From ae5e21dcc21ba3fd557849d78342ab808fff65ef Mon Sep 17 00:00:00 2001 From: Kelvin Steiner Date: Thu, 6 Feb 2025 18:26:14 -0300 Subject: [PATCH 01/46] chore: bump flake --- flake.lock | 24 ++++++++++++------------ flake.nix | 25 ++++++++++--------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/flake.lock b/flake.lock index 7a3b4158..79615d64 100644 --- a/flake.lock +++ b/flake.lock @@ -57,11 +57,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1735669367, - "narHash": "sha256-tfYRbFhMOnYaM4ippqqid3BaLOXoFNdImrfBfCp4zn0=", + "lastModified": 1738702386, + "narHash": "sha256-nJj8f78AYAxl/zqLiFGXn5Im1qjFKU8yBPKoWEeZN5M=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "edf04b75c13c2ac0e54df5ec5c543e300f76f1c9", + "rev": "030ba1976b7c0e1a67d9716b17308ccdab5b381e", "type": "github" }, "original": { @@ -89,11 +89,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1728538411, - "narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=", + "lastModified": 1736320768, + "narHash": "sha256-nIYdTAiKIGnFNugbomgBJR+Xv5F1ZQU+HfaBqJKroC0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221", + "rev": "4bc9c909d9ac828a039f288cf872d16d38185db8", "type": "github" }, "original": { @@ -110,11 +110,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1735882644, - "narHash": "sha256-3FZAG+pGt3OElQjesCAWeMkQ7C/nB1oTHLRQ8ceP110=", + "lastModified": 1737465171, + "narHash": "sha256-R10v2hoJRLq8jcL4syVFag7nIGE7m13qO48wRIukWNg=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "a5a961387e75ae44cc20f0a57ae463da5e959656", + "rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17", "type": "github" }, "original": { @@ -136,11 +136,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1735871325, - "narHash": "sha256-6Ta5E4mhSfCP6LdkzkG2+BciLOCPeLKuYTJ6lOHW+mI=", + "lastModified": 1738808867, + "narHash": "sha256-m5rbY/ck0NAlfSBxo++vl7EZn8fkZ02H3kGGc7q883c=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "a599f011db521766cbaf7c2f5874182485554f00", + "rev": "ae46f37fb727030ddc2ef65a675b751484c90032", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index d6c0bec4..a01996a2 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Torus Substrate development environment"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-24.11"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; flake-utils.url = "github:numtide/flake-utils"; rust-overlay.url = "github:oxalica/rust-overlay"; pre-commit-hooks.url = "github:cachix/git-hooks.nix"; @@ -12,9 +12,7 @@ flake-utils.lib.eachDefaultSystem (system: let overlays = [ (import rust-overlay) ]; - pkgs = import nixpkgs { - inherit system overlays; - }; + pkgs = import nixpkgs { inherit system overlays; }; rust = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; generalBuildInputs = with pkgs; [ @@ -23,10 +21,11 @@ rocksdb zstd.dev ]; - buildInputs = - if pkgs.stdenv.isLinux - then generalBuildInputs ++ [ pkgs.jemalloc pkgs.pkgsi686Linux.glibc ] - else generalBuildInputs ++ [ pkgs.darwin.apple_sdk.frameworks.SystemConfiguration ]; + buildInputs = if pkgs.stdenv.isLinux then + generalBuildInputs ++ [ pkgs.jemalloc pkgs.pkgsi686Linux.glibc ] + else + generalBuildInputs + ++ [ pkgs.darwin.apple_sdk.frameworks.SystemConfiguration ]; nativeBuildInputs = with pkgs; [ git rust clang protobuf sccache ]; shellPkgs = [ @@ -38,14 +37,11 @@ # Python pkgs.python310 ]; - in - { + in { checks = pkgs.mkShell { pre-commit-check = pre-commit-hooks.lib.${system}.run { src = ./.; - hooks = { - rustfmt.enable = true; - }; + hooks = { rustfmt.enable = true; }; }; }; @@ -69,6 +65,5 @@ JEMALLOC_OVERRIDE = "${pkgs.jemalloc}/lib/libjemalloc.so"; }; }; - } - ); + }); } From 2091d692f93f44afd917b2ac8158a15daadbdca5 Mon Sep 17 00:00:00 2001 From: gabrielle oliveira Date: Fri, 7 Feb 2025 18:49:31 -0300 Subject: [PATCH 02/46] docs: improve torus substrate docstrings (#71) Adds docstrings to most storage values and core functions. Closes CHAIN-45. --------- Co-authored-by: Luiz Carvalho --- node/src/chain_spec.rs | 1 - node/src/cli/eth.rs | 7 +- node/src/command.rs | 11 +- node/src/command/benchmarking.rs | 4 +- node/src/rpc.rs | 3 +- node/src/rpc/eth.rs | 17 ++- node/src/service.rs | 11 +- pallets/emission0/api/src/lib.rs | 3 +- pallets/emission0/src/distribute.rs | 6 +- pallets/emission0/src/distribute/math.rs | 37 +++--- pallets/emission0/src/lib.rs | 32 +++-- pallets/emission0/src/migrations.rs | 1 - pallets/governance/src/application.rs | 48 +++++-- pallets/governance/src/config.rs | 11 +- pallets/governance/src/lib.rs | 97 ++++++++++---- pallets/governance/src/migrations.rs | 2 - pallets/governance/src/proposal.rs | 133 +++++++++++++------- pallets/governance/src/roles.rs | 16 ++- pallets/governance/src/voting.rs | 7 +- pallets/governance/src/whitelist.rs | 3 + pallets/governance/tests/application.rs | 6 +- pallets/governance/tests/curator.rs | 3 +- pallets/governance/tests/voting.rs | 10 +- pallets/torus0/src/agent.rs | 50 +++++--- pallets/torus0/src/burn.rs | 18 ++- pallets/torus0/src/fee.rs | 5 +- pallets/torus0/src/lib.rs | 110 +++++++++++----- pallets/torus0/src/migrations.rs | 1 - pallets/torus0/src/stake.rs | 41 +++--- runtime/src/apis.rs | 8 +- runtime/src/configs.rs | 25 ++-- runtime/src/configs/eth.rs | 41 +++--- runtime/src/lib.rs | 40 +++--- runtime/src/precompiles/balance_transfer.rs | 6 +- runtime/src/precompiles/mod.rs | 7 +- test-utils/src/lib.rs | 5 +- xtask/src/build_spec.rs | 38 +++--- xtask/src/run.rs | 3 +- 38 files changed, 567 insertions(+), 300 deletions(-) diff --git a/node/src/chain_spec.rs b/node/src/chain_spec.rs index 535d9c57..20b1a3ef 100644 --- a/node/src/chain_spec.rs +++ b/node/src/chain_spec.rs @@ -52,7 +52,6 @@ fn testnet_genesis() -> Value { polkadot_sdk_frame::traits::Get, sp_keyring::{Ed25519Keyring, Sr25519Keyring}, }; - use torus_runtime::{ interface::{Balance, MinimumBalance}, BalancesConfig, SudoConfig, diff --git a/node/src/cli/eth.rs b/node/src/cli/eth.rs index 602c4d35..b0ecbb78 100644 --- a/node/src/cli/eth.rs +++ b/node/src/cli/eth.rs @@ -25,7 +25,8 @@ pub fn db_config_dir(config: &Configuration) -> PathBuf { /// Available frontier backend types. #[derive(Debug, Copy, Clone, Default, clap::ValueEnum)] pub enum BackendType { - /// Either RocksDb or ParityDb as per inherited from the global backend settings. + /// Either RocksDb or ParityDb as per inherited from the global backend + /// settings. #[default] KeyValue, /// Sql database with custom log indexing. @@ -50,8 +51,8 @@ pub struct EthConfiguration { #[arg(long, default_value = "1")] pub target_gas_price: u64, - /// Maximum allowed gas limit will be `block.gas_limit * execute_gas_limit_multiplier` - /// when using eth_call/eth_estimateGas. + /// Maximum allowed gas limit will be `block.gas_limit * + /// execute_gas_limit_multiplier` when using eth_call/eth_estimateGas. #[arg(long, default_value = "2")] pub execute_gas_limit_multiplier: u64, /// Size in bytes of the LRU cache for block data. diff --git a/node/src/command.rs b/node/src/command.rs index ed977cde..81a76c6f 100644 --- a/node/src/command.rs +++ b/node/src/command.rs @@ -15,17 +15,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{ - chain_spec, - cli::{Cli, Subcommand}, - service, -}; use benchmarking::{inherent_benchmark_data, RemarkBuilder, TransferKeepAliveBuilder}; use frame_benchmarking_cli::{BenchmarkCmd, ExtrinsicFactory, SUBSTRATE_REFERENCE_HARDWARE}; use futures::TryFutureExt; use polkadot_sdk::{sc_cli::SubstrateCli, sc_service::PartialComponents, *}; use torus_runtime::interface::Block; +use crate::{ + chain_spec, + cli::{Cli, Subcommand}, + service, +}; + mod benchmarking; impl SubstrateCli for Cli { diff --git a/node/src/command/benchmarking.rs b/node/src/command/benchmarking.rs index 12f8b50a..056708cf 100644 --- a/node/src/command/benchmarking.rs +++ b/node/src/command/benchmarking.rs @@ -2,7 +2,7 @@ //! //! Should only be used for benchmarking as it may break in other contexts. -use crate::service::FullClient; +use std::{sync::Arc, time::Duration}; use polkadot_sdk::{ sc_cli::Result, @@ -15,7 +15,7 @@ use polkadot_sdk::{ }; use torus_runtime::interface::{AccountId, Balance, BalancesCall, SystemCall}; -use std::{sync::Arc, time::Duration}; +use crate::service::FullClient; /// Generates extrinsics for the `benchmark overhead` command. /// diff --git a/node/src/rpc.rs b/node/src/rpc.rs index 847e0aef..4a419d26 100644 --- a/node/src/rpc.rs +++ b/node/src/rpc.rs @@ -22,6 +22,8 @@ #![warn(missing_docs)] +use std::sync::Arc; + use eth::EthDeps; use futures::channel::mpsc; use jsonrpsee::RpcModule; @@ -38,7 +40,6 @@ use polkadot_sdk::{ sp_runtime::traits::Block as BlockT, substrate_frame_rpc_system::{System, SystemApiServer}, }; -use std::sync::Arc; use torus_runtime::{interface::Hash, opaque::Block}; use crate::service::FullClient; diff --git a/node/src/rpc/eth.rs b/node/src/rpc/eth.rs index 0a4d98dc..7f3ca668 100644 --- a/node/src/rpc/eth.rs +++ b/node/src/rpc/eth.rs @@ -1,5 +1,10 @@ use std::{collections::BTreeMap, sync::Arc}; +// Frontier +pub use fc_rpc::EthBlockDataCacheTask; +pub use fc_rpc_core::types::{FeeHistoryCache, FeeHistoryCacheLimit, FilterPool}; +use fc_storage::StorageOverride; +use fp_rpc::ConvertTransaction; use jsonrpsee::RpcModule; use polkadot_sdk::{ sc_network::service::traits::NetworkService, @@ -11,11 +16,6 @@ use polkadot_sdk::{ sp_inherents::CreateInherentDataProviders, sp_runtime::traits::Block as BlockT, }; -// Frontier -pub use fc_rpc::EthBlockDataCacheTask; -pub use fc_rpc_core::types::{FeeHistoryCache, FeeHistoryCacheLimit, FilterPool}; -use fc_storage::StorageOverride; -use fp_rpc::ConvertTransaction; use torus_runtime::opaque::Block; use crate::service::{FullBackend, FullClient}; @@ -52,8 +52,8 @@ pub struct EthDeps { pub fee_history_cache: FeeHistoryCache, /// Maximum fee history cache size. pub fee_history_cache_limit: FeeHistoryCacheLimit, - /// Maximum allowed gas limit will be ` block.gas_limit * execute_gas_limit_multiplier` when - /// using eth_call/eth_estimateGas. + /// Maximum allowed gas limit will be ` block.gas_limit * + /// execute_gas_limit_multiplier` when using eth_call/eth_estimateGas. pub execute_gas_limit_multiplier: u64, /// Mandated parent hashes for a given block hash. pub forced_parent_hashes: Option>, @@ -95,9 +95,8 @@ where use fc_rpc::{ pending::AuraConsensusDataProvider, Debug, DebugApiServer, Eth, EthApiServer, EthDevSigner, EthFilter, EthFilterApiServer, EthPubSub, EthPubSubApiServer, EthSigner, Net, NetApiServer, - Web3, Web3ApiServer, + TxPool, TxPoolApiServer, Web3, Web3ApiServer, }; - use fc_rpc::{TxPool, TxPoolApiServer}; let EthDeps { client, diff --git a/node/src/service.rs b/node/src/service.rs index 41c9451c..331e03d9 100644 --- a/node/src/service.rs +++ b/node/src/service.rs @@ -15,6 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::{pin::Pin, sync::Arc, time::Duration}; + use fc_rpc::StorageOverrideHandler; use futures::FutureExt; use polkadot_sdk::{ @@ -28,7 +30,6 @@ use polkadot_sdk::{ sp_runtime::traits::Block as BlockT, *, }; -use std::{pin::Pin, sync::Arc, time::Duration}; use torus_runtime::{apis::RuntimeApi, configs::eth::TransactionConverter, opaque::Block}; use crate::cli::{ @@ -495,9 +496,11 @@ pub async fn new_full, > = Default::default(); diff --git a/pallets/emission0/api/src/lib.rs b/pallets/emission0/api/src/lib.rs index e18b4e87..ab57be98 100644 --- a/pallets/emission0/api/src/lib.rs +++ b/pallets/emission0/api/src/lib.rs @@ -8,6 +8,7 @@ pub struct ConsensusMemberStats { pub trait Emission0Api { /// Fetches stats emitted by the consensus for an agent. - /// Returns `None` if the agent has not taken part in the last consensus run. + /// Returns `None` if the agent has not taken part in the last consensus + /// run. fn consensus_stats(member: &AccountId) -> Option; } diff --git a/pallets/emission0/src/distribute.rs b/pallets/emission0/src/distribute.rs index 9d725dc2..c0401966 100644 --- a/pallets/emission0/src/distribute.rs +++ b/pallets/emission0/src/distribute.rs @@ -212,7 +212,8 @@ impl ConsensusMemberInput { } } - /// Removes self-weights, ensures the keys are registered to the consensus and normalizes it. + /// Removes self-weights, ensures the keys are registered to the consensus + /// and normalizes it. pub fn prepare_weights( member: ConsensusMember, agent_id: &T::AccountId, @@ -242,7 +243,8 @@ impl ConsensusMemberInput { weights } - /// Normalizes the list of stakers to the agent, and adds the agent itself in case no stake was given. + /// Normalizes the list of stakers to the agent, and adds the agent itself + /// in case no stake was given. pub fn normalized_stakers(&self) -> Vec<(T::AccountId, Perquintill)> { self.stakes .iter() diff --git a/pallets/emission0/src/distribute/math.rs b/pallets/emission0/src/distribute/math.rs index d9cf4728..fc0e1002 100644 --- a/pallets/emission0/src/distribute/math.rs +++ b/pallets/emission0/src/distribute/math.rs @@ -1,16 +1,15 @@ #![allow(dead_code)] +// This is necessary because functions like `f64::{fract, floor, ceil}` +// are only implemented in `std`. +#[cfg(not(feature = "std"))] +use num_traits::float::FloatCore; use polkadot_sdk::sp_std::{cmp::Ordering, collections::btree_map::BTreeMap, vec, vec::Vec}; use substrate_fixed::{ transcendental::{exp, ln}, types::I96F32, }; -// This is necessary because functions like `f64::{fract, floor, ceil}` -// are only implemented in `std`. -#[cfg(not(feature = "std"))] -use num_traits::float::FloatCore; - // Return true when vector sum is zero. pub fn is_zero(vector: &[I96F32]) -> bool { vector.iter().sum::() == I96F32::from_num(0) @@ -344,9 +343,10 @@ pub fn weighted_median_col_sparse( median } -// Stake-weighted median score finding algorithm, based on a mid pivot binary search. -// Normally a random pivot is used, but to ensure full determinism the mid point is chosen instead. -// Assumes relatively random score order for efficiency, typically less than O(nlogn) complexity. +// Stake-weighted median score finding algorithm, based on a mid pivot binary +// search. Normally a random pivot is used, but to ensure full determinism the +// mid point is chosen instead. Assumes relatively random score order for +// efficiency, typically less than O(nlogn) complexity. // // # Args: // * 'stake': ( &Vec ): @@ -362,12 +362,12 @@ pub fn weighted_median_col_sparse( // - minority_ratio = 1 - majority_ratio // // * 'partition_lo' ( I96F32 ): -// - lower edge of stake for partition, where partition is a segment [lo, hi] inside stake -// integral [0, 1]. +// - lower edge of stake for partition, where partition is a segment [lo, hi] +// inside stake integral [0, 1]. // // * 'partition_hi' ( I96F32 ): -// - higher edge of stake for partition, where partition is a segment [lo, hi] inside stake -// integral [0, 1]. +// - higher edge of stake for partition, where partition is a segment [lo, hi] +// inside stake integral [0, 1]. // // # Returns: // * 'median': ( I96F32 ): @@ -466,7 +466,8 @@ pub fn row_sum_sparse(sparse_matrix: &[Vec<(u16, I96F32)>]) -> Vec { result } -// Return sparse matrix with values above column threshold set to threshold value. +// Return sparse matrix with values above column threshold set to threshold +// value. pub fn col_clip_sparse( sparse_matrix: &[Vec<(u16, I96F32)>], col_threshold: &[I96F32], @@ -706,8 +707,8 @@ pub fn mat_ema_sparse( result } -/// Max-upscale vector and convert to u16 so max_value = u16::MAX. Assumes non-negative normalized -/// input. +/// Max-upscale vector and convert to u16 so max_value = u16::MAX. Assumes +/// non-negative normalized input. pub fn vec_max_upscale_to_u16(vec: &[I96F32]) -> Vec { let u16_max = I96F32::from_num(u16::MAX); let threshold = I96F32::from_num(32768); @@ -797,9 +798,10 @@ pub fn inplace_col_max_upscale_sparse(sparse_matrix: &mut [Vec<(u16, I96F32)>], #[cfg(test)] #[allow(clippy::arithmetic_side_effects, clippy::indexing_slicing)] mod tests { - use super::*; use substrate_fixed::types::{I96F32, U64F64}; + use super::*; + macro_rules! fixed_vec { () => { vec![] @@ -809,7 +811,8 @@ mod tests { }; } - /// Reshape vector to sparse matrix with specified number of input rows, cast f32 to I96F32. + /// Reshape vector to sparse matrix with specified number of input rows, + /// cast f32 to I96F32. fn vec_to_sparse_mat_fixed( vector: &[f32], rows: usize, diff --git a/pallets/emission0/src/lib.rs b/pallets/emission0/src/lib.rs index e74cd53d..7b18c7c0 100644 --- a/pallets/emission0/src/lib.rs +++ b/pallets/emission0/src/lib.rs @@ -6,12 +6,13 @@ pub mod migrations; pub(crate) use ext::*; pub use pallet::*; use pallet_emission0_api::Emission0Api; -use polkadot_sdk::frame_support::dispatch::DispatchResult; -use polkadot_sdk::frame_support::{pallet_prelude::*, DefaultNoBound}; -use polkadot_sdk::frame_system; -use polkadot_sdk::frame_system::pallet_prelude::OriginFor; -use polkadot_sdk::polkadot_sdk_frame::{self as frame, traits::Currency}; -use polkadot_sdk::sp_runtime::Percent; +use polkadot_sdk::{ + frame_support::{dispatch::DispatchResult, pallet_prelude::*, DefaultNoBound}, + frame_system, + frame_system::pallet_prelude::OriginFor, + polkadot_sdk_frame::{self as frame, traits::Currency}, + sp_runtime::Percent, +}; #[doc(hidden)] pub mod distribute; @@ -36,33 +37,48 @@ pub mod pallet { use super::*; + /// Map of consensus members indexed by their keys. A consensus member is + /// any agent eligible for emissions in the next epoch. This means + /// unregistered agents will also receive emissions. #[pallet::storage] pub type ConsensusMembers = StorageMap<_, Identity, AccountIdOf, ConsensusMember>; + /// Map of agents delegating weight control to other agents. Emissions + /// derived from weight delegation are taxed and the fees go the original + /// weight setter. #[pallet::storage] pub type WeightControlDelegation = StorageMap<_, Identity, T::AccountId, T::AccountId>; + // TODO: remove #[pallet::storage] pub type MinAllowedWeights = StorageValue<_, u16, ValueQuery, T::DefaultMinAllowedWeights>; + /// Maximum number of weights a validator can set. #[pallet::storage] pub type MaxAllowedWeights = StorageValue<_, u16, ValueQuery, T::DefaultMaxAllowedWeights>; + // TODO: cap weights on distribution. + /// Minimum stake a validator needs for each weight it sets. #[pallet::storage] pub type MinStakePerWeight = StorageValue<_, BalanceOf, ValueQuery>; + /// Percentage of issued tokens to be burned every epoch. #[pallet::storage] pub type EmissionRecyclingPercentage = StorageValue<_, Percent, ValueQuery, T::DefaultEmissionRecyclingPercentage>; + /// Ratio between incentives and dividends on distribution. 50% means they + /// are distributed equally. #[pallet::storage] pub type IncentivesRatio = StorageValue<_, Percent, ValueQuery, T::DefaultIncentivesRatio>; + /// Amount of tokens accumulated since the last epoch. This increases on + /// every block. See [`distribute::get_total_emission_per_block`]. #[pallet::storage] pub type PendingEmission = StorageValue<_, BalanceOf, ValueQuery>; @@ -79,7 +95,8 @@ pub mod pallet { #[pallet::constant] type MaxSupply: Get; - /// Emissions per block in NANOs. Not taking into account halving and recycling. + /// Emissions per block in NANOs. Not taking into account halving and + /// recycling. #[pallet::constant] type BlockEmission: Get; @@ -156,7 +173,6 @@ pub mod pallet { #[pallet::call] impl Pallet { - // TODO: configure price #[pallet::call_index(0)] #[pallet::weight((T::WeightInfo::set_weights(), DispatchClass::Normal, Pays::Yes))] pub fn set_weights( diff --git a/pallets/emission0/src/migrations.rs b/pallets/emission0/src/migrations.rs index fb5a4cf0..57f390cd 100644 --- a/pallets/emission0/src/migrations.rs +++ b/pallets/emission0/src/migrations.rs @@ -9,7 +9,6 @@ use crate::{Config, Pallet}; pub mod v1 { use super::*; - use crate::{EmissionRecyclingPercentage, IncentivesRatio}; pub type Migration = VersionedMigration<0, 1, MigrateToV1, Pallet, W>; diff --git a/pallets/governance/src/application.rs b/pallets/governance/src/application.rs index d46a0e24..27af4c4c 100644 --- a/pallets/governance/src/application.rs +++ b/pallets/governance/src/application.rs @@ -1,15 +1,24 @@ -use crate::frame::traits::ExistenceRequirement; -use crate::{whitelist, AccountIdOf, AgentApplications, BalanceOf, Block}; use codec::{Decode, Encode, MaxEncodedLen}; -use polkadot_sdk::frame_election_provider_support::Get; -use polkadot_sdk::frame_support::dispatch::DispatchResult; -use polkadot_sdk::frame_support::traits::Currency; -use polkadot_sdk::frame_support::traits::WithdrawReasons; -use polkadot_sdk::frame_support::DebugNoBound; -use polkadot_sdk::sp_runtime::BoundedVec; -use polkadot_sdk::sp_std::vec::Vec; +use polkadot_sdk::{ + frame_election_provider_support::Get, + frame_support::{ + dispatch::DispatchResult, + traits::{Currency, WithdrawReasons}, + DebugNoBound, + }, + sp_runtime::BoundedVec, + sp_std::vec::Vec, +}; use scale_info::TypeInfo; +use crate::{ + frame::traits::ExistenceRequirement, whitelist, AccountIdOf, AgentApplications, BalanceOf, + Block, +}; + +/// Decentralized autonomous organization application, it's used to do agent +/// operations on the network, like creating or removing, and needs to be +/// approved by other peers. #[derive(DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen)] #[scale_info(skip_type_params(T))] pub struct AgentApplication { @@ -23,6 +32,7 @@ pub struct AgentApplication { pub status: ApplicationStatus, } +/// Possible operations are adding or removing applications. #[derive(DebugNoBound, Decode, Encode, TypeInfo, MaxEncodedLen, PartialEq, Eq)] pub enum ApplicationAction { Add, @@ -32,7 +42,11 @@ pub enum ApplicationAction { #[derive(DebugNoBound, Decode, Encode, TypeInfo, MaxEncodedLen, PartialEq, Eq)] pub enum ApplicationStatus { Open, - Resolved { accepted: bool }, + /// The application was processed before expiration, can be either accepted + /// or rejected. + Resolved { + accepted: bool, + }, Expired, } @@ -44,6 +58,9 @@ impl AgentApplication { } } +/// Creates a new agent application if the key is not yet whitelisted. It +/// withdraws a fee from the payer account, which is given back if the +/// application is accepted. The fee avoids actors spamming applications. pub fn submit_application( payer: AccountIdOf, agent_key: AccountIdOf, @@ -116,6 +133,8 @@ pub fn submit_application( Ok(()) } +/// Accepts an agent application and executes it if it's still open, fails +/// otherwise. pub fn accept_application(application_id: u32) -> DispatchResult { let application = crate::AgentApplications::::get(application_id) .ok_or(crate::Error::::ApplicationNotFound)?; @@ -145,8 +164,7 @@ pub fn accept_application(application_id: u32) -> DispatchResu } }); - // Pay the application cost back to the applicant - // TODO: should this value be used? + // Give the application fee back to the payer key. let _ = ::Currency::deposit_creating(&application.payer_key, application.cost); @@ -155,6 +173,7 @@ pub fn accept_application(application_id: u32) -> DispatchResu Ok(()) } +/// Rejects an open application. pub fn deny_application(application_id: u32) -> DispatchResult { let application = crate::AgentApplications::::get(application_id) .ok_or(crate::Error::::ApplicationNotFound)?; @@ -176,9 +195,11 @@ pub fn deny_application(application_id: u32) -> DispatchResult Ok(()) } +/// Iterates through all open applications checking if the current block is +/// greater or equal to the former's expiration block. If so, marks the +/// application as Expired. pub(crate) fn resolve_expired_applications(current_block: Block) { for application in crate::AgentApplications::::iter_values() { - // Skip if not expired yet or if not in Open status if current_block < application.expires_at || !matches!(application.status, ApplicationStatus::Open) { @@ -197,6 +218,7 @@ pub(crate) fn resolve_expired_applications(current_block: Bloc } } +/// If any applications for this agent and action are already pending. pub(crate) fn exists_for_agent_key( key: &AccountIdOf, action: &ApplicationAction, diff --git a/pallets/governance/src/config.rs b/pallets/governance/src/config.rs index 7d91f251..76f9cb28 100644 --- a/pallets/governance/src/config.rs +++ b/pallets/governance/src/config.rs @@ -1,6 +1,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; -use polkadot_sdk::frame_election_provider_support::Get; -use polkadot_sdk::{frame_support::DebugNoBound, sp_runtime::Percent}; +use polkadot_sdk::{ + frame_election_provider_support::Get, frame_support::DebugNoBound, sp_runtime::Percent, +}; use scale_info::TypeInfo; use crate::{BalanceOf, BlockAmount}; @@ -22,11 +23,11 @@ impl Default for GovernanceConfiguration { Self { proposal_cost: T::DefaultProposalCost::get(), proposal_expiration: T::DefaultProposalExpiration::get(), //130_000, - agent_application_cost: T::DefaultAgentApplicationCost::get(), //100_000_000_000_000_000_000, + agent_application_cost: T::DefaultAgentApplicationCost::get(), /* 100_000_000_000_000_000_000, */ agent_application_expiration: T::DefaultAgentApplicationExpiration::get(), //2_000, - proposal_reward_treasury_allocation: T::DefaultProposalRewardTreasuryAllocation::get(), //Percent::from_percent(2), + proposal_reward_treasury_allocation: T::DefaultProposalRewardTreasuryAllocation::get(), /* Percent::from_percent(2), */ max_proposal_reward_treasury_allocation: - T::DefaultMaxProposalRewardTreasuryAllocation::get(), //10_000_000_000_000_000_000_000, + T::DefaultMaxProposalRewardTreasuryAllocation::get(), /* 10_000_000_000_000_000_000_000, */ proposal_reward_interval: T::DefaultProposalRewardInterval::get(), //75_600, } } diff --git a/pallets/governance/src/lib.rs b/pallets/governance/src/lib.rs index 97478c4d..b6fd50fb 100644 --- a/pallets/governance/src/lib.rs +++ b/pallets/governance/src/lib.rs @@ -13,25 +13,30 @@ pub mod whitelist; pub mod benchmarks; pub mod weights; -use crate::application::AgentApplication; -use crate::config::GovernanceConfiguration; -use crate::proposal::Proposal; -use crate::proposal::ProposalId; -use crate::proposal::UnrewardedProposal; pub(crate) use ext::*; use frame::prelude::ensure_root; pub use pallet::*; -use polkadot_sdk::frame_support::{ - dispatch::DispatchResult, - pallet_prelude::{ValueQuery, *}, - sp_runtime::Percent, - traits::Currency, - Identity, PalletId, +use polkadot_sdk::{ + frame_support::{ + dispatch::DispatchResult, + pallet_prelude::{ValueQuery, *}, + sp_runtime::Percent, + traits::Currency, + Identity, PalletId, + }, + frame_system::pallet_prelude::{ensure_signed, BlockNumberFor, OriginFor}, + polkadot_sdk_frame::{ + traits::AccountIdConversion, + {self as frame}, + }, + sp_std::vec::Vec, +}; + +use crate::{ + application::AgentApplication, + config::GovernanceConfiguration, + proposal::{Proposal, ProposalId, UnrewardedProposal}, }; -use polkadot_sdk::frame_system::pallet_prelude::{ensure_signed, BlockNumberFor, OriginFor}; -use polkadot_sdk::polkadot_sdk_frame::traits::AccountIdConversion; -use polkadot_sdk::polkadot_sdk_frame::{self as frame}; -use polkadot_sdk::sp_std::vec::Vec; #[frame::pallet] pub mod pallet { @@ -44,17 +49,22 @@ pub mod pallet { use super::*; + /// Map of past and present proposals indexed by their incrementing ID. #[pallet::storage] pub type Proposals = StorageMap<_, Identity, ProposalId, Proposal>; + /// Queue of proposals to be rewarded after closing. #[pallet::storage] pub type UnrewardedProposals = StorageMap<_, Identity, ProposalId, UnrewardedProposal>; + /// List of keys that are NOT delegating their voting power. By default, all + /// keys delegate their voting power. #[pallet::storage] pub type NotDelegatingVotingPower = StorageValue<_, BoundedBTreeSet, ConstU32<{ u32::MAX }>>, ValueQuery>; + /// Global governance configuration files. #[pallet::storage] pub type GlobalGovernanceConfig = StorageValue<_, GovernanceConfiguration, ValueQuery>; @@ -65,22 +75,32 @@ pub mod pallet { ::PalletId::get().into_account_truncating() } + /// The treasury address to which the treasury emission percentages and + /// other funds go to. A proposal can be created withdrawing the funds to a + /// key. #[pallet::storage] pub type DaoTreasuryAddress = StorageValue<_, AccountIdOf, ValueQuery, DefaultDaoTreasuryAddress>; + /// A map of agent applications, past and present. #[pallet::storage] pub type AgentApplications = StorageMap<_, Identity, u32, AgentApplication>; + /// List of whitelisted keys. Keys listed here are allowed to register + /// agents. #[pallet::storage] pub type Whitelist = StorageMap<_, Identity, AccountIdOf, ()>; + /// List of curator keys, which can accept and reject applications. #[pallet::storage] pub type Curators = StorageMap<_, Identity, AccountIdOf, ()>; + /// List of allocator keys, which are the default validators on the network. #[pallet::storage] pub type Allocators = StorageMap<_, Identity, AccountIdOf, ()>; + /// Fee taken from emission distribution and deposited into + /// [`DaoTreasuryAddress`]. #[pallet::storage] pub type TreasuryEmissionFee = StorageValue<_, Percent, ValueQuery, T::DefaultTreasuryEmissionFee>; @@ -162,6 +182,7 @@ pub mod pallet { #[pallet::call] impl Pallet { + /// Adds a new curator to the list. Only available for the root key. #[pallet::call_index(0)] #[pallet::weight((::WeightInfo::add_curator(), DispatchClass::Normal, Pays::Yes))] pub fn add_curator(origin: OriginFor, key: AccountIdOf) -> DispatchResult { @@ -169,6 +190,8 @@ pub mod pallet { roles::manage_role::>(key, true, Error::::AlreadyCurator) } + /// Removes an existing curator from the list. Only available for the + /// root key. #[pallet::call_index(1)] #[pallet::weight((::WeightInfo::remove_curator(), DispatchClass::Normal, Pays::Yes))] pub fn remove_curator(origin: OriginFor, key: AccountIdOf) -> DispatchResult { @@ -176,6 +199,7 @@ pub mod pallet { roles::manage_role::>(key, false, Error::::NotAllocator) } + /// Adds a new allocator to the list. Only available for the root key. #[pallet::call_index(2)] #[pallet::weight((::WeightInfo::add_allocator(), DispatchClass::Normal, Pays::Yes))] pub fn add_allocator(origin: OriginFor, key: AccountIdOf) -> DispatchResult { @@ -183,6 +207,8 @@ pub mod pallet { roles::manage_role::>(key, true, Error::::AlreadyAllocator) } + /// Removes an existing allocator from the list. Only available for the + /// root key. #[pallet::call_index(3)] #[pallet::weight((::WeightInfo::remove_allocator(), DispatchClass::Normal, Pays::Yes))] pub fn remove_allocator(origin: OriginFor, key: AccountIdOf) -> DispatchResult { @@ -190,6 +216,8 @@ pub mod pallet { roles::manage_role::>(key, false, Error::::NotAllocator) } + /// Forcefully adds a new agent to the whitelist. Only available for the + /// root key or curators. #[pallet::call_index(4)] #[pallet::weight((::WeightInfo::add_to_whitelist(), DispatchClass::Normal, Pays::Yes))] pub fn add_to_whitelist(origin: OriginFor, key: AccountIdOf) -> DispatchResult { @@ -197,6 +225,8 @@ pub mod pallet { whitelist::add_to_whitelist::(key) } + /// Forcefully removes an agent from the whitelist. Only available for + /// the root key or curators. #[pallet::call_index(5)] #[pallet::weight((::WeightInfo::remove_from_whitelist(), DispatchClass::Normal, Pays::Yes))] pub fn remove_from_whitelist(origin: OriginFor, key: AccountIdOf) -> DispatchResult { @@ -204,6 +234,8 @@ pub mod pallet { whitelist::remove_from_whitelist::(key) } + /// Accepts an agent application. Only available for the root key or + /// curators. #[pallet::call_index(6)] #[pallet::weight((::WeightInfo::accept_application(), DispatchClass::Normal, Pays::Yes))] pub fn accept_application(origin: OriginFor, application_id: u32) -> DispatchResult { @@ -211,6 +243,8 @@ pub mod pallet { application::accept_application::(application_id) } + /// Denies an agent application. Only available for the root key or + /// curators. #[pallet::call_index(7)] #[pallet::weight((::WeightInfo::deny_application(), DispatchClass::Normal, Pays::Yes))] pub fn deny_application(origin: OriginFor, application_id: u32) -> DispatchResult { @@ -218,6 +252,8 @@ pub mod pallet { application::deny_application::(application_id) } + /// Sets a penalty factor to the given agent emissions. Only available + /// for the root key or curators. #[pallet::call_index(8)] #[pallet::weight((::WeightInfo::penalize_agent(), DispatchClass::Normal, Pays::Yes))] pub fn penalize_agent( @@ -229,6 +265,7 @@ pub mod pallet { roles::penalize_agent::(agent_key, percentage) } + /// Submits a new agent application on behalf of a given key. #[pallet::call_index(9)] #[pallet::weight((::WeightInfo::submit_application(), DispatchClass::Normal, Pays::Yes))] pub fn submit_application( @@ -241,6 +278,7 @@ pub mod pallet { application::submit_application::(payer, agent_key, metadata, removing) } + /// Creates a new global parameters proposal. #[pallet::call_index(10)] #[pallet::weight((::WeightInfo::add_global_params_proposal(), DispatchClass::Normal, Pays::Yes))] pub fn add_global_params_proposal( @@ -252,6 +290,7 @@ pub mod pallet { proposal::add_global_params_proposal::(proposer, data, metadata) } + /// Creates a new custom global proposal. #[pallet::call_index(11)] #[pallet::weight((::WeightInfo::add_global_custom_proposal(), DispatchClass::Normal, Pays::Yes))] pub fn add_global_custom_proposal( @@ -262,6 +301,8 @@ pub mod pallet { proposal::add_global_custom_proposal::(proposer, metadata) } + /// Creates a proposal moving funds from the treasury account to the + /// given key. #[pallet::call_index(12)] #[pallet::weight((::WeightInfo::add_dao_treasury_transfer_proposal(), DispatchClass::Normal, Pays::Yes))] pub fn add_dao_treasury_transfer_proposal( @@ -279,6 +320,7 @@ pub mod pallet { ) } + /// Casts a vote for an open proposal. #[pallet::call_index(13)] #[pallet::weight((::WeightInfo::vote_proposal(), DispatchClass::Normal, Pays::Yes))] pub fn vote_proposal( @@ -290,6 +332,7 @@ pub mod pallet { voting::add_vote::(voter, proposal_id, agree) } + /// Removes a casted vote for an open proposal. #[pallet::call_index(14)] #[pallet::weight((::WeightInfo::remove_vote_proposal(), DispatchClass::Normal, Pays::Yes))] pub fn remove_vote_proposal(origin: OriginFor, proposal_id: u64) -> DispatchResult { @@ -297,6 +340,7 @@ pub mod pallet { voting::remove_vote::(voter, proposal_id) } + /// Enables vote power delegation. #[pallet::call_index(15)] #[pallet::weight((::WeightInfo::enable_vote_delegation(), DispatchClass::Normal, Pays::Yes))] pub fn enable_vote_delegation(origin: OriginFor) -> DispatchResult { @@ -304,6 +348,7 @@ pub mod pallet { voting::enable_delegation::(delegator) } + /// Disables vote power delegation. #[pallet::call_index(16)] #[pallet::weight((::WeightInfo::disable_vote_delegation(), DispatchClass::Normal, Pays::Yes))] pub fn disable_vote_delegation(origin: OriginFor) -> DispatchResult { @@ -311,6 +356,7 @@ pub mod pallet { voting::disable_delegation::(delegator) } + /// Creates a new emission percentage proposal. #[pallet::call_index(17)] #[pallet::weight((::WeightInfo::add_emission_proposal(), DispatchClass::Normal, Pays::Yes))] pub fn add_emission_proposal( @@ -330,6 +376,8 @@ pub mod pallet { ) } + /// Forcefully sets emission percentages. Only available for the root + /// key. #[pallet::call_index(18)] #[pallet::weight((::WeightInfo::add_emission_proposal(), DispatchClass::Normal, Pays::No))] pub fn set_emission_params( @@ -385,9 +433,11 @@ pub mod pallet { InvalidProposalFinalizationParameters, /// Invalid parameters were provided to the voting process. InvalidProposalVotingParameters, - /// Negative proposal cost when setting global or subnet governance configuration. + /// Negative proposal cost when setting global or subnet governance + /// configuration. InvalidProposalCost, - /// Negative expiration when setting global or subnet governance configuration. + /// Negative expiration when setting global or subnet governance + /// configuration. InvalidProposalExpiration, /// Key doesn't have enough tokens to create a proposal. NotEnoughBalanceToPropose, @@ -399,7 +449,8 @@ pub mod pallet { ModuleDelegatingForMaxStakers, /// Proposal with given id doesn't exist. ProposalNotFound, - /// Proposal was either accepted, refused or expired and cannot accept votes. + /// Proposal was either accepted, refused or expired and cannot accept + /// votes. ProposalClosed, /// Proposal data isn't composed by valid UTF-8 characters. InvalidProposalData, @@ -413,10 +464,11 @@ pub mod pallet { NotVoted, /// Key doesn't have enough stake to vote. InsufficientStake, - /// The voter is delegating its voting power to their staked modules. Disable voting power - /// delegation. + /// The voter is delegating its voting power to their staked modules. + /// Disable voting power delegation. VoterIsDelegatingVotingPower, - /// An internal error occurred, probably relating to the size of the bounded sets. + /// An internal error occurred, probably relating to the size of the + /// bounded sets. InternalError, /// The application is not in a pending state. ApplicationNotOpen, @@ -430,7 +482,8 @@ pub mod pallet { ApplicationNotFound, /// The account is already whitelisted and cannot be added again. AlreadyWhitelisted, - /// The account is not whitelisted and cannot be removed from the whitelist. + /// The account is not whitelisted and cannot be removed from the + /// whitelist. NotWhitelisted, /// Failed to convert the given value to a balance. CouldNotConvertToBalance, diff --git a/pallets/governance/src/migrations.rs b/pallets/governance/src/migrations.rs index 30cd2901..6ed34af1 100644 --- a/pallets/governance/src/migrations.rs +++ b/pallets/governance/src/migrations.rs @@ -11,7 +11,6 @@ pub type Migrations = (v1::Migration, v2::Migration); pub mod v2 { use super::*; - use crate::TreasuryEmissionFee; pub type Migration = VersionedMigration<1, 2, MigrateToV2, Pallet, W>; @@ -29,7 +28,6 @@ pub mod v2 { pub mod v1 { use super::*; - use crate::GlobalGovernanceConfig; pub type Migration = VersionedMigration<0, 1, MigrateToV1, Pallet, W>; diff --git a/pallets/governance/src/proposal.rs b/pallets/governance/src/proposal.rs index 9c9de443..56abbf90 100644 --- a/pallets/governance/src/proposal.rs +++ b/pallets/governance/src/proposal.rs @@ -1,36 +1,36 @@ -use crate::frame::traits::ExistenceRequirement; -use crate::BoundedBTreeSet; -use crate::BoundedVec; -use crate::DebugNoBound; -use crate::TypeInfo; -use crate::{ - AccountIdOf, BalanceOf, Block, DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, - UnrewardedProposals, -}; -use crate::{GovernanceConfiguration, NotDelegatingVotingPower}; use codec::{Decode, Encode, MaxEncodedLen}; -use polkadot_sdk::frame_election_provider_support::Get; -use polkadot_sdk::frame_support::traits::Currency; -use polkadot_sdk::frame_support::traits::WithdrawReasons; -use polkadot_sdk::polkadot_sdk_frame::traits::CheckedAdd; -use polkadot_sdk::sp_runtime::SaturatedConversion; -use polkadot_sdk::sp_std::{collections::btree_set::BTreeSet, vec::Vec}; use polkadot_sdk::{ - frame_support::{dispatch::DispatchResult, ensure, storage::with_storage_layer}, + frame_election_provider_support::Get, + frame_support::{ + dispatch::DispatchResult, + ensure, + storage::with_storage_layer, + traits::{Currency, WithdrawReasons}, + }, + polkadot_sdk_frame::traits::CheckedAdd, sp_core::ConstU32, sp_runtime::{BoundedBTreeMap, DispatchError, Percent}, + sp_std::{collections::btree_set::BTreeSet, vec::Vec}, sp_tracing::error, }; use substrate_fixed::types::I92F36; +use crate::{ + frame::traits::ExistenceRequirement, AccountIdOf, BalanceOf, Block, BoundedBTreeSet, + BoundedVec, DaoTreasuryAddress, DebugNoBound, Error, GlobalGovernanceConfig, + GovernanceConfiguration, NotDelegatingVotingPower, Proposals, TypeInfo, UnrewardedProposals, +}; + pub type ProposalId = u64; +/// A network proposal created by the community. Core part of the DAO. #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen)] #[scale_info(skip_type_params(T))] pub struct Proposal { pub id: ProposalId, pub proposer: AccountIdOf, pub expiration_block: Block, + /// The actual data and type of the proposal. pub data: ProposalData, pub status: ProposalStatus, pub metadata: BoundedVec>, @@ -45,6 +45,10 @@ impl Proposal { matches!(self.status, ProposalStatus::Open { .. }) } + /// Returns the block in which a proposal should be executed. + /// For emission proposals, that is the creation block + 21600 blocks + /// (roughly 2 days at 1 block every 8 seconds), as for the others, they + /// are only executed on the expiration block. pub fn execution_block(&self) -> Block { match self.data { ProposalData::Emission { .. } => self.creation_block + 21_600, @@ -52,7 +56,7 @@ impl Proposal { } } - /// Marks a proposal as accepted and overrides the storage value. + /// Marks a proposal as accepted and executes it. pub fn accept( mut self, block: Block, @@ -75,7 +79,9 @@ impl Proposal { Ok(()) } + /// Executes the changes. fn execute_proposal(self) -> DispatchResult { + // Proposal fee is given back to the proposer. let _ = ::Currency::deposit_creating(&self.proposer, self.proposal_cost); @@ -137,7 +143,7 @@ impl Proposal { Ok(()) } - /// Marks a proposal as refused and overrides the storage value. + /// Marks a proposal as refused. pub fn refuse( mut self, block: Block, @@ -158,7 +164,7 @@ impl Proposal { Ok(()) } - /// Marks a proposal as expired and overrides the storage value. + /// Marks a proposal as expired. pub fn expire(mut self, block_number: u64) -> DispatchResult { ensure!(self.is_active(), crate::Error::::ProposalIsFinished); ensure!( @@ -178,26 +184,44 @@ impl Proposal { #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] #[scale_info(skip_type_params(T))] pub enum ProposalStatus { + /// The proposal is active and being voted upon. The votes values only hold + /// accounts and not stake per key, because this is subtle to change + /// overtime. The stake values are there to help clients estimate the status + /// of the voting, they are updated every few blocks, but are not used in + /// the final calculation. Open { + /// Accounts who have voted for this proposal to be accepted. votes_for: BoundedBTreeSet, ConstU32<{ u32::MAX }>>, + /// Accounts who have voted against this proposal being accepted. votes_against: BoundedBTreeSet, ConstU32<{ u32::MAX }>>, + /// A roughly estimation of the total stake voting for the proposal. stake_for: BalanceOf, + /// A roughly estimation of the total stake voting against the proposal. stake_against: BalanceOf, }, + /// Proposal was accepted. Accepted { block: Block, + /// Total stake that voted for the proposal. stake_for: BalanceOf, + /// Total stake that voted against the proposal. stake_against: BalanceOf, }, + /// Proposal was refused. Refused { block: Block, + /// Total stake that voted for the proposal. stake_for: BalanceOf, + /// Total stake that voted against the proposal. stake_against: BalanceOf, }, + /// Proposal expired without enough network participation. Expired, } // TODO: add Agent URL max length +/// Update the global parameters configuration, like, max and min name lengths, +/// and other validations. All values are set within default storage values. #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] #[scale_info(skip_type_params(T))] pub struct GlobalParamsData { @@ -270,16 +294,27 @@ impl GlobalParamsData { } } +/// The proposal type and data. #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] #[scale_info(skip_type_params(T))] pub enum ProposalData { + /// Applies changes to global parameters. GlobalParams(GlobalParamsData), + /// A custom proposal with not immediate impact in the chain. Can be used as + /// referendums regarding the future of the chain. GlobalCustom, + /// Changes the emission rates for incentives, recycling and treasury. Emission { + /// The amount of tokens per block to be recycled ("burned"). recycling_percentage: Percent, + /// The amount of tokens sent to the treasury AFTER recycling fee was + /// applied. treasury_percentage: Percent, + /// This changes how incentives and dividends are distributed. 50% means + /// they are distributed equally. incentives_ratio: Percent, }, + /// Transfers funds from the treasury account to the specified account. TransferDaoTreasury { account: AccountIdOf, amount: BalanceOf, @@ -287,6 +322,8 @@ pub enum ProposalData { } impl ProposalData { + /// The percentage of total active stake participating in the proposal for + /// it to be processes (either approved or refused). #[must_use] pub fn required_stake(&self) -> Percent { match self { @@ -305,6 +342,7 @@ pub struct UnrewardedProposal { pub votes_against: BoundedBTreeMap, BalanceOf, ConstU32<{ u32::MAX }>>, } +/// Create global update parameters proposal with metadata. #[allow(clippy::too_many_arguments)] pub fn add_global_params_proposal( proposer: AccountIdOf, @@ -317,6 +355,7 @@ pub fn add_global_params_proposal( add_proposal::(proposer, data, metadata) } +/// Create global custom proposal with metadata. pub fn add_global_custom_proposal( proposer: AccountIdOf, metadata: Vec, @@ -324,6 +363,7 @@ pub fn add_global_custom_proposal( add_proposal(proposer, ProposalData::::GlobalCustom, metadata) } +/// Create a treasury transfer proposal with metadata. pub fn add_dao_treasury_transfer_proposal( proposer: AccountIdOf, value: BalanceOf, @@ -338,6 +378,8 @@ pub fn add_dao_treasury_transfer_proposal( add_proposal::(proposer, data, metadata) } +/// Creates a new emissions proposal. Only valid if `recycling_percentage + +/// treasury_percentage <= u128::MAX`. pub fn add_emission_proposal( proposer: AccountIdOf, recycling_percentage: Percent, @@ -361,6 +403,7 @@ pub fn add_emission_proposal( add_proposal::(proposer, data, metadata) } +/// Creates a new proposal and saves it. Internally used. fn add_proposal( proposer: AccountIdOf, data: ProposalData, @@ -417,15 +460,17 @@ fn add_proposal( Ok(()) } +/// Every 100 blocks, iterates through all pending proposals and executes the +/// ones eligible. pub fn tick_proposals(block_number: Block) { - let not_delegating = NotDelegatingVotingPower::::get().into_inner(); - - let proposals = Proposals::::iter().filter(|(_, p)| p.is_active()); - if block_number % 100 != 0 { return; } + let not_delegating = NotDelegatingVotingPower::::get().into_inner(); + + let proposals = Proposals::::iter().filter(|(_, p)| p.is_active()); + for (id, proposal) in proposals { let res = with_storage_layer(|| tick_proposal(¬_delegating, block_number, proposal)); if let Err(err) = res { @@ -434,19 +479,17 @@ pub fn tick_proposals(block_number: Block) { } } -pub fn get_minimal_stake_to_execute_with_percentage( +/// Returns the minimum amount of active stake needed for a proposal be executed +/// based on the given percentage. +fn get_minimum_stake_to_execute_with_percentage( threshold: Percent, ) -> BalanceOf { let stake = pallet_torus0::TotalStake::::get(); - - stake - .saturated_into::>() - .checked_mul(threshold.deconstruct() as u128) - .unwrap_or_default() - .checked_div(100) - .unwrap_or_default() + threshold.mul_floor(stake) } +/// Sums all stakes for votes in favor and against. The biggest value wins and +/// the proposal is processes and executed. expiration block. fn tick_proposal( not_delegating: &BTreeSet, block_number: u64, @@ -500,7 +543,7 @@ fn tick_proposal( let total_stake = stake_for_sum.saturating_add(stake_against_sum); let minimal_stake_to_execute = - get_minimal_stake_to_execute_with_percentage::(proposal.data.required_stake()); + get_minimum_stake_to_execute_with_percentage::(proposal.data.required_stake()); if total_stake >= minimal_stake_to_execute { create_unrewarded_proposal::(proposal.id, block_number, votes_for, votes_against); @@ -517,6 +560,10 @@ fn tick_proposal( } } +type AccountStakes = BoundedBTreeMap, BalanceOf, ConstU32<{ u32::MAX }>>; + +/// Put the proposal in the reward queue, which will be processed by +/// [tick_proposal_rewards]. fn create_unrewarded_proposal( proposal_id: u64, block_number: Block, @@ -530,11 +577,7 @@ fn create_unrewarded_proposal( .expect("this wont exceed u32::MAX"); } - let mut reward_votes_against: BoundedBTreeMap< - T::AccountId, - BalanceOf, - ConstU32<{ u32::MAX }>, - > = BoundedBTreeMap::new(); + let mut reward_votes_against: AccountStakes = BoundedBTreeMap::new(); for (key, value) in votes_against { reward_votes_against .try_insert(key, value) @@ -551,6 +594,8 @@ fn create_unrewarded_proposal( ); } +/// Calculates the stake for a voter. This function takes into account all +/// accounts delegating voting power to the voter. #[inline] fn calc_stake( not_delegating: &BTreeSet, @@ -571,6 +616,7 @@ fn calc_stake( own_stake.saturating_add(delegated_stake) } +/// Processes the proposal reward queue and distributes rewards for all voters. pub fn tick_proposal_rewards(block_number: u64) { let governance_config = crate::GlobalGovernanceConfig::::get(); let reached_interval = block_number @@ -581,10 +627,10 @@ pub fn tick_proposal_rewards(block_number: u64) { } let mut n: u16 = 0; - let mut account_stakes: BoundedBTreeMap, ConstU32<{ u32::MAX }>> = - BoundedBTreeMap::new(); + let mut account_stakes: AccountStakes = BoundedBTreeMap::new(); let mut total_allocation: I92F36 = I92F36::from_num(0); for (proposal_id, unrewarded_proposal) in UnrewardedProposals::::iter() { + // Just checking if it's in the chain interval if unrewarded_proposal.block < block_number.saturating_sub(governance_config.proposal_reward_interval) { @@ -623,6 +669,7 @@ pub fn tick_proposal_rewards(block_number: u64) { ); } +/// Calculates the total balance to be rewarded for a proposal. pub fn get_reward_allocation( governance_config: &GovernanceConfiguration, n: u16, @@ -661,12 +708,14 @@ pub fn get_reward_allocation( Ok(allocation) } +/// Distributes the proposal rewards in a quadratic formula to all voters. fn distribute_proposal_rewards( - account_stakes: BoundedBTreeMap, ConstU32<{ u32::MAX }>>, + account_stakes: AccountStakes, total_allocation: I92F36, max_proposal_reward_treasury_allocation: BalanceOf, ) { - // This is just a sanity check, making sure we can never allocate more than the max + // This is just a sanity check, making sure we can never allocate more than the + // max if total_allocation > I92F36::from_num(max_proposal_reward_treasury_allocation) { error!("total allocation exceeds max proposal reward treasury allocation"); return; diff --git a/pallets/governance/src/roles.rs b/pallets/governance/src/roles.rs index f17e6fe6..57011073 100644 --- a/pallets/governance/src/roles.rs +++ b/pallets/governance/src/roles.rs @@ -1,12 +1,15 @@ -use crate::AccountIdOf; -use crate::{ensure, storage::StorageMap, Config, Error}; -use polkadot_sdk::frame_election_provider_support::Get; -use polkadot_sdk::sp_runtime::{DispatchError, Percent}; use polkadot_sdk::{ - frame_support::dispatch::DispatchResult, frame_system::ensure_signed, + frame_election_provider_support::Get, + frame_support::dispatch::DispatchResult, + frame_system::ensure_signed, polkadot_sdk_frame::prelude::OriginFor, + sp_runtime::{DispatchError, Percent}, }; +use crate::{ensure, storage::StorageMap, AccountIdOf, Config, Error}; + +/// Generic function used to manage the Curator and Allocator maps, which behave +/// similarly. pub(super) fn manage_role, ()>>( key: AccountIdOf, is_add: bool, @@ -21,6 +24,7 @@ pub(super) fn manage_role, ()>>( Ok(()) } +/// Sets a penalty ratio for the given agent. pub fn penalize_agent(agent_key: AccountIdOf, percentage: u8) -> DispatchResult { let percentage = Percent::from_parts(percentage); if percentage > T::MaxPenaltyPercentage::get() { @@ -40,6 +44,7 @@ pub fn penalize_agent(agent_key: AccountIdOf, percentage: u8) -> D Ok(()) } +/// Returns error if the origin is not listed as a curator. pub fn ensure_curator(origin: OriginFor) -> DispatchResult { let key: AccountIdOf = ensure_signed(origin)?; if !crate::Curators::::contains_key(key) { @@ -49,6 +54,7 @@ pub fn ensure_curator(origin: OriginFor) -> DispatchResult { Ok(()) } +/// Returns error if the origin is not listed as an allocator. pub fn ensure_allocator(key: &AccountIdOf) -> DispatchResult { if !crate::Allocators::::contains_key(key) { return Err(Error::::NotAllocator.into()); diff --git a/pallets/governance/src/voting.rs b/pallets/governance/src/voting.rs index aef2e112..94f4678d 100644 --- a/pallets/governance/src/voting.rs +++ b/pallets/governance/src/voting.rs @@ -1,6 +1,8 @@ -use crate::{proposal::ProposalStatus, AccountIdOf, Error, Event, Proposals}; use polkadot_sdk::frame_support::{dispatch::DispatchResult, ensure}; +use crate::{proposal::ProposalStatus, AccountIdOf, Error, Event, Proposals}; + +/// Casts a vote on behalf of a voter. pub fn add_vote( voter: AccountIdOf, proposal_id: u64, @@ -51,6 +53,7 @@ pub fn add_vote( Ok(()) } +/// Removes the casted vote. pub fn remove_vote(voter: AccountIdOf, proposal_id: u64) -> DispatchResult { let Ok(mut proposal) = Proposals::::try_get(proposal_id) else { return Err(Error::::ProposalNotFound.into()); @@ -76,6 +79,7 @@ pub fn remove_vote(voter: AccountIdOf, proposal_id: u64) -> Ok(()) } +/// Gives voting power delegation to the delegator's staked agents. pub fn enable_delegation(delegator: AccountIdOf) -> DispatchResult { crate::NotDelegatingVotingPower::::mutate(|delegators| { delegators.remove(&delegator); @@ -84,6 +88,7 @@ pub fn enable_delegation(delegator: AccountIdOf) -> Dispatc Ok(()) } +/// Removes voting power delegation to the delegator's staked agents. pub fn disable_delegation(delegator: AccountIdOf) -> DispatchResult { crate::NotDelegatingVotingPower::::mutate(|delegators| { delegators diff --git a/pallets/governance/src/whitelist.rs b/pallets/governance/src/whitelist.rs index fadcc1f2..3875fd05 100644 --- a/pallets/governance/src/whitelist.rs +++ b/pallets/governance/src/whitelist.rs @@ -2,6 +2,7 @@ use polkadot_sdk::frame_support::dispatch::DispatchResult; use crate::{application, AccountIdOf}; +/// Adds a key to the DAO whitelist, allowing it to register an agent. pub fn add_to_whitelist(key: AccountIdOf) -> DispatchResult { if is_whitelisted::(&key) { return Err(crate::Error::::AlreadyWhitelisted.into()); @@ -16,6 +17,8 @@ pub fn add_to_whitelist(key: AccountIdOf) -> DispatchResult Ok(()) } +/// Remove a key from the DAO whitelist, disallowing the key to register an +/// agent, or de-registering an existing one. pub fn remove_from_whitelist(key: AccountIdOf) -> DispatchResult { if !is_whitelisted::(&key) { return Err(crate::Error::::NotWhitelisted.into()); diff --git a/pallets/governance/tests/application.rs b/pallets/governance/tests/application.rs index 3f559cb9..0c522f04 100644 --- a/pallets/governance/tests/application.rs +++ b/pallets/governance/tests/application.rs @@ -1,6 +1,6 @@ -use pallet_governance::application::ApplicationStatus; -use pallet_governance::AgentApplications; -use pallet_governance::GlobalGovernanceConfig; +use pallet_governance::{ + application::ApplicationStatus, AgentApplications, GlobalGovernanceConfig, +}; use polkadot_sdk::frame_support::assert_err; use test_utils::*; diff --git a/pallets/governance/tests/curator.rs b/pallets/governance/tests/curator.rs index 866f620c..b93962e9 100644 --- a/pallets/governance/tests/curator.rs +++ b/pallets/governance/tests/curator.rs @@ -1,8 +1,9 @@ -use crate::pallet_governance::Error; use pallet_governance::Curators; use polkadot_sdk::frame_support::assert_err; use test_utils::*; +use crate::pallet_governance::Error; + #[test] fn user_is_added_to_whitelist() { new_test_ext().execute_with(|| { diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index 65951a21..491e5634 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -3,9 +3,10 @@ use pallet_governance::{ proposal::{GlobalParamsData, ProposalStatus}, DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, }; -use polkadot_sdk::frame_support::traits::Get; -use polkadot_sdk::{frame_support::assert_err, sp_runtime::BoundedBTreeSet}; -use polkadot_sdk::{frame_support::assert_ok, sp_runtime::Percent}; +use polkadot_sdk::{ + frame_support::{assert_err, assert_ok, traits::Get}, + sp_runtime::{BoundedBTreeSet, Percent}, +}; use test_utils::{ add_balance, get_balance, get_origin, new_test_ext, step_block, to_nano, zero_min_burn, AccountId, Test, @@ -519,7 +520,8 @@ fn creates_emission_proposal_with_invalid_params_and_it_fails() { fn rewards_wont_exceed_treasury() { new_test_ext().execute_with(|| { zero_min_burn(); - // Fill the governance address with 1 mil so we are not limited by the max allocation + // Fill the governance address with 1 mil so we are not limited by the max + // allocation let amount = to_nano(1_000_000_000); let key = DaoTreasuryAddress::::get(); add_balance(key, amount); diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index 56673d34..ada91717 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -1,32 +1,50 @@ -use crate::AccountIdOf; use codec::{Decode, Encode, MaxEncodedLen}; use pallet_emission0_api::Emission0Api; use pallet_governance_api::GovernanceApi; -use polkadot_sdk::frame_election_provider_support::Get; -use polkadot_sdk::frame_support::traits::{Currency, ExistenceRequirement, WithdrawReasons}; -use polkadot_sdk::frame_support::DebugNoBound; -use polkadot_sdk::polkadot_sdk_frame::prelude::BlockNumberFor; -use polkadot_sdk::sp_runtime::DispatchError; use polkadot_sdk::{ - frame_support::{dispatch::DispatchResult, ensure}, - sp_runtime::{BoundedVec, Percent}, + frame_election_provider_support::Get, + frame_support::{ + dispatch::DispatchResult, + ensure, + traits::{Currency, ExistenceRequirement, WithdrawReasons}, + DebugNoBound, + }, + polkadot_sdk_frame::prelude::BlockNumberFor, + sp_runtime::{BoundedVec, DispatchError, Percent}, sp_tracing::{debug, debug_span}, }; -use scale_info::prelude::vec::Vec; -use scale_info::TypeInfo; +use scale_info::{prelude::vec::Vec, TypeInfo}; + +use crate::AccountIdOf; +/// Agents are one of the primitives in the Torus ecosystem which are bounded +/// to modules in off-chain environment. They can receive weights by the +/// allocators. +/// +/// Agent registration needs approval from a curator. Registration applications +/// are submitter at dao.torus.network. #[derive(DebugNoBound, Encode, Decode, MaxEncodedLen, TypeInfo)] #[scale_info(skip_type_params(T))] pub struct Agent { + /// The key that bounds the agent to the module pub key: AccountIdOf, pub name: BoundedVec, pub url: BoundedVec, pub metadata: BoundedVec, + /// Penalities acts on agent's incentives and dividends of users who set + /// weights on them. pub weight_penalty_factor: Percent, pub registration_block: BlockNumberFor, pub fees: crate::fee::ValidatorFee, } +/// Register an agent to the given key, payed by the payer key. +/// +/// If the network is full, this function will drop enough agents until there's +/// at least one slot (see [`find_agent_to_prune`]). Fails if no agents were +/// eligible for pruning. +/// +/// Registration fee is stored as [`crate::Burn`]. pub fn register( payer: AccountIdOf, agent_key: AccountIdOf, @@ -121,6 +139,8 @@ pub fn register( Ok(()) } +/// Unregister an agent key from the network, erasing all its data and removing +/// stakers. pub fn unregister(agent_key: AccountIdOf) -> DispatchResult { let span = debug_span!("unregister", agent.key = ?agent_key); let _guard = span.enter(); @@ -138,6 +158,7 @@ pub fn unregister(agent_key: AccountIdOf) -> DispatchResult Ok(()) } +/// Updates the metadata of an existing agent. pub fn update( agent_key: AccountIdOf, name: Vec, @@ -273,7 +294,8 @@ pub enum PruningStrategy { /// Finds the agent producing least dividends and incentives to /// the network that is older than the current immunity period. LeastProductive, - /// Like [`PruningStrategy::LeastProductive`] but ignoring the immunity period. + /// Like [`PruningStrategy::LeastProductive`] but ignoring the immunity + /// period. IgnoreImmunity, } @@ -282,9 +304,9 @@ pub enum PruningStrategy { /// When search for least productive agent, agents that are older than the /// immunity period will be ranked based on their emissions in the last /// consensus run (epoch). Dividends are multiplied by the participation -/// factor defined by the network and and summed with incentives. The to-be-pruned -/// agent is the one with the lowest result, if multiple agents are found, the -/// algorithm chooses the oldest one. +/// factor defined by the network and and summed with incentives. The +/// to-be-pruned agent is the one with the lowest result, if multiple agents are +/// found, the algorithm chooses the oldest one. #[doc(hidden)] pub fn find_agent_to_prune(strategy: PruningStrategy) -> Option { let current_block: u64 = >::block_number() diff --git a/pallets/torus0/src/burn.rs b/pallets/torus0/src/burn.rs index fcd045ae..38b571b3 100644 --- a/pallets/torus0/src/burn.rs +++ b/pallets/torus0/src/burn.rs @@ -1,12 +1,13 @@ -use crate::BalanceOf; use codec::{Decode, Encode, MaxEncodedLen}; -use polkadot_sdk::frame_election_provider_support::Get; -use polkadot_sdk::frame_support::DebugNoBound; -use polkadot_sdk::polkadot_sdk_frame::prelude::BlockNumberFor; -use scale_info::prelude::marker::PhantomData; -use scale_info::TypeInfo; +use polkadot_sdk::{ + frame_election_provider_support::Get, frame_support::DebugNoBound, + polkadot_sdk_frame::prelude::BlockNumberFor, +}; +use scale_info::{prelude::marker::PhantomData, TypeInfo}; use substrate_fixed::types::I110F18; +use crate::BalanceOf; + #[derive(Clone, TypeInfo, Decode, Encode, PartialEq, Eq, DebugNoBound, MaxEncodedLen)] #[scale_info(skip_type_params(T))] pub struct BurnConfiguration { @@ -36,6 +37,11 @@ where } } +/// Adjusts registration burn for the current block. +/// +/// The next burn is calculated by analyzing the last N +/// (`target_registrations_interval`) blocks and increases if the target +/// registrations per interval was reached. pub fn adjust_burn(current_block: u64) { let BurnConfiguration { min_burn, diff --git a/pallets/torus0/src/fee.rs b/pallets/torus0/src/fee.rs index 51108646..4d77ed48 100644 --- a/pallets/torus0/src/fee.rs +++ b/pallets/torus0/src/fee.rs @@ -1,8 +1,9 @@ use core::marker::PhantomData; use codec::{Decode, Encode, MaxEncodedLen}; -use polkadot_sdk::frame_election_provider_support::Get; -use polkadot_sdk::{frame_support::DebugNoBound, sp_runtime::Percent}; +use polkadot_sdk::{ + frame_election_provider_support::Get, frame_support::DebugNoBound, sp_runtime::Percent, +}; use scale_info::TypeInfo; #[derive(DebugNoBound, Decode, Encode, MaxEncodedLen, PartialEq, Eq, TypeInfo)] diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index e0ec0021..d8af9d5e 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -7,24 +7,23 @@ pub mod fee; pub mod migrations; pub mod stake; -use crate::agent::Agent; -use crate::burn::BurnConfiguration; -use crate::fee::ValidatorFeeConstraints; pub(crate) use ext::*; -use frame::arithmetic::Percent; -use frame::prelude::ensure_signed; +use frame::{arithmetic::Percent, prelude::ensure_signed}; pub use pallet::*; -use polkadot_sdk::frame_support::{ - dispatch::DispatchResult, - pallet_prelude::{ValueQuery, *}, - traits::Currency, - Identity, +use polkadot_sdk::{ + frame_support::{ + dispatch::DispatchResult, + pallet_prelude::{ValueQuery, *}, + traits::Currency, + Identity, + }, + frame_system::pallet_prelude::OriginFor, + polkadot_sdk_frame as frame, sp_std, }; -use polkadot_sdk::frame_system::pallet_prelude::OriginFor; -use polkadot_sdk::polkadot_sdk_frame as frame; -use polkadot_sdk::sp_std; use scale_info::prelude::vec::Vec; +use crate::{agent::Agent, burn::BurnConfiguration, fee::ValidatorFeeConstraints}; + #[frame::pallet] pub mod pallet { const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); @@ -35,78 +34,106 @@ pub mod pallet { use super::*; + /// Max allowed of validators. This is used then calculating emissions, only + /// the top staked agents up to this value will have their weights + /// considered. #[pallet::storage] pub type MaxAllowedValidators = StorageValue<_, u16, ValueQuery, T::DefaultMaxAllowedValidators>; + /// Amount of tokens to burn from a payer key when registering new agents. #[pallet::storage] pub type Burn = StorageValue<_, BalanceOf, ValueQuery>; + /// Number of agent registrations that happened in the last + /// [`BurnConfiguration::target_registrations_interval`] blocks. #[pallet::storage] pub type RegistrationsThisInterval = StorageValue<_, u16, ValueQuery>; + /// Minimum required stake for an agent to be considered a validator. #[pallet::storage] pub type MinValidatorStake = StorageValue<_, BalanceOf, ValueQuery, T::DefaultMinValidatorStake>; + /// Number of blocks in which an agent is immune to pruning after + /// registration. #[pallet::storage] pub type ImmunityPeriod = StorageValue<_, u16, ValueQuery, T::DefaultImmunityPeriod>; + /// Number of blocks between emissions. #[pallet::storage] pub type RewardInterval = StorageValue<_, u16, ValueQuery, T::DefaultRewardInterval>; + /// Known registered network agents indexed by the owner's key. #[pallet::storage] pub type Agents = StorageMap<_, Identity, AccountIdOf, Agent>; + // TODO: remove #[pallet::storage] pub type RegistrationBlock = StorageMap<_, Identity, AccountIdOf, BlockNumberFor>; + /// Maximum number of characters allowed in an agent name. #[pallet::storage] pub type MaxNameLength = StorageValue<_, u16, ValueQuery, T::DefaultMaxNameLength>; + /// Minimum number of characters required in an agent name. #[pallet::storage] - pub type MaxAgentUrlLength = - StorageValue<_, u16, ValueQuery, T::DefaultMaxAgentUrlLength>; + pub type MinNameLength = StorageValue<_, u16, ValueQuery, T::DefaultMinNameLength>; + /// Maximum number of characters allowed in an agent URL. #[pallet::storage] - pub type MinNameLength = StorageValue<_, u16, ValueQuery, T::DefaultMinNameLength>; + pub type MaxAgentUrlLength = + StorageValue<_, u16, ValueQuery, T::DefaultMaxAgentUrlLength>; + /// Maximum number of agents registered at one time. Registering when this + /// number is met means new comers will cause pruning of old agents. #[pallet::storage] pub type MaxAllowedAgents = StorageValue<_, u16, ValueQuery, T::DefaultMaxAllowedAgents>; + /// Number of agent registrations that happened this block. #[pallet::storage] pub type RegistrationsThisBlock = StorageValue<_, u16, ValueQuery>; + /// Maximum amount of agent registrations per block, tracked by + /// [`RegistrationsThisBlock`]. #[pallet::storage] pub type MaxRegistrationsPerBlock = StorageValue<_, u16, ValueQuery, T::DefaultMaxRegistrationsPerBlock>; - // StakeTo + // Map of staked tokens prefixed by the staker, and indexed by the staked agents + // mapping to the amount in tokens. #[pallet::storage] pub type StakingTo = StorageDoubleMap<_, Identity, T::AccountId, Identity, T::AccountId, BalanceOf>; - // StakeFrom + // Map of staked tokens prefixed by the staked agent, and indexed by the staker + // keys mapping to the amount in tokens. #[pallet::storage] pub type StakedBy = StorageDoubleMap<_, Identity, T::AccountId, Identity, T::AccountId, BalanceOf>; + /// The total amount of stake in the network. #[pallet::storage] pub type TotalStake = StorageValue<_, BalanceOf, ValueQuery>; + /// Minimum amount of stake in tokens a key has to deposit in an agent. #[pallet::storage] pub type MinAllowedStake = StorageValue<_, BalanceOf, ValueQuery, T::DefaultMinAllowedStake>; + /// The weight dividends have when finding agents to prune. 100% meaning it + /// is taking fully into account. #[pallet::storage] pub type DividendsParticipationWeight = StorageValue<_, Percent, ValueQuery, T::DefaultDividendsParticipationWeight>; + /// Constraints defining validation of agent fees. #[pallet::storage] pub type FeeConstraints = StorageValue<_, ValidatorFeeConstraints, ValueQuery>; + /// [`Burn`] configuration values. #[pallet::storage] pub type BurnConfig = StorageValue<_, BurnConfiguration, ValueQuery>; @@ -189,12 +216,14 @@ pub mod pallet { #[pallet::no_default_bounds] type DefaultMaxRegistrationsPerInterval: Get; - /// The storage MaxNameLength should be constrained to be no more than the value of this. - /// This is needed on agent::Agent to set the `name` field BoundedVec max length. + /// The storage MaxNameLength should be constrained to be no more than + /// the value of this. This is needed on agent::Agent to set the + /// `name` field BoundedVec max length. #[pallet::constant] type MaxAgentNameLengthConstraint: Get; - /// This is needed on agent::Agent to set the `url` field BoundedVec max length. + /// This is needed on agent::Agent to set the `url` field BoundedVec max + /// length. #[pallet::constant] type MaxAgentUrlLengthConstraint: Get; @@ -221,6 +250,7 @@ pub mod pallet { #[pallet::call] impl Pallet { + /// Adds stakes from origin to the agent key. #[pallet::call_index(0)] #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] pub fn add_stake( @@ -236,6 +266,7 @@ pub mod pallet { stake::add_stake::(key, agent_key, amount) } + /// Removes stakes from origin to the agent key. #[pallet::call_index(1)] #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] pub fn remove_stake( @@ -247,6 +278,7 @@ pub mod pallet { stake::remove_stake::(key, agent_key, amount) } + /// Transfers origin's stakes from an agent to another. #[pallet::call_index(2)] #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] pub fn transfer_stake( @@ -259,6 +291,7 @@ pub mod pallet { stake::transfer_stake::(key, agent_key, new_agent_key, amount) } + /// Registers a new agent on behalf of an arbitrary key. #[pallet::call_index(3)] #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] pub fn register_agent( @@ -272,6 +305,7 @@ pub mod pallet { agent::register::(payer, agent_key, name, url, metadata) } + /// Unregister origin's key agent. #[pallet::call_index(4)] #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] pub fn unregister_agent(origin: OriginFor) -> DispatchResult { @@ -279,6 +313,7 @@ pub mod pallet { agent::unregister::(agent_key) } + /// Updates origin's key agent metadata. #[pallet::call_index(5)] #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] pub fn update_agent( @@ -304,17 +339,20 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub fn deposit_event)] pub enum Event { - /// Event created when stake has been transferred from the coldkey account onto the key - /// staking account + /// Event created when stake has been transferred from the coldkey + /// account onto the key staking account StakeAdded(AccountIdOf, AccountIdOf, BalanceOf), - /// Event created when stake has been removed from the key staking account onto the coldkey - /// account + /// Event created when stake has been removed from the key staking + /// account onto the coldkey account StakeRemoved(AccountIdOf, AccountIdOf, BalanceOf), - /// Event created when a new agent account has been registered to the chain + /// Event created when a new agent account has been registered to the + /// chain AgentRegistered(AccountIdOf), - /// Event created when a agent account has been deregistered from the chain + /// Event created when a agent account has been deregistered from the + /// chain AgentUnregistered(AccountIdOf), - /// Event created when the agent's updated information is added to the network + /// Event created when the agent's updated information is added to the + /// network AgentUpdated(AccountIdOf), } @@ -324,11 +362,14 @@ pub mod pallet { AgentDoesNotExist, /// Insufficient stake to withdraw the requested amount. NotEnoughStakeToWithdraw, - /// Insufficient balance in the cold key account to stake the requested amount. + /// Insufficient balance in the cold key account to stake the requested + /// amount. NotEnoughBalanceToStake, - /// The number of agent registrations in this block exceeds the allowed limit. + /// The number of agent registrations in this block exceeds the allowed + /// limit. TooManyAgentRegistrationsThisBlock, - /// The number of agent registrations in this interval exceeds the allowed limit. + /// The number of agent registrations in this interval exceeds the + /// allowed limit. TooManyAgentRegistrationsThisInterval, /// The agent is already registered in the active set. AgentAlreadyRegistered, @@ -352,8 +393,8 @@ pub mod pallet { NotEnoughStakeToRegister, /// The entity is still registered and cannot be modified. StillRegistered, - /// Attempted to set max allowed agents to a value less than the current number of - /// registered agents. + /// Attempted to set max allowed agents to a value less than the current + /// number of registered agents. MaxAllowedAgents, /// Insufficient balance to transfer. NotEnoughBalanceToTransfer, @@ -389,7 +430,8 @@ pub mod pallet { StepPanicked, /// The stake amount to add or remove is too small. Minimum is 0.5 unit. StakeTooSmall, - /// Key is not present in Whitelist, it needs to be whitelisted by a Curator + /// Key is not present in Whitelist, it needs to be whitelisted by a + /// Curator AgentKeyNotWhitelisted, /// The amount given is 0 InvalidAmount, diff --git a/pallets/torus0/src/migrations.rs b/pallets/torus0/src/migrations.rs index 92fcb77c..7758c96b 100644 --- a/pallets/torus0/src/migrations.rs +++ b/pallets/torus0/src/migrations.rs @@ -9,7 +9,6 @@ use crate::{Config, Pallet}; pub mod v1 { use super::*; - use crate::{Agent, Agents}; pub type Migration = VersionedMigration<0, 1, MigrateToV1, Pallet, W>; diff --git a/pallets/torus0/src/stake.rs b/pallets/torus0/src/stake.rs index e5d95682..d1aee317 100644 --- a/pallets/torus0/src/stake.rs +++ b/pallets/torus0/src/stake.rs @@ -1,11 +1,17 @@ -use polkadot_sdk::sp_std::{collections::btree_map::BTreeMap, vec::Vec}; -use polkadot_sdk::sp_tracing::error; - -use crate::agent; -use crate::{AccountIdOf, BalanceOf}; -use polkadot_sdk::frame_support::traits::{Currency, ExistenceRequirement, WithdrawReasons}; -use polkadot_sdk::frame_support::{dispatch::DispatchResult, ensure}; - +use polkadot_sdk::{ + frame_support::{ + dispatch::DispatchResult, + ensure, + traits::{Currency, ExistenceRequirement, WithdrawReasons}, + }, + sp_std::{collections::btree_map::BTreeMap, vec::Vec}, + sp_tracing::error, +}; + +use crate::{agent, AccountIdOf, BalanceOf}; + +/// Stakes `amount` tokens from `staker` to `staked` by withdrawing the tokens +/// and adding them to the [`crate::StakingTo`] and [`crate::StakedBy`] maps. pub fn add_stake( staker: AccountIdOf, staked: AccountIdOf, @@ -39,9 +45,10 @@ pub fn add_stake( Ok(()) } +/// Withdraws stake from an agent and gives it back to the staker. pub fn remove_stake( - key: AccountIdOf, - agent_key: AccountIdOf, + staker: AccountIdOf, + staked: AccountIdOf, amount: BalanceOf, ) -> DispatchResult { ensure!( @@ -50,32 +57,34 @@ pub fn remove_stake( ); ensure!( - agent::exists::(&agent_key), + agent::exists::(&staked), crate::Error::::AgentDoesNotExist ); ensure!( - crate::StakingTo::::get(&key, &agent_key).unwrap_or(0) >= amount, + crate::StakingTo::::get(&staker, &staked).unwrap_or(0) >= amount, crate::Error::::NotEnoughStakeToWithdraw ); - crate::StakingTo::::mutate(&key, &agent_key, |stake| { + crate::StakingTo::::mutate(&staker, &staked, |stake| { *stake = Some(stake.unwrap_or(0).saturating_sub(amount)) }); - crate::StakedBy::::mutate(&agent_key, &key, |stake| { + crate::StakedBy::::mutate(&staked, &staker, |stake| { *stake = Some(stake.unwrap_or(0).saturating_sub(amount)) }); crate::TotalStake::::mutate(|total_stake| *total_stake = total_stake.saturating_sub(amount)); - let _ = ::Currency::deposit_creating(&key, amount); + let _ = ::Currency::deposit_creating(&staker, amount); crate::Pallet::::deposit_event(crate::Event::::StakeRemoved(key, agent_key, amount)); Ok(()) } +/// Transfers stake from an account to another (see [`remove_stake`], +/// [`add_stake`]). pub fn transfer_stake( staker: AccountIdOf, old_staked: AccountIdOf, @@ -87,6 +96,8 @@ pub fn transfer_stake( Ok(()) } +/// Usually called when de-registering an agent, removes all stakes on a given +/// key. pub(crate) fn clear_key(key: &AccountIdOf) -> DispatchResult { for (staker, staked, amount) in crate::StakingTo::::iter() { if &staker == key || &staked == key { diff --git a/runtime/src/apis.rs b/runtime/src/apis.rs index 6ccddd19..92550578 100644 --- a/runtime/src/apis.rs +++ b/runtime/src/apis.rs @@ -1,5 +1,5 @@ -use crate::*; use alloc::vec; + use frame::traits::UniqueSaturatedInto; use pallet_ethereum::{ Call::transact, Transaction as EthereumTransaction, TransactionAction, TransactionData, @@ -10,12 +10,12 @@ use pallet_grandpa::AuthorityId as GrandpaId; use polkadot_sdk::{ polkadot_sdk_frame::runtime::prelude::*, sp_consensus_aura::sr25519::AuthorityId as AuraId, - sp_core::crypto::KeyTypeId, - sp_core::H160, - sp_core::{H256, U256}, + sp_core::{crypto::KeyTypeId, H160, H256, U256}, sp_runtime::{traits::Block as BlockT, Permill}, }; +use crate::*; + impl_runtime_apis! { impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index 7a763982..e8801a39 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -1,4 +1,3 @@ -use crate::*; use frame_support::PalletId; use pallet_transaction_payment::{FungibleAdapter, Multiplier, TargetedFeeAdjustment}; use polkadot_sdk::{ @@ -17,6 +16,8 @@ use polkadot_sdk::{ }; use sp_runtime::{Perbill, Percent}; +use crate::*; + pub mod eth; /// The runtime has 18 token decimals @@ -69,8 +70,8 @@ impl frame_system::Config for Runtime { /// Contains version information about the runtime /// Used for runtime upgrades and compatibility type Version = Version; - /// Defines the weight (computational and storage) costs of blocks and extrinsics - /// Including base values and limits + /// Defines the weight (computational and storage) costs of blocks and + /// extrinsics Including base values and limits type BlockWeights = BlockWeights; /// Specifies the maximum size of a block in bytes type BlockLength = BlockLength; @@ -93,7 +94,8 @@ impl pallet_balances::Config for Runtime { type AccountStore = System; /// The overarching event type type RuntimeEvent = RuntimeEvent; - /// The type for recording an account's reason for being unable to withdraw funds + /// The type for recording an account's reason for being unable to withdraw + /// funds type RuntimeHoldReason = RuntimeHoldReason; /// The type for recording an account's freezing reason type RuntimeFreezeReason = (); @@ -124,7 +126,8 @@ impl pallet_balances::Config for Runtime { impl pallet_sudo::Config for Runtime { /// The overarching event type that will be emitted by this pallet type RuntimeEvent = RuntimeEvent; - /// The type that represents all calls that can be dispatched in this runtime + /// The type that represents all calls that can be dispatched in this + /// runtime type RuntimeCall = RuntimeCall; /// Weight information for the extrinsics in this pallet type WeightInfo = pallet_sudo::weights::SubstrateWeight; @@ -163,9 +166,11 @@ impl pallet_multisig::Config for Runtime { // --- Timestamp --- impl pallet_timestamp::Config for Runtime { - /// The type used to store timestamps. In this case, it's an unsigned 64-bit integer. + /// The type used to store timestamps. In this case, it's an unsigned 64-bit + /// integer. type Moment = u64; - /// A hook that is called after the timestamp is set. In this case, it's empty (unit type). + /// A hook that is called after the timestamp is set. In this case, it's + /// empty (unit type). type OnTimestampSet = (); /// The minimum period between blocks. Set to 4000 (8000/2) milliseconds. /// This helps prevent timestamp manipulation by validators. @@ -190,7 +195,8 @@ parameter_types! { /// Converts transaction length to fee using a polynomial formula pub struct LengthToFee; -/// Fee adjustment mechanism that slowly adjusts transaction fees based on block fullness +/// Fee adjustment mechanism that slowly adjusts transaction fees based on block +/// fullness pub type SlowAdjustingFeeUpdate = TargetedFeeAdjustment< R, TargetBlockFullness, @@ -202,7 +208,8 @@ pub type SlowAdjustingFeeUpdate = TargetedFeeAdjustment< impl WeightToFeePolynomial for LengthToFee { type Balance = Balance; - /// Returns coefficients for a polynomial that converts transaction length to fee + /// Returns coefficients for a polynomial that converts transaction length + /// to fee fn polynomial() -> WeightToFeeCoefficients { sp_std::vec![ WeightToFeeCoefficient { diff --git a/runtime/src/configs/eth.rs b/runtime/src/configs/eth.rs index ddfa7a30..35175940 100644 --- a/runtime/src/configs/eth.rs +++ b/runtime/src/configs/eth.rs @@ -1,7 +1,3 @@ -use crate::{ - configs::{currency, WEIGHT_REF_TIME_PER_SECOND}, - TransactionPayment, -}; use codec::{Decode, Encode}; use pallet_ethereum::PostLogContent; use pallet_evm::{FeeCalculator, HashedAddressMapping}; @@ -21,6 +17,10 @@ use super::{ precompiles::FrontierPrecompiles, Aura, Balances, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, Timestamp, UncheckedExtrinsic, NORMAL_DISPATCH_RATIO, }; +use crate::{ + configs::{currency, WEIGHT_REF_TIME_PER_SECOND}, + TransactionPayment, +}; impl pallet_evm_chain_id::Config for Runtime {} @@ -42,11 +42,13 @@ impl> FindAuthor for FindAuthorTruncated { /// Current approximation of the gas/s consumption considering /// EVM execution over compiled WASM (on 4.4Ghz CPU). /// Given the 2000ms Weight, from which 75% only are used for transactions, -/// the total EVM execution gas limit is: GAS_PER_SECOND * 2 * 0.75 ~= 60_000_000. +/// the total EVM execution gas limit is: GAS_PER_SECOND * 2 * 0.75 ~= +/// 60_000_000. pub const GAS_PER_SECOND: u64 = 40_000_000; /// Approximate ratio of the amount of Weight per Gas. -/// u64 works for approximations because Weight is a very small unit compared to gas. +/// u64 works for approximations because Weight is a very small unit compared to +/// gas. pub const WEIGHT_PER_GAS: u64 = WEIGHT_REF_TIME_PER_SECOND / GAS_PER_SECOND; const MAX_POV_SIZE: u64 = 5 * 1024 * 1024; @@ -71,19 +73,22 @@ parameter_types! { pub struct TransactionPaymentAsGasPrice; impl FeeCalculator for TransactionPaymentAsGasPrice { fn min_gas_price() -> (U256, Weight) { - // note: transaction-payment differs from EIP-1559 in that its tip and length fees are not - // scaled by the multiplier, which means its multiplier will be overstated when - // applied to an ethereum transaction - // note: transaction-payment uses both a congestion modifier (next_fee_multiplier, which is - // updated once per block in on_finalize) and a 'WeightToFee' implementation. Our - // runtime implements this as a 'ConstantModifier', so we can get away with a simple + // note: transaction-payment differs from EIP-1559 in that its tip and length + // fees are not scaled by the multiplier, which means its + // multiplier will be overstated when applied to an ethereum + // transaction note: transaction-payment uses both a congestion modifier + // (next_fee_multiplier, which is updated once per block in + // on_finalize) and a 'WeightToFee' implementation. Our runtime + // implements this as a 'ConstantModifier', so we can get away with a simple // multiplication here. - // It is imperative that `saturating_mul_int` be performed as late as possible in the - // expression since it involves fixed point multiplication with a division by a fixed - // divisor. This leads to truncation and subsequent precision loss if performed too early. - // This can lead to min_gas_price being same across blocks even if the multiplier changes. - // There's still some precision loss when the final `gas_price` (used_gas * min_gas_price) - // is computed in frontier, but that's currently unavoidable. + // It is imperative that `saturating_mul_int` be performed as late as possible + // in the expression since it involves fixed point multiplication with a + // division by a fixed divisor. This leads to truncation and subsequent + // precision loss if performed too early. This can lead to min_gas_price + // being same across blocks even if the multiplier changes. + // There's still some precision loss when the final `gas_price` (used_gas * + // min_gas_price) is computed in frontier, but that's currently + // unavoidable. let min_gas_price = TransactionPayment::next_fee_multiplier() .saturating_mul_int((currency::WEIGHT_FEE).saturating_mul(WEIGHT_PER_GAS as u128)); ( diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index f2a9f168..8959f417 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -5,12 +5,8 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); extern crate alloc; use alloc::vec::Vec; -use interface::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; -use weights::constants::RocksDbWeight; +use interface::*; use polkadot_sdk::{ frame_executive, frame_support, frame_system, polkadot_sdk_frame::{self as frame, prelude::*, runtime::prelude::*}, @@ -19,6 +15,10 @@ use polkadot_sdk::{ sp_runtime::impl_opaque_keys, *, }; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; +use weights::constants::RocksDbWeight; pub mod apis; #[cfg(feature = "runtime-benchmarks")] @@ -46,7 +46,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { state_version: 1, }; -/// The version information used to identify this runtime when compiled natively. +/// The version information used to identify this runtime when compiled +/// natively. #[cfg(feature = "std")] pub fn native_version() -> NativeVersion { NativeVersion { @@ -101,7 +102,8 @@ pub type RuntimeExecutive = frame_executive::Executive< Migrations, >; -// Composes the runtime by adding all the used pallets and deriving necessary types. +// Composes the runtime by adding all the used pallets and deriving necessary +// types. #[frame_construct_runtime] mod runtime { #[runtime::runtime] @@ -162,25 +164,25 @@ parameter_types! { pub const Version: RuntimeVersion = VERSION; } -/// Some re-exports that the node side code needs to know. Some are useful in this context as well. +/// Some re-exports that the node side code needs to know. Some are useful in +/// this context as well. /// /// Other types should preferably be private. // TODO: this should be standardized in some way, see: // https://github.com/paritytech/substrate/issues/10579#issuecomment-1600537558 pub mod interface { - use crate::RuntimeCall; - - use super::Runtime; use polkadot_sdk::{ frame_system, pallet_balances, sp_core::H160, sp_runtime::{self, generic, traits::BlakeTwo256, MultiSignature}, }; - pub use polkadot_sdk::{ frame_system::Call as SystemCall, pallet_balances::Call as BalancesCall, }; + use super::Runtime; + use crate::RuntimeCall; + pub type BlockNumber = u64; pub type Signature = MultiSignature; @@ -202,18 +204,18 @@ pub mod interface { pub type MinimumBalance = ::ExistentialDeposit; } -// Opaque types. These are used by the CLI to instantiate machinery that don't need to know -// the specifics of the runtime. They can then be made to be agnostic over specific formats -// of data like extrinsics, allowing for them to continue syncing the network through upgrades -// to even the core data structures. +// Opaque types. These are used by the CLI to instantiate machinery that don't +// need to know the specifics of the runtime. They can then be made to be +// agnostic over specific formats of data like extrinsics, allowing for them to +// continue syncing the network through upgrades to even the core data +// structures. pub mod opaque { - use super::*; - use frame::traits::BlakeTwo256; use sp_runtime::generic; - pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + use super::*; + /// Opaque block header type. pub type Header = generic::Header; /// Opaque block type. diff --git a/runtime/src/precompiles/balance_transfer.rs b/runtime/src/precompiles/balance_transfer.rs index 0882e40a..e0aca361 100644 --- a/runtime/src/precompiles/balance_transfer.rs +++ b/runtime/src/precompiles/balance_transfer.rs @@ -9,8 +9,10 @@ use polkadot_sdk::{ }; use sp_std::vec; -use crate::precompiles::{bytes_to_account_id, get_method_id, get_slice}; -use crate::{Runtime, RuntimeCall}; +use crate::{ + precompiles::{bytes_to_account_id, get_method_id, get_slice}, + Runtime, RuntimeCall, +}; pub const BALANCE_TRANSFER_INDEX: u64 = 2048; diff --git a/runtime/src/precompiles/mod.rs b/runtime/src/precompiles/mod.rs index b745e2b7..a00d3dd8 100644 --- a/runtime/src/precompiles/mod.rs +++ b/runtime/src/precompiles/mod.rs @@ -2,14 +2,13 @@ use pallet_evm::{ ExitError, IsPrecompileResult, Precompile, PrecompileFailure, PrecompileHandle, PrecompileResult, PrecompileSet, }; +use pallet_evm_precompile_modexp::Modexp; +use pallet_evm_precompile_sha3fips::Sha3FIPS256; +use pallet_evm_precompile_simple::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256}; use polkadot_sdk::{ sp_core::{hashing::keccak_256, H160}, sp_runtime::AccountId32, }; - -use pallet_evm_precompile_modexp::Modexp; -use pallet_evm_precompile_sha3fips::Sha3FIPS256; -use pallet_evm_precompile_simple::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256}; mod balance_transfer; use balance_transfer::*; diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index f259ba04..e55d3399 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -2,6 +2,9 @@ use std::{cell::RefCell, num::NonZeroU128}; +pub use pallet_emission0; +pub use pallet_governance; +pub use pallet_torus0; use pallet_torus0::MinAllowedStake; use polkadot_sdk::{ frame_support::{ @@ -22,8 +25,6 @@ use polkadot_sdk::{ sp_tracing, }; -pub use {pallet_emission0, pallet_governance, pallet_torus0}; - #[frame_construct_runtime] mod runtime { #[runtime::runtime] diff --git a/xtask/src/build_spec.rs b/xtask/src/build_spec.rs index d4f0aeec..981ed51f 100644 --- a/xtask/src/build_spec.rs +++ b/xtask/src/build_spec.rs @@ -202,38 +202,42 @@ pub type RefCount = u32; pub struct AccountInfo { /// The number of transactions this account has sent. pub nonce: Nonce, - /// The number of other modules that currently depend on this account's existence. The account - /// cannot be reaped until this is zero. + /// The number of other modules that currently depend on this account's + /// existence. The account cannot be reaped until this is zero. pub consumers: RefCount, - /// The number of other modules that allow this account to exist. The account may not be reaped - /// until this and `sufficients` are both zero. + /// The number of other modules that allow this account to exist. The + /// account may not be reaped until this and `sufficients` are both + /// zero. pub providers: RefCount, - /// The number of modules that allow this account to exist for their own purposes only. The - /// account may not be reaped until this and `providers` are both zero. + /// The number of modules that allow this account to exist for their own + /// purposes only. The account may not be reaped until this and + /// `providers` are both zero. pub sufficients: RefCount, - /// The additional data that belongs to this account. Used to store the balance(s) in a lot of - /// chains. + /// The additional data that belongs to this account. Used to store the + /// balance(s) in a lot of chains. pub data: AccountData, } /// All balance information for an account. #[derive(Debug, parity_scale_codec::Decode, parity_scale_codec::Encode)] pub struct AccountData { - /// Non-reserved part of the balance which the account holder may be able to control. + /// Non-reserved part of the balance which the account holder may be able to + /// control. /// - /// This is the only balance that matters in terms of most operations on tokens. + /// This is the only balance that matters in terms of most operations on + /// tokens. pub free: Balance, /// Balance which is has active holds on it and may not be used at all. /// - /// This is the sum of all individual holds together with any sums still under the (deprecated) - /// reserves API. + /// This is the sum of all individual holds together with any sums still + /// under the (deprecated) reserves API. pub reserved: Balance, - /// The amount that `free + reserved` may not drop below when reducing the balance, except for - /// actions where the account owner cannot reasonably benefit from the balance reduction, such - /// as slashing. + /// The amount that `free + reserved` may not drop below when reducing the + /// balance, except for actions where the account owner cannot + /// reasonably benefit from the balance reduction, such as slashing. pub frozen: Balance, - /// Extra information about this account. The MSB is a flag indicating whether the new ref- - /// counting logic is in place for this account. + /// Extra information about this account. The MSB is a flag indicating + /// whether the new ref- counting logic is in place for this account. pub flags: ExtraFlags, } diff --git a/xtask/src/run.rs b/xtask/src/run.rs index 03634255..48a6f863 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -82,13 +82,14 @@ pub(super) fn run(mut r: flags::Run) { #[allow(dead_code)] pub mod ops { - use super::*; use std::{ ffi::OsStr, io::Write, process::{Command, Stdio}, }; + use super::*; + #[macro_export] macro_rules! torus_node { ($($arg:expr),*) => {{ From 151076ab56545135457c1cad0271f1749562c21a Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Tue, 11 Feb 2025 20:44:32 -0300 Subject: [PATCH 03/46] chore: remove old commune stuff (#80) Removes unused storage values from Commune times. Storage values removed: * `MinAllowedWeights`, * `MaxAllowedWeights`, * `MinStakePerWeight`, * `RegistrationBlock` (in favor of `registration_block` within the Agent value). Fields removed from `GlobalParamsData`: * `max_allowed_weights`, * `min_stake_per_weight`. --- .github/CODEOWNERS | 2 +- pallets/emission0/src/lib.rs | 15 ---- pallets/emission0/src/weight_control.rs | 15 ++-- pallets/emission0/tests/distribution.rs | 4 +- pallets/emission0/tests/weights.rs | 23 +++---- pallets/governance/src/application.rs | 14 ++-- pallets/governance/src/benchmarks.rs | 4 +- pallets/governance/src/config.rs | 11 +-- pallets/governance/src/ext.rs | 4 -- pallets/governance/src/lib.rs | 24 +++---- pallets/governance/src/proposal.rs | 91 ++++++++++++++----------- pallets/governance/tests/voting.rs | 9 --- pallets/torus0/src/lib.rs | 5 -- pallets/torus0/src/stake.rs | 2 +- runtime/build.rs | 2 +- 15 files changed, 96 insertions(+), 129 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3435a54f..ccf4f2b4 100755 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -* @supremesource @saiintbrisson @steinerkelvin @devwckd +* @functor-flow @saiintbrisson @steinerkelvin @devwckd /.github/workflows/* @steinerkelvin @daviptrs @saiintbrisson /docker/**/* @steinerkelvin @daviptrs @saiintbrisson diff --git a/pallets/emission0/src/lib.rs b/pallets/emission0/src/lib.rs index 7b18c7c0..b0cf2f1b 100644 --- a/pallets/emission0/src/lib.rs +++ b/pallets/emission0/src/lib.rs @@ -51,21 +51,6 @@ pub mod pallet { pub type WeightControlDelegation = StorageMap<_, Identity, T::AccountId, T::AccountId>; - // TODO: remove - #[pallet::storage] - pub type MinAllowedWeights = - StorageValue<_, u16, ValueQuery, T::DefaultMinAllowedWeights>; - - /// Maximum number of weights a validator can set. - #[pallet::storage] - pub type MaxAllowedWeights = - StorageValue<_, u16, ValueQuery, T::DefaultMaxAllowedWeights>; - - // TODO: cap weights on distribution. - /// Minimum stake a validator needs for each weight it sets. - #[pallet::storage] - pub type MinStakePerWeight = StorageValue<_, BalanceOf, ValueQuery>; - /// Percentage of issued tokens to be burned every epoch. #[pallet::storage] pub type EmissionRecyclingPercentage = diff --git a/pallets/emission0/src/weight_control.rs b/pallets/emission0/src/weight_control.rs index 1f78c93c..60155980 100644 --- a/pallets/emission0/src/weight_control.rs +++ b/pallets/emission0/src/weight_control.rs @@ -18,11 +18,6 @@ pub fn set_weights( let acc_id = ensure_signed(origin)?; ::ensure_allocator(&acc_id)?; - ensure!( - weights.len() <= crate::MaxAllowedWeights::::get() as usize, - crate::Error::::WeightSetTooLarge - ); - ensure!( !crate::WeightControlDelegation::::contains_key(&acc_id), crate::Error::::CannotSetWeightsWhileDelegating, @@ -37,12 +32,8 @@ pub fn set_weights( .iter() .map(|(_, stake)| *stake) .sum(); - let min_stake_for_weights = crate::MinStakePerWeight::::get() - .checked_mul(weights.len() as u128) - .unwrap_or_default(); - ensure!( - total_stake >= min_stake_for_weights, + total_stake >= ::min_validator_stake(), crate::Error::::NotEnoughStakeToSetWeights ); @@ -95,6 +86,10 @@ pub fn delegate_weight_control( crate::Error::::AgentIsNotRegistered ); + // At the current network stage, it only makes sense to delegate weight control + // to allocators. + ::ensure_allocator(&target)?; + crate::WeightControlDelegation::::set(&acc_id, Some(target.clone())); crate::Pallet::::deposit_event(crate::Event::::DelegatedWeightControl(acc_id, target)); diff --git a/pallets/emission0/tests/distribution.rs b/pallets/emission0/tests/distribution.rs index b609403d..cc801476 100644 --- a/pallets/emission0/tests/distribution.rs +++ b/pallets/emission0/tests/distribution.rs @@ -13,7 +13,7 @@ use polkadot_sdk::{ use substrate_fixed::{traits::ToFixed, types::I96F32}; use test_utils::{ add_balance, add_stake, get_origin, - pallet_governance::TreasuryEmissionFee, + pallet_governance::{Allocators, TreasuryEmissionFee}, pallet_torus0::{ stake::sum_staked_by, Agents, FeeConstraints, MaxAllowedValidators, MinAllowedStake, MinValidatorStake, StakedBy, @@ -489,6 +489,8 @@ fn pays_weight_control_fee_and_dividends_to_stakers() { register_empty_agent(id); } + Allocators::::set(val_1, Some(())); + pallet_emission0::weight_control::delegate_weight_control::(get_origin(val_2), val_1) .expect("failed to delegate weight control"); diff --git a/pallets/emission0/tests/weights.rs b/pallets/emission0/tests/weights.rs index 37180ca7..d500083d 100644 --- a/pallets/emission0/tests/weights.rs +++ b/pallets/emission0/tests/weights.rs @@ -1,10 +1,10 @@ use pallet_emission0::{ weight_control::{delegate_weight_control, regain_weight_control, set_weights}, - ConsensusMembers, Error, MaxAllowedWeights, MinStakePerWeight, WeightControlDelegation, - Weights, + ConsensusMembers, Error, WeightControlDelegation, Weights, }; use test_utils::{ - add_stake, get_origin, pallet_governance::Allocators, register_empty_agent, Test, + add_stake, get_origin, pallet_governance::Allocators, pallet_torus0::MinValidatorStake, + register_empty_agent, Test, }; #[test] @@ -37,6 +37,11 @@ fn delegates_and_regains_weight_control() { register_empty_agent(delegated); + delegate_weight_control::(get_origin(delegator), delegated) + .expect_err("cannot delegate to not-allocator"); + + Allocators::::set(delegated, Some(())); + assert_eq!( delegate_weight_control::(get_origin(delegator), delegated), Ok(()) @@ -52,9 +57,6 @@ fn delegates_and_regains_weight_control() { #[test] fn sets_weights_correctly() { test_utils::new_test_ext().execute_with(|| { - MaxAllowedWeights::::set(5); - MinStakePerWeight::::set(1); - let validator = 0; assert_eq!( @@ -71,17 +73,12 @@ fn sets_weights_correctly() { register_empty_agent(validator); - assert_eq!( - set_weights::(get_origin(validator), vec![(0, 0); 6]), - Err(Error::::WeightSetTooLarge.into()), - ); - assert_eq!( set_weights::(get_origin(validator), vec![(0, 0); 5]), Err(Error::::NotEnoughStakeToSetWeights.into()), ); - add_stake(validator, validator, 3); + add_stake(validator, validator, MinValidatorStake::::get()); assert_eq!( set_weights::(get_origin(validator), vec![(0, 0); 5]), @@ -96,6 +93,8 @@ fn sets_weights_correctly() { register_empty_agent(1); register_empty_agent(2); + Allocators::::set(1, Some(())); + delegate_weight_control::(get_origin(validator), 1) .expect("failed to delegate weight control"); diff --git a/pallets/governance/src/application.rs b/pallets/governance/src/application.rs index 27af4c4c..58255e97 100644 --- a/pallets/governance/src/application.rs +++ b/pallets/governance/src/application.rs @@ -6,6 +6,7 @@ use polkadot_sdk::{ traits::{Currency, WithdrawReasons}, DebugNoBound, }, + polkadot_sdk_frame::prelude::BlockNumberFor, sp_runtime::BoundedVec, sp_std::vec::Vec, }; @@ -13,7 +14,6 @@ use scale_info::TypeInfo; use crate::{ frame::traits::ExistenceRequirement, whitelist, AccountIdOf, AgentApplications, BalanceOf, - Block, }; /// Decentralized autonomous organization application, it's used to do agent @@ -27,7 +27,7 @@ pub struct AgentApplication { pub agent_key: AccountIdOf, pub data: BoundedVec, pub cost: BalanceOf, - pub expires_at: Block, + pub expires_at: BlockNumberFor, pub action: ApplicationAction, pub status: ApplicationStatus, } @@ -104,12 +104,8 @@ pub fn submit_application( return Err(crate::Error::::InvalidApplicationDataLength.into()); } - let current_block: u64 = - TryInto::try_into(>::block_number()) - .ok() - .expect("blockchain will not exceed 2^64 blocks; QED."); - - let expires_at = current_block + config.agent_application_expiration; + let expires_at = >::block_number() + + config.agent_application_expiration; let next_id = AgentApplications::::iter() .count() @@ -198,7 +194,7 @@ pub fn deny_application(application_id: u32) -> DispatchResult /// Iterates through all open applications checking if the current block is /// greater or equal to the former's expiration block. If so, marks the /// application as Expired. -pub(crate) fn resolve_expired_applications(current_block: Block) { +pub(crate) fn resolve_expired_applications(current_block: BlockNumberFor) { for application in crate::AgentApplications::::iter_values() { if current_block < application.expires_at || !matches!(application.status, ApplicationStatus::Open) diff --git a/pallets/governance/src/benchmarks.rs b/pallets/governance/src/benchmarks.rs index 22241b88..bf91ddb7 100644 --- a/pallets/governance/src/benchmarks.rs +++ b/pallets/governance/src/benchmarks.rs @@ -10,7 +10,7 @@ use crate::*; fn create_application(module_key: &T::AccountId) { let config = crate::GlobalGovernanceConfig::::get(); let cost = config.agent_application_cost; - let _ = ::Currency::deposit_creating(&module_key, cost); + let _ = ::Currency::deposit_creating(module_key, cost); let min_data_len = T::MinApplicationDataLength::get(); let data = vec![0; min_data_len as usize]; @@ -112,8 +112,6 @@ benchmarks! { min_name_length: 2, max_name_length: T::MaxAgentNameLengthConstraint::get() as u16 - 1, max_allowed_agents: 1, - max_allowed_weights: 1, - min_stake_per_weight: 0, min_weight_control_fee: 1, min_staking_fee: 1, dividends_participation_weight: Percent::zero(), diff --git a/pallets/governance/src/config.rs b/pallets/governance/src/config.rs index 76f9cb28..b2fa98bf 100644 --- a/pallets/governance/src/config.rs +++ b/pallets/governance/src/config.rs @@ -1,21 +1,22 @@ use codec::{Decode, Encode, MaxEncodedLen}; use polkadot_sdk::{ - frame_election_provider_support::Get, frame_support::DebugNoBound, sp_runtime::Percent, + frame_election_provider_support::Get, frame_support::DebugNoBound, + polkadot_sdk_frame::prelude::BlockNumberFor, sp_runtime::Percent, }; use scale_info::TypeInfo; -use crate::{BalanceOf, BlockAmount}; +use crate::BalanceOf; #[derive(Clone, TypeInfo, Decode, Encode, PartialEq, Eq, DebugNoBound, MaxEncodedLen)] #[scale_info(skip_type_params(T))] pub struct GovernanceConfiguration { pub proposal_cost: BalanceOf, - pub proposal_expiration: BlockAmount, + pub proposal_expiration: BlockNumberFor, pub agent_application_cost: BalanceOf, - pub agent_application_expiration: BlockAmount, + pub agent_application_expiration: BlockNumberFor, pub proposal_reward_treasury_allocation: Percent, pub max_proposal_reward_treasury_allocation: BalanceOf, - pub proposal_reward_interval: BlockAmount, + pub proposal_reward_interval: BlockNumberFor, } impl Default for GovernanceConfiguration { diff --git a/pallets/governance/src/ext.rs b/pallets/governance/src/ext.rs index 539a4dd4..5c072c14 100644 --- a/pallets/governance/src/ext.rs +++ b/pallets/governance/src/ext.rs @@ -5,7 +5,3 @@ pub(super) type BalanceOf = <::Currency as Currency< >>::Balance; pub(super) type AccountIdOf = ::AccountId; - -pub(super) type Block = u64; - -pub(super) type BlockAmount = u64; diff --git a/pallets/governance/src/lib.rs b/pallets/governance/src/lib.rs index b6fd50fb..eda42782 100644 --- a/pallets/governance/src/lib.rs +++ b/pallets/governance/src/lib.rs @@ -119,7 +119,8 @@ pub mod pallet { type MaxApplicationDataLength: Get; #[pallet::constant] - type ApplicationExpiration: Get; + #[pallet::no_default_bounds] + type ApplicationExpiration: Get>; #[pallet::constant] type MaxPenaltyPercentage: Get; @@ -132,14 +133,16 @@ pub mod pallet { type DefaultProposalCost: Get>; #[pallet::constant] - type DefaultProposalExpiration: Get; + #[pallet::no_default_bounds] + type DefaultProposalExpiration: Get>; #[pallet::constant] #[pallet::no_default_bounds] type DefaultAgentApplicationCost: Get>; #[pallet::constant] - type DefaultAgentApplicationExpiration: Get; + #[pallet::no_default_bounds] + type DefaultAgentApplicationExpiration: Get>; #[pallet::constant] type DefaultProposalRewardTreasuryAllocation: Get; @@ -149,7 +152,8 @@ pub mod pallet { type DefaultMaxProposalRewardTreasuryAllocation: Get>; #[pallet::constant] - type DefaultProposalRewardInterval: Get; + #[pallet::no_default_bounds] + type DefaultProposalRewardInterval: Get>; #[pallet::no_default_bounds] type RuntimeEvent: From> @@ -167,14 +171,10 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(block_number: BlockNumberFor) -> Weight { - let current_block: u64 = block_number - .try_into() - .ok() - .expect("blockchain won't pass 2 ^ 64 blocks"); - - application::resolve_expired_applications::(current_block); - proposal::tick_proposals::(current_block); - proposal::tick_proposal_rewards::(current_block); + application::resolve_expired_applications::(block_number); + + proposal::tick_proposals::(block_number); + proposal::tick_proposal_rewards::(block_number); Weight::zero() } diff --git a/pallets/governance/src/proposal.rs b/pallets/governance/src/proposal.rs index 56abbf90..060f858b 100644 --- a/pallets/governance/src/proposal.rs +++ b/pallets/governance/src/proposal.rs @@ -7,8 +7,8 @@ use polkadot_sdk::{ storage::with_storage_layer, traits::{Currency, WithdrawReasons}, }, - polkadot_sdk_frame::traits::CheckedAdd, - sp_core::ConstU32, + polkadot_sdk_frame::{prelude::BlockNumberFor, traits::CheckedAdd}, + sp_core::{ConstU32, U256}, sp_runtime::{BoundedBTreeMap, DispatchError, Percent}, sp_std::{collections::btree_set::BTreeSet, vec::Vec}, sp_tracing::error, @@ -16,9 +16,9 @@ use polkadot_sdk::{ use substrate_fixed::types::I92F36; use crate::{ - frame::traits::ExistenceRequirement, AccountIdOf, BalanceOf, Block, BoundedBTreeSet, - BoundedVec, DaoTreasuryAddress, DebugNoBound, Error, GlobalGovernanceConfig, - GovernanceConfiguration, NotDelegatingVotingPower, Proposals, TypeInfo, UnrewardedProposals, + frame::traits::ExistenceRequirement, AccountIdOf, BalanceOf, BoundedBTreeSet, BoundedVec, + DaoTreasuryAddress, DebugNoBound, Error, GlobalGovernanceConfig, GovernanceConfiguration, + NotDelegatingVotingPower, Proposals, TypeInfo, UnrewardedProposals, }; pub type ProposalId = u64; @@ -29,13 +29,13 @@ pub type ProposalId = u64; pub struct Proposal { pub id: ProposalId, pub proposer: AccountIdOf, - pub expiration_block: Block, + pub expiration_block: BlockNumberFor, /// The actual data and type of the proposal. pub data: ProposalData, pub status: ProposalStatus, pub metadata: BoundedVec>, pub proposal_cost: BalanceOf, - pub creation_block: Block, + pub creation_block: BlockNumberFor, } impl Proposal { @@ -49,9 +49,15 @@ impl Proposal { /// For emission proposals, that is the creation block + 21600 blocks /// (roughly 2 days at 1 block every 8 seconds), as for the others, they /// are only executed on the expiration block. - pub fn execution_block(&self) -> Block { + pub fn execution_block(&self) -> BlockNumberFor { match self.data { - ProposalData::Emission { .. } => self.creation_block + 21_600, + ProposalData::Emission { .. } => { + self.creation_block + + U256::from(21_600) + .try_into() + .ok() + .expect("this is a safe conversion") + } _ => self.expiration_block, } } @@ -59,7 +65,7 @@ impl Proposal { /// Marks a proposal as accepted and executes it. pub fn accept( mut self, - block: Block, + block: BlockNumberFor, stake_for: BalanceOf, stake_against: BalanceOf, ) -> DispatchResult { @@ -91,8 +97,6 @@ impl Proposal { min_name_length, max_name_length, max_allowed_agents, - max_allowed_weights, - min_stake_per_weight, min_weight_control_fee, min_staking_fee, dividends_participation_weight, @@ -110,8 +114,6 @@ impl Proposal { Percent::from_percent(min_weight_control_fee); constraints.min_staking_fee = Percent::from_percent(min_staking_fee); }); - pallet_emission0::MaxAllowedWeights::::set(max_allowed_weights); - pallet_emission0::MinStakePerWeight::::set(min_stake_per_weight); crate::GlobalGovernanceConfig::::mutate(|config| { config.proposal_cost = proposal_cost; }); @@ -146,7 +148,7 @@ impl Proposal { /// Marks a proposal as refused. pub fn refuse( mut self, - block: Block, + block: BlockNumberFor, stake_for: BalanceOf, stake_against: BalanceOf, ) -> DispatchResult { @@ -165,7 +167,7 @@ impl Proposal { } /// Marks a proposal as expired. - pub fn expire(mut self, block_number: u64) -> DispatchResult { + pub fn expire(mut self, block_number: BlockNumberFor) -> DispatchResult { ensure!(self.is_active(), crate::Error::::ProposalIsFinished); ensure!( block_number >= self.expiration_block, @@ -201,7 +203,7 @@ pub enum ProposalStatus { }, /// Proposal was accepted. Accepted { - block: Block, + block: BlockNumberFor, /// Total stake that voted for the proposal. stake_for: BalanceOf, /// Total stake that voted against the proposal. @@ -209,7 +211,7 @@ pub enum ProposalStatus { }, /// Proposal was refused. Refused { - block: Block, + block: BlockNumberFor, /// Total stake that voted for the proposal. stake_for: BalanceOf, /// Total stake that voted against the proposal. @@ -228,8 +230,6 @@ pub struct GlobalParamsData { pub min_name_length: u16, pub max_name_length: u16, pub max_allowed_agents: u16, - pub max_allowed_weights: u16, - pub min_stake_per_weight: BalanceOf, pub min_weight_control_fee: u8, pub min_staking_fee: u8, pub dividends_participation_weight: Percent, @@ -242,8 +242,6 @@ impl Default for GlobalParamsData { min_name_length: T::DefaultMinNameLength::get(), max_name_length: T::DefaultMaxNameLength::get(), max_allowed_agents: T::DefaultMaxAllowedAgents::get(), - max_allowed_weights: T::DefaultMaxAllowedWeights::get(), - min_stake_per_weight: 0, min_weight_control_fee: T::DefaultMinWeightControlFee::get(), min_staking_fee: T::DefaultMinStakingFee::get(), dividends_participation_weight: @@ -270,11 +268,6 @@ impl GlobalParamsData { crate::Error::::InvalidMaxAllowedAgents ); - ensure!( - self.max_allowed_weights <= 2000, - crate::Error::::InvalidMaxAllowedWeights - ); - ensure!( self.min_weight_control_fee <= 100, crate::Error::::InvalidMinWeightControlFee @@ -337,7 +330,7 @@ impl ProposalData { #[derive(DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] #[scale_info(skip_type_params(T))] pub struct UnrewardedProposal { - pub block: Block, + pub block: BlockNumberFor, pub votes_for: BoundedBTreeMap, BalanceOf, ConstU32<{ u32::MAX }>>, pub votes_against: BoundedBTreeMap, BalanceOf, ConstU32<{ u32::MAX }>>, } @@ -434,10 +427,7 @@ fn add_proposal( .try_into() .map_err(|_| crate::Error::::InternalError)?; - let current_block: u64 = - TryInto::try_into(>::block_number()) - .ok() - .expect("blockchain will not exceed 2^64 blocks; QED."); + let current_block = >::block_number(); let proposal = Proposal:: { id: proposal_id, @@ -462,8 +452,12 @@ fn add_proposal( /// Every 100 blocks, iterates through all pending proposals and executes the /// ones eligible. -pub fn tick_proposals(block_number: Block) { - if block_number % 100 != 0 { +pub fn tick_proposals(block_number: BlockNumberFor) { + let block_number_u64: u64 = block_number + .try_into() + .ok() + .expect("blocknumber wont be greater than 2^64"); + if block_number_u64 % 100 != 0 { return; } @@ -492,7 +486,7 @@ fn get_minimum_stake_to_execute_with_percentage( /// the proposal is processes and executed. expiration block. fn tick_proposal( not_delegating: &BTreeSet, - block_number: u64, + block_number: BlockNumberFor, mut proposal: Proposal, ) -> DispatchResult { let ProposalStatus::Open { @@ -566,7 +560,7 @@ type AccountStakes = BoundedBTreeMap, BalanceOf, ConstU32<{ /// [tick_proposal_rewards]. fn create_unrewarded_proposal( proposal_id: u64, - block_number: Block, + block_number: BlockNumberFor, votes_for: Vec<(AccountIdOf, BalanceOf)>, votes_against: Vec<(AccountIdOf, BalanceOf)>, ) { @@ -617,10 +611,21 @@ fn calc_stake( } /// Processes the proposal reward queue and distributes rewards for all voters. -pub fn tick_proposal_rewards(block_number: u64) { +pub fn tick_proposal_rewards(block_number: BlockNumberFor) { let governance_config = crate::GlobalGovernanceConfig::::get(); + + let block_number: u64 = block_number + .try_into() + .ok() + .expect("blocknumber wont be greater than 2^64"); + let proposal_reward_interval: u64 = governance_config + .proposal_reward_interval + .try_into() + .ok() + .expect("blocknumber wont be greater than 2^64"); + let reached_interval = block_number - .checked_rem(governance_config.proposal_reward_interval) + .checked_rem(proposal_reward_interval) .is_some_and(|r| r == 0); if !reached_interval { return; @@ -630,10 +635,14 @@ pub fn tick_proposal_rewards(block_number: u64) { let mut account_stakes: AccountStakes = BoundedBTreeMap::new(); let mut total_allocation: I92F36 = I92F36::from_num(0); for (proposal_id, unrewarded_proposal) in UnrewardedProposals::::iter() { + let proposal_block: u64 = unrewarded_proposal + .block + .try_into() + .ok() + .expect("blocknumber wont be greater than 2^64"); + // Just checking if it's in the chain interval - if unrewarded_proposal.block - < block_number.saturating_sub(governance_config.proposal_reward_interval) - { + if proposal_block < block_number.saturating_sub(proposal_reward_interval) { continue; } diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index 491e5634..ef8cbe7d 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -109,15 +109,6 @@ fn global_governance_config_validates_parameters_correctly() { Error::::InvalidMaxAllowedAgents ); - assert_err!( - GlobalParamsData:: { - max_allowed_weights: 2001, - ..GlobalParamsData::default() - } - .validate(), - Error::::InvalidMaxAllowedWeights - ); - assert_err!( GlobalParamsData:: { min_weight_control_fee: 101, diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index d8af9d5e..86bdedec 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -68,11 +68,6 @@ pub mod pallet { #[pallet::storage] pub type Agents = StorageMap<_, Identity, AccountIdOf, Agent>; - // TODO: remove - #[pallet::storage] - pub type RegistrationBlock = - StorageMap<_, Identity, AccountIdOf, BlockNumberFor>; - /// Maximum number of characters allowed in an agent name. #[pallet::storage] pub type MaxNameLength = StorageValue<_, u16, ValueQuery, T::DefaultMaxNameLength>; diff --git a/pallets/torus0/src/stake.rs b/pallets/torus0/src/stake.rs index d1aee317..ac3ddfad 100644 --- a/pallets/torus0/src/stake.rs +++ b/pallets/torus0/src/stake.rs @@ -78,7 +78,7 @@ pub fn remove_stake( let _ = ::Currency::deposit_creating(&staker, amount); - crate::Pallet::::deposit_event(crate::Event::::StakeRemoved(key, agent_key, amount)); + crate::Pallet::::deposit_event(crate::Event::::StakeRemoved(staker, staked, amount)); Ok(()) } diff --git a/runtime/build.rs b/runtime/build.rs index e5194fc1..6b797f30 100644 --- a/runtime/build.rs +++ b/runtime/build.rs @@ -19,7 +19,7 @@ fn main() { #[cfg(feature = "std")] { substrate_wasm_builder::WasmBuilder::init_with_defaults() - .enable_metadata_hash("TORUS", 18) // TODO: disable on dev/local? this increases build times 100%+ + .enable_metadata_hash("TORUS", 18) .build(); } } From 0e7b0c7dfaca77c86ac9105e833d6669bf9f5e67 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Wed, 12 Feb 2025 09:13:27 -0300 Subject: [PATCH 04/46] fix: automatically delegate weights to allocator (#81) Updates weight control code to better handle the current state. This means all agents will automatically delegate weights to the allocator. Closes CHAIN-69. --- pallets/emission0/api/src/lib.rs | 4 +++ pallets/emission0/src/lib.rs | 14 +++++++- pallets/emission0/src/migrations.rs | 44 ++++++++++++++++++------- pallets/emission0/src/weight_control.rs | 24 ++++++++------ pallets/emission0/tests/distribution.rs | 4 +-- pallets/emission0/tests/weights.rs | 33 +++++++++++-------- pallets/governance/api/src/lib.rs | 2 ++ pallets/governance/src/lib.rs | 6 +++- pallets/governance/src/migrations.rs | 36 ++++---------------- pallets/torus0/src/agent.rs | 14 +++++++- pallets/torus0/src/migrations.rs | 25 ++------------ pallets/torus0/tests/agent.rs | 38 +++++++++++++++++---- runtime/src/lib.rs | 6 ++-- test-utils/src/lib.rs | 26 +-------------- 14 files changed, 148 insertions(+), 128 deletions(-) diff --git a/pallets/emission0/api/src/lib.rs b/pallets/emission0/api/src/lib.rs index ab57be98..c2e1a53e 100644 --- a/pallets/emission0/api/src/lib.rs +++ b/pallets/emission0/api/src/lib.rs @@ -1,5 +1,7 @@ #![no_std] +use polkadot_sdk::frame_support::dispatch::DispatchResult; + #[derive(Default)] pub struct ConsensusMemberStats { pub incentives: u16, @@ -11,4 +13,6 @@ pub trait Emission0Api { /// Returns `None` if the agent has not taken part in the last consensus /// run. fn consensus_stats(member: &AccountId) -> Option; + + fn delegate_weight_control(delegator: &AccountId, delegatee: &AccountId) -> DispatchResult; } diff --git a/pallets/emission0/src/lib.rs b/pallets/emission0/src/lib.rs index b0cf2f1b..9691bc73 100644 --- a/pallets/emission0/src/lib.rs +++ b/pallets/emission0/src/lib.rs @@ -25,11 +25,12 @@ pub mod weights; #[frame::pallet] pub mod pallet { - const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); use core::num::NonZeroU128; use frame::prelude::BlockNumberFor; + use frame_system::ensure_signed; use pallet_governance_api::GovernanceApi; use pallet_torus0_api::Torus0Api; use polkadot_sdk::sp_std; @@ -145,6 +146,9 @@ pub mod pallet { /// Agent does not have enough stake to set weights. NotEnoughStakeToSetWeights, + + /// At the current state, agents cannot control their own weight. + WeightControlNotEnabled, } #[pallet::event] @@ -173,6 +177,7 @@ pub mod pallet { origin: OriginFor, target: AccountIdOf, ) -> DispatchResult { + let origin = ensure_signed(origin)?; weight_control::delegate_weight_control::(origin, target) } @@ -212,4 +217,11 @@ impl Emission0Api for Pallet { } }) } + + fn delegate_weight_control( + delegator: &T::AccountId, + delegatee: &T::AccountId, + ) -> DispatchResult { + weight_control::delegate_weight_control::(delegator.clone(), delegatee.clone()) + } } diff --git a/pallets/emission0/src/migrations.rs b/pallets/emission0/src/migrations.rs index 57f390cd..af6e30c6 100644 --- a/pallets/emission0/src/migrations.rs +++ b/pallets/emission0/src/migrations.rs @@ -1,23 +1,43 @@ -use polkadot_sdk::{ - frame_support::{ - migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade, weights::Weight, - }, - sp_runtime::Percent, +use polkadot_sdk::frame_support::{ + migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade, weights::Weight, }; use crate::{Config, Pallet}; -pub mod v1 { +pub mod v2 { + use polkadot_sdk::sp_std::collections::btree_set::BTreeSet; + + use pallet_emission0_api::Emission0Api; + use pallet_governance_api::GovernanceApi; + use pallet_torus0_api::Torus0Api; + use super::*; - use crate::{EmissionRecyclingPercentage, IncentivesRatio}; - pub type Migration = VersionedMigration<0, 1, MigrateToV1, Pallet, W>; - pub struct MigrateToV1(core::marker::PhantomData); + pub type Migration = VersionedMigration<1, 2, MigrateToV2, Pallet, W>; + pub struct MigrateToV2(core::marker::PhantomData); - impl UncheckedOnRuntimeUpgrade for MigrateToV1 { + impl UncheckedOnRuntimeUpgrade for MigrateToV2 { fn on_runtime_upgrade() -> Weight { - EmissionRecyclingPercentage::::set(Percent::from_percent(81)); - IncentivesRatio::::set(Percent::from_percent(30)); + let allocators: BTreeSet<_> = ::get_allocators().collect(); + if let Some(allocator) = allocators.first() { + for agent in ::agent_ids() { + if allocators.contains(&agent) { + continue; + } + + if let Err(err) = + as Emission0Api>::delegate_weight_control( + &agent, allocator, + ) + { + polkadot_sdk::sp_tracing::error!( + "failed to delegate weight control from {agent:?} to {allocator:?}: {err:?}" + ); + } + } + } else { + polkadot_sdk::sp_tracing::error!("no allocators available"); + } Weight::zero() } diff --git a/pallets/emission0/src/weight_control.rs b/pallets/emission0/src/weight_control.rs index 60155980..40413dfd 100644 --- a/pallets/emission0/src/weight_control.rs +++ b/pallets/emission0/src/weight_control.rs @@ -66,33 +66,33 @@ pub fn set_weights( } pub fn delegate_weight_control( - origin: OriginFor, - target: T::AccountId, + delegator: T::AccountId, + delegatee: T::AccountId, ) -> DispatchResult { - let acc_id = ensure_signed(origin)?; - ensure!( - acc_id != target, + delegator != delegatee, crate::Error::::CannotDelegateWeightControlToSelf, ); ensure!( - ::is_agent_registered(&acc_id), + ::is_agent_registered(&delegator), crate::Error::::AgentIsNotRegistered ); ensure!( - ::is_agent_registered(&target), + ::is_agent_registered(&delegatee), crate::Error::::AgentIsNotRegistered ); // At the current network stage, it only makes sense to delegate weight control // to allocators. - ::ensure_allocator(&target)?; + ::ensure_allocator(&delegatee)?; - crate::WeightControlDelegation::::set(&acc_id, Some(target.clone())); + crate::WeightControlDelegation::::set(&delegator, Some(delegatee.clone())); - crate::Pallet::::deposit_event(crate::Event::::DelegatedWeightControl(acc_id, target)); + crate::Pallet::::deposit_event(crate::Event::::DelegatedWeightControl( + delegator, delegatee, + )); Ok(()) } @@ -100,6 +100,10 @@ pub fn delegate_weight_control( pub fn regain_weight_control(origin: OriginFor) -> DispatchResult { let acc_id = ensure_signed(origin)?; + if ::ensure_allocator(&acc_id).is_err() { + return Err(crate::Error::::WeightControlNotEnabled.into()); + } + crate::WeightControlDelegation::::mutate(acc_id, |val| match val.take() { Some(_) => Ok(()), None => Err(crate::Error::::AgentIsNotDelegating.into()), diff --git a/pallets/emission0/tests/distribution.rs b/pallets/emission0/tests/distribution.rs index cc801476..f01e1c69 100644 --- a/pallets/emission0/tests/distribution.rs +++ b/pallets/emission0/tests/distribution.rs @@ -12,7 +12,7 @@ use polkadot_sdk::{ }; use substrate_fixed::{traits::ToFixed, types::I96F32}; use test_utils::{ - add_balance, add_stake, get_origin, + add_balance, add_stake, pallet_governance::{Allocators, TreasuryEmissionFee}, pallet_torus0::{ stake::sum_staked_by, Agents, FeeConstraints, MaxAllowedValidators, MinAllowedStake, @@ -491,7 +491,7 @@ fn pays_weight_control_fee_and_dividends_to_stakers() { Allocators::::set(val_1, Some(())); - pallet_emission0::weight_control::delegate_weight_control::(get_origin(val_2), val_1) + pallet_emission0::weight_control::delegate_weight_control::(val_2, val_1) .expect("failed to delegate weight control"); let val_1_staker = 3; diff --git a/pallets/emission0/tests/weights.rs b/pallets/emission0/tests/weights.rs index d500083d..005828c9 100644 --- a/pallets/emission0/tests/weights.rs +++ b/pallets/emission0/tests/weights.rs @@ -14,47 +14,55 @@ fn delegates_and_regains_weight_control() { let delegated = 1; assert_eq!( - delegate_weight_control::(get_origin(delegator), delegator), + delegate_weight_control::(delegator, delegator), Err(Error::::CannotDelegateWeightControlToSelf.into()) ); assert_eq!( - delegate_weight_control::(get_origin(delegator), delegated), + delegate_weight_control::(delegator, delegated), Err(Error::::AgentIsNotRegistered.into()) ); - assert_eq!( - regain_weight_control::(get_origin(delegator)), - Err(Error::::AgentIsNotDelegating.into()) - ); + // TODO: reenable when weight control is enabled again + // assert_eq!( + // regain_weight_control::(get_origin(delegator)), + // Err(Error::::AgentIsNotDelegating.into()) + // ); register_empty_agent(delegator); assert_eq!( - delegate_weight_control::(get_origin(delegator), delegated), + delegate_weight_control::(delegator, delegated), Err(Error::::AgentIsNotRegistered.into()) ); register_empty_agent(delegated); - delegate_weight_control::(get_origin(delegator), delegated) + delegate_weight_control::(delegator, delegated) .expect_err("cannot delegate to not-allocator"); Allocators::::set(delegated, Some(())); assert_eq!( - delegate_weight_control::(get_origin(delegator), delegated), + delegate_weight_control::(delegator, delegated), Ok(()) ); assert!(WeightControlDelegation::::contains_key(delegator)); - assert_eq!(regain_weight_control::(get_origin(delegator)), Ok(())); - assert!(!WeightControlDelegation::::contains_key(delegator)); + assert_eq!( + regain_weight_control::(get_origin(delegator)), + Err(Error::::WeightControlNotEnabled.into()) + ); + + // TODO: reenable when weight control is enabled + // assert_eq!(regain_weight_control::(get_origin(delegator)), Ok(())); + // assert!(!WeightControlDelegation::::contains_key(delegator)); }); } #[test] +#[allow(unreachable_code)] fn sets_weights_correctly() { test_utils::new_test_ext().execute_with(|| { let validator = 0; @@ -95,8 +103,7 @@ fn sets_weights_correctly() { Allocators::::set(1, Some(())); - delegate_weight_control::(get_origin(validator), 1) - .expect("failed to delegate weight control"); + delegate_weight_control::(validator, 1).expect("failed to delegate weight control"); assert_eq!( set_weights::(get_origin(validator), vec![(1, 0); 5]), diff --git a/pallets/governance/api/src/lib.rs b/pallets/governance/api/src/lib.rs index 9d60155b..60d9fd5a 100644 --- a/pallets/governance/api/src/lib.rs +++ b/pallets/governance/api/src/lib.rs @@ -11,5 +11,7 @@ pub trait GovernanceApi { fn ensure_allocator(key: &AccountId) -> DispatchResult; + fn get_allocators() -> impl Iterator; + fn set_allocator(key: &AccountId); } diff --git a/pallets/governance/src/lib.rs b/pallets/governance/src/lib.rs index eda42782..39e5959c 100644 --- a/pallets/governance/src/lib.rs +++ b/pallets/governance/src/lib.rs @@ -42,7 +42,7 @@ use crate::{ pub mod pallet { #![allow(clippy::too_many_arguments)] - const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); use proposal::GlobalParamsData; use weights::WeightInfo; @@ -533,6 +533,10 @@ impl pallet_governance_api::GovernanceApi for Pallet crate::roles::ensure_allocator::(key) } + fn get_allocators() -> impl Iterator { + Allocators::::iter_keys() + } + fn set_allocator(key: &T::AccountId) { crate::Allocators::::insert(key, ()); } diff --git a/pallets/governance/src/migrations.rs b/pallets/governance/src/migrations.rs index 6ed34af1..a996c79a 100644 --- a/pallets/governance/src/migrations.rs +++ b/pallets/governance/src/migrations.rs @@ -1,41 +1,17 @@ -use polkadot_sdk::{ - frame_support::{ - migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade, weights::Weight, - }, - sp_runtime::Percent, +use polkadot_sdk::frame_support::{ + migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade, weights::Weight, }; use crate::{Config, Pallet}; -pub type Migrations = (v1::Migration, v2::Migration); - -pub mod v2 { - use super::*; - use crate::TreasuryEmissionFee; - - pub type Migration = VersionedMigration<1, 2, MigrateToV2, Pallet, W>; - pub struct MigrateToV2(core::marker::PhantomData); - - impl UncheckedOnRuntimeUpgrade for MigrateToV2 { - fn on_runtime_upgrade() -> Weight { - // Set Treasury emission fee to 5% - TreasuryEmissionFee::::put(Percent::from_percent(5)); - - Weight::zero() - } - } -} - -pub mod v1 { +pub mod v3 { use super::*; - use crate::GlobalGovernanceConfig; - pub type Migration = VersionedMigration<0, 1, MigrateToV1, Pallet, W>; - pub struct MigrateToV1(core::marker::PhantomData); + pub type Migration = VersionedMigration<2, 3, MigrateToV3, Pallet, W>; + pub struct MigrateToV3(core::marker::PhantomData); - impl UncheckedOnRuntimeUpgrade for MigrateToV1 { + impl UncheckedOnRuntimeUpgrade for MigrateToV3 { fn on_runtime_upgrade() -> Weight { - GlobalGovernanceConfig::::put(crate::config::GovernanceConfiguration::default()); Weight::zero() } } diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index ada91717..cdbeba93 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -134,7 +134,19 @@ pub fn register( crate::RegistrationsThisBlock::::mutate(|value| value.saturating_add(1)); crate::RegistrationsThisInterval::::mutate(|value| value.saturating_add(1)); - crate::Pallet::::deposit_event(crate::Event::::AgentRegistered(agent_key)); + crate::Pallet::::deposit_event(crate::Event::::AgentRegistered(agent_key.clone())); + + if let Some(allocator) = ::get_allocators().next() { + if let Err(err) = ::delegate_weight_control(&agent_key, &allocator) { + polkadot_sdk::sp_tracing::error!( + "failed to delegate weight control for {agent_key:?} on {allocator:?}: {err:?}" + ); + } + } else { + polkadot_sdk::sp_tracing::error!( + "no allocators available to delegate to for {agent_key:?}" + ); + } Ok(()) } diff --git a/pallets/torus0/src/migrations.rs b/pallets/torus0/src/migrations.rs index 7758c96b..feaa735d 100644 --- a/pallets/torus0/src/migrations.rs +++ b/pallets/torus0/src/migrations.rs @@ -1,30 +1,9 @@ -use polkadot_sdk::{ - frame_support::{ - migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade, weights::Weight, - }, - sp_runtime::Percent, +use polkadot_sdk::frame_support::{ + migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade, weights::Weight, }; use crate::{Config, Pallet}; -pub mod v1 { - use super::*; - use crate::{Agent, Agents}; - - pub type Migration = VersionedMigration<0, 1, MigrateToV1, Pallet, W>; - pub struct MigrateToV1(core::marker::PhantomData); - - impl UncheckedOnRuntimeUpgrade for MigrateToV1 { - fn on_runtime_upgrade() -> Weight { - Agents::::translate(|_key, mut agent: Agent| { - agent.weight_penalty_factor = Percent::from_percent(0); - Some(agent) - }); - Weight::zero() - } - } -} - pub mod v2 { use super::*; use crate::{Agent, Agents}; diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index e35422a6..d9eae8bb 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -1,15 +1,36 @@ -use pallet_torus0::{Burn, Error}; +use pallet_torus0::{agent::Agent, Agents, Burn, Error}; use polkadot_sdk::{frame_support::assert_err, sp_core::Get, sp_runtime::Percent}; -use test_utils::{assert_ok, pallet_governance, Test}; +use test_utils::{ + assert_ok, + pallet_emission0::WeightControlDelegation, + pallet_governance::{self, Allocators}, + Test, +}; #[test] fn register_correctly() { test_utils::new_test_ext().execute_with(|| { let agent = 0; + let allocator = 1; let name = "agent".as_bytes().to_vec(); let url = "idk://agent".as_bytes().to_vec(); let metadata = "idk://agent".as_bytes().to_vec(); + // Register allocator + Agents::::set( + allocator, + Some(Agent { + key: allocator, + name: Default::default(), + url: Default::default(), + metadata: Default::default(), + weight_penalty_factor: Default::default(), + registration_block: Default::default(), + fees: Default::default(), + }), + ); + Allocators::::set(allocator, Some(())); + assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent )); @@ -22,11 +43,16 @@ fn register_correctly() { metadata.clone(), )); - let agent = pallet_torus0::Agents::::get(agent).expect("it should exists"); + let agent = Agents::::get(agent).expect("it should exists"); assert_eq!(agent.name.to_vec(), name); assert_eq!(agent.url.to_vec(), url); assert_eq!(agent.metadata.to_vec(), metadata); + + assert_eq!( + WeightControlDelegation::::get(agent.key), + Some(allocator) + ); }); } @@ -406,7 +432,7 @@ fn update_correctly() { Some(weight_control_fee), )); - let agent = pallet_torus0::Agents::::get(agent).expect("it should exists"); + let agent = Agents::::get(agent).expect("it should exists"); assert_eq!(agent.name.to_vec(), new_name); assert_eq!(agent.url.to_vec(), new_url); @@ -456,7 +482,7 @@ fn update_with_zero_staking_fee() { Error::::InvalidStakingFee, ); - let agent = pallet_torus0::Agents::::get(agent).expect("it should exists"); + let agent = Agents::::get(agent).expect("it should exists"); assert_eq!(agent.name.to_vec(), name); assert_eq!(agent.url.to_vec(), url); @@ -506,7 +532,7 @@ fn update_with_zero_weight_control_fee() { Error::::InvalidWeightControlFee, ); - let agent = pallet_torus0::Agents::::get(agent).expect("it should exists"); + let agent = Agents::::get(agent).expect("it should exists"); assert_eq!(agent.name.to_vec(), name); assert_eq!(agent.url.to_vec(), url); diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 8959f417..8dadd9b3 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -85,10 +85,8 @@ pub type SignedPayload = sp_runtime::generic::SignedPayload, - pallet_governance::migrations::v2::Migration, - pallet_emission0::migrations::v1::Migration, - pallet_torus0::migrations::v1::Migration, + pallet_governance::migrations::v3::Migration, + pallet_emission0::migrations::v2::Migration, pallet_torus0::migrations::v2::Migration, ); diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index e55d3399..803f37cc 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -8,9 +8,7 @@ pub use pallet_torus0; use pallet_torus0::MinAllowedStake; use polkadot_sdk::{ frame_support::{ - self, - pallet_prelude::DispatchResult, - parameter_types, + self, parameter_types, traits::{Currency, Everything, Hooks}, PalletId, }, @@ -86,28 +84,6 @@ parameter_types! { pub const DefaultDividendsParticipationWeight: Percent = Percent::from_parts(40); } -impl pallet_governance_api::GovernanceApi for Test { - fn dao_treasury_address() -> AccountId { - pallet_governance::DaoTreasuryAddress::::get() - } - - fn treasury_emission_fee() -> Percent { - pallet_governance::TreasuryEmissionFee::::get() - } - - fn is_whitelisted(key: &AccountId) -> bool { - pallet_governance::Whitelist::::contains_key(key) - } - - fn ensure_allocator(key: &AccountId) -> DispatchResult { - pallet_governance::roles::ensure_allocator::(key) - } - - fn set_allocator(key: &AccountId) { - pallet_governance::Allocators::::insert(key, ()); - } -} - impl pallet_torus0::Config for Test { type DefaultMinValidatorStake = ConstU128<50_000_000_000_000_000_000_000>; From 15ebf95377f9bd2caac7de637e0146bbe53485e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:04:28 -0300 Subject: [PATCH 05/46] feat: add code coverage tooling & reports (#73) Closes CHAIN-46 --- .github/workflows/check.yml | 89 ++++++++++++++++++++++++++++++++++++- .vscode/extensions.json | 5 ++- .vscode/settings.json | 17 +++++-- README.md | 13 ++++++ flake.nix | 2 + rust-toolchain.toml | 2 +- xtask/src/flags.rs | 10 +++++ xtask/src/main.rs | 30 ++++++++++++- 8 files changed, 158 insertions(+), 10 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 00c67df6..9b563041 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -11,6 +11,13 @@ concurrency: jobs: check: + permissions: + pull-requests: write + id-token: write + pages: write + checks: write + contents: write + runs-on: ubuntu-24.04-8core-bakunin steps: @@ -44,8 +51,86 @@ jobs: args: --color=always --tests -- -D warnings token: ${{ secrets.GITHUB_TOKEN }} - - name: Run tests + # - name: Run tests + # env: + # RUST_BACKTRACE: 1 + # SKIP_WASM_BUILD: 1 + # run: cargo test + + - uses: jwalton/gh-find-current-pr@v1 + id: findPr + + - name: Extract branch name + shell: bash + run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT + id: extractBranch + + - name: Install cargo-llvm-cov + if: success() && steps.findPr.outputs.number && steps.extractBranch.outputs.branch + uses: taiki-e/install-action@cargo-llvm-cov + + - name: Install cargo-xtask + if: success() && steps.findPr.outputs.number && steps.extractBranch.outputs.branch + run: cargo install cargo-xtask + + - name: Generate lcov code coverage + if: success() && steps.findPr.outputs.number && steps.extractBranch.outputs.branch + run: cargo xtask coverage + env: + RUST_BACKTRACE: 1 + SKIP_WASM_BUILD: 1 + + - name: Generate coverage summary report + if: success() && steps.findPr.outputs.number && steps.extractBranch.outputs.branch + uses: irongut/CodeCoverageSummary@v1.3.0 + with: + filename: target/cov.xml + badge: true + format: markdown + hide_branch_rate: false + hide_complexity: true + indicators: true + output: both + + - name: Generate html code coverage + if: success() && steps.findPr.outputs.number && steps.extractBranch.outputs.branch + run: cargo xtask coverage --html env: RUST_BACKTRACE: 1 SKIP_WASM_BUILD: 1 - run: cargo test + + - name: Upload html report to S3 Bucket + if: success() && steps.findPr.outputs.number && steps.extractBranch.outputs.branch + id: htmlUpload + run: | + aws --endpoint-url $ENDPOINT s3 sync ./target/llvm-cov/html s3://$BUCKET_NAME/$BRANCH + echo "link=$(aws --endpoint-url $ENDPOINT s3 presign s3://$BUCKET_NAME/$BRANCH/index.html)" >> $GITHUB_OUTPUT + env: + BRANCH: ${{ steps.extractBranch.outputs.branch }} + ENDPOINT: ${{ vars.COV_ENDPOINT_URL }} + BUCKET_NAME: ${{ vars.COV_BUCKET_NAME }} + AWS_ACCESS_KEY_ID: ${{ secrets.COV_AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.COV_AWS_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: ${{ vars.COV_DEFAULT_REGION }} + + - name: Add coverage PR report comment + if: success() && steps.findPr.outputs.number + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: report + number: ${{ steps.findPr.outputs.pr }} + recreate: true + path: code-coverage-results.md + + - name: Add coverage PR html comment + if: success() && steps.findPr.outputs.number + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: html + number: ${{ steps.findPr.outputs.pr }} + recreate: true + message: | + [Detailed coverage report](${{ steps.htmlUpload.outputs.link }}) + + + diff --git a/.vscode/extensions.json b/.vscode/extensions.json index bc463a8a..aa8846dd 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,7 @@ { "recommendations": [ "streetsidesoftware.code-spell-checker", - "rust-lang.rust-analyzer" + "rust-lang.rust-analyzer", + "ryanluker.vscode-coverage-gutters" ] -} +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index e577c10d..3da0151c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,16 @@ // Editor "editor.formatOnSave": true, // Rust - "rust-analyzer.cargo.extraEnv": { "SKIP_WASM_BUILD": "1" }, - "rust-analyzer.check.extraEnv": { "SKIP_WASM_BUILD": "1" }, - "rust-analyzer.cargo.features": ["runtime-benchmarks"] -} + "rust-analyzer.cargo.extraEnv": { + "SKIP_WASM_BUILD": "1" + }, + "rust-analyzer.check.extraEnv": { + "SKIP_WASM_BUILD": "1" + }, + "rust-analyzer.cargo.features": [ + "runtime-benchmarks" + ], + "coverage-gutters.coverageFileNames": [ + "target/cov.xml", + ], +} \ No newline at end of file diff --git a/README.md b/README.md index f959ca8a..03dc22b7 100644 --- a/README.md +++ b/README.md @@ -88,3 +88,16 @@ Running a local dev node: ```sh cargo xtask run local --alice ``` + +## Code Coverage + +> Code coverage is done via [cargo-llvm-cov](https://github.com/taiki-e/cargo-llvm-cov). + +Run the following command to generate a `Cobertura` xml file on `target/cov.xml` that can be used with the [Coverage Gutters](https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters) VSCode plugin to display which functions and branches are not covered by tests yet. +```bash +cargo xtask coverage +``` + +If the `--html` attribute is passed to the command, an HTML website will be generated instead. It serves the same purpose as the plugin mentioned and can be accessed on `target/llvm-cov/html/index.html` + +**Pull requests must not lower the overall test coverage percentage.** \ No newline at end of file diff --git a/flake.nix b/flake.nix index a01996a2..a5a9f772 100644 --- a/flake.nix +++ b/flake.nix @@ -36,6 +36,8 @@ pkgs.act # Python pkgs.python310 + # Code coverage tool + pkgs.cargo-llvm-cov ]; in { checks = pkgs.mkShell { diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 6e63c01d..e99d69e0 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -6,6 +6,6 @@ # but we use the oxalica overlay, which does not fix this yet. # Should be fixed by https://github.com/rust-lang/rust/issues/123151. channel = "1.82.0" -components = ["clippy", "rustfmt", "rust-src", "rust-analyzer"] +components = ["clippy", "rustfmt", "rust-src", "rust-analyzer", "llvm-tools-preview"] targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"] profile = "minimal" diff --git a/xtask/src/flags.rs b/xtask/src/flags.rs index 20fa94f2..48fc358d 100644 --- a/xtask/src/flags.rs +++ b/xtask/src/flags.rs @@ -71,6 +71,10 @@ xflags::xflags! { optional --sudo sudo_key: String } + + cmd coverage { + optional --html + } } } @@ -86,6 +90,7 @@ pub struct Xtask { pub enum XtaskCmd { Run(Run), GenerateSpec(GenerateSpec), + Coverage(Coverage), } #[derive(Debug)] @@ -132,6 +137,11 @@ pub struct GenerateSpec { pub sudo: Option, } +#[derive(Debug)] +pub struct Coverage { + pub html: bool, +} + impl Xtask { #[allow(dead_code)] pub fn from_env_or_exit() -> Self { diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 6e500a58..1ae60048 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, net::IpAddr, path::Path}; +use std::{borrow::Cow, net::IpAddr, os::unix::process::CommandExt, path::Path}; use polkadot_sdk::sp_keyring; @@ -76,6 +76,34 @@ fn main() { std::fs::write(cmd.out, out).expect("failed to write resulting "); } + flags::XtaskCmd::Coverage(coverage) => { + const PALLETS: [&str; 3] = ["pallet-emission0", "pallet-governance", "pallet-torus0"]; + + let mut cmd = std::process::Command::new("cargo"); + let mut args = vec![ + "llvm-cov", + "--no-clean", + "--exclude-from-report", + "test-utils", + "--ignore-filename-regex", + "test-utils|weights.rs", + ]; + + for pallet in PALLETS { + args.extend_from_slice(&["-p", pallet]); + } + + if coverage.html { + let dev_args = ["--html"]; + args.extend_from_slice(&dev_args); + } else { + let ci_args = ["--cobertura", "--output-path", "target/cov.xml"]; + args.extend_from_slice(&ci_args); + } + + cmd.args(args); + cmd.exec(); + } } } From ff40ef2a2afc075b99e611c55717e525663858cb Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Thu, 13 Feb 2025 21:51:23 -0300 Subject: [PATCH 06/46] chore: drop substrate-fixed types (#82) This is a large one. We've been facing issues with the precision provided by `substrate-fixed` types for a while now. This commit drops this dependency in favor of the SDK's provided `Fixed` types, which handle 18 decimals of precision correctly for most cases. The change required various tweaks to how we test things. I also expanded coverage for the emission code. --- Cargo.lock | 24 - Cargo.toml | 1 - pallets/emission0/Cargo.toml | 2 - pallets/emission0/src/distribute.rs | 147 ++-- pallets/emission0/src/distribute/math.rs | 1004 +++------------------- pallets/emission0/src/lib.rs | 6 - pallets/emission0/tests/distribution.rs | 189 +++- pallets/governance/Cargo.toml | 2 - pallets/governance/src/proposal.rs | 58 +- pallets/governance/tests/voting.rs | 2 +- pallets/torus0/Cargo.toml | 2 - pallets/torus0/src/burn.rs | 39 +- pallets/torus0/src/lib.rs | 6 - runtime/src/configs.rs | 4 - test-utils/src/lib.rs | 4 - xtask/src/build_spec.rs | 1 - 16 files changed, 385 insertions(+), 1106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 10e9a976..a647b4d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8317,7 +8317,6 @@ dependencies = [ "parity-scale-codec", "polkadot-sdk", "scale-info", - "substrate-fixed", "test-utils", ] @@ -8460,7 +8459,6 @@ dependencies = [ "parity-scale-codec", "polkadot-sdk", "scale-info", - "substrate-fixed", "test-utils", ] @@ -9360,7 +9358,6 @@ dependencies = [ "parity-scale-codec", "polkadot-sdk", "scale-info", - "substrate-fixed", "test-utils", ] @@ -16451,17 +16448,6 @@ name = "substrate-build-script-utils" version = "11.0.0" source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" -[[package]] -name = "substrate-fixed" -version = "0.5.9" -source = "git+https://github.com/encointer/substrate-fixed.git?branch=master#ddaa922892d1565f02c9c5702f0aacd17da53ce2" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "substrate-typenum", -] - [[package]] name = "substrate-frame-rpc-support" version = "40.0.0" @@ -16539,16 +16525,6 @@ dependencies = [ "trie-db", ] -[[package]] -name = "substrate-typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f0091e93c2c75b233ae39424c52cb8a662c0811fb68add149e20e5d7e8a788" -dependencies = [ - "parity-scale-codec", - "scale-info", -] - [[package]] name = "substrate-wasm-builder" version = "24.0.1" diff --git a/Cargo.toml b/Cargo.toml index bfde1ee1..3df988dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,6 @@ codec = { package = "parity-scale-codec", version = "3.6.12", default-features = scale-info = { version = "2.11.1", default-features = false } polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk.git", branch = "stable2409", default-features = false } substrate-wasm-builder = { git = "https://github.com/paritytech/polkadot-sdk.git", branch = "stable2409", default-features = false } -substrate-fixed = { git = "https://github.com/encointer/substrate-fixed.git", branch = "master", default-features = false } # Utils num-traits = { version = "0.2.19", default-features = false, features = [ diff --git a/pallets/emission0/Cargo.toml b/pallets/emission0/Cargo.toml index 10749aa3..db36db69 100644 --- a/pallets/emission0/Cargo.toml +++ b/pallets/emission0/Cargo.toml @@ -12,7 +12,6 @@ std = [ "codec/std", "polkadot-sdk/std", "scale-info/std", - "substrate-fixed/std", "pallet-torus0-api/std", "num-traits/std", ] @@ -27,7 +26,6 @@ try-runtime = ["polkadot-sdk/try-runtime"] codec = { workspace = true, features = ["derive"] } scale-info = { workspace = true, features = ["derive"] } polkadot-sdk = { workspace = true, features = ["experimental", "runtime"] } -substrate-fixed.workspace = true num-traits.workspace = true diff --git a/pallets/emission0/src/distribute.rs b/pallets/emission0/src/distribute.rs index c0401966..b91a9599 100644 --- a/pallets/emission0/src/distribute.rs +++ b/pallets/emission0/src/distribute.rs @@ -9,7 +9,9 @@ use polkadot_sdk::{ }, polkadot_sdk_frame::prelude::BlockNumberFor, sp_core::Get, - sp_runtime::{traits::Saturating, ArithmeticError, DispatchError, Percent, Perquintill}, + sp_runtime::{ + traits::Saturating, ArithmeticError, DispatchError, FixedU128, Percent, Perquintill, + }, sp_std::{ borrow::Cow, collections::{btree_map::BTreeMap, btree_set::BTreeSet}, @@ -18,9 +20,8 @@ use polkadot_sdk::{ }, sp_tracing::{error, info}, }; -use substrate_fixed::{traits::ToFixed, types::I96F32}; -use crate::{BalanceOf, Config, ConsensusMember, IncentivesRatio}; +use crate::{BalanceOf, Config, ConsensusMember, IncentivesRatio, Weights}; mod math; @@ -84,10 +85,10 @@ pub fn get_total_emission_per_block() -> BalanceOf { pub struct ConsensusMemberInput { pub agent_id: T::AccountId, pub validator_permit: bool, - pub weights: Vec<(T::AccountId, I96F32)>, + pub weights: Vec<(T::AccountId, FixedU128)>, pub stakes: Vec<(T::AccountId, u128)>, pub total_stake: u128, - pub normalized_stake: I96F32, + pub normalized_stake: FixedU128, pub delegating_to: Option, pub registered: bool, } @@ -114,21 +115,21 @@ impl ConsensusMemberInput { let mut consensus_members: BTreeMap<_, _> = crate::ConsensusMembers::::iter().collect(); let mut inputs: Vec<_> = crate::WeightControlDelegation::::iter() - .map(|(delegator, validator)| { + .map(|(delegator, delegatee)| { let is_registered = registered_agents.remove(&delegator); consensus_members.remove(&delegator); - let mut input = if let Some(validator_input) = consensus_members.get(&validator) { + let mut input = if let Some(delegatee_input) = consensus_members.get(&delegatee) { Self::from_agent( delegator.clone(), - validator_input.clone(), + delegatee_input.weights.clone(), min_validator_stake, ) } else { Self::from_new_agent(delegator.clone(), is_registered) }; - input.delegating_to = Some(validator); + input.delegating_to = Some(delegatee); (delegator, input) }) @@ -137,18 +138,20 @@ impl ConsensusMemberInput { inputs.extend(registered_agents.into_iter().map(|agent_id| { let input = consensus_members .remove(&agent_id) - .map(|member| Self::from_agent(agent_id.clone(), member, min_validator_stake)) + .map(|member| { + Self::from_agent(agent_id.clone(), member.weights, min_validator_stake) + }) .unwrap_or_else(|| Self::from_new_agent(agent_id.clone(), true)); (agent_id, input) })); inputs.extend(consensus_members.into_iter().map(|(agent_id, member)| { - let input = Self::from_agent(agent_id.clone(), member, min_validator_stake); + let input = Self::from_agent(agent_id.clone(), member.weights, min_validator_stake); (agent_id, input) })); - let total_network_stake: I96F32 = - I96F32::from_num::(inputs.iter().map(|(_, member)| member.total_stake).sum()); + let total_network_stake = + FixedU128::from_inner(inputs.iter().map(|(_, member)| member.total_stake).sum()); inputs.sort_unstable_by(|(_, a), (_, b)| { b.validator_permit @@ -163,9 +166,9 @@ impl ConsensusMemberInput { input.weights.clear(); } - if total_network_stake != I96F32::from_num(0) { + if total_network_stake != 0.into() { input.normalized_stake = - I96F32::from_num(input.total_stake).saturating_div(total_network_stake) + FixedU128::from_inner(input.total_stake) / total_network_stake; } } @@ -177,7 +180,7 @@ impl ConsensusMemberInput { /// Calculates the total staked tokens and the normalized weights. pub fn from_agent( agent_id: T::AccountId, - member: ConsensusMember, + weights: Weights, min_validator_stake: u128, ) -> ConsensusMemberInput { let weight_factor = Percent::one() - ::weight_penalty_factor(&agent_id); @@ -193,10 +196,10 @@ impl ConsensusMemberInput { }) .collect(); - let validator_permit = total_stake >= min_validator_stake && !member.weights.is_empty(); + let validator_permit = total_stake >= min_validator_stake && !weights.is_empty(); let weights = validator_permit - .then(|| Self::prepare_weights(member, &agent_id)) + .then(|| Self::prepare_weights(weights, &agent_id)) .unwrap_or_default(); ConsensusMemberInput { @@ -215,12 +218,11 @@ impl ConsensusMemberInput { /// Removes self-weights, ensures the keys are registered to the consensus /// and normalizes it. pub fn prepare_weights( - member: ConsensusMember, + weights: Weights, agent_id: &T::AccountId, - ) -> Vec<(T::AccountId, I96F32)> { - let mut weights_sum = I96F32::default(); - let mut weights: Vec<_> = member - .weights + ) -> Vec<(T::AccountId, FixedU128)> { + let mut weights_sum = FixedU128::default(); + let mut weights: Vec<_> = weights .into_iter() .filter(|(id, _)| { id != agent_id @@ -228,15 +230,15 @@ impl ConsensusMemberInput { || ::is_agent_registered(id)) }) .map(|(id, weight)| { - let weight = I96F32::from_num(weight); + let weight = FixedU128::from_u32(weight as u32); weights_sum = weights_sum.saturating_add(weight); (id, weight) }) .collect(); - if weights_sum > I96F32::from_num(0) { + if weights_sum > 0.into() { for (_, weight) in weights.iter_mut() { - *weight = weight.saturating_div(weights_sum); + *weight = *weight / weights_sum; } } @@ -273,8 +275,8 @@ fn linear_rewards( .map(|(idx, id)| (id, idx)) .collect(); - let mut weights: Vec> = vec![vec![]; inputs.len()]; - let mut stakes = vec![I96F32::from_num(0); inputs.len()]; + let mut weights: Vec> = vec![vec![]; inputs.len()]; + let mut stakes = vec![FixedU128::from_inner(0); inputs.len()]; for ((input, weights), stake) in inputs.values().zip(&mut weights).zip(&mut stakes) { *stake = input.normalized_stake; @@ -291,37 +293,16 @@ fn linear_rewards( let ranks = math::matmul_sparse(&weights, &stakes, inputs.len()); let incentives = math::normalize(ranks); - let bonds_delta = math::row_hadamard_sparse(weights.as_ref(), stakes.as_ref()); + let bonds_delta = math::row_hadamard_sparse(&weights, &stakes); let bonds_delta = math::col_normalize_sparse(bonds_delta, inputs.len()); let dividends = math::matmul_transpose_sparse(&bonds_delta, &incentives); let dividends = math::normalize(dividends); - let calculate_active_stake = || { - let stakes = inputs - .values() - .map(|input| { - if input.validator_permit { - I96F32::from_num(input.total_stake) - } else { - I96F32::default() - } - }) - .collect(); - - math::normalize(stakes) - }; - let Emissions { mut dividends, incentives, - } = compute_emissions::( - &mut emission, - calculate_active_stake, - &stakes, - incentives, - dividends, - ); + } = compute_emissions::(&mut emission, &stakes, incentives, dividends); for (idx, input) in inputs.values().enumerate() { let Some(delegating_to) = &input.delegating_to else { @@ -345,18 +326,23 @@ fn linear_rewards( { delegated_dividend.subsume(stake); } else { + // This is an impossible case, but if something changes in the future, + // the code is here. + let stake_num = stake.peek(); T::Currency::resolve_creating(delegating_to, stake); + let _ = ::stake_to(delegating_to, delegating_to, stake_num); } } let upscaled_incentives: Vec<_> = incentives .iter() - .map(|i| I96F32::from_num(i.peek())) + .map(|i| FixedU128::from_inner(i.peek())) .collect(); let upscaled_incentives = math::vec_max_upscale_to_u16(&upscaled_incentives); + let upscaled_dividends: Vec<_> = dividends .iter() - .map(|i| I96F32::from_num(i.peek())) + .map(|i| FixedU128::from_inner(i.peek())) .collect(); let upscaled_dividends = math::vec_max_upscale_to_u16(&upscaled_dividends); @@ -417,49 +403,43 @@ struct Emissions { incentives: Vec<>::NegativeImbalance>, } -fn compute_emissions<'a, T: Config>( +fn compute_emissions( emission: &mut >::NegativeImbalance, - compute_active_stake: impl Fn() -> Vec, - stake: &'a [I96F32], - incentives: Vec, - dividends: Vec, + stake: &[FixedU128], + incentives: Vec, + dividends: Vec, ) -> Emissions { let combined_emission: Vec<_> = incentives .iter() .zip(dividends.iter()) .map(|(incentive, dividend)| incentive.saturating_add(*dividend)) .collect(); - let emission_sum: I96F32 = combined_emission.iter().sum(); + let emission_sum = combined_emission + .iter() + .fold(FixedU128::default(), |acc, &e| acc + e); let normalized_incentives = math::normalize_with_sum(incentives, emission_sum); - let normalized_dividends: Cow<'a, [I96F32]>; - - let to_be_emitted = I96F32::from_num(emission.peek()); - - // If emission is zero, replace emission with normalized stake. - if emission_sum == I96F32::from_num(0) { - let active_stake = compute_active_stake(); - - if math::is_zero(&active_stake) { - normalized_dividends = Cow::Borrowed(stake); - } else { - normalized_dividends = Cow::Owned(active_stake); - } + let normalized_dividends = if emission_sum == 0.into() { + // When incentives and dividends are zero, the protocol still needs to issue tokens, + // so it is distributed for all stake-holder agents. + Cow::Borrowed(stake) } else { let dividends_emission = math::normalize_with_sum(dividends, emission_sum); - normalized_dividends = Cow::Owned(dividends_emission); - } + Cow::Owned(dividends_emission) + }; + + let to_be_emitted = FixedU128::from_inner(emission.peek()); - let mut calculate_emissions = |v: &[I96F32], to_be_emitted: I96F32| { + let mut calculate_emissions = |v: &[FixedU128], to_be_emitted: FixedU128| { v.iter() - .map(|&se| se.checked_mul(to_be_emitted).unwrap_or_default()) - .map(|amount| emission.extract(amount.to_num())) + .map(|&se| se.const_checked_mul(to_be_emitted).unwrap_or_default()) + .map(|amount| emission.extract(amount.into_inner())) .collect::>() }; let incentives_ratio = IncentivesRatio::::get().deconstruct(); - let to_be_emitted = to_be_emitted.to_num::(); + let to_be_emitted = to_be_emitted.into_inner(); let incentives_to_be_emitted; let dividends_to_be_emitted; @@ -477,9 +457,14 @@ fn compute_emissions<'a, T: Config>( unreachable!() } - let incentives = - calculate_emissions(&normalized_incentives, incentives_to_be_emitted.to_fixed()); - let dividends = calculate_emissions(&normalized_dividends, dividends_to_be_emitted.to_fixed()); + let incentives = calculate_emissions( + &normalized_incentives, + FixedU128::from_inner(incentives_to_be_emitted), + ); + let dividends = calculate_emissions( + &normalized_dividends, + FixedU128::from_inner(dividends_to_be_emitted), + ); Emissions { dividends, diff --git a/pallets/emission0/src/distribute/math.rs b/pallets/emission0/src/distribute/math.rs index fc0e1002..9190223c 100644 --- a/pallets/emission0/src/distribute/math.rs +++ b/pallets/emission0/src/distribute/math.rs @@ -1,240 +1,49 @@ -#![allow(dead_code)] - // This is necessary because functions like `f64::{fract, floor, ceil}` // are only implemented in `std`. #[cfg(not(feature = "std"))] use num_traits::float::FloatCore; -use polkadot_sdk::sp_std::{cmp::Ordering, collections::btree_map::BTreeMap, vec, vec::Vec}; -use substrate_fixed::{ - transcendental::{exp, ln}, - types::I96F32, +use polkadot_sdk::{ + sp_runtime::{traits::Saturating, FixedPointNumber, FixedU128}, + sp_std::vec, + sp_std::vec::Vec, }; -// Return true when vector sum is zero. -pub fn is_zero(vector: &[I96F32]) -> bool { - vector.iter().sum::() == I96F32::from_num(0) -} - -pub fn normalize(x: Vec) -> Vec { - let sum: I96F32 = x.iter().sum(); +pub fn normalize(x: Vec) -> Vec { + let sum: FixedU128 = x.iter().fold(FixedU128::default(), |acc, &e| acc + e); normalize_with_sum(x, sum) } #[inline] -pub fn normalize_with_sum(mut x: Vec, sum: I96F32) -> Vec { - if sum == I96F32::from_num(0.) { +pub fn normalize_with_sum(mut x: Vec, sum: FixedU128) -> Vec { + if sum == FixedU128::from_inner(0) { return x; } for ele in &mut x { - *ele = ele.saturating_div(sum); + *ele = *ele / sum; } x } #[allow(dead_code)] -pub fn inplace_row_normalize_64(x: &mut [Vec]) { +pub fn inplace_row_normalize_64(x: &mut [Vec]) { for row in x { - let row_sum: I96F32 = row.iter().sum(); - if row_sum > I96F32::from_num(0.0_f64) { - row.iter_mut().for_each(|x_ij: &mut I96F32| { - *x_ij = x_ij.checked_div(row_sum).unwrap_or_default(); + let row_sum: FixedU128 = row.iter().fold(FixedU128::default(), |acc, &e| acc + e); + if row_sum > FixedU128::from_inner(0) { + row.iter_mut().for_each(|x_ij: &mut FixedU128| { + *x_ij = x_ij.const_checked_div(row_sum).unwrap_or_default(); }); } } } -pub fn fixed64_to_u64(x: I96F32) -> u64 { - x.to_num::() -} - -pub fn vec_fixed64_to_u64(vec: Vec) -> Vec { - vec.into_iter().map(fixed64_to_u64).collect() -} - -pub fn matmul_64(matrix: &[Vec], vector: &[I96F32]) -> Vec { - let Some(first_row) = matrix.first() else { - return vec![]; - }; - let cols = first_row.len(); - if cols == 0 { - return vec![]; - } - assert!(matrix.len() == vector.len()); - matrix - .iter() - .zip(vector) - .fold(vec![I96F32::from_num(0.0); cols], |acc, (row, vec_val)| { - row.iter() - .zip(acc) - .map(|(m_val, acc_val)| { - // Compute ranks: r_j = SUM(i) w_ij * s_i - // Compute trust scores: t_j = SUM(i) w_ij * s_i - // result_j = SUM(i) vector_i * matrix_ij - acc_val - .checked_add(vec_val.checked_mul(*m_val).unwrap_or_default()) - .unwrap_or(acc_val) - }) - .collect() - }) -} - -pub fn u16_proportion_to_fixed(x: u16) -> I96F32 { - I96F32::from_num(x).saturating_div(I96F32::from_num(u16::MAX)) -} - -pub fn fixed_proportion_to_u16(x: I96F32) -> u16 { - (x.saturating_mul(I96F32::from_num(u16::MAX))).to_num() -} - -// Return a new sparse matrix with a masked out diagonal of input sparse matrix. -pub fn mask_diag_sparse(sparse_matrix: &[Vec<(u16, I96F32)>]) -> Vec> { - let n: usize = sparse_matrix.len(); - let mut result: Vec> = vec![vec![]; n]; - for (i, sparse_row) in sparse_matrix.iter().enumerate() { - for (j, value) in sparse_row.iter() { - if i != (*j as usize) { - let Some(row) = result.get_mut(i) else { - continue; - }; - - row.push((*j, *value)); - } - } - } - result -} - -pub fn mat_ema_alpha_vec_sparse( - new: &[Vec<(u16, I96F32)>], - old: &[Vec<(u16, I96F32)>], - alpha: &[I96F32], -) -> Vec> { - assert_eq!( - new.len(), - old.len(), - "New and old matrices must have the same number of rows" - ); - let zero = I96F32::from_num(0.0); - let one = I96F32::from_num(1.0); - - new.iter() - .zip(old) - .map(|(new_row, old_row)| { - let mut row_map: BTreeMap = new_row - .iter() - .map(|&(j, value)| { - let alpha_val = alpha.get(j as usize).copied().unwrap_or(zero); - (j, alpha_val.saturating_mul(value)) - }) - .collect(); - - old_row.iter().for_each(|&(j, value)| { - let alpha_val = alpha.get(j as usize).copied().unwrap_or(zero); - let old_component = one.saturating_sub(alpha_val).saturating_mul(value); - row_map - .entry(j) - .and_modify(|e| *e = e.saturating_add(old_component)) - .or_insert(old_component); - }); - - row_map.into_iter().filter(|&(_, v)| v > zero).collect() - }) - .collect() -} - -pub fn calculate_logistic_params( - alpha_high: I96F32, - alpha_low: I96F32, - consensus_high: I96F32, - consensus_low: I96F32, -) -> (I96F32, I96F32) { - if consensus_high <= consensus_low - || alpha_low == I96F32::from_num(0) - || alpha_high == I96F32::from_num(0) - { - return (I96F32::from_num(0), I96F32::from_num(0)); - } - - let calc_term = |alpha: I96F32| { - ln((I96F32::from_num(1).saturating_div(alpha)).saturating_sub(I96F32::from_num(1))) - .unwrap_or(I96F32::from_num(0.0)) - }; - - let a = (calc_term(alpha_high).saturating_sub(calc_term(alpha_low))) - .saturating_div(consensus_low.saturating_sub(consensus_high)); - let b = calc_term(alpha_low) - .saturating_add(a) - .saturating_mul(consensus_low); - - (a, b) -} - -pub fn compute_alpha_values(consensus: &[I96F32], a: I96F32, b: I96F32) -> Vec { - let alpha: Vec = consensus - .iter() - .map(|&c| { - let exp_val = - exp(b.saturating_sub(a.saturating_mul(c))).unwrap_or(I96F32::from_num(0.0)); - I96F32::from_num(1.0).saturating_div(I96F32::from_num(1.0).saturating_add(exp_val)) - }) - .collect(); - - alpha -} - -trait Lerp { - fn lerp(self, other: Self, t: Self) -> Self; -} -impl Lerp for I96F32 { - fn lerp(self, other: Self, t: Self) -> Self { - self.saturating_add(other.saturating_sub(self)) - .saturating_mul(t) - } -} - -pub fn quantile(data: &[I96F32], quantile: f64) -> I96F32 { - let mut sorted = data.to_vec(); - sorted.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal)); - let len = sorted.len(); - if len == 0 { - return I96F32::from_num(0); - } - let pos = quantile * (len.saturating_sub(1)) as f64; - let (low, high) = (pos.floor() as usize, pos.ceil() as usize); - if low == high { - sorted.get(low).cloned().unwrap_or(I96F32::from_num(0)) - } else { - sorted - .get(low) - .cloned() - .unwrap_or(I96F32::from_num(0)) - .lerp( - sorted.get(high).cloned().unwrap_or(I96F32::from_num(0)), - I96F32::from_num(pos.fract()), - ) - } -} - -/// Normalizes (sum to 1 except 0) each row (dim=0) of a sparse matrix in-place. -pub fn inplace_row_normalize_sparse(sparse_matrix: &mut [Vec<(u16, I96F32)>]) { - for sparse_row in sparse_matrix.iter_mut() { - let row_sum: I96F32 = sparse_row.iter().map(|(_j, value)| *value).sum(); - if row_sum != I96F32::from_num(0) { - sparse_row - .iter_mut() - .for_each(|(_j, value)| *value = value.saturating_div(row_sum)); - } - } -} - pub fn matmul_sparse( - sparse_matrix: &[Vec<(usize, I96F32)>], - vector: &[I96F32], + sparse_matrix: &[Vec<(usize, FixedU128)>], + vector: &[FixedU128], columns: usize, -) -> Vec { - let mut result: Vec = vec![I96F32::from_num(0.0); columns]; +) -> Vec { + let mut result: Vec = vec![FixedU128::from_inner(0); columns]; for (i, sparse_row) in sparse_matrix.iter().enumerate() { for (j, value) in sparse_row.iter() { let Some(target) = result.get_mut(*j) else { @@ -249,357 +58,11 @@ pub fn matmul_sparse( result } -pub fn linear_consensus( - stake: &[I96F32], - score: &[Vec<(u16, I96F32)>], - columns: u16, -) -> Vec { - let zero: I96F32 = I96F32::from_num(0); - let mut consensus: Vec = vec![zero; columns as usize]; - let mut total_stake: I96F32 = zero; - - for (validator_stake, validator_score) in stake.iter().zip(score.iter()) { - if *validator_stake <= zero { - continue; - } - - total_stake = total_stake.saturating_add(*validator_stake); - - for (column, value) in validator_score.iter() { - if let Some(consensus_value) = consensus.get_mut(*column as usize) { - *consensus_value = - consensus_value.saturating_add(value.saturating_mul(*validator_stake)); - } - } - } - - if total_stake > zero { - for consensus_value in consensus.iter_mut() { - *consensus_value = consensus_value.saturating_div(total_stake); - } - } - - consensus -} - -pub fn weighted_median_col_sparse( - stake: &[I96F32], - score: &[Vec<(u16, I96F32)>], - columns: u16, - majority: I96F32, -) -> Vec { - let rows = stake.len(); - let zero: I96F32 = I96F32::from_num(0); - let use_stake = stake.iter().copied().filter(|&s| s > zero).collect(); - let use_stake = normalize(use_stake); - - let stake_sum: I96F32 = use_stake.iter().sum(); - let stake_idx: Vec = (0..use_stake.len()).collect(); - let minority: I96F32 = stake_sum.saturating_sub(majority); - let mut use_score: Vec> = vec![vec![zero; use_stake.len()]; columns as usize]; - - let mut median: Vec = vec![zero; columns as usize]; - let mut k: usize = 0; - - for r in 0..rows { - let Some(stake_r) = stake.get(r) else { - continue; - }; - let Some(score_r) = score.get(r) else { - continue; - }; - if *stake_r <= zero { - continue; - } - for (c, val) in score_r.iter() { - let Some(use_score_c) = use_score.get_mut(*c as usize) else { - continue; - }; - let Some(use_score_c_k) = use_score_c.get_mut(k) else { - continue; - }; - *use_score_c_k = *val; - } - k = k.saturating_add(1); - } - - for c in 0..columns as usize { - let Some(median_c) = median.get_mut(c) else { - continue; - }; - let Some(use_score_c) = use_score.get(c) else { - continue; - }; - *median_c = weighted_median( - &use_stake, - use_score_c, - &stake_idx, - minority, - zero, - stake_sum, - ); - } - - median -} - -// Stake-weighted median score finding algorithm, based on a mid pivot binary -// search. Normally a random pivot is used, but to ensure full determinism the -// mid point is chosen instead. Assumes relatively random score order for -// efficiency, typically less than O(nlogn) complexity. -// -// # Args: -// * 'stake': ( &Vec ): -// - stake, assumed to be normalized. -// -// * 'score': ( &Vec ): -// - score for which median is sought, 0 <= score <= 1 -// -// * 'partition_idx' ( &Vec ): -// - indices as input partition -// -// * 'minority' ( I96F32 ): -// - minority_ratio = 1 - majority_ratio -// -// * 'partition_lo' ( I96F32 ): -// - lower edge of stake for partition, where partition is a segment [lo, hi] -// inside stake integral [0, 1]. -// -// * 'partition_hi' ( I96F32 ): -// - higher edge of stake for partition, where partition is a segment [lo, hi] -// inside stake integral [0, 1]. -// -// # Returns: -// * 'median': ( I96F32 ): -// - median via random pivot binary search. -// -pub fn weighted_median( - stake: &Vec, - score: &Vec, - partition_idx: &[usize], - minority: I96F32, - partition_lo: I96F32, - partition_hi: I96F32, -) -> I96F32 { - let n = partition_idx.len(); - if n == 0 { - return I96F32::from_num(0); - } - if n == 1 { - let Some(partition_idx_0) = partition_idx.first() else { - return I96F32::from_num(0); - }; - let Some(score_idx) = score.get(*partition_idx_0) else { - return I96F32::from_num(0); - }; - return *score_idx; - } - assert!(stake.len() == score.len()); - let mid_idx: usize = n / 2; - let Some(partition_idx_mid_idx) = partition_idx.get(mid_idx) else { - return I96F32::from_num(0); - }; - let Some(pivot) = score.get(*partition_idx_mid_idx) else { - return I96F32::from_num(0); - }; - let mut lo_stake: I96F32 = I96F32::from_num(0); - let mut hi_stake: I96F32 = I96F32::from_num(0); - let mut lower: Vec = vec![]; - let mut upper: Vec = vec![]; - for &idx in partition_idx.iter() { - let Some(score_idx) = score.get(idx) else { - continue; - }; - let Some(stake_idx) = stake.get(idx) else { - continue; - }; - if *score_idx == *pivot { - continue; - } - if *score_idx < *pivot { - lo_stake = lo_stake.saturating_add(*stake_idx); - lower.push(idx); - } else { - hi_stake = hi_stake.saturating_add(*stake_idx); - upper.push(idx); - } - } - if (partition_lo.saturating_add(lo_stake) <= minority) - && (minority < partition_hi.saturating_sub(hi_stake)) - { - return *pivot; - } else if (minority < partition_lo.saturating_add(lo_stake)) && !lower.is_empty() { - return weighted_median( - stake, - score, - &lower, - minority, - partition_lo, - partition_lo.saturating_add(lo_stake), - ); - } else if (partition_hi.saturating_sub(hi_stake) <= minority) && !upper.is_empty() { - return weighted_median( - stake, - score, - &upper, - minority, - partition_hi.saturating_sub(hi_stake), - partition_hi, - ); - } - *pivot -} - -// Sum across each row (dim=0) of a sparse matrix. -pub fn row_sum_sparse(sparse_matrix: &[Vec<(u16, I96F32)>]) -> Vec { - let rows = sparse_matrix.len(); - let mut result: Vec = vec![I96F32::from_num(0); rows]; - for (i, sparse_row) in sparse_matrix.iter().enumerate() { - for (_j, value) in sparse_row.iter() { - let Some(result_i) = result.get_mut(i) else { - continue; - }; - - *result_i = result_i.saturating_add(*value); - } - } - result -} - -// Return sparse matrix with values above column threshold set to threshold -// value. -pub fn col_clip_sparse( - sparse_matrix: &[Vec<(u16, I96F32)>], - col_threshold: &[I96F32], -) -> Vec> { - let mut result: Vec> = vec![vec![]; sparse_matrix.len()]; - for (i, sparse_row) in sparse_matrix.iter().enumerate() { - for (j, value) in sparse_row.iter() { - let Some(col_threshold_j) = col_threshold.get(*j as usize) else { - continue; - }; - let Some(result_i) = result.get_mut(i) else { - continue; - }; - - if *col_threshold_j < *value { - result_i.push((*j, *col_threshold_j)); - } else { - result_i.push((*j, *value)); - } - } - } - result -} - -pub fn mask_rows_sparse( - mask: &[bool], - sparse_matrix: &[Vec<(u16, I96F32)>], -) -> Vec> { - if mask.is_empty() { - return sparse_matrix.to_vec(); - } - - let n: usize = sparse_matrix.len(); - assert_eq!(n, mask.len()); - - let mut result: Vec> = vec![vec![]; n]; - for (i, sparse_row) in sparse_matrix.iter().enumerate() { - let Some(mask_i) = mask.get(i) else { - continue; - }; - let Some(result_i) = result.get_mut(i) else { - continue; - }; - if !mask_i { - result_i.clone_from(sparse_row); - } - } - - result -} - -pub fn vec_mask_sparse_matrix( - sparse_matrix: &[Vec<(u16, I96F32)>], - first_vector: &[u64], - second_vector: &[u64], - mask_fn: impl Fn(u64, u64) -> bool, -) -> Option>> { - let n: usize = sparse_matrix.len(); - let mut result: Vec> = vec![vec![]; n]; - - for (i, sparse_row) in sparse_matrix.iter().enumerate() { - for (j, value) in sparse_row.iter() { - if !mask_fn(*first_vector.get(i)?, *second_vector.get(*j as usize)?) { - let Some(result_i) = result.get_mut(i) else { - continue; - }; - - result_i.push((*j, *value)); - } - } - } - - Some(result) -} - -pub fn inplace_mask_vector(mask: &[bool], vector: &mut [I96F32]) { - if mask.is_empty() { - return; - } - - assert_eq!(mask.len(), vector.len()); - let zero: I96F32 = I96F32::from_num(0.0); - - vector - .iter_mut() - .enumerate() - .filter(|(idx, _)| *mask.get(*idx).unwrap_or(&false)) - .for_each(|(_, v)| *v = zero); -} - -pub fn inplace_normalize_64(x: &mut [I96F32]) { - let x_sum: I96F32 = x.iter().sum(); - if x_sum == I96F32::from_num(0) { - return; - } - - for x in x { - *x = x.saturating_div(x_sum); - } -} - -pub fn vec_fixed64_to_fixed32(vec: Vec) -> Vec { - vec.into_iter().map(I96F32::from_num).collect() -} - -pub fn is_topk(vector: &[I96F32], k: usize) -> Vec { - let n: usize = vector.len(); - let mut result: Vec = vec![true; n]; - if n <= k { - return result; - } - - let mut idxs: Vec = (0..n).collect(); - idxs.sort_by_key(|&idx| *vector.get(idx).unwrap_or(&I96F32::from_num(0))); // ascending stable sort - let Some(idxs_n_sub_k) = idxs.get(..(n.saturating_sub(k))) else { - return result; - }; - for idx in idxs_n_sub_k { - let Some(result_idx) = result.get_mut(*idx) else { - continue; - }; - *result_idx = false; - } - - result -} - pub fn col_normalize_sparse( - mut sparse_matrix: Vec>, + mut sparse_matrix: Vec>, columns: usize, -) -> Vec> { - let mut col_sum: Vec = vec![I96F32::from_num(0); columns]; // assume square matrix, rows=cols +) -> Vec> { + let mut col_sum: Vec = vec![FixedU128::from_inner(0); columns]; // assume square matrix, rows=cols for sparse_row in &sparse_matrix { for (j, value) in sparse_row { @@ -615,10 +78,9 @@ pub fn col_normalize_sparse( let Some(col_sum_j) = col_sum.get(*j) else { continue; }; - if *col_sum_j == I96F32::from_num(0.) { - continue; + if *col_sum_j != 0.into() { + *value = *value / *col_sum_j; } - *value = value.saturating_div(*col_sum_j); } } @@ -626,10 +88,10 @@ pub fn col_normalize_sparse( } pub fn row_hadamard_sparse( - sparse_matrix: &[Vec<(usize, I96F32)>], - vector: &[I96F32], -) -> Vec> { - let mut result: Vec> = sparse_matrix.to_vec(); + sparse_matrix: &[Vec<(usize, FixedU128)>], + vector: &[FixedU128], +) -> Vec> { + let mut result: Vec> = sparse_matrix.to_vec(); for (row_idx, sparse_row) in result.iter_mut().enumerate() { for (_, value) in sparse_row { @@ -644,10 +106,10 @@ pub fn row_hadamard_sparse( } pub fn matmul_transpose_sparse( - sparse_matrix: &[Vec<(usize, I96F32)>], - vector: &[I96F32], -) -> Vec { - let mut result: Vec = vec![I96F32::from_num(0); sparse_matrix.len()]; + sparse_matrix: &[Vec<(usize, FixedU128)>], + vector: &[FixedU128], +) -> Vec { + let mut result: Vec = vec![FixedU128::from_inner(0); sparse_matrix.len()]; for (i, sparse_row) in sparse_matrix.iter().enumerate() { for (j, value) in sparse_row { // Compute dividends: d_j = SUM(i) b_ji * inc_i @@ -665,141 +127,32 @@ pub fn matmul_transpose_sparse( result } -pub fn mat_ema_sparse( - new: &[Vec<(u16, I96F32)>], - old: &[Vec<(u16, I96F32)>], - alpha: I96F32, -) -> Vec> { - assert_eq!(new.len(), old.len()); - let n = new.len(); // assume square matrix, rows=cols - let zero: I96F32 = I96F32::from_num(0.0); - let one_minus_alpha: I96F32 = I96F32::from_num(1.0).saturating_sub(alpha); - let mut result: Vec> = vec![vec![]; n]; - for i in 0..new.len() { - let mut row: Vec = vec![zero; n]; - let Some(new_i) = new.get(i) else { - continue; - }; - let Some(old_i) = old.get(i) else { - continue; - }; - for (j, value) in new_i.iter() { - let Some(row_j) = row.get_mut(*j as usize) else { - continue; - }; - *row_j = row_j.saturating_add(alpha.saturating_mul(*value)); - } - for (j, value) in old_i.iter() { - let Some(row_j) = row.get_mut(*j as usize) else { - continue; - }; - *row_j = row_j.saturating_add(one_minus_alpha.saturating_mul(*value)); - } - for (j, value) in row.iter().enumerate() { - let Some(result_i) = result.get_mut(i) else { - continue; - }; - if *value > zero { - result_i.push((j as u16, *value)) - } - } - } - result -} - /// Max-upscale vector and convert to u16 so max_value = u16::MAX. Assumes /// non-negative normalized input. -pub fn vec_max_upscale_to_u16(vec: &[I96F32]) -> Vec { - let u16_max = I96F32::from_num(u16::MAX); - let threshold = I96F32::from_num(32768); - let max_value = vec.iter().max(); +pub fn vec_max_upscale_to_u16(vec: &[FixedU128]) -> Vec { + const MAX: FixedU128 = FixedU128::from_u32(u16::MAX as u32); - match max_value { - Some(val) => { - if *val == I96F32::from_num(0) { - vec.iter() - .map(|e| e.saturating_mul(u16_max).to_num()) - .collect() - } else if *val > threshold { - vec.iter() - .map(|e| { - e.saturating_mul(u16_max.saturating_div(*val)) - .round() - .to_num() - }) - .collect() - } else { - vec.iter() - .map(|e| { - e.saturating_mul(u16_max) - .saturating_div(*val) - .round() - .to_num() - }) - .collect() - } - } - None => { - let sum: I96F32 = vec.iter().sum(); - vec.iter() - .map(|e| e.saturating_mul(u16_max).saturating_div(sum).to_num()) - .collect() - } - } -} + let Some(max_ele) = vec.iter().max().filter(|x| **x != 0.into()) else { + return vec![0; vec.len()]; + }; -pub fn vecdiv(x: &[I96F32], y: &[I96F32]) -> Vec { - assert_eq!(x.len(), y.len()); - let n = x.len(); - let mut result: Vec = vec![I96F32::from_num(0); n]; - for i in 0..n { - let Some(y_i) = y.get(i) else { - continue; - }; - if *y_i != I96F32::from_num(0.) { - let Some(result_i) = result.get_mut(i) else { - continue; - }; - let Some(x_i) = x.get(i) else { - continue; - }; - *result_i = x_i.saturating_div(*y_i); - } - } - result -} + let ratio = MAX / *max_ele; -// Max-upscale each column (dim=1) of a sparse matrix in-place. -pub fn inplace_col_max_upscale_sparse(sparse_matrix: &mut [Vec<(u16, I96F32)>], columns: u16) { - let mut col_max: Vec = vec![I96F32::from_num(0.0); columns as usize]; // assume square matrix, rows=cols - for sparse_row in sparse_matrix.iter() { - for (j, value) in sparse_row.iter() { - let Some(col_max_j) = col_max.get_mut(*j as usize) else { - continue; - }; - if *col_max_j < *value { - *col_max_j = *value; - } - } - } - for sparse_row in sparse_matrix.iter_mut() { - for (j, value) in sparse_row.iter_mut() { - let Some(col_max_j) = col_max.get(*j as usize) else { - continue; - }; - if *col_max_j == I96F32::from_num(0.) { - continue; - } - *value = value.saturating_div(*col_max_j); - } - } + vec.iter() + .map(|e| { + e.saturating_mul(ratio) + .round() + .trunc() + .into_inner() + .checked_div(FixedU128::DIV) + .unwrap_or_default() as u16 + }) + .collect() } #[cfg(test)] #[allow(clippy::arithmetic_side_effects, clippy::indexing_slicing)] mod tests { - use substrate_fixed::types::{I96F32, U64F64}; - use super::*; macro_rules! fixed_vec { @@ -807,40 +160,40 @@ mod tests { vec![] }; ($($x:expr),+ $(,)?) => { - vec![$(I96F32::from_num($x)),+] + vec![$(FixedU128::from_float($x)),+] }; } /// Reshape vector to sparse matrix with specified number of input rows, - /// cast f32 to I96F32. + /// cast f32 to FixedU128. fn vec_to_sparse_mat_fixed( - vector: &[f32], + vector: &[f64], rows: usize, transpose: bool, - ) -> Vec> { + ) -> Vec> { assert!( vector.len() % rows == 0, "Vector of len {:?} cannot reshape to {rows} rows.", vector.len() ); let cols: usize = vector.len() / rows; - let mut mat: Vec> = vec![]; + let mut mat: Vec> = vec![]; if transpose { for col in 0..cols { - let mut row_vec: Vec<(u16, I96F32)> = vec![]; + let mut row_vec: Vec<(u16, FixedU128)> = vec![]; for row in 0..rows { if vector[row * cols + col] > 0. { - row_vec.push((row as u16, I96F32::from_num(vector[row * cols + col]))); + row_vec.push((row as u16, FixedU128::from_float(vector[row * cols + col]))); } } mat.push(row_vec); } } else { for row in 0..rows { - let mut row_vec: Vec<(u16, I96F32)> = vec![]; + let mut row_vec: Vec<(u16, FixedU128)> = vec![]; for col in 0..cols { if vector[row * cols + col] > 0. { - row_vec.push((col as u16, I96F32::from_num(vector[row * cols + col]))); + row_vec.push((col as u16, FixedU128::from_float(vector[row * cols + col]))); } } mat.push(row_vec); @@ -849,11 +202,15 @@ mod tests { mat } - fn assert_float_compare(a: I96F32, b: I96F32, epsilon: I96F32) { - assert!(I96F32::abs(a - b) <= epsilon, "a({a:?}) != b({b:?})"); + fn assert_float_compare(a: FixedU128, b: FixedU128, epsilon: FixedU128) { + dbg!(a, b, epsilon); + assert!( + a.into_inner().abs_diff(b.into_inner()) <= epsilon.into_inner(), + "a({a:?}) != b({b:?})" + ); } - fn assert_vec_compare(va: &[I96F32], vb: &[I96F32], epsilon: I96F32) { + fn assert_vec_compare(va: &[FixedU128], vb: &[FixedU128], epsilon: FixedU128) { assert!(va.len() == vb.len()); for (a, b) in va.iter().zip(vb.iter()) { assert_float_compare(*a, *b, epsilon); @@ -861,198 +218,89 @@ mod tests { } fn assert_sparse_mat_compare( - ma: &[Vec<(u16, I96F32)>], - mb: &[Vec<(u16, I96F32)>], - epsilon: I96F32, + ma: &[Vec<(u16, FixedU128)>], + mb: &[Vec<(u16, FixedU128)>], + epsilon: FixedU128, ) { assert!(ma.len() == mb.len()); for row in 0..ma.len() { assert!(ma[row].len() == mb[row].len()); for j in 0..ma[row].len() { - assert!(ma[row][j].0 == mb[row][j].0); // u16 - assert_float_compare(ma[row][j].1, mb[row][j].1, epsilon) // I96F32 + assert!(ma[row][j].0 == mb[row][j].0); + assert_float_compare(ma[row][j].1, mb[row][j].1, epsilon) } } } #[test] fn test_math_u64_normalization() { - let min: u64 = 1; - let mid: u64 = 10_500_000_000_000_000; - let max: u64 = 21_000_000_000_000_000; - let min_64: I96F32 = I96F32::from_num(min); - let mid_64: I96F32 = I96F32::from_num(mid); - let max_64: I96F32 = I96F32::from_num(max); - let max_sum: I96F32 = I96F32::from_num(max); - let min_frac: I96F32 = min_64 / max_sum; - assert_eq!(min_frac, I96F32::from_num(0.0000000000000000476)); - let half: I96F32 = mid_64 / max_sum; - assert_eq!(half, I96F32::from_num(0.5)); - let one: I96F32 = max_64 / max_sum; - assert_eq!(one, I96F32::from_num(1)); + let min: u128 = 1; + let mid: u128 = 10_500_000_000_000_000; + let max: u128 = 21_000_000_000_000_000; + let min_64: FixedU128 = FixedU128::from_inner(min); + let mid_64: FixedU128 = FixedU128::from_inner(mid); + let max_64: FixedU128 = FixedU128::from_inner(max); + let max_sum: FixedU128 = FixedU128::from_inner(max); + let min_frac: FixedU128 = min_64 / max_sum; + assert_eq!(min_frac, FixedU128::from_float(0.0000000000000000476)); + let half: FixedU128 = mid_64 / max_sum; + assert_eq!(half, FixedU128::from_float(0.5)); + let one: FixedU128 = max_64 / max_sum; + assert_eq!(one, FixedU128::from_u32(1)); } #[test] - fn test_math_to_num() { - let val: I96F32 = I96F32::from_num(u16::MAX); - let res: u16 = val.to_num::(); - assert_eq!(res, u16::MAX); - let vector: Vec = vec![val; 1000]; - let target: Vec = vec![u16::MAX; 1000]; - let output: Vec = vector.iter().map(|e: &I96F32| e.to_num::()).collect(); - assert_eq!(output, target); - let output: Vec = vector - .iter() - .map(|e: &I96F32| (*e).to_num::()) - .collect(); - assert_eq!(output, target); - let val: I96F32 = I96F32::max_value(); - let res: u128 = val.to_num::(); - let vector: Vec = vec![val; 1000]; - let target: Vec = vec![res; 1000]; - let output: Vec = vector.iter().map(|e: &I96F32| e.to_num()).collect(); - assert_eq!(output, target); - let output: Vec = vector.iter().map(|e: &I96F32| e.to_num()).collect(); - assert_eq!(output, target); - let val: I96F32 = I96F32::from_num(0); - let res: u64 = val.to_num::(); - let vector: Vec = vec![val; 1000]; - let target: Vec = vec![res; 1000]; - let output: Vec = vector.iter().map(|e: &I96F32| e.to_num::()).collect(); - assert_eq!(output, target); - let output: Vec = vector - .iter() - .map(|e: &I96F32| (*e).to_num::()) - .collect(); - assert_eq!(output, target); - let val: U64F64 = U64F64::from_num(u64::MAX); - let res: u64 = val.to_num::(); - assert_eq!(res, u64::MAX); - let vector: Vec = vec![val; 1000]; - let target: Vec = vec![u64::MAX; 1000]; - let output: Vec = vector.iter().map(|e: &U64F64| e.to_num::()).collect(); - assert_eq!(output, target); - let output: Vec = vector - .iter() - .map(|e: &U64F64| (*e).to_num::()) - .collect(); - assert_eq!(output, target); - } - - #[test] - fn test_math_vec_to_sparse_mat_fixed() { - let vector: Vec = vec![0., 1., 2., 0., 10., 100.]; - let target: Vec> = vec![ - vec![(1, I96F32::from_num(1.)), (2, I96F32::from_num(2.))], - vec![(1, I96F32::from_num(10.)), (2, I96F32::from_num(100.))], - ]; - let mat = vec_to_sparse_mat_fixed(&vector, 2, false); - assert_sparse_mat_compare(&mat, &target, I96F32::from_num(0)); - let vector: Vec = vec![0., 0.]; - let target: Vec> = vec![vec![], vec![]]; - let mat = vec_to_sparse_mat_fixed(&vector, 2, false); - assert_sparse_mat_compare(&mat, &target, I96F32::from_num(0)); - let vector: Vec = vec![0., 1., 2., 0., 10., 100.]; - let target: Vec> = vec![ - vec![], - vec![(0, I96F32::from_num(1.)), (1, I96F32::from_num(10.))], - vec![(0, I96F32::from_num(2.)), (1, I96F32::from_num(100.))], + fn test_math_vec_to_sparse_mat_fixed2() { + let test_cases = vec![ + ( + vec![0., 1., 2., 0., 10., 100.], + vec![ + vec![(1, FixedU128::from_u32(1)), (2, FixedU128::from_u32(2))], + vec![(1, FixedU128::from_u32(10)), (2, FixedU128::from_u32(100))], + ], + false, + ), + (vec![0., 0.], vec![vec![], vec![]], false), + ( + vec![0., 1., 2., 0., 10., 100.], + vec![ + vec![], + vec![(0, FixedU128::from_u32(1)), (1, FixedU128::from_u32(10))], + vec![(0, FixedU128::from_u32(2)), (1, FixedU128::from_u32(100))], + ], + true, + ), + (vec![0., 0.], vec![vec![]], true), ]; - let mat = vec_to_sparse_mat_fixed(&vector, 2, true); - assert_sparse_mat_compare(&mat, &target, I96F32::from_num(0)); - let vector: Vec = vec![0., 0.]; - let target: Vec> = vec![vec![]]; - let mat = vec_to_sparse_mat_fixed(&vector, 2, true); - assert_sparse_mat_compare(&mat, &target, I96F32::from_num(0)); - } - #[test] - fn test_math_normalize() { - let epsilon: I96F32 = I96F32::from_num(0.0001); - let x: Vec = vec![]; - let y: Vec = normalize(x.clone()); - assert_vec_compare(&x, &y, epsilon); - let x: Vec = fixed_vec![1.0, 10.0, 30.0,]; - let y: Vec = normalize(x.clone()); - assert_vec_compare( - &y, - &[ - I96F32::from_num(0.0243902437), - I96F32::from_num(0.243902439), - I96F32::from_num(0.7317073171), - ], - epsilon, - ); - assert_float_compare(y.iter().sum(), I96F32::from_num(1.0), epsilon); - let x: Vec = fixed_vec![-1.0, 10.0, 30.0]; - let y: Vec = normalize(x.clone()); - assert_vec_compare( - &y, - &[ - I96F32::from_num(-0.0256410255), - I96F32::from_num(0.2564102563), - I96F32::from_num(0.769230769), - ], - epsilon, - ); - assert_float_compare(y.iter().sum(), I96F32::from_num(1.0), epsilon); + for (vector, target, transpose) in test_cases { + let mat = vec_to_sparse_mat_fixed(&vector, 2, transpose); + assert_sparse_mat_compare(&mat, &target, FixedU128::from_inner(0)); + } } #[test] - fn test_math_inplace_row_normalize_sparse() { - let epsilon: I96F32 = I96F32::from_num(0.0001); - let vector: Vec = vec![ - 0., 1., 0., 2., 0., 3., 4., 0., 1., 0., 2., 0., 3., 0., 1., 0., 0., 2., 0., 3., 4., 0., - 10., 0., 100., 1000., 0., 10000., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., - 1., - ]; - let mut mat = vec_to_sparse_mat_fixed(&vector, 6, false); - inplace_row_normalize_sparse(&mut mat); - let target: Vec = vec![ - 0., 0.1, 0., 0.2, 0., 0.3, 0.4, 0., 0.166666, 0., 0.333333, 0., 0.5, 0., 0.1, 0., 0., - 0.2, 0., 0.3, 0.4, 0., 0.0009, 0., 0.009, 0.09, 0., 0.9, 0., 0., 0., 0., 0., 0., 0., - 0.142857, 0.142857, 0.142857, 0.142857, 0.142857, 0.142857, 0.142857, + fn test_math_normalize2() { + let epsilon = FixedU128::from_float(0.0001); + + let test_cases = vec![ + (vec![], vec![]), + ( + fixed_vec![1.0, 10.0, 30.0], + fixed_vec![0.0243902437, 0.243902439, 0.7317073171], + ), ]; - assert_sparse_mat_compare(&mat, &vec_to_sparse_mat_fixed(&target, 6, false), epsilon); - let vector: Vec = vec![0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]; - let target: Vec = vec![0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]; - let mut mat = vec_to_sparse_mat_fixed(&vector, 3, false); - inplace_row_normalize_sparse(&mut mat); - assert_sparse_mat_compare( - &mat, - &vec_to_sparse_mat_fixed(&target, 3, false), - I96F32::from_num(0), - ); - } - #[test] - fn test_math_mask_diag_sparse() { - let vector: Vec = vec![1., 2., 3., 4., 5., 6., 7., 8., 9.]; - let target: Vec = vec![0., 2., 3., 4., 0., 6., 7., 8., 0.]; - let mat = vec_to_sparse_mat_fixed(&vector, 3, false); - let result = mask_diag_sparse(&mat); - assert_sparse_mat_compare( - &result, - &vec_to_sparse_mat_fixed(&target, 3, false), - I96F32::from_num(0), - ); - let vector: Vec = vec![1., 0., 0., 0., 5., 0., 0., 0., 9.]; - let target: Vec = vec![0., 0., 0., 0., 0., 0., 0., 0., 0.]; - let mat = vec_to_sparse_mat_fixed(&vector, 3, false); - let result = mask_diag_sparse(&mat); - assert_sparse_mat_compare( - &result, - &vec_to_sparse_mat_fixed(&target, 3, false), - I96F32::from_num(0), - ); - let vector: Vec = vec![0., 0., 0., 0., 0., 0., 0., 0., 0.]; - let target: Vec = vec![0., 0., 0., 0., 0., 0., 0., 0., 0.]; - let mat = vec_to_sparse_mat_fixed(&vector, 3, false); - let result = mask_diag_sparse(&mat); - assert_sparse_mat_compare( - &result, - &vec_to_sparse_mat_fixed(&target, 3, false), - I96F32::from_num(0), - ); + for (x, expected_y) in test_cases { + let y = normalize(x.clone()); + assert_vec_compare(&y, &expected_y, epsilon); + + if !y.is_empty() { + let sum = y + .iter() + .fold(FixedU128::from_inner(0), |acc, &val| acc + val); + assert_float_compare(sum, FixedU128::from_u32(1), epsilon); + } + } } } diff --git a/pallets/emission0/src/lib.rs b/pallets/emission0/src/lib.rs index 9691bc73..d770d88b 100644 --- a/pallets/emission0/src/lib.rs +++ b/pallets/emission0/src/lib.rs @@ -86,12 +86,6 @@ pub mod pallet { #[pallet::constant] type BlockEmission: Get; - #[pallet::constant] - type DefaultMinAllowedWeights: Get; - - #[pallet::constant] - type DefaultMaxAllowedWeights: Get; - #[pallet::constant] type DefaultEmissionRecyclingPercentage: Get; diff --git a/pallets/emission0/tests/distribution.rs b/pallets/emission0/tests/distribution.rs index f01e1c69..93044b95 100644 --- a/pallets/emission0/tests/distribution.rs +++ b/pallets/emission0/tests/distribution.rs @@ -8,9 +8,8 @@ use pallet_emission0::{ use polkadot_sdk::{ pallet_balances, sp_core::Get, - sp_runtime::{BoundedVec, Percent}, + sp_runtime::{BoundedVec, FixedU128, Perbill, Percent}, }; -use substrate_fixed::{traits::ToFixed, types::I96F32}; use test_utils::{ add_balance, add_stake, pallet_governance::{Allocators, TreasuryEmissionFee}, @@ -75,6 +74,10 @@ fn pending_emission_accumulates_and_returns_when_network_is_empty() { step_block(98); assert_eq!(PendingEmission::::get(), emissions); + + PendingEmission::::set(u128::MAX); + step_block(1); + assert_eq!(PendingEmission::::get(), u128::MAX); }); } @@ -94,12 +97,12 @@ fn weights_are_filtered_and_normalized() { register_empty_agent(2); - let weights = ConsensusMemberInput::::prepare_weights(member, &0); + let weights = ConsensusMemberInput::::prepare_weights(member.weights, &0); assert_eq!( weights, vec![ - (1, 0.3333333333f64.to_fixed()), - (2, 0.6666666665f64.to_fixed()) + (1, FixedU128::from_rational(1, 3)), + (2, FixedU128::from_rational(1, 3) * 2.into()) ] ) }); @@ -110,7 +113,7 @@ fn creates_member_input_correctly() { test_utils::new_test_ext().execute_with(|| { let mut member = ConsensusMember::::default(); - let input = ConsensusMemberInput::::from_agent(0, member.clone(), 0); + let input = ConsensusMemberInput::::from_agent(0, member.weights.clone(), 0); assert_eq!( input, ConsensusMemberInput { @@ -119,7 +122,7 @@ fn creates_member_input_correctly() { weights: vec![], stakes: vec![], total_stake: 0, - normalized_stake: 0.to_fixed(), + normalized_stake: FixedU128::from_inner(0), delegating_to: None, registered: false } @@ -127,7 +130,7 @@ fn creates_member_input_correctly() { register_empty_agent(0); - let input = ConsensusMemberInput::::from_agent(0, member.clone(), 0); + let input = ConsensusMemberInput::::from_agent(0, member.weights.clone(), 0); assert!(input.registered); StakedBy::::set(0, 1, Some(10)); @@ -137,8 +140,8 @@ fn creates_member_input_correctly() { member.update_weights(BoundedVec::truncate_from(vec![(0, 0), (1, 10)])); - let input = ConsensusMemberInput::::from_agent(0, member.clone(), 15); - assert_eq!(input.total_stake, I96F32::from_num(30)); + let input = ConsensusMemberInput::::from_agent(0, member.weights.clone(), 15); + assert_eq!(input.total_stake, 30); assert!(input.validator_permit); assert_eq!(input.weights.len(), 1); }); @@ -188,10 +191,10 @@ fn creates_list_of_all_member_inputs_for_rewards() { ConsensusMemberInput { agent_id: validator, validator_permit: true, - weights: vec![(miner, 1.to_fixed())], + weights: vec![(miner, FixedU128::from_u32(1))], stakes: vec![(staker, stake * 3)], total_stake: stake * 3, - normalized_stake: 0.75f64.to_fixed(), + normalized_stake: FixedU128::from_float(0.75f64), delegating_to: None, registered: true, } @@ -205,7 +208,7 @@ fn creates_list_of_all_member_inputs_for_rewards() { weights: vec![], stakes: vec![], total_stake: 0, - normalized_stake: 0.to_fixed(), + normalized_stake: FixedU128::from_inner(0), delegating_to: None, registered: true, } @@ -216,10 +219,10 @@ fn creates_list_of_all_member_inputs_for_rewards() { ConsensusMemberInput { agent_id: delegating_registered, validator_permit: true, - weights: vec![(miner, 1.to_fixed())], + weights: vec![(miner, FixedU128::from_u32(1))], stakes: vec![(staker, stake)], total_stake: stake, - normalized_stake: 0.25f64.to_fixed(), + normalized_stake: FixedU128::from_float(0.25f64), delegating_to: Some(validator), registered: true, } @@ -233,7 +236,7 @@ fn creates_list_of_all_member_inputs_for_rewards() { weights: vec![], stakes: vec![], total_stake: 0, - normalized_stake: 0.to_fixed(), + normalized_stake: FixedU128::from_inner(0), delegating_to: Some(validator), registered: false, } @@ -247,7 +250,7 @@ fn creates_list_of_all_member_inputs_for_rewards() { weights: vec![], stakes: vec![], total_stake: 0, - normalized_stake: 0.to_fixed(), + normalized_stake: FixedU128::from_inner(0), delegating_to: Some(validator), registered: false, } @@ -261,7 +264,7 @@ fn creates_list_of_all_member_inputs_for_rewards() { weights: vec![], stakes: vec![], total_stake: 0, - normalized_stake: 0.to_fixed(), + normalized_stake: FixedU128::from_inner(0), delegating_to: None, registered: true, } @@ -377,12 +380,7 @@ fn pays_dividends_and_incentives() { #[test] fn pays_dividends_to_stakers() { test_utils::new_test_ext().execute_with(|| { - EmissionRecyclingPercentage::::set(Percent::zero()); - TreasuryEmissionFee::::set(Percent::zero()); - - let min_validator_stake = 1; - MinValidatorStake::::set(min_validator_stake); - MinAllowedStake::::set(min_validator_stake); + let (min_validator_stake, _) = set_emissions_params(); let validator = 0; let miner = 1; @@ -454,24 +452,20 @@ fn pays_dividends_to_stakers() { assert_eq!(PendingEmission::::get(), 0); assert_eq!(sum, get_total_emission_per_block::() * 100); + + let validator = ConsensusMembers::::get(validator).unwrap(); + assert_eq!(validator.last_dividends, u16::MAX); + assert_eq!(validator.last_incentives, 0); + let miner = ConsensusMembers::::get(miner).unwrap(); + assert_eq!(miner.last_incentives, u16::MAX); + assert_eq!(miner.last_dividends, 0); }); } #[test] fn pays_weight_control_fee_and_dividends_to_stakers() { test_utils::new_test_ext().execute_with(|| { - EmissionRecyclingPercentage::::set(Percent::zero()); - TreasuryEmissionFee::::set(Percent::zero()); - - let weight_control_fee = Percent::from_parts(25); - FeeConstraints::::mutate(|constraints| { - constraints.min_staking_fee = Percent::zero(); - constraints.min_weight_control_fee = weight_control_fee; - }); - - let min_validator_stake = 1; - MinValidatorStake::::set(min_validator_stake); - MinAllowedStake::::set(min_validator_stake); + let (min_validator_stake, weight_control_fee) = set_emissions_params(); let val_1 = 0; let val_2 = 1; @@ -520,6 +514,17 @@ fn pays_weight_control_fee_and_dividends_to_stakers() { StakedBy::::get(val_2, val_2_staker).unwrap_or_default() - min_validator_stake, val_2_stake ); + + let val_1 = ConsensusMembers::::get(val_1).unwrap(); + assert_eq!(val_1.last_dividends, u16::MAX); + + let factor = + Perbill::from_rational(val_1_stake.min(val_2_stake), val_1_stake.max(val_2_stake)); + let val_2 = ConsensusMembers::::get(val_2).unwrap(); + assert_eq!( + val_2.last_dividends, + factor.mul_floor(u16::MAX as u32) as u16 + ); }); } @@ -527,16 +532,11 @@ fn pays_weight_control_fee_and_dividends_to_stakers() { fn pays_according_to_incentives_ratio() { for ratio in 0..=100 { test_utils::new_test_ext().execute_with(|| { - EmissionRecyclingPercentage::::set(Percent::zero()); - TreasuryEmissionFee::::set(Percent::zero()); + let (min_validator_stake, _) = set_emissions_params(); let incentives_ratio = Percent::from_parts(ratio); IncentivesRatio::::set(incentives_ratio); - let min_validator_stake = 1; - MinValidatorStake::::set(min_validator_stake); - MinAllowedStake::::set(min_validator_stake); - let val = 0; let miner = 1; @@ -553,7 +553,8 @@ fn pays_according_to_incentives_ratio() { let total_emission = get_total_emission_per_block::() * 100; let total_incentives = incentives_ratio.mul_floor(total_emission); - let total_dividends = (Percent::one() - incentives_ratio).mul_floor(total_emission); + let dividends_ratio = Percent::one() - incentives_ratio; + let total_dividends = dividends_ratio.mul_floor(total_emission); assert_eq!( StakedBy::::get(val, val).unwrap_or_default() - min_validator_stake, @@ -563,6 +564,108 @@ fn pays_according_to_incentives_ratio() { StakedBy::::get(miner, miner).unwrap_or_default() - min_validator_stake, total_incentives ); + + let val = ConsensusMembers::::get(val).unwrap(); + assert_eq!(val.last_dividends, if ratio == 100 { 0 } else { u16::MAX }); + + let miner = ConsensusMembers::::get(miner).unwrap(); + assert_eq!(miner.last_incentives, if ratio == 0 { 0 } else { u16::MAX },); }); } } + +#[test] +fn pays_weight_delegation_fee_to_validators_without_permits() { + test_utils::new_test_ext().execute_with(|| { + let (min_validator_stake, weight_control_fee) = set_emissions_params(); + + let val_1 = 0; + let val_2 = 1; + + let miner = 2; + + let mut member = ConsensusMember::::default(); + member.update_weights(BoundedVec::truncate_from(vec![(miner, 1)])); + + ConsensusMembers::::set(val_1, Some(member)); + ConsensusMembers::::set(val_2, Some(Default::default())); + ConsensusMembers::::set(miner, Some(Default::default())); + + for id in [val_1, val_2, miner] { + register_empty_agent(id); + } + + Allocators::::set(val_1, Some(())); + + pallet_emission0::weight_control::delegate_weight_control::(val_2, val_1) + .expect("failed to delegate weight control"); + + add_stake(val_2, val_2, min_validator_stake); + + step_block(100); + + let total_dividends = (get_total_emission_per_block::() * 100) / 2; + + assert_eq!( + StakedBy::::get(val_1, val_1).unwrap_or_default(), + weight_control_fee.mul_floor(total_dividends) + ); + + assert_eq!( + StakedBy::::get(val_2, val_2).unwrap_or_default() - min_validator_stake, + total_dividends - weight_control_fee.mul_floor(total_dividends) + ); + }); +} + +#[test] +fn ignores_agents_delegating_to_non_existing_agents() { + test_utils::new_test_ext().execute_with(|| { + let (min_validator_stake, _) = set_emissions_params(); + + let val = 0; + let miner = 1; + let non_existing_val = 2; + + ConsensusMembers::::set(val, Some(Default::default())); + ConsensusMembers::::set(miner, Some(Default::default())); + + for id in [val, miner] { + register_empty_agent(id); + } + + WeightControlDelegation::::set(val, Some(non_existing_val)); + + add_stake(val, val, min_validator_stake); + + step_block(100); + + assert_eq!( + StakedBy::::get(val, val).unwrap_or_default() - min_validator_stake, + 0 + ); + assert_eq!(StakedBy::::get(miner, miner).unwrap_or_default(), 0); + + let validator = ConsensusMembers::::get(val).unwrap(); + assert_eq!(validator.last_dividends, 0); + let miner = ConsensusMembers::::get(miner).unwrap(); + assert_eq!(miner.last_incentives, 0); + }); +} + +fn set_emissions_params() -> (u128, Percent) { + EmissionRecyclingPercentage::::set(Percent::zero()); + TreasuryEmissionFee::::set(Percent::zero()); + + let weight_control_fee = Percent::from_parts(25); + FeeConstraints::::mutate(|constraints| { + constraints.min_staking_fee = Percent::zero(); + constraints.min_weight_control_fee = weight_control_fee; + }); + + let min_validator_stake = 1; + MinValidatorStake::::set(min_validator_stake); + MinAllowedStake::::set(min_validator_stake); + + (min_validator_stake, weight_control_fee) +} diff --git a/pallets/governance/Cargo.toml b/pallets/governance/Cargo.toml index 05560c3c..a10f988f 100644 --- a/pallets/governance/Cargo.toml +++ b/pallets/governance/Cargo.toml @@ -12,7 +12,6 @@ std = [ "codec/std", "polkadot-sdk/std", "scale-info/std", - "substrate-fixed/std", "pallet-torus0/std", "pallet-emission0/std", ] @@ -38,7 +37,6 @@ polkadot-sdk = { workspace = true, features = [ "runtime", "pallet-sudo", ] } -substrate-fixed = { workspace = true } pallet-torus0.workspace = true pallet-emission0.workspace = true diff --git a/pallets/governance/src/proposal.rs b/pallets/governance/src/proposal.rs index 060f858b..c316cfd4 100644 --- a/pallets/governance/src/proposal.rs +++ b/pallets/governance/src/proposal.rs @@ -9,11 +9,10 @@ use polkadot_sdk::{ }, polkadot_sdk_frame::{prelude::BlockNumberFor, traits::CheckedAdd}, sp_core::{ConstU32, U256}, - sp_runtime::{BoundedBTreeMap, DispatchError, Percent}, + sp_runtime::{traits::Saturating, BoundedBTreeMap, DispatchError, FixedU128, Percent}, sp_std::{collections::btree_set::BTreeSet, vec::Vec}, sp_tracing::error, }; -use substrate_fixed::types::I92F36; use crate::{ frame::traits::ExistenceRequirement, AccountIdOf, BalanceOf, BoundedBTreeSet, BoundedVec, @@ -631,9 +630,9 @@ pub fn tick_proposal_rewards(block_number: BlockNumberFor) return; } - let mut n: u16 = 0; + let mut n = 0u16; let mut account_stakes: AccountStakes = BoundedBTreeMap::new(); - let mut total_allocation: I92F36 = I92F36::from_num(0); + let mut total_allocation = FixedU128::from_inner(0); for (proposal_id, unrewarded_proposal) in UnrewardedProposals::::iter() { let proposal_block: u64 = unrewarded_proposal .block @@ -658,9 +657,7 @@ pub fn tick_proposal_rewards(block_number: BlockNumberFor) } match get_reward_allocation::(&governance_config, n) { - Ok(allocation) => { - total_allocation = total_allocation.saturating_add(allocation); - } + Ok(allocation) => total_allocation = total_allocation.saturating_add(allocation), Err(err) => { error!("could not get reward allocation for proposal {proposal_id}: {err:?}"); continue; @@ -682,50 +679,47 @@ pub fn tick_proposal_rewards(block_number: BlockNumberFor) pub fn get_reward_allocation( governance_config: &GovernanceConfiguration, n: u16, -) -> Result { +) -> Result { let treasury_address = DaoTreasuryAddress::::get(); let treasury_balance = ::Currency::free_balance(&treasury_address); - let treasury_balance = I92F36::from_num(treasury_balance); - let allocation_percentage = I92F36::from_num( - governance_config - .proposal_reward_treasury_allocation - .deconstruct(), + let allocation_percentage = governance_config.proposal_reward_treasury_allocation; + let max_allocation = governance_config.max_proposal_reward_treasury_allocation; + + let mut allocation = FixedU128::from_inner( + allocation_percentage + .mul_floor(treasury_balance) + .min(max_allocation), ); - let max_allocation = - I92F36::from_num(governance_config.max_proposal_reward_treasury_allocation); - let mut allocation = treasury_balance - .checked_mul(allocation_percentage) - .unwrap_or_default() - .min(max_allocation); if n > 0 { - let mut base = I92F36::from_num(1.5); - let mut result = I92F36::from_num(1); + let mut base = FixedU128::from_float(1.5); + let mut result = FixedU128::from_float(1.); let mut remaining = n; while remaining > 0 { if remaining % 2 == 1 { - result = result.checked_mul(base).unwrap_or(result); + result = result.const_checked_mul(base).unwrap_or(result); } - base = base.checked_mul(base).unwrap_or_default(); + base = base.const_checked_mul(base).unwrap_or_default(); remaining /= 2; } - allocation = allocation.checked_div(result).unwrap_or(allocation); + allocation = allocation.const_checked_div(result).unwrap_or(allocation); } + Ok(allocation) } /// Distributes the proposal rewards in a quadratic formula to all voters. fn distribute_proposal_rewards( account_stakes: AccountStakes, - total_allocation: I92F36, + total_allocation: FixedU128, max_proposal_reward_treasury_allocation: BalanceOf, ) { // This is just a sanity check, making sure we can never allocate more than the // max - if total_allocation > I92F36::from_num(max_proposal_reward_treasury_allocation) { + if total_allocation > FixedU128::from_inner(max_proposal_reward_treasury_allocation) { error!("total allocation exceeds max proposal reward treasury allocation"); return; } @@ -739,17 +733,17 @@ fn distribute_proposal_rewards( .collect(); let total_stake: BalanceOf = account_sqrt_stakes.iter().map(|(_, stake)| *stake).sum(); - let total_stake = I92F36::from_num(total_stake); + let total_stake = FixedU128::from_inner(total_stake); for (acc_id, stake) in account_sqrt_stakes.into_iter() { - let percentage = I92F36::from_num(stake) - .checked_div(total_stake) + let percentage = FixedU128::from_inner(stake) + .const_checked_div(total_stake) .unwrap_or_default(); - let reward: BalanceOf = total_allocation - .checked_mul(percentage) + let reward = total_allocation + .const_checked_mul(percentage) .unwrap_or_default() - .to_num(); + .into_inner(); // Transfer the proposal reward to the accounts from treasury if let Err(err) = ::Currency::transfer( diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index ef8cbe7d..b2d97588 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -524,7 +524,7 @@ fn rewards_wont_exceed_treasury() { pallet_governance::proposal::get_reward_allocation::(&governance_config, n) .unwrap(); assert_eq!( - allocation.to_num::(), + allocation.into_inner(), governance_config.max_proposal_reward_treasury_allocation ); }); diff --git a/pallets/torus0/Cargo.toml b/pallets/torus0/Cargo.toml index 820db7ae..8d915c42 100644 --- a/pallets/torus0/Cargo.toml +++ b/pallets/torus0/Cargo.toml @@ -12,7 +12,6 @@ std = [ "codec/std", "polkadot-sdk/std", "scale-info/std", - "substrate-fixed/std", "pallet-torus0-api/std", ] runtime-benchmarks = [ @@ -26,7 +25,6 @@ try-runtime = ["polkadot-sdk/try-runtime", "pallet-torus0-api/try-runtime"] codec = { workspace = true, features = ["derive"] } scale-info = { workspace = true, features = ["derive"] } polkadot-sdk = { workspace = true, features = ["experimental", "runtime"] } -substrate-fixed = { workspace = true } pallet-torus0-api.workspace = true pallet-emission0-api.workspace = true diff --git a/pallets/torus0/src/burn.rs b/pallets/torus0/src/burn.rs index 38b571b3..924cc5f4 100644 --- a/pallets/torus0/src/burn.rs +++ b/pallets/torus0/src/burn.rs @@ -1,10 +1,11 @@ use codec::{Decode, Encode, MaxEncodedLen}; use polkadot_sdk::{ - frame_election_provider_support::Get, frame_support::DebugNoBound, + frame_election_provider_support::Get, + frame_support::DebugNoBound, polkadot_sdk_frame::prelude::BlockNumberFor, + sp_runtime::{traits::Saturating, FixedU128}, }; use scale_info::{prelude::marker::PhantomData, TypeInfo}; -use substrate_fixed::types::I110F18; use crate::BalanceOf; @@ -67,36 +68,36 @@ pub fn adjust_burn(current_block: u64) { return; } - let updated_burn: I110F18 = I110F18::from_num(current_burn) - .checked_mul(I110F18::from_num( - registrations_this_interval.saturating_add(target_registrations_per_interval), + let updated_burn = FixedU128::from_inner(current_burn) + .const_checked_mul(FixedU128::from_u32( + registrations_this_interval.saturating_add(target_registrations_per_interval) as u32, )) .unwrap_or_default() - .checked_div(I110F18::from_num( - target_registrations_per_interval.saturating_add(target_registrations_per_interval), + .const_checked_div(FixedU128::from_u32( + target_registrations_per_interval.saturating_mul(2) as u32, )) .unwrap_or_default(); - let alpha: I110F18 = I110F18::from_num(adjustment_alpha) - .checked_div(I110F18::from_num(u64::MAX)) - .unwrap_or_else(|| I110F18::from_num(0)); + let alpha = FixedU128::from_inner(adjustment_alpha as u128) + .const_checked_div(FixedU128::from_inner(u64::MAX as u128)) + .unwrap_or_else(|| FixedU128::from_inner(0)); - let next_value: I110F18 = alpha - .checked_mul(I110F18::from_num(current_burn)) - .unwrap_or_else(|| I110F18::from_num(0)) + let next_value = alpha + .const_checked_mul(FixedU128::from_inner(current_burn)) + .unwrap_or_else(|| FixedU128::from_inner(0)) .saturating_add( - I110F18::from_num(1.0) + FixedU128::from_u32(1) .saturating_sub(alpha) - .checked_mul(updated_burn) - .unwrap_or_else(|| I110F18::from_num(0)), + .const_checked_mul(updated_burn) + .unwrap_or_else(|| FixedU128::from_inner(0)), ); - let new_burn = if next_value >= I110F18::from_num(max_burn) { + let new_burn = if next_value >= FixedU128::from_inner(max_burn) { max_burn - } else if next_value <= I110F18::from_num(min_burn) { + } else if next_value <= FixedU128::from_inner(min_burn) { min_burn } else { - next_value.to_num::>() + next_value.into_inner() }; crate::Burn::::set(new_burn); diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index 86bdedec..a1ae27cd 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -417,12 +417,6 @@ pub mod pallet { InvalidAgentUrl, /// A agent with this name already exists in the subnet. AgentNameAlreadyExists, - /// An arithmetic error occurred during calculation. - ArithmeticError, - /// The extrinsic panicked during execution. - ExtrinsicPanicked, - /// A step in the process panicked. - StepPanicked, /// The stake amount to add or remove is too small. Minimum is 0.5 unit. StakeTooSmall, /// Key is not present in Whitelist, it needs to be whitelisted by a diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index e8801a39..1c16a7a6 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -422,10 +422,6 @@ impl pallet_emission0::Config for Runtime { type BlockEmission = ConstU128<{ as_tors(64_000) / 10800 }>; - type DefaultMinAllowedWeights = ConstU16<1>; - - type DefaultMaxAllowedWeights = ConstU16<420>; - type DefaultEmissionRecyclingPercentage = DefaultEmissionRecyclingPercentage; type DefaultIncentivesRatio = DefaultIncentivesRatio; diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 803f37cc..c40e95a9 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -157,10 +157,6 @@ impl pallet_emission0::Config for Test { type BlockEmission = ConstU128<{ (to_nano(250_000) - 1) / 10800 }>; - type DefaultMinAllowedWeights = ConstU16<1>; - - type DefaultMaxAllowedWeights = ConstU16<420>; - type DefaultEmissionRecyclingPercentage = DefaultEmissionRecyclingPercentage; type DefaultIncentivesRatio = DefaultIncentivesRatio; diff --git a/xtask/src/build_spec.rs b/xtask/src/build_spec.rs index 981ed51f..28e7d5a2 100644 --- a/xtask/src/build_spec.rs +++ b/xtask/src/build_spec.rs @@ -91,7 +91,6 @@ fn grandpa(genesis: &mut Value) { )]; let key = key_name(b"Grandpa", b"Authorities"); - dbg!(&key); let mut buf = Cursor::new(vec![0; grandpa.size_hint()]); grandpa.encode_to(&mut buf); From 95ff1c3bd962a023e66577c620b0ee24bc073d80 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 17 Feb 2025 12:40:12 -0300 Subject: [PATCH 07/46] chore: improve proposal and pruning coverage (#83) Improves coverage for some governance files. --- .github/workflows/check.yml | 14 +-- pallets/governance/src/roles.rs | 3 +- pallets/governance/tests/application.rs | 20 +++- pallets/governance/tests/curator.rs | 39 ------- pallets/governance/tests/roles.rs | 114 ++++++++++++++++++ pallets/governance/tests/voting.rs | 86 ++++++++++++-- pallets/torus0/src/agent.rs | 17 +-- pallets/torus0/tests/agent.rs | 146 +++++++++++++++++++++--- xtask/src/main.rs | 2 +- 9 files changed, 350 insertions(+), 91 deletions(-) delete mode 100644 pallets/governance/tests/curator.rs create mode 100644 pallets/governance/tests/roles.rs diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 9b563041..9bbcecc6 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -56,7 +56,7 @@ jobs: # RUST_BACKTRACE: 1 # SKIP_WASM_BUILD: 1 # run: cargo test - + - uses: jwalton/gh-find-current-pr@v1 id: findPr @@ -79,7 +79,7 @@ jobs: env: RUST_BACKTRACE: 1 SKIP_WASM_BUILD: 1 - + - name: Generate coverage summary report if: success() && steps.findPr.outputs.number && steps.extractBranch.outputs.branch uses: irongut/CodeCoverageSummary@v1.3.0 @@ -98,10 +98,11 @@ jobs: env: RUST_BACKTRACE: 1 SKIP_WASM_BUILD: 1 - - - name: Upload html report to S3 Bucket + + - name: Upload html report to S3 Bucket if: success() && steps.findPr.outputs.number && steps.extractBranch.outputs.branch id: htmlUpload + continue-on-error: true run: | aws --endpoint-url $ENDPOINT s3 sync ./target/llvm-cov/html s3://$BUCKET_NAME/$BRANCH echo "link=$(aws --endpoint-url $ENDPOINT s3 presign s3://$BUCKET_NAME/$BRANCH/index.html)" >> $GITHUB_OUTPUT @@ -112,7 +113,7 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.COV_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.COV_AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: ${{ vars.COV_DEFAULT_REGION }} - + - name: Add coverage PR report comment if: success() && steps.findPr.outputs.number uses: marocchino/sticky-pull-request-comment@v2 @@ -131,6 +132,3 @@ jobs: recreate: true message: | [Detailed coverage report](${{ steps.htmlUpload.outputs.link }}) - - - diff --git a/pallets/governance/src/roles.rs b/pallets/governance/src/roles.rs index 57011073..dc75435f 100644 --- a/pallets/governance/src/roles.rs +++ b/pallets/governance/src/roles.rs @@ -10,7 +10,8 @@ use crate::{ensure, storage::StorageMap, AccountIdOf, Config, Error}; /// Generic function used to manage the Curator and Allocator maps, which behave /// similarly. -pub(super) fn manage_role, ()>>( +#[doc(hidden)] +pub fn manage_role, ()>>( key: AccountIdOf, is_add: bool, error: Error, diff --git a/pallets/governance/tests/application.rs b/pallets/governance/tests/application.rs index 0c522f04..d1fe9071 100644 --- a/pallets/governance/tests/application.rs +++ b/pallets/governance/tests/application.rs @@ -255,6 +255,12 @@ fn application_denied_doesnt_add_to_whitelist() { #[test] fn application_expires() { new_test_ext().execute_with(|| { + let expiration_blocks = + pallet_governance::GlobalGovernanceConfig::::mutate(|config| { + config.agent_application_expiration = 200; + config.agent_application_expiration + }); + let key = 0; let adding_key = 1; pallet_governance::Curators::::insert(key, ()); @@ -278,9 +284,7 @@ fn application_expires() { application_id = value.id; } - step_block( - pallet_governance::GlobalGovernanceConfig::::get().agent_application_expiration, - ); + step_block(expiration_blocks); let application = pallet_governance::AgentApplications::::get(application_id).unwrap(); @@ -291,6 +295,12 @@ fn application_expires() { #[test] fn error_is_thrown_on_resolving_non_open_application() { new_test_ext().execute_with(|| { + let expiration_blocks = + pallet_governance::GlobalGovernanceConfig::::mutate(|config| { + config.agent_application_expiration = 200; + config.agent_application_expiration + }); + let key = 0; let adding_key = 1; pallet_governance::Curators::::insert(key, ()); @@ -345,9 +355,7 @@ fn error_is_thrown_on_resolving_non_open_application() { let application_id = 1; // expires the application - step_block( - pallet_governance::GlobalGovernanceConfig::::get().agent_application_expiration, - ); + step_block(expiration_blocks); let balance_after_expire = get_balance(key); assert_eq!(balance_after_expire, 1); diff --git a/pallets/governance/tests/curator.rs b/pallets/governance/tests/curator.rs deleted file mode 100644 index b93962e9..00000000 --- a/pallets/governance/tests/curator.rs +++ /dev/null @@ -1,39 +0,0 @@ -use pallet_governance::Curators; -use polkadot_sdk::frame_support::assert_err; -use test_utils::*; - -use crate::pallet_governance::Error; - -#[test] -fn user_is_added_to_whitelist() { - new_test_ext().execute_with(|| { - let curator_key = 0; - let module_key = 1; - Curators::::insert(curator_key, ()); - - assert_ok!(pallet_governance::Pallet::::add_to_whitelist( - get_origin(curator_key), - module_key - )); - - assert!(pallet_governance::whitelist::is_whitelisted::( - &module_key - )) - }); -} - -#[test] -fn only_curators_can_whitelist() { - new_test_ext().execute_with(|| { - let not_curator_key = 0; - let module_key = 1; - - assert_err!( - pallet_governance::Pallet::::add_to_whitelist( - get_origin(not_curator_key), - module_key - ), - Error::::NotCurator - ); - }); -} diff --git a/pallets/governance/tests/roles.rs b/pallets/governance/tests/roles.rs new file mode 100644 index 00000000..eb4bc276 --- /dev/null +++ b/pallets/governance/tests/roles.rs @@ -0,0 +1,114 @@ +use pallet_governance::Curators; +use polkadot_sdk::frame_support::assert_err; +use test_utils::*; + +use crate::pallet_governance::Error; + +#[test] +fn add_and_remove_curator() { + new_test_ext().execute_with(|| { + let curator_key = 0; + + assert_ok!(pallet_governance::Pallet::::add_curator( + RuntimeOrigin::root(), + curator_key + )); + + assert!(pallet_governance::Curators::::contains_key( + curator_key + )); + + assert_ok!(pallet_governance::Pallet::::remove_curator( + RuntimeOrigin::root(), + curator_key, + )); + + assert!(!pallet_governance::Curators::::contains_key( + curator_key + )); + }); +} + +#[test] +fn add_and_remove_allocator() { + new_test_ext().execute_with(|| { + let allocator_key = 0; + + assert_ok!(pallet_governance::Pallet::::add_allocator( + RuntimeOrigin::root(), + allocator_key + )); + + assert!(pallet_governance::Allocators::::contains_key( + allocator_key + )); + + assert_ok!(pallet_governance::Pallet::::remove_allocator( + RuntimeOrigin::root(), + allocator_key, + )); + + assert!(!pallet_governance::Allocators::::contains_key( + allocator_key + )); + }); +} + +#[test] +fn add_and_remove_from_whitelist() { + new_test_ext().execute_with(|| { + let curator_key = 0; + let module_key = 1; + Curators::::insert(curator_key, ()); + + assert_ok!(pallet_governance::Pallet::::add_to_whitelist( + get_origin(curator_key), + module_key + )); + + assert_err!( + pallet_governance::Pallet::::add_to_whitelist( + get_origin(curator_key), + module_key + ), + Error::::AlreadyWhitelisted + ); + + assert!(pallet_governance::whitelist::is_whitelisted::( + &module_key + )); + + assert_ok!(pallet_governance::Pallet::::remove_from_whitelist( + get_origin(curator_key), + module_key + )); + + assert_err!( + pallet_governance::Pallet::::remove_from_whitelist( + get_origin(curator_key), + module_key + ), + Error::::NotWhitelisted + ); + + assert!(!pallet_governance::whitelist::is_whitelisted::( + &module_key + )); + }); +} + +#[test] +fn only_curators_can_whitelist() { + new_test_ext().execute_with(|| { + let not_curator_key = 0; + let module_key = 1; + + assert_err!( + pallet_governance::Pallet::::add_to_whitelist( + get_origin(not_curator_key), + module_key + ), + Error::::NotCurator + ); + }); +} diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index b2d97588..9eda2790 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -66,9 +66,7 @@ fn delegate(account: u32) { } pub fn stake(account: u32, module: u32, stake: u128) { - // if get_balance(account) <= stake { add_balance(account, stake); - // } if get_balance(account) - stake < 1 { add_balance(account, 1); @@ -136,6 +134,24 @@ fn global_proposal_validates_parameters() { const KEY: u32 = 0; add_balance(KEY, to_nano(100_000)); + assert_err!( + pallet_governance::Pallet::::add_global_params_proposal( + get_origin(KEY), + Default::default(), + b"".to_vec(), + ), + Error::::ProposalDataTooSmall + ); + + assert_err!( + pallet_governance::Pallet::::add_global_params_proposal( + get_origin(KEY), + Default::default(), + b"1".repeat(257), + ), + Error::::ProposalDataTooLarge + ); + let test = |global_params| { pallet_governance::Pallet::::add_global_params_proposal( get_origin(KEY), @@ -150,6 +166,12 @@ fn global_proposal_validates_parameters() { }) .expect_err("created proposal with invalid max name length"); + test(GlobalParamsData { + proposal_cost: 50_000_000_000_000_000_000_001, + ..Default::default() + }) + .expect_err("created proposal with invalid proposal cost"); + test(GlobalParamsData::default()).expect("failed to create proposal with valid parameters"); }); } @@ -189,6 +211,57 @@ fn global_custom_proposal_is_accepted_correctly() { stake_against: to_nano(5), } ); + + step_block(1); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Accepted { + block: 100, + stake_for: to_nano(10), + stake_against: to_nano(5), + } + ); + }); +} + +#[test] +fn removes_vote_correctly() { + new_test_ext().execute_with(|| { + zero_min_burn(); + + const FOR: u32 = 0; + const AGAINST: u32 = 1; + + register(FOR, 0, 0, to_nano(10)); + register(AGAINST, 0, 1, to_nano(10)); + + config(1, 100); + + assert_ok!( + pallet_governance::Pallet::::add_global_custom_proposal( + get_origin(FOR), + b"metadata".to_vec() + ) + ); + + vote(FOR, 0, true); + vote(AGAINST, 0, false); + + pallet_governance::voting::remove_vote::(FOR, 0).unwrap(); + pallet_governance::voting::remove_vote::(AGAINST, 0).unwrap(); + + match pallet_governance::Proposals::::get(0).unwrap().status { + ProposalStatus::Open { + votes_for, + votes_against, + .. + } => { + assert!(!votes_for.contains(&FOR)); + assert!(!votes_against.contains(&AGAINST)); + } + _ => unreachable!(), + } }); } @@ -267,20 +340,19 @@ fn global_proposals_counts_delegated_stake() { const FOR: u32 = 0; const AGAINST: u32 = 1; const FOR_DELEGATED: u32 = 2; - const AGAINST_DELEGATED: u32 = 3; let origin = get_origin(0); register(FOR, 0, FOR, to_nano(5)); - // delegate(FOR); register(AGAINST, 0, AGAINST, to_nano(10)); - // delegate(AGAINST); stake(FOR_DELEGATED, FOR, to_nano(10)); delegate(FOR_DELEGATED); - stake(AGAINST_DELEGATED, AGAINST, to_nano(3)); - delegate(AGAINST_DELEGATED); + // AGAINST does not delegate voting power, so it doesn't matter + // to who it stakes. + stake(AGAINST, FOR, to_nano(3)); + pallet_governance::voting::disable_delegation::(AGAINST).unwrap(); config(1, 100); diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index cdbeba93..feb37004 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -65,11 +65,6 @@ pub fn register( crate::Error::::AgentAlreadyRegistered ); - ensure!( - crate::Agents::::iter().count() < crate::MaxAllowedAgents::::get() as usize, - crate::Error::::MaxAllowedAgents - ); - ensure!( crate::RegistrationsThisBlock::::get() < crate::MaxRegistrationsPerBlock::::get(), crate::Error::::TooManyAgentRegistrationsThisBlock @@ -99,11 +94,6 @@ pub fn register( } } - ensure!( - crate::Agents::::iter().count() < crate::MaxAllowedAgents::::get() as usize, - crate::Error::::MaxAllowedAgents - ); - validate_agent_name::(&name[..])?; validate_agent_url::(&url[..])?; validate_agent_metadata::(&metadata[..])?; @@ -182,11 +172,6 @@ pub fn update( let span = debug_span!("update", agent.key = ?agent_key); let _guard = span.enter(); - ensure!( - exists::(&agent_key), - crate::Error::::AgentDoesNotExist - ); - crate::Agents::::try_mutate(&agent_key, |agent| { let Some(agent) = agent else { return Err(crate::Error::::AgentDoesNotExist.into()); @@ -357,7 +342,7 @@ pub fn find_agent_to_prune(strategy: PruningStrategy) -> Optio // Age is secondary to the emission. scores .iter() - // This is usual scenario, that is why we check for oldest 0 emission to return early + // This is the usual scenario, that is why we check for oldest 0 emission to return early .filter(|&(_, efficiency_score, _)| *efficiency_score == 0) .min_by_key(|&(_, _, block_at_registration)| block_at_registration) .or_else(|| { diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index d9eae8bb..a8483160 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -1,26 +1,26 @@ -use pallet_torus0::{agent::Agent, Agents, Burn, Error}; +use pallet_torus0::{agent::Agent, Agents, Burn, Error, ImmunityPeriod, MaxAllowedAgents}; use polkadot_sdk::{frame_support::assert_err, sp_core::Get, sp_runtime::Percent}; use test_utils::{ assert_ok, - pallet_emission0::WeightControlDelegation, + pallet_emission0::{ConsensusMembers, WeightControlDelegation}, pallet_governance::{self, Allocators}, - Test, + step_block, Test, }; #[test] fn register_correctly() { test_utils::new_test_ext().execute_with(|| { - let agent = 0; - let allocator = 1; + let agent_id = 0; + let allocator_id = 1; let name = "agent".as_bytes().to_vec(); let url = "idk://agent".as_bytes().to_vec(); let metadata = "idk://agent".as_bytes().to_vec(); // Register allocator Agents::::set( - allocator, + allocator_id, Some(Agent { - key: allocator, + key: allocator_id, name: Default::default(), url: Default::default(), metadata: Default::default(), @@ -29,21 +29,21 @@ fn register_correctly() { fees: Default::default(), }), ); - Allocators::::set(allocator, Some(())); + Allocators::::set(allocator_id, Some(())); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( - agent + agent_id )); assert_ok!(pallet_torus0::agent::register::( - agent, - agent, + agent_id, + agent_id, name.clone(), url.clone(), metadata.clone(), )); - let agent = Agents::::get(agent).expect("it should exists"); + let agent = Agents::::get(agent_id).expect("it should exists"); assert_eq!(agent.name.to_vec(), name); assert_eq!(agent.url.to_vec(), url); @@ -51,7 +51,18 @@ fn register_correctly() { assert_eq!( WeightControlDelegation::::get(agent.key), - Some(allocator) + Some(allocator_id) + ); + + assert_err!( + pallet_torus0::agent::register::( + agent_id, + agent_id, + name.clone(), + url.clone(), + metadata.clone(), + ), + Error::::AgentAlreadyRegistered ); }); } @@ -407,6 +418,18 @@ fn update_correctly() { let url = "idk://agent".as_bytes().to_vec(); let metadata = "idk://agent".as_bytes().to_vec(); + assert_err!( + pallet_torus0::agent::update::( + agent, + b"".to_vec(), + b"".to_vec(), + None, + None, + None, + ), + Error::::AgentDoesNotExist + ); + assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent )); @@ -541,3 +564,100 @@ fn update_with_zero_weight_control_fee() { assert_eq!(agent.fees.weight_control_fee, weight_control_fee); }); } + +#[test] +fn prunes_excess_agents() { + test_utils::new_test_ext().execute_with(|| { + let immunity_period = 10; + ImmunityPeriod::::set(immunity_period as u16); + + let current_block = immunity_period * 2; + step_block(current_block); + + let max_allowed_agents = 3u32; + MaxAllowedAgents::::set(max_allowed_agents as u16); + + const IMMUNE_KEY: u32 = 1; + const ZEROED_SCORE_KEY: u32 = 2; + const MAX_OLD_VALIDATOR_KEY: u32 = 3; + const MAX_VALIDATOR_KEY: u32 = 4; + const MIN_VALIDATOR_KEY: u32 = 5; + for key in 0..6 { + Agents::::set( + key, + Some(Agent { + key, + name: Default::default(), + url: Default::default(), + metadata: Default::default(), + weight_penalty_factor: Default::default(), + registration_block: if key == IMMUNE_KEY { + current_block + } else { + key as u64 + }, + fees: Default::default(), + }), + ); + + if ![IMMUNE_KEY, ZEROED_SCORE_KEY].contains(&key) { + ConsensusMembers::::mutate(key, |member| { + let member = member.get_or_insert_with(Default::default); + member.last_incentives = 40; + match key { + MIN_VALIDATOR_KEY => member.last_dividends = 100, + MAX_OLD_VALIDATOR_KEY | MAX_VALIDATOR_KEY => member.last_dividends = 200, + _ => {} + } + }) + } + } + + let agent_id = 6; + assert_ok!(pallet_governance::whitelist::add_to_whitelist::( + agent_id + )); + + assert_ok!(pallet_torus0::agent::register::( + agent_id, + agent_id, + b"agent".to_vec(), + b"idk://agent".to_vec(), + b"idk://agent".to_vec(), + )); + + let expected_keys = [IMMUNE_KEY, MAX_VALIDATOR_KEY, agent_id]; + assert_eq!(Agents::::iter().count(), expected_keys.len()); + + for expected_key in expected_keys { + assert!(Agents::::contains_key(expected_key)); + } + + let _ = Agents::::clear(u32::MAX, None); + MaxAllowedAgents::::set(1); + + Agents::::set( + 0, + Some(Agent { + key: 0, + name: Default::default(), + url: Default::default(), + metadata: Default::default(), + weight_penalty_factor: Default::default(), + registration_block: current_block, + fees: Default::default(), + }), + ); + + assert_err!( + pallet_torus0::agent::register::( + agent_id, + agent_id, + b"agent".to_vec(), + b"idk://agent".to_vec(), + b"idk://agent".to_vec(), + ), + Error::::MaxAllowedAgents + ); + }); +} diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 1ae60048..29e07207 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -86,7 +86,7 @@ fn main() { "--exclude-from-report", "test-utils", "--ignore-filename-regex", - "test-utils|weights.rs", + "test-utils|weights.rs|migrations.rs|benchmarks.rs", ]; for pallet in PALLETS { From a5461345f4a318f58465a922f69e43a285a4191e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Tue, 18 Feb 2025 15:22:49 -0300 Subject: [PATCH 08/46] feat: transfer fees to treasury (#78) Closes CHAIN-60 --- pallets/governance/src/application.rs | 17 ++++++++--------- pallets/governance/src/proposal.rs | 15 +++++++++------ pallets/governance/tests/application.rs | 21 +++++++++++++++++++++ pallets/governance/tests/voting.rs | 20 +++++++++++++++++++- pallets/torus0/src/agent.rs | 7 ++++--- pallets/torus0/tests/agent.rs | 17 ++++++++++++++++- xtask/src/build_spec.rs | 1 - 7 files changed, 77 insertions(+), 21 deletions(-) diff --git a/pallets/governance/src/application.rs b/pallets/governance/src/application.rs index d46a0e24..8fd74edf 100644 --- a/pallets/governance/src/application.rs +++ b/pallets/governance/src/application.rs @@ -4,7 +4,6 @@ use codec::{Decode, Encode, MaxEncodedLen}; use polkadot_sdk::frame_election_provider_support::Get; use polkadot_sdk::frame_support::dispatch::DispatchResult; use polkadot_sdk::frame_support::traits::Currency; -use polkadot_sdk::frame_support::traits::WithdrawReasons; use polkadot_sdk::frame_support::DebugNoBound; use polkadot_sdk::sp_runtime::BoundedVec; use polkadot_sdk::sp_std::vec::Vec; @@ -69,10 +68,10 @@ pub fn submit_application( let config = crate::GlobalGovernanceConfig::::get(); let cost = config.agent_application_cost; - let _ = ::Currency::withdraw( + ::Currency::transfer( &payer, + &crate::DaoTreasuryAddress::::get(), cost, - WithdrawReasons::except(WithdrawReasons::TIP), ExistenceRequirement::AllowDeath, ) .map_err(|_| crate::Error::::NotEnoughBalanceToApply)?; @@ -145,10 +144,12 @@ pub fn accept_application(application_id: u32) -> DispatchResu } }); - // Pay the application cost back to the applicant - // TODO: should this value be used? - let _ = - ::Currency::deposit_creating(&application.payer_key, application.cost); + let _ = ::Currency::transfer( + &crate::DaoTreasuryAddress::::get(), + &application.payer_key, + application.cost, + ExistenceRequirement::AllowDeath, + ); crate::Pallet::::deposit_event(crate::Event::::ApplicationAccepted(application.id)); @@ -169,8 +170,6 @@ pub fn deny_application(application_id: u32) -> DispatchResult } }); - // Application cost is discarded - crate::Pallet::::deposit_event(crate::Event::::ApplicationDenied(application.id)); Ok(()) diff --git a/pallets/governance/src/proposal.rs b/pallets/governance/src/proposal.rs index 9c9de443..d2edcd90 100644 --- a/pallets/governance/src/proposal.rs +++ b/pallets/governance/src/proposal.rs @@ -11,7 +11,6 @@ use crate::{GovernanceConfiguration, NotDelegatingVotingPower}; use codec::{Decode, Encode, MaxEncodedLen}; use polkadot_sdk::frame_election_provider_support::Get; use polkadot_sdk::frame_support::traits::Currency; -use polkadot_sdk::frame_support::traits::WithdrawReasons; use polkadot_sdk::polkadot_sdk_frame::traits::CheckedAdd; use polkadot_sdk::sp_runtime::SaturatedConversion; use polkadot_sdk::sp_std::{collections::btree_set::BTreeSet, vec::Vec}; @@ -76,8 +75,12 @@ impl Proposal { } fn execute_proposal(self) -> DispatchResult { - let _ = - ::Currency::deposit_creating(&self.proposer, self.proposal_cost); + let _ = ::Currency::transfer( + &crate::DaoTreasuryAddress::::get(), + &self.proposer, + self.proposal_cost, + ExistenceRequirement::AllowDeath, + ); match self.data { ProposalData::GlobalParams(data) => { @@ -378,13 +381,13 @@ fn add_proposal( let config = GlobalGovernanceConfig::::get(); let cost = config.proposal_cost; - let _ = ::Currency::withdraw( + ::Currency::transfer( &proposer, + &crate::DaoTreasuryAddress::::get(), cost, - WithdrawReasons::except(WithdrawReasons::TIP), ExistenceRequirement::AllowDeath, ) - .map_err(|_| crate::Error::::NotEnoughBalanceToPropose)?; + .map_err(|_| crate::Error::::NotEnoughBalanceToApply)?; let proposal_id: u64 = crate::Proposals::::iter() .count() diff --git a/pallets/governance/tests/application.rs b/pallets/governance/tests/application.rs index 3f559cb9..f435b718 100644 --- a/pallets/governance/tests/application.rs +++ b/pallets/governance/tests/application.rs @@ -1,7 +1,12 @@ +use pallet_emission0::PendingEmission; use pallet_governance::application::ApplicationStatus; use pallet_governance::AgentApplications; +use pallet_governance::DaoTreasuryAddress; use pallet_governance::GlobalGovernanceConfig; +use pallet_governance::TreasuryEmissionFee; +use pallet_governance_api::GovernanceApi; use polkadot_sdk::frame_support::assert_err; +use polkadot_sdk::sp_runtime::Percent; use test_utils::*; #[test] @@ -203,6 +208,10 @@ fn error_is_thrown_on_multiple_applications_same_key() { #[test] fn application_denied_doesnt_add_to_whitelist() { new_test_ext().execute_with(|| { + PendingEmission::::set(0); + TreasuryEmissionFee::::set(Percent::zero()); + let balance = get_balance(DaoTreasuryAddress::::get()); + let key = 0; let adding_key = 1; pallet_governance::Curators::::insert(key, ()); @@ -249,12 +258,20 @@ fn application_denied_doesnt_add_to_whitelist() { application.status, ApplicationStatus::Resolved { accepted: false } ); + assert_eq!( + get_balance(Test::dao_treasury_address()), + balance + crate::GlobalGovernanceConfig::::get().agent_application_cost + ); }); } #[test] fn application_expires() { new_test_ext().execute_with(|| { + PendingEmission::::set(0); + TreasuryEmissionFee::::set(Percent::zero()); + let balance = get_balance(DaoTreasuryAddress::::get()); + let key = 0; let adding_key = 1; pallet_governance::Curators::::insert(key, ()); @@ -285,6 +302,10 @@ fn application_expires() { let application = pallet_governance::AgentApplications::::get(application_id).unwrap(); assert_eq!(application.status, ApplicationStatus::Expired); + assert_eq!( + get_balance(Test::dao_treasury_address()), + balance + crate::GlobalGovernanceConfig::::get().agent_application_cost + ); }); } diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index 65951a21..75a50304 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -1,8 +1,10 @@ +use pallet_emission0::PendingEmission; use pallet_governance::{ config::GovernanceConfiguration, proposal::{GlobalParamsData, ProposalStatus}, - DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, + DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, TreasuryEmissionFee, }; +use pallet_governance_api::GovernanceApi; use polkadot_sdk::frame_support::traits::Get; use polkadot_sdk::{frame_support::assert_err, sp_runtime::BoundedBTreeSet}; use polkadot_sdk::{frame_support::assert_ok, sp_runtime::Percent}; @@ -203,6 +205,10 @@ fn global_custom_proposal_is_accepted_correctly() { #[test] fn global_proposal_is_refused_correctly() { new_test_ext().execute_with(|| { + PendingEmission::::set(0); + TreasuryEmissionFee::::set(Percent::zero()); + let balance = get_balance(DaoTreasuryAddress::::get()); + zero_min_burn(); const FOR: u32 = 0; const AGAINST: u32 = 1; @@ -235,6 +241,10 @@ fn global_proposal_is_refused_correctly() { stake_against: 10_000_000_000_000_000_000, } ); + assert_eq!( + get_balance(Test::dao_treasury_address()), + balance + crate::GlobalGovernanceConfig::::get().proposal_cost + ); }); } @@ -454,6 +464,10 @@ fn creates_emission_proposal_and_it_expires() { new_test_ext().execute_with(|| { zero_min_burn(); + PendingEmission::::set(0); + TreasuryEmissionFee::::set(Percent::zero()); + let balance = get_balance(DaoTreasuryAddress::::get()); + let default_proposal_expiration: u64 = ::DefaultProposalExpiration::get(); @@ -483,6 +497,10 @@ fn creates_emission_proposal_and_it_expires() { Proposals::::get(0).unwrap().status, ProposalStatus::Expired ); + assert_eq!( + get_balance(Test::dao_treasury_address()), + balance + crate::GlobalGovernanceConfig::::get().proposal_cost + ); }); } diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index 56673d34..fe0fbcff 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -3,7 +3,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; use pallet_emission0_api::Emission0Api; use pallet_governance_api::GovernanceApi; use polkadot_sdk::frame_election_provider_support::Get; -use polkadot_sdk::frame_support::traits::{Currency, ExistenceRequirement, WithdrawReasons}; +use polkadot_sdk::frame_support::traits::{Currency, ExistenceRequirement}; use polkadot_sdk::frame_support::DebugNoBound; use polkadot_sdk::polkadot_sdk_frame::prelude::BlockNumberFor; use polkadot_sdk::sp_runtime::DispatchError; @@ -92,10 +92,11 @@ pub fn register( let burn = crate::Burn::::get(); - let _ = ::Currency::withdraw( + // Registration cost is sent to treasury + ::Currency::transfer( &payer, + &::Governance::dao_treasury_address(), burn, - WithdrawReasons::except(WithdrawReasons::TIP), ExistenceRequirement::AllowDeath, ) .map_err(|_| crate::Error::::NotEnoughBalanceToRegisterAgent)?; diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index e35422a6..6412ea0c 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -1,10 +1,20 @@ +use pallet_governance_api::GovernanceApi; use pallet_torus0::{Burn, Error}; use polkadot_sdk::{frame_support::assert_err, sp_core::Get, sp_runtime::Percent}; -use test_utils::{assert_ok, pallet_governance, Test}; +use test_utils::{ + assert_ok, get_balance, + pallet_emission0::PendingEmission, + pallet_governance::{self, DaoTreasuryAddress, TreasuryEmissionFee}, + Test, +}; #[test] fn register_correctly() { test_utils::new_test_ext().execute_with(|| { + PendingEmission::::set(0); + TreasuryEmissionFee::::set(Percent::zero()); + let balance = get_balance(DaoTreasuryAddress::::get()); + let agent = 0; let name = "agent".as_bytes().to_vec(); let url = "idk://agent".as_bytes().to_vec(); @@ -27,6 +37,11 @@ fn register_correctly() { assert_eq!(agent.name.to_vec(), name); assert_eq!(agent.url.to_vec(), url); assert_eq!(agent.metadata.to_vec(), metadata); + + assert_eq!( + get_balance(Test::dao_treasury_address()), + balance + Burn::::get() + ); }); } diff --git a/xtask/src/build_spec.rs b/xtask/src/build_spec.rs index d4f0aeec..88c3177d 100644 --- a/xtask/src/build_spec.rs +++ b/xtask/src/build_spec.rs @@ -91,7 +91,6 @@ fn grandpa(genesis: &mut Value) { )]; let key = key_name(b"Grandpa", b"Authorities"); - dbg!(&key); let mut buf = Cursor::new(vec![0; grandpa.size_hint()]); grandpa.encode_to(&mut buf); From c00bab0cbacd800a2fe6e4e6d86bf93a77dbf96d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Sat, 22 Feb 2025 22:23:36 -0300 Subject: [PATCH 09/46] test: improve `torus0` and `governance` pallet tests (#84) Closes CHAIN-70 --- pallets/governance/tests/application.rs | 16 +- pallets/governance/tests/config.rs | 40 ++ pallets/governance/tests/delegation.rs | 33 ++ pallets/governance/tests/proposal.rs | 563 ++++++++++++++++++++++++ pallets/governance/tests/roles.rs | 100 ++++- pallets/governance/tests/voting.rs | 509 ++++----------------- pallets/torus0/tests/agent.rs | 30 +- pallets/torus0/tests/stake.rs | 108 ++++- 8 files changed, 942 insertions(+), 457 deletions(-) create mode 100644 pallets/governance/tests/config.rs create mode 100644 pallets/governance/tests/delegation.rs create mode 100644 pallets/governance/tests/proposal.rs diff --git a/pallets/governance/tests/application.rs b/pallets/governance/tests/application.rs index d1fe9071..731379fc 100644 --- a/pallets/governance/tests/application.rs +++ b/pallets/governance/tests/application.rs @@ -1,5 +1,5 @@ use pallet_governance::{ - application::ApplicationStatus, AgentApplications, GlobalGovernanceConfig, + application::ApplicationStatus, AgentApplications, GlobalGovernanceConfig, Whitelist, }; use polkadot_sdk::frame_support::assert_err; use test_utils::*; @@ -118,7 +118,7 @@ fn whitelist_executes_application_correctly_remove() { zero_min_burn(); let key = 0; - let adding_key = 1; + let removing_key = 1; pallet_governance::Curators::::insert(key, ()); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; @@ -128,11 +128,13 @@ fn whitelist_executes_application_correctly_remove() { // first submit an application let balance_before = get_balance(key); + Whitelist::::set(removing_key, Some(())); + assert_ok!(pallet_governance::Pallet::::submit_application( get_origin(key), - adding_key, + removing_key, data.clone(), - false + true )); let balance_after = get_balance(key); @@ -140,7 +142,7 @@ fn whitelist_executes_application_correctly_remove() { let mut application_id: u32 = u32::MAX; for (_, value) in AgentApplications::::iter() { - assert_eq!(value.agent_key, adding_key); + assert_eq!(value.agent_key, removing_key); assert_eq!(value.data, data); application_id = value.id; } @@ -154,8 +156,8 @@ fn whitelist_executes_application_correctly_remove() { assert_eq!(balance_after_accept, balance_before); - assert!(pallet_governance::whitelist::is_whitelisted::( - &adding_key + assert!(!pallet_governance::whitelist::is_whitelisted::( + &removing_key )); let application = diff --git a/pallets/governance/tests/config.rs b/pallets/governance/tests/config.rs new file mode 100644 index 00000000..23b8e087 --- /dev/null +++ b/pallets/governance/tests/config.rs @@ -0,0 +1,40 @@ +use polkadot_sdk::{ + frame_support::assert_err, + sp_runtime::{traits::BadOrigin, Percent}, +}; +use test_utils::{assert_ok, get_origin, new_test_ext, RuntimeOrigin, Test}; + +#[test] +fn set_emission_params() { + new_test_ext().execute_with(|| { + assert_ok!(pallet_governance::Pallet::::set_emission_params( + RuntimeOrigin::root(), + Percent::from_percent(15), + Percent::from_percent(15), + )); + + assert_eq!( + pallet_emission0::EmissionRecyclingPercentage::::get(), + Percent::from_percent(15) + ); + + assert_eq!( + pallet_governance::TreasuryEmissionFee::::get(), + Percent::from_percent(15) + ); + }); +} + +#[test] +fn set_emission_params_non_root() { + new_test_ext().execute_with(|| { + assert_err!( + pallet_governance::Pallet::::set_emission_params( + get_origin(0), + Percent::from_percent(15), + Percent::from_percent(15), + ), + BadOrigin + ); + }); +} diff --git a/pallets/governance/tests/delegation.rs b/pallets/governance/tests/delegation.rs new file mode 100644 index 00000000..573340db --- /dev/null +++ b/pallets/governance/tests/delegation.rs @@ -0,0 +1,33 @@ +use pallet_governance::NotDelegatingVotingPower; +use polkadot_sdk::frame_support::assert_ok; +use test_utils::{get_origin, new_test_ext, Test}; + +#[test] +fn delegates_voting_power_correctly() { + new_test_ext().execute_with(|| { + const MODULE: u32 = 0; + + assert_ok!(pallet_governance::Pallet::::enable_vote_delegation( + get_origin(MODULE) + )); + + assert!(!NotDelegatingVotingPower::::get().contains(&MODULE)); + }); +} + +#[test] +fn disable_voting_power_delegation_correctly() { + new_test_ext().execute_with(|| { + const MODULE: u32 = 0; + + assert_ok!(pallet_governance::Pallet::::enable_vote_delegation( + get_origin(MODULE) + )); + + assert_ok!(pallet_governance::Pallet::::disable_vote_delegation( + get_origin(MODULE) + )); + + assert!(NotDelegatingVotingPower::::get().contains(&MODULE)); + }); +} diff --git a/pallets/governance/tests/proposal.rs b/pallets/governance/tests/proposal.rs new file mode 100644 index 00000000..ec362d84 --- /dev/null +++ b/pallets/governance/tests/proposal.rs @@ -0,0 +1,563 @@ +use pallet_governance::{ + config::GovernanceConfiguration, + proposal::{GlobalParamsData, ProposalStatus}, + DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, +}; +use polkadot_sdk::{ + frame_support::{assert_err, assert_ok, traits::Get}, + sp_runtime::{BoundedBTreeSet, Percent}, +}; +use test_utils::{ + add_balance, get_balance, get_origin, new_test_ext, step_block, to_nano, zero_min_burn, + AccountId, Test, +}; + +fn register(account: AccountId, _unused: u16, module: AccountId, stake: u128) { + if get_balance(account) < stake { + add_balance(account, stake); + } + + let _ = pallet_governance::whitelist::add_to_whitelist::(module); + + assert_ok!(pallet_torus0::agent::register::( + module, + module, + b"agent".to_vec(), + b"url".to_vec(), + b"metadata".to_vec(), + )); + + assert!(get_balance(account) >= stake); + + let min_stake: u128 = pallet_torus0::MinAllowedStake::::get(); + if stake >= min_stake { + if get_balance(account) - stake < 1 { + add_balance(account, 1); + } + assert_ok!(pallet_torus0::stake::add_stake::( + account, module, stake + )); + } +} + +fn config(proposal_cost: u128, proposal_expiration: u64) { + pallet_governance::GlobalGovernanceConfig::::mutate(|config| { + config.proposal_cost = proposal_cost; + config.proposal_expiration = proposal_expiration; + }); +} + +fn vote(account: u32, proposal_id: u64, agree: bool) { + if pallet_torus0::stake::sum_staked_by::(&account) < 1 { + stake(account, account, to_nano(1)); + } + + assert_ok!(pallet_governance::voting::add_vote::( + account, + proposal_id, + agree + )); +} + +fn delegate(account: u32) { + assert_ok!(pallet_governance::Pallet::::enable_vote_delegation( + get_origin(account) + )); +} + +#[test] +fn global_governance_config_validates_parameters_correctly() { + new_test_ext().execute_with(|| { + assert_err!( + GlobalParamsData:: { + min_name_length: 1, + ..GlobalParamsData::default() + } + .validate(), + Error::::InvalidMinNameLength + ); + + assert_err!( + GlobalParamsData:: { + max_name_length: 300, + ..GlobalParamsData::default() + } + .validate(), + Error::::InvalidMaxNameLength + ); + + assert_err!( + GlobalParamsData:: { + max_allowed_agents: 50001, + ..GlobalParamsData::default() + } + .validate(), + Error::::InvalidMaxAllowedAgents + ); + + assert_err!( + GlobalParamsData:: { + min_weight_control_fee: 101, + ..GlobalParamsData::default() + } + .validate(), + Error::::InvalidMinWeightControlFee + ); + + assert_err!( + GlobalParamsData:: { + min_staking_fee: 101, + ..GlobalParamsData::default() + } + .validate(), + Error::::InvalidMinStakingFee + ); + }); +} + +#[test] +fn global_proposal_validates_parameters() { + new_test_ext().execute_with(|| { + zero_min_burn(); + const KEY: u32 = 0; + add_balance(KEY, to_nano(100_000)); + + assert_err!( + pallet_governance::Pallet::::add_global_params_proposal( + get_origin(KEY), + Default::default(), + b"".to_vec(), + ), + Error::::ProposalDataTooSmall + ); + + assert_err!( + pallet_governance::Pallet::::add_global_params_proposal( + get_origin(KEY), + Default::default(), + b"1".repeat(257), + ), + Error::::ProposalDataTooLarge + ); + + let test = |global_params| { + pallet_governance::Pallet::::add_global_params_proposal( + get_origin(KEY), + global_params, + b"metadata".to_vec(), + ) + }; + + test(GlobalParamsData { + min_name_length: 0, + ..Default::default() + }) + .expect_err("created proposal with invalid max name length"); + + test(GlobalParamsData { + proposal_cost: 50_000_000_000_000_000_000_001, + ..Default::default() + }) + .expect_err("created proposal with invalid proposal cost"); + + test(GlobalParamsData::default()).expect("failed to create proposal with valid parameters"); + }); +} + +#[test] +fn global_custom_proposal_is_accepted_correctly() { + new_test_ext().execute_with(|| { + zero_min_burn(); + const FOR: u32 = 0; + const AGAINST: u32 = 1; + + let key = 0; + + register(FOR, 0, 0, to_nano(10)); + register(AGAINST, 0, 1, to_nano(5)); + + config(1, 100); + + add_balance(key, 1); + assert_ok!( + pallet_governance::Pallet::::add_global_custom_proposal( + get_origin(key), + b"metadata".to_vec() + ) + ); + + vote(FOR, 0, true); + vote(AGAINST, 0, false); + + step_block(100); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Accepted { + block: 100, + stake_for: to_nano(10), + stake_against: to_nano(5), + } + ); + + step_block(1); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Accepted { + block: 100, + stake_for: to_nano(10), + stake_against: to_nano(5), + } + ); + }); +} + +#[test] +fn global_proposal_is_refused_correctly() { + new_test_ext().execute_with(|| { + zero_min_burn(); + const FOR: u32 = 0; + const AGAINST: u32 = 1; + + let key = 0; + + register(FOR, 0, 0, to_nano(5)); + register(AGAINST, 0, 1, to_nano(10)); + + config(1, 100); + + add_balance(FOR, 1); + assert_ok!( + pallet_governance::Pallet::::add_global_custom_proposal( + get_origin(key), + b"metadata".to_vec() + ) + ); + + vote(FOR, 0, true); + vote(AGAINST, 0, false); + + step_block(100); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Refused { + block: 100, + stake_for: 5_000_000_000_000_000_000, + stake_against: 10_000_000_000_000_000_000, + } + ); + }); +} + +#[test] +fn global_params_proposal_accepted() { + new_test_ext().execute_with(|| { + zero_min_burn(); + const KEY: u32 = 0; + + register(KEY, 0, 0, to_nano(10)); + config(1, 100); + + let data = GlobalParamsData { + proposal_cost: 69_420, + ..Default::default() + }; + + add_balance(KEY, 1); + pallet_governance::Pallet::::add_global_params_proposal( + get_origin(KEY), + data, + b"metadata".to_vec(), + ) + .unwrap(); + + vote(KEY, 0, true); + step_block(100); + + assert_eq!(GlobalGovernanceConfig::::get().proposal_cost, 69_420); + }); +} + +#[test] +fn global_proposals_counts_delegated_stake() { + new_test_ext().execute_with(|| { + zero_min_burn(); + + const FOR: u32 = 0; + const AGAINST: u32 = 1; + const FOR_DELEGATED: u32 = 2; + + let origin = get_origin(0); + + register(FOR, 0, FOR, to_nano(5)); + register(AGAINST, 0, AGAINST, to_nano(10)); + + stake(FOR_DELEGATED, FOR, to_nano(10)); + delegate(FOR_DELEGATED); + + // AGAINST does not delegate voting power, so it doesn't matter + // to who it stakes. + stake(AGAINST, FOR, to_nano(3)); + pallet_governance::voting::disable_delegation::(AGAINST).unwrap(); + + config(1, 100); + + add_balance(FOR, 1); + + assert_ok!( + pallet_governance::Pallet::::add_global_custom_proposal(origin, vec![b'0'; 64]) + ); + + vote(FOR, 0, true); + vote(AGAINST, 0, false); + + step_block(100); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Accepted { + block: 100, + stake_for: 15_000_000_000_000_000_000, + stake_against: 13_000_000_000_000_000_000, + } + ); + }); +} + +#[test] +fn creates_treasury_transfer_proposal_and_transfers() { + new_test_ext().execute_with(|| { + zero_min_burn(); + + pallet_governance::TreasuryEmissionFee::::set(Percent::from_percent(0)); + + let origin = get_origin(0); + pallet_governance::Pallet::::add_dao_treasury_transfer_proposal( + origin.clone(), + to_nano(5), + 0, + vec![b'0'; 64], + ) + .expect_err("proposal should not be created when treasury does not have enough money"); + + add_balance(DaoTreasuryAddress::::get(), to_nano(10)); + add_balance(0, to_nano(3)); + register(0, 0, 0, 0); + config(1, 100); + + pallet_governance::Pallet::::add_dao_treasury_transfer_proposal( + origin, + to_nano(5), + 0, + vec![b'0'; 64], + ) + .expect("proposal should be created"); + vote(0, 0, true); + + step_block(100); + + assert_eq!(get_balance(DaoTreasuryAddress::::get()), to_nano(5)); + assert_eq!(get_balance(0), to_nano(8)); + }); +} + +#[test] +fn creates_emission_proposal_and_it_runs_after_2_days() { + new_test_ext().execute_with(|| { + zero_min_burn(); + + let default_proposal_expiration: u64 = + ::DefaultProposalExpiration::get(); + + config(1, default_proposal_expiration); + + let origin = get_origin(0); + add_balance(0, to_nano(2)); + register(0, 0, 0, to_nano(1)); + let _ = pallet_governance::roles::penalize_agent::(0, 100); + pallet_torus0::TotalStake::::set(to_nano(10)); + + assert_ok!(pallet_governance::Pallet::::add_emission_proposal( + origin.clone(), + Percent::from_parts(20), + Percent::from_parts(20), + Percent::from_parts(20), + vec![b'0'; 64], + )); + + vote(0, 0, true); + + step_block(21_600); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Accepted { + block: 21_600, + stake_for: to_nano(1), + stake_against: 0 + } + ); + }); +} + +#[test] +fn creates_emission_proposal_and_it_runs_before_expiration() { + new_test_ext().execute_with(|| { + zero_min_burn(); + + let default_proposal_expiration: u64 = + ::DefaultProposalExpiration::get(); + + let min_stake: u128 = ::DefaultMinAllowedStake::get(); + + config(1, default_proposal_expiration); + + let origin = get_origin(0); + add_balance(0, to_nano(2)); + register(0, 0, 0, to_nano(1) - min_stake); + let _ = pallet_governance::roles::penalize_agent::(0, 100); + pallet_torus0::TotalStake::::set(to_nano(10)); + + assert_ok!(pallet_governance::Pallet::::add_emission_proposal( + origin.clone(), + Percent::from_parts(20), + Percent::from_parts(20), + Percent::from_parts(20), + vec![b'0'; 64], + )); + + vote(0, 0, true); + + step_block(21_600); + + let mut votes_for = BoundedBTreeSet::new(); + votes_for.try_insert(0).unwrap(); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Open { + votes_for, + votes_against: BoundedBTreeSet::new(), + stake_for: to_nano(1) - min_stake, + stake_against: 0 + } + ); + + stake(0, 0, min_stake); + pallet_torus0::TotalStake::::set(to_nano(10)); + + step_block(100); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Accepted { + block: 21_700, + stake_for: to_nano(1), + stake_against: 0 + } + ); + }); +} + +#[test] +fn creates_emission_proposal_and_it_expires() { + new_test_ext().execute_with(|| { + zero_min_burn(); + + let default_proposal_expiration: u64 = + ::DefaultProposalExpiration::get(); + + let min_stake: u128 = ::DefaultMinAllowedStake::get(); + + config(1, default_proposal_expiration); + + let origin = get_origin(0); + add_balance(0, to_nano(2)); + register(0, 0, 0, to_nano(1) - min_stake); + let _ = pallet_governance::roles::penalize_agent::(0, 100); + pallet_torus0::TotalStake::::set(to_nano(10)); + + assert_ok!(pallet_governance::Pallet::::add_emission_proposal( + origin.clone(), + Percent::from_parts(20), + Percent::from_parts(20), + Percent::from_parts(20), + vec![b'0'; 64], + )); + + vote(0, 0, true); + + step_block(default_proposal_expiration); + + assert_eq!( + Proposals::::get(0).unwrap().status, + ProposalStatus::Expired + ); + }); +} + +pub fn stake(account: u32, module: u32, stake: u128) { + add_balance(account, stake); + + if get_balance(account) - stake < 1 { + add_balance(account, 1); + } + + assert_ok!(pallet_torus0::stake::add_stake::( + account, module, stake + )); +} + +#[test] +fn rewards_wont_exceed_treasury() { + new_test_ext().execute_with(|| { + zero_min_burn(); + // Fill the governance address with 1 mil so we are not limited by the max + // allocation + let amount = to_nano(1_000_000_000); + let key = DaoTreasuryAddress::::get(); + add_balance(key, amount); + + let governance_config: GovernanceConfiguration = + GlobalGovernanceConfig::::get(); + let n = 0; + let allocation = + pallet_governance::proposal::get_reward_allocation::(&governance_config, n) + .unwrap(); + assert_eq!( + allocation.into_inner(), + governance_config.max_proposal_reward_treasury_allocation + ); + }); +} + +#[test] +fn creates_emission_proposal_with_invalid_params_and_it_fails() { + new_test_ext().execute_with(|| { + zero_min_burn(); + + let default_proposal_expiration: u64 = + ::DefaultProposalExpiration::get(); + + let min_stake: u128 = ::DefaultMinAllowedStake::get(); + + config(1, default_proposal_expiration); + + let origin = get_origin(0); + add_balance(0, to_nano(2)); + register(0, 0, 0, to_nano(1) - min_stake); + + assert_err!( + pallet_governance::Pallet::::add_emission_proposal( + origin.clone(), + Percent::from_parts(51), + Percent::from_parts(50), + Percent::from_parts(50), + vec![b'0'; 64], + ), + Error::::InvalidEmissionProposalData + ); + }); +} diff --git a/pallets/governance/tests/roles.rs b/pallets/governance/tests/roles.rs index eb4bc276..48922f80 100644 --- a/pallets/governance/tests/roles.rs +++ b/pallets/governance/tests/roles.rs @@ -1,9 +1,37 @@ -use pallet_governance::Curators; -use polkadot_sdk::frame_support::assert_err; +use pallet_governance::{Curators, GlobalGovernanceConfig, Whitelist}; +use polkadot_sdk::{frame_support::assert_err, sp_runtime::Percent}; use test_utils::*; use crate::pallet_governance::Error; +fn register(account: AccountId, _unused: u16, module: AccountId, stake: u128) { + if get_balance(account) < stake { + add_balance(account, stake); + } + + let _ = pallet_governance::whitelist::add_to_whitelist::(module); + + assert_ok!(pallet_torus0::agent::register::( + module, + module, + b"agent".to_vec(), + b"url".to_vec(), + b"metadata".to_vec(), + )); + + assert!(get_balance(account) >= stake); + + let min_stake: u128 = pallet_torus0::MinAllowedStake::::get(); + if stake >= min_stake { + if get_balance(account) - stake < 1 { + add_balance(account, 1); + } + assert_ok!(pallet_torus0::stake::add_stake::( + account, module, stake + )); + } +} + #[test] fn add_and_remove_curator() { new_test_ext().execute_with(|| { @@ -110,5 +138,73 @@ fn only_curators_can_whitelist() { ), Error::::NotCurator ); + + assert_err!( + pallet_governance::Pallet::::remove_from_whitelist( + get_origin(not_curator_key), + module_key + ), + Error::::NotCurator + ); + }); +} + +#[test] +fn cannot_remove_from_whitelist_if_remove_application_exists() { + new_test_ext().execute_with(|| { + let curator_key = 0; + let module_key = 1; + + Curators::::insert(curator_key, ()); + + Whitelist::::set(module_key, Some(())); + + let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; + let data = "test".as_bytes().to_vec(); + + add_balance(module_key, proposal_cost + 1); + + pallet_governance::Pallet::::submit_application( + get_origin(module_key), + module_key, + data, + true, + ) + .unwrap(); + + assert_err!( + pallet_governance::Pallet::::remove_from_whitelist( + get_origin(curator_key), + module_key + ), + Error::::ApplicationKeyAlreadyUsed + ); + }); +} + +#[test] +fn penalize_agent_successfully() { + new_test_ext().execute_with(|| { + let curator_key = 0; + let module_key = 1; + + Curators::::insert(curator_key, ()); + + register(module_key, 0, module_key, to_nano(100)); + + Whitelist::::set(module_key, Some(())); + + assert_ok!(pallet_governance::Pallet::::penalize_agent( + get_origin(curator_key), + module_key, + 1 + )); + + assert_eq!( + pallet_torus0::Agents::::get(module_key) + .unwrap() + .weight_penalty_factor, + Percent::from_percent(1) + ); }); } diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index 9eda2790..006d5c25 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -1,15 +1,10 @@ -use pallet_governance::{ - config::GovernanceConfiguration, - proposal::{GlobalParamsData, ProposalStatus}, - DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, -}; -use polkadot_sdk::{ - frame_support::{assert_err, assert_ok, traits::Get}, - sp_runtime::{BoundedBTreeSet, Percent}, -}; +use pallet_governance::proposal::{Proposal, ProposalData}; +use pallet_governance::Error; +use pallet_governance::{proposal::ProposalStatus, Proposals}; +use polkadot_sdk::frame_support::{assert_err, assert_ok}; +use polkadot_sdk::sp_runtime::BoundedVec; use test_utils::{ - add_balance, get_balance, get_origin, new_test_ext, step_block, to_nano, zero_min_burn, - AccountId, Test, + add_balance, get_balance, get_origin, new_test_ext, to_nano, zero_min_burn, AccountId, Test, }; fn register(account: AccountId, _unused: u16, module: AccountId, stake: u128) { @@ -59,12 +54,6 @@ fn vote(account: u32, proposal_id: u64, agree: bool) { )); } -fn delegate(account: u32) { - assert_ok!(pallet_governance::Pallet::::enable_vote_delegation( - get_origin(account) - )); -} - pub fn stake(account: u32, module: u32, stake: u128) { add_balance(account, stake); @@ -77,154 +66,6 @@ pub fn stake(account: u32, module: u32, stake: u128) { )); } -#[test] -fn global_governance_config_validates_parameters_correctly() { - new_test_ext().execute_with(|| { - assert_err!( - GlobalParamsData:: { - min_name_length: 1, - ..GlobalParamsData::default() - } - .validate(), - Error::::InvalidMinNameLength - ); - - assert_err!( - GlobalParamsData:: { - max_name_length: 300, - ..GlobalParamsData::default() - } - .validate(), - Error::::InvalidMaxNameLength - ); - - assert_err!( - GlobalParamsData:: { - max_allowed_agents: 50001, - ..GlobalParamsData::default() - } - .validate(), - Error::::InvalidMaxAllowedAgents - ); - - assert_err!( - GlobalParamsData:: { - min_weight_control_fee: 101, - ..GlobalParamsData::default() - } - .validate(), - Error::::InvalidMinWeightControlFee - ); - - assert_err!( - GlobalParamsData:: { - min_staking_fee: 101, - ..GlobalParamsData::default() - } - .validate(), - Error::::InvalidMinStakingFee - ); - }); -} - -#[test] -fn global_proposal_validates_parameters() { - new_test_ext().execute_with(|| { - zero_min_burn(); - const KEY: u32 = 0; - add_balance(KEY, to_nano(100_000)); - - assert_err!( - pallet_governance::Pallet::::add_global_params_proposal( - get_origin(KEY), - Default::default(), - b"".to_vec(), - ), - Error::::ProposalDataTooSmall - ); - - assert_err!( - pallet_governance::Pallet::::add_global_params_proposal( - get_origin(KEY), - Default::default(), - b"1".repeat(257), - ), - Error::::ProposalDataTooLarge - ); - - let test = |global_params| { - pallet_governance::Pallet::::add_global_params_proposal( - get_origin(KEY), - global_params, - b"metadata".to_vec(), - ) - }; - - test(GlobalParamsData { - min_name_length: 0, - ..Default::default() - }) - .expect_err("created proposal with invalid max name length"); - - test(GlobalParamsData { - proposal_cost: 50_000_000_000_000_000_000_001, - ..Default::default() - }) - .expect_err("created proposal with invalid proposal cost"); - - test(GlobalParamsData::default()).expect("failed to create proposal with valid parameters"); - }); -} - -#[test] -fn global_custom_proposal_is_accepted_correctly() { - new_test_ext().execute_with(|| { - zero_min_burn(); - const FOR: u32 = 0; - const AGAINST: u32 = 1; - - let key = 0; - - register(FOR, 0, 0, to_nano(10)); - register(AGAINST, 0, 1, to_nano(5)); - - config(1, 100); - - add_balance(key, 1); - assert_ok!( - pallet_governance::Pallet::::add_global_custom_proposal( - get_origin(key), - b"metadata".to_vec() - ) - ); - - vote(FOR, 0, true); - vote(AGAINST, 0, false); - - step_block(100); - - assert_eq!( - Proposals::::get(0).unwrap().status, - ProposalStatus::Accepted { - block: 100, - stake_for: to_nano(10), - stake_against: to_nano(5), - } - ); - - step_block(1); - - assert_eq!( - Proposals::::get(0).unwrap().status, - ProposalStatus::Accepted { - block: 100, - stake_for: to_nano(10), - stake_against: to_nano(5), - } - ); - }); -} - #[test] fn removes_vote_correctly() { new_test_ext().execute_with(|| { @@ -266,23 +107,21 @@ fn removes_vote_correctly() { } #[test] -fn global_proposal_is_refused_correctly() { +fn adds_vote_correctly() { new_test_ext().execute_with(|| { zero_min_burn(); + const FOR: u32 = 0; const AGAINST: u32 = 1; - let key = 0; - - register(FOR, 0, 0, to_nano(5)); + register(FOR, 0, 0, to_nano(10)); register(AGAINST, 0, 1, to_nano(10)); config(1, 100); - add_balance(FOR, 1); assert_ok!( pallet_governance::Pallet::::add_global_custom_proposal( - get_origin(key), + get_origin(FOR), b"metadata".to_vec() ) ); @@ -290,314 +129,146 @@ fn global_proposal_is_refused_correctly() { vote(FOR, 0, true); vote(AGAINST, 0, false); - step_block(100); - - assert_eq!( - Proposals::::get(0).unwrap().status, - ProposalStatus::Refused { - block: 100, - stake_for: 5_000_000_000_000_000_000, - stake_against: 10_000_000_000_000_000_000, + match pallet_governance::Proposals::::get(0).unwrap().status { + ProposalStatus::Open { + votes_for, + votes_against, + .. + } => { + assert!(votes_for.contains(&FOR)); + assert!(votes_against.contains(&AGAINST)); } - ); - }); -} - -#[test] -fn global_params_proposal_accepted() { - new_test_ext().execute_with(|| { - zero_min_burn(); - const KEY: u32 = 0; - - register(KEY, 0, 0, to_nano(10)); - config(1, 100); - - let data = GlobalParamsData { - proposal_cost: 69_420, - ..Default::default() - }; - - add_balance(KEY, 1); - pallet_governance::Pallet::::add_global_params_proposal( - get_origin(KEY), - data, - b"metadata".to_vec(), - ) - .unwrap(); - - vote(KEY, 0, true); - step_block(100); - - assert_eq!(GlobalGovernanceConfig::::get().proposal_cost, 69_420); + _ => unreachable!(), + } }); } #[test] -fn global_proposals_counts_delegated_stake() { +fn ensures_proposal_exists() { new_test_ext().execute_with(|| { zero_min_burn(); - const FOR: u32 = 0; - const AGAINST: u32 = 1; - const FOR_DELEGATED: u32 = 2; + const MODULE: u32 = 0; - let origin = get_origin(0); - - register(FOR, 0, FOR, to_nano(5)); - register(AGAINST, 0, AGAINST, to_nano(10)); - - stake(FOR_DELEGATED, FOR, to_nano(10)); - delegate(FOR_DELEGATED); - - // AGAINST does not delegate voting power, so it doesn't matter - // to who it stakes. - stake(AGAINST, FOR, to_nano(3)); - pallet_governance::voting::disable_delegation::(AGAINST).unwrap(); + register(MODULE, 0, 0, to_nano(10)); config(1, 100); - add_balance(FOR, 1); + if pallet_torus0::stake::sum_staked_by::(&MODULE) < 1 { + stake(MODULE, MODULE, to_nano(1)); + } - assert_ok!( - pallet_governance::Pallet::::add_global_custom_proposal(origin, vec![b'0'; 64]) + assert_err!( + pallet_governance::Pallet::::vote_proposal(get_origin(MODULE), 0, true), + Error::::ProposalNotFound ); - vote(FOR, 0, true); - vote(AGAINST, 0, false); - - step_block(100); + assert_err!( + pallet_governance::Pallet::::vote_proposal(get_origin(MODULE), 0, false), + Error::::ProposalNotFound + ); - assert_eq!( - Proposals::::get(0).unwrap().status, - ProposalStatus::Accepted { - block: 100, - stake_for: 15_000_000_000_000_000_000, - stake_against: 13_000_000_000_000_000_000, - } + assert_err!( + pallet_governance::Pallet::::remove_vote_proposal(get_origin(MODULE), 0), + Error::::ProposalNotFound ); }); } #[test] -fn creates_treasury_transfer_proposal_and_transfers() { +fn ensures_proposal_is_open() { new_test_ext().execute_with(|| { zero_min_burn(); - pallet_governance::TreasuryEmissionFee::::set(Percent::from_percent(0)); + const MODULE: u32 = 0; - let origin = get_origin(0); - pallet_governance::Pallet::::add_dao_treasury_transfer_proposal( - origin.clone(), - to_nano(5), - 0, - vec![b'0'; 64], - ) - .expect_err("proposal should not be created when treasury does not have enough money"); + register(MODULE, 0, 0, to_nano(10)); - add_balance(DaoTreasuryAddress::::get(), to_nano(10)); - add_balance(0, to_nano(3)); - register(0, 0, 0, 0); config(1, 100); - pallet_governance::Pallet::::add_dao_treasury_transfer_proposal( - origin, - to_nano(5), + Proposals::::set( 0, - vec![b'0'; 64], - ) - .expect("proposal should be created"); - vote(0, 0, true); - - step_block(100); - - assert_eq!(get_balance(DaoTreasuryAddress::::get()), to_nano(5)); - assert_eq!(get_balance(0), to_nano(8)); - }); -} - -#[test] -fn creates_emission_proposal_and_it_runs_after_2_days() { - new_test_ext().execute_with(|| { - zero_min_burn(); - - let default_proposal_expiration: u64 = - ::DefaultProposalExpiration::get(); - - config(1, default_proposal_expiration); - - let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1)); - let _ = pallet_governance::roles::penalize_agent::(0, 100); - pallet_torus0::TotalStake::::set(to_nano(10)); - - assert_ok!(pallet_governance::Pallet::::add_emission_proposal( - origin.clone(), - Percent::from_parts(20), - Percent::from_parts(20), - Percent::from_parts(20), - vec![b'0'; 64], - )); - - vote(0, 0, true); - - step_block(21_600); - - assert_eq!( - Proposals::::get(0).unwrap().status, - ProposalStatus::Accepted { - block: 21_600, - stake_for: to_nano(1), - stake_against: 0 - } + Some(Proposal { + id: 0, + proposer: MODULE, + expiration_block: 0, + data: ProposalData::GlobalCustom, + status: ProposalStatus::Expired, + metadata: BoundedVec::truncate_from("test".as_bytes().to_vec()), + proposal_cost: 1, + creation_block: 0, + }), ); - }); -} -#[test] -fn creates_emission_proposal_and_it_runs_before_expiration() { - new_test_ext().execute_with(|| { - zero_min_burn(); - - let default_proposal_expiration: u64 = - ::DefaultProposalExpiration::get(); - - let min_stake: u128 = ::DefaultMinAllowedStake::get(); - - config(1, default_proposal_expiration); - - let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1) - min_stake); - let _ = pallet_governance::roles::penalize_agent::(0, 100); - pallet_torus0::TotalStake::::set(to_nano(10)); - - assert_ok!(pallet_governance::Pallet::::add_emission_proposal( - origin.clone(), - Percent::from_parts(20), - Percent::from_parts(20), - Percent::from_parts(20), - vec![b'0'; 64], - )); - - vote(0, 0, true); - - step_block(21_600); - - let mut votes_for = BoundedBTreeSet::new(); - votes_for.try_insert(0).unwrap(); - - assert_eq!( - Proposals::::get(0).unwrap().status, - ProposalStatus::Open { - votes_for, - votes_against: BoundedBTreeSet::new(), - stake_for: to_nano(1) - min_stake, - stake_against: 0 - } + assert_err!( + pallet_governance::Pallet::::vote_proposal(get_origin(MODULE), 0, true), + Error::::ProposalClosed ); - stake(0, 0, min_stake); - pallet_torus0::TotalStake::::set(to_nano(10)); - - step_block(100); + assert_err!( + pallet_governance::Pallet::::vote_proposal(get_origin(MODULE), 0, false), + Error::::ProposalClosed + ); - assert_eq!( - Proposals::::get(0).unwrap().status, - ProposalStatus::Accepted { - block: 21_700, - stake_for: to_nano(1), - stake_against: 0 - } + assert_err!( + pallet_governance::Pallet::::remove_vote_proposal(get_origin(MODULE), 0), + Error::::ProposalClosed ); }); } #[test] -fn creates_emission_proposal_and_it_expires() { +fn ensures_module_hasnt_voted() { new_test_ext().execute_with(|| { zero_min_burn(); - let default_proposal_expiration: u64 = - ::DefaultProposalExpiration::get(); - - let min_stake: u128 = ::DefaultMinAllowedStake::get(); - - config(1, default_proposal_expiration); + const MODULE: u32 = 0; - let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1) - min_stake); - let _ = pallet_governance::roles::penalize_agent::(0, 100); - pallet_torus0::TotalStake::::set(to_nano(10)); + register(MODULE, 0, 0, to_nano(10)); - assert_ok!(pallet_governance::Pallet::::add_emission_proposal( - origin.clone(), - Percent::from_parts(20), - Percent::from_parts(20), - Percent::from_parts(20), - vec![b'0'; 64], - )); + config(1, 100); - vote(0, 0, true); + assert_ok!( + pallet_governance::Pallet::::add_global_custom_proposal( + get_origin(MODULE), + b"metadata".to_vec() + ) + ); - step_block(default_proposal_expiration); + assert_ok!(pallet_governance::Pallet::::vote_proposal( + get_origin(MODULE), + 0, + true + ),); - assert_eq!( - Proposals::::get(0).unwrap().status, - ProposalStatus::Expired + assert_err!( + pallet_governance::Pallet::::vote_proposal(get_origin(MODULE), 0, false), + Error::::AlreadyVoted ); }); } #[test] -fn creates_emission_proposal_with_invalid_params_and_it_fails() { +fn ensures_module_has_voted() { new_test_ext().execute_with(|| { zero_min_burn(); - let default_proposal_expiration: u64 = - ::DefaultProposalExpiration::get(); + const MODULE: u32 = 0; - let min_stake: u128 = ::DefaultMinAllowedStake::get(); + register(MODULE, 0, 0, to_nano(10)); - config(1, default_proposal_expiration); - - let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1) - min_stake); + config(1, 100); - assert_err!( - pallet_governance::Pallet::::add_emission_proposal( - origin.clone(), - Percent::from_parts(51), - Percent::from_parts(50), - Percent::from_parts(50), - vec![b'0'; 64], - ), - Error::::InvalidEmissionProposalData + assert_ok!( + pallet_governance::Pallet::::add_global_custom_proposal( + get_origin(MODULE), + b"metadata".to_vec() + ) ); - }); -} -#[test] -fn rewards_wont_exceed_treasury() { - new_test_ext().execute_with(|| { - zero_min_burn(); - // Fill the governance address with 1 mil so we are not limited by the max - // allocation - let amount = to_nano(1_000_000_000); - let key = DaoTreasuryAddress::::get(); - add_balance(key, amount); - - let governance_config: GovernanceConfiguration = - GlobalGovernanceConfig::::get(); - let n = 0; - let allocation = - pallet_governance::proposal::get_reward_allocation::(&governance_config, n) - .unwrap(); - assert_eq!( - allocation.into_inner(), - governance_config.max_proposal_reward_treasury_allocation + assert_err!( + pallet_governance::Pallet::::remove_vote_proposal(get_origin(MODULE), 0), + Error::::NotVoted ); }); } diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index a8483160..e9287899 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -1,7 +1,7 @@ use pallet_torus0::{agent::Agent, Agents, Burn, Error, ImmunityPeriod, MaxAllowedAgents}; use polkadot_sdk::{frame_support::assert_err, sp_core::Get, sp_runtime::Percent}; use test_utils::{ - assert_ok, + assert_ok, get_origin, pallet_emission0::{ConsensusMembers, WeightControlDelegation}, pallet_governance::{self, Allocators}, step_block, Test, @@ -366,15 +366,17 @@ fn unregister_correctly() { agent )); - assert_ok!(pallet_torus0::agent::register::( - agent, + assert_ok!(pallet_torus0::Pallet::::register_agent( + get_origin(agent), agent, name.clone(), url.clone(), metadata.clone(), )); - assert_ok!(pallet_torus0::agent::unregister::(agent)); + assert_ok!(pallet_torus0::Pallet::::unregister_agent(get_origin( + agent + ))); assert!(pallet_torus0::Agents::::get(agent).is_none()); }); @@ -392,15 +394,17 @@ fn unregister_twice() { agent )); - assert_ok!(pallet_torus0::agent::register::( - agent, + assert_ok!(pallet_torus0::Pallet::::register_agent( + get_origin(agent), agent, name.clone(), url.clone(), metadata.clone(), )); - assert_ok!(pallet_torus0::agent::unregister::(agent)); + assert_ok!(pallet_torus0::Pallet::::unregister_agent(get_origin( + agent + ))); assert_err!( pallet_torus0::agent::unregister::(agent), Error::::AgentDoesNotExist @@ -434,8 +438,12 @@ fn update_correctly() { agent )); - assert_ok!(pallet_torus0::agent::register::( - agent, agent, name, url, metadata, + assert_ok!(pallet_torus0::Pallet::::register_agent( + get_origin(agent), + agent, + name, + url, + metadata, )); let new_name = "new-agent".as_bytes().to_vec(); @@ -446,8 +454,8 @@ fn update_correctly() { let staking_fee = constraints.min_staking_fee; let weight_control_fee = constraints.min_weight_control_fee; - assert_ok!(pallet_torus0::agent::update::( - agent, + assert_ok!(pallet_torus0::Pallet::::update_agent( + get_origin(agent), new_name.clone(), new_url.clone(), Some(new_metadata.clone()), diff --git a/pallets/torus0/tests/stake.rs b/pallets/torus0/tests/stake.rs index 4ce28c1a..1006c13e 100644 --- a/pallets/torus0/tests/stake.rs +++ b/pallets/torus0/tests/stake.rs @@ -26,8 +26,8 @@ fn add_stake_correctly() { assert_eq!(Balances::total_balance(&from), total_balance); assert_eq!(Balances::total_balance(&to), 0); - assert_ok!(pallet_torus0::stake::add_stake::( - from, + assert_ok!(pallet_torus0::Pallet::::add_stake( + get_origin(from), to, stake_to_add )); @@ -39,6 +39,68 @@ fn add_stake_correctly() { }); } +#[test] +fn transfer_stake_correctly() { + test_utils::new_test_ext().execute_with(|| { + let from = 0; + let to = 1; + let transfer = 2; + let stake_to_add = MinAllowedStake::::get(); + let total_balance = stake_to_add * 2; + let balance_after = stake_to_add; + + assert_ok!(pallet_governance::whitelist::add_to_whitelist::(to)); + assert_ok!(pallet_governance::whitelist::add_to_whitelist::( + transfer + )); + + assert_ok!(pallet_torus0::agent::register::( + to, + to, + "to".as_bytes().to_vec(), + "to://idk".as_bytes().to_vec(), + "idk".as_bytes().to_vec() + )); + + assert_ok!(pallet_torus0::agent::register::( + transfer, + transfer, + "transfer".as_bytes().to_vec(), + "transfer://idk".as_bytes().to_vec(), + "idk".as_bytes().to_vec() + )); + + let _ = Balances::deposit_creating(&from, total_balance); + + assert_eq!(Balances::total_balance(&from), total_balance); + assert_eq!(Balances::total_balance(&to), 0); + + assert_ok!(pallet_torus0::Pallet::::add_stake( + get_origin(from), + to, + stake_to_add + )); + + assert_eq!(Balances::total_balance(&from), balance_after); + assert_eq!(StakingTo::::get(from, to), Some(stake_to_add)); + assert_eq!(StakedBy::::get(to, from), Some(stake_to_add)); + assert_eq!(TotalStake::::get(), stake_to_add); + + assert_ok!(pallet_torus0::Pallet::::transfer_stake( + get_origin(from), + to, + transfer, + stake_to_add + )); + + assert_eq!(StakingTo::::get(from, to), Some(0)); + assert_eq!(StakingTo::::get(from, transfer), Some(stake_to_add)); + assert_eq!(StakedBy::::get(to, from), Some(0)); + assert_eq!(StakedBy::::get(transfer, from), Some(stake_to_add)); + assert_eq!(TotalStake::::get(), stake_to_add); + }); +} + #[test] fn add_stake_without_registering_the_agent() { test_utils::new_test_ext().execute_with(|| { @@ -53,7 +115,7 @@ fn add_stake_without_registering_the_agent() { assert_eq!(Balances::total_balance(&to), 0); assert_err!( - pallet_torus0::stake::add_stake::(from, to, stake_to_add), + pallet_torus0::Pallet::::add_stake(get_origin(from), to, stake_to_add), Error::::AgentDoesNotExist ); @@ -110,14 +172,14 @@ fn remove_stake_correctly() { let _ = Balances::deposit_creating(&from, total_balance); assert_eq!(Balances::total_balance(&to), 0); - assert_ok!(pallet_torus0::stake::add_stake::( - from, + assert_ok!(pallet_torus0::Pallet::::add_stake( + get_origin(from), to, stake_to_add_and_remove )); - assert_ok!(pallet_torus0::stake::remove_stake::( - from, + assert_ok!(pallet_torus0::Pallet::::remove_stake( + get_origin(from), to, stake_to_add_and_remove )); @@ -138,8 +200,8 @@ fn remove_stake_with_less_than_required_amount() { let total_balance = stake_to_add_and_remove * 2; assert_ok!(pallet_governance::whitelist::add_to_whitelist::(to)); - assert_ok!(pallet_torus0::agent::register::( - to, + assert_ok!(pallet_torus0::Pallet::::register_agent( + get_origin(to), to, "to".as_bytes().to_vec(), "to://idk".as_bytes().to_vec(), @@ -149,14 +211,18 @@ fn remove_stake_with_less_than_required_amount() { let _ = Balances::deposit_creating(&from, total_balance); assert_eq!(Balances::total_balance(&to), 0); - assert_ok!(pallet_torus0::stake::add_stake::( - from, + assert_ok!(pallet_torus0::Pallet::::add_stake( + get_origin(from), to, stake_to_add_and_remove )); assert_err!( - pallet_torus0::stake::remove_stake::(from, to, stake_to_add_and_remove - 1), + pallet_torus0::Pallet::::remove_stake( + get_origin(from), + to, + stake_to_add_and_remove - 1 + ), Error::::StakeTooSmall, ); @@ -182,8 +248,8 @@ fn remove_stake_with_unregistered_agent() { let total_balance = stake_to_add_and_remove * 2; assert_ok!(pallet_governance::whitelist::add_to_whitelist::(to)); - assert_ok!(pallet_torus0::agent::register::( - to, + assert_ok!(pallet_torus0::Pallet::::register_agent( + get_origin(to), to, "to".as_bytes().to_vec(), "to://idk".as_bytes().to_vec(), @@ -193,15 +259,21 @@ fn remove_stake_with_unregistered_agent() { let _ = Balances::deposit_creating(&from, total_balance); assert_eq!(Balances::total_balance(&to), 0); - assert_ok!(pallet_torus0::stake::add_stake::( - from, + assert_ok!(pallet_torus0::Pallet::::add_stake( + get_origin(from), to, stake_to_add_and_remove, )); - assert_ok!(pallet_torus0::agent::unregister::(to)); + assert_ok!(pallet_torus0::Pallet::::unregister_agent(get_origin( + to + ))); assert_err!( - pallet_torus0::stake::remove_stake::(from, to, stake_to_add_and_remove), + pallet_torus0::Pallet::::remove_stake( + get_origin(from), + to, + stake_to_add_and_remove + ), Error::::AgentDoesNotExist, ); From 375bdaad1c4b937ca0acf491b01929161ae3e5fe Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Thu, 6 Mar 2025 23:22:29 -0300 Subject: [PATCH 10/46] chore: new readme (#85) Updates the README and creates a new CONTRIBUTING.md. --- CONTRIBUTING.md | 152 ++++++++++++ README.md | 168 ++++++++----- docker-compose.yml | 41 ++-- docs/linear-emission.md | 70 ++++++ docs/pallet-structure.md | 222 ++++++++++++++++++ docs/xtask-manual.md | 191 +++++++++++++++ pallets/governance/src/proposal.rs | 8 +- xtask/src/flags.rs | 29 +++ xtask/src/{build_spec.rs => generate_spec.rs} | 173 ++++++++++---- xtask/src/main.rs | 71 +----- xtask/src/run.rs | 2 +- 11 files changed, 926 insertions(+), 201 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 docs/linear-emission.md create mode 100644 docs/pallet-structure.md create mode 100644 docs/xtask-manual.md rename xtask/src/{build_spec.rs => generate_spec.rs} (61%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..2400ba35 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,152 @@ +# Contributing to Torus + +Thanks for your interest in contributing to Torus! Follow this document to learn how we write our code and contribute. The guidelines are _not_ written in stone and each case has its own needs, so feel free to reach out to the team in our Discord server (we don't do DMs). + +## Table of contents + +- [Development environment setup](#development-environment-setup) +- [Project structure](#project-structure) +- [Code style and guidelines](#code-style-and-guidelines) +- [Storage modifications and migrations](#storage-modifications-and-migrations) +- [Development workflow](#development-workflow) +- [Testing guidelines](#testing-guidelines) +- [Pull request process](#pull-request-process) + +## Development environment setup + +The project uses Nix flakes to manage dependencies and ensure a consistent development environment across all contributors. It's worth your time setting up! Believe me, you don't want RocksDB building from scratch. + +1. Install Nix package manager by following the instructions at [nixos.org](https://nixos.org/download.html) +2. Enable flakes by adding the following to your `~/.config/nix/nix.conf` or `/etc/nix/nix.conf`: + ``` + experimental-features = nix-command flakes + ``` +3. Enter the development environment: + + ```bash + nix develop + ``` + + This will set up the correct Rust version, git, and precompiled binaries for dependencies like RocksDB and OpenSSL. + +4. Build the project: + ```bash + cargo build --release + ``` + +## Project structure + +Our project is organized into 5 main crates: + +- **`node/`**: Contains the actual node implementation including network setup, RPC call definitions, synchronization behavior, database configurations, and more. Mostly boilerplate from substrate. + +- **`pallets/`**: Contains the runtime logic modules separated by responsibility: + + - `emission0`: handles all token emission logic; + - `governance`: manages proposals, allocators, votes, and new agent applications; + - `torus0`: manages agent registrations and interactions with the network. + +- **`runtime/`**: Defines the configuration used by the node and lists all the used pallets. + +## Code style and guidelines + +We follow standard Rust coding conventions with some additional requirements specific to blockchain development. + +### General Rust guidelines + +Be idiomatic. Use `Iterator`s, `Result`s, etc. PLEASE. Take a look at [Rust's API guidelines](https://rust-lang.github.io/api-guidelines/). Our CI will reject your changes if they don't pass formatting (it's 202X, enable autoformatting FFS) or clippy check. Code must be reasonably documented. Not everything, of course, but things like storage values, extrinsics, errors, must be documented as this information is extracted to other places like JS SDKs. + +### Pallet-specific guidelines + +- **Always use the `polkadot_sdk` umbrella dependency** instead of individual substrate dependencies to maintain version consistency. Last thing you want is a massive Cargo file with 150 substrate dependencies written out manually. Don't ask me how the experience of bumping them feels like. Some parts of the ecosystem do not have umbrellas, that's the case of Frontier, but we do what we can. +- **Avoid panicking in runtime code:** + - Never use `unwrap()`, `expect()`, or other panic-causing operations in pallet code; + - the WASM runtime that Substrate runs on cannot unwind, so panics in functions like `on_initialize` will halt the chain (been there - more than once); + - use `Option` and `Result` types properly for error handling. NEVER allow `unused_must_use`. NEVER; + - always prefer panic-free functions and treat all potential errors (`checked_div` in favor of `/`, etc.). + +## Storage modifications and migrations + +Modifying blockchain storage requires special care to maintain chain compatibility. When you modify a storage (creating/deleting storages, changing names, switching types, altering structs, reordering enum variants, ...) make sure to: + +1. Increment the storage version for the affected pallet if it hasn't been updated since the last runtime upgrade + + - Check the git history to determine if the version has already been incremented + - Always use `VersionedMigration` from `frame_support` to handle version increments + +2. Create a storage migration when you alter existing storages. + +### Implementing migrations + +Migrations must be carefully implemented to ensure data consistency: + +1. Create a new migration module that maps old values to the new storage format +2. ALWAYS use `VersionedMigration` +3. Add the migration to the runtime's list of migrations +4. Test the migration thoroughly with realistic data +5. Document the migration process in your PR + +For detailed guidance on creating migrations, refer to the [Substrate Storage Migrations documentation](https://docs.polkadot.com/develop/parachains/maintenance/storage-migrations/). + +## Development workflow + +1. Fork the repo and create a new branch for your feature or bugfix: + + ```bash + git checkout -b feature/your-feature-name + ``` + +2. Make your changes, following our code guidelines and testing requirements + +3. Run tests and checks to ensure your changes don't break existing functionality: + + ```bash + cargo fmt + cargo clippy + cargo test + ``` + +4. Check code coverage to ensure sufficient test coverage: + + ```bash + cargo xtask coverage + ``` + +5. Submit a pull request with a clear description of your changes. + We are very strict about title/descriptions. Your title SHOULD follow the conventional commits format (`feat(pallets/emission0): emitting 10x to myself`), but MUST be well described. Commits are squashed, so your PR's description will be the body of the merged commit, be generous! + +## Testing guidelines + +Strong test coverage is a core value for our project. All pallets must maintain high test coverage. Trust me, you want this. Of course, coverage alone doesn't mean it is _well_ tested. But it's a good enough metric. We will review your tests. + +### Test coverage + +> Code coverage is done via [cargo-llvm-cov](https://github.com/taiki-e/cargo-llvm-cov). It comes with Nix. + +Run the following command to generate a `Cobertura` xml file on `target/cov.xml` that can be used with the [Coverage Gutters](https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters) VSCode plugin to display which functions and branches are not covered by tests yet. + +```bash +cargo xtask coverage +``` + +If the `--html` attribute is passed to the command, an HTML website will be generated instead. It serves the same purpose as the plugin mentioned and can be accessed on `target/llvm-cov/html/index.html` + +When contributing, please: + +- Ensure your changes don't decrease overall test coverage +- Add tests for new functionality +- Update existing tests when modifying behavior +- Write both unit tests and integration tests where appropriate + +While the `node/` and `runtime/` crates currently have simpler testing requirements, any complex logic added to these crates should also include appropriate tests. + +## Pull request process + +1. Ensure your code passes all tests and meets our quality standards +2. Update documentation if necessary +3. Include a clear description of the changes and the problem they solve +4. Link to any relevant issues +5. Request review from appropriate team members +6. Address any review feedback + +Thank you for contributing to our project! diff --git a/README.md b/README.md index 03dc22b7..45dfb2bc 100644 --- a/README.md +++ b/README.md @@ -1,103 +1,157 @@ # Torus Network Node +[![](https://dcbadge.limes.pink/api/server/https://discord.gg/torus)](https://discord.gg/torus) + +![Docker Build](https://github.com/renlabs-dev/torus-substrate/actions/workflows/build-docker.yml/badge.svg) + Torus is a self-assembling and evolving peer-to-peer blockchain organism, with a stake-driven network built in Rust with the Substrate framework. Torus powers an innovative ecosystem of agents and incentives, incorporating diverse technologies into its collective body. -## Quick start +## Table of Contents + +- [Quick Start](#quick-start) + - [Running a node](#running-a-node) + - [Building and running from source](#building-and-running-from-source) +- [Network connectivity](#network-connectivity) +- [Local network](#local-network) +- [Documentation](#documentation) +- [Terminology](#terminology) -TODO +## Quick Start -## Building from source +### Running a node -### Dependencies +There are several ways to run a Torus node, depending on your needs. The fastest way is using Docker: -The recommended way to install dependencies is [using Nix](docs/nix.md). +```sh +docker run -p 9944:9944 -p 30333:30333 ghcr.io/renlabs-dev/torus-substrate:latest torus-node --chain main --sync warp +``` -If you don't want to use Nix, you should have the following dependencies: +This command will: -- [Rust](https://www.rust-lang.org/) -- [protoc](https://github.com/protocolbuffers/protobuf) +- Pull our latest Docker image +- Run a node connected to the Torus mainnet +- Use warp sync for faster synchronization +- Expose the WebSocket RPC port (9944) and p2p port (30333) -You can install Rust using [Rustup]: +Or you could use docker-compose: ```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +mkdir -p torus-node +cd torus-node +wget https://raw.githubusercontent.com/renlabs-dev/torus-substrate/refs/heads/main/docker-compose.yml -O docker-compose.yml +docker compose up -d ``` -Then install `protoc`: +### Building and running from source + +For detailed instructions on setting up the build environment with Nix and all required dependencies, please refer to our [CONTRIBUTING.md](CONTRIBUTING.md) guide. Once your environment is set up: ```sh -# on Ubuntu -sudo apt install protobuf-compiler +# Build the node +cargo build -p torus-node --release + +# Run connected to mainnet +./target/release/torus-node --chain main + +# Or run connected to testnet using the included spec file +./target/release/torus-node --chain data/testnet/spec.json + +# For faster synchronization, add the warp flag +./target/release/torus-node --chain main --sync warp ``` - +## Network connectivity -[Rustup]: https://rustup.rs/ +The Torus node operates on two primary ports: -## Building and running the node +- `9944`: a WebSocket RPC for interacting with the node's API. It's recommended to always have SSL enabled and the node behind a reverse proxy. +- `30333`: Used for node-to-node communication in the network. -```sh -cargo build -p torus-node --release -``` +## Local network -To run a node connected to the Torus testnet: +We have tools to simulate a network locally as well. The `cargo xtask run` command allows you to run a local network from scratch by setting up nodes with fresh spec files: -```sh -cargo run --bin torus-node --release -- --chain data/testnet/spec.json +```bash +cargo xtask generate-spec gen-new --sudo -o myspec.json +cargo xtask run local --chain myspec.json --alice --node-validator true & +cargo xtask run local --chain myspec.json --bob --node-validator true & ``` -## Docker +The `generate-spec` command has been expanded with subcommands that allow you to create different types of chain specifications: -```sh -mkdir -p torus-node -cd torus-node -wget https://raw.githubusercontent.com/renlabs-dev/torus-substrate/refs/heads/main/docker-compose.yml -O docker-compose.yml -docker compose up -d +1. Generate a new empty chain spec with custom parameters: + +```bash +cargo xtask generate-spec gen-new --name "My Custom Chain" --sudo -o myspec.json ``` -The node RPC port defaults to 9944, so to connect to it locally you can just use localhost: -ws://localhost:9944 +2. Generate a replica of the mainnet: -If deployed on a remote machine (not recomended without setting up a reverse proxy like Traefik and having SSL enabled), replace localhost with the VM public ipv4 address, like the below examble -ws://123.123.123.123:9944 +```bash +cargo xtask generate-spec gen-replica --sudo -o myreplica.json +``` -## Development +You can also pass an `--api-url` flag with a WS endpoint to clone the state from. -Check your code with: +Both commands take additional parameters to configure Aura, Grandpa and balances. For example: -```sh -cargo clippy +```bash +cargo xtask generate-spec gen-new \ + --name "My Chain" \ + --sudo \ + --gran \ + --aura \ + --balance "=" \ + -o myspec.json ``` -Run all tests with: +You can then run nodes with the generated specs: -```sh -cargo test +```bash +cargo xtask run local --chain myspec.json --alice --node-validator true & +cargo xtask run local --chain myspec.json --bob --node-validator true & ``` -Running a local dev node: +Other options are also available. Check the code or run `cargo xtask generate-spec -h` for more details! -```sh -cargo xtask run local --alice -``` +## Documentation -## Code Coverage +We maintain several documentation files to help you understand and contribute to the Torus network: -> Code coverage is done via [cargo-llvm-cov](https://github.com/taiki-e/cargo-llvm-cov). +- [CONTRIBUTING.md](CONTRIBUTING.md): Guidelines for contributing to the project, including development environment setup with Nix, code style standards, testing requirements, and our pull request process -Run the following command to generate a `Cobertura` xml file on `target/cov.xml` that can be used with the [Coverage Gutters](https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters) VSCode plugin to display which functions and branches are not covered by tests yet. -```bash -cargo xtask coverage -``` - -If the `--html` attribute is passed to the command, an HTML website will be generated instead. It serves the same purpose as the plugin mentioned and can be accessed on `target/llvm-cov/html/index.html` +- [docs/pallet-structure.md](docs/pallet-structure.md): Detailed explanation of our pallet architecture, including the API-first design, storage patterns, and coding conventions + +- [docs/linear-emission.md](docs/linear-emission.md): Technical documentation on the linear emission algorithm used for token distribution in the `emission0` pallet + +- [docs/xtask-manual.md](docs/xtask-manual.md): Comprehensive guide to the `xtask` command-line tool that simplifies local development, testing, and network simulation + +## Terminology + +We have some specific terminology throughout the codebase, so here's a list of the most important ones: -**Pull requests must not lower the overall test coverage percentage.** \ No newline at end of file +| Term | Description | +| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Agent | A participant in the Torus network identified by an account ID, with optional metadata like name and URL. Agents can be validators (who assign weights) or miners (who produce utility). The network tracks their registrations, stake, and emissions. See: Miner, Validator. [Source: [agent.rs](pallets/torus0/src/agent.rs)] | +| Allocator | The trusted and relevant validators of the network, chosen by governance. Currently, they're the only agents performing as validators, but this won't always be the case. Allocators have special permissions to perform actions like weight setting. See: Validator, Governance. [Source: [roles.rs](pallets/governance/src/roles.rs)] | +| Application | The process by which new participants request to join the Torus network as agents. Applications are reviewed and approved by governance, ensuring only quality participants enter the ecosystem. Successful applications result in agent registration once approved. See: Agent, Governance. [Source: [application.rs](pallets/governance/src/application.rs)] | +| Burn | A mechanism that destroys tokens when registering new agents, particularly when the network is at capacity. The burn amount adjusts dynamically - it increases when registration activity is high and decreases when low. This creates a natural economic barrier to entry when the network is saturated. [Source: [burn.rs](pallets/torus0/src/burn.rs)] | +| Curator | A role responsible for managing the whitelist of agents that can participate in certain network activities. Curators help maintain network quality and might also operate off-chain, for example through popular votes. See: Agent. [Source: [whitelist.rs](pallets/governance/src/whitelist.rs)] | +| Delegation Fee | A percentage that validators can charge from stakers. When emissions are distributed, this fee is deducted from the staker's share and given to the validator. It incentivizes validators to maintain good performance to attract delegations. See: Stake, Validator. [Source: [fee.rs](pallets/torus0/src/fee.rs)] | +| Dividends | Tokens distributed to validators based on their stake and the performance of agents they've weighted. Dividends reward validators that honestly weigh miners, creating an incentive for accurate assessment. Good validators who support productive miners earn more dividends. See: Incentives, Validator. [Source: [distribute.rs](pallets/emission0/src/distribute.rs)] | +| Emission | The process of creating new tokens and distributing them to network participants based on stake and weight assignments. Emissions occur at regular intervals defined by `RewardInterval` and form the economic engine of the network. See: Incentives, Dividends. [Source: [distribute.rs](pallets/emission0/src/distribute.rs)] | +| Incentives | Tokens distributed to miners based on the weights assigned to them by validators. Incentives reward utility and efficiency, with the goal of encouraging miners that produce the most value. They're designed to motivate future work and contributions to the network. See: Dividends, Miner. [Source: [distribute.rs](pallets/emission0/src/distribute.rs)] | +| Miner | Agents that produce off-chain utility, typically via their API exposed at their URL, or through other means. Miners receive incentives based on the weights assigned to them by validators, which reflect their perceived value to the network. See: Validator, Weights. [Source: [agent.rs](pallets/torus0/src/agent.rs)] | +| Proposal | A cornerstone of the network's governance. Proposals suggest changes to the network's parameters, configurations, or operations, which network participants can vote on. Not all proposals reflect changes in the network, but most do. Approved proposals are executed automatically. See: Governance, Proposal Rewards. [Source: [proposal.rs](pallets/governance/src/proposal.rs)] | +| Proposal Rewards | Incentives distributed to participants who vote on proposals, coming directly from the treasury. The reward calculation uses a quadratic formula based on stake (square root of stake), which proportionally rewards smaller accounts more than larger ones. This system democratizes governance by encouraging participation across all account sizes. See: Proposal, Treasury. [Source: [proposal.rs](pallets/governance/src/proposal.rs)] | +| Stake | Tokens locked in support of an agent. Higher stakes affect the weights set by the validator and their influence in the network. Stake determines validator status (only top staked agents can be validators) and affects emission distribution rewards. See: Validator, Emission. [Source: [stake.rs](pallets/torus0/src/stake.rs)] | +| Storage Value | On-chain state variables that persist across blocks. Configuration storage values are configurable by the network through governance, making directing the chain a public effort. Examples include `PendingEmission`, `ConsensusMembers`, and `RewardInterval`. See: Proposal. [Source: [lib.rs](pallets/torus0/src/lib.rs)] | +| Treasury | A special account controlled by governance that collects fees and a portion of emissions for community use. Treasury funds can be allocated through governance decisions to support network development and improvement. [Source: [proposal.rs](pallets/governance/src/proposal.rs)] | +| Validator | Agents that prove the efficiency and utility of miners, typically by periodically checking the miners via their exposed URL (API). Validators must have sufficient stake to participate in consensus and assign weights to miners. Only the top staked agents (limited by `MaxAllowedValidators`) can act as validators. See: Weights, Miner. [Source: [agent.rs](pallets/torus0/src/agent.rs)] | +| Voting Power Delegation | A mechanism that allows agents to delegate their governance voting power to other participants. When an agent delegates voting power, their stake is counted towards the delegate's votes on proposals. This enables passive participants to contribute to governance through trusted representatives. See: Proposal, Stake. [Source: [voting.rs](pallets/governance/src/voting.rs)] | +| Weight Control | The system by which validators assign and manage weights to miners. Weight control is a critical responsibility that directly impacts network incentive distribution. Validators can delegate this duty to other validators through weight control delegation in exchange for a fee. See: Weight Control Fee, Weights. [Source: [weight_control.rs](pallets/emission0/src/weight_control.rs)] | +| Weight Control Fee | A fee paid when delegating weight assignment responsibility to another validator. This allows validators to outsource their assessment duties while still sharing in the rewards. See: Validator, Weight Control, Weights. [Source: [fee.rs](pallets/torus0/src/fee.rs)] | +| Weights | Numerical values (0 to 65535) assigned by validators to other agents, reflecting the worth that the validator sees in a miner. Weights directly influence emission distribution and determine how incentives are allocated. Honest and accurate weight assignment is crucial for the network's health. See: Validator, Incentives. [Source: [distribute.rs](pallets/emission0/src/distribute.rs)] | diff --git a/docker-compose.yml b/docker-compose.yml index ae465316..1e0fe292 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: torus-node: container_name: torus-node - image: ghcr.io/renlabs-dev/torus-substrate:f6efa2e + image: ghcr.io/renlabs-dev/torus-substrate:latest volumes: - ./docker/volumes/node-data:/node-data ports: @@ -9,24 +9,21 @@ services: - 9944:9944 # RPC restart: always entrypoint: ["torus-node"] - command: [ - "--base-path", - "/node-data", - "--chain", - "mainnet", - "--rpc-external", - "--rpc-cors=all", - "--rpc-max-response-size", - "100", - "--rpc-max-connections", - "5000", - "--port", - "30333", - "--rpc-port", - "9944", - "--telemetry-url", - "ws://telemetry.torus.network:8001/submit 0", - "--sync=warp", - # "--sync=full", - # "--pruning=archive", - ] + command: + - "--base-path" + - "/node-data" + - "--chain" + - "mainnet" + - "--rpc-external" + - "--rpc-cors=all" + - "--rpc-max-response-size" + - "100" + - "--rpc-max-connections" + - "5000" + - "--port" + - "30333" + - "--rpc-port" + - "9944" + - "--telemetry-url" + - "ws://telemetry.torus.network:8001/submit 0" + - "--sync=warp" diff --git a/docs/linear-emission.md b/docs/linear-emission.md new file mode 100644 index 00000000..49747e67 --- /dev/null +++ b/docs/linear-emission.md @@ -0,0 +1,70 @@ +# V0 Linear emissions + +The emission distribution code present on Torus V0 is written from scratch while keeping the same behavior as older projects. + +The goal here is: on every _epoch_, given a list of consensus members, distribute all _pending emission_ to validators and miners. The former are agents who periodically attest the quality of the miners, and set weights on each accordingly, while the latter produces value through an exposed API. + +## Accumulating pending emission + +On every new block (target: 8 seconds), a certain amount of tokens is added to the `PendingEmission` storage value, in a way that 64000 tokens are emitted per day (10800 blocks). The amount is controlled by a parameter called `BlockEmission`, which currently is `64000 / 10800`. + +Another two factors when calculating the block emission to have in mind are max supply and emission recycling percentage. Those are taken into account inside the `get_total_emission_per_block` function. + +## Distribution + +Pending emissions are accumulated throughout an epoch, a period in blocks which, once over, is marked by the issuance and distribution of pending tokens. The interval is controlled by the `RewardInterval` storage value, subject to change via proposals, but default value is `100 blocks`. + +We use `pallet-balances`' `Currency` API to issue tokens and deposit them afterwards. This is very important. The `issue` functions returns a `NegativeImbalance` which wraps the balance type (u128) and makes it impossible to wrongly distribute more balance than the total pending amount. A mutable reference is passed to the `linear_rewards` function from which the balances are extracted, and, at the end, we set the remaining balance to `PendingEmission` again as a safeguard to avoid burning tokens. + +### Consensus members + +Agents come and go, sometimes in the middle of an epoch. We must store enough information to distribute emissions even to the agents who were deregistered in the last epoch. This is done through the `ConsensusMembers` storage value, which holds information on weights, last incentives and dividends (used to deregister agents when the network is full). + +To avoid having the confusing `uid` from previous implementations, everything is done using account IDs, which may increase storage use, but makes the code a lot more resilient. + +Members are (de)registered in a lazy manner. The only time at which the list of members is updated is during distribution. + +#### Aggregation + +The entire distribution process uses what we call `ConsensusMemberInput` (or only _inputs_) that are gathered in the following order: + +1. iterate through all agents delegating weight control to other validators and remove their IDs from the agent list/consensus member list. The input is created by copying the weights of the delegated validator; +2. iterate through all registered agents removing from the consensus member list. If present, an input with the correct weights is created, otherwise, an empty input is used with no weights; +3. finally, iterates through all remaining items in the consensus member list. At this time, the only remaining elements are deregistered agents from the last epoch. + +Input creation first calculates the total staked balance and applies the weight penalty factor by doing `stake * (1 - weight_penalty)`. If the total stake is larger than the `MinValidatorStake` value and it has weights set, the weights are filtered so that weights set on themselves are excluded and the remaining ones only refer to registered agents/agents deregistered on last epoch and are finally normalized. + +The final step of the aggregation is defining who gets validator permits. The only agents that can act as validators are those with weights set and the top `MaxAllowedValidators` ordered by stake. The others will have their weights zeroed for the current epoch. + +### The linear distribution + +After inputs are gathered, the linear algorithm proceeds with these steps: + +1. We calculate the miner ranks by applying a sparse matrix multiplication of the normalized weights and validator stakes. This efficiently computes how much each miner should receive based on both their reputation (weights assigned by validators) and the economic stake backing those validators. The resulting ranks are normalized and used as the miner incentives. + +2. For validator dividends, we calculate the "bonds" by applying a Hadamard product (element-wise multiplication) between weights and stakes. The Hadamard product is used here to represent the strength of connection between validators and miners - it captures not just that a validator vouches for a miner, but also how significant that validator's economic stake is. This approach ensures that validators with higher stakes have proportionally more influence on the distribution. + +3. The bonds are then column-normalized to ensure fair distribution across validators, regardless of the number of miners they support. + +4. We calculate the final validator dividends by performing a transpose matrix multiplication between the normalized bonds and the miner incentives. This creates a feedback loop where validators who support successful miners (those receiving higher incentives) are rewarded more. + +5. Both incentives and dividends are normalized to prepare for the actual token distribution. + +6. The emissions are calculated based on the current incentives ratio, which controls the balance between miner incentives and validator dividends. + +7. Weight control fees are processed for delegated validators, where a portion of dividends is transferred to the delegator's validator. + +8. The incentives and dividends are "upscaled" to u16 values for compact storage in the consensus members record. + +9. Finally, the emissions are distributed to the respective accounts, with additional processing: + - Dividends are split among stakers based on their stake ratio + - Delegation fees are applied to the dividends + - Any remaining emissions are added to the agent's stake + +### Weight Control Fee + +The weight control fee is a mechanism that enables validators to delegate their weight assignment responsibility to other validators. When an agent delegates their weight control, they must pay a fee to the delegated validator. This fee is calculated as a percentage of their dividend emissions and is transferred during the distribution process. + +### Delegation Fee + +The staking (delegation) fee is a percentage that validators can set to charge stakers who delegate tokens to them. During distribution, this fee is deducted from the dividend emissions before they are distributed to the stakers. This incentivizes validators to maintain good performance to attract delegations. diff --git a/docs/pallet-structure.md b/docs/pallet-structure.md new file mode 100644 index 00000000..0d4876df --- /dev/null +++ b/docs/pallet-structure.md @@ -0,0 +1,222 @@ +# Torus Pallet Structure + +This guide explains how our pallets are organized and why we've set them up this way. Understanding this structure will help you navigate and contribute to the codebase more effectively. + +## Core Pallets + +Torus has three main pallets, each with their own specialized role. The "0" suffix in the pallet names (`torus0`, `emission0`) indicates that these implementations are early versions that will undergo significant changes for the v1 release. + +The `torus0` pallet serves as the foundation of our network, handling agent registration, staking, and the core mechanics of the protocol. It manages the lifecycle of agents, from registration to pruning, and maintains the staking relationships between users and validators. + +The `emission0` pallet handles our token distribution system, ensuring that everyone gets their fair share of tokens based on their contributions. It implements a sophisticated linear distribution algorithm that calculates incentives for miners and dividends for validators using matrix operations. The algorithm accumulates pending emissions over time and distributes them at regular intervals based on validator weights and stakes. For a detailed explanation of how this distribution works, refer to the [linear-emission.md](linear-emission.md) document. + +The `governance` pallet provides the democracy layer, allowing the community to propose changes, vote, and manage the network's evolution. It processes proposals for network parameter changes, counts votes, implements approved changes, and manages special roles like allocators and curators. + +These three pallets work together to create a functional blockchain system. + +## Pallet Directory Structure + +Each pallet follows a consistent structure that promotes organization and maintainability: + +``` +pallets/pallet_name/ +├── Cargo.toml # Dependency management +├── api/ # External interface +│ ├── Cargo.toml +│ └── src/ +│ └── lib.rs # API trait definition +├── src/ # Main pallet code +│ ├── lib.rs # Pallet definition +│ ├── ext.rs # Helper utilities +│ ├── migrations.rs # Storage migrations +│ ├── weights.rs # Transaction weights +│ └── domain_modules.rs # Business logic modules +└── tests/ # Integration tests + └── module_tests.rs # Tests by domain +``` + +This structure separates concerns and makes it easier to navigate and understand the codebase. The `api` directory contains the public interface, the `src` directory holds the implementation, and the `tests` directory contains integration tests for the pallet. + +## API-Based Design + +We use a separation between API definitions and implementations, with each pallet having its own `api` crate that defines a trait for other pallets to interact with it. This approach is necessary because Rust crates need to depend on each other, and having separate API crates prevents circular dependencies. It also makes it much simpler to create mock implementations for testing. + +For example, the `Emission0Api` trait defines methods like `consensus_stats` and `delegate_weight_control` that other pallets can use to interact with the `emission0` pallet. The `torus0` pallet implements its own API, which `emission0` uses to get staking information and agent details. + +This separation creates clear boundaries between pallets, allowing them to evolve independently as long as they maintain their API contracts. The implementation details can change drastically between versions, but as long as the API remains stable, other pallets won't be affected. + +## Inside a Pallet + +Each pallet is structured around the Substrate pallet framework, with a few Torus-specific conventions that align with our coding guidelines outlined in [CONTRIBUTING.md](CONTRIBUTING.md). + +The main pallet definition lives in `lib.rs`, where we define the `Config` trait for runtime configuration, storage items for on-chain state, extrinsic calls that users can execute, events for notifications, and errors to handle failure cases. + +### Documentation and Safety + +All functions, types, storage items, extrinsics, and errors must be thoroughly documented, as this documentation is exported for other language-based clients like TypeScript and Python. Clear documentation ensures that developers working with different languages can understand and use our blockchain correctly. + +We strictly avoid any operations that can cause panics in runtime code. The WASM runtime that Substrate runs on cannot unwind, so panics in functions like `on_initialize` will halt the chain. This means: + +- We never use `unwrap()`, `expect()`, or other panic-causing operations in pallet code +- We always use checked arithmetic operations (`checked_add`, `saturating_sub`, etc.) instead of operators that can panic (`+`, `-`, etc.) +- We properly handle all `Option` and `Result` types, and never ignore errors +- We use `ensure!` macros for validation instead of `assert!` which can panic + +### Numeric Types and Balance Operations + +For balance operations and fixed-point arithmetic, we use `FixedU128` instead of raw `u128` values. This type provides methods for safe arithmetic operations and better handles the decimal precision needed for operations like percentages and ratios. + +```rust +// Instead of: +let result = (amount * percentage) / 100; + +// We use: +let percentage = FixedU128::from_rational(percentage_value, 100); +let result = percentage.mul_floor(amount); +``` + +This approach prevents overflows and ensures consistent handling of decimal precision across the codebase. + +### Code Organization + +Our extrinsic calls always use manual call indexing with `#[pallet::call_index(n)]` to ensure backward compatibility during updates. This approach prevents issues that can arise from automatic indexing when adding or removing calls. + +Instead of having large implementations directly inside the `lib.rs` file, we break down complex logic into domain-specific modules. For example, in the `torus0` pallet, `agent.rs` handles agent registration and management, `stake.rs` manages staking mechanics and rewards, and `fee.rs` controls fee configuration and processing. + +These modules typically implement their functionality using generic functions that take `Config` as a type parameter, rather than implementing methods directly on the `Pallet` struct. This approach improves code organization and testability. + +```rust +// Instead of: +impl Pallet { + pub fn some_function(...) { ... } +} + +// We prefer: +pub fn some_function(...) { ... } +``` + +## Storage Efficiency and Container Types + +We are careful about storage usage since every storage item adds to the blockchain's state size. Instead of having multiple storage values for related data, we prefer using container types to group related values together. For example, instead of having separate storage items for different burn-related values, we might define a `BurnConfiguration` struct that contains all burn parameters. + +```rust +pub struct BurnConfiguration { + pub burn_amount: Balance, + pub target_registrations: u16, + pub target_registrations_interval: u16, + pub burn_adjust_factor: Percent, +} +``` + +This approach reduces the number of storage reads and writes, minimizing the blockchain's state bloat. However, we sometimes need to index "hot" values that are frequently accessed, such as staking relationships. In these cases, we might use separate storage maps for performance reasons, even if it means some data duplication. + +When updating structured data, we follow patterns that ensure data consistency and validation. For instance, when updating agent data, we retrieve the full `Agent` struct, validate the changes, and then store it back, rather than updating individual fields directly. This approach encapsulates the update logic and ensures all validation rules are applied consistently. + +```rust +// Update an agent's data with proper validation +fn update_agent_metadata( + agent_id: &T::AccountId, + new_metadata: Vec, +) -> DispatchResult { + Agents::::try_mutate(agent_id, |maybe_agent| { + let agent = maybe_agent.as_mut().ok_or(Error::::AgentNotFound)?; + ensure!(new_metadata.len() <= MaxMetadataLength::::get() as usize, Error::::MetadataTooLong); + agent.metadata = new_metadata; + Ok(()) + }) +} +``` + +We take input validation very seriously, and domain functions should only be updatable through private functions that correctly verify the data. This prevents invalid data from entering the blockchain state and causing issues down the line. + +## Storage and Migrations + +Blockchains require careful handling of storage changes since data persists across runtime upgrades. Each pallet tracks its storage version and includes a `migrations.rs` file to handle transitions between versions. + +We use the `VersionedMigration` pattern from `frame_support` for all our migrations, which ensures that migrations run exactly once and in the correct order. Each migration is implemented as a separate module defining the version transition: + +```rust +pub mod v2 { + use super::*; + use crate::{Agent, Agents}; + + // Migration from version 1 to version 2 + pub type Migration = VersionedMigration<1, 2, MigrateToV2, Pallet, W>; + + pub struct MigrateToV2(core::marker::PhantomData); + + impl UncheckedOnRuntimeUpgrade for MigrateToV2 { + fn on_runtime_upgrade() -> Weight { + // Actual migration logic + Agents::::translate(|_key, mut agent: Agent| { + agent.fees = Default::default(); + Some(agent) + }); + + Weight::zero() + } + } +} +``` + +When modifying storage structures (creating/deleting storages, changing names, switching types, altering structs, reordering enum variants), we create migration code that converts data from the old format to the new one. This approach allows us to evolve the codebase without requiring a chain restart or losing user data. + +For example, in the `torus0` pallet, when we added the `fees` field to the `Agent` struct, we created a migration that reads each agent, adds the new field with a default value, and writes it back to storage. + +These migrations are registered in the runtime and applied automatically during runtime upgrades. We carefully increment the storage version (checking git history to determine if it has already been incremented) and ensure proper migration paths between versions. + +## The Torus0 Pallet in Detail + +The `torus0` pallet manages agent registrations, stake, and the fundamental network participation rules. It maintains a registry of network agents, each with a name, URL, and metadata. Agents can be registered by anyone but must meet certain criteria, such as passing the burn requirement if the network is at capacity. + +The pallet also handles staking relationships, allowing users to stake tokens on validators to show their support. These stakes influence the validator's standing in the network and are used by the `emission0` pallet to calculate rewards. + +Network constraints are enforced, such as maximum agent count and minimum validator stake. When the network reaches capacity, the pallet implements a pruning mechanism that removes the least valuable agents to make room for new ones. + +## The Emission0 Pallet in Detail + +The `emission0` pallet implements token distribution based on network participation. It accumulates pending emissions over time, adding a fixed amount per block until reaching the distribution interval. + +When distribution occurs, the pallet uses a linear algebra approach to calculate rewards. It builds a matrix of validator weights and stakes, performs various operations like sparse matrix multiplication and Hadamard products, and calculates incentives for miners and dividends for validators. + +The distribution considers factors like weight control fees, delegation fees, and the balance between incentives and dividends set by governance. The result is a fair distribution that rewards both miners for their work and validators for their stake and weight assignment. + +## The Governance Pallet in Detail + +The `governance` pallet enables decentralized decision-making through proposals and voting. Network participants can create proposals to change parameters, add features, or implement policy changes. + +The pallet manages the voting process, tracking support for proposals and executing approved changes. It also handles special roles like allocators who can assign tokens to new agents and curators who manage the whitelist. + +The treasury is also managed by this pallet, collecting fees and emissions for community use. The treasury funds can be allocated through governance decisions to support network development and improvement. + +## Cross-Pallet Communication + +The pallets communicate with each other through their API traits. When one pallet needs information or functionality from another, it calls the appropriate API method. + +For example, when the `emission0` pallet distributes rewards, it needs to know which agents are registered, their stakes, and other information maintained by `torus0`. It uses the `Torus0Api` trait to access this information without knowing the internal details of how `torus0` stores or processes it. + +Similarly, `torus0` might need to check with `governance` to verify if an agent is whitelisted before processing certain actions. This loose coupling through APIs makes the system more maintainable and allows pallets to evolve independently. + +## Testing Approach + +Each pallet has its own test directory with integration tests for each domain module. These tests verify that the pallet behaves correctly under various conditions, including edge cases and error scenarios. + +The API-based design makes testing easier by allowing the creation of mock implementations. When testing a pallet that depends on another, we can create a mock version of the dependency's API that provides controlled responses for testing purposes. + +We always write Substrate benchmarks for our extrinsics because almost all operations in the runtime must be paid for (with very few exceptions, usually for operations that can only be executed by sudo keys). Benchmarking measures the computational and storage costs of each operation, allowing us to assign accurate weights that correspond to the resources consumed. These weights are then translated into transaction fees that users pay to execute operations on the chain. + +Proper benchmarking is crucial for several reasons. First, it ensures the economic security of the chain by preventing resource exhaustion attacks - operations that consume significant resources must cost proportionally more. Second, it provides fair pricing for users, so they only pay for the actual computational cost of their transactions. Finally, it helps maintain a consistent user experience by ensuring the chain can process a predictable number of transactions per block without exceeding block time limits. + +Every time we add or modify an extrinsic, we write or update its benchmark to reflect its current resource usage. This practice is non-negotiable for production-ready code. + +## Extending the System + +When adding new features to Torus, we follow a consistent approach to maintain the quality and organization of the codebase. + +First, we decide which pallet should own the functionality based on its purpose and relationships. Then we add necessary storage items and parameters, implement the business logic in appropriate modules, and expose relevant functions through the pallet's API. + +If other pallets need to use the new functionality, we update them to use the API methods. Finally, we write thorough tests to verify that the feature works as expected under all conditions. + +Since storage changes require migrations, we take special care when modifying existing structures, ensuring that the chain can upgrade smoothly without losing data. + +By following these patterns and conventions, we create a robust and maintainable blockchain system that can evolve over time while maintaining backward compatibility and performance. \ No newline at end of file diff --git a/docs/xtask-manual.md b/docs/xtask-manual.md new file mode 100644 index 00000000..ad20f194 --- /dev/null +++ b/docs/xtask-manual.md @@ -0,0 +1,191 @@ +# Torus XTask Manual + +The `xtask` crate provides a set of development tools that simplify working with the Torus blockchain. This manual documents how to use these tools effectively for local development, testing, and network simulation. + +## Overview + +The `xtask` tool provides three main commands: + +- `run` for launching Torus nodes with customizable configurations, +- `generate-spec` for creating chain specification files for different network types, +- `coverage` for generating code coverage reports for the pallets. + +These commands help streamline the development process, allowing you to quickly set up testing environments and validate your changes. + +## Running Nodes + +The `run` command launches Torus nodes with various configuration options. It offers two primary modes: local and replica. + +### Local Node + +The local mode starts a node using either a provided chain spec file or the default development configuration: + +```bash +cargo xtask run local [OPTIONS] +``` + +Common options include: + +- `--alice` to start the node with Alice's predefined account and keys, +- `--bob` to start the node with Bob's predefined account and keys, +- `--node-validator true` to run the node as a validator (can produce blocks), +- `-c, --chain-spec ` to use a specific chain specification file, +- `--account-suri ` to use a custom account seed in the format `//`. + +The Alice and Bob accounts come with predefined keys and network configurations. Alice uses TCP port 30341 and RPC port 9951, while Bob uses TCP port 30342 and RPC port 9952. When you run nodes using the `--alice` and `--bob` flags, they are automatically configured to connect to each other, simplifying local network setup. This can also be customized by settings other flags, take a look at `xargs/src/flags.rs`. + +### Replica Node + +The replica mode creates and runs a node that replicates the mainnet state: + +```bash +cargo xtask run replica [OPTIONS] +``` + +Key options include: + +- `--sudo
` to set a custom sudo key in SS58 address format, +- `--api-url ` to specify a custom WebSocket API endpoint for fetching chain state, +- `-o, --output ` to write the generated chain spec to a file. + +This mode is particularly useful for testing runtime upgrades or simulating behaviors that depend on the current mainnet state. + +## Generating Chain Specifications + +The `generate-spec` command creates chain specification files that define the initial state of a blockchain. Torus xtask provides two subcommands for spec generation: `gen-new` and `gen-replica`. + +### Creating a New Chain + +The `gen-new` subcommand creates a fresh chain specification with customizable parameters: + +```bash +cargo xtask generate-spec gen-new [OPTIONS] -o +``` + +Important options include: + +- `--name ` to set a custom chain name, +- `--sudo
` to set the sudo key in SS58 address format, +- `--aura
` to add an Aura authority key (can be repeated), +- `--gran
` to add a GRANDPA authority key (can be repeated), +- `--balance "
="` to set initial account balances (can be repeated), +- `-c, --base-chain-spec ` to use a specific chain spec as base (defaults to dev). + +For example, to create a new chain with custom authorities and initial balances: + +```bash +cargo xtask generate-spec gen-new \ + --name "My Test Network" \ + --sudo 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY \ + --aura 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY \ + --gran 5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu \ + --balance "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY=1000000000000000000" \ + -o my-chain-spec.json +``` + +### Creating a Mainnet Replica + +The `gen-replica` subcommand creates a chain specification that replicates the current mainnet state: + +```bash +cargo xtask generate-spec gen-replica [OPTIONS] -o +``` + +Key options include: + +- `--api-url ` to specify a custom WebSocket API endpoint for fetching chain state (defaults to "wss://api.torus.network") +- `--sudo
` to override the sudo key in the generated spec. + +This command fetches the entire state from a running node and creates a chain specification from it. You can then modify specific genesis values like the sudo key while preserving the rest of the state. + +Example usage: + +```bash +cargo xtask generate-spec gen-replica \ + --sudo 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY \ + --api-url "wss://my-custom-node.torus.network" \ + -o replica-spec.json +``` + +## Setting Genesis State Values + +When creating a chain specification, you can customize various genesis state values through command-line options. + +The consensus in Torus uses two types of authority keys. Aura keys (specified with `--aura`) are used for block production, and each validator needs an Aura authority key. GRANDPA keys (specified with `--gran`) are used for block finalization, and each validator needs a GRANDPA authority key. These keys must be in SS58 address format. When you set these keys, the corresponding accounts are granted the authority to participate in consensus. + +You can set initial account balances using the `--balance` flag with the format `"
="`. The amount is specified in the smallest unit (planck), so you'll need to add the appropriate number of zeros for the desired token amount. For example, to set an account balance to 1 TORUS token (assuming 12 decimals), use `--balance "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY=1000000000000"`. You can specify multiple balances by repeating the `--balance` flag. + +The sudo key is a special account that has administrative privileges on the chain. You can set it using the `--sudo` flag with an SS58 address. This account will be able to execute privileged functions through the Sudo pallet. + +## Local Network Simulation + +One of the most powerful features of the xtask tool is its ability to simulate a local Torus network. This is particularly useful for testing changes to the runtime or pallets. + +The typical workflow is to first generate a chain spec file with desired properties, then launch multiple nodes using that spec file, and finally connect the nodes to form a network. + +Here's an example of setting up a two-node local network: + +```bash +# Generate a chain spec +cargo xtask generate-spec gen-new --sudo 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY -o local-spec.json + +# Start Alice node as validator +cargo xtask run local --chain-spec local-spec.json --alice --node-validator true & + +# Start Bob node as validator +cargo xtask run local --chain-spec local-spec.json --bob --node-validator true & +``` + +The nodes will automatically connect to each other and start producing blocks since they're both configured as validators. + +## Code Coverage + +The `coverage` command generates code coverage reports for the Torus pallets: + +```bash +cargo xtask coverage [--html] +``` + +By default, this command produces a coverage report in the Cobertura XML format at `target/cov.xml`. If you specify the `--html` flag, it will generate an HTML report instead, which you can view at `target/llvm-cov/html/index.html`. + +The coverage analysis focuses on the core pallets (`emission0`, `governance`, `torus0`) and excludes certain files like test utilities, weights, migrations, and benchmarks from the report. This command is valuable for ensuring that your tests adequately cover the codebase, particularly when making changes to the pallets. + +## Internal Implementation + +The xtask tools use several techniques to simplify working with Torus. It provides pre-configured accounts (Alice and Bob) that have predefined keys and network settings to enable quick setup. By default, node data is stored in temporary directories that are cleaned up automatically. For replica specs, the tool fetches the entire state from a running node and then modifies specific genesis fields. The tool also handles inserting the necessary keys and configuring the nodes, so you don't need to perform these steps manually. + +## Advanced Usage + +You can customize various node parameters to fit your specific needs: + +```bash +cargo xtask run local [OPTIONS] --chain-spec my-spec.json \ + --node-name "Custom Node" \ + --node-key \ + --tcp-port 30444 \ + --rpc-port 9966 +``` + +For testing in isolation, you can prevent the node from connecting to other peers with the `--isolated` flag: + +```bash +cargo xtask run local --chain-spec my-spec.json --isolated +``` + +You can also specify custom bootnodes for your node to connect to: + +```bash +cargo xtask run local --chain-spec my-spec.json \ + --bootnodes "/ip4/192.168.1.1/tcp/30333/p2p/" \ + --bootnodes "/ip4/192.168.1.2/tcp/30333/p2p/" +``` + +## Troubleshooting + +When working with xtask, you might encounter some common issues. If a node fails to start, ensure your chain spec is valid and correctly formatted, and check that all keys are valid SS58 addresses. If nodes don't connect, make sure your TCP ports are accessible and not blocked by a firewall. When running multiple nodes on the same machine, use different port numbers. If no blocks are produced, verify that at least one node is configured as a validator and has the correct authority keys. + +For debugging purposes, you can examine the temporary node directories to check logs and configuration files. The path is printed when the node starts. You can also run a node without using xtask to get more detailed logs: + +```bash +./target/release/torus-node -d /tmp/node-data --chain my-spec.json --validator +``` diff --git a/pallets/governance/src/proposal.rs b/pallets/governance/src/proposal.rs index c316cfd4..afead9da 100644 --- a/pallets/governance/src/proposal.rs +++ b/pallets/governance/src/proposal.rs @@ -9,7 +9,9 @@ use polkadot_sdk::{ }, polkadot_sdk_frame::{prelude::BlockNumberFor, traits::CheckedAdd}, sp_core::{ConstU32, U256}, - sp_runtime::{traits::Saturating, BoundedBTreeMap, DispatchError, FixedU128, Percent}, + sp_runtime::{ + traits::Saturating, BoundedBTreeMap, DispatchError, FixedPointNumber, FixedU128, Percent, + }, sp_std::{collections::btree_set::BTreeSet, vec::Vec}, sp_tracing::error, }; @@ -693,8 +695,8 @@ pub fn get_reward_allocation( ); if n > 0 { - let mut base = FixedU128::from_float(1.5); - let mut result = FixedU128::from_float(1.); + let mut base = FixedU128::from_inner((1.5 * FixedU128::DIV as f64) as u128); + let mut result = FixedU128::from_u32(1); let mut remaining = n; while remaining > 0 { diff --git a/xtask/src/flags.rs b/xtask/src/flags.rs index 48fc358d..385d827f 100644 --- a/xtask/src/flags.rs +++ b/xtask/src/flags.rs @@ -70,6 +70,18 @@ xflags::xflags! { repeated --balance balances: String optional --sudo sudo_key: String + + /// Creates a replica of the mainnet + cmd gen-replica { + /// The API URL to use for fetching chain state. + optional --api-url api_url: String + } + + /// Creates a new empty chain spec with only the specified values + cmd gen-new { + /// The name of the new chain + optional --name chain_name: String + } } cmd coverage { @@ -135,6 +147,23 @@ pub struct GenerateSpec { pub aura: Vec, pub balance: Vec, pub sudo: Option, + pub subcommand: GenerateSpecCmd, +} + +#[derive(Debug)] +pub enum GenerateSpecCmd { + GenReplica(GenReplica), + GenNew(GenNew), +} + +#[derive(Debug)] +pub struct GenReplica { + pub api_url: Option, +} + +#[derive(Debug)] +pub struct GenNew { + pub name: Option, } #[derive(Debug)] diff --git a/xtask/src/build_spec.rs b/xtask/src/generate_spec.rs similarity index 61% rename from xtask/src/build_spec.rs rename to xtask/src/generate_spec.rs index 28e7d5a2..fe09151e 100644 --- a/xtask/src/build_spec.rs +++ b/xtask/src/generate_spec.rs @@ -18,9 +18,48 @@ use polkadot_sdk::{ OpaqueExtrinsic, }, }; -use serde_json::Value; +use serde_json::{Number, Value}; -pub fn targetchain_spec(flags: &crate::flags::Replica, dir: &Path) -> PathBuf { +use crate::flags; + +pub fn generate_spec(cmd: flags::GenerateSpec) { + match cmd.subcommand { + flags::GenerateSpecCmd::GenReplica(gen_replica) => { + generate_replica_spec(gen_replica, cmd.out, cmd.sudo) + } + flags::GenerateSpecCmd::GenNew(ref gen_new) => generate_new_spec(gen_new, &cmd), + } +} + +// Types needed for chain state fetching +type OpaqueBlock = Block, OpaqueExtrinsic>; +pub type Balance = u64; +pub type Nonce = u32; +pub type RefCount = u32; + +fn generate_replica_spec(gen_replica: flags::GenReplica, out: PathBuf, sudo: Option) { + // Create a temporary directory + let temp_dir = tempfile::Builder::new() + .prefix("torus-replica-spec") + .tempdir() + .expect("failed to create tempdir") + .into_path(); + + // Create Replica command + let replica_cmd = flags::Replica { + output: Some(out), + sudo, + api_url: gen_replica.api_url.clone(), + }; + + // Call the targetchain_spec function + targetchain_spec(&replica_cmd, &temp_dir); + + // The file is already written by targetchain_spec, no need to write again +} + +/// Function moved from build_spec.rs +pub fn targetchain_spec(flags: &flags::Replica, dir: &Path) -> PathBuf { let spec = tokio::runtime::Builder::new_multi_thread() .enable_all() .build() @@ -48,6 +87,7 @@ pub fn targetchain_spec(flags: &crate::flags::Replica, dir: &Path) -> PathBuf { chain_path } +/// Sets the sudo key in the genesis state fn sudo(genesis: &mut Value, sudo: Option<&String>) { let key = key_name(b"Sudo", b"Key"); @@ -62,6 +102,7 @@ fn sudo(genesis: &mut Value, sudo: Option<&String>) { genesis[&key] = Value::String(format!("0x{}", hex::encode(sudo))); } +/// Known predefined keys const KEYS: &[[u8; 32]] = &[ // Alice hex_literal::hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"), @@ -69,6 +110,7 @@ const KEYS: &[[u8; 32]] = &[ hex_literal::hex!("8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48"), ]; +/// Sets the aura authorities in the genesis state fn aura(genesis: &mut Value) { let key = key_name(b"Aura", b"Authorities"); @@ -79,13 +121,14 @@ fn aura(genesis: &mut Value) { genesis[&key] = Value::String(format!("0x{}", hex::encode(buf))); } +/// Sets the grandpa authorities in the genesis state fn grandpa(genesis: &mut Value) { // Alice let grandpa = vec![( sp_core::ed25519::Public::from_ss58check( "5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu", ) - .expect("invalid SS58 sudo address") + .expect("invalid SS58 grandpa address") .0, 1u64, )]; @@ -99,44 +142,7 @@ fn grandpa(genesis: &mut Value) { genesis[&key] = Value::String(format!("0x{}", hex::encode(buf))); } -// fn balance(genesis: &mut Value, sudo: Option<&String>) { -// let sudo = sudo -// .map(|sudo| { -// sp_core::ed25519::Public::from_ss58check(&sudo) -// .expect("invalid SS58 sudo address") -// .0 -// }) -// .unwrap_or(KEYS[0]); - -// let mut key = key_name(b"System", b"Account"); -// key.push_str(&hex::encode( -// [ -// sp_crypto_hashing::blake2_128(&sudo).as_slice(), -// sudo.as_slice(), -// ] -// .concat(), -// )); - -// let info = AccountInfo { -// nonce: 0, -// consumers: 0, -// providers: 0, -// sufficients: 0, -// data: AccountData { -// free: 1_000_000_000_000_000, -// reserved: 0, -// frozen: 0, -// flags: ExtraFlags(IS_NEW_LOGIC), -// }, -// }; - -// let mut buf = Cursor::new(vec![0; KEYS.size_hint()]); -// info.encode_to(&mut buf); - -// let buf = &buf.get_ref()[..buf.position() as usize]; -// genesis[&key] = Value::String(format!("0x{}", hex::encode(buf))); -// } - +/// Generates the storage key for a given pallet and storage item fn key_name(pallet: &[u8], key: &[u8]) -> String { let mut res = [0; 32]; res[0..16].copy_from_slice(&sp_crypto_hashing::twox_128(pallet)); @@ -144,11 +150,8 @@ fn key_name(pallet: &[u8], key: &[u8]) -> String { format!("0x{}", hex::encode(res)) } -type OpaqueBlock = Block, OpaqueExtrinsic>; - -// const IS_NEW_LOGIC: u128 = 0x80000000_00000000_00000000_00000000u128; - -async fn crate_chain_spec(flags: &crate::flags::Replica) -> Box { +/// Fetches the chain state from a running node +async fn crate_chain_spec(flags: &flags::Replica) -> Box { let mut chain_spec = sc_service::GenericChainSpec::::from_json_bytes( include_bytes!("../../node/specs/main.json"), ) @@ -192,10 +195,6 @@ async fn crate_chain_spec(flags: &crate::flags::Replica) -> Box { Box::new(chain_spec) } -pub type Balance = u64; -pub type Nonce = u32; -pub type RefCount = u32; - /// Information of an account. #[derive(Debug, parity_scale_codec::Decode, parity_scale_codec::Encode)] pub struct AccountInfo { @@ -242,3 +241,77 @@ pub struct AccountData { #[derive(Debug, parity_scale_codec::Decode, parity_scale_codec::Encode)] pub struct ExtraFlags(pub(crate) u128); + +fn generate_new_spec(gen_new: &flags::GenNew, cmd: &flags::GenerateSpec) { + let chain_spec = cmd + .base_chain_spec + .clone() + .unwrap_or_else(|| Path::new("dev").to_path_buf()); + + // Start with a minimal dev chain spec + let out = crate::torus_node!("build-spec", "--chain", chain_spec) + .output() + .expect("failed to run torus node"); + + let mut json: Value = serde_json::from_slice(&out.stdout).expect("failed to parse spec file"); + + // Set chain name if provided + if let Some(name) = &gen_new.name { + json["name"] = Value::String(name.clone()); + } + + // Apply all the customizations from the flags + customize_spec(&mut json, cmd); + + // Write the result to the output file + let serialized = serde_json::to_vec(&json).expect("failed to generate spec file"); + + std::fs::write(&cmd.out, serialized).expect("failed to write resulting spec file"); +} + +// Function to customize a spec file based on the provided flags +pub fn customize_spec(json: &mut Value, cmd: &flags::GenerateSpec) { + let patch = &mut json["genesis"]["runtimeGenesis"]["patch"]; + + if !cmd.aura.is_empty() { + let aura_keys = &mut patch["aura"]["authorities"] + .as_array_mut() + .expect("missing aura keys"); + aura_keys.clear(); + + for aura in &cmd.aura { + aura_keys.push(aura.clone().into()); + } + } + + if !cmd.gran.is_empty() { + let gran_keys = patch["grandpa"]["authorities"] + .as_array_mut() + .expect("missing grandpa keys"); + gran_keys.clear(); + + for gran in &cmd.gran { + gran_keys.push([Value::from(gran.clone()), 1i32.into()].into()); + } + } + + if !cmd.balance.is_empty() { + let balances = &mut patch["balances"]["balances"] + .as_array_mut() + .expect("missing balances array"); + balances.clear(); // Clear existing balances for gen-new + + for balance in &cmd.balance { + let (account, amount) = balance + .split_once('=') + .expect("malformed balance entry, format: ="); + let amount: u128 = amount.parse().expect("balance amount must be a number"); + + balances.push([Value::from(account), Number::from_u128(amount).into()].into()); + } + } + + if let Some(sudo) = &cmd.sudo { + patch["sudo"]["key"] = sudo.clone().into(); + } +} diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 29e07207..db14be53 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -1,81 +1,16 @@ -use std::{borrow::Cow, net::IpAddr, os::unix::process::CommandExt, path::Path}; +use std::{borrow::Cow, net::IpAddr, os::unix::process::CommandExt}; use polkadot_sdk::sp_keyring; -mod build_spec; mod flags; +mod generate_spec; mod run; fn main() { let cmd = flags::Xtask::from_env_or_exit(); match cmd.subcommand { flags::XtaskCmd::Run(run) => run::run(run), - flags::XtaskCmd::GenerateSpec(cmd) => { - let chain_spec = cmd - .base_chain_spec - .unwrap_or_else(|| Path::new("dev").to_path_buf()); - - let out = torus_node!("build-spec", "--chain", chain_spec) - .output() - .expect("failed to run torus node"); - - let out = if !cmd.aura.is_empty() - || !cmd.gran.is_empty() - || !cmd.balance.is_empty() - || cmd.sudo.is_some() - { - use serde_json::{Number, Value}; - - let mut json: Value = - serde_json::from_slice(&out.stdout).expect("failed to parse spec file"); - - let patch = &mut json["genesis"]["runtimeGenesis"]["patch"]; - - if !cmd.aura.is_empty() { - let aura_keys = &mut patch["aura"]["authorities"] - .as_array_mut() - .expect("missing aura keys"); - aura_keys.clear(); - - for aura in cmd.aura { - aura_keys.push(aura.into()); - } - } - - if !cmd.gran.is_empty() { - let gran_keys = patch["grandpa"]["authorities"] - .as_array_mut() - .expect("missing grandpa keys"); - gran_keys.clear(); - - for gran in cmd.gran { - gran_keys.push([Value::from(gran), 1i32.into()].into()); - } - } - - for balance in cmd.balance { - let (account, amount) = balance - .split_once('=') - .expect("malformed balance entry, format: ="); - let amount: u128 = amount.parse().expect("balance amount must be a number"); - - patch["balances"]["balances"] - .as_array_mut() - .expect("missing grandpa keys") - .push([Value::from(account), Number::from_u128(amount).into()].into()); - } - - if let Some(sudo) = cmd.sudo { - patch["sudo"]["key"] = sudo.into(); - } - - serde_json::to_vec(&json).expect("failed to generate spec file") - } else { - out.stdout - }; - - std::fs::write(cmd.out, out).expect("failed to write resulting "); - } + flags::XtaskCmd::GenerateSpec(cmd) => generate_spec::generate_spec(cmd), flags::XtaskCmd::Coverage(coverage) => { const PALLETS: [&str; 3] = ["pallet-emission0", "pallet-governance", "pallet-torus0"]; diff --git a/xtask/src/run.rs b/xtask/src/run.rs index 48a6f863..2d8225fc 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -65,7 +65,7 @@ pub(super) fn run(mut r: flags::Run) { (chain_path, true) } flags::RunCmd::Replica(replica) => { - let chain_path = crate::build_spec::targetchain_spec(replica, &path); + let chain_path = crate::generate_spec::targetchain_spec(replica, &path); let chain_path_str = chain_path.to_str().expect("invalid string").to_string(); (chain_path_str, false) } From 2532ff757de596113ec0d7ce22946f773771b706 Mon Sep 17 00:00:00 2001 From: Kelvin Steiner Date: Mon, 10 Mar 2025 15:41:37 -0300 Subject: [PATCH 11/46] chore: disable `cargo-llvm-cov` on flake shell (marked as broken); unify nixpkgs inputs (follows); bump flake --- flake.lock | 58 ++++++++++++++---------------------------------------- flake.nix | 23 ++++++++++++++-------- 2 files changed, 30 insertions(+), 51 deletions(-) diff --git a/flake.lock b/flake.lock index 79615d64..58d87316 100644 --- a/flake.lock +++ b/flake.lock @@ -57,11 +57,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1738702386, - "narHash": "sha256-nJj8f78AYAxl/zqLiFGXn5Im1qjFKU8yBPKoWEeZN5M=", + "lastModified": 1741445498, + "narHash": "sha256-F5Em0iv/CxkN5mZ9hRn3vPknpoWdcdCyR0e4WklHwiE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "030ba1976b7c0e1a67d9716b17308ccdab5b381e", + "rev": "52e3095f6d812b91b22fb7ad0bfc1ab416453634", "type": "github" }, "original": { @@ -71,50 +71,20 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1730768919, - "narHash": "sha256-8AKquNnnSaJRXZxc5YmF/WfmxiHX6MMZZasRP6RRQkE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a04d33c0c3f1a59a2c1cb0c6e34cd24500e5a1dc", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { - "locked": { - "lastModified": 1736320768, - "narHash": "sha256-nIYdTAiKIGnFNugbomgBJR+Xv5F1ZQU+HfaBqJKroC0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "4bc9c909d9ac828a039f288cf872d16d38185db8", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", "gitignore": "gitignore", - "nixpkgs": "nixpkgs_2" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { - "lastModified": 1737465171, - "narHash": "sha256-R10v2hoJRLq8jcL4syVFag7nIGE7m13qO48wRIukWNg=", + "lastModified": 1741379162, + "narHash": "sha256-srpAbmJapkaqGRE3ytf3bj4XshspVR5964OX5LfjDWc=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17", + "rev": "b5a62751225b2f62ff3147d0a334055ebadcd5cc", "type": "github" }, "original": { @@ -133,14 +103,16 @@ }, "rust-overlay": { "inputs": { - "nixpkgs": "nixpkgs_3" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { - "lastModified": 1738808867, - "narHash": "sha256-m5rbY/ck0NAlfSBxo++vl7EZn8fkZ02H3kGGc7q883c=", + "lastModified": 1741573199, + "narHash": "sha256-A2sln1GdCf+uZ8yrERSCZUCqZ3JUlOv1WE2VFqqfaLQ=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "ae46f37fb727030ddc2ef65a675b751484c90032", + "rev": "c777dc8a1e35407b0e80ec89817fe69970f4e81a", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a5a9f772..44af69fe 100644 --- a/flake.nix +++ b/flake.nix @@ -3,9 +3,14 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; + flake-utils.url = "github:numtide/flake-utils"; + rust-overlay.url = "github:oxalica/rust-overlay"; + rust-overlay.inputs.nixpkgs.follows = "nixpkgs"; + pre-commit-hooks.url = "github:cachix/git-hooks.nix"; + pre-commit-hooks.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = { self, nixpkgs, rust-overlay, pre-commit-hooks, flake-utils, ... }: @@ -21,11 +26,12 @@ rocksdb zstd.dev ]; - buildInputs = if pkgs.stdenv.isLinux then - generalBuildInputs ++ [ pkgs.jemalloc pkgs.pkgsi686Linux.glibc ] - else - generalBuildInputs - ++ [ pkgs.darwin.apple_sdk.frameworks.SystemConfiguration ]; + buildInputs = + if pkgs.stdenv.isLinux then + generalBuildInputs ++ [ pkgs.jemalloc pkgs.pkgsi686Linux.glibc ] + else + generalBuildInputs + ++ [ pkgs.darwin.apple_sdk.frameworks.SystemConfiguration ]; nativeBuildInputs = with pkgs; [ git rust clang protobuf sccache ]; shellPkgs = [ @@ -36,10 +42,11 @@ pkgs.act # Python pkgs.python310 - # Code coverage tool - pkgs.cargo-llvm-cov + # # Code coverage tool + # pkgs.cargo-llvm-cov # marked as broken ]; - in { + in + { checks = pkgs.mkShell { pre-commit-check = pre-commit-hooks.lib.${system}.run { src = ./.; From 27aab25ad4ef94fed31b4890a82aa826c2b68786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:37:27 -0300 Subject: [PATCH 12/46] feat: build and push xtask cli tool to github packages (#86) This PR adds the `Docker build and push xtask cli tool` action. When code that changes anything related to the xtask is pushed to the branch `dev` or `main` this action builds a docker image and publishes it on github packages. The image tag is `ghcr.io/renlabs-dev/torus-xtask:{commit small sha}` with the addition of `ghcr.io/renlabs-dev/torus-xtask:latest` if it's pushed to `main`. Closes CHAIN-71 --- .github/workflows/build-docker-xtask.yml | 49 ++++++++++++++++++++++++ docker/xtask.dockerfile | 35 +++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 .github/workflows/build-docker-xtask.yml create mode 100644 docker/xtask.dockerfile diff --git a/.github/workflows/build-docker-xtask.yml b/.github/workflows/build-docker-xtask.yml new file mode 100644 index 00000000..c7bbfbca --- /dev/null +++ b/.github/workflows/build-docker-xtask.yml @@ -0,0 +1,49 @@ +name: Docker build and push xtask cli tool + +on: + push: + branches: + - main + - dev + paths: + - 'xtask/**' + - '.github/workflows/build-docker-xtask.yml' + - 'docker/xtask.dockerfile' + +jobs: + docker: + permissions: + contents: read + packages: write + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository_owner }}/torus-xtask + tags: | + type=sha,prefix=,enable=true + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: true + file: ./docker/xtask.dockerfile + tags: ${{ steps.meta.outputs.tags }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/docker/xtask.dockerfile b/docker/xtask.dockerfile new file mode 100644 index 00000000..5ac89b6e --- /dev/null +++ b/docker/xtask.dockerfile @@ -0,0 +1,35 @@ +FROM rust:1.76-slim-bullseye as builder + +WORKDIR /usr/src/app + +RUN apt-get update && apt install -y --no-install-recommends \ + ca-certificates \ + curl \ + build-essential \ + protobuf-compiler \ + libclang-dev \ + git \ + pkg-config \ + libssl-dev + +COPY . . + +RUN cargo build --release --bin xtask + +FROM debian:bullseye-slim + +WORKDIR /app + +RUN apt-get update && apt install -y --no-install-recommends \ + ca-certificates \ + curl \ + build-essential \ + protobuf-compiler \ + libclang-dev \ + git \ + pkg-config \ + libssl-dev + +COPY --from=builder /usr/src/app/target/release/xtask /usr/local/bin + +ENTRYPOINT ["xtask"] From 4456ef882f43d0bdf4597b1d7f84d2d5144938ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Sun, 23 Mar 2025 19:12:12 -0300 Subject: [PATCH 13/46] =?UTF-8?q?feat:=20make=20xtask=20spec=20generation?= =?UTF-8?q?=20tasks=20go=20to=20stdout=20when=20no=20output=20is=E2=80=A6?= =?UTF-8?q?=20(#89)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes CHAIN-72 --- xtask/src/flags.rs | 4 ++-- xtask/src/generate_spec.rs | 47 ++++++++++++++++++++++---------------- xtask/src/run.rs | 8 +++++-- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/xtask/src/flags.rs b/xtask/src/flags.rs index 385d827f..557a42e7 100644 --- a/xtask/src/flags.rs +++ b/xtask/src/flags.rs @@ -61,7 +61,7 @@ xflags::xflags! { optional -c, --base-chain-spec base_chain_spec: PathBuf /// Output file for the chain spec. - required -o, --out output: PathBuf + optional -o, --out output: PathBuf repeated --gran gran_keys: String @@ -142,7 +142,7 @@ pub struct Replica { #[derive(Debug)] pub struct GenerateSpec { pub base_chain_spec: Option, - pub out: PathBuf, + pub out: Option, pub gran: Vec, pub aura: Vec, pub balance: Vec, diff --git a/xtask/src/generate_spec.rs b/xtask/src/generate_spec.rs index fe09151e..5cb4d265 100644 --- a/xtask/src/generate_spec.rs +++ b/xtask/src/generate_spec.rs @@ -37,29 +37,26 @@ pub type Balance = u64; pub type Nonce = u32; pub type RefCount = u32; -fn generate_replica_spec(gen_replica: flags::GenReplica, out: PathBuf, sudo: Option) { - // Create a temporary directory - let temp_dir = tempfile::Builder::new() - .prefix("torus-replica-spec") - .tempdir() - .expect("failed to create tempdir") - .into_path(); - +fn generate_replica_spec( + gen_replica: flags::GenReplica, + out: Option, + sudo: Option, +) { // Create Replica command let replica_cmd = flags::Replica { - output: Some(out), + output: out, sudo, api_url: gen_replica.api_url.clone(), }; // Call the targetchain_spec function - targetchain_spec(&replica_cmd, &temp_dir); + targetchain_spec(&replica_cmd); // The file is already written by targetchain_spec, no need to write again } /// Function moved from build_spec.rs -pub fn targetchain_spec(flags: &flags::Replica, dir: &Path) -> PathBuf { +pub fn targetchain_spec(flags: &flags::Replica) -> Option { let spec = tokio::runtime::Builder::new_multi_thread() .enable_all() .build() @@ -78,13 +75,16 @@ pub fn targetchain_spec(flags: &flags::Replica, dir: &Path) -> PathBuf { let js = serde_json::to_string_pretty(&js).unwrap(); - let chain_path = flags - .output - .clone() - .unwrap_or_else(|| dir.join("spec.json")); - std::fs::write(&chain_path, js).unwrap(); - - chain_path + match &flags.output { + Some(chain_path) => { + std::fs::write(chain_path, js).unwrap(); + Some(chain_path.clone()) + } + None => { + println!("{js}"); + None + } + } } /// Sets the sudo key in the genesis state @@ -264,9 +264,16 @@ fn generate_new_spec(gen_new: &flags::GenNew, cmd: &flags::GenerateSpec) { customize_spec(&mut json, cmd); // Write the result to the output file - let serialized = serde_json::to_vec(&json).expect("failed to generate spec file"); + let serialized = serde_json::to_string_pretty(&json).expect("failed to generate spec file"); - std::fs::write(&cmd.out, serialized).expect("failed to write resulting spec file"); + match &cmd.out { + Some(output_path) => { + std::fs::write(output_path, serialized).expect("failed to write resulting spec file"); + } + None => { + println!("{serialized}"); + } + } } // Function to customize a spec file based on the provided flags diff --git a/xtask/src/run.rs b/xtask/src/run.rs index 2d8225fc..67f75cf3 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -47,7 +47,7 @@ pub(super) fn run(mut r: flags::Run) { _ => {} } - let (chain_spec, _local_seal) = match &r.subcommand { + let (chain_spec, _local_seal) = match &mut r.subcommand { flags::RunCmd::Local(local) => { let chain_path = local .chain_spec @@ -65,7 +65,11 @@ pub(super) fn run(mut r: flags::Run) { (chain_path, true) } flags::RunCmd::Replica(replica) => { - let chain_path = crate::generate_spec::targetchain_spec(replica, &path); + if replica.output.is_none() { + replica.output = Some(path.join("spec.json")); + } + + let chain_path = crate::generate_spec::targetchain_spec(replica).unwrap(); let chain_path_str = chain_path.to_str().expect("invalid string").to_string(); (chain_path_str, false) } From df671d1ae694b960358c426f36c21424c39102bd Mon Sep 17 00:00:00 2001 From: Kelvin Steiner Date: Thu, 27 Mar 2025 10:04:46 -0300 Subject: [PATCH 14/46] chore: add devcontainer.json; organizer Github Action files --- .devcontainer/devcontainer.json | 8 ++++++++ ...build-docker.yml => build-docker-node.yml} | 10 +++++++--- .github/workflows/build-docker-xtask.yml | 19 +++++++++--------- .../{build.yml => build-runtime.yml} | 6 +++--- .vscode/settings.json | 20 ++++++++++++------- 5 files changed, 41 insertions(+), 22 deletions(-) create mode 100644 .devcontainer/devcontainer.json rename .github/workflows/{build-docker.yml => build-docker-node.yml} (92%) rename .github/workflows/{build.yml => build-runtime.yml} (98%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..003a73b2 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,8 @@ +{ + "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/nix:1": { + "flake": "github:nixos/nixpkgs/nixpkgs-unstable#direnv" + } + } +} diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker-node.yml similarity index 92% rename from .github/workflows/build-docker.yml rename to .github/workflows/build-docker-node.yml index 94933807..c0f50f18 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker-node.yml @@ -1,8 +1,12 @@ -name: Build and push Docker image +name: Build Torus node Docker image on: push: - branches: [main, testnet, github-ci-test] + branches: + - main + - dev + - testnet + - github-ci-test tags: - "*" @@ -15,7 +19,7 @@ jobs: permissions: write-all runs-on: ubuntu-22.04-32core-karl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: commit uses: prompt/actions-commit-hash@v3 diff --git a/.github/workflows/build-docker-xtask.yml b/.github/workflows/build-docker-xtask.yml index c7bbfbca..06caeaaa 100644 --- a/.github/workflows/build-docker-xtask.yml +++ b/.github/workflows/build-docker-xtask.yml @@ -1,15 +1,16 @@ -name: Docker build and push xtask cli tool +name: Build xtask cli tool Docker image on: push: branches: - main - dev + - github-ci-test paths: - - 'xtask/**' - - '.github/workflows/build-docker-xtask.yml' - - 'docker/xtask.dockerfile' - + - "xtask/**" + - ".github/workflows/build-docker-xtask.yml" + - "docker/xtask.dockerfile" + jobs: docker: permissions: @@ -18,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - + - name: Docker meta id: meta uses: docker/metadata-action@v5 @@ -27,17 +28,17 @@ jobs: tags: | type=sha,prefix=,enable=true type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} - + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - + - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - + - name: Build and push uses: docker/build-push-action@v5 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build-runtime.yml similarity index 98% rename from .github/workflows/build.yml rename to .github/workflows/build-runtime.yml index ef3ba698..f0705ec9 100755 --- a/.github/workflows/build.yml +++ b/.github/workflows/build-runtime.yml @@ -1,14 +1,14 @@ -name: Build Torus Runtime +name: Build Torus runtime on: workflow_dispatch: push: - tags: - - "runtime/*" branches: - "github-ci-test" - "build-runtime*" - "testnet" + tags: + - "runtime/*" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.vscode/settings.json b/.vscode/settings.json index 3da0151c..183f52dc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,10 +8,16 @@ "rust-analyzer.check.extraEnv": { "SKIP_WASM_BUILD": "1" }, - "rust-analyzer.cargo.features": [ - "runtime-benchmarks" - ], - "coverage-gutters.coverageFileNames": [ - "target/cov.xml", - ], -} \ No newline at end of file + "rust-analyzer.cargo.features": ["runtime-benchmarks"], + "coverage-gutters.coverageFileNames": ["target/cov.xml"], + // Spell checker + "cSpell.words": [ + "buildx", + "devcontainers", + "irongut", + "jwalton", + "presign", + "Swatinem", + "wbuild" + ] +} From 06ec2691fbed5cb7a604929fe474e8a961d0098d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Mon, 31 Mar 2025 13:59:27 -0300 Subject: [PATCH 15/46] feat: add cooldown and event to agent update extrinsic (#88) Closes CHAIN-66 --------- Co-authored-by: Luiz Carvalho --- pallets/governance/src/migrations.rs | 114 +++++++++++++++++++++++++++ pallets/torus0/src/agent.rs | 35 +++++++- pallets/torus0/src/lib.rs | 32 +++++++- pallets/torus0/src/migrations.rs | 59 ++++++++++++-- pallets/torus0/tests/agent.rs | 104 ++++++++++++++++++++++-- runtime/src/configs.rs | 2 + runtime/src/lib.rs | 4 +- test-utils/src/lib.rs | 7 ++ 8 files changed, 337 insertions(+), 20 deletions(-) diff --git a/pallets/governance/src/migrations.rs b/pallets/governance/src/migrations.rs index a996c79a..397d4be2 100644 --- a/pallets/governance/src/migrations.rs +++ b/pallets/governance/src/migrations.rs @@ -5,13 +5,127 @@ use polkadot_sdk::frame_support::{ use crate::{Config, Pallet}; pub mod v3 { + use crate::proposal::{GlobalParamsData, ProposalData}; + use super::*; pub type Migration = VersionedMigration<2, 3, MigrateToV3, Pallet, W>; pub struct MigrateToV3(core::marker::PhantomData); + mod old_storage { + use codec::{Decode, Encode, MaxEncodedLen}; + use polkadot_sdk::{ + frame_support::{storage_alias, DebugNoBound, Identity}, + polkadot_sdk_frame::prelude::BlockNumberFor, + sp_core::ConstU32, + sp_runtime::{BoundedVec, Percent}, + }; + use scale_info::TypeInfo; + + use crate::{ + proposal::{ProposalId, ProposalStatus}, + AccountIdOf, BalanceOf, + }; + + #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen)] + #[scale_info(skip_type_params(T))] + pub struct Proposal { + pub id: ProposalId, + pub proposer: AccountIdOf, + pub expiration_block: BlockNumberFor, + pub data: ProposalData, + pub status: ProposalStatus, + pub metadata: BoundedVec>, + pub proposal_cost: BalanceOf, + pub creation_block: BlockNumberFor, + } + + #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] + #[scale_info(skip_type_params(T))] + pub enum ProposalData { + GlobalParams(GlobalParamsData), + GlobalCustom, + Emission { + recycling_percentage: Percent, + treasury_percentage: Percent, + incentives_ratio: Percent, + }, + TransferDaoTreasury { + account: AccountIdOf, + amount: BalanceOf, + }, + } + + #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] + #[scale_info(skip_type_params(T))] + pub struct GlobalParamsData { + pub min_name_length: u16, + pub max_name_length: u16, + pub max_allowed_agents: u16, + pub max_allowed_weights: u16, + pub min_stake_per_weight: BalanceOf, + pub min_weight_control_fee: u8, + pub min_staking_fee: u8, + pub dividends_participation_weight: Percent, + pub proposal_cost: BalanceOf, + } + + #[storage_alias] + pub type Proposals = + StorageMap, Identity, ProposalId, Proposal>; + } + impl UncheckedOnRuntimeUpgrade for MigrateToV3 { fn on_runtime_upgrade() -> Weight { + for (id, proposal) in old_storage::Proposals::iter() { + let new_data = match proposal.data { + old_storage::ProposalData::GlobalParams(old_storage::GlobalParamsData { + min_name_length, + max_name_length, + max_allowed_agents, + min_weight_control_fee, + min_staking_fee, + dividends_participation_weight, + proposal_cost, + .. + }) => ProposalData::GlobalParams(GlobalParamsData { + min_name_length, + max_name_length, + max_allowed_agents, + min_weight_control_fee, + min_staking_fee, + dividends_participation_weight, + proposal_cost, + }), + old_storage::ProposalData::GlobalCustom => ProposalData::GlobalCustom, + old_storage::ProposalData::Emission { + recycling_percentage, + treasury_percentage, + incentives_ratio, + } => ProposalData::Emission { + recycling_percentage, + treasury_percentage, + incentives_ratio, + }, + old_storage::ProposalData::TransferDaoTreasury { account, amount } => { + ProposalData::TransferDaoTreasury { account, amount } + } + }; + + let new_proposal = crate::proposal::Proposal { + id: proposal.id, + proposer: proposal.proposer, + expiration_block: proposal.expiration_block, + data: new_data, + status: proposal.status, + metadata: proposal.metadata, + proposal_cost: proposal.proposal_cost, + creation_block: proposal.creation_block, + }; + + crate::Proposals::::set(id, Some(new_proposal)); + } + Weight::zero() } } diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index feb37004..2efb1108 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -36,6 +36,7 @@ pub struct Agent { pub weight_penalty_factor: Percent, pub registration_block: BlockNumberFor, pub fees: crate::fee::ValidatorFee, + pub last_update_block: BlockNumberFor, } /// Register an agent to the given key, payed by the payer key. @@ -108,6 +109,7 @@ pub fn register( ) .map_err(|_| crate::Error::::NotEnoughBalanceToRegisterAgent)?; + let registration_block = >::block_number(); crate::Agents::::insert( agent_key.clone(), Agent { @@ -116,8 +118,9 @@ pub fn register( url: BoundedVec::truncate_from(url), metadata: BoundedVec::truncate_from(metadata), weight_penalty_factor: Percent::from_percent(0), - registration_block: >::block_number(), + registration_block, fees: Default::default(), + last_update_block: registration_block, }, ); @@ -177,6 +180,10 @@ pub fn update( return Err(crate::Error::::AgentDoesNotExist.into()); }; + if is_in_update_cooldown::(&agent_key)? { + return Err(crate::Error::::AgentUpdateOnCooldown.into()); + } + validate_agent_name::(&name[..])?; agent.name = BoundedVec::truncate_from(name); @@ -211,9 +218,35 @@ pub fn update( Ok::<(), DispatchError>(()) })?; + set_in_cooldown::(&agent_key)?; + crate::Pallet::::deposit_event(crate::Event::::AgentUpdated(agent_key)); + Ok(()) } +fn is_in_update_cooldown(key: &AccountIdOf) -> Result { + let current_block = >::block_number(); + let cooldown = crate::AgentUpdateCooldown::::get(); + + let last_update = crate::Agents::::get(key) + .ok_or(crate::Error::::AgentDoesNotExist)? + .last_update_block; + + Ok(last_update + cooldown > current_block) +} + +fn set_in_cooldown(key: &AccountIdOf) -> DispatchResult { + crate::Agents::::mutate(key, |agent| { + let Some(agent) = agent else { + return Err(crate::Error::::AgentDoesNotExist.into()); + }; + + agent.last_update_block = >::block_number(); + + Ok(()) + }) +} + pub fn exists(key: &AccountIdOf) -> bool { crate::Agents::::contains_key(key) } diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index a1ae27cd..374716fe 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -8,7 +8,10 @@ pub mod migrations; pub mod stake; pub(crate) use ext::*; -use frame::{arithmetic::Percent, prelude::ensure_signed}; +use frame::{ + arithmetic::Percent, + prelude::{ensure_root, ensure_signed}, +}; pub use pallet::*; use polkadot_sdk::{ frame_support::{ @@ -26,7 +29,7 @@ use crate::{agent::Agent, burn::BurnConfiguration, fee::ValidatorFeeConstraints} #[frame::pallet] pub mod pallet { - const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); use frame::prelude::BlockNumberFor; use pallet_emission0_api::Emission0Api; @@ -132,6 +135,11 @@ pub mod pallet { #[pallet::storage] pub type BurnConfig = StorageValue<_, BurnConfiguration, ValueQuery>; + /// Cooldown (in blocks) in which an agent needs to wait between each `update_agent` call. + #[pallet::storage] + pub type AgentUpdateCooldown = + StorageValue<_, BlockNumberFor, ValueQuery, T::DefaultAgentUpdateCooldown>; + #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(block_number: BlockNumberFor) -> Weight { @@ -228,6 +236,11 @@ pub mod pallet { #[pallet::constant] type DefaultDividendsParticipationWeight: Get; + /// Default Cooldown (in blocks) in which an agent needs to wait between each `update_agent` call. + #[pallet::constant] + #[pallet::no_default_bounds] + type DefaultAgentUpdateCooldown: Get>; + #[pallet::no_default_bounds] type RuntimeEvent: From> + IsType<::RuntimeEvent>; @@ -329,6 +342,18 @@ pub mod pallet { weight_control_fee, ) } + + /// Updates origin's key agent metadata. + #[pallet::call_index(6)] + #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] + pub fn set_agent_update_cooldown( + origin: OriginFor, + new_cooldown: BlockNumberFor, + ) -> DispatchResult { + ensure_root(origin)?; + AgentUpdateCooldown::::set(new_cooldown); + Ok(()) + } } #[pallet::event] @@ -428,6 +453,8 @@ pub mod pallet { InvalidStakingFee, /// The weight control fee given is lower than the minimum fee InvalidWeightControlFee, + /// The agent already updated recently + AgentUpdateOnCooldown, } } @@ -516,6 +543,7 @@ impl weight_penalty_factor: Default::default(), registration_block: Default::default(), fees: Default::default(), + last_update_block: Default::default(), }), ); diff --git a/pallets/torus0/src/migrations.rs b/pallets/torus0/src/migrations.rs index feaa735d..1da8411c 100644 --- a/pallets/torus0/src/migrations.rs +++ b/pallets/torus0/src/migrations.rs @@ -4,17 +4,60 @@ use polkadot_sdk::frame_support::{ use crate::{Config, Pallet}; -pub mod v2 { +pub mod v3 { use super::*; use crate::{Agent, Agents}; - pub type Migration = VersionedMigration<1, 2, MigrateToV1, Pallet, W>; - pub struct MigrateToV1(core::marker::PhantomData); - impl UncheckedOnRuntimeUpgrade for MigrateToV1 { + use scale_info::prelude::vec::Vec; + + pub mod storage { + use codec::{Decode, Encode, MaxEncodedLen}; + use polkadot_sdk::frame_support::{storage_alias, DebugNoBound, Identity}; + use polkadot_sdk::polkadot_sdk_frame::prelude::BlockNumberFor; + use polkadot_sdk::sp_runtime::{BoundedVec, Percent}; + use scale_info::TypeInfo; + + use crate::AccountIdOf; + + #[derive(DebugNoBound, Encode, Decode, MaxEncodedLen, TypeInfo)] + #[scale_info(skip_type_params(T))] + pub struct Agent { + pub key: AccountIdOf, + pub name: BoundedVec, + pub url: BoundedVec, + pub metadata: BoundedVec, + pub weight_penalty_factor: Percent, + pub registration_block: BlockNumberFor, + pub fees: crate::fee::ValidatorFee, + } + + #[storage_alias] + pub type Agents = + StorageMap, Identity, AccountIdOf, Agent>; + } + + pub type Migration = VersionedMigration<2, 3, MigrateToV3, Pallet, W>; + pub struct MigrateToV3(core::marker::PhantomData); + impl UncheckedOnRuntimeUpgrade for MigrateToV3 { fn on_runtime_upgrade() -> Weight { - Agents::::translate(|_key, mut agent: Agent| { - agent.fees = Default::default(); - Some(agent) - }); + let old_agents = storage::Agents::::iter().collect::>(); + let _ = storage::Agents::::clear(u32::MAX, None); + + for (id, old_agent) in old_agents { + Agents::::insert( + id, + Agent { + key: old_agent.key, + name: old_agent.name, + url: old_agent.url, + metadata: old_agent.metadata, + registration_block: old_agent.registration_block, + weight_penalty_factor: old_agent.weight_penalty_factor, + fees: old_agent.fees, + last_update_block: old_agent.registration_block, + }, + ) + } + Weight::zero() } } diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index e9287899..ba987165 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -1,7 +1,9 @@ -use pallet_torus0::{agent::Agent, Agents, Burn, Error, ImmunityPeriod, MaxAllowedAgents}; +use pallet_torus0::{ + agent::Agent, AgentUpdateCooldown, Agents, Burn, Error, ImmunityPeriod, MaxAllowedAgents, +}; use polkadot_sdk::{frame_support::assert_err, sp_core::Get, sp_runtime::Percent}; use test_utils::{ - assert_ok, get_origin, + assert_ok, clear_cooldown, get_origin, pallet_emission0::{ConsensusMembers, WeightControlDelegation}, pallet_governance::{self, Allocators}, step_block, Test, @@ -27,6 +29,7 @@ fn register_correctly() { weight_penalty_factor: Default::default(), registration_block: Default::default(), fees: Default::default(), + last_update_block: Default::default(), }), ); Allocators::::set(allocator_id, Some(())); @@ -417,6 +420,8 @@ fn unregister_twice() { #[test] fn update_correctly() { test_utils::new_test_ext().execute_with(|| { + clear_cooldown(); + let agent = 0; let name = "agent".as_bytes().to_vec(); let url = "idk://agent".as_bytes().to_vec(); @@ -476,6 +481,8 @@ fn update_correctly() { #[test] fn update_with_zero_staking_fee() { test_utils::new_test_ext().execute_with(|| { + clear_cooldown(); + let agent = 0; let name = "agent".as_bytes().to_vec(); let url = "idk://agent".as_bytes().to_vec(); @@ -526,6 +533,8 @@ fn update_with_zero_staking_fee() { #[test] fn update_with_zero_weight_control_fee() { test_utils::new_test_ext().execute_with(|| { + clear_cooldown(); + let agent = 0; let name = "agent".as_bytes().to_vec(); let url = "idk://agent".as_bytes().to_vec(); @@ -591,6 +600,12 @@ fn prunes_excess_agents() { const MAX_VALIDATOR_KEY: u32 = 4; const MIN_VALIDATOR_KEY: u32 = 5; for key in 0..6 { + let registration_block = if key == IMMUNE_KEY { + current_block + } else { + key as u64 + }; + Agents::::set( key, Some(Agent { @@ -599,12 +614,9 @@ fn prunes_excess_agents() { url: Default::default(), metadata: Default::default(), weight_penalty_factor: Default::default(), - registration_block: if key == IMMUNE_KEY { - current_block - } else { - key as u64 - }, + registration_block, fees: Default::default(), + last_update_block: registration_block, }), ); @@ -654,6 +666,7 @@ fn prunes_excess_agents() { weight_penalty_factor: Default::default(), registration_block: current_block, fees: Default::default(), + last_update_block: current_block, }), ); @@ -669,3 +682,80 @@ fn prunes_excess_agents() { ); }); } + +#[test] +fn fails_updating_whitout_waiting_cooldown() { + test_utils::new_test_ext().execute_with(|| { + let agent = 0; + let name = "agent".as_bytes().to_vec(); + let url = "idk://agent".as_bytes().to_vec(); + let metadata = "idk://agent".as_bytes().to_vec(); + + assert_err!( + pallet_torus0::agent::update::( + agent, + b"".to_vec(), + b"".to_vec(), + None, + None, + None, + ), + Error::::AgentDoesNotExist + ); + + assert_ok!(pallet_governance::whitelist::add_to_whitelist::( + agent + )); + + assert_ok!(pallet_torus0::Pallet::::register_agent( + get_origin(agent), + agent, + name, + url, + metadata, + )); + + let new_name = "new-agent".as_bytes().to_vec(); + let new_url = "new-idk://agent".as_bytes().to_vec(); + let new_metadata = "new-idk://agent".as_bytes().to_vec(); + + let constraints = pallet_torus0::FeeConstraints::::get(); + let staking_fee = constraints.min_staking_fee; + let weight_control_fee = constraints.min_weight_control_fee; + + assert_err!( + pallet_torus0::Pallet::::update_agent( + get_origin(agent), + new_name.clone(), + new_url.clone(), + Some(new_metadata.clone()), + Some(staking_fee), + Some(weight_control_fee), + ), + crate::Error::::AgentUpdateOnCooldown + ); + + step_block(AgentUpdateCooldown::::get()); + + assert_ok!(pallet_torus0::Pallet::::update_agent( + get_origin(agent), + new_name.clone(), + new_url.clone(), + Some(new_metadata.clone()), + Some(staking_fee), + Some(weight_control_fee), + )); + + assert_err!( + pallet_torus0::Pallet::::update_agent( + get_origin(agent), + new_name.clone(), + new_url.clone(), + Some(new_metadata.clone()), + Some(staking_fee), + Some(weight_control_fee), + ), + crate::Error::::AgentUpdateOnCooldown + ); + }); +} diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index 1c16a7a6..5cf68924 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -345,6 +345,8 @@ impl pallet_torus0::Config for Runtime { type DefaultMaxRegistrationsPerInterval = ConstU16<32>; + type DefaultAgentUpdateCooldown = ConstU64<32_400>; // 3 days + #[doc = " The storage MaxNameLength should be constrained to be no more than the value of this."] #[doc = " This is needed on agent::Agent to set the `name` field BoundedVec max length."] type MaxAgentNameLengthConstraint = ConstU32<256>; diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 8dadd9b3..8ce37610 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -39,7 +39,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("torus-runtime"), impl_name: create_runtime_str!("torus-runtime"), authoring_version: 1, - spec_version: 11, + spec_version: 12, impl_version: 1, apis: apis::RUNTIME_API_VERSIONS, transaction_version: 1, @@ -87,7 +87,7 @@ pub type SignedPayload = sp_runtime::generic::SignedPayload, pallet_emission0::migrations::v2::Migration, - pallet_torus0::migrations::v2::Migration, + pallet_torus0::migrations::v3::Migration, ); /// Executive: handles dispatch to the various modules. diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index c40e95a9..9d4c41a8 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -121,6 +121,8 @@ impl pallet_torus0::Config for Test { type DefaultMaxRegistrationsPerInterval = ConstU16<32>; + type DefaultAgentUpdateCooldown = ConstU64<32_400>; + #[doc = " The storage MaxNameLength should be constrained to be no more than the value of this."] #[doc = " This is needed on agent::Agent to set the `name` field BoundedVec max length."] type MaxAgentNameLengthConstraint = ConstU32<256>; @@ -347,10 +349,15 @@ pub fn register_empty_agent(key: AccountId) { weight_penalty_factor: Default::default(), registration_block: >::block_number(), fees: Default::default(), + last_update_block: Default::default(), }), ); } +pub fn clear_cooldown() { + pallet_torus0::AgentUpdateCooldown::::set(0); +} + pub fn round_first_five(num: u64) -> u64 { let place_value = 10_u64.pow(num.to_string().len() as u32 - 5); let first_five = num / place_value; From e24e7e6c3e6ba75b680d38fb5fa106893da4d632 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 31 Mar 2025 14:04:58 -0300 Subject: [PATCH 16/46] feat(permission0): initial implementation (#87) This is the first version for the permission0 pallet. Effectively implements emission recursion. --------- Co-authored-by: devwckd --- Cargo.lock | 27 ++ Cargo.toml | 2 + docs/permission0.md | 298 ++++++++++++++ pallets/emission0/Cargo.toml | 8 +- pallets/emission0/src/distribute.rs | 17 +- pallets/emission0/src/lib.rs | 9 + pallets/permission0/Cargo.toml | 37 ++ pallets/permission0/api/Cargo.toml | 27 ++ pallets/permission0/api/src/lib.rs | 116 ++++++ pallets/permission0/src/ext.rs | 329 ++++++++++++++++ pallets/permission0/src/lib.rs | 371 ++++++++++++++++++ pallets/permission0/src/permission.rs | 207 ++++++++++ .../permission0/src/permission/emission.rs | 325 +++++++++++++++ pallets/permission0/src/weights.rs | 32 ++ pallets/permission0/tests/fixed.rs | 213 ++++++++++ pallets/permission0/tests/lifetime.rs | 156 ++++++++ pallets/permission0/tests/stream.rs | 231 +++++++++++ runtime/Cargo.toml | 5 + runtime/src/configs.rs | 24 ++ runtime/src/lib.rs | 3 + test-utils/Cargo.toml | 1 + test-utils/src/lib.rs | 33 +- xtask/src/main.rs | 7 +- 23 files changed, 2472 insertions(+), 6 deletions(-) create mode 100644 docs/permission0.md create mode 100644 pallets/permission0/Cargo.toml create mode 100644 pallets/permission0/api/Cargo.toml create mode 100644 pallets/permission0/api/src/lib.rs create mode 100644 pallets/permission0/src/ext.rs create mode 100644 pallets/permission0/src/lib.rs create mode 100644 pallets/permission0/src/permission.rs create mode 100644 pallets/permission0/src/permission/emission.rs create mode 100644 pallets/permission0/src/weights.rs create mode 100644 pallets/permission0/tests/fixed.rs create mode 100644 pallets/permission0/tests/lifetime.rs create mode 100644 pallets/permission0/tests/stream.rs diff --git a/Cargo.lock b/Cargo.lock index a647b4d0..30e5cf2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8313,6 +8313,7 @@ dependencies = [ "num-traits", "pallet-emission0-api", "pallet-governance-api", + "pallet-permission0-api", "pallet-torus0-api", "parity-scale-codec", "polkadot-sdk", @@ -8865,6 +8866,29 @@ dependencies = [ "sp-runtime", ] +[[package]] +name = "pallet-permission0" +version = "0.1.0" +dependencies = [ + "pallet-emission0-api", + "pallet-permission0-api", + "pallet-torus0-api", + "parity-scale-codec", + "polkadot-sdk", + "scale-info", + "test-utils", +] + +[[package]] +name = "pallet-permission0-api" +version = "0.1.0" +dependencies = [ + "pallet-torus0-api", + "parity-scale-codec", + "polkadot-sdk", + "scale-info", +] + [[package]] name = "pallet-preimage" version = "38.0.0" @@ -16707,6 +16731,7 @@ dependencies = [ "pallet-emission0", "pallet-governance", "pallet-governance-api", + "pallet-permission0", "pallet-torus0", "pallet-torus0-api", "parity-scale-codec", @@ -17079,6 +17104,8 @@ dependencies = [ "pallet-evm-precompile-simple", "pallet-governance", "pallet-governance-api", + "pallet-permission0", + "pallet-permission0-api", "pallet-torus0", "pallet-torus0-api", "parity-scale-codec", diff --git a/Cargo.toml b/Cargo.toml index 3df988dc..d7dc6cba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,8 @@ pallet-emission0 = { path = "./pallets/emission0", default-features = false } pallet-emission0-api = { path = "./pallets/emission0/api", default-features = false } pallet-torus0 = { path = "./pallets/torus0", default-features = false } pallet-torus0-api = { path = "./pallets/torus0/api", default-features = false } +pallet-permission0 = { path = "./pallets/permission0", default-features = false } +pallet-permission0-api = { path = "./pallets/permission0/api", default-features = false } test-utils.path = "./test-utils" # Substrate diff --git a/docs/permission0.md b/docs/permission0.md new file mode 100644 index 00000000..4cf6d3a4 --- /dev/null +++ b/docs/permission0.md @@ -0,0 +1,298 @@ +# Permission0: Recursive Emission Delegation + +## Overview + +Permission0 implements a permission-based delegation system for emission distribution in the Torus network. This pallet enables agents to delegate a portion of their emissions to other agents through a structured permission contract framework. Agents can delegate either a percentage of incoming emissions or a fixed amount of tokens. + +The concept draws inspiration from multi-level competency networks that self-organize for efficient resource allocation. When an agent delegates emissions to another agent, they create economic pathways for token flow, effectively allowing the network to discover and reinforce valuable contributions across different domains. + +## Permission Contracts + +A permission contract forms the foundation of the delegation relationship. Each contract defines the relationship between a grantor (who delegates emissions) and a grantee (who receives the delegation authority). The contract specifies allocation parameters, distribution controls, duration, and revocation terms. + +Permission contracts are identified by a unique `PermissionId` generated deterministically from the grantor, grantee, scope, and creation block. This ensures contracts can be consistently referenced and avoids collision issues when multiple contracts exist between the same parties. + +```rust +pub struct PermissionContract { + pub grantor: T::AccountId, + pub grantee: T::AccountId, + pub scope: PermissionScope, + pub duration: PermissionDuration, + pub revocation: RevocationTerms, + pub last_execution: Option>, + pub execution_count: u32, + pub parent: Option, + pub created_at: BlockNumberFor, +} +``` + +The `parent` field enables recursive delegation chains, where a permission can be derived from a higher-level permission. This creates hierarchical delegation trees where permissions can cascade through multiple levels of delegation. + +## Emission Allocation + +The permission contract's scope defines how emissions are allocated. The current implementation supports only emission-type permissions through the `EmissionScope` structure: + +```rust +pub struct EmissionScope { + pub allocation: EmissionAllocation, + pub distribution: DistributionControl, + pub targets: BoundedBTreeMap, +} +``` + +The `allocation` field determines how tokens are allocated: + +```rust +pub enum EmissionAllocation { + Streams(BoundedBTreeMap), + FixedAmount(BalanceOf), +} +``` + +With `Streams` allocation, portions of the grantor's incoming emissions from specific streams are diverted according to the percentages specified (0-100%). Each stream ID represents a distinct emission source, allowing for fine-grained control over different emission types. For `FixedAmount` allocation, a specific number of tokens is reserved from the grantor's account at contract creation. + +The `targets` field identifies recipients with associated weights, determining how tokens are distributed among multiple targets. For example, with targets A (weight 1) and B (weight 2), target B receives twice the tokens of target A. + +## Distribution Control + +The `distribution` field determines how and when accumulated emissions are distributed: + +```rust +pub enum DistributionControl { + Manual, + Automatic(BalanceOf), + AtBlock(BlockNumberFor), + Interval(BlockNumberFor), +} +``` + +The distribution control mechanism provides flexibility in how emissions flow through the network: + +- `Manual`: The grantee must explicitly call `execute_permission` to trigger distribution +- `Automatic`: Distribution occurs when accumulated amount reaches the specified threshold +- `AtBlock`: Distribution triggers at a specific block number +- `Interval`: Distribution occurs periodically at the specified block interval + +## Permission Duration and Revocation + +Permissions can have different durations: + +```rust +pub enum PermissionDuration { + Blocks(BlockNumberFor), + UntilBlock(BlockNumberFor), + Indefinite, +} +``` + +This allows for temporary delegations (`Blocks`, `UntilBlock`) or permanent ones (`Indefinite`). Expired permissions are automatically removed during the regular block processing. + +Revocation terms define how a permission can be revoked before its normal expiration: + +```rust +pub enum RevocationTerms { + Irrevocable, + RevocableByGrantor, + RevocableByArbiters(BoundedVec), + AfterBlock(BlockNumberFor), +} +``` + +These terms create different security guarantees for the grantee, ranging from complete assurance (`Irrevocable`) to flexible arrangements (`RevocableByGrantor`). The grantee can ALWAYS revoke a permission as it is the one being benefitted. + +## Permission creation + +A new permission is created through the `grant_permission` extrinsic. + +```mermaid +flowchart TD + A["Agent/Grantor"] -- grant_permission --> B["Create Permission"] + B -- validate --> C["Check agent registration"] --> E["Check targets"] --> P{"Check Allocation Type"} + P -- Fixed Amount --> K["Reserve Tokens"] + P -- Streams --> D["Check stream percentages <= 100%"] + B -- Generate ID --> F["Permission Contract"] + F -- store --> G["Permissions Storage"] + F -- index --> J["PermissionsByParticipants"] + F -- index --> I["PermissionsByGrantee"] + F -- index --> H["PermissionsByGrantor"] + B -- emit event --> M["PermissionGranted Event"] + D -- accumulate --> L["AccumulatedStreamAmounts"] +``` + +## Emission Accumulation and Distribution Process + +```mermaid +graph TD + Root[Root stake emissions / network rewards] -- root stream ID -->A + Delegation[Delegated emissions] -- parent stream ID -->A + A[Agent Receives Emissions] -->|do_accumulate_emissions| B[Check Active Permissions] + B -->|For each permission| C{Permission Type?} + C -->|Streams| D[Check streams map for matching stream] + C -->|Fixed Amount| E[Already reserved at creation] + D -->|Extract from imbalance| F[Store in AccumulatedStreamAmounts] + F -->|Wait for trigger| G{Distribution Trigger?} + G -->|Manual| H[Execute Permission called] + G -->|Automatic| I[Threshold reached] + G -->|AtBlock| J[Specific block reached] + G -->|Interval| K[Interval blocks passed] + H --> L[do_distribute_emission] + I --> L + J --> L + K --> L + L -->|Retrieve accumulated amounts for each stream| M[Calculate target amounts] + M -->|for each target| N[Recursive Accumulation] + N --> O[Update last execution] + O --> P[Emit events] +``` + +When an agent receives emissions, the pallet intercepts a portion based on active permission contracts through the `do_accumulate_emissions` function. The accumulated amounts are stored in the `AccumulatedStreamAmounts` storage map until distribution conditions are met. + +The function is designed to be highly efficient, with a storage structure optimized for quick lookup of all permissions associated with a specific (agent, stream) pair: + +```rust +fn do_accumulate_emissions( + agent: &T::AccountId, + stream: &StreamId, + imbalance: &mut >::NegativeImbalance, +) { + // Get all permissions for this agent and stream + let streams = AccumulatedStreamAmounts::::iter_prefix((agent, stream)); + + // Process each permission + for (permission_id, balance) in streams { + // Calculate and accumulate based on stream percentage + // ... + } +} +``` + +During distribution (`do_distribute_emission`), the accumulated amount for each stream is divided among targets according to their weights. The distribution uses the `Currency` trait to handle token movement between accounts. + +Importantly, the recursive accumulation does not happen in the same block to prevent unbounded recursion and excessive computation. Instead, when a target receives their portion, it becomes a regular imbalance that will trigger the standard accumulation process in the next applicable block. + +## Storage Design + +The Permission0 pallet uses several storage maps to track permissions and accumulated amounts: + +```rust +pub type Permissions = StorageMap<_, Identity, PermissionId, PermissionContract>; +pub type PermissionsByParticipants = StorageMap<_, Identity, (T::AccountId, T::AccountId), BoundedVec>; +pub type PermissionsByGrantor = StorageMap<_, Identity, T::AccountId, BoundedVec>; +pub type PermissionsByGrantee = StorageMap<_, Identity, T::AccountId, BoundedVec>; +pub type AccumulatedStreamAmounts = StorageNMap< + _, + ( + NMapKey, + NMapKey, + NMapKey, + ), + BalanceOf, +>; +``` + +This storage design allows efficient lookups for: + +- Finding all permissions between specific parties +- Retrieving all permissions granted by an account +- Retrieving all permissions received by an account +- Tracking accumulated tokens for each permission by stream + +The `AccumulatedStreamAmounts` uses a StorageNMap with a triple key of (AccountId, StreamId, PermissionId). This structure was chosen for performance reasons, as the `do_accumulate_emissions` function is called frequently and needs to quickly find all permissions associated with a specific account and stream combination. The order of the keys prioritizes searching by account and stream first, which is the most common access pattern. + +## Stream-based Emission Model + +The permission system uses a stream-based approach for tracking different sources of emissions: + +```rust +pub type StreamId = H256; +``` + +Each stream is identified by a unique `StreamId`, which represents a specific source of emissions. The system distinguishes between: + +1. **Root Streams**: Generated for each agent using a deterministic function. These are the primary emission streams that agents receive directly. + +```rust +pub fn generate_root_stream_id(agent_id: &AccountId) -> StreamId { + let mut data = ROOT_STREAM_PREFIX.to_vec(); + data.extend(agent_id.encode()); + blake2_256(&data).into() +} +``` + +2. **Derived Streams**: Generated when emissions flow through permissions, allowing for tracking of emission pathways through the network. + +When streams are redelegated through the permission system, their IDs are preserved rather than generating new ones. This crucial design choice allows for easy tracking of the lineage and flow of emissions throughout the network, making it possible to trace the complete path of tokens from their source to final recipients across multiple delegation hops. + +This stream-based model allows for much more granular control over emission delegation, enabling agents to specify different delegation percentages for different types of emission streams they receive. + +## Integration with Emission Distribution + +Permission0 integrates with the `Emission0` pallet by intercepting the emission distribution process. When the linear rewards mechanism distributes tokens, the `do_accumulate_emissions` function is called to divert portions according to active permissions. + +This integration preserves the existing emission calculation logic while adding the delegation layer on top. The approach ensures delegations only affect how already-calculated emissions are distributed, rather than altering the emission calculations themselves. + +## Automatic Processing + +The pallet implements the `on_finalize` hook to handle periodic tasks: + +```rust +fn on_finalize(block_number: BlockNumberFor) { + // Process automatic distributions every 10 blocks + if (block_number % 10).is_zero() { + Self::do_auto_permission_execution(block_number); + } +} +``` + +The `do_auto_permission_execution` function processes all permissions to: + +1. Check for and execute automatic distributions +2. Check for and execute interval-based distributions +3. Check for and execute at-block distributions +4. Remove expired permissions + +This mechanism ensures automatic processes happen regularly without requiring manual intervention. + +## Configuration + +The pallet is customizable through several configuration parameters: + +```rust +type MaxTargetsPerPermission: Get; +type MaxArbitersPerPermission: Get; +``` + +These parameters control storage limits and processing intervals, allowing the network to balance functionality against resource usage. + +## Historical Context + +Permission0 emerged from the need to create more sophisticated economic relationships in the Torus network. The initial concept was described as: + +_"A distributed multi-level search process for new competencies, methods and organizational forms that can serve the respective higher level competitively, such that it can serve the level above better too, cascading upwards each delegation tree."_ + +The implementation allows economic signals (in the form of emissions) to flow through the network according to agent decisions, creating a dynamic feedback mechanism that rewards valuable contributions at all levels. + +A crucial insight was that rational agents will redelegate emissions when doing so increases their own emissions by more than they delegate. This positive-sum logic creates natural incentives for delegation trees to form and adapt over time. + +## Practical Applications + +The permission-based delegation system enables several practical scenarios: + +1. Validators can delegate a percentage of emissions to miners who provide specialized services +2. Module operators can share emissions with agents who contribute to their module +3. Teams can create token distribution trees that align with organizational structures +4. Specialized agents can emerge to discover and connect valuable contributors + +The flexible distribution controls accommodate different time horizons and trust relationships, from immediate rewards to long-term alignments. + +Crucially, the recursive nature of permissions means delegation trees can extend to arbitrary depth, allowing for complex specialization hierarchies to emerge organically. + +## Safety Mechanisms + +By using the `Currency` trait, we are able to use reserves for fixed amount emissions, and negative imbalances to avoid emitting duplicate tokens. This is a core part of safety. + +Additionally, recursive accumulation is designed to prevent infinite loops by deferring lower-level accumulation to subsequent blocks. + +## Future Development + +While the current implementation focuses on emission delegation, the permission framework could extend to other domains like governance rights, data access, or identity verification. The modular design allows new permission scopes to be added without disrupting existing functionality. diff --git a/pallets/emission0/Cargo.toml b/pallets/emission0/Cargo.toml index db36db69..0e83d6d3 100644 --- a/pallets/emission0/Cargo.toml +++ b/pallets/emission0/Cargo.toml @@ -12,12 +12,16 @@ std = [ "codec/std", "polkadot-sdk/std", "scale-info/std", - "pallet-torus0-api/std", "num-traits/std", + "pallet-torus0-api/std", + "pallet-governance-api/std", + "pallet-permission0-api/std", ] runtime-benchmarks = [ "polkadot-sdk/runtime-benchmarks", "pallet-torus0-api/runtime-benchmarks", + "pallet-governance-api/runtime-benchmarks", + "pallet-permission0-api/runtime-benchmarks", ] try-runtime = ["polkadot-sdk/try-runtime"] @@ -32,7 +36,7 @@ num-traits.workspace = true pallet-torus0-api.workspace = true pallet-emission0-api.workspace = true pallet-governance-api.workspace = true - +pallet-permission0-api.workspace = true [dev-dependencies] test-utils.workspace = true diff --git a/pallets/emission0/src/distribute.rs b/pallets/emission0/src/distribute.rs index b91a9599..8bef9c67 100644 --- a/pallets/emission0/src/distribute.rs +++ b/pallets/emission0/src/distribute.rs @@ -1,4 +1,5 @@ use pallet_governance_api::GovernanceApi; +use pallet_permission0_api::Permission0Api; use pallet_torus0_api::Torus0Api; use polkadot_sdk::{ frame_support::{ @@ -318,7 +319,7 @@ fn linear_rewards( let control_fee = ::weight_control_fee(delegating_to); let control_fee = control_fee.mul_floor(dividend.peek()); - let stake = dividend.extract(control_fee); + let mut stake = dividend.extract(control_fee); if let Some(delegated_dividend) = id_to_idx .get(delegating_to) @@ -328,6 +329,12 @@ fn linear_rewards( } else { // This is an impossible case, but if something changes in the future, // the code is here. + ::accumulate_emissions( + delegating_to, + &pallet_permission0_api::generate_root_stream_id(delegating_to), + &mut stake, + ); + let stake_num = stake.peek(); T::Currency::resolve_creating(delegating_to, stake); let _ = ::stake_to(delegating_to, delegating_to, stake_num); @@ -354,7 +361,13 @@ fn linear_rewards( .zip(upscaled_dividends) { let add_stake = - |staker, amount: >::NegativeImbalance| { + |staker, mut amount: >::NegativeImbalance| { + ::accumulate_emissions( + &staker, + &pallet_permission0_api::generate_root_stream_id(&staker), + &mut amount, + ); + let raw_amount = amount.peek(); T::Currency::resolve_creating(&staker, amount); let _ = ::stake_to(&staker, &input.agent_id, raw_amount); diff --git a/pallets/emission0/src/lib.rs b/pallets/emission0/src/lib.rs index d770d88b..a5ad1790 100644 --- a/pallets/emission0/src/lib.rs +++ b/pallets/emission0/src/lib.rs @@ -32,6 +32,7 @@ pub mod pallet { use frame::prelude::BlockNumberFor; use frame_system::ensure_signed; use pallet_governance_api::GovernanceApi; + use pallet_permission0_api::Permission0Api; use pallet_torus0_api::Torus0Api; use polkadot_sdk::sp_std; use weights::WeightInfo; @@ -102,6 +103,14 @@ pub mod pallet { type Governance: GovernanceApi; + type Permission0: Permission0Api< + Self::AccountId, + OriginFor, + BlockNumberFor, + crate::BalanceOf, + >::NegativeImbalance, + >; + type WeightInfo: WeightInfo; } diff --git a/pallets/permission0/Cargo.toml b/pallets/permission0/Cargo.toml new file mode 100644 index 00000000..103f98fd --- /dev/null +++ b/pallets/permission0/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "pallet-permission0" +version = "0.1.0" +description = "Permission contract pallet for Torus network" +authors.workspace = true +edition.workspace = true +license = "MIT-0" + +[features] +default = ["std"] +std = [ + "codec/std", + "polkadot-sdk/std", + "scale-info/std", + "pallet-permission0-api/std", + "pallet-torus0-api/std", + "pallet-emission0-api/std", +] +runtime-benchmarks = [ + "polkadot-sdk/runtime-benchmarks", + "pallet-torus0-api/runtime-benchmarks", + "pallet-emission0-api/runtime-benchmarks", +] +try-runtime = ["polkadot-sdk/try-runtime"] + +[dependencies] +codec = { workspace = true, features = ["derive"] } +scale-info = { workspace = true, features = ["derive"] } +polkadot-sdk = { workspace = true, features = ["experimental", "runtime"] } + +# Local dependencies +pallet-permission0-api = { workspace = true, default-features = false } +pallet-torus0-api = { workspace = true, default-features = false } +pallet-emission0-api = { workspace = true, default-features = false } + +[dev-dependencies] +test-utils.workspace = true diff --git a/pallets/permission0/api/Cargo.toml b/pallets/permission0/api/Cargo.toml new file mode 100644 index 00000000..b1f52d24 --- /dev/null +++ b/pallets/permission0/api/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "pallet-permission0-api" +version = "0.1.0" +description = "API for permission0 pallet" +authors.workspace = true +edition.workspace = true +license = "MIT-0" + +[features] +default = ["std"] +std = [ + "codec/std", + "polkadot-sdk/std", + "scale-info/std", + "pallet-torus0-api/std", +] +runtime-benchmarks = [ + "polkadot-sdk/runtime-benchmarks", + "pallet-torus0-api/runtime-benchmarks", +] +try-runtime = ["polkadot-sdk/try-runtime"] + +[dependencies] +codec = { workspace = true, features = ["derive"] } +scale-info = { workspace = true, features = ["derive"] } +polkadot-sdk = { workspace = true, features = ["experimental", "runtime"] } +pallet-torus0-api = { workspace = true, default-features = false } diff --git a/pallets/permission0/api/src/lib.rs b/pallets/permission0/api/src/lib.rs new file mode 100644 index 00000000..7f8059f9 --- /dev/null +++ b/pallets/permission0/api/src/lib.rs @@ -0,0 +1,116 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode}; +use polkadot_sdk::{ + frame_support::dispatch::DispatchResult, + sp_core::{blake2_256, H256}, + sp_runtime::{DispatchError, Percent}, + sp_std::collections::btree_map::BTreeMap, + sp_std::vec::Vec, +}; +use scale_info::TypeInfo; + +/// Type for permission ID +pub type PermissionId = H256; + +/// Type for stream ID +pub type StreamId = H256; + +/// Static identifier for root emission stream +pub const ROOT_STREAM_PREFIX: &[u8] = b"torus:emission:root"; + +/// Generates the root stream ID for an agent +pub fn generate_root_stream_id(agent_id: &AccountId) -> StreamId { + let mut data = ROOT_STREAM_PREFIX.to_vec(); + data.extend(agent_id.encode()); + blake2_256(&data).into() +} + +/// Generates a derived stream ID based on source stream and permission +pub fn generate_derived_stream_id( + source_stream: &StreamId, + permission_id: &PermissionId, +) -> StreamId { + let mut data = source_stream.encode(); + data.extend(permission_id.encode()); + blake2_256(&data).into() +} + +/// Defines what portion of emissions the permission applies to +#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +pub enum EmissionAllocation { + /// Permission applies to a percentage of all emissions (0-100) + Streams(BTreeMap), + /// Permission applies to a specific fixed amount + FixedAmount(Balance), +} + +/// Distribution control parameters +#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +pub enum DistributionControl { + /// Manual distribution by the grantee + Manual, + /// Automatic distribution after accumulation threshold + Automatic(Balance), + /// Distribution at specific block + AtBlock(BlockNumber), + /// Distribution at fixed intervals + Interval(BlockNumber), +} + +/// Duration of the permission +#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +pub enum PermissionDuration { + /// Permission lasts until a specific block + UntilBlock(BlockNumber), + /// Permission lasts indefinitely + Indefinite, +} + +/// Terms for revocation +#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +pub enum RevocationTerms { + /// Cannot be revoked + Irrevocable, + /// Can be revoked by the grantor at any time + RevocableByGrantor, + /// Can be revoked by third party arbiters + RevocableByArbiters { + accounts: Vec, + required_votes: u32, + }, + /// Time-based revocation + RevocableAfter(BlockNumber), +} + +/// The Permission0 API trait +pub trait Permission0Api { + /// Check if a permission exists + fn permission_exists(id: &PermissionId) -> bool; + + /// Grant a permission for emission delegation + fn grant_emission_permission( + grantor: AccountId, + grantee: AccountId, + allocation: EmissionAllocation, + targets: Vec<(AccountId, u16)>, + distribution: DistributionControl, + duration: PermissionDuration, + revocation: RevocationTerms, + ) -> Result; + + /// Revoke a permission + fn revoke_permission(who: Origin, permission_id: &PermissionId) -> DispatchResult; + + /// Execute a manual distribution for a permission + fn execute_permission(who: Origin, permission_id: &PermissionId) -> DispatchResult; + + /// Accumulate emissions for an agent with permissions + fn accumulate_emissions(agent: &AccountId, stream: &StreamId, amount: &mut NegativeImbalance); + + /// Check and process automatic distributions + fn process_auto_distributions(current_block: BlockNumber); + + /// Get the accumulated amount for a permission + fn get_accumulated_amount(permission_id: &PermissionId, stream: &StreamId) -> Balance; +} diff --git a/pallets/permission0/src/ext.rs b/pallets/permission0/src/ext.rs new file mode 100644 index 00000000..21f09c7b --- /dev/null +++ b/pallets/permission0/src/ext.rs @@ -0,0 +1,329 @@ +use crate::{ + generate_permission_id, get_total_allocated_percentage, pallet, + permission::emission::DistributionReason, update_permission_indices, AccumulatedStreamAmounts, + BalanceOf, Config, DistributionControl, EmissionAllocation, EmissionScope, Error, Event, + Pallet, PermissionContract, PermissionDuration, PermissionId, PermissionScope, Permissions, + RevocationTerms, +}; +use pallet_permission0_api::{ + DistributionControl as ApiDistributionControl, EmissionAllocation as ApiEmissionAllocation, + Permission0Api, PermissionDuration as ApiPermissionDuration, + RevocationTerms as ApiRevocationTerms, StreamId, +}; +use pallet_torus0_api::Torus0Api; +use polkadot_sdk::polkadot_sdk_frame::traits::CheckedAdd; +use polkadot_sdk::{ + frame_support::{ + ensure, + traits::{Currency, Get, ReservableCurrency}, + }, + frame_system::{self, ensure_signed_or_root}, + polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, + sp_runtime::{traits::Zero, DispatchError, DispatchResult, Percent, Vec}, + sp_std::collections::btree_map::BTreeMap, +}; + +/// Implementation of the Permission0Api trait to be used externally +impl + Permission0Api< + T::AccountId, + OriginFor, + BlockNumberFor, + crate::BalanceOf, + >::NegativeImbalance, + > for pallet::Pallet +{ + fn permission_exists(id: &PermissionId) -> bool { + Permissions::::contains_key(id) + } + + fn grant_emission_permission( + grantor: T::AccountId, + grantee: T::AccountId, + allocation: ApiEmissionAllocation>, + targets: Vec<(T::AccountId, u16)>, + distribution: ApiDistributionControl, BlockNumberFor>, + duration: ApiPermissionDuration>, + revocation: ApiRevocationTerms>, + ) -> Result { + let internal_allocation = match allocation { + ApiEmissionAllocation::Streams(streams) => EmissionAllocation::Streams( + streams + .try_into() + .map_err(|_| crate::Error::::TooManyStreams)?, + ), + ApiEmissionAllocation::FixedAmount(amount) => EmissionAllocation::FixedAmount(amount), + }; + + let internal_distribution = match distribution { + ApiDistributionControl::Manual => DistributionControl::Manual, + ApiDistributionControl::Automatic(threshold) => { + DistributionControl::Automatic(threshold) + } + ApiDistributionControl::AtBlock(block) => DistributionControl::AtBlock(block), + ApiDistributionControl::Interval(interval) => DistributionControl::Interval(interval), + }; + + let internal_duration = match duration { + ApiPermissionDuration::UntilBlock(block) => PermissionDuration::UntilBlock(block), + ApiPermissionDuration::Indefinite => PermissionDuration::Indefinite, + }; + + let internal_revocation = match revocation { + ApiRevocationTerms::Irrevocable => RevocationTerms::Irrevocable, + ApiRevocationTerms::RevocableByGrantor => RevocationTerms::RevocableByGrantor, + ApiRevocationTerms::RevocableByArbiters { + accounts, + required_votes, + } => RevocationTerms::RevocableByArbiters { + accounts: accounts + .try_into() + .map_err(|_| crate::Error::::TooManyTargets)?, + required_votes, + }, + ApiRevocationTerms::RevocableAfter(blocks) => RevocationTerms::RevocableAfter(blocks), + }; + + grant_permission_impl::( + grantor, + grantee, + internal_allocation, + targets, + internal_distribution, + internal_duration, + internal_revocation, + None, + ) + } + + fn revoke_permission(who: OriginFor, permission_id: &PermissionId) -> DispatchResult { + revoke_permission_impl::(who, permission_id) + } + + fn execute_permission(who: OriginFor, permission_id: &PermissionId) -> DispatchResult { + execute_permission_impl::(who, permission_id) + } + + fn accumulate_emissions( + agent: &T::AccountId, + stream: &StreamId, + amount: &mut >::NegativeImbalance, + ) { + crate::permission::emission::do_accumulate_emissions::(agent, stream, amount); + } + + fn process_auto_distributions(current_block: BlockNumberFor) { + crate::permission::do_auto_permission_execution::(current_block); + } + + fn get_accumulated_amount( + permission_id: &PermissionId, + stream: &StreamId, + ) -> crate::BalanceOf { + let Some(contract) = Permissions::::get(permission_id) else { + return Zero::zero(); + }; + + crate::AccumulatedStreamAmounts::::get((contract.grantor, stream, permission_id)) + .unwrap_or_default() + } +} + +/// Grant a permission implementation +#[allow(clippy::too_many_arguments)] +pub(crate) fn grant_permission_impl( + grantor: T::AccountId, + grantee: T::AccountId, + allocation: EmissionAllocation, + targets: Vec<(T::AccountId, u16)>, + distribution: DistributionControl, + duration: PermissionDuration, + revocation: RevocationTerms, + parent_id: Option, +) -> Result { + use polkadot_sdk::frame_support::ensure; + + ensure!( + T::Torus::is_agent_registered(&grantor), + Error::::NotRegisteredAgent + ); + ensure!( + T::Torus::is_agent_registered(&grantee), + Error::::NotRegisteredAgent + ); + ensure!(grantor != grantee, Error::::SelfPermissionNotAllowed); + ensure!(!targets.is_empty(), Error::::NoTargetsSpecified); + + for (target, _) in &targets { + ensure!( + T::Torus::is_agent_registered(target), + Error::::NotRegisteredAgent + ); + } + + match &allocation { + EmissionAllocation::Streams(streams) => { + for (stream, percentage) in streams { + ensure!(*percentage <= Percent::one(), Error::::InvalidPercentage); + + let total_allocated = get_total_allocated_percentage::(&grantor, stream); + let new_total_allocated = match total_allocated.checked_add(percentage) { + Some(new_total_allocated) => new_total_allocated, + None => return Err(Error::::TotalAllocationExceeded.into()), + }; + + ensure!( + new_total_allocated <= Percent::one(), + Error::::TotalAllocationExceeded + ); + } + } + EmissionAllocation::FixedAmount(amount) => { + ensure!(*amount > BalanceOf::::zero(), Error::::InvalidAmount); + ensure!( + T::Currency::can_reserve(&grantor, *amount), + Error::::InsufficientBalance + ); + } + } + + match &distribution { + DistributionControl::Automatic(threshold) => { + ensure!( + *threshold >= T::MinAutoDistributionThreshold::get(), + Error::::InvalidThreshold + ); + } + DistributionControl::Interval(interval) => { + ensure!(!interval.is_zero(), Error::::InvalidInterval); + } + _ => {} + } + + // TODO: develop the idea + if let Some(parent) = parent_id { + let parent_contract = + Permissions::::get(parent).ok_or(Error::::ParentPermissionNotFound)?; + + ensure!( + parent_contract.grantee == grantor, + Error::::NotPermissionGrantee + ); + + // Additional validations for parent-child relationship could be added here + } + + let target_map: BTreeMap<_, _> = targets.into_iter().collect(); + let targets = target_map + .try_into() + .map_err(|_| Error::::TooManyTargets)?; + + let emission_scope = EmissionScope { + allocation: allocation.clone(), + distribution, + targets, + }; + + let scope = PermissionScope::Emission(emission_scope); + + let permission_id = generate_permission_id::(&grantor, &grantee, &scope); + + let contract = PermissionContract { + grantor: grantor.clone(), + grantee: grantee.clone(), + scope, + duration, + revocation, + last_execution: None, + execution_count: 0, + parent: parent_id, + created_at: >::block_number(), + }; + + // Reserve funds if fixed amount allocation. We use the Balances API for this. + // This means total issuance is always correct. + match allocation { + EmissionAllocation::FixedAmount(amount) => { + T::Currency::reserve(&grantor, amount)?; + } + EmissionAllocation::Streams(streams) => { + for stream in streams.keys() { + AccumulatedStreamAmounts::::set( + (&grantor, stream, permission_id), + Some(Zero::zero()), + ) + } + } + } + + Permissions::::insert(permission_id, contract); + + update_permission_indices::(&grantor, &grantee, permission_id)?; + + >::deposit_event(Event::PermissionGranted { + grantor, + grantee, + permission_id, + }); + + Ok(permission_id) +} + +/// Revoke a permission implementation +pub(crate) fn revoke_permission_impl( + origin: OriginFor, + permission_id: &PermissionId, +) -> DispatchResult { + let contract = Permissions::::get(permission_id).ok_or(Error::::PermissionNotFound)?; + contract.revoke(origin, *permission_id) +} + +/// Execute a permission implementation +pub(crate) fn execute_permission_impl( + who: OriginFor, + permission_id: &PermissionId, +) -> DispatchResult { + let who = ensure_signed_or_root(who)?; + + let contract = Permissions::::get(permission_id).ok_or(Error::::PermissionNotFound)?; + + let grantor = contract.grantor.clone(); + + ensure!( + who.is_none() || who.as_ref() == Some(&grantor), + Error::::NotPermissionGrantor + ); + + match &contract.scope { + PermissionScope::Emission(emission_scope) => match emission_scope.distribution { + DistributionControl::Manual => { + let accumulated = match &emission_scope.allocation { + EmissionAllocation::Streams(streams) => streams + .keys() + .filter_map(|id| { + AccumulatedStreamAmounts::::get(( + &contract.grantor, + id, + permission_id, + )) + }) + .fold(BalanceOf::::zero(), |acc, e| acc + e), // The Balance AST does not enforce the Sum trait + EmissionAllocation::FixedAmount(amount) => *amount, + }; + + ensure!(!accumulated.is_zero(), Error::::NoAccumulatedAmount); + + crate::permission::emission::do_distribute_emission::( + *permission_id, + &contract, + DistributionReason::Manual, + ); + } + _ => return Err(Error::::InvalidDistributionMethod.into()), + }, + #[allow(unreachable_patterns)] + _ => return Err(Error::::UnsupportedPermissionType.into()), + } + + Ok(()) +} diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs new file mode 100644 index 00000000..b8234b79 --- /dev/null +++ b/pallets/permission0/src/lib.rs @@ -0,0 +1,371 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +pub use pallet::*; + +pub mod weights; +use pallet_permission0_api::StreamId; +pub use weights::*; + +pub mod ext; +pub mod permission; + +use permission::{ + generate_permission_id, DistributionControl, EmissionAllocation, EmissionScope, + PermissionContract, PermissionDuration, PermissionId, PermissionScope, RevocationTerms, +}; +use polkadot_sdk::{ + frame_support::{ + dispatch::DispatchResult, + pallet_prelude::*, + traits::{Currency, Get, ReservableCurrency}, + BoundedVec, + }, + frame_system::{self, pallet_prelude::*}, + polkadot_sdk_frame as frame, + sp_runtime::{traits::Saturating, Percent}, + sp_std::prelude::*, +}; + +#[frame::pallet] +pub mod pallet { + use super::*; + + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + + /// Configure the pallet by specifying the parameters and types on which it depends. + #[pallet::config(with_default)] + pub trait Config: polkadot_sdk::frame_system::Config { + #[pallet::no_default_bounds] + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + + type WeightInfo: WeightInfo; + + type Currency: ReservableCurrency; + + type Torus: pallet_torus0_api::Torus0Api< + Self::AccountId, + >::Balance, + >::NegativeImbalance, + >; + + /// Maximum number of targets per permission. + #[pallet::constant] + #[pallet::no_default_bounds] + type MaxTargetsPerPermission: Get; + + /// Maximum number of delegated streams per permission. + #[pallet::constant] + #[pallet::no_default_bounds] + type MaxStreamsPerPermission: Get; + + /// Minimum threshold for auto-distribution + #[pallet::constant] + #[pallet::no_default_bounds] + type MinAutoDistributionThreshold: Get>; + } + + pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + + pub type AccountIdOf = ::AccountId; + + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] + pub struct Pallet(_); + + /// Active permission contracts - stored by permission ID + #[pallet::storage] + pub type Permissions = StorageMap<_, Identity, PermissionId, PermissionContract>; + + /// Mapping from (grantor, grantee) to permission IDs + #[pallet::storage] + pub type PermissionsByParticipants = StorageMap< + _, + Identity, + (T::AccountId, T::AccountId), + BoundedVec, + >; + + /// Permissions granted by a specific account + #[pallet::storage] + pub type PermissionsByGrantor = + StorageMap<_, Identity, T::AccountId, BoundedVec>; + + /// Permissions received by a specific account + #[pallet::storage] + pub type PermissionsByGrantee = + StorageMap<_, Identity, T::AccountId, BoundedVec>; + + /// Accumulated amounts for each stream + #[pallet::storage] + pub type AccumulatedStreamAmounts = StorageNMap< + _, + ( + NMapKey, + NMapKey, + NMapKey, + ), + BalanceOf, + >; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// Permission granted from grantor to grantee with ID + PermissionGranted { + grantor: T::AccountId, + grantee: T::AccountId, + permission_id: PermissionId, + }, + /// Permission revoked with ID + PermissionRevoked { + grantor: T::AccountId, + grantee: T::AccountId, + revoked_by: Option, + permission_id: PermissionId, + }, + /// Permission executed (manual distribution) with ID + PermissionExecuted { + grantor: T::AccountId, + grantee: T::AccountId, + permission_id: PermissionId, + stream_id: Option, + amount: BalanceOf, + }, + /// Auto-distribution executed + AutoDistributionExecuted { + grantor: T::AccountId, + grantee: T::AccountId, + permission_id: PermissionId, + stream_id: Option, + amount: BalanceOf, + }, + /// Permission expired with ID + PermissionExpired { + grantor: T::AccountId, + grantee: T::AccountId, + permission_id: PermissionId, + }, + } + + #[pallet::error] + pub enum Error { + /// The agent is not registered + NotRegisteredAgent, + /// Permission not found + PermissionNotFound, + /// Self-permission is not allowed + SelfPermissionNotAllowed, + /// Invalid percentage (out of range) + InvalidPercentage, + /// No targets specified + NoTargetsSpecified, + /// Invalid threshold + InvalidThreshold, + /// No accumulated amount + NoAccumulatedAmount, + /// Not authorized to revoke + NotAuthorizedToRevoke, + /// Total allocation exceeded 100% + TotalAllocationExceeded, + /// Not the grantee of the permission + NotPermissionGrantee, + /// Not the grantor of the permission + NotPermissionGrantor, + /// Too many streams + TooManyStreams, + /// Too many targets + TooManyTargets, + /// Failed to insert into storage + StorageError, + /// Invalid amount + InvalidAmount, + /// Insufficient balance for operation + InsufficientBalance, + /// Invalid distribution interval + InvalidInterval, + /// Parent permission not found + ParentPermissionNotFound, + /// Invalid distribution method + InvalidDistributionMethod, + /// Unsupported permission type + UnsupportedPermissionType, + } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_finalize(current_block: BlockNumberFor) { + permission::do_auto_permission_execution::(current_block); + } + } + + #[pallet::call] + impl Pallet { + /// Grant a permission for emission delegation + #[pallet::call_index(0)] + #[pallet::weight(T::WeightInfo::grant_permission())] + #[allow(clippy::too_many_arguments)] + pub fn grant_permission( + origin: OriginFor, + grantee: T::AccountId, + allocation: EmissionAllocation, + targets: Vec<(T::AccountId, u16)>, + distribution: DistributionControl, + duration: PermissionDuration, + revocation: RevocationTerms, + parent_id: Option, + ) -> DispatchResult { + let grantor = ensure_signed(origin)?; + + ext::grant_permission_impl::( + grantor, + grantee, + allocation, + targets, + distribution, + duration, + revocation, + parent_id, + )?; + + Ok(()) + } + + /// Revoke a permission. The caller must met revocation constraints or be a root key. + #[pallet::call_index(1)] + #[pallet::weight(T::WeightInfo::revoke_permission())] + pub fn revoke_permission( + origin: OriginFor, + permission_id: PermissionId, + ) -> DispatchResult { + ext::revoke_permission_impl::(origin, &permission_id) + } + + /// Execute a manual distribution based on permission + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::execute_permission())] + pub fn execute_permission( + origin: OriginFor, + permission_id: PermissionId, + ) -> DispatchResult { + ext::execute_permission_impl::(origin, &permission_id) + } + } +} + +/// Get total allocated percentage for a grantor +fn get_total_allocated_percentage(grantor: &T::AccountId, stream: &StreamId) -> Percent { + AccumulatedStreamAmounts::::iter_key_prefix((grantor, stream)) + .filter_map(Permissions::::get) + .map(|contract| match contract.scope { + PermissionScope::Emission(EmissionScope { + allocation: EmissionAllocation::Streams(streams), + .. + }) => streams.get(stream).copied().unwrap_or_default(), + _ => Percent::zero(), + }) + .fold(Percent::zero(), |acc, percentage| { + acc.saturating_add(percentage) + }) +} + +/// Update storage indices when creating a new permission +fn update_permission_indices( + grantor: &T::AccountId, + grantee: &T::AccountId, + permission_id: PermissionId, +) -> Result<(), DispatchError> { + // Update (grantor, grantee) -> permission_id mapping + PermissionsByParticipants::::try_mutate( + (grantor.clone(), grantee.clone()), + |permissions| -> Result<(), DispatchError> { + match permissions { + Some(ids) => { + ids.try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; + } + None => { + let mut new_ids = + BoundedVec::::default(); + new_ids + .try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; + *permissions = Some(new_ids); + } + } + Ok(()) + }, + )?; + + // Update grantor -> permission_id mapping + PermissionsByGrantor::::try_mutate( + grantor.clone(), + |permissions| -> Result<(), DispatchError> { + match permissions { + Some(ids) => { + ids.try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; + } + None => { + let mut new_ids = + BoundedVec::::default(); + new_ids + .try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; + *permissions = Some(new_ids); + } + } + Ok(()) + }, + )?; + + // Update grantee -> permission_id mapping + PermissionsByGrantee::::try_mutate( + grantee.clone(), + |permissions| -> Result<(), DispatchError> { + match permissions { + Some(ids) => { + ids.try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; + } + None => { + let mut new_ids = + BoundedVec::::default(); + new_ids + .try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; + *permissions = Some(new_ids); + } + } + Ok(()) + }, + )?; + + Ok(()) +} + +/// Remove a permission from storage indices +fn remove_permission_from_indices( + grantor: &T::AccountId, + grantee: &T::AccountId, + permission_id: PermissionId, +) { + PermissionsByParticipants::::mutate((grantor.clone(), grantee.clone()), |permissions| { + if let Some(ids) = permissions { + ids.retain(|id| *id != permission_id); + } + }); + + PermissionsByGrantor::::mutate(grantor, |permissions| { + if let Some(ids) = permissions { + ids.retain(|id| *id != permission_id); + } + }); + + PermissionsByGrantee::::mutate(grantee, |permissions| { + if let Some(ids) = permissions { + ids.retain(|id| *id != permission_id); + } + }); +} diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs new file mode 100644 index 00000000..15c66954 --- /dev/null +++ b/pallets/permission0/src/permission.rs @@ -0,0 +1,207 @@ +use codec::{Decode, Encode, MaxEncodedLen}; +use polkadot_sdk::{ + frame_support::{ + dispatch::DispatchResult, ensure, CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound, + }, + frame_system, + frame_system::ensure_signed_or_root, + polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, + sp_core::{H256, U256}, + sp_runtime::{ + traits::{BlakeTwo256, Hash}, + BoundedBTreeMap, BoundedVec, Percent, + }, + sp_std::vec::Vec, +}; +use scale_info::TypeInfo; + +use crate::{BalanceOf, Config, Error, Event, Pallet, Permissions}; + +pub use emission::{DistributionControl, EmissionAllocation, EmissionScope}; + +pub mod emission; + +/// Type for permission ID +pub type PermissionId = H256; + +/// Generate a unique permission ID by hashing a concat of +/// `grantee | scope | block number` +pub fn generate_permission_id( + grantor: &T::AccountId, + grantee: &T::AccountId, + scope: &PermissionScope, +) -> PermissionId { + let mut data = grantor.encode(); + data.extend(grantee.encode()); + data.extend(scope.encode()); + + data.extend(>::block_number().encode()); + + // Permission type as well in the future. + + BlakeTwo256::hash(&data) +} + +#[derive(Encode, Decode, CloneNoBound, TypeInfo, MaxEncodedLen, DebugNoBound)] +#[scale_info(skip_type_params(T))] +pub struct PermissionContract { + pub grantor: T::AccountId, + pub grantee: T::AccountId, + pub scope: PermissionScope, + pub duration: PermissionDuration, + pub revocation: RevocationTerms, + /// Last execution block + pub last_execution: Option>, + /// Number of times the permission was executed + pub execution_count: u32, + /// Parent permission ID (None for root permissions) + pub parent: Option, + pub created_at: BlockNumberFor, +} + +impl PermissionContract { + pub fn is_expired(&self, current_block: BlockNumberFor) -> bool { + match self.duration { + PermissionDuration::UntilBlock(block) => current_block >= block, + PermissionDuration::Indefinite => false, + } + } + + pub fn revoke(self, origin: OriginFor, permission_id: H256) -> DispatchResult { + // The grantee is also always allowed to revoke the permission. + let who = ensure_signed_or_root(origin)?.filter(|who| who != &self.grantee); + + let grantor = self.grantor.clone(); + let grantee = self.grantee.clone(); + + // `who` will not be present if the origin is a root key + if let Some(who) = &who { + match &self.revocation { + RevocationTerms::RevocableByGrantor => { + ensure!(who == &grantor, Error::::NotAuthorizedToRevoke) + } + RevocationTerms::RevocableByArbiters { accounts, .. } + if accounts.contains(&grantor) => + { + todo!("implement arbiter revocation") // TODO + } + RevocationTerms::RevocableByArbiters { .. } => { + return Err(Error::::NotAuthorizedToRevoke.into()) + } + RevocationTerms::RevocableAfter(block) if who == &grantor => ensure!( + >::block_number() >= *block, + Error::::NotAuthorizedToRevoke + ), + RevocationTerms::RevocableAfter(_) => { + return Err(Error::::NotAuthorizedToRevoke.into()) + } + RevocationTerms::Irrevocable => { + return Err(Error::::NotAuthorizedToRevoke.into()) + } + }; + } + + self.cleanup(permission_id); + + >::deposit_event(Event::PermissionRevoked { + grantor, + grantee, + revoked_by: who, + permission_id, + }); + + Ok(()) + } + + fn cleanup(self, permission_id: H256) { + crate::remove_permission_from_indices::(&self.grantor, &self.grantee, permission_id); + + Permissions::::remove(permission_id); + + match self.scope { + PermissionScope::Emission(emission) => { + emission.cleanup(permission_id, &self.last_execution, &self.grantor) + } + } + } +} + +/// Defines what the permission applies to +#[derive(Encode, Decode, CloneNoBound, TypeInfo, MaxEncodedLen, DebugNoBound)] +#[scale_info(skip_type_params(T))] +pub enum PermissionScope { + Emission(EmissionScope), +} + +#[derive( + Encode, Decode, CloneNoBound, PartialEqNoBound, EqNoBound, TypeInfo, MaxEncodedLen, DebugNoBound, +)] +#[scale_info(skip_type_params(T))] +pub enum PermissionDuration { + /// Permission lasts until a specific block + UntilBlock(BlockNumberFor), + /// Permission lasts indefinitely + Indefinite, +} + +#[derive( + Encode, Decode, CloneNoBound, PartialEqNoBound, EqNoBound, TypeInfo, MaxEncodedLen, DebugNoBound, +)] +#[scale_info(skip_type_params(T))] +pub enum RevocationTerms { + /// Cannot be revoked + Irrevocable, + /// Can be revoked by the grantor at any time + RevocableByGrantor, + /// Can be revoked by third party arbiters + RevocableByArbiters { + accounts: BoundedVec, + required_votes: u32, + }, + /// Time-based revocation + RevocableAfter(BlockNumberFor), +} + +/// Process all auto-distributions and time-based distributions +pub(crate) fn do_auto_permission_execution(current_block: BlockNumberFor) { + // Only check every 10 blocks to reduce computational overhead + if current_block.into() % 10 != U256::zero() { + return; + } + + let permissions: Vec<_> = Permissions::::iter().collect(); + let mut expired = Vec::with_capacity(permissions.len()); + + for (permission_id, contract) in Permissions::::iter() { + #[allow(clippy::single_match)] + match &contract.scope { + PermissionScope::Emission(emission_scope) => { + emission::do_auto_distribution( + emission_scope, + permission_id, + current_block, + &contract, + ); + } + #[allow(unreachable_patterns)] + _ => (), + } + + if contract.is_expired(current_block) { + expired.push((permission_id, contract)); + } + } + + for (permission_id, contract) in expired { + let grantor = contract.grantor.clone(); + let grantee = contract.grantee.clone(); + + contract.cleanup(permission_id); + + >::deposit_event(Event::PermissionExpired { + grantor, + grantee, + permission_id, + }); + } +} diff --git a/pallets/permission0/src/permission/emission.rs b/pallets/permission0/src/permission/emission.rs new file mode 100644 index 00000000..88dea16f --- /dev/null +++ b/pallets/permission0/src/permission/emission.rs @@ -0,0 +1,325 @@ +use polkadot_sdk::{ + frame_support::traits::{ + Currency, ExistenceRequirement, Imbalance, ReservableCurrency, WithdrawReasons, + }, + frame_system, + sp_arithmetic::FixedU128, + sp_runtime::traits::{Saturating, Zero}, +}; + +use crate::{AccumulatedStreamAmounts, Event, Pallet}; + +use super::*; + +/// Type for stream ID +pub type StreamId = H256; + +/// Emission-specific permission scope +#[derive(Encode, Decode, CloneNoBound, PartialEq, TypeInfo, MaxEncodedLen, DebugNoBound)] +#[scale_info(skip_type_params(T))] +pub struct EmissionScope { + /// What portion of emissions this permission applies to + pub allocation: EmissionAllocation, + /// Distribution control parameters + pub distribution: DistributionControl, + /// Targets to receive the emissions with weights + pub targets: BoundedBTreeMap, +} + +impl EmissionScope { + pub(super) fn cleanup( + self, + permission_id: H256, + last_executed: &Option>, + grantor: &T::AccountId, + ) { + match self.allocation { + EmissionAllocation::Streams(streams) => { + for stream in streams.keys() { + AccumulatedStreamAmounts::::remove((grantor, stream, &permission_id)); + } + } + EmissionAllocation::FixedAmount(amount) if last_executed.is_none() => { + T::Currency::unreserve(grantor, amount); + } + _ => {} + } + } +} + +/// Defines what portion of emissions the permission applies to +#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, TypeInfo, MaxEncodedLen, DebugNoBound)] +#[scale_info(skip_type_params(T))] +pub enum EmissionAllocation { + // /// Permission applies to a percentage of all emissions + // Percentage(Percent), + // TODO: fix bound param + Streams(BoundedBTreeMap), + /// Permission applies to a specific fixed amount + FixedAmount(BalanceOf), +} + +#[derive(Encode, Decode, CloneNoBound, PartialEq, TypeInfo, MaxEncodedLen, DebugNoBound)] +#[scale_info(skip_type_params(T))] +pub enum DistributionControl { + /// Manual distribution by the grantor + Manual, + /// Automatic distribution after accumulation threshold + // TODO: block for fixed amount + Automatic(BalanceOf), + /// Distribution at specific block + AtBlock(BlockNumberFor), + /// Distribution at fixed intervals + // TODO: block for fixed amount + Interval(BlockNumberFor), +} + +/// Accumulate emissions for a specific agent, distributes if control is met. +pub(crate) fn do_accumulate_emissions( + agent: &T::AccountId, + stream: &StreamId, + imbalance: &mut >::NegativeImbalance, +) { + let initial_balance = imbalance.peek(); + let total_initial_amount = + FixedU128::from_inner(initial_balance.try_into().unwrap_or_default()); + if total_initial_amount.is_zero() { + return; + } + + let streams = AccumulatedStreamAmounts::::iter_prefix((agent, stream)); + for (permission_id, balance) in streams { + let Some(contract) = Permissions::::get(permission_id) else { + continue; + }; + + // Only process emission permissions with percentage allocations, + // fixed-amount emission reserves balance upfront on permission creation + let PermissionScope::Emission(EmissionScope { + allocation: EmissionAllocation::Streams(streams), + .. + }) = contract.scope + else { + continue; + }; + + let Some(percentage) = streams.get(stream) else { + continue; + }; + + let delegated_amount = percentage.mul_floor(total_initial_amount.into_inner()); + if delegated_amount.is_zero() { + continue; + } + + let delegated_amount = imbalance + .extract(delegated_amount.try_into().unwrap_or_default()) + .peek(); + + AccumulatedStreamAmounts::::set( + (agent, stream, &permission_id), + Some(balance + delegated_amount), + ); + } +} + +#[derive(Clone, Copy, Debug)] +pub(crate) enum DistributionReason { + Automatic, + Manual, +} + +/// Distribute accumulated emissions for a permission +pub(crate) fn do_distribute_emission( + permission_id: PermissionId, + contract: &PermissionContract, + reason: DistributionReason, +) { + #[allow(irrefutable_let_patterns)] + let PermissionScope::Emission(emission_scope) = &contract.scope + else { + return; + }; + + let total_weight = + FixedU128::from_u32(emission_scope.targets.values().map(|w| *w as u32).sum()); + if total_weight.is_zero() { + return; + } + + match &emission_scope.allocation { + EmissionAllocation::Streams(streams) => { + let streams = streams.keys().filter_map(|id| { + let acc = + AccumulatedStreamAmounts::::get((&contract.grantor, id, permission_id))?; + if acc.is_zero() { + None + } else { + // For percentage allocations, mint new tokens + // This is safe because we're only distributing a percentage of + // tokens that were already allocated to emission rewards + Some((id, T::Currency::issue(acc))) + } + }); + + for (stream, mut imbalance) in streams { + do_distribute_to_targets( + &mut imbalance, + permission_id, + contract, + emission_scope, + Some(stream), + total_weight, + reason, + ); + + AccumulatedStreamAmounts::::set( + (&contract.grantor, stream, permission_id), + Some(imbalance.peek()), + ); + } + } + EmissionAllocation::FixedAmount(amount) => { + if contract.last_execution.is_some() { + // The fixed amount was already distributed + return; + } + + // For fixed amount allocations, transfer from reserved funds + let _ = T::Currency::unreserve(&contract.grantor, *amount); + let mut imbalance = T::Currency::withdraw( + &contract.grantor, + *amount, + WithdrawReasons::TRANSFER, + ExistenceRequirement::KeepAlive, + ) + .unwrap_or_else(|_| >::NegativeImbalance::zero()); + + do_distribute_to_targets( + &mut imbalance, + permission_id, + contract, + emission_scope, + None, + total_weight, + reason, + ); + } + } + + Permissions::::mutate(permission_id, |maybe_contract| { + if let Some(c) = maybe_contract { + c.last_execution = Some(>::block_number()); + c.execution_count = c.execution_count.saturating_add(1); + } + }); +} + +fn do_distribute_to_targets( + imbalance: &mut <::Currency as Currency>::NegativeImbalance, + permission_id: PermissionId, + contract: &PermissionContract, + emission_scope: &EmissionScope, + stream: Option<&StreamId>, + total_weight: FixedU128, + reason: DistributionReason, +) { + let initial_balance = imbalance.peek(); + let total_initial_amount = + FixedU128::from_inner(initial_balance.try_into().unwrap_or_default()); + if total_initial_amount.is_zero() { + return; + } + + for (target, weight) in emission_scope.targets.iter() { + let target_weight = FixedU128::from_u32(*weight as u32); + let target_amount = total_initial_amount.saturating_mul(target_weight) / total_weight; + + if target_amount.is_zero() { + continue; + } + + let target_amount = + BalanceOf::::try_from(target_amount.into_inner()).unwrap_or_default(); + let mut imbalance = imbalance.extract(target_amount); + + if let Some(stream) = stream { + // Process recursive accumulation here, only deposit what remains + do_accumulate_emissions::(target, stream, &mut imbalance); + } + + T::Currency::resolve_creating(target, imbalance); + } + + let amount = initial_balance - imbalance.peek(); + if !amount.is_zero() { + >::deposit_event(match reason { + DistributionReason::Automatic => Event::AutoDistributionExecuted { + grantor: contract.grantor.clone(), + grantee: contract.grantee.clone(), + permission_id, + stream_id: None, + amount, + }, + DistributionReason::Manual => Event::PermissionExecuted { + grantor: contract.grantor.clone(), + grantee: contract.grantee.clone(), + permission_id, + stream_id: None, + amount, + }, + }); + } +} + +pub(crate) fn do_auto_distribution( + emission_scope: &EmissionScope, + permission_id: H256, + current_block: BlockNumberFor, + contract: &PermissionContract, +) { + match emission_scope.distribution { + DistributionControl::Automatic(threshold) => { + let accumulated = match &emission_scope.allocation { + EmissionAllocation::Streams(streams) => streams + .keys() + .filter_map(|id| { + AccumulatedStreamAmounts::::get((&contract.grantor, id, permission_id)) + }) + .fold(BalanceOf::::zero(), |acc, e| acc + e), // The Balance AST does not enforce the Sum trait + EmissionAllocation::FixedAmount(amount) => *amount, + }; + + if accumulated >= threshold { + do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); + } + } + + DistributionControl::AtBlock(target_block) if current_block > target_block => { + // As we only verify once every 10 blocks, we have to check if current block + // is GTE to the target block. To avoid, triggering on every block, + // we also verify that the last execution occurred before the target block + // (or haven't occurred at all) + if contract + .last_execution + .is_some_and(|last_execution| last_execution >= target_block) + { + return; + } + + do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); + } + + DistributionControl::Interval(interval) => { + let last_execution = contract.last_execution.unwrap_or(contract.created_at); + if current_block.saturating_sub(last_execution) < interval { + return; + } + + do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); + } + + // Manual distribution doesn't need auto-processing + _ => {} + } +} diff --git a/pallets/permission0/src/weights.rs b/pallets/permission0/src/weights.rs new file mode 100644 index 00000000..c94810ef --- /dev/null +++ b/pallets/permission0/src/weights.rs @@ -0,0 +1,32 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +use polkadot_sdk::frame_support::weights::{constants::RocksDbWeight as DbWeight, Weight}; + +/// Weight functions for pallet_permission0 +pub trait WeightInfo { + fn grant_permission() -> Weight; + fn revoke_permission() -> Weight; + fn execute_permission() -> Weight; +} + +/// Weights for pallet_permission0 using the Substrate node and recommended hardware. +impl WeightInfo for () { + // Default weights - these should be calibrated properly in the future with benchmarking + fn grant_permission() -> Weight { + Weight::from_parts(100_000_000, 0) + .saturating_add(DbWeight::get().reads(5)) + .saturating_add(DbWeight::get().writes(5)) + } + + fn revoke_permission() -> Weight { + Weight::from_parts(75_000_000, 0) + .saturating_add(DbWeight::get().reads(4)) + .saturating_add(DbWeight::get().writes(4)) + } + + fn execute_permission() -> Weight { + Weight::from_parts(150_000_000, 0) + .saturating_add(DbWeight::get().reads(3)) + .saturating_add(DbWeight::get().writes(3)) + } +} diff --git a/pallets/permission0/tests/fixed.rs b/pallets/permission0/tests/fixed.rs new file mode 100644 index 00000000..9fedb0bd --- /dev/null +++ b/pallets/permission0/tests/fixed.rs @@ -0,0 +1,213 @@ +use pallet_permission0_api::Permission0Api; +use polkadot_sdk::frame_support::assert_err; +use test_utils::*; + +#[test] +fn fixed_fails_without_balance() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + assert_err!( + Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + ), + pallet_permission0::Error::::InsufficientBalance + ); + }); +} + +#[test] +fn fixed_creates() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + add_balance(agent_0, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + }); +} + +#[test] +fn fixed_reserves() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + add_balance(agent_0, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert_eq!(Balances::reserved_balance(agent_0), to_nano(10)); + }); +} + +#[test] +fn fixed_manual_executes() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 2; + register_empty_agent(agent_2); + + add_balance(agent_0, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert_ok!(Permission0::execute_permission( + get_origin(agent_0), + permission_id + )); + + assert_eq!(get_balance(agent_1), to_nano(5)); + assert_eq!(get_balance(agent_2), to_nano(5)); + assert_eq!(get_balance(agent_0), 1); + + assert_ok!(Permission0::execute_permission( + get_origin(agent_0), + permission_id + )); + }); +} + +#[test] +fn fixed_manual_executes_only_once() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 2; + register_empty_agent(agent_2); + + add_balance(agent_0, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert_ok!(Permission0::execute_permission( + get_origin(agent_0), + permission_id + )); + + assert_eq!(get_balance(agent_1), to_nano(5)); + assert_eq!(get_balance(agent_2), to_nano(5)); + assert_eq!(get_balance(agent_0), 1); + + assert_ok!(Permission0::execute_permission( + get_origin(agent_0), + permission_id + )); + + assert_eq!(get_balance(agent_1), to_nano(5)); + assert_eq!(get_balance(agent_2), to_nano(5)); + assert_eq!(get_balance(agent_0), 1); + }); +} + +#[test] +fn fixed_at_block_executes() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 2; + register_empty_agent(agent_2); + + add_balance(agent_0, to_nano(10) + 1); + + let _ = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], + pallet_permission0_api::DistributionControl::AtBlock(20), + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + step_block(40); + + assert_eq!(get_balance(agent_1), to_nano(5)); + assert_eq!(get_balance(agent_2), to_nano(5)); + assert_eq!(get_balance(agent_0), 1); + }); +} diff --git a/pallets/permission0/tests/lifetime.rs b/pallets/permission0/tests/lifetime.rs new file mode 100644 index 00000000..b5f1f461 --- /dev/null +++ b/pallets/permission0/tests/lifetime.rs @@ -0,0 +1,156 @@ +use pallet_permission0_api::Permission0Api; +use polkadot_sdk::frame_support::assert_err; +use test_utils::*; + +#[test] +fn manual_cant_execute_when_expires() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 2; + register_empty_agent(agent_2); + + add_balance(agent_0, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::UntilBlock(1), + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + step_block(20); + + assert_err!( + Permission0::execute_permission(get_origin(agent_0), permission_id), + pallet_permission0::Error::::PermissionNotFound + ); + }); +} + +#[test] +fn irrevocable() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 2; + register_empty_agent(agent_2); + + add_balance(agent_0, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + assert_err!( + Permission0::revoke_permission(get_origin(agent_0), permission_id), + pallet_permission0::Error::::NotAuthorizedToRevoke + ); + + assert_err!( + Permission0::revoke_permission(get_origin(agent_2), permission_id), + pallet_permission0::Error::::NotAuthorizedToRevoke + ); + + // should still be revocable by grantee + assert_ok!(Permission0::revoke_permission( + get_origin(agent_1), + permission_id + ),); + }); +} + +#[test] +fn revocable_by_grantor() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 2; + register_empty_agent(agent_2); + + add_balance(agent_0, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableByGrantor, + )); + + assert_err!( + Permission0::revoke_permission(get_origin(agent_2), permission_id), + pallet_permission0::Error::::NotAuthorizedToRevoke + ); + + assert_ok!(Permission0::revoke_permission( + get_origin(agent_0), + permission_id + ),); + }); +} + +#[test] +fn revocable_after_block() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 2; + register_empty_agent(agent_2); + + add_balance(agent_0, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableAfter(1), + )); + + assert_err!( + Permission0::revoke_permission(get_origin(agent_2), permission_id), + pallet_permission0::Error::::NotAuthorizedToRevoke + ); + + step_block(2); + + assert_ok!(Permission0::revoke_permission( + get_origin(agent_0), + permission_id + ),); + }); +} diff --git a/pallets/permission0/tests/stream.rs b/pallets/permission0/tests/stream.rs new file mode 100644 index 00000000..306aabda --- /dev/null +++ b/pallets/permission0/tests/stream.rs @@ -0,0 +1,231 @@ +use std::collections::BTreeMap; + +use pallet_emission0::distribute::get_total_emission_per_block; +use pallet_permission0::AccumulatedStreamAmounts; +use pallet_permission0_api::{generate_root_stream_id, Permission0Api}; +use polkadot_sdk::{ + frame_support::assert_err, + sp_runtime::{BoundedVec, Percent}, +}; +use test_utils::{ + pallet_emission0::{ + ConsensusMember, ConsensusMembers, EmissionRecyclingPercentage, IncentivesRatio, + }, + pallet_governance::TreasuryEmissionFee, + pallet_torus0::{FeeConstraints, MinAllowedStake, MinValidatorStake, StakedBy}, + *, +}; + +#[test] +fn stream_fails_if_overflow() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + add_balance(agent_0, to_nano(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(98)); + + assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(3)); + + assert_err!( + Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + ), + pallet_permission0::Error::::TotalAllocationExceeded + ); + }); +} + +#[test] +fn stream_creates() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + add_balance(agent_0, to_nano(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert!(AccumulatedStreamAmounts::::contains_key(( + &agent_0, + &stream_id, + &permission_id + ))); + }); +} + +#[test] +fn stream_manual_executes() { + new_test_ext().execute_with(|| { + zero_min_burn(); + + EmissionRecyclingPercentage::::set(Percent::zero()); + TreasuryEmissionFee::::set(Percent::zero()); + + let min_stake = MinAllowedStake::::get(); + MinValidatorStake::::set(min_stake); + + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + add_balance(agent_0, to_nano(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_1, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + AccumulatedStreamAmounts::::set( + (agent_0, stream_id, permission_id), + Some(to_nano(10)), + ); + + assert_ok!(Permission0::execute_permission( + get_origin(agent_0), + permission_id + )); + + assert_eq!(get_balance(agent_1), to_nano(10)); + }); +} + +#[test] +fn stream_accumulates_and_executes_at_threshold() { + test_utils::new_test_ext().execute_with(|| { + let ratio = 10; + let (min_validator_stake, _) = set_emissions_params(); + + let incentives_ratio = Percent::from_parts(ratio); + IncentivesRatio::::set(incentives_ratio); + + let val = 0; + let miner = 1; + + let mut member = ConsensusMember::::default(); + member.update_weights(BoundedVec::truncate_from(vec![(miner, 1)])); + + ConsensusMembers::::set(val, Some(member)); + ConsensusMembers::::set(miner, Some(Default::default())); + + add_stake(val, val, min_validator_stake); + add_stake(miner, miner, min_validator_stake); + + let stream_id = generate_root_stream_id(&miner); + + let total_emission = get_total_emission_per_block::() * 100; + let total_incentives = incentives_ratio.mul_floor(total_emission); + let dividends_ratio = Percent::one() - incentives_ratio; + let total_dividends = dividends_ratio.mul_floor(total_emission); + assert_eq!(total_emission, total_incentives + total_dividends); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + miner, + val, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(val, u16::MAX)], + pallet_permission0_api::DistributionControl::Automatic(total_incentives), + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + )); + + step_block(120); + + assert_eq!( + StakedBy::::get(val, val).unwrap_or_default() - min_validator_stake + + get_balance(val) + - min_validator_stake, + total_dividends + total_incentives + ); + assert_eq!( + StakedBy::::get(miner, miner).unwrap_or_default() - min_validator_stake, + 0 + ); + + // Should still exist + assert_eq!( + AccumulatedStreamAmounts::::get((miner, stream_id, permission_id)), + Some(0) + ); + }); +} + +fn set_emissions_params() -> (u128, Percent) { + EmissionRecyclingPercentage::::set(Percent::zero()); + TreasuryEmissionFee::::set(Percent::zero()); + + let weight_control_fee = Percent::from_parts(0); + FeeConstraints::::mutate(|constraints| { + constraints.min_staking_fee = Percent::zero(); + constraints.min_weight_control_fee = weight_control_fee; + }); + + let min_validator_stake = 1; + MinValidatorStake::::set(min_validator_stake); + MinAllowedStake::::set(min_validator_stake); + + (min_validator_stake, weight_control_fee) +} diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 6a547e6b..4ba1f87e 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -19,6 +19,7 @@ std = [ "pallet-torus0/std", "pallet-emission0/std", "pallet-governance/std", + "pallet-permission0/std", # Frontier "fp-evm/std", @@ -36,6 +37,7 @@ runtime-benchmarks = [ "pallet-torus0/runtime-benchmarks", "pallet-emission0/runtime-benchmarks", "pallet-governance/runtime-benchmarks", + "pallet-permission0/runtime-benchmarks", # Frontier "pallet-ethereum/runtime-benchmarks", @@ -46,6 +48,7 @@ try-runtime = [ "pallet-torus0/try-runtime", "pallet-emission0/try-runtime", "pallet-governance/try-runtime", + "pallet-permission0/try-runtime", # Frontier "fp-self-contained/try-runtime", @@ -87,9 +90,11 @@ pallet-evm-precompile-simple.workspace = true pallet-torus0.workspace = true pallet-emission0.workspace = true pallet-governance.workspace = true +pallet-permission0.workspace = true pallet-torus0-api.workspace = true pallet-governance-api.workspace = true +pallet-permission0-api.workspace = true [build-dependencies] diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index 5cf68924..a7c4af18 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -434,5 +434,29 @@ impl pallet_emission0::Config for Runtime { type Governance = Governance; + type Permission0 = Permission0; + type WeightInfo = pallet_emission0::weights::SubstrateWeight; } + +parameter_types! { + pub const MaxTargetsPerPermission: u32 = 100; + pub const MaxStreamsPerPermission: u32 = 100; + pub const MinAutoDistributionThreshold: u128 = as_tors(100); +} + +impl pallet_permission0::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + + type WeightInfo = (); + + type Currency = Balances; + + type Torus = Torus0; + + type MaxTargetsPerPermission = MaxTargetsPerPermission; + + type MaxStreamsPerPermission = MaxStreamsPerPermission; + + type MinAutoDistributionThreshold = MinAutoDistributionThreshold; +} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 8ce37610..e04ed2ab 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -156,6 +156,9 @@ mod runtime { #[runtime::pallet_index(13)] pub type Emission0 = pallet_emission0::Pallet; + + #[runtime::pallet_index(14)] + pub type Permission0 = pallet_permission0::Pallet; } parameter_types! { diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index e722bc9c..bad6f50f 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -16,6 +16,7 @@ polkadot-sdk = { workspace = true, features = [ pallet-governance.workspace = true pallet-torus0.workspace = true pallet-emission0.workspace = true +pallet-permission0.workspace = true pallet-torus0-api.workspace = true pallet-governance-api.workspace = true diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 9d4c41a8..1191d3a6 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -43,6 +43,9 @@ mod runtime { #[runtime::pallet_index(4)] pub type Governance = pallet_governance::Pallet; + + #[runtime::pallet_index(5)] + pub type Permission0 = pallet_permission0::Pallet; } pub type Block = frame_system::mocking::MockBlock; @@ -170,6 +173,8 @@ impl pallet_emission0::Config for Test { type Governance = Governance; type WeightInfo = pallet_emission0::weights::SubstrateWeight; + + type Permission0 = Permission0; } parameter_types! { @@ -213,6 +218,28 @@ impl pallet_governance::Config for Test { type WeightInfo = pallet_governance::weights::SubstrateWeight; } +parameter_types! { + pub const MaxTargetsPerPermission: u32 = 100; + pub const MaxStreamsPerPermission: u32 = 100; + pub const MinAutoDistributionThreshold: u128 = to_nano(100); +} + +impl pallet_permission0::Config for Test { + type RuntimeEvent = RuntimeEvent; + + type WeightInfo = (); + + type Currency = Balances; + + type Torus = Torus0; + + type MaxTargetsPerPermission = MaxTargetsPerPermission; + + type MaxStreamsPerPermission = MaxStreamsPerPermission; + + type MinAutoDistributionThreshold = MinAutoDistributionThreshold; +} + impl pallet_balances::Config for Test { type RuntimeEvent = RuntimeEvent; type AccountStore = System; @@ -318,15 +345,19 @@ pub fn get_origin(key: AccountId) -> RuntimeOrigin { pub fn step_block(count: BlockNumber) { let current = System::block_number(); for block in current..current + count { + Permission0::on_finalize(block); Torus0::on_finalize(block); Emission0::on_finalize(block); Governance::on_finalize(block); System::on_finalize(block); + System::set_block_number(block + 1); - Governance::on_initialize(block + 1); + System::on_initialize(block + 1); + Governance::on_initialize(block + 1); Emission0::on_initialize(block + 1); Torus0::on_initialize(block + 1); + Permission0::on_initialize(block + 1); } } diff --git a/xtask/src/main.rs b/xtask/src/main.rs index db14be53..651b2e90 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -12,7 +12,12 @@ fn main() { flags::XtaskCmd::Run(run) => run::run(run), flags::XtaskCmd::GenerateSpec(cmd) => generate_spec::generate_spec(cmd), flags::XtaskCmd::Coverage(coverage) => { - const PALLETS: [&str; 3] = ["pallet-emission0", "pallet-governance", "pallet-torus0"]; + const PALLETS: &[&str] = &[ + "pallet-emission0", + "pallet-governance", + "pallet-torus0", + "pallet-permission0", + ]; let mut cmd = std::process::Command::new("cargo"); let mut args = vec![ From 3309fa6d81c54318688db13e070be9262ba7799a Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Sun, 6 Apr 2025 12:57:31 -0300 Subject: [PATCH 17/46] feat(permission0): implement revoking by arbiters --- pallets/governance/src/lib.rs | 1 - pallets/permission0/src/ext.rs | 34 +++++++- pallets/permission0/src/lib.rs | 22 ++++++ pallets/permission0/src/permission.rs | 29 +++++-- .../permission0/src/permission/emission.rs | 6 +- pallets/permission0/tests/lifetime.rs | 79 +++++++++++++++++++ runtime/src/configs.rs | 3 + test-utils/src/lib.rs | 3 + 8 files changed, 162 insertions(+), 15 deletions(-) diff --git a/pallets/governance/src/lib.rs b/pallets/governance/src/lib.rs index 39e5959c..36234c4f 100644 --- a/pallets/governance/src/lib.rs +++ b/pallets/governance/src/lib.rs @@ -424,7 +424,6 @@ pub mod pallet { ApplicationExpired(u32), } - // TODO: organize this shit in semantic groups #[pallet::error] pub enum Error { /// The proposal is already finished. Do not retry. diff --git a/pallets/permission0/src/ext.rs b/pallets/permission0/src/ext.rs index 21f09c7b..6baab023 100644 --- a/pallets/permission0/src/ext.rs +++ b/pallets/permission0/src/ext.rs @@ -78,7 +78,7 @@ impl } => RevocationTerms::RevocableByArbiters { accounts: accounts .try_into() - .map_err(|_| crate::Error::::TooManyTargets)?, + .map_err(|_| crate::Error::::TooManyRevokers)?, required_votes, }, ApiRevocationTerms::RevocableAfter(blocks) => RevocationTerms::RevocableAfter(blocks), @@ -184,6 +184,13 @@ pub(crate) fn grant_permission_impl( T::Currency::can_reserve(&grantor, *amount), Error::::InsufficientBalance ); + ensure!( + matches!( + &distribution, + DistributionControl::Manual | DistributionControl::AtBlock(_) + ), + Error::::FixedAmountCanOnlyBeTriggeredOnce + ); } } @@ -197,6 +204,31 @@ pub(crate) fn grant_permission_impl( DistributionControl::Interval(interval) => { ensure!(!interval.is_zero(), Error::::InvalidInterval); } + DistributionControl::AtBlock(block) => { + let current_block = >::block_number(); + ensure!(*block > current_block, Error::::InvalidInterval); + } + _ => {} + } + + match &revocation { + RevocationTerms::RevocableByArbiters { + accounts, + required_votes, + } => { + ensure!(*required_votes > 0, Error::::InvalidNumberOfRevokers); + ensure!(accounts.len() > 0, Error::::InvalidNumberOfRevokers); + + ensure!( + *required_votes as usize <= accounts.len(), + Error::::InvalidNumberOfRevokers + ); + } + RevocationTerms::RevocableAfter(block) => { + let current_block = >::block_number(); + ensure!(*block > current_block, Error::::InvalidInterval); + } + _ => {} } diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs index b8234b79..359f78fa 100644 --- a/pallets/permission0/src/lib.rs +++ b/pallets/permission0/src/lib.rs @@ -59,6 +59,11 @@ pub mod pallet { #[pallet::no_default_bounds] type MaxStreamsPerPermission: Get; + /// Maximum number of revokers. + #[pallet::constant] + #[pallet::no_default_bounds] + type MaxRevokersPerPermission: Get; + /// Minimum threshold for auto-distribution #[pallet::constant] #[pallet::no_default_bounds] @@ -97,6 +102,16 @@ pub mod pallet { pub type PermissionsByGrantee = StorageMap<_, Identity, T::AccountId, BoundedVec>; + /// Revocations in progress and the voters + #[pallet::storage] + pub type RevocationTracking = StorageMap< + _, + Identity, + PermissionId, + BoundedBTreeSet, + ValueQuery, + >; + /// Accumulated amounts for each stream #[pallet::storage] pub type AccumulatedStreamAmounts = StorageNMap< @@ -177,6 +192,8 @@ pub mod pallet { TooManyStreams, /// Too many targets TooManyTargets, + /// Too many revokers + TooManyRevokers, /// Failed to insert into storage StorageError, /// Invalid amount @@ -189,6 +206,11 @@ pub mod pallet { ParentPermissionNotFound, /// Invalid distribution method InvalidDistributionMethod, + /// Revokers and required voters must be at least one, and required voters must + /// be less than the number of revokers + InvalidNumberOfRevokers, + /// Fixed amount emissions can only be triggered once, manually or at a block + FixedAmountCanOnlyBeTriggeredOnce, /// Unsupported permission type UnsupportedPermissionType, } diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index 15c66954..01afdba3 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -3,8 +3,7 @@ use polkadot_sdk::{ frame_support::{ dispatch::DispatchResult, ensure, CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound, }, - frame_system, - frame_system::ensure_signed_or_root, + frame_system::{self, ensure_signed_or_root}, polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, sp_core::{H256, U256}, sp_runtime::{ @@ -15,7 +14,7 @@ use polkadot_sdk::{ }; use scale_info::TypeInfo; -use crate::{BalanceOf, Config, Error, Event, Pallet, Permissions}; +use crate::{BalanceOf, Config, Error, Event, Pallet, Permissions, RevocationTracking}; pub use emission::{DistributionControl, EmissionAllocation, EmissionScope}; @@ -80,10 +79,23 @@ impl PermissionContract { RevocationTerms::RevocableByGrantor => { ensure!(who == &grantor, Error::::NotAuthorizedToRevoke) } - RevocationTerms::RevocableByArbiters { accounts, .. } - if accounts.contains(&grantor) => - { - todo!("implement arbiter revocation") // TODO + RevocationTerms::RevocableByArbiters { + accounts, + required_votes, + } if accounts.contains(who) => { + let votes = RevocationTracking::::get(permission_id) + .into_iter() + .filter(|id| id != who) + .filter(|id| accounts.contains(id)) + .count(); + if votes + 1 < *required_votes as usize { + return RevocationTracking::::mutate(permission_id, |votes| { + votes + .try_insert(who.clone()) + .map_err(|_| Error::::TooManyRevokers)?; + Ok(()) + }); + } } RevocationTerms::RevocableByArbiters { .. } => { return Err(Error::::NotAuthorizedToRevoke.into()) @@ -117,6 +129,7 @@ impl PermissionContract { crate::remove_permission_from_indices::(&self.grantor, &self.grantee, permission_id); Permissions::::remove(permission_id); + RevocationTracking::::remove(permission_id); match self.scope { PermissionScope::Emission(emission) => { @@ -155,7 +168,7 @@ pub enum RevocationTerms { RevocableByGrantor, /// Can be revoked by third party arbiters RevocableByArbiters { - accounts: BoundedVec, + accounts: BoundedVec, required_votes: u32, }, /// Time-based revocation diff --git a/pallets/permission0/src/permission/emission.rs b/pallets/permission0/src/permission/emission.rs index 88dea16f..c6fb75a8 100644 --- a/pallets/permission0/src/permission/emission.rs +++ b/pallets/permission0/src/permission/emission.rs @@ -51,9 +51,7 @@ impl EmissionScope { #[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, TypeInfo, MaxEncodedLen, DebugNoBound)] #[scale_info(skip_type_params(T))] pub enum EmissionAllocation { - // /// Permission applies to a percentage of all emissions - // Percentage(Percent), - // TODO: fix bound param + /// Permission applies to a percentage of each stream Streams(BoundedBTreeMap), /// Permission applies to a specific fixed amount FixedAmount(BalanceOf), @@ -65,12 +63,10 @@ pub enum DistributionControl { /// Manual distribution by the grantor Manual, /// Automatic distribution after accumulation threshold - // TODO: block for fixed amount Automatic(BalanceOf), /// Distribution at specific block AtBlock(BlockNumberFor), /// Distribution at fixed intervals - // TODO: block for fixed amount Interval(BlockNumberFor), } diff --git a/pallets/permission0/tests/lifetime.rs b/pallets/permission0/tests/lifetime.rs index b5f1f461..f804cbd0 100644 --- a/pallets/permission0/tests/lifetime.rs +++ b/pallets/permission0/tests/lifetime.rs @@ -1,3 +1,4 @@ +use pallet_permission0::Error; use pallet_permission0_api::Permission0Api; use polkadot_sdk::frame_support::assert_err; use test_utils::*; @@ -154,3 +155,81 @@ fn revocable_after_block() { ),); }); } + +#[test] +fn revocable_by_arbiters() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + add_balance(agent_0, to_nano(10) + 1); + + let grant_invalid = |accounts: &[AccountId], required_votes| { + Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX / 2)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableByArbiters { + accounts: accounts.to_vec(), + required_votes, + }, + ) + }; + + assert_err!( + grant_invalid(&[], 0), + Error::::InvalidNumberOfRevokers + ); + assert_err!( + grant_invalid(&[0], 0), + Error::::InvalidNumberOfRevokers + ); + assert_err!( + grant_invalid(&[0], 2), + Error::::InvalidNumberOfRevokers + ); + + let arbiters = [2, 3, 4, 5]; + let not_arbiter = 6; + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(agent_1, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableByArbiters { + accounts: arbiters.to_vec(), + required_votes: 2, + }, + )); + + assert_ok!(Permission0::revoke_permission( + get_origin(arbiters[0]), + permission_id + )); + + assert_err!( + Permission0::revoke_permission(get_origin(not_arbiter), permission_id), + pallet_permission0::Error::::NotAuthorizedToRevoke + ); + + assert_ok!(Permission0::revoke_permission( + get_origin(arbiters[1]), + permission_id + )); + + assert_err!( + Permission0::revoke_permission(get_origin(arbiters[2]), permission_id), + Error::::PermissionNotFound + ); + }); +} diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index a7c4af18..a15fd917 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -442,6 +442,7 @@ impl pallet_emission0::Config for Runtime { parameter_types! { pub const MaxTargetsPerPermission: u32 = 100; pub const MaxStreamsPerPermission: u32 = 100; + pub const MaxRevokersPerPermission: u32 = 10; pub const MinAutoDistributionThreshold: u128 = as_tors(100); } @@ -458,5 +459,7 @@ impl pallet_permission0::Config for Runtime { type MaxStreamsPerPermission = MaxStreamsPerPermission; + type MaxRevokersPerPermission = MaxRevokersPerPermission; + type MinAutoDistributionThreshold = MinAutoDistributionThreshold; } diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 1191d3a6..18368fe0 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -221,6 +221,7 @@ impl pallet_governance::Config for Test { parameter_types! { pub const MaxTargetsPerPermission: u32 = 100; pub const MaxStreamsPerPermission: u32 = 100; + pub const MaxRevokersPerPermission: u32 = 10; pub const MinAutoDistributionThreshold: u128 = to_nano(100); } @@ -237,6 +238,8 @@ impl pallet_permission0::Config for Test { type MaxStreamsPerPermission = MaxStreamsPerPermission; + type MaxRevokersPerPermission = MaxRevokersPerPermission; + type MinAutoDistributionThreshold = MinAutoDistributionThreshold; } From 44f90b8bcac29d41705d8a915a266d1ba021ff46 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 7 Apr 2025 18:00:35 -0300 Subject: [PATCH 18/46] feat(permission0): implement multi-sig controllers --- pallets/permission0/api/src/lib.rs | 14 + pallets/permission0/src/ext.rs | 228 ++++++++- pallets/permission0/src/lib.rs | 138 +++++- pallets/permission0/src/permission.rs | 46 +- .../permission0/src/permission/emission.rs | 7 + pallets/permission0/tests/enforcement.rs | 454 ++++++++++++++++++ pallets/permission0/tests/fixed.rs | 6 + pallets/permission0/tests/lifetime.rs | 6 + pallets/permission0/tests/stream.rs | 5 + runtime/src/configs.rs | 3 + test-utils/src/lib.rs | 3 + 11 files changed, 896 insertions(+), 14 deletions(-) create mode 100644 pallets/permission0/tests/enforcement.rs diff --git a/pallets/permission0/api/src/lib.rs b/pallets/permission0/api/src/lib.rs index 7f8059f9..10c70fd2 100644 --- a/pallets/permission0/api/src/lib.rs +++ b/pallets/permission0/api/src/lib.rs @@ -83,12 +83,25 @@ pub enum RevocationTerms { RevocableAfter(BlockNumber), } +/// Types of enforcement actions that can be voted on +#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +pub enum EnforcementAuthority { + /// No special enforcement (standard permission execution) + None, + /// Permission can be toggled active/inactive by controllers + ControlledBy { + controllers: Vec, + required_votes: u32, + }, +} + /// The Permission0 API trait pub trait Permission0Api { /// Check if a permission exists fn permission_exists(id: &PermissionId) -> bool; /// Grant a permission for emission delegation + #[allow(clippy::too_many_arguments)] fn grant_emission_permission( grantor: AccountId, grantee: AccountId, @@ -97,6 +110,7 @@ pub trait Permission0Api, duration: PermissionDuration, revocation: RevocationTerms, + enforcement: EnforcementAuthority, ) -> Result; /// Revoke a permission diff --git a/pallets/permission0/src/ext.rs b/pallets/permission0/src/ext.rs index 6baab023..5a3e67fb 100644 --- a/pallets/permission0/src/ext.rs +++ b/pallets/permission0/src/ext.rs @@ -1,14 +1,15 @@ +use crate::permission::EnforcementReferendum; use crate::{ generate_permission_id, get_total_allocated_percentage, pallet, permission::emission::DistributionReason, update_permission_indices, AccumulatedStreamAmounts, - BalanceOf, Config, DistributionControl, EmissionAllocation, EmissionScope, Error, Event, - Pallet, PermissionContract, PermissionDuration, PermissionId, PermissionScope, Permissions, - RevocationTerms, + BalanceOf, Config, DistributionControl, EmissionAllocation, EmissionScope, + EnforcementAuthority, EnforcementTracking, Error, Event, Pallet, PermissionContract, + PermissionDuration, PermissionId, PermissionScope, Permissions, RevocationTerms, }; use pallet_permission0_api::{ DistributionControl as ApiDistributionControl, EmissionAllocation as ApiEmissionAllocation, - Permission0Api, PermissionDuration as ApiPermissionDuration, - RevocationTerms as ApiRevocationTerms, StreamId, + EnforcementAuthority as ApiEnforcementAuthority, Permission0Api, + PermissionDuration as ApiPermissionDuration, RevocationTerms as ApiRevocationTerms, StreamId, }; use pallet_torus0_api::Torus0Api; use polkadot_sdk::polkadot_sdk_frame::traits::CheckedAdd; @@ -45,6 +46,7 @@ impl distribution: ApiDistributionControl, BlockNumberFor>, duration: ApiPermissionDuration>, revocation: ApiRevocationTerms>, + enforcement: ApiEnforcementAuthority, ) -> Result { let internal_allocation = match allocation { ApiEmissionAllocation::Streams(streams) => EmissionAllocation::Streams( @@ -84,6 +86,19 @@ impl ApiRevocationTerms::RevocableAfter(blocks) => RevocationTerms::RevocableAfter(blocks), }; + let internal_enforcement = match enforcement { + ApiEnforcementAuthority::None => EnforcementAuthority::None, + ApiEnforcementAuthority::ControlledBy { + controllers, + required_votes, + } => EnforcementAuthority::ControlledBy { + controllers: controllers + .try_into() + .map_err(|_| crate::Error::::TooManyControllers)?, + required_votes, + }, + }; + grant_permission_impl::( grantor, grantee, @@ -92,7 +107,8 @@ impl internal_distribution, internal_duration, internal_revocation, - None, + internal_enforcement, + None, // No parent by default ) } @@ -139,6 +155,7 @@ pub(crate) fn grant_permission_impl( distribution: DistributionControl, duration: PermissionDuration, revocation: RevocationTerms, + enforcement: EnforcementAuthority, parent_id: Option, ) -> Result { use polkadot_sdk::frame_support::ensure; @@ -217,7 +234,7 @@ pub(crate) fn grant_permission_impl( required_votes, } => { ensure!(*required_votes > 0, Error::::InvalidNumberOfRevokers); - ensure!(accounts.len() > 0, Error::::InvalidNumberOfRevokers); + ensure!(!accounts.is_empty(), Error::::InvalidNumberOfRevokers); ensure!( *required_votes as usize <= accounts.len(), @@ -232,6 +249,25 @@ pub(crate) fn grant_permission_impl( _ => {} } + match &enforcement { + EnforcementAuthority::None => {} + EnforcementAuthority::ControlledBy { + controllers, + required_votes, + } => { + ensure!(*required_votes > 0, Error::::InvalidNumberOfControllers); + ensure!( + !controllers.is_empty(), + Error::::InvalidNumberOfControllers + ); + + ensure!( + *required_votes as usize <= controllers.len(), + Error::::InvalidNumberOfControllers + ); + } + } + // TODO: develop the idea if let Some(parent) = parent_id { let parent_contract = @@ -254,6 +290,7 @@ pub(crate) fn grant_permission_impl( allocation: allocation.clone(), distribution, targets, + accumulating: true, // Start with accumulation enabled by default }; let scope = PermissionScope::Emission(emission_scope); @@ -266,6 +303,7 @@ pub(crate) fn grant_permission_impl( scope, duration, revocation, + enforcement, last_execution: None, execution_count: 0, parent: parent_id, @@ -329,6 +367,11 @@ pub(crate) fn execute_permission_impl( match &contract.scope { PermissionScope::Emission(emission_scope) => match emission_scope.distribution { DistributionControl::Manual => { + ensure!( + emission_scope.accumulating, + Error::::UnsupportedPermissionType + ); + let accumulated = match &emission_scope.allocation { EmissionAllocation::Streams(streams) => streams .keys() @@ -359,3 +402,174 @@ pub(crate) fn execute_permission_impl( Ok(()) } + +/// Toggle a permission's accumulation state +pub fn toggle_permission_accumulation_impl( + origin: OriginFor, + permission_id: PermissionId, + accumulating: bool, +) -> DispatchResult { + let who = ensure_signed_or_root(origin)?; + + let mut contract = + Permissions::::get(permission_id).ok_or(Error::::PermissionNotFound)?; + + if let Some(who) = &who { + match &contract.enforcement { + _ if who == &contract.grantor => {} + EnforcementAuthority::None => { + return Err(Error::::NotAuthorizedToToggle.into()); + } + EnforcementAuthority::ControlledBy { + controllers, + required_votes, + } => { + ensure!(controllers.contains(who), Error::::NotAuthorizedToToggle); + + let referendum = EnforcementReferendum::EmissionAccumulation(accumulating); + let votes = EnforcementTracking::::get(permission_id, &referendum) + .into_iter() + .filter(|id| id != who) + .filter(|id| controllers.contains(id)) + .count(); + + if votes + 1 < *required_votes as usize { + return EnforcementTracking::::mutate( + permission_id, + referendum.clone(), + |votes| { + votes + .try_insert(who.clone()) + .map_err(|_| Error::::TooManyControllers)?; + + >::deposit_event(Event::EnforcementVoteCast { + permission_id, + voter: who.clone(), + referendum, + }); + + Ok(()) + }, + ); + } + } + } + } + + match &mut contract.scope { + PermissionScope::Emission(emission_scope) => emission_scope.accumulating = accumulating, + } + + Permissions::::insert(permission_id, contract); + + // Clear any votes for this referendum + EnforcementTracking::::remove( + permission_id, + EnforcementReferendum::EmissionAccumulation(accumulating), + ); + + >::deposit_event(Event::PermissionAccumulationToggled { + permission_id, + accumulating, + toggled_by: who, + }); + + Ok(()) +} + +/// Execute a permission through enforcement authority +pub fn enforcement_execute_permission_impl( + origin: OriginFor, + permission_id: PermissionId, +) -> DispatchResult { + let who = ensure_signed_or_root(origin)?; + + let contract = Permissions::::get(permission_id).ok_or(Error::::PermissionNotFound)?; + + // If not root, check enforcement authority + if let Some(who) = &who { + match &contract.enforcement { + EnforcementAuthority::None => { + return Err(Error::::NotAuthorizedToToggle.into()); + } + EnforcementAuthority::ControlledBy { + controllers, + required_votes, + } => { + ensure!(controllers.contains(who), Error::::NotAuthorizedToToggle); + + let referendum = EnforcementReferendum::Execution; + let votes = EnforcementTracking::::get(permission_id, &referendum) + .into_iter() + .filter(|id| id != who) + .filter(|id| controllers.contains(id)) + .count(); + + if votes + 1 < *required_votes as usize { + return EnforcementTracking::::mutate( + permission_id, + referendum.clone(), + |votes| { + votes + .try_insert(who.clone()) + .map_err(|_| Error::::TooManyControllers)?; + + >::deposit_event(Event::EnforcementVoteCast { + permission_id, + voter: who.clone(), + referendum, + }); + + Ok(()) + }, + ); + } + } + } + } + + match &contract.scope { + PermissionScope::Emission(emission_scope) => { + ensure!( + emission_scope.accumulating, + Error::::UnsupportedPermissionType + ); + + match emission_scope.distribution { + DistributionControl::Manual => { + let accumulated = match &emission_scope.allocation { + EmissionAllocation::Streams(streams) => streams + .keys() + .filter_map(|id| { + AccumulatedStreamAmounts::::get(( + &contract.grantor, + id, + permission_id, + )) + }) + .fold(BalanceOf::::zero(), |acc, e| acc + e), + EmissionAllocation::FixedAmount(amount) => *amount, + }; + + ensure!(!accumulated.is_zero(), Error::::NoAccumulatedAmount); + + crate::permission::emission::do_distribute_emission::( + permission_id, + &contract, + DistributionReason::Manual, + ); + } + _ => return Err(Error::::InvalidDistributionMethod.into()), + } + } + } + + EnforcementTracking::::remove(permission_id, EnforcementReferendum::Execution); + + >::deposit_event(Event::PermissionEnforcementExecuted { + permission_id, + executed_by: who, + }); + + Ok(()) +} diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs index 359f78fa..e83074cf 100644 --- a/pallets/permission0/src/lib.rs +++ b/pallets/permission0/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(not(feature = "std"), no_std)] +#![allow(clippy::too_many_arguments)] pub use pallet::*; @@ -9,10 +10,12 @@ pub use weights::*; pub mod ext; pub mod permission; -use permission::{ +pub use permission::{ generate_permission_id, DistributionControl, EmissionAllocation, EmissionScope, - PermissionContract, PermissionDuration, PermissionId, PermissionScope, RevocationTerms, + EnforcementAuthority, EnforcementReferendum, PermissionContract, PermissionDuration, + PermissionId, PermissionScope, RevocationTerms, }; + use polkadot_sdk::{ frame_support::{ dispatch::DispatchResult, @@ -64,6 +67,11 @@ pub mod pallet { #[pallet::no_default_bounds] type MaxRevokersPerPermission: Get; + /// Maximum number of controllers per permission. + #[pallet::constant] + #[pallet::no_default_bounds] + type MaxControllersPerPermission: Get; + /// Minimum threshold for auto-distribution #[pallet::constant] #[pallet::no_default_bounds] @@ -112,6 +120,18 @@ pub mod pallet { ValueQuery, >; + /// Enforcement votes in progress and the voters + #[pallet::storage] + pub type EnforcementTracking = StorageDoubleMap< + _, + Identity, + PermissionId, + Identity, + EnforcementReferendum, + BoundedBTreeSet, + ValueQuery, + >; + /// Accumulated amounts for each stream #[pallet::storage] pub type AccumulatedStreamAmounts = StorageNMap< @@ -162,6 +182,29 @@ pub mod pallet { grantee: T::AccountId, permission_id: PermissionId, }, + /// Permission accumulation state toggled + PermissionAccumulationToggled { + permission_id: PermissionId, + accumulating: bool, + toggled_by: Option, + }, + /// Permission was executed by enforcement authority + PermissionEnforcementExecuted { + permission_id: PermissionId, + executed_by: Option, + }, + /// Vote for enforcement action + EnforcementVoteCast { + permission_id: PermissionId, + voter: T::AccountId, + referendum: EnforcementReferendum, + }, + /// Enforcement authority set for permission + EnforcementAuthoritySet { + permission_id: PermissionId, + controllers_count: u32, + required_votes: u32, + }, } #[pallet::error] @@ -213,6 +256,12 @@ pub mod pallet { FixedAmountCanOnlyBeTriggeredOnce, /// Unsupported permission type UnsupportedPermissionType, + /// Not authorized to toggle permission state + NotAuthorizedToToggle, + /// Too many controllers + TooManyControllers, + /// Invalid number of controllers or required votes + InvalidNumberOfControllers, } #[pallet::hooks] @@ -227,7 +276,6 @@ pub mod pallet { /// Grant a permission for emission delegation #[pallet::call_index(0)] #[pallet::weight(T::WeightInfo::grant_permission())] - #[allow(clippy::too_many_arguments)] pub fn grant_permission( origin: OriginFor, grantee: T::AccountId, @@ -236,7 +284,7 @@ pub mod pallet { distribution: DistributionControl, duration: PermissionDuration, revocation: RevocationTerms, - parent_id: Option, + enforcement: EnforcementAuthority, ) -> DispatchResult { let grantor = ensure_signed(origin)?; @@ -248,7 +296,8 @@ pub mod pallet { distribution, duration, revocation, - parent_id, + enforcement, + None, )?; Ok(()) @@ -273,6 +322,85 @@ pub mod pallet { ) -> DispatchResult { ext::execute_permission_impl::(origin, &permission_id) } + + /// Toggle a permission's accumulation state (enabled/disabled) + /// The caller must be authorized as a controller or be the root key + #[pallet::call_index(3)] + #[pallet::weight(T::WeightInfo::execute_permission())] // Reuse weight for now + pub fn toggle_permission_accumulation( + origin: OriginFor, + permission_id: PermissionId, + accumulating: bool, + ) -> DispatchResult { + ext::toggle_permission_accumulation_impl::(origin, permission_id, accumulating) + } + + /// Execute a permission through enforcement authority + /// The caller must be authorized as a controller or be the root key + #[pallet::call_index(4)] + #[pallet::weight(T::WeightInfo::execute_permission())] // Reuse weight for now + pub fn enforcement_execute_permission( + origin: OriginFor, + permission_id: PermissionId, + ) -> DispatchResult { + ext::enforcement_execute_permission_impl::(origin, permission_id) + } + + /// Set enforcement authority for a permission + /// Only the grantor or root can set enforcement authority + #[pallet::call_index(5)] + #[pallet::weight(T::WeightInfo::execute_permission())] // Reuse weight for now + pub fn set_enforcement_authority( + origin: OriginFor, + permission_id: PermissionId, + controllers: Vec, + required_votes: u32, + ) -> DispatchResult { + let who = ensure_signed_or_root(origin)?; + + let mut contract = + Permissions::::get(permission_id).ok_or(Error::::PermissionNotFound)?; + + // Only grantor or root can set enforcement authority + if let Some(who) = &who { + ensure!(who == &contract.grantor, Error::::NotPermissionGrantor); + } + + ensure!( + !controllers.is_empty(), + Error::::InvalidNumberOfControllers + ); + ensure!(required_votes > 0, Error::::InvalidNumberOfControllers); + ensure!( + required_votes as usize <= controllers.len(), + Error::::InvalidNumberOfControllers + ); + + let controllers = controllers + .try_into() + .map_err(|_| Error::::TooManyControllers)?; + + contract.enforcement = EnforcementAuthority::ControlledBy { + controllers, + required_votes, + }; + + Permissions::::insert(permission_id, contract.clone()); + + if let EnforcementAuthority::ControlledBy { + controllers, + required_votes, + } = &contract.enforcement + { + >::deposit_event(Event::EnforcementAuthoritySet { + permission_id, + controllers_count: controllers.len() as u32, + required_votes: *required_votes, + }); + } + + Ok(()) + } } } diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index 01afdba3..85daaf6d 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -1,7 +1,8 @@ use codec::{Decode, Encode, MaxEncodedLen}; use polkadot_sdk::{ frame_support::{ - dispatch::DispatchResult, ensure, CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound, + dispatch::DispatchResult, ensure, CloneNoBound, DebugNoBound, DefaultNoBound, EqNoBound, + PartialEqNoBound, }, frame_system::{self, ensure_signed_or_root}, polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, @@ -14,7 +15,9 @@ use polkadot_sdk::{ }; use scale_info::TypeInfo; -use crate::{BalanceOf, Config, Error, Event, Pallet, Permissions, RevocationTracking}; +use crate::{ + BalanceOf, Config, EnforcementTracking, Error, Event, Pallet, Permissions, RevocationTracking, +}; pub use emission::{DistributionControl, EmissionAllocation, EmissionScope}; @@ -49,6 +52,8 @@ pub struct PermissionContract { pub scope: PermissionScope, pub duration: PermissionDuration, pub revocation: RevocationTerms, + /// Enforcement authority that can toggle the permission + pub enforcement: EnforcementAuthority, /// Last execution block pub last_execution: Option>, /// Number of times the permission was executed @@ -130,6 +135,7 @@ impl PermissionContract { Permissions::::remove(permission_id); RevocationTracking::::remove(permission_id); + let _ = EnforcementTracking::::clear_prefix(permission_id, u32::MAX, None); match self.scope { PermissionScope::Emission(emission) => { @@ -175,6 +181,42 @@ pub enum RevocationTerms { RevocableAfter(BlockNumberFor), } +/// Types of enforcement actions that can be voted on +#[derive( + Encode, Decode, CloneNoBound, PartialEqNoBound, EqNoBound, TypeInfo, MaxEncodedLen, DebugNoBound, +)] +#[scale_info(skip_type_params(T))] +pub enum EnforcementReferendum { + /// Toggle emission accumulation state + EmissionAccumulation(bool), + /// Execute the permission + Execution, +} + +/// Defines how a permission's enforcement is controlled +#[derive( + Encode, + Decode, + CloneNoBound, + PartialEqNoBound, + EqNoBound, + TypeInfo, + MaxEncodedLen, + DebugNoBound, + DefaultNoBound, +)] +#[scale_info(skip_type_params(T))] +pub enum EnforcementAuthority { + /// No special enforcement (standard permission execution) + #[default] + None, + /// Permission can be toggled active/inactive by controllers + ControlledBy { + controllers: BoundedVec, + required_votes: u32, + }, +} + /// Process all auto-distributions and time-based distributions pub(crate) fn do_auto_permission_execution(current_block: BlockNumberFor) { // Only check every 10 blocks to reduce computational overhead diff --git a/pallets/permission0/src/permission/emission.rs b/pallets/permission0/src/permission/emission.rs index c6fb75a8..a948171b 100644 --- a/pallets/permission0/src/permission/emission.rs +++ b/pallets/permission0/src/permission/emission.rs @@ -24,6 +24,8 @@ pub struct EmissionScope { pub distribution: DistributionControl, /// Targets to receive the emissions with weights pub targets: BoundedBTreeMap, + /// Whether emissions should accumulate (can be toggled by enforcement authority) + pub accumulating: bool, } impl EmissionScope { @@ -93,12 +95,17 @@ pub(crate) fn do_accumulate_emissions( // fixed-amount emission reserves balance upfront on permission creation let PermissionScope::Emission(EmissionScope { allocation: EmissionAllocation::Streams(streams), + accumulating, .. }) = contract.scope else { continue; }; + if !accumulating { + continue; + } + let Some(percentage) = streams.get(stream) else { continue; }; diff --git a/pallets/permission0/tests/enforcement.rs b/pallets/permission0/tests/enforcement.rs new file mode 100644 index 00000000..c492ddb3 --- /dev/null +++ b/pallets/permission0/tests/enforcement.rs @@ -0,0 +1,454 @@ +use std::collections::BTreeMap; + +use pallet_permission0::permission::emission::StreamId; +use pallet_permission0::EnforcementReferendum; +use pallet_permission0_api::{generate_root_stream_id, Permission0Api}; +use polkadot_sdk::frame_support::{assert_err, traits::Currency}; +use polkadot_sdk::sp_runtime::Percent; +use test_utils::{assert_ok, *}; + +fn stream_percentages(agent: AccountId, percentage: u8) -> BTreeMap { + BTreeMap::from([( + generate_root_stream_id(&agent), + Percent::from_percent(percentage), + )]) +} + +fn distribute_emission(agent: AccountId, amount: Balance) { + let stream_id = generate_root_stream_id(&agent); + let mut imbalance = Balances::issue(amount); + Permission0::accumulate_emissions(&agent, &stream_id, &mut imbalance); +} + +#[test] +fn set_enforcement_authority_by_grantor() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let grantor = 0; + let grantee = 1; + let controller = 2; + + register_empty_agent(grantor); + register_empty_agent(grantee); + register_empty_agent(controller); + + add_balance(grantor, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + grantor, + grantee, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(grantee, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, + )); + + assert_err!( + pallet_permission0::Pallet::::set_enforcement_authority( + get_origin(grantee), + permission_id, + vec![controller], + 1, + ), + pallet_permission0::Error::::NotPermissionGrantor + ); + + assert_err!( + pallet_permission0::Pallet::::set_enforcement_authority( + get_origin(controller), + permission_id, + vec![controller], + 1, + ), + pallet_permission0::Error::::NotPermissionGrantor + ); + + assert_ok!( + pallet_permission0::Pallet::::set_enforcement_authority( + get_origin(grantor), + permission_id, + vec![controller], + 1, + ) + ); + + let contract = pallet_permission0::Permissions::::get(permission_id).unwrap(); + + match contract.enforcement { + pallet_permission0::EnforcementAuthority::ControlledBy { + controllers, + required_votes, + } => { + assert_eq!(controllers.len(), 1); + assert_eq!(controllers[0], controller); + assert_eq!(required_votes, 1); + } + _ => panic!("Enforcement authority not set correctly"), + } + }); +} + +#[test] +fn toggle_accumulation_by_controller() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let grantor = 0; + let grantee = 1; + let controller = 2; + + register_empty_agent(grantor); + register_empty_agent(grantee); + register_empty_agent(controller); + + add_balance(grantor, to_nano(100) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + grantor, + grantee, + pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), + vec![(grantee, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::ControlledBy { + controllers: vec![controller], + required_votes: 1 + }, + )); + + distribute_emission(grantor, to_nano(10)); + + assert_ok!( + pallet_permission0::Pallet::::toggle_permission_accumulation( + get_origin(controller), + permission_id, + false, + ) + ); + + let contract = pallet_permission0::Permissions::::get(permission_id).unwrap(); + match contract.scope { + pallet_permission0::PermissionScope::Emission(emission_scope) => { + assert!(!emission_scope.accumulating); + } + } + + let balance_before = get_balance(grantee); + distribute_emission(grantor, to_nano(10)); + + assert_eq!(get_balance(grantee), balance_before); + + assert_ok!( + pallet_permission0::Pallet::::toggle_permission_accumulation( + get_origin(controller), + permission_id, + true, + ) + ); + + distribute_emission(grantor, to_nano(10)); + + assert_ok!(pallet_permission0::Pallet::::execute_permission( + get_origin(grantor), + permission_id, + )); + + assert!(get_balance(grantee) > balance_before); + }); +} + +#[test] +fn unauthorized_account_cannot_toggle() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let grantor = 0; + let grantee = 1; + let controller = 2; + let unauthorized = 3; + + register_empty_agent(grantor); + register_empty_agent(grantee); + register_empty_agent(controller); + register_empty_agent(unauthorized); + + add_balance(grantor, to_nano(10) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + grantor, + grantee, + pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + vec![(grantee, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::ControlledBy { + controllers: vec![controller], + required_votes: 1 + }, + )); + + assert_err!( + pallet_permission0::Pallet::::toggle_permission_accumulation( + get_origin(unauthorized), + permission_id, + false, + ), + pallet_permission0::Error::::NotAuthorizedToToggle + ); + + assert_ok!( + pallet_permission0::Pallet::::toggle_permission_accumulation( + get_origin(grantor), + permission_id, + false, + ), + ); + }); +} + +#[test] +fn enforcement_execute_permission() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let grantor = 0; + let grantee = 1; + let controller = 2; + + register_empty_agent(grantor); + register_empty_agent(grantee); + register_empty_agent(controller); + + add_balance(grantor, to_nano(100) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + grantor, + grantee, + pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), + vec![(grantee, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::ControlledBy { + controllers: vec![controller], + required_votes: 1 + }, + )); + + distribute_emission(grantor, to_nano(10)); + + let balance_before = get_balance(grantee); + + assert_ok!( + pallet_permission0::Pallet::::enforcement_execute_permission( + get_origin(controller), + permission_id, + ) + ); + + assert!(get_balance(grantee) > balance_before); + }); +} + +#[test] +fn unauthorized_cannot_enforcement_execute() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let grantor = 0; + let grantee = 1; + let controller = 2; + let unauthorized = 3; + + register_empty_agent(grantor); + register_empty_agent(grantee); + register_empty_agent(controller); + register_empty_agent(unauthorized); + + add_balance(grantor, to_nano(100) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + grantor, + grantee, + pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), + vec![(grantee, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::ControlledBy { + controllers: vec![controller], + required_votes: 1 + }, + )); + + distribute_emission(grantor, to_nano(10)); + + assert_err!( + pallet_permission0::Pallet::::enforcement_execute_permission( + get_origin(unauthorized), + permission_id, + ), + pallet_permission0::Error::::NotAuthorizedToToggle + ); + }); +} + +#[test] +fn multi_controller_voting() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let grantor = 0; + let grantee = 1; + let controller1 = 2; + let controller2 = 3; + let controller3 = 4; + + register_empty_agent(grantor); + register_empty_agent(grantee); + register_empty_agent(controller1); + register_empty_agent(controller2); + register_empty_agent(controller3); + + add_balance(grantor, to_nano(100) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + grantor, + grantee, + pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), + vec![(grantee, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::ControlledBy { + controllers: vec![controller1, controller2, controller3], + required_votes: 2 + }, + )); + + distribute_emission(grantor, to_nano(10)); + + assert_ok!( + pallet_permission0::Pallet::::toggle_permission_accumulation( + get_origin(controller1), + permission_id, + false, + ) + ); + + let contract = pallet_permission0::Permissions::::get(permission_id).unwrap(); + match contract.scope { + pallet_permission0::PermissionScope::Emission(emission_scope) => { + assert!(emission_scope.accumulating); + } + } + + assert_ok!( + pallet_permission0::Pallet::::toggle_permission_accumulation( + get_origin(controller2), + permission_id, + false, + ) + ); + + let contract = pallet_permission0::Permissions::::get(permission_id).unwrap(); + match contract.scope { + pallet_permission0::PermissionScope::Emission(emission_scope) => { + assert!(!emission_scope.accumulating); + } + } + + distribute_emission(grantor, to_nano(10)); + + assert_ok!( + pallet_permission0::Pallet::::enforcement_execute_permission( + get_origin(controller1), + permission_id, + ) + ); + + let votes = pallet_permission0::EnforcementTracking::::get( + permission_id, + EnforcementReferendum::Execution, + ); + assert_eq!(votes.len(), 1); + + let balance_before = get_balance(grantee); + + assert_ok!( + pallet_permission0::Pallet::::toggle_permission_accumulation( + get_origin(controller1), + permission_id, + true, + ) + ); + assert_ok!( + pallet_permission0::Pallet::::toggle_permission_accumulation( + get_origin(controller2), + permission_id, + true, + ) + ); + + distribute_emission(grantor, to_nano(10)); + + assert_ok!( + pallet_permission0::Pallet::::enforcement_execute_permission( + get_origin(controller1), + permission_id, + ) + ); + + assert!(get_balance(grantee) == balance_before); + + assert_ok!( + pallet_permission0::Pallet::::enforcement_execute_permission( + get_origin(controller2), + permission_id, + ) + ); + + assert!(get_balance(grantee) > balance_before); + }); +} + +#[test] +fn enforcement_cannot_execute_non_manual_distribution() { + new_test_ext().execute_with(|| { + zero_min_burn(); + let grantor = 0; + let grantee = 1; + let controller = 2; + + register_empty_agent(grantor); + register_empty_agent(grantee); + register_empty_agent(controller); + + add_balance(grantor, to_nano(100) + 1); + + let permission_id = assert_ok!(Permission0::grant_emission_permission( + grantor, + grantee, + pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), + vec![(grantee, u16::MAX)], + pallet_permission0_api::DistributionControl::Automatic( + MinAutoDistributionThreshold::get() + ), + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::ControlledBy { + controllers: vec![controller], + required_votes: 1 + }, + )); + + distribute_emission(grantor, to_nano(10)); + + assert_err!( + pallet_permission0::Pallet::::enforcement_execute_permission( + get_origin(controller), + permission_id, + ), + pallet_permission0::Error::::InvalidDistributionMethod + ); + }); +} diff --git a/pallets/permission0/tests/fixed.rs b/pallets/permission0/tests/fixed.rs index 9fedb0bd..a4ced319 100644 --- a/pallets/permission0/tests/fixed.rs +++ b/pallets/permission0/tests/fixed.rs @@ -21,6 +21,7 @@ fn fixed_fails_without_balance() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, ), pallet_permission0::Error::::InsufficientBalance ); @@ -47,6 +48,7 @@ fn fixed_creates() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); assert!(pallet_permission0::Permissions::::contains_key( @@ -75,6 +77,7 @@ fn fixed_reserves() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); assert!(pallet_permission0::Permissions::::contains_key( @@ -108,6 +111,7 @@ fn fixed_manual_executes() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); assert!(pallet_permission0::Permissions::::contains_key( @@ -153,6 +157,7 @@ fn fixed_manual_executes_only_once() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); assert!(pallet_permission0::Permissions::::contains_key( @@ -202,6 +207,7 @@ fn fixed_at_block_executes() { pallet_permission0_api::DistributionControl::AtBlock(20), pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); step_block(40); diff --git a/pallets/permission0/tests/lifetime.rs b/pallets/permission0/tests/lifetime.rs index f804cbd0..0d04c10a 100644 --- a/pallets/permission0/tests/lifetime.rs +++ b/pallets/permission0/tests/lifetime.rs @@ -26,6 +26,7 @@ fn manual_cant_execute_when_expires() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::UntilBlock(1), pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); step_block(20); @@ -60,6 +61,7 @@ fn irrevocable() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); assert_err!( @@ -103,6 +105,7 @@ fn revocable_by_grantor() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::RevocableByGrantor, + pallet_permission0_api::EnforcementAuthority::None, )); assert_err!( @@ -140,6 +143,7 @@ fn revocable_after_block() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::RevocableAfter(1), + pallet_permission0_api::EnforcementAuthority::None, )); assert_err!( @@ -180,6 +184,7 @@ fn revocable_by_arbiters() { accounts: accounts.to_vec(), required_votes, }, + pallet_permission0_api::EnforcementAuthority::None, ) }; @@ -210,6 +215,7 @@ fn revocable_by_arbiters() { accounts: arbiters.to_vec(), required_votes: 2, }, + pallet_permission0_api::EnforcementAuthority::None, )); assert_ok!(Permission0::revoke_permission( diff --git a/pallets/permission0/tests/stream.rs b/pallets/permission0/tests/stream.rs index 306aabda..86c0e68b 100644 --- a/pallets/permission0/tests/stream.rs +++ b/pallets/permission0/tests/stream.rs @@ -41,6 +41,7 @@ fn stream_fails_if_overflow() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); let stream_id = generate_root_stream_id(&agent_0); @@ -57,6 +58,7 @@ fn stream_fails_if_overflow() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, ), pallet_permission0::Error::::TotalAllocationExceeded ); @@ -88,6 +90,7 @@ fn stream_creates() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); assert!(pallet_permission0::Permissions::::contains_key( @@ -134,6 +137,7 @@ fn stream_manual_executes() { pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); AccumulatedStreamAmounts::::set( @@ -190,6 +194,7 @@ fn stream_accumulates_and_executes_at_threshold() { pallet_permission0_api::DistributionControl::Automatic(total_incentives), pallet_permission0_api::PermissionDuration::Indefinite, pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, )); step_block(120); diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index a15fd917..da42016d 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -443,6 +443,7 @@ parameter_types! { pub const MaxTargetsPerPermission: u32 = 100; pub const MaxStreamsPerPermission: u32 = 100; pub const MaxRevokersPerPermission: u32 = 10; + pub const MaxControllersPerPermission: u32 = 10; pub const MinAutoDistributionThreshold: u128 = as_tors(100); } @@ -461,5 +462,7 @@ impl pallet_permission0::Config for Runtime { type MaxRevokersPerPermission = MaxRevokersPerPermission; + type MaxControllersPerPermission = MaxControllersPerPermission; + type MinAutoDistributionThreshold = MinAutoDistributionThreshold; } diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 18368fe0..9fc3fa4e 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -222,6 +222,7 @@ parameter_types! { pub const MaxTargetsPerPermission: u32 = 100; pub const MaxStreamsPerPermission: u32 = 100; pub const MaxRevokersPerPermission: u32 = 10; + pub const MaxControllersPerPermission: u32 = 10; pub const MinAutoDistributionThreshold: u128 = to_nano(100); } @@ -240,6 +241,8 @@ impl pallet_permission0::Config for Test { type MaxRevokersPerPermission = MaxRevokersPerPermission; + type MaxControllersPerPermission = MaxControllersPerPermission; + type MinAutoDistributionThreshold = MinAutoDistributionThreshold; } From 759e79c9932a4027ba9fe797547769db258869d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Wed, 9 Apr 2025 09:20:19 -0300 Subject: [PATCH 19/46] chore: publish autogenerated docs to github pages on push to the `main` branch (#93) Adds a CI task that generates the pallet docs and uploads them to [github pages](http://renlabs-dev.github.io/torus-substrate/pallet_torus0) Closes CHAIN-75 --- .github/workflows/build-docs.yml | 46 ++++++++++++++++++++++++++++++++ README.md | 8 ++++++ 2 files changed, 54 insertions(+) create mode 100644 .github/workflows/build-docs.yml diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml new file mode 100644 index 00000000..4a76f48c --- /dev/null +++ b/.github/workflows/build-docs.yml @@ -0,0 +1,46 @@ +name: Build docs and publish to github pages + +on: + push: + branches: + - main + +jobs: + publish: + permissions: + contents: read + id-token: write + pages: write + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Rust cache + uses: Swatinem/rust-cache@v2 + + - name: Install Rust toolchain + run: | + rustup set profile minimal + rustup show + + - name: Install Protoc + uses: arduino/setup-protoc@v1 + with: + version: 3.20.1 + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate Docs + run: | + cargo doc --workspace --no-deps + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: 'target/doc/' + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/README.md b/README.md index 45dfb2bc..489f6720 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,14 @@ We maintain several documentation files to help you understand and contribute to - [docs/xtask-manual.md](docs/xtask-manual.md): Comprehensive guide to the `xtask` command-line tool that simplifies local development, testing, and network simulation +- [pallet_emission0 docs](https://renlabs-dev.github.io/torus-substrate/pallet_emission0): Generated docs for the crate `pallet_emission0` + +- [pallet_governance docs](https://renlabs-dev.github.io/torus-substrate/pallet_governance): Generated docs for the crate `pallet_governance` + +- [pallet_permission0 docs](https://renlabs-dev.github.io/torus-substrate/pallet_permission0): Generated docs for the crate `pallet_permission0` + +- [pallet_torus0 docs](https://renlabs-dev.github.io/torus-substrate/pallet_torus0): Generated docs for the crate `pallet_torus0` + ## Terminology We have some specific terminology throughout the codebase, so here's a list of the most important ones: From 000fe75de4da4a6c7719e55ee3ccc497a649fdb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Wed, 21 May 2025 11:36:25 -0300 Subject: [PATCH 20/46] feat: add faucet pallet (#96) This PR adds the faucet pallet. Closes CHAIN-85 --- Cargo.lock | 19 +- Cargo.toml | 1 + justfile | 8 + pallets/faucet/Cargo.toml | 32 +++ pallets/faucet/src/ext.rs | 17 ++ pallets/faucet/src/faucet.rs | 210 +++++++++++++++++ pallets/faucet/src/lib.rs | 238 ++++++++++++++++++++ pallets/faucet/tests/faucet.rs | 400 +++++++++++++++++++++++++++++++++ pallets/torus0/api/src/lib.rs | 2 + pallets/torus0/src/lib.rs | 4 + runtime/Cargo.toml | 3 +- runtime/src/configs.rs | 6 + runtime/src/lib.rs | 3 + test-utils/Cargo.toml | 1 + test-utils/src/lib.rs | 9 + testnet.json | 1 + 16 files changed, 952 insertions(+), 2 deletions(-) create mode 100644 pallets/faucet/Cargo.toml create mode 100644 pallets/faucet/src/ext.rs create mode 100644 pallets/faucet/src/faucet.rs create mode 100644 pallets/faucet/src/lib.rs create mode 100644 pallets/faucet/tests/faucet.rs create mode 100644 testnet.json diff --git a/Cargo.lock b/Cargo.lock index 30e5cf2d..5e3c6df6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7419,7 +7419,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.90", @@ -8431,6 +8431,21 @@ dependencies = [ "sp-staking", ] +[[package]] +name = "pallet-faucet" +version = "0.1.0" +dependencies = [ + "pallet-emission0", + "pallet-governance", + "pallet-governance-api", + "pallet-permission0", + "pallet-torus0", + "pallet-torus0-api", + "parity-scale-codec", + "polkadot-sdk", + "scale-info", +] + [[package]] name = "pallet-glutton" version = "24.0.0" @@ -16729,6 +16744,7 @@ name = "test-utils" version = "0.1.0" dependencies = [ "pallet-emission0", + "pallet-faucet", "pallet-governance", "pallet-governance-api", "pallet-permission0", @@ -17102,6 +17118,7 @@ dependencies = [ "pallet-evm-precompile-modexp", "pallet-evm-precompile-sha3fips", "pallet-evm-precompile-simple", + "pallet-faucet", "pallet-governance", "pallet-governance-api", "pallet-permission0", diff --git a/Cargo.toml b/Cargo.toml index d7dc6cba..a40a505b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ pallet-governance = { path = "./pallets/governance", default-features = false } pallet-governance-api = { path = "./pallets/governance/api", default-features = false } pallet-emission0 = { path = "./pallets/emission0", default-features = false } pallet-emission0-api = { path = "./pallets/emission0/api", default-features = false } +pallet-faucet = { path = "./pallets/faucet", default-features = false } pallet-torus0 = { path = "./pallets/torus0", default-features = false } pallet-torus0-api = { path = "./pallets/torus0/api", default-features = false } pallet-permission0 = { path = "./pallets/permission0", default-features = false } diff --git a/justfile b/justfile index 6a88ea65..ed132eb0 100644 --- a/justfile +++ b/justfile @@ -1,5 +1,13 @@ default: check test +# Build + +build-mainnet: + cargo build --release --timings --package torus-runtime + +build-testnet: + cargo build --release --features testnet --timings --package torus-runtime + # Development check: diff --git a/pallets/faucet/Cargo.toml b/pallets/faucet/Cargo.toml new file mode 100644 index 00000000..7189fbfd --- /dev/null +++ b/pallets/faucet/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "pallet-faucet" +description = "Testnet faucet pallet for the Torus network. Allows users to get test tokens by performing proof-of-work." +version = "0.1.0" +license = "MIT-0" +authors.workspace = true +edition.workspace = true + +[features] +default = ["std"] +std = ["codec/std", "polkadot-sdk/std", "scale-info/std"] +runtime-benchmarks = ["polkadot-sdk/runtime-benchmarks"] +try-runtime = ["polkadot-sdk/try-runtime"] +testnet = [] + +[dependencies] +codec = { workspace = true, features = ["derive"] } +scale-info = { workspace = true, features = ["derive"] } +polkadot-sdk = { workspace = true, features = [ + "experimental", + "runtime", + "pallet-balances", +] } + +pallet-torus0-api.workspace = true + +[dev-dependencies] +pallet-governance.workspace = true +pallet-torus0.workspace = true +pallet-emission0.workspace = true +pallet-permission0.workspace = true +pallet-governance-api.workspace = true diff --git a/pallets/faucet/src/ext.rs b/pallets/faucet/src/ext.rs new file mode 100644 index 00000000..7ce6957c --- /dev/null +++ b/pallets/faucet/src/ext.rs @@ -0,0 +1,17 @@ +//! Type aliases for the faucet pallet +//! +//! This module contains type definitions used throughout the faucet pallet code. + +use polkadot_sdk::frame_support::traits::Currency; + +/// Type alias for the Balance type used in the pallet +/// +/// This represents the token amount type in the system, derived from the Currency configuration. +pub(super) type BalanceOf = <::Currency as Currency< + ::AccountId, +>>::Balance; + +/// Type alias for the AccountId type used in the pallet +/// +/// This represents the account identifier type in the system. +pub(super) type AccountIdOf = ::AccountId; diff --git a/pallets/faucet/src/faucet.rs b/pallets/faucet/src/faucet.rs new file mode 100644 index 00000000..5951f407 --- /dev/null +++ b/pallets/faucet/src/faucet.rs @@ -0,0 +1,210 @@ +//! Implementation of the faucet functionality +//! +//! This module contains the core logic for the faucet pallet, including: +//! - The execution function that handles faucet requests +//! - Hash calculation and verification functions for proof-of-work +//! - Block hash retrieval and validation functions + +use crate::Vec; +use crate::{AccountIdOf, BalanceOf}; +use crate::{Error, Event}; +use codec::Encode; +use polkadot_sdk::frame_support::{traits::Currency, LOG_TARGET}; +use polkadot_sdk::polkadot_sdk_frame::prelude::BlockNumberFor; +use polkadot_sdk::sp_core::{keccak_256, H256}; +use polkadot_sdk::sp_core::{sha2_256, U256}; +use polkadot_sdk::sp_runtime::{DispatchError, MultiAddress}; +use polkadot_sdk::{ + frame_support::ensure, + frame_system, + sp_tracing::{info, trace}, +}; + +/// Main execution function for the faucet pallet +/// +/// This function processes a faucet request after it has passed the unsigned validation. +/// It performs the following steps: +/// 1. Ensures the account exists (or creates it) +/// 2. Validates that the block number is recent (within the last 3 blocks) +/// 3. Verifies that the proof-of-work meets the difficulty requirement +/// 4. Checks that the submitted work hash matches the expected seal hash +/// 5. Deposits tokens to the account if all checks pass +/// +/// # Parameters +/// * `key` - The account that will receive tokens +/// * `block_number` - The block number used for the proof-of-work +/// * `nonce` - The nonce value that makes the hash meet the difficulty +/// * `work` - The hash result to verify +/// +/// # Returns +/// * `Ok(())` if successful +/// * `Err` with an error if any check fails +pub fn execute( + key: AccountIdOf, + block_number: u64, + nonce: u64, + work: Vec, +) -> crate::DispatchResult { + // Ensure the account exists in the system + if >::account(&key) == Default::default() { + >::inc_providers(&key); + } + + info!("do faucet with key: {key:?} and block number: {block_number} and nonce: {nonce}"); + + // Get the current block number for validation + let current_block_number: u64 = frame_system::Pallet::::block_number() + .try_into() + .map_err(|_| "block number exceeded u64")?; + + // Ensure the block number is not in the future + ensure!( + block_number <= current_block_number, + Error::::InvalidWorkBlock + ); + + // Ensure the block is recent (less than 3 blocks old) + ensure!( + current_block_number.saturating_sub(block_number) < 3, + Error::::InvalidWorkBlock + ); + + // Validate the proof-of-work difficulty + let difficulty: U256 = U256::from(1_000_000); + let work_hash: H256 = H256::from_slice(&work); + ensure!( + hash_meets_difficulty(&work_hash, difficulty), + Error::::InvalidDifficulty + ); + + // Verify that the submitted work hash matches the expected seal hash + let seal: H256 = create_seal_hash::(block_number, nonce, &key)?; + ensure!(seal == work_hash, Error::::InvalidSeal); + + // Award tokens to the account (15 tokens with 18 decimals) + let amount: u64 = 15_000_000_000_000_000_000; + let amount: BalanceOf = amount.try_into().map_err(|_| "Invalid amount")?; + let _ = T::Currency::deposit_creating(&key, amount); + + // Log success and emit event + info!("faucet done successfully with key: {key:?} and amount: {amount:?})"); + crate::Pallet::::deposit_event(Event::::Faucet(key, amount)); + + Ok(()) +} + +/// Creates a hash combining the block hash and account key +/// +/// This function combines a block hash with an account key and produces a new hash. +/// It takes the 32-byte block hash and combines it with the first 32 bytes of the +/// account ID to create a 64-byte array, then hashes it with keccak-256. +/// +/// # Parameters +/// * `block_hash_bytes` - The 32-byte hash of a block +/// * `key` - The account ID to combine with the block hash +/// +/// # Returns +/// * `Ok(H256)` - The resulting hash if successful +/// * `Err` - If the key is too small +pub fn hash_block_and_key( + block_hash_bytes: &[u8; 32], + key: &T::AccountId, +) -> Result { + let key_pubkey: MultiAddress<_, ()> = MultiAddress::Id(key.clone()); + let binding = key_pubkey.encode(); + + // Skip the first byte of the encoded key (which is a type indicator) + let key_bytes = binding.get(1..).ok_or("Key is smaller than 1 byte")?; + + let mut full_bytes = [0u8; 64]; + let (first_half, second_half) = full_bytes.split_at_mut(32); + + first_half.copy_from_slice(block_hash_bytes); + + second_half.copy_from_slice(key_bytes.get(..32).ok_or("Key is smaller than 32 bytes")?); + + let keccak_256_seal_hash_vec: [u8; 32] = keccak_256(&full_bytes[..]); + + Ok(H256::from_slice(&keccak_256_seal_hash_vec)) +} + +/// Creates the seal hash used for proof-of-work verification +/// +/// This function generates the hash that users need to match with their proof-of-work. +/// The process is: +/// 1. Get the hash of the specified block +/// 2. Concatenate the block hash with the account key +/// 3. Concatenate the nonce with the result from step 2 +/// 4. Hash the combined data with SHA-256 +/// 5. Hash the result with keccak-256 +pub fn create_seal_hash( + block_number: u64, + nonce: u64, + hotkey: &T::AccountId, +) -> Result { + let nonce = nonce.to_le_bytes(); + + let block_hash_at_number: H256 = get_block_hash_from_u64::(block_number)?; + let block_hash_bytes: &[u8; 32] = block_hash_at_number.as_fixed_bytes(); + + let binding = hash_block_and_key::(block_hash_bytes, hotkey)?; + let block_and_hotkey_hash_bytes: &[u8; 32] = binding.as_fixed_bytes(); + + let mut full_bytes = [0u8; 40]; + let (first_chunk, second_chunk) = full_bytes.split_at_mut(8); + first_chunk.copy_from_slice(&nonce); + second_chunk.copy_from_slice(block_and_hotkey_hash_bytes); + + let sha256_seal_hash_vec: [u8; 32] = sha2_256(&full_bytes[..]); + let keccak_256_seal_hash_vec: [u8; 32] = keccak_256(&sha256_seal_hash_vec); + let seal_hash: H256 = H256::from_slice(&keccak_256_seal_hash_vec); + + trace!( + "hotkey:{hotkey:?} \nblock_number: {block_number:?}, \nnonce_u64: {nonce:?}, \nblock_hash: {block_hash_at_number:?}, \nfull_bytes: {full_bytes:?}, \nsha256_seal_hash_vec: {sha256_seal_hash_vec:?}, \nkeccak_256_seal_hash_vec: {keccak_256_seal_hash_vec:?}, \nseal_hash: {seal_hash:?}", + ); + + Ok(seal_hash) +} + +/// Retrieves the hash of a block by its number +/// +/// This function converts a u64 block number to the chain's BlockNumberFor type, +/// retrieves the hash of that block from the system, and converts it to an H256 type. +pub fn get_block_hash_from_u64(block_number: u64) -> Result { + let block_number: BlockNumberFor = block_number.try_into().map_err(|_| { + "Block number {block_number} is too large to be converted to BlockNumberFor" + })?; + + let block_hash_at_number = frame_system::Pallet::::block_hash(block_number); + + let vec_hash: Vec = block_hash_at_number.as_ref().to_vec(); + let real_hash: H256 = H256::from_slice(&vec_hash); + + trace!( + target: LOG_TARGET, + "block_number: vec_hash: {vec_hash:?}, real_hash: {real_hash:?}", + ); + + Ok(real_hash) +} + +/// Checks if a hash meets the required difficulty for proof-of-work +/// +/// This function verifies that a hash meets the difficulty criteria by converting the +/// hash to a U256 value and checking if multiplying it by the difficulty overflows. +/// If there's no overflow, the hash meets the required difficulty. +pub fn hash_meets_difficulty(hash: &H256, difficulty: U256) -> bool { + let bytes: &[u8] = hash.as_bytes(); + let num_hash: U256 = U256::from(bytes); + + // Multiply the hash value by the difficulty + // If it overflows, the hash doesn't meet the difficulty requirement + let (value, overflowed) = num_hash.overflowing_mul(difficulty); + + trace!( + target: LOG_TARGET, + "Difficulty: hash: {hash:?}, hash_bytes: {bytes:?}, hash_as_num: {num_hash:?}, difficulty: {difficulty:?}, value: {value:?} overflowed: {overflowed:?}", + ); + + !overflowed +} diff --git a/pallets/faucet/src/lib.rs b/pallets/faucet/src/lib.rs new file mode 100644 index 00000000..d173361d --- /dev/null +++ b/pallets/faucet/src/lib.rs @@ -0,0 +1,238 @@ +//! # Faucet Pallet +//! +//! A pallet that allows users to get test tokens on the testnet by performing proof-of-work. +//! +//! ## Overview +//! +//! The Faucet pallet provides a mechanism for users to acquire test tokens on the testnet +//! through a proof-of-work challenge. This enables developers to test their applications +//! on the testnet without requiring real tokens. +//! +//! The pallet is only enabled on testnets via the `testnet` feature flag and is disabled +//! on production networks to prevent token generation outside of the normal emission schedule. +//! +//! ## Features +//! +//! - **Proof-of-Work**: Requires users to perform computational work to prevent abuse +//! - **Token Distribution**: Provides a fixed amount of tokens to users who complete the challenge +//! - **Rate Limiting**: Prevents wealthy accounts from repeatedly requesting tokens +//! - **Recent Block Verification**: Ensures that proof-of-work was done recently +//! +//! ## Interface +//! +//! ### Extrinsics +//! +//! * `faucet` - Submit proof-of-work to receive test tokens +//! +//! ## Usage +//! +//! To request tokens from the faucet, users need to: +//! +//! 1. Get the hash of a recent block (within the last 3 blocks) +//! 2. Generate a proof-of-work based on block hash, account ID, and a nonce +//! 3. Submit the proof to the faucet extrinsic +//! +//! If the proof is valid and the account's total balance (including staked tokens) is below +//! the threshold, the account will receive the configured amount of test tokens. + +#![cfg_attr(not(feature = "std"), no_std)] +#![allow(unused)] + +mod ext; + +pub mod faucet; + +pub(crate) use ext::*; + +use crate::frame::traits::DispatchInfoOf; +use crate::frame::traits::SignedExtension; +pub use pallet::*; +use pallet_torus0_api::Torus0Api; +use polkadot_sdk::sp_runtime::Saturating; +use polkadot_sdk::{ + frame_support::{dispatch::DispatchResult, pallet_prelude::*, traits::Currency}, + frame_system::pallet_prelude::OriginFor, + polkadot_sdk_frame::{self as frame, traits::StaticLookup}, +}; +use scale_info::prelude::vec::Vec; + +/// Type for looking up accounts by their address/pubkey +type AccountIdLookupOf = + <::Lookup as StaticLookup>::Source; + +#[frame::pallet] +pub mod pallet { + + use frame::prelude::{ensure_none, BlockNumberFor}; + + use super::*; + + /// Storage version for the pallet + #[cfg(feature = "testnet")] + const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); + + /// Storage version for the pallet (production networks) + #[cfg(not(feature = "testnet"))] + const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); + + /// Configuration trait for the faucet pallet + #[pallet::config(with_default)] + pub trait Config: polkadot_sdk::frame_system::Config { + /// The overarching event type + #[pallet::no_default_bounds] + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + + /// The currency mechanism, used for token distribution + type Currency: Currency + Send + Sync; + + /// The Torus interface for accessing network functions + type Torus: Torus0Api< + Self::AccountId, + >::Balance, + >::NegativeImbalance, + >; + } + + /// Implementation of the unsigned transaction validation for the faucet pallet + #[pallet::validate_unsigned] + impl ValidateUnsigned for Pallet { + type Call = Call; + + /// Validates an unsigned faucet transaction + /// + /// Returns: + /// - On production networks: Always invalid + /// - On testnets: Invalid if: + /// - The call is not to the faucet extrinsic + /// - The block number is in the future + /// - The account already has enough funds (free balance + staked) + fn validate_unsigned(_: TransactionSource, call: &Self::Call) -> TransactionValidity { + // Disable faucet functionality on production networks (non-testnet builds) + #[cfg(not(feature = "testnet"))] + { + InvalidTransaction::Call.into() + } + + // Enable faucet functionality only on testnet builds + #[cfg(feature = "testnet")] + { + // Extract parameters from the call + #[allow(unused_variables)] + let Call::faucet { + block_number, + nonce, + work, + key, + } = call + else { + return InvalidTransaction::Call.into(); + }; + + // Ensure the block number is not in the future + let current_block = >::block_number(); + let target_block = BlockNumberFor::::from(*block_number as u32); + if current_block < target_block { + return InvalidTransaction::Future.into(); + } + + // Lookup the account from the provided key + let key = T::Lookup::lookup(key.clone())?; + + // Check if the account already has sufficient funds + // We consider both free balance and staked tokens + let key_balance = T::Currency::free_balance(&key); + let key_stake = ::sum_staking_to(&key); + + // Threshold for rejecting faucet requests (50,000 tokens) + let total_worth: BalanceOf = key_balance.saturating_add(key_stake); + let threshold: BalanceOf = 50_000_000_000_000_000_000_000u128 + .try_into() + .unwrap_or_default(); + if total_worth >= threshold { + return InvalidTransaction::Custom(0).into(); + } + + // Build a valid transaction if all checks pass + ValidTransaction::with_tag_prefix("RunFaucet") + .priority(0) + .longevity(5) + .and_provides(key) + .propagate(true) + .build() + } + } + } + + /// The main pallet struct + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] + pub struct Pallet(_); + + /// Callable functions for the faucet pallet + #[pallet::call] + impl Pallet { + /// Request tokens from the faucet by performing proof of work + /// + /// This extrinsic is only available on testnets. It requires the user to perform + /// proof-of-work by finding a nonce that, when combined with a recent block hash + /// and the user's account ID, produces a hash that meets the difficulty requirement. + /// + /// The account must have a total balance (free + staked) below the threshold to be eligible. + /// + /// # Parameters + /// * `origin` - Must be None (unsigned) + /// * `block_number` - A recent block number (within 3 blocks) + /// * `nonce` - A value that makes the resulting hash meet the difficulty requirement + /// * `work` - The hash result of the proof of work + /// * `key` - The account ID that will receive the tokens + /// + /// # Weight + /// * Read operations: 16 + /// * Write operations: 28 + /// * Does not pay fees + #[cfg(feature = "testnet")] + #[pallet::call_index(1)] + #[pallet::weight(( + Weight::from_parts(85_000_000, 0) + .saturating_add(T::DbWeight::get().reads(16)) + .saturating_add(T::DbWeight::get().writes(28)), + DispatchClass::Operational, + Pays::No + ))] + pub fn faucet( + origin: OriginFor, + block_number: u64, + nonce: u64, + work: Vec, + key: AccountIdLookupOf, + ) -> DispatchResult { + // Ensure the call is unsigned (from None origin) + ensure_none(origin)?; + + // Look up the account ID and execute the faucet logic + let key = T::Lookup::lookup(key)?; + faucet::execute::(key, block_number, nonce, work) + } + } + + /// Events emitted by the faucet pallet + #[pallet::event] + #[pallet::generate_deposit(pub(crate) fn deposit_event)] + pub enum Event { + /// Tokens were successfully distributed by the faucet + /// [account, amount] + Faucet(AccountIdOf, BalanceOf), + } + + /// Errors that can occur in the faucet pallet + #[pallet::error] + pub enum Error { + /// The block number provided is invalid (too old or in the future) + InvalidWorkBlock, + /// The proof-of-work does not meet the required difficulty + InvalidDifficulty, + /// The seal (hash) is invalid for the given parameters + InvalidSeal, + } +} diff --git a/pallets/faucet/tests/faucet.rs b/pallets/faucet/tests/faucet.rs new file mode 100644 index 00000000..06cd4e56 --- /dev/null +++ b/pallets/faucet/tests/faucet.rs @@ -0,0 +1,400 @@ +#![allow(unused)] + +use std::{cell::RefCell, io::Read, num::NonZeroU128}; + +use crate::frame_support::assert_ok; +use polkadot_sdk::{ + frame_support::{ + self, parameter_types, + traits::{Currency, Everything, Hooks}, + PalletId, + }, + frame_system, pallet_balances, + polkadot_sdk_frame::{prelude::BlockNumberFor, runtime::prelude::*}, + sp_core::{hex2array, keccak_256, ByteArray, Get, H256, U256}, + sp_io, + sp_runtime::{ + self, + traits::{AccountIdConversion, BlakeTwo256, BlockNumberProvider, IdentityLookup}, + BoundedVec, BuildStorage, Percent, + }, + sp_tracing, +}; + +#[frame_construct_runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive(RuntimeCall, RuntimeEvent, RuntimeError, RuntimeOrigin)] + pub struct Test; + + #[runtime::pallet_index(0)] + pub type System = frame_system::Pallet; + + #[runtime::pallet_index(1)] + pub type Balances = pallet_balances::Pallet; + + #[runtime::pallet_index(2)] + pub type Torus0 = pallet_torus0::Pallet; + + #[runtime::pallet_index(3)] + pub type Emission0 = pallet_emission0::Pallet; + + #[runtime::pallet_index(4)] + pub type Governance = pallet_governance::Pallet; + + #[runtime::pallet_index(5)] + pub type Permission0 = pallet_permission0::Pallet; + + #[runtime::pallet_index(6)] + pub type Faucet = pallet_faucet::Pallet; +} + +pub type Block = frame_system::mocking::MockBlock; +pub type AccountId = sp_runtime::AccountId32; + +#[allow(dead_code)] +pub type BalanceCall = pallet_balances::Call; + +#[allow(dead_code)] +pub type TestRuntimeCall = frame_system::Call; + +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const SS58Prefix: u16 = 42; +} + +thread_local! { + static DEFAULT_MIN_BURN: RefCell = const { RefCell::new(to_nano(10)) }; +} + +pub struct MinBurnConfig; + +impl Get for MinBurnConfig { + fn get() -> u128 { + DEFAULT_MIN_BURN.with(|v| *v.borrow()) + } +} + +// Balance of an account. +pub type Balance = u128; + +// An index to a block. +pub type BlockNumber = u64; + +parameter_types! { + pub const ExistentialDeposit: Balance = 1; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; + pub const DefaultDividendsParticipationWeight: Percent = Percent::from_parts(40); +} + +impl pallet_torus0::Config for Test { + type DefaultMinValidatorStake = ConstU128<50_000_000_000_000_000_000_000>; + + type DefaultImmunityPeriod = ConstU16<0>; + + type DefaultRewardInterval = ConstU16<100>; + + type DefaultMinNameLength = ConstU16<2>; + + type DefaultMaxNameLength = ConstU16<32>; + + type DefaultMaxAgentUrlLength = ConstU16<64>; + + type DefaultMaxAllowedAgents = ConstU16<10_000>; + + type DefaultMaxAllowedValidators = ConstU16<128>; + + type DefaultMaxRegistrationsPerBlock = ConstU16<10>; + + type DefaultMinAllowedStake = ConstU128<500_000_000_000_000_000>; + + type DefaultMinStakingFee = ConstU8<5>; + + type DefaultMinWeightControlFee = ConstU8<5>; + + type DefaultMinBurn = MinBurnConfig; + + type DefaultMaxBurn = ConstU128<150_000_000_000_000_000_000>; + + type DefaultAdjustmentAlpha = ConstU64<{ u64::MAX / 2 }>; + + type DefaultTargetRegistrationsInterval = ConstU64<142>; + + type DefaultTargetRegistrationsPerInterval = ConstU16<3>; + + type DefaultMaxRegistrationsPerInterval = ConstU16<32>; + + type DefaultAgentUpdateCooldown = ConstU64<32_400>; + + #[doc = " The storage MaxNameLength should be constrained to be no more than the value of this."] + #[doc = " This is needed on agent::Agent to set the `name` field BoundedVec max length."] + type MaxAgentNameLengthConstraint = ConstU32<256>; + + #[doc = " This is needed on agent::Agent to set the `url` field BoundedVec max length."] + type MaxAgentUrlLengthConstraint = ConstU32<256>; + + type MaxAgentMetadataLengthConstraint = ConstU32<256>; + + type DefaultDividendsParticipationWeight = DefaultDividendsParticipationWeight; + + type RuntimeEvent = RuntimeEvent; + + type Currency = Balances; + + type Governance = Governance; + + type Emission = Emission0; +} + +parameter_types! { + pub HalvingInterval: NonZeroU128 = NonZeroU128::new(to_nano(144_000_000)).unwrap(); + pub MaxSupply: NonZeroU128 = NonZeroU128::new(to_nano(144_000_000 * 4)).unwrap(); + pub const DefaultEmissionRecyclingPercentage: Percent = Percent::from_parts(70); + pub const DefaultIncentivesRatio: Percent = Percent::from_parts(50); +} + +impl pallet_emission0::Config for Test { + type RuntimeEvent = RuntimeEvent; + + type HalvingInterval = HalvingInterval; + + type MaxSupply = MaxSupply; + + type BlockEmission = ConstU128<{ (to_nano(250_000) - 1) / 10800 }>; + + type DefaultEmissionRecyclingPercentage = DefaultEmissionRecyclingPercentage; + + type DefaultIncentivesRatio = DefaultIncentivesRatio; + + type Currency = Balances; + + type Torus = Torus0; + + type Governance = Governance; + + type WeightInfo = pallet_emission0::weights::SubstrateWeight; + + type Permission0 = Permission0; +} + +parameter_types! { + pub const GovernancePalletId: PalletId = PalletId(*b"torusgov"); + pub const DefaultTreasuryEmissionFee: Percent = Percent::from_percent(20); + pub const MaxPenaltyPercentage: Percent = Percent::one(); + pub const DefaultProposalRewardTreasuryAllocation: Percent = Percent::from_percent(2); +} + +impl pallet_governance::Config for Test { + type PalletId = GovernancePalletId; + + type MinApplicationDataLength = ConstU32<2>; + + type MaxApplicationDataLength = ConstU32<256>; + + type ApplicationExpiration = ConstU64<2000>; + + type MaxPenaltyPercentage = MaxPenaltyPercentage; + + type DefaultTreasuryEmissionFee = DefaultTreasuryEmissionFee; + + type DefaultProposalCost = ConstU128<{ to_nano(10_000) }>; + + type DefaultProposalExpiration = ConstU64<75_600>; + + type DefaultAgentApplicationCost = ConstU128<{ to_nano(1_000) }>; + + type DefaultAgentApplicationExpiration = ConstU64<216_000>; + + type DefaultProposalRewardTreasuryAllocation = DefaultProposalRewardTreasuryAllocation; + + type DefaultMaxProposalRewardTreasuryAllocation = ConstU128<{ to_nano(10_000) }>; + + type DefaultProposalRewardInterval = ConstU64<75_600>; + + type RuntimeEvent = RuntimeEvent; + + type Currency = Balances; + + type WeightInfo = pallet_governance::weights::SubstrateWeight; +} + +parameter_types! { + pub const MaxTargetsPerPermission: u32 = 100; + pub const MaxStreamsPerPermission: u32 = 100; + pub const MaxRevokersPerPermission: u32 = 10; + pub const MaxControllersPerPermission: u32 = 10; + pub const MinAutoDistributionThreshold: u128 = to_nano(100); +} + +impl pallet_permission0::Config for Test { + type RuntimeEvent = RuntimeEvent; + + type WeightInfo = (); + + type Currency = Balances; + + type Torus = Torus0; + + type MaxTargetsPerPermission = MaxTargetsPerPermission; + + type MaxStreamsPerPermission = MaxStreamsPerPermission; + + type MaxRevokersPerPermission = MaxRevokersPerPermission; + + type MaxControllersPerPermission = MaxControllersPerPermission; + + type MinAutoDistributionThreshold = MinAutoDistributionThreshold; +} + +impl pallet_balances::Config for Test { + type RuntimeEvent = RuntimeEvent; + type AccountStore = System; + type Balance = Balance; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type MaxLocks = MaxLocks; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = (); + type RuntimeHoldReason = (); + type FreezeIdentifier = (); + type MaxFreezes = polkadot_sdk::frame_support::traits::ConstU32<16>; + type RuntimeFreezeReason = (); +} + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type Block = Block; + type BlockWeights = (); + type BlockLength = (); + type AccountId = AccountId; + type RuntimeCall = RuntimeCall; + type Nonce = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type Lookup = IdentityLookup; + type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; + + type RuntimeTask = (); + type SingleBlockMigrations = (); + type MultiBlockMigrator = (); + type PreInherents = (); + type PostInherents = (); + type PostTransactions = (); +} + +impl pallet_faucet::Config for Test { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type Torus = Torus0; +} + +const TOKEN_DECIMALS: u32 = 18; + +pub const fn to_nano(x: Balance) -> Balance { + x.saturating_mul((10 as Balance).pow(TOKEN_DECIMALS)) +} + +pub fn new_test_ext() -> sp_io::TestExternalities { + new_test_ext_with_block(0) +} + +pub fn new_test_ext_with_block(block: BlockNumber) -> sp_io::TestExternalities { + sp_tracing::try_init_simple(); + let t = frame_system::GenesisConfig::::default() + .build_storage() + .unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| System::set_block_number(block)); + ext +} + +pub fn goto_block(block: BlockNumber) { + let current = System::block_number(); + // for block in current..current + count { + Permission0::on_finalize(block - 1); + Torus0::on_finalize(block - 1); + Emission0::on_finalize(block - 1); + Governance::on_finalize(block - 1); + System::on_finalize(block - 1); + + System::set_block_number(block); + + System::on_initialize(block); + Governance::on_initialize(block); + Emission0::on_initialize(block); + Torus0::on_initialize(block); + Permission0::on_initialize(block); +} +// } + +#[cfg(feature = "testnet")] +#[test] +fn faucet_fails_with_wrong_pow() { + use polkadot_sdk::frame_support::assert_err; + + new_test_ext().execute_with(|| { + goto_block(1); + + let origin = <::RuntimeOrigin>::none(); + let res = pallet_faucet::Pallet::::faucet( + origin, + 0, + 0, + vec![0; 32], + sp_runtime::AccountId32::new([0u8; 32]), + ); + + assert_err!(res, pallet_faucet::Error::::InvalidSeal); + }); +} + +#[cfg(feature = "testnet")] +#[test] +fn faucet_works() { + use polkadot_sdk::frame_support::assert_err; + + new_test_ext().execute_with(|| { + goto_block(6); + let account_key = sp_runtime::AccountId32::new([4u8; 32]); + + let mut nonce = rand::random_range(0..u64::MAX); + let mut hash = + pallet_faucet::faucet::create_seal_hash::(4, nonce, &account_key).unwrap(); + + let difficulty: U256 = U256::from(1_000_000); + while !pallet_faucet::faucet::hash_meets_difficulty(&hash, difficulty) { + nonce = rand::random_range(0..u64::MAX); + hash = pallet_faucet::faucet::create_seal_hash::(4, nonce, &account_key).unwrap(); + } + + let origin = <::RuntimeOrigin>::none(); + let res = pallet_faucet::Pallet::::faucet( + origin, + 4, + nonce, + hash.as_bytes().to_vec(), + account_key.clone(), + ); + + assert_ok!(res); + + assert_eq!( + >::free_balance(&account_key), + 15_000_000_000_000_000_000 + ); + }); +} diff --git a/pallets/torus0/api/src/lib.rs b/pallets/torus0/api/src/lib.rs index 7e618b0d..21359bd8 100644 --- a/pallets/torus0/api/src/lib.rs +++ b/pallets/torus0/api/src/lib.rs @@ -17,6 +17,8 @@ pub trait Torus0Api { fn weight_penalty_factor(who: &AccountId) -> Percent; fn staking_fee(who: &AccountId) -> Percent; + fn sum_staking_to(staker: &AccountId) -> Balance; + fn staked_by(staked: &AccountId) -> alloc::vec::Vec<(AccountId, Balance)>; fn stake_to(staker: &AccountId, staked: &AccountId, amount: Balance) -> Result<(), Balance>; diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index 374716fe..419179e4 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -495,6 +495,10 @@ impl .unwrap_or_else(|| FeeConstraints::::get().min_staking_fee) } + fn sum_staking_to(staker: &T::AccountId) -> BalanceOf { + stake::sum_staking_to::(staker) + } + fn staked_by( staked: &T::AccountId, ) -> sp_std::vec::Vec<( diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 4ba1f87e..f1708f1a 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -53,7 +53,7 @@ try-runtime = [ # Frontier "fp-self-contained/try-runtime", ] - +testnet = ["pallet-faucet/testnet"] [dependencies] @@ -96,6 +96,7 @@ pallet-torus0-api.workspace = true pallet-governance-api.workspace = true pallet-permission0-api.workspace = true +pallet-faucet = { workspace = true, default-features = false } [build-dependencies] substrate-wasm-builder = { optional = true, workspace = true, features = [ diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index da42016d..dcd37634 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -466,3 +466,9 @@ impl pallet_permission0::Config for Runtime { type MinAutoDistributionThreshold = MinAutoDistributionThreshold; } + +impl pallet_faucet::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type Torus = Torus0; +} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index e04ed2ab..399b6b53 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -159,6 +159,9 @@ mod runtime { #[runtime::pallet_index(14)] pub type Permission0 = pallet_permission0::Pallet; + + #[runtime::pallet_index(15)] + pub type Faucet = pallet_faucet::Pallet; } parameter_types! { diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index bad6f50f..9db24920 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -17,6 +17,7 @@ pallet-governance.workspace = true pallet-torus0.workspace = true pallet-emission0.workspace = true pallet-permission0.workspace = true +pallet-faucet.workspace = true pallet-torus0-api.workspace = true pallet-governance-api.workspace = true diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 9fc3fa4e..e3cfe61f 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -46,6 +46,9 @@ mod runtime { #[runtime::pallet_index(5)] pub type Permission0 = pallet_permission0::Pallet; + + #[runtime::pallet_index(6)] + pub type Faucet = pallet_faucet::Pallet; } pub type Block = frame_system::mocking::MockBlock; @@ -295,6 +298,12 @@ impl frame_system::Config for Test { type PostTransactions = (); } +impl pallet_faucet::Config for Test { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type Torus = Torus0; +} + // Utility functions //=================== diff --git a/testnet.json b/testnet.json new file mode 100644 index 00000000..f150318a --- /dev/null +++ b/testnet.json @@ -0,0 +1 @@ +{"bootNodes":["/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWPWGWUYaisZyTdGiPskyUBSQrZzoHieKmWfBxTn8HLBBn"],"chainType":"Development","codeSubstitutes":{},"genesis":{"runtimeGenesis":{"code":"0x52bc537646db8e0528b52ffd0058d4d704fe5406bb13521060c928e9e230f8194ad73b216ba2c5e2d25b21c161787d0e1d76f7cfebaaa7ece99e177f43a35fc07b769a2d46d8361c1a037895524f92d0bb5a351f8deddae4a9c1bfe07f6ca43542082184ecbdb7dc32241557120713bc2d5784bb563fd95ae42857934eaa90fb914daf69cb91ea67d4a46f5e94abb76bde075bfbae90ad7edb9908e95d20dab5fb44cdd3bcf8e548552836e486d073de471fbf9c1179da455582d6be97cc937d0fb922b04c6f7517c8a77d5eabbb3fb0c70c5eb540e62defa346189c6f688f3d554aaf5204fcbfdf893d55ac57a939fd3e48eca9c2afb2e3a4ef4fb1a74a7c9522e06dbedfd85365474de178e4f12a315cfbfe8a3d5576aae8f88eef6d624f959a9aaa79a9f41da697bcd73c555353a69cef78aae6db4baf126beabaded554772b3e156beaaa45c0a7aefbb8e9dcf75deca992d55476e66b3b6aaade92e1349cadef788abfa3a6e67c5753d9bba7765c7b15791e354543731c35158fd514764f7bcabb5653313ea5fde6335df7ada6e67c5653b1a67a3c7b17df3db5bdaba939f3d4bcce6778aafb0c354543f31c3595e396751f3545e3e339ac1c9fe129eb33d4940f2cfa780acba9459c666a6ae63972fc6626478e7a19b2ec3e7a649996615e8e1d35a6d8598c6535f1d272cc923737be76984a7c795617bbcccaa1cdad6647cde5954c33c3b0a875560ed3d6d560db0e93c51767256fe68833c78e78d110804ee392a7bd06d30c190d34ccecd022a6a3f3145f4707aba9a93f75d74f5b0002f054f60004c0b3acd2eb75b6ec3af3747acafb8986d355cad1bd3e003b4c0fc06b78aae635e8e83ca55d67069dd7f0143669a041f35e7f9a397e621a68a021004f590f404dd1408329be861966e8f1d4f61ed8eb757cbc870c35355ce7a91dd7399d00f0196aea741966b8ce53d96578aaab399f99e11dafa7a1478fcbe0c3c76fde4386f778caf41ed769f88fa74aff0177705ec353a5d700732e430dfff154cd6578eabace0907a71e47e7384f79c7814f69c7f90c373797c1474df5a8a91e97e1373e7ef3d4f61bf8d4fc0c3f3dd5fd040140c353d669a82900d0f05a5300b80f1f3f3d155f9fc2fea3a6021080e7d4d44d4ddd7c66e63835c583c76f6a0ae73333bf792ac76f6a8ac7cd793cb5559fd581cf790d326c38dea3a678d4148ff7f8b6bd3e95bdd6140e195e9fd2ea93d581c7f11a9ecaaa94d581afa1a602508b803ada67a8a92c3b4d4dd15c9be1da5358bd80565399769c9acabe61df9ef2ea0eab038ff3548e9ac3eac09f6a8a861c07404dd59aaa9fc17b4e4dc9f0d79ada2b50f14216659c58630547288f0b229060c217d460a20a17a82ade7d76d4cbaba9d7d7d45d1df818ea469dbd8f1e3b8e53533736e751534640d0c1195fc0c880065b0001b5c3c8052510e3082cc2f0029827503b9e32559b1d3565534fa5daad0ebc8e7a459d7dcd53b1feb03af0353595a3160151554ca7a9a9d2676a113ba82af1386aca447aa9a68ca4d012062d52b4c1461a5940c51d838c0e6270840bdac0c20ba82af1a5a7ba1a6475e04b3545aa41acbab33af05cb5e19a6475e0b79ad26a11275415faaca610d0832bb07003369c40a60628ac167154951888c0851d0c410c2b5f380355856f3d75d5d3eac05b3545eb4ed4d9a766fdeac0cbda459dfdbe480702c1c2421374bbaa5245ef6a8830fd959abf5ff4ae8620d35a894fdfd5fcefea59d6e1ef35c865a083dfd5105eacd3b3f5f98f7a179ff89727f9c4d6b799fe5895426e5e83d383cddcbc16e13269631e7abe641ecbdbd6f6d4d15fd72e0f36e4ae4a79a3def6e5c1d62047cf5c0edbf497b7ad518f083ec0a8e92127f4d335fd7243363ec1593fa39e17bdbc4ff6174f14dbfa7243e67d58d3962b62d54fb675ec97f7bdaf53effbbe8ffef0e493d2d7974fd77d22e609a55afef23e9c8ed7e06679dbd4932da727145b7eb921b24a3e456ff9047f41b9026da769e3930d9fe067ef6a8855d3ecd034c90dc1d1166ae9f6f09b4d697d2fe7757a8d7a1b9fe62fafe3d33c9c9fbf7acacf6bd28b9fc7611e26f2f053c21b098a97a252a954cd550b3644cbd151582dda6259e77a63847f9d7f5522d8b05af586086cf99b9f4b8896872dfbea2d4241f1db9f517ff2f13e4cbd6dae1f1f5ece1a74c9fc84b6cc036169a5565ae6d9965fe6e1cf6bcc0d89d7e0949f8fd7e626bd4ff67e7acbc53abde553bcc65bf4169a7e9420834fdb7c1e3f4b885920db5adca207bf1ccb7a2d3744f2299ecb619b8d18320bb4ada183df6b0b806eb9196d73be37bc641efe7e99277ecf9eb6a7aee313fc7245605f7c82f7619deea369f878d8dfd5f036ecc1a6611e781ce6e1c36b70636f7b39be0f4360af8ebf3ad61b23f2f1b27e950836df87b53d75dbdbcb15316aae395042d865082efd5dbdefb847a2b60455f47e631ed87b1be6d9de6fced6a0f7ca6004e101b45dd2edaa0457b4fdba5d9540d5db36ccf39d9acf3fc59e783e0ef74014bf639e5d09a16a3e0df3f012535820db3e1c3d2a5b36e6d9f33787e113da2ee9f8dfd5f11df37ceff8f8c71e2a5be2e5e34fb187ca964f76bcac568eda323b9e867b18157f31cfae545d3a7e639ed8f1cb3cfb78c93cf0f19b136bd04eaf0c45d008f20fdaf6e67c5df335f808ff6dcd10428f7bd55128c7dbc53c1fec154243b75faec8f2691fab0f6bbc414f92e928384a5adca0179b8b42b7301d6523ad9021a86aa105343c7fb9235205b99f4ed5f01bf36cf397fb81aa86f7e1cde11ad4f5ca60c490bf6811fe8b313e28fab011843968daaee947892ef8b42df9b45f6ec8f269efc38ba365a083df954ad57badb47d31cfc787dff3d09144c78fffe0259ff61af42e3eed03d0c186cd87df2f7784abe4133f08d68b4ffbe5d33e7acb27aecb2778c8f135b8450f367bdbd0bbf8b4678eaf45b84c927c82f7611ff6611f666fe313bc114388a5a60b525c2084ac864ccd1a356ed468a1060c355fd021448d176acad4bc51c3464d1b3a543561a8e9424d1a18a801a3e6093568d488514346cd183561d480a9f9a2268c8e12d44ca1464c4d193552a83103aaa0260a3550a889a284a5d4821c62e448428e2f72746192220712a8133432ba16744c9086405a9598e85cd02161aa420e1fc82a7090d139d1614163841c69e01883660559401304ac0a38542435261268b0e4d8220718a42ee4d062660b336c4c1ee4e002871b38c080e30b5a143429e4204313a39981830d1c58a829410e357080a15330a1618a028d0b4c583089315dc1342647142632dd18a6354c5898885073c441c141c1d402d31226264c586818a62336226c58d030512a83c482ee4b0e28ba2d3a2e3a353a314c6998a66092424746074607852e4c07a663026582dea00ba36b42e784ae8c8e0c0e35a80b7294916798b2501b743b20f1a05b425e412ba30485ee8b0acc1b502c28151c634856d09ed05dd1098142a1a64a294bd4027ee994e8b090ce2061817405121a5b979a13d464a1060b890c490b138b1c4dc8e104a8450e256c57c8b1842e899a2a7060b826705ecc23cc24e400430a424d0b48352021414a82a403520e4838a09102890b3606871768d0205921552111a16b8234a65bd50c5143651e91bea8114262e1a64023c6d4c5a4048e0a334b8d8a2b83238313830383eb82e3828b01c7c496c6c6c6b6c65684ed08a6334c614c56e8bc20a5b15db121615b755d984c20a3c0be80b12167400243e240e6204718581739aeb09900ae60ab62a282e9042633b0364c6a6859d0c8604dc831c6d603930b38354a4c804a30dd60d2a0c4021a1498b8c8374a2b9865689ab05dc9c1042d4c578492171a2e28164845c891855c82c688d21626284a3730c1a084840e09242c362b4c514834640b4c4ed414819db11d5112c3f402d313251cd03061e301c90739bc287d2921a141c114031c426c2ba043d04481060a252e39be989ac8e1c554044a050e0b34616811b834b02e606b6064302d6059c0a68089c1a48041012b0353030b83818179c1b2a02bcc0c0c0dcc0ad815b028605f6048b06e60d9c0da625161d5c0a2812584a5a265e81b340cd40d6b0a4b0a4b8b25032b06160aac27ac17584e584d5845584716119615cb051613560b2c2cd612961256121612160bac1558475857e816e81ab40a940c4d839e41b540bd40af40d9a052a063a815e817140cda043a05a501ad0195017d01d50115029d01dd429fa030a0515028e812d409da0455822601af502480680b601250090fd0135023280ae697b9c5ecc1d4625a31b3985c4c2eb306930a0a664231b5cc26e613f20b118b5c43b251a3062d81fc81fc22ad903d903cc09e209d905aa414920ad984a4816442262195c0bc20572059208f884b88595055742236115d1099e02fc4164c37b80dee027381b7c06cf01aac05ce02936135180b9c06a3c167f015d80a3c86abc054e029b01896029bc151e0300c052e839fc064f0182c0687c160180cfe82bde02ed809dc04e682bf3013780bd682b3e025b0123809ec8591c047602370172e0263c144e0150f8185c041e02b1808fc03f6015bc13d601ef00eb80ad601e78071c05cf8066c03dec254f014ac856bc034e019b00c580a8e8263c0306028380b3fc12f6027b809760133c12d602f30165e8295e02418096601af808fe02bac024e01a3808d805a8055c030a013e01460162015330cb00af008900ab0cb2cc25402340215028e8149985e20122013a0173883f9065c02628155a01050f5011fe00b34f00308763802011d1ee0809f1c8a10b9a1010c40b5cf1005240007210708d2c35300203b36fc80485c86eacd1868b0176630c038024151e201244f9400fd80048906a30f4d809020c9800099d1420f444340519a3861c0ce4c16043043c68726404fd458a221274f9e000105c910d012264f9610310122044888968460091324509480000b1b04d1921e96104151c204288d1d022262b2e40348d058264c947833672c14a2274b807a001a02c0cc15acb05080a000418099310b44a40468a8872a2c13264a7ae03143852552f299292cce8c98255232c38c1416a88725434f90405102821866ccd81e964051e2011966a2b03e2c41b2e4493360070948200440000d01fd4034c4c74c9885021402254d90dccc40618980a0000d3d41420404821d33652c1091122228487c60b204080f40590205a80950111e334fd89921830913253d3061a2840163fc40048226404cc45820a00f2071428484e807102c011281ce4c180b85c9122544403e200102fa000d3360d6c9079a2c4112c41010104248963c69a22640210842c90e9f0163817a68e2a409122548963c69a01e9a3881005113209cf4d043f798f9623fe0c4c9d013244f96fc006508a889089c200902288886192fd607a026205802a50910487a701265091042404888869c3c011a4242b424041e00024a90992ed68725488880a00c01d1c38e192780e0890f4d940c15f131d3041f9cf400e4430c335c2c9420808290408112049091264e9640810234016fe6cb42015a42b464c8c90f444028999961c23671b28448c910103e202172c2040a92254f5ac910109d63668b1501122748963ce921a0a021271668b244c90f3d7ce00347bc192d168848890f4b98288982040808202022c0830f40200081121e6a98c962a104f500f4430f4b5828444d8086807e68b2e4334a68b2e403373349d81e964069b26488480a109220983c79a204c910900f4c9600810aeac1091314ce8c9785c2630609ab0409cecc11360448941029f1410911900ea619238c600913254b889634599263a6cb06f5e084890790001101d1039014201c3345d821270cd8160231f18012a226407c0009510f40434b7c68b20409921d06207dc14a021655af91b62b95aaa151dc416714330af8045a9266ce9999191a9a4933e79c219172e498a1a14cca2864beb28e47a40c69bc28bd688c5d2777ec883ad84866c94c29cb65969125cb857b5d1cc7f4ba2ec9922f19a5a669944a8d3247969c941c77650d2b7721dcdda5cbf28a72ce8dd2a53f1e2025ff90a4125fbc6379878c914a235c8374408c946eb6bb7b9922b6cb8be928edae8e0dc0ee620158ded5c1cc9ae4289725cb8dbb1633dc12535e665ec8cb54cad2967e74a2d4913b98996f4a39e458a694a5a6699a66d238878b1061a652520a29bd4cac31d3b9413a299da1b424590e595eb81af34597194248e705a18dc4c1c1c1a193e9642a374967bca194c6128977b70192323333435ede654997176ecbbc10f28901a8938430b2949437c29574e1b60f4b9672296bbb13724ce9456266e6dddda59794525e7bed755166ba5bb3cc5c5353c32c214b96242691f8da8b594ac9576429294b5e8e1042664a29536ad19083213395bb5d37830fb8bb000074d147970332efd2956c515e4b4a8d9735130014c02b174a4a4d94e172bc225fec832fbea45cb94ba78c2b97e9d2e5e5d534b91446c994442261175c2bb2a54949ad8b25336566c97293526e525e9499e9527a2d95f4dab82bafb8cc9c00045c71572ea5d86448e5729c74424829c526a594db3897ee45a9c6cc1d534a2577497a518ef9e21970a8e19552ca4959f2b5f1a2947797972ea5522ea554524ae56419e9ae84bc57dc852bd9c6460833e7ec52cabc1bc748c30c595e97d4685846c951464dc6ebdadd785129a36479b1bc34c992d26b9932d576af8d70215d9ee18851ba7c31c757d498212723b364c93c37c81a73dc788e2b35ed5a29a54d64de0370105e29e5ee6e64be38f22599725c8c1ba994944a8e1c3772e4dd6b37ee2e2fcbc89252bacbcbbc2c372ecb5d9652f65c71520a3dba4b290fa597016490e18257a4744e139d515accbbf5865a008ecabd2eee925232a594d249bd49a7890074523900bac3d615279431461963d4a284314649a9d6d1c974f98abc164b3a97d674a1c60b71663988212721000a01bd81a78714272220f2a1e407283e8294f4d00350108f0108701c0418c00f5094fc708c095014202648a42809410c3940e08409121034590202103861b20386c0c702010d7d00c9901322253d3861c244c99012222834e880b2e33c827a50e201264c9c0c05c0062540433c7a000521219202d4c407100876e0804204658914208ba80725509a2819224242b4240421707212c01260c90780869e5425404c7ab8d1e14313a0274f942001028192212744507aec0042b084a809104335c8078880e851da014801fa0109519325434f90f40065490870801039713284c407a021201f869c20e1310001901000284809130f20015a32441400020ccde00310142840434f42e0a4879e6c09300414c5490f4043489440f1a10720240308e23100019ef40004e5470c417c60c910501419a234018a3c7600489a3859026508280a1220222543404d804080e4000330800108e003101227444f8218ea01099114a019a234018a5e46853745631223586474159592ac51a6195916d3222c651433a3a222a3a2a298a4081615ed95a4086e92352aeaac246b64545464644493ac1134324a19c994d195c4081641a322a3580493ac5191112c3232322ae2246b54c431c91615151519cd246b545464249318c12298c408161515c1245b64c446561223489314add14cb29bc408c6246b6464642493ac91112731824630c91ac12410982880bb0b430045c9065528d59f16b5e58a70f583cd7d3b7344328ef3b6bf5c11ec6cf5568330cc081fcbb6b1ed6b7a2b3d69c4416985b639df0e5fb1078b73ce8979a92d33cea8a52630cf708570048ec43921f79359f7e16ba38efcf4e4991bc296f7a3c1d23c7bf31a5d21b18740e163d730ccb3893af299d7451dd9b5bcc50d99bfb29b9fcfe889e6cf6806cd75e84d6f54bf1de06ad8867953b6f08bb26399912cbb362cd5ed2a4b988e4426901dab53b067a7c0a2b0ba85cf49808805a0b27a8a3af21a77249eebb7c375221680c28e3d8b98916c4bbcc6dc8fa937f6e629f763ea780ddbd8eb9a6f04af158265a6b70b046e91f451a067d5481b5c21dbcbf7611d36d09f063a3e1a49beb85cdabe48ac1f6c2e87eddd1fb1874a762a5be235ccdb15b3c6db86514dee01923b123b3ef316c5da5ceee8002315f4756467c940c0a7af47ce0897daba0627e92bbac2e5e0d3d7992bd2a4858a7a8ba1ad8d3907183dd11747c4284b0b258124d25794c583d4bab6ecaa98b7280ddb326f5198b728e67ef8b47ed957d44e9069fa0ef3be5adc628d9c90142a251042d543cb277ac9275abfc8dc1129143b285a15089b26b2691a0f83e08552fdc58697de8d912f88e6539e5a70224c135d90a0c3b45dd2c1377109b8e08a251d844cb4d13007f27059f40cbd2b26a2e88865c7ea0e14c0751f3eeab26399971dc2a0cbeacd0fab541d5fa4523576839179ac7e393a8a6c26d86f72d8c62a51fbb0c671c36020372936f2fa3047ea7068bfaee1f0204a630209de34d371745dc7dc0e38ae491cd7268e120ed24d1d89542291bc2040ca74cc97cebeccc35ddbf7dae55d441df6ebeaec1adc360f366c18789b47c3a7ec4074d8afcf6f6bdf6efdeb3abbc6dc03b42ff700adfa400164f7e1cd43009fb25b5e103e65d782c49e06b04ef62c4867413afb720de05366d3d9bfedd219f3dc6867c288de15132ae85db5608a1bad0a39603b07d8b1615ff2ba2eed9174d81c8954dab4fa15b57602ac10ed59f6c71e88ca7e8a3d33cfbe0371d89e5d9bf1206adbdc6801f4ae5a90455fd1022ae4b679dff61b4ec3f119ef863379379cc924b91d66aed14d9bb9666dda4c3783c3546fb652a92b5d9b9b56f28200cf9c03e47598590dda2f348b4b636d8ac6b68e79e29088798c79924fd7893aebf4f13bd086eb3ff874fdc4a7ebd7b553ecb98175ae5fdfd5dfa92f224e37f0e93a14ddfcf5ef86beaef12645dc300f36c3de16c0a063d36b90238ca4cfa86f7e62678f9d9dbd9bd6bc1bfecd7678b3552d470b4071df550ba0e85db5204b6359fd8a1abb0fd71582fdfa157b4abfdec51e88ba6e137b4cbf7e8843f6eb9ac983a8ccfb44a045676fc19506d2bbc212a6b17c895be67dd96fb48b208b16c1121af3a0c0d6d2dde4dd6887284695bc1bad46e02add0a44957e2d723b98aecd0df364436ec80ea66b74c3246092c0a248266f882dd306f7ce1b02a24af526ab42a532ade5e80614f7214a6fa0ac4014772a974aa522d521ac3228ee9adc308f7b392590f382000f391d3a1de2358d264f30dab6f5fd421c60431cf81f49632f281eb612b2e09bf95d61f1d2bbc29284e65ff563b2b5756a79b24fcc434f8fc50a2c4860a1b2041b728b96171b8779e8cf3c949ec606e2c0dc0fb7a4b4e92d1d665bbc4698ae572c4145c7d0bb5ac28856c28df67a574a88b1b2734e416c83037b42ce085f1e8779bef81a746d4b90e9a9c54d7a1fa7433cd720bebce474e0d81df3c41a44bf3d574b64a1db06e7dcccc977f1f3d73ce47ef81136ad40744dd4411cb8e799d321eab0d3bb40603c622703dd6a50c269a2f29083d7187a5b126132d0491bcbb2893d54b6c09e88e2ef15cdcd87d344ebb6f5ae92e862878980491c6d18780dbdab24aef492e00a75f2da421974bb42a28da6e76b87ed0249e40abec89ef07b814826f60dbdfcb7d3f34198e75b2f39ccf91d724e3d7f81534f1a7a3e49eca1b225fbfc0ff3599d4700f74cd4fc0ef3ec8a055c7afe06e6993dff63fec43c0c2184399423b25d685c207121fd42a105342f907822da0b3b8779846099869f437b226a0489500c0dbf9ed0021a2e10c811a15c116b839c0398bdcff23e12f4f5546aca94a658fdf85b14eb57d4b47ef41bff193de07b1fbebc203e95dc0fd76f4ac76fd3fac1660ffecce3dd38801f9933128d405a8dd8308ff5791ccdf276b582299a7a93d60f86a1a9038c86d0f08dfd6179b0a9b79fa7e186b0ccfed8f7720f301a42b36a7ffcb0100dcf71325684b64f3a7900b4f51c76902b38926dfdf3d735ff75fdbd2dfa6fc1b4f524ccf30569ebd683d8b435435bf7b9dafa75eb395c396ddd07ee8928eb17e8a2ad6f8079ac262013cd1eb70df3ecea082c0c3792846099de77cc136f9d8679e42d6bc94422b46dd2c9c7d51147fd5df31bf3e4cc2057dae8f843b4e9f8087b242a7647eef81e2b043e4609686bcda0dbc3f371200ef06afec69e659dafebfdd7b511ad03dd52d3c6279a187b7663fd8e244a3e7a3c7428f9dd183fb4d3b10a955a8bdcf35b7a1b75bc2768107a1de876b7c4f5b6427677f77cdefff0162d466fa9e95ad0f2bf6586671602d68e4fb3d2d0b2d2440f36129a945eedf9e528aca2f9d72111783e1f720f60867063ee01fcebda3ae97675258a26fd3ad4e016b9215b0dd2ce3df33e7ea97ed94bd74aa5d2e591ae91bc9b1fa95275e9b263732f77a45375897404aabac40fda5edaeab47ef129ee3491eac627fa8f1f743dfb777db90f3b897bc0bf8c44ba0f6b922b32af2ffc75dd87236724fb15445a20f1a50512552d1748bc4027554274e99fec4f36e9256f4868c9a8544d84a3bb136ddd7d8b4344b4b7a1ed44b4bb2f67044997ce4d7ae709c5d0a56f9ed002e0562a95eaee0f92a7c98dbd2ffbc6db214764c92052bb74c8fd40285a0896e9cf48882e55666f9bf3becd83d7bc7d10fcf6b50d979aacdaf189561b3ef16b4f12b488d03ad0c9ded515273ad0cdded5152cbb4064d08460efad6bebbda021d7bb82e289a6f120ce02e11688f58b4fd6197a43b06e0bc47a916d1ea2a39f874374f2f19279b6ad732b6408dfbaf56d85b0f5cdb1a2a0317bdb97f5db5a5e8bdbe423813526d564c5344f79927576ac7e457d7d3922d8bfab8398649dd5269936993f27f37dd83a7b0c6d90d724bcf82479958231438cecaab97e3ecdd7b0f95df5ae5230a6772e119aabe4939496f7c9a6dec764eb79aedb561968f3b3639eeb476abc4d4f4a1f9e493a3ee5dbf06957931b3d769f083d1a1b3ec18e029bce2a04cb74765a83a80ef451d68fa8a526a6b5c7e65eee27837df3b35b5c69edb3e598d62a431b26e48da48536cc283d261ba4413b9dd1e925e9e069f89479d631ef3ae484aec65920fbab6e95179f9847d62dae2443fb998fdef7333fbf5c91f8791fbeacfbf0757aebcc0d89f5336a1acfa6d3a61705f6e54581f193630d8a97bf7488979717bd47ebf0f3f1baae5ff5b30e85b6e6c89423473ee4cb6bec59d72057846f5de30d72d6a1c5e32749c7c7bafbe39abf68b5bccf7a508c4ff848920f76bceaee8fc811998ff5ba4f84b768dd2637442b2d0d9fa0ac1785f30a1adce522910368da67d4f0a51f7aca3ddb8e3dcb3c1acf864f1af5a2c08e027bdb78e1b224c1fa0542bdad06d1c3ed8e79b05bdfecf3f2db7d582bc1d6961bb2d4d4f129fb4e6f87dc10583fa386de073b881e9eb96cab342b04f65ef3605bde17c8be639e9dde635ec7a7ab2d68841e56adb47d1ef6724338707dab36950662f5336aec9b07bdc3fbc4cdfbb22158563fd9d9b5432ff2077bfbe700a321f4ee8fad7e9927b465de36c43ca1d8f1eb822ebeeb2824dbd2a8f7cdc35fde0dac42b0ad5a430369cbc3e1d37edec882d40afce67c3b7088fc8f485abf37fdc5f5238abd7cc24ec33cd9e36d324dab9f76ec9ae569b71eaf691e6c6d3be4249fb06bdef6e66990174612dcb6bce5d3b735fcc9e6074ed7b07e344248bd6dccbb16e011cd8695864f4ceb27c5fbaede6ba9e994c3a778ebe793557dd827ae27bd0fb6102c53a64c99fe8c7a4f3da2d87be85d7cdabaf189bfdcacdd46f39c93f4b67198e71dff6385c436cae03442cb40b7a7e9b4cdd1ba08911c434d4d0d8f1b9c1e3b6a6aa0131d1492aab805e48608b1dc30d30a4a8625e6da16e200c790d17b8619c441aa7a17878536e458211b869e0d662b848564bd5f48467f5cbfa2e67f5bc72df467d4120c2debc7350a37088660c3779d69c371cd08953a8a2c7dbb8222061d6583386cc78fdbe286c0223a788b6f713f54c51159321a5e5b0b4208af08a16408e989047f4a056d5e69f9e96da00b9aa7a1bfb90db5e96d0369d91b2d150ebf5b69a56205088afe6806052f0f8d601e9a96e7a1c388ee63d2f33bfdd1f4b75388c0a2a8d04368049fe429d07dd08829b47c6adf459d2d34d183277ac0258c4a85a287d7a8b728e8a9640d52108312c02008282a5680a0e08f6650d0a3628551d68f148082a7de910250a92d3cc0a776883af2f04b6a0b0fd6694df9441d79aba6b6f0400f6bea51479ed69d8d3adfd5dfae56f0df7e592e1091042d698841832834e12daf43896e51464964118417bc80086072b0066a51fb6f8787ab54286804f3d0d0f2f04aaf0c456cc42c5da05920eae4480198c6e95da5e08ad64afc5d21433b1dffcdfa1969259effe24fd6b30a45a1f94fd6afa8e57247564c4febf45f517ff1d0aa4d680d62b25b5ce959e9e953f43203bbc515d4a5e5bad664b7b8c2414c564cd3cb7fb427ad4d564ccb7fb24902a8ac5a562d538a6c00030b1bc0c002d64f4ac77bfbe5326003185868b984629932ad45d5030552209145c5538a560c0afbfe23cd90e5065e54f2c98a692d2a1bc0c0424513406575a9768b2b5909560c0aabaa1583da7f5bcfefe2b06bc3b72b23d86822d85a543565e060082ba854a8ad538aaeaadacffac9fa3de978f8e5783045a10c19bc4145a542ad0e33cdf7e122369a4c69708230fd5dcde7c7333f32ff3ac197e66f412730a267efca0454f49a22b0bb5dac9d118439747142fef4be20fef2094208b130a5c64307125da752a9542839bd3804769d8475a3300196ae93679ecfbaaea16e5726389a985c3ecdc8e910047f9d6b10fc8d91ecfcec5c89605f971eec8b7960fde4adcf33f7039f7147e4ad5fcb3c7b5d5ed293b7660dba5eafc7eb540ac5d05347129d3c7cd07531f793d5205ab17a55cdda36e619824dc46d5df269de87a5077b639ef8eeaa93fe83bfae416fe353fce54960fb931dab9457fc160fe525e525bcac37d6b7893eacadba35fcb5c98e4f33a8db55116df4d5bb2a824c6b57e48ec07fd7ad2ff7237fd528d3f282e469bd30c8f1993b220feb072fbf9c10ec59373eed2535021abb2b65bdeae644291a91d516b0df52ddcea271dc0974cb39c0a8a53482b0011abc063d22b02fe8c13682500620c009bd4f1e7e7a3746a6fc8453ceb347219db37ef1b2069d60d23929a5944e4a4f27fcf48260d581441724689011b5e53d730f30eaa0dd7f7cb81d5c6933d2e97dd7e7a917749d3e7a37466ad0f5f8edb8512f1e7a1ad3796d42eb44b3e13569fda3e7c3cb7938042eacdf75ae51665bf7616d6ed0b366f4bef8ab06cdf32d4a278c6b68cb3cf2507adfbc3cf46e8cc0d3d31a340fbfadb13724d4a3e98966f3691610b78d7984ac8ec24dcf57907579d50fde3a3784699ab99f5d7df3568d329b5e9becd12f57449e21ac5ffcac419227e42b4768f4ae8eb2f4576af91a7a57475ce4d4a817974f70f9f4c9e653ef336aae178f392137247e7ab079dc93f33e7c31cf0d11d8f3b35e0d4fbded201d48cc2a54d40c650dea8ab035745bcbd64a72c2f87839e910be0f2ff3dc7025c28f8ff4f09279bef9a078794a7f310fd3ad7dd887bd683b814e2b1db9211f6004ebc5277979ad8400a1a29697875fd8b22e9fa007b4656d7ba5b631cf8d9158a64cc707117183204ad6f15088eed11ba110daa523892e9e2f1f2faf4919a5077bb9781f8ed2db36821048bb364fdb9c6f571d4fc49818e30e023a7e661d8f00e6918fc721024c4779314f10bf639df8fdba8edf685a3ec94b3ec17f5d5f6e92793e3e4acabadc33e1a7b7ac03aff126e1ca4a16bdbfb86751bb1c11beacd7c63cbc2b660e43eb5d59592845b72b23c434547d733ea86abed603b7f536d04115f7ae8c08d3b0e199330255bdf583aa8ed7961b22bf5e14d97be9fd74bd8fde67d4f1bb426e7eb296ff168c961fda6959854abdffb64c7ff17c9f18bdedf596b7f5e0111d3cec6503ec2127f48e5f4ea8eb5871a0aa5706a308b909595a9ef66c17950ab557699279e8f743f45edb1542baa6196d2779bb40b6fa694384b8e9b5fa716b87dfbcafa837d8a40f4a516b97cfbe2b043b698190eaa73d9e3be6ed02e1eab73d6e434fc82a53a6cc1b2dbf799f1111a879db9917246b14d8f43fdcf4913322cff5336afeb676e87db0e12347849e74cdbbf991a7df865c91edbb40e07da20f6f9e102cd3d749de0d57c43a563fd8d833ef839d5da3de079b9ebbe48ec8c328ba5d59e1d2f2f4da6a015c74818a91152d4db841833168a0822c0800a6891e3b08430dd6b0220c239400a7641eab07a2e63b1b9cd78f494e5f976a74179fa407d6f002062618e20a6480013507d0738ab1444f1ca839bfb1c788062b27a8100209617cb142cd7a61a1fbe4371806c8db43bf6f00f740d50376e09efdec824c9b7a574e70a3972b127b760b28d8411a6f8c31c389154a8ef1a54c164a78a10466a0a4fc9967575ea85a3e877b3a94fc0fee912859a7e8bead07aa689867734eac03bff05c6911ddb6f422092faef4975385b6391fab9abf70684a6f08be1b8a0b049ee86a5e20f043f242b04c0f1109593d8108c1321d253614a31e12826d347dd3e9c10502af05c29f1eb640f8d0d396e8ea6c81f0b137ba6361e8e0e3211bcc038f9a0fdb8038c0e62c7afb8a3d8bbafabb6c9aff3d5656a9405be619c25ffed50cf972c8ac9219b277f5723032c31f68bb42e25cc29623b228010ad2a0026ab5b0c10b8ec0c28b23c01803b5b7611e1b7a55bddfa177a552f9e4107b2ed47e7d881edd3a48834e3e46ef6212a463993265da6859b558562d0a82da32eb8d11d9f2725e7e5619e3e640ca300d6d6740038b13ac90df2ecd3a54d1fcd8842e9a1fb3638fdc03e6e5a3f4e24e6ba59d865b16338b3b12b3c778c811c91e350f3ebbb80a5c9f72d529dab54dce086f90abc0756a05a2ae4fb10251947e0abdc55de0fa94eb02d7ad43a145d1f129ca3501898e8ff3d9a9e9a6536f88ebf4d32bca50f3bb42acd35a94a1e80e47180af3b6082da03fa3ee600cbaec56ac6fd1aeca50f3f2a56f37814a6b5e93acb56fde4f46bae488c0e3d8fe79414cb46fe71e39225e13eddc71789f519be04b42b14c9907c05aaa4074fd49958ae4dd681c17597c11c3c5159dd3bbe2020b174773d3bc1b12c7719cb569de8d46f26e348ebb0f4fcee28c70e7024c5bb40e71d594112aab56ac43d4e43c2d47d656b5fbf4ac293a6f1da3b568ced3a78aaed37a7414fd558f8e9ad5cad10250558c50f3f3168d5a0da280d1fc8d268bba2bd54999f546fb9c87b0de68d3284b3337241ece5937ea5c4594af3134ee5e740194a902dc8b6818c7b74fe18ee3cbf180e35b4ded3847bfdc05b8e3f036ecfb0ba4a6a066e0815126b9f13045c7b74f315dc797e341c7b7eac3dc054cd7711f6642978e6742151d3f391e76bcf4cde34ef2a6ec38e993cb000f1e769ce6dadc9ef31489c7b99adaf18de42dcac69bb29dc773bc293cbee334de94d4f61dff36886e574c88a2a7d724fbc97a9ee69a06b90c904ef3ce9b427af7929722bd74939722ddf4e532b083c64b75cff9e665d7ac6da6b60ca44ae79eea6ef3e578d8711e35653a57f2a6f0f894fa29de53455362388ed33c657ae99d97fa533cea53f5de6dbc29a9d476eea91c2fd594cd53359ff9a272bc29a91477530ae73ecea8c9f1407ae993bb80e93b6aca08d55d879782a8ae4e8f07d27ca94e31bd74cdda225781ed3cea14eea45b1cad3cecf894eddd717829eea45a3445c7732eb0d521787c7b578b3254e99c5794a14cbb4266fd765acb11e95b2dca50dbe94b5e7793c741541178534d6de7aa15d2b7d01ac464de3a7de93eacd56fa7ad67f58344e0e32dafc93c8543f078a9a6206a863a2575f3548fa770eee339dfbc21783ce73abc94cd755ca328c8d2bbc5158a822c4db530a2978b8621e876450431fdd9b4bcfcd74922742104262021a6b7e8628b28be18c1842ebe74f1a5892d9068a3b518a385172dacd0a289d6b66d7a37573582353decacad31bd62ac314d574cd30450594933b6a89ade6ada1a699bdecdfce5ddccfad3f4585fbddc8f0d6060a1dab89f04505935dde20ae93935055129196a8afbf6a76a3d3acd535e2d8ae1db5f8b62b0b2c57ae9342568781f3d3c1caf883bcd6f6a51779aaeab455c3d3aaafb761e5eca08b54368011df42db4e1db1516aa861065e31d1d95ba524f1d1d5544fa76d37578a99a5a44aa4394689eca518b709ca61e1dc57da61e1d65aa4538ead151a46f758852dda8f3ed8a086d34ac4472b9685843d06dd1dfd4c2a599ec97be5196c638096ce7dec51eae1e7127552b5c1d620128d2c69ecb5f9c04b89bdec51e533d22bdab5648750b3d77798b7b805107cd1a64550a18a14a8c225d1675570aaa549d945dddcc936ee528d2e9bf274debcdac3c74f05f928e3d5c9dc27dbbfc057180d506da002f4fb90c5cc57d7be478d84eaa29d23712b7f130bab80b438b595a628f7599cc8d3437a6f4d7f52cbb4e9d5d1e7ce66da79e45af65dea4de5edec711e19e3d7ad7a55d23799f47c4cd4cb0c3ecd0bb320bd376831e77ccbb89f5d31e3dabfb47c4dc9153c7facd6b5f8e872e7af35aecbca3a34c5f5680a9a68a4a5f3640f6d4b201e2bbc74beec8a9e11e7ada378fdf798b2a795bb66bd0e3eae65d9987714468e613338f3deb2362c81dd1f9e14f1d4674304b2fccb2315d81515b44f271d647ef4b0d45b91e4f244fffc923a7fe8a7a7e52846238320feb07e3ca4a6bcbe433b2220d3d87c41ae5aa96371f39233474acd3fbf8300b9f2e534dcf9c111afa8b97f789f4db4b23a78e321baa3a8689524e19a510aa10b90563035d9094d1831de5b5e845f17ebc9bafa7e78cf2bc1d87c44f1e68b0898eb7f4aeaef8417396ded50f98e853efca074ae826ba8845ef8a07470dbbf4aeaae8d23f7a573a404348e887072370e9afc81b2a12f407250c2e442fe88f48a56252467f44575442fd114d7165a83f2233bef45ee86704fd0171c4aaf7424532322f78a3f745322dc2b4d0962913a6f73f418620d3ab52f54a956acbf4bea11434a179cb835283f870573ac8a23f6f082e9079a2ab85b64cf3b38cebee8f39a1b7d7bc8f7e52794e076434976546e4b973cc11b9be1d7adb338f3b7346b043f871850b043efbe67ddc51ae168a6fa87a7f791f6c230bb215b4ebd7c75fd91c19d6ef3e5128d51784105e08075eb32c08eb47c42d04dd687a693d4ad74ca44a88fef842961b4294e92857f3b1e8698795bded63ae7ca18b4a0984e8a128b4b147b11a8a5163f2fc0959647a9e888562d37af303571dcf183c7df4a270cb6bccdffee063f17b55f60e3fcc928d1d3233d70ffb1e623aa4faaa41fcbd5589ec77b6ac41f1b106edb9eee105a91504e065c7080ffc6d6808a4e169b807e6200ab843ea5de560081cb4410123147f4a7c95588958008acf450cafc102ec00f64bd2a4f436d005c9d3d05f4fa36c562d1757819502eafafc7ad7a757011bc0204219d45e4e2d538aaa6ab7b8f2a57ad64ffec33ade274a8f86a5a1bfd0a011ddf6a11164056810051d1bd1c1e6cbf7b0001e3c669c81c300200d98f7c036607eb90f30a08b10444f18d53660d6210cb165cac421c4ba51e704ddc6a758c39e3d21d8292e824630c2138c69f9ecda3201d3f25814f2140756f4c228a668790e075e5a5ee3bea7b1c179ce8979e8e525866dc7b6edd7b609a55ad3eec3da76490bba31627ddeb2ac6395d341b332928565dfc6b24ae43a766cfbe5c1c69623921d0b826d6519c61d91cf6ad0fc270f853b228f6d0fa297af1ffd56b1b7514f8f7be619b566043b77ecdc56f2a8b705719745b0973c2a54a85029ddcaee0020373d4459d91dc0179b5688f2898bd2bcedcf68d391828e7b7ce47eb4d3fa71d7ea8dc6d51bad1ab94e7f9d3ebb755941970ef1b22eac7ef4da350da3de0d5689cc6bd76ae64d225a5076ad7eb03faad55d2058158265b047ad7ed9e9374fbb4f9c1e84b0b5d2c69e4509d17bd20ad9b92108028aa051c6da163426d3f1ec21e92e828eb6a93fabe33b4c9369c086d92f513ad9a6fe4a1bc6478bdf9cef5ab57cf49074dfc5454a27fbbb542d7fa9fabbb85c0bb0e9b9b313643e877b1835cf258a9ebc8da08a9e60f4ce208af69aaf958460436884065e9a2302bff789ecdd189960347cf482f81f14a38697425ba64c995e3eada41725474b3ebdf9138c865e941cbd7c8af5cdf5e37f3ff0f144e063fd200fc9665889b4de13693d832e4dc44357c3c34a24db88748206bd12461868e9a2e331baeaf9651e889dbbc00d5b21f4da2177241e3be47280d023c2767a07a318ef307704fb073b081edbbe61ccdf2a3a3e7242109eb3cbb84c0fb95fe7ce5fe6ff79f1bce6e7b66df1626dc73de871dc8d16363a1efbcd392d623a3e72db72dbf64dbbe679dce691368dc7b59b1e3efe53eae1a304b9dc701c77cde3eec337a48bbbf9f59b1b6ca60777d1e3e6e6e6e6c6ebd1d11eaf790f2a98a7c7e7359a186e621b373168dccc2699070be271ec3bfdf138f33866241ec371a3e61eb77a70d7714305f3dc7cdee28668da869365efa179433f9a8f6ba5ff70dfaef9a85aa97e5c7673739c9b6b47b8e9b79ea69bcb1bee36e7aec9861bdce17db0797cb9233acd9d87b763878d0e6f62e1d37c8d17d9e093c9fb528dc3fb529df7a548de9782130bf3c0d846cfc3c80677d198b7ad410eab373ff14134075a61b5a898dc39eecbf1f0c39bded52a0653509902092d516841420b156ddb96dbb67bdb8f1d7b4d7ddb7a6edc356e835430cff63cc7dd87b70dbb4efa7512e9f31a8944c2481ab661da90d27db81bfac1be61db967d3b861ddb320d7adf6c62bb6bace409c18d44e20ecf5548059fe67f4fca5fef1daa7ecfdb0ebd0d62f7b6d06f104e6e08ad44b0974fd88f4ec34aafe013d658fd44d0d8b56505a8ae5d1c3df43e290d7fcfca51538abcffaa48c61948a850af54ac1cf57b8ba21feceda7ff66139b563f781df3e233ef93d25f4e8753d6319e5ec13cd7e7379be8f9cbe32f7c9a904b4ff84477fe02b94c5845cfee908a2be09f92e3c1fb1f391efe54fdabf7ba5187ae6ef8b486b6300a315996963cbebf200ed6bbe8781edec77d73ee3c7418d1dd7ca73fb8d33bbddccd009a07d0cbf130a2a3dfe98fbb3be48ef0f8c7bdc1267280de05d21d7a5bfd8c9808f58c1a7a37e7bc8fc7f9dc63882186182247e4d4317c391e62b816b71862b80f974a3e3c1f3eeec3c7991be283e3344d93a20bcea1d683746d8378f4ae8680466b3cb61ddd8b74376ae875de07cf9d7a1ffc762ea2b1d16944e5214b25ed256e8876cedb2e79dbdacd0639781c0d721098b0e6304fca70aee338d78183838393e1bc470f1c9cfbf07170702e9c7a6324866b8f41d334120946c1c3fb60dfdcf271ed3ebe9dc6f97773bec61189bf818df32ba2d16372477474bcc775bcc7c73de88c469a57483d7a683d7af4f048588f47ee884ef7a837466c4ebacd49d770bc21d93827491a8d56a1914824eecbe9009b5ea493ea8d911de7bee3dc35ced38ee35d0db3308f96a30714a3a6de678191df3cd89ca6f5f084606b874d8fe36dc367da6f3c1ef7893cbced1d9ed5059fe46d3cca854ff23a32ef4b795f0af3be547ff38a91536bf5c648cdb9d7d4ab0d3ec9731566c911fbb3c0b4fcd5860586c6834f74dc5617cc036915331e7ca2834db9300ff7cd2b6398c764c2b063639807bb0fb357abc7cc0dc1ce5d9807966ae9a597be5c06aa07bd9216ab77749457e3563f1845971eb921a5436fdbe46d972a77e1933ccca25d97775d1e5e157a153ebb145534102a54744fef4a0a3664c046f3f4ae6470051b8d03c64bf7e85d453145478125066eb48663b3bc0f6adab65c57bf547787ded735bce71d1d55eb06bd9af25e94a1960dd075d7b4cdf316053d79d8416ddbae6b9e7a37f0db467d63a43b7d912ea241bfcb8d4e351c02ef132f586f8c64e79e9dabd3083ec9ecf2da47c49d71444e4334480fb7433ed14ac4cdfdbbdcd0eec31a3777d27735fde60dfd6ceffe83e35b37f4d3ddf49fd2bb6ff5a3c751b7fac936d54f08f6f6ae7e250e7a9b9002606742b0b38c7247743aab3746b05fc76a1c9335c13c57121dccd2f2dfe506ccc227798d07b4d209412b56ac7430c8fa3ac0e889ee8b68347b91d0a255cbd15129ae228b1650a85045720c1198c00235258894112ae744eca0aceca0b6c04f239827a2c13cb09be8ed2f9269f6d2f29c850c718c0cec851520c307a368793845e52ef51c052ba0422cbdfd5d2d2fb51c1de57d5bded0ea9d1b2ac0b38102809f1e8ffd013f391dba8e971c0ff5de23c7c3bd33178145c950bba8030fb9082caad62bea40af6ed481cfb2f4ca50248d7af04e151ef08999de150ca8e85565bd2b185069d524b3ab28e63c60968e8cdeae638cd13a7b6c6d9665e938230a2896bcbd43842eb8c5186364726ae6d172fd23e29e444e3cb0870da1f7e1f92190d1a78e718387922d6fd90070ce0ab3cc2dd5f2ec5dded15118b65d47474d055c3575bdc8fab20158bad1ecedaf23b1e59628bc2b28aa6822168a3dab50d4e806b330cfc6233a1d2bccc20de12a645d0d5f148d266754562b4155b70d196e3b4429a1e4609621f372a712b4fd7e7fad901961bc1ee9e37f304f7c908bc6c7481fe32937b1941ed2dfc8c3e6be912ea09f1ea4555e0b645b2641dbcfcb1542bf9f2b04f60d7c9a57a2773e9c9e8fdf06551dffdb7af6649f47c00af902b93eff8379b0cf67deb2cef51ceeb958e7fa6e7a7e5759c8f4fcc63d34ac737dfe6685c09ea71e6c0df37062ef0a0a16b405c5117d5dbf7e633d36f78df55d416144ef0a0a15340d5671f874cd05423dd89b336bd0ae6213da5253772259438e5b3dc9f088665db3b821dbe571a75f8ff38810b9b8a0ebdbbb82e2a8e702a144f8d7d7e36bdec5c7b06b1ef6e58aec077bebc71dbbc65b3fd8fbed1a6f9c97f5352d5e07d2b77e570b0d715ce5864a0f82b25fa640c2045daacb27ae7e7bed179512a8da276aeb6d933c0d6e2ca5b7ef5e0669da377cfaf64b4cddc82fea36b12795dd265e92c3aeb9611efc353d2d5e694da6a0b58982d6a811ad592768ed32416bd8516b1911ad69565adbaab4c651698d34446ba5ad04ade1d8382dc32eab44a78c0c174747baf9e9da3aa9adfa5974b953e6a5baa8c39f72451dbe4dd461594f7c62ba058dab373dae8be37a6e26ed1bcba25b06e7a6cccd55ea7494b9294361d442db1c20669c9e702f6cb4c0c1083824e0ba68f3473fba1f05f201e9bd01b60787d561ba3ba7d36f63d3751b2f9fc30aa1f37485340e2b64612c42737c39faa394c6fac1366a1fc66181f00241000edb65b3d82e968c15b36834dfda9e5dba4260f3b7d4aca3f98ba19986661b9a39bed17d38341fbed1c17fb4f9db2434cc61819401c55066cab4ca18e12d218b4e1a279d1c237784678c31f2296c093fb9905de44a6221bb7c3df92864356b51caefc26bda7a50cc57d4f3dbfdf4d88361a00dcbf7a4f4b2914fb4d66378e9c909e514ac5b9655b72f743978592fcddfb1acfae534ef6018864133223704b33ab93a70ebc9ced732cfca515baec74b29310cc32ecff230efb31e2da36642d3b34233a45c8176beaefaa38d8e0f8faeabeb6c6cfed313edacd58f4cdf70faf11c1b9c8ea6b3efd6d925f7645fb99d3d7be486643f70cf76be0fcc137bba73ffd60be9df7ee929fd5b30cdfc1dd82311c03cdb9ee0b9f27fbc74b221556df3aec5c80dd12eefbba1af63de07bd22dbda99cbe1fdd934a6d59b1cb6b517d9d6aa8e143456bfcba8b3eb16c6e486e6134dc355c6544c18364c17e846f75d7d6d45b6e16fe0737eecd4221b04013e0d609e9b99c30ae1e66bc805ad1eec10f3967596b54003c34033a01828e6688d305ac8a27785ec0d03f8a193e3e1ecf84cbd1f269bebc7e486bd6ccbb2fab28a3ad2198fc8b337a52757d0067ee486cc8beb9e79e0e34a915da4ecc2279652c86ab9317c5c3ed57b81104228e70f51276e1f0d0d34634e18069a01c54c08cd80500c34034208cd80643ace39db906c44328c061c03c340317c9250cc4208c52c0fd6fdbb4ab7eac7f164b74e56fd6848c7dead0e563f49e3651ed78dab4c689af7dbd24008e19886d08c4944f7fde87826a2fb2e3074fe107be0eada311de12a6af5bb2ecb8335f0a0120b241ec659bf0e82e9782ea253a221151d370c1403cd90643426a9208c1aaad634b8edc618e94f3fd945de3a22b7dd1ea892d7d6d1d8e03ca7ad1f6d7d37b4252d2c6417e6a1b7d8f089921b42e9991b429927d69552ca3da2b54fb46abcd2d3f2e4ad681a7a5759b8d26980e91dbd2b3486d05adc2618d945fcc25958557ae193945576d97edd92fdc52a3f3922b0a175b5d5d9bc2dab7e7cedbb3d3b6ef3dd1e1ed7f1dd9e9be7f86e0f4e8fe3f86e8f8f773ebc5d9d1edeae0e8eb7ab73e3edeaf0f076757678bb3a56e56c74d46f6beb35f5bb72d48fa6add3d4afdbfae1b4f599fad9e0a85f4e5b37d5ef5dfd7eb485d5ef86d69144c795c90dcddbb9aa9db92241f4b2b9066ddaa39ccd579723b369f5d2b1568bad746ca59b5f0e0c8531d33655ece12cdff575a67f36dfe329cbf5eb33f5bb70d4afbb6eaa9f4d57bf52fd4e176781672c9079ce833c5820f30c06fbdcc1aed5ef843dabdf6d60fd3aec144ccff35137ef133fc883aa23892e5af54bb575e9d5798905b4415e5ad3a25528f69c911ad5f08c117628b5ac5b5696c131500c34c3c6c68686c6c686069a01cd8066401b6295473012504c984db36098eb8263f8d8575208cd806298073212188514be8400cfc76b40103ec993baeb944e3ae9a493de2752d39cf3d818c8a61ab4d8cd8038980e210e66c65183288e6b70638ce693ed836136a40ecaa60ccfd3f4ebd483f5933d82a61d3ca2c2aa86d755dd68583ffebc4f64da264a696394bac1d00d554f58829c5113cd157a157a41c0d0fdd8b9e18a9c82612099fe20a5340cc4811e836320f355e907c5f447941d9afe61621a9a2a466fc2308c3ff831a1e97913c498328461981976f5bb48558366401cbeebea3a9a0eb28ed1d0b4651dabd00c68c3761f869eb679d7356f7bf68c56fd764c4f9b75e3876d63c98ce00ba22d0aafa4a011904a10f39a476f137b82d834761b9a1d7305893d3cac5c327a1e836640332e4aa119d775551aecd73f26349dfdba2ceb3a34e3baa0188b42334a70c7152b7a2383450d327d9d39482f2fcf6e7b56cbeaf7733d7b76c81db99e65a7f7893e9c491d49749ff412e72557243bad41d6e5637605d9399d7e1b9b786167aec8f5a0ac7e107247b6be1e243befec9c4ebf8dcd7eddd6c89755afcf959ec402da10eb2e9989861a5f7aa777a5469666a36563814cafb2a06a03f4aec878693253b4564327bbb484ab965d690571808d6d3438393f6ee879e985e7b36d6bcecb2e930dea496e88a5dde635a739e9dcb75b5e8a4ff29807551ea412b921b34ae193fcacd899adc9d6646bb235579b93ce534bab4174251610078dc7d9621e35e89af5e9313d8ffac9567d4104c9b29b4e9d1dc73bfb8c4d67cff1d5917dc764ecec59f5932368b6ac312c264c5bc7f818196dd50f9eb6e67d525a289671a3fb2341d3a6b3a124c3fa64f249327afe93617adafcbb6afe7534ff6c48ffbecbc3430712dd37c58d6672035f41dbaaecd5697952bcd07d8b46cb33f913e6b12e4fc43cb2e5a7f7751d392505c2fed21fffe27e6267b07e46d3fbe40ae2609d7ed24b7f4442b13fd8590d9a177704ab1f373cf64f7669cece5f9766cdfa75759d8dcdff9d5afe3bed34a59f37f494cca48f04b3e9cfb420df87e58a2b026f65deec091275e477d4efb2a9dfa5a37e5d4dfdba1cf5b3a1a99fcd4cfd4eaadf715453dd6af7ebf4d9bf1b3aab1f931bfaba0ed7bbfb7077adf3b05fdef6bce2c80a2e5364c1726504f1f26643082184b05e7164059729b260b932822f88be2819be020d16c36470179c057709426e9d375ff2ac07893d524efab7c3fd3b6dffaefdb3c982c89e4c6e68f88f8f7afee28e6c0d2f25f6c02e5687994acf93eab7e346cf73f53bb1d1f35bfd8e46cf6bf5b311f375fd6d1b908c9ea76db484f523411fbb666dcb3c93afabeb3e9bb6feefc4b37bfa76dae25b95c90d1d849d62b7fe31b9a1b35bd927656412e47e665fd8251610876dec183704ebd23f5ad32ab18036cc0a75c09c2670e1ba82b411e439df5b426be393945ce83e9a96e75f36321e5e42c855cb75d5a22db4de18697a3edd2224a53f6b4ac80536ba20418eb87ad8021a539ca183358c5410c5155680440fb220e20b94750434acb06840c5133b10230b5856657441c66d0b3b1b0dce194f9cd18410308d2c52e6b89193c6d56af0645b108cf10c23aee0064f8d5b20d737f3682eafc318fba7158ee206b3ac36b1ac7979791e43a53f9b1e89e2db50a18de6e39c2e2ab78bde8735fac9fdc8d3fa49c90db1eac5a72b18d11a6fd6e9e7696d627d1e7297077b7a72634eee0e06a90b820409d2d70555419ae430c9c9692977d524075a51660749c93a3ebc5dff88665fc7ae5dde46a67b5f6fc95714c82c3880cf133f58220924dc8802118c8ef0810c6c70e5054b94c00946e000f7e00515c01083219461c50a3f7451832770513101cc11a8edb281d9f169299d44b3e927b5d9e12229adf292d3e3a612728cd68444d827d29b9f79fa4999d626fc482315baf43ce4243fbe090fe128a78c3ed0ea724568956b7d4f77814c4fd3214806cd2ab78b42e8850f866045164008c216ac6ad92a58f9cc7ddb8f05c2f7614884eedb6c54bcdd35b3acaa2197aa774c4005392d0b0ccca202181d7b5754e8220762b860673eb645683e02703a2974693e0d164118d3a45e2cae70a3b592499efec369febea3b1c1b17eac5f2b22dae8e80dc1a6a787deae8e8c684861c795952ca0c73cd6e3af183719649dfef222f4f8d4d95c57f0805c74511e3e6edc0a998f53084a29e7a473ce39e59453468e81c6603afa787959978b4e7ecf2354d4cc2dbfad10d8f2dc0ab9aa106c1e7a0b754d24fbb27e5df523924d0f055aaf201c4a299d74d22991a06dced7f1eee1371e7af2e213c72845a55209d13b8882aae7aae3c3449d48790a3ec58701f3c5cbca0a2e53b43145163259b08cc17225cc957804261e45952aeac4f754915ca24e3c87993de8c10289f76213ad883ad18a6885e4d2f1e3301dcf6056883cf36964ca5e98c7a6e3a517ab97b9b2b4ec92d1c16fdc85b0ee02615884c5fe65cc1dd16a8769c7b48cb32ccba280466f1934ea81f6235beda6185dd0fc76eddfd65b8dbb32466cc3300cc3b20d4a618bd697655946b32ccb34206c9ac846bbc70db313c9de0592fd99194df47b57517063d5b0614f810bac373fd7bf79101ae969ed5ab6751c119a0f424ebbb66d43ae2fb64232c815c98a741b34a3fbfe9c8e79b02c3b4744fb877df9246ba7794346aac6ded939ce484f638fde871d9eb922d83f6cb70856bbcc83aa8eded7318d07d1e83e9ae69f79b2f37398073bffc43cd7f93f56083c1fc80ab1ce1700c4819eb7f8587fe0b76fd5a8b5e87d45b683985c6f72fd5a31abd678db3c78cd83875ce669f52bb2fde43af626d7b147efbae4866097dc90eccb15e1868717b740e0a9478236cc8ac3a7fdb606494dd04118256c10c60a0ec2a8b0de551814f834600d278ab0e2852e3060228a2f0d187871c69724cac88205185a906070e1ca42068679051bc078034c116c2aa34d6a5857f0f0a32514d3d14b263f780ae971147c5afabd6113ba8fa9e83ddc550f156d8c21841b6b2c91821e40418611a6108327c0708508130c2da26581b1ba1080830c08b3470acc06d1894b2281a5805e972afb71011237d04217ac78230928abf4461a44a8e1822d50e9c1aeb29081618ae1be708229099965ddf0831b7c9145eb7a5750d8a269ef0a0a5e66b0b8fa935e649696688ce193947225556156bd314b2f47559895fc92057eacea25d35d40808215ad9520a510422a573c6685ccf335fa78a660ae5c398a3d55a41c4115544991f2e4c90f3f244972810becb0430e39f8f80409b2b313754ebf8d4dd7cdb97c8a5e98322e1e7cb1faebba99edf159486f3a1c7a1d32c9b96ee0130cc22778cb43400e3a6b8b1b1a1e6ee9acde55193f6878838ef6aecaa8a2bf5dedcae684793f6c683a9c9caeb3394784fe4e17c7367c1ae063f3ad97fe425e97cc301946174a6140c106061d136048cb923e3644509c808b1850a8800a1694a50337bec00321b674f9c11b0b60c216c61832471784c0c28c2da020a38c2dbc70833136e0810eba34a1801f6861182143c01520cc294d72f68491c4658388a37755c695d21533b27841a30b3680220a3498a1054fc88206527831c65102c270020b43063496b56254a0822068a10a326a5041040b369062084758420a4a20208c2b130c20cc304e306d7c7838c20bae20c6124558c3063642a041126250c597212081031b14cc174c3e366020715d60cec08480e16582610259660b604e00e6064dc0e2cb69cb1827986065064970e187a94c16e64b0c3637dbe373612b196c72706c8e93f35db7b181605c954990b68e63a325b3893d59f5893af016fdc69e2056f00526ca984212552883b2b4f0c2962a08914411b62083b20ef0c5173590f56312a4af3760573e7c82578f4d90b6566d1d87086de54059d655573d59a4604511a0d0851254a0ac1648418a378c88820b156a80b22a8ecdd59877c3ce716c725807feb3e95dd9347c0e3e363fd13ca1bf9d2f17d32ae8bc943252cbb236cbeb62cf0f329858c10b6a20052b4881b2de314f4f5bb7b1415bcfb15e80c611c250840a8c386201cacae1938c5c7378896ec02be450fa042c68d3e7a811844f5c9e2084fe767665c2225da04131c2747c323afe7e57f3acbaf8154217a38430c647494617cf7b351403cc172f2b2bb84c91859370a30d3268b010ac0ab35a839f702406a594d2301dfd07b7d052524a34a9ac900c307cda288491f2b4e2b2b37d69230c5bc1658a67b9b07457e2d155317ea73eada2ce7ec9c28b2e76342f78cc13aeb0820b1550458455962bb40510c2dd0f7e4208293d858f5587111dfc7624034c6f6b316e6d1805eac43b4ac8834e3e4ad8049ff68a1161a0c8b2ef5d292b64d5e482b63c6c982674bb1a834cd0feea6f6b94d85a82b0ce54a850390a82b27e744259a7726483b27e74a1ac53a162e5420d516a43a5b2410d61b9a152a1ac53b172420d11df50a1ac5b0982b220c482049ff664c6804ef4c226162ea15b7825da40db9c6f7e693e3cac1d7344b60645e98b4fdcc3dff5753d9f4defe50e3a69059f5664ac18c325cc1460b27cc1e2e5caeac80a2eb1a7ca547169630a3259c660893afc9e2a324cd4e1c72b5187df5345aec8441d3e7f2261226181f0c1cccffad97c91f5eba497a8c3df4aa6bdac90d5614417040f8feaf402bf74988fc9341feea08b150cf3d83417f1a5bfce0b844207cf9f5fb668cb43b70db77e49beb7a46fc91ed1ec1946073fc174f00b648c8ea6bf8d07877bae52a98440514aeb47245b4e28489c8ea6f230d2c186f22b6bf715c2bc8531b2343cea39bf45b43c6a0855ab03a5ac0e7cb23af087d5814956075e6075e00eab0373581de8b33a30c8eac09dd581a7d5815f1d68b33ab05b1d78ad0edcd581df1f78e47db3328147dd041e35b32777d0412f7cdaf754e12f51670f5552bc4879b27af283153f24e192e402535c6087d85385b3449dfd0e51675f85b1449d7d0e51677baaf095a8b34751671f24ea2caba2ce7e27ea2c6c23eaec4f8f3d552099a8b37fd4593826eaec6da2cec23051675f0582893afb2bea2cfc12756689c1ac908f2fe5238359207b78d4fcc12fbd378a90a240ebd9d5f9661a1e6ecfb6a5edd90133af1d1d5bc3259a2ddfc17f71c58b32f08caeb3813ba7de0d7c8247636ca9c1115d50a20918a0e8185aace0e588235452e0004579c0406103e30958fdacca2448d3df8085eedbe91d3e41eb3ebc137b360ac697a6c7611eab2918304d2d14a556859462613bb14e4ee76d7cb2611df8cf0a5d909d2354cfa2e071b847a272f4ae9e308326f5ae9e90058b6716b6010eae001337f0c20b26288106120c30031ccb0455113ff8c209455021c6094c5888b842084528a3451a6fdcf08511641426be0843832e8c21c5d16e1946f822075a9071040c0a60c5c483216200842ace08a221a8e409d50a84919e2449c710a2a191260109431540304024140a87c37928abb20f148011a2ac48509cc9a3518ee428ca20848c0100180200000000664868ab002f008972fd08d20c68684d3a868844691c69fa08a9a78d85644c1cb8638bee82511627b9777b72d36af3cd82318434571c83e5325882310496c6bfa39aa45280d49eb43809e53f680c3dbeced9fc6bf343e8d05ce272d5256fc0b830caa2b4d7921c7fdb2953f643986683d3da9866dc0bce3a59e387150ad8c930ad543c7e12b42c6f25d0930f099a1650e75640d22c8558f20338973c2ef247bb38c430608676121bf5d6008aa6407bdd2c4b6d16617205e9a6cbdfe9e60661d8f35c0ad2a7d66aa256815600079927e038253e5ced6e53d1dd2982d596c7b00117245f591780491841dc79a03dd55660684e271c0d9cffb377bc6a287915cbdd4da562a5635e36effce215421c548249693c9efa077b3be19a7e23ea5651bdfa09125c1ee85b8ff688ad823b9db05510b0ea83a860d04a1478f51b36d4fb540bfba02089bab5629668fa6964779e603536ebce01305a5285d03e577db1c8e2adc3de0741998c9dab63cb68245e2417c5dc195e85b560fda81490ed048cf59862ed70348b34574213fa57ecb0fd878c3c27a1b8588c6dbfd0ff6c0d83b48e9d4e3efec17e287cddbc21a039d6e5c366777ae7f0b7236793f1997ebef6790df6d7fa104f89ee0a0da3e9235ef40c9e8e671469cb503ec84159a01efd77a0543cc584a1249ce56ab5e078b1ca2310a2a9b39c5f30bc0eba03fd2c5a97b3ac1e11ae6281855e0aa7fb60b5f5627030d2903cc75cf5de2ff5e0719c542a6a162be36741395f56f9722784242f37ca01f32aaabd7dc6b889330691fc1c0f973c085bec70eb780ebddf548fd61c2eac9ee18e8a5a36408afa4311ed54cf92d84df4f713ff1ae87db5d01b06289af7bbff203f1af17ea0bf460d4e2681ebaed2749c6711022e67934249d5e2e68fb8aceb361615a3179db964b6e5467daa1f28d88454acd06506c8da31c950ba6515178cfbcfd2837345b99c3c87babade68e9b1614574868af22196fd259ba504f3af42fbd94d74a43f9531a3ac8b1245e358450d6c52bda7ebe7376a8ed69f0bc7b0a2121e0189d1ab10362b5cb640ccda5e88706735c83f6995045447c558497172445fee61949c9a1ff057a24c5d1d1bc64d8cd0381c9fc6bbc59700acf442e75e9f8f0bf67ebd531704bbd3e2f7fd1e544d49a5e11e39416e69d6f05aa56a90eb6b8c0dd632828823b23ad58619b4104ad82c305967b522c7f0da11df1df2d450194d3e82f92ce0ad430e46bb330c5a908a82bdde23c03f99fb346c29c55526b7139f66362cefa3b71d7ae2365d6417a04e46df4ac492c269ad0e459a03ef6e1cf05e5791c29e35570ca9a335279782e821fc2cb2550f582aaf642c62418985a534f6e0f104dace5834e923efc69ee36f653a754c2f3375e2498d4d5e677f2f4897c30d917187af64fd0cb147ba260755f088c51eefb4ae6f448b5d4e27dd59a2334aaa3ae5966a2f832d3cabb9c1cd676614cdfe1c10c0a9069242fd6a3daac430af3baafbddf1373afea06c5dda231230bc0a570516e60619a5694b47fb4108eceb0ff0cd73e52f469d166d7ae0b1cc549054330a0a857bcadd6ae6c90e521f0de8c5175db71b92b32204a2eb403a2e0c1191f98b565c314b947d42b5e75cb2ba88bb92de7acef9afd7dd56e33a5cfafaea654a4e73b6a6cb3b7f14d32769c4a3f36e7484a7c97f1058f94ddc5e67f1b40d416b41ac4e33499c8bad0fe675dfc48e9a1ab413038f28470eab8463b765ca00894d8d941af8f6358970430517800621170d0616c498bd5bbcb0b830e22cbb9a3772b0e269298a1c6f65d93ecf9d30b718b16456b5bd6bb9f0cd624943674b84705a385c8e0219886fa88095ddd046b9beed670e287000a78647a20d158091dcfee6dfcc2a25299108d0eb051ef1af9ac2a26429e4127a2831661484a2653a6dfbb7ea86252e65e362195e7c76ff6495c31bec7e08233b08b7309a01cab9b3d19ab4b5835ab9f0e858e98963fc2db092c1c02ed24798212952693b2c50c5669d0ec4683fe776bb8e8b60092c83ae335c82f7d01daa02aaa0a360964a1cd16e38f2159c5cb83ad1b788b02fc3c2b6e23180cf425fc4d66b4def4b4ed9b7cdf1cb1b39168aaf0287e502c1d19f6b12a527a3b8fe2e7df78032f48e82dc13d62eebf7d416f44c13a8a8827eb68d184ab5962cc1a60663b165fd76110371eb7e76656e29fc8041936550091f01da907c805d2ce95d8258ef7ae614a7cfa1d7faac9045a4f49c294a1eee28ab6686ba34c80918774ed9dfb1384e15fb20a88b5f816547ae66bbf9fc004cfda0a29b2c18e94e7e1566c071b6e41d16ffcc35566b1f30daa6f86fd8f30814c552aa6de781bc6f47b26e91fec9c0b8d1ec9d348a631ba26d9ffa115d573367b153dbcd7d597f0ef4b725f43b7fd9f5609ef0745a490d038c8acad673e24bbfc24bc365519ef24f4194263c14399d1a09d3acb9266a2cbad373a9c8b0f6ab07fe834eb0a63ca7fb2810136bc21d1ad54662fd5348a04f7331f01679cc1c59618eead02b24e2646d08c9488a379df80c29cfed71d9e32e2ff255d74f747ac8ca10d1d9413eea018ae91cd04af2866944550263e43185354c84e5c0d83112e5b0ca2bca9f45ce3fe2e9bbd6290cc0052dab0f9a9abc95a27612c73169e1d6174884ac4e0130d100aea71e49342895207eeec1ad4a5b142843380debd1cacfa34ee8e882ba2bb959cce8b97a7f0ad7e7562ccec89e1d418d66640f26b20c54fcff7e7e0a3b8d3950f46b9267904bd8949fdd19535f1cd56bd8c4876bf3da84335bcdc0b16bfe0de9f3f8042e1d9fa8e303413d20f41032244b9b32f7314779d7058d85501a7204aff0c9736fb27169c8ef575de14db8aaf76988dc74ce987ca40dc1db750fb838a5af0d60652882aa43d7863d832db140941ca7a118bfef7ea2e9b1e1c4f9ed34d930b1264c2db45f3511c602019a00153e04ea9d88f2219ff8b47712b1c7576f56cdec3b32bb5aa1a5a595da8372a2f3e9ec049b64795f89fa30df0ebb2e315b92b314e72fbd4c0e2f032e32625e10e266e52a2df122b749360c5e7c3401c2dbff03371df3c637074e85583a9f20901739a56115fd54c911b2cd8a74ea3bc9c592b04e61352ec913671c51fe2eebdceb209544703e385bce42081e856f4a6d43152b2fad04dec5d1f2a151c73515019abd49027921c3d656d64a05543577d7f838a05a886a8f257e3981896b50191dc354cd061c99280b6d8faed2fde9732b47c381f86a2dad229fe61ebeb57a22152c4822c29ef62152477466515d98c64cd1bf21e4a320c45f88e00e6c2d45530731883e4feac1a76e7e6d65668cd719d25bf8ef408fa893e77806e57e4bbb8c826dd3c3d3dfeece67cfcdc8f41748c67125bc5d1c41b55375a044fc0ecc00ecde322c8aba25f20bb78d6ece0ff71335a7a981f028e4914556f71b634fa1ed0233421d9be7116ff68125c82bb978d0757085e0c1c084b49deb2ee0b1f28c9dbf8e8ad9de3ff8d42284e5dd209447b6ed406f894fd186ffe1ef570d1d19f34fab442aa2870b0049f557862ff526d6996847bfac2a06491aa67d2a7ffbbd40435c4ca5422052e48161dcea4359905b28dd0170e30c9df8db67d0d33a234d2fe010403fa7b019867d23543a05b1ea0e0d018131a88a595ae5dba037a46a84813a24e2446fe12211ec1381682207823d789a08001e88a072fccc3a0ea2d50c19c1d69a3ba2143c9931344e31bc42a83c3b762f429ae351bc4d2642ce3f9ed0aba084a92477d0c2731c960b07515e020c8872eb3ab74c106a082bbfa19025796760e04f7f241560f878b1c187406039b1f11598ccc4d3d407a487ab3f420f62036dbf1d843b37a843c1ca4d09173ceee578544089dc17d3682f2cd1d4a482b88ac9f9ab445fabdbb560c3bef247195412ccca125783297a04c0cd1208d1a4d9839e720b8da7732ca1f5d84fee5c5eaba46ef334976dbfec59ba53181cf819c212f12334711ed673727defb1f008e617ae2babf97173e90e55a8d7a2372556a1d5ced794706fb6e0f3b34505751cd66860c75e9137b00e08e52dd6a029af4d66d610c61a9f35204c8dcdf6d6b054e5025f9ead135ae777a8c6453eb2587e8e9d03dddc48535181172ece036f270968edac49ceb97ccc9fa00e8a75f91357055de22322b1cad105c6cb0938605a9076164a2277801c14df05a8a1eca4115d1621f8e222ad5f63d789e09bd48d1166a4a1294d128bd6046eb8c31626a60439a565b9ed0f9491af22fd7e7eaecac6e6db6d684155f8187ca4171419138e3768b1d8a0b5d82ed0fe0204496eadb098a212475b36da3ab4d3ec360e30d653e10ce1d4add39df1114f14eb8fd28545607fe885e69ba9ff84dd87aafbf04dbb6c739e27bb1e5cd7d197e2e638ddf93002b9b5c513c6fecd58dbfdd2410720d6bce3d4d4859b742e285596eaed0f1ce49d7f1a2e5245aa0d48e503e892e96b747a76a46cc62fe9a1735c661815aa38310e7b7f62352ae8114e47e0cd4c9159b532c1cdb2acf84d3460b80fed364c8fe2dc1a42b1b4b56293c72d3bebb0a6c7fccbd223dce0f2e49a83d0ff9ac3f78e30ceb36765f48850c6178b68c508be4ee9a5ee95a6ed80e1ae4953a20832883142ef4368b33eac966d8daf7f51653a799811cee61e802afb059a831fa025e3be4e0cd25611522730992fae088f4360ca3b8a724bc0d2baa6584e04c6c336332ee117b06771d9461f01974d2f8971fd5dba54890afc5c57987c1765810c05550308c4613ef68e628205a8e6b8f1940baefbb89cfdd120072302b64e024ad2f1ac7e286223c8dd6e9f72e2ca01947ca9570425b86d4bfffb64da47638634d9a390da254f24e3895055db114f5f174019c9bc53b76d4bf4bd7362e8b73015a1920c8852e37c3b404bb93043ccf342b4e26de27199d6254848dcb1956a415348a99d03ffd2b048aa6dbf5752762805b01466873d30792c76c6a32882a467609e19f3d1675c33d2e4afceb28b150ba18ec0c206ed89941a10eed90656bfe23a7b493d5afa0cd8ba0793287cfac282d698c4f368ba72fbade4842c483d2831ba1b5f6fd2ad70357630f03e974a8fe54c5e00e7f7909f0181b57d84994f06041e0eff279f1400bb1bd04944a443a97fd492335aa1b598aa258fb00c5fd02d91eb5445372af6d653fee12a69e8786260ad956b87da731f3e55644d416076f2810746d829e1579e49245bd798409a5885ca1b8b10ecf3636ad85f4e08f6fa44276f39c25e15e8befd68242df9197c3976591770c60378cd4767b9da8f3d0ef5b268eedc86dabd1f43857ae2cb4e895161e3a3ef415c451e2fa528838858244ba9ba811fcd4b5f7ce8a890fe7c381a8138a52ebc612633b4b9708922022c0aeaa3a6164f6306b5247a4a8c6a3bb4330c99bc03ad5e7896a7853d2ff68da2ffd41280f3d6c7f9d2517632137f3a7eb4d67400da9769fb5579fe087fd6512f3f17db50807b4057ae03118501decbf2f758f31eeb389747b1ca2ab1c6c2180b180681e05f63d538ed3c90313e6e6a5b8662ce8c87db48779bc80742a30ff21d96bf03cb77dd03f50998c899b32e81c362e36822e30f2a98ecb88388a056e6e7a1b8f39294f990bb9d153130345adc730d6112a255bb3f5e9c0fd7e6c9c5453585c18c94fea51f4a6bd173aa944c3039609d07a25afaa9cd5c860599ecbeb408faf346a12aad781ae4632f34a7123eafb30dc52c19da445e5fff7c5b74914ed69ebd81c8121dca43e37f22d4ef5282417f65ca6607cdd6afa89862ad5386d14a2384f159590b49b50bbbe05c16d20ccae46680cc38d7a849d37e2ef0c2427ef86199907a19d02df538609950ddcd1d751052cd894e2e42dc4d8a8dc554e07a76dc5fcc7933145193801fe0fbcbfd3a1fc9a0bb6659e10a5f8056b5050369eb111a58c9ca1ae94ffe4b8359fd6dbad9e3d60a1f107f29cfadb448c58d9cac8dac6e0fa7b832b11c246122ba3878f76c9a3b06929427e259e7b7fa896f8eb233a85887d581d853ace450045abcaddba6b9587d107dc7c5fbd087def2d31c9be8c705b2f43ee4f1c098e66ae46212f494a02ba2dd6d50c6c19f95456c87c2e83bcd0b19e2c394ce70ba4f7170300c6193ac92933bd3e807828aa5cf85cb4bb809a698ada5d48a42fd74bbc7d828201d3afc10d80294186c99db053505a36d53121c688b6639c0d40a72dd896fd3cea4dd4fd54a1b35d0f9235140c4b3a2682aa3e36a3f44a2e2eda3fa4c6466bd9918d961c38d3460fdaea0b486c02e6c38be480c7a188058cab0821aee85d84ab4cb4028e7c01188faaac0b421bfdc4850ddc7e6d9d726ad8805974981a8568942f427eb0cb30419a401db2cec07c10f7611d5733e2892bd03ab8f1791fa61e1f20119e09513379f87928287f952445bb77a32dd3f8cba53da027ed0b1a37cf8fa8ed8ea998f1833a13a47607db62054071aa7d5394d769234d8cfaeab928ffc5c4e2d9a736259edcc0395fff38456fb0bec9ca0093d05333de806d99a385de62154a12dc5241130d9b519eb86a7cfee3e1c1e4a93b7b8f236d5721a0313f7d1b665716d2cf33b762a6542188a6399b2b3cef9787a4971f17dd2fb9d2308d69513ec191450924244718027e65d9ac5099aca85cfb676885c5019e62321a142c12dd844829c87d1749adc6bf7f635254d150a3eabe5567b6e4c35c8238fc4c9572a7ac4adad88aa6edd59d681e4c974111b368a71843bcbfcfd4e82b3ec6a8be4ed727a5bab9fc6289d8ec081cf0054fafe696c722d5b582988458ab66f78d97e2f74d9ccb64b43c397589845bb6a753ef1277166a2ab0b78f1287e4901e3270eef80b47083056dd62c4739c431c536826bb6cbfbf452226316078b840fc8640d5c7e2e0ef56717d684037aedb4e102fc11202e5ad6660d286b79bb25d466a25222e33074324ec01ca945812e7ca0de10ec3502bd22ec2582bd40d02bc2ec457818fd4e96f39f1749969d12ee2f06c2bd89b1fb84c8d6ce16ea42d0c13dbb5806b9d03ef1407972c41180e1b425151fa79adf406b5244552310eb6a1855d3b7152e9aa9da84a61e17c15b252e146b762c4f481fcf5cb812a27e14fc3532677bbda76d46e9353733af215749a2cdcd03de310d64359c5d030e2c3c0d283d910c4805b78a45d9db8843e83d913f5757fb1a917fb15204d1648ad4d6275bd85a81faf26a603d198e6f970c2b8875d9883de97b79954b9bc264ea3fb6f98a453bd90c23da26f5e783c2931bfa16bdc1fda03d476c4d440088b1f9cbd1111e4850bca67cb609f0a3f166a204cbe75848a9bc9da81bfff23ebace4bcf06b61d4f092e1466a4ae76e96853b738c67be334a7b95f3f34a157d2040efd8da8504cd20c99bdfd989c14e0089832005e1cfac353a183568806da294af8ec6467465ded84c7906b8f7f0325435f77c39e63e874a597e442ff33f767790d2b0a3cf049e7fa5fc9e839a603f6bbdc43b21e2a535a371fe63bece890a24e353320af4d0b8b92e20cae6ef1162743f2ee350d537fa1c6ac022dd1160af9da53fe120670b1b8f6495178e4a07fbd99ae22f9d46b97ca4f9b1eba5974dbff180ab1d65ba115d49d9acf61602e9c31fb05be02dd597e099bccbaf314af225eff07f07c96b5877699a0538c1d46307c788d8fb84dd612838c8160a5c3e952c316883d14143bcb54cbb81f6412ad52d40e3b023d0b604134e30994d57ca9d398206396f9c116694361a01f2059efc61bde0a61883c78e2429bc1d5de6f265b054111788b7e51d096fd94404c390d718c6c940f99fff08df3407240cc1dec9ab2f713c8fa6a16d25b9d0656cf25e40890aca1ef09160e6da60ad7732d33b7ad13335ee1a9509fa0116170a86056c5272e2d7898fc836c7be37d40c4b45fe8bf14fc44f4a4ec09e30ec71fc6c382a67e1a74f341e8c4b6856a7eaf5fbbde7050262c2d8065369f7b518d38ba537d7392b3258f12d72dab90a1c098580c0a41c582370a62ff2b785f0a37cf60204c72a76251cf57303251e8a74ef415acfba98a7df070f3b6332daa446fd6236afa104a736d85761593e4b6daba3b84a85e2c87bec53d9cdc7a468081925daad1fc078b3ccc4a2079bc19046b375541ae8e8a61d12520fe063187e7b2c208d4115449eb1ff715914c6f25443fba843492b7c7e0a7c9681cfdddc93dce1248743a60d005fb8bde7e118589457f17883db94f16ff5c75d931dc2f12dc2da73f09740af94022d4e7cc08d4c8162de392b6eb0eca6932ba83b8aad1f540548b77be118bce2ee889c0a448cc92a77b530206bec3aa771d14226ec92310c157a21fbb60e920b33ce34c4be7d324d08764ac9fac9615700445b978ae08147b952fffc3d9958260cf39f3c737b42610acec5a7f6599ef6c297192cbf877ea5b56d09cdda12662201e401a8282a51711d34782e5681f9d9c3b8e56686c42c2443d77e7e62bc970fa440acd182362eebadba88c522cdff14f30f0c37e2371ad097b63a2ea31860096c1847976682a3da4310ca5ff8c22ebd4dd590bf2125e278425939222f8ef8bc462a838d017829c4f08a0b3943bb618ff5790af7de59e575197a4bb20546e45a0e8a788d0aaf3b956347048ffa56f6a20527005f468f0e8a230ad53a3fa006833a9bd521d752111b61784f91f400998eaf4dca9c2dce887e6943f2a7b1681317bd68295d16779ad8e7b41622d93be3f0ecbd3e3031d3fb8dd61a952fe9baddbdbb459ec56fcfb78612004a81dea20390dc1c02325e02b1ef131dba5580100c2d6822883ad9bf0b9e62f5d43fec234c7db9cd15e47bf1ed2da24de654f1ad0524581072b27e80f15a542cccaa1d0074b83e20524abc8197d64a785e3abdc45d682106144085b662855804fc82f7bf4ff8810b1968caf7cf3d9085d5ecf31ae2499d38a519947af2418720f74ab73b429a071c68ee0c70785efc33ae3022b0e18dc948a47a0bf7d8898f74abd0b7ecc361e37db75812eb7a93500e8f553fab805f1b1bd3e18c49ebd9ab8157240cd22bc1fc11f26f85b33ef7d563410cab55631a1ae56ba7d16a1c0d5679d2319cfcd4487d5c447d41bbbbc1f451d0f767cac9310eacca19c93deac6871a234017ae997755d28c1b09fdd632553ef49602a92bc432af51b45266b49114053d25de9a91a45e281eeb225f25024c51cb22e8c8e11f9a48297c7180b6c6c46c6c70c0e70fc6ce6c64606335e3ef6d14e421127bbf27934397a78b0238db036c28422a956437a9f3717a2b4582c84214514e3b949f4f57918d0e79978fb8d17fa8d78b60a59d28e928f6450ead762312045bf9f2a12e2623d0dfbfc68388803474773bf222601b100684a392519ceaa786117007d85919f3fbe88f20711a4193b26b833729d9fbde472d259fc928deb10927adafb3d697f361482cd91f2a25e1533f7015e57c5e234452851cdb61f981ccadc468f34c10972b4082024e54a6510444476f22b43922c9527f783d7c426ac026da7da4c8081f4b93d1954bb1ba3c39099672be777a6dbdde8ae653c9321c10a3c541b1982262ef830bb9cb3f11041cc32f24188227be7839a3878b26c74b1c27765173d87c207ec07c957ccaa416f7dc227955af862481accca522cdf2cd2b4a5568f03a6b81437bbb1bcc91b5632cb1a2e844092159eb7098ddaa4fb826a2f2baf4300cea9eb263d2111485904d85438840d604f4246d31e83426c9bd338fd2656446cd43157537c66013d1a35a551462b580e0903e2d4fef8f3c8fad60e2084ef6ed334f966d3bf46e8ae8e06c784871a1bb4781b9bfe211b403350766a92a1b7a9feaeae6d3446212728fe3b4fde4eb84e6b7eab4075b1dbad8faa3f7b3b9c814447a030a9db674ffb475012c7ccee5e0489045c62db972aa93ab053881b425382574253ffea6957609fbba618f45c0123180303afcdf8ae5104d91a1f21e1373dceeba8311db60c5add9ceffa1f14ce6f649a61be39ee3adba54a1005eb2c6776ade57e09593d35f52c4d8db3d45c1b4090a6e4711bc5b1cbf55335c211384338eedc0094f5d3801287d9c0088d70eae49d84efaac8002177e62490e13c91e16631960405763bc731c4452008a30f11c7804200978eebffdf0b47104c62a55eb7906691b5b6296fd503fe12c37399dcac2da23bb7f4ca75cc96351994dd4915ebc8030850bf4845bd79beb25559f90b7df660697b16a2753278195a366c7b86de056b228fe6fef050085fd47677a8ac6de36f60f65272b7a8b21a065de799030b3c62e21f191501d3572ba9e82bf4fcd815f41a3d157d877b70195092789d703636a27f4e9112fd6fdcbf8c1b5e31df88011f70d235c4fb95c61e74f15e54f2ac46448ed6dfb3c96b32f490775096ebe1114c263e979737501f8833dd3c89ebf35e14d7841efda13cd6cc30f3013fcd3c748ac9103d4a86bba9b63a5d67dab60edb300872e9531836d1e0fce6568c988eb3145b87e69f6f3d693185fccd7de6811fb42fc7afbcd4c1ea73111a37d107443bdd7ea87ee3d5f3880af8b8f83ee339a9620d4a71be470e0d6ddea37fc3d47fa4a17b4eb8639e96a9ac5e97031964de6b0b7da4ac3c80a82724284f51a9e6586f7c5fb11b1a6baf6c9e8351b86a3fc27779ac8b822409f8b28ebdae4956e37cafc2b7c25c811b2785117e310f175a347a61025ab227b07433f4fdee303100a73ae50d98ca716f06b30294669e530e0d724dbf16ec7523beff1a435f3f3972732ceb52eb576c3889f737dbc04779d6c02c621b7daad6356bfc7065723d2693565753a49f1216dcdfbaeacc7a4cff52570b8557b3ae5a5291592ec944e258f6e6ea4190b45c789fa13b174fc0a6742bee2811b76ae3575517e81657ca624ca7a00e731341d03c2d7b3b59193cc8df5f96199a0e1bfd3a051c02a84d1fbe10e4edde60c04cef415c584338760d9decc2488c71fd3572e62e406837625f49042e291052c7d275df73d097a81e8ff858c644ca4305b8c0f5b38b82951705da62ad9739ed8bdb62c82d7289049fbfebc131c84e590684ebc77fe2d84ce30ba4f6d80b9aa94813c430859ce633e673296dba9cd7212818db5a3489e316c9a3bf11d099886b9c6c38599642eb8608f48adf42e0c2b55f452c7ae4dcd9682eb8961028682dfc45403507c14b52475c9251db3708c590262f9b2ec4038bad2dc1ca837e913180e2c6d4f4c78e6d03f2cdb89bf20d5e4696e54c6855e1c11f870ea4bac9a82da8f2325df4694463c45259accf511415c2d63e9b06141543611bb2c2b51c82e6858172474c71dc3d934668325548299f5fe976dd6ca5deb130d7cbeb2d4e6a3fe608fbc5425d64fd09094a02be500d87aa0cd4aa5879359363258eacd274ad51b99587e12a5bba261bafb4e4ab4c033658c2b2316245c9b1b1545c5db494bb6c5d7be409dfa57d88b77f7c0a0ad36e053b3c1a02b0f8402924f3eaac98993d2f19e842d57727923aa41c158504a766c86f2c83af85b588a419eec8c1b457247d365091206d12a5f0f6758dd981d04d96c21352e9a0e1530325eba0f8d230cee283f641dc8fae26d8c3f1a2033667c3552ab58a816143368709c4eb0778397ec657db12e05fdf510a324df97efc9858e2260b5039a66f4b27a0aef0cf8519d1fb2898991ebea4376c96fac4ff3b17ea136442bed9ec59613f170fc03c0dfe9838a544e165689abb6582ef4fa029ab5df1bb34c64379447761c19e261c6b31f45f802e8de3841a23e31fdad2e2b7a59a8cd1aa4a66efa5b2a0372ccb37a040c4f27706dab7618d4cb1220d8a2e80ef18deb4312257902f80943fb8991eb705f0340fdd6eda44c4bb33f1867af834fc37f8f20070b0f4048ab28c0d1800d722d0be89826a39544af4870b82994ff1a19b0828057881c34a3418fd0862cf8ec97b946a651a399f091c5e37172c10faf905cf6c58b02709d635e381ae09d2ed168e4686fa53e5bb59e30f16cb8f878260795543372848e705b3da25061ff8b28b4b0ebeff5f4098f5c3d0ae41287ab21263e924bf8dd61aec99648a1f1cfa6e1d55f590c2f44e426fa9d695ad866cebb8e479f8eaf84d4be40ea9220551a9cb6058dc5938b5ea0cd96c7225e57ff473375f9b316d13d78cc52224bf29c4836df344b761dbe9e9b32e8f6087fe2cca4a7b3ebe2b26f3b28ff123466304b1790b8d08346ffcef94c8ded83ac03a7b7a00a2582f20a182cf1dbb8e1458374d084bb40616b66881ab680740f4bddc59cad121a0854805484008d2fe07edfffd823ccd010ca16f31a790d7950efd20cd95894859cbecf66ab5abc43c0e3e316574349d67d0269cd46b5c9726b3ba91831295e26fb662ea7115db5aff580f4ad626474d6ae1505c69d98d3201982b6b87f247494d955cb904c2180d77bcb7d2b37c143fde9d50a0eaed247d57c65da96e62ab3ee1add587a2bf9ed87b2bc55f32fd5fef7d7bea1f7862f0d70e5567d9c0329498f287e311f9b89353c2b50ac6de5cd1aed313628c8f2c8b1275ea56d7849f6cd05e1f7092cc04e847cf69fd0348bc70865c470562f385b9cfdb74d1ca48cd1f22b6e3bb2878acf6b0a74d2686b0072286569e10a6314609a3c6afc99c54669bcc7b2204408e84595623f8391f0c48da685f942248d85b47faeaee3d49abbea7c36468fdafd038452c318d105f47ea828ec2311b05fd4a437e5b69d65399dde72a61632aa97be03a5153a2058deaeb71e3457140eb3883a9382c7c66cd303bc69055005b57a9a6b1ce7d70985fbc0d4b05a28486db80c0e4db97f956da799c8d60e4bd8427f46db2a133928d50858ae4e21b5fd3606b5d29b4ae6ff62d76eca800be936668df4480fe5548da9afb9bf33d590bb4afdb161054da4ea7845ae89ec84aa39351157eea673954807dd0811a5e40c1491660ae8e21aba625a8c9f51f26be8f6a0f445b5ab4c58b5deea7cf3698842cbeb46cfd00eb59339a136314d3ae01ded16e468f2b6079cd46386d5502c01145a1868be228d4bd8f3f745f54dd1870c0d97c0134e6c982cd8df97f21fa208c41d559091931a67ab3ff2b2024d25c5a72f53252c3ed46fb377616ae5b7a3922bf2d9bac39e2d29d21073e8fff9c2add6de1fbb333e0202822a1bc9fc4cba24d6f9c693d75972e51ce4afe9ca3d7990568542e6254991fd2e18bbf7fb5da2aae4a2d740a34645e976c41e087e095036530133f71ca9e5060cf50170472bc3c08d6441da7926f4bdf55ffec12b8962ba484fb63322d618738cb3320a6a12d94b77ce791aa182046127342ad90b7292ccb1f94f3d8a35051b93d7c0e339a158bbc1389d163f9f7b61b135c2b2816d7d91b7881b65e539ba7440df765a2b98fe9a5953e34439b1b3d1c46e75a93c7e6f7d1e7490264392b1b0dc090771a5923236e60b08b220bc5a9fb4596f4a36df78fdabf68980649075cbdc2645961af2204d1913bf27091594b288ddc103112b02440120fb3e40ba09622157e9a0d4d0291e87dbc1e098247edcd8968b7d7030dad0a60c1757d8964493f58a89e5abb9de1f4041e1131b5b043d4ee86519f11e32975557ee88b00e55e5b4dc3d9a1cf218bbbc05fdb9021b09e75b45e60afab815f76f5fb23d9fd6ce56b540274d68f1785c21ef02f39489c17a74a3e7b6910a70df45be1910b84c01ed4e1ec3b41989b53b923d67b05d3a3750af871b90b3c470e1d0111f4dabd8bec1536fd2d40f2f9ce5e8d5c8e7662acc91d6987e000a857cbd4c3f9c8ab21454fe4eb943042eb149940414592c6eb7ff95408193941bbdb607e438d8de3abb43ef9775bbc11b91e34ac520d71ba12cc2be1251a9528bd5dbd91f1c343ed9e42f9b3709e16217085c923ee0e91d1220a5782901099bd1526d4f0ae5723bb2f9d75760cbab43ec6b10e6940042fbd61f4ab64e109dfc890cfa021b0a567a5f5ded92320116f9355efa3b9585f5bf5e2075b6ae59d203b24f6ee98fefdc4d00be86c1f0c58c8f89f6014edb9827fa4591cb460a743be36f001b0d47efcce8abef50cb0478070a7caab15dc631bb0f9fccd000bd71ee57d44afc70e33988846c31cf4e97eafd28f5f8402f03aa56cde9d9facc765aed0f5ebc10b20fdb367a9fa43fa5f55558040f94b2f38d153201102bc1fe20431fd854f097c715f3c69bc53c225c602cdf276e0ed37ecfc4b81c76b9ff6aa44fd1737644b2a330f6f8f0611e9c5f98b58dc782502dd053f1f2b141669a1ce1971b8c856325cac8943fb956d968ff7f4c92d2e6cccd23a15e26ef13971086a3229028880580fd896150bea49e439554f514b92e4b46ca9452feb14c9a8a7897c6b07d8495d90a5a855e0efed9023e22415f3a7001dcd979cf10615e1ddea905d5aaaa393058f52946ddc18d62ee65ad7cd7f9b984df0f7ff98331808241641756581063cad78fe4db169eca19d08f95e4d344559046a470aaacba0a604aaa2af1a0ec527bdcbe4ab2b4a7805679e5ce86f334a825c64ab2b7e66f23b5b130b5ae7315401f8d1ad4949099147c81400e3a7dde74098b72522e539e43ac084d06bc78dfbbc5a9c66d07c4bccd30bf3f3218f8e37d9839446ed687bfe448ef340396aa34724903bb66308bdd4290b0dc13b967a6e82e3cd1861cbb8d3249e8e5f25a64560fd308a994720fa7ad13b3e716db1495ea3d2c4482448cee3176b29865156f8b2906cf1298a45fa2c413b24543915f3ca522d70a88f8878363bc2f1303bb5832fdcbf116ff5109fd203f4fdeb3b587b57e70592512ee1ab1f5078e739f15214364fbbdab424c2677534b2d030a1a7324f4c7191c03a6c47589be595d1e95f19d480482de282abda552be68fae45346f4e6f803e35117fe42cde2307d16856e6a47b7d47395a95fa1109bdeb4f4c8690afb088f3d68d12add815d986f64d664449752ad393fabba8be222f9bc9300a6be4bcdb4fa2c6755ce6c715a6d09a039786297eb90d62c6fd55680dbffa5bce8be03dbec8dddcb348cb5129abf40f64435951d6bbba2de8a5dc3e6c7bfe827f31fd25e179a62d1f312a699164e1e15fcb1e3849095295eaabfe4758d9b4719db0afcc006ea6b9a78855f8e68e2df052e19ffbcdf587ed0a2f4ed05bae2a79d9194e30e7b5193e49d428a5ff3cc82bdc655e6de4b0ee2755d44d6d5e74451d8d58c35961323791f3938b696b9a1e2ff40c149c87067c6684832ab0d50cbd2ec55f7c22b29e7cd0a49df9d42725f7f7ce26b055a05996de247f929821539ff313539de0168e7365b09aa5cfe311034706b62611032c5eb9ceceb26186b5a4fe971c9e637ceafef2444a2aa03a10f55f730ba6103cb300e50c2b7bb9cc4bc8d1df007ad0ec4114a8e69db5a5b9fa33fd90d1ffaaf95956f1523383fdc0ed4795b2a6b9ea10190849190791a467c7623acc72afbc3c596b3cb5456d9d3254ca23a323cd7a03c804f36360272c3826362d4cec009e2015221fe6a00c03e82b200df2b10ca75ea12a2e8bdd8a6d53aae4e989f03557cd8f97273c12e5940c05ab6931cbbdc1ada48870ff06b4ea832957341d453247c4ff80948208e01199b315b0be238fb397c5d8546c223890681e26e336c4b28ad27cce4d40618b0e734219eac0fe58b5196151b27c1d1adfb84052743c17656b6de6959e3a78902adfc408095afc81b980560c0ee4590e84275293d1a5414d61cbdc6ea8df524c5e988bde94cc3311b48aa8b5088ed35c2f584a0c2d27d5fbcbc829a31d2e9c4028bf5e6756b43af771c88d062e021d67ddca7e1dd011c46a61b4d9685ee52bbd51481e889c20b9818da932e599e9e29a1ec40038d8f813b87a6f020f365e4e855dc10450e22c54746888a0e62a19d3ce51640cb88b7cc6a2f83a6d5da8004164f35d89e615aae99384a5e1b34c17140a3d23f80832ba4d325998ad0ad2e9858bc8c85b9d8270e4cdbb52d054d697c81e0716cc457f98599a696dd8393b61a14393f7208f3d15fd46ef36a688190ad0f2a5608a7426c5c86d202c1e347b87a9f4f1d71b1bc4c082dc332cbeff8d51b0971c19ff8e6bbeca1a66ae0c4e8630b9c5dc976b99a5c82a69d7077b4192580ff98e86f5deeaab59f4dd8de83d4faa1fe6fc3b9f0cf250b03c15a76c7927997b0250dea3df3beeb08939bfc92c0ec9f04f688a34a7260a99140943bd958fa1c7231926a73b4985bbabec85267e0314a43ee5f47e13bd58e180c5b9062eef97e1bbba31b3e3a8c2ebb7226082ada3dd4ccd6c737a28932adc3d0b5fb003d5199d77790e8a5cc3818be7a43c77ae97952089b76d08b1a38b53712bc1b3fd22f9c25aed8c2f75592edb8e69d3cc43501cfca66132e90989e2e0dc35b3aff951ccee4a6363ebf0632a63ae97fb9fc1e5cf64a736926f9da422d209bb36c25906812760ff9c99add365fd3e571e65b1007353e5f6ebe77ea3a26f97017074640eb99f58fd0452f2f3b3238fcbbcdb785e4330e5100af8e365c61417fe10b946d814d8d63f842c21360e318b369c7d2d087bb9c04cbae7a3055d75a970b16a56e5ccbcf6d28229c849daa53f993d24fdb93f77e06d8caf54e76cb41003e744ba3bd0765783db2420903647a214a4d052510da5e4987674d8b7c8e44814a4ce43ab2992d802d99a99e938fcf39a07a2bd26db1ec4b345ef18727635a41aaed1682530fb8f0ea335683ca74dfc25aea10a393ecba6ad1be2d3822bfbb2a8df0e9b36581f32c24c4579a74cdfcedb6324dd4b68974dcc7404913bb52129ff1740861084fa1ef85a47592e9d1ce8946b1dc56e2090f0ea823985d30a8b9e94d8aefddc4d81b15d7234e3422bf74b4ac6aad0f241c2eb3cf7f3377774ff4b0cec0502305fb00cfd5f0ac1cb5815351733a548cbc74bb462b6c16098b9754b2f29ea6151e21847042f81b23d5d540bca7317c265cb6ae4227e5252a3b03d1d00a2918d0503a2452ffcdaf116a2f8ff824fb61a04c1be9df069813b5d40d75583b3dcb152ad795dd71e68ea7826a382524e31ccbb36a6eb92978de050ccca7df61e5a341452b64f369075dc801d6826470469f47a32544a7a0f8485e7aea9c2555df6beafbfef18312151d002d4eee36f6e7118dd8760dcb0b4a8dcd73be29a2b37d7b1b845972905faad5a349233648a20aee661060adc331b5b9db7b81044a91d0823a6c089633d3dcb8255da03dab57297f2226c4905114eff2d8b6f55cc4ddb496c8b7c8396e27ea0a7b9e1035c6d8e3e13f5e2b177d0373cc39746d9dc08b2542b708367901b8e3607a94adc921ab34aa462f304a28f541c7634659292c12f524c672e4cdfd9d2f49019e2cdb8ef056e8ab42f62c06d795eb40312401ff5d58ef3dc0ee975bc5a88a68dd79bb14ba6fe6ba4cf03419b6edd6b3bcbdb124a8e67b0ea3dee67fb3d511d11bdb7dc3ddecab2e4fba9287fb81504333558595984a094fdfe979f35b749978b10b839b9bb829ba46b5c3942626c342bcfab01f23f1101abfd09babdc4364d1f446314952aaf1394a896a54a06d63b7d5a97a7b69d208014477ec50442b1736f5265995a9182473bd12c1ded30f657aee1220a9c747c9f02fe01f1090bdef3de81338d0202163c2bf3588987ec62ae1a4180d0332cc842b65cb7dd3f5b3b5db6aa2ed7efc88f8cceb8d7eca06f685493309d204a9e45f5b1b341e3a7e446280aa291401c3b4a9e245bd277e4f78462176bc2c6f33157211b915628b9a4b34151e20cd6e5ef4c979d76c880b8e998ef3b99ec47f7660aefba1df7784622faab315c83118a886df7846a921fc6ba09a2dd113b5a988e229543340b468b9085c0e44e90d5cc373cd93e293ca3e7180f66e54b12bb8a4e03bf822c12f4a080093898d53d2308b8c4ba16d057afcecb2b635669c59351a364ceedef9d2a89f213cf41b9014ae6cae7456649e18c9db7195fb62bbacebf6c575355c3c64408f9c4d82f036a743e1784401cb82417b3202d4dfdb736955ca545f2895f19b7e4476728133cab8911a89b4a02310e58f839ba8706a7e530bb02212d4ba2e395445235208a051c3d5b7299fe1c583c9688b94c507baae38f05f8cf18a104ef771a7f4738d40243a6bb447b51acb3cb1386b2f6de9f181618b182ff7ce916bfb0fa984438ad4711eb0539c0f4c269072bf3ff2fda986e434e60cdb949c144f94b58aa7c5895f9cb78fbd130c55530423eee1eac3b26b62b1e9ec8f755b1e8dd409394e7d1e158da33fbefefb8436a9193fac042d2903b4c95513cf45ecc560400885a1942a6cc564e81bda5d9d6f0950d0c14b00ade6a485b5875218f4b104ed50f61c3ef5c7b5c04f84fa350cfb981cbdc076fe626fbdcf295d3347c8fec5239a589923a1e567145eabb31c967e0d4cb0f1398f37c2c5ec72b5674535e98b972fefe6472bad6e68be15e456dea5fb00deff50dac9fad1710b7fc7434712784259297fab8bc8d4188b5719a9f856008414a59254a1fadf2a21358334da5f582da73abaa6757f314b941745a21b74e1ea71168c59e4f5c5ad0defe5160c5f658e5bb9d970f6ac2f1da2c9625ad83c048cde90bd44c70592aa34adc7b8010713ff91e7cb4d8dda2b3dba61e2b840609a99c9ad4c1444e30c84dfe5ededeea84f9398119c6a7c9f1593cc96236e058034a05c9f99ec2fe4f77d88584bbf2226e8295932eea5547ab3dd64691ba409fbe86f0443432d3d7507a1f610d5938ab0c24844a4e29ac5436d43ffe90b81613a6d7a2f1fbf04e8f107543af75747ddd81adb7f0399e3935258051c3be59fe83d68ed448d029ce8f28668f6b1f243b08ca6e0c5b134b1ae5564cb5b3df06f689b3b9cc52d8173692b52598544304666a25a2cea16eb0fec89282038afaf5c0f677e18af2741993df8ae695b6505f44293830338999dc7faf1bd992fdeafb8206440f48c968b3117595aaff050e54852b13558ce57aaf4c3a813eee8444a854ba761fd96397a0bbe047cdbc2c9cee80d86c1ae79a566ab97abcbc3693ab6e66736a1f49a5ceb31d41bf7ec437e0745da067208583a5598300d4a82b3125f444e1d7b0f9686eea6281ba89cbc98e99e07a7a15b6e6e2037abd81f354c30a9733e0ff61ed4f3e260b9d96816968df554bdb657991f578c689fb927c75bdd2da373fe0cdf111e2013b57272bcd8c4aef94e2ec1c04df8a605e822bf293b99cabd5c4433c21582a31c4f186920ee31ed52c23f8f2352bd8f3091948d236c634002fa26ca47a6f29a8f4960c58ec139ec5d0e4a8986f5c007e12affa7f0a24629982ef0394758f8fe2056bc06991581a8b60b96739cf8a206d2059a8e6c4443cb88e457828a06f9410bdcdb26e85f43d46aa836882440f789b68a182ec9ac2a689e6a93b2fd077a13bb631bd9b92469398601691a18f9d5881c997565ae3229d73e6859ee12fd0cb1d08732ac0a4e5e807e7bffce276f1458f5c457fb47658796f9c1d47a71781167100a9257d0f84968e7531168679098a9edd1c2a42b6368d1de1323bc527b1adacb49a5331cdd4a405b203ca1d7dc459a463ae63348140b91220959180a8ed4a00d914a13f573306a6846ee91ce0c05547e0ae1139ae2f89b9ae022eeefb4f5d4572377fe1d589562bae1a9e56b8cc94bbb7be97ec1c5e8f512b154451bbceff0d9a6111dfbfe836758d8c73cf9b6cfe6c4abd7ae9e082843bb225baf6712802c8a29a346dd8b639c9658395311f0bb96c7de5ce88991169c4b2e3866072b951f929ccfa1834516010097fa2239670526cf7860034a71e3ca8ec88c35275fc2900a212d14d646e3cf3ad143dbae21f518bba9853d177a2ad49e7c4a762201e126a8673e1eb70fe566762ec09123dd5a028a797993ce3673888fafb53129bb9195c49e7a2a5ee4140f6b48706ecabf0900c3abb2d21187478f246b025614a1c05cd34eaaf3f01ae69003184d43460046eb0c26a0c97f73d00bc659e30976cb04917d3a924b0e8415219f4202f8019b3d147df9ad768f712124dd04d2aa490c8dd1be03d524f5a3c2cf4ff5063978070a502a2e8f3bc273d18d91b1c3df3d27498e63250f8f75d2898f43b3b4ec897c57256d99d885ad925fe18693a918091cefc132d3f47a059c5753754112425fd89affd127742330e85f94790fd6ba82c6f1fe40d4bfbd3870542f6e9be846b17541e09b75bbe25fd76e8b76f5b798c08f6de9d86f780043b2ca3f23fe0e3c4200e93aabe3135256849d56e1fdbfa463652c77b1ef46d8a7705a5a30187d6b18edc60109c2c3872b4ed954201ce204607a28dd5669d6d84acee6357ec44c4fd7824cd42602e3c73fd7fd014412b2d2b367750db790f6af7d84195eb8d7d8ab1c1eb28f388647e03f4597f46ba96c0193e87ab27b799f298bbafc078b113d65d1f16f992fcc02b245f8f0820aa6500a04932aaa8267142b7b5eb965ff553eb13763d368b678e871ed62889629095fa706d5dda03bd858f8aa1c1d5cb718a1167cd7d329c1f2c08097eddf6fde3f069ad316404af266b1a02694d307ce0ddd2482fb0253a64e355bfb601f75c9799acd83da26b3933803b0c3f7f226f813769053a0299df5ce4ef3673997ef06e4df70396c3f013ead8ca6373df4c5861cf557dc4809a8eb342092e74956c3fa298db8764b8960753a05d99d0435fa94adaae03d3a2fe20eed9bcb35f5036b0a755fb80d16d6967eafa25d47122f2a136008b6449b969dd3f84327db526fd88850e4b016a28ed3aaa1034b7f30bcd2b35ed1558c8ec0ce3905f2b7051333b42bda0b114202d8311ea4dcfae40e045e344428467fe143ea830b28201a9350b4643ab8d2017dc34b09ed8196c5de6cc2d2bb228e5769e0972d95fd36c6f5f9a3c760b6cc53e4deb7b32008856842b380b259a98d186e9bb4b27b9b26dc2719c4dddc2a9000ac3580ab6e79486d2da7573615f45716dabcd18293e4cd568600d687452a551d6b3bd642adb5795d0a06655819a031ec728292071db86c9072d20e098e12d03b26d00b23d16539149f1fd3ac44b571818574c921bc93c006d882eabafc565a8db2c99a1d265d2adfae485ccb5889722c21aa7b48199c9c1f86726f5971e62d16e87804c35e548b771aa6afd84f3adfe02b6fe4c81b0d7d00966bd12af7414561b3752521c5b8fa7508dbe84e4b40eecdd8bcd8fd7b818c7a94e09656ca552e6e72a8fd398c42965ed0683b260428d38f5dc60031dbf6fd3b65d9bf99071738fb049ad6fad6440c5e8aaef09a43ad3dc307f17d90363411ba49e5b56d38a0f20a08bbe1b94ce2ea78b81ba3c3a2741bd3cd226b04390071b334d154a0dc047dd4fa64eb99f12558e3a3ed5fbc185c34886f4cd1ce761af1937165dd5ababd970a0498fc3c294b1500df2cac4679111231450653209b7d1207dd2e6f4cf2916784fa8c3f281bca7e5de61752f4838fd6f19cff0cc86b6e9914107552cd6476acc475d659d1860e0b7141f3929958ddd2a12f52384e21e6c53f39886a952359fb1f0ab1425abb09f63147d922fb17d5d427a3a31bc08e8a7d1e3a4117316896fc1d87ff31db3c17d56f7bedbb9603b3ce409d967190ad8ab5c04715b24bf4adbd788815ea8b55b2c6a68d38caa990e99872c365e9850973a839c5de4ec045339eeb7e043eac229015997809e7322fe53710602cdc69a7a1a398285ec7a238d6953f84b2e69d3f1aa7585f5484b6cdbcff348fbfa610acde2f16ea8143fb829d938cf409ab60c651448fcba018a526e48169856c7044d91964055bfaac381decb4ae388e3ff772c162e68d5e42120ed2b0b6c68d102e0808508aca3b632b31f5c283bceb992e804390db3b2bc010974aec6d119d98d8402aaccec48c26a386c8cb4a6466a1e44846d7dc3c3ea2a163ae2e9fe119a74d7984da429d6ca8ebda4ed95c239bc21851f0c10b89f108974cc05a276982289a85942906be56b22b7b79544047ab2927de0d351e2226d4d7841525a1e16438a08fa092a5acba8f0846bd21c456acf888948b80c59779560af7c28bf9983e8809072d5d71485b4bb185f2c631a57cf1c9cd1962949fab89befaa8f0ca475195f21bae4455c1b60a123ddcdfd4edb86183779a9c25cda418ec5c0eb3665bf7b8b7ec090099f039e74c487259837d7795a21999076b3468850e43689294dcf91a385cde1860692988c55c263f512106142b5f60f0adcbc6c01d79fc848317c59e6bf02c6ec8037313a07019b4be27323c93e3e3fff8a2ef32a19061b9b0eac9a43dd5ebd981a09fb922f0cb63c9330380adf575c1ab7805926ced78bd2b8006870ac7b18ac1389d356c0ae26f796dc710c79110780507f01ce6dd19ba9de917e5a1d8c668f0867b9f0467d16114017a1b5080da06f2cc0985b8ed95df8344e7bfebdce514900c4e844699031846345a21db41a47259ad58d657bd678a4f8162a6b60b269e378b94928b6539a690887802b2b48e7a151351f0cde24d1ba6bf19c8fe72b7330cadc60dc5799f92fcb1adc698817fde93a813718faa7ccea85807e648557067fd430b48cd3db372b5424e6d6ca4d2a6af38d27b66cfc1fd7775beea831f599e17c235f9a2916c2022fe3ee88d60e98e62f4c5a9553ea3a0864252735cfbd100ea2584cd173d4dda314c1371866dd15a87227cc8e3101b9f85a82144b4866248c20740cd2782c021d2b806a4660ca11a50b114cfd512109f8f90e21299875e3dea9d6d49f5ef60be723c6d98d47377a561db65815a1a997d1e1519f9913f7caf0b362426a7ab3da28db167fef370ff28ff1e57328d9cdc4878146fe23e3a33a08c28eda61234ad5e086c1c20144adbe8fcc556f77a08cb58b327a683fe1ff20858e4b7f1fbe28ce1323a4fe257a9445c5e8f56ade47cc0fad36fd4201e43740b99942c3af6c18487bfe0c42712f20cc0391ca6687bdfecabf6bb666187c88030b058cd8d43141657a3a84a7bd78453f6b9b2ec033b9e844fd53eeebdf5174d77bd8347bc69c2380639e81657b363741c3ddb7bafd32b261566efd741a5ea420ea9838a0f0065a5299d4733a4db17a095eafb78f3b47ade4b0be8bd75f8312e061cb2101e799251a5c18641efcdc2e2c144ac4a4603ed2962f5080cb3a7518605a2c11c87f10e0a5e54206c83aa6723b91a435f41006c9950a561171ade34c7dea37e5a4c4d5f6468467c3043b2ecb9b9313c3889f4da5e530b60328360a57a5979b659f8c233ecc746b35d36418d1934b0376e8e624245ffd36bccb6ef01ab7cb0ba886ba9ca9a2c937d143b954d094f69e017e527ed3e69a4d93129ecf259d7540281e7dd0b00aba3e854d39ca37240f1a18426b06492936410996242dcd392445b9cb0d3a3bf202c6bfa1f31dca7eaa6bc2a27f6e24feed63b651223ef9cdacb5223aa7370b528bf6f643b3bb17d1c89428cd85bf197515ce8d9b2d97b89b6dc3ad7adeaafbcb5897d5fcf94dcfea88c8c8595c965acc706fa810928246ac0bf3896c41f13ad648354f48c9f03a9ac36930d210a5ded1ad96e3d62d82038881f672914b09eeb551cf50077c174678044d4f7d30d482915d30b0415a18b78753185cd443ad933798934f59051152438dec7b67b52f1c0ed5fa14cc7dda9b0a9beb9d430ff82d576f9ba5458520bdde0b620db1f291feb8840109ae50eb304ca51120a5765f51a62b13167121544556c301b049972db513284e06d967cbbc9d561db57b7cf20fe20ad4d7e77d6d4bd9425cb9adda4f3a66977d33793569b3fc8b496867b85d43836cfdae36fd619e46da9c3b088e750aa62fa9e90a51f324b5014955f5b333742dff1eb7058c718d76439a46985f37d7b8822c024cccdece096aea44f10c8c9b499725f6c274109b4d82429ad654150d5dd5c39103fa2c0b67bee8d776a90d113e6c8478f4e02e3df7c60d7709bbe254da2bcc956f521bbf22fa07923a0c823656bd75a82fa9b6f139dff3fd9f9b0c30cf8b32556d34d3bfcfa89a436d8d90a5c0d9207343aff04a567f5f2364ff1ca22d88b7f58ff26124cc52e24fbf3fda7bb3065ec5dbb3ec0aee3f7fde01d7c23db25cb6616291b8aa1ed9713fe023cecf74569f9e62f753de56c042ed19a57cb3f330724c798eda7fe58bdf1845a604823111f9fcdb132a534d7a5f5d7c5483c58ff62178d01875bc3b93c2883abc3fb027c36aa0a5ed87b0bd930ca820187798c0989502128badcec3b11c40d4fb6d66171302d30a7465825198c4d738ed7169141b1a0285f0ed7bc5d0a2d2054a207a967cd510a38fa62134bb7954ce0dc8a446b53c0d3c1a12eeaf0444593fe0e9471184a2e1f82af9c0306cb90886966f191ae551a97bc91d34740707a1802bf46e04aba2740c3180e21c1c1e7d7e120f8b8e6ff160807aa9e9798566d3e331dbcdf63ce3431b26eedf76bd25cad2c05c16bcf7277246b2fb20054a74128d90211ed2143024adbf20eff12857449acbaced8c94602214d88a09c1ffe8106382bb5982a050088914ef5d8c52b75c8bdbc926bd860d2c8d6e8b339faafd4c5e6003b7a6ee681c4f60fd375ad7af2f4da3ffa29b9cb8f51f28e0b118e82afbd09276484c4f48874b928622d28e10cf4589a427482ace0bc8553156273eaee1eee3de5d54ecc225e216721286d5d6c7bb8cb87c583787c45031b907b5e917f03b1261d98463fd437298e37e7b5977c4ef3eeac8fd1c402f6110dfe88f6cef30107cb68e3f78f79c6c9fbff4cb48ff01465a3e20895a1c4ee049f51d41faa57883abaad40103b67d2d2ceed1349b6c823d775b17b1e4181b313bfa029640d660e969e30630ea280fbd6c0a3e46cf1242b71cf26c76989a9fa1af11bc8e76df221cea84dc72ec62ffc0e697a140712a5d291331b2ea824cd2516dd17911a8801139577c67ed970855e6b8c22e10c3da07b50577d3988b3b8752c272220e6d218c2c1d997a0783bd5cc0cc143ead85223adb076287b90bf781a96e322c2f9101709c782d183933b961eaa4dc442231758febc7e5b803e12876016262766fd5144ebfe337ff027e61c0285bc519914e85e850fc2a14991e33842d65aac607ee69a58e483e4508436979e5cc0887a6d6987a23977bb48a3b12991c42a1d8de43e6a34392d54ca5e9e42eacdc118927862ce81daf9999d150dc02536e74b8cb56f047a653213a147e0a8f4c070c650b9952f3879bb45c899f9ce3892108107389d3f8a9fe61b6f99e1598864e88e75cb8c95acd2cef894ff75de6dbf2bf2b23634458341d06fde4e3872c6adf7f5a2676ac70b2e44cc8b14bedfb870b185d7905b86561c2c766c5eaea75983daee6c971b415e8717a0d1971018dc0db8052e481b66d1ae9e5d58344010e883a6965d44e5d9af0b762eecf30b869441290b5c42ed8b1e3dd13fc5482147159b1f45528a72df24ee68006846a9d294bc9ed12545bcaa118d681b86b628c3daec9de8ca726c3f0df287724c1b0d68b8ab3745e01eafb39e372bab8dde12a9e8ca9f75a2e6c5e786411eebb12bb4bd59924f2e5af9557087c0a146eb7e2d2d294a61628ad33993c2c0ab9836ab1b2fad71aaaabfeb7d307b5572f14139c72b2fa978984ad925ed49afcf2a6e17187d1fea6ec8693e06967fefd2ec2d0e2ce443728eb16961b47926deb096d3cb50eb064b2ee9fd6e9e2c1f13cebeb9d11be2f0fa67a541ebbffc4b28bb9cb361c4c265fcca7ace748d42ea1e1de621f2a11e47530f0f19a9c3791468cac42cf3c9b9746b43186acbaac00a23d335e0593e3578a852f27f27bdea55e60f43d4eb3269ba9862be7e3aa3314177c0226e92862c34675d1c4c758ae764dc56b2ad592ce7e7f96fadeea8a04cdbe2bf57e74ac96f582733d3d563df014b2bfb8bfd8f3c462e1fbf24cf6ce6005048bea0fcf641acaeb458f4ba918b329d076db74810406753999953696fa3305d4f8161046af9c5568323e111c589f3ea9cfb87745d8aad4bc41b5320b13bbbce43315c1393bb467fbed1127783df4e13ce5de2de0e3a9b255d981f78600fe6c0df036d26a954f72e8acad47f3979ceb5131ccf236e1eaf505d7df492c33ccb892df07d10c7f57c64421238fb7e2329f98bc075076f9749369bd3cb8fa18f725e88403d298921dccd20c368ddfb818c36a943db0850597c19559258b334a66c44340aaa0433653728f7d6a679892b05e834460fe73706d9486979fdb8140ee0e0437649a1566f5c5bffe6f23ac158a54daeb827664ccb332deda8acc35fd675d73430b01c002b55209821b71a1b6a0d28a7aeca38dace4ae85b42b8919ea29022902a05551a46a47f240caeac8bdf2f6de61396df8e560d731e9358278307dca7c73efa0877dffe2218fcd331f4edd1c97e159450072652e65fd928a6eb85e138008f0ce6cab8c2ee655bb9c03942181adc42628df2e1125a104f1cc75b23fb6960dd5b380c04dbcc0557b8e8a73a3dec6e418c068a0d78fb2759061737662a7b72e5012fe966babda14b403eae5c257be234b29791072e3866c18488727bb5e4ed2645e214ccd7ba2f096a3aff6e4047f2604bbad6d1045f2a0362e8f3b8e08ed29fed62648fb663284503e273a5288aa1e5996d265a1f8afb638a040ce27d51671864b40af6ca20e2997c1b64eca91f1805e432eee716469d326f5915721811fda5b6894b4aa0546c3e11f2311821c3ccc19dd92b7b1b9053fe4ee0d9acb5ebf9bdfb753b79c6f1e27b94a39db2a2ef9e44f8a7473d08338122093931bdf2e629b7595a9b0a2bede947e1ef23b3b122da6478dd83de55f567634de3415f1b6928b3d9d597e8a0e6a8d8e812071cc52cad6bc16c2a040a45c015b826ae50481f47f1ffc68106e34b958a8f95917ce311de7a497ecef90383101f8e1bec209a52f9a3c30f2f5a5ec74d24dedfd06677d13a04101bd1b8c6595c89a183b2c15110323ee7046b9261b3b88430be7b06675fdf7812c9ac26eb80e457b069936343e2450e49d1e3e85d0be06735e84c044aa777c3c2c9dc5c9b7610e1911f78807a9260bf85a02ef3eb3d7506e5b4f3a2c8fdec063c03528a9c603a231843328cd18c24f79da5dcca395c78126c0d45ca9017cfc5cb6d856119d7d09353e794d01aacda1b3c7b391edc4e69cb3174fdc781feafc4201c42ec0f2f4582ba54ba51584cbc74ab56de794c35bcda40eba674807fe6d17604c5ef146f4ed3b068cfef2fbe84778ff258bb90f3018fa8454d462e04b9cfeef74768c750241eb4cd6c89e1f97e9241d0cec22d6d986b4f61ea0dca639a17c4598fc5845ef95e8e3f85768afaf1584b75cf247a62e14857eb97ca7a90e8ed1d243f2fc66502779ec41c3b79da9e207b017dc0218a25498de7108663401d56f1dad5ade66b46208919e909a9d17c622e1a357dc6a03fa36379e55305c15351d9981aae6ebbd7bef38eedebbf7b91c19a86a59dab9f365d6d57ba24d4a7c726a8e3bd3e7410d32ccf8fe63100501d94c53f4a56e07514f1cccc3d901c33633bc81a608f65bdb6e424b7a49db7bcbbd03dd09f9099609f355f5ab291c9036d0a279c8448b26137db8b8fe833b1b683edc8abfe738cf8424d5ba83844bcb8d279880696204256082a29e6002a6891194808999ec0834212f0449d5e7c42018dc793b0191a6bb3865c7243bf7de7befbd9fcfe7f3f97c3e1e8fc7e3f1783c34f6f67073b901811c704bc21e7b5f4e088c57ca7effb1c7b46fb758088cf7b967c33f3c3fb643ef72352e1f5c8adee71b2ec5d2e7433c1fbcc9d0838330c0839e1b19fb7bfbe1a0672796b5e7508a364ec673d3d87643924a309ef6d96e09c6db5cb6dfdb887d3818cf61b7c22245966297ca649d598a79eee560bc0f07e37938186fe3603c2a332266ba652f6df2acb5d65a6b2d965d6b81346ee02cc971b9418107e090c08d1b2e0fc071430214d8b95d9c6cbc5ce97e88b571e34adb8758fcc3c6b871329e4f94d10ea5e872325a75a1f7f97c3e9fcfe7e3b99b9661b66a9b633f9fcfe7f3f97c3c1e8fc7e3f1783eb7e5860b12db517cc84cb79fd00dffb0871ee81666408e50f052e451fef990a70b7f3d64c34118e0d99ffcfbe069883de8d8092a5bf888d5119b7816631f0e7a9e9024a560140c3ac19fcfe7f3f97c3e9ebbd5961bb702c160aac64ef415d25f4853525252525252524ef35024cfcf249ea34ddec5a5e8dd7fb8128cf7b94de162dca2702595a3dc460c852ba5bc8472959317cf4f7029c5e5e41e5c02e227b7295ca9a67a8d0b08c4799ec2d55487d94bca63e0d29ff217d03db824e3a05b199ecb3810310ec455b892cce73f5ce53073f9bca5cf0db9f75c0637e43ec681e086dcff70156ec83d10b73f70a51f3e44e550ce6bd56370a5181fa252e5ec1eaee4f910150ca528f370322af7dc02c1c9c83894a21f3819199b8c0c1c84019ecaa1147d3e64ce8c9839c31f101cf434fc0307bd181cf43c1cf480e0a0072529088c7b82841e230800fe4390003cf4430cae4a5149e687caa1173d0d1f6638221472bd95dbb74abb3644e531c338621315aea6bee29ca072ad87d63acc7454de0571d03b49e1a07739e87dbe9a6f88870f998f781e99e4000020c4d1c3a0ef4c870ccff3140e7a281cf44e7480e27dcce72707b9c4c49cfcfe734a29a5275c8577bb0706eb9b031aea1592a8dfea148c577f71b04a51c55d28a2288a921d8508112224262626264810fb2d88f52cc8750dd6ad25ac3658db0d34d5298aa230c3116ab9f88614cdd75a6badb5deca85a0887a03a8cf1b417d5e02d4e73d8a9a4da5b070860d7acae578a3458aa604bc0618d152a9ee4260010ce010078b35c49926f4dd8409254af0f11081124c2851828f87089498a96cb021481ac2e2d558966559966559c770e8baaeebbaaeeb7a0e7b980c338a5574e4c830ac44b0214852a1875eac10426837ca35d143c704ae63d7a1e5b0c74e391d1acef076ed50c786358c61cb0ac26ab79ac476b124777798c9f33356eaad32c39efddadf6fd6b76b5c8c1018efbaf620d9b15f2ec8bdfdc605d96e5de38268bf827cee81f12c07e35d5c0906c6bbb0935b8b2bc178d663e662bd04e361301e7698b99cb474b7c24229fe6467ea43e62a57d80999e93f78c810e9598f26efab7e4f857b3c91293ea2438667e118ab614dd3344dd3b40d7717020b60007f8705f00108014f1686360604eb155a96d5f6722ba59a976dc37ef13df9c525ac54f3b2fd04974a18beb7f8e20f895e093b90fb9363f6dbeff6fbedd5bf7aebbf908cc18df98b3439d9c3953e2d1f970f8639d9355cfa3cc33ba428bb07974cda3f38ce4453864b508a70b29f7c473b760fe4738bfd83271cfb0fe67ce08e66cae20cf44e41a217692e9424e9d14e388cb3dce56af63e1cf4322ee64812f42afc558a732afe42f31e0e7a31490e8e3a52342312ebd37a4c836559961573a24ec87237a621e64436c439b40553b5878b2de814241eb2c8f07407239925c3d31d9064dbd65a6badb5d7755dd7755d96655996655928282828282828281285ebd38593e72db7c4864b4c4c0c76fbeb169673abd35d3b799eac6642b1b85206f783a7084fd0334912f46466dac8bbdb94e7a3c9e3f1783c1e8f47e6f3f97c3e9fcf67e6e4e4e4e4e4e4e44358bc93cf472392040281402010e843583cd0e7238d2441af0b611886611886b5dc7091f348c8f91d9204bd6e85257ff0b4923f78ea5038e8814eb896b93f2ed72d3343516d92a296514107695343d12d90a60c86f6c70b6d732da7dde2b61d263b5db449cbae966958088c976d9a668234a68d58c4b1893792747123b191a40df74c1249d2701b394952869b468a7024097aa13b4f9770bf2893b323d3024f2bef2eac4c769ad4c10e79d8691b2d0c345996655996659aa6699aa669dbb66ddbb66df7de7befbd978b26993caf7133d1085dc26d815ffd6e86129ea0a771d0bb2441afce8c839ea6699aa669dab66ddbb66ddb7cbdf7de7befddb4ec8634b0c30322a0a930b4b119e05cd7755dd775611886611886599665599665c51929a25122448bfcc524793e9e1e93f4082a191293e7e3153d8a373dc2a5e85d314b22fbf678714260bc88448ae6314e853efb864b3514bb6838e6baf50c0b81f1228d4a0ee859f8479c91a279e85df88775e80981f12c1c8dc0680369cc7b3205f7833aa738f33dcf7969baf32c2befa291381373105f1061106710672a18da190b2c134f2ce17e8739f08471d0b31cf42e0e7a2d9204bd1b9c3ce1923c5956decd5f499aaf92b48313c1e733a0811d91b66dc3fd8ffad08fcf3d70b316f703fb51f382ddbacacb7d76e8c178d88ffbecf6e24a4260bcedf61857aa9900f6eb352fdb6b5eb6db5fdc8fed167b3057b72b61b5691cc415df0b86b6b5c2cedb9a17945b2fd5bca43c54aa7901e2b9f652cd0b8c9fbc04e47aa95402629f1d0886611886611fc2e261bfafaf215c02954e0e3a0c0c4b352f9f5b4fc147c1f79640b8748257708b144d17299ad65a6badb5f6d0cbfe5dd3344dd334ed43583ceddff560e8dd7f2b39c359966559967d088b97cd0b43efe27befbdf7de4dcbb80b4519d0c00e0f88608714cd5b4e890c6860870744302f0c6dec0cf6baaeebbaae0f61f1aed75748aabf90e4f1783c1e8fe743583ccfeb439054a1f0204d0462fc7ae9de96eceff56b71f71757aa99af79b1ac9af997cfaf6b5c0cca539e713127071de362b2187becf6d6b87870297a9edb885dae867e0b6ddbb66ddbf6212cde9682023af9bcdc7b70e9e2eaf321209986a0a8dee22e14d56bdc330ee32c87a165599665591fc2e259b84ad16c09471276f5f3302a004221eae72b48aaa0a87e7e83436c9046c55f8541a11e51241893c9649a31994c423c18ea8ec7cd5000403418daf60d16f66866f8796b86a72e746a7cad524a295b4e4a55d5ba2c96691ecd032194a4523c112b3be67e44641608e1a456ad8fb788648b03411a201bf133eb618496e18fb819e2cf014f984c377bc26432b940c88def9836dd88bf1a29b8f49d2411d1a23e1659b490db31b78999bf5a718f988fcce8914ac52c147f44e478f92a4917666951ff941bdec892d2be94b22fa97ca496729f3c0c29ae84f33db998e561648c775032448a4d52f4b22cc6656fae8917ec192e1d7ec32c96c39e71a59a7ecd8bb535d8768b4bd9378d63b1c72c0bb3da2d5cc2aee16ee5e2ac5b6b65bf70c93ec3c7b8eeba5555d685bdc225cb9d72157d854bd5694571895a5ce542d554afb8544dee859ec225faee79b27046b5aeeaf07196ac8ea5da32f6f5f6e2a01785252491320a4a6092e5b1aaa50c46cd4ce1af653029c24e505c4d855ecf6e2fe69ce1c50caaaa66f44133f50830a0499326558c68903333314e8125d7e72aa59c21225990f561a322065b08a182c913f8104513bc4025990119646e86d0832cc8a1494b0454114593207c610a2eba60c215ac0adce00b6f401284269c81055fc49c38b8210c36d0a1820b96a0046ba60c7c381205175dc8811b9a3426e3052c5c41872f941421c9e98a71031650a1041e6ca10a347c21e11b88d08215b0000c5ed0c1144a0883e747146080c3112514e1c2177d80b2080b66608739bc200b499802113c9a04253155d8023031434d1db6d8c11759c817f461a50a851a26cb79fa2823577d72dffc8d79594949497c8a6350f8883d621d6613b03eadcc5eac5f945531296a6863b05bb74a5270459625911d21e3178f4917dcafe6d6b42c4796237af62d1d257764eb51ac6d3f1a007b7c318a8fd8eaf9859966365cae534a2dfee1f9bdbdb81fd8af6bd98b7d9625619f1dfeb0cf6e2dee8776eb1857b2ae6fd7ae6fcf38ec1a57aa998075ec352fd6b17fb81fd6b1bb71d18475e6827dcb92c86e7ddbb224ae6b8fd9cbfd715dc31957e3621b062653535e990dea51525c7dc5dde8ee3daaf8ab300f79201966ea0bef3ac51f014c96f8c87598bfd00442d5852dc58414450b3f21a38cc54593144517298a5809298adf818414559de5c1867a04e5edd1bc32d1c46427430861e5c1bb50110fff3853241ae911459daa3c009a215b8ff9fb607490ad4361ca14f61901c7902d0c61101f7db50e438a4b29aa7a857557513034ca27c85b195a59599122f9983920e6e98048d55094f5d65aa5484e49a5467f438915497261912424483b9670fb382e92143d792424097a3a30a6b8c74a48128c49de45e2c8db7a48a3dfc1213acb5729e50c05040b6774ef86b0330c85ee9d009cb8143deaf09234a9451dcad7ea42603cea16a7824b3511bb5438469e4efc831e7a15fe31278b2451537677c3536c69061bb3dd9ce81199641f32f765936c371e9d83eae88e99114db2dd20acf5dea69fcf41f1c4a1431a1048c37437122a9d2c3f25d65fdc23d8e391ec91c7bcac979cca11d4f1116de223d7532045fe6aae2a25416872752c7389f13c66bbfdf5798cca54a9df7e5bc68f8dd98bbd15922239710f978b2b7eb9aee112f60bc3db98d501a5a8bb4352d4330784598efaee99060b7b4467a64e95a8e046890a9264ea7549a64e4f9df298af24eebaa3de0f80fcd7ef7050afd583e81115a975ea97853f184a714771417417bf19d9c23ca8d7f3a03e23081c6f951e916a3b4c1bd523f7f53b151cd4eb2be6d1a77010588faa69bf8a3f984a7e14c628aeb349b708b45092ec55fad595241579ea9705331b2e162ec524a85fa51a897bb8d4c62ff5169782c8f07ed443af9eca517ffdc255f50b57ead77350bf6032cc2456d161fd7a0eeb170e4951d6b7b8ebcdbd58b7de595fbed85bb814b2384471d6af178aa2d6750a97ae14c95fd85a556551afb8045fa857b854a5489ec2558a7abe5bf241490c15d993a1929815640b09603759816275d982eebe37f4aebf225f50511c08ebc6728a1a44f4e8fb0a8b12130f727f56e10747600312e260052bccc16b2fdc8421670e4f28031eaaf09090bf822b335462a229839d7088be703e9415b62066b4683e66ebf14848d2f5f81d92648f3d9e0949f23cfe0949ba8fd9a356af71db2bf7b25dbbcc6266a3da8cfb7c7b4dfdd867b8b4ddde7eb8524d7d8d4b4d3dcc5eac7b7029bbc5bd5cd78c19966559966559d685afebbaaeebba2cc630cb0a034830170e0a72ae69a3d14e59290733599aeb64fdc8a9a68a863a512039d3246168bab0b04755869fd4959d5ec2917dc49f0c0a7f3032add4ab631c8434a068cb31be5240f5485f71100a41f1d792ab5b4ec22e3ee3aacd8818e32f1c6fe15ae1cfeab68369a3d14e59290733599a4b8b93a5c58f9c0a065345439d28909c69925ac0d0b4162d3862f682853368eaad6455c191f5ea15245daf0ea1026244214030b855452fae82a2aa4ad216a3faacf0b7237f940f9abf1879368e9c523695212ecb2b81c21ca7c71a225630bea4439f4b01fda3656c214327b66549c25b8158c3941305b3433f6c4163a06443d013d018141029daa44c405595355452068c4d564f540158439da9b504150057b0a4c993a5e58415e2c2b513455f4ae8532f125c310506176c0e4a9e2795f56153b480e1846ac546807508850bd909460c149a35918134205228ad8776722d7c6b29ab8d89ed732ddc9eb922b81e2378da54c1213c21f0dccf0e15ef07041f2a92a0b79de450289aff42dbc912271492a0a78170625c100f507605caa9ca503e940a8e209684141b20b4940fa4547b058c4853eb06a3aa245502c67545682604491e0879560f00104d230b4300a81d00c008e659a310801d20f2170a000702903facba51c9c160a8c051edae6e4005a36e62e0e41870847587692006d6233a841f3489f21fa002b028c43c96811fb47903c44a4a9607022a408b42681800428b0a90d50faacbc8130bf5881e469697315f55927ef25b9eef0cc773f598e1d89165648a79c8d33cbf48536399cce467c9c494e9e594524a4a650c1cea8ecb127fcf3ce4e9e7558eb8dd490cd3317ec156488224ebf51455b15c2b562745f195bb14c93550525214f5212c1e856b64773402a4f1d5c722dde12318666195abf08391df4d2f6ec542362ad45528fa58c4ca36468e6698e1884662bd8d55c55555555555555044a56856185ba5b2251262cf9595957c447b3c2422fbd42cedb298665996655996755dd7755dd765adb5d65a8b611886611816654003d41596cbaab552b4a93a583843891d1b6022768d1a3267c7dcf1c5fdfc91ed71bb368b6535f2869560e2892ccbb22ccbb27bd0db2069d3a86afbd7f49f8c3c3184a20f46aeff606448e393b1711b14d5571cc5695c054519b743097b99a8ae416868172e8c02138c44810945f2ca12172a5101926cdd625989239829361fea91b54257482b14478cd04af56ae50be56fa5fecee79cfd8bf9b2a719fee8b15ff8cb1c609dde7ed76f584e0587c5e3c2473eb7300420b42ccbc25fad708deee6250b9e61fe564897857e6e3bcbc18409662f317a669e5f91a40f6669b9e1f1783c1e8fc7736f3ed4adb068dc0110b0426200bd4c558e5ccca149739cb965ad3852519d09aaa230c57aa0424e39e5ac6e379ae5b8a7e152f434ea58775704287ce4fe76775dec270751dfee51c98ef294c3ac87f50cf778d9eec1a51aeadb29dca31ec32f9f5f5cd2fea1c2250597a287823917102e45ef046fdc87839e5b5de32e1455dfaa073263d87d541b124748a3bab5a4b277a233760b5b4638350869546fe9253db29674d7167f301717a2a2bbbeb545772123dd3517f9d36e72e350112adccf5a92fbdf894dee6c2d696b89b5458f2a7cbb8b5877941d9cc0c51a7284d6e3ab6c698123618c4db5beb97258aeb8cfc2f9ac2c723f41970065f918a241e92b050b67780121bd841042380f65a4264c6374ba8b90542b8433ba56c2fd2016b95fc40d08f4a88e6835fa96a0547d77b9679d75ee74d15dfc3c8583014d249e4c2ace3c59da40649fcef8d13c379984ebc4a434b0dbecd98779ceec886e20b109ea9d1dd1a6dcb8091f370b314bb9676e09cc08bb89829c1d41735f66129899ba131d5bc2a94118fc031be316918b9cee20d4c246c4895e7407bba3eceeeeee1e4072cfd8316dea0ec62eba8371a73b08bb83f20d39b96b7750d67a2f08494d43456b52d1039a2233b3487775a6bb3aafe8ae5a965ed7755db7b0eb9a587457e7a9bb6a4577d5a6bbdab1b53e75571f85fbf58926d7faaf4fb9be693227279e3974c74a297fbbc32878ca71e649bdb91e4032ed1133951200e509fa6234d6a49014cd265d9f57c9fd300cd4dd8d16c9872cfcdd8a252856b808245ce98495a656e80a287f4be4f908ca134fec82e694d1a449131fd4099a6777916ac1c219d68889c17a43a42a05790c7f218bbf7b51f8ab6e51fcedc8f4884faad6aa56d8099aa94c32713ac99d6f91b3dba669a2d0346d3301e95d2c6415a6a0a2699a66e2583b594e2eba9bf85b62eee43eec9c3c5f9ac9f343811479f6e43e6b49863d6235c9efdfad3cdd6f6689b19dfc5d5396ef2ea870235533cc289a6136e9631786dce425e64e9e58e5889e380473274f6b67cad89b2cff45263837f994e16312247dea9bb84492a097a3b393e1a50a2efd8c948d1d618c2da56cca554b194173dfb6a41557294d6c4aab96304a39b5d837dd45aa5254a8d61e5594524a89002b8a4e8a6774477514eb3207cce88ebabdb00a0b415294af6257d5d4acd7eb55077557eb2b1cf2d4c2ef8e7a8c501faef5c662858295be344f511456d19e1dbb8a8eedf6bd22491baeb170df501a97711857515914ac8d1d2d8d119bf2764a3cbb6b236896a799115a8e9162b3094bc1485153939192d5acd78529acbb18a1d935c61823116e553515016aaa1c21f3bccc123f4291fc47849525c494522a4fdd62d15d3c7d7dcab1524155951c02567900ccf25bc4186bbd3714fabbee5bc99045e588cef3f33e87fdc5be3d07f62d7b7d8eec7556cf415f1d266bdfb8eb95b35e7114573fb917ea54752b07e355f5d42b1caa5e6b552bbe2cd7a5e1d257ba6a3de3aa631c75cbcd5b1cfde45eac535c82998dd918e560bc8c83f1ac8bd25794b2504ae98a14c54e8aa28d524a29a594a76eaa0fb64a5289faec389bab38b83de79c73ce2ae79c73ce49af4df8c5c811241f6d674950ff519a3fe2e6891dd0990b7598bda4527aa2144dd44bd54bd66b03993240ea0c10cc0807e47602fa340794bac41bb1432d5ba20da4d1578ab40069b467294ac3c53d983c5b2b1ddc5077d1aa3bb897c5037bf5e04648e30f75d607f7abb588cc46cb8d1f5c0c401afdac07f5a8052f2229d52351b91d52446f638f98b580342aaed4b4af12b58034fa2ab3629513a471b1caa9d463ebc12a57929c3dc12a5752e92105241ed402d2805440e2d56b91d1439dac12e95b640c35a4d1b71fac7220cf8230cac55ce11011d2006195a39e45c12a273d9b827241f2e4d3117a526068d0c3aa60b1967136284f2a8f5c7a89e47e2010cd1e92a258c27e1fad8e18238c1912da6bdf0ef5a394b27568ef5658b21cd06be902a441dd4eed2b418690465fe37e6cc7a58bb5e630d915a35455adcb6299b6dd0ca3ae650aabc8269cbc2d401a52e6e0ca7f5049ff8bb96f1bc6d6be11642871166d94875fcdb485a26a8b66635b270eaefc577b0ac9822945ed110687e84f221da4316fab8c05c535c40ac162b22058ed115627ec6bb9677437dfc4a4c76276215cec7d1a29c951b7d5c26afcab94d5722a3aecb303915e7619cb03923dc3359f1130f79091e59da059e223f731d381a2d9cee4336ebbe45eb26fb833791bd93db71af7f9e75a8d7c8d0b0a2e450f0504facbc9517069fbc9e5dd8e71d08376565b76b77cd90c833daa6e7457e196227070e96dd55825b16a6215c52a8b2ba20838040669545855b1cac2aa0bab2c5661589561d50906e24eb80f17f270574af98c6b912279006436e0117b8cfb51b257f3dc8a2bee2483dd5998aa556660bb1e4aacbb38299df3ddc52a319cd14c90b267327c774739050ba4886205130e31218d78782232500c11121344059b9661f25a968da515b61b86ba83bf51954edd458aa8c3c72e3f575555a9e42ebf5be9e6e04db69d2521ca02a44155aecb11565515b37886998d9803699c7a0b20a86edbddd2a59abeb0ca7c7da96e710948e7c10b129b7835f1d52956e9d35fbfa8c63d5cac3a71e7c1a3aa87d3dd6e985975ec7ab52ceb7a4582e1528c33bfe6b4d527cecd7ccca2474be20e49b22e0bfbb4381597f81ab35ae79c93a2734e95a8054843fe66957eb4c911499673ce39e79c735293ce1b9973ce39736453422e7aab9eaaaaaa9e42425914472355a491e9ec8e1b9c9b2c96c41d9254f5fb2e486015a7e2525ffda28e591c536ff50de9f5573a2524c9462749ee13d4b9b9e1721365a468c6084dadb756d9340e968a3d671771e397790a972e6fe28b2f4552ba48d2bc3c129707a3a7440a9b3c800c9544d18352f464a4571202e399609e9ebcce5ca6a9c6539b260e41263c5863cf2ce4e43e5c011c7244a2240a2a723ff6a04736f5d64545defa5489a7af92a0af4e5ca926e21e2e168e38eec1e45138228949a468469161770d85dba7a897a237dfb7ded5bbdf1497a2e7522d951a23608631c57d4b3cdd549c1b97c09c1d4ae4448a8b345cb491a22452d4f7fa5dc71c1a0658ba14c9522745dc8f1b52244f7f7831b3416dc067a7310b4843e6cc29f461c420c6b61bec119c1d230e600b58847043bf209abac854864a88c8414281d30255a67c0d162284c09324726f864a8894217ff712c9e273899cb01b4447440938f309146d29820811b43cf147f11233f29c51100902911c588c48116b8944615d448254ab99d8da826face0da0c95c8c4410c27151636ea6429113c33d4c2034c5694ca18b1b43aada84c14d9171a6575415b33430d286ba880625c38540cbaa12e088886fc75a72e62d393007ace98530c137f12c7a03ea92ee439ff988bf8e0a9a5bb183348091458c873fe70081ca3c8fd4212d768517c732bddd90c9540719a6d00816040521155468e528abbc48c48448b4c1358865c0a09128a4b335402854dfe626e95a1122880903f508ea71841acd42d432550d4205f192a8162267f41d8c0f66d98c7ddb11042d80d218410f63f0821840d61ff831042d810f63f0821840d2186dd0da1ec2bce629992520dd69c98ecc3fd82c854102b3dda4ebd468fb4534bb05027a247d7a957d5352ee340dd559fdcedaeaa7eb9508baaee2ac6e00c0af380a776020e0e4efea2e90ed1144dd1848373eb92b3b0ebf5aa5e2bf6880718971c0c960ac0213ed94b8f2e047a64df875d4497d2792ef1b72237fc1d84a51a2a10e88df27e8c39392845da1c49ea2acb0e8e1a723fc824f7ad3fd123edfd528fb2774d390cfc419d140e857be94e1ec421d19dfc095781eee43fdc0e4843dec315d19dfce55aba93df388dcb38acbb1b10e7b235585222d5024b552cf207bd9075b8d5eb3fe8056402996459412c6e76ec256767fcfe0bb1348b54c3fde016b95fbd023b7a24b1f795e8917c7f891e5def6f5c0d2e088e456af8ab39b37e1d4ad2b5aac5ea7788c51233b4965bb017c54d7b6ac8ad6efdc3a821b7deaa3214aaba4ed67ce18f254b8bc3f03c712189121b23966559d6ec992ceb993ed526818ebdaaf0e7e35fb4225b0a7f3e644f21d353f48cf596e9297a866a2960cf9c2c2eca587fcc6c5cf4473c3fa91f0e6b51750f577d468f285c1df99c72474eb0ccbdcf41dc6d113d262f4c71f33bb9cb5089cd4d2e02922298b28d4c0640864a8630876c25467b306924156d24660a7791eeaab74c8fa4a070cf7457d97f3d434f594c61d029fc693ff9971d7e4edde33975503de54366ebfd7b0f075bb4fd84832dba9f0fb9e1cfc7ccd6e9bfaa611f3357d87dc85c616f0ce367ae300f0c57d3c7ccf6d387ccf1d01ee22fdaf414510116e6615f59cc239ee68ae22a4e5c245718533d4514e27a775d77a15c9da22b4ae4b9813c631f6684f2a7440e41284fcc8372c0f55cde525cf5eb9672d43f1757bba33e2394290758a72e2ebee2e2a5c505e1e1aa144950adf77e35f74c4fa1b54708107ba43ea93ef53e0f0ad76e0cb7ff6159d62ce5e9e763e6f87829d4cac28425c61863aceaa7858a9214870917e26c1cf95e22df393d82279d9c2cdf70e8d195e57bc70d59bebb6812f5e4db0b2a4f4ce5f83622df34f28da447f10959be6db4c8f26d458f6692255734a96241698e4e7402132f7a743ba6a59833476885294e60c04212b070853778126e610c3ed8e28b2358e080099e8c4e381d018b1ef50d12b268d2a68594399e09f927e4a3a94735649064f928458f66968f33459a5479f2918aee932b869086138e4c8c8eb78031cc600b4a5a80052b80c193bfd1a3784596772992e55f7ae4c9f248f820cb57a049d293df80ad21a57cc834ba590e6126cbcf0802e77e35a2e90e557051a7a8d9a92183845511372010ea4e6ee1ce0c95549193bf1a4454b1c5c42c5ab85f8dae06ccf88b916b1563e8df1a39c68c1554f185fc754c78e2566b660f57a36386e7f9e564a257b280e7b991a2d824d85be4782564649263344d397f6259c9392d49027172bc2145f17546d61bbae95c60d48939918b9b1b9c25191e891c9df810bc59813748644c92613cec3c5cf4228d1139c3820c1f6524fe5a26c71e511f55b3331b94fb9ee9f60f947d31f207ca324696ffeead671c8c1868d7360edb3898b51b38b06718beaa75716d6a9855dc31ddc5a82345f115072306978add0593eee2294a8beee2e31248a916382ec9370d07c16eab51390242296478980c67d8fa6ccd4a557abd8210c7e8ceba756abe3b799279c80a7f15c257990d08a2551599d87f52f29035420a9ba408cef7881445e12cc9b999f2e6ca9b1b0f6f9344462452be3ecfef56aa1bfe82b764a4c9f0154719288297df7ce339e5e7e5794c5c053874076feb5727feeae76d9da01c3328534432fc85bf6aa5008a208e387a81558e989f0ac54f64eb9b12c3e47bf546030bbb7b0af137e7f3949179cc860d7b34fb998a7d060be168cecb1abf3e1ccd295b3669a280e6d144ccb0a5e1ab116eac3e3a3340a620b69c94aaaa75590ccbb2cc06fde442c3e669de485276ca5f9d4824c99a9932925473a64dce9cc9c9d18183d491a47aaa3435344d97c96927947397d0e0549bdc2699e4a34c524692684e8e9cc9c9691d49a2a71b49a23452d43fed9c4e348d434303495466097cc61d8ae41b89244d9d9691a4794aa26313a2e92e4b243255dd9a91a10b7f575ad64ceec31d95b3a4e8aef1b464308aad182b26f7316e5a0145f40a2c72cdc9c9c9c96d45a628c8e23a9d4ea759040570b02a4da5a9349546765192a2565335555335492d4a5554a65cfda34cb294450e45d11c8ae65034275a9129902ce869ced3e9148b0081c3a4a1349486d2742185a4324d652695815a645a858e24854253079e5a6e42a179f31db76cae3e216221f46e489245bade87ff5632b45b8845bb2b1956abbd17430cbfe3e486a731d8e48e5e8903de0cafbf2a65c3df649a244bd8658a44968fa23a9fa8d933513ddb50b58e176d6a99be41d3a05d90e19b08dce991eca24793498faa9cfcc91dba051c82bac95fe8095394e947324035e418870c8f842451362c74270477be500e419c9091cc083a438d501a8a64ee4c26d44465268e245136367389cdccb199369244cdcccc2433f334336f727fce4812dd994626cd4492fbd446ee4812c5a137f44493e0c81d1cb983237768b7eca6282ae200081ae48c44208df91500c1036563634345227902c943c33674e3e0e0e0745718d5317267e0db2449347af0878f5bc41c49f21c3eeac021be80435c877a8874c8f0b10d11276a519df2d73654cc9149b2d6f2a6f27095144da27474a4111d1a1d24146563c3c4469aa44cee378e245175c9cdd1c97d8983bddf369244433a17fb27978442f7b6925ca15061957cc2fd2a191c32b27dcce9adb50cc71cac5a4a6f2f2e6608695895d24a4692aa225d15c95dc9e43e2c22995019a9a8a0aa2255118aa2a83ea8a0aa1f70830ca836cc80b28212281105b28c50344f5925a0b2232a95d998c2d4c959c28da774747474727f47ae2a8a437120c4c30ab204e58ac2188034e6211a7090e5236543d95036944d6e7806981c50335545cd54d44c45cde4864a60a0f04c9deed08742f742ba939ba3f077812ccf650b8392243d283559d1682d803640a1699a060a14abe0886e9050983b73870e523ebee525778a9253ca4863c4c21133c28e464a69cc228e949ab774f68cf42d3d7b34634662e18c2f4493fb767ad1232e7a94f2f8a9d32394c74f38f408f4f8b9d3a393c7cf2e7af479fc64d223cfe3a9a947f7f134a647f4114f2f20e87e6636a818e5afb515bd92d2cf89c7f3f1a01c663652ded2767b8c5b8d31c618a57cdc648c707a91c2d5a370d641dcf5130efb87b3f770d5294efbe5b6534e4e9ddcef6fea6897b2bad5524a296bbd8c55cc151f818165eec138847104c6ade43e99e44a6bc3dae2b372721f06776205779264e34eacd08eb0454ddb5ad3b4d634b96d9ba665275674d7afb89324dd61f8c4c68a2b6fa3ac1ea110b3143b8a822c4f739ebca8a42a5a0aa39a744ad18c00020000d315002028140c87c4a2d160a0c8d13e14000d7faa4056529ecaa3490e83308a318618620831000000080200190568b5027f422c579c563022eab783bb6fdd973a804b396c87e9234450ab2661e9ba633df6097518f869ea41b8ebe0d5b0904a396c4da672f4b56a1c5bf8656b2e342e04b6f94f1d8970aa66a23ab0a25a2a92f7b5d244e78a790c1e78e04ba486f1259fd015841ee1b30fc667c39eaede93d544a30e52ee86a7c85e6011e435d0b54c79a90ac549506ccc4a9fce4a1dd5e44675e7ca9a90770ff1874f7cb26e465d66d3d4858ba963947ee6a93c40c0265a71cd7407e1053935eb3df2fb5aba767ed6bba27f4aaf3832f71d17eeca905b9aa526ce53bb6fea9c6056749463bc19d6894afac8bc72d54649c59ab62b3fe7e73ec4f689a96a2b758d1659355aa7a32884a8d0abee7a1064d6f998d6d57f279972613c6bfb9dd7ba593c5ec4da2267d2689a64f414a96d4b43794fad54ba0a1fc0351bb2b8e194090040057829d498c03cdc33e3d29afcc56a328763ca4a0246ddad1b5c04dd0a570fd08e3436738e54b019570566c881debcb6bfe4c084d4a642190aa76982890567ed685f22ef921eba22341cabe5143e187e780a70cc46912eb72a6ada92a7b469e41c9025a31daaf9ac6ca8cb03ca548f526b7d996a0d1397b9eb67c73459f0dea6ec443d7930603ec605e1f76dea0f629385120d2317589cfbd3a90b1d4ad3c3ce3989d39f446d381a54a2f12a0e2ef12b100be0b5a1891dd522a49b8aa8624d6395f0f578ef4d2dced2fbee41752478d276b3771068356c62752d099ff164182f8710720a4c311e9935d8ff2f026c31a20de4b0f2e743559294af80b60839921fa0695dca9ab0fed372d524092cdc8803e23d98afb13009e66ff7d15c81889ccf02c71b05a562afaa73f9123300a31bc0ee75090c05f88599c781f1b7cb1ce3a67ae63b375483d9585d78005d726ea0e80c4a6d061220d1415da1dc8fc5fb86a7c1ff4a19fc4085f92fd69fd80cbc066ae71aacbd12e2d04e843a24251c0371799c1f007198fa559afc7098869f7aa8963b7d38a0fb4f708a2c4ae14391c24562c968775299ca793814a37105956cba488d5023500f27d189ce0e854cb736fb07b6aade1d13d9f9e7937a79898a0059166c822d06b4d86c6044f2ffe25244533bac6be9411a6619099459d28869534e6fbf264f602adec3a7147ff03d037cf94e81bde08d5f0480fd0afbbac028f20f79bc0e63a3b7836f43526226f1093bf81c02fa775d67cd9b99414c9d60c4dcd4c66a15af04c024cf7d585f88e2aadb824297b90e818a7514da1975ed65c568442ac3515cce098a5d3c5f7f745d321cd4f322dc182c3559b38c3801949dceb17024c3e10462899feaddd93fa3c5e1045d274c6927ea65d00780da76419fdede75cd1ed6db9f2c68b1b8b137f094fa52ddbea0833029c5522423a5a3b9bd08700cceb19f34cd41f7a52a70fa3f400020d8ac8da8d1dcd8c8a1a0ce702a4603bb8473e472ba184c17a9153e3248e2216ebc8a09eb536f2e10c7b358cec1c4d1d0b043644ef8a13b2444f582916ccb1a8b4443d6eb84eb550ee1c099d25f067858ce2f03b4d6bf596bf9a02ac02eb32a46857c3c2c36686c2a576003de72606fc2cf560ddc0bcf330be316017111d009dfed2d49b745c5bdbc70ff71f10ab60a39eca569a3eef7555bc130d88bcfb21d6b2dcc91a1b17142f3e84309e2d53011fffc4e67d76692a08fd55b1dbf97469430d7ddbdbc26396f9734f772d4ed8e8acb5dce3b042782953bfe9c12c4a133b9eaa093bc8f5b7497f28d99dd36cfeecbd11ad9723d3de2812dc63665240e27f2f31453f132918fefeb6c05c9426d5092a4702acda3d33f1f1622747248742922bd96ecb9ededcf7e567e4093abfc1c80b519e83fdbc3cfe6d09c6835d14a2ceb25fb356384ce091f113aaabfd2878a9e592c436aeaf7afcd72999bfbcc219b31c9bda84ff017beff682eb36ea46ec7eb87516c52a30e954d0c71d1f3f31ed46cb72af765b7a97e82486ba32dce08c125e288bed170fc4c1fed5916b9ee0168d36533d6319ee1823aa8e8a4d36cb0639530d6de60523730c124586f304ee9a974ac442aed9c0a5242643c115e50784f3b3e9967c159fc799a6ddd6d49abf7070129ad085913700d716668e33cee588987eef7bd54878f8a139ee8c013aa84ac85a0ee67ba31c172be6ec7c1c9e2e921e2c8f23194cd9eb519a6fb70122ecbe3c279731fabcdd83d038a21eca6cf2f7c7b77ddc40faedab1b4e7c7c1b5e4c273ee377fa80e11adedd3a69547efc91608064d9279c335926e858f3357f0d81dbda7b80f18cc63293469b48a3c2fa171b330b1265c19b452b9ee54f0895de71ce9cccfa0a256879be96ed06722529cdb384eb8f69ca8944e2da3dd1365f41c7f1048046a1671400d082f764e0b9e1877ac8fcab28f3f0fdedb9f1954b8f741b54c7135af3cc8320b463c6b34c3e9b9e2207aadf935d54e2386fb6f6acc717760f4d455067c1079d31c43fe2255a0712b096d1ce6d23f7fc71430e8e1eb67baa0de1030edeafd494107de136c86b72fba54e2dd4b96cabfcac33102e1e0563997e1f0f4b303e6b35003036cee9bf06ee7b512529f3c7c4002f1f86a9426649b5bcd3dc08ffd302acedd91597c05ccb23524338989b5b2fc80b19994baa2b4da05d409ff583711079f549c940cac94a6692d7170aaa0dc1804124a1b3dddf3f11ef66ba6c6e15b6a35cb998964ce262db5826c6550b11cfaf91ff2cb63b93b109f24f8d8b3c4aa67f56fbc231ea11c5faff240c86bb04fea0927994055181af5960e0aa98e4c54e38de26652d9430ead24e12edec5028a3b9f0def6248520b985dccca5b27c9be5e8df72f6dbb8f914899a83491322a281f5fc2ea87a41c5ca508f5307aea69d12deb32441ec2301ee5f8cdd832b994e876164d8dcae5992e7aec156e239f15607e7b2cb9658986f585e5cce18300e2556f311b7549799b23acf7160d80958f98baac9ae109acf8c20417a3835b756dc5adc035c297d17ba35096d5273d4c665e289d9776cb98003703603a49e07c0bb083a7a7741503dec257546fc5d26c6eb24ffcc035a094da3c05f9ef4e24420b1da57c2ecc70d78d086ccddea3374fbcb6b417b6e9b908d3a9b02114127da5b43d453e2637418e7b90aa4c55330b441e0b6c9ade9aecd61a161483cd0e411064877c4ec0eda430479644a51712c37f978bf1866e9f0ba472d579b7d9d3aad8c88681f3636d89b6832029b00f5c05fb55c4f68ebacee0e452f9703014a7ae91ba83d72a413562d7e2586c0e6030dd3e0b57f784d708cd41d91c119d68500c29021b61bbd5f09259c457af8eac876fc86ae855180b3716ca6177e79087de82560fdbc27f097e63d52bd47c886b4e079448609a6339958e9db801145529c2155136230064daec73975adb3290c3eb6cd07cd60758acf40489c11642c6ffdebc5eec223b5c282847574e9f74c469646a991600693829df7b53971a0c7986cbe80950ed5575f9d0bd8b9c8213f2c2b400ef63a86a5a4820512c4536c95dfa6144b0d29a62190152a0a4af83def4f3ea3c5afd3df9758e6080e94a83971557d9d9c53faafeed717c16bc079b1311157b972e96dc8b5a8b04f3d0c6a101141bb3ecc14102246cfafa35c77e6b0ae6b79f1bb72172123b9455940f448db9abc339b167e200ad6606d372fe2dbd11236a3c1d3a67c13349b6c258baa70933f430bff17ac290b4efdb30679949b4a624554351bfc1c741f4c3b58f77924792bb69cd41e8fabba500ed7e89560daee2d654cbbaa98535e5594b4ba253ff3c8963fe9eb08564218af40cad4f941fc6bbfe855091eab6779dabe028bef39e0146fd24a6bdf3616b9d426a2bf1b5e3c01fa914beac2c59996664cd92217b642c603eb216dddac8d93739acf3275da2e33066b7bdbba394cbe4f5ed8cf5bbfe6aca62e9ab008dff1cc34f1bbcb08ad2cc306a11e79d2e15dd0298dc3a8803d54b1064afaee11b505cd1108888011a1a104509c8c72542a090c666257edad8009e2333e44970649973b91c31a1a9a947fbd435067c99f5509e803038a2024e4193e0dd013e3220fd231b9b66845d97b35ebc3034b95ce167e83addcfccc768d78d19581c9b8c115cee252382ac07585ca1a7c620a8827fbd8e7ff03631ead4a82cda984f51ceac4cec4bce72c13617444d0912360485db4b30f4c3fa6200f395c15e1a993bd59e3834e3b9f468a5bc4bd3aca5524da32aa5f0113f27eae49965d45308e6d314de1b17da5b057a2101cd4501bd2ab3ded84683133b42e8414a3d7fb0282e26ffcd7007f9ba084c81b463629ed98352ad24d6054ae6f14fcf65cb9a182870af84f43b8b4b931d6c371113983449ae7569032aa713e49267399f684f5e1ce34cef266a2b3ccbe7dc10c57a9618129771687b34d2969f4afae974bc080bb1562a0d45fe5c13133acb5acc26cf90453aa2b9274d1604cb626884c02ef152424480c85e784beea0455d68c8ab8fec1272d5a6c308b3a41d5972d1b9b6b6645ef6b98c8c86f04fb5fd31ebd43062ff6bb6824f41c0e8eb4549b2924a947a743ab5ea4a27d823473d851f68b3e150c27ad499e2af3378ddad240696e4159ee1b8cd40043ce58cf16983b72ce8894c0ff67ac8a18afbc8187fa93f90f1a7e00c38619d3267cee4cc1fcf17b44baa6a5f5dd885418f0e1fbd802272efa8de60bbba168072dcaeb05118c9368ccc4b25170f93894d4e0e961f7e49af34ffb57e767b46146811a4eb8045ec92382a9653f12b22e31f11997d342a932772f3b5a0e4078ac09d8ffb2238430d94e6e4c7b09ecf38414ef1971e6561dcb47821dca07172b603dd4c0c52f1f744d6b689e0639b03909f6c5935e4e4057982fbb2e93337c9d1449869cf48a8e1cc8e9c32511fca84e685ec7e0f209b99e251091afbcb7e76c9ad9e1eef25243dbe8dd748bf074423d105a8edcf01abf48c9d3f54bab0991cceda60b5541f21e209339bbeebca59e502f3f8cbb5b141c8cbf7160555dd5b6f9affdf116b63e2be6c55eac457618428929c427cf1d2a724e79e69cd0d2113ea20a165af5bde2a7c3bcaad982ead5e9df62fdf65be3c8ad91bc08eb3ed6e22b3d1f982509882f520ebd0595c1083b4471b54ceff69f3248d8d6719d06c9930f22fd1fb146837c160151bb767d9f2fbb1345da9056f2ab212d0e05a818d858b9295e7079c2fca545988820351732a2c3d01f90c67408ddd047a7d8e6aaee4cc253bd2af9ec3429a0fe3ba4aa5a62a1d6c093b188e3da56d6c3773c79d0850943a40a1984b65cd4a44df2981473922c0f5537c3b57c72a9648f2c09b96024ada5f698fa4a3adad8e6f397c09931c4ef4b03897b30561be4e170ef1e16178eb42983be100351e3ec1b527c7e1d79ac9ebcbb3beca2c9fc145ccfd125889c707c441004145848d437a83914234cc601c3e21b52e316939c5101167d9918e4a3b2b6b00bd23015293518f9e083f62007b6561803272a991e6b7760020709cd3eafe1ae392dedc7178990deb12047b1ff7d671b6a25b4b9abadcd9877b1e5ecb8071aeb35429ed1fb600526f0e44758ec8258dc0954d89b302968efae3a73a07a7ec8d2dee51c47867b499e772d6c9c87a33628decf6dcb46ed613a29c54fc432adf97321c868776130776cd2c0e2482d6f20ce61e050e9b4bf6a3c4c995c7dea927f117e115c4c29da26996fac3b11e59547a241a7ea13bdad86fba57e06bc56994f08328507975f11aef33a57ca1de6a38a60a53163aa6d48fcff0e9058d71feb1c0ffed8f35813518ee6dc3fe6aa78c66f24f0bbf34560709cbbdd54fd44aa7997f3d69555327b5dc3a75fe0984365c55fc866fd25804f30953120fd1814c12b7bbff43b994a18f74b67699867eb0a049e578082fc0692826040e6b29b393bc646e15a5789fad9509f0bb43142bb243e7dc4e102c55ae0b7a06102701573a43ea9c7a4a875bec9b55db1abb0deee0c68b38fa15b3f69bf6bc29e5544d0668c7f7dafc3f7e459499004e9acbb7d1c6532561c69023bc4ed5c2a92d1a083f922de678cf5d520cdf511321d9b87446c3a428493898aaaa5359813f28f8cf39737deaef2ffdbd19b7099e0f98093aead437262ae50c914d793d36d5ab4c12760d3af605fe1b87641beeb0844a601a9575e2aa999f39fdb0a37d531aa03cbce1b22bf29df011429d13395155a5d8a6b8c425ca11193e895ab45ffd360f97a0b2dc01d5848ff49967b3389fe6c6670fc4ff1a89e33a558bf1fb91c58fe4730c3b2bc10b63da6310fc3a09f1eabed8808d5adbabc0f3d44fe596b604a713b9912e9ac30fac36fb8f390b350b41fab8e905dc42cb246b564c04719a8b4cc03ce676727377dbee8881656b633b1fcb6e86aaa158bef4dfa46f06f00985cd9957cd14ba5b62d9bbd2e1eda61c6410089069f0396495e594cef0f76e384fe82d04d8aabcecc0862e05d7f88018af3e96dac573904349c6f4ef3f812e784ef156c77bb8238ac40689f52a5595288725f5a069e5be95b86727bf380e60d933660e77d3ae626c852c5c579f2db5e1b9232b70309041adb4ee2e8445b3b1315ebc0b03271941e5ca084aac7b7a17a4c7784652ef1839bbea9a1e94704b6e5cdbefedaae8771e24ae64baf1970c8b81bf7cbd85f0c0df3de039e54f47f975fc3d0560388250a31fa3033dd96d1cee2bda97eef41d28cff4d400d39f14c02212705408816e02837f41cf500f9ea3088ef8dc0c0622ec5df4feb152a0f60e81acd542778dcb3fab1d95518bd70103f9f61164fccac26daa5271def8f4bd2d78f781b0ab2a1951efee7d6944d23ea8f24f5541a4d993725c807521f498350af4c01ab91224f8d32372e51f487873550973ceb63b085d20d223b64f502a531017920f989af22319b5d56aee9d2745a70f7fbe5321195761e653a809d064b4930e8a2d00394061375a1033324c8565b6343273e916a22e25edd8d0022368d0716919eb719a7b1461f13a7b9f8081e205e866022b55eb3ab6297042bfc0f553adc30db917beb54c1d2958385d310b8f7f0ad751fb64867728fccf34e041b9ea7d161c06fd7bd539dd4088ff7a7dc8cfe4d4a4b8e3dc35594ccdc07f5a0868d96d04bf70ab492ff9853d2e5b0497d9fba92930ba806b1be4f8888311b249bd2703fa8d07e9575efa27775254a1aeea421cbca62f52b058b48003220da5942ae16ff6b9f88e09b20b85cc0dad3ef8c0bb353553afb7e2ca33c3c38abb370c3aae4bc600dd4e922c4eb480d9665bb91409f9c22dfc2c2665463b76017777e8580bd585ce2cacb112535831b7dbb1605e992134fbc8fe2d5b2d09ba2d14fa3d98ec9d128f67fb8708903e98d76fb2b775858807fc16355404400e1585fd9a3c983ab7c06c866f561fe4f8edc269647c925942b3d95701882ec04613d35c7fc92a827c749cd0464292acfff724c406f3d6ff6e69518c475a287b5561cea8056ead7861d95df1b8ecfec5e1931e912b6157b877f34e02847099f57aebeffd04b979676a5d03dc644644ff8c3eefc16a492ed9c257885c291e6d745dcb84aac6756435d54233f85bc455df53e015cbd5f1283c694b8b60acc03e6eec9cc695d4baf280bae136537647637712180e563279e76dd6be89a96f62abbe47e2b46aeed3c7fa5574520023e6d59ca8985e91e98249f8af09dda21a812eebb8303fd1134083aa39281686e0e15ff0fde70f31331a11cd95be14cc6b05def82851d7d4e52975c6c0b5459aefda3bb6aa23a448fceeb324283b4729379eb0e74de79a074a5ccd7944e0c866257bfdd01cf410403a209ff0dc143843ddb79a4b913ce15229bcdbc50feaab56a569e8cdfebd74e42895b4ce60cb27979b3467cdc5d8a26045f1e469bccfacc47111f1e881f02bb09339c0f816ab8ec5fd2698fd49b593f3cb5a52b690ca836f413eb242c43eea249666559e2d491657a41a0204239c382f15f47847ac37980bd80ba6bda19cad26089768a5e91dc528307b4cec92eca5c8be2e2c57d66bab83412603cac8e4a05127743915500581a931fa7efd8b72196cbff2d7fb75be65548802e6a72ccaf626878ea7fde277efceb701d5947c28d059a983563bc01ea08bd111129d5c960640f4d3bfa1d06cda0383c98503358c5f783069988f4d6cbf342eaf5aa7ef5c8e851be12cae4aea324e7494ad946089928ae48c88b6a265e2c0354d13d8b50fb681a94234f7a1b53b671440a7fa69c5cc3f937517dd548d7f4434619de08b81029652d2b33e6125cca6501338ddcf36292ea0c0ad407b317ec82b70800c19c93ce74853219aedcce218c223d642921b8a560a58828d6b5c060384e581ad07b5e862f11f4b0e3a9e59b82906f6e7655006391407376b1973652dc225cd27af38f7f7fe01efca79d46601e5b14fbf1227166315a889e9a785300a91fc9091f044b83e2570308b90828465a07b7ae2efb1ccffd94ce9f6a22ddea2d5f5fdcf2b029194924cda6a3cbcb870d59a358568498d0ee8ee2ae88331caf5a5e1d24c76ad2514e536621e89b9cd37a80cccc64fbdbb441f078c25be5c3b8f9c561231ff02a12735843afc64a95a19887cfb0bde122e53ead0e487861c3952496d1a72557e996c8ee85d89805c0a513de95ce4a120649f371088e57389c78773ff3e018367b1b2487a78ac019711347ceaa93b21b93243780ed5b3942125246ca2993f173e86a839841dafdcb59546f16cfdd804b04f1e8305f10d0bad203d0273b1e64f476c1dc59d2fa1a661c10576b85126bfc7081516f103f38baa2c879a1d8c32615c885a012440ad54c793ceae1228955d2941869e022824d3b200b919d27e34468ad1d426c78eafbfd9e69e29fcf88133ec0bfaade13732f30301979f033dcf682d4497307b8b84c81982fbfaf2d14e1beb91c83bbbcb19a9d4fb77128a0ac45cc804ad07f906ce12e5160d1051d36f4f0935b4e40fd3c176222416e3010871188c9c1aae1984be02aefae755cbd2198a77c652b8235bdc245076dddebf86438528c2c60291586398234c9a54901794d39c57e7fb299a1c3eb417df618438d9dc5f3392210c4ba3e47c3d09ff49687d0f1e58acfbd535b1f0387a08a48aacb6532b8a8775da90a204b6c66951787b1c12bbebd2f3ae04d7108161c0a6baaa14c0298be068a9f3abf76032c8112a0c2c1825b4fa4d30a028e8a03415d6ea06757bc88a934b7ab1262d2e5aeac1bd60ad11ee0f40a2268988b7b8a56f2f114cd4ec74fb05126f01024c5c18610ddaa1a7b2c791bf5802ec873fe0f526883c0a8412525ec7839c9422ec30c1322c9ada5424730aa3aaaa56da3dc16cc9b7db0c04315a81f1a6800497167c170a488605f49d9c656d0ce63f3f1362bdb973ccb0a063f56b03a5b30f84ba4fb4a205658818746077ce9f056591f7a9d36613d5770bf61de82d7a07ada54973998fb07476ba527ab1473cb3b2fa5bb9ffea29a1d2d995e6857c048e904d86d219f9b77f3cb58bc66f8f3525ebcdb4a7adbcfcce208db9d99bd0cbdf93baba7ebb5d041baf695987b4be7a194ab8d12b7450b4c8367fc9a0a3f0addd1df514503cb8aa18075fe067283080e0783a0e15a07158238e0cd5109e233a5a993b3f82040e46c31dddcd68470122a08f13855c8a6cccd11ca5a223165b2dbd4169261f3743a0d61650f1fce62af4246f8f06326bce092a0787ef67e7c076abb459aed2e1d3c69aa6c41aacdc35852a57777d87d0d1291f44b029d330123d83a9c17e87fe27189a3444f79db1361f349b1d9dbda7e0788008d7a021a3694763de9cf5c5d035c3926a74852e6025158626189925b6e3cc75f621ba1409f5f5f7f5ebed5ce02a718582c15ab011180f81a99d1491656045279685516574a16e54d8d870dda944ffb1b03df664dd16afe89c064083094b696c1d80819671a03b55289c4848564531679e03f7964f586e0fcbf6d0fa0130f3c9822c51c9c8473a4732743685ad47a12d32bee5d77a9f4369ad4a8edd0bf2e22fc247340f617c3c2b2f7ddda6dc3d622c8faca04604e60272e03dc54a9b50e73527c79e0080740eff38ae89c696084e1db472e5503130f32081a2f24616d56f011b5fc15e0ff0ddb844d83e87fd7fd4dd302ca0a55b2610e0adae28d104b94a114224c408a21d8152efc46c8073a0bce02c6b603602d372f694960728b76e0f86ae5f5ed982a7e195cc3d6bc78e2fc0dcc08a051a2524a8681fa12a12074d5c508363614e8f9fea8d904d5d2f5cd4c3a5eb156fcfbea893f612ae5506852e0bfca5e7d4d5d3a210aef5e613105eccc015e3842b3c0274ac8da29b1305ce383d2061148c2a2266f82a4037a4a78fe9a2c7d7acd30ac273066eb130ee29d2860643e9d7a8b82f4a6418ba3ac8597ec69b2d19e8231f9983d4a790cc8893bb09e88e959479f3be3b41484c2e030d2f39e9f052817caaf46b4a5f8b760359b486e734dd500e7df9acb6bb1c63f0863105ffcfdecd19a35b8b0b900d4a9704ecdfae9e74772d8adfc04d608c608c070d803b991ed195ac89682417c6d3d800b315e0d0f839b9c8f31fcbca18e0b1ebd2e4851cd37096b89050eff1cbc934dbfa07b1eed589474903dda049f6cc169b6cb57afc9cbd4d50d8549e99770b4476bf6e288d892e0db6a88bd5ed291b720409dac5d936e9417903d9cfc11b90fd2c11f285025c86025865ca19efc78a565b31f327268c3f7018dbdeb9a79abac3cb30ef491fa14ac316487444dff54b2b903e7774ad56adac943ab222a72faf9048bef1cb3aad978903f8f94c46a275df23477104cc0154f07b307ef5838000de9380661ff05d6121c8374d50b10366c50a035f708d564102778c9fa34a9f49a9d4c63b6d373c68ca42dac43f8162b72b5a3f4a784c57105379950a23e65f6dc8e35e8a292d2c999bb26a71efc16558211cd6e93865f4ed48b5726dc7528d1e0b04d786a90bf9facf454dc30d8ae384d44f4f547fafa402a1ed52d09e08068c0896e3a856342651172a56c1f9fb848c53308d3dfa70e1123ac767690d7a70c52e3ce429c8e27cfb6e03cf6d6e1d7a6c1cf274d5a2dd23bba39501cead48d8b70fe1745c3f57a73d1912a98dd963bca65cefb6af62ec7b82df8bbe3591b07f1cacd4d8632e2a02501b9d01e5e5eac89246b90c8ac52a58974447ef29078aa3fa78a0ec021aa2366ae7b3ba059d49e99d71ed9d8d8d2adf1903f20f312cfdbda68cfe178a7583118e2c5351e03a86dbaff92220431d390f69518a0e40384bd2032353b5719618a68edb8f2e7d9742aee33fd1145ed97b8461bb21a27ef1e0052d89c963c38934e6dd7b8b2f3778bc09fd60ef96201eece3571ab6bc647c4c5624d3b38f899684811d7f0038fe9d0674e5a1a0937683cea6e8615136cd23f62a5ddd0e1094f7d858027ae0c5f0c9d7813f0258070572afb38db362f40eed3bd890792142aeed4aaf01cbfea983f102a6f01c3698017fd144d8e7fddf480072e2bc86747213129e7843501c62ace82866f37f3e4ae16434ed0f83ae6ac34c54874d0fe6697d92a7f41854d999338c819edc598fa9e491371c1bc37e61f41e37e4d61b22fc1f739b94f74767281e9a6a17e55a451c3cd6e4d5a3f784328bee990254ff421cc6953d2f4bbc20198dac4ab0a18162b818ba63a20228591a0fdfff5e4769321b7be34d1a4b48cbf3f2c1c3b6d912e40760b8bcd8b560cac33fcfef3c76c9e78292c00146a86ba1d1352cc103e4ad54f79884b1666356542747f3f31ba0373659015a38b7a007aff395c14523fdb6994ae2279bf72573f34529c4a8a62ff5128e1418bba8420dc59056de421100474b367f4eea2887ad69232d4bf74f25b0d8912688094d368e7735655de529fa2d8353ca8f91d5cb916a2a70a4a841e98d231a859910601971e198d2204458eca1f65105ce0a33b60af902798182ca637876ee87164b92d7e3fddbaa93a2efb744634e5c28dc0b752e256f618b0c8ff0b0214ad6f89330d14e102f8d9fd7aa836fc7538450538bbcac18813016e343fa2c72db67a031ada99fdd1360f8384680efc2365d43219e782c4b61a813421240f4956968fe6a7b7aff69dfe7324b762ea29e5ded8458aba7c48f2ab473e7243f4575aec5841dc125425d293555e6cc1503f890d56d207483f5a5b22f36af6ac3fe5089081c3aeeefef42f7940f223ede16a24ce16ce74da82e762c82b3dfdee379eb9f975e23fd3699ded741c935b12d08769d5a2be2d4fddfbce1b1f41995cdd5de87b56fd24f5dd02eb354462514e0f9e923acdc19b83660bca6baef12ac148b03c46ed5929ed396833d921a241d7ae2aa016bc7006331f332b955ac826f9e997530d94d8feef70535b884c2f568dfe4fd9c7edd85f8d5afd843b5fa77e2c55b5bffe4727613718f5b3eb672e8ee71b7558f3fa34491b517d5a3c66dd9fc74d6f6a001547a8f64b9f3777fd52c791264bdc6e48911f1d970b55fe01e3375a680abdc15640ad9aeefed914bcf97e0dbb7abf1f127bdf2a8f6053c0828ffbdf639629e17af978ed10efe3c84039c751ab253233a546d7c2dbd144f8d4d8d3ac2edc64b2f8fa7adfbe5be32c9458743fcb98c99bbaf5704959cb927359fc23c3abd2d5be834c09c2620a65f48555d70a5c81707677daddb97986c2f02b93696d0d40939ad6558e4bd9ee727ecb590c5c837487c716854c5f98edeea486d68cb243c330fde204dc864477f848a3977d694e6627e50838ab89999391b7d21554a825bf0b1657fe50857bbfb12c48f4527858d6b707c424ec0c022440c40631e2fa4479ac7700264d5313b5b04532f26893386444c132e8464a6c0b6ab20e87acc112bb2f87b974ec052828341a25568d54eaa5ace18ca0eb217e69b929582ae78366fc1546d20e7cb886bdfb5f28431ee1bd495595170bdd19b9df57176a28dd0997f6556268df21be1417cc0cfdaa331dff3b98152b5e29a7264ba8c831706ffa2cf6fbc536116293a4979abb1c3103ee6cebf78919e5c760554b2a203646138a2e2c3879050a3b07dee140959132c3606650b455e57bec74d75ecfca85b1793f35d6506e4df508331f4f359d2862b90e94aebcc26cc6aa51f56bfe4dd7b718e918b94c1d9b9be28743a129d31a21b5804607d8816e02a13c64583002e65e00a8b461bcfb2720d02fa9100ab4f43fd869a6ebe03a6dd6bfb42a9c2cefc5b9f13040af0c9781e2d07e3978c46b65fb405528eceba40600f8d7f5fd85de4b18a59f9beaa6e6d2c048886b597aa1710804c24eb5ca3c23fa4ee70998ff8a9f49f473c47eb9d0076ecd96041321c5bc44bccb39001a04cd10106e6a96d23c9fb64459ec72045e8d8b8c721ae5d0560f98c9ade1bd2ed54d631631c7293e21aba9eafbb590f368a4ad1d0c957f71df4f53ab780881b408ec5f8585b021a9501eba61978d411ed703ec1287e93869c3f0d7980b0dccf070431251829a1a298b020c6d4e8eebd16952a28d6c3a5e6116b49b70fceccb0d6713f658201a9bab1f863baeebb27ed0a9e0ce68a0eceb9c924127a69e492c0111e4957135dba449347f35bdf6f24edfb34540144a0f3d9d04ea861abe90f426363629b2faba9aa29783195d97773d89adcfd02c864acc337bebb45163daacc57471db7a4501225ecea6736054b21941b5baf5a6d9d72f2808fada3b6f0fe66e3d581a8a9b41d516154bed9cb115ed1bfcc5d6c02937816d9cf14e26b8a62affb785bbd1f3729ddd00300d8b6048d91435aa5bab57f4efb67a7abc8e10c71e1432fe55740351c719c5568b8dec2549133b23e01a1bc5ec9869adb5698e041cc21688b5067a6c4081aa45dac417611432fa8ed0d2a36e188d7cabfa65d058c866b30f2026df92d32c131ed99b363d4c4d3cf7c57479c2197b678156557746a77175c7bca56ecf25e3d6ec13ec652f2fe6355b2dda113d9a67dd9e8906b527a5d5f6cc7b1fc28ecb396e975f1a2631e8a3b9a124216ed46c49a1a5615c99ca71c10813eb070342a5e3a63012188483ae0e7027df4d844566ca9e7c34ca7e973c8bd7c0d16b2a2e873084aea31af7d25ee30b9d7801c72d073181098e290871fbe9d0dc440dcb863d388098cc28d1a7f23860f66493492d29f00f41015b1f0ee921e9ed592e40a5c909e962e935b037d93406ea32a68378578027163089a32eb82ae2f62980d10ea09bc182f26be4c10651fc0c035ae285b8b38a6aa824e4dc0704fc0c57c31f07582d865c0da6dc86ca0dbd22b072e77dab6c2ed75ec00d0d9b7139919f11a8b69ca4044f35cb22d7516287a2a49e290bd9c1d688c93316af4d44961a4d993eb212c7312437fc5657cbe41b230609e657bf2ad50bc8a4adc30c4af0e3f313b161a9190634f5457751c03d4e083eaab6481566008c7c6312cb570bd3fde1f22dd2377c1b37fda4d2791f3b3f8b0d06bef958694da068b46a02eed206abf39568f7ec097c8b18f42a4484d8d226ef6de77ce614991be6f7b7ab04389dc2fb916f629a973f66a6b259f18ec274c709f597b41c5f461250a0ab037747ac7218b78db2d1837fa3af33680abe5c046065a495443aa680f9d4fccb03e710e280e81f2ea088a427521f972396e51abe1d7c98d1c63884d57a463ea152fae09683c4b26725c432ef4c2b07b0b3253ca01e175783265ecac693f5faebe3a349cb1b9a06368f919540d8756ff84c38e3b3275fb0984f57ddc31aceaec58db151e8c3804c9e8cae62f6a591c80496de121c48b1e062b47eaa703393935d94324cdbe839eb908707a6cbe2fa8363f715dde5837a7b88b3cd1c6c9a93d8a5f1208d66ba72017e7c6715f70268121d4bc0bfd6eb53f3224332055aa066d159aa50f825a0790aef02d99a79cf5f375d6f96790de2bc4624d95cec9eacc5d102645ebc8127e92251c271103cb99c6707d6a59cb03b17afebe44361fb3f64ed45d03d6ce912a16ef080294034a4b40e6f7fe68ef6a46503ce0d6f89dcc154d4c09ae16cf5f28d7741191a5f76825aed95451b24e5473acbc30cbf5c80f0e889459251af7c0467d69178b61dc42c45abdabfe4a4b34b891597c20b0bfc85a4d8c7b78e11a7a10e7ac824723f0bf956c98bee8394c3dc04436aeb6e25989963b22f9d778c68ae04be864b075551a48b22375b3cd5de0a10632ec278c4c5017d04c2a7d8c984c300787eca6bb39a1ed2ed1ec685b222c98a8714daa554d4a2f8de8b0fa80ae273eb02e3eb6240cea7a152ac7dbbe4fa3779e0fb28cc7a9d69cfbb003dd7e284929a29a7bfcecabfcab6ba060cb7e486d1ce437fa8be7944846ef8eacb8fe1c3c967f7c40e038e7d8c9cdf4034bd915c923a17ea0549c03cc9c70ada408ffe4a3edd00c4d7c2ea1833ef61ec1e5e1d213e4b8c1589bd405d354a60b2b7d7e233ec201b68992aa85367abbe09c40e190155c1a14e044ef36f567278bdec04bc164d03c0f2c5d0564740d480dae1212cba0198226443be175eef2d9f0ea0f2b9c88965b9c3cae1bc28ba04f57013d23ed8dc607a3408546465d1e261d115b5664cb48e334bdc0b7ffb2d4c87973cfee30ca94ff3b5b6194866e412a2a091fed43e70ee91741d48fdfe104adea631d7568f8bef41529d3ca2b8e77bbd6a94fdff440602c4fa127fafcddc945d1053f8f53630bf9e0228fc945aca7ddd209009554b1c8110d7d607375f7aca385f8cc6c50113f1ec6f1495469b95b6156ac51ada9841dfa273c5d87ae242239634345209f69827f033b89c03c868efa3ba593b06d06a1a98f842b4e3259c9de91f79d38497d2ee912dd63e54254efc5fb1ad1380a4a931e47de8387f71a49f60410bba248f70950e977b6e040c01750718d65880f024f3d68fadfa995678d382764bcb92f2e8e977940987970e6acb15d6b83f70d2132eaa9279472eedc1368f94aa1d30c40b6f1655583a9410a2b0d9bc897166d43a8fe327ca4db27e935b994d8b079b1f1b0a5267da48beac9baa72a814908ebd4d226d476b6fa9d214b13a608cbca490ce2110c247ed213700e37508e2945ca571511df90bc6d00f15c24791e11e7aeee7dddc4d13dc96df1d82f7c61f6d19859546f82972623da0889c0ea4503bd7fa1d1882261535d2ba657f3f7b5b14142d075992a72ac23421c535420aebfa3d2107136a2096385541b63b51227973019edb1977070a17f18f0ad5e4092516f929c432303317cf9d5502e0a54efea05e048530e8879ce701263dfb878a456fb3891b6e3f9112dffc3571f444b8a70d708de918015e27154fc522d8dbeb22649f982c3224f4ef90455a7cdb68e7dc8d94fa67b0640c6f3719fb576040ef8e852b27bc807bf78543dc5018603851694a394bb57208b26ee89cd05d4db11d8f1c73ca36aeb5b3721111d71db9cc470f327f8761cdca6fc2da4281da987e329e4046843f4d457ebab9674375f8482fccc478152a7dc14d85de145d1da579048275b462ecb823c294e6590d637982ef480eb82c071aae5423d5c065e92208e368b586985cb89032e2949edd08cb12e4671280330f013d421bbaddf4673bb5730d83563595b9360683fd10b228e979fc0752b8f06a46c94df105b8d0dfa0e2f365ac8d9ec9470734e55c77620500cee666f4454554f567438a691aa3780b0c43009af0a9f037aafc432680fed14096127e02f3ff68d882316b18475f081d4d9150340c42c6a4f86c80a81883a57985abc9bd8c90023385128fc002c6c16ccfc8abf79d1464eeecb662a3ee534d2eb1f2b3c2671adcd385db3a7e0315bfecc5413712db56653e926f3a25bce784bbc10c598720b1ba80e70d59a20d4c5d3d8e7e3b2b463ba40e8e2f43b29aa8ded264b7a9376e9cdc797d6bba995ea29cd256f1b5b42cfa696f63e6d95de6c6c89de3559d29bb44b6f3e96d27a6cb2546f99c64a796f2732a8d45b622278496efee3accbcefe49c2db695ba07a151586902a4e1d898871d95a5599e45ea11307869b40831959e0eaafc035960640426d5d4088ad83b82ad6d662f7555ab5bea4ce6a2cceac3ac54a594f799e6e10c1985771b03c773ca0d623b8db6985096e95cc12372173c9dbca24c9379551d24d52e692ac37257353965fe0a2e37ab0ef0f4af75a7d1238be542eac4c9950af622da1375897d45b5693acb7c55292454fb3da28477085de61554a04ab2756e68c4cadbfbe0a227e35cc31b9785737a2eba4e52a4b1aab33e29fa4a5f8e951b46e6519ac46a80550a144c3c30097aabd342675562fa097ad08295799e4a6b1d1ec0abd2ca59b73967aad24fa7957dd1606f8a6bb4fa8187bce54c06b9da4284a251b5900968d4106e151afbd7761913313e5f9c4e673ca0870d4cb3a7a2db01884505b1ef839ce19d3f48cba5eb040297c17a0511da217a345d45ca3766b8c9b2324379f3b449fa5cb5f0dce8832d9d0ae3caeaaa25f6b4d20a2f0fed19957e6d3c531141e80004fb674b2843dbcc775337eb97a18526b28159374441fc3b5db62ec95f16909f27c1368d00bdb3be3b1fd71441fd301ad4de7a0a07ddc433e830aeb5446b428154d5c0523461a515972fda31133aaaa38d7ca813a0ec7e8e35c816a00a2ae6c0c367578076a27b7afd93b3a1eab915785a20c27c38c3e44c17e134f153b377cca0786bc8bb4643ec5f753826f4e6da6b1a9891ca38ff7a5a20dd548598164241387748da629e00a37a361fb92fa1e5641839e99723e49278444bcb9c08c7538429f3ca724a0c34761324557b05dc60949809dc811a626aac301fb34158816a86825d0341b3de850ca1b0382497f38c713b889c2fd6745f8cc92c5a34896c88721d3838258b71b874e7d5e038c9879521eb795011ba67cb539f618f6320997f170476e3e35519bfa55dde134c162a5eee3c2ac1cde8070279a01291b0ec4c89c6f88be7bbecd068873923d76e8ba547c77418d867deeb5196a18eb47984e87b863b5955255dcb96ec91d68b6abcb8f9859762989bdaaa685c1ed6340bfb9834890e5569a16842d5e29c9b398c63d585ef210c5e696da408f46fbeaecdd58da118196cf0d5cf5746a6e378b0ea85110fb06f13e9dd0e394cfdd410f7a5e4f1130a903f848747d9b0a7d883180cbdbafbf29939f9f0afc5ddc768c3f6e83a0fa3e231e47517ddeb65b7015812e0a7c5f8a7449c111e4544cbc515cfaa0d1ef56da521dd0a270dfabbb47b3450f2e68f88565624d693fa3fca50e65d424c75123ed602287e8635b5bb202ad0510482e537de981aee931c6248735c111fbd8dd9062ea49715656c1b6e1bb1937fa68459a45e3ec9fd1e5eb104c8086e1d9b4fd87b6ce0407309ff888b58ffe9facf70d997cbcb5f22419fc8136387679409fa518b2a4ce8fb4a3f13e5e2fc4bf1d8821455c26ca0ce19d1de654e827ed0b736ce95dde285cfb1bb0dc38278f90a9c34a260a538fde838c03361594b1b1ba1659812bfb44556dfba01ccbfeb60fe16826174576cbe22ea10e0eb4ceada760fc0cc4ec1ce30803990c2e3d003671ab082f6fe18cf0af50a9da6e56059032c6d3ce725738fbb3cbd1c9fa5d3b71a01b6eecccfe462102c3ddec4b01ffc2e11b8d029a4cecf88fe2ef0dffc58ba3c307fe777e7e943e265ffb08ab1adc5306b44bf8dd05cc0c2c1395497e4c61364dff9cf1c1eb8215ff812f0f3190c3947692650da1747b101cba099095224139e703812125805ddbb0e45efef386667ec5b8b80b706684f00ba4f80f4160276eca0d441c13357c829a0c74fe8414116a4c0321e7867620203c71243bfbe8ee87e68f3e81fbd7e156eb07ff83a54527de74c955bfaabeafa7bb3e2d0b775de815e2c23b57565b5cbed75e280c5b4d27e3056dbc4605ca42ae4d31859412ba64eb1e4f9b686d3c825287f0abf3926c7dbca510010ed1487e5a5ad4c7783c02492116a66b738c3e7e3c2ac53e92888e7f7731f50d977c2f32b1a1bc33825e7b9d1aac375f2f00958223c5d34f30f04d851e7eda37d1b89efca98bf53034691949ee5af039f6928835f6a172b651ee4b523963ddcc53ace84399efa4ffd238a84f36e431600e8190265177ef039a310e8640e2507934822f86ac63c2dce51b8568574c2c5f105e1b2476495e59449b8f30cfac21c3528003942cdea00fa9c376c6faffa98e3ed5073ace63aae59a7bacf7b7afc4479f5c18279d40fa0845741ce7afb197695cb3312c237a243a2e3f70da7749058c01058180bc0fa055b0c4fa7f26a9fdab92912a963f9d7e30004ec1601a474536b7e4a5ff57570d64f7618e647f52fda028ea2993372c00fef25adfb01d0e6541f626f2512d407c81e8f015c3c8d32ec32e17d9d3587b897a2824d1b6bb8af499330693ed309d858bab2eeb8ae11aa08a7ae38d504e3fd723e1c6113fd87a8f1d5f912928f9283b7a4994023c482f19ef906151e3bd0241741887c1f81420956badc34392cc9ac0ec0bc856284abe1e3432680125bb6e9dbcfdb0954f6cda2e7cba8325799f9350bf4ab8a87f6302db7b48163ec62c28a41d7635c6acd2a5b54316aec05e166e54afe9c53781b2d0add1024066b134857cd0dac137cdb2598c2e986c2dfb2afa22050aaf3d2389870ae41dc8192d251e0ccbde824acb4b9bf3587f8436813a25c68b6b26d3df2e0ba81ce8eb7ce73aaf115c410843730181684390ad08adb56ea63025293e33e825dfb1146a3def460232cda237da8e53a94bcbb8848ec34044fd4920ed46eaabb1fe2ca54fc81331f3f67ea1e7ff1745c69fdabcd64f4286ad1a9d119a14a4f1b8f4df7ff33f659570f13eebfc34a603f641cad8820a883595f9251c4c0dff2c85204af1b4f21e52d2146dcb9e4ac42e29bb3f2a05f03326a9dfe2ead00e34277958bda9055ccff8a7289458c482c5bd326702b410e9840e33ee9465b2643df9a8a2d1e81dd2aec8b9f39646908657860ee5cb80d7a61f948685e83c82cd7c27661e2d3837d280661e5712970303a9f850b7be54c91fe505e841d4d45b74a51ff283e264d203d34a1050d46288ed5d08b30b3239e46219f359f9a8a11588fc4917fb186633cc3624611be4c5358792e6a88d0d87044b2ce58514c77274265e8d619e7b68cf28ef9ebc7a822d6dfb3573ea79e95229a3a84d4091151f8b3df3f553be0da9d62e646560a99a9c7983ad8049c37138ded03c7dd0419a90177ac94098edae0b6482e9810a94c0666467de050ddf8a970ba15202abbaf822992ff0358cc80c15a86f813765923061221aa96e7a5024ff76c07cfb3e37a7e2d642cfb1475aa4b10dd5f3c6725f8ac28eb7e546cf493f52bb2fd4a2314602e4194634845e52d0c0c6040113a102b935aacb1f40e91525ff8c7eaa7b98908f4d5bd484b48d1ce70f12f54391d1295fad9b46b58b1c51a30cc546198ec1b3a21a6b5e292f7a33b58f598202a576fb6035bff6a80a5ddaeba3179fb55f9928435555b858fdf8eda14dc829ab2d1693e30dfe817d4ee248a439208353014338bcfd230016a760a5300119ab20cfb94d31a8deaeaa27d4ea7bdce6175b3df33e13730e75854f69b2ac21e51cd5778b7900d8e16335757c5a91285e8bd14c5cf226fc8382bc930abe74a0e064b74a04c6b020ca6324deb19968c257d543d18cec037aae5b0b43c3b103fe860eb378ae4bdc2c601ce557021c83101d8c97cfcfb6e3ae0bc78e142dbbf9fab019b38d69c02f3e32dabd6df41da1eb097a79e4b0039687bc0cb5e5e51efbb5a8f2cc64266ab6742a3c5791b8a0300ca776129bff583a143ac0bd6d79872f7d58102f880ae9e119626b682f6146aa0e2b7101dd685f378f5e9bd1dc0849b4b2474c573fb2554126740de9f0803c331fb4fa0d2d4dac26e21cfee828e596d311f338b410e92bcfb0ca731e569090780efe935439e7f42ad48cac5e0d22fdbe03c3285af9f00ac50437dda6c2c463a16dacae6e12cf889870dca0775ef9324eb645f830614e9daffc7354017603cc0b79a6b430e4885cded5e07f359888532c2f7be9daab707faf2e1ab8483dc9b6620fcc7b8e30ddd7875939b0973d0df505a2e02d370aab0e77162f00b5ce10f7d004106a0210a1015edd48d3ffa09fe8c2cd426fabb7f46250b370352be6701f7ba2617e969775655e2129a81bb5f146070e1c7d480914a29678701cf1f8af9e78341f4cb821a4448171938c7bbe38c84525c8bb1728044540eba808a87d0c0ec324feef320039e017d30535a02ce231f2805c3e1eef6ff94271e5a01b888aa3dd8f4717f42060c2a7fb5787785359bfb22e41d089f85f5c8a572a480dec9dd0ff361be44ff49dc67b9d4b58649c537758914409be19ca9c573a423f2d047028409d00804ccd8c68909e52c3bb7593228550c60832241d45e5cd26a103272077c58a5b617679af7c1bed03f3afff74730b60b71daf7bcc58942723b47da33ab33b65e54a2ff07507c1de21437123c4c2e3c4397cec7ff4ae38dab383f7576cb16e1c2d27826515535cba9ee3b4f83862cf463cb1478c42d2883b171200ad53ed76effdda87a6d5720d228093135ef98397efdcdd33f54084160b4d13e1ac9fc563d4be97f9c956c2fcfa5b2d7ffc28233377627e5d94c6da55487de32a1af76a961678b62c36f7f808553e722dbe4729957d2b9baa29810edf3b889bcf2049040cb4e11dedfd5905524df64156459749ae54451c3396e6ad6e0e0a97cdc22de0f8b39531d01efea095df8c1f38ff7b70a68eafd7b0096226043d7f9f13cc9e740a1d7b9f1d9af3f859b3fb7923b8a4ae538d478057084db9cfe9ce93a3f8ec10ff5bab29c44e3a087049a5f24e82f6bb85e2f97a884851d20ec8a74391897c10892024f41b0897ad3430d8ed00eef04750bd3d4654f0f48d2e929818c93730800bb60fb411a3060e0590ac7fceb34a842a2df5aa26b205bb148cba143e0b310d6d853fe745c1b5e16cb569c9de5a226933d3c731375b81122ac4d1fb745b846b9871f8c0464bf507816901c5938ec7a25e41ac4a1ae10cb8326b561d637828e5e12fbe5cfdc82eb7a6cd7f43437cf5a0832a43b64e33174438846f215a879544ac0ed457ce7b43fa40356998caf7b204945ddb2f10df3900e850af046895a5cde03140047f010b529d584268cebc91ee815122c92cad2f864f624aa176eaecb6bc6fd97cf2dbbcb86d073abea00060b8b3b5d171287454328e5db64ad6ce3cc39615c417b39323ac718516b9b32753415c2510b64bf6a6ae5825ccf83d43eb41f43c4c61929e10284005a06c838ee0eaffaa3cb76968c7786830ca86d3a1af9d405eaf433176187406064828c57a889252fa43b418e0f35a98d258e27f6085539d28cc01aa5e01bc72577591c324f15a0d96cc9c616acce28cf0357461f56cd3b6d323438fdeaedfbfcdb81f287a8f42779f0e31b4fc01bbfa381c85f84b019bb96ce4ff2dda424a6ae4ffab75eae2d99f2e42729dadaff1ca04af24e33307cd57721046e92a38861055aaca5ae4910e35faa8e78a6112dcc2ede2355074909e64953795652cdf2354808498864b59731bcecb5c02c83bd1e1d212fda773f0e90607ffa973ea6bd38bdc28683dc9619f82703ae91b650388c675ff9c20c60a26edbf2c24b3523bf3394c18007003aeb2a1a007c0e1836906e992a57cd7fd58470cf0c9f27e5c90fa1d5d5f581bd3fb62fdff475146a1b7dcb7fb05e3325ff54a5acd084a2e1a868e41ab33fb9e2c136545f1e98f5b865dab830153aa96734e883fa000432f2d9314e83ed9a6740083d019695df392dd8f8853dbe2a0fdba85c3a90ed379a07fe71de824e1b112c8e2339feba7a82b82715c27540ea103ccb96b038d70091702743b5d1cc91139084a21b8ead7fd42acbfd6f81a5121f838d38f828e80d34a2b40cd002356f4ec2c4f6344a2f85e808938220a86a3279bd9476bf98acb4cdd3e9aad400db3dcd8eff1006b15c688386ef40dfab3c8055ba1ec4e7efe86b4a01c434668d0fd7132f705172b6fff553c1004ddb8b09cdb8a84cbb1f31a23701f16bb59cd2876158516e3777abcb70129320cf36faada19e1437992df0eb6ae3bbeb8e1a6cc7933b20d58380893417c340a85bb34f970c0b60c9cbe04bc9a86498fd647462c8f82c9305597a00036844e909d256d799869d0598949fb50b010665e2a7e840634e8cf9def0c8e4604fccbcfd70c4e43944153dc35eb49f91177e4ec8bf26ee2f26e7cf03caa9ca73528acc9cca2e203d58fc09802ffc391bbc4dab99bbe2ccad2ad7f1b256e812c592d1d97a7b5af18a59a02c029e88b49aeaa25fd0e5a5122eee0ebc808dfde91e8f868258411a8f34415a56c9ba2d18d3083d1c8e6a5ec8f1360d25ada04ff2ce04d775c09d758cd9037b3173c26de956ff82f7528c9b3a9a441309b715d396c26d9c1c542f3d80535d9e694594523ea8010b8192b7e7c525e9b8664f3afdad842b729e7b701707df13f4c792b7b5cdcb0caa6ef5a29780a0e684032cf6eb65506bab267aa8cfce2dc472152abf819be57f4fc0ea9bcd0135a4aec6388dad2d729d21487580984596e2b22353bdadac0a6bf3d4444229b3de9bcb65f13188e1ed2d1fe1e9ac834ca7969d5679c8ff5c4207cc300e2d01f96a85298f2e8d1b91e55c73c9ac48869e53189d2e9eb5c4eae9c1df1611028c3f66d2484c62dbbbb602f64821e1e482d1b93d2f3c20ad64906155e5814026454daeac5edb6cf6fa465ccf3ca1dd5e874d6a54081f92066cab37caa484758177eecbe134158e226cadcb7e89ae2f00a0ca4763be959bdb724348e3d24d1ed3d8c212bd697e32555ebaca452a4a01479206667725f7060e5ed3d5d05fac645115c1ba20dd16942cd2f5506fd59991afc211cd912e94b90fb5867b5cf3f1141e078ff9a1e1802acbebc4c6f34d0295d22f141885ae841ac0f6be86360f3a5249f573c7f442e7f77b27fecbddcf3e9fb425d650c0a05e97a0188a469721010c109650038b63f91999f691b069a7a4a3df3320d65fbba6ed243d478f9ffad20cc02c83efc6c74a6872aa562178035e11676cca50f17889f8ad3e7fe692ef4be735de0690e56d575f0a1800026f577a9110f38d6961731fe5790c317bd41d3561d01c22b102864e37e20ea06226de3d61307c5e9341c4f0098591a88e1ff23c1acf8562c737d43553ae77318655fd5d8f88b209cf74517d41e3b6a99dc6b59dde62fec6ce920786a61ae32ff5c7de91b7582c9147913ad0386c1d029ffd519838d8274b17928b458956cfcb8ce39c751b94c21c6536c3727142920dcdfd053a789e2b05ea32ae376c8f990257c5b65bca4c548bcae82b80a847f0a0acb956f42f2e367a11e579ced77ac50c020ee0e1391b5a8a4e48058aff5ff01cd15280b04367b6efb195983b9ce587caad2ad3eb7b635afc5ac672cd729926d89521b020c0f65adce4817038967a18fc968e28434a61dda6e9704da795549ca8778d72584e36b6f805f00e8fd44ba20915c1d07ed406e2a721b8e1f6674ebf909894d185de5d63ea966ed19acef0c20828a58c7881ac67157223027fb949fc4af6376ea0ba16b7d39cd578623cce6750864931f2ce30e70530344406e4b92412a9f7892de096d51de9dd74021b38fbf224275007e0a5a8ee3f208b7f70ac5c887e5b7a6ab3e16a4ef5c348d78c9ff410f9fb1cf989ec997b56ce0c4f800b0de8c0d98cdc62b80c39065b6f8882c06068c5c8b60ff4dd37d45b5564cee8f4e14cd31a20c1951ac83de467f2fd8674685a8b33c5e768b67ef0497bd2e0789335b5417e1b13a3aeab97a0b826620f0941a1e826cfd32cc50f2a40c2c39b4e48e599538c6f19e35663a2f2265a54a4fccf530dfcacb08ccba5d00e9f3b14b72750e76f40afddd2ccfba03c6fe225607a6ca93356c6cf9ef98e9f98566113d9ffb0ba4ebf1482eb21bfed7ca48545f8c729dc3d99efcd1b19c2ae948c2bed8d278ff98e0f59ac2c21fe4dcc39f207f1def6bc622daaf03bc26f21c5a405a995d1c26e60a61e8b7dde58cf334016ea0780116178d6f05415ca40ae119b7ba9e0eee1c2e4898574c43c0391223e7bb1080c3fb62b96b51dcaa663551a2a493a6000d721c78688baf4e4d7b4253088f4950c098480a62b318349b048e13847b0c58209c19251d554d34628923563080c57390640e04b8bc3c6353e34596aa58a652dae844a1d2603fa5071a151cd8ac030a340149aa2a17418b876e62717cf181ea1cd4fa626f86a19b1942adb5465a238410b2c9de7bcbbd03220c9a0c2f0caa09451602142a84257037d388f844084e84f0a4629f22ba48e20956a8104209412a0e1c7184248aae6802c50baa6944fcd9322472c20a7a04279e80399104cd09a2ca6548e40413b1a91096080106d3889c9792467b510a6579987f13cf13c44d120107591ee6b0068cb63b41f76d9b17d39e4b86444ec820cf0c899c7841fe62cea0c5cf52a7e1b4874329c544a667754daa621d88a84092e771b48d1c82d7b1430d199e47db5c05df438b0cef81b6e97e7e7ed4a082444ebc90e17f744d97e179ba061219814a860fd2359de1e34fd79be3822a3787054537870557e04094614c4186277215939982ae3324324212f28743ce714116ed65e8f52156725d78967292b8d21ecca70c8988b083fcd90ce31121222224d140676711731e1143e961cee281d0e488774839fe3bd2a57262921cffc129647b2034d9e29e992386337e1ee9ecbf79ed7529afd75a73bd40ea796adec055e34e8cb11fed562d87a3cf13f3cc7209118e484d4e2d7edacb8857f2363e9e66ec9fccb562f88b9fd78e23232bd76bf7a3bf56f13b324754d758fc4adece0ed54d0ce1e7e272e82bde56f2f2f4aee616b94a853963aec44c134c139860167109e9b4e674f85e3277f97e5f4ac05a9c3ae19ced90bb580432b2f6ed12d5a713047cb28653a552c76de77eea60073b144ea1bed2de1dd5c937773feefdd3fd38fcf9c850feddb5ee6e251c2fe97e2f99740db6bd4cdf3ebb66bb1feaa71d793ba7236f375dbbdf4bd64e9ab55d87fae974497f39fd62c1dd57dbb977dbb96f9b092b79394e77f9f482b973187fdb33bddf06718a3bb57c749cde2ef7d3ed1a0e776eb9a8abf392475731a9bfae6b5276cf3c813af9ed13a8eb5ff9dbbe0debbce48a7be22847b69fadaefefaccb9d93e1205412847099c4ea7eea5ee19ecbad349d3b4eea5d3e904f3e97ed472dd673ae9f0ee44ee917b3cc9c46537bebb9d9dce596bb9a74e18023ed9da9facb66959774bf8a3922808411751108e785d0373e47c36eca2699db9fbe9e8fe7979ebfebd0b413c9df4ef256f1cc77d3b8d8e1d75778644985dee573acb5bee4ecc26d365b92e497425dc87a5fb92b7528ec9be47463e59fb7599dbced9134ea1b8a3b89fb8adc39f8fdcbd4da5c36fa59bbdbb24fc8db0ce4bbe30a6b8afecb773f6dbeda6d9b80ea5ccb0c4a2ab8fefb62944571ffb97a6d4a7346838eceb6fe8e53d9ca21807cce6658411e2d47578fa9b1d7b86e1f652f69db2d6a6ae0b374ecdafe0ebebfd52f5104aa6c9a98a71c05c4feb29c5513c789a0ca1347ec9e24432e71c22494bc9558eaedd52e92b69a5bb75df6ef712909861b824d1adb6b3682597bff8855b7ebd391d58bee1eda553e9543ae194a9c5f493e9a71386edc1f6ae92cb5d0eb9ed38ed72966ff7f3a143e957cb4fef9191596ebab6ebb071aa0543c027b3e0eb3acbafeb2cdee9b0bdeda6d3fd7ce4eb3872bb2f879c044e2cf763b90b7649a263c13a2f797b8ae5a55f78c329169c73bae9a79b7862465d8b9be98fdc4e081a907962fe0090984fa7970e399c2ea1ae1d02b9be1d853f13ee893d316fddbf99b94338f3755fa3e0c5fd4a877fb95f09dbae6404ad3359f5c421a9b3606026da997cda7b621e5d63f96cb1e054ceb3e9cfa697ce13732ac7747bd3ed47319f4cf8f3c9a69758eee7a3a6fb87caa5c3ae41dd8585e5a552e92d1ecbbbcb72d83630dec2f2ee306c2e1d47b2dccf87e92cd7585626dc13f3e9307f3a2ff9f4d2b5de4ea7736f2ec7fe74ed744dd7b4e620e0a3c9cd746366b9df4b2e998ed3a7dbf984bf984f371d755dce725bdeddef2577971cea2b96b71cc5f296b3bc057517dc1d479e6ee7ee7eddb34f4e87cea69f6ee38039d5f2d5e92c6f399de5275c3a0b2e1d855fda2b1da74fd7944d39f626bcd21ebf0eebbc64ed249c438b99bb30e3c8edfa687c3e722a070ee50bafbe9eebf13c17ee8979f59c0b9163eafec0382b071898496c29a8de92a01dd57931de8c9828502fdfccb1e5a49c8d49925d88c7a1bd18afebba6c7b14079cf6628c5e0c8d9930a7698fdee7bbc91042085f68b4476fdaa3c7698a3b8c6243177f4188b1d0c5673ce8ee5e6afee964fa23d38f27536889e85ef2cc34edf55b07ccd268afef235ef70687f666e478bbaeebbabc6559f6ad6db46719760d8339036a99bea6599cca3133fdcc14a7e87df2dbabd2c5c3b6b712e962dac391327d43318f2b74f1f148cd42cbb49b3c632c0eb93f1ce416ddf59ef0ca9eeb85372e561364d08250a68fc915077193e7d61e1539a4c58679696fce9817ee36b8711bb7ddd95ed5b4cc6b6fd60b63a794d28ad9799af666cf19219d734e2ed21b504aa916d60a8450d6193bd0d0e078804de28a2efe835332941225c337144dbb8283038c02be6713295c489945d07866861888f6e0b7fdbb5eb5476c1f1ff197ca893c3367b7389583ddde1ec3be6ddbb66d58c7c5c1ae45d51d2e7b598c23666dce07b4072bad98a6bd38a33d78ca03eca28bceb0669a658ccf1627151c19de8c015e9d9b0c21ec361c3803519452da0191e9bc0c4317af139329a59b8d334369a58ba7313138dcd42e3c411ee67006b61318451a6014386ebed03a375ad801d660cd08d25eb4f92165220d0d1c701e80e362c14ea4d15e7cbfa87b8cfc8c0e25339c6119d6d9b27d0c4d92cfeb0af81d6d03048e1d7448b1d1d132d7e163bc193434600d0d47ca5c3452e6d269eff2d1deb545be4ec70065951547a0f6aed265b7d2962f5885ca154dae54bf2211d4f87a14ea9a0ccff66a124a27fdb759e1eac638533252679d8ff6ba8707381a6cbb95880e9ce9d3489bc844cb5cbf2415ba2f1e91afeb31a86bbe2d1e118f740d123e74bac6fefa8faec17e9da76b3e9e2b32a1fd8a4ce44bc33a504adeb63b737667c622ea3d236251321c58e3079c89a6432b472761ddb4391d9ea6864231dd9881e89a07e09036343c3cd03232c3320adc55ca382c6fba3073177779c00707d30419b490ad4e4cb65887e6015d338346dabce0444f23bd8c6ecc33ba06f51709bbd3f5d132f2f37a600add07b3c8f212f6e55955b2fd0f9e205d735dde033eba86bbbccecc90e330c6f5b840ec682f1e3329a18415e8dc648b79b41775d41dbaae56623c58c31e7e46d7c41b9b1b29336d3c293329175db6437b38da5b43f7c129799e8ea1fb20d6af18be01731fe94fec81f690744daaabb55df64579733365071d3bfab5310cf3ccdcefc7c0990b5389743f6c9652e83e7825cf225df39dd535f1f3f10708c70e3a7674cda703ade47a5ab3cfec8ad35e58041458c83a308a5cb1ed98aea952c4d0c5538149fb4f4a29a9c528a59aa4d2da19bf980c5fe90b0d3803db063a5b9c62d2474a298510c2b681105d3f0712e5f8b8839a9bab945e094e5725171ef2a262129748e5a0962491e327ee8939fe67ca84af8fb556482fade44217515cf8c261ae586bcc0700ced0c9ea3c2f679e916be63f29a5d71e949ffcbc7c011153059d983c5f638f8381ced340f9183803ff437aa18b973c33cf292ff1755dd7ebc763edd46ca04d08db084dcaabd6a0ab5e17fea016f9d3f1f2652d16642d66915c570bae4b5eb75b10c406ad08847da45eb5693c85b10f6f1fa1939e205e9b87f0ab39bf98631a34d835f53efde10bc3d9fb7ecfad69d7fe590d7ffdfef59dd832374ee588f4dd2331deb2d84a34a8918278c9aba7aa7c95d72e9fcd8853d85732757da53dfeca307cbdf058ac43f9bb4e14ca12f7f860316a417b0a7e358ffd219038656f9faa5f517a798a61882186ddefc72bb5d0c90b7d13eb402a59e21e990f63161afee02390789e99923a3ed9e7a67226cd33778698a63d18d3decc3296a51a3a78e5c8e580752847ec4d5a2f0bef071f4fca5f912c3418d3bd064aca1fa568e846f13627b7a9d1ac62d7869a13a3b66f8bd6e66fbe9bdbcc1ab4a32f484ee120e56f66086b7ab4d7513ab1cc4217ef93332cfa30120add0793fbdefcd460ba06be8ba020e2747de96cfef892b5d4b6c567f1f39135edf8d37efabe52da57f1d935ec82822e95139f3deac0f628b52f597e2f328b4e9e05d5351f6c42c65d17ddf7f79dd07e444ad648563c2d5e255bfce978799e56a21f38c9312822e91620110fd06fce06c5f3480ba29432a8bda652369edd45e8a179252786b5ed26c718e38ffcd160a7d9d25fd7e7d61ed036abe83a8a85f21f84f4f07105e7e544cdcff6aca6f59060e822a593524a290c6c824ad64810423863c3c0fed9dbc7af2cfe7826131806c918cdfa08867d0884b7a77d443c00b5017117b90e25f06b4e22206891ebbc7d44c679fb0885f45ef437609ed28ac601b764ba3b433289924827bd442a95482552e9cedb92c52dd44dba8674d229f6f964521312e9526cb1fb6167b9bddf97fd93c7783aafb26d89c21639b61c02e5f84d0c426160826e92cb69790bb557a5e8b66b796252cb71ba9bcc6f25f34eec226f3062c000008ccf1b0300316e2f69af1ec675c1dd84cbb17847b6216bf64e6cb5e271b1c79e336f47b7f883011383447a37c230909cd1b1e7701f61d84bcf317d9c3591603e2f8c8f768664976bd125c6dd89d9e54be1d5f67897ad97740d8cbbbcbeda7918305c60b890ee72928bcbc5b0d76b2d77b92da3c9ca96a7bfce2b9ef8a572a47220c7f27997db72fa0b8cfa0bdede6ff97c0bf592265dd3725b0ef3b472235d98a7cb85d9b6b4e02f6616fca1f06abbfc09afb66748e4787b0d5e1ba5e82cee89723aa1834453a6e4af8ba624c95f0be57a98a744b181438d05148e9872440a4ae478b8619c0edc7bf4eb7eb6723ad88f8e23e1eddd30fe4c9f9c0ed94bd7ec55f26bf6da59b7d11da73b6327fd16b9eaac2257dd1eb386c898f6bf959f57fb852aecc22ce332b1d6c4e528e1d5f5787bc15fdd258d2e4f47018bfaa6d2455d03899e1094ebfb8aaea9827b6296cf84e0213b4fcc52e2944d59eda62ccea1bfb29bcaf12d28ad1be4ece39c9c0d8b299d82458e2b6c853d7e3e1a760b2fe56cd8f374beb478d11a18c355899c900591142d2a0cfb59af37c51eefe793631feb43ce064fe7beed49e7ec29ad7484908372343f6e5e7476ad11e6eb30ced6e6ec9e91cecb099a4c8ee8356e34aa735e35ab132bd1b64cc3b22bc9f626d4abf9ce30cbbaebd573c2eb9a738b5b9e47e89a62d349175bd6ebd96f64d82767f7ab9fb773d60963062d0ae25cd1779eb5ce3a23ad15c34cda50023353989b5ebb3981ea9985abd64c512fa86ab3536a69a6493aa51ccd6b9cb59db5ed69977f89b7c6486945a15eae7ad5ae9456d9299acaa1fdfa0d2d7bc51fcb27d3fbb12ece06add9a5174ee5d0dbdfa0b6bb28a5956e14725b7bf2c22276e715f33563c7d8b3e145735d1ab0bd8be6c26e54ecd7fd581f76ed199661d76f60d7a6c13fceafa391dfcc5f972d56c2fdc24a360ec39669dc499b0de31923d6160b1a8ca1b1c618638c9bacf48af1b7bba8f6e474a2eb7fdd856daf98566b9c118b5adb64275c691998f313805a66833552f1f0a53dd939d1c57fdd95cd6a6faa1e661f1bd6fe06877fe18fe593eb959c8dfa795d9eb6f846862db6dd9ebce1a46b1be32f5a69add549176f9fd2eeebc296daa0d760ac508ee6e923ac31afbe9ace78d5d81b9cd15a5342835eb77d666cfb7ce4b073efe9cc1d4be5c4638fa36f1bf6d19cc7304e8a938cfd08c77d2b9eced8b947eedeb8ae63d8afec7d2cc6eebece61f7b30fc1e9f4184f594c22a5bc17865dcb9eb33dc3ab0dd318a3e939dd4ba4e78ccedd84575d096327e1d5883ede596bec52c4d040c40424444b48a23577fbc849a0a773c430723911cb6bf17e2cee7e3e99e3aebc763fd6671f9f0871a4fb89104572cfb89a978d6cb232779871c7911c7dbc5fbda63d27d6ac22bece71f88b16db3e9bb96717484ef6d3734c2f612039d9bbe7903efa09af4c255caa5965eff08a84617bdc4718da73306f74f274a6d81429179ab084094dc008852638c9fd395a65e7e9edd82196619eced7f5fed5d947ff78e614ba9967de7e3deec82eba585d87d7b3cbd379c3abebf5a3fbd9d36ba5af4aefde89f9ea8ba7e564e5ad391bdb8aa767cc40727a7b636ffc9dbe314fe7ecd36aefbb5deceec43cc24072b08f9ed31d1b8d468d7d843f0e77d3634372cdea4e3ce4725c55d0e0e105226ed0a756fcedf4104a35787bec145ed65fd6e29e98e7e9a4f2b2d603a18187325fd9842ecbf0dfa4c9325b2dce2a68d3085d3cdc4a5d7ba996cf57c54e6db2d3d3cfa0699bedf4376dc3d98c4e8f039e7e746dc3862dd3d7ac4c5bdc5519258bfc6d99aa88a2fc64fa0e2686b60934d8541c9121518644535091359206a50d8c18741e3e06491b98c3d606701987a9c377373da40d3e7778cf72d4e179489b93005e7af198c30791362ebfe1f0370617e006f88cb7dc1b702be68607e0a62b00dc9211c0bd8f2ec62d03ccbce5dbbdb81500fc7bec0e00b7665a3ee3f6cac02d6f0027c0af9bc22d7c1ff37a63e0560a06b7064080cb1cc66dc5788b081927528216399e45c6615eb191192a00bcbb2d19d8480154add165c03c75edb660b0111655cb1e061b19a9fe18b805e3dd5fdc96963acb51b79562798c936e8b051b91aad6cbbb18273dbb2d2262602333aa96e9314e6f8b848d3040d5da2e43c34660542ded304f612328558b3ef5d36d15c000d8c80b550b3bcc67b011ab6ac9a73e6fab051b31a95a2def66602351d562798c17001ba9aa16e932ee725b04c04652aa567d4a061b8951b55ebcbb00ce79d80849d5e22ee303c0466e54adeb3017003692a95aa7c778e9b66e38112d1f5500b09101a85af3a9636c4446d57279875bf846a22a7bdf16112d1f550c36d20055abbb0c19cf708be52dd45ba7b74a37fd066cc446d5ca0e8371abbe45df9a6ff5e5617eb19156b54a8ff1df563f855b32704b7b2b7b0b7bebbabd91a84a1d00b7857a0cdc32125530b8d5bd457a6bf4d676ee29dc82f1d68bb75ede6ab9cb71248cfbe27ad7e506b991e5a22e8d94813f5d93d025ddd1ed2165e0b9bbc16b37bbd8f571e3055f2fbd38a40cfcbc3fa40cbcbc31e8c6a1bbe279193213ed1234f8f6a0ec28b98fda7ee85e3c0f87aeb1ed41a22408c12d1cc9fd0b094972ff2777ee2c851619662805957c800c89a4f0411ecafd8a8426b95f2b97a35f3b57897b489ebf74e84f5289298e9f708794ebbf0bd6208ac249ee99b94a99b5c8d15fb773c57001518b26391e48cc52a0ad508b5ceb4d3d4e8d92eb7520c1723d0f1ce47a20dae685aade03f5c21790624a131aa8000b5448a1aa1ca0e203235c81093cb8220aaa4a45ae436cc8b51219c9f5a4aa954ed92d1912459183fc7952ae683493f2892792c0605104656badd5b04ba307342cb6d6467144b6d6ded0c02106dd28432228da30a365a6ec181c385b19320dc36c030fe68cb91213adf4cf8f2249a050d1a22848c70b0d0e29416024c314534cc103101398e8020a4810a28917356ca108456330c314464c317960ed8d951b68e70ca250eefe1124fec4224ec89dfbf148442222a171611c1c3aaac8fd1d5da3e53e0f203cd04bd8ee092a72f71f55ddf886c68c96f13a181a741f1c7ac00e385064d10d45147297211114524ce105a603355882085b5882c4056220c0166cb002083cd0c10b8000450a15ee7c9204cc883ae444b611616691cac941f7c1a299830e462ca59c415226c623b49b528abb081834299d6c7971da7be28920d825d868094ab9b0022556087521e48222aa39063350c107314072040aac24614805dcd00c464b3cc186d190114b542876d006eda3ffbe7e8410421c4a29bdd1a4f4a494f22ff7a39d94c9329419723ffc00875435461d5206ae7a645632827a2c6bbdf50f3be2cf8f6a071c52558c43caf490e8439bee809421d1932b9376137237e0169ac0e208141c4831451190f0c416f27ca20a8b0a9290f224065730220b5ca82611142d80c28824683066d6a0096973bda15cfd731575112aaa267af8f81185e24f6c128bd81eed596953e7a36a5e1d42ae4fecd1cb43a67c10a27d621a15546971ab3674d4e3743c3d6b089df4f4dad53ecf1a723dbb36f1902b9b4fd24b3a014554301ca54899166a2f3efe0491324d7f79291fe6318d945152f1a54c7792169232fd6ed25d91103dc9224322a2a13c9321d19323e46e026b7470667e5e23cdf7bc41f775933cffd93c85d00f491b21f545d286aec14a921fd9447f5e0a499b247348da40d58422254fecf63a66f190faeb5d246d286631f1218a210853fca8ecafb386d4d3db0b0fa1108a1529d28ab481471050c40da4346942dac4a2a01c1415c99fa0f90355928a2c3293cc22934aece902cdc21a512309e5b813b9fb506ffa04a06a3b0f16e95a1cba7ec5266293f6a209472956faa78463911654aa94381f3d38aebbf6114ecdfba84a384892283439fc23281689407680f8607fdd877aee1380aad281f0606d3ceab509d0eef4f23b407c48f98065c70e55a303d131c29d9489ff21e5c3e8a69bb010eda34315cb4775036618d449a44c7ce912d1dd54df4755a10a08fbe85ae47ce0a1f1d87890708f704ade47c5e1f791ecea48498b5feac591328d7762a6f151dd4899f821231fd9970e629e6d0f6d52a39327963c010339bd5f8f4f2461d2a09bbc2769e45ce20928660fba6f8b914f3ce9774f5efe841317c0d90327436b907309229d852a3842935c2b0dea084b72adb5d649e4860c898e60e44afe62e617e08c52e4c9853ce7ec42b6191239b1853402eb2c427d820084365c41c4022378e148090656d8c0c5d00958808328aab0599837465c1744c3132e982068882c52e0037c02190c0d010590196e105d96772c9677a6cd3b7de59df853f30e1ca279e733ef7432efd8ce3bb327662b74319aee1724afb263dd3593e9eec42e7aacd0edc4dc39649c6edfdd2f483e9dde744deeee9946a6910977d72ce18f954f98e77e9d4dd7fa76b827ee74ee9b6efac69e1e7f7a2c75a7cf53099fba78baf1f6615f93913b77dd9c25abe14cd371686fdee469ba4a5aaeb55c16ea38ade1dccce380e3661463cb1d8285a5e538b2e532dd1fd1144d27d371a4e964aa5bcbe92614cb65127f8a3368aeed859b57e8e43f6fd62efdf33c6973d3c5dfe0d087a3b737f126bb2f66d2712437e7159d7cecc6ec75c91967a9513440c3cf198e40c31134044d88ea0ee3c96396522ab1db8855f12175ba46527a29ada49452fa1f5393c7a0c43a59f31173c48cd1548e2ba3b4330cfb64273a0934765db6dea08ff7c9f7477bf33a3ec650f413a46b209118aec8452eecc274acb5d8c791acbd7f68cde5587c5dd931cc460cebf8881b4cee9dd84537969867e6ecdd51c74751d1cc3dbae67aa7d3de6c00e9f3dde52165e67d481b120ed243c787cee6d1e01e989c5de37101c1a34a151f51c74751118fab08081e55aaf8a852343a7675e03eba1cb6edfde89acb27469c611d1fb347d7681ab68adab567d8a63deb01840432bcc278c04edfa36b80e81aed5776b1f833946726b978edce9961db5ec6f017af28d90ed975cd686f9a2109b6659aaeb930ce250d8d96d1d932f619330adde7656f56d1d15bacf3c57c9d6f48be0e24668b757cbeaecb7328c7f0b4bddf908ce12099a73386dd2f061f4798c7bca05eb6a0b2c512669e5da7e36362d1c1cc13ad0461c51ffa0ef562334edbaec11eff69961efb42e09373163f3cb1787b334cc931191299a1492e831611afece957f6b0bd4f8e077b1a840a9db4c2039df1d9b558866518662fad7114349286c6c775d3b457cf5d7a79a9cbeda38b8b0b15818c0c6447bbfc4e76201a0e814fd62eb597afb47fb1bff5cba5a91cfa78fab8a25232766c28d3d326654892bf975c61003181f17a9cce09b91e072ad7d7c7d432fce45a062a197bcb356c9395eb5f1797837ba4dc758d057f31b31c75bf9951bf2e901cdc2d3a8cbab52ccb344d7b79f75dae692eda0beea398e8bc60b9262f8ce7c84725303afec58bfbb9dcfebe7c088cf929297255ea39f2d95f32fc294961d6101897a8f7355d5e28bbc34ec0e782793ab3fcf4c9e940cf72c9e5c0de823f7a16960b33eada9f4cb774e7e7b33364277278956fbae6db8ee8b4437c43a33d99698679309a5a25aa83da096c775d13b3dcae12566e2257615a58d102c84a9b4c86226438d20519e2fa10d781602780c85595f5a31ec88ee4e9f28f7a203d5d8e38ceefc88f49fd8c5d51f30a1dfd9c3dad206959c6d339d886bffa0c7f9de12cdb30909c3a7ae55e475af6ac5f2595525e0af18429fbd7a5c371f3414fd8b627cc2774cb2e221888b200821052619b21fff272fbf5e66439fe94360e22cbf16f4fce686f5e6697ecaeb5bbebfc75e32f1b7166d97c3627e426f5aeeec103081ff533dfb03d29bdaa48dab5fec83256615e5e563a59c6701059a6f157ed98d3d7ae3dc35eb3ab6d9ca773c6e9e02030901dc9d365dad3e18f9523d69eb4c1e1cdf0b24bc3e1d1c81b8d61655dd835a369acedabf6551b87f664ecad6b7777edfae73a21138e641e3ce440d33533ba265227562ca91b67438bb7feba39fd7814ddae4b6172c43c6f26f628387df322afc81ac6f95c47754d8cdd8583e8d3d3edf1a2680f207844e970eca0833be436ce7b8179b93aed4979ccb3795ea1fb6e8a5a6ad76fc4788a030c4f577c837e629fac41efc91048647aeef2c4ccfd46dae09037f5835070c809a5bbfec1a2584329866de0903638701b7763a618a73d99a33e88cac3757aebe3adf441d04f2b90e41622b71547646d6ef1de80f5d253dc13f317314f7ccc3d71fe6fef060828dc489bd1a5cd08e72aa8b40ccc12e72aaab407b3e578c821cf5b2bae105df19323e6e91ae715791ad2fad515f307fa323224410789acc8221765c9a365a44f8eb847d7440a040f8bbf8945bcaaa91ccf3dd9fb3dabd843030216f1c8c13086bf03e9f3c45f98a77900d1a3de27677747468edd3e19c34a46a4771fbdc33fa4fa1116c2e403761ea7b16d32a1ab8f3f7662173222a7838c4cf107fa9a8df4b53e0899571f9857c593a76f64b9fbda20ac11391b31420f0d555cc16e2197737d2776d1b333dfffe89c622b9d37043e99a7ef93e3dd91917b6e328b1cb138533e796225196631990054fd689888d8858a493f3b4e675708930f10a12a26f6cef9e7eeea4904a6b5c3cc7e7b335ece2aa4641aa22aa0e49989aa4092e563ba463e476a52be4a59dfdebcc43c8d63dad342f76d796a797e1ed53541bc869c324a2d14fd4c01a8b38cbe1bb3d63ecbe615e71bf374a684bbc604bef1c7bafa7e36bbd0522149d112ec4286b4b6e11f225771af38920b9231d64aa79ffdc241f4afab5f71107d203c5daecf9ee19e2e5ff8c32a4ff776a1aaef574f1ff157e7b4216dd72464ac52d2cbacd1dbe51b1d7eb92f36228d47b5177346b5d75fd77553daf416229476b617750031f1011f86a00c9321511648e4c9e254544e2cf48def8e3d95d0d5cf2829beb5a1689b658781dd4e4dc35239bf30566eec9a762f0cc32eace22f86faa062d1f940a1ba0f63db060e4dfb4d2828c11eb3c79bb1322d7255966d587d1d620f3b01f191de1d4c667a26f157a531832036ec513c4ed79e42b429a5dd932aa1a3ef09a59bff66aeb4d64ae99c120b4a6bc039e79c3973ce39678d11c21a3dbab0937e5d72362e5c3f228dae570dbb1ff7ecbaf51989749eceb5564a29a518c6ba56a5f37ca5cbeb62d88a3bc93ee73a66f1eac2d7e5b10b9ba28c51fb7c8d75546b4d968293f660feb62c05265a06e6eb7e18cb73503f6d2b1486ed9df0097f335f1b6e4c3a76e333a9c96e27dae85eba3c9dbb2a7f5d1bddc95ddccc236e725996ca9165d9f6acb1bb7586531abe315fef93a52025cf5f39a29c32bb1876fb36c65fdd3086765ae4fa254e9a8857daabb1c992f622135c88e2c811edd5afe0941c478f5c8e8455ca512301672a176651d7491a49f3c4ee9f2b3a7216452e7471c809e5722c8e45ba8b1c51c4ca8bfc761129f3ff42296371076941766af3520c3715cc3a21332ca6ec3f34144568288a9429294bc2a91ca46bbf41ba867db2763ffbd2499c0dfb283f56363509a76e58dc4d6494298d05ac918522da5b800b6827f100f5f532c3fe919a09277101f4482cfefa08f6f4360ee0019a94bf0e8a4d7494283d254a4b8951a67cb1895c9b88926b7b310a38538b302cbaa87b1ea1fbba28685a2ceca1c45d447bde2e6aaf5a27baaf83304adaba48d6886d317f1d14ad58d9a91c52ca365d5e8db3616a24a91ba4db6deb5c1b8beecfde8295be5fb772bd0dfbd35e2551c102d698afb7d72589ec1ae9b6bc262dc9dac61637109ca9f18a12704628a8a8888aae8b221409255a89577eba46bebe81600dfb291f3349ca4cd2b26bd895cf3e2586e5c863cfece5ad9cddb2af3ccdb25bcc5ae9c88c7df2e020649e18c88ee4e9f24a47e6c641c80c84a7cbddd3e589692684bb0929bbbde449f745285572fd1655a44d0705550942129424284848282828895010134d960809dd04f1288222c8daa0ae41d235348912b006bda9f938ede7b4b7839024c1a28b19daf7eb9b0ad7a46f2f6102ce08794558141505c523da8b45229298241e8931c8daa84444624a0b0941115ad2a4adb457af4d2574f64e7aa8bb9db457ff759468a5a88b749116ea28edd53799a2fb3a4868ce5662e246a2ab93aee92386baa68b7494ae6924154707b13287bafa2eaa2f3e2c8e5134d1042c9ae101d18306167931368d72e4014c03ce5426600dfbda4152a6be0ae57a0d497bf530c9ed2025748ddd6057c9df41d2e6b885e484d2b590b4e9a296a9af330bdd6773c5a1bd9a3b487692ae81b9314e7bb56baf3ed549daab4f42f7dd54f999dd3291ed474a649847514022cfdb280069d766ad16e5e80170a662149c8150ea2751f7bd548945eabf9b5cffcd27bacfcbb5da67b6a8aff170dde26ff41e3d1b5dfb77937d46d1ad7866141df6af2997338f613895038f3ea3e8ec1ba7725c23fcc99c5d7e497b2d8471a1b3f676931b16432974334fa1c8e5d8d3534ca9b41f518a2de6e96ed24bb0d0c1dcf2af859a48d1c963a9c35c939c0d2dc21ae548723af415d86d2aa7bff8d7455d0467eae1ed2bdaa3d2582001f5977f5d9449a4f91c78cc748b6170da5e08e77c4e36e747cf919fd9c41fa4f09a2eac64baa993f084704212a4254eca9b28bd4e47a77424e167142866018b272d70f28405420d73118db60b865a1065891ec84951306d94984f5e20240f318da428883f35892579cbf0491249f2173364051d3a576a44f7c1a24b99796bbbeee5e5f78a0ee0c301300b6ea13ac021e7838f11aa03602865e065b14cdbb811a92b994e289616979717305230310020e317df101300011ca763110f58650004f8002e733f9f2cf3c8d990b94680690003bc00f78b7986c60e597ec6fd629e71cd00f706cc06b8263702dc19875c04603600f60c600003e8cc995b801917e6025c9f2caf0e8d4c8001bceff79207701c297351edc17bf743e501e08e46dbb05cce440940968f21809be14c3f00570567fa31d70170a67fc37d009ce9e36b03cef4efd501cef47f6fc099be8c8b03003707cef4635c08c0993ecccd717780337d18970738d37f71230067fa2f570270a6ef7275c0997ecbed01cef459ee04e04c1f75290067faa7bb03cef44db70270a65fba3ec0997e772d0067faa4cb03cef447f70270a6cfdd1fe04c7fbb18b840c0997e763370350067faf66ea0079c6919a14c1fb3a5dc2ff28d518670a60bd018130dbb22b4b1f11fb7c307a978c93550da883feebaae1a58a3d6e4b65103673ac70e39608d686d600dac11610e3009d448f7412a729f1aa9a13245aca9f15ab4d65a7bdd2f7ea8f8497db20e2a4f1ce943637c423bf26405483c5141164f50c0c49313043584ddddf20521be3ebaf8d3416597243a0e6bdf7066f14ac3598661db90b280b2a093d7a893fc0c9fa4e08a0ec019f937e9dffcb60b7f3a5606cbb1d9422d7400ce10e9e43fa8852cf1b6c4dc82128144de72f62db297e1932351f291259926c32729b8929fa4208a0aaec809c8f0890a94c84f54004485a83559cd56e5f1a713933336644748a1b443b5375fa7708222b213a8e0c230aa3d8b9568bf3a68650a5014a145166158420855250313a620c10994290455a1aa522883c6860c76550156e8c48052a25dd1f5fabcd2c1ae683e390289395157ba6e5e513802c88832644b53e70e1e7dd1ebcd686f76d1d90c9f1851244795113f520666995fda93894f4c2045a6193e31c150a66916703167cc95182eacbdb17293aad77410615998866118865dd3300dbbc6c18643b006dafd3a43203d0011e1d322e23a88b0acee47c338a93ada8e3d7b1157696f6598c855d98188649aa61de38ebdc85519667d3b8bc3d947dab103a13a017d1ac871c7fe3d3787375c440e2aed0d5558cfcc2bfafbd98be27bf5d4810647608224266832c4802257a57400b5ec8bb82a7bcbe222725011b90acbb2635996dd6ab7ac0cb3589ac5521480aa56767ba82272d58645edd9b75bec9bbd959ac5ac94d7b69c226b24fa75793e201ea01f3fd3d0412993c248dcb3a7306d7b4bcbb40db3b4b37adbb667a3672f72958659c72c263bb473678d70a6bd49dbb303a138ccd2faa3fef6d1b37fff08672e2de8b66f18aa3228652694328d7b66b6f58a74cab63d8968971569d8c214a4087a520531a8200c9e4841c4128490459320a8e021d660ccd768e8be975335d8d0b022bf83071038bae6b3380fd88146d7ecc8df748d866189a5748c5e01a81add87ff60b747e649c2a91e481fbd02a4fb700c6729eed8531be9a6b897521c09a7b697521b4ef5d07df40a741fdd8712e93f32067b9ee36d972f78633c43f7c5cc903838b89e3974a1454745ebea038a6559ad9bb66d1ba594524ae975d14a352a6bbd6ac3885db6565bafcb115dc5df0f6babb5027b66dbf44a16630beaa7636761399d4e94c5e52c2f72d509b34898c57261399db674271d884627809ec85528cceaa40cfd09b3582ed4492fbd3b549dfe75280cdf74a83a611c692add22725061f893f1eabce4ebf0b26db1fb6d199bd925098e1b5d0de6eb45c544b395a48484876c2a268dc4da39c3d08dce1d4a190d5b29337500d90ccfa98db46eb248da48c3557bc9f419366fa7366ffd84b976edcbc2d9653dc1b0e5e82343d28188f0f9f9214208131da643d5d69802504544eb74d259a573e74a38d52c072a7255f752aab10ea0d6e8455c457a6b84895c353a1091ab4898c562b283f41111290a4015e93eaaa82a220715112d1f550bf5d28b5c35c2ac4b99ba63f4ee2c14ae3b501f9d85f4d281501d668d300b75c2d04765c24572d830fe784e3af7d2bfe773b8881c54a5973094322e2de83a5c440e2ad26d3d9432f650c5612b018ad32f19ceebda752c66e9afeb724477e1ef47be0e3366af7731333d1ca262d0e00834b8eae013a02b7297e113a02c72aabee5032bd601d492dfde92e7de825d60b8881c54adfe2c220755bc666f8cb7e5b341157785702c26dba1ea0250d59a071abd7bbc40588c380524d543e9f13f9c2e9fea81f4f81da4c71dda2566c96b875caa87d249ffa1d49d30d4ec2dbeddecb7ed76b3d66eb7dfb1dd6ed6d208c1a1b1dbb17f349b141d43a56f376121a56fd7bacbf251b198ec309dc32cee269caaddb1cb62623ab691befd87d24d4fedc0bee11ddb4d9825bf412ed503090bf92165e84dffa1847b6cf2ddb97f904a0b7ee20fd422d3bb9ca083aa78214c76908e5d48278474ec1a77594c4ae7a08a853da51a5dd6e8a98a81a47ae88efd07d24b4ff5c01dfb0eee182b9e7bc53bb097304b1efb10958f0a7236523d74e7bea3c31c1632247e74ee3b4814ff44f92f1ed111af71374a9132f4f2462a3726a192042836199232f4d8051ab249b06ff42e46ba0befc02ef2aa6ef42e405d7da492a992140b0ea9462071aa5e5e883c548d20e254c514b8c469c8f500554056088b492604bb101693094055bc3d546157bb42e2a16abb2d1f1d40f631fb76b16b16f05165b8881c54455cd58f97c85545aeeaa8856ccd05ad859d5526ae624f193e19220af9f3d400e98cb272c185941b44e108454578a1044898b0821d3021055cc882ea094f88b8e2852cc327435011844c9f1091c51322aac0a183470f2859de033e6695193383060e5164799c07c01a31cf2a4f8620c23755ba8f8607875a327c32c412f9caf0c9104a44b1f6c6ca4d17ecdce476b543ed3852ab9addae6178b5f5062f7b81e4d8d23b8b81e4d8d266390cda4b0ea1d6d8d9ed855eecb4a9ad55627d2d66b34cfbf58327c7bef69efa20395eefa99a26b5ac2f1936b06bfbf1e3690c8bf1c2ab3ee56a5f9823b6f58abf84c08629f9578af23c8c77c5c3d81e2fa5cd6cb665b7da63c4b4ed5a1753343cadbdbc3dda2f791eec51cab831d36e7fc35d7bb36b6f766137fa18ed65a5cd4b0643fbc7d35a760f33bfea5f7ded3efbe2ed6db4d1b697e1940e78b6473718d8673e7667dbdaa7b140b0da6a7bc5387c5d202c2143804038c3437f69bf765879fba6e16fbbf66b47e66d47468670263b8ed4b00b2396c741c86fedc5771b8ab0eb82f9e269f9fa2064b7c5790495534e2979da67c6b8028dc20e32edd6a15e60768264f96f48a63b5796f88b0f814f96f4380d57f23c484c64ced1e135ee30b867594d65a9d447e752a99bcaa918f75ab315c61da7677c2af5ec3585ab9669cfb4ca69374676b5fb654fbdd6cad3365278c68881bf9a71114586994ec931d72b4059935bbd9ccb49b7059b4ad627bff88b7f2fe788d46085480d404ae4ec2e5790c82feef2c9a56a4dcdecc55197292d7581e4d4c7784eea3506fe62bcd6f75318b6977a0a7f15672f07c0b57a57303030678991c24072623cf51c188f914abde539a40f468cc768c15f8ca7f00763f4612ecc00b81663ccf6e4572e7ff1170f814f561273d25f5c7bc35931af6ff92af514fe86e4d461626e91ab6262bcc855318f81bfd98018ccea2164c80dd9639ef5bfd25b0e73573b3295935d3ecb6eba3ccca9989bdd70996887512fffa2babc5cc8e5b8e0cf27bb3c8bc1ac3fe6da8ddc0f43649c89f61b30ebfe86e3c81b2eeb86b3885c15737c1873250178cc1532e40f00fef9631e83819868242eb6c8316bd727c75c1613d299688f5cce76d26f68b9765bb8c022432e73b9d849d75bf015723191ab8e996c872a96bbda1982baabec309fee4e5c5d972fdd55872f2c3bcc1c774d72322eec0464873c9d57b2d25493d860a54a1ab2d0501acd0c2fcbcc85d0479325f64a2ba5953e625409e91a93d1ceccf1d6fb59d930880b26328db70625b2fc8c9bb9852e7bb5f1bacd2c74dd18a63d49c3a3d279f9dbc4a2cbf08e8c9cbd621bf59fe7c949a59b975d232bcdf0072ac66acdb60ea571d124732154697716a9966d90cb2af7d1490d18e11fee244c7a7dd6836da38fa759dc6552b3ac3ec6fac641d4f7743966dfec9b65a362ecba24d1594dbb5aa41542ef7a66bffd86f5c9598655ce463679fa7ab537e687b2e1cee1cc8550c5998b26349b9f4ae8a494589e527b65bce255a384503a2821b6514a38b5a984ceca46bdf4ec96b26b9066674e9face8d2d0041aa26065930c00e49d1923ef344cde893fa9bc038760e49dbfc83bdd4bdeb12e7967b6e49d66c93bf1079577e0d029efdc9477ba52deb15dde99a4bcd3a3bc137fb8bc0387b6bc732def04a7b1a8b44cf5c4b11e650cd18c00020004000314002020140c89c4a2c1704c2ecbd20f14800ba9b04a62214ac420c7510a19638c21c410030000400460643468007bea28b882eaaad5478cd97e578d97cd07e276c9915128bd82ed31464fc9631bd46bfb8853a04014b9990cdafe384ac64999290e1a2267154765dec7a1cc839c20b6a182e3d0c103123a52d3f222df21b6a3cc3e6cf0540792a62bc686a6c040e7a74a1cb560f3ab3add31b2153e514b061f422ce22828c14c2884c495352392e197ca6232e64124b70318d2e27b134ae9b54e4651d98e8fad08649fa0efe33fee8cf8a51a3aa917bce5f30f791a60a0c0d4ee815a00948ef8c4ab52f67897ddf7fce009bb4d4f978f97cdd779e979b9f99e2f1f2ff7efd3d2e372f7395b3c5e1df97aa42fdd9c43148d62686d4467f2a13d376efc9ab6c8b09883902bda12d0686d6903a12541b8b88e142081e23c538061fc634e6548653a0cd70a593ee2c0b9ff1fd2c1b48dd47a83b48f77edb3bd91973718828e2a2eb5de102e1454567ad3a8f29434d20d86469f477eeebbffedb5feeb31ec0d309f027b1a6ea4277fdb2c3a6aea990bab0c4c36c66edfa077a57ef5ee0ca16e8939ed2b271a2c8271ee1c50702ffbc0b1ac1ed04fa7718b3d3b4916a7595e2ec4d31a6a8ef3b224bc121f81a78113d5da5c58b9198ca2e207b5614699c750bb0b66dbfb2d35a403cfae95ac056d2df4e4408bf60beeca9e3f3a1564df8e3d68f46a1eb8e713737f666453db00240586713d8ba93c7d9dc7697d2a84a4c83356a7a17038fae7b9699078b66f66e419fd718b15fd20acd8de1ec232b98a46083d9f39d282de2b3ccff34dce24a2e49fb58e152e40435666013be4545cdfe9a56378f8c65d330b103000e33d44a8ebbcfad15980bfbe582bb1caadc80da976191c0fec31a8906f4c664e6400cb537909cc27dfb58dc324839447c255b0af4348a77ee826816390561f23ee8a9b04479d3e8a93f0603320036792f2352a37794a50259d08217f98904ff095b56a179a01a1e52801ac820db66916b4e44e5cb94970adb54c970fd27b6637095a0ab44f9de70daa03927a01881e67c8f3e4433b9881e0b85c007d69409a1a857243a1985b81fac8a4eda1b13d0d7469f80377467fd0be746ba09800f3fd40ff82a7dd6209430da847ec6d0afb3174cc5077ed2e7001bd442680ff189f62724881f8ebeb7cfd149673ffe04150c2310bc6f6a3accdc6ea0782de64c7fe2dc5647c78ca456b1795fc1133035ae728582fe49d1a311311035e8aace20a0ee93a9c56495dc5eb5e29ca758e4231df09924cf8bcd9803c64031410f9583e17cd1f02400aaed60a29f559c0c1601df6e670381f24758a573fb1950528a0d0ea5362dfd55fb9a327ade810447f09bc0c7a27a64e57f203e62a6fe7e1d18ceb198ece32f92ececbedd18f401d808e28c8c8c093b3f6f9318060f44a70eca3e3fa9149ebee479d3f2bb5c267b1b8a8b1c49c990e4224815148c133caa59d300d48113779941b99a0585533d31706f51a388d84c7c52b9d4dab216bdfe71edf884921ec0f952a82b0421ee485840ddbf6ea020bd98ed580435a671f11f9fc487b717ea2144671c8f5abbc6a2c411d26356aad573abb6917512bb41d5b3a440d763087807559926d4dd9c722a1eece1f8645090d04036765fb0e45f3b44358ecb24b11c77bd3e7f6191b99e28e0b1964661213d167156174335620dd7dbfa40a8d02a841a3777caa6f331b3ccdf5aaa2b358074bf8606b4423f09b04152512e284738443855a33a332af68253566b5ecf741db44456a463924b0a0d7c4c00414b48746092dd63830534a9a606e32bcd59354098a6e844c9162f19fa1b7b92f06c672cc449d0a116bb24fd0c12a6d07079b21c38923e02c6348c2bc10992a46f380feeff18ad7351a083194cd05571100c39ce7eb05867ce70eccba5c177038e31ee100c89ba1ab8e977dcf4f43ef55f8e2ed280ff69f98b893091539b2cd24ad1e56348c28ea5680dc8acdfb5217dff653b692c6e24fe0d79cab8c74f604d299704c79ad0acdf33a9e842df8b4988856964caaea702bf66f4318e380d0d656c43a69b86d79d69c8291e26a8d1fdb1c4057474e71c52dcf476bad094d255bc12c2b1234657672ff5ca2a2866108375dbbd610b5dc50a0b163a88b7d3e285c16c29c1479b25f4728bd22fb1e9edd001f014846174022275fe4797060aabb280b000fd8dd620790e1803c091100e8cb3852c58d1d0698618809a4ee4eecbfab3348980095490b0e522d7d26c548aa427b92e43dce3e93d5056e66f9e9f83be32bdfc6340262a6d2a92c5e74ee99f167e1bc9748b1d8ddf0eee463bd2ccaa7127546b610dc305040885563f7c0748c0449507b61b239d85b8a70c184b77181ff00d0048de1d7b2ae8c0a9e18e271e305124bed12ddea0743698b68939803af6a30e82ac1efb8d4b046df6796323ad41d8e9b13551772913eb8e32f6f91cb6d0557b78bc554970ff6c1551df9cdc48d1a40436c9b2bba4ed06cd7faeadd94f679c687fcea052967960376e771736a7f079df31c19f2a0a7edab02efb83976670fe4b3476d3a9a832568b05e802f11ac951d86893298d73609942783a7f813d1c12d816e89863ab6c5833a84d3d92b11444b5bcd6d9c304f93d0a225cc1c6bc2f8481cbe81435c650853744d685c1a7b2c04876dc510065b0bb8be4ec00f05af0384ccc72383fb39c298ed1e329867572bae45aa4ab10885b85c3704c0a0a61a3219bbca38a0b17fcf4e77168e6084ab1d338dfac2c6efa66ebab8d53712d35fd33907f0a6a7582f8b40df3801f7a5cdf01b8fc5aa1a7fe1ffffff2ec51fbd77d1478b6bc30919c18309cfb22be12ac8d0543f4a0474dc0646a4bb4ae0a245f7868cd06f0633c2ee0cda9bb914d30cf0d4320494b6346811e1a53461b4874de9e5faf6df1f4b40957b27ea90247a97c18fb91e9de11ced3d0eaa32a482d290cc2707514fdd5a14339fa9b4a877acdff4c4b162605ded0b414c3f7061ebbbfe95f83dfb022ef63a5c6572fad64b825863993dc6417485e6d32f43cc16e1cc0ce05aaf91316129c6c0084e3237217d4f612129a1eda24452d83cafad778867e0e9a8f0ae8c1a8f9778b5dd24627a81c608b80d957f608787642f173b58eb992fdbda04643e9e7a97a7a1ee25a4f1fabf5993ec645fc49ce2c95f645031fc4fb4d2cb3cc6ae4f3cbc01c69a6cbb04e5404f4aca7de67e3e2349abd58267f9326d347816775f249bc7792533f9a9fc25929adeb4bc9a87e0fa26910d1f21aead9bd269e0df3d8ac72517c00f70b6089b9ea94bffb7e648530d28b2511d08a0ba83256292e5814d096de0c0e2673d1acfedcaf0d5b135d59643785f1e04485a570ccca82a3a32349698418f75582908af7b74a6f7cd9a0d906ec9b02d63ddd2dd6cf57c4b664be5f6e9be3351478290cb0742126ad94464e1f4b7ae036c0b0567a2a93d31fd285446b8bca19332f44239f2dbd64c4f8caa68b507e0d799438c5264fdff6bc531ddcd7bd803f21c43c2a660b68bcccbbd918e749e82e67a89974644bbaab6c58b9d115cf79ffd872859bd7c3a57193efd5ba2be0011ca9dff229a32f46bbec78f610e7d46a0b6923507cee38464fd94b88faa84bc094f731025cc48e722772183525a14c947618e0eb877768d513ebcc008b6a3e500a13c5600c2ff0e98baa1c57936e4158a55e0e41384162e2162417e51fddd03596c2bacae1d2745057575931824d163606542231b4e534945bdd071f5d96f06222d1d566cf3924b3e5dd525ae4f7b2938185fd7323a89c468e9841f69aab16b62f860dd6db87c8b74ecdd159edc6244dd3db92398f88190db8e88da4bf7104a93e0dd4f4743338ce229c5847a10f7a2016c9c30a7dc1912a554fac87410fa208db83b2d01e4e116eee8d6f51686136ac50e8d75a5db5d09c4e6308d6d6b5b6455f5160bdd89b08a01460976f5e434142c617852b7be808ac745f830862cf2ec966ccded129ac6a7236446b54fe47e14c836422cefb3b5df4af1838dfc0c7f8ab255a70f4f3e8d2af776e486098f1e9728e914f631a0aaa000700fe4b71adb9a30410637a94899a8167cba8c22639c22751614e6c7f30cfadf88ee9f95837251bd04213f06e4d0e6356e28d54c8622b6652e7c4deb83a08c181fb0319cc59004ffd2ccb714c0c049d82534f3fd8f745b48bd905e025f08876254c15d4904bc7865313f7f7a773b236ece04f9a46a81350b0e6ca3528366448f41539580a27bc858c77a07a51b5160db2b1649e77f084b30eedd51394302b852a4c63620f1312a55e77fee657e780bfe41e04075396e74addc98058e8801f95676e676fe41c58650c75e762459790040e4c1d2ef5ebeefd300d387371cde60d1ffa3898c7b5307c9288f85b177ec8d0a623d7ea133d091b6db5fe285b6b6d965ebd95650122623648b1f7d279e1618bfef9eb3633d7ffbce32b6e69d808664579089077d78ccb05077179bd61c2f9b9d0f2a0c9bb1152e46702f1e9c1812529bbe313a4e11e3f652c5908fb6abaf11c35dc40a61b3045d98b0f46347b975619aad1709bdc6d8bc97ea2ca07b4b4f554dd0b0433caa26acf62ecd5e92d98df3fd2c1604aae960826e4c7b1a192cc59e0a3f0339961ba72adc82ab054cf22f39ca3805b0a0c412b7f4774462094a403096c55350358752990538125d2d8dca72899a96b998b95a9a3c39ee296e529df2508323c2527c744b462cbbc81b278e3b49a50cff45aaecb6e4d870914a73d03360fd3e4ca099587b68849c251ceedcdce2f0c49d55a58fbaec5e97ed987951d55b51b5ca5d3daca6700e380c4e87dc5569955cf8f073f2c73416b538aa080f684aff477a0635392afc3cf7c36a54001097483a638da51ade84a3cae59ccb39573698528e79bf4a2ae5e241fbd0a0f88457ed8a5e8a75bb0dad28e38a3ce8129dd938b0a19ebd704ce46a20142c6f796c370cd36b1e0d73df665c16d03e380fbdcd69ffcdcbd5c4be19e59812d04f69c9955269facfa8b0724d4584417b20eefb099fb86d00c7c07d548240b28e5fd6b1be4c615b490ccb410d36e3c4e9edbc4a0ed8508a3311e2e94c113e4be694e018aac34761aa115739105fcadfe55605ec739114549aa57d824cf11009bfb25e2685b085c9204b6e46c58aef98129bc7fd0bc1210b78ea803938079acb45c38b0bcb39db47ce1877f55ef320d5516f7641a28ecaba1b3786d95522151bb9e72a4ae9f5adbbc7cf3a76ab50cbb0f8d87dea02af58fd576e0192494878443d8f7e50022de8a0156e5c7adb05f7a79fa5401eb14312f5818ebcfd595cfb4694194204954ba7fe405bfe010e88003045ba8426367060e6499e0c18de29a02b32a3b88a6aa623c38ad50c73e0d6fcec2e1f9c02c2b91f11c0a9b6b0104e014277f10d8fcdd513ea1b5950391f2420cba207cbe8e62ac1f50256119e94c566fb43d3774fc2488609179ddf32b139a0346a246bb8f622f4c3f7f9531a5e9e90e4acfed4e82b83fa5e58be813524affe8b0e5ce857c6f220da22d412f0d7bfdd51ec2d73e8b06ba6e4b97e4d1f726051aee18af9cad91cd6fb2e5720eace7d812c53b3bfe805aaf63eb9ef5e5e4b51a095da81cd2b4f79c29d5abbec6609f274d856e367e5e3b3d505a6a10e3bb5511ead001b277e08cb8f5c36cec3867844143112447654768ce9218e0468bd20b52717e1b8b659ab73509b8d2eb77463fba8e95d8b60a02fb9724cff5a03a9f3b09a63c54b4430b2c9d93bd9452900e48e08d8aa4945c3ecea5d3f1dc83fb95d7df03b153a45ba2493cf238854efc69aadc9d474e9417d9b3fc6caf01752d4d347934040e417d76658350a63dffce410f229db4d125b64e5d3cae0300ecdd1b39c2ce479df7b738068a71e542e3fae4dc5c47727cbe3f394b55f7456790f2e5fc0ced15fda25de0c2ac6c3206bd59b003a33e7fcbb2e2c21cf045e45197327d9a3b5204b5048088b4193a1f5b1f1adc1f8adabfa6b7ee9e7c18b85c29e2993a2ef0356093f34f4c04c60b4a746b5d30b39ac5798829cebc7305685379b462a13f48c5205b8622c1b708c68cce4709dfa5e422eed962974cdb9e2f329e778c3560fdda14c1f892bba2f1cb2b6f5141d6b19cc274d69f10ad2dbb74512196b4206db41dd055502080065058419bdcb951364e09c47ffa5d0c55e7f33deb855df885fa44a573dcd6bf088d90058bc56e1b50dd98c9c471932ef77bec588d5004c0e758575a15239ace16ff5d57aeffa261db76a1113bf7a245bacecc439ae561114ee37ced91c9abb6ec34fba8f0e06d277b616ea227dfa248e6df17d49a0fb189e2a5e21fad5389da5034adbdae1a1fbe17405fc1f652313d30285b54cbdf6406b085d4e49ab25972e6b923037ba095fc0c8ce7e1a584c34a22258eb5188a146d1e15539e12c9e2f3f141dd8e7c0ae338645739b4efb4aadf6f180807f92d1acfc3a1f38d5b3f647067608f95564f1c8487eed3852be85501f6eae341916691d398284b7d0ffc913199a15676acd39d6a10d5bf3a99b826f7b8a22339cb137615bbfa2a2703f3962e21a71334d9a4ca625f2bf00f32a7762266e4b25b108a719b280691010b5eda7946cb139f8f8e231b86be8394655022d9373c94a148965ddd257b282cbcc37132f261ce2061744b607b76e7e0056690a1326e44ea727d2a1cbca066329c4db1342b8fbf76f0778ef2aebbc1372c1bb116717cc68dca0dcbc6baa22fed6e010cbe1747e96e85c59e95154ec8d8c72ec1a7821178dfc04a8d4513e6b2a47f1a01b6363b03a8d6c7e36dd226dcb93a2e32f391914b2c3de7b76d14a9c22870c5729e4d161c0ec7253f1db63528d5be9778e87756854944da3d21b987701b85bc8e8cb7900e5c889ffc7a1bec3f3a69bf12365923a15c9bfcd48a8fed864f5158dc01f62a71eb12b3c7e86bc88369b624f8fc9924ffd0c8a19ac9e8400933337e2e03648d0ca8605f5e5b08d7f3b58b5bcb718f17eb89972aa40ea5866a31e149e35869410f0e6251946a40a9ee6a51a4dadd570ce7b130930f158b00a6a829ddda25126f344476f68610d2e34eede285159b100283984923fc3f3ffb4544e69f086745ea3c715a32e5ed87e1b95dad729a03f33e65e49269946b27025072218a472d1d478ba4592a5f6be7cbac9c3b53f25820d388001bebd83698391bc4e3c759421717c0320d5cae4c024717df754bb27ca6a85728177224d73f1943e49b56b4c3314100a6d963e91889d795a81af6f690b6a578bd7576e8c85cf30468ec6c886fde779cb58f57b8f773922bd772a9d3af137af03cddd6ecc945cfda7a31d3ce8e992fa67bdee9749a44a361d81a743d2622fd0ca0d006031a838f12f6e449c5326ae3f866a7db2611ac719416cf264b4ef45983cb9685bbe13487981ace22728ab708f915e8c9914de2505bd6b710d1ce4e46d29b1ff680817d7e7b282baa194111f348c4897e4029e80c7f65dceb01caa69dc7e186baedc27597489b17e33035e4ffef342720e29f9405176218818376c44d37d41c2c753b37a4dd4cfec1f8d90aabbcb91608d44e6f7662947939ada173efc448a17d164bd4c50102058ac454be5223f529fb29a28eb5a2254055e18458d1a22fbd39954a61969aaea1491659c5050ea440e7fa613e2f770d34f1b17cf766473f783780bc716e069e1fc81d150275a0405930a4f093c2ec8f78f9c43d611d7b6f16ba481aeccf904fdb54bfbe2d49eb9fcb671acab6d3b216096549f831a50aa1725d0716cf570aab006b22816a49933b44436e11d50199f3aef504ed4342d9e533b14617eabc6db3ade0892acd43f53e4d1bac05d10dafa334fdb201cd0ad084419860697cfb28effda1882d1893c13e76769399a0cfdb3738524ce023159a7db6739116c67f1a540cb1f1febccb1b881d0dea090353fbd27455a33acc647edbe78e0cf9319b69626a51f213eef1f4a9d92de2c74a7dcb346445887a751959120cae3c3166c1a9bb8fd6b481721830c2e958ef234d16cdb6811ab81ca8d27089d6117e51927db0980bc2e57f1a11cf5f8c74ccec1b5ad7af36ea42f247b6d2ba372b56489750f503531a6b7493252a6a24040372a23f4228d69252256684fec7e829d7d977c7f4e90bbc5f88afdd1016b7c43a7a4f4d3bd832623f4ea7fc2d7af1e2b174958fcf2a84a8876f2bf0cff830202ff362ffd4a9e9bedb8de6e1af7569a6c5bf3b81468223ed9e951525732248c4aa8f25dc2087f7686a33ebc7aaf79a17eb65aad889013c0329d149e1e88627946ac4165a994266f9c9de3cc0bde1926838b0bfb130372402a51d8538eb6235079b06e959cf844cd7a70537cb1b9c27ac93f796f56c87444d7f95d90fa7040f1b3d5be6e87c9c52ce29517d9b188c5cdc3429322becc6952a47e3392b8b8907596159630d23a4f9227388859888735775823fd89ecf45f309f6f2d2697467af8e11f0b14c69e88853f2d6534cff7968a5be92a35e64310460540e543e2484e61cbd56f764bc9140f8e934b48248d32464943171af81ca75b2c7d36dd210616c980891ec24b48a264461e036b4b03642270dc96f6c83a06f73e9a21ece51e52752b88ba5420d618fe9c047519357fd76e6fa274a5b2743110f34e36c35cb70db155d41595e3341e1a4662685ed9e1603f351b6c47d0418fa53b0d1c9108d490ec15ec66bd3a5d681678e2098d5ed3d8f04acc820be79cc79109263cfcfb77f5ff781c97963d11cc35008a7905a7f94eb90cc1aac55c80a94bac244726168e89f74c27918f6fbcc439f262c163f77681e956e326e2a945624dca083f86405b566172d3bdd92676c426987599abdd63906c84b887f61cb6b839712b12072b9711e25c24eb0713cb343defec0cf3166bf03136c6ce259e71f09f374745d125202e05cb6a54da5c3bc05e1434004809595a39017006f2d83f363bbd7947eadd5e2e43e3738c987fc8f9766d5f16b5760b601c569a5e72fa0b35752ee4bd7daa1f412273ce059a74477494ecad495d7c2a56a5c2f0c3325a10c14f3ad3ee950913b7e23a3fdf82554db67a87a4e64b85b61e9847cdf0263c421d0681bcc5f9ba0e0b917af474c0a4a74fc091584a9cbbdc51a95c123f0ca6eda8def82311d1a688b46b9d7b7ac32d1ed1cc4e7dbb9ad03b0ac52c9ca324a960c9eb507bc6801e5c5c94c89459b7c628258d260e633157b916a80e606f9a761e14d108b7857477745558e783a75a2455577e6d859f13028d8b80a831968fb0c48d0c41811caf656c9ce2d3e0ecb4a461905c11dc1c75e9408ddbc162902b8b60d21411816fa0bb5c265246d6b702a4a9c663beffff07f9b2d59d2591d47f7d2c14dc550f158b31f197d545712734dcba5649672bd3d5b8912c1663858ce9601930362d959c57089b3cdc0577c0de5f6bdfc2cf69645832ff80426923dbd91334207dca1cf3021454cefd01592cf3ee30eb81e11dfd4ec6dcfabb8e2b2fed5a9aaa2c8b33fa7d5bf8ad1d75c264fb06198084340f87528e3a6041ac488f5f9ecad71fe1679539b93f599b4de658880c15e93caba0f624114240ae4679e44a26ed2db28e4768c503a2b33474071c28953b228d1f2ac120c710fc3acbbf821b173c53b4f606649bc405a1e97386f0fd311674567c30048de3c288a6a68fc2a753130878c95ca4e9e7a2f4c1c0d96fc676bd45465e2cb93521d58548559f2110f2af2471915bb859809df3d22319b468afd2a0243c9599e332ed4f7823486ab0b6dc5501f58fbc1d83068292f58eb4262271df99d898d660ef7b96ba0a924108813b7b38d3e60af55bb19e67594a290b63a1a05c7308aa2c5346ef849da58ad4818fffd58af92f4651912b81a290804328f963befd431269b01cc6d082a8bc1b923327038193aab021ce03e294876a4f3eb275c828edc4c5f8e22a9342b61e60d983b8da34cd713ee96ab1f36d78028843f863e1b6021673d8fee2ab1a1448a3c164a89300cd23e09d92e4603d627979b9fc47b7ac76f7abb7420329094d0354f364ac9afa3dccd9e31c79253cb2cd50ef7b520b1608da9843b66e47fb8eb378e4d25d60599485380c6cffab40bf70ce48a03c5040c97b19e04ba5dee29b10b13ee1d8af9202900f52f03eae91761e61e89de1bae8b3f8a789ebfb31a118fba6bc1fd2de2192b042d04b289ecb4b3e5eb366c5dbc29410127b9d28ef66df94fb255b6e2941366cc9c6822f05c176e56a911b705647e458af7d3a7df61d183d8fad4562168044518548eabd081fe0d86c514ee2a125b413f6e9c9938bb3c0db210d1ac2f20026f67da36b7998215e2f0602ded0b8b58dd388c10b4a39e98c1b17dcf05c1f2ed4d83564d07071730c6078453e9bec4433207563ca726b66e5f58b7823f461dc2f549618a4ca49b442346bff668d99cbda53e5e6113d81b251004285f371f48170510ee3570fdc85bd20097d597dfd0ed4cfa3986e9dd5e1d6485fe1780743ec96b81386ff5dd6ffc30de4d3703524f355f8f00499029f57c05fa4ab703e6ea92b3ae9cf9c45238fd29c00400d674abf4af3c5d830a529ce46db994ec73ac3f0ee94674fcee85d50bc64b158ca7a2d5d3ee74c06846046a00750f4ceed365ac34eefcd18ac223bc0b3796ffdb508cd7fc0e3afa352843e41a32b515503de1d9031d31689b25d1ea433b45fea743007febe059f2353c0d29bc67043d9b146ff28ae927707025cc294a69f26596c6e2b4262ae540cd3c551ed54905512290da2c2b47f0a0ce5b9bc6b3548ca7f1e4923b068c2daed763c0ddb4203899e1f6ba12dc5eac769da7411dc702f3d4a4dc965d7e2f2cbf03e78af03ba41b9a88be5ac9c360261457055691cb045cf98e3909c4f1ca9d00508784ca6e611e1298cb8c7b2471372ad898b34acddd60eaf04654a7886b606ff67c1756619a373613b37e4a68bd3bbf1821f3afb1ee9161876c0cfd94e45c332d066d3d11f811e204d17b13e324a802bf2a9fb5b0c3d7a4e4bb378fa72c972ea98b7e7b18fc24658dcde242dd86ace641ac53c801afd6ba18b0c44cae5e618a3b96dcb43a0d8a46f7855063e563d5ca5e153c883d6d2d8a81ebef742200807b728ec8ae44859996a913aa70a1b86b4ee19efd0ac13c922b3d3ef9846da2c92a3adedfeb2fe1e2c44e42f209d44baffad7820c5aa37eb0822bef96f87744bc46fa0f9f09286bdd90085d3122994c4dec850ad60ca1558e2e2417c8a1cb096e306fcb6715d8f625cf45c11c26f7277ba11ea42a77f0b0cc45244957c19a27a8fe020d73990a746a1efe3931e948e53fac7a5675e297794c425c0badc0de3dfd11fbcde851735bdb7dc20fec2df9ce977f187557b9833d7ab4e41c3244232592f68c45a46c2c9e8cc0b26006a75ca23ffdbce86f8f200a3cbf665a90ea782c7ddcda9a321c048dbb6e49ba5d0c41b4d15e301875d5b91d4c35737d65f5f51a464af491ec7e07ce4230f62009fb2e2da9eaca928178b1ad05205c6c162b0835402d2e42c3795fc9dfbe2b6b3cb639572e8d014aa0a53b652993f67160050f8e2c77bd3176cc92b43e1882232551ccd007c7adcc6bbbc8e399082e538bf4a61ab45275d45636986f2742ef0e03b2c61370532f3afa8823100fa924645c16071d604e6237677096512cd6b861ff7bc9c50bcc2f51fbb2266e69538ba0f8b91da4a7fb0ca5d4fdceee012936f26b4ea0875b17f873fe506f00b1054a668b3d0d4ad184b2e0760e3644664fd68ef93c8c174c7ad03aaa2fb569bf2995b52dc615cf516ae2d74120db04a512085455253999c66a9519e8c23f00fd5f1162b4ff03212b64446ea1b1d8bba878225995ee741adc0f1ef941b8073503a0941c9ef3e3385892879b1bf89db5980724df67e83e7bc1a8daeb0f1ed4ce895c3b2f0fed768553924d2856a2b73f37519da5190040c554f54379d67b0766411335581c5782ff42c4302d5f59254f5059a740f9682ef9df971f4c6258f962a491f763d872700d0820b5ac3d20e7d4867cb307bc523f9bcc091da8f6812248ad64aab34898ab1f5506658efb69cd981cdb76fa92e503798462a9b8746c4f2f246ef4ed93f9015bb6ea55cb185a335a2165939a0a78b111dddb2a819a9a942e22bd6e5cc48c156dedada9f15b91b82a02219873741cb2a9afb69149dc3b34e0e2d10d6345e98c746293fb86248f7be17e87df528dec791419f2b526c0b39cd4e8d90ce950b7f02a761fa8a1944973a6c9acd65b2906bd0ee01b7cda51a9af1647ab0669a43e44621c112a0b9822d4b1087958dca810671633c4d46a5116273fc11ad1378cc695f17dd709eaa97155289308a7e5cef6f90ed624ebc8012bc89e02ed3506dde3566345cb0335b0db03f4c01f69935ae18d62c99a82d001ae81f8f6cd1ed824214a683ad12873740f45e5d46bd0ac736108f1e38cd4be4fcc0767a069a6182ce0b41b1accde07f5d8fc796c1ad76b0188ff7000576a4568ff51353a3cd408af151b3c5509cdf6abd903afe18a43e22ebbaabec8f901764a9035524daf5d219d18d762676aad9c4c77e62e06f764bf5588538c798a16dad5535e86f008089abb8dd0ba502b3a69f8c9ab25120a851c59f8a24387a89541c14a9adf9c7399e16ee6ea417125a7c7d503501cb6aa053749e0f7d3015081e53a1c30c13880ab96624aa038d79144518782820e4b8894720b3eeb81b540c590033b17287a0c7039f0cc772e7f7f858506e9146d6e6833f5b7fdb1d439501bb62fdff04b797b5cad3439013c97af80c21d05fc3d1d3080b3f642d68aea05fd09b2c669b892b7300725489e1b734b289454762b10025ebca8ba2a4c59a30bf76b54cf1d526c02d733381bb2b82bc69f6f719b0dd5c233dbcce11580a80badc20929ce607760d50d82ceb119f30bbc1cdee4557eb1b8bfda4de19660e91e58d34d8bf8799912800a505182c064c2daa932f461fdca1fce1a36ba47dbbde057083c23f26b1154ad07e8cc1d1615f525c02799aec50624564d15d2d8808b28247c0fa15fd31bd6c3b51368dee8cf12b983e4baa3f6d04e98dbe2b51f14e61d7f0b3db98698c886516fe48fefe8afb0e6c5d9b398ff1f28a69d3e20123b8e96ec58eb563bb28cbf2da69abd4c821999a0fc75e46085a0ceb59289e45373ad464670a204b62ec8d9591c9f3559b2ff690ca1f96c98fe16019b6f351813eec79a4fda4bdc050f69ee4e1ccfaeb756fa79c7df548ec703d8b99e68ad21a22d7a76840b5bd5cbd27ec238a142c8aa74ef1387d66990f753cd4a64fffd843a149dfe4ca82d69d10339925a307c699c65421880a784fdcf661730f99f5dd661bb87cb5ff42e802c93f7c61f00dc835bbca86359ccfdc13d9fc3437e3ac1662d5b8e19b58bcab2c44fd59daa805ad69cfa3b7012a031cd9ff547f5605c536092595168b04143c88c99eb4b7f15a3e26d41c297e17d4fe7900eb6718ddf1683d55a78398ff355bc0ae53400932ae980729af3f94cc089177e780d711e5fb13e24984cbe54ebcc5b6a68ac836d0cd087736904502a3f7a1def8e2056f8232e199dd7680810f9c179168ac1dee6018d1078bcbeea6fe7d61c5ca8bb8931f76aaa22ec1cc43b5e90fbde082f36739cbd23a0ab650a9213a4490ac6efd831559fcb19e9444609531fec6f303ce0e221da03611d401760d5d8244e326432b11891b9b67fd9ad69d08286e1ba2e5db8bf9d935095bd20922e20d9143221ccb28c482407e0cd5b00e408f25c23289767c9c663019ad97f7cfc93a516cb1d0902b43530e425027b55bede05a8ac9cdd516108d4a07dab27b3b1839006c7407aa30005e02690570b99c5af1c19ea1fb0379f3658df2dfcb90dc4406f36a1efa3ea0c67d2924360f1b9335530f7218c10b81d2b4d64881bee711d5c7c8a2a09a5777a5d7fe5786aec2962e18e7eb7d9dfd0fdac81f0678ec9f2f43102adb88f78909340f03b5417a6ea4678813c02bac0fe5fcad008a6306491780764e1c9bc8aa2e9b67941c2390e58d83658464b7cc88c32f795c545da676a1eedd74b6f8cc41314705baf1de1f02800a80fe9b1cf4276469f8055622961f0362f932cdb849dddab0f5c631c958e12ea2c29afe85c716506a04026c2f85abd473acc16f766886c18f11b5c623be7d06e1c0905607a8a58f5d65ac720aa9255fe8e2e0ea0ce4c343e71ac47f10a2565b8a005690706ffe7615a6d02fc8314b65a067e367ebf60bd030817d07c97ec53ac1291c874bc37149c25490da0ec06360c36e335d6f50e25796fe8cc03d9da6ada9844ff8f11a6d34ecf454cbbd8fc7284d8710a19649e3d72ff83b18a968e6675c1215a3d34d1d2da2e1ab852f61fb63f04fc155ab715a18993dac49e985f8edb4aaa51e6b750550e28146e4ad0765363287b5f6a26b0ae189c1728a00a71825b273fa0df5565c98cc07a93f41fe8db998aad1970322f0fe9607893b533a99cae3aac7445f88e0e6c14959f2b318c68599964ab1cdd55df216467a94247413a886f162c98e695d187f3083e3fed7a72b633dfd6122f7eb87022df8ef043a793d5869cae6839c70c6e9a58e77d2b2db760c727b0871e42f6cbe3c18f695a7dc79a5500ce93244454791e5688820b104f4a61f2a925977b4e74f9304d4ee6b5f514c5fcb4c7df08d175febc234ac97dd55ac80a9e50c0abe29363dd0db6002591d3b200fe32409750c72cc2424609266c544e892629b24ca2bf1d0c684bad90f515a1e50bdcca419606cbab2022f6068be06931a9a2235caadc9f09bdb7a02fb7482ace97111c32dd80b802c0b3a670673351479a4b5d050a8dab69fe74d5101ed49877b598762b243bce171ced846136ff23f0753e8130d3f68fdf1e1bb297a08a47cd03264e93cdf9bd2089bd0cecd1ce6d95903b3b2b9a85357088e122c2a51addffa5fa00799afd3862a2073797bbd6bdad7a5d552dc36cfffba703257e9d13f4124f447073e27bf760b37c40d3628786f7b49dee2d7293de3041e43b640ca1dd4a8e9a12e6f28c1419d7d19b6079be05bd46794ea0a77f4112edc40987563d427d419f3c2d7e257c61766deac4fdd22f7e2add2d96ff94629ede9ff5133e2efeb9ccebe124db55736cdf4adf4cc9f4917d5ff82642ba7bd311590ac3edc7bab6fd9a79600abdfe8a4b04ffcf93d5d813e9353bfd5bdd65a64c88556bfe6f485b6703aafba5b389a85ca158607faaf31b845757112e40752d49944049a0a68695868a98f41f7e3b33f90dd7835795d66497f41e51e0d83d3ca1950a5b317df4140827959f21a4f497513d0d350efb48edd43a9af5f82afc5d21a64f3046bbd0a4d2fb47eadb8f435d8905c00a4a4e54199831d1f9550540e768fd3ac027c96ef7d13d5dc5eeaac1a00febf8ac30af8b8c39f43e7c35060c66ee128a8eb33bdfd05bc6648b50a8eaf00f62bbeec6b076bf8150f35dcad0a5ed630dd77807cc54b91501716a515bf49e1a890f72bf412927ab21144bfc1e5c28d238e941fc4d1f4010a114a80bd26413a9543ffebee493238a7231de71bef1f58e281cd5aea1f6ce562ace003dcb01a50c3e528a392c1f4db6574492b16a8d730f5e5c56cd35de4356a4e0cae446616772adfe15b3d4f14e45171a515b7f9e2769a94718d20143382edd0482c1882535db7324a5ce7bbdbba170f06f9e7a8c94e9ee852fe0d778c5c2971e3c2c97eea7f0f2c689c028eece628aabbd2cb142683ccfc064fa235b96d6b92ccd1a95bb492e17c9bf6bc39dc61e42fca675754d3e6ab05148f1044b5f2eef98b932e5f023f9e42cd647c9da9e300424bf3e1435c493b405b85b07af784d24d6f109104c13c079d6cfbb2b461052c28114f6e767e83d6a846b9f6db214645fc9d7f83fa5a170f2b8823f12869e0216ec6fb19164a27ffca69a372252a3b279cd5961beab8ab88889dbd13d609cacbca97bb2170fb8a3fcc9dd82164ab4cba561bddbe86a749000af14bdb24de860a135d9a2dfdd2874d0ab1b23445830671a4d30ad19e620aa3ab6220c62840d607a6dca3a8fac096d5b3a922f1fa8ff965dc3683c6531417223e86a0ce1d21543307d1479f52882bf23560b2e74509bfc49e33d5c09927ba4635721228a3db2dc71ea6f2044e2a5b6c000cef4957cea22e05a26bd5f33958cf0be89fecb2d1d0cd2d157898214424f488be9159c0467d6a434df9253c7ce664296cc97cd614ab0f397277ff954431d6e5ac99a7d437e7f58e76e0e8fe689973d8ce8767cd6d69be800bdc6c4c062426a96d977a24e40d218c653ba598f387ad1af7de054b1ae89ba3fbbb70571ca22cd693e7f4c2c4b3491a62c09d958eb1973cdc0663462d84a4c58145a030f9eafdead93636ccd212b918b8c868176f429fd51cac705ca814af6aa0e71402b5c7b61270296628fb8b60ce3c763362bbe87d12bfcc4d70bd61aa843519b80eb407c2007466b316f9ab01aea4eac43f710ae8c993dfc633359ca0796d58e327ed36a94481823fa5beca7302b42d8ce81290c1f5a623315973cf4af05e61e2454b5b5310bbc72b6c306af5b7e6f3f806f5bb79735a1fd80126736ac3d53e52a91d741523fae7f7d29ed1ed7eae00368d3eb672cc4a6c22e64a1d8d55c3fd0e4225212fd485b818110b3808f812a3016514193876216f1ab10e81d5fdc510404a4884e594c04d5d1f92bc60f0cdf730d263a0f30755caf8ffa1301c7e6fa660cf42137c2b9d97b542ab98409d613fbbcef17bb9bccdfdabc1a1e5cdc5065e317629894b81843bb38d8f63ee21fe338ac94a33918982f773108e85799c5cb329eeb1a414b996880737c57bb872f3ae6b20ebadc31cffc0484244080686fce07c68d5f27e0c431dc7fa7af9134abb7e298cdb99d9537090ebe9b8c440fb2a23fc08d2f26fa3a3906e1f75f69e85eb66f0e8de02a7b4280d1d2db612f7ca6f7173f8297bc8d1841303f874e7b8ebdb3719c36e1d95732456f97715cd493b221c5e2a8ed5a00f328939c876d67533e208282e9fdf13ad5e5388f7df1660a647b7b3a6f94c711cab0fbb3f3b265025a55dd077e4a02cd4ca958fc40c9a4061146ab400e3204bf966ea2497d711f25a5850537c88cd8edd6b9b4d0bb6684e41191c7391024d204c0bfc253972acf96e6c95ec842ee201b1e9d8fdff188b9cc5b667dfc4afc7730958c0ecba9b8a8bc00762d41a4a62c7dc040fc0393651f26a81beadb2f06dea0c38ae6736d768288fe407b610d54094a6dabae50003cd592963fd7b6dbc4656b2b42d9b844ac7a8144333c95442eb6992881e5bdafd3d6b17f543178e5ae1656e1b0c2586c15aeb765a0d8caf619ff9476cefd272889a80f4f7cd1db6f83d6a90cb081e292914fd7987c49612b678857c09e1183f464cee98315f174cbbad7db9faf799142b990af11d31bc170dbf8ed0e587488e7bfe653a8f354e217643abc5deffc5f273a1638fad7378077d5c3b48ee0f7914a2471bf7012457b037a180e9917740c5b1856546ebf54d809f0f039b7a3689861de6e850536d4823220b652907aad5025e6967d2b17e1ce1ebada4c2676ce4a7c267e510a910223871183fcf7323b50904cdb70be4fd182d9468f62b11971ca52cdfe62188474a87027ced6f4abc03193ee46f2c9fdd3e2c339c60007410d724e8a259e5211654902d00a1f1914fd034f8b7c085dedc795fb741d4e4eac63bc61ffed02a66402f8ce60d04e83b1c36b606c4dc0ac5eb59ad74f85a2903cc75dbfcb0a529f83bbea740d692de2ac87b00eb9b625dab217033e607e42ff72854844204cde482f3b2045381479f540f04b5a808d32834e12697354229487d04546047887f51b9df0a70c6b6a2bb37dd9aa10c15b2fa59b07f711b724cb62e883e97e2649814ca497a4e8c020d26f5fb7e72168feac570bfbb342e9ada23bd20d5505bf4e97d02b1eb70cffd5c3b037051d4924bc984e6c01a2af5fcf8cc5ac825a2eed4574a4c821543d6e8acf00fbd4a5f0bf001995c86c5971a0c94c20b4db125854a42a8583bbc498f2c2e817a5393c3b56daa3f926139f22a569f3bdd55e0fb5cb70fb9b69dfe86be23db699246f586627d5143bc12c7f7de9aacb23e793f50f93e3bc81e8dca471bfcbccf3afdafc8f4557dedeac49f0fc0e847e36d1b7f4b1b920be7b14427d792ae8720a2eb8f339ee44f79b0cc931c602465a21444963368240e1f9a86566843d5c31cfcc7a81294a959cafa0e318534a94cf940d3bea3b9cee1897842162dd1adaa354cdd29ef73cecf1b66ea143cab0599509bddeee08602184acdc612b12e2f914c9ded8e21cd01a07b84baff97011e74dd4bd44008301d49256790ca86d264644ccebcd0f80e08280bfa9e0d79628eaf066035e766d04c44469038db4f9184f7395df6bd24ceb1f77cd83bd37cf0ea9ef21bd5e03a0fb2009daf1756b11868393b4bee58defb10d3bf0e72cbc9138a96439581e4a7636be0dc082be056089d5bc28580ebb13bac53ad48618798b1a6b23e6eb384e669a988d318789e1ce86ca40c05321855d78f0188fb9c2ff221cb2e5947a6e9ab179ee1d310e250bd969625fdd79d084f74d696c048ad18394ad8a30f9f2df4d05c61cabc1dd65580f8942f0d02c60486280a60a26af8806cb5101e9d1e4843215d7e5fc76a3d4990eb3e287620bd8428b8a667b2bc148936a91a25cb27f54f769d402ef5589a588c8f220f6257cbe2da40a198311643bd7041c7929ad141f8f019fc56f8a6f55249a279d689bcbee603c4d1a3da8fb340140bc650f803b844c257922142d12620cb50a3215869a21d8a4341084106427bf02e871df9b451a8049491ba9a6abe6dec4a40394366de317a31b502fede6d4c2fe298cf3fd7ca3019f953762bed1faed84147364091123655ec7c5cb2f667300d77737497a32c9a6b2fbedf255b5b7d0b4ade2554433478b95fc829f90e8922b2579d224ade2b8355370cc954acc87e140737ddbbbd1239c1e7723b41596e075f0c798f4ff604c703a44bd8b26b2122e2040a6c7b7fe552aa7967a1892e4efd05865dd279d7495cae78db3b897c9e0174abcb1d94431b95b0076c21ba2b3dc4426bd318951db40655bcb85d741c0258172ed2f1e69f5b2502e40f08529aa8842c295e8ea23fd5fd1390a95bc629ed3544c54b377e4823414d09f0ec19ac6d0a67a65cbddd222918178d68d24110c9852428db069a30f80830db3c9ef92a33b11090fdeb0934f0b5950884220309c7f237c245a3592fc0e43fff774828ee9942b5c258d2e3cc64ab9863900ec65d643dfdfbc319cbba31ae3a58c50723fcdd9207333b41144e825c8972929c187b69f380a965a232dda2817eec18fb8686dc125042fe6b406314046bf1c0730147ecda04471d8373ae4b1284a86ca7bd9b3c3be2eea887305c1121c473f10654dd62472d295b5e9fa2700e61c619d1aa149dc05138ca508f11ba44ea503a88207d2a0f0a2148e8e79ee1c32c6d1efa04b1f169f9e35fd80f6e4d332828f2f5fb02e4c9a936b35a1ea83f4591ea1bf8ceea517b8b0e64f0face44db11162a3bc466ce812fd5cc2628b6f95b3d4a9d648be9357fc96c0560d35da44492982ae0c78f284d2dbd93e17778c0490eea85468bde034484030786a6b9d6373cfa185825d30b54de2a61e86e2f60909511bf0c851d004588753cfa990ac44983121bc862189aa13c9bfc29c59de1d9889ab57ae2449b8f654fa282ad1b1f38be8093abaf11702ffe9a7e6369d236b13d70939b965263e971d414314926fe0896e7f39231f24ec6268b6b7dd2b93920bd0b36722be0e6c4c75eefbe81d869ffbd6059e30376e22f948c988a6dd300b3732e02e9bc3f822113d4a14b23bc11b7c53fa1c85d4d8ab6f9dc396a7f4624878e1009a994edb9b86b7cc4948eb1362325e65cb5818dd91e8d75d6c0b73ee9443f826a0a03f3d55077ab58aa28215b599981012e1fd8b0ab95814dff4366747fa4b2ccdcad4e5c0cf4b0a2e9fe869c859b965f7e520805d5aeb6848acd4f970d6e5e4207dcb9e16bec53ff8100f454491633071c8bbb41116e3b970b9433d160dcfe1e531974acb9b8cd17a91362925ac8f517118528f9a9f1896fecb29c3b1195b795fea8985290f135ef9195cb4af13e553f25950d0d67c2166ef08d580b683c3935619a3360450f19c028e0637e560e913d092c2fa2f8c43cb23fe7129a9316c070d253c9c7f9387827afaf8aaa95cf3f5189b7ae2cfc9eea21a6d8092da8c28af01c409da02ec7f87c1b2105f65c99fc48ec98e087474d1adc0c2c7836e5e5663633047f107d79e40267fbf5a04ff03ebf5a06bbbc197f347f3d0d44144a30a75e7285d817b6af52d9f3553017a8c146c8aab5125be811014d95888618e034b4c4e8eacff475e8d10fef373b8f751192e731e0b47dad109ffc24733f74c0a1aa1315ccfd6d8c1b206bb5f1272c79a03b1e465ec565ab95ac2ddb3c0ab6c7c7058973b203a7b7f3d8cdb10f22f8e4df1a127f6955c0091a5392f76a6eea1668ae88c6c5c16a1ee2a1854b3a2b58920ad4e6afa21e74da54634b64ec010521b45cbf8a0378bdd4326ad32fb1222496ddcc8a6c60c0de11c008ed87f5780acc390d1abee4da14b6c5287439dd7404323097fa96135721e6ccbd58a15c4143bb326ee4cf54ee0fc0c5f8c8a3df7a0afb217f4dba43c9338424e53898ed7f3a43cc18455c5b15e2099f659caae91d2072707322f82bce2d781e344d285f362bc1a40e2df7ff5228e0d1d4c69dea20cf65df1c53dab9ad72f231ae8d891e67b36178aeffa31fd18328228652783c4d14c26aeb2a78f6242d969169b70e866d47cd135f29ccaf6a35d475af54b236202bf0609c8a295cfe10f6badada22f5953c4fef64f1200628528b9c8c1719b319144ae93de26fc22afe4e84983cdc6954b4efa7d118df2ef909a3f735e5a94372de49eefab5194d53a439e2c9d232ace389122d0292b7837e5187920cb47fbb43729d89b0458e6c2215da47eef5023766a97530071ebe91db3f067540d876a027070cfdd2483f9c9c7a08abbf203804758f28b0a741872539059abd2419157541a8399bf3f237e3104339c29ab7e8cb230bd91fa3e6de76a01c077a84073720f92c89d555996b45c68346c4e3e10f2c0625d47324099742e4682a1ee7bb95676489b3804e0c043a07258ac58f5bdbd55bd4748836935777a6f6fa28e51f0466d481e3fd7567ec328bf41626377123d07a65d84073a81181215134838768b07b3c9165fcf9e19cebaceb8f279a67a73b3d944a75bcefa4d47a504173cfd1ab17525d0931213c4064111ef43a5e3826f204781d3e40c62ba20b04f27c88256e17c35f185425785cb078e8317a87b11539851360f4a161ce2ad13130e9d7687f213f1330fe88f3386736f5adc784d96a2404d989b83f4a3fb7879de754eb148909da928cca9f7c0422fdf0229f97914ff5f6480563a157e34ac701e6b928e601a05e7ac496866ea855f1f94eb0511eba693165f327f7d8d6c8ad6eebcc20f3542cf11bcfa87fd918e266217f72ec19cab124fd33a95bc8a223376051a09961b8c640fc240bb6c91b82cd690c4144be3a48cbe26e0e517ea24a7d0bef20a97a6dd121209450b7c39abc7c347154aed86ea5da0693966efa7cb9b7b1ae214551e4a4c289542e052d42aacc9ab233a16c3fcf4f10eb5e328a1d43a012b6139c1cf6f15f958d658da9d6c334cc84af07c2549438fb0571b35ec8d06f038c0c191be86936d26bef0cca2b5a5f83e2f6dd4956339cf9fc5c9930714c30dcdc6e3f489615466ec2efc94ae426ad47f9a362e1af627adfa5dc06bfd695206c05d21e04a214452e7ebc849d930189fde95aad1169326c5721cb34eadcc4964762712e1b72fafa2ea0c393d6e22a79464bf4b09ad3385a0f27327a8c76414fdf018394add6cc1f77978f6976d65e4886f22a3b8c516ba8a26b6fc98805d1982452e8f0bf1a54a725159562c558237b9fcc32020943ec14296e586c870d5c27258fe3c2de8200a352286cfc1432dee17e9616f49a9ab3cde91def7347804cc4145b8c0c11dfe00a1f0f6f3d6bca53f043c1615e2d412c696e84ee8de11112818b6b60c73b216c37c041805d2fc85d2d35b23e83d68f42fd53044584571ff1f31680962c8b2538cd1c61b661d4f71cc1e3e7deddff918ab479ff05e8527270a78f7cceb19727dcf5d7355405e2ceacef31efe7a7050895946bad0dedef17203166b2e51cff64773b6dcc2637d5112adbb7016de104e60fe943b9ca96b7cea344e3a60ca29787243090566c8a73ce1df78fb463c7874ace24d73fd4f29500bf56dee4d192d4b878ea82700b36c7c517fa5ddd0f097edb1804000bb49e140662988732856b5b42e334ec4ab9869cf80e8d24f460192806653adaa8e2d76105148eb2166c2450622529f767e16fa9968af45990cb0a3c603446017a568db57cff8b220359fff968cc30a823e1048e0b1a61bf43f89cc58eed942fb79430257fc82b602095ae9adfcbbb1aa16d2cea2b43713ac9d8cd18d590377f0c3c01b558c67f2876facd2fba7e82fa3b8d65ae280ba008cec09ef4da63e4bfdd1e26add0371d75501e353f3c3f6e7e326bd7543c831403e7d5f947fae1e34545197b925f9a6856c31e6d928156c935dac39383195484b33ed0aaf6758cb55abf6a50b333768c4de45cfd1d4180d966b25f193ef26f1fbd1a21222ab347c7bd570c4476fbffc0195671fcad1e6fd8a58a77ca77c8aeb2a6ba087e69f5625398a6c446fbeaef1278a8668258767da5ff43c24d85a2bc684b0d5c365fb0ec81171cb11f3cb4a9cde0a75faea84376594220351e9617cad8aa73e577a016a4b00994d8853981ac91431c9ba5e51513fc1801fd1c10d14515e9a02aeab607e5dba506ac322ddecf98cb1080b419c2fddb751735e810a3fa036fab0d46b33d5afda0b584fe2e23070ff95337e2a1bb90a1dcbcb063956ca87f1b0b41a79eba42730d5e0c53e980f5930af84a60ef93643a036ab17f4eca006857631370ffcc16ee399690734b44c0f73a44366334079bab14d5e67d4d83f7dbbc60e3dfebc35c38820c9dc7c4437c2042c1c895d6b4a1b7f5cddb6b5e890d7faa43bcdb1bf9b86f271fb52e7d37e5f8bfe545a374476fa9d0534af4d8526000ea68c3fd7e3ad4b8dfa42ed5b1b78f11e5fb3d49bdaa510fc6562070af7d5891646ab09f42f443133f10137f97a6776a6af61f4cfad1c35ab6d7b2e5b5e1bbb5624f23882239f509d0e89feb3eb6b8c07d0d065ea718b59906a5ae636928375418abe96833ef9bebbcdaaedd2dd78cb68b4d262a5dd3be57354d696b5785d4779b52bcb6ec221bd5fb00536d17a3a6ffca7553dc2f4dda932c75c5127d88b58906da5f0e24fa50f81b10ea4d8f0ad10d6b4d8be1cb8eb2fa0c4fbc113194d4c59e304f234a1600b8597639bda184ba75a59a248c7a2f34c4740ef1a55b1235d63babbe4e7239b898a82eebb43417b56e104b74bf87f5ce6a8826a83aff8b55c9a3404fc2ded1c2b9d55db829e979178a256786cea2648920823fbce332bc04a83dab9a07b9d521143317874b37d640771323aa434624a85c1096c38483a1c03862bba98df8aa5c3c19128f09158440de9226a8645b038d924aa09c3f71d40421fab88b285e4489b8da2c65b90ed5f6ee4437e9e1fd39d30c2aa7097a5fc4552e0faf0dcc79067d2500881973aca0447176c03ec6510e99398ea5a6d31076ae627e236deeebf5c0ad566c2e3418bb812468cc316df054652c98733167e88b0d9c215809777669466d29cdf869f2f3d0cc6017736bd3c9a74a1594ee44a5a5fc63a2d51a95b1e6120737bfac93b6d3f3acd5768770aa68b676932d1e83c506ab000adef304401a66dd7c2d817b2be95324a740c709b6ca191b26c0a5586c388926da9b9a803649b226b173e6ad16d4ac06c433949a30e958303500c45422a6cd044284f5200e4d3115b7a1f4e68e0ea97903e7507c41dc015c3da911739140ac4a5ccdff3f04ed284e6e9a88352b5b76a3cb66503e15d2c54cdcd6685234f10d5a9e1916f81d6861c2a60225166215a5b75c8d1bff5cc4aca4ad64e086f530fd35128f60b71ff8c4947bad63def1fe5c23fb79359611a85e60bde316807ba385277dfe4eebfd65bf20441891a7f186f09019c2790ab9fffa7bbdf3096bef0fd8328428bb858abccce099055c5e853bb9f18022c6917c2e97b83b87b6f4908ff5c51208558780c84adecb79c542e6e402918835e3e1819f486e8b2cd2f34009976172d6d5d0ea622e417a354d6cb16a548cd3f3f1d04dd4de934f1910b886265580bf01e23658d5fb5347d6acd2d6f172d9e84ed321ad1134281249a47a096f382243c193ae62816765125af6721ec96fc0786c9eab1b7a8209b153bf1030dcbfcb029f8a6bd40a21522764c606c91195d4c01936ce538b1b8c23dc6a9cd7224ad92a4ea0a953672ee1927797840e7cbb84f3df57ea3200f9a1c3d71e574c46e10f8b95a5e2c09ac29788fc25090208f6cbb9b563352cc70b7042183cf121501470689092dbb3834da9257f3a4e13f6ebf80400a970cdf025b7f2203784fbf2582e9ec6d34e3ffab1ed2d6f3af52a622489533b0c4090ea9477a52d0e87adbf6d14664bf800beeb8577bdaede1a0a70303334619c803006998ce406a89f780567b20c8b0e9554219771d0100307eaa8fe19f0559fd73a13655612b512514412f65b42d1cb3ebc2b74be8c2c3d54563c5921b16a64404aa9b44fd3bbcde0896f8e3fa569dbac9f775d3cb120196b3e10627e357a26159c9fa847b84659a928d60f7349940274018ef320b2cd9869065514adae9793d02ac841b639f5bc62e3236eb6d2b42e7714862350fa789464257c8131ef97e6623ef434ec386ab8c0359126280846f5c27c64d8fd5b589354581325ac090833877b03419683d0c707e855fc32ab738eafa5e64623b2527b63525e3428f0452a5d727c2391bd3b9f15819819e558e7b93447a4ccb8c4a95be5a0c6c4f37ccf237437349250fc2ee1ce8eeb3af314b07fae2d13ba0e44479735dbeb65aaad08ad5c2ea1e8c5fe143de4311c139def2937bc028af47cdedff9fc157545532656071a49cd26aa58fdd6c652b184cab07bd1f2c7fbd6cdbf2a7c3af5d5adc92ee2725c30882706621f161c3275cb49cca002ba941b709e255e7a6baf49ed384794243a13928a9f4baf61e00cb52d474db16e2d637df5b2c8b177eb19b32645511ace6765e66e9caf4032c8d7c7f18b718eed99a2c231567c4b32b3734f03852adc700cc1a1b1e69221c13eeb9152b8404d27b07b6630453d11e85c5d13dc3da6e7a0558da8272c0a00058fded6d13c887d41391040d3f15fd14f405f04a14d904c19c731ee5586272fa664bad8312cb984c651e4aae117084799b20cb229d867d3c7fa4d0c613f860a0103b95d44f6c60820847ed0fc839f181faa0f904c78e8c8a883a8cac3b11707709e88472b748769505cf5d4903564f06dae4139b692cf0ba430c7b7075bec7354c137fa58fc69eab5a2e6f99082b02a06be94947b3848ecdd3967dc0187bb5ab5d9c45b0fa05e8ce3f6a79efc99fe5c26d6d263180f3c86ce89ee3ee7e9cd36b7677e7f66bf13d76dc8787004cb40e326e62e1e8093392084b9550d3847c9b6200cf0b4cc65780c6cd62d9f7ac1565272d6a356c3fcf0c353b160900895931f2b270532b0b8668cd3f37e217901a642c292c5369efd606275296e0c80e01ab8a7bbb62250f27c78e9df0dc22c96a1afce0aba42d14c89eb952c843bd10adb11191c7a402c2ce241dfcf91321b35a9827d71cfdff0bc898d545607503cb47e128abb388be4b425dd1430f7acf756fab7700c9bb518b70da852e3566a65e384d1c8724c274ee908d81950956091e10937ec0aa24ed12abd42c55b7a849a8d8d9a744acbf77c759fd3c82224998587ca719ef03ac5cf27a5ee091f39424ae00d3166776c0002d8dc091b3decb03e612301b46434456cef8f9c4b251b6491e4c79f0f3d1a87ba0e9d2ba46d70b5c0ba541da369a7dbc69a8e82ea5c6824c0dea7129ce90d8426d0fbaff793dd1dfaf3e20e5dbf2eda85363c2d15af83485c3f635696d63547276604391ee6e967b60dac458653ca7a16c2b93b41959c1fc110ee6dadf94d172d2998630837c5b758c4698c6e3d286655b8e40ffce226e84cb4b34c6edc909a570af5098fd82ab090b9d85401d815984762b1ffd179e316e82f2b5d1ef804d167feee30a2fce298583f8d7527256b7918c9197814a80b5eb95dddbb4f5191d964c7381ec7b33fce08e19dd989576722d2c05d9dd35547b83b7fafceaaf7baf9ee9a627f91965753b4f32d6afc7f48e8aed3de3aa1a88aab59570ae57f5d22f025e1693531ec00a807b57851d4da11dca30274b66097e21408e02ce6e983e91e31862ea820629425729c04dadca361bdf29eaf2c3627bf1b29ff1fbda6707bdd54832b82b046dc26ea1a1076c671d51a6441130240c8fdd57a9bcb7a844f9e405306aca935cf46723f6863acaf71673e5fce62718d6becf04dee0da5b039b2ab180b0b630d0ba9a60a6659bd63a9fe9000168f6ba8711808e1a161d7c82c0e1c5d7b7d76bfb01d5a4fb66ce888356416b15263a0ba08ce12c4c72c9e04d85ba0496f7635ed845a52e00a29f61159af1c29913e5f034321dac79e84d7a09a503581e52601e60024a4c37e9854297fd5debddc8e9ef94225baf5da8c214a4218c9dca6f287522f66d3c089df9c1ab84bc2132058778fa87c9f153f9197f31b1257ca43abf2a7157b546fd4334127049cda47bda0c2a02c65779852e06eed2c0fdeb3d4d4e915ff3875cef77e8003836311862766264761c98988979811b8e1f1f3e154c757197fe9930cd1543fbc4ee57d49dbd6783cdc9ea29609a789bb94ce7daa5ea4364dfba4849b718f57df07a371ac547c9e32fb193e1252f512ae1544b0589726d2a25d90d36f3ae380eda7ff255aebfc7fdc1ea40b3d4cf57d7fe463b6a3a3be2062ca449acf3f8984959aa3544da29e552139abd2aa957c012e65bc95ce490a3ad7e05c0af9321c32fd9e85c1c3e2f5b5010a8984037a402a8fba8954f054cf757df0c181edcf1c6e85760408d7e8aec69996fb4dd09a4041eb59aceaa4776637802191658f013d8d0bc0ac59ec780a3ac3d1a3e3b843290ec79a6e0ee86573f38db2bd77592f27859a5c2a06c0e66634d6aea55c45b7da7d4a43633f86f46a7dacdffeea80bc192ee1c88520b816488252848b74a5df3af89a43be9b58c3c186d0108fc27d96ab1b94d39fbbe717dac95c25f1d7500b05a35a30ca4d4828c057be470e333e780363358521efac25ffbd94b33ef99591a2e491abcca2b7e4c214bebb1436a2a0f0f3956d7194a0ca134987730297340304e2a2bd82fecea0b417194f4790f5165ddf5068a19c7e1014a259da393dce6995cb3f0c8863cc4214ab12c00a2850cc379551feea282fc510852e210dbff24c8e5065dae9c594ae8c2c825e3b7483d8f328a36164c2f4b6d73952e82d375589620138b7cbb058f40235130ae396eebb6cc165a5cf8d2c7f8eb562c15db3cbc118f750958a60b46df97460f8fe9c1bb26de64ff90f3129b088711c4085ed1c7c61795a14511583e759d1c9dd71efe0de3f8cf0c60555606b7b393e8ff9d62225f1e525bd88935be98213272f62a6177534330974cf065eab0ffd42f4d9c1938119e69ddeb2d1b76279d6ed646a751746f7cc5f5e79255ba906cc0379604d52e569ad09c64cfe21fd8e8c771c6417d9fdf1318464b5f64bd961bdf45ac757aa10fbe58ec1cce3dee386f7f4b45d7606df1ad1b3893a65eae5971385ed31e0f48d89402bf8f5f7d151bf97a82059218f1c31f3dd3f5bedaf54c7dbb36a608b4bbc6d42401bd4b68b842511edb11a1da20e8d2ac75ecce8c7062493c6c3f85f502465d59104b5d2ca1df5e45504a45d0fe8f50a742822bcc7e5a38a7d382d67aa09c53af4d7dfb5c6197f708711dc39b77896563b890cc1e33bebe86d7c883de9e830cf6921e2038c6388b92f85d287c9760aac848c27de7c86b0a174fbfb97e367c61cc281e269b38f8b3ad037988bc8d3b73f59cee82381566786bc83fd9d7f7ebbfb98b4b8be3b86dd34d0e9875e94c4fa4005111125dd5b290c0be0e34cdb13220bc006a26f4e1dadb227152e4d78ed845531ecbe3099280b33629be36be93012766e27c1f16e8a0dcea05836b83eae893180160418f4f08cb32012d07d0b394a821255b36e5fbc5b85b211a5fca53176bd9d81ff0bb9aa98cf5da39adf14fdd7e76e106bf15cb408b61592bf9aaac3ea5f8d70fd167fbf82dd9d7ff848a13faf4b25bb079a135ee2d5573475f6f938a23843a0e2c3e7724b88e24eb2393fc3a57f8345c74b83d4bdee825a55633261cbbfa6ef03447b132542b8d83db046993913799a89095394beece819f807d541ff13742496e208691a0f29f8e25baf76af218425a8dc9f413f7081f4a6b17978f966a0c57669ff66f3d7e61daf30b21765ec3f82f80bf265acceee6cfefbc425f6ea95199a25bf2a1035738d7ae91df5b892e5da12ed0e95181793f019e2429a917b4444f36e1475dbb6a0821df00e547845732205c8f45c9079bb4a73b6c43888eddffb60d82fa9a9f39ef97f77f2f87edea271428a4d6d9438e3d1de807743e32cac4d6851305091c4556d14a838f39ceaa168ea581e9a5e2aae109487b484a17b4b292fa70029bcea00bac2f080febfa66e24da052b3d76a2449d4a348db56a24d73f5209daa8385935f5454be9ec3bad7c423dc821a62201eecb5c48c42c9deebb0be6ddad800930096727a1debda2f349b477bf472d5e3fadf6b4bee5067dfee6c482822965bdfca682efe7d6899b591c5146a45e624292fc3fe5bb8415c37de50052e22e4ed6530891ce6869410c8801b108c97085074f7a798c26672908c4ddf5fd1453916122cc561cedc71ca7b347224858fef547ec2958bdaefafcf108005e9da11aa8a5f2f061daa7b99ebc3ae116eaec98965f0b8ce5664660b19781153873f74c1898d91c63c01109cc4622134a57eb8196ed1f1e058973c3e58db766abefc30b17150d145eca3934e11eaea7ededbebd000fe1b3048fa41b9039a1cb2aac3e6fc1e6fa048a3cc6fde5d00aa93a42137401523b0fae027a313630c87081f799100e4961a456f220df07200dc808e7bde7a7877031a08eec893b02a4b9ec74d66dde5f11ff645a0cf65999c69003badc57316cec31a45858dcf51b01e672984b38f2545793f41ec0cb4c55d1772ccce0ceba7bd9817c633f7eaed8e535b0620174af0d488ebdc6bd9ceca1513a4504e8e8261c1206cd14d6953517727d552c3d9820e6338d42a4bcf484eacf044cc576899bc127f3670f78ba17637b56b40871ae2a3dc31d81f22f0a9a4e561508834d1cb7614f48b538d66a6834443615f72f6b0c8168d982d01570fd99834602c65b87a27a004483218ff65e008d59ce9046d7f732c981e19c1933b014b26eec8b6148e97fa541164bd946a78cab97e3da10c6d87f21ea0d3e9b3c39181ad8894ff908a0c96ae50561dafbd828a0fd214e64adc10f6884815ca924ca9dd74707df5f32f07664134ebe80c6dc8bc554b4c130406834670b7bebd00049ddaebd836b544bae3596788d042598b103afc82f6e509c15c31174332b55b8dd152dd3c6e94c52155eb6c9fc43895d3e0b45e8e2c2e19cca1a7ed00bb9a1c2e5eedff8bb75862690d2a0d77fd5b4fd586d5b85f41bc60c1541c3917f35eafbd7ad176ce9f561de0117911d7dbe9d333d48025115edbba81fa82d07ff6a7b86f7cc8b666839de67c619b1e95fd551ec5dc03a37d61ee0cbe8d0a47615d21eae526d10e864d8e5000660bf5d87515548ddb12a57f419ad5cba065d56d527bd9729c1a3d8d42ac0c5a996f958b85bb81215feedc69705683c2f3d45c41ffc1f935dc559cb94144b0eb635001afb27637d2856154a57a940f67285ad7192dc6121c082ee0d847d44960dffa12114b9c2642480d84190d95f949c45331ef7521d3f644fc1bdca9cd40f5ee6da1819eb3f5b217a791b5d289bd3f3bfab9738b973bb015cb23e033a1edcc69d4cbe2bd3c7d721eaaa8709d00d796f732cee6cd670b452d03550bd191e3bf58e7dd22e3c9ba10d7e806a6586a86b5222aab709893ffa136086dab0668a993f517a29e63243fceaef846126dc8e6df2640887fa71fa42a5abd2292cf9230d25a895ce72e5d27744bb2632c9fc761f0084afa33ce893dad5027de717e12da857a3ace808a86f66e7baf62c5f46cab32d74a5efc96e80ee824e3cb8660bd497e666f39bed4d7c0d54290f17aeac8a4d5d914337e379e7009e0226730b91c7370672dac1809efa90e8ca89311a106e387bec1d1dc7d09a3580b546fdd73019964b2596aaf5cb0ca47e171512104162442982771ab2a6ab67e572d403699d620dc12b3408bee2218c437b030a00d4e885fd3373b4ab7282e350b1d1559447f3c04045c01c89324f77fca87a345fcc28bf1c71d10087a08be9eded6801d0dee0c26569fcf4b9daf818ce2f9f090c54a31b2ef652ee11d04916866119f40569f46b4b7aa103fcabb53b5055dd6346d2946f97b22e8113db3619a3042fa9bf3a9aa33ffc3ad0ca63fa818445cdfe1ec46781a24e222680f6d4b3e1cb586de1c9aa11dfd1f3884840268d46e10c4eb91a039e66b6ccfb3634bddd8bc06713275ff1b547c01fa1d49de8594c24ec1826e8e9f898330e3d967ed96daf8ebe921ceb4c397501e9b436fa2fb6abf7277886cda0f6d52995aee470080d0345e125b91fc318ae06c7a87c75ab0aaa3daef1ae3a7d8c545e629ca99ac37ab23a5c5ac5a518601ffc4269a869357a506b627f056b5257e1b8be808200ec615fd9c21ef948c19888e846fb89d00c713d3ab694eea86d89c4654164176b3d7c32503ae29e4e120f5519f696da411cb5db2b817d55db0bb5d64e1e46cbb10a6762d95dc16c000b5b01cfea1e13934e502e77316abb243ca6581fae9e2b3d1840e301365af9c36ca88de5beb5a9ffd22911860b6e2bcbf45e8989342945dfe720fb395e9020a2470b8a5fb84573cd908290adb2ed0c30c9ca2a495c54e53f2f52f93fcebfb9496c05e76eb7dfa548d3db553c57a840803c044c681bf836ef76c04149a4d4176912d65f2e0746646c2a257cdbdef4e68626fa2d568af51a071287bfb87e985e6c0f101b53acfa0bfcfc052a02736b1d2d511b1366094d899f1f9b6fd5d178db3429772e779b167866edf19bc08a67f843fe304f144231402232f212910e2306d9be155df87c27870206ed649bc3ce5cd257bf58219c6138e1df33ad0569dc66577705da52effca9f6e6b5a67f71e80d5a96cada943a7c3a6e6544769d726d4d48b56ab815cd6228016acd82ce7fb74652b58ad144f9ea79ead59460d61f98e2ae85824b2626f7e542ddb0ea4d0172a9a1a7dd1ad3bc0b1f5224ee0ce88925e3a908e5114ec608e3ee52294d68881c696eeef84f9972590ab448f84232c71bd76bf220d8aa31841bdecf119a56f2da444b326a8addc3bf289387561f2e768e41d88726c751f2cb8ec00fade4043758ff0c1361601190b085742cf33f5eb35629f328f0100780a391606b72c42a55d1133a1865f3353baca0461a544f2664560eb404bd2d5b4f5e2da5b66cd3739aa4eedcf27d82293dbca9422a459e92cf47b2dc6328504d2eb4932a84cb167a34d55074c1cdffd7357f10850c604ae8f929d6b467d040c49a784cb14fbe08cbfe1c435acda87d7e489b52512652aff79486781ed8a816879d71a0e0e7df27ff1c27ea108a0692f68e2887e3d108edf8d1d2da0c4518e7d3608cc0c4b2c8678849e1ad12876528764db336b78aae08e65a4b812b5f40796fd32650b95b3f96f1213b9de0364a98a27497cff377ab166c4aeac7656752a9723ebbf24afb2055edc4803308358023e211e1cc068c9778028edb13c05448ba72c9877dc714996b84cba46b65a51727b66cb1201f43e1cc0c32e8e4d6ce066a80e4b0ca2dbf6bf45f7278488c58a9c37a10c4a8231a5986bd8df0323ec25a52894bf9d10c988f0bf95542bc94d61f480120a6bff0d94e5fc882633aeebd6d3104eda3b0aaf942430e533754f5581f587d5ee1ba707dce609911798c0ddd40164645017848195815d2f1352f047d52711044e8d04f21ff57c729d176a89906f4ef78cea5a37bce22123f2365672f4ba141da59921527493795f9f96cff56e086047897a34589138d73b594d0cd930a0607176de663d29b6f50fe1cd02761426ae54b6a8692df9ed309222d7537c5009bd13ae575546ff505e9a1243f0af3545d4cc2f435f3a7b5b8fa3839da7a93c37e62305eab016658cd59d5a51bba4ed0439a7dfe86623922b27005f3a424a47a01b67b0f971b44a9a0aae698a6b8b7fb01ed49f3164cae4749c491c7985b3e9f1ed0eada2436710015966429007cf4f2daf2acb8fb63742a6cc58d83bf76a83f7db58df88c3d804d24f447357cca7e8ff6b75e33da8b9e06758af88fb82bd04adb1de2f480bdfc3cbad20010be8cf8737faf3f5609263982e7569381af543c8cd1fd3aa46b4edb8390f60917654ad9a0e0226abfe3795266d4db5cfa34196d9a4597a51429d92170bb94ff9edf6bace2e9066d98850643c03ac936cd1c00c125fd17804e45b0a4718357f93a08597b5dbf4834ab29ebcce105ffbdfd91cecf746596925036f7c4f91935b0176128aa474ff6481be04a688f5c0fc9e47c1d14e06e270ac528db189f4b03635a0413f20ec5c46e2e8660e2598dc8162767ef78bcf8551843dcd8d45450b511085c69632b0a2e2e12f112aa45372c4f6351fa1c4630464a8f5d35e80fa18bdd25345d5fcf5b36b17f446d74e83692033463fa1fa5bcfab2b8c0ef080ca1d0f13681dc8aaa0d6725e1b1837d054b5e671188b2bf21cdebbea20921fcff240c8c7c4980d3a349379a400a75228faaf9686af7047a88718b7081cb7c2676f04a9a41db753f31b2c94478756c097b6509b5944663e884be04211c3050881bf0f3f7bd64e640c1e436b812fadfceae523cded2310c5d3b74b26dd06c6db1baae404c96f6436d575afa8c0e0ab52a1180146751ee4b32579ce721f87fc823406264fc337b05c660a06431cf0179522ebf14858d2e565ab5d68ad91592af6e425d7d77e4213fcfb96551d38fd91ccab39397345f636fab84626bef1436588f3d1395876156fea6f6c8f4f4a2fecfd2fb75b43f6154ceb11dc89a498d7dbc9603e522a055e51eca6983f046f23c94e426e3e7f514463eff705e65cda30a9a5a1faee1f83e5fc804e590f389fc1e17f3c82793b9ed368f9cb0aa8392189bc3f7636bf2c1a8eeee6b8d317fc92ecc2a4b7d1e788fe89e9366ca3e7707bd292b811d5933951bee22effad21ab49539756786fa218a61e1aa15c6f8aefa96c089476af13d285b39fc4916d93145a7706e9e23329036ff4c9a6b3da13e3887c137842c8de4b093ae3ec858f8d0408618cc48bd458f731b4d4af04d49f43fea93a4a0a3080a9dbcd8864d1e0959a87929c50cf010041847c83c043e622b7dfbd8c25b5ce4986acc7139d1005b19809b96d9f094763d44384216ed20fa32e62ab33e2ef595e308e6bd219e64dd95c8e720ecea4a424a5ffb872fab59de6ecdf9bc3e2dc04361bc3bcb28e14d641236831309771830705a428ce4fdc6ffe07ec37fe87ef33f74bff91fbce7066ff52804c27a370e46c60d52b9be341cb473d9371b3e4aecb596b7f3dff939a4743aed8cb79a72a4d979c0f936935377f76f83d3f068a21373bb7dea94aa36270be6f0957fa9a0fb12d4f9b68a5520cf1ab1082a564baaf948a63df216595b866be7976c15e0e7124138244604aa14842ce1faf9b4b26b6e10ad94ad91574f5e7349a2cdf07dafbd92502ff7a0eddd4c4bb4fbb16c84a8d89b49018514ad114be09f49978860df35ed604bfe4dcc3f38779144e4c302d2846b0d949cfe8495a1784df751269463399de7ca306c899c3f8f61a6c2fde46ded1669ec4d5aeea2fd582b16f4cfab3701e755a139c64b63903d3c470f5a66118970f98362636d9b14c67d19fa361942d7c205d000e3bdcb8c4ea0e1adb2ce0e9650dcdff3ed3ef24014aadac054ec65a0f90a1d1ded376d3f56a8392ede696a26c50bd9e028891a53d496bb10a8a5681a1f687adf98a16072965186265685b3616b3d433a534d63f7907385645103710fb4a6093c0c4e0ab01c29ca574c0239c131e1d81533b9bf892d407cd5087c3046172be2a7374ed14b38969da25e223e7c492f615378aaf1e45fa18077a84b73ec2e2fa1be114b71bcc452bc22ccbffcdf5bb5eec834e2784781322184809424134d437cb08109ebed11df2fc8308209103eb952a6332fb188f1510e923550a2ec6c9c59deb1fec98c98fbe83aed782fccda97509e544082ca7d2a2970e129a1d928be2ed60ea0815e5b6c4f7cb64045ac69ecb7868f64729e520a68098f57d9c9873e9afe4822a5abf768242698aa910eaa942aefe23ba6f24a1335356dbc91d9dc0c23dd4d10b52bc5686713f2d249c7bbeda84d2657232b1fd6c5617ed65dd97108b1b7256c9d0c3a2c93b8c65715102bd9a72d96465c89a817a67b92a39bf9bfdc8052607ee7a5c5bae0f84aa0b3f96d3aaa4ee106e424e0de7a1e11634f606ec1ce66f71ce4cf17dabf139120a2b38c4df74a80f8817d9986a5f8d09f21639f9d6766cf3571d23ff892eccb4f98305b88c0eae212006f83554bf10e40ada5e59d71362ddba848c0b85c8e28f76240aac0933e241ed9c666900b78606470c85082e552c0e5ea01cf1b4ac8f9df614eb5ba177841d34336cb540c0aab24648c824d56084a6aec64426216416db0c4e1dadc7d2f6d7b4980feffde3706c051c285fcdee5f1526a8648f6b8cd9f358400312d5106a149f9937edce36fe99722402019a1fc9505c45fa83c384d8961b2c886e2792aed2d20347091008a6c3ceb538938aa5b873c56d1cab63456f3c80199ea64f15af63156c3248a07e4b004de0fc4b50c55205e55493ab969384b8b73fe350c6d51ee4d9abab0b1a32d8d8ec8afb9fe64660d3876bbce94b2762410061a9ff260096249021e53f7ddf06a9fd7bf49ee3c35966f660cb53175741d2d698d1042c8de7befbdf70ec50c8d0c600c2b3e2b5dd00e0e0a751c97a370abe52e40285c7f4e3fa8969f545a32dcca848aa014417141dd6508d7232747503f694115a1704d624a5201d36f624bcb514b0bae469a910a10956bdd63652a5dd00e8e8aca7150285c9150285c975c4b5a125109c25151c13d2a2ab826c9985c939aa5bb436ac5d6c7fad4155ca39201a5e056cacfe9d9fe9cb04c8a504a0ab645509e6d911494ac3474e4e4d91e69f9cb1858b425313ddb242d8f92318f956d5debc9986c8f326c8d648cacd6a825e6ec922cc376898c79b64b5836a94b4d8c83daa4967fac6c932e503f00fc48f1c4488026640f26d3a3792fc7a150ff6a25f37393704528a31fad96c850a0240a4481acb54dbb6b34a4c82709ed194a3a8224b4a40890a4f111c0a7d1edec3a39c19e67bd9d655baaa594a27a917aa14ab5c82127299ca9642a5d5d5b5aa6110af62c8b5252c751a9522d278f1d4b8ece6bc2dd9ebb45b12fddbe74fd74ee5a0cef900d371b5767a73f92e668c8910f44eaa13d3d439286002101092d894243f32816c5a158046184798e4001788e4203788e43abe758148fe2514b3c6a8948b247f64424d973af4b7bdd64d1657acd708ef6f8eb8479c8552707d0c9007412a69345648c3c003a29248fc82199649343eced1db24d3fe9728e768a7748f9f9f3237464a8a594974503b8bc3492342f97974792467579b94422491a39a78fa47171f93944d204e0f2998baee5e24170b89ce5302c07c0598edfd2b55a1e84e5dd5f0c40d5f9b01ce6a9aea5f36139ee7e179da90b40e7033b0567db29bf8901e81e8bfea583e900d03d1983bbae7b978279d4a6a738e7e46fa8e5104933efe53814ea5fad0250d37987c4b1f2e200f87fbd1ce6587717cf8ebaeadc59b00f973f56eaf8367b241822698208e02daf4992417a372b999a2d3a4fa3693495cc25372e5e5429d48b95ff49483fbcbcdc854af597679914c63124848c91f915b56022de514fcb53cf0f0985e1901ea0966738e4058642402f8e62292a827fe1a27be9545daa6be9be02e2b1564e2e80ce081f582e018838cbc000e018077179872d0ee2f217b8e4426fc2415c9ee270a6e75c5270a678876c14cca3f60926e28249b0f26924691e8bc3f972269c51d3a884f36a1ab5fccaa6c92192e66238731cce2814ceff6a85b38c4c9443228d34d248238d2da7dd6cc1355c0f2a0e7d2565668d8ca14729310044dea4537059d39028010849129ce0914111ba70832d18010b5f688235c7d0138912846ecd16408ab490b4041096a054204142919efd9020418b29b2f757d43c0db3fccb320f8e2d7b1b90843f3206fbfb10a567f9a6e8fca668791c14091c119206e3280e4993fd62b7cf6f49bfbf29fa611621dc2b6a244840c163a164ccd3f02dba51b2e1bd7ba37c3c1032f2c01f318e604ed469b59f16b76aadf6f43827b7cf86b2975af41ea774fa5a9f1d27e5f5da0a3cb23f39390a864327b8652fdcba99769c7bfa52e9a67a72d35352bea272c2ad94d28585b8a6a39cd073b865c22d0db7b297ae0db7b4ecbad456ecb16aadd7b59595c203a3cd22939f9a29e53ee871308854296eddb7e4ed71b2d3fa791ceef5d810f60d43240cb7e6bd3dcef6794a8f1d07e5f49990ca6b3d77c121dcaa17b72c6eb5e6b3e3d8cf6fb8b5bd8461512b08877be928b88572157cc22d14dc2ae1d676b110322608e73ebbc5f6a59f600e7f62b8d5c29e7dc3385a4138b77563311197b0e7c248434350324742b027ff165908c4a267517c2f461d59cc15fdb12abe4314bf895f44e181f11a913d497375907539d423e623c32e08ebf0de7bd6c7c4c17e6900eb7c60f8f2d10ac2b99773fab830c7d9565005e4e771e4e76de743be623abb1f17c619644fd2d83fd6e550bf38d6de0bdd905d2ea3785892864ef977947decb6b8c98838f715b75028196371e42b6ed5cba0cb5ee296c59c8c09ba1e341f74fd6d38f254c6e0c84fdcbaf8c21f3546d9c3d3f7723fa8bbe264724d10961d526e3664431bb2a1bc91b083cdd219e103cb87eaaa2416a49525a84b9f174fa53044ddbb82396eb6e9998cabf4adbb5d2ea2efcaf3c91fe481c908c80a8a7f32863bf72c762911efe0b41c751c98b3fca1ee02d3825b13c3a2dfec28cf52b2a73c7b4a5f8ff058e527cf102987fef58fa6b72c5dd0c43b382c77394ecb598276705267798b0bf6c1825b2c4fddc78eda2e47c787264dea801de5d8df63a5b0a7e0d2b5b8c948d5c0ce4376cec9aae16683b6e9a8480889c22d22648c3c0b467d48d2a05830ec9131f270888c91fff33bea9e1f127e863d2b7f2c0048960e75d8e1b01c855b2f67f94ad7e261ad1c6ea90aa0ce720ca0f0350081522efe582bf23792a5f301855ee010147a39cb51f8076d9e8638570dbc9c832b3768430c6fba8679c8ceab06803ceea0918c91ef3a782463e42fffd2b9e89e8c81451d0fd9996b08f10e197f7e7e7e5a1e2249d4e5cae5a38fa4495d3e0e91342e4f75add48318e1030ed5515d0bf5202c77f195aeb5f2202cd807cb1febc587161f96af743e2c7791ea7c58feb243ba74a91913fbb0e0a08873e2df50affcb16091a48947648cfcbd1c473b1eb58df081d572973f9c3aea2f2d9f16ec43f5c762b98b5f9427c88bb73cef9047debb8c478622cd64213992d4f271093109d52e697cfcb97ce5ef2849d372d4514f3d732e58e6373246dee5a867191a3c19b38259eee307cb5b700fcb57be7297fc8a50dda531fbe22cfb9e762f3a237c60a9fe248d0b1c447517aa3aeaf1c80b0ea23acb319c2fbc43f6c53c6a474c448549903abd5c3cd2f2a90ef3a88dc22cf7bae0a216ec84a69f388708eaf3d91b6af87288908025d2d8f3861ad59100d59180e5d9ec604fc30d070bbe32067ea859302763204bb7f2d9c59e7e1b8e15d963e2498928a3133cc4798b91e6675d1b990420f47f47dd0f09127ae065847340f2c491daddf8a94d4dcebf999dd81a25c2a4e13406ecc08e97564a25d0ecc17c36f4c57887d4c6bcbcc439722faefad9f048187d901cc1897ba118e4d07c0ae0689ecfc1dc7cab4c5fe96643da3041d31af212c913459a9ea7b3a9c5adc6a4936ab46e13804d7ae215dc21be6ed408173baf569001af236cfbc823b6b5f8bd1879be626e4221a19443e0a4941478b7e16f439cb21121de017bc22760c18812235330420d62108ce0822b082efd9018d9a26f3f2446b208fa01931f9c61e83d58ff60f69cd2f074075cbe7dba94092edf192cc35c2116c3daa54d70f95ece8922f15e2441412ae421aeb24ccbd424c598d73ce04afd903891d4f93a81546b071363b81d7059a646e63ed66439610427843abfbea008904cdf9e28f803600c48c0c2134198c11998b0e00ca8a0420a58f086381c2104d62aced0348432dd847b6b926a4ec082e7debd4e9bb84010b2b6872a8480b0c00620401062d12f343dea4853244078c266b38618dc400e3460c318a460517c7bc04525d02273c23081a13e803909c9e18a22a860084710a106463f4330c3188edce004d00b10ca18298e0d926c50861b24a19e54377882e680cba7868f5a8c813fc57783246e3005c5c184610233e7844978bfdf4b937461928c995be0e216b821b3c89078640b5c7c86b675d4b4d5e1435b1f800491ac20fb2017eb3a4c92346f26590c915e8c2fe9bc7a36f6f314679d9b8e37740bdc7dd5b9e9201e9595c411b962259124ae5eb39218923179c522847b4ee8376f2c429acfde8b484892e619198248493d634f148a3e516846a1f78f11d0d154c38b313f4f6ad40008f429d2f319aaa1e7e564c00c828e2c2ee05ef44392841411d3b82f661ef61c251da18c8abca2222814c7d5e8e9d82387d0366429201e8bf5603ad85d195353f49075623d560a671ab1e07b240be21fd87fc043dc0a02e2b18cb02c781fc982388501f877567d8675290c401676c8c29cd0c1d321882bac6bf968c2c27e8aab5616a5acafc7ba209215345f05eef6eb4da6cbae74f26c4a2728cf6643d1529e8d96929d9e4d76c2549e0da672ad3c9b6be5c588d7592e966723ed65f75e0cfbdaf26c6a0b757936d465a69ecd4c49d5b391aaf8f26ce2cbb379362e5e8c085f0fd85fbc18f1f157bc187e900537f9fa83443c1c82463a0a0989ab2825f489ab68e4f2925e12449240480248bfe887e4e70a480324e2eaf511114e277ea86817fd90d4a0a83353f6626c4518ffa294dd0662c0cd200b16701076961722078cce01a3e9371057420ce160f46c798a73281622aee0632bb280636284a14b8c910822e20a9e2a91bd02702fa96fdb931a347022ae5e5fe031e0026f072ef47b7e5ce888f29872525961793c117106f5f81d71a6e5f1582abbdaf692e9f112c011674e1e8ff36c5c542f77f1f892709e8d0eec1d97c7140484c8a1faeb0cfb05febdbfa8529d4b87f362bcb7743b3a22e2ea9da5cb1157ef2bdd1071f5aed27d20aede4f9d1071f59e82d29d7438e2ea9deb241057efa6aed46ddd4d0f1d0f30562eba2b631eae18e3549c71c832243848c4e381d110422cc406e2ea5dd1ef1985014763c0d5bc18b755adb4053060d016d01e8a8217bdea475403a0b637410db3af38d7b0af3784ea276e986116f413e7d41b963e52cc32032e7e5eebdedd31ab111af6391767d837b4b6b6e2fb3965172514443518424483a39fbe443328aa277fbf99bd4660167106a331e3cc7df73f8d5f766b7d4ab79231b57eeb6ae2aa12fd08b502fa11d520a92d46c5559df7da6bafbdf65e2befbd2fda6bafb5713f61d675cfbada17c3a6cdb25c828642f05748f401d2d73ecb2eeeadf633187be20c767b6f634fdbe708a4ed76fb6971489a94d3edfc518dda9076455dc1d5ae34646c1531e7169de1afad86ecedc263f7188659d8b9ddac959e4dcfbea46156c23b6236e1cc7e3ebb8746529e3dbb850d678ca56c023a6b64d1fe371143a1b8b2443530824bfa7656ed76cc62d88673aedf631aac02320005053e43949770cef5ec10c26728f028a59b9ed23d1993fdd43d19a37dcb503aecd9c93b92a24b1ded2b89510930da38244dbc7d109246de1e26b1508ab6cfd048b3cc80c3be7530495cd99fba20648c7d4a8743c6d8123ca43675b0a84b4f8a25472440e9ec4fba7bae7b456dea60922e75b3b72ec328fa2569fbccc22ab067f6d8afa491c75eb709dc6738437caf5f8742b00a0c834bae7b71dde28a0b32fa0793238c117856c42c21855804ef8a08afc3676380a67ff414e2b913ef336c1e2fbabe2d0257cb083c2b5aca2e479e3eab5a7d9ea73f3a654376bdec9bf318f09408f5c579da18a0b33c0b129c7ca6bf1aed8e82d0d9854508572f4329203f062ed3e7994d4d76f512ef60a787cfe691a129cef387937ab1b0c38e2dad08c262419f155e50fb6d41d416e8c0f6db8268001028eeacc289abdf16c40e5c7002d66f0b422a41830cb27e5b100100124214b42d88be30c5d66f0be2a5053c404207a5b803206d980214a67e5b102b611882114bb87e5b10d00a219ca107493469c2c24efa6d4118418fc91d1bb3ebe9533368ebc026291c46401676dab3752a901dfb8e0e9ebe27a2cdc8b94c2f75d8b7ce847bb0ad8495886cbf91a51c22d996613775d9b7ae74da6daf9d8e8caa33238788e9af73f0682219e63ac358a663b807ab1ddca1af00771b934713c19ebd0d03b8d483b1361c4409f7602cee19eec158998d037426b23d078f124d04dbb8ce748901cef40cf7bc2b58a5df444d66d9447c7c60617fcfe601484ce1c5789d1f031e804492b7c3c3b0ae853d053cac20ea23e886bd7c09c7082bcb70486d6e37ec8348401252b030fc4302652842125294a108495481859da7df46238708f6d7394cd0447a280b5b11e2c96cdf70ebe6157199339d0e9d79a4748e37851e4cd1f639f2f62d22f05192ce904031d415efb0215b9e074ae7984b9cd0550787e6437be932701891021e5690a07a1e16f6b9ddf0a16b357570ebe0908c2995700b1665474358d111041af20c81e8e35956c049ace30db5ce6b92c323a573bc3042178660ba09b7624f2c15e91c7b360c24b2b03f568ec43be62bcea1c1d3f23c4e9dc3024ca4a0e51f923300c5947c0f293af7a0427746405676ac0b1259194ec967b4dba9115b1e88c7caae636ad2f2598c0c3c1676223e3cb0b0679d11b649932698090fe846152259fc0e4f5f0de10f1bcf8a96d0c60e5c7042938691e6e01902524b2c82472b0c6998fdc825b8a275644e8e678521dd6a4824839ede01bb62229e1586f4949848ebfd87a9a848137a5836be6f1ae07a7a7a8a32eec5f727371aa7b88210c29ee64e4ba8340c33db315bbe3e33c0609feff395ba548dd2e74b9f334adf36fa9c973d9bd7b66b356297b4cfd94d9b39bbf852178f75392fe7fd3d171624b878381fe3277e9f9b8c78e33de29cf7777aafad21fbbef74e0fb5aeb3d7ba8c61a755b626e3dc60cfecda1fced8e96f24865d5d0dd952a795130f4fd0a9896bc4d740757eb0c7ce01d2f87b2fc307df93f02fc2f71e8ef2c536c889c19ecf79efd9f71e8d000f0ce804ecf2dd66bcf762c0e962e3be8e7a81cbe836e3c695c4af46cd7d78be87afc5c112b2e8ae1f12251875f670389b4523a01f92261c69244d60d290828183cf99fed5802fe21c4a718eaf87104f9cf3e26ace4f9cf38e79c80e419d786787074ad6a16767c7ed1d4530bddf2b638e4ac61833d3fbe3501c8a59ebc7049bf9a744138a748c7e489890d4599c363b70a8b71b120914427a5ee61ead039b4cea050ebea62bce9938df448bb3a6a9f28ed971a3510f6126024f2e6ea1473e4dfea73833a918263ec5d50ac37836461c94f0a8b89273087539e57cb1a75590697126f7c8589eb39f649961afcfb6beb8ca519eb99ffc6d2dbfcf28385fef414f700f4ce5f9e5282ffdb1e01ed8cc2797cf3db056c1f9e5c27096ef41b10aaf03429ce17bdc897b607d3de53ab0cbda59c7bd0ef8f95c2f9f590e710fac559ee131dc039b3a54ae43e21e589ec7ee5570c62ece575e0796558eba8e954b1ddb75dc9b32f68b7b60bd82738ae9a6e01e980ed4b7aec267946b97566969ab2bdb4a69bba984afb372d3f3e9d833c63db0dcdda4b37d856e360b464883197eb22af45edb46b71416a995eaeb5da9f0b29909bf87ed562a1a86e8d086ce3af0ffbc1de5790563cfddb713ca74aa3645c5a2ae73ab83ca4cd759f976babf0eeaddf376fa6cfa7c46c9e7bfd350d731ddea9cae63dabaeb6cb48a279868a2f38e0eea3a2bef9e1f5b9eb7fa6cea8ed24ea5527631d972ff1eb67b0ffb9bbed1eea89b4ca8f8bc5d65e5f4b9336d5f31e11e589bbe7d25bbe91bcedbca4f375df0a767a6e7936fcff62b194d010b6a5086cef35947c974eddc598ef2949fb43c9bfe227b5195529b4621d672b5fbf2d351d5d6148ac23db0d409f7c05c707629c114a69083153aebd8d1c1d32e7e3a4a7ba13aa9bf3c9f7e3da3cee272f2ece2a5a654a94a5115059e54d779415d47751d97bbb84eeaa797eba07ef27cfa7d56a53ca75eaef2ec62bacee905a5d2522e45246911072528eae2e239f5724cf5f8ecc2bea8b414addbc945e32d995c5c2e299467d42f4b09b5634f3b2f5bea3b3a785af513cea8fa062cb8b0c48e8bab9e4f6f79465da6aea2d25c601d3c9d3a2ab59db26bb2c068d2acc9a2b4a49c5c99cbb797eb5c17d741fd545177b94eea2acfaa53ec59a628152b6843129d777474f0f4e92a1d979f707ec1d9c57b5c2f3f3d435cf356f02ed79172790fdb59c7a99e9e53b0cc5bc1abaec3c551cff4a96714dcc35bc1bbc82f38abdec3847a8f92eaf42c9f721da9bbe09cf21e5b671d279c5d74a05c47cae9f93e751da8a3e09c7a8fabb38ed375b83ce5b91ee5d905f7c0dae5f619857b607db2a7f7b89d75b85c070aea29cf289fd791ba0bce28ef413beb48c179e53db4ce3a50d781827b608df216acbd15bc8eed3d4c9d75a45cc7ca519e4d67c17705f7c0ba7415cc9d700fac537036bd47a9b30e149cb3f7c83a9fe0f756f099c3cfa4a374ed3a4a78e21e586bf8e2f956f0d731ea17ffade02d86792bf88a553cbc153ebdd55bc1470ce3f174b00073c84216902821c9dfeb69896f703d277e6f4226b4f01d4eef1ccda45fe0def33be7d9968fbf94524a297d901a6ece393fe77c901a56adb5fef1d97c437d5f97438404f5b1648572468a515326c649c407231c210a1c086191a4051986621011192cf99183164a2862852b6e204109493c11c4080d3db0e2088f1358c860880a985cf1449124bc2005a59fec872409425adefaf7b89234151fd19329a580b1671510c21b640f265fa096d7a7e5ef90eb13671e122400b5fc1512677ee2cc8b2a9796a3fe3620348b6d5c29253b103eae3f56cb84efca4dcddf63d409a55dd771b45fb8d58257abeb3299704dcd75a25dd7714cbf704bbbe9baf00f2f897653d00e8ea6699a8683d09e9146af3da35dd00ece751de7e5176ed1bf5c171ee2d1201c4a7b28c5453c5aa3ea5a4138a9bb40f8025f8ef3e22f20d00b863f27f8f3e2e227172f2f181691311205164179f102b7e0911378e4c445d10b8649648c34c12426950a1eb97081a191068d549a4aa5c22d1544825085a3ea815025e3d2b582705cde12a34aa5ea82768ee3e22adc7ab90b20158e3fa71fd5cb4f2e2f4245508aa0b850dd451c8a474e8e9cbca862910a47979778f4f282a39166e4a2b944a4e8d2e3e282638e2eab96ae1584d3d282a54cad3c68e7e50548fe9c7e52aa9f5a544245508aa0bca4fe2287e491932327aa942c4a61d9a25249950a4b23cda8456b9148b2a5a7a5054b9767d992a1ba56100e0a85e7747171e982765477c1add455402e78fe9c7e5c523fa1524245508aa0a85cae9a43f3c8c9919394cb2c72c113959a47a9149e469a114a434da489ea41a1f06c799e28144bd70ac26161c194b6b4b474413bc749bd05b75c9e026ac1f4e7f4d3e2f2138b4bc5ad2a5404a5084aaae5a9214c8f9c1c397169a1452d98b2b8b8d02317174c8d342316966b2c2c2c2cb8c54291284b100e0b4b0f0b0ba6a8679ac4226372322606e1a8a8e0ea2363e403b9081a70fbe176c5f637f26aa9f3193b36569c79260025a4f213c916174211d4eb008570f9d4bcec94d441a724be000fabfe1115dda01f51d14f57c1e5d5ebde7681d7040e153381e22b0bf0ea0f07bf8ad147b7208f94310ad97b5785b877193ab4fc8a09150d63e0032176a66aaadefef5fc9b106e533e9e0e6979a19659d56497fd166152440afdb2ecb26e35b25b9caf3da5d64a6bed29b5943e0c6245bd5d3bd46289e24d5ed3346dab6189947ed9b8fac21947bf8dc80f8c15743d07d6d76d5b9c716c37ae2b3474fd7615679e1a585f1a05a86f8ba58b73b0df7c1d628f70c35e4fb61a92d28d524aefb10d883f7183206cc10a26400188f55ecc856d356e6b1b8dbbdd09dccbec76f330be6ca3a169708b40c470be3ac3b712e12011ee35fd27e4e1827da90bc57693000f14915e6fb58f1ffdb61b5c4f5f3c57f61d55c787d6bea3b68eedf76298b4abf3a2b10c639887a76656c310f80ded5e5cbc18908b2be802eeea471454d412e31957a52364ef5d1d0237af161f2fdfa57c2fbe280dc03d088d88f4f423e24192ce4f0d1d4fd38f8807463cc8c8749c43107e7a760fb187a00dc499dc43471c421dff8138f3def143f4109fd0008742c9a1a3cc1c0d9a3588834f220b3aa2ea4714a444d00a9c98034c3f2227b800a31f911340e0a11f1110e070ea4704042b1cd08f08083c00c2112949672829d18a90948c2c91e2821fa0a0c50c2e53a4fa11f9c0489f50fd887ca044bb542838f83c512c2b2aa7149496125dc27ba79a3b898a4461fae38ce9b00812a6cb9bb004d2f45891269a9e2b62a4e54df5a66ebbed72b6dbf76240aecba6973eb71b526e334cc72c8aa9bb8e627abdb6999e55cd6ef5a61cee39d76d4a87d265d34d8f9b0cee37d274734c7f7dd265d3330e679e36d5d07e5dfbf54bbb3775f4a838734b3fc9ebf4d7c539a82d4e2132a85179d0123e47e2bbc1b7032c541ef0e0a7730592497071857a330cd0f0ef2f6656d8d5f849e5299d73d68ae921cd45b4ac74ca2837896718c0467c9d973933077ec67889247b8fa8892574a91fd10eaad05964038a0df18a8ef14634fda9cb45b4dc34c0451cd7d031362145475b9b60d21477b06569621929856cbea7da887830447b31e243e2814f7b800709024fc6c834c9e01f0c2c4111372248d30ea656033a65d0f523dac1903ec515ec8876e0734b72b8342d3026aee813ecb07e444b18f549538392bb69f06a11c55d807cfc5da5a1882cc07b66ca824303133e271abc6768a225b2b8ef842b592732b9da9974069c18561af2b01e424a31dd99cfd111d7704449107ae20704053d7d23b3cca4010efe112d71a4df0c0374ad94ce29658c709b01279e6180b651712e8246dd6618a0236c0a9f6c095b4e0ae709320e70f37180c32ad26a13d5f2ba3c272b1990b4e08828ec800e438258971a5e40061e38810654a0010c2cecba1d2763ea0c8bb5b88a11fa605ea80ba3a24c042293619ad5348c7a774628dcabd667ad2bf64bca0cbbaea531be21d3609c819a867dba817b588661ace0320cb79253c31905cfd16b9a56a303a2037cce920e909f47a960e6ad704985db8653a5a730206f3a10f226ccd3259cc240bce940c49bced35ad711d1d83713f61db3af2ad4951b9a70c81e4ce668debd34eccf662a780b6bc700bc18f031dad0997575cac0c7b8aa300b3470f019b55b77630c7df61b59bb4ce3b40cdb311bc3273aa1942d315795641ee0e0391dd8100e2df1d34b24d1704762ede10da2807b4439d8a26d3fa22584faf1db493fa22574d0a7b89a444b0c7949444bf4c8402c5a120121f1204361e4e81a387a9877481ee24a9e6ae24aa681cba896345a4cc29085f65acbc595b5a7b8b25a702895b5d65adb4386ec4116708f0848a81f910e7c1a01fd8874f0d38f33f59443c5d549a39f740ddc8bab8ac4e5371522ce7c6008c800d8f444ec2822ceb84007407a5ef650213b948431a014d5f014cad066dbee5e36f410f1ad8934108831b2d6219c4c4d0f3870a2a874e2775483c89823de0bbbfebad7d85561a57788b88aef75c2fcd1cf4ee747c3b78a1f7831e271c49504e20a0271157f13072efe541570af09882b0c383804a39022ce3c212371e6085c426da2898e7342211d04a2459a227ae22ace177045d60b8f8ab64fd998b72bb751b4cd8191be3e737045dbcbdbd739e5fce1a6e7db6ed87a6d76693588e87b21a456efe976c3de6e3ab051b28ba7612fb51743e2f9d28b91d52c53f9ec52543ebbd36597bd17e362bbddb83e717cdd68d8a7fc76293fe972ae9fdcd4e5eba66f5d4ae5af371477549752f9f6d77253398afc7b3150a82ecf976e3ab6ddb0cff39765e52c2b2995a76c6cdcb9bf4dbebee5f7f72add8c2e63bf4fe950ba9c93bf7b9cb5df969f7439f71ce6e2eabebed4d5c0c415bd50b8876d86fdc5aab8aa9d8c0be8295a26228e08a54c8d4c8c0c110e9a20524208c36021621eb6e0646a50cffa11e1c00892ecc18800d59943715506dcedfcdb99e37a9e2869d8ad290001fdc04c013503081ea594cea4379128a5b4d65adf63ede227d28403145a429444144bb280424b966091458d6217c3f9defb7046a1eeaaafccabb5cad4394fc9c049ed946d32324d3b8d788da7b5eeeada6a4a2914d97b0f4bf9ee155f4b9c73c0d41594811157eff1bd190653a494de53fa2a6917a9a41149ca698336dc3b93e66b8308603a67669a96653731af9afed10d3bed28fda129049a6e3f362cfb8dab4cab2280e91cfb6a4f3b98bef97d2f762fa667e0320c18323ce4b8b64eebde5f0c1a31387f51ac6971ce81d391215f753a80e1a018c2dfc80e0a171e1df47b9df1c4d0afa6808bfd886ee0d3f06ff3f1634e1930b75233dee7ec9b18df5bbd5884212ad59bb283a1dde3abb875ab907abb2a22ae54506bda6937af3aaea6bdb596e2501c50485e61c131c9869c4ef6523e23f98ce43392cf483ea38ef119aaa6670f5102a8679c6e3bbacd8042b24ce71c3cf4fc8dd4aeeb52caff689a21d54276f053fec6671113099b48b6b1c3eb14fbbdeeefe53814ea55a6f31f63e2abac52caed1bfe51c30a9af2b365cbc7553c4e9c7101a7c555bc140ef75e91bd157708031363e26fa761c1ddc38813af324cc7cc621ad5bed6409fb88289ab18e34d9489abc803ed4e1747d8f2b5a3f17a03710595e8175759a6237d71c69585b35361c1498c82405409d98b33d3da397f2b843a808169ab353d3545a99ad2bf384371b6aff81463e263bed94bcf4c9d96953afaac44b7ee1d47350d9fe20a5234a866d84fdbbdaeb31239c13f605841125f539445f4dea965189dbf373de34cbfcf4cddfc354dae7b6d9adc09d5a9a48d0bdf19f532be4649a70fd404a51243f6e4506bec28dd89a9fbe5b0dc62667d3469d224c90e3a24df5043de3ed3baebaa244d7f2d69f9948debf2a54b221b186552bbbad773bb9eb3dda2fcbd1827271d4a97af73f9badd6464c76e0fdf8b91511e3f8f42b71bf456758a33d7f593ed275daa5efb6bd3af6c5336e84ba72fe1547dca463dd15b1c464096cf7b07c8574ab7699d2a07c39cc5272d4a2ccc20e20a1e07475cc599d8ddc49b2ecfcbe4cccf98f8264220ae6e20f0438d6753e3c59899f66c5ecb672e3584e839f1844bb8d795cee06918f8dacdd2b321b241524f7aedd9e8d06dc6d4e08d793f5bf6bbb735600fb5d825f6ebb2df51fbfacef51db5b1173a3e347c31ecdf16017ad3db8cf9d28b01258d0167c49617ac36e06105e33028d5e906023d64b10592165ad04b5731c6186394d1420b2de00ed506483d9b02f544a9b5d6fab9050f3273a3211f2b529cb140ddd9aca60665e26ee92f25d84f5cd187ad5c766a0119c07298ad3c8301a33a659f99ca331e64ba059f3ca3b22ccbb22cb3c172d2e515159832048d311ec20b2275de112d9499eb0bca4324e210210d9fc967d4a721ced7551b93523ef38933971699fa747da642e251348a47eaa3913883a15c5890304195b0a80c5c3d6ddad5965d2641cb9f0ebbd937eb32d732b68ab82e269de1b71ab2639d594006d4dbb945e71d5147768ec4b61bd9c92b52e44a480d0f034675aa99dbed730e1eb24c6f3847fee4b61e2931a2a2488a2451b4cd3db43db97ced4a78c379369487f5047e66017790b7e7babcea5c93515b973979ea52ba0c8d5ade12dd68a4904aaac121640cfde5369c39d4bfea0c0542082184282594c7ed106e786a81f20ca5bbae71a6d27669d7ab04b221c4cf97437171890a65243bc2994af5dbad5289ab966c594824a4100984c916f55a677f640cfd0a55a2d548d7ac3bc5558dab7a53041263ea9de8fa139c574d745522a390e8fa12ce5c14d2f5a7e9a716bf9e594d9b5a5cdcd025afbf4b5eb8e62bfb85b34cd76338e75ecf70c6b44041d202ee50f18b2ba802576558d25acf270962103a808a17d6100758840160d8840b70e8c2dce1f2424ff60ac0c9dfce4c42bc5b2be59c73ce49a5844c60d21a38f8bcfa21ce88a0a6659db92e576de111ed3276f92929862bea645d24add2ce5b2254bcc3b6bc15e2e8f36a528804b388ab1989e192228a45f60ac0d55fca1121dbc0e5b945911c99cc2d269338f31a0ec99821f9926aded0aae6bf791a81cbf34748cbcf26e216316611575232914913c8b39987b4c21c352d8f868ab2fc894671454554f262c8df2e16c5958c403e4243456a7e5643ce49f91f0924ce30913dd2471b0267ef238f449cb171495cc9fbc4992824ce441caf9043e2cc85e351ec795774963ff227ce046979991467ea115798421a5a5eae81cb2fa9a5bc8cfd7579189c941c57632cfdba2f5d58042e4fa038238297d43971fe2891c5ebe678495717e32d11b83c8b4c11bca4deb015e2aee779c4489cb9ae177122ce082d8948d0082ab9e2c5d822ae9298c49551525c6d1157b0c618639481611264a2c4288bb8824bec11b8bcd3a3411316ad2422640c6c437619a392861227d2e0c41f24cd0f568867230f57abe6e685902c8028229e4ddd0ee37d881c71c6b65e0c78f964b813ce0f12c0819234325b0701adfb000c8e063cea2a5bfbf54b4736765dcbba1c35392e3c840c7c44456b84938933d63e089cb8821b883138ba1f3a094c374839a7b53407edea7befbdf76a10713571e26a9ece7779847cbd12c32084d05a6b2df6491fcad69ab5ac43c59829a57645b90378f496748eb4d65a6bad7d4baecf0be7b7a4afd397d447387b6cbbeb94d2a3b8860c420821ac104208218410c20a8d643b8818e20335fdde0e22b24c0f910307475cd11b51f192e004816387edf9c8c3764efc7bec26ec347984212c33e0862081c39ee190aed710f88298d4f2f6092ec39eaeb0a7a787e705ccbd2e787851a150299cec5e171eb2f7ee490d1a5c719728d1b06d135ce61ac248a4215c8244c39f7496b8a0dfcc5e8c10420821341980837f301a21e3c012213e70b4838d52b1a84c8c89308ac065547cbd4ad554c53b501567e6e30e5a5c45555c45eb82789855a414560a5f749c27dc677c65c5384f52f4a746357c2b29631353c0ce3c329f2a4ed1bf211f21298a77604bd48498087c244306ffd38f880c547436f523c315fdb61a15b770ef2643713c2c2bdcfbab990af76676e28004457954f6e20c4cc1137910e310893885fb0f08693214eecd6c9ee2aa3ea3ec0bb83a5fec7660cf4bd811f1b9b4f884a39f4232bb04c7592638139792cd805d3ac936ee4d986b81388d2b8233f3927b36afa62ad669da3791834e645986714082209e7175a302e2676cb49dbdb40fbead068dd83c154225a6398de0a03cc1ac749341611a321d5cf64eb9d6f95aed11b36eb5d614ed896fdfc437a9f394b6fc61dc01e26b83336e35a68d564f6cab2127606d864f62a1bdb8b22ee0b2a6712794eae29e82ec5aeeaf943d189c2745bd6e9e528a2b97aaf8360a388a6f15350b3840bf550c0f14cf096f280a9e9e91a7bb7ea896937bf53b6c386dcce08933e6639c40bc7cdd6c7000d7e83a673e5ec658a277ab311f31876150ebb4215f27b596d21a14e744cb02ce277b30408268735aec2896dd496b7c3acd3787d6d11ec149144a521a91e8c4b087757e670c7b3130300b84cb30b0968721c3434d0f72099913fa61c1a41f11164b6803f423c2428ace5e0cc9c59504e24a1e475cc9db1470f949d1f2396b193730bb1dd89148fd4da41d119fb388b028d215472e1e1e0ed90cd89093071204555e762fc7e1c70109a25101f25608170f911091210a8bad8538c7e21cd0a7e9adb5873d451031841041e0f8e1a646667514677f65cccb41876c0fae286afb8a737dc45a5503379f536fa9b53863fb9a53ffea09b2399968fa0c6e568b2bd4ec5c2010ee115921a4b3d6d7b3798f9e54bcc48353545145156feb37f4b6ee763268dc051ac13d222b94746ca43ec59515593c4c83242c5851d4f9b6154af47bd68fc88a274879f523b262096aa8620b6c0c4bc690d4368d3d9b5ad65d79b9fde84dd3e0b3775b85dfb09c7bed19d5ee33f6f9ed70bb61b3e19c4d7a89aaf0e91935986ff6fb5e0c98b231ef55c54fdcb667356c3ac39eef8cfbb81dcbbee3b60e6c82dd4bfbf76c7272d874864560d33bd877dc7e2f8694cf3aec66f7c5b8323ca44ca085c390150393232356e084153adf0e8312fdc2200529c3b004ed0c62c8a21f5118a8e8ac6a1a862b5ab58a0eb8a787111df0184365e8dd547145ff83b3181535397093e3247d95894f64efbd77802fbc7ab3ce5ad211932315bc610556a0e08e2189280c4774d68f280c3d4dc050d4b75fcbd75771453fa22a8a14a01f5115473a7b05e0627d2f894fc7cbd4748c2a886058d2f16e34ee7d30eaff8e5f6df5f466c13d2225423adbf3809d65d7e71745e624f0c37caedd4d4d1729ae895f60d2f3b12796b9825b357ef8a6872a6a4d0f6fa879c4d6814cfad9ecf0b84dbfa3b68c5de521c53aafc60c8ae00eaf6f620be4c5c55719fb8624908c79431048d2c82319235f738ab3cc6ae27c0c08a86b724dd111ce2b88943ff1d11194472d7958f159fe3c1b979e8e3fdd0a8258febc18f271485191ed397b3af6c016ec61ddecb05d53f1b027efb05d718e8c88755e9388338f0a0ec0491ad8c3927168f82987fe21ce3c000c5078ab24cfc6ce3c000c5278ab273fe330c50ce01083242c7994a4f9258dfc4ad2c8d7481af99b790486acbe53fae02663beb67a5a7a810e0ddfd30f137da1c7be4b4863907e5b8d6b444f3ce5d0d111f7e024f20215445d188324f2821c6418b8a9c518947e445e58d2b31f9117aee83cfb880a865b935473effdc217a8e009ca420f62d08419844189250000873a0821431b9a708525299802c588085ae882909112a800d285219317b4609484910cdca08537a405254a52acc085235b88a20ab6b3d188b696880b49da9a58d616596100fd88b89045d77e445c280393572b3c1f0e06534c71857a05aea6e69eeb5a41386abdba2020785846c8a72a50b10fc440aa0215fb08c2c14eefc307b22a8e0f0c0309e203abde07b2e8d5415616e19b71da0b878cb9879d1032e65e764bfac20d07901b19735fa9202363ae9c9733e2ec3e1e5e895b13b79e8cf113cae000521fcc85511e6577ca0ceb7c743e827030fc648cbde93e6207b1cf78ec17c6d12e710b9622e63819637fd3b3f893b370f1f0d971e0b3ecf017c641a1300e885b3232c6fee42cf804b76e648c3dc44fc67011b72e63ec65a7bdd46db81594aac03c769c79bdc57dfec238f21a6ec12132c65e6238b6158403b147dc823d7848c4ad56104e3cc4aded110b2163ec5ba53f19738f2293f2c78a57f96359687f231f4ba56b05a5743e321f413819864032c61ebb0f161a70180ac9186bcfd202aefa680501f11e0bcb50a8edbca9932f758fb56932700021da8291ce5e7cb14484fe26661d8e7a0c4016fd4d94d11691c2bd354935550a73c23081a953d0ac158a2dfd88a818d2760549b53ec15a6b6f2d91169ca84988b29085befa1151d1d3196648be217b309ca4b1b0b350a40bd032521ab85e8f736fef27c6b92e7c19b383537f718b03421ed6c7b2ab96d276ad201c3b6ff193312cfb7ad9d33ed68d6ed6c01d0f219450ce5892914840222d2841a485236a1459fc80230821d2d0b5d4d5c2e0a1073274ad87408d02477405255dafaa51e0a142e186e80a53b4a91fd115863aaf647005a12226fa9d6c3359fc494ba22450d132461a5a89c0c5cb05c8cf0725d40264003c242242142d2103e09f26771e34807c31e0771e3440dc390215bd03f68344a08283515e4e18c064135e2dbe763036192bb803d4264a75c5291fadb5d6cec89de20aca532218894f86429a44cb679ecef4a6763b42340fade5a13cd7032fec5777f0b09d174b5dc158612c15a5ca2a77e2b4ed3035bf34657898a7321a1767e0a9df26e3c9185fd7c3c98df38ffe61082bde99df8115f5b43c1deae9896db61a2570cf0d6d6f6c349e927923be5b0d99d4935f921e79a4a77564524f4b6c0377887f5b0ddc21be2a817b170db207432390a6903b45cebe9c791b91202242139a364d15a5a2a9893192871f9ca474abb1c9b8f85e17b66598a66db7b483e929e1b48b3bcf9386b2c9a0b822818bda61a88af64a9b0c0abb158c88c10b42782d84b04e48714a9903f7f6f7f7de1873e6e973eeac313979b5f87a7b95c4789bc6cdae46e0e8e9df165deb8c2370b02dd49064704e1ca105b28c6631429813877045cb1b6732093ac7f3904da404d786e3c246f0f40c010df101828213f4b08c00f29404a106473ca18a351c51c2ba0ea4d50135c0610e74a84313288e58d75b3f9a40210635c0610e7468c24a0186814f144cc0c0270a2658d7df8b89f509eefd569953b14e119dd3b4c69bd2392720e594526e3620ceada9d36a4bab58c3112534220c7ca26062652bdd663c25b8257e2fc6fcdc244073e865fcdc66cc6d066e1a3fe3a44bc8669cc9a19773ce2150d1f174085174bc94b59331cfc0ea755a4d6fc4d7539c0323fc8c7b6d17a88ba884cc15c5b11c650cd18c000000015314002028180e89c462a150341e6af33e14000c9bb64a624897685192e320848c31c40060080000000080c0ccb40a09f0cf58d1cf6d1f7a7da6b7d46037b457faddf45ffa52c17abfc8cad2c16f5c68659fe01b8da4878995a582dc68816a795149ef7dba0b38a365151882f524633825898c008999207d81529b8c4cfcff4b939bdb729de5fa9b2217eed1fb30a6d14883810ede47fa40416c19895caa610544c67385b4783b0cbbade41825672e5674b863518c0d006849c1b8553744402d2468c4b92f41a57eb4246c0c014275fc3eb630607b49baf889a378436a1c630eab37271b25485b7ba3a8b4462be9a506a298c90aba981ccdf6b9217c111e972003e78aaf55a96cad5160bb07e83a59d54e28c89f2b7fa5c465cfffd5eb53fbb5cf50326831137af7eee8206bd8b5d00711517f9e2cdf9cb8e1b7abbce637ec356010f6c35791173b8b5788bdb9b892c204792f10cf790e96b752ef03eb70e0fb777124f2c47bf7050f9240fc229b4cdca699cdaf12fa9e897c565f61cf7e4cfe9db29c051602b0d7c074ff1ac962347025a019a4c58b2a1f005bd65e25d36bfe3f1cf40a1c8174363381805b7c36f34461a7387a3905fda36a791a2c6dba9e95c7e046e176991e56d62b77202543e791572d253912bc1df583560b6db72b56e4c5098d759eb34d13f14fbf30b515981c219ccb822f0af7bae260fd42b09803b4a0e1e9d9915715c9a1d9d0366dde9f30c58d91592311ad5a12f9b5ce92342c09d9d0b6d3473e799698c276a47aa98cc26592bddcf02f8dcb439278c4264c16026365e475e6dabaf825f6f214f8f4c93a98e30a08ff69b04dd7b614555eaccddee92a98530d4b813a491cdabd6418ea2621727b84acc1dbf3460efe1acc18011c9104e707767ec71b971ea1c480a83d369f3a213099e2ffe1b308617a78fca0eee3aa29152d517df51df08d178bb456293204ce098ead6f08a44b9ffc7f1b5a4c84ebbda65033c0d659008ed7c134e3a6ec0d637d16c0d4b485611b70280ccccfd2fe844c7f05dbe42c09772718c3a7b3af1dd61853bb2d9634fd5a0d381ace9cb5c8b406a6ecfef24986bf7e12de9a1b51209efd459fe61ed0e20d7ee12ab0ac85da9ea15c617abeeda82a1303a487d51ef3f0ad794aa7dafcdfe6760d50ff523accf71b821f0651601e6675951fccadf17cfc28819ce3b4d524400df6a0793c8148136b07a5cf4e7407c07f073f40232501def7fbdf1ea5c2bde1fd714807f8edc4136e187a5312cba287f2af2bbbc880fa43c3d44e56d4f10a7cf1a3bf147e3ffdeadbdbb144e66df47822521c584e8e805698b1330ada77c826c4ed087ae0d3862f7c3c45f032d7767974011174067ed67bf2356ce018cb8448cbc6db61eed10d9cd496744ef05fb838b3453d5acb36e50a71dbf91c5decf6923f6e7be28fb28f2f59d1cecbad96f62f44f10ada3865406c93c41770210987043abf6192c3b51a776b9437ba764802555d4f4eb6fddf534ee076aec95093fcccb6de39adee58291a628456005e5131134522b28fcbbc9024a1a204764707862269c68ff62112cba2e0e5527df9e6bd0c4a363cd62375b2f5d443b5f0ff6c992a20e81398089d27cf29112f820ba8c52df4bdfb355e4507bc66a74fb38a71264a6896a745c93210c53753e10b1880352859437e5f33d881500e1219af4f6615600f6c8f531cc5f7d4592de40b9104857039c8ecea4a596c40e9f57f4ab379894ad82f204884746540cec139c510f4c2ffe1042fadf02d5a1805e3d2990c9392ead6b7da67cc5d5561c6d4de366c4b9a1f62d6f652a72d22fb449b904bcd3816f3f7159963167dcb7da99e9195863605b6ef613b3ae649a88b6a216c35f47796a6bbb2865d5c059487ed438dc725bd2a2fd76d150639f09a7bf9b79bf5683422e57e257d8156466a37367af00a710c38f3b14854535f33004d23eef3ba38354c2d64181a8c3c59efa048eee8b91c935f3b0d1f160a127dd69a9f917423c521df697888f124168b9c6ae1dcee5b5bb7ec9ecc2f5880759ed882bd097fab9abf5c4c583663de10ae0408b75b4497aef3ffa1115498f6410c4ad017a34b5a417e7c64638c39f6f676baf81354be3ff7823584c997f212ce4552eecab3eb296bb8f8333416ceba187c2a153c7f86353ef085e1509226a9291f68c47ba725e7048d60314e59aa1fe2d78284bccd1aaa5dfab423feebededa0b059dbc973ab4d24e41f6e1365afeaed9ff38320d4b930b6a4685cd6781c44b8c4b30245c3ac0d6fcd03a1aed0fbcfe8715c6ed7bcab3009e51e4e7c856db13008cffceb19ae37922af83f8ef08e83ef8daad4c33e0e068b70d4048f664a354d456eb4c632a45de70bfbaa4971d0addda4a020a993af09dec3612c1481c99ad43f0854f204f871f39380b76c1a130753b80b68cc9edbfd98448b84bd2183c7e1f6360955353f71ba7b638e40bd62ddd9863b35c778f1cfb94b508400d6de746027fc2624815e5cabb0e62099b14187f989c0de1045731581c822111d90a539b5b8884f72a2041e9c873cd6ae29d05ebe529fcfcf74ffe32dab3af52d2f5e44509e6d137bc031c4fbe3b70b9522e165b02119f3b89788e984c9440d5c264e20487097b71786e0da8b510bb3d30687092d50631076c2124f9927b5577813923ec7364002cc19739566947ab7c1b34e3c7091e6a370b45382eed1b1485fbb9ec28595455ec4edb7385d148b08636bb1c9011eb07a837523a600698838f27b827ea324c08103d72a34cf452e7b4395222cadb119acf9f486672b59f5458f8ea0c563ed39cddd12f6bc411f6b47bc7686b6ff237011f0085dc9214933b60b5cfe5774878ca3562927d87fae78b6ca22321296cc4229c09c5e89f5569b969390a359a593341c7efb30c96ac626ab7a2a82929b6b9319ebdb30c44f493207e3aa4160828442fe8ab930e2fc86ebb5a32675c0974bfff077f4323988748debe60506e60739d44160b41c8bd1e85e700cb29274739a08c36f27cb1951c7a5741173954a7950cd2561ffc58a57a5aff2a29d8e83380732061eafd57e8d19a7f91fd8402c4e57dbc534cff53d228e890c24b547286709c662fda48a66d500c116ba1f7296db88a738dd801dce2b91e009ad5d7b7dc643f939f92b1995fc6451ea873052ea1ad028a8c520fea420ce02a754b32b6ed5cb5a0b044ed5fd4525d1b2b9355fc78e22b18ff7a1598e6c055c0feca76085f2e472798d1cd2a2999a4202b019d8c2c33208ff1089dcbeb5509eead0877d085851cb595611694af8dfb2679c4ab3e1fefef8e02a3335663d996a1f24164279816ea037cb82ed324af58af08c0df2af97312caf2a3e11b628074f50aa8f2d607d46c5cda1bf61742d1770492ed814669c9972e6d53910df4bed385e09525793fbe39fd048afbd62a6072030a825766834767c0b0f46bb00d3099a97ecdb2b785391a8ed4d37860c901bbe8c391c999fc124158ab216976698a6c9930aa9b6ab2408037370dbd296f9033da522270d124248a5e3edb89254ad139a01df01a8a82113ceee718e91c4440ebe5611eb7a80732a6b173211b9612ef00a010fd0e318d9519fb67a997df48f56679b94452544a836a72ae84d45b98efca23c0ca65f11972aef2b8228adb5d1bc9c6a38cd7c022a27f6c84c3cf5d5df3ff123bbb27534e25114a2b113f2aeb953821a6754375de228de89b3baa0155886394d304a11d23340d266e1478a0da542374793241383f23c9323523d391372ab98c45a601e994e153e1f10b93817c63a15b2d27f2b446c2f784f010583adb1261462124b9a6bcb1aab52ae7fff84c8e4b72efe131b070816a38e546ae603f86f830eb12f4fd3ee542d8d3aec49e7d131a6b03de91d09038b49321ebaca2e5e34fea6d56f4263165d5655b3b66d81a626467d9b37eb7eae6270da2d52dd8acbdd910bba52e41c283e95e87200b4d271cf7b4cea0ab0299b8a5b6c408fc2976c72a4e54e5ff12e856494f208c606df9e86d8551a1b6c0a9098b95d576c953c6a4cd60222c7d0c1a78a8840eee8f304b0a3b5a8609e2c52930d2fc0ebd253e134a31a15bb3ce825b308699e47d50fe60449cf40aa0eb42b73509843ba1cf63ecbe1e60b04e2cb368a22fc12bfc5c063b7d05a2e1fea38171b11f6579e6c4f7bac2417516ad09e920d207b190a059295270161308c4c3fb4b0e4c65f424e0bcdd6b34447c0c0f40a7e1eb1c5e4b5244e9eaacbc2dced2232aa2d30242a5cbebf46a4bdc301c95c7abb016fe205d8f4e538064b775428525959d2d7178de2570f69bc97bd9d7d4c572145183a26c172236fe6b8f4a323c98bc91485de2fb56c279c30eb196dc276a574d8759286bbad6dc2c4fd7a95f657fc9a633060854448ca9590e22f33acd8e0840fa252573c82e23b9cf0c63a00890e4d4860e3e68cc8c77ce3c516f29660215805215b866bb46611ad8f6f21ea122488f529ca9e241339188fef969512d255c30a9da9270df4ad690087b834495dd801f2213aabbd04c3c9a20f6cc9bba6f112258c21546a214d8d21e59ee10129a9626f0c45ff2c978e5e3fb9b1a34e2442153d254637a486e468d3ce81cdfea8463eca572f737a3db84fbf7057626110b60ea8fbb399d7996cfef9d61d9148d5685b9a6cbe8c24285990708c7d37d1d67a3fa1313e289fccc4e56f803e695fcc40f9d5cd861f88f072b236f290dc91b517ca816bb571a701568ead016624a0c424f080022e9d14ba3540f8629c4d4e69d902e775cff1910e1ee75ee0b75c773861a1005e05850dab6cb7532e36ff63a0b3838ecad867ec0e8001e4ef03f5f8d131e33d673d593e4d55ca0f9052c7185fc5ffb6359f54fb3a4555f0fd1a81ea58ec1ff3b821b2733a75046c7349eaa83897bafa334a338fa908d2e21f438ba5e8f1c20e4553353572f608d663b1d5d3ce0fc65494bada212b69e772a9abe1c638a6f11e0b9eb4da2829317f647d5d165e55ea68fae9124062516881d55c56c13b3de400df003b21340c58d580402efc44ae2ea990109b321c6742340811876073ad6b56c2c048b34082a0b784f979517c5fd2370e94960b079076c403aa0f9144660569ec7eb9347e3490eb389a8951c0120e61edbeef6ead808a053c86509f22db0681cc0aa970914fe878ae2d08d31554d0936e2b83a973493458f1e68372858caa736ed049faab4d21fc6f40bcf309491e5c0bbc667361e79f8c865973444c1d498e39f4e1d953e22c3d81fc8bde99375b04756ece053911fc3f53e87e840ce49fd6b66098202fce3417d68a6382d8455573120a89d34e472856ffa3bebfc56ba0c2b46920b0b78d02a36823326e2e7e05a813e610933a191a9c1b6e5ea89b0b97a9588faad8ae05153b9f45f3e32cf4adfe2a702ae4f20ef3f81842906cd7056fc7e225fe4188c82627eb85c6acb161faebe97f8e6c68806ecc78bdd9d3666ba71a59c35c120fb6542c4219dfb77db1c21835a7cd03fc2627e4721a78ed25df72ee286dd6e5b46d91665a18fe724179abc283e562fea19ccb69c733369b7f1ca0d67aa1284d008cf338efa4ebc346ea7d85d8f00b6637ac8b29b67a7d6fdf49e1148e7ee6d2e0a9b6f3d89a0ef9a458a3de42fc447eb0b8b5b5cbc7f3652ea7e98d020da9a4af7da983120880e9d00559d9715f2993829393d2ca98597c6a55262fa7e8b7e042c9e1783c42f59aa0ffa4501164398b6b7022d461337ff53af05117717786380fda5a90e04b33759e1513502345fcd1cb114085b149568657724de26d4872739434252784864622186a075ab7c0b52afed865605912acacff9f7cd9e09461a292b864cba1e87eafb4b0cf10ebc4c8adb530da9e7c4df1b78c5dd3cd8101fdbe1f69fe0215d80a1b0867af5fba2cc0b35accd848b40077f2f65aa1d1024ffe187816d3acbdcd601015be2b049c2b8f3d803a024c56f84d8ee9a804ac0c06e82b211bb5ccbc43b9c81bb98257efe8963669e22f978cd9100409a3322e736040521d23f1eaff65c4d893705289cddcc7d3276be50b71ae17fb0a2cfced0c38fc71e93acfa5416550042d27d710ea41e82f6974ff21258cbb959447237460a7b5bb609061af958617f9187fcd7cf920647383cd3ec3054f31870b4a333881e82db3f4c85871543a70db2777a6c3b240b9f5f6df241a1edc795be9f4b52826d68ab0282550a2a2cf504a55e668d3cdac240724c3e137d9bbf6d9178c464661ed3df0a26699a0262bc0e0b148140105723c5e282e2681f3fb38a924e79b624d0a16b35d02acf93f1416e79a358f910989f3747835c0495e18ed7138e42b25b082c1abebd3581518951602fd7d3e1198a9083b83e505dd46ec9be78cae35195a546f1ccef5234b762d77733b9d628a815bf2c3bda2df6dd4ed3d6e90b472a47f6d8fbe277e86878e7b84313843f7b3f1f66485ce1567f3b889b84f259eed893ed8f29f9be13d743ca85f54361adfa48795582d7a6e787263f7bd4829a7f462d736bfe678dd67b94c53f77370864e65d752b01caf74224aeffff4e116d014e977ec59b6212f805afdacde4ea86df5b23175b4944a81169b60309950fc1fa98c507eba2abffdb9694218307345a925c905aef0db38cd47f685cc50cd0b758ec7a51cfdd2d6188c699c35aafd8772490ef22bb08e43964f781cdaf0dbe9ab13aa01e1e12bd4157b59975f9dd56d29f7b509e1a07ddf232bd708b1f453e08e70bfa11f97980d3ed1e43e16fb1af012235f83178abbf1ee4fe596a65aee38d749b4e94ab00fa487c775d8d358d0c6394536050b87c2d6de5b0634273b0d003e02fa7993984105825ffb15d6a7331c11952dd335eb0baa20720f95d93e928324040742aded41bee275ae2a441241053b68df55b10cf45c64e9a84fa63c2a369e1795ad99763e6f61f5b7a6fbc4b78ffeba87bb950c53468a9bb0238d44ff716fb130e39ed892e16e5c23eea29b436841c73d6dd4e2ae3f2378fa0b3938dd2743a02fe5220005c902f549f817c16591655c6b20b80bec2c697b5fedbabf0350590dbac9b92f72b7e3e1b84e5474830b66c6765bb8d4d29016298360f1babd305a4aee37b39d69e02676d5cc4d009d790bafd97973f88cf1f91d2ffae83e5df826bd12f2dc29a8d23ab21f474411b1167041fa38f216eba9dedd1adc539e04c29efc3b594a11f533581c72f36b05d1fc81071fa2e71ea4a141045bec08ff16749d708fe44073d6af9f7525c6b9df238bf1e527bd51a2bdf64af7e93a1fa24fedab1ff141d4c00f5d8efd8f7664fae4151d814f6ced66c1fd4d396f2968414c730c954cc4062cb29915af0a1dc1b1c0e0c706a930cfc20c243307fd7c915aa7668a41ef11bff7355fae5559e7acaf780addee6fb199301b2d056bb7b42869761a006e091b2b24a2a2674c07ee998d683a7f8b2e7d4943fce0155c7279c83fbee1825e860f97fd223d24e0630f66f5f2a5c74d9a3a0ae7cd7fc0c773f6849dca41ce180e0f76a136a8eff928701aa3bc72b317f2502aa86ec41628bdf25a7808dcbde7e34d84f988abfcf731fa976040fb7e8406686c01ede7d6d1472f211e720248b014518467bab0b0ca649136d2d362810f0925b3dc3fc5290c01a00f22f5dc47501ed4b4c9d45d96149ef90945657ae2912908267178e9a97cf8ab15c224c70d0d2b3a3edc5e440020b8004a8639d2b40c6248ab1f42a44961206fe79efdc300d724e17e29d2fdabb67ce187a14faa7d8a06555cc4be7c42498f9a2a82be3a1d700e7fb873f546156a3c971d397a75772b73c51f37f0a8f9dc4669bf7170149dd04445af97e9357f54dad57f2d6a4b27e91a1206d24bf21d70a629462ff5e50259e3b058b904b0a4744f880f6e2657e2de91cfbff927c5decee59737dae6dfd5c7ba4c37cbd414c96e7b772b9c37d2b2951c5101653feba37249bf4c27a45b0f8e0348f86fc3801800a34b0dad2e32481f324e6a18737f0e8342da2c93a705e9eebffa5f80031305b31b5d9e7173ffa3fe6f652e1ba2da63c88be5b01b464793589a63f01b7304d7cf0c1bb68f778f93718c68c7497e7ed22cca7ca0442fc6d77cd30d122db75e8bf2d1e57b23f0c4a543af2dfe9942b843d726eedb2cfa41b819c33e6119dda5b9ac37860341a5c1d1b7999b60fbd4a5f3b1402e47a201daaaafb72f3cbb17241781a860e995f5c10cee2770cce6d12ecb26e38d4021812417354fdd1c65da5ee88d647e95cb8a2b0b0ba0cb63244d623875a1ab9334724c0fd0c0e8f535015dbd181ee250e263b4d1214da85653d6f0b6314f1f18d4e242ce03f320674cdfdc89c261a06d1c89fa25a07e9b219b40d9184395acfc8d8185fb1e314429de20e87a4ac3ce071aec3e6caba007a72930f36587d7cc4df1c56d2f6f380d077c9e6be3aec18027125d2d31627a613b2ab586b60af5f7f46ec1c41555ed1df18abecfaad92116702a65739e333b7874e226961776c9773427f38d86a05793b751e3ecfe39193a3cd36502eb7df4856ea3d85a9fa12e112a87b02fb6aef4efb75a4aba9d8ec5b828abb9086453726a2e282066288635f88d7375bf83f52b4f285dac67b180f3ebcac5e2dab36f0acd4b0d85ecd4b23922c3698a81ae7c83fe09aac9ca078106b26ec8aba279242a394cb0ca2f6a1049a1a5f11def1521742cd2e831f9e66c9b68333d2b6c711ba80270d2fbec7ad5504b4e86f22d5fecbbdc2bf16b082bcc1a8dd24b35bff9709fb2db833800d93844f8a43ce6631470e7bbde390f63b4c6f26b6c3b46876ba007bc7550978b292a8c6d21d65d3024b0ab57efd6660f47cecb722adaf77f66b15eb0012dc24965aa2d8a8db0592057ac8375ae5addb5f7cca546c81e8cf1dec553909bfab8b402fd9d54a4bab749b244d514c169aa5492eab2cbc34794a414801ac40e8cba2f6fd940bf347abb0fde52219a64b6f7a2cf8fbc975490a572cffd6e5364880d2b8d760cc325772c535441d005680f595c83377b1f4803b983538d2522d6ebf55ccc17a22665c1162e34edbc4a80f265df8b8d226273f4e806d3e84245616aecc804d7b389c6e0045c308ca2bee89089d7ff0af760b15f0cf8ea9e85c800b910174c868d92ed3c161382c15d736dafc270ff46c7ddb8a1948f6640dcce94997a283e05a1d431fda886b8e5e86b551dcca7f44b68b69c549241f37e2bc0a145fa3cac44123017621c3f7d2cd6eb518dcb675aed0ce6630653d5fd18fb5f7d52b02107a67d90db670000049c26409dfee0b3c34f80fd413ea94fe6a42e5dafe41333fc94c12cfeb7cdc706631c1f9a0fff2459fbc2f6c5724b7c8e7eeb7526b5d00257257ed00898a808511216043b92788fd68d3e617d89aca287de73c6475135d6e0b4a69df3416cb0fa7daf7eb00698048b160a30c15532e4af99d1f032dc51d4d63ca70da21a503ec0a79bfce781f768e8a10541d0175567b4a18e1477d691736edae402a5250e15b77725d9e1e8ee6fbc127d398115f6a3b7dafe91fec4a4a8577ea37775d77b1687e061bf6d8d335bc7f36bf2c3101830d371c34024437018f3526de414b53f266bc62c2ee6c8ae030459daa50b7c11bd8b723089f905b6451cd2f4b3acc3bd44a31f9c84a08eb82990d9176fc1e90e87eef0d8ec460baa196faa294372d2909e20641387249d3e433aa6c13d64799f1857eaba2c708833f30c43777023431eae6919182d5b3f082ad478844fd3ed9d839d43528805a280eef01e3131bc9c618b83575b9fcd52adf0ab0a8d110f89aa69949885a4b8c6fd68f762412bd04f0c873ee5b7a6677877bece387d2669c761994d87f548d49d52bc99d2f82f380589ff23137ea9281ca1fa4001e0f48c9a0ee4632da525fd28893b3463d545a21be9fadeaafd66958be904fabdc085b737cd5a3bacaa9e2ab4f807ec13b053467413e2de3516449e83427f838b578147bb4b5cd2452a6f64c8125f0eb7ce53e7f52833eaf6cf35719af0731de95702245fb8cb7c5e233aaeb63a2a05d6ab2f807b1e00814fe8caebfe7d9a7630eb1f404d9dfc477d9bb0532c968279415ccb18b8326b2d1b2e62303715a6067bd34fc37b5cfe9f86f4c9a05e587e7c63ef8f2f896fc7bbd9126713b5abea6f477f83a4379f1787660f03be610c4f0b5ec3574f380a03ea7d79138cf2b92d680a10419407f0693a72709aa67de2b30f04ef6a032dccde8bb81f9778d58789aef2a71ab860562aa969cf7a0d35dd55f6cef15dabdf590f7580f9d4fc6a26ea4d227b7e0a0ab20596a6c2be09137517906703062c500e52a046fdebc9db9d3dc1f3c2e039c5d355d2ed545004303c653f3bc0036607850be20604e218a37078a133bf057cb542a401b9fb473af854816152349211416c671faf2b8b9677be1dc212200a4d91281ad2aca8d8c17437e1f4cdd85e21024083af530b840296313ddb33f167c296ecf5c0921b29d4d6ff5ebd1aabd2be112db0f1509fdc724a716dcdbb979b5f19700af93b74bebd7e2ba323871c7621a8d30f91be5da4d94f6680d707ea0c3fd95b4174ea1c175de75073da1a149ba7a5aa7c80044d7bd8993c9cdf49b83b1688cbc0d375ca4d44229bfeb625acc0420eaff64ac3ae2f2f78bf74ce8f65bea371093d45a7b75471a4de4562736546d41d0e081ed555c86da8977ac6df713881e8010f5bfc80a0e6d34891864540d024c08ddeb12679ed0880ca5f26d3dca12f3b92a67b468cc617977270a9a051e50304d8618e5c1b9da001789d696984cbb2675c63e8179ef98c53390a9edcbf51a01ef80b2d8d6bf43d08eb58216d9d397181858c9173ead6510096e1a06031a4ee63fff0201fd2a2d41cf08c8bede58d334b1032b66da13220b9d11ba4663b6c472ae7138e4ddd3d29184454da5490709df5541774f9440ffc6fe1054ffe71e068705bd762697658854c67d30a51fcde6803116e1b8ab59b817d2451a3d3d4441bf98a743fb8c67b9abcac3b53560102892409fc665005a873262c059d24c4a490a2ae74062209dfe6f2c8eb4ce7628d31adc13124d9e5b51d3f223b4a8a9bc16df9f977ec872d265ad915f8177965ad7f87100ee59479a07bb0937eb73e7a4b507e1a6ab32261e2b9a3a9aff1d0dc625feb9b8515c77b50d4bdb297fee7d6f0eb89b729cdea01a55dc73f8a5bc4c8c0c721eb60d49ccfa9f5b22b2590708506fa8408ad00c7f89fcaf168f12ac3324533d41c185ca0b1137de6cb8ff84a324290d95353254c79f32c53222a7ddf5319f31c9928a05e76d3d936119f3e27310064014ca77980095ae9e337a726d749eb2845c8c37cf46768ba66f41a919a0b8f739c6d85bdd6b3fc8ad26c46e7b1f66e39db274d9890dc2fc5c6499b02e433cfaa3d825355147b28cc8a14a1e1b00ab281006ba4fbbf64f2a2b6b0ffcc5002a69c6086bd2ad4bb7f00eb8818a1df1837b757fe788fb95e5477e343dd10bc8d11b3acc55fb4403a467e553b279e01cda56c9b7c2eeb9cac2eeafd4fc4cdb635982402268655f43dca0d86877439e3d4bcf887511c86f5b83ccc868db0775f4d24ca22ebb668eaf7c5dc87f909ae239474166dec0762284e0c69c8d4d1436fe8dd825b56e0a4df2a90915ae7871723fa3f156330edea4273e78a6a89cd43c3791876cf57bfeac44132cdc1f3e2520c82203b98563280a272904279a3c40be9841ec4c4ed4cce424fa0ac21c5481ae583c0b00f2ac17e1b0f8e5008645d9996263f81dcdcb1881d1c24533f5862610a4ae4f614c1c184959788f5c4f3f77a96f1fd9d959af76b31b10fb63e5caab3d29ef1c029673938d537d69e1ffea59c2d11ce646e14c9d3d0b47b2d441642cbfda46e14e9cec39f284378beb582b95f417c0f8be5b770670362c59ec6315b229b6c1de1cd31147a77fe8a5f56563a4e678bbcda640d24a58c83a5b01255c536b899e776634be62a99b66c8f2c4302e6da936e27d27e02023b807f1127aa5a6e3574b0aef256a2c584a28af8d6ea71204e412f9c886fb56bdf26eeb0cfd1dbe5395caeae60e6601e8dd37f1220ff546df7496fd949d981528a6d83551bc17e85942c8170ef0e6f75124a9f8c26f5508bdb795650a8d7057aadc0adb852d9065fee38e30183f76014997045c8397895636d29eb43ad1d5a1505cf6819699ab7bf0d4dd16e1024448e5ee520d1f900d62344beda6c5a1aa2eff19937b6f3e98610636c8130313184ec84d3ae5233bb8371da5246d6d6f60ae48a0b41a90d467ebfc92f898321c6f0c6ef8cefa7ad5870293e1f7fee6d4f4b748006ce0b8ade080497b5a708436e5cb259a63da67eb514205f53a2ea539ce2029becf8612945952cb174451419945238e3ef85f6fe6d8e0752276615064e5f06c37628e07f2fa89effceee8cdc3aa953440d042808165c2b15e25b076ad160b31715f42e2d4bc111cc935995226cfb2742af290c43181e87df8e330b894c09f48c895c443a20fc242574eb1c6045811420649917303c9ad3e75e4eb3a2bb855244fa34d399de5de8f4aead9c793d76b8c62a8a3d5288d03e40beb524f40dd977c5aad68cd94775496008e145847f60ea8cfe5072f1db989e16b96a0e664b333e7022deb557ab087f5114c1b8cd391930b2528a55875b76dc2aaa9e680b7d4c3799a6152de00a35668b5699f66fbb121cf93b255b7079c22cb59e9e311fe457f3b0efc007a28514f1b612a69334f336bb2223e287ba6f89fad0aac8cb5dce1f203db3c20fbd5b8fe7e9ac203a68b3fb89f5fea60e4ef0cb05e59703e9e4a73cdf344572d9e7a1854fd8206622cd706ab1ff313c45b7cac6ed8a8a0e607c5149b3ee933e54b4f47e6a4a13c7b483a0cfbdfca6b98f03d65f663ddd1055f10d7aad5bb6c6dd3bf2339b394c332043ae9be06f2a00c1446154b544303c4047f1f8359540da1f1424b362f6350b6bc6a093cbeba7ee4fe8ae1efaf63c911309b411f07b6e62abfa148726124808f469336fb2a3fa1ec5f7398132b839116470cb3e545abb2d793090d11e0aff981f5b159b8bebd8e853c1c88ddc1d69a8deb9e9eb4254dd1233f5a67a4e6383f865cb47160c371edfaae07c3b2e4932bf4a3d0c4a2a27c85a738e158e562064a3a3bcff88257caa500d5e155a2d68060f85c8f924bfbfcaa878b8ce445371982981a193e57628198dc514aabe0fcfa91bb163462bf23ac2b45cc00d0bf689908368df9b3b587ed0701d5c44d089aa50ae10974b57e57f342f084ed85d70b30177a8fb6ebdc6cf824e5ee97c3811d9296251efbdce43544be88f19544bbc422f9aba56765247bdc7e1a4e509c725a5483ea3b18ffcca6251023549fe70d7812236fa9a021a83b768b43ab0366daa39f6c8dab535c686a3712bec834104b6511dd4352d319bb544905da515fb881dcfc2282d6032131ceb081c7f7983cdb5d1a16aa5de932cfa6ba83a113af50d87d85afbb06bb588a795f39b21021ffd1f7e8c52e68535adcee0e485076ad94952679923889b3835dc8578affdba48d3086021f6394f36d9b8701e6472cee7ac4b7f2b1052f531f89390a8ea15c947e99cc167e200b59dde8fdde764612757e417553ebd57344f4307dd556c0be5bc1a62b9f922697860fe325f1367a787ea12cdb914463aa3f5ec987e935e52547303873dabfba33818b94ca6a451953b48ee697b833f115a3513a8455d2143c704103414beef3787f54d72f30a7309fb4daee109f2ecc95a8d1a29967514d8d845cf0c235e86345488bd012fe0165cbacca39904162a86623bbf6e3539a7bb6bf35ebba7f72ef6d3076c24bc9f037e92030cb8bf4692df57a4dc8b8efe68f464a3cf820b8ba929009ca97f0b2c6798463db2e58240ffd1bb52238c3b3324f3758aecd7352f274ac4ca093812869c65d677cbb597355b05421f1527f0ebba35542a588b7774804b43a76907e40b7b3f9dfc4f0bb62dd243319fef6eca1c374ee8075e6e68a634772fa4cca94e6d7ce77aba8946efc163c6984995a32896aee4a5aca24557547a967e5d852313f1202061fa1e26377fbf586fc2be2b754537a083955e457f3cd6245002390583cd3b35945eba8e1d3a63295048bccba4e11830a071270b700e6a06bd37390fdd49deb2f155ba62336580488f36a962bade026438c1fa6d36fde7c74726e9ba160f3869e1d8c147a28ae7018ec8d21dc23987fb3aa33817dbd6b73af90e0285b1392e20e961d9efa58684a2ad6e1a9ee6cbea83f728f5bfed73b5a3c43e020e4a3184a13f8866535f85bf934cb72210d54ccc43300986c8483d986db85397dece84b35436aac91b06c41df430bbab98cbc921759a264119add75127648bdec7a60d993fa2f677241a958b830ea97b5d76cb127234b1d9ad66fc29a909ee9bf1c528c5a13919b1273b4be6d7271a61b5a1288d3fbeaa299c3acfa5be48ad8381aa21a2854a1b3785557839dd35a59a5b0db74144aa951868c81e762010d6477fea07f2e55c55abd033f1d498dc5d8b189b69b2bcd20e85d921034d7faaccc9880cfd3cca7f205d29f1cfeab7bcd842ae0ffcdf2f1c7a742e075ea7cb0eb6ab1c35bf35b5e8862e13a5eb8580e601123e4b49136c0b2b8e6dec42c228aa3d698a0d8d7e5463ebf029c936e0d4f611af4100ea26e42a8acb9643ed5a23ef12944156f5fef0751943b8ab7d945c08b2f09d57f1494d1909132dc15cd1ae51a30dc170e94758aeaeca67745de1d4b00fbd49570457fb15ed1222ac5842187e650615cbd9d87c2eb6547920589fd25733abc7c14e0e95411d61aa68dba5fca4c3710d8b5f3291fa6d2008045c081150a67b5b5d7cd76fcc43d0ca332a307c4ec796b419059e4ec0a8530d9053b993c3d4c6f882b6bdb67ad0083d8679664b11dfa0ea6de1f77b8c67f42f633e2688d2601783b748897755e1dec2561e765d3016f149c81fbb4c399a413f6708f3aa17d973e05a0351a07b58bd7a20cb22263c3420aa63de60994c9dabaecab8c274dbd9541b2759b6e7e8fa5f8dac263d08339bc384e21b709a0be46ad9aa8eb34f5b81d9e64c225d001879ca0d9257ccad18873beb2d64ea1f154b2ed76bf2becfc5bf84960b71e52027a9f2d64cd8ccc846f3eff5d724dec726dbd7ff17f4c0935a20941a6a379a8b4ba0fd149698f2eb57f6e603f2a1cd885153ddef9dde3f15cf66de483a13e105320ca07810236072791eb1e9cc2290a335c98fb658e3b6e59baf155dc89ed15e63c260468f6fcfe6f6de2724b2a783876f360b26f3be500c1e4ee0014678ac50030118c4d6df1ad7ca2888e08d715eb33d2374bf63fd24996ed6c37902d574dbf22e15031fc4b9802d7c76f1d9893fc384fd616b70189fd18bea8bce1762ead302c2856a094793c24dd03b4c1b6008a2c3e1b1e9ca3bab465009033ae6295c28a5024a5bbcd6dc0a8adf8f73334498d516dbb210bad3c44b26bb4bb14d552e39eadf96bf86023441925b83e1a7aa8e2df6f87c53402314eb5d09e9ce25407b8a708cac81eb6d0eef2abdb73b32da19db8e0a53701ba82c930a7e56ed52f5854fe709d4268f9efad604f4046704afd6703667927ede128dcc210919f69073f26d34aaa6ad5d38763952e6401e7217a735b362dcd1995041bc7010ff61ef59c10319401c9944695c6f9ddca9bc48620a73420aa0080cd082ca6cb1e4ec89f3420289c654c0da0f799c0306f409d02b18ba615e20e2eab92bcf7a504d0a84c615ac10936bde7d7d82393299d0a171e69f7ea8ad8bcc74f7ad94cd6c81046b76475caf1bc2da9bf625f0116b050fbaf357a8ea193eeac676911f7842583fc64b168d371faf19ab0d27277795cf666089642096f4ca7d073816cf67c9daedbe4e0854ad73a893432d73228c3dff6ba6070c2af62e2ad0063431105f5d3253e92997e5ec99cc01063a2757016fd8d1e384ebf80afaabd59848a542fb42352b57c98b405749f43ec1c05a10247f137b1d6900c598abd0e1f6bb52cb46e73cddf5b4719ca48129706c32861008e0318661c0d1085bde189aef809ee38dec731107b76542e33c21150f845a1b821beaa31d5d575d21a2194d20c1a4062f762b765b60b713e96e965da0f04b95f645a2122163b326a5ef97457c449c31c9ea8ba601228b579783755de02c1080fe92e9a14fd089cf63d24eb113716d3d546ca2ef4186a0717feb6524a829e0b9e1945fc860be7e1deb0b26ff22e102d6490490f5d90805b6427e9769ffcabf91f5694568412ca80ca407d27741834a2b3512e687f340b2756fbcc7f30fb4824cca3c9042178cccbedf828e1816240604025fafed31394a72f550bbacbf870b115d30338b3aa8e155e14e89507c1b4fcdea306ff1dcefefcbe54a21953868f610e40177531126aa136914933c5ced501059c6d03db3cfb21d05904f9dc9593667ea5c6d1473731114023972d5fab833d4a65a2b6ef5808ce3a739059954030e0908c3168d201515dd0c7a0437b22052bedcd78196d45d1f0f7eed64bd45c0656a118c2dca65e8bca4c364f9d1e8aabf3f5e900943ce95b50d28855bdc3c5c452fadd7b22fc24e31d2f52e0d4fce85d4abcc8e01ae5c49441f9e211c639e388ec09f66775dc03a73d6c4cce59642265298e89145997a2dcd13367647ad6c4be74faf915a067c9cd06f5914473984f85a0c359b5ce3aa8d35b43b8b1541720201efb66c0d6e0ab1be89b3d73af136f7fa2afeca18a0a7279740f0e09949273373c73b6fc5abe7fcf1ad3029906f4355c3e78be2a128a95b7e882f05795d7ccc9eb3e0d379b2ae468532e799b7c2577822aca93ace8b2e5641745ea7c534f880bfd0b53a32834a401a4b28e0615af656db6cacefc232124e4eea6134436c75f60081ac963671e84ae2ddd06f15197408f8d25b6e5605e3eb4e65aba3e3ff0f38684a7680d53ee795983f421315102897713173920e63d19a22d8c13a989f5fb53ad25ff81f6388ce627f2e9820a6bea24f15e3eaa3e50612a8ce9ab3185ce546521a3b011a2baaa9124bc5522b4d04442a095d3770dd12faab2adf6dd45c7ef1e2d4f2ae146f07db52cdb84c6680ed2fb9eeecca395dd9fb46eae59b6015b31023ef90234983b1f0e3e63d01ac37f8f4b3f7b49638bdac31ad49728850cb0d2a6f76d4d0e016b058fc62668d12c519af404d317d6395a2aabb8b500d61c697dedb492c2d39d590b0a31c613172c1017d85daa8e45168e9eac095316f7ec07cdbec685fec1aaf572c8a618e06431cb8e78c1d6a2579a2886044dbbd947e5fcb571b5f95753a82a0441b12c0a62a64151bb8dae21a8d1cc4a6a156a1f69c6adaa77941da1f198356ad0625218da11d8f92e5aebcee567d58b6bccb7d902f280d15f3725c19290e28dc8628f57ab7648a4490f082640b21ca675c2a560f9f0b5a7d4df2afed03cdfa1435f61687ee7136d3a98fa027edfa56de69196d07d9d6165a39d1e1a4c528fb4a4ac4a1d5db66b7676dd26ed994ff773faaaf8e03e43bb3178542b67fb3c11426760ee41866b94078ceaf5309a666122895ceafcd6e4b8a0ab107406032684325846ffc04b09862b0dc1c31db16ba4e5b78583cc77696f53540c66451a0d7c9385305bb248d32de6259bbd629fc41949a474e5417565c5de913abaf7853df15ad2a6f085696bb2963be71dbe14050d6780ef454c6337846c0e1b3ddce8cfbc372b04f2fcd734d2c3881ac1af267b1f48cbece9cd132b8d91c99302b52fa657442061b80274b6c12c0ff0a9915049f33a2ba3b8da70f6925f9296f9d51b68ecac74025b58ea14b2ae29182c99b0d0e9424d55bca2b811e5577ffd611c5ff6fff9fabd35169fbe3cceb4b6ce48ef6993afb20b4bbe89ba2bc2c2fee2a35fb7b54a79270fc9d0bc2eb98af4cdcce9d3050200e9a220b8827fd243e79819c4e337383487bf4c911fe279d830040f1286ff51e15116ff1875454d7ce69b70dbb870f54073b18b329f927e4ebac5c13c69ddc253a8125260e1a1d6ed1c3ba58fffeffc71ba77dddaa3754c6f8027cbba3ccfb53e062982944585a54863d0d41399f258325c79ed502fa683b4bd22bc1397c49c2406bb11b5a058fc828aa0371d1d01b4525088c1436f36f0e316fe33faa0cf49242449c0975f050a492199a5be42b3ba8f592df06a5b9b44eee21ca0b118b9b83205c70d2520ce7948d70c040a9df19354276c08c0182411659af571ce25717095043887210bd28a6114a8c05d71ef1a61bfc01c75cc91a0729775537cb22e407833645fb342219724c0ccc9d74c1872671d6cb5b822ed64c0cf9e74abb902046f6c6a4b7ee15ddc5074f2c162e3d1b8eb3972a958a52859ccdfbcebd7d56c4ead559889ae10f1b24eb4e96807fdba0a70d14e33f0474c778e223a1f0940f122bc97caf81bba5caf44352d34b0d75a7aa09117e159b00fc562be8991703d20ed20ceb3cc879622b070688959d610e50f1d68b36c0c4d0d303f4556a106a8740f22fd8bdb3835268751ca2f971c34d93caee2e471b39c0c64c1a87f250903b4200eabf8bcc100b0a7361ea55ef84cb8d66a60888238d6da33627eecbe049339d703c6e9cbd46b59459342748dd8cc97489aa810afab49281ce7a343945ca2a8b131dd3a490630aa4978b2bef3d9765fbe4fb5df17baa776c0674dc78c74a0f789fa981df98e74bec145a7468c8c704fc1d4211428c159a828a401ce20fca625478aefa441c4c764d0ad974d6c546352010eab6a04d7389427e5e3a92fc1e48eb2cc25c1c5d78ce66fd187b4bb330af4c0042a78c6a6fb92741d2f218996b49100ca6b07a233e862670b82698c71907c8f57284910d5095cf3fa4ef019303f68e8c9a3554f56557a1ead8c78a5ad454d1340aed1dd3c4804b7f057c5d8c780c03ae1a1a6ba79ad03db1abe97015598b0df43a8c4425a45674da7591316d9858268121bf0cda95761fb05df8aaafe89a2b9105573a2f41c28cb3e0835be59808fecb51de509ca861f0bfe4aa33da1175729251d099a693682c3348f549f9e2572bf0cb69d011ec2e7ef1c04a531612ceaf685abce4888229ed657d05c328fd0b38464d0aa0e975d4d4ff0239b5c488c82536018362bfe5775aafa51fe4f0fa4bc96a13248fb4df6b40620330ac6c28e55171c323638d28969135eb19963ce3313baf355803b2d95308ccf8af47e9cf3cd0393325ac7cbc0d65929210662903012f37fa8ceb1ed574509cb0c46f2cd1a811559217869cda83092341b3091066227573a827aa7f30daa74bce4654afa8dc34443563f9a0e8ceaaf43d2ad68cccd3d4185fc719728c2d84f4b994366551bd26024318f20d3b0de7262fe4cf8691f17068c4f8353501e7914a7bd8bb5f085eb82c0d7106ecc719dad8614bb585537b823db392de93c20c252e7dc731ac44bf6d380f8554ae554f2b5580494733e580bed0877bd3afc48492edf8bb548b1713e12cd995b66ea3843f56d3190952af7168fc998bcf2030d503a6bf1bc86ceaad72e897017a9900005319e67dd0d229507fc3f30860730eb740891ccfa5b1d5a90ce87f0ebed97d90acf9c6e9a2c7548547ca15c74189794ae2307f9a4574c4724b1f9f771c61b43bda6a5e09ff3b258b6a6656bc818aec66fdbd1ad539ef19a0b63c37d3f11642649bf57c3cf292174221c164c5ab73102e9b19a2b102d01d9efbf0f63e0b9324eda4596cc46832f1a192b28261eb3685b38c98ace9482e5759fb7ebf61c34e015f35c4f938c379ca5ff8483239a7f653dfec2b6b53c88fb7d8192a19c0839ada63ba809b66e85e41cd7326efc10c4b33946307ad89c7016166cec6da6565035d7c4a2dea24895ceeecb251c5474780b490c8559a511925003fd1d57a55271c6ecdefc1d3c5a6e0a8a9917cd862a96beaee35191935226701d1fa617071aed75815cab0adbc3ca29145828ee985428b3d4872c13e3dc16084ac68006fe4ea1b72f521fc1b6b92c5888cdc071e4d84a6c5264c8b6435c92e0712baea292e282851dc186e9b712bc5914efe25ce9658fbe89bab2e1a09a64f6af185a51d11205ea2661037b97821128561b276f6a34a11a94c985405887e8f2f2db9024afa19b656d8908844e26e24c448825352e9e8aa37c142a17e78df6a39104de6f28382b09e726a127f5bcd93d4492d99ee4de6a207831c5c56ba385422b999f1aa3497e88d06fb502d5c2efbf76e38c644fea60c28d6ec2b4ea1d28cd89f1f2a088689bab4d20638c2840be658effe1297122f35d29e5a4a4d9671aa548f639ac319aca4ca18f0308a04256e8fbf8c2c0ec698809b9cbd7326aad73f2fb106cd1d80cf121b13e0dad98befb34b4d189725e57241f6d22b72a97d73cbe84e5b41b267996c534e2da8488c4412a3d1c1b1921c48720a7c18ed13a52456864661fc413db20c42fdd26658808d49ecc4d6c0ef757ae6b1341970dc03320627e7110a97d6e2684911b9ac08cf2f5624d4119b87daff9030e6a80c1a5e65ac17ac046d4c363a7275b2e3fd17e251c8fca69814954b5824938bab51db0f0502d59c9fba2a9188b8030418d1fa10a1ce18aa60bb276e09db1f51436b15d82aeebe3a2cc5e12ad9e5768762e91b371ec96cbd9167d5dd75b40a4c4a309ed24fbe5e7e423b5e90c911a9a25a528a3f3a511e203097cc7064b176a21d66429924b68064cb71b6a8692bd3e54f18626a54f433ac94ead8afacd03de902956b8065e88924e13d158c4445f72901f4575c38723df5597ba1a0543008f3309cc1cb39141904e31df8d908d13f146ad05fd1c31824c6e1ab487126933321e49941f8f65da5309c4578a2d30fca7dbc7f9426657672029fdbf945508b39fc6227a68ca524bdb1242a9c5d2d40094a8c6ab440ee1d836c06ca5e102123636c9f3302e6ca79a5bcbcc859edf4a6384836285113dba9242c79de920b62c64b1f723e705a772e5749d5dbbe631bb9458a1bf58576d802a109fa4071593346eb348568fc05707ede9a3f1cbd8f82526b91898b7440bc1ca6ad5314fc6ef360d831a790c8022693054a85be9b250417d3027b403d25f7d81777faa4fd2ad7371a45dd42f338540d121038db140629aeac7c06c199473406081581157c00c009fb387bfc03606052810ca39ea307e7a2fb255af5a33c5d84883472b916ea63b0819bf802cd25e678eb3a893baf260e5b1210c3637001b54fa40230121b206009416801a5ef88319a70b62fae5c8b270cb80dd7811650563a646e97ce60b25ef479085adc2d0f410a049f8e0398341b06590074f45a07073cba8a7f1328b578bf4e4ca22b05ac3789dff307b9b52e4632197e322867c5de20284747c338275211e554eeff681686d2233aa0458656e6ef31e033aa16a8b4a40ab01c2a9a3ec15a4615176527f63f15a08cce61525525b586382bfb890abb3f7e3eaf5ee997f30690fe5945138e20a00ecb29d3dc86fa1abba8671ba52ccec772be985eb5849405d4e5fcd0b8ad6d32dff8d9f74907b15ad186e97e0ab144e18bc7c25aae843221e17c97d209d774947fe496301bb5f0d00eb442b0c840f10e3cbd1600f346823bf912d9ba43a4db812b72db0d626d22a91223404721947107d1711508efa440887799d5ac414f2766f3e97475ba7b1d8d18e9e0423205dc67acc188e515ab9a4cee60ee630ab5a75b21202f44f88f5e7451842a85c1183c11a243a8ba395c695da132b7e74fbc2eb6691f42e382f401f04112417f5dfa5f9088900a931d69964b4c9a000e6b13252f67a4aa0d67a8aac82f443cab95f543fcb321fe732775186bd4332394879d125eb89296c09e3fabca0b8e968c01ebf44ca18df19e81f12c8ec628596a54bc768ab093dc0b12b77f38d3078a6e9ff26d510b78af9740f4ec5a9555215c49966801b61779120672433c373b875d1e4ac02b1f65081f111068868d9445f4d9984000ef984b5b2f0842ac5c584842c79c6751508035107e41fc31743c54520b15f9e3ebe99de25ae0ea014de74ce119558a05db276458392d58f426499e4b68f300df3808b99e16f12608f5f91853be3a61d0c5a54d20218820d80e1394a1336a426636f11966450bd688a853aac2dafd14667a3ae9d4bcc76b384d4d944e90e52f44b97c57114be8a5dfd1139d4955285398561e2cea5969f964a34352c8efb7f2a2a7388db9bd47ad8867fb0f6209c2f1ee47709e75ee34601c4a9b8253d8799c2c540658a1d3ba44d64bb86cd1c3aecfc605fe5930b54732eeeec573501528b7075643457ea530ed08d4cdfe7327b47c9db12c40193a96dcf3a9656f1a558fa130bc5bd35877970d1ad4f0b6a9ca00c9c0ee32e50cc0b5b7d76dc265775350d831a6a2efdc8cbd6c6dfb6d05713ad3b02a696b03215c1129e147ea831f26a2e8b18defb41bc09c0a24ffd6c223040d65dc4f42488f23637dd496b6eda66d4aa80da9bd4b9e033b870be5513580a81e05362dd38d0c2d76b22b043df15ce4c659d840779970aa65b5be0e7c09689a90b6fd5c3ff0b3251478472953a2aa140567fb5a165fa61c8b311b9c8dc00c1d4f9a78b62d66b6b4bcf6d6edcf2e60e604d0ff5d697bd388378e0f84966c4567a3ed36a3d9375be65f1aa06838fb119cd60f8d5f6dd2ef62a335410ab023076d35d485044db1d1ed8c1da23e955bb65ab0b8fb3c962f86513dc93ff98e9569b7d450c34323e0250aca4697a6a3e38077ca0aeff4239982d0a869a4a1d06c5fe12daff95f5b7f78ada8304083cf05551599c84c0538d45b1e37e459101b25e0c8f619371fc0371464f933cf540866ad1d99f988dffb4ceb485439d6da8e953a218c0f754109a56789e368c182fd165b9e7a03a9f776d2a9d6c6de7bdb388df76ad038e9162a9dfbd8af0abcc2e5892afe0d1476a0a088228a38e8181e8546acd720aa1074be10c6f08babeb04f1b855372476a8d35da9a09852973e18c52a77d93b13f05376e13ed640199289dfd6ea3644fcd504778abb12860d17aad66a5bddd5127cf81c485ff9ae594ca55b4b55352fddb5718013e8c1bf4c5bedb21820145fccf61bfb1a0b3124589858080b0230f95afdb8579f18eb25ffcd77b25bbd52c634a5e4af54941f3c585f95496553d1113a1161d1fb2ef69fb419d3d14bd2cde77c831153567f670f8fb0ae2ab85370ef7d29fdb4149b2a3657c9e3c3880a3a9a64682d1e3e950c141403e1247e82bf22ac0573faa7cc4521426a85a9f2d8aa1a780d23e487480ea79dc440cd82ceccce3145f01130979af398c01ee543d415bc9121b1ca9100ed4e6c0e38666612c91ad1ab27cca88808116d8fbdb4f182f83b67ae1278abe1bc865b350455113de3d1fb300a0fd38f7e4ac513324dddb23c2a27b327b807c7c3381fda4fd4bc51b3375bf95823d8f67540150b72b48a885e3ac595453c98927a69876ff0aa05e019b4aa758e61d9adf4e9f2cd5113bad5f83cc6f2a3ab87ce8cdafce9194029152a0404538bdb84333b4e3d0100c95964d517b3a62f4624d9002276ef2c19de1bc8fd504da227e14680fa37aa34312807ae8b4cfab27f05d5e7c79f530d74db7f88cc47cd21a4c99a40b771326989ad3bcbe3aec9734c6f6bc4875e488410bf93e3b5ff606244d03bdab600c62a3bea938728801fe5490c76b3b382afd131879ca65f35ce051aff9d3494024c1e6ba96977f393837e643aaf651ae51ed902c2d91c139189ecfd787948439608c0ec167ad06734b03d766ee79438ddaa1ea9b5c0ce3c0e9f04c2eaa0656c1c9f66d2739a91b7a45e828b745a3562f9b657d4a17b9b9826e5833233d043b3978b8ac08d971197b6433d6cc07b05239262e80f69d9f1559611ee1a746798c790d279171f347d597f2c9424da5ae6e1f44836ddee0014d6cbac0c118c8d82e7b202f7524b7b40610ffcca2debe12994fb42626c4dbe786ec95882c2930890b14eb5ed423a7965aa880217f79548e99d9b22364fac14472bda7d24f312b131d5604324f8efea418c38f32b4a7d026705e26834cfdeb4fe482321e1f57e40be29536a828f0b489714c53407889151aee052474a87a106e14fb4c329fa5da241a6699e9c361d3811cef424dffb5828da1ddd31441f9aca2c4104dcc1cf0c430c9c0e61f9790bc1b5e0f811e4f5fd5bf8bcc78728929153e578fa9678689c315f013cb9bad5ef0061806fe5aa262d70427b7348f022d8823f829cb031ea3a4000c234937b9374ac8fab12a884e8e7baf30b95451aee51b388659fee4c9bf63cd62095dd8d24648e4bf0f09c91f56b5c150356809b6c2dafbf1a8eb9a1c486650714f051e54c922f6962f58c356be900036a69d717bd9469525a58df624168bdc0493aa7bf1d4abd9d25a43376ba9237517a6e4f161d97a4131fa60efa0d5046e2fce7f89b4c75931a216f571a6a2a39a23a3065169f59c63d35f697dd4ab49009335c6101951f03a168e24885f562dac6c4028f04e099ce57b19aa02d92c045e26a88be129f59f7b431e394362d86d940a701d6ca6561268c6b08da4f58369b9453c6ca4f829e5f2900f3627f5e496092fc066f1e9556a130530be38417c4092eacc63865a8fdc2d05a9fc02f2b9f032d9c33e714c5d007877ba648beb542f8f0a3b7ed620275526eb8ae5f74cca6d4e802db6eba4021536beeab4fa5204e9e703765ca453a97a73e8197d2bfb558319062d85d9a61a7f69294938211c0363d2af28781b73a046d092deeaa6eeb1e9c788e79075881c21815c919cc1b7159a84384a49ca2cf2270c1cc62ad000ea2b9ce8c59c251e2ce09585996bc6c2661677c7c597646d18c1b1babbd8d8c1272d82db68fc4aa11ee8da2fed32a9ac2433294cce4006ce91b385d37a5cb8f291d7e85aae70f8e9098296d51c915ad6978616ee10b817d4b3f1aaf2fff51dac39f8ff9272b5db4888a99146d14aa9f080aae54c124287df9ba3fb68774707f44e6ccb91ec6a997f043782d0b7fa31e1173923360009450ff4b718aaa66dd3afe40b14a653852ee7c06f5d317e63aaec41acc9e46907de9a5b98a5daf997bcc79c13da4c5636824a5fe19d6c700a4344669083090645793bf414afad245724d5885e9cef1ca5c5e355c3c9f898ea93c4d8987c8460d59e2f926dd1e4cbc165f5292f4205e4f407d29a398d4b8f2c3062c93abc64ff18bf7d123a5d65588022156d6150b900e24dca4d789223ae48928ee455fd864b015249163e369eb8b48c8b50ae6990f4a37621c68558bb58682a7a89bf548e7caf6e567d31c1663f29e988dfdf300382271b6d90e751ac78ea0dd8e2170c2940608c4b7201e2f2c9248265a3b49a8027c9382c7d88d226bdc0e7873f4275f9a7949a92501a837262ca297741cb042a53513f5e92da3ad4bf2031c8285621ba61cbf144764fce695fd88b8221c339e0222345a675057c61539e4d71a571a594f1698f71b4091ec879a2306431a513b6be4ba63190304098a8d82ad518a2ce9b85a6897b5e8762f50a855d20623e568e2a168d90aa7aa2331a8fc7451d6bb827355acf2a113657310bf9b016b3988278e679148a69e7b625a038cbd257451dc102443fb47042cc2be6caa4de39249e511132d67ad0e50c6e4dc390a0a946ce7382f3879597afe28c9b6a78893f649950dbd8163ecac535b70c977b97d8c2518acd3368003ac560892e74fb3f9654daa010a0d09051c6e8999f18593327ce6b6cecbcc094a4ac6aab67c595feaf9d97051fa29f8b01479b43234502007c3b1c154aa926e9d9a941f64d2a3391c1f27d81e1848bf9253a5101ebf09d5dcb47f9f86214a7feaf759707a35276865f1e3e347b2456ca7b40c2810e3517b903ad9a7dedf572bc2878dbd875823e1e2d30fbb3f1670497af00c5f4279f90701423c574b19477b1e3337b9da2b8bfec92b44e63b04af3bbf099c4cd504397a49bad45f482e55b232165d8c569e2ebf83008f2141686e2bac482e854d237ef4e510264a2903df92868280c07074bcb447daca3ee770f643eba75c418cb7ca4f10f20fca6e489ecfa1a01b9268a39d9fc9ef429c836118a2af222949d0fa0858af7a28c868567e1c47c1c540c3c2ff7560dab5479ac5a0e15377173e8bcb2b3d260bfdefa9c7034b3c29dc7a9f039a4a140b95182b7c4a8378f6a7d553f5241abcb4ffbc717f4bbe48161220741b06df1298d976464797a18c48dcd144f338a8c3ad9b7d8003a14f5195d325bdff8139dfa0f32e5eace54b20237bffa5057b00c902122b8b6d3484cbb11bd095bd420858d3fb828a00fe71bdf2d58c5a67785f03d6693d2a01029a0376e106e2c60f22958b8597f1f608c87b83d801368f7176ea4aa5546449c2f2bae0eaacdc868915c40f5b56accba51877c4eaab5c7e9aa9be2a412862c2366d45b237f20602c399b18e5e11df5f79b4ed7be9e3ab6acad0686421be5f9c09011ea2e72523829652fde3db8424e32f56457bc649cf64ac3341f27a9c3116400b876cc2df158ff5e6ed5fd58d8aa6bd17ea09aed6780b6abc320d1ef702268490da236518eefa8113a230898c9dbdcaa1ffe3ac30bacc84018b3a14a83b431ac423eac264564223019520f05f7e4712f495a034f4345249badabfc1dab213728701aef29b40cbe18f8bc4b78594b0291d36883c15554fbb4a11e7e3f11fee140783bd33c6ea437d0e146372f0fd470481e657159f2e878bd33c07c82a1bd1b705047505e9377d4123f47a3680206f853f416f42dc198a04e5a8b44ff842381d4e7079b914d0d1f504913f2ee17cbd46254bfe0a2d845fa80e480f7984dc5c7ed251cd38848276eb35e5193cf7271d569c0f13e46fe37709308cafc32a3d89dea2c5538e12139d99d2f705cbcd06998fae83f6096247c1531c5b090d2ea2bc37404b12648af9e3fc11714d8dfcd6b6fb99ad648721e6579cf426eb83ebd694de8c8296db29c04e52cd4d654f5c5bdaa5d65888d48ad4ec9d37260e7a9a007f2d56937f8905031c3ac9c488c56a2a1f4fe110798e61f3a209b02e91ecc1503d2d662936ddf97ef67cebc7acd8d299e01a949f4fa7f6e4093834e74030e57843722ef78423b36d6312b7ba8261abec2c91a3b2ef024fb6b0925c5ab6aea24be10d23c39981bcde303eed9cb4c6a3a653648ff688d276ff435512775951c89c5da58e690cc77db7516bcb3f0a44e7c68fd3ef5e339b5641ee2ff215d8e90956a1f3165bb346739e0dd778feb4bc66c53b667201266ca473bfa8263c322759313eae8075c30ff65fb641616fdfa008358551c7c82ba3b0087043d06efa687e3c563b4861017c6da196985d505e4274bef7a0dd1dda02ca6fc87eb47993a9bbbd8575ff866f774bd74e5a3c5d627600bcc85ffa06063820935e87ad877ab14e536a208608779787c619a370adc2335a5f776398adc9a0b32a8337296a1caefae5401a792850df9294efacc58539620c84c34f11eb547cbbabcb943c328183b0d00dd0e00c6ddd4cc6542b81c601d1688e6b6820e48d81b4c3b22d5a86803a49aea4210f02ac28451859b0a1bfa600b8508c7d9211233f0c96c71068a0acbff82f8e459939e911f94d4094b513982d42e5576ff75ebb4760d8d108ac26e3e80b7653b792a86247f42b91552d25c8001384e561cd3388dd12ed154bc4bc71cc099cf0ecec0ab68eee4c124649526069b745d5cbfce008c1188b09521a1bb8d41bd3d2f092aa524c978b428230c31b90e19e1cfed68ed00bac8bba69807f3e8247c340c548d954b5a52ec3b5a84cc6973df60e24d1974a541cc63b943d3d2b3c4b998bf60244cd41e156df91490578c7b1d39cca173f1f2ab0f6b1f1fb0374e5081b3e642bc502c9c2933f84cdd246a78c4fa0d4d9b41a8acb0596d1acb9540da0067abbc3c92ba828ee782126f51c29524c30146ff48a4c44476321bfd963f222bcdecb9e7ae4d70a8792b546b417c4b5381928b95a297a012a1bd4b0e4fe230a137434099736c544707b884a7a7199cb3e4268ff67c9de52189ad21086f37b4696249a6da85d6212800729153efdfbef554bc80aa52f2405a42e3aa606ac748e929449d6f861468b4a14f0dd2d4df57e47d229120da55f7b24b3d55469dc973c4c46348f47b727cffc55e144b22248ec05a8e6241da55a2d852f4de58c56d8b62d7538025e72c31e754c66b397ae512c1e1394470ca5f724c62925836635c2687e616741b676754a210620e571eea3f56f41c1e629435645a9aa06129d1fe47f18da16c110907de466a9f80811cc8a86505702c9349f7e929f26071331bdf1d3f6fc57375608b1ecec883d165d7587a7565b4ae16c2a90960f25ead82735e1b14208ca04265fd89b13cc8b6d4aa423b6603d18c938ea97268a30fe25e266b9622210a5240fa0ba2ca1cd4bc5a5cd25258ce7a64a61931b9897246c7621f35125a41c5781d85f5ed990d808f40d2a1a805e4ef1ac70a121353cfbd344f70afe292b43c35ec06a2f7952eada52a8445737a437914de5059130392e0aec43c49d56c3f72310a57cac354bd1f76f421484c9179b2c8f694a8504dfb37b004e9bf2ff54045601a4d0e5f5a8136650302d5441a5cbdec09408279b60b7f1ad86cee2baf29e6a1b242682ca344066e0d5d3715cb0d420ce8dcbb5e04244277384b5aa32aa8b311ef9d68acf0681993f420b162ccd1b4abd0a2e4b63706e11eea1703086702cd0535fffc393694ec9f6002213956fb88c35f5a65c47e0fa84036e941bf8ede30bcab19a752aa0b47f8987434cc8c9a1b43d3bfdf65058e66392626b3981c6411ebe62b3ef0e75c51b6c97611d76183c55609d33e57d0947887323972e0b3beef3c602f14e9e185af23934a628664615e4a57de4ec129486511ab09c4fe59762255bc0d3db931e2b3b14dbb30ae64c604d7dc3889dc7e108fc360d62b102cb33b7ac8c6ba87566736437bbe05380998b4c2451aa325f233697eee9cfba20c1a619090903b7e526344cd1bb24be89e84dd00ed65166187db93cb7521b69dd4854de4b91e0659e2de60dc430ec8a7b9d4fb754e8dd6beca5fefa53a7050103ceaa894195c4f1341abcecf80a5633d70e584cc2dfeb9bc71f434b90868883f6dc5c00cadc08a927a1c3c88799f66f32b0bb9596e099c1d6981bee11855a426b96828318703a18e86909308678a3328c7fd840fc44d0f3c11d9d8f84852a46e0d0124422b913b74db4f2891a127d7e3b41db72f9b1435982168519180470d3df020e16da369d67ea823fddc256dd063e372abe736922ed688d1e9f828c2e8352bc4bc681de98b361c8dfb240c76b80f8e52af6a5af65becee2aaa8d73a1f8c8459b60c493b02a545f092399afcb708c19064f59dd9c29824072c339dc576d595c97631aeb9c1a7a9199b080b218ddfb2a2c784945ee1b521d23e075eaf34b8ff5e679634cc5c5d13040ee84dae082445abee58bddf05b3f7718b76a035b9f480d1081288b235997b62acf936f8116fc0412118bd6427af2c84aa0385421ab67cee93ff18d9f5b46c1dccfc9cd9ac0b42266770841c87c838123930aa25aed1c8ca65fe03ef7236db78b065324ac06c013d4d674f71c14c226fc8a1d6a09d0eb544401fe68df020e24a588b91bf99d2645dfaaabfe8b812040fe2db7f5d160db48eb77cc440f83ff5a66f24c5fdf3779352ef40369ba3dd76338458bd92ea400c664d947d3ee09111b1cfb03e7eb25805cd69754ae9f8d09bf8296965394ef9c742285ba625fe48a631b2497fa325b5bc5c7fd04f953866403169b50ddaec8b68df09fb583dc8ec6b07fecf7b24b8f215ecb79ab0305a9db717c5ddc49b9437ab5261dd800478b037a764dc19b844c14f03e606be526c5ea78b7065d45b08589763d53d3ea29c77450f55b88fe0785d6b802fa160908f258c9c8502be6bcbec32fcd183149ca55c21e3e4390f4cc624d890eec3d28c806fb9979d1e53237f2fb4e24b2aecb4ba3934cf35833d1389252c660b9bbbc86d9fda5e9a9a42ccf964024232a7b4475d870ce9ddb622bb5299f39125fa233562300a27f03f9765631c214d11342a0da60fe54b1563959360df19d57dfff088220b150d90e12b3e14cc5d0d131626f57c5f489e36d65424a632860046de28059ac04e9623dba6c821825e01f76f3b53a941864045f7e23382143f63a3582350c9b750927f4f2d263afc46b704e370fa37285dfcdc51fe62fc227de05104971d7478ab2ea0b0697bcf8d9bce879ee25f17f6dfdacb7bd2e5844b80ca81770a8a3340c24912b6ddce9e7100515fbede707362dd9c17352dacad4661e1f9704394b9810c141f6144b237b5f3dc799266db89e56cf0510fcb3982e927f91de7a2c16eb648775233007710ea8c159f7c62ec7d6701222ac5aba2c2400b6cf51291e3301a52a2677b9c196857f9574698306467cfa7294548dbfe3c4b2778a765cbb39690e650dfd74949f01bc62e6a56114cad192e0c399fe714a021d916d22fd054aa798aa8696ad59ca6924e4082032a8d322b1c36151b23725581941cb72af807405cd1569ec815a67b0c69128e565ca035b85b41810ec6d97d7d7aea686da4023967a46976b87296f04b01e116405e8eb7d8e9c288d977fdbf443728fe2b00a1ba0f25d509cda0c09cc88fe42cbba243ac0ac10b0ccd1079a6e228560d43d2da150057f8aa35aa40c4359e55c2403d2c0b1fccc987039be7c5aaf73ec868f7ec9f41edfd11c46c22714293b0df24bc95758f123503b24f5f61a258b4d011e0526667ca343c1714a4365a422c9077c2a02b6036a0a2994d09972123d30e8f17893842aeb619be92495a38c5456a06841828092145a18606fede74f0ad3fbf2413e9bb4637d78db54b816104c4aa166f72a7f24affe246284bdc8436ed139b3c425aa3b24417b65d75fbdc7b426a646bbc46e78c64486b6b9177312a4ad453e1dc0a8140585a0e0840863f10c85b1f9b9fbb9ec7065414af3835beaba2cc368e0145208f3d2c5262b1e314318be795265a2a1de9d63bac443e9561f6e87b9d1aa49cee4d4b15ca22e061082aa8e617a8dba9ec4a965e53a524e5953f05148c7bbeb668e22315b6153d492985d2c87b9aa478d6fa86781c29b54c1aa39366c539884e9e78502bccd6b749263c20316ec1f08f27954444632d17a1ec2942c475bb54878334c78888885809aa073502add1bc6e8732c5ad48a086fd42b426aef9be24c7bd108b08c10f678f6c5bf245581e5b69064242e71387fe520084f3c6ddc4b74ddf18faa8fbe00aea7d49f335f7dd8aab4d7abf7cb08e3c4754564b113a0bc6abecf77971d3caa3d5599ac4c4236c2e94e554d72b2a1363f0020587e5c979d341d0a4bbb46f9a284cf3afccdc7bb0e9ce9ea3816850556eb30d15e725374a0d0ba2619c429f15cc345044334290e182b9151f6dd5ba20217a672303a01b2b0bef485c84b0eae4740e775a380c5532746608d23ea6aee60a61c499c58b72c11d28d158f7ae38c0e7bc9f1f229056ded3d47984e5e9d5577cabd4a2f62576ef6576fb05ebb564824768bb73f7ff00190f2397a65e027425dc2ec067361dddee037455557c8f6c101a1c0b81ea580baef588fdeeefc157ac420b72f8c94401ec385f1552546ee27501af002bc406a47dbdca52ddeaa91bd8e01f858110f39f8bc1856a4c03c1ff1900b177155412fd810072d9b001c12f5942f0575cf0059197eaf05fb572efc8831e697edc4ed45385f2eb448be08c4a0b0aa32e54d82a8daba4bfe997de7abf4649d43fca7d50ab8c90d070e7e9e3181c74e3f7b1d0d12eda560a4bcd865b375d63823e7e7b0468a33a82500ab4159c9d6f948a66ef9761c1513590bccfdf29acac2de787b925783b7604188c6c2d037ae9e9a2e67ccf0b029ac7948479a88696d94f79060833f97fa99d09526c939a399452c2a75f792714db5f5a938a2d852a5322a4c800bda10819c942cefce8137ce19317d4b32f6c922a17de8006ad582f5d502c70b158aeeb7300b59f8bb54f9d55844e8ded6929328deabc2436d02787f143c5dd45d42f4a0220164b7a003a455eb467eac609f3f9344dfd1f62d01b4cfd03f6f0761405812a3a9ae6f55a32a3eec8b86224d474b97c853a152dd814ee8916c23ef261336c18059074acd2afb6a24428e489cf9daaada20db9be51f24f49881a2be64a21814a3c2247125e30716bbfd22d7605c9dd964cf16223b030ee720487e856b639cea30155c29825eaeced353d2bc5c0427c48fd535e4dc2765529ab6201bbe251a894521876d21be9ccb3719b3545f1b88ff1579b8b53b663eac0e598403f5bd8e119ca004df2869f1f5ee772f4aa80f9e1cf555ec91103bb0d249318fea1cc5b620598732b393d1a5d1362bbdce1b3bff3d2378ecfbb7fdc953e6689273f06d0224c2fd79e496a568aaab8c229c688b73ad56f48016cc7a9e821accf1b846fade248c8ef9b16f1fced8e1a528670a099f4e44e0402269b592540592380af1d239e3236a7689f3fa8ccfbbe080f6379ad3b436034abf7e915cda02f852b1375dc2390351f433ff399813434994875af652eb1b717f1a5325f04bbd7e904e923452156a34d5bc017c5a0828441242db47e01e6043409eeaad2de74ce100df8d60c1e8f930b0b65eb60ee00b580a896de4158950162b01603c88ee23263459f5cf0a37b22b25e65f468921587c0148b9ee748bf8a2224124b538c1299a1ea4dff5122ce2e4530dffb51d8297277bdbc0759be8fd70e62b50cc69421625f7c2ea1b1fa4aea341b70d0ea73b46da10036ec50f30e8aca65640e8adfbf1a8dfa3256f0a0524583eb3cdb441a8e6c409e352806d940635d3ae6264c436543506e41a1473515d96aa2da3c2224c007aaa6694bba6945aa61db7c7f1d2108ac9d5399b2bf60dc8d51bccffb8812ba98562f141ecb85e3576e647cff58646d5426ec0856bbc1c2e92b11ba210c0b66ee44532dade8afc6012d69f92b0ac7ce2752087f9a2f23e37e25c0682e0564c9044705d8b6cb52d07a9801b7ee64a463a631ab39475952e5371671cfd8785a40ee56c4cd0261ad2348fef8849a2513e90c9b55af2c3ec81bd9c2b58460b16481e70f35d1bb7613f4e783ed2da31b430a79b0e4cb82ec48370c38da910fcf85a3f8b330f00764ce0135e26e2f7c400bad3173a81ca55f379d69ebc0b42d3560be47f4fbe0994573947947758c9aee88a1a3b976eb9063bbe085b171e5d10e26252b43b7c5938b985ae868ce5cdaccc5c158c0a89d03404a724febe63473922d654945ce3236ecadeb4afae49b0b5645c65880fca678fab6042088a72a3ca76fd04a984d089676c09545994cd9fde5c995372ba1993d81f293a56689ac1540e25db55089b6686bfcd5673f2d84d2938540a7813adb54e241462f3a49ef5a6a5318eaede9bf00386322d3fae38f3c4505fbb59aed7de0fd102ddcb1b8548726db7bd33e53bc79e9644ce396c245c6766cec00afc754787088c9d089d998891e821b1576a27ced0c8fd8581f89d319207c4d8758c4b5efbe6ec4a433726be27f0de4810bc98318458f4ac2cd2a07cafaa3c7f41c88eee4fb9a30b58f495a4b8b18c957bfd854e0f9b70b02bc29deaaaf013035bf1107d51be67dffda60c2242e58f8a846a21b9564525d59806b51cc7caffb35b88f9bbeb81ff451dade9a241f5110bd5ce75bed3322f9d67a7d5e3858e197a8bb613fc28216173830dae611947bb8ecdff354337e7a999eb008387049dc82c781b01519195b54856664809e396eb1506eece1cef00f7aee4dc9ed0c95a5c3f5f0c052a2b7700e4057266c0c468648404e05428385313e2ef075d7e98c8dac973c494f20cc080e82429bc386c4ca6e4714abd2984402cfcf70b3c2bbac54560895112a202544d1253a3f3d139f6183262d58ee63cefc43ac10d1e6584006af2b5304cebe5198b0f111d119f49b18f8b0bbe9627ab22bd12ff06f00d3fc867d52750e1f3232fb2d7222391c75a3a614b99737aa0b97ad0c30c8287bb8d1187e2e05f0fd96e66a7541c109a1cc06d19843619bbd3f9c077ecc96f767b5354692702fe18826e069b7b726b6e8ecd91b9a19db628fe8d7a1cf09d70725d19ff5ebe75fd9c5a44bb350fb641e028c325cb3b0aa59b8db2a4466f8505491df28d50f895083c61a60ca1a7391568e9577e3655e1f1e8c89201719726e36f990c336099146608c8cc45b971fa15b1c854d2b276b6c35399e7f82fd7b2acfc5f19402d255f89c89fd0e7c5d5a2fb83d35d40f0c25a79fc9c287311331a762ac44ef7139665cde093d438df8910f2c48abd1ea16097a8c26f32a967a051a80016a7da77bc2be92d20c203c8589324b6596ffd716dfbbbecb2031a20e06c54e93ba67a0dc0b441c5f60660cd253b4f59b1cbbb2261f9ded8a4e4091ec13ceca8d87577d9f8b50522db16bac858bc3495937c184437e330a1d35861511403818aaae143094012b54609c941ce8fb69a190a7c24bab4b22cbf9286e9e26dbe20beb92dc9b301a4500956e97a83a88da899ee92bf550033dbfdbec10e15a90f7d33cd04371246b4aae293dd188e4478a28d5af326500452284598fc9d899bbf265ce655490749178366a453043ff3b9f5573a17efac6861ccb0cdfcb99c10837246b3597eb44928d1ad202dbe26b34032ddcb7047951498ffe594c708be340ff65ca34fbec40865136bc93f258f8580f6731813b61e1c6872c596b0fbfb963a1d201d26730264366d763d8445495aab319a6f2cf52cc3d4e712bfa6a165ec2d1e0bcca08b03fbbe2ae4a73427cbb10859c6ba7049b8c5b61253e22b5afb303f3370f9855258a79387d6d218a1481c114037f886f06553b8f2e86a7e9e9ccd35b8fdd1a649f42662d21fdd1969dc8c55c984e3c1cb2193e06d909807ad867fece788e074630a2bce70c93fe115713af78587c2cf0b733e10dd188bfb77fa8b7ab056b4d3e329cb3928d233db732a09732ec9c949e58112597689cc5de03163078107b743bc2803b51993a48c8e55852dec8de411cbffc4bf0999f24de699dd6ed59dccbc34cf149a6c654d87c01e1660f6f2cf121b6460e8cc74fb26026827894fc7001e6fdf9e9bf8e951903432ebf4b05ade836b9ffa543eef13737637493686cb4e50db580c2bd2f1eea3388d00b465bb460abcb3feac52868bc07931cfa091b3bd354090781e39d1fb0c87d9417a305f1f38618e1718adc6d4e20d5e589e52a082c5dc8b527800a018f6dee2d9f38ec61a411bd032595036b48a6776e4476efd0987f40e0a0e93bc708089965411e87ed5debd8b891cba1cfe4be94886e94401388edcfc42502fc9d7ba756c37bfa001b65724a991aba6dac30514c8eaaaee8aa1f5246c6563373879a971fb65c00f4e2a6215319ce1f36305b566c289acc0d8e66c2486f2711f06cea38a8c23a3defd0c669b40dc651ae052d845af2a87d242802604f7c7abb3352342b80774112d7d822e39e6641a0ce13205065f4d0055c4109af03383edfeec179130fadd8da39491f1936e3545dfc4922831cec9112ce38af18fdb45ecfa7d3ed29593addb5b47cb338c3d26ca6c182d44e33a18350809690bec0122137aeb7447da69552cc0401ead00ee5fed2e1662447649d17370f78f3e3e9fc7c58766e8c7563b0680b9e110ba11b36ff5bd84db94c41d63da2c833529f5df382177b9f3752ed5212fa414d6c642bc10caceaea72c7c13fc2949a1c2b08bb20bb15546c470c84e18abb89f2c1bac764ac65b680dd0a924f8a7513db54bd06bd5751933b0f71363bbda9130bb2f7e288c16edd7cf89eee3cbdd2ffb0f47a2626f28661c7825e42dcf0c1f27f37f44a063c6d01ea3451465740ce58cf0183319c1e86437850972c5e524b6d6ab09c452cc18b0b4c305a65d3bef54d47d7097727c0b6427666fd899275ee0486c33d20c7c89e9bafcd32aa7b08151a6ab536425afc3ed6ae148f92bd534a294929530a5704390446047a32fc4dafe5707fddc4ddd81b0743cb0aeb3d5a3b870dde8cea2c30e68cf81a8acd5662258fa6c7c84b76a9c05d9767030e508d078e09717565f3488ae390c1bb58f456a8d7e081b2d96f782f1b0f2fa5e3ec919073aea990f1135d7dc50d171a1b8da93321f1a9a8f1611ac187ee4470b2bb95113fb61adbe978d8cea665d6a7c0389016f7ab0a21b56f2cf52724ae36f4fce951395b76336176c9a867cbde269b4362eb34ccf2c074683955014a71114b5b0fe96aa8c3f8d972396675333caa2e89f3ec317b2a73466cfccf8c7381ed1e5a4a5576523d67690789b70d85f8e93a39dc07ddcc76d225b7df3368ef678e3fb1f514664bb04da5d585aaaaa4b68f25ee86b432d4937e627238cfdc0cbf994b6ea9e7c6daeb3273fc8c0dcc6ccf000bd482aada4d2996a5ce442a31b47ffcecc8c1939bf9924b72ab27bfb1b799736b6c5cc96c7381751a2dceac9292725b8281b4e186381acb7f72b03c677bd17012712fbc45dc4a37f2eb3e781c45dc8f8f8fbc5b3bcdec23fdc79c88ddff4ec1857d8fa253705b1f45516389188bf4ff2eb13fe31024c4186315638c315e715a081c7f148e598e8d2ce72c4e7366390a9b73aa6ab128dba3e809f6c2ab2a5154cd3967feb5f62a6a92a70275729af6ff14de12e44db758249ba6ff168b2b7288a2c234afc39ca2f8e6906cbc97039104bdc1390a592c1285e1478762281dae012eaa62df6f7450a7dc74a6dcda6e55f2016a82a2a84e161fcde0a328ea3f408d2058b199a82fb1aa10f771f27c6409976383ff4e396b7ec95d2ad9917fa7def47ef0dfa937b88f24a6759d0c8b1041c35462855cd5f1e6c871f6c8e048f183e878696c00d5805f73ce39f72f4f86a33448bb7cb7ab002cd8ef8e611fb72c0dedc2652fdc727597456f029012c224e6f49d731ead8861800e29beb89e0e4093617ae016182a8411f0eeddf581c586f62ae03c0eae8d1e3ed70c2f2f2077fe78c520e3e1f3e35be289a4322d74d0513d4d75c9dd1f552fb8bd753bb089fbc42953f78c0d97b84e1cb59b23031524c0c8cad148b8e6dad970100115fba1bc71fad585fd907a1b62419048890b324a218767848024be71c9a88425d78a09035db60c4fbc75c3b0ccae7adab8e00a62f20b9af116f4624e3e1f3a32ea74884fac73fb82b7060ebc6ad8282501876c851a4bf3ca28cacd4ca8023ab71d39812d353dd70f0c03062108a0e2827de29d1c5637223a6ed37f70b7fa058058d260c02ca5c9801ab32001251ccac01b1a3729ae9b1da00c900bf8eae98dc502dcf5da38ecef32cb301fbe6d237050a00795eea2a59827fb9c9759edb7afbca9691b91288060bc29cad089a88211c4504c1a901819568d8a63765a1acb626a51d3e277cc46e2f0ab29ea30b5639e2880448ee8567132931af78d041e76ea602a2b014d16d80dffbdd0a1c1032adc777714b568a0e88da0c0332e16d6ba796b4b2b6d58796f60ac1584ab1782796097010c69dc35f4c6d175c5e19ffb6503cfe01e1c1b5caebb7e26c2c2153b816300d07471f0c84d536e4d3b70434a2a3389f7519f5523c6d17cb2d763aebda22010c0cd9f1a711307e6d238a375bfec4222bbd4a82ec92fc297d1dda6b4c0083b7cb960aa8da856abc65b67aa7eb61816512f4e3485d040c599c2cbc993e2d4ff36b3cdfafa5f66db84125e5fcc0067b6491f1d8146d1bb5c99fa942625c04f7d0a04f8539f0aa11e407eea5322d4c365b684f8a94f8f5218288a7adc5f35ee8f3dba85a1de2ea4faa780e6c6ea6ec526092e0154302c425f7a4b2b689619931a148ab299399fb575ad294eaa5ad3156028a50a23700f082538e084153ff515c000c831ed79a9e7a9675396113f65b2f880808053982b2e3fe45fa60adf479af496c9d2c25ca1d1eaf657f55cf5acea89372f13f73eea550bbc6de9a4e8c178d1754447c03079a415c5b005a1584c15bc0ea90ae10788d87b8c717c0c250562a8876767994246e886aac646d45d5b224977c5813435a1c76d1155e276dffb0c846fb19b4aa8a57456515a5595a1354d7956a6cacc93cd13c2e112b6bf43fe46a1e4ef4d265c730485563dd8c482fccb4c81ea4936f82f33e5c54712b90e36ffcb4c61e1c36ace6d84f9c35d96404499292a15548ec5ea7fa79e7ebf84148568b4ebe8de9ef5f1f7deeb7ea2fdbdbdbf9ce42e7d89072510bd49e08f8fecb0c56435b6a79e59ebfa848ad37aec6d69833e4680ae8c6acf7509913f5d7c64c9f28415677b1e7d24fbc1c7beb348f1b98ba709e2902529298125fae788a74be01bc948d0c8796a72433881c9e5807a13ee91c45b01a10f7a10c7eb4b4aba2f2929f1a809093712b7d7ebdf3e6b3276fdaa4a444dd861f1a6271b4d51082f8aae1e35c13e430690eb1701a353815e5f8610ffabd20041a0104e49743916638c31c618638c31c62b91dac35475f837ec61196089f782da6ff42b231ba7f26c86da94f3b86bfced89cbbf3d09ea4175639640264ac6ced5924ca68f05daa849759887691eaa2ac6aa4712912417ca98727f510f5b6fbdd37f91c38f6a9f6e8ca6fb227571fdb9c87e612ad41849fc24151e80c3bc5380811f05614003f035c11e5f939cfa9f8bab11e7ec6e9d40818bf2c103e4dd71b73070820820dcad0a68e0040ca01e86440f3a7c40fc770ad0c74fff9d0254fb6363c32d2e2ea3e922d567c84861b16908f1229e1a9bdd07f8d267005366f6bee4f8d2daae41b6cfbafad10d1d1a9b07134f42ea452aba0b9fe4884df72782f7fdad40fdd87774306c5c8f4777faea4d38baa67695d36e73c15710f1113f29387bca2fa6dff8b5b0f0e357767c865b4771d665806db3ac1a54fd04949852de0a4e7762c7e9ecb0be99177d2e3d00390d3cfee2ec2d697b8758da564f158799c16d62ecbfa3fe1284b4b3f77ed450fd50f612cf0ea4271387a3078f1ddb2e470cabae6259b7b4972d789b82aa67dbb889e30bb1c3a7a2e4239ae3593efa50d90baf9c2b9b1afcaea90725f516433c8589cd47426b0fa66c8f6597f5f1675d17d1b6c5cc4ce898c2fac1f47a9a7bb1574403a422671977899edcffc1ad896a4dec2bff25d8c9faea2b01b844a580b52f2932a522116ca8d91e1fe79bc74e725804a88643e9ac84b36f04473a48227a34932e6537e48748c5062b48a95536f74552829c0ba5a0b619a53a406dc20e26afd5a9f735266a653e4df590fbd382e9ed45d98a1e30c83c60d5dcb1c5c3e5e493d28498eba9d3027ada41f7e682260a6fa859a5c4dc0bf061c5963737764662aced441c88e4de8aa23e221a291cede267e6515e8a263508192c5c6dad970a4d9358cb48cd5d8f524d8b87dfde3fd82839cf977973c6bc514b6bb019fd9e063db91f6074d093fb919cbd18541f812399bac01b395a3aae8d2533185d514f5d2e61307fc22406f5b23149796d65af8d23671717cbda0edc518b68a75aece83104d573d46030584498b5154844eb189f1ea322d5ba2e2369adb48736f4986cf02f68421b969edcdf83d9e7a5a6e64b097aedcc48993d49ab5a23a8e38bc32c7dfd6c22eae765d805181f3e49316a98bad6946536f88e6e927b43342148c110af194d18984e55213162bc29d1906852ed1d738d5c889da3a7120c2f1be1097f493f3d7660b1c0eada2b4e20c7cd87da0c97ba32c09d51c0143db3b8669ec79ce3672ab99f0d207ac048bc44d5e12cd1a1ce0b5c3f2fa57ef624a887219329c44681de1518a00d1bb6e6317b9ea2085750eca4352955665418e170abceeb8ac60c322eadbd2daa37b59fe76e5cf36bd954c1937c1bdaf0290a899a8ee0603f318a8468b0960c2f58206ac050f41d1891fc77e0d1e288d107c073e07391c4d866306ee08ddefb5ddc606c3507dec4f3e289b145b33ff1c26289b12df17e030f52d4c088562802c0d86a1f007f41b1a8c1d89e5ce0b9cfa0d88ef896f9d2f63bd0e0871e1c35d0e049bc48b1d500e235f80c3e98c1f81272dce0478c6d065ec46f9fc1138bedd007fd85a127f121243ec40f8d2fe9b1c5c08bf85e6c492a7892101ff46ab10d117a0dc1a0cf30d25ec08d2f191c5bee3378d4f8c28fed487b32f424fe8210afc167e38b85637b8117f1188aad89f165e4d8663f1200e34bc9b1257a110f00bf165b0b9ec4ebd56bf01c689fc1b3c5b664c4a7de63f022dd7b5ff4b8d86ec07a12e3cb08c756c46b30b6ddd8b2beade05b0bbe1dfa0bfe051f35f8a2f105e5d8769fc1d866f02ff8e88d2df62deadbd4b7d9ab7e43b11d31b6c656fb76fb96fb36a841b1bde0498ced0806df62e0db0c3cd1bfe06306632bf4edea5b10df8a74506cc1f26740c400c305c30b162ab0222120ab30d8f9d6b9e8d5a2034ca0733d08dc8213940f699f5b3eea552416ea8900eab530fb5439e2a369ea737a3d5265267bfedee99a8bb86985823c2035621cba8854b31002a8c7201148f948105f4d016f5d0ea94f8dc86bc44dcc7543c0ff0e37510fc8d46ba110638cf10950b4c7477dce1ef5cca4d737f997993c62bafcfded55988f9bff013a9f20fd2a0b7eaaa6378414d214bd21a4805e0edca397c30d21057c39708f2f87ed53b89703f7f772d87eb3c05fcf71f3076e3271974a89cd2e26e869a3765f3acb19c8006c40c1b8d1755646f3032e4a457b66ddac39fdd0699df6de9382f90ee2d1e178424ae6348f9acf8749e833250322c7c9ec0745584b1dd7511bb96a220510154b09ea16b81540bb9f32137b6c4c6e76575d3ae4c078bcc02458aea5adb828d1a24a8f39226f4d00cf8b8c2b2c1e40404d0c18f2da4a5c81445461aa222026861ad3a46a215feaa7d2a202cae80e6845de9a191c88959d97ad137dcd26259e428443c0a32a62b6ed55d5e0f5a8931ba1c44ed389aa862bc6f3be55ada63844e8c9c549e2384c2cce92e83770402b3b918325a5ade898a9d2acaac2d06cb082ee7678d49d9f0da99c5ac6b58507d64248ccce65c3007cf6788c72d66ab8e531be3515ba319abd2c09e58975f0319dfb2104d0baaacb74f31d0ca67beb750724f39c49e85255fc9c53941d82acec1f06fb5aa6959b6054d036994507eba04917aecebf544f503a681d94d7cf545060bdb955288fdaf4d2166e99e4af730f06e992d0934bc7c4e9962c5d9348b7e54df864e86e7ee6ebb9e09776e586a41c4a530be1640533e7b46344e05f6ab3151423423fdc84c514fd9cd51abd63adcc1865cb67dd8ac15e6b1d0c3e7bf2532867ad01109aca535152581f8c0f96732962a9674e4967e165450b855a6bad832f4a74a5529ea9abd6641c63cca383ee2418b6e70cab723d6ddff9b52f1971d4de830e60317b41396e4e303d8f7a84a7142f34433445caa3f649723acb654cc12dd696e2183a6bce2bdf5a85d65a0783269085e5ac6a12983fad2ad47a4d792e48d45a56036455b5d659cbbc4050e2a8789ce8546568284baaa19cbf174b4176476de28bee2927a763e54cf374d05feb60704ea9e768f49c8e9e039a23f27349261d72e69b2f843af439c46a42590ad33039748304738606140b2bb89b57d66715f3e3d49484bdd42d83a6c256b7f3c2d65aeb5c7321c0f7d46a5b371a679c1109092660ca80f2f0e06efce517764a466f533c88dee85274302246441475a623a7cd5aeb9c458c2c880483bb0ff06c8d4a0983b626f3da8ea0d082dedc9880844f38442edba2e6c66fa6c789201e402d9b28117c347d4c47ddf6357f6a1309069bccd2ad9f68bed63b488bc049d5826925c79e131b9dd6c8094d319aafac34a74df0c333ace77c975ceddd48881b1d7123184650c43ad6e79c73ef39423ce788f396618e25ef3da577fe7bef9d73223ef4e4a670254b43d4f14026441d7e2e4a02219b683351b7d3166a0b92a4d1ab083032713b65732e7c3873383f1419adc11073391183eac86969699ac8fbd666aa079eca9696af46e9c59a8fab10d89c95d0c94a69b5f83167eec44c43d0170e15e724514763078b133d9647cc900db6e060ecd2705e3c299b9da60b2f1305f3e77c9b39c7b64a5b26156d49cd457c69d85d5055600ab8e531abfd7cc4f7f3d11fbf577e46586f267446cc98025931136a76e1a4402a4adbf31d70d201287317e2aeaf8b68538ac5d079a1a78256f7936106944a17d00a9fa0dd02a49e3149bcfcbc26cf825eab27e69c73d6290f06dd98d0938e00a8a48a9bf24166c8289a00a0680013190000c070140792204b72c6e47a14800642d66c78503830786c148b03814030080683c260201008823008023114c5d028c68021fec261dd800760964e9eb4f53f7ec868456a5e912ceeefc519bc5dc1af32f9fd07c24da5f40410abd5788f2202531268755e0337da1308e73dc028dfcae2be3707c2652f175f4217e6190df6faa0c186b0e4f08b1cd793342d5258a1083751378a0012c72af944eabad97b6df7cb2a40c943ff17b0ec958d709f88586f3ea0748a0272c3dec87746abcd8877f82266c65a42b49ac1c714f064a95a8698d7eff88da7c66d9e60d2d9bdde4d12aa02ec67e2ef1eca47aacf358f82c9443ecda39706aa37381ff717f8f5dd3733dc1c26bde6ee83104fa23abb2f1d8bc53834dc78a100c329dcc2bcaa9d54fdd9e196d1abc3f554733ad0136287e37515abd77e14e6fa4c2f16a49fc65ac03ba455833eb940b64fc703487728f0447ec5772e3cecae33263dcc55611a344a31a7de5920428e8121d36ec634682a5e802469fae16086c010fa02f5158e63f23b4ab6ae2e255a3e95b315015a052db1a54cfb772fdfd87c712b8c541f4cb69d1b8d51fb15291cfff8b7bbc752468a0dc33f71ca8f1da13713312d46db1fa0062308f4d04680cb0cbea3b60971c2d69546f1909942ec1484408805bdc46a088823ca9077299f643f1616e1293a8b253c4cd39c3c8a5bb524ab41a2ae7d5315887b2abfcd26378178515d7f8e7a054a24782308345f69685862b8e75ef6095ee2fe91d72d6787d078d9273213d36cb12b335663d9bbf8dcd8cf88a40666262722dfc279089a925dcd6dfdb0f491b634bf4451de0350f1877d1983d7bfb67b1f3e5ec8cfe5137f00b02566dcae47e025b7610bd46f4ffc71460aec599c0be004c88ead3102df76d9ac4a74b380fad186c5c17081b4dfb987af691c5493b467b5d24faa62b1f6a7acf3ed92abdf6b17736ad41a17aa290edf21a3a94284cea69f459a16ba5d116671748f2df5a9a743879df3a4ff76925a027ba7e02447d1a81a576d242f4b2022b87512331c5908b6178bbe1b6dc16858d34dc99e73c2286a5a5b2fe64331bd64d3772eb02a77068ba60a28fa7699eec4b16675b256cacd742debe82c4393b48836528120a462956587898e33555f925fc878bd85f3b82601bbc3838230fb37319275b57a654cc7f05671533422870c4901a02b50ac49de9bc70f6d11e5817c28bc9d7beb6d2859f85a2011c9b9d1178abb9b033a035d3ab63d7ef221f0daf3a61677608e6d03dc5f2a4df2b6e501689e26e4aea640b34b8c88672aec035d62fa5ef1b92478b9ed1c5b188898bb0dbf3b911efe6df982c8d3320b50f8df1807a8377cac0db800e4f8f77e033280a2d15a9f0fdf0ab860b3fafca30f350374d6759d01dda2cb5b38b965fbf27763bd8b6287cda75dccff532c8e33d29d25abc8b3e53975e1c17442e44024c653fa1e196ff6a8aa285b610b5fc0bebf426a4ea1c4ee86d3f4d0a038a672c446235621458214c0f3de8d0f497a0cde0460114abe5b2a0b4cf91219c2e3a06511c691e64060b734ae095467de1018a89845d994ef77f203e142ef3d5fa4bfc655eab18f710ea7d5fbc055387db0a110c74f4628abc40eb34c0fa181f0616b94640d95938b13a7fe63d8e34bc7ad03c9df7c381956070746414c95f647e2b5c5036cc7fc55e51abaf92feae905c793a8fd63c85568e0165a43524d36af3e763d79baaa6c807f249aaf4ce279c293fb10c14bb88933e05f426211962f77a26fa2757666c3c01b3559ed9b200da2a467f9514187ab2930f18ab6703aaf6e73effdb20af43c69f503ee8507720bae004a5656d73966c8207be59de893046d887b018e97b7f4ea81e31956c8e3b9438327d2fd691e9576f60b342d72d8abb62aec509594a87bc7ade87fbee33bb05ad8685aa1593fb0fd6db7bc9bcf905b4eb74921584e45100a3011f0057577461828bf2ba8ca183ccada234fc3f3c0493f0d3075a49684b3f748a1982a0b8f51a6ba679a481fc9b31806f850ed86f7669399c60833347e29ca62704c3a7f2869444c5d6f38c9b09a4caddf9e9e98869f926018d11be6a485c3d9d946f001a16bc2647bf9d327fdf8ae0209600f826c69902ced8383d5a6f10a923d0b40bc110bf36403d97a5277695aaf5cac54b97a8097aa1cd4661856c9e5212984d396a43c85511679a969a8b433a481584b8bbc09dde8b7c81ad59861b7c893b915db5a356610063dc1db709201d2f2b9d79fae17de2ecb99726b9b8652320df378dca00542f79718ebad16f9fa34cbf44aa1ba4e7ca27d94a0f0bd1d6b8ae15c7652ee6fbb255f243bf4bd58d227bc13ec9fe26b84477dddc697ea4b3f893617866790837f49a5629d51af65fc4f1e57ddce544d0842019eac3126f8982f740513be376f9cf1c2cf68430a5802adb90cc9d7b463e05a04a85b129fee9ab098cee3f7b1213126c7b68ce262f4e1e038400063b76c4c0a253409f7f718530b9cb2314b05106ebac952072bf39f10392575f98ac033a6f7934fee62659619e62a693b6684a96b9e226c11e991bd57109117010e6c986528f26111e62e6ac0ea97fd12f2e255137f8c035609e1c6ba8eb2829d58452459fc9b03f21265d6f1199c87febc3a6708fd08a20ee7edd46dd1dfcd1ec73d82617ffad93f6ab423c290d5ca858e757f740167bd14b0308d20a555db2f881fbecf20107100652acb7059b07243a5a65bde2e078a16ca1baded919ddbc623d1c90bfcccc5daf370eef09b50a24d93f7f2a3c0b68f45acc7e3a1658466bfdcdd1837bf76ea1cdd717afad4ae836d8c98e4a0a0a31569f5d9cf0c537e41170865c2ba60084129ef4c3ad0c32251d7c072e2142cf108f7d477fe1bb5a3ced73cc5608b470d502b23387f4886e88cdfe004d6a2f552f316ebf644982802b968bcdd6430038dd1390607c2fc6dd18241bdb310840d429b982bd2a0752d3c403f565b6bdeb849ca03db159ebd74f5f9a874d0cb8a2776194ff2a0895305cdaf2689e37c67cb7d41bd58093c21bf737b12131a17a36a152b4747c0dc98d8756876f6e89e1ca962d94bf96915f0c2c48c0801cc18004f0391a10987965966f82198535609b62f23e7327168e23b609a73752d6937a988174c2f66e1d94814e8d723193e702881de294a314a12b8a249166ac6b69a23fc96992346ed845a83117931488424fdce064439d9920e7e33e6784a70191295bdcdc872ed546ffee4aa1662efe5c2237779c01a12b8e2ac6f50f3e81ef29a07b158b764ee4272a42216287fcfd029229628a80e4fd9e89c3c19b678d9abcc72206948e97eb6c2c7896fc1e71ddb4b5567c931845f0aeae52d0a14c6136ffb0c180ddcecb9ec14ea1e669c16c4156951a0404208ac6dec9def17f42f44cdb0d94ac24f2a686ab4bb557bc72df0a13a85e31ed30538d8ec843ac107c9665378068d554948ee6e6d14bc8abc525df512e537b4bfbdb9ea8994e93c31b8f46cfcbc6163d3c940361039dc5b9463ff1b2ea52fe822a3179c3ca1138d9a2681e02bc71682b6c0623bbee24b64cb433ef6524663726cc5a07e3c5d033df2f728cf71f1a4e4d841664b62e061366d766c318f150b2218e21bb1aac0163c8802729ab409c3f73acbb71e6748cc777168889d1995a9802f63ca38261480c400c0219e404b53026fc2a3c5e2f08f1bc6b64445f7a08a2c29825430c199660e9c48db7466b0e391170242e91636918e0c5004489e188fc62c6befc20b321640f7aaea7da1c00f13d04b2407ecf3353d93000715dfdfba0bd25df9a51804ec3298337a540a8c592520d606320a4b248b6874c9f5c95e0468dd8b11364d3425052af893795104208004276ed8a1390a673b9d375142f3a956c08156f5869bb875c8d0b35f63d96ca2ec1488517a6a6e61ea439bb01129b083946a4b728b8def7f230828c9ec5cf91b8f994ecb41103c49538e65c0ad3ae2c2967b95528f5cbb504279c228af7a15fa5932807c03d9ca7563970ff9fb87bd1728760fb73fb37fd90911c13e1857e14ce3552ef351eed0d5d8cd62577662ef23ff2ab9bfc61e68f52acbe628c1474cfb1f5ee5505eaf92a9ae5e858bdbfbb177af425f51dd96fc47b37a154aafed3c57d87041d8931d33f0e1f72a34fa3155f1fbedab642630e6637915024b27f6f52a3451f0abf85d062bb16505812af4fce7abb87b0e4d62ad68b70a511ff476c19a316a63a192cbecc52d657140afe2202acadafcffb057f16f18535276b0337f393d0f0cf70a9d6f885ab19434016c4872530a003f82b670cb129c236e875ee52583c1ca2aa1e3434842b86509531de026735682bf222bac6c2d25f18d52e4ce56fb2071a6ec1f5b161ad1fe140db3899ac1e79e46f1fc901eca03534bec1f334bef333f25ec3a7cd4424f50f3a7900da0d449b7abfe87e3bb8ce299aacabe9012333299f494647365eacb4006b5c88d6bca7d52ad6990f590de2e41de72d5284e73889456345aff7374c9725fcb276829dae83088420d1c6dcdd3146a9daa1c2d2cd5ddc0fb274daf66f775c93a8f450988d475b905808579fecb36c26fbb0c537162bb603ad559761b50ce7a6aface280c1de22e9113e02d078ef5b2a01cfa8466ad99aa891ab410c6a3329fec463c56476503d8be6d830e76b477a38366a968378d7ee102634265e5d56f7a4e4fb4263cca4ced1eb7d9cf18ac7b1a104a526feacee95e172c3dffbd4d8dfdb0b76a9681e87a16d6789e1dc45afe50798c9c7cc59847ab010445a593a3f3ace4a4adf9088527922136bb07dedb5e120d4a2a541671a16c84c51268cd0c466004608c4d602b1eaad6baaa213e529a6bfce6a0a42130bfe3883688ac1b4c57aaf6fc11848f5a2a1ef3cb4496318248cecfd8ca327c1182aa67dea5ed8a471f990121c941b0bbbec2f68167e9ca998fc95852e003b70dd2704505ffd0c6d2139c52bf131b2d7901d66e9f64493e78c2e30f96c42c886e8744583110d66603c2e6590b7d38ae9aa9f046244eb1298ed9ffbd03c2061e5b6fd0543f0a7a2048565550c86639bf898cbd12bc680aad5740a8044b0d12542d03a88210162c6c1fcd1f8450e6f9b742fb3686ba7cc35dc1c864169ca46097ba41a8865d8964bd313f176791630b73fc2a5f287eb43e957063d58239ddb1a4e0578d0251796970eb99e67583ee4c08b1086bf57fb1d11146bac38bf51156567edaf39577dd3e3314e991dd56be81f08e9de26d21e5b453bfff7cbc2d0021881e0cbb143d41181950d913b165179bd98b5fe56d450c74730256f4e54c92b9119ce602e1f3b64ab2cbad8b2a0029f4b6eebfb53d88e76dd18b5d899c2d372cb7a2fd9a91cfab601e7c9c2d92224809ab86320ef44ef63ec7a0eec96137d4ae13fe4fcdb151ff6063d7314466407132ddb2de4940b14bfd45bbdb99c77c75d96849c5dc90c1ec588dbd498d46de1607a44503b2fbe4ca5b2a2b1ffc57081111614a166207a967ece1feab56ec74e7019146254b7ffe7d5ba553f274d136fccc8614b0d5bc93cadf75db07e6b9ac4ade8b01a52cf8860c3fbda32b3f43215c6d8f36cb8b89588e907c7c23c376cefb36f94cc5a7259289d7d1d4295bebf8e2371d3fb437b22af48212e8182b280d9607dd9f324b1abac288ec791997926d01cc64e3e2ce621f4834f746cf0aeb6460f80bbb87015a2226a68c8578862ecf392d0bcf861a954d5ca82bfc05efee7a8f5913ae6fc13cd0e2d75efef65872a1b4161d09c1a3bc3326aff499a7b952908bed1191006485afeef0a5c048af4f7c5084c2085c4e85815e45abb39d4389645f00550b2db9ff95128cdb68b1bb7f8804e52e8cee67d0c07f56aae52b18ee9efc36feaf9202d60b38183a715f76b4de9724a227e00bd74ba0407123cd89916aecad3ebe3d4e27191dde29ddb8ad95400ceca354bb908070a918eb2c278636b89951ac7a1eab6afe4414a1160eddc1f7d85fda946cfa78b44b334a7a5954cf193a48b72136d088707898bd9b47fe335356095ba4060a94dc4cf461931120cba6162af9bf6aaf2c354e8e35ea274dbd112c5aed1739cd42991b52fcbd2180353eb31e96a0b159a0357605b5856ec1eda93af6458d295919a7299fdb58c3263c24b58ee5c42232de060d1ecacc37e609c2cbd6749d3410b86daee728111a7603590387060d26932dc51ff4fd19a29e3774cf15ff4adaf5007f07d16515fd8451093f1752408c5e3935bffb099a8b4b68dc5cb3fbe5abfe79f535879976c517ceeaa2e803e3d8abc5394d8212067cefff73125a4cda1fe42d07089735feaae3f03c220ed8fb42ab5df1d77ff737e21ecceaf77a897e36ada8ccb5555ba380c2231501c493f1fedcda483dc10b6f57c1a139fdd8cde69a0ad0c4ef0964ad28a20d834b5589051b08eb79aa19d6a0a8c9709b32e6fdc302773ff68250718cc520d1a6aa8a7b3972285b2d1b2f3137f9f2304e6ffb2241688f5c2cc61ede5172c6e86877977d4940c4abb99fa18289fa0e39e94f1319234a689bd763573040292f2bc7edae4ce6edaab1a36693bc0c66b83d189871d42bd227343b9e4d194053bcd1c166b3f74476deab7dd5ac69d015f9c4a81f076577f52375dfe549c01d2868ea32faa46912bd10c11b8443be77a0d2f83eaa964d8ef8026223e11e25adc702c8054b15b57e8e097dd7dc64dfc5824c24d29364e2f28cf88a375ffec97b48ffec89ebec8f58bab02e8c805d346ece2c924ef222bc421604bc0576131e86be13bfc198acd61a8b233166bf0bba9d0bfab283a52f116303c2571f25792e3a4a75ac41e1afb7b50bbdc1ee8f4a35e28a5c201383282f6c7ee172bd520a62eb28159ff97fca2c35a1c2209b240414879ab93d19da72e5cb423fddb9f9f7289d6dd156cd52598f19913145557bb03f918b7e0c6b15ad56555929a9f831bb25f944c88d34f36575c4f5503af7d1e4d57414c30984697baa1626b5867cf893c6dadad444d6d3d2af34e2986335a661379148c5f5c7d4addd06b6dc8b65f6baa515124dadf5a1238439e6b130666d4dc659ed991674f4de00c8e28a6afc9f8eb78ca986ec3352c30a42725eddb9c4743a6800b7042028ea2ee832bd45ed0ddde2cad4e0e632a9ef054a780513770b5be9a608d1909ef73b048267fb5bebeca97c216ac3d069508f7e0a4e7b2ee0fb86df4d5f8f77bc7302db9808026d29654d3b96dcf1f96e0692381bd1fbdaf68d8c317b09d7cba1f5676069d2c0d10398da36573273f04cb44773dd722e2fb8fa1e8d431cfb0e472d6c04f318fee3746a03852190ae36d32c48cd1812035ce37a49ecc734b10a71aa92892c380d9aadc084682ad087c59abae515421fe362bf5cac613e0d9699b11b53f2ac19e3a38299a803fca0c05f3efdbf080a1e64f8cede418d389f2c89839de244ef074f59dd260983dc925db9b751913e60868e42db39b964c3c75ac6cd5e25b5bca2d93f2e2bc027bfe7118c7cc1beaeb2d22c53133191af890c57a4696b9d14fbd18b3de93204db8c38be982f520133e9e0d39f378fd2365f0d7218201f32d24ddcb55a404d998d0b59da8feb8afdb6dac90f49b2aa8de995e4821fffb16ccc7fe5fd3dd30c975857e58f6a63990587b2bf5a8df60cfcfa7bfcf5fc3f4498e96eaca33d4a1c987574cd74197a618fa40326eb201b879679c6a5d7fd8b7901d339447d2d5b475becabe196e91a1341eb15fbe75e4277de4fc34ea0a3b326e4a21a80fcce909806b157b002c1893836bb4de9c1be8cc10a8bdd1da46b34a07b469ef4c87b9eb5a8a968c6eea8d2219bca4910dc9bd1b23ff5b2915b6a2eea5411974e68143382ef4a4fbcd474c49bbc600c25d8870f5adc7ca052e5054eb78e233c4405e4a70d3ee1acf54e68b26abf4903d3050229fc67e7f3ee912b761eb40100395d1e58263c25565377ecd5628aff4068697c87e4cbe1d1c99539028efe54fd9ab9e484c116affe406d981953f9fb69a36f884b3bfc73b123bd9325bd8eb2302da7f33a410341c1c41df09d601f2f3b1f0c298be0fa2c09d3d0e1d7d72e0ce0fd8c6c23d7b620560906fced1bb6f59da7968357cc0766d26a18f4115ed98b77fa29f70843e3ff8a7b1b25c8616ae33e27fd3232521eaa0f486e7e2df7ea1a46dfa90363991fbb414ca8bff263049bb677395ea8786fbed8371772b1bf7dc465783bb415c61a05baeb63464795d912d308da9fa024a45926ae9353543a78f6b706112d8f949525b4457f2913c09da13918969bc948aa36a3f34a22b4a907e19bd6e6114acd35ea92258b739349046e60f756501ca94911d6087a3504621872420dec2a6fae1343ad0838c18014feb5ba5a9141b2ebed1dcf28088691b8ffd2c7878de387cd3c28230a9daca219c4894d75a9bfc0683db89291d62c67af0fc293500a997dc9d85aff06217f3b3e93fe824f0242a67de47db11196fb1efe1b062fa1ea860a16f7a3b4f335989287734ea06e50952cfa16533c5c89ace8bbd12592bfcaba7d7900571cedf36cc73fc14ca4ad5bc5d1563c5c5144ef0687d30f8d85d5c365004c94436b6654cf95dbdf7431210761356cbfdbb48b0f5ec0607afccd975df6f9fbc10face855e189107ac1407203037a086acb00af37a99b0ac2d45b21a8f8182e069eb6b97bc7785bb01ddb3ef715f36c5069531bc48c693f88f9fe4148417a117771fdb1951448cdd31fea9f7dd04b14c1b2acafd867eebffb82d26cda0fdf2f83c1de4abc537463e9537e761f2ba5028f915842989aa32f56492162bcd2d852df93bcb4c4fdd996c890f6f6c55e7230a5aefff63fba74a0b7c01fb6520269e9ab44602dc32586c28df6b7562a78d853a585f4f6fbef281960acef935d622861c695128a0cd5f7ee03a9b450aa469508e6eb8d12c46ccbfacb7d67970eb817e567bdd420c3a4be2825038d05efcb2cd1a8667d7e43093767dfae8fd4e7fbdc471b5ae3c9ba6592012bfbb29ff667f699fae717ee1bf5b3fa8cffea8f7ec37e5e9ff5af2b150cdb516aaadc17ea9201631b5a4238d4564b079bd9f4b72591d960587a24da498f8df6d1fad5950a38336a29a1bdf4eb1b3c4dfda90b2632241dd44b40823649102b5c4b0c65c68da584564df715fe6a4a0bbda5b512815ee6293174a6b41fdbcf64a9c0ae885f32302ac225063f6c885242d53af72ffa8f961ec029f172d4f2432f728c259d1e44e4cffa7546aed5298f290995a0729997a45ff705537ac05be9fb3b7d5e125757df8bdbc02d4d0a9a21b4bbd0592a681a4e25854a715e89c05284970c848cee8ba684d0b5514b1ca0597f7d03b2099a9df08faa90fff4ef7ebeef62696264cbf643fdd83fec6bfdc69e76611d80f3124676bb78a10a0af871ff5e950a3ec361c90168bd5322b02ac3258542161d300ddd5e7b9f486ce50a563b61a2a6257bf7adfd404a0e3a4b5c4aacbb2ff8a77dadcf5d89a1f1b2f8dbfeba4a05237bb474d05b5a2a1128656e09a18df12a15ccad3e960c30e5f3527f8b329e8973242b2724f5db272b7e1365ad9bcb87c1dd9ae04e8875346d9ec143923a9b62fa420f9f8751eccf8c48454309c4c4f0c93b25ca422a8b1fe657a2ad83521ea617551d8b0b15bb54888e5691521ff1b7643bce22425c0e5bbb55a3eea74844e5c4a56ccd725a501743d2bcea1c88b0b25eea3858bf6b485816efecb3ddea21fd6f9f0edb5109015a6ebfdc4b046961575220661c950a3c46a4d2422b75fac55a3240ede993a5e46062c62f1d1029cccf5e2902044beab7fec24a084dd6fc71ff8912c476e3fc22940a8c9529a5066794e937ffd01f6269a1ab78ff8d4a0a1cafb23ff59f2e21cc5874a58f5b0cef5f58322032a4cf7e89a38496ea77fbe8fe411ff7377edf1ffc477d6cbf98a582c7eaaa745053fe2b119c15eed24258c56da58ef715efa7fabcbeb65202d165facdfed01fa2d4e1fbe2fc02ffe9dfec5bfdd17fc952c14df9253185fc7ebfac4ffc699ffb1242b7d17e6dff7f49014195e7d201c672fda296105ab5514921a329fa222f49a86ebcf92d3af15f346b7d7a3484341b59e001356094f07954b795a020669929dcfe025a1d266c5e40121aa70de93820484288adee67c836d0e008cfe288d5071892b0383467d964cdeb56848936e12964ed199e5c959bc9c0a27ccf832bb4fe9033e61438fbcf6bacd325613f05fd9cf416ce27be92565f60c06f6b939610914422bb7b73cb8a073606390631c66e860769a43ceab88cba4879d471998642e56c0467c660d869e9b05635aa593489be17765661f4c7458dbc00f4f3a251280f6d4297502534a7f3ea8fbcfbf18ac7441de8363e64d34f46eae36b8b2f1b5f9bbe3d424377acafcdf83c686b51055fea2fb147ec9118a3bec642ad72cda53348c69494948f82e2d9f5b7d964d7ed5ed4bdf77ee520607fbb9ebefaf3a05d1d668fd89cecda23de92a144c9def6fd213bb5618f15415b23a26ff5e700fa5602f4adf6f75a9b2dd12ea52cc817ffe4531be5db018158d0b6a633f9599257966402d153c54e4f153519acc7ca6bf75c61652b60c39e2b9aec9e2b8c64ad2deb0a3896d0af513585fe67a5ecfa368ac7b01077fd8c4bc11f6649b2d6cd60d2923cb9235f288ca6e5124fd1d17f77f3f8cb53f4ddf328155b5b6db5d5566badfcaebbbbadee5edddda5f557dd75da5aa5b5af4cc74af19f28dbbe7dc5ecb5addceeb520b914e88e2fff9abd76fd2f8bb2ebcf20a4afefc2beb556f2c4a8ada7a9bb7ec891285a719822e93c5c68b2bff8957380dcf2adb52fff4c27d2b0efd912896dd6e23edac7349eb5767cf9527f3ba2fcee71dce4e3d0f96b8c6441be50ffcac92ed2faee994e8c51ff7229b87fb1c6beeed63ee2cf92685af7316a2dee389db4a83dd6348d8bad5dafb6e2a909c2e94feeb46070edfadaceae7feb8c014dd89c32573c2f4889a2b98bba1489f5b3db8a225bf2a53ef6a4122dcafe1cb62bfd082463ae11f8529f7e96e4033b4b7295ecfa9cfe72ceaeafd12c49a42121d0d6be1d1068e3afd0a1e3d7a043df71b25176b5af2c09ce5a599218a34ad7e65f439ca2a3411d4a6499f04c8b64a351feb85adc252f6e482581709d10d06628cb58f4528a43d1b4348857b6b3a8699912315b7b7efc6499a6d92a35ea44d36eb4004669f73cd4eee2175b12231f4055cb6896b9cb864d733ca3e1ce2c4b818e7c8117862978a0a2ca0f1dc4508434010ee812dc0a2d2c6020821f277892a4d64a2990a95d9b753f59b6d5df6c1d62b2ea9800e19ecc28838eac4287bca8c53588ca3337abb964e8369b538dca04f9c3d222510002e09168c31e9c9f487497a8b5564d6ba928bdb7e6665bcf5c800d144c3449820511223fa032820592850d56e070848910f80e0108107d67c39e1b86ec5a7da7d6ba821deaa9d65aeb0899ca09a408c20b807800a5090e8b18ac6470b2438d14259862a4830f18760a5eddd0c0061c6870250ab9aaf2c3932053b040820a580c7c685476a8b8a8bca8fc5001a202a312bbd9b45363390f0e5ca429261081642b15c2658c376c310e09a2468a5db06d83b087861cd8aee123d41fc1564a2989fa44243f41e81319dcc0840a23aa3c51728524811430e8d1a40705248831c9e1861fe08d185ad049511120273c34d8811334c4b0138310184ac9e14688212d48011549f88f0a2e00884b4809747a72002267e041144d28d1e37a220726aac8004586526b352da6136bc57662aed82bf61303a2321aa59452edda1a648f235b0c41c2830f7a66986188145558603954a999618a150970a2acc1ab93812bd9b1c1cc6448a844a5a446c90a5579004f60d58c2044b6012d72c04407d611408464888209172e648012031d2439f45461baf183752fe0e4099d1130d1a14108398220a0a0e005423a58f100b48308a740f2c408847872c50e6a10030f4610d42308273e5554f12187d70d3462c8082b2539c576329aa0e65aa088122ff861e20a226aa8a912434b07b298810f6cd8c18924b288354ca921a886a11aacd470a5a6b26a297d6283936a03947aed085acc12c0b2bba639e1a2379c786525e4a644ad3d4efc6c72bb412684678b25968052c3501229822c625134f121072440373ee04087b26c8d85524d67c39e9ca25dab4e111f2fea0379c1ae9524a4073b4bc81b428820014424a5c80a542f1154d142c90f491801a3e8b00383222766b8214886a08a12423630812248890e3bc4bee71545111f5460a58a0c1224044ee102276670c565454e944e624a29b5199459b66d1dcd376a80e60946a8ba9b65d90e3b7707d7dde17577f8b997a8534968aa50c4a02082a26848355433b41a620de1fc8064f5e466861a1c21850d2a81c8a21f480d90e2832a9a6831c492277a28d260463b1b419e2b549bd2d983366da5949e284f3c42e788d6b6755d0b6a51e98420d4d02aa3a6dde80187de5b7fe0b45677d66cb98ad00d3788bdb280018d0ba6f0b103207a90e247fa58014fd6b302235eb48e6444e08c665957290dc24817840e174a155420840ad60e604e7890aa1f40098009092482a842a80808092d6a0e514e111215929afa99b45158792d0b62d894052418f21fd8fcc008cdf9546b3de55a2bd530aea753b50154c1b69aa0cd4a18c0ea125cd715d97ab88008131134f1030c09932da46001e0de0479f97842d503cf8c416be3f11b3e8ab45a6badda56a1402022a0a21ca8725093037084908e0c4288d0196283165185e5b3240729e0890561092ba32940b2164bb44a4b3c4140cc9227a84c41d282a1272870c5131c9b206e7c90831f405f01104543af1f3d14b9e2c3101f6e2080164350412403286c5030c38559b68475afad3d96bc5c3db0a96205ac880d9a050f1c931d238a0041886748073164f728e4e78610a09a6fa6594ab56b99e0b0e94691b844501192c14d900c98cc000830323264a452ffb4d2979492ba28cf1d8a491ab4ef5397a430e9ee8e625118f589342e2c68d79faa3a6b769d2c9b918cdae5aea5a783d4441c285906a9c9ac741e97f23895b23fa9b95317e5a151f627ab75fada1f8d539feed2d796f7a3feb68f234d433f4ea38a32d17f1efb1c766f8e35e2a665a53bde4b7d9cf2c4182e357579aaca989b51ffa9940c93fe64ec92fe64f6075df425ebbdf7de5befbd77d33e24fdfd4742719a86ee4d931ec71851a44cfb4c715c2a1c1858ab9a9d968ea6dab5524c378aa3c28181b5aad969e954176ce2b85e983bb33575807e5e24af7ef6ee47978c81110885437d54300d832f2a191355d487fa1411c918dd54f85e14d634746b95baa88fa6d117f5213ac502f8807b342b58087ab32c0bb2d6873c46bf664fb37b3d17722117e2c193dbac64ede9b13d37d6b61b7dc885e0e55288ee30265959e56e544caa1e05725460e36e508dc353f349a64a2badb4525c6b36e459e6429106a6271a638ca748638c990bd1fa23ed496eaa95d20cd75b87784d100f92aa5d29ae3b93aaa752456fee3e10c0360da5d53ded64ce394bdb95cec383228d6a85a4c13cc88748d1632ee438cbe494534ea759ac2ee441b6d2bfa5bce787daf33117638c9c0bc518dcdfdfa84b52974737ce4e4bc7852acc05f4f37221aece4ddf85c5539bf4334d333a937da50f85220d78e37acc561752bd28a28232f02184274013b0941f19199927f73fed2bb63c104208219c4f9ea89ed850d59ed155224dd78c14090f03f562f24013b6af3fa53c912f15ce27f367521596b9e3e1a9a88a5e0cc2a1e07bd3b1092c81be8ca42f4d0f25cb430965088fabe7c237efadb7de7ae3762f9e5230b655847717f7baf8ab3ffcf7bffaf7bad033f8a30bbff7de8b3f7eb17a584531c635ce1f69dfbd6be17459211adaf7618c78c6becea18a69d5d8051ad0dfc1024d665d37c638a75c192374451af7f194723909d8f9339f441af25dbbf367fb63fd558cb5f8d88416e2de2aa514638aa38cd8a31bdf5a7f5e492ba59452fa9ad39f8cf983f157bc616d3e8126c84ffb2f73fd4d9e5de24af6495a56e710d004f995882643c0122acb5730d42288888025d428cef3c22479977e96e934993904cfb673be6009b57ea6f547b47e476bd0aeaf4dd9753e7962ed4f766baa876c2465c4d45a23ac2c7b7717f72bd554d3b02db3cfe6cdbc99ab9b18436a5ab3da75d4cdd7bef067dc1785f2d8341261322684e80ee7cd64394c365f9ef9973e7fe651c053f5af97c3ab80a7ea87e045957ca98ff2b0e56e588d23cb6c66339bd91c2ecbece36f1a89f326d2e0dead8b8d31ba7cfc186374b1316a8f31628bddcb9179df0bdb93b637b160fc5966f17df76098ab699335f19d253bfbb99a36b7b533cbd58d5b99fd6f2e09e1edcb1d19837a1bec30efecfafbc08eaee869f77000914f5061058799fb4ae7e142ccd99fff966573e530fef8a74da4913d9e466cb41b2781cf3e1a9f3798b5fdf1e3c75a562c2b961567216014d69fdf9b337e88bd2c8b59b48931ec3b97426cf1e25c79cafedf93feae49679246ed3a59fbfabcb1d8665996e1bf9fd99b4863e43f1db647eeee9c9e19a1b4c77adec418231aba2fd63cb8a9cbd5dac1d969e9c0a069d9faec72b53cba519edcc1d969e9c0f0bdb0b5fa0373bd5c403faf17469efdcecbfe650c0ef952bfa2e6b6ef42b6b6752912827d94a7a3b2cfe90f656ffd79731363d8bf8f6db6659ea6fd5cdd9f37f74e9696cd9bb82ab9d783d6ba5234ed35edbe7d8b833d972256c7e6ec8b357a5732877cf14745f18f013252a97f20a08f86ce98e1417185df3f078eabb8c2faa3a1da0301c9b747ec1187d923b1558bb052f61cd16e64751c467b1c142bae82d85c9143a015190475255bd9d58776adf117ea713bcc1eb1390e73a56cf7b945ae7ed5a4f390b2d68f2e373d13b57aefbdf7c67aefbdf7de7aefd59fdf7befbdf1e56fd1bdf8d3fa5eb8f4352ffe788abef4a294b9bd5eedbec5b92fe771ed5b5ff3d79aecab3f29b7ba236aa789c3685faf6db2eb7fd6b5eb479cab0361dcb1717777776ac43ddd8aaf19e4a8735bdabdaf49e72171646b7f6e71228dfbd1eab8b49ab439f648a4b1e9cfe66cff7bef7bbc28548cf7e68c42fd53c05fe8c7ba79bc57fa5b9c0f4ad10ef394149b53b54ae957efbdf7deabbdfdbb3d3e126974f7a25098eeed3f1ada6d7a066f8f638c310fbf7ef6b49107e5773b1664a73f4d3fd7e92fb636fdedadcfa9bfed3fff4d6bd734736b9ae999a8ed4b0b5de885a7248cd467abe7db9ff100ddf325cae4247f24ec1a9e929f7db1359d651f4a7bfd45bebf64fabbf7cb357ee4efaaf21198eacc1c89e34624cb5353da70ddc7afff71d2e6cb7ec3da4fe941587fb794ebb7dcfc2e5ece397fcd39973efec9f3d2d779fc2d8b6fe7cef44cd65fdca5cff4e63b4f49a4a467f26779675a12b956b2f6c5f56b78a53264a44d8c316ed246f2f82c6535aa2422579288b4e19144a40d75b9724944da481e498452a792488c313faa3c75339d5d336e29d3e8d1b38ed7dc9f839974497f6f6da775c89858235fe4df8c82555de3355ee335f563cdbd1955e33318c081b9bf2b6d249116c95970e8a6d77d0b727773853f3e7498c8d5d8507bdb36fc62bdec4369ff7358296a31c7b86d1f638c5b1763ec62ecbace1463d272d35a6924317ecd69adb5d3fe0ed8b6d6da15b6ad5264ec0fc7b6510332b6d5331805fcdae39cf7faee3573c997687a69f2a0bfd82fe58e4b21e244d546d223fd9b97d55a2bb6bf4597bbdc7228682fc307d633b6bcb7ea2803cb5ed2014318180f9167ead32ddfb74d4b69df4e7829a594ce187d6ed86ad6ca5817b2d6ba3b757777e9943a75ac25ce280873e60234216699fec67dfc6d338ddadbcf217f7b28335b3bfddd5db3ec2127efac2fef5fedabbdf7deb73ac312a436495b4a29a394e14238231d3084f149a22d27bd328ba4158ec853dc90a73417f394e56257d3f8f6235fb6532977ef62d3d5ca1f161329fb10b2477910beb8782d1ec6353b33e90faf76f625f983593bd31f8dddf0479ac66eab751c8e9f41bbe9cffbf3c3aa3d9f83d77243db6e9c90aba40a9ac78d389068cfaa8188b367a69efae7165bf245524ae9c6c53ad6e73476db9f1f56edfae19a5d3fbcc2ac8df262abc5e384381817c4c138212ec6c138212ec60571304e888b752c4e8883714231c6bcf1b503dd880948962d2ec60911993c3bc11086eda1a2d533c509a892a92373268ea7e634e2a939f564796a92ea7f244de3dbc4ba2ebee2ca42d21ff721bc089fe9efbe7816fd650054d29358be925e842bc267ff226f524622fd0b4f04cf85474343f0207c21b17c7d94e7e291f44733b7ad23fd8c6fe9cfbde9198d3ec9f4246d4d6f4d3fdfa467e8d31d279d2c2abc7aac00d55a29a534933128fb99e56e1c3474de505bebbc897aaee6cd64cd9bb99a28cfc5c321635c5eb2e80f65d2248d4f7018ece2411bf8b29848913a35b1d4d71e6fcf451b90bb71bf86b76816fda54efade78e96541fecd19857aacbfd7f497da1f24dad2568b42f63ab87cc491f7e68c42fd7f2929ff84153c25e7cdcfc959b6e83ada755d473b1722913c88e456462492c3b8f720ce87482312c7b9900bb990902bab5d800d7bb208ea1e7b9476b4eb3aec414a3bfa1dd62dc81de7df8fdad7f01e7bfb2ee79c71eee68aa46bc80e3f8def4eb72037e96bf84cf7db9372d6fa8b2e388ec471da6333c398e32892bacf23fde56edefc86359c597f3be668b1f01876980761b782b11527c243d863197e0fc23e84b1c730c65ab675a38c7f84f1c8eb3cced3f4d76373a1d3665b4058626db511083957b018da08d8b0078b9d299d079c2b28bf86e4b1e1cb7a5f7f11851efbc6a9731c67c76984b5630db7ab398dcc16247cd8525b5a5a3c948b4dac9e8b4ddd5efbaf85e5ebcf58fdc5a05c7e7e8bc992ac6d41b9b4742e8ffa5329b7bc7d172d1f42cba35af4c7a269a8cba9d370d3347363ad9d3616cf70801e83f64ae751a3fc0aab155b3d96790c6f6f9ff3b8bfdfe57b3b6ec35a966917722117ca9c3ec142070b158c449b001bf61415edec046cd85314647f794be7017fae2203b67d285b889bc22fb26ed8b71eca532c7ffaefee9baffeb0dd5e868c61d19fc34eda6359c69cde59deb6b898f4774b9a9451f65d3c085f5a3c085f58bc9307e18b1de9abddeaefba14c9dce65224db14be1e33da7fd97cf9dfcbab67e257bde92ffed425b73e640e5f196a9af6f6a98bf25c1a85beaef69946ff658c0e944c9691c299d6340dd57448ff1a1a2c7b0c73b9a80ff5a12eeaa3da292222e5a22222278ac550a84ca3c4e8902fd4630a2e25a43ef45514a594234e9aae17733c45a3925b6fbdf5babcd135a73e91c6f652badc7bffea8fe52f4affd7522fc6f75eff8d45cbaf3aee50c6c804fed1668992ed39b126c6e46041c6ace02f4d7c880816644b39c08e1f245a409472e98f128fd151c443e4b1cc02a1c948c01fe0b35f92bde6274c867c913e24fecbe6c788e7eceaeea326ee8292e4809b9c9d0187f9e29e3106d944823048fe602cae1ce6f35506a484b158ec05bec43fc0029c5024f98b384a62149e264b70702a0df98b4031c863a007f178c5a395ed0f3d0e6dff08e4b0d4f3f86629a5a4f565a552ca92ceca59d9471ad986108841d8534f9b8cb50ae4e001da39640c093380f0a4ee449c0415e4c600195a638c53c6f8929191e1fc43e58d849293fcf9ca777cb54aa556ab158cadacce80af50b1d5f61e93fe9cba3444264146c55a762ddcbaafc776e9193c964a90e3cfe9ca5f6cc52bff2854cef7ae50f3a57460301d3a3eb66034c89fab5cf58f42e930c06394578d0d663853ad0834756ca5fc1f85f21294fc41980e8f747fe0e3b1a54ec112e2fb8f3b67048636b28c915707120d19255f6c9068c8d1318065a40137fc0c5d743de42ffe9e36a00df8f961a4a009d1a9e640dcdfc6dd98dbde6009f2b79afc6dd03dba0b73e069eebeef81bba1e6004dde1e7d4f3a7d4ae97eeb430851274fbdc85828431851f6c0521fc0863e22b061e30d7d80dc50831b3e08811247f898810b56d2068795344012205809f2a3a789cfe9c5cb863e437ad8dd863e4048b03f183c2c547cfb93cfad14e503046ba336f4f971c5866233c5e625adbb3f0b95fc6da7ad52cfbf8d45c8670435db7ffafb0ca9d9db863e3fa0d81f0c24fe1403c35984e0bbbffba73cc61e481b7eefbdf7e2c022d7eb0708c6c2d169edd4ac58c001048bb9206364c097f832d79551ef42963471f1e88081a3d3da71b9a0aa59b172c08870b85ea8bfd9059c4af9c34ca76ab80b9f2afa6e69a7e5301f842d7198efeeb09aecb85c3c0ef345d8cb61dc5b9f2292893bd06a6f516fd57c32bb49e4d9f15df7957f504035dbe32ab270605107d68aaea2ebf29f0b9459db4998c1025f22007614c08e3ae626039a20034bf0879f8003401a0b8031fce1bfa3d0edd491fc399164b5a41187f9fcbd46c668efd9fb3b918c89317f894f743dbe4722f912bd25affc7a6cf9635d041f9b43edddeed92c7bc845c08bf60dda3db6fd193d6e741fee2894ff7b6a868c4f1655c9979731a397932395de9650dbb5277910be68dd67cf758ce6cd5c4d9b79832307053c256be8d860305812f32609b9b985225fbe8c703b8c79179c7acc53917e71bedcac6368bf280187c53d1de0355498de099e7a7f918ff5a5fa43e120868790b7e142310151d358750b1204fbeb8183ec72cf4bb404f69b8c1932384e6f7a8ed34c3926231cc7719ac9c49df27f26963f9146a8e74c26d34f1bd33773708bc954fa69c399505fc35b4c8f42955a9ed32d2652f616ae85452bb57cdc699193cb3bf245bafc97376a47ada43f546987db71d15f6ed11feaf4dae39277f23e120b11798664e495674851c5a23de9e31087d1b06964338b7b168ff4399ff4c7e979135bf825c67198518e49c761b292253bae293c3b4d4ad326c6c82352d6f8ad371a7573d579db9d41448efb9b316f54984666c8d0aeeba2e40ff542fdbf4891b0e39ac2b3d364de603d6dbab9ea300bb6a6e60d8e1f586602678ae5cb8d0881cef4a4cf592391722e594bb24f22bd964b7ac6bea9b3da4b2e8599d39b46dce6f2396f79cb5bdef2d7909985449a3b6f5f2ad590339185f42eef822a7d2e69bd8dbe6b61299d5e4391de45e7a8235b248b24fd667aed71f64cde373a3dae1b2e220ed9f0107966f4349eb41f3d0f87d1b697cf820b0e43e254416a4a7ff246df7526fd9574c4d9e2ca86e530ddcb8f46628ec3d8ac3d28c6e85a90b1d3db5b8fdbb62ca4ec48c3863d40e0d9db2d22c7fd41295667c061620574606087dc3036227f325f7c80fd2172fce2feac6e416eb1450d3fc161a284d1b4c7b4c70a1cf9c5287149d47118d863056b4bce85620c8d5b90967e5a077a6c9b218523158625eff4a32f7927dbd518f431c8064eb1fadb412363cc9123e6e872e4c8d1c52648b4685a91443e14f7fc1c111683baff6210d7e9aaebe9bffcf3eb8feae8593ce82f23fdc1295b963125ee497ff2ea8e6ddf27edd8b66f4fe21e67fddc5bba63db74dbdd63fdc129d2d2eee7731d37a99da31a9b78c8a9f0e3ded39e4f533b3200b7f8769cb6d533f46fd6996502a53f3de4f4c55efe4e9bb3234f0796c7917af6e455ef6efe4269f727cff49c573d7af24a5f3deead4759bc202cd85ec8db60017e9377face1bf9966f6c62e42415644231877e61e019d95a0b51b07ac603145a195ac6870f12906ac282aec0828a604156604144b0a0214f59ab3de6291b3df35bb71afef0afbf542d47399ecca844ed181631642435000063160000380c0c06c382c134cf9310283f14000f669c425e5038930684d12047611844310831c018000c0006184494535446006e7032e846a0a857e806481c5d61993aa8fee1bc8a2206582a35cc2713279bb65bc39a752552552404c1bfee9195948895ad038b2252fdebc204a04e3c3be99901050f520cb5b7338dfab5abe20b38a85036e56a244a658db8cf2450e68c5d5b117902d4d04d7b74d6ce18fe18758433bebf885e468d344fa61252393969177e871ad0dc3d3c0d17b3c5c8a6b94bd3fd66211c4ad91f653c4c4616b8ecdc3ca263437349132f5f6bb66ea059725afcc6dd8714e2a1a28397a5121dd8c148735c90e334034f19c18334e6168314d153f6bfed88d07184dfa6f21bcbaa46195aace20d5b0a26a41f70258f999b025ac85988f7476cac8436e8c024b08f23ea7f947939760224ae778e7aea2c181c615487cf92882145902a5928ec2f9fa606bb7962031bf2c961ed996f821ba2b8c1204e2273ab918283859bf17b2b41e6bb239d2bd1f67f94fcf7407851e6bb24a93a90070e0136c289edb26aa2816ae89a39aa7574145bc8396201690435e41608a8409a03ef0931cbd4ff68924d4de559a38c8a9d04641b830a01ad6fe56305bbb43628e0475b21664c31477d24e0610fa67af2e1650068b01b3b94e385cde60f466a9e24781fa883af4ce3509acadb897cb0a8b60e52a00a4098e8d84a7879ae5fc46a22366c95f05cd0fae09f1c1890f335886196bb62bc7d9b40cd44f099347e119c4b03d316b4571f20f73316b481da4f4c80025e711b5925e4b1814f07df75867c3a482928da94f5446f4aee385f9bc2094717f19f69eec20368aaa627f626a113923558f167a818df978a8d9e44efd54955a2b929a1a10298aa77bad9a519d0bd9fd0ace821c1bcc3259182b4404575fc4070395a190ddee45322958577e7fabe2b7b0ca6af798c8628d2ea5fca2b523095094343c702e4413ed3c4d51cae7c75ea017713383042be6851a96b4af639c319038a063715c06388b90fee965c8332f6fd849cbcffadf770c494cb634d924817b094f1fe4449b613eca1c323cf5b89490f4a7b647fa9c325168421ed8ffdf1e6fd991712d4972b86425bd9b3889bbb53d69722ad8635bae10c4a8c1e7f3dec6660cda00ffe2501310aba78e8acca8db49e56ec2ac362df23e4364dd8cc89188681cf43f8502521bca0ccde5d42dcfafa01426130a66b3fc944fd7cf9a023a8b74a786d6a30fa1779a0eb921292fe47b674015d5df145eb8a723b93346286c1da1bb080ccbd9f64f64ac95b6a4d2c9bbc8e2dd1db9789876236d6790a5d94bd485244fd2a002dbd0f934b6e7b8dce12d42267c1ba2b8f2edb64ecb74ebe7c1b427bfb8668a1da07a7b39ccf0e27c7b2f81a313bfc7a17594d59449663914676458e4291ff926b404e9f44778464c324d00f7f42db85f1477ec6c8b8e2f5244a45378c5bfa10a40789626baa4a9f9a7ada0f3c1ddecb8659837969adb10d111c5b5dd329e2fef5426173c714115c02019c14107742756a0c852186da92658a1b5cd16e10ba1ebaf03d76bdcb7c3fcbd64568cecaeffb273748d4b2ad5bba103b4ebae65106ea52150587d158dab1595b80b21f7a88014953ba111446254b92e4df93e03e8a3bf195ff28393411a984a904eb805e7a9dda70a9501a8c0eb882dd45a206d187e88c1cdccb2805b7befe545019b40a900e6eafa0ba7fcb826df0e5a76d1f7b23a7ac0e9da956c880fa6528c86e443b54b1b7308cb6f81c8c384ea7459b21d93c2ccb814ae5629c3b73f1ec2b62ffb693a3bafc1834095eb3c962d388fd5f895a4da795de4e0e8ff2c07712edfb80407fcadb2d5c0d81fe01f95c7b32c3100e92d476539a46d6248bb9ea7f6451a712f35699c891bb7a771ee9f22763921a3d191b2aa3c24c85e75e4a26c263ed437031127fdf152411d585465ea1776b9acf153b41842ba6b8181827a377ac1725ca76b7725fd020bfbca446449cdc92f97c21026d59bd279a4a6f36cc18b4f4f086e1c713ae2f6e0c4d20ff1f016b0d91053fd7a0bc676d756e47c19e72380b5aadf28c4544d0fb3016c6f9cc728b06401bb311e3a5324ffee5dabef47ca22246430b6810d1ddbe0fb8e72caf74a67b290f0ecdf7917313245135aca9bb5bfb3383dbd0dad984dc6cda5223612668344badfac42e9632129aa86ec328a58edb5e9e0bfb1f380e5b1a18ec125b778ede72cccf526aff832494fc52509547fbf1d8cf9f5bce473cc5462c166f50a289c5d38f8d6984a0b871a3cc45f0ff8d602a90c04dce2540e44088a99204568f610697ae058c9148aa0c240c4649a2d074d7194f227c08628449a51264f940611359aca50325948e64e350ea49abfb6ebc0152aa105feecdf3c13aaf854ef20978b2c87c70bff435d93a9932898d60c9c3c4295d1fb450e3124b0f212e560ecfd79db92315fb065cd097a81dd8a0b124a76fdd373b9c207050285e08556394ea756ef3c887661de3b56cc2a95282d598c49303f1280b364c24d90e2aced416c9deda278987a516890c79f178a8e93dd758626bd8651e8f3dcc4cef5119596d178fe130acdc9f055fe12d42c92cc209b810ff30dcb1be146e28142dcae8f2f8b30db103320b9146b88dbd94055705aeb5906270e3b1946c804f0e98b5937755c4081f4d80351db647d52f15b8428fbdf81232bad9f06a3223c86177a0c14373879f46ad3ed354c218d093dced6c720949b8d05f918083d3d3fd07e479c40eb5977b9b896a1c0ca10ba9dc39de023f35bf66a8965785fec616eaa6601fca234674046245159ecb6d378f48e4e71ecacc45c7d858177d077f32449db1e80a911bc12328c2cd21dac6ad6c26a9c4d910e2251c9ecdb2b09e02723cebea1269e853c7adb2b1ae18198d69cd002d6b96e3fbd2f68e5822ee418af8f04d9ec839c68ac39e4e76b4fcf8c2c4fd830f09fa863b0a3b604134cc86c59ebf27ae16db107b4f3bf6a2ae4ee8e9facaf7d2fa661f8d5450c7504cffdc813decbb9cb3ad4ede4a2da812f301266cd3425de4962df76f1374f3c8e7083196b8af93f7b3ae4ea0c95568664553a72d4dad5a24259896c86de9ed508aac8f866e793bc54f2fcdab80783b01a3f2bc38783b480a7e148200610ddd7f090eff7a952ce992a5728e8261a7bff536c65898ea92edaad4705ff13c663e47f56c2231f097e8dfea9266680da521435dffe52c86c66acbf46438289ab81ef8df7af8d33c0c756ee5c7d1f8b72ab081c26041fc3c9d5229b1c7b7e3b2c6e42943e0cfac16485f8a4d95788e5c4092592f020fcd15a6d7b22ba8ff054fad4fa9278ea3909c25d47cfd6275b67c317b129fc10373673e8b89c47818db2490b9d3a7e40474444915fdd72ca7ba00e247bd2649e3b65d0d602a193c00d078603d0a67dcb9d0a1e08567273130be23b170c66922ea5d0d2bb55126838c0d97e7b4014573d7b4087143ec2eeecc6b3cf6da410bcf5ae10f9c62478c380254013bcdf8eee9c264f901d08b15e0c50fe9fe08cc35dfea6d839882b42ae095898eb10af63cedd14fc9ca3b1377d9b192be22d81d4221728ce47b7055b709b10f324da7f60e9f0c2b5fae3cb7ad198828cd3e42e493385ea9de78f9786bb87a16eb8db98088d7a27bb36aa671ba53e768cb21c0bd0cdda1c0ee2b9402ac71670d5b3dd44738cbb9a9bb0f071ee2cfdb61004c27d43897cd25ab526008840cb419c4b02344ee8dc98915d1a030e92e1e480906a06a368808c2842caa30db5031469bba164549ae03f71eef70b9918394d905b88d263f0a8a22a53b56830cb3fb9378433ffd1eb88230fdb6b7f99b001f04548340de166f947976f34f2aba3d8fbaa05dc14be985a28482d651d1bd0c02bf9dbd01755cfbefe1cbe01284e4f825dc22bcea04b7c09a7c05330e16c1df4453c6d906d33570739c1900371ac14e43df41b8c03c39ce112e43caa943f9716044767fd397089d5d1e20aabd7c40c9ef31eff5407870138e5d77eb133916ccc2e851786a39832c0ec090f94ef714dd68a1c59d20cb874e1a5636d92df956d8273407c17ee6293163cb3517f2bb1241689012a4d37e46384781205409e1f909ec2e83c890c78e8292dc7a13644014253cf2fd3daf8452d7c93dc857f41a784c953cfa1d4c6288515e16a584e1167668405dcf90b0fa8b054052f9f6bf24357edbf8e0259794af05cc50dd7dc6d76f06873ff6df173acb021c8413c6a2265050fcaea055be6f9fc1c5af3e569eb2be2abc2a9eb8b4dd03e70a2a2f7777f306705a5d8685b649db0c7154ed139c876b36bef44c0c27fc3a7682618593e4b86af8600d577a9c0f741b964ceaa9cc8d7e03b76270b80b373f9fc85144013ad3aa6f0ae165ea2e1d9b9d4855389d0833b2f97804c2ba6eb04e3341e66bc0faa65cacfbf41acbe82a5011a62c18357f345fefce4f9cb277a51b61a42b5afb68e546e8cfe2ec68dfed11ff46e04b343d6f3efbd4b4194a094608e22984363b93be8b97b6dbb6f64c570e62d5829f42dbc0da8ad1b4251049b3f83eb5c556ea990f31a343cc5863dd43d0051e1b681f71922fe1455283c06100673b754e8eb4d7c95819d709b90e7a14aa5339f073ef7dd3497077bef1dfa525ad46c1297a57fd2c495aae2f07abdc90bcffc978968cd4cfe93a2e305415fe818b6bb86d269fb8cf6b6a9ae25a5a84137945d3bcde353806352b06ce8895e2697a819fd8844ad21a8c14e387f371ead1a696a39acc7b82388ac1efbcac7cc94bf4d7a1b5001566e1a748f9f65e7b6d6cd5bebb181cd69d124e3402c07e398a0e1bc14120202591254a240b28ceebe56788c450a8820aaae5c123615d2968bf73b55cd9e189df5727252ce21eda67ce38334d035780d722c0c0c0c8f75db184f95172ecf45d7c9a087ee6388bf4ef79dbc49ad5f10ea7275c6068039dda8a9dbd0b8088463b1c4c6540de09c3bda4f9bab068be18d7a8d60153743c4236313a0d8e9bc95b4502af4d81c8c445b7dc27e82461058b0bce4b628198487ea47be64cadbbc7c9af3c0d73daf373a180eebfb76d4279ee805081a488d78a981b3ba14ff53a9d921622c48faebd99de26ab77554d4f745831b81e72b61df5b502ed62d70298ce8018aa868791955ddfbe7f4b844454287714724a74f87d4c458b833c807eec7ccdc94f8868491faf53ba87eaf5d72dfc11b73c033d307bafeadc91e67cdd99d2534386e13aa8b0971164492ceac8f7580fc639675d4baa9c27cc2a02516a1ea5b3755adc980c2dd8b2e8bb5ea70a108cc4c44fd0bfa27f4ff22d1971935b402d5054d25a98625ca3c8d432d05622f1bea87d4a31d71612eb10e239d0177f3bd35a46c23ac0e5f19fbc61310530e64cc1bf5969542e51a028fd25149ee2329018c33fb4b50bed5df8e67d19202367321dc46d4f6d1932658f0f699d331e1068cb1bebc21822beb30316d90413e49a02f11a695797cd7edcd9be5c69cef2e6ac4f91725803aabcf158a8d3cf3e72a388767fd870a24aeabb52da31a5f14d45a4472f44a2a1951cb12f1a5888c6197254b02825d0b8baa2b14feae4eac5b7e4e97c722e7081f824d85259ee04af9afe797752d569d345c1f60ce3eedc08d2a76ec52b58c44d2e7e5a855f281537d174a63e0a30799a3b8bcee0284ec9667f878b3687d3b76d5b8f2cd849544f0ca21a0fd4025340fc0a2397479ff389d539bb49e1a2f7cf102a2ef21c3cff0248a70722dc742cf5723d688c1f0cc8d60c9bf55c6bbb187a9173274c4236ad89840dcfdd33dd882cd44167b4cb2e8712c6a1ce8e1f796664c8944f1e909079774be6ca7769a08a6b28853f3c1f569e27c93477e6c0fcfc8eec4d237c577245606621d28623c5b38cf0840dc0c224d3a3c42230369b69b4203129c00dde8af967b1099e3394e70445d9937b7a4a911a03fe52a28264c10446c1a2278bf7bfc3bff0d582cd05c5e12dc2745baf9ef128a6182f22c2f74abef7ac23d05d9aec603cf2a81f40f15ec73cd22bc5550584a566a47a15427f4b0ad7a652b5c1a9fab95e8e4303bb28a3976e684bcfb24f12ed1e23ca109040e7e4d410daf4e09c6a8029215c923bed9bdd0deae640ebc7aeb3d138371412ed9cba81858ab851ccf51a31595cbde20093b65facfc980a956062de1c28943676ab0b82e0dd0a41601244444b63dfe00041665e59aaf43b482bb24a1bcfa99fcef3e19d7bc64e7f11774be79e55912320806a666c255dd49958ee754a91f499d4c907ec1cac3d811595509cf5ec12df929e39517d97b5eb0e17b6e6077f486141f502f3a8435a7d0b9ec81eea98c407b84f70b4cc2a0263bd20cd3a1d3e082f27cd7a858745120b0863e5049a632a19200cfd5bb7900cba9a1c97f8c735f858d9e55522b00a3acac5781759635f5e2d86796f2b0a9416b2ae557ac6835601c0a639b02acd18f3f42b2a36b7a332648f49b8fc789c96af40faac75e6b6a30d8c62be98a85fb75a5789d5853b54ef9190bea2bc4572a488313ca20f32a08b9887a338d9c22576bb22e827f7f301510380091146a752e76b3d7ad9f698813bf2803d40683979fd3dc90edffaee3fceb646e61213f48c1b04ed2873a92280a2c5e95e3fe0414b389970a000da7501359739ca0f96ed848839b9746014b9a4b53155cdef4a81dcbb62e673b6fdbae6f441bceb3e3cbe3b43686ad1bf56845b1e81cb0531237f65919380fc4098ca42182a544013dbac60b4993b4cd1918dddf00f41037c4118a0a792c9b2c8f04d752c3f417ca79f793f76adc0f3fd02d48f2e9a3e3a1415f0142c384bdc3501cc9b934ba1611d7c084022bf8ccc06f57a1d64e84ab93634994587bbaca2fe0868041524924bf8e9dd9ad203f1071c223c07630f8428f305bba0fddc4b926cc7e9de4c4f4954b4c918263d2527b85afc06612cb3518609b1e2b64c68cfd1bc057b5d050f0e941878037ffcbf162926d910f658f3f96355a1ed5d291686714eca60508ff071414470dc32870a5882452187dc1688372fa2bc9f520ec5d7a488089b1709bf3f9d2e8339510d9abe7cb2aa36dbeb6eb780518e64ec04c261b2e5a0bdb8632e48186f47c262cc916509e42799b99cd892fe900071483c97bf1beea332d1c2478cb95a205c8960885131f2800b9acb12af767a42fc31816146c5482e3f139ff98414022c09f333f551d974b8ca28a5eb14b247e4bac521146c67fa87f4ce673eb192d288e371ee39fa52a40a74d808155f42392be11d9580ee715ad4578e8577b641ebe9e4fb633af5e731cf6d4470ec91b344563c089f85221f54c00e351990c2f1004a04be0db1e12dc68c2590f8ac37950df7df9553b4bb2d00e1615f48203e4c96472d2ca6116fc849f6273c8635c62a892d16df4af3f4520325c2db54c860ab58d3ea898988880c1f260dcd5fc26167d8031c33cd2eebda362ead21e1d7e31f428ec37c2e1527a7982989230f7a336ec693b0a36adf3531be10e45e4ca533b82fcef8f7faddc88d70dd459c3e956e4b46a36cfa4ee720628eae1028c443ed0eb0c71217b8866a39a56e589730b22a13e57d3af6906092c2ff936320dd1d9dac3166da7edd92b5230e0404e8e0070cd90b7e2b910ce38c03b2b5b854556c930fb180d0d9ce75af7956e3b2a7e86ab54cb7e7fc15b5b817d0b1522c1e6bb9e40fd23957feea8f988e6c84d35f49c54868d0a9b9d9a74f692ecdc4a83ceea346b1c4a225405227558c03be11152fca28318b47a0165a59d713642b9fa6dce49cce6930daf7664488893cee5fd94af5fafb6f61418d8d93c461e1aeb1d11b0b2e53072a17d5688198723e29da6ddbbe980fb6efb4334f9315ebc699f887e5a4322a5a5a4e105d54fa7685af8fefa7706a50670b317cfaf10035c12e1f98554122fa005b755d494f647d1618810680c514f41b40a214549f10acd36a2c282afdb7c3e8db7c1aab6aab67e9d4614add74a3755946e42db76ba4ea65bf4e79b890ebed82aac15c67e26c3208e406c22a009855057cd9dbad4a93f02642d440790f89a14e7ad344eba2f70661b08c162a4cae7761d758efc4a34593994d4971d6aa346ba3c5ac4c732e10720552cd3b3b369ca7419925407212abb364b5dcedb427993988f05f96cd95f52e904c17d4f209c0a77e955159ec669d2958f0097bdede1889de3544ba02cfb777d99631b97dfde64205db19e742497185afd7dc59d46db5b6606c9261c2de19f7cdd4aa4da21ffa2475fab1d785e34f17763e6278ec50e1157180361792e7485076a66714bd63652eea3c480132b374cc5946c42c23a695c11f376ba2b72641396c605614906eede2251235e8bef1ed9086d3c8ac9a4ad1022e4463b69f372ce0c552894335250ee21de3a89e97b69b47c17c9a3d60421ce7f1642779a23b884093dab9e98297f3b55fa3ed8b559dd921e20b5de6727dc4108734167d32491dc6a7c6fdd819ae62631f757191a96a2d9ad79c15c41094e92050ca3c85cc035c02b9074ca5c1e16223758361d50c5b251843856a1769456c8ba6f55f0a39fffca0169576b666e47019f96c8df02b6249da085684634ac5a9bb977a46a81cb52188f506ab0e1c60cca933617111eca3de0691a80407b8cf45f5cf1dedda5df0f311255231d926a8b50031861d145c7331ebe5e2c58a434129d2225b44ac478462fd0fe815f621e1d15cd9bec8b0418a18bf978ecc49ecb0b8009c4881fa7ce1e0bdd0e0182d3397553d42c0c3e522fae5d81557d3341bb980a7058bdca634edf0701430040bb6daa55f669daed77c28ed79e506b0381dc21b69d6cd81d4ed599b26d042cdec16eb9ac8f73f170c99c1b5a36c573100dd2d59d2e1a7f091e3fb789e10670a5fe9103c06a8bc511838dc53396509e4b835d0c5481de474d4b44e7db2f0c09c99cf6222628a6da6fcd425a0f05a0a5e879d67cd85816191bf0d79d7e9425388b44e874b703cfcf99a4cf5308e6d3755ebc2c0488a3727a9ff6243886351f1d89009150226b0ac76ef652c95b7b1350462def04ca14d1d66b1fa48aac572b1da830a9049212f64ac8daf41c0feee2922e42068cc6056742d24c09afdd883cb1fafa574e9c8a344ed27fffe4e886f95050ab744074e89024b80999d17cb136867683454d96a3245ba965e0f49660fb881783747b71af0d51244a10571ca5de8bfb5cf2e0ba1ff166cc885ac57419fac9ac42c77ef3ab2095b48c55b88e564466fcdecd8246c294c2c4ef51faa90da63dd9ef35cedc155fe57065cb8e54191679aaab0f5f462a49c38a353980a335b0394d12852383600fb5ace6516b18ae89a59d3b099351389ea4ca860728f86915a4326be0d47296d44f09bc78f33e1dccec4384f811ffa1e272402b711e2546120f813d084b4b8aa7d080af5f2d6d65791d1bfe040b0a26edb71b537a70fa4c2b071850053c77d3ae24007b43150cadfad9a16613e1cd14af93ba1a73e6cd615ec0047c8f45d6832a8587ff76c85eee934358bc1cb5e3254b80fb64a10864a1527c53681d798c56a8d3a076150d86728f483a221638780d196888a165000416babe5e406b0636930fc68c08c11c0268af80d4b0d9255ff7c7c44a2da30dea6eba83cd43b74b78c8cb482e672e8860c80b37321c8a2d281ea627675101c3038ffb01e831ab380545e3381fd494af616ef76cf00526ad1fee0bf6d90b9287f144e6820ac1bfefcff1ad9ff973bed40e1422de924cf5b049c4bc4602145783537fe91622ef6b72791dc3d12566710d59da14283c4bb40ee4a46271a347ee02fd9bdc704b8e31d0850fea0184e38fbab287517435e04aa889db625826fc850bad6d48a6cd2ed32fa0307559c197c5ac203e70a1f8fc8625985c302a412d1db5e051374ee79e0328b6c2db92d11727434ddab94d59082c5ea7046bd809de4dbc1a6c79ed0ddd809048ff110c39fb48bf0b50871210ce06df8dd156b5fea84563d9463ec1a3c88a05744e2e73b2d2df9826cbd2eb87702812c209a90fa9315c4aee08452159fe08ba83030b75c3ac7e89f9ffc5daebc1f6076e1b95a89bd4c4226b4626328fdff9b5cae39174b443c30956a78ffb7cf6024c0912a835986c7c05c75144262b58baf898ea832afb33f9c9dcd37715fb24e42a700008401d126567f222b88efc589f167d1bef1a38879d6f061f2bc326bc180b57bd8210c16eb2c533cfdeb77d1f0ce7b45b77b583c162c7653cb4470687bed62612cdd6ea85131848f44c0ffe33580462e805818cd7d9b2adadf00d872422076ad1639913c5cc5072078f93031b1091d47a1a8a85b858cc168db95c25957b0fccc4bff16681d9a5678b025c5e12898186193494717248112879e9452a844bd20bf8200255cfbd91c76776b594697ab8647bb7f3a662c0917dcac08a8d6377ad76a6cf3936ce4b93618a8ee3d66ab4e8fe47c54bc7c7fb356c3523c2e64a63e115e47647fac8bc1772895ab76bcf47a95da2ad1f2ba8db028de509aa355a86ce38766a14efc833bdd50e2519fed3e983aff5cf6ee2105a974e165261dd53c629b0f7444db14f7c48f39e68ddfe319fcb8c514a45dd65d83b8ab7e54def38273189c357b7bd333d0b06a06f0c36d8a9a67c8954b38f17d0e151a0f52b23c6a81b0d657d53b417d41665783aa4197c9eb321a03727c28a1d1ea42228da47a85dadd5561a64d711b4973fdf1102981cc0a489b5cae6f6fc8e0c97da73d55cd7c880351b649919fbccf96e732f26632939526a7e33f40a252016572bf6c1b7d6e363304c5946dbd4e8e92e3d9010906f186667ccbd5120db3ed059d50ff054bda0ef22b49f597ce506ab7a0a4e85e13c5197d5b59628f028385e9be85f45059ef4ef591290a99d69c6a474e7cbc6d7ecf3b3b2bcc31e3e163d973eb6ca8ffcfc9ab0dd1db2c0a21e3f22f5a8fe649d679f311f76f9ddcce7a241cf4aff01dcf2a8a501683ae4aefec0006947f8a9162ff3a072c6bb3b0fada02f25dd8d5101f236fd90ad9f772c22a4fde38ccb385ed857ace94983c7b8329a6cc1e7180756328a268a67982e503f0241e5f4138164c8b8d0782da2f039246fd3102faccb92f54112772b52c7b9e4e701d4584865baea1007e385c01ad0d694d25b013164d115a90f6245ef390a9510532347913766c214c0dc94b22330164ef9d2ef160572742542bc387aa0b5bb2e125ab0283f12001c51d71cd65ebd04afc28a70aec1d66ed43de729874314773d90a6146b993e255ac43a30aea519bbc4750c8a667403ca664437006e4e64ebe9f185af4d58f866fda4346b41e85f1506c1843828fccb5f57ed5ddea59fc818cf6e3535c57ce26ec20eb36ca0ff57931a01d84028be81fb2bb80b0ffc4149813e604d391fa319b9521a0898aea33da14d0da71b72cf4e8b29a9d4623088df8b01a440f41e920fb9cefc669eb2f6e663a742ddcb5211bc688a12bde27875ba0aae3679e6f7585a9eec3fb1f1e4a0cdf1684aec1369748e6ebe5c9f7d1303ee84898a7a557c710e3ecec0057b5efef4233982eab5d9b86a01f81f71445d3140851c9d41eccf9482a3d4fe8d60a474efbf256901530d0a0c39dfdf8c68ea334f239875dbc8bfbedf00baa93496bb6db6fdf2c8602f91b715196b6eb2d3d8702c4ba2c7591355a498a5159d39705ade5b29cd0ba583883a1bcd8bf85af6d44a8785ea69db1af6951882aa596df59ec64856ccfefaa2bf42560e61d026f6583a2a903ade6a1627991e0ce6ee38c573500d853291b64cdc412888d60e1dc43d981ecfda5759cc4e015497ccb729d4c8ad8994a5cc20e8ab2854878f0f3086f035c572411a8240f8c0e3433b0978b24a66121e2d0681816a834af7860091ab478cbb5ab91b1d7912ebe8d09e6ef5064bc7c6291a7c54c1fd5a92f50e9b23930bf1779b2136922546f16ba646098c839f608412057bcb58853db2a24fbd4d8a6c2f94aac462ba12d53226225b3b881c77ce9373df006a9ee7bc05c783c0ed12af85badafda2cd90e9a2473b7d46f3469c5a73fe98612c747ea17228dbfb151daf91f316d319311f2181d444f386285e078593d4229e59fe3a832841512568e42b8f7972ae558ea7da2fe9f1ca1b8e2e9eb3cd8f745770d8aeda58286864cc557cd735e661de2237d4accb6a4bba34bad1092b95e28b29d8bcdb9af388c527ca2089210cf7b6ac5beaa03b433c6315d9b9d7234c6c7ea9e63359f63c088e4a89132cd04dc8dee3c306f9a6eea897f4f4f780c50e2f303cd82bdf012268289144f8678c465f4a1b3e39033c43a2db4a918ed310b6224c5a86b805191c1b5f1a79160969edada912631584da92b7c6d6c442dcc388a08d4784497888aa1c388acd4d97318b7fb2b1d1104218dc502ed54e530ee98ef0ec7cbd7fe7ecfb8fd9a19f7ee85818a4875bfd050eaca2bb8520b4328eec824e414b07a87b0efd60763201f683142ee2ebc43051fec3eb4a0a659ee7b58a66ba0695121ba91eae8a4778d64372c95c99ae6aa47e9c4ffd062f590fc7d5c40af49e6392ff41ae51bee23d1f9963c2161ad3219ebe9ee865bf7d74a85b8c40334990c9ec149aedc9f3626ce6bd04e8e680a186d51879c865b84c65f7c4098e5e2c8ae30b9cbe520ca0e517286f4ba4fdb8f6c507a2f190d6eac93d99a74e682b0464c5c9be99bf5ba66940b357669c9007b27f19fb831ed86cd5cda9643b03d688e2ef62e13f10a841073974986e8b177c3d11bee275c34caadf272ec66f1c968805c8abd575bdff5d660dc4f6b0d2f6ecbec6b6a3c555edb1ae6b36f11be99bf4321042a924ea9cdd0da8e997c693f6eb1b7c5e9525594583ac351aed353db9c52fa8b6322f3dc85fc960f5561f652622394ffd7fd4809e01d0510b66e1b607ed0938cc46ad41d81473ec9bcd2d440e3df6aad2b9ace36f71b6e4d94459f484f71cd0f81df355643a1541692e928ef3711fc71fce73ffa210f872a17c2151c8ca42d34104c2b29e80f9fbc3538cf21ed502dadf712c1e1550739b54509dc7ec43b54e9307ae18c6e8198857888529fbd2360f17feaf8de2110cbeb3ecbf42eb975af18b7d23b4fd10715133adec8ca15a9c1b0f8b498bce0dbdf737774daa42523d88a813be0450672ec5d8a886a4e15e7cbd808f67ad3e775ee56480ea7cb6ba1731514ce9488b886be8c77d7f59bba0f10c7a5dcec986f61d652b0a8c4aee0191b4b97f5adca5c8b85ba3b03e0067e7b1cac59672d7204b764e6a69a78ef4811e18b0010d44ee80db3aa1b45880378983cee6f97c57772bcad94e5bc7cae5cb9c61b7bb15cc45ab6dbc83d0ef26fb2e978b89155bc10fe981584219a1bd6fd341fadd86ea6f8ba96a5c6f3ba079a55111d2e18b78aef1e69477331e2fc1ae92cce2400b50c2f9a7326afe213e745b2f3b539d4e22870fbc356ddec3c16b3d01ba3bfd98fdf187890002b38464c2516685e2a472c9ede7e7e42e10edeb9f112fa72b578265a9538eb427aa5900283e190028115bff54fc785d2e8e9a816c606bcb3e73c9b8b55990dfe1358d4229d91050e1d72c0d483063e19bf6582b2e662bd6ffe7cae21235a8d68fdfb34f84939a9c04b4f6041676928585041bbba08d56a89ea71c7f7caf5ef13f6fbb7d3f30d0f2a07795e8af3212d95ebccf2182bffa3ecb7c3c6692b6db1a373095689e98bb61ad6ab59040301e0b8f680bcf279ce7cfaf95164fa4635638709d34b3f94e0b8b495fd4fe93d52eb38d705c166fdbc93aa0fe6225a5b84a443143e5bf9fd08a802632414936466a0f3205b0f5a2985cc988190b138e6002d3a94f3069b380ee05797e06c1af4253233da24d838da5d4ab74ef7cc589b3aebd0024757417cc21a5d485cefc1b51d1e4cce4249731cf2bc8d0428f71087f25c346a366c9db41fd7725b6da58f318e29ac7c8525f8a348fc80fd3c7c4d42a7425cf21965b2015c241f88ec1c2b26c942417d38afd1d816c9f41982c7fd31bc3124cfc9d34cafd452946be9245cd24267ce081f06f8c602e11e28793f68b6a14cdf2a7727b578dd5298cb16fb8c66d262b69ac89d8e0219cbdf02b5e7738def7f88a7b08a2c106f0426e1fbd9a1adecbb01a848f713ffee5b81c06f3146f22cd03f2f9feb88207c7a5c12e06114ad6c13d4c7df72b73e7a5868e713f2f7b345cf4009dbc6c92713526ffe104672db672470b54a223e4329f721c3b86ed9091322e82ba7fa8b3308f654452cebf9da88cbf937575e30c4c642fce6de9a391b627e4f91a7c64294a5a045256a76bd15c02013028acbcd50ce87c6f0f166df0cc5c5b32c07214aeadcc7409962ed28a6ceee71db333a0545f0b6eea9196585a2b188b4a68cdd51ffcaf1a0380de9a8308ed8b93935c72ea60abd066ee7dba4c4983eb78a5a9dafc3970a744b511e2d8cbe045e355de1c22e7b95c0f48be2854bc51ce2b038bf6ffcf327368ad482b202fc91ba5e28d75aad2a21bf50ac8ea3ebd536860a96c04e05bc4b87019bd4061a5466a51ab9555c0c353f2626290a9716e40019a90e843c85d28f156b56f2e01d78252507722794476ce552a86a74e34b27e0c1edecf583aa9b10c515fad8674a1d73565a57399faf558d2154867b11fc6e8ea7d259e4d1b059f987ba0bd7cf38d4b586173c2c9b7e42aca21c6bf824bf51dd077fae7c67c28d520e3d30feefd5fe4bdaf44bad80a5eceb3d474259572e854df2c19c5babc3d73910af4223a2780306662fcc6d4d37b2f5aec5947600469c08140c76eca2fd44c2319e268f0670f4106c76c631a0811cc1a53367428f50c4406bed7603473733c4a0b8ec598462c5c0a795fa55a9f5575c72e9ba0baeb2bda18008de5c30407d3493dd66f35c80c3aa98d6b4dfdecd16b9224b98a7a99858c60b5af8e1724e4c89c48248cb9bf83aa01e5856334ea4fdfaf82381add6400887f20bf78df0ea9668b8af0e9c239276704b9550fc11a70dc5dd3297c4a262e52e0ae6fd5241668bf716838507c17efdc87947d1745db290f5751fab5d17e0ef5f461e6b198b341958059582d0a10288951bcdd36be709dd62a0b65b83a89c8a955b042a709684726913e6a11095fadd290dc920e07c6a66adcf662c952bff509d316cfa7d91eee118951db0729401b478df29101b9a3dca79c893400ca1dc1cb41e5722442986501ccec4cbcd63a9e99d2ddcc32a694b07d1d69d18d0298acd9a7d72a52d20dd5357ebafe084d223df8d3f22f228634484d2bb62d8160fb9cd82fda70940b22165d9cb6a9342888261f52a5027af05164098bf9d20a5c9084651eff9a20e19dddad3d473f31137a581241454f02d6904526ed6ec1c627a9f44ec53d8c1c5fea98f8482c50cf813c715665d803d864aa07b61ffc5514b4942a1886e2286592ea27b546798077896c0bb6d8cf5b9a3c1d530bcf5d2861dff4528804f7ac44623f0863d006a4cf8d7ebe94b208651638588b6950181c3f29fa5eb4bd0a7caa5bf1663d8b458a99013a174435e08d8034134e81c6439ffbd57c9a805f4c9fc308dddfec73c9f0e4c1f394528bfa9d7c44c3581d206ab26fb4a5bcc2cec9e5c9bd37a73345643335b8ca12c8378076270b5611e7a0dd4af164239d15c2c554e00026b695fd677ed8dc85b0401d56dc8dcf3a867fe281b5acc88ba2d4f0a81289cec914c630e475481c348c0b1a8427f07ab4221db19d1a781e217f181c2992df2f258776f13f3c1cc32122302867ee555c0b5149099450f91d4ac16066f931918264370ef0471c05f33c990c6e617d33b54484e919ea3f2d665f2b829a0d0a862de44d5cb73c908da7a535d80a049673de4d313681e2d6cf991c95a030db8ccf6cf2791ad27a4e908508fc6f44dfaa8370e2c6b6877539ce5cc1c6fdb5a2aaf169c9e1dddf202282c2ad1665705d95bcebea880115c00c597a0f3bcf1cd902e8ed84aa647c0d0dac9de4e8d6016c271b3fa4010d0b446447436223f74dd10e7195d6fae33f240d751eba52a468afdeeff89925a1910fb2199eda47734cc8b7833ffc40a9ae63ac0325632d565f819065d54d759be57918d12430098cb5e147180686ecbe1d645d596df725de801dde121f0522d495c56d2beaffa13c1dcea2e71698eb57045ff3157560d1e697238329a5bdd8cd25e56a684cce9250450c47d56def43022aa4a5fca5ef4cf6d704c3b50d1ac19e7f2fe0b584da858f8f6ba1be82c781de717089f1ddeb59755efdfa3b01555397a9ba7a6999921264bdfccacc79173227ca35365f7b789ca00b550032bcfbc2e800c85097dddf58523234c084c429700b4e07584497cfa672ba54357664e3a9741675ffef14018d2901e093c45345b15afdd75414e07f011795a648a248ae089043a441d7a4a45e9a00b60f51dd40862c5f7a855258108ba600615b88a03c17857b23645a8dd9542dc5f2c74b5fe22bb70f30cd249ff1658be35f57aac40b71e1d5005c212042248cf1ff10690c359e1e4c25320a96030834f88d76642fe3b6cb07d4f84bd1bf1cad09c5b7c6a37ac8653069695a6016ccc00da8c7d54d906fa00e50081d07f783328ca415b83d9841485249131a2a6a3b63e36e380d18e6edfa548dbc34b9f1a04a41940bd35500b688b6e0f276bb9704b8a7c67f5b5eb6f7f61851c6e7b00a47b0428afd1afa17db894e03cc0ffe6326f16c86731d83e30d7173ba9dc3aa20301ea58d392f7bd8b1855e5da2326505a7eff66081bc910750296a0cfb87e0515161822085039a79696ab64d9e0d67dc504220be8f4c8e2473e239b63743711e390e4127d003a246ac46a3d311a76d131b7968b900e1f25ead761418f90b09830bed89e1bdd4d5643232cc8db490d5b171590b7dcff5d95a66764bd0816584151abc02b8b203203fc830572dbddd816c1ddb3ebb136006869bfdb247a8608b45b9371b1c61f01a3a3be85099a9cccb883000d7202f9bea43afd29b7f4b0848cb756e179a8bcc0ca617a127cc7c21f9251a02b54772155a80c36b5db120c52caa597093000c2a53234801326faf0ce493bf0899b17d5b39c59390064034daad91611630a87fd1e97282419d474360015a2b68fb9a5f00db482091073d37ea4d0026e66bb2badcf7f05cbee09077e17e9842474e584252ea067545de8c1cc2a26961c176ed53ab2b0c082d61fc5fdf31840e7d7a931e2a319acd137f351b6188abda5fa920a1a5eb54099dd50a5cdfcd6212be6ec1901df3bf389a27683d0177e2e2095fc1b69efd42665e594028ab26b80a4b97c5b77e17993df735c77791b4ee022b9720d70ac0cdd08d57d69af1fdcdc19e266263b4f6562d56af1541708ea3939c91b156d0b73ae5537b25e1aedbdde014fb27c82dc802654fbf6cba0b52bb55d1688586ff723e9da60d8257b79440ef1d4d5ed67c5fc25513afe51474239d1460e19bcdc46adc4cc5bc94a2c462a1a47d311837be392b54e569a6018a19d08c84de687d2191da7c6885247c7bbeb17933809c406e3cef45decd871355ecb720cb6772d332af771a5f80ac8952f9655588404f834316ff76edd4c06ca8b17d6e6d447d07d76a5c2a3524bc6b0f4cd5dd06d824fea2380cebaffee3a38295c94cc7881a2258904dcbc8c33e9b7604121563d30424085aa4b0831958b96f150c5b1bc2e7a60a4037e1bb930342612186a491df4d0189ef8d4c662b7624f028ca717f178957d5dc73a00a04e761184b771f2f10e85dc2baab5b2f8f922a7e9e217d87a656d40552e5f1f46eb318265d3ca3a30b1b6e97a7582d774fa6cdabc9af7eda7a3c79056a2761174b449bb88980b681721e5c2fe35a1be86d3aad9ec22dd57d1e2fcafaf5f96255d52cf83b094cc8fbbd5a104a7bd4c3be6dcb6ea826ad04e77750e50fed29d36520282864c620d49d5761745391bffb1710928668c4efaa6bff93e53cccab6f05671a26512b08c8dd1da53d8b9aa8b3fab9e15122af5025cd24a9e59fbd40eb3bc13832ffb33f978d2a4721a8bd93425d0dafa6c8e20037ce3b580c5e035276f5a521720cdd885dd7c9cfb6dc2b044e8a290ba00ccf0560a5882c0eee2e29623de24f9092b19c0bb5017203cbcdb37db1180dae14d6ff8affe23415d350f9a6f519c13cf1510db643710c120dd1b800eb081109466b2719bbb6d9b18f806920c69b789ac674e2a6395a0016250fa003266869b76d38c04b16a980e9bbaf594bf3a9f4157224c975b684c3958490d969c2be501a00aa18b696fd389da4b821ea77af7c94944fc5a9cc5e314b9c70734cf6d673646bad9737d63172eb22703be7dd2059fc24542ec06aa7e2f94c01cfb64ce6cc2bc115b4cfda258777011075951a47f076f7b246a0dad6b28ffaf5fc5aa6214e870de161226e757d425aea388b5a76bb80e8726c9b1f9402e05e80d1b702c2717ccd36539ed4403e8a0f40e207501cfa5bc822d484b729042fb6dd0ec02d3240bf6b26e05c9c5ccae90880cb9d56ce4e8d03dd7b6245f45e2076ea92a2822104d225eb1d931cec0bb1c6b3704e7fda57d466016155d44d41800e064eaae11b18579c97b9b5e68fdf7b043bc36113bc8046c8a1900a0758f816d282cb2851bbead59bc0af3b90c75c9a74c4e6bebb6cc2e1d3dd49feddb185ac51b62a3435f950d75f5ccd494a97e0ebf03079c4dc1069a0220991bca6233cd7e26e49dd4788ed821d55268511e6833dfa894bfe5bf7ba585a52ea2921c255d5c57e2e8f253af3edc538ed3b338c73ed57a7d4cb14f1a758c843cf7d601d0dac4d86fe899d8f3eb96540c697642e1fc0496670bac1d26c5b637bd46e642e0dc8897f0f1b6747199a425b28d6982bab040a5ef0e367b12804db82d914b7b5b34ac6b331dd245a94af90c35919217d2cb5ff764249b18f4e86446d5f1404a00c6ab686595cdecde8c52a446333b4cf674ec5f58b9e88f4c19b573d7b02df5d8ef4d6019c82829e6b62155cac7800f06d9948cbe96c91befbcb9e62eeab30221844446eae9b2367136ca43e65d9adf44a1b6fcb834d7b32d915316d8928a55f99db6f5bedccd9acd4bcbb97a2b35152099a62691c4f437246229ab1d4ee490416e3debd6f91a4fc8893dde5a5ea9faba79a93bdb0ee7e4c96c2b96101b8b88089ae4e5b172a9f888b45adf66db458297b7438b365025bda6f779bbbd7453fec061616f674d423f69fcae43a4f1cdb204a1c443a242ca201d3a32e54fd4871ef45ebb69cb5f8094dd9ff22abb76006de72357c194baea1e757a44b6befd4a0f5ba59d4051ff953e141dca31ebbcf84a7f6386954c64b6ef16916f86311d92657b4cfcc08abf4b33a945c63be1c5adbb729153ce58a6864304a06b57d2107ba06bd2c23cfab36b14c6fa2212bdfa31c8f640557ef6996417275e660967255b020c5c24a1231381c0c4086862f456a4e7b7c0fc74edf812ddac9ca677baf3194287f924e5c715d7f70ebb1e212a835cacb32e24e03bca0f1735b8cec9571609a79b7fd58df8438af00ea3e1879b1fee75279e2259dce6c7eaf5b15062736abed55e8d89356308ee57a5d0c876345871b48ef9bc90848a4c6ca95e6a768d7060e81fe6c78fe11be91c227fcaf7fcf887af9f3415add3fe58ec1f386c5b84e99d0423b7c87e6957464c7abee388b414c8455ac17236f8343692edee10319b04ab68988ea8c310a1aa8a6854efa86def15a538613be3bc030bcfcf2d685796ad38188d2d351dc238b2b1e5c189d495ee875babc7c7a26a30f6691f39a63bf581612330496ddc48abba640ff13b7a59f603ab5306cca406e40db94c8f4fa711386183cb2e7231a8a45a6f0e750c08a17f78ba4a79b6ec0cb3143a342e5f6023fbeca60a792dbef73bfd27445a328214a09567ce2d4292995a25c54d20701af867db1893744351ee91c5ed08551bb590ed9cac684048dc0b011529736edefcdb507e14c9a5c683a99e8b2f812a655c493f0c0e53f4b9d155ad79d40f6a172d88bf88e4862da01759573e8e621259ba809ed4cdd8564d05baf9b1d705f42964f4fafed511461da699f0cd02b88a7a162617d027381bfdc20de0d94fbd90e083d8333ffeb30d71ec0ea7d74bb6647845d4ada9449a0ea0cf637553b7ab6350b4daa2ebfa619815ad1780e9e10bf9340ecdc85b9ec7e159b54f90ba2b75ae17dafeaa65352ccad1c4c59325f34bc4516bcd0d96f42bae6f0299cc8b712d86917282945077e3fbe202e785702b00b7f40a533add6ef797d997519f7c9116be4896ebc82a9aff972e8c9c440d3ace2a40ef87eb5cf043c17af9b8cfac130790de7001e3bf198634625c7a7128618a51796e476ac8fea08b133f10310d91975c5c399daee2da2fa223ce583b7a10b7f54f0eb0e34c6229cc8fa4b48fe2ccd2c809f7ff02916c46011e1ae063e73ede881d1a5f9ce6657f1c2a56e67338b00920e3bc5f12b11d59c0449bcc1d3950a72a25892a1ad57deaca4a533cf006945276d18bac5287f5d5cce670120c4584acace53377daec30c6bd37a90ebb43508914ff9a0587c6f066752c5c3635959d0c3683194c183d3531443d5d8457b7dd13957a69add8bfa6faf8569739cac05d031f2227a7b73a34431bf635718cbbba307d6496f5d0f818d2609d06ce4d1153ab396f89ac13c570656d25684821776faaf6c5d4cbab86a989a9bbd2a308e639df6347722997d65138ad706c92ba79a857367082c45cca71ab44fb74b82a4440b88ac28d6822d188fa9e4268280e9a24172cabfeaa229e8ebd5a53a9e7f16cc1e07632927460efda576929f55665155ce711d937b10edf43672eb1bee13be022472591d64734b68f468b7c733d4ece04688250527e1b80cfebfca09f9db8697a4da41123acf3fc92df7552d223446860b21cb4cda39d39d262eb3a55becd3f2aed87890ccdba4e1efeef1516aeae0b55d89c88e44a956ec007339fc5f9154b0f8b7a1e5823b7e11866b8b5f5bef91af2f499e6e632c46d8da98840662835bc1cb10e1401bf3d2ce7c786895d4bedd15985fef5576356bcf1d5d1ffa96868a46ef1cf095cecbc8eaaa5f8e86fa7103a17ef6144828c32ee42814e7bbcf8c51122152881ee60f175e2bbc1fc0b5808a009ebe3667daca4a96c55aabc3eef1d52d7228cf6fe551e310e0ff962faa208cee41b36af0e2ed6b7fa0262cf8d9222a35bbd07595f376989f660f92922b12acac16f1c5247a5a466a5e397b5d9d4f01fcac588c4f5fc370adb4823cde5bef29129915bb7d3a5ffddfd8c95d579f1a30ba433679346697c8b4cca9f31214b5d3d23c9c7986a3c10e98977f31e0aa446a69119c663aa9990316f077ef840aaae413548d596a927a2b3960c115ef26aba294a0776a0988f5023b77f1e4b168e5985254ae8f562286bc3301e03956dc8dfdd10ca2bd36578ab0acdb5ee041b083d047caf43668242caa8deaf6740b42af3013b1a32bb8be047e5af92eecb0798c05d691e210212c59f3fa0308079fdef6b8952f7b87174652b3ac3242c15f56754476e15c77d25dee74119a528f44516d7317c08b9355f057d8704dcd07b427878ee0a81f23fb5a73d5fa7263c7d7a178b2bed5f3af545d857e07643b9a77f2c266df86358b3d7bbd4ffed841f73d95f2086c9f75c6616793a5f8a83256058658e68a467910f1cb4e18444b54a3372c6c00b36803e85f806183fa5419c82ddc24693814cb1ec0598ca0c676ed6f8aa025d38fe084c42b5f3dc574a55f25093ea8a5f9d0019921fca400f94e1e4305d7397cae9af709dd8541d263eb52b19b2b9b76010b5c48f6c7a03a3dd86c6b52de4c4a912fb0519dcdf58785d146745d9e83748c74be0d97735a9469317608893a4c0452e8651a60114dbdc542bd0d2a037544ed07c7712a99ff8dc6845f98ed458c5706b5c6308a48294f582a85580119d45482b0eb8b6e4c7d0ea7ae19fe9dcb8a868d8de2ccf1aa105241456e06260e1a27defe53e31eee8f19c0f21bcf42ac855c779f346ec148836d318cbc3ed719208c3cc0b3d09f2bc56738ca777b1af4960fae6570d8086cad2a7cb7cc30a90d2f939838fe36f770296ad763e720f5d86d773ea60f7969b768244f0542241511b93f0ab55369b6fcd2ac4f66ae5880f8e1c5b42edc9c972b6ea632707c6b7b6597b667182d3e463ea54eb79b570fdb8d751b340eb316ffd508c133a4aa0df5742cfde7bc51138afa0fec2915da986c1ab86a85190cefde3acd55f392ec92b1087ee49c635cf1068032482c2406ef100b5249b4b86721e46799926c6df0fed699016097f9f5f51f055033752c999fa686a562ad5ff332f6b30fafe99e89d21a643ef6be1195f460f7f8c5c3fd4b09e4d247969a9564ccd44cc595c1364d067b6ff924b6058ae369f252a53f232d671f41b6c4ac971374cfdd410fc224812240284eee142424b2f29601be1df6433c5eabd580177e4ad8bbae953fd260afcb37fed308940563964a6f4ae88ce3d0fd8016a1d24d166e9ff99f45fb1831ff877d666a433c3a107d98eb28c169790138dc8b87684a9a31dda33f0671b68ed3a20331019f6dc0eeecd18733da09c1af4c3517b3ad8e9bc853f117bd5053961492c81c066ef745aa369af86835440e6844a180e53c364a5f4e0d04c0b9f8652caf693a42acd78783805017a48e7863f64a574e0a042e7be51fb1977e17915e94d87391811f2f34cb50d8c98ee24629c3a9415739a36408e4aa11c2573f9c2dcb373728ea1c4f0e639ee2ac7b5fb040643b57bce7f9db305c0863e7efb0540e5ed7c2a55eaef6649f8b47e0c8b4c7d58eb4b5f2c4e5f4a3f04ca797ecff8fa3f26de28e572e24259a6dd667ce86d3fab99bbe2aa7479cce74b022411a57f8f5af9124467f1b9e251db5f51d4bfc94fe7364d09aeb4941e468dc05f5e0267550874e7e3cfb14f7d9302aa4ce15403a5be046fa8a2226379ddced3f8a8f09a5742fc1f38d46ef651d493d09560ccd8fc49f995a9dcf1a25027a5718e51f0937de834383971c0e1885742ec1701f29ec6425d41c7ccbdf54adc283942c36dc9339c346ae7a692e5812c12b7bdf15431f4575c6d31ea28700eaaba27581e7730ac20b273ae6ec844a4b48682b36242a6bf766b55da97ba5967d841bc23c50d803af70991240fc7c877a7533161ca8bf82c788aa0ed4f6307baa634e49ab6b31cf72805629fb06de1c9992a748c9cf3a15af3b34e7b9c8da5a87872cbd690cd986beadb9d327ebe2c00c3a3bb854668a90aeb61ed13673ff562b3e23ad1d489bdbc75fc9929c2beff5eeb11d65283964688a75c9f8793bf0ecf30131be1d3927b886fa58365fe0e813ede9932b14c83533978be7e3ba6e0a2db6e981e8498efec3f660f8ee90122b42d4f5d51c19cf1aaa43055e2f4b871f33d87f53e78aa2f306c3b876fa6701042480259993235390c0163e48871feac989655806b8622af6c62b0d2003b4361b44028ea0a776bf55790b52e79394906b0e1aac2b0f551cbc2d92ed614650521df15e338a5de213128c36f544633fda3d54668191f401bea6a7cc136f5530c709b4ab52ad528dc6c3af40b5caebe446c5ed7fc14bfeb1fb5c93808410000640d092f39b3266ef51a145d3dbd382d7d24654ef345772fefb8098eada8054122ca700033d023d61d3b5d496425e8658929e689376d8946686f9c5b71c9062fe501bc7a08ddd57675173158029ea9bb8b056126d6a59b1c513e99d9caa55018c044af783ec221867a795c402a020abce79a57a05cf116907028c36934a2f56553df168158e513ff8f869d30ec58b9a08e3efcef7293df50527967ee3b50c5ee043cb65f72bf70e1f26a2ef2429600edc741c90a0b1bcc10de7daf1b9c74756404ebd787b56a3cb13ca0c960853bcab212bd718a7360edbf194dd83bb8ef0b6a6c0aaad8e913c5616675ff3da136816e7532329d689aff77af15f0d59086031a09356c709906d65eafb2f12fe83c678b56c41f9f781a52611583ff09546106917d65682a6706892245920da225a2dbb33f3860d105c484404795053a04b594a59e084e5d4fd941fd1858817e275090fb4053821e7f39ff7da9fb4e82061fb5ff316e414a072a0b6289c3d4388c24df0fd7d434a2aad30ccdc17e6b5edc56f9804e741683ba2adc5f0d90a36c3c3be006509015f22120b6d305cdfc8262e9c6a7642651338209aa9af571bbd355109f01bd1015c69be2c5083e14a8428208273f8f4b2db9fe87f5b62c9b800a1755524a6170aa5ee7cc17c39a4c2385efa09fe17cc26736f5364aec75cf13a3209c9b31dcfd7adb50c10982abb0f4be03207f3d2995c1b23045d11a2c62039a670b63f41b6c00a24a12cd25e91f290349c0140ac9e8937dabcce21c2090bccd6786ef8d3dbbe2593d25460a89d469033f615d72a1a17dbdc7a42bea75adc0d1ab484fb4025f57a2de6c34b712567a1dc86de07e734211f3b45122dedcad729548e9258ce4b615f1ca52f4124ed9703bc4e4f6d18ead78a8d5aad24196c41dde38c900ea6b44128618871b048a946ccadfba955fca52481368858e27f6ff4af29de950c5c517df93f0989988a3cea728476a83516fecb7e2a577675c8e03624cda6773eebddc72bc5262cd61d6317d47ab09afd5f9d3d8cd42d084940f5344062f942ddf578cf92e9a819562c74a41d70b83b6365db4db11941338f83ad9083164320c67348c4b8f1e4c7b0832986f126fa02d3a92ef31b8a5d0c8a39afe54bc600095f774ce4a57752c0719130a2fdcf130a8d56a9cb89fcc99ba5a34bc9298d1bb34f451246a508a76c0ca99eca30ddbaa2499a6b256e68937c213e7bd5eb3be7e2526b113ec3701fc3b047ab76bbf5a2092aa9a74b9f2483f83c68eeb08c0ee9d57832f8efde2bf2eb7e250af8de2f7de81b38ef4df735d771f0193078c78154cddb93a8c4391f97557616d00073198e83cfbd79cfeeb25441c24af60a2dad65a42a41142c8de5bee1de70b210c800bb218463b5b9e110fd593bb8efbc124f556bbea8f1c4fb08c47ae97fdc8f53cde33ac6efd30857ecd2da9c7a92f1ce590e40827dca0e2c30f104f1c91c3173bb0c1075694f5afa6b47b8e24d074abf6fc94f72e3b607a1816e06e0b1e1ca111870ec0084246892d6400e2098837ae7497c471c9134989534ed9002f65fa57ea06f8f945638373b1d838d2877bf71eef3e32e870f738affb29b9512c42f3b66d1b6d0a87951a094dc7dcd495fbabe9ea2ec4e10c9b40d32d3a96809ae54955f0e14a9f92a112d8bee7de4706fb4b8a3aa4cffd468a45689e65575e128739969618b3de6ff5bb6b0d88862c48342b9422d1aa649abf198a39df59d0a14f84e104122b4ce288a3fc725aafae0dd38065608eec05037c9a164f15522b0c3ced502b157ea0d2d487334820dd6af5144961e6daba2c24386c02cf3009cfcf83e3595b5f7584efe76758e729fd5bf42f7a1a7a1bfa2b7b6d1ff2ca171cb7aea7a7280682640ff85953e094b7ff0ce5e4ed36951b8bf4e4bee3cc1328527bc82b37d95154774f34ed6aefc6cd1c5a78fb3a9cd9058d0a3494460c2ca34454895221226a2217b77d5e45027597f8b825b3a6baa60ce83d117e50b49093110ad4b09ce6a930204e4ba903008fedc232c0324a74a567642d9a8d86868626876736cd273aa3a1d9688894285175f5a9d16d9102cb6872f3d0d0e04a5367c76d530712242ba6e44fb5e5a46669cb51b457596bc99868fff03daae3ed98ec51fda7fc4f694918627825c3f8b2d72d67b97a388af739d5b55d1286580aa7bab69f528c158de05e6c320748f5a29c90eca1e577f03f652cf5f04b8d333196ba2a7523b3a61a4d99ed2bb1fbc4a28b337a66ebbabad433dd30119866b3d911284ae4edf5a861e250de5ea55c29b7d7293d33b718a387bcbd2af54c4bde5ea9f4ccdc428ca0bcbd326def38235b88019485c8dbe9ec2ee5ed41e4ed36bc5101082b232dad6892b7df337a4684bcfd9435bc9989e155a4a8434befb4f41e3e27f570fc09c95babae8d665105fa8954ab9263e86c6f52902e2b1112983651a7eda7dcdeb3a605d5a16dab44b5b6bd266daf4adbafd136cbed2a25dd5ade6e8b44fad467b9856fb98eea29d227e553144b5d458af4b314525ddb7d543cddda66b955a2edd5687b3dda5e6baa4a548dc24ad4ad6d75fcbeac12e500ad4891e29e595367fa4f991a95447ad57fca9ea5bc3d957a784ac6c2abc89e5a237bb6a72a9125f194b15f4d197b90fc6c25cadb2f53edd0c90743cff2fc8105ab3061e3c499355cbebf375261dfaff7fb3b9b5837186790656318dd8b265f72e22b30f8f0ef41fda93efdbd4d7fa3389f2222cea7fe53f6cceff31fd95334c9d8f714d9c343e6a0489c6e7df4456886613565e8bb9f661463e0bf83e44776a318fb8e4291b3f65775cdce4add4ff7dd0257d8b9fc51907b1d5f234d757158b0ac45692aac92223dcaa6c29a14292906015faf131e45fa903e453ef5204eadd932f79a355de63e1724b85561a277d4abc2448f14837c575d277514e9837aeaaa54575ddc7d52ff48d1238bd0923bc8067e96b55a13f68324071d4cb1855192175994dc5f133642134e9a4012c30932844aee341336938684e0c610909041900c4aee3613f6335322891d3c81e2022daa945c8a9c2d7009aea44fd1769fead32dd43732d60f49d1fb7a14b7871b2906015f1f0bdf62907af0b17ec81d1c4124f0f641e9d6ab358648308dd22dee1d498fbac53d6c02d76a5f2cbef9e3d59396d0b3d92f51231e3f37f0cc9d67bdc901f248f1bee792dff712efbfff9434e225c520a87b8f5d32e6fd237b3c12ab6480f194b95f4d992bd1ae481ced6aefc6751eea03c3940aaf5a5c5e409849040ca561d96b76bffaf57ad5ea94a3823142dfb3ae8c306bb6933065e8efa88098cb03a697551a8bfb027f3abc293bbe27adea7a4d19fa4fac21155eed388facb55a5292acd25ab3ba78a8bac0b2f95469404b86e841c9538f15132ca346d4a81a194d1a547db45805f80166092e971085546629816595d67118b35ae98c9e35f55d57692b9d65ca508eec9a346529f73f112c4c16ac595369349ac581d25da37495d2754a4cd0a8c388a4b5995aa9d1e81b88adc40596559a52a5518c592c5aab5b00e851049655a6ca5499684142433f441803cb2c1111111151df2a5926db1480710a2cb34ed6c93a5927eb649d8486888c0400002558768feed13dba47f7e81ee5fe65ba4dd7e93e0d200054b06c9bcd66b3d98cc8683bda5ae0aba563c22a6dd61c26ac3b775905a20a4d998eacb476f5bbae80d20e304ba8410c204421952b8d0558b6256d495bd296b4256d49b9bf396d4fdc8ca3bdb8b4ac60708ccc66331fb23d986596a441dda26f7141b76bd25015353803ee0ece806fe509adc032eff554e986de650996b572ad6d25d7b7959e69522c4273d7adfa46b7840337c6e8a20d368c6c984a4330f1c4c60c4f34214559b777776c14ea0ced300587807388b134069230d460228e1d504421441543d850050f65fd0c7358e1114c95e8d2844d30948ad6600287245cc850d653a609fb71828518532c2186164b63b4931658b02c6f991ecf1a9ce9597731c2f333cc01aa240dc2009e359d3465e8e93f150ce00f9975ca54b4f37da567ac6da78da993e89bbee99bbee99bbead58c9f4fd446f27bea450a634dcb99fa1ced6f9eb51466bb9299e32b36bd545e98c9e0ad1a65deb5eaa4ddff496de526a9932b54b9976cd3add27749600f6aa2f527b1e91922874a6330df39cea4da83fa11ea761b3569f531feb1955aedf7192eb5fa0b659150654f456ae40640b81d9ad1eef26aa40ca66fec91548aeaf07524f42bd09f527d4773330cd66659dcd66b95a6a83c49873ce39e79c940ca70c51f66620c34835a49a509edff244aa25d58e80becef3478b1ca2814acf885d06dffa0ff91e7c03eff008b927b2a217b7969dee346cacf1bc702fa4610228ef89c0a6d27d8f2adf5320a07c4f693468eb571ff2e561e125d6d267f9a2a9c9ba75ef7debfe754f736f736dfa7321c294bbe7d39d8379f71f6af4ba518c71efcebd1b3d7272431c133f649c536e993cb1c8c28a5c8366cd4d9a321d44d61e60e0c0b2667aed2a4d980e26652469e2850f66104dd8fc8114248288228b92357c28fb344ca1f3b7069e5d87318b2563ba58dccfc20ca960a84e81fbd366950072bf0e2965982d27920a9272ff4ae9196ac31d9beae27468aa8beb1aeef4d2eb78863addfac81e5675b54eabba389d57177733765be6e8450ee692d433537aa67f951a2680b27f977a6622255192fbf78c8ea3ecdf2a3d3391685041eedfa69e51f5cc445232cbfdebd4bf4f0d9b65a5337fb569ada9ea1d85ba478631cf6be566751c7731e6bdfb4f891a8be83b528c75471d45f6ccfa53fe945f531bd120a69aa2991dcd2c4897b78604b6b31a21b820aa0555d84fd9b74276a8c25248627011342bfb96a8c266eda8c2ee1b4f43b3d96c76a4a465191da24377a95ea60a2bc0186dd4c06856f66f5385fd5c11479f4bea73b25b63e29672df1661d9ad55d84dc2f8d69c30ab4325f859568372d7a07e15ead7a1099b2fd8a10548536c1083184029fb9568c27e7ef8e2063afc00871f08f154f6ed78a574ab3665fa41c0f495c453665e766b9cd3d6ab261fedca438417b0099681951a81c15aa5c940286d7a7a1e600f10ec01c7d0b01f40b26c3699a0840420d982b709a3201e663acce8cc8b26fad4b55a422809544c787abaad7a021d816e5b18338d26199d0d71b57e80b2a68bfe5d0bbf6638eda28f35928c0e35d1a7eab2d233176316eb6f6d74889650ffb4c4a9a9555f5ddd8b863ed11166b3edb38dce5a55d817c62c167d026252d2e4f46437b26b24244c59468d7a46d64e72cfb2a71642c892fb148a18b3e576261bd99382d2c8c5086a8ff3449ae18a3ca7cd2d2f84707af20228e060b28037669061072596942146497f85151ea03cf141065a0cb01967d4a08724acc07244499f62c2cff478c278847ca0c11220a4414589929e356126d0c10f3b28e5608aa02c25fd27ece7092fc20843c9164c8270a3a46f4d98112082c88110393031c550490fe20051a55d33e30061a55b33bbec8071873b2c6365abc51161105169e2830d5a94f6255402cf52865f39d0aef6821b4bd491ca5d4b0d5846999cf44ccb7ce47e37a7b4141f93c72cc13547a0059823d0d30069184e9bb035d117607a19e5a8135d8302813251261fb06c3a51a61c7f8f5184f318ebc5715661f5f6462a8c56ed85cc9a2ddb1399359cb5ff63aa9fec29eade53af7a47c6521781ec691fa3ea3dc6d4798cb314c759ee1867a9639631341473ea678e11cd666587df31be5cc7e872d6d8f29871f51c233e37b2304b202097af0ed472fc3b8a39aab3304b552a070808c9cb81805c0eb4baea402d07c24ffdcc66a9b1e565bc6a74195f66a91a67f93313f202123681ed77804b606a53f0f2e3758b0abef9e3c3b4b666cd56a3cadee9eb5d8af03c0d7380e8bd4e31e9db349e4f42cb22f13ed6bdaca438ef5364efd3efee53b49131eef43eddfb1e294e52bc64907ef758bf236775c5e8b9fb70e4acae8346e0beed16a2a929470d355628c38a953ad414356bed70700b13583697fafdd4afd58e8e647389287b493b3b750805254b161a0f78306ba30d3ab4831de494c1c44304b007c84304b00708bec01bf04eabf55a5fde88abab6d685e34af97d744c1cf0cdc9fb7836c68bf85ddeca6bd66c040054a413c29d1441494bf4983c013896896bf4985c0138989d3cf07caec6d08766bdaf195bb7196ac59335fa64ced9729536372ad307384d965576998422adb2953df4206c6b91d9f592d1064bd7c30336019ce785ad00b6f6c1fec99d07e86ac0ada7a4ba93d77ee85450ffed8b99addeaba15471c4a51fe511458ed246badd64be9806967b93967a6b5b5decaacb516776b82db25471998adb5dd1030d76aef1b9fd576d58375ef68fec0fa39e78a874a82ddaab54ebc92e26bb0eb674154f6b85103d98ed976ddb86eda9a2bb891b60b51c81185edbccd090f758d509ffdc0f96efbf4f2f66a82396b68fe72db49beb4ab55b9ff92238af04381a949ceaf8b59b9ad7e4678952752126b7c4f306a074c9cd103a424c2f85a80bb3c91928001ca0638cc1329892838c0a8272812d324987c76762d386a57f71161559e484908a1ccc0384fa4246849ccbed9e12533c83296151dcbaab80d656df8e2bdbd00515e3761044659794544df1354f7048ac9c739f1e42d51226e5010754b66e085a289c314082adbc46ceb30ad814b7dd13c49ea5eaf8a458f06bb0e3b71e4c4094e24b56bb298e4de91bb4990bdf28bc6a88a9195faaab0ae33121242aa93a0127ee24af74496f0a643220835fe3806bb0eb36e9e48473865d95b70509b95a39bf781b667bad601b62d5410989527d2ec06d411f86a00e10c213047c61578250595832980c0605113fc1d815a8263f2d4220e15d880bb3cb58863868f079cca538b2160c9b257ae016f796a31841fcc0e85239aa837f268568549037718e90852b679221db1822c63d5ae179f8c66fa0f57d726a35ea6f55fa6f9bbcf9f057bb4b936abba9ca64c0b74362be9582bd95597ad9ed7dd5e75f271cacc73b46fbb7ba5444a074cbbe6523a60bacd39e79c4df66d78d37faeb7d6d6dab556cb62d1aefbddddfda96076b05202d3570ab3033c51a9396526c8430d4de1d5d9cd769cdd6c6edc01b9ecf6dd5e2fdb366b7f70f5dbb6d56f21d86ec16e236520f7996536f776a416e07a6e725d07aa20b3f9ca60f2258780d992cfdc103e253d43bb879ea113e9081d72bf87e81954eef710514d92fb2da5937a067cdfdcb49eb2208c2ff76d2aece70934ac0c418826577e8043397b6045c8061564f1340333ca7e4ecf542230f75de0a97d2143883c91fb31f44c8ace60b9a3424b888ee4ce03b8220658664c145501a324e20236a080a2c40d38e85076658273777a46cf3035e172ff484184134d9441040e31002afbd4a9c22460830ba220230d3268f0a2ecaa44ee9f052b000bf024842b907c61058d2b658b2103a02294663a50034a12ddb5a12732d8a404c1213332f845068d58228353326804960cfe47cff0c8e0bba360a6592977b9956dfe42b0550201f2772fbcf91ae3a11a66c68c3a2abc418137e0990444952ceb5a115764ef371eecc3e2542b3bcc9d91b973e10dd7c2546e1d01f26501937c7fc39b3b67ee6c366b10d6b58e081d90d0a4944322f054ca9666da511ada4da69927d8530a28612061832ea894c144025f1421861b528420a568c91132ac563398354dc414b9be864a68546ed0010c296578c08d37ac3c61c48466032496e80087b9832402885c2f0609bd294b06b9128124b70cd144aed7818d38f281e618c38c5c1f13ded499293abc208a1fa8000bd20384dc50e2055210d2b0a11eb1248a1d5e28192b4892eb61c29b1adb7181a7be03316b01598a2c986aa0023286c8828bb2b23106176470f1c312295d94d5885c6bbd1767c50376a167e8776ca67715de546bdf12de58fa431830c8fd4e88249080b8e23ce41946eeb784aae43e9029ca3e093444e41903a420d6c863e43e4ecf4c242190b24b78d34a63e4fe093600d11995fd01895c8f5daae0260f6ce4be252a310b726f81d4430e729f0794b2ffa315449e5de4f6a14a7640eea7c29ba661b14e408403cd0c2f6a3f68b2b2c408204421a34a931b8692e061f3bcc02c1ea83021d787e14d7599820716f0c87db06dc8fd1392d028aacb62873372fd17ded420ec700318b9ef8537ed860e3ac87ddb85376dc40c41db54d201885cbb977c9c1f9a19496890e4c91430aa4c20485981129619baf021a91661040d663e0b030766b532a534084b2673fd7540123304d1ea9a92eb2d2b690951ee9fd078c7051e5236840b2c03c1979a3c63805c835890d9c03290c5e33954a9c9dd87e3a3f41d434d9a35db0c29072a7922e52094659d13192907a2ce28d30be91931cf0fe919b17f6fc526594cb81229751d9e9568bae8bbcfa7579e737e887c9fbab5cdc89b4509dc238222caee3828bb43e9d6ccf439c2c0a2fdfc3af08dae2a8d754a4d6a039fbe1bc5fe53855d37a68bfec8ac864c371d829e2a6c96b31a3465c299089a7852058a22bc4062c30a60b0d1c5d30f5868559423abba6a92ec3ec12853d06c363b52a9d0d7a58681f4b50a7db5529dea959e99483818651a667a3b6b1858d2db4a8f32a5df66b446a352826020c4c5501799be23a253323d673443a6ef8e80327dad8a4c9f1425d3732cc8f49b52b74144a6ef36fefa8bab714975284acfd4926ab55aad96a4b4546baac2a69653536a72eaa006ea19590b35ad839a466b1a6d5a1bf50c1f05bb859e95b4a48fb901cfb2bb6b56994e3add3952eccf9c8e14b7a04d88de277b646b36c92ad925cb749dee534dda8236a16da89b75b4a14c3ba14cbba04c9ff2ac4ee919a50adb664b2c7cd6d337a24c2f6bd1a54c29a54ff7a95bb42665fa9a5495ea127d65ea620634e362d6748f23b833085c91d294d0e8bf3a8e60c8ac0281ca349b654b8a34a8872ab9c759250749111a42889ed67a46a443dd5ad22df08d217a7a44894a6a749f32a5bf4fdb6ca3d16f41b433da5a004a306f95e716234c57fdb435e708eed32fcb6c9e29209ca866cd6bcad4d7e3093bc074d5ebd0d1d282cab21164a95c574d302a93238434e011727dce0e4fbd902773d6f4517fc2b6cf09dbc886d2aefe2567bb649fcc25372d59b366b44ad5d54648607a224666b42021224a29d949add44bf6c8d6ec52eeeea3ae4d5817c5072966c48124861365bf93262c02603c9941098c2c51b451f6bf0fcbd1ac69172658d646b3c6de3c916e8892691b4d99a66123cb7485f8e67ceb1dfd9cf3489334684003491b475c006b218aa30626357050a2a29cff287de34706b38ec1377fc8ae51ee589df50c25450bbe81fb1f165c67b3c6d61a262c67bafa35f45d6bc3e84bcc26237010534987dc16b041eecfa983dc20981498b04fd73c6ee3073dd1c85d2f5e9adce22551e87cbb6154084c5389110c2cb51802500fca7e5d42e4e486a1dcaf47fd6b2b4e8575b8ba6886c87d9b15e47e7804bf9bd18248e8999c595369342c4257b366667a70356b68ae2c74b9dda6ebb89a3234d683c3f5e4fca7a43dabe354ca5389d6681255a24b948936f553cf842a8c5eda0daab33b7485c82ed6d5205dfe1ad9fea87cac4cc39b976ecdf9f125d7f06656a04c1b851aa6d04d7aaf4d4d4bad4d893553d2766bd2b1cb37bca1bfdfd674dbb66d7229190af29c32f3b549e729bd0f55ba35f34fa6f915f69ab3bee60c7090ed4a0520a4e48954a54996bdf23cce9c73de66c2660ea0c0e2881c38c1b1c4ac9cc799300b5439230b1a13496a8852ce4fa59ac5ec145d35c1f493be33cd1406d4539899923138e030cfa41f9ce4d9349bcdcaa7d96c56a6c2c900da55d304daab4cbdde9b0d48bdbe9b35ab26b8f63ffbd1a679eb689d0a9dbf7f3c7a467633f89a51607d9851240b3f2b303ab2c60f484564d8a09cd3151e3586a30c8502aa350e0151f8d1adfa1c53c8c0ec05e3cf8ca75bd589a44db98660509e004801fef1ba65866ff68ccdddfc41a6b73dd3426770ee53fa17093d8325537a1b9c1c6b850c2152cbf431f4cc97e98dcc6841af215a339d02894c8d2aa574ca5117d9bbf5ceb2b735a6dc795db62f28398e934208ac9959255b06e42b8515f94a51de7baf1447f2bd3308b8b156a984a224d7bf40c141ae4bb9fe2da022d7ffa86f451194eb8120110514d90428a2e46ea6ecd1ee061cf23ca69f5db8c619d9debe631dd32eec4238287d8245b6d99eebdea8f509274b3c4146b692ed37566a66ad135c646b9d78ca1606a5b5465864db037b216059f732c37a931bb2bdcda2b407f10b8fff68016162876c4f42cfd024d99ec6049b1356c8715244b68f6951da2660d80f2132836c3352933480642755b2ed4113cab6668be46405760e1dc9f67489452a2223db69869151b6a7507a667291919a7823dba97463492f82b8b8b88bdcaf333d43c5c8164bb63fe186d27e859ea9b7cfb1dfa1d9766db99865ad3389dc1dfe98f8ecbbeed7be0f8fd7249e1d2137e3ac725a503d759d96e3eba89e3a5691222a09276787a7c75774bc4d2709e1c1c9993533af6e777cfcb645041d3667856e250d718ba4d0b2c7e9161e7bbc655cfd232d471f63ea228caa8f63d1c759d61ade783560d92bdbd0eb78f040adbe8930fa8857ddc7e8531413afba0f8fa78e9304268160789c9cd80ecf0b4388c46024fcc283383dd0802409492f9c2418bc5f1499d3a3c74aa745ef3efe53f618f157f73c32d6721f648ff896f7f84ff9cd5e7997cda40ff59e9e91bdbceff38ed330d12927b6c3f3c29096a729997e28efb57a0f3108be8fc7f07d903d45a8f7207b7890a2f7fad4f15164ace52bb2472445af3ef5beea2d30d731be3c667439abeb525761dc921a67a9ca2c2e75ac7a4b4c8e6ae4214267b8e9899672c1a12121e9a57aea40abe3f2b51a73785237a99550ddf284ad3637ecb47b264049ba1297aacf83f602d15ea5ea4970b9ba7541b2c3b34aadae7a6a458a28515cdae111428486394628162344767866b420d50e1acced77782a2ca563966387c705275d47d4a9461e4f8de27b80e0c8c22c75bc4705bbd10601ab06d464eb79dc01a6cceb55e49222ea02425a58c2c1ced2bd6c2eedf0bc2084480c3d33205ad0bd27ecd87f4cf0bb5108fe6ab562c2e4cece94b19ee755504491393cc477ef310201b1bee34031d771d38d31145652beb8e4094ef0fdc78387e8bd7cf40891601a1296441ea34fd1bde0d6adbee3b1d577d4afee91317c1d644fab2e8ea9ef1857d731e2dfb1aa1eab57fd92b17e8a35ba3c666cf9f7d1558e137888cc829a684276059c6ed94ba14c5eb7246db51ba0e2d1aeedf547deceaa3015f9aaafb0d676ec6284c5bb89177fd5b2e27115298a77a34154880e759803249e8748f3c6e33d6ed3df9ce52c39aad2f10de69b8f6fa96ff81beb5b8e6f5fe0ee0c1e176e4ecc97685c0f24f5aa23e9a7ee437c6ae4711f3b8edf0301ddb74f0a9bb4266f9f14e7eeb29945de6e0d9804dd08430c5366ebd1fd2345ef356bbe6f3fc084d11aa6e77de4147867bb0b3cdb5fe89998bc5d88134adb288a46a9746b3bea556194d66db429b3ddfbdb0386eea247da748f1d07621d1f27a7c2b060224a1bda4e83664d97b79a0b2761aba40979fbb77282af0b0d8ba15ddbb72c55b6cba6151452398629b37de5047796cd2b79cb45c420e27b5c87c77dfcf6d0adcd470f24b88768213147e491a3faccb1944f3f75714cdda75ef58f8230d85caf7a0bfdd4778cb3e45cde723cce72053386cf31beac8e3bccb130cb1872a341231daaaeed2d2335a2b5595dc6595de1b8515ab7361e17bab56de510d72e627cf3c737e7ed96ea8ec0e27de799651db5e1abc04f89c5f5b7664d2ad3032c20d3935f08033c6d72782a0ce867d6a2c1a930eef43bf3dda22df247b762b04da45bf4b735917e05fa9d9e357a9a443f893a100a167340f0a2ceb79a97bd1f9bf3393da8b580d0bfe869e84d68d8e94fa0c7e99955a65f01c8f6246a926953a213e9167ded0e84ba4781d9c2b9e078c749a9117572dba834be39dfcde379d6fcccdfecf03c6b7eda7cf3c787e2f1b1555d17cbadd9f2fd5bdc58df5da7fb1de953e453b2f2e58e7a857d0faf03820f41d207fc478adcbd2cd6fdef5bf7af4bb6aaeb76ebb296e0eef548bc599222f7fa9f52e4484b43a6e18d9853e9d8b4eef5b1ee95ec29e2ce9131ef4df6f4bddbb4c875a3c86d4bba75ef754289ba759718dd35bef9c30e31525d5d8555ee8e33539a1022b3e6cbdc8d54583dd7e7382e051e759def29d2a7fe3b8af4298a5552b41f296e4d8a961483f4eb753e9f129c98db0e121183a452e141d2077c08cef2e153a4b8b15a2c9034424488bd4f7d7fa7b14a8adb414bc65024197b55977d5d11ef674944bca49032cb15d0d2129a96677dbf0552f45a409162478add63f5df634538ee428818a1334b4be0f2bcd89141eabfb750df421f45ee54178744cf3a32be3b614049ba520544a329554fd2952956996a95a99709034a4253ae4eebca97cf87b301f3733240b632814653ae2e73c9f396d5f2794a3279a1392db7e91a0f4ece934789b06e6f83b35361e18eebd86c70c813ba55eb610bbaad91555d2d63110bb38c196759af1afb312f5bcba4b52e06a6ae23622396f63bf62ed8bf206488918ea98926519a546140802401a140ec9d32d6b6709f61118e14b9cf1ccb53c6aac6920225793969026429aa00d9e422a3489bdaf77d36382be4ecb8f0829021448c7c28d4c17f36dd52d22dfb31e9d331676442ebca7e6aa4e124af9286cb266b772572644ead0d04241e1f68c7c37fac5993caf6a9f7a8faca09ae59c6cab6e53babb79062b71373b16bb94eea2daafbd4a7aea3eaab3e4b7184618d2ed731e6f8c7c2cb838457cd32f4721c080806e8e540e1558f19c5ed2d9fe5eae2f61b8e3b428cc08c339c72d109affa1d755241525f913e453ef8a92f84e1a6e394d0a06ed9733875154dea9615b7dba74671236dba6543aa44a7d4681275f2da054b9d95148370ffaeb36dffb6fb7ccff92e8a3aa87f341c618080fd4dac5b34d3a628d0bc43b96fa877a358ffddbb0eea1de9d3bdc8c7fbf759ceb21b51e3eb1b6d88040f11d2ad2ad3c916f1cd701603e9d6763bbe469aeadaf0563798fdf6d65fb3a661f52c3ac34fdbc6b404c7dce57d590b49ea314712de258614ef63fe53baa41ef358ea3135dff0b60b109ed545535ddbe7e65374efe3f298532e874f3d169222f7f092311752e448314848c6c2d787640c1278e6db715c77336bbccfdf59f37d82ef095d0e92b1d47b629e225ffe8d3473f91b3b27fcccb19bef3df6a97f644f7df82e7323cd5cf759bec48e6cbdb8708d698823d79a92a1208b629096a71e6b798a14bdd8eaa2173ee631648feafbcd95862210a019756fdcf2e7a13e312775168abcfbd8a7ae13923e6210fb98c7ec6348f17bcc6719ab173f520cf2f298ebbc3c86f4f161fde53a2e87390ce9137397cfb21b5134e42f06862210380c37e0c51cd6455127e628708ca15bdbbfd148b7b6a35eee729b8e19c5ee309f256b143b520cc27a8eebc41c86f48179cc73903e453198c7dc27c7599fa50b4ccc4b0e16cc384b2e87b7e9edafd1a6bab6afc69cb1ba5ab6d6b66db6673a31887dea31fb142976b17ab1238bd08cbbb5dda6439ab7b75e3436f6f5e00fd778f6cd1fdde73f95e85284652c1e179160213d88b490baea3af5dda3499fa29818eb51ad05d9c042ec89d81bb9ef30875e32c7c7cc3dfe8530c0aa985b1db7301596aab01cb7ac1d17d22d4b64481351b86b8ba430333dea96bd10ae8e453ddee32c7d3c35f6788fb4fc688ecf82e116b8eb15e5ae8c3ad111776b889ee9000c89f6b4872eedb5a74f76896c7f5b1516ebb0452195633651607a1b7e9f61918f143dfaa1be8b281285ce28f0421a46674a335ba41988b2bd9186c5947622cd92c8f614a8d528ed445aa2876c57d92241b124c3668d0e35f88537332c92020a1c85740b4ab7ec51a92c64cad8874f70b705a6a761c7c22cebbf1d6112a62b27d866186c96b5320ca247e6f8e8f1fb3a0201e978cc5f613c2edefef33106329b67cbe69cf321d8bad61c7cf3c7b7cd52afbbdb293d475aba9dbec910d06e072cb3b9b6cd94c681411ab616676dc7cd7b2f08e670efb577b3d6debb61f1d281f8e5e588db791ec781f7bba87b43ef73049024f3bdcdc0573b7f7fddd42b7c81af4b6e28723e6ff6dc76b9addbb64b4e5be525bf70f7f264ea42a698fbac81a49452d4272d813bea258e113a05dded23071a5e40e68d7ce33a514acecda906a73a4b61b1b6abfc6044f7ad6e8054564a94be006d4782d6821bd762651824248831867103db0e2400194dc818c21a01cb2e71efbdf7de6b4f41dc75f69786fbdbd40ec4db24a309194d86802300ed17777614d449473a1c25c1f4b0e486a0a3a33bfbc21bee5edab71bae9bbdf7de6b618ed8976e9d9083094cefcb25e7cc1ddef4b76b375b82ab34c37d0b9c1596a27929140ac519e99ee950d4feb9e3744c49038abcb57ec911b4b2ad59c06dabadb618350448de72d86a8731ebadd6cb142f1d88ad8d39e24a134080d80026280716a3eddab796e33e30b495e4c9a10abfe73cae1b69ae69bc50c991038c0d2a317ac82af5156e86c17a94ed73dc807b49b6b48cbbce565b89721db2aceaaab7afb40afb6ec959ab47302a6075ddc6aab42cab491fb9b5d000d3ba2de51a810ec4bd441080ea513d9adccc896ffe90a926992308cb6e50a643b89734518e1c30256543b8bb714b5c12cc0d5c12b71406b61dd87594062878c0257149d9768baa8668a8f5c382c83639a78cb5736b813032a46049dcadfaf212a270334c162f1d88ad4d401053d2c8435e5eb2adc9e84f5e7283cf66d9244515261d0224ffe48f8e32f1759988bd2c16a199c97d67549ee4fc56e8d6bc4dd5b94267db428823c7604951059ced53d99ed0b467db6cf1526b6d2246e88c46b7ca711cf7bda25ebdd7eeb57e28afab9bddb66d499ebfd4499eb7e4bc4d2f51607a4b97746b7ea85bf3ab37eabdb75611bc9188113aa3b4ea9aef68adb592f77addedf1844dd8766b737678845417f95d4a7b8003df1d708e1d30cd1349061ee41a046ca1f00196cd9a932ceb3617602e4f24a22432d82f53a65557f0241ac241c782af03989e9c304a199527d2153ec8b22e5f51cb57a471055387e40220983cb1705243bae209a9466ba3f0f37e4931d6c3fde2ff942dff295ffe53e6f84fc9fa4fb9e33f258fff943dfe53a640d437528c6defb6ff94aaff94abff942e3f65cc7f4a1dff29451511a6e731b2c41147d931b6ac60d9333d6ba489195f45e01c230ecc6803845fc69d172b70cb2884e7082c9b4c4646222a2ab06c3aa5c254487377874316d6508c1a353c4d245a968c4307d29860199dd120aa3202cb68101da244d5458fa1e07fdbf861712ac18b27b5f28eb3a4533a8896d0a774ca74d18ecae8145a49197e4247a0a7537ad633b20e829d52a14bf40c5a853635ec459de895890494a5816a07d1b7d01326323d95b2d527b404fb181c2815aad42d4aa7748b025128999e42a151da48c78fed940f689d2511837504a886c614af3af10066e98a0bd02063b35a50a103098b232cb45882a4c51066a0524a3250693952a50c347250b7b1735903e338926630042a49664c41c3a9a5862408486a40e3490039249138283da191a5853514a3060edd2c49941c32a461e5070e880d17a01b7620831547ce20c2b6cc585b3c19f2c116508cf0787a46c6ead7e811a49792fe049c1ca31c19e90851a677e18586d11f4d327dcb0986e9f3a6cc8d0c8a32a3e66036d1cec93ecd963c91d0c8423b1c2ef78325e2f773e68954c5882c7b96cd8d24eb84c933a906b5ff43fae6c46338356d4c3d335f308650aedfaaf48c93359a355bd394a9af5e90a8438af664acd1785ac2092833021495cd3dd6eff92192c3a364c3349562a8773d61ac07944d27d1f6d8dd75388f14ad8f68b7a7bc75f157755594d73dfc4756b2a7766feca1de5d07e513fa80b2570bde451b8ea2fd46d551a3b891393f25a546ab191d0a321a9a056155cae5e539fe93ba8c1ae15327d431d94399aaab5225a79e1e5aab854ad46973aa2e31a7fba24e78233299e1e40a1b43f84531d5b973dc538f714fcdb863b2a7673d14d4332e68a8e575a65a31e1a7c816b2a72545f6b4904d32adb0d3c6b4398d2e613385299014b7d57f4a7c599dbdbc1fbea728e672ee3d3407942de05fc89e9783b1f020d9f34276481a914968d9426e4c9fac8d7eca595db7a248712373807ecacda995be872f8a81f52832867a48f6d4a06a34b41a37a66a49a6ed0975590dfa6475e823c598775427e6786761969e779f9acef6f4430f88202269362b7d5064adf5a4007ceadd0f55a92ad55a483255262535cea842a50a253e2900c959e85414032aaa08e248d1922ad8201b248a3a2aef4c3cb23a55577d3da3073d7ceb02cf926b2a6709c3228a19ecc04a6d96b28d893b2db9a1211bf491dc67b9395557157568d99dda5975d5cf12e5dd921bd3d6545df5323bcbf5d6c81ed99a4dea6e2fbbb891db938ca36d7788c8a8c27ecafa7b746bf537695baaf5db1337abe7685d537de7543d5aaedecc92b2ee29d78d2957cff60e2bf5db3d25bbf1ac5dbb7bcad01e70dfcaacedaeeec8302eb7a53af1753d336773733b55e1dabfe476e79d3f3605ddfd43135180b0046f3dc8010f704703541219ac81bd2f3e27784b72c25d6d0877473b60cf092bf0b6441278434206438011a5871ea2dc70845be0c0020846ec4008a36c5003199481bb3c91aa00038506e6f244aa22a98a1ab783aafb28aa4bbd48a84207ef6b378c422a86e082128210488553ca8383e9a3a20ad8794260425141868a7b43c8a3828b6f83c3a8a3028a989b6588a34289d0bac1b4b5543768970a1e5c1a0e3bc51060e88be68da576cd8e4ee194c25994da35bb299a68dae507d4eb21b04de3870bb0d8850e7845850f306e42840c2b5003e78032c22e79221dc95205a7f2443ae2031c7019deacf514b5dcff41833403d1938f05f3e2d2dd2dab6e5cab2ad75a6badb5ca6aad3504bbfb63a1badbebb8d94d2a915bdfeeb6b5ebecbd97c65adbb4bbd65a6b676dbf1be6c5a525470a48199faced36bfeabc697f02fb967c6d9da89a69e37a5b203847186c8ee166b05be34f4e817314e77ff22451de1782a91c5105da4d42b77a1c73675578238e94ccb1e4ccb1164cbe1977ab76a5b3ded49853d03fdd9e950fd5516bdf59dbcd4f52841c821ac39d9fd65a3b673761d65a9cad2a87601bef3d9d32f32d33c8acb5d66e95bb7d57606e9901d34f6bad9dd5432df9e68fafabdd26ca1b292d644267b8c254ef7ab503a6210a9dab8802cdf5fb38b0979aa97dc071d7fb7aa9adec28e54c25ef5bb2823ae3f3bebb6405d5c4846a2b2447521429eb4991a043cc22264cf55691d40965e26452275060276158ab51a123f43b06ad7abd0f55a3c249e1a8dc1a154e2989a372ef87f26a5438a5248ecaedb89b0a6fbea7c2143a839f7d6464454d3df8a138a2287484a6e788a2744e7290d972a926ea285d1fb551d7515418ec502a950a77500bb512b5837a890d0d0d4d07f50086a894d741bda4877a890aa354aaf0c65e15a640d3b3bf1c5901f23c93bd6b96d04a98aeb4fe9e1d37824f3d83672b7ca1596042903d98ecfda361a8c2982f97b24f15865b49f8a6b17a16b692dc1a5079ff708a9c212abcf1fe7d2890e94a951c28f063bae2d474c52357e02abcf1be0a53e8dc7dfea03c720db2eaf8b3fb6034a9baba047a061da1cfa4abae1db037dee9cd7026f5cc6ab660a6e49065ab020c38d2a1912ea1432455d86aba36eea352ee73977596d13372931948852a8cb9e99d37d59174ca6cf7c29bfbaf0585a29fd300a4f8ea859065965ab2eb16685540c0f35d9e485314e5ae706499bdad87d92105ac0a3faf1a7f74bbbc0325e9ca24b80c5fdf0a9f0497f8f52f9e97cfb23629b600dee53a2d7f215d4252ecde428a6293e52c2b134fbd907a22f546ea699843c3a63922f87a1e21442a2c7cadd5d21369793d0da2433c15b6e3f5428c50daa9506d9e6e55212f3401e516a9e7b92f2378178ac5b128fc8e0da766226591ebbf8fd6201ef14a8b107769cfea9b564f9b2a6c853985aeb080294333656a2dd2f748b1dbc094a9e1c801eaaac73cc81ee98928d4779e21f544ea8dd4f7d453a0baaaa74154a87e5e130f75d2ad7a1413d5e94844758c1fe24af24c99ca719d037ee65838cbedbb2f77c931a6ce5aad5abe127330d631ce72953acc81805e6c3a8790eaaa5f8d46aaabde65a4b4910a8d2de3cb980aa3cca8b42b76d6991c658acd88000000001315002028140e87c442b160344ef524ee0114800b86ac46664e160bc42cc9611432c628420021c0000010019919a9cd00704c125299a93602a09eedecc4aa6756412c0aa17baa6c97f0b2ef085558e94f3f19814becc041aa4a3403c8a889803003e58b71ed41509c83c74d2f0791f38f767e2bf167dec602f752bcd17fe5dc402b5855647276b509a8a6fd41ab6a2654bc23f23c09a9c4e1130ba76926a6a98c14504fc75a5e7d34ff44654f57dbc19db7ad80aecc256445b9759f24ca34979d95297dbcd31e98ea2344938e676a3042db3c9ca96fb8f212350aa8ca5e82b45e4bb23a6df4dcc693e03b4f300d5a166e17679a104f5b2c49b083009e8da2825b47985381ff3348e125d8f81696197618b3f18b187044ff47e05a585a656722c1af706ccaf02bb87acf5e8b9d7c508b13bb1931cfe6b98fc23d5c76a9ec5f3b0103b0eccd6c8f71b9d6f6fa8059d2cfd81d5ee21909385121d56397b0e55ef2a0e03119aff8162f5055adfb288d92e267589d6b45cc874b96e394d018e7ee79c3944ec444a150e6cf85ac47d1b820d5734dc2e6e442804c2e22a71c4b761e8abf4f7b6085826ba970b8bcfe80ad4a78947b12087eda22ad8822bb893f98a2e6858c4a44575f390aedce143d2b9905ae91d11c95b30eb31ac263c60144b6a4054543c2abd0d80ccd5806d34ab164705a082e88b2046ad0c213090bf5e6ee9f8a3de5649e13d49aa19244e18bd0bf4f0f704324a3090ed1516a40793b93c61a5760046af82e3672d932bcf67a25b03c316193d556fbc94f7623fa7ad53d8417efca5da617245718df4b53d32129bfe154c9bf0e19bc47d381cfb651f7639ff31893a6a51e9e2ecec62522c51ebc5f77af14355a4df5e82e64a8dc517c6a7ce514d9ab72497d2f93e0f01849ba529b360546901d9959c9bba8f2cfae4894c7c39e17df185e04f5bbd39203bad7421415b9979bbb6d9647cf1fea14322abdc9ac57c7fd334b89c758c9d948d5669029a62fbe760b333887e67e39a51403a453c4779698b919105e6175bc115660cf61c171d23c2a4440173d3b45100e447e7c0a799eeabd92fc9388ea6718b21420f24021865901ec361e7391f511c347490a058ea90e82f64822360fd043fe395200e5afd8f20014f762e628812b582999fe387dff41c0fa28e11eb79e643994dbd0e0fb0c3a198fd72045ed90fc8dc6964fd62aab37141ca148311afcec2ba35a603620a9e15d0fc9e5174fa025ca81c504e3db5b0737fd39290fd135ca9dd4792d10e7f4f57b84cc8dc7a05cc79ab74ece1edffb4eea353a22013e85e3ae3002ff81d3a02c06047d1589d1b04bd526c3ba4e9c61c93705fab746b4dbd84732dcdc7ad624042b25548decd203635f90cda63cf87709f8a6d859e0dd4d2873672384d0b4f6fa660cd637e94a32134d1f261cb7707c8febf3d418d24c9ef9a6255604468ddae0900f1e3646cec2236adb0146f0ecc984eb0b4201e265d89c9c4bd105b92ba3f857d827d115e7fbaab7e03214031019c80f71e8a42bac685b6b36fae7d9b9da28b1e4870357a64114c1c76c223f23f891035413d4c1105dc2dadc1d0441863fd6255c5838fe69bd2f4d3839ad632304690686cfbcad00f835765a8d3bd5a3bc5f5891df44497affdb97752243e49986a5ac182169d7314e4b227b213c9a393ae48557cb8ab3626152e62bfc096d1e87d292ef13ed77229941320245b1cde38387dfe97e1c7629c91554e6d4d111fb36fae5ac48eab6573c0ad39f9e534eb02249fca3017f2a13141125358b5dbb038109603623b9347c41fe4c89180e5dc130cdee583a667d6842b9ae08839adafeedc1dc44425cb100df83ef07e4bff1ed2a02dbf757b34e145401447512433d882eb89085a0595a6c5f8bd6ee7f88b26c31bfe0bffe33dc6444a4ee3bbb9aaf20901c7adf1090997ff964227178992db94e3cac98ecf4e13e418c5d2c372db45bd0e90a98487d4aa262f3c4d11d5db8fab2a951ea839e8ec4ff3b7671131ec0908a71d4066f9e7ceafef5b239e10cbbb69b0d017daa46c4a842f1ce54909c27b01aa8850db89dbca0c8b307ac052a57b059a7ac9b6c43b013fdc540d1f36bf3c45f02e8b07af5c1127003c0665c4878c6ac168f61c7b43b9e5346913d197a7a2d7a843c1be5f4e6d539d4159a6a889c5c49d8b95d5e2fe851e0b5d06b963712f6d9f66d4b2301470066eeeee8f1539b6486f305841d6dd83c5cd6ca08b3412ae28bb9c7f12e3a2f36823225d2e56f5e8ac272640eda6def53c230d75b53800ec67cf4a1e7f364cdec60e4c93fb4bbd12333aac5c66727287d070ee68c93bae51ba27c4d612407c27bef8ffb176225f7a9f71b196ec125f94f7dd1adc620820f5e42d64624ae2b7b5b847b27982842231fdd1a32757390d421b8f7efb1d603d75107d944f79abf81b05bb61a5da0c62d22609b5bc018743519529d41e81c29c6fdb6cc54c4070925d94424486478401d63e463809b2b400b2b4e98da334abe2534d4f30e1c3082e9a4afd81a9f7c9d635ae8a0b943404c2490cdb06ed184edbbfb47b37fe838d97d2da9de939e0035f3f62fdfccedaf5676eeb3b4cacd3bfbc5fbf30180178f18fb129a8fdc1a8c6075693ed262ee0736b15ce1686186ab97d0375d1e676ca9aad25cf61a9ec5b44c4f678297ea255984538af5dcf089f2a4b4d3186ecd117e9924d4f93051e9f3d8a1a58dd436b475b8f2d6950315ddda7de7dd291242126a58a624797fedbeb09ad6c450e71e23a10de1ca08b04ab6b11ae1d48d812ca503ca2494689ea5e5f46c49a7d07f3a48f1881438ca4c51e9e390b4c16c9080189c921d55b3c05081f2082f518195d05a4f14b686bab202f6381276ede9060029d4c82717abc466818b5de9c0c48d14b73b9e01a4a96ae443f7be64d358c923c7e3d1d3cf401fafbc53c9289af3162ec385b63680553c97725fb5fd78223b4ef9912cae65278b671b5391396677cb82e5b406ff8ac40ff5a54b97ee56359c31750fcd8da907e66441a9a15e8100e0f9b4ec743691347366e1a876a9c25375153bf61bb151d6907408e793c75f53cca5a04df100c0010905f9db72b16462345dd4ab678398692e1c86fd308c1656ebbecb65a5970b2035d10faa77eb2e09db01475649576ec22e00c5f6268b8f0ad4593444255395cbb04f5292952beadf865c93ed90edfc1a58035ed8c7b336c27f88347d3876945241a295fd8699b95f9fc482e370e2a06f4b4c5ff5b25cece32393a63f3a73f195595ccc8f1aac73aa2dee18d2d4f0122c416559ea3217901a6e71c3174eeb68f2e6d4b01ce186879738d73b4a82ee1822de9ee0687b1bf71bbdd4eaa61b18084763d71ae908f3bed99d10de15d0b393086aeb5c1b24a7128d914446f79def9f6735098bb3361846bdb3087f5e5f4537b72b65342c203166d870c00c82176f4222389ada2655b498991e226e388b8459637b06137354df06d8e7a674b5bc7826c42ed8f3e42d22f7b1ae3f05fb06ff0211f1cc430725e80517d76cf4bacb75f2624834bacd80786db5e49a8db5bb4145abc802d2a50cf0fcbe561a271c45a74b239e307b0c476a94ec712de1be70cd4355e93a75b085c9d802b3c3c4cef08ceb75548b33be3c9fa5683034d4a2ab0cecabd6491cea74e4a54ace7375d480988ef3e104791923512fb01c03c50ea4acccc6ccdcd515f68793cbdfe64af32932c9c82e821c863a16bc3c8fba1e3d4be6a447069dbae984fc14f7ba7f098013d358ad776bc9eeaaba431194bd66b47a0dd771b7e9dbe5aa396db7f4dad5d20efc200a16601f7298c605a2650e4a3ff54a33f10bab24a4099fa0f4f4b3c665e6e6348dd91e04c756978f67cd18452cd2f520242296ec92f8744b2b096305eac70da2c35575d77cb270e5a135ec24b17da7c8b271650ee785cd5b8a23112b5084312dc2a440402bf77e4fb696635c69acf620a2b450b6346b6f33f1785c7f18c8147828e4c39585505fa0804cb7268e56492e44aef33f4f6164147142c54931bb45e7c155953109e6b00eacc4863839a2c73ac445fad38fb96869a0cec3c487500da6fa37ab65893c2aa8ef74ff6ff14ad8dbeef132258dbafae4569b72613f3007b9aba396a8d177fa6c6905f9b4403822a984824cf38789600f8ee5e3cda6c2191d30e323f590dc3cb061b7e2b087fb5f8a082709ea817f7d0443f69103686b48224618ef44f29e4c3e72fc88bfc3c9c3719cd8ef36e8e3137d4221a705dd39a29eae78a28f3faf51ccbbaf2410d193fd5591ac38a5c01fb2fbdcb874b1e02e427f12ce39c50945ccb86ad13fef298ae44911f54c8097ed583f638b2b8247237c3a75cdd3f077d9489389006b7fc95d9b8ee0ab67d4898489b63e76946b03bfa78f3e9e9da3285c3a6e992075e0140ce8397a4ac1c051dd70a02c00784f3bad047a9c9d3f16ef09cf74fe6a2f8645837a12330a7cd146eb2171d74ef179b990624a1edac812aae723be13ddec44d881ed2b6bbf134fe7eec20301506d97171115ce53e635d2143544f579f8680b3e1284a5890169048d1c91400b89b4d5ce64648da4f466d873cb608955c8dce46118d8c190126b9c45558dc330424167c958e9888dbb84d2921de04b94a2fbb0e28c1d2ffdf533436cc842e13a148714584842c9404db1fb284b807a0e101e6f1cb9566d52c8cf641e854469fddddf0b59f9d561a54de37e744de415d2cc866881373c92c99f839129e84215d16d4c25e428e176b31e0452a357e7a21786c04d350bc5b508d00632148e06ced3a980cf9d68a04b61c7414a0f9c73ef01ee60191740e2b31a86f79f01e8b0e5ed2b144f0e55eab30594afcc68938477f413419dba03a88c4b4377b2db43a6e6ce27ecdf78d7c3bcc44bc8388166bcf25b2f28388e1166b0e989454091b21fffbfb310de9d1de0b49064833e9fe0c08a680701d31beacbe54bc896ba5cb9f9fbda5bbc2418d3c3e77db40f6d3509d099b0d11fcabcd4077fe93fc555a08f73005d179f5d8b262e6074aab329b6d6e7b623a0c0dbc079f753ce1b0da376d894c8b7dfb37e24255e92ed2f7c77e96366cc19db2d2110379ce844e84be22ee3c71bd9f9c0e15f3c6c37893e742838d69d05ea619037c5e72ae3705b7aadc7f680cb2bbc26c8c426c029d4cc50eb249fe4b4be3e2e30ca45859ce1dce6fbfd0427d3ab6f0b889c4d337fc43e5ed52ed9ba036946fb34e0d05553905d17cc50ce37439c15e4e332ed30200a405db148a612997977ae58b78ca9c5f7ffbc3a04df37859e39459d78b57f4bafb234dbc3252057c6f207338cb70792f47f753248aa4ba659c5f01204e852b11583527a2ac0a412ec71091f7e55d0fd11610f253120b048d31170a5ba29e70b4ad86a1a728bb92235a1fc6dd78fe363dd7f46b0e16a79f300e1df05fe43dc0c344336fe3b5d17911912c0dc742e0c5e00865d22b99f507d61872085882eb0a1b1f2642ffecb7db6faf8e2dd2f108029fd1b15899a22a6686b465166c8c459042bfeafec11e3c58c880d1424290fc46da0abc95b642a9cce1b5e1b23d977d228ca702028e249e6069d6498a365b90198da88a8bab0c0c9598dec903ff0a42964b91de26b1088b680284500a83d69fe54446147e0a6c6e946d74c92a63cc691b7878b6bbf7ae25a6cb4d70393d24c2116845467756b52fc6a33490242bcb01911ad81f41d997d15534c9b7dfc85a17317dd5b6b91ffbba38bbd8fe7b5238fc087cddc5fc59090e7d12546c6843160249fb638b8ca9eb487b97c0be64b45176d305a73246795206782def7814bc46a63700e19a07ca9be8147ba238ef8f8c9df522d0d20ba1e679f7a651f88c607f7037fc1f23f61cecd1107aeee7e284b60993ae2283b968040ad38e5a2d4e55db6e5bc52f9cfc11ab7af9f20d18ba83559fd054b44f7a81d0b9ee2b3d3c12dddb5b3cd7ba22d4a124366e4d831eacfdd0f1bc5ff604272d6fd3881aa3dba6163d8a98e066682be1ca6f2472c2ff7a2c752aa5b6e475b6c170eb67beb0d6657da1ae294f8f84cd83e23bc347f396eb0b33e7437df74a53679de7d6bf99a8cf54eac517dc0afa1a8ede650b92b4454dc780de29c81103cca069a32530e476abbd77530914ce698565523a27ef2c8272af35d53ba157e4e3ba17c6af523ed7a1fafa7c1df2c69c19ea00c28f1beb4752919dd8ff229533224bf649ba55c6a7ecfd74a092df851b238049d7685ec83e5f85f463cbdccd05519615270ca14f6ca9f11c85cc929fabe809ec2b24087bf7e4fa7b83c83106f4956462af6925db0be65cb6a786a751fc7b07f42310ce1e9a35636a9bcbc85265120c738c20d42e573ac7773e002617fa46b7863c73956f2bf4fd8d6d3f1096967893fb59f403d7c2ca8acb0048cd4fd141b03579ce1439d84255782b079861cdff18e21efa9f2af0bf5442cdea1f0e840a2dd02fd588909c513f6af70f5fe485fba1d7da312eedcdff5794099bd1183a291089e38744519aa2c33dda56c28ce97133b6a4ce33dbd99d5010d0c958bde53c62c97632dbabfea254d7077af849e3b4afe6fa5c5b9ab97c86dffa7fb5f1708d8dc64a6c45c392d84af142b672ca68b7ca8647ea8662a4014c0a4e80ab87978b0f3d3dbb749954b6f2421dd77164b5a5aae1efe9e4ee0879e50317c5a34413031a2083054df7b11f99c833f20a85914d1825c31448bc3197a42dbbfa233508cd7d1260c28709fa557354e02682387f3917ffdf571cc312a2557a933ebdf50643b8e20e72823d1feae62da291f096f65a6d2976f24a4733b92c38818f7743778df3b7ee185863374438652e44bbd508d07d293ce120c5f1f0e3dc240a92253fe8b9356027a72947451af19ac8d804a5c08f7bc9ab7e2b56b87e1aaa55002cb79e9cbf31c5e9cd151c8c1190d9eed56ffc3697da32d9f4e388f66e8aee2dcc32cc70aa9eef668b65381fd23410155e5f2232ead1e11154b72ffc06ef03953d26cfc92a3f84713572bc1fb1c74ab8937825613543d479bd158ecfd6dc2e19625962c377462720d0ed20a05f673d5a84f0700c98472ebb41c158c1c670757aac691195e9d99a75e6ab16dfa3f0c8944336e96c37517e12537e2dcd16f54a2061e6d3fcda6846e3d406a9313c12adcce229f751ffaf8b06698c016de3dcb752f05d9c4da25c4d2a9a4b9f3b0964a20750fb088d0df25166753a31b81c28fd8c0c43e256a1c9d744e4196be4f4c93e2a4dfc18ef00493e1aa500436dbcd1c2658d8ec12381ddb1cb50250fd9b4e189c1b9be04f24e64855b24aecd80082d812fe02718c691fbc2cab3deba8b5ec33a01fab62446c299c751b795064ef2a06e77e16a4885c3135231a0def04b75e2b4889a520f1a08cf5134ed26bbb0947a8ce2668b0534ab6fccb3ce6417748bd2c240a1e7947037db1552ed038433900b7495e7d1f0305f3ecaa0dd515310c75ff7882edb46e6b1fbbc028a06ebe496350c50dcb64e06086caefd77459eb2080e234dc567020c9eda5807d6aa8b7208f8e2b3a5e08a3d7a1d6889a501b08281ef5147471e5bce7406001f5ffea844115255b7925f14d9830f3953c65138d3e7c8ca184fc536cb52365a21f85f78eadfbe328d604ebc00533b3ae4d50f6c9381bbf28bb530e860b7a3b86115fb2b1d7252e4b95f5f4c456ac33a4dfdcdd53f69d0958b202d749dda32addd3d2dcbbc3e4e09783a0780b70ae6a39c494250593050ac4903b858752c447cbc0eb27427a2f2ac1ed0a77caa8f0fc13fb16d6ec3e9127ac9e1fd8a014afd27ac2aa1a3e8a87f479d5d3516e6f7ccd22c230cba6d1fff5276c450242cc1a0d8d757dac4b086229dbadffdcb084aff57024e909381adc707bd8d00da2c57e04478da46b6af0ecae20185af404ba2ee7e5fc5bbd273019b0143c8a3b351c9e6ef1017c3b1d7f6fc9348ebccf20a22d9d3e7c57941bdf80a06d51142b9eea67c24c88d5b0ead9923633cc669756f143e176d7956a194c8bbe605557c8fb506eb19ba269d1fbbfceb5232e6c716cd49de32801868dcdde689c45f78425be329a805dada6d008b7b3210fa8d0cdd5cd4c15440eec4daea408de546d81ceede9c84384bee2301d8185adf4af6ff2bc6d2d6b2ed2ea171793292bf979040b5d5a51fcc2be3d7061d81d50373d8b3a056f0bb7fc66aac2fae095f48acc795a75f7fc4781907461706cecc30d0d7d3b7893e90642c28da0f465a5c1a57a25f09509c190816ef1dde4899be69d9321027a2d20250a45599cf2ffda7e94f97d1a86885006ef18a1e9a521ea2c253d8240a1faba69a4f6deef41e49b34495f8d3274b0a66aa0133a6156078e8dd572f04e0bd43b623d0a0fb4f84f5a3badd52141d1b93902d3106924b171554745d2a69a544c968d3f64a8ad0adf68433deb9a3f0a53ccf345a508c4b3a990841912900b90f6789ec09d28d3b614d8974a849c8b7685a3a1bc33c09cb0cd9722e4a467c71173d727216a4006a3b201e35060a0b833ecba070e7fcc0ac458930387e33b3ea1044248c7f169b0afbf30b78780aef1694be2acf29d6c694bf406a8a8005be6de806e561f1e8e05ee693c34f6ff6aa0558c4286b5c122d8602516df136012444f5c82b85d41f524edfd4f66ce4637cb81b176a301a7271f2493e1bab64427290a8d29519d377f47aab187af3e8ecd15d76decc33da6c288a3ce43da6a2ab3b2b4ea672125982317a41eaa0815c5991e5da38f5c41a083b14951a26e37cc03133d9857265c014221e5598b163c3333a808778285369837342022d258de98fe218160e28a59736a3d57acd22cd33d5e77c76c8f1b7b81d3bf2fc66d9be4c2633ba445a1f910bce2b4999cb35505b7f0c96ddc10deb3f2e5ab23956c3615e78849a60b392612103b3443b9d0e6c115ca70b60dac0f34118c24d9c930bf3451cf6cb3e20266591a9ae9b72cb5bb25f80512157b352bd76a05c96e97f0d82dd64f8e84c9dc0cb19e8e4f46037eda423ac3257a83f444e0b1e0b23fad23d5ad831585740db2d434bc28bee6fb579b4e859522b840588cc7e488425b7fe6c4d940c0c6763b2706cf2ff261ff56facd1231ce8c6109040b99c138880dd6588685288259503674f2d0f1669b04dde044b8154b61367e6cba8abe2ce89d19607a1d9e55931e97ade0b3888d2bfe313b836d7bba65bb35169e196666c02f3ffe18a304dcdb0b2cd4d96949aa27cb2fa0af56f0557a3c8c113e66768625636654a7c50118988c79c9613be81c8fb86cd6fdb146008779e47c0090b52807217b9742b9d0425fbcc3e361d1c9c06f78d0166e35f7da50d33900a9644b011d4e2ebf768e22f2e06c4562fa6f0ec75671f73c65a1b19a3f69550c7b1b6eb2f9791f0183214a8bbbbd4bc84e5e55e0d855a85cb31098a5ee045bc8983038275238313a837dc78402c2a0e824bbe32aa7a52a2d9dba959f38025f1c1a180dd84ab911882a34bcbfca509dfad038b5b507ca13a5c260a01e5dadaf08e16077fc7a815bfa3ac65b59421ecb42a3b62c6ce1f254e0ae9a8d1b9602dfc1343d629aa28275f26935c5d40a5c458b3a7777be9b7f9b0b5bca3412b946be0c7c2b1a75b254301d9e95c91dab87f6a11d2318d24eeb9409384ef2ecadf6a2659a78881b5fe69cc670d3eaa84889c7cbccaa77045719974bcd404a25ad8543af3889585550b830005fc3e9ad6ebac7a6953d83cd6af8c8cb8c1affa8669e00b25aaf5d1795613fd1852894f0669720bca19587f01f82273d42ca5aa8d805046bc96f5af047f20ba8a981b826dc98a6319eb1eb6b5577aca3eb050fbdcad4ef1ec9eb171b31e4e806933f9f675657ffcd47e85e6156fc8a3085c74efd7eca1f6354d4ea968288ffdcf4814722a6e891311c6b8733a055a2ae91684e1dd19c868afb6bd73f9263367b8962002b3d87a508f34b42a2a75cfdc1efabca2e6098f90e10250d1ec315db436820b711942a6685cd4bb743d3db676f18ac7d5463a4fe5066f0cfb15341ddb13f7d6be121745cc85720e291cbe54a2a17ad064c9dd60ceeb39fa4c947b13ed3c61809f6db8f0fea3395d5ce681bc503b2fab86a6b1b23376ab7d9555a5bebc9c6c1e4223a4ea3a6baea7f4f879fc18280116aff76653f738d49f244de7da62c6557d536caba13e91b010ebe2783320ea412690da791d6c3059f5730f1232225fc43e4a6e3cb62a09a11fa6bf2b9617e66b4286402366d10a5bcb2c78e161b161001c77c52124d419ac03655c0da84ca540d5ab97ff8885a7dea7b0d23ef5d35c06b57054c92130be08d6c889b2a73b08a305e77a38022187c22a8a0e693a10ddb4202452365618f0e674e6df04328873664e91b38f1754cd2bcd3fa6ccdc0aaf0832f334649fc5b78344c2fbd6b35d7e7aa7a390721f976b2a8ce764e1950df928cc856f574561e112527060457201b9f5db040918d7b3be4942aa0289999431c98e2b026793742ef4bc8e1b38fd9456423e10378476818b828240ec81c338c88f524f55a66d6637206c98157e2d1b05f84e9276752d2af29ed76c0938c43461621d74b4f5ff5f1299554b9a4b9d1d458c04eb3d8d405be868ed50748b845dd8c59bb44018afe3983ed79eca2f2eda3b3550fe942cfa1e380d3d7999818ba77d63525ddeaf0277716e6289fee5868e46ff97f40d0251c94c9bd183f2a1adfdecfde7b9a5ff301964710f757992b4753e4787de33e8d858805655a5e792924e0488c0bf283d22980b2ea0f204a7edda38af9fb591fc03ffdd63a705a83e122ffecb852042dbc2be10c6b04b55b1ab35b770405b2be2715322a7c0eeb7999beb31f09cd2873733752af9fc17e70f3284cd7815a0c2cd1dbad650cb7fa90e75d74a5cac9c2922141105e0594b0286a5cd957750916d4240fe5fb3f2a477db047b51273b1ffb863e2cd51c0d194a89512d562f772fc3dc6abe26725ad522ea10dedbb03c540a5fe16ea8aabd39b238678ecd5a625bdc0992021655d45b9b1d1da8f267629067f91c80ecec17de58c6fe35169007eeec81d6391091c484da9260b9e4277bcc320436a5bc07f99eea070bbaaf94475016296d815de2a9ee9468e34c0a5ea512b2c872743145d653a49519bda66707e47da659174440a4010bcaf3d8e174472117c131d79500c228d9224d2b2189cf4bae6da7300ba88015117630bbc462fd59a632e8b692e47613a034a4cf8486f5f3643404e6c4b2ad46a62690f08ce48003491859ce54e802129a0588daec89c7228252d268dd985e82049a431e12e6a8da686101cac3f666b083c3d22e0a0eeee2144021a7b4fe4f53fd12f72c187ab72e10c3d24e00eaff1c0bd92e40602ef59b9242ef8df4e28535ff09d505610a9bd5553057cbf15e25e7cb127acd70ccac70f602549f1c72b12c7dc434fd004c01bc755ef7cacceff3921964ea81b6fd0f9e66f073668448624302eb676df1b9779424843379ddf415ebdb5143721e5df18f6cba86ee47f1b24623e6b945e42738344c0d0297abe52a398b26d09ab26083a5151016c48a9820c88ab75576decf53ccaf2aeac37c404476c9d8f048c9e67bb1e118d8403e52f59014ea059b37b89ac89fd1d8fd9532870177a3493753b1b31a5f2f971520909ccee6d35da7772ea630b3c6a3015d85bee31c57161a9ffeea5cfe9fd69642a5ca9ad1cdb387b7386a052e19c9b8900da88c7b466bad08a60ea75d741a9d1b4ef155b8cb1fdc97692b386491eae0944e06af035c016fa837dbfb54876f866e3693e87b654d96ee94fd7a6bed6c00985356fd812a8946e39500e537abcf2dd6d3d94ac472436e8ebd6a5ac0d4aede81f2a1625835c373b6d9105917b7e064dd33cdf1daaf5e09b1bfb80e051acb628dfb5d06e8f461da9530a7d7a2d7a85ce568126f1fc6706bd800bb97b2c230182c880b13a2df269e956512a8210584e83eb671706513d8db76516c149297ba3ff3dd9794f6b7e0402e3a1314be3a2823124d12e2ec3f23108c84d74ebe2f45d5266892bbecd5cc00d745d2c947fe699e0ccacb4d4fc465200cb92351277887d2af7cdea2083201e541a3fd07bd4f0c215eb74c4086439c075c4c7a58c0c31ed33a39c11cc0b1c5251204a5a4ef7a876c4cf64fc3c91d00a2f37a7847db0fc7b1bb68f5b36076a3e18f01f49686b77a58b69a79a0cb99fa566de3e86dc6d0187d7e362591c50a7b901ee7e28ecb50800ac8c81b338bf880f4655253a96630cf3e0dc79e5338861082c4570372a05dafec429987643c19bb1efc4bdbb1aef86e19184edd2d07b0c73d33fec2e8453d59fb54fef37412123e02316378ba7dac32d874033f143c0be2d44ef7699b250409222680272b8b61138e1005d6db8c654112c7de763c0b2c92a4a6c551b90b91cf501e60e0cc0524047f0149af89db536a8b2b43a12739bc73d6d8ef3eda5193000fb631135cfbef8dfa25288ade7a0ea60c6d6203c9886e66f7519dc58555209a449d5dfa0aa0d109e71127fe5491556378324da07272b8104012cc1c9250af11ba08e5e68dcb1bf6515eda4cacab49bc4201aa60cc0ffcaf77db1058910c11678c94742ea20b13ed86d3dbd3c55ba54505e377dbbfac24fcacddeaa2532050464317b7b75977ca2803c99fad68eab137ce75ac933c734f6424e554b17b8af0a92b68af37e0a9ea3c2b6362dc9a0f4d5c28f1f0434019a932c8b554faee03eee0e82a1157a40610816203c5d0f96163a8f48e9c401fb3e06d886a62bda206da3545708748754b8038a88382ac4ede97f648f9ae9ccfc40c693fad34873f66f4fb20337a9a0a5608903311a87c40d2be1b9660241d88561c5f73902f0dedf5b2b859d76cb7996460b681d063b6ca09c7c084250483d5df0e747862d71e1f1b476b4cec9b007d1106d61dea61eea0cf61ab3f7108bad3ee71148462a45f0f50ee951caeeea399644dde1abcf07c0522824f2a00eadb1947ac51e6e4213a3ab14f85f82719e78813926fec1978a11df1ab07324e5edb1878675a5e320c797f2b0177bfcfd1eb2ce9ce1e308490cc60918b091a56d091f7ee650df4de29d7a058ead875216e460a6f9cdc49ef1705af7700fe707315bdf0b9f879ae676b840a168bea31e71dad9d6eb781c8834b15f211c8ee4e0895e801f766a63078902829a3a084996f1a4414d4de2713b4e6a95d6c2b19b24587452832f7288a8c30ad2e329876629c46a9379d4a22a6e9dd784ec472d459c04735132ca5a36c02e3ff52655d07d71e3137f0ab9f80264b9211610f6d9839316c09aaed6f1535b16da913fd315a3008e8fb32f79f7809c710b73b6c119c3aac7855583535c9d59c567613dd55dc66aa580ad18d896b873d34975776cf26773cba20c8ba834f2199240ec67c3f80a72713e065dca7fc2eb9080688dd0afcb38008eddb3f634d4bb80b0564a0154d1b34b5791d70a50537b71f13d18520a31b25581eab40aa3461b89201f5529d1b7cf4992039f3fe79b52962bca7534e59a4159fe98fb4c9d1624b34db25389af617f00a80fcbcf84f7b31381cb4dc3ec7b92890278cb83546814ca0214356e6285b7fcee8f38980d05484766089be92f201aad60f0fa27900d609413d57936de9ac6a784737865206339210d8c4a9b0bfe39df85b7c956fb793ccb94db7be34051588fa78dd93ef0b97d2b339e003cc89891e28856dc258c6780b19c4a5e501b004cbc97103bd73492a7e6faa61f4c3e2893fe2b0bca9a0849b067d3acd19349014d7bc52f9266884c05e93cb3e4eb25e02b24468f8b0f55d68be9e72d5858b62e4bd6352f3868edff6513bb6c545e596fa95a9645385f9159e54dfc9461b5b168cc9a9b6c4873044b4ff4808284ebf7180431c984c273f457e02fb7f4e9a21039412bcab1fc6bf6204db5cf9e25bffeebe0316015224edd5c49e12c3ba18659399f6127b7f775dacf317c81c0512ddad795c487a82888ac87252309d0d9e1b0fff74712ab1d188ccdb6fa4b0bd5b080249d65ce274eff2fdc409fd07882c9f99e1b667638376c476aaf362be075833346e97525857f1e1dab0a35e5df23bf339908260f9344822eeccd0e464bd15dfbd3f230eaa84f60e7be23f9f867e7e2b056c87ee4a08a9926cf9a96f9c229a93116e9a0495a1fe5e31e4def85065e4c09577ff51c9589e4bc657a0ce8cc412baa2472b2704589a956112c0a51e2a260061a4c3330d016e5c14594bb8880a032c6e445d852ad8b063e17d96ad5cb125c04df45bc0d4b4ce622958480f71464c1ba59f38e972275df3c457d13d1590535c1ca25dbb24a53f5d9d1fc8fc58c40bc8513eabc9d560a345407f693571f141408d11042f01121fe089d9584a62921278799954ce84f78cc822a2178fbd213c58dd97584f869c0653ae780285b4fd8f03cfa32e13d3ed10c9b41d13452ea43402ee7c77c606374dc880f69924378d85b161bff5725cadff9f662957bd79951609b185cc7fa40d9934cdf09809b5ca896419e7acb590e7c00faa053b6796bb180d55a865ddf26a9d705c68e9cb60fec5eabe1483a415150387b9047178bb2ce475bd2546837f943559c7b34233534809fe42112062d7b358dbcb98d62a50813ef7db7a0fd6448ed020f69683811649b72c8aae82195087fe6d14f153e2ad7c782fee67823af07c0a120b87541cc4972b3e6d5ea9bbda3739968945db56f0687afe147500c11fbd0b6968ce681ffd81dcbb4543f19a9ee1167ce16e9b0d40798e944e39800898c8ccd2111bce4c7a6180085ac45e0ee20342e49108660cb7f6c4240a010c69cb882fcc98a57d80087f76afc90355cfa1213d0fa621a4f1442d6b2f18d901fc9e8e3fd61ef3d9acbd593dd775df282ceb5f9cb680c5f0e466cee210be034043f2a5f33c4e52f0062431d7942883d1b7f5022860562f980cf8fb889c9a9b426c590a884ee5f23438694132d5bb773d86ae8959996e3f9c3d943d26c37c232086692bd1a7b58a8e22d529b3c500556f85f5bfecb61a7564b4ae7983169fd94985b64d1f1d95315176b720ed882c8de75b4eeebde612a9a4424077fb73b66cc4e7a3ffae3acc3129c08b518172632105f349940d9e7b722496008508e1f6db63399f38b97ee05481e1c848af3aad31b07a8438b6bc982fe6be3e94559140673598205c6cdd2459fb3a618d47ddb2e73806c39fd65cdbb68765fc210bf2ce67741be1b2920a1c6cf29a19b5128efc3a43e255efa40a45e1b013d64ac02d05180c7166523618405f857fc7e29a229129efa9754fadc88c61f4eb91694a90750526eb47989377128a36ce51b6020676bb1a220ef1444d984a7a57b9b5914a34ae896f0cc2739ad358f91d708d8cb07c318d35671378bf7f6fc21db25e9b072a94f671166f7a88ae0471b563f7811a12ad8458cf91404e3fed738ba02c0e017c37b421e25ff5fda65c8837920ee3b4c2f363b77e23b32c1a2c142120d05455462d23c2c5304f6be57d2777f6888b3bf96e2e8ced1a6e6e7491051bf0018bc9fc8f9ff8cb4ec3224d80491ba5502b365c030d49ce579266cea1c618792d3d4c6e9cbfd0cf695a8534ffa195e511f8c78a76b23bdb7a6668f1486b7e69155d60d377677b9e922d395c9d9bb7d5ef96fef523617f27591c32cd5437c43cd528f9ae9476ae640726a86ea750a5140450708872c92821130faf0e060d7a88bf47b24837388dbf939affea947959b222745cc21a36b8e7740353b64b7f69b0047d1c3697335fb98cf76c6640e908af263a08801c3032a305c76e88df278ee69c24d81b947285e751716f4c0fd3a5626492bcec7985ea68541756602cae6b44a46bd4d64725e7e9fed14c3610530b31ce18d08913e1410fa666993b6a929ea80276ee1c9d6d5b1445a035752b5b095f5142616242a6229b2b9e438649c045e78a24eea22da24298e9f1a65da408e18142a8a24104e38b4c46313d0e8ae01805a3eb6ae22c62d8a10c187f9052aa34d091fbad620b248f314fd258fd2d9efcfd52e52bc0dd44a7c2feb58d9a1dc249f538bf90068c77228a6fba301e811530ae219d5b11a3370ed9d61de4070959ab7fc52911c5eedf4a8c554d39026c6c2b0db21af15bd433b03452ea539800ea8551bb6b16a08ba666fa0e03b5d9a37894468e67e3f63cccb53aea1161fc4918a583b30ff90e9e180db5853c9fcd0dbe0b84ac2d3c7704e8c33d6332272842dbd67c1d9cccf6ae80fef7be368ffd70668dcbd25f9d15b2986143c69009782d18745968e6144a1c334df996d1ebbf927c0854ec1bddeef9d9e97687210babd967c423f7fed7632f38b61e78f619a239c0589be8e2c18e7da6a2b63623a843768be10cd22fc1a0ca0eb7d7e32becf9a27162b02b914fa87527c034bfbfb7bb0136214c5db6fa5d7d83b167cfc5a7d405f10529c137a4cf748b6aca141428d5757c58a884b5a286a9bed96307d59506d018c5555122adc92abb3440b906318a2b02598521cf9d1fd7de54feb185dc1ef2c03f92b4432162ccb2c58aeca511464e58473b24eebf40ee3a9fd3ae65c86e4e3475d387534af3ba8dcf4fafd5bccb5ce4481dfc110240fae8292b2baaa7de4ad18ba228b84ec54ee9271153554f28a7139ace50fb7d5e9d5c1b6bb0173492a6195fe99e1a6762922f7e98b74a3c60dc7f1204f6ffdcdd8d4e28f3e487d039f5737a60df8e41c4efaf6fbb012a842dae4da2841771994232a7d9ae7708e7c0a5e180d85179427dca46e841725ce37bcc4e05782be74529831ac67c01da7fdc2c18517b5d15c33952bfa5800697ab2099a113abe278d14a095423e1504f7a33b1dcdd1727ae21732e45973e2c05bfb596ca71bc87f9b35d2154a3338d0fface80c65ac830039d27fed3e26bcae7aa0f1acd3a02ab3dabf838e0fd29b37371cc58754cff6d8af810b3ffb40ba998e6e5c3355fce40bb96feae473b31afc536c0ea52a19668aff1db400a13cd1ca23ad1936591dffca3ae6f9aa88655c3d2f3b1880ce1ef950b8ec4ada00e3092328ffcee5ca50a332d05070eea1255523825f1ebe8cd29933fba240c4a8cc7aeadca34ecd874944ff7c98228208b7b975d7c2635cab542be57954d52f4c1c3102c383b1b15010dde4a15a26e8b3bbd160325b422ef85cb0b617b295854bf1f92d6e2dd866e4c2c0e8d482fc52bd8d5d434416b6cbb2b8197848b74e857a3226f9442552b70cbd7fe16c77d904378d006d6e412ff80d0bde06e247d7a1c8ae82acb2fadbe7935a8264205b37d46b02e18b35cb3ce3dba5670304da620f7eabac27a77b8f7f1b9884c9077a112974b14634e4aab566ef62966d90be34fabbbfa147001400071fb9e456da63d384ad55cf529914eb98c0d545ea664fc707fc2c960f9dc151f967a27078f8bf240c6031548a4d3e059289837c10ec99a4ea8a877c0bbaf58047296d060ac451a0b6c2c40d800cc4765ec3899c9dc03900a610c97cc1b51e44969e86f2d3b33472e9d79024d557fda368b14c101092d17bb98ccd145689fe9cf8f7bf34cd70eb0f02abec04da1ea435611ef59b7e6fad91b32839c4dbf94c9f5886f0db178c289a2613bbd67b4ed968b2c1d64c9e3702edd2e01673b3ffc860f5d0861dfa51d4cefcf6b40f827a93827bc8fa05149a4d7123b4d5e7e8985e63702dfa0e7722c6ff837750bb9799296c20d6e6bd2fe848b057a268b64801daa4570e1f289ab5137c5be34331c062b7533e72ce191f2ee6976a1c17cedd3fd08000b4b9e0278df54e21402c5b05e96a892c1ad8a94487695b39b8bd84ba369283f6fa474f87146aba9c5ea0ae1496d4ca75f15262606efba8782bf7ba61010d2288a6870c3cb03eab0fb5e253977697a59a423828b57bd4b8c21e119bede8c58d112dde21391dcb83b16b235b34d88ad29194e1b83752cd9d535c0ff4b5ca0cd5b348dc58e9bf14dc0c7c6ecce1d561032321be9add87e660884ef5972061d04c39736ba5478f85c696ad284ae1d99cc112a6521a12235b0cab35ba83aeef14efe1ba8e8ba0c00284034b2160559635bfa2bdda14c3882423b13fd33a5fdff200e770d2003aabe4bebc9b46ab2fa25a11fa383c0d8454dbb8e41dc6731d16c88476c5f6be7bec48833411667feae612456a28c7b3e26f4bd23a819f23a0e51b208c46498e1669ec6688f4b51ec84aff6adb88bbfcdf04e137e29e3bcaa8369a6d1cbb4e9d9ef00c4367959cd2902d753cee70c514b0ae2dc055e5947e57128138b5af3a38407291aa0d8826011e0a4e59d50daa67d6b2adfcb362710f81fd7f5808ed684c0d4e4c3445415dbf00ca4e446aa238b208cac293aa2f77a1e26dec0ba6b67f467482538222a0566168915ae32ea8cf988ab630911d2b11d9bf530bcb7b8c1f8bde9d1cdbfc0d9caec6b38db18e4c0bd777a81231b0c686e622df52adefa310d92564d1fda1a1c9f74e797d124f1350c48de225d5b6393e119c5c84392a6582e607f5369249ce2df15d1d1386f934366afffb6e061c9a8550a614610001712eb71d69bed464315a10e8b42dfd08ea387c503715c52312b8b4ace620812a388b8f9324790e5aa7aad03ca47e0b9c1498f9462ef416bff28c600c6114f6e81178bab6478471115654cda36ada83307f62a245afad7ab58d2003fea3eabda1d4487ea8d5a51c750c3a7acb70dc8165e82a93bc03cbe15fa6bd1c641953461157f22f7a88a869a408e381702c2030c91a011f66eaa83c456ec8b9ca3178253458b6b1c22e09afd8207833e8899ba55a719c6caa3b8be78d33ecf1bb397d9fe9cc95d7a6624d26979122eb860713c694987956602b059712d6adaed559a1896106f60a4422e015b0aa64d6c4b8022faf06be837afa7bc09e2fc728dabf1bcad2db65641ab76237c98c231e2cbe268a9599e41b8ac925bbbfd7350c309c79e8e64be96e47481a6769fb374b1b60b1685b6034ca4b96da4d465e67adb33ed06c95a152c0e6fa3fb65d80743c94a7c240ced47290d312f0da158dcd5012adf4a9161fab778d7c305811faf73ed12795b4865188d7708d3ead85bb7079bc1a07c4b35d014eb5c4453e519aebeec940a19ce45f43c3f38b42c73388a1c5b5bf34390fcabfc1e28b8ffad4a0df71cbd596d07650510b6ebba40c4f4fe00c8a63d500aaa10dbc177ef6dbc0c660aa455c0a26d04af78b2ba9e62aea4b5affdaec2035cfaf54fc53772573da1f1893627b551d61104bbc575718422152f9895327c4f03ea142434a532b030e0706b6262490ed5d20b92ae9d49341da42bbbd80607e3c2f675f096ac9958539eaae3337e251b74471f1afefb5bd8c12615b80b8ca49bfa6e142a1ef3a2065ffdc8236b368e1ea1f4a07cc3267dd261ceac4fe138314774d1d4fc18bb0394852954115b47d600792dc1f394f0ec3caf768e17acf8bc582232aa2d17b24de6feb220643a8469a37b4dbeca6fbe4c34b267c6365b41c9e29905bbc5eff4e286cd448a9fb6e281d0a83660aa264f8089611ce5475cf2119f57a8251a87f87cf50bf1ceecdeccd4928403a124ee04c668ff6893953a11070ccd0e7f46d04fc49cb363ffc5e9961cc0566ac03fa081389cf5d7e7f411bc73cc3737196037d24c25151ace140ba50bd18041bc125ac83d47db555d2846dd2d71f26e9e81627460f57a307df316abaa4e727d4e18a3919f4393a3d0f3a1e041dde48d36e2d51f491a1f37216b18d421729202ba56ecedfd46e97643dec6e2eed00db493ed083d1489d4d1ad1c7eb39680683a03d15347f05169fcd6a2482c104d512c74bb99c27dac5ec8ba91067e3e266ad0f98d9ba5f15da97a327963e6a3cb45be0180d88ee6fb0c0b94e0a1bcc9ad0113fa05fb8f687b30fec67673ac64547f6a0dfbc544f68931b333a05463f8da92a8e67dbadec92b5e8c47b65d586f8da178bcce6b7c850383cfe4c067801f4de19f48f884929eb0c33e62c6a054b49d89e87bb9692828620a03d020715229c2b61e436b667b88ec511f81d7c56f0372d1955bf36a5606a5820b30f4dd031c9bde0c53e72d3d932d3e4aa2ea4dfcd32311c00d96f17468c5aac8381e282a86b1e95bc9eef82dc31618e13a81529033e6e6b88819b41c9080faacc13d23d6701ff2f204f6c10be5619e219936b237e60ca34bd111c88d0b14421426717ae5e96b38985ce65979fe7528333d76f429406e7edba30593e86d43e74679b925ad79ec31da1c424393e15b62af3d7728978c2adc8ae81209d1fb97dc48c72d4394ea6efb7d27c02c035cc1d026d1962ce2dd56d00a86a66da60062058f9dd169052ab637f6bfb1b1b0672bba4024741fe11f6494cf643ef3d846e8782192669e38c52b1324322e8388884797ee26cf23b1a6df7a9b168e271c204778354c934f59061ba73d8fe01dddbed9ebacb47998a4f3b0363f621a62cb4c08cc9dfcc345d40bd7840a9e72945ea00002504a88c9e720d001f86af2be9a897ef9e6da36183ad575d03d40affa38cd0602fa01bf7ba484d264c23c6965e8a5cd46aca38ab3e21ddc889464f05e5f9eae3939406db8e12ae5bd19f716a47a0e440df06035dc6e158df899907e00c7849a886460065874eb71f03204292b84a97fe0bdf09bc1f8309941110891f610ca8727315e977688bcbe77a814a0a0efd8f5240ea653fcc036b5bc03837ead3e14efc9df9f8237fd601eaa0b78c1db9c1c5a6b20d29dc240f82f194448be551ab803ed21e4c6508cd814647ea61ae8a50eb3d28a34f44f524876e388f0b6fec3a6c5063e2c47ff1cdd5930215f449e6535750f8137c09479f09341a099447cba433056c00e9c66c3edb06a2284665ebd1ed810b9db14ee7440aed4bd4aeb2a047baf252d66aba28e9d0502421e6102de764f197ad865cc150e48b3f1b1d6b31b87e0984c31653585a7585250b2542278cb991ff16577aaa8f5afb10de7c7f2afa6cac1dbf60e222a32c0ae3c71a3513ff9705165c1a339ca6823d265c1096eb412d45e413d55af6e08d044546dac241ff2b4b0cd16171b92ca35db429ef8fae3edf4fb819f0de721427e03191295b99a46297bdbda82372e54d859905c1f96931a72c53ef19a331316e68fed4797dbc597459a6ebc96bb183386fbf16a6c45911f558773ba2460ac8114f12c4c356bc6647f639be681391de3d59578efe4133790ceaa0612d0b868a90f967c8af915ff1c976392548b2a574074874a2ff982905711f14816f07c55144188258ebe77c46831e50f7106dffa8a4e6d6199ca0761250b6af4b410bb1bb383ef534ce00f972404e513e5bee3c6271e7ed0dc3e9a357752ac8801dce1b9dfbff02cb449339433478bc2ef90e3d3cae627fcb7b89f9a117ba3bf6bc0107fbe40354d0ef74f6376db7446c8608d5c17838f16929c4f56f7cf8fae57766933bb1791e98cd4034bb461e25323e634d032df40afcdb6676a806c2e90856ad69eb42cec66bb8d1af1fe6e87b6f8f0910200593610d7683e0b8f0bf6e230d558b31c3023282d3d1ac0101e79416599e19e7451a07e743232efa16264d28f5484a743076f190ffd1f7ba517774a702c700ad8cce113c375443eb7495a9ead7f8681811c01a306a1ccbee3e0bc435978d0f72c25ae07c4d899cf2782f41e441ce176e515772a95c40809c02935d3f3fbe5efe0cda3a2dc95e294873b6725104641649a56ead5935620205e50a543e107342b200d1bae28a444a69979c664258ddc5192c3890b840e45dc785c80bdde5d45e2cffd3a1d9ee1addb0106762e941422c63b7cac282d31bb62c19ef2725aa1754340b3995ee02bee7d43953dbb3b44fbb51939abbd405eed793afd910adedfc10ca9ddbe4b0e7bf8e13324f51d3102126d06757c90600a6502ffdf62bf2ccd5ff424459beb719b7e17b8218b9e7dc9e748e7e172922414899b29be1a1e7b4cfc57c986411dc1828c6f9c97e031ee61dd8c0c2008a6c1f5144762b32cbc566546918548cfd439aed2668f9dac4ea9c51851e546469e680c4f43da3fde61e7243436950279e0b45aa4467a69bc39b6c403373377f02ede6c4d09a5921015a6b9ef01240f3ca31a03d525eda4c1bfbae939153f368d1209f4d6199d14ec12586e0028ddfbae8c8cffb0052e59ccfe9eb1cb6896aa05325466778ba3aa293f42eda50107a2397f3b40a47040e0bb83916f3e6b2e4c76f0729544558487e4e9f1d12ce57eb90ca98e6f4691ef9c05740e9f909e0c6f5db7fcb0a03ecb7104f4ded971ec1f6cde0ffaa9dc469f7b1e38c3275e2118a1cb87f3fbf10932689c133a3b97198d0b87df51b6d743379657847447a76897eb7f6e930fe32aed4198c685ab387e3e344176c00442c433211c1cf12a1462ca94868122d0ef07723a790d10e0448d835bcb2c14303dac6843c5e7bdf6fbdcf83f88e5c6d0f5da01ee77d6926fb89b322f46172ecdf2ddb9a127a7829adaf90038d978d97efe6d6fbe5531637ed64dc6c43f7c33297d1ad120df9b85c36ce88b3aec1aeb05bdc9c49ecad8e07064fd42fa39f61efb2a29163b9ed68f1995b063e1ec5329107ed85e76e6a195d1522379f2c58fd61c8f86e643d2b3c8754506e061508be0bc51deb2a66c1ad41e4b6d932340579158872bae153042a05e81d4eabcfc2f38e3c792c365ebcfbc1cf2eb4d768cf96430fbef6a466db797b70230b3b9f773337379a39b15912835e97b8670cc2e864439378b3b6647808315890ad84408c71f58aa4d73c26917d75ed8210e866779e0de13201087c6598fdad10e079ab82f85c8fcec9265e221d73ebb83be9db102042d88f5588217812c3cd3ae2055251a082433e26c78b68d856bd28f97a43de5034bdc9ea3f5538aa3b00d918f20dd1c778b0de0c13d0f08f0dd59492394480098ac2504bcae7caa7d649e5973276963d89964f92d16fb3d545f36021e6a073dd55ffbd26a81961876c3b86e5943d5cc990442112839824e884c3c3cf8790771947ec6729e3f15da2938a07015e7b3ae2d1aa3932218327f8bfcd98135e2570022ce15c02bac24fdd0a4b99e2f9e3ba1208d8a6b765dced296ae3ff456a420c0e08f9c3c00aaec463c3d837fd2fcacf8a3a17d3f71a174b2d0f1e0a83487388d83b4fafc1392ba6c1d21553ac0d55e91e6282462f2cd0fd354599c61eb1ac12e3dc3784c2afd0ff8cc6975a2574ed67e60a781872cb84c5a07a3c020e38d8283ba61624eb1decdf4d1157ee421a22b8630afda3af35a7b97a5ef9226af6190e18e980b8bd9b3acb55e76c78ed057473b2369249951e428745bce954bc8f6d97df6356f18b0177c1bf08dadc71fa6a892947dad292cd221a32833caf837bf699a0f5ffbf412474a29f47a44a046721c602edc438c7b373c6b293dfb5b6c227479ea46ea19c06edd3a25908a600c97ec07934eeb673546cbd5393eb6eb7a6c1d21925d3f4db5e9432cf1eb264dee48e68bc9d1e4f29005128261e7d435cfb06f79973af00c473b3ed7c2a80d9986bb9127290bf857fe6cc5ad812cb9d687a8396612fe209ca2bf407eb6ca306aae10ded6992181a83ad0d5831f3119258232f85d33ffea9cd9833614f4e2613951cb078c397e1802654f0cf159a012457b5934ead187bd55794306bf84195270730ba6dccbc87237375cc6b6abfc58feea512f24d7f0717764ea9770c0f4765d258c65b6ad33bfc2a91e91ec09d6b5b997ebeee5c6af11447de73b5803fbf6ade77aa7404596ebc270ff753443f7b5ce7ef873d0f7ffd5f8a1883313dd5bcada2a6b83842212470914598fe2729ac794bb6d7966b78c02dacd6eeb4f52b75380088b8641d29cf9f47f375cef876658b320205bf4ec290c55f25100b17bc2b8628edb6b2c105cf124d0c5320cec623ec1b0bc4e96561d25b6903360984cc963b0698449baa8cf282949ef7b66d614058e6b6288a9af61623297d97a12f4714a2dfc932f2a7b62a1c4c506d4d62f4c35c475f923ff0b4a25dd2af446af78e82633483d4b66991a8c276717e06d56abac4e8e791ad828d40e640fa8ff7b53ccfd27a3f48d1c8492cadfed37dc6210929bafac981751e1b25a48b4bab59d5f1d6eb865762f0bcc47042e6bff7f8cdcc6458845948968b6e29b4a2426d8d5cdb820bff5a6b29615506ae92df902863bcc11820e5595a9173991abd4cc4e922a2318d741c97c519573ead215ecfcb04e34f768d9242dfb727392fb4fb41b55bdcadad53ca4c5be8b61a26cd29a364cd45dd85bd392e7681466b88c6d9e603346351df15a0b12ccbb5684962ad8e61a1ad2b36e83114bcd5639ce11337fb6e73477b6516852154b7181b0926a89f3e7f3496847d8a9da6ed755316378fa591a62d890d9cd02617f1b1e12e7b7829ac2b054238ae97c52a72fdec422e509a2d64ffb28960c0ca04cd94d9a020024e95e0207ac98ff78fd6fe0a85fa71e90763d92ef4b8ae20bef4234dbd90c4e621f7cf6103d179dfea9e28f11d801249cf0e965b5abf37c14f04273c922679797a2c0829f4feec4f3eee4687514a0597e0097f1115c5bd630e03dd0f4211d72b823151cc4d637abce05131cda6005cb861b9971ff520e68c30ae2a91b75f2e0a06de58f6f6cb8451251ea925db8915a44156787470d2e364ad4a38c7461a07c2052c10406421f874b6e8425a9b104470a21ab5dc20605d07e128d3806f4e03d95a23a4628eca8811220384c9231217c79e15d7ea698aba93bceec66bf17e8827b7d51b46efbd085952ec1b148a2965ddf9f4f233478595a77648beb4183394b702401cc49290f28a265afa74488e3058cabdb1a2aba728242ed949c5e7246bb719591eb27a16eeca2a8227ffd1c091010b18db2addb61c4a912260514f0c29b243aeb9b79ba443bd0106d3bc0c5ef1c5f83a90bbb1a5388bed4bad3741d132c6cbed5ab415823e9fc5f8db123e740087f741fe5a28491d0a6f55ac5544bf30b54bef2efecdbb0c0d4bdf1b31fd05a5aaa669bd0cbf901225607773e84f8f80c18df2909599e227d6d18a629f7c0cc86d2c4aa78e735b0572bd5a911baf3ede280ae125248938817712626c988e5f17a01edbeacad7979c559dadb2f605446c213a992cb8feacb66ba8313f6960557fcb73832455005c06e2501c32fca16ededb17eefccf0b2bb5259471b4e9b0c6f819d70906191cc61c639f2bef7eccb96309243a24492f3c440353be4c7f931a4ec584e871139e951b6ae8eaaf80615bcbee06e430077d9f6b536b7317b241a9c9871049dd116a5b2f1118a9040dea310df563c29b20431c4206a6d5c1194d8b89e76ddf5d2c1a2360a0a08783f705bea7777b2f4b2dbc35e18c35ca1a49819a9a95f4ca8df6f0d441de01a0a0149e54737d7e7d281c5c21e2988d67b82b546f2418aa49f9c12fbff23a95c74fec669f2172c862a94cc52fb9f561f605de699a1aa695d674d349fb6910afebe13005d948d1cf843358843d5c38358fc2d06b8d9deb814758e0f38d844de3ec7890e4d41c968f446a957c8941293ef3f1b22222af514c183d5fb65c8ac6fa62b87d489da36ee9f6bf54b2049867e1a2f8490f4915e6314d9017fd04e8df2e4d8292ce96ea8b355383573c3e73b7dc5d81666456582b29439f514557500c1bdc7dc13348f0ba6d7fb4a722a6ea7a5a475db884c3e7eb79524515bb7fc39d83f2b4bfc34b1305c8df2a182752ee372f2d5044fecff3fbf383e32b69c22d617a535947393f76d41c10ae8e53ec4e75092adc1ee085593cacf1fb4ffc893c26c3dd6217df10e8f17b24a005d76a0d1b17b7cd955fbf383c833d137fcf678edff44285785f1c8e204f9417d3c2754ec8e03d51916d4d367c2a03846356ab1d6ef7126148a5109076b55f564633f84c923f3cfa8f61a7e4d569081d24f8c0443c9cff019cce3daf4df153e9c45083546427b2f5d9da552c625694a45147bc6bbe9dcd2bb9ce0b149eb6309e2874c6f9ec40c615bf6f66b546eb2d2e3469ad082e8a350b7d48c038aa0848b82898865607d32c5597c15cd1578713cbe40bf892f547f4ae1ed7616a093464a9bc711d6baa3945e2e39b6288665bafec0b12fc14e0c9d00b08f142f3ec09ca4e27f1267866e608bc81b29560562b8e50a567e89944eda9c1c0192cb3c490d64a62198486b6711e431a3a8cdb1848036591264b78716a6ffe2a379c3412ee656cb40a5eef861b6db78e923734998e7e80591446440d019785dbca7508fb6bde65762874680e150d1cf1454d065af3f68db82e794deb61918726a54ffa08bd6b1f14487c0ee44a95c552d8568178375e61c9900bbb94281693dece44b307149bd080738371f279929b569d15524b1cef3c2534c1baf9e7cf14daf417a181336675082b92efbe13b99032b80fc6f82a1dc3b7260e83eb85a4ae00d65e7c734f10b23179db7e15c08d0afb3160119989e80a0e666aceb5946aee812a208ea3dc1b57362ece41127741b7b35e607875a97691a69a4ff72e2ab8fe5e0441186a9e81adc822b1bf2886d7cefa11771b9c007efa6f9eae2c249d5fec8105c53ab0c49ec1c3ed8b8c353440becdb982d8315fa007613727921f1a503f6b5f8f569447acfbbbf425e06171ad7397a76efb1c8b1276a78d11b2583b91ffe01580e7af22ca539f421dc551c7d3774389c29b0e8c238058ddf71dd722942a8c6c53ab430ffdeb48e37aa6156b6933ebba4d8d2144f734ab77b3bdc560a6cd8ebfb2671ed7156003a01e7a470c6f3eb7f93793c8350b5a86685f40351deb7219990d00a29ea75cff346aede654e84369e88109c0de9f5b6c645383631d8f39a2d2eb015541c48a8ce10aa516ac823a67bd576dfb26456e76ffc827cf18a16451771305fb99891cf174a8b59c47e1cd1baf4ee9302b655e899bc6f02ffa68320d9b0a019b50f4a745f53e33c4ef5b2aade2368260d40d98cab47a1189307d321f1543329b933d2e1b6a847c6294f80a4c5049a0d128f47db497b8223f8c0514733861702afec625c1e7e1582b2bc12d9beb6b50ba8fdf578d1157d6f710d2d1a94ab7f2d16622207620c3f0e66cdc23be46fd46b855a95fb1fd561355424ee0bd7608635b1d9dca8eab11000fb55fa287c7d367310d5b2010331a1323bb8917f34adc45a2d580055bda7433b102006874843e02fbb286cf4400be9c1cc4e1de4402000202eddc9511558a7f5c7be7d0b85777fc16203c86467a7180474bc1f6e213d50fbf7907584352b2393c605de15bbcf083b1b8e18bdb45e66f11825238d27cbfdd3d6d3c76d90927128701aa3571b3a514213981dd576782a40a84075b8bda9e0a061203bb4d128a9a3e3eee0a64a245f20a846be68d7b9991e523e5c31264ddbec6979a52a6fa9ef1d72c4466944bf7156825422dc8a5dffbbc6462c2e182bafc61423278c72190eba032e1a9f15dac0827af14bb0b5c5494bf80d094b634694c339df4a79f7eda694993a634694d379df43f3d3bd3de541a2c877c23899afc54117b59167d28d50c0105ffc94d26bd2808028cd28461e7f791c01d448329707c569d5c92ad007e9f050c4d4daa21ec7e868a18b4cb7eff50254d3b6e2cb321a3bf39e72fa50ac27c1d3d7b265b0d74086ff05e3ee27eb254fdd2420ab55c1d791a80075f9a44ba0a103a4efb4e62472fd46d163f32934cb58d8f115fc5d71d53d9acefd1b62e17013186a56f4158e4ae1ee7474721e4327f262269a465edf25164872856fd0becff9cb820934d48c594c6a5ae91c1e0848ee1c7b207fe97157a0d454312c50acd1771d22342ce1a3abf1adbe5d9f2ba5836cbfadae9740d24775fab90ffa619799af389dae8e4ba8bf853f75abe65ae896049c40bce1512bfcb2c2e215159c9ab5a4d9cad4ecc5503e16cde7dc75e7668e53d6f3d873e792abb7d6fd8fb4750f41d9bdf1e743bb100296afca03c80ab4933097194bd6fba7f086040ee2f5988fbee19584d4e3fe1dc5a6ac12bc5ec891d5c0508471646f707720171b4f5f0f8ef257796e30102ddb8857984d501808cc3dbc202b0fc09a9d72b6795719374d74d86e5fcd06510cd7218eaf80a98505b697168e762ccc244b3e8122847af2bf15aa5135b42539877133d73cf22b0be9a0894eb9f8f546e0ba7ad2314f728df200e4b240cb0f7b31a0674911d8b72feb62053d1b95ebaf65d3a723657b8055b59da1ecfdae2a14b8aedec6372244ca19f2309d6af8e44447535278d7fc6c235f500f58ec52e9ae7ed83955ddce11628a000cf2d1eba7031cd3a829553594fec120bfd9c657a960f7d5845b0723739f7824631b765b9e76b83f34ed1964235ccce9e191562e955b44fc4ea360894145b02cc0ce48f2fdcede6d2b80fb235b9267fd27258b3544a5d866a55b77e5098f1bd11d4d174b42e5ac4425da9593939c49fb722f1977feebfacbec9afe2065d4103bb41b2412971d7b2882440e842aaa713b475ae2effae2986365412e1105ffd4d9488a0104e3b8681638bb5b486a75fc887b0b3e1fd182d1a2b648768497055f8b960393d3551b203eeaedd0aeed7648685e671bf985ae05ae0bed7a413d1a4b6d243fe8cb32de48701548b42dc20f71b32a2e5f9fc213571b6125a6d85c85ab417cbce6350223e194d19e36f08c20d931fbc783c5c9d821aa96d168243acd2c5841b39e7dd1993744e2227060dabe587d616a99664c33e253c8626b2598243c864310dc2a7282ed24fa4c2994486065d56c6034fc131372e65dc836c57242f211f57ed44b487cfb9e237d841394c482575a562908bbc2ecb0719b9f324f67d88abd3ec47c07e9227a754ceef459ee3618924c98a8e94cb8aea213b51ec5c83254da4bdba91ce9230c3b812c138211394646a873128e23b0a6a47de6843bf2c53d0e4bfc854c22863da5ae3fb4fc136cc01ac62c29785c49eb8a415264fd174afb30e7888b05c5ce3276c172ce15fe100d583c7ac5c96e58dc7ca2989c0b009072fe1eb71d8ee89086f16fba62b5c2df170d176949e7f0ab97b2585adf069ebf59bdbe86846501ef0d8d2a7862968acf7236bb8cfca6c2484e16b488f5be89914e1bb9fcb1870723c40c7349e954b1e511ebb63f80403a519d3357bc7584ee41c84fccf048963a80e993bdf6c8a8506c6af414ad1e2aec458c55eda14d2902283f556938f5bd77c90140846d94157eee4b5f8ac9a0d14a280b1ede1b8a2fd2bdb1e8aa8dac406525ec89ddf7af692abd0c1070f05458931ecdc3a3d6e342a26979118ad53fb1f2a3ce76b7bacc262b72d596bc4d4e6cd9048345b36311d37bc9f8e246c0619fea78e83514911335a5d468cb6129139ebace263d0498f319522ddd3aee551b68a6d32648393f4ec840eeca38b2d64edc079bd34e5764c9cae9418ff4fad86327d8e3af7887eada2d39da115ba3d0eaebcf38e8fd96059c48b5f1188bded2e6a0cc1676e092298ef7b495544ae3992fa2988d0f6da6045675d25f4072c6af6919262c63d4a5e41a3b1334d7c0e074ba4cb8815c57a004485c9cd10339ca503d9d46ec3cda32c57fc90fd94aec787faf38764abf11b0c1006250b4a70d192d81302a20bd2349945b1ec6e6ce6eb10d54ee2243a69b3f714a7b6fa068189037cc04af8db244e9a2b0ddb582bb591b1b3c6fa0552d903d64707b60f5eb401a2466ae6ecbeb8f22e1af1f2a32c17a48bd2180f1c5126005929e21de6e36463c6649ffaaccd1800bd38553443cae9500411af56497b32e719d10b4875f3acb5531073b8e5617f47aebf1ea9b64bb7adc3bea75b15497f4ae5f3ef9d73025b6fb6db98460465d2863f6868057b5a43533865c215595849574fd0b5f2146c7e505dc5fefe0f22449b044fa18b286a97e6959b730a09a6e97af9cdebeb1daf2431abef513ea0fd51eff4bf3567e8da3b1ca3c0decac7f5c64de3201bc4b88a71d1aaa15dd6f389c7ec9d0cde61bf04864ceb663c276b781299f76e8e679cacdd6efd749f309490759860f460edfc4ca7db67566796de792ed2f120cada2b28339b2473a474430b9b0d9611e0a066969dfb7dd90e69dd848ef48a04b73bf368e42a862562529d6af0101feabac15da153ecc8edaea721b3dc6837b4cdd93cb52f1c817ce994ff77ddbf02bc0f52a5202edcafa483949c129720169eb82016738f9e511e49f4d929e772d4b247b4dace794a720262a1fef208a25e7da92deafd6aa2b66f222c5c9ecd0928404d61017629a1d0589e894b15bc00d9ed4baa0028f44fca86ff5c966b9fddc068647093dbca558de27be9c06c087bd86cb05e90e0e8379d6979e843750c757fb788e1527081b47d48d9823f426e1820c189efd7b29f411af941fd4c11768b2644a90465e1503c778a4f7d9a9e05e99d0bf130360e9d0c728cad4a25b3654e6452c48e87f5b26e21f5626d14825f45000756afeebe510d32c988d1dd75db1453b8e8bf7cdf67fcd018b645b3cee83fb6c1383d6fff8fcf126f7cef256c775020f59b3b75d914829f862a6ad16cd429767c70c0a15a4b7b38341cb844afd521823067455687a3d1b688f86be211c18a42f2293baaec90f2c9a27c38bee057db2c764a667f2f2593214006ea5f69752b04f257b1803e94fcd682b00bd5d2a71c79defbe44262f420bdb8dd866f884c255c5b6ac1e6b74e9512a592c5c30ce9901c841cf38c051ee12a2710bf27b901149703ca3a6027461c53a910df67663b01955c9f0732012b55cf7c5cddac461628348c8486874ac87e67bf562b17047597d014d45778cfd74559101e74044517a82c04cece3d0beb38b8f225c47c4139a3cc3c82f2dc8110ffd4c5042b76b2d128a196ce742ba1f16a71f745dc46ec620dc48124a551383824b4f8d49e78d284ff0409f679cfc84d448e831edf51bc645437396d10a7b4f128e7984509d3e96344fae2b44667ed74cf7804826a964eace8f3ff580d40986e023d771c5dfe5175fca09da9e531657bd6fb801d866e6c5fc969ccbf9b9ad8f30a9c34d393bf7fcf863a417045fe8b3198500eac09b6eb00be0a1561c59afeb43f637913dc42c35848a50fd6470e1916cd2d47b205a45f60dbee06028a47e8e09e38f87afd46a7198b82b914b802820bc2c8fc05557af08c00a573e6eb48064da7a94d309a88c6178f88b729cea5324babdc0c87ae0942ccf89e9b5bbe3cff77afac1f6ca8bc507312d5479d82f4c27cd52d9cc19da14db9748b9277b85605a5a0b353387988a3002dc9f55a76381551a64711ebf50687c2166491ec11131fa5da29d02061d39a454f34e9977a0ad560f57ad3999622045292b635a5b82bdb535f178695d1b2e6b9fef1b454e6da1f6057d0c564d9880efb735e2cfe323b1cbfb3a79997a520273b3ffd1a014ed16761e0508e968223d8c50ad646fa1da8c9bf1108a0f910cf439e5e1395b9d075d0bc347d61324a8180166c35ce836fe2d0182abb32cd2432e54e9349a3aec09ebff22e962fdf7f9c797863e23de3b3d175359288ce1c03fd48e0a5ccdaceb496f7b06aa9b6d303190674ccc2b1bbff57c2dfb8afd56272b6c179068b70805621867c6628344ee7a642f85928348b23724dc5a0a6acd22da22a6c102df6187c6b7ec3b5bd94d6658836faab0b1362a129c5121cd70aff980a0f4073dadd23a5a3f0e3deece338ad8f2b9e3f6843efe404144e033a7b96835920903a930e2ba8e1253003bc0fa178c2fa9ea17e0bed3027203c6f56a17ddbf3b6afe802bd7203e7e01ee99455c9cd758a420d06a376f718c0bee427fe84d0066adf4ed3116cd84b50006188001f1291bd37217b6f29539229cd071508a108aecbdce4b8867292d284eb990318743e39319fd888b211dd727d62b93ea530148f13ca14e79313b62d6c83f5a00c9bcf30ee7dfc30c148f7a17b29ccdf583f9f3a3697588a0244c73e997394144ed77f4e7de1456a05b586cd889102a3caaa5b2c2ecaedc6f27d883f4c68d2397ca1a18cf89158f2e7687232fda349279d744efe231b3966bfd74e3bc79c94a7cf59e493ddfa9c816bba687ecefcac3fa7ebe7ac23cffc2077da9a19178dcd37e8b168c4a9449c11a78d386b44d758dad658da7fbea2b6e997d9608061424f139e5801dc92c1e0001bf5fb9bc0462ea6538bc7a465da743571c236f918c6b0ed2b6558f7b5c226921cdbb7121eadefac0dc39f9b3897665b995bc789848e334968434bce1c600cec9c4e95069feea449d38d292f544d7a8d17162a9cf1d831abaa7eb87f8b61933441580e82b00198b316f2ffc146aeebef6d808d5acfd33dbd2bd88b0297c66c46fa60a3960e146699cbd37dbd2b7497f5ad71f210f3506b0c028fd89ff9cf258e31c0891517a8800b2eac64e1984f1761f040db32c60d66c83ca904771e1d3da309c2b6bc966873670b96f5dd9773ea35bb2c108926083befcd9d206bfc1e6ebcb1a349e0b1e363ed60adfb147974f40c877f8d0e76824ab68e2f10083bbffc6ade0f4c7c611886f6458d14d998b3c5faeeb96f75a2256f8760fe3f7c2e4d70d1fa61062e35b0a874b161a3820b9956975718eb038bca46692de238ae7294a824e2b2e5964f61203b92bc4c2925a3b84459bd3b4b8756971c3c369159c86bf92def63aeb5761edbc66d7c169a7f51e871bb99e86e24ee37659aff1cc0c20515258a20c2c90719a7f10212524c3943062e2990cd0f391604092f5a80c51552c8480117b21bb42b966cc1830c429890cdd973a2e1b1c758d675dda53d652dcc39023b1de02f1e494dd69184267b4efea426fbdbbdbd7decf6f61f4b4e4cea4e72ea1c8f24ffa36eefee1c3b96d0dc79b8b70fafee2be5b13df39c93e79c73524a67cc702d6c60e3685a29f6eb4024966a800c2a220a8f6cf43378f4ded6a38426fd374a7f9ca00290391b328b5826ba715eba21ead31e2de425dc7cf1ffe1a58ddbef216b04c58f5988937cf4dcd93169557021ee931ad624346c8e3646261e913772834475ac0122b1fd4e5d6f659e2ecf591215c5ba19bf7df5b011cf22a2eb4e9d15c6191efbd4f182e1789a7383ffbcddf6e2414b8ea31ce5283752cafde8553189521e0de39e3e0994dbb89a44396ae4c846c3e8b66ddb46b95669c034f49dbebbd749dda9775bb43b3159615879cd396777f7eccebe66ccf85bdbd0a0b5a3e7ee9eb38e5db6a857fc69f4496832a97b7e12a5490da3fedc258d007429755a69c783f3b1e79563c7d3ba9b694ee53da45daeb8a5e56410a1a8a8a863d2e2585d11c762710f0467c91d8da8eb1cc8dc064eaeff6c362343e669fc709dbb6e832597d57145e40e3528b25d21771b79b890e328d16a75f191a77e5fef2b85035569b5d65a6bad5589ebca96b5d6269506c64bc13b8557a1bbdb364e1ef206e37190379dd61258dffca1f27b45975dcf5e420f1f615964ab4af287d41c9db845402efa6eef6ddbf67d431ed2e9c0dd7e8af5c78ce812752069b2e912bdb9c2fea0b48a29470902a5fb1c61686d50094d59a05f73258cb1aad5acaaca58f110d0882d27d5a46a589d5e4ae8996bc152375fd82178e47079cfcfdcdbec6deb6d768323ccdb7d500bb77b6f7c96c8a349dfd1a4d7be4f0a91d3cb422d0f78b0d1f6624ba423b0988bc22c73b7918887e8036e2d7fdc6a9768532f3ca7470d9b48e612396724d10745473676f02021a9c79ccda5a9c4c35cda21ef8f9a2db6e4abeb0fa48705ee886986e9e721fab58974d7591bb214e77021bb040dc2865f74f431191279ec8885688e1d3c1ad631295226e9b7c84cd2e7f284ef6edb330a2c5cc6e2068bc905499f2c6a181193b47b66891d7783e8a2c00279b76d4401c8b51785136ee5264d70d189cc421ded589646e729e74569d2a1be6ca7276b1015896023c70e1e49d309aa9ffa4a4329ddf22fbd1f852dbba99bba096d5a168f8a7e6973b49b3647279375527617e5c2dfb7e3260b2c7a86d041cf709e6641972f9d4de7a4b3295797f029f37ab2401d343dd9a98b7988be8cffc873db578ee33850076b71b9ae76d49588ed68a111278999174b3d4e6459276389ccd6c36ec9b30811e29a127201db512b9adc7e7df7f6d9edeeeeeeeeeeb3dddddf7a8e1c7f7d7c0535cc475ee2c2abdd2c2aa2455f04a363779da5af5184a2499d6e4547e5df391ab145470d2b3f609a8da6527ef00178396a0b995b06dd7e0dd9a0fa6bfda326fbebd875d65acb429dc34693fd977b5cfa47361a36a71fe5786ac4d20fba5f4b684f4ab9c8e0b6b5827a541c6196b9cec31df48fe065cae830d99b8f3a3cd43fc10754af7e2b74d7c9d405568f46070e456eedb9fdd4bec4e8282cac6ab3bf3d3d5cebe9b93d3c1a56726d474f1059e38318d1918da8da9d4f428fd78f28a6ee1177feab15f43d946301f85235831aec10668a0bd9fc8f636ca58626c050a16111c249367fcea895e7df3c1b0bb38bdb9fd4b197f5f7a8ddeea829b6dcee2829b4dbdd3cdb9fdc36e2f6db277d394a8a93cbdc01ad2313aea7c9fed0bbbbbbeb3e70774f2fb1dad29d51609eee1cf969a2c2d4ee1ce77b57043f9ae424af8a5fb9bdddb6f1d5242d7be8d65b0efaf391807e7c7a787674c21c9c9b974d0d8d9d71819fd762751c0ff1100f390ff15033f191bbbf783edffd5b98b05040280989baeedeaf26bda8f0c469d420e5298993349eb8d468c208134e64c1320498286c88b19666b3190eb2fe1d5264fd494da9253906e60025f327ba1ca35668327fee60327f0f38a66355c41141d40002c7680b64526c92e819a5614e27bc0a4020800317247630220a932e32eff282ab2f421819c3899acca35c779bebe3f7c19d248fd085b4cca63b73cc3076fd498f852005313c4d3555254146e6647a20020d264b387c3184cca1605d1fed57844c81de32ec39275757486ba66b6386476bad20782024d2266e7bff6c3ae3eefd5364a3fae3edc943b47a0b3e435d4ed5e57ca1fd5e33e4bed7142f9c735153a8b8e55735a5cafda4504ba3de894054f4bd7aa63cdd32480b6f5160de45dd8d258b102fb8828b1860b08204161f76588209289e98dab8bcbad184a2dbdd55d2a86ab2051a4c6396645d860c67c8804315283380e24ebcb03131434f181e85417314f677cd8490af0bb2c4195c282162040d4c61644d822cc2ccf085175148cac8daa16ed31f086083a18ec2d9dd512c7175bbdb25eb7e4551d12eebeefa15c5f5845dd09de194233afca8293a4c8941098f9f835e1d0a138ac7c043504d4269a91c2355a4624974bb886b0a5b76def952129e7b344faccfe5cff9c680506c593499d8886f05bfd69f60d848a97a5f7f2af95a0b43a7262c78ef5ae24c4df2b43c91a77b30072899579bca754d61c12db674a66b1d85793b2176564dab7955bf67344facce9d646ed9c2658d1d19556c64c546f656d7d799af7f6d9e659586c6be8db5f65130f334230f37a2302fc7321a5b86fd9a6cadb32a083befcc85c9aa78ba110162be78ba828c990bcdaa0667b05f9da9be37d577278ed96c210303143818a14318597d7fe258901c94e060650a31b0d06e20abcf2028c696b15bbfc5bfcc5571602cb15d636c44bffad6ac2bdd0faa26fbaa4a2a0a14949414549426a7264b2814f8446b58fd99f7f957577dd5579d4469e93a5992525052144a6a1bbbaf3c469b9a9aa638bba9999a78c8699ed89d2796e796b4a9c96314ca9be66c6a72753563a3af8ecd047543862dfb0a6a56595df5f530ec18cba579627b6e499bc0c6c243fe4e608fc143febe44eaeaeaeaca95aeae8352782d6ff425aff952cd8b34e91feb4e6762a3ad3a3dfd752b8f0591f9fb1504be079f84efc1ef1e5b0f8e3ccd82f7416456eccab05f93e531c41bbf1eac1019636c5999ba6e6ee121a67d49e44b976b5e6e59997c69a3daa636da46d530dea6288d52d1294aa53255ab7ab529fdb04961a35aeb375a514934f325c934d2259f21491711915b7d2275aa3af090bf27522817f28de631b7da62d866db9086d10f436badfcb71e361d36155cffba7122956ad2e9167a061b4d3a06ed8282a94c948a5271abca54992a5375aa4cdc12d73354509aeb39a9bbc646dff5ef2a366af953930ed5a47bd0369334e9b77f8a7429ca32926dfa6f736c2441eed8453c9a2776c76374c9c99f1ab6cd744f1215cd9e4d27876ad8fca2a2b1240a6dfd4a5ba9496f24ad4323918488fea1079a271687878ad060836e3faceb6cd7ba9fb6ae782c9a207356c00bc30250aff1efe008f3f6db166e77e3b7f5685d0c9b7cd56cf9d5e7a0da4313363250a2c3174a0c0106125824e12289174b658c91010d9a2898f009a3cb184e4881c50b4a506828496207214c5c51060dca349d74058d4051a625822491c1111b5cf0618b2a3403e890040b15152ecc400b369a1384cb1e5cfe52e872a973b96485a1b55d479622373a0d50821c7962c8104a5678f8a186326368b0430d523f443941511dc982d682197c6115d68a2862450a95a82a6cd0351f3ec6dcf2b32a3fab69e5c555c49694999c94765d2bc2ebd1c3de1a86dfd1a6152592d0f0e2ea8914331031728f20820919188c01a2cc557daf6b18ed9a9cc1d6df6a2f9da0ca2c17b32e549fc3a0186c696fb51556e3d67f31b6ec6eedc4ae0472bb4b7fca38a882918404a68628f105195fba68e12e66c0441055fc00c31252baf0267fdd08de74e2840a8a134e5ad24c244945924bf32793c7e692169a3d9adcf9938aa422a9c8bb91e494cd9f734279a141355f587f6652eb7b4d472b83f5f10399a4b17dcd2b73c5f101ae3fc46a740de71a6ce4ba6d84dd6e59c36328288772a8a323a07842799a4e9c4c284c4fb1d93499a6aca3cdbcc7df639277e04886e18fac4ff29887f643f2bbbb5ba1c726c88d80a2adb717e6a49a9af2c20a98e27efea49a1d579975270472f06023ef82c174bce5760afcd5e392b03895b03ab1ebee6e8e726d1362566ee2b944ea630528bdacf53c5901ada39e5fbbefac0dc37f2f47c7a6151a0f12e627f59826cc3f4185a63b1f48c778d6dc06f23891cce69c2149c31c3ebee6779db6319ec73e63a8b5d65ab7f2ebf840f5cbed691797670c93f9963f8cbcf3b6f9030f75dbc6c3856adde6d1b66d9b8f1e4db2b3b3734558a0bfdc3d10a5dec2c1ad0db9163133f3c6bc6dccbcf106449de16d1c157d50830c1a6bbcb0f3cb20a74e9d3aa5cccccccc4ca790dd184bde9e3da79dd3bbb7938848eb072fba4595bfbf4b111c0e4d3d2f435def6fb621777bf78ce26f986af2bbf5bb5d93f3882965a69429e57f4a436aa758cacf9385e60761f94b9a82203a4b088ab295474798abab42df1f3c34df471e1d0ce6fae8e3fd991989832ecde5a82d33687581322d0cb6b49426094b5efadc306850892129d0db75d6f65233f5d2edebedd44fd818ac8dc1d250b1e49ddfd47bde39e79c444da530133d833eda36d9b396ddec6c65ab13ecd7555b69f5cefea82634d973498c2dbf632ba634c22793c89f4de34d8b3ca9878f1f27a8c0829d4a4bd499ca51377def58c725905bbb1a4d864dc3267a8319427dbdedab200e2e8b4b060e34e8e2066f01e5ce175304163c7cb1c1164a34d9f285ad20c155ae30952b6ce5e90b1a773a00e76e631924892f20c8d08195168bc562b15a9cabd4d103085f988a95212a481adc18c3dcf93b2fd05819c15c0a3ae075b7b10cc1144d95cbea581d8bc8559ed0c46581383c30ee7c8f3d573902da1d411a33503688067450e5e2e8aad0d1b75c410956c7025d6509cc684047c50571d41d6ef8d39def791f27faf55a9ed76ab5bc56cbf35aad96e7795ecbeb2d5ce56dc0a674e73bd880960b3a42b87323818758cf89933b607d273a77c0ea59c0cd657d59e4acb124ba1fe092b8795b63094df68bb1dc98c25fd66f5ff2147719c451808b02972173278e72bc2c8efa2c73535861bbad57a1ef5cc0bd5eeddb8d3c76e4286267ff146b90c16a17941499a7cb523748830097a5c814b9e2d6c4328834b3024b9fbf87146b1081fc85e5a82f4b6e59f42bcc5b7e403249e4efb1183629f6e5a7a3fda82f48aefb18c463d3317cddd4f00a6d507339ea8a215ec678e9c24b94972b515ea0361069db38ce4b92282f4df7c547bc10b9af2627cf0ef8bb838cd8b2bb5f0d9a29763e0d949d48958dbcd67b4c5ca04735cea949630ffcf640cff31e7c702c39ccf546264a2f737d904bdfabd888c7aff75df3984b0a97d84e623711fb89879a3e9d599ff9acf5fe93e5332014983f674db6ed26ade42e5868d22565fb85e5f6f7b8bb5327ea449d58a8df9d6e535a77d5df2520834c0dbc584165c58a8c9e318513515071832b1e6494d6c58c199a821612460c4d44f3d7ca24a64a19386871c3121b786148152c18b3c41259bd72eb9359b6500ae123d21c84a1030d0aab2e65c490d11a5c589205cd89530c56a86ea8b512c5ba48a182ad08aeb5d627eb134d284514a94e50b327e0821ad090410c9ca24011800a8438630ca85a9722bc4a13dd6c369bc1c0501ee332d54b971994bc9b08ce4243194e51c22cf181e6a4065d6000c6851882e0c1a97421523f31b6fcbaeb82a41a9e8421c4195a84b942a45151820c1861b61832a58c2e4aacd68ae4052796787002cc0e57e068e2ca124f74391203337c8a30489a886f75f443a34b9f0481cb1656abf5aa0deb5aad566b2cbb916ce6c6b2dbc6d2d6b10ce9ab63d667342b4a69102856a401460a3360400391204da6a87892015515281d5c0a9726381f32fa3e7e501eb20e32b36e453ffc808b0cbe9ee1eea91a7290d5dfd1d309adb576f5bbf0498f6d80091adc0085911d9ab881acdaf0a285185f9c78612546565dea562e33dccadd4ae90d195bbe6ef744e998924029a54fd227a255c0e8db9882c606a6d4dd917cdf1c4bb29fb31df7f239991b6df557932690f69502bd26907fc46336eafed933476b08da0db6860925ac1052b6ec10b545c9086baf8e589717ad2936cc528405a31062679e4c31f18ea0cae1099512d58c3b4b75cbb076e96cd77507e83e2d617888da0a9a01b444e1d3c1152b0fb400c153002a25222d38bc86a43ac892c64e0da95a01b28809098065284b959c013c51230b122f212a5404c8f28217998569005968080520459550961918002d3412cb988f83282b0160116383a60280a50a17009e38c082c4384510961e42d10a250060b1c1f5529c462c42809e9012693570fd4c49f2b42e5a3e556a401d2d4b4ecf94aa1f1a1122cf950f0d89cfced4ac8726c446272a09cf152d7a4229a076ae68a9c9c162a57325091d1c2aaac2eeca0b6e6e3e20222a42a235e574578ee0bca8a870d2b0b1a982e9460cb0660aaad7b7169a28a690a2f06263ad3c4163af34d55849a29bb1b2446325069fab0a9ab5d2034acd108df9f9beaeb351965c1d181b0f894a53152d2ea4285555a0b0525560e08324d554a586171214332a645e484e24a1a2850e9296272a547490b0cca820618394e58aca0e4048535053c8e000a90ad3942c6a90a860b256d0de7edd07221015958f9403abbb2863d8d874eda5200a985b12754044a172cb8ea88b62448eed88ba8ec203ce4c47eb5a65d8d7e5a8283340614132de0bece8a54586dd79a2f582dd69f27e80028720a0508a4119deccda2d5a32d89aa915d89b2698583b44cb89b53c783b3c51c32d3bafc813436e49d4a272e28c5b765630b16c18154512554cddf2a1584cdee7b558dddddd7573776fdddd6d2fd7eeee9eddddedd6dda9777777777777d7eeeeeecf6b813388b71de2d930cf9a06798827cd7577cbcccccc1b0f752057f401a594d63a5a4a79fc3aa6de7dfad3ff0413a4ecfc560d1efa30ec3a4ae947e9f310ffd87d2f90a3d4b7996a298dd7b4cdc7fedf2dadcf0bb39dd68d436243cbfbc01a583eb6a380fbae8e2d5ceffbf12db98e5c66b98c5c160f6dad155ae264a18d35f3c399cba21890f0d2d13d78803879fb0fd4f1b7d28480a6c865beba3f3c0604c8d8ff8140a4d8e96fe3b4061b4d19ba970dbfb9cd6dc6c20744c48078e97b36cf46315cae220f6d938501f175a3542fbdc1810127e7e31fe4564f70e9fb517b392f8443745cd849018f909eef47c326c7beef3e4f6c89eff97c3f1ac6efe1b06eb8b16b1c17bacecece92b4ab540d03c1cb5a6e70e7d30a50d1320487225890e4886c22014614a9265c78c2031797a2eb645436f542d84336c5829052a62923ee7c393d359609a3cd9a94bb73e7cfaac6d2b0d94abd3495c59d36777e3375533b4169288fd99e2ae3ceefa986e974adad1a36a6af7ce64a541cb9f3bd882f7912676a629fa080b853f45ac33a58955bf9d5943b05309f2af97cba349534cc63f2d86c726a18475141833b9f3a69d800ee7cfa44690d9ba2541eb3b44ac99d4fc16898cf9d4fade8d54c095c4a52991ac651552071e7d7250de3b9f36b5375aa4f15aa6151ba4a79ac93cdaf348f51d96caac95c0f8248ae0efc0f4402bfef3d10e9b3deb740246f761c83c93a8efb0d44e2eceb6e2c66cee8a5651cb1258c238290f2658c8ceabaa68b090290534a165d5ae586e50541d84067fd4106568b7221a3c4753e25e502a519a8fb873d75fd497f22f772dd639025b91b8148756ef3454328412c91c113972f2c1843481a4d96dcc0440cce6ea1ba642ee392fc6cb0d3632eafc5fa3a6eab1ff5afa7ab6b5bb794bc12baba7e78803b5a9dd5f2c0ef392cb2acb1243b3af670a1bf77ba64b0f3995de0c745782af9901eb55aad8fa0a0a0280b944be27150e9b5399d3cd6b23f697ed6fc1cbbebac0dc3ffdb2411d1f5fadcd16c48b352e18ff9c4628d8eeeb29e4f702a9fe22becf7f7ed8ad2b05a43f3fd5df31838d30e6b4a2928ea7ca25005684416eb74a0469c24b8a00e9685c13a1427ce1ad1abe84ea243b950bf15b91130235a16dade256ee2276e275887f2984fd17ccabdf46fa0d3b2705a4747e6fc6743d14489240b11f1e89c37de78236f4d9a1d90ce6b5d7b5d78f57a33fc1e7bbd3c9f9f67a8bb8b79a82f8ff305eebdd9e431977221ee3ba9a71a54959415cdaf2ec774c65c910b71e18f0cb0d1f34f366af0f99d8d6a9edf460e251d92cb1d945c84639d7b8063ef425cceebe6f9775e67e6f93dcfe78ce56d5cc76a791fe86a91b55caff2d894713bfe7977237995c75ec6bd5bf9d58c8a67c71d049da6a64511ee0ca8a3afcdd7892d1b71cafcf3f1f96c7a2678634e10e905e2f85b6f7a7a7a7a7a7a7a7a6c6c6c6c6c6c6c6c7c7c7c7c7c7c7c7c7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e8080808080808080fe817e98ae7d1f1b0fbcb1ddafb369813ab6a5244c3e3e3e3e3e3e3e4fa448e603557b1a9b7e7e7e7e7e7e7e9e4891ecc709080808080808e88914c980ba7fa01ffb3e3622ad026fd0fbd9d8f484762c69464ad38137faa8e67329a73995d7667ee5556ef57d1d088ee50622855f27b2de469c3217a274a92aabab9aa46975a9a9eaac2a7d3e5f0b504d6baa1af046bddf37adb3b496b6a2b168a14603eaa8f70bc3300cc330d4d1d1d1d1d1d1d181aa3d8db4aaa7a7a7a7a7a7e78914c97a9e7beae49c8f8f4d8feb79762c78c3efe7deedf873bf23723aa26521ff500c59c85d633933ce803afcd2aaa3c33a3a3a3acdd5bd75aa4e8bc5d2993a9b8eced499530a57a983f52d91f59ec8d7dbf97a3e9f9f8f1bf64d96c87225ae64ba1277f216b81257e24a9c0727271fc29980af4275000471b0098004853cd7d754305963a8001d107930c6b51e635995d5e52893c78624f1d8108eeb9ef3b8f73a7186876c088ea038ad7bf0d58836643a11bc3dc65dde63da6b554ead5c88fb1b915e15a9f51857ea327a8cf798ee316d8673ef307499cbbdbf440e0491da003c1f4bbcf11d2b0e00443f7847404bb4dff77d1f6c9cdf176b89f6b6c8df57d4b64ad1e7897d3bd1757544ca03e7c042dcf388f4083717dc58b010f739625bc142dcd388ad8549ee6bc4cec243dc836263e121ee5b6c1a0f713f23a6409974370515eca5dffa1b71488bc11e704fa4930d1942e465b4c83c00f7448864d4087bc03d556a04705f54c47d8f54aa498e52b17acda85433b910d74e6607dcccb33af0eb532929a9cbbd8d196284ffacb104eac632478946a9d6d58ce5cced31355ac6e59e66acd9b1c6dc81fbf788dc933ff7e46379d471a16803de98f7fb666a2733a3733e96e0e8e4725f03428def881f4bf4c6d88c19d34a658c1933c68c566a18ca7821cc106642f87c3e15c3b02afe995b3af85fda4b95ccd7f825ce2da912ce658fdd8c33239321b502c340b3cbe570cf3e964db3e86b03228920828d7b0200f0b1c49aef033f67f2fbbef25380d1c71269ae274e10ec40900441702c83cc6ee9af42bd017180b3366b2dc485a9d5b29835f0f18bcbfd0b44fa16d01267ee4ded350ef9709e7b2a068ec8b1903379743b017c2cf1bb37e2909eb7d9791e9dd0894d0fcf8e4ee8e4eb727040cf035f37e03b917ad24e6608dd39f99c1cf149497d5f4e299ab8dc7fdd0d8ea08ebe411f2dd24204f85862ebce884cc277894c943ee839f81d71c8f800781e7188f83a7f230e01faff9738c4e77f1e471c62f3379f237aa0288279678e804af37ae2bca1b8b3b3b3b3b3b3f3448a643bcf010f0f0fcf07f1f0f0f03c00c2300c7f0cc3307c1d1d1d1d9d1775747474fe717070701e08070707e77f72727272de27272727e76f6e6e6e6edee6e6e6e6e65f628ff87abdde8599cf75c596b4d697fb1b10c73736ada736eea9d2f3ec749d4e285a16ea3e47a4552ec43d8e486b2ec43d15838dbee79ed6c234cd8261aee79e72c1318e85da99ecffc4191eea7f89210bf5df883608d3eddee3e03d368bb410e7b19be77e1a61a315ec2c3243f85ede388bcc22f308c76e1ee7998cc02f270f77cce1fb1b718685be7f891c0b7d637974bbf105eae82b0bc015101300b9e2ba7b8239c37481011e033e4f9cb7c321c607077c8811d30133b8b7d1ddad0ca33430c93d3fa982eb23556a92fb1669111ee2dea68c55badcd31a1bf1e5fe9dfb08b0d10a96c70ca147264aa48cb356021c9b61a17eaeb99cdb63d9e3962ad42ef735808f859480eb75625f0f071658e4f85a9c652ebd3906f8724024fa2c32ae7780afc569755f975e2fb6a4c80520f860d443085f8be9015f8b4cc50d41f8147043706e89c0d789f41ab538c75c1d70562181afc5055c3101a92f1490c28b5f8f025f8b3ed756e06bb1e7d2247d2df2dc1a7072e1a1fa9e053e4fe4db2247dd4ee4995d78a83e8eafc57983db127926d5e5ebc96c642c93f5c86432594d9783a7068dec25f3c49c9c1cd956a7ac04aec5fa0965403220998ecc4726a3deb29f65b8ca15eeb7e8ed44eeda703641be9e4fd4e071106d980dc3963c55005b92533982b2c4a6acaf4872fb6b047d00660875b2116b86d03dff3663df7b5fba702efbdcaf736e49e6dcb2e36ea0e096419840b9d3855c154600411717c4c151563740c00244a1a5905060276642ae0adb6351bbad0f9f14a8444c998b72d4a1a11100000000f315002020100a064442b1489ce7b1aaf514000e6ea0426a501acdc34916c3308aa1186388318410020030c0106648e86a06081dd0217e0d308a8ce9011070b792b4a9ef3d2148ef928f8f219dc6d7ae0be4de457ab73265ead635e264495ea904ef45eb6c2f73a2819e3289ce5d7598308279ccd8388fc541ebbbcd508bf5b7b77bc71f905524c1b0f2b6b558f4c64356228360b905b723d0aa9ddfaf6156d0a16dbeeebf6dee04b0f8a9a0d1ed61f61b909079a54c5790b4dcfe4a4f4ef4e6c833e75c09e5b02840ab76f9aea697c0663be0bb2aa02b8e43a5818db4fcd66f715e6e0d554c8a03fc8f07edbbf9ef8f3ffeebb7df1ffff896db7eb3d887ec195bdbf9736fff598d4a08b1e8c04b4c75eb70c07be32a357ed97faa1a9e5b508b660e46d8a4574b9554110915a7a4bad7e673d6aa6b0cd40a6e5efe605dcf5ea66d671a529695f501f12514f328f2bd811e10f3df599665b01d2acc15118fd0fa1c064603468a37cf23782c191fc00ca82b38bd82c2e928a176b50e724270161b506d32be44959886e1a38505594d1ce781a14408b468cf0a0405c2566cb1a86f7a38779f99cd8eacdfb827d9eab082654d53936b0a76219b7ea9994cdc58e373613ab59da46790eafe6c5a96e811fdf0d11c17316cb1c06a7434c48d994baa4bac08320c88e651d306eff3491ff2307fdd709e93e4a44bc4d34e9e3a7d5b5a2ae934d020ef69a836455c3177c73e077898e18bbdbfaf2ef06ff0e62b95459f880b0738c57b6329c611dd0be9e79c5e8daa1ba2c443f7b7ae621e54aa1edab00cad862dd9cda7cb26847c3b300b62a6329bf1a39176d5e2f02b641c12fbe429bba95304d7659305b49aa39c61dda8559e318d600776922b6e8c39b46ad84b61a0edd2c7931564059b63094331d859dab331b119d00b788f23eded7a82027f983fb269e7c550cf1843a258b0b1552b593bf9eac13be1facc9cfd3f8fed17565a778042ae256727720e2163447f55e7665184392b556d27f9250e81783b04efc2c418ab93968498a8a271e0576b138eb72283ece1a5833c80cd431b90ae06b95c229b002dd571de2f10c54121ef972851041d31b78d8e9609e23732e13dde93c46e6d984373967376f890bf46ab0f818f402e614300733ca5353d960f803bbd90df6718b25132a6f1a2969d46494fb6ab2004aa3af4eb5742bd06f4c0f7a893cdf19d728b86a9d7a46027c865cd0117a5c34ba8135d8cbc50370f4246d2be1781423af2f9579dc9b0389166788eba9c162da951537df5d5ab450d5097bd55095d1cad696b6e1c648783c5004178915a0bbf01d1a53c0673870b84b3971d9fce0e057cb0712a703ac542aaed5c549ea0e728dfb8069c4336244d0958db7645b51efce4ce1150175e2140915e7d522af75ebadcffacb4ea005c75441f28531ad1a23894792f89bb96b94098dbfdba56a260a2d0d959ced147c76d02768073abf1392326cb39e02f7c3fa6b1731720fca38dfb88c2d09c99bd38e0ddc2fd62018616c47a10f4dd9567c706a05a316a3180bb9c6901c1cd19e92d1088fabbd86d6a76ed35485e0f8343cdc4a999612cbbf65c8cd2dc008559e8ecfc331fd92f1af70007cb2f21bed0e17ee2db726985d7cf558db52d67f5500ef9b96ea9d5c790f4dd58b7c5b25f22cfa97a6fc3b2a3be9cc2f2b22710989ab9a046269cef45b5670be6552a5cecc9880c132bf4a4f25971a76744adc7dd18c59ef081e6cb249dcefea728740fc6dc6ce5bbf5c9e4cdf81b6b2a05aa4de594198a55323979269f38918f7c666e5263e11e8b8819f65373e4e225515f3fa576b15d1b00efa06efa2f31cd568aeafd339f7b7680c38813189b97795d5c2b7102136be6f1f9f172ed86f8e0b4f3adbd93b1a22a53498d9a8f5779fc67b515e3c9de9986d113512f927f1b11d9f55ecd738d0df9eeebc660f8ef3b5b8522ccc27d7f0a734ebb80e147e33d4fbf98529a7294c937906d92e35e319904d690eb2a907bd26d0697881fabd533cdf1c3a262104b697737fe1c740e7ee94baa4bbee8031d5fc86d4ba8c9d1d682591207e6df2a4243fc3977cbdf05393361130a590ee4894cf6a333408be8e50c1c062a41e415cb4d2ef0d50c287a86648265a87b77c1e809c45f0f32abdb6072e4937bc9b393f1411b1c868396940a23c824179db9606beb72843d9f78a8d97d23366111a1df62615ee1466c224484ace1be1c5c06bb98f7f07832441308223761d144c956f329e010f83873fe2175c34ee8ae9be7437cb43b9442a2dd57099db09739bcf4540d58c85a2748ac2d80b9f03d303d3d9709f3af2e0b0e415310d2f89b0a2788f042f4c30c75437eccc28ffa25e4d0ea1e2212ce71e11e5a603cc7eb5208aa1d872a1823131e74e8855455c4cde0542cfbbbd761df6027136c541ea7a22faf7f181f819503f7e7d71a75a8ce6ab68c5a6cf75e63f499149089e11ff8a5f6bab1a866dcf0d4d9bbd78d1575b3c207f685c38e72e20d6ee7d139e787d7bf3e918fbad193dffc605b066f20baa0fce1e56688c430934dcff76ca892e99f23836c27749a4ad7dd06816d80ad447d2c06a71666a51427c86855e5ec98c46077022c90dc538b8da0bdeca7dff333b27082c59d7e704206d0ca26ff85330a024560dba515742b6c04677edb38b57ba636f1fcb6906c92ebe820ffed6aee5fc6d8ce5e040536bfcb538a10510f35ca227295eff45463c876fd91c304e28a17d0a8b4f771827df0f10135ce2061405edf24844608eb080beb7dce4b57776438d6ee7c70c794c8ac96221389deedb6d19d1a34be2f29bb6a603258bf80bde29040609417f6861acca4aa83b7fa9e7a3261df0cf60c3079dbaaf1f362611755a07ecb7ba0697e93c42c1258d214ff753e8fc732a56841fc01a06c4bbed342802c94658cef13d9711d53309a1262e8860945fdca4c3b42f17d63f3e8b4b0704e4cd807380a5f5e8e05d8b7ef18c6335e1a84930f8515773526b1d46ed63e2460228aebeb3755adb904f8a1e4d894bce55b8272d15c0c94dcc8ddc07f03f005065e0a822c4d28ec820fb1e606dc4181527973f7cd3ee1d146c54d53ce9c18870341ff8267edff8295a5f7dcd84709e900edf8256acbe85ea6003845adeedf90dd3d641261970ce3cea42957b4d7eb10652fc1998f72097105d1b15b6d09ea1c1d027968fe4bdc0716c8d35d0e72bd08c15e1023968d5568b024639995f003c90756d6bd51125772606be47d7c11a87aafa59e6835673c5ce72932c6f0862bfa9a24def44bb4d719cd4cce3f4ea13a0b242af0e41992708c2490f7c281cd3fd6ea8a80847970ff41f82fb3e3d27fcfc49830b3c01599228a51fbf218edb93f5ebf81f3830230d5946f27c829dbe89577a478271d1d943cafaa9617abe58670cc491c7561ead3fe684de97f4cd2e12a6de8ed4dd8f4d0c854f814617643827a3745787421ae2ee1ef0f2a767e5ac3a150fb79755d29001a8b19f0963870877e7f50b5b953ce0e4505e7ea6b4500c8f885ce2aa0347a56569845718aa6b3bfa46d1cea9c7130479bc9ca7ec6bad16190878347f307a0610f15e7175ca4c2513c0ba560c4a53ca9f8de6114e7032f78d2ddfe4457196827202ed86fb4283efaf52ead112fd8e1c0392ed1a1f7f020ff915e4e66a50b5720aed7633bec0eba96293b73eaa1ac65385d0ecadcf7e7496b789d84bad0af21529f459c6df9c9905fe509499233101a824da36505f195bb93ed520747ea90c8a2c56ba8f3d1efa7330b93ce82a0176cd8067aaaf419334dd1f7cf658b097cd3464a434367e08e180841fa23462aab6c2b447b6fa84365b99bffcb16aa08bc7e0ea7e5564121a3fe8eb0391febccab1be7831c6c6b6132342c636d5dfd34f2e18781c3419772492a52260ffbb4a5cf082c3c1d4d7442661851f2e399e4e0be094527f98215a13a534f1faf90bf7e635299777d2274ff43496051b8894083ad325a039b060b49ab84f89791e6adaa4d000a68481c93135d30d49f14c4cc9104ffa807b7524a4dc0f5e3ecf9df439d5ca87ea767c83fce7101ff1259b18c2a893a2ff8e033a50505cfac4f883ed15a228d72f74ec06f4d165928aac4dde4d7bd70a49f73366b71523f9120223c2470f96c8ea9603b376e0cfd83db216e0a04e7b4098c3e394d84da3ee70572f9e0ec8258b8576d68a92c3f9728ff5a32d9f9128b3dae0af3d860f443f1a9f71786a3df455a8b188308e02b327f67f6c722146eba7138a2d0e924515c2e7265f5435e760d6e3fb56662139aeb02e0e3b3275890452b626ea817702ffa4da5a954b811c0238c5546add8486401966e301d17a0075033397c849fa5f2497c42547de4298b0a2c51a94c4e6da15fbf9a10d447cc86f4d3d2a26a425927fe36c0260b5879f367beb065c8f0df82e0fe85d0e5aca81b1fa2379ac98da0fb9a9cf334a8aec5ad2c554e01df36f3ea3555d7ae26df0f0440e858686b941120756bf5bcf193e4003d3762050d1fd7e961f4388a86ddefa17b3df41faf85073ee2303dfea517ad57082fa927aea11573c3e7679be0f09e7aeccf59323a20886a779afe1ce0e98aca1bced0bff327ef47b5a0778d3eef6c9b2a61cd91ef350fdc555643db1fbcddfa568b41a36b1dc5fa09a876112256f7f0fff07aadf1d125870bdfa8bd0f7d724bc56820e1fdad8dcb7c4a8d14e4e7ce92ef54749d92bab9d050d57145708e0a0ae4dfd8f11617304ba0c54dc289f476d8e9c0dc53cf4c231a3853a588e8b19a5c49266f081bed6212bcaafd87a494e1276ce5140e8837a6bb18732034e36eb516e98889198bcbca4ff52aa04d6162a3f944eb904a56075f6094ca483480d49eb4edfcc59779fb9d78827ee197bc0099e7261e9058eaa459d4b944b6397dbf49f66cdd8460a32ce2d97554b918774aa001b91a5edc9c3e74b303e69588807c2859d55572196abe8178678dc385e89d4d34792659b2d1ae7e435a332fcde967f7cfe94f72ffd2b83daaf867ac9f3f0c56f9c3b551523059cb780fbdca4df0067e8a84b3fd04277e8182a16290c0e93ef62f351ccee345e84de0f0e3fc95e51f08563dbe7c9057f5e4e7ca8330f904d1f08cb13272daaea22108dcb47d89ef1d9ed7cdd9714f1e335c5d8ba4608b66e0bf3585b73590dab0825feabbfc8acb5a0cb8818ba5cce2296f09cbe86846357f8b0abe5c91b2cb4ff380c13da33e9a2ff0871f6269281376bf08285134d56bd644b23776de7175b0afd07510ddedc5547c4ae56e812fcec01fe242833276cb9cf45897df613b130ff5b50acadb8b354fa9f4750e409e8782afe003868360afe883266a79614e1b62b8114c0ac00c33158f994323b72c7bb44d0c3800a287fdeae05013a2ad8c93eb2158c9d15966f886e8e4ecbf4c36bcc0343dbecfb694278ffb51500f8ff7f91e83afd2c3f6137f88b3e80284f482d0d754ab5fa62d87583ab321c02c3815d21e9d7a02908896285caa80213e79cba84d02661b0d1e4dfe00d9366c981911a2fc145f1b4f7c2fb685a861b7794baf26a4d17c8f8083a3b673c8a092050d57a08bf87278a381de2252861422434436c2e1b125fb1982e9def1d7fd8c074e80bfee3dc1697f0c8184079693e9085dd1c64987e8fd019c774cd2e444ee13793cb45a87adb2905be1a74a47dbeb2647f96629474f16000de0d7d6b326e2606317ad4caf490bd9cb9e1a5b35340261592cbe59c140f2c74a1354ce879ce8c5699bacd8b626480b2a3c0c3189cda9d19499e6a5ca703e045e7182e8bdb53ee44515ed48987dd94ab08cdd39e211c74af92474d1311e8e34cfaa1bcf54f83b8bcd53a5e9d7abbfac1a8cc911ead9d780c46b38613adde82659fc666a0371f388d1cc8298ce73cb80e2f58987782ad68584976b014f1ec88e575e7c534127a7b04078f658173958e722f850fa3347c63209e05a5ed5ba913a19ba73818701fac558871fc52a974e77339cff86afa59e48658085094dee6c11698a14ec07a3b48532825b612013c93920650e93dd4d29901f62c97364843cc1d5023f4325dbd5981ac80045925d5d951cfd431064568ef4ee2afbcb7f10b53b1cc37d243d8362e169de45068b61b01f56b1a6903f247546d807c0e0855dfb4a35417a329229135946bb3236c2613d30d97c74efead6125d5c2ecc3c10659143d661f0d15f86b415824103c8dfd29b0bdff7dcb5948567c66a149c3bf10d125070d0eb17416d80cdeacef25656b854f50decfeb047fb9981c8fc60aa0e6a9cad74513689987a0af1736cddadc491c1756e04a90a1567e92469e3f6f287a31c61816b0cb2b9c40de695f23cbcb4828ea993e839a16727b2e1bcb6a964fa2ad0da708c4b1ac351175370b923563be52a83ad6e6631051535d7c71b8522a42642fd1d3dd387e28b065d03bafed04a039024cbc23651aa02e584216dcb4b1a91d14d37251197381013ea81d377ab846897bc39317fd56638029b69ffd87f54fc01deb950c950532708a18054079f00c4da2fa3c83132d5db35fc3b2dbb57d5c7ab7d62ae0f0a6ab84bca0328dadb4ccc38d09703985c6015fd9f4128fb6c19be529c1505c8911c44d26c278ee0296359f9197eb102e9b65681718965864631afcdd86497384771d1d1277ab305b99045e6bb79c785ec2aa15f488f54c4baea3b18286327c3c585911502b46ce9edcce3b3275f702c835ec7b014536a9e2aa53e40c2ee8822cfa52fa7c86d0261636c744b0f96216b09867a6837e821f9606657134ce7f29bd812e77545972e8be7da99957efaa3fb4c34e19deeccd7d57c36fd6aa643c1a25ea4490bb4859325b279aa039186c48160f2c848ad4019ff3914e5980c73c65745a25f9528f8dbe17b30d3cd2c6beeb7759e84c0a180e79c337edc65e70ca4790aa31d209f876440ce075d32c2377255a12c6443ddb7df7b8305be58c553bcc16d17c4b976b4dbd0f07444500c7082e57b9f5e6b8438450e65d31102ed252e721f24303612b50406a69e704bf05481f3809f632f9405c276e2bfb248d84efc5796499b841f92cedac9f47bd2597ba7dd498ef0ea3abd7439613aff9a6bc69ea45f73cdda93f46bae797b9afc9a146f4fd35f93e2ed9bef3e1f84573dbed92e528af4f26d0bd1e0f7a4683b1afe9ec416edfc275709fb92fee42a695f960bf99f1a1d153ffaaa3c7fc2bcf45cc5cbba861a5ffd55921ec353375e724f1014864acecd99a22cc935db5613ff924b4e81208a32e3de5a38232a01ca1e4aa1e93745a99ccca2a555d709fb097ef1c7a7b3317b9632891fa91442edaac6a75e1abdccd8cc235b9755667be27f96ae5c6bf22df8d7e476063a8ce5873198d61733e742821ce67ff548c5d61b50b00cd9db275087a85ae69e027421f4fb075a48fafdc07608fabe801622b70f700f81bb27d085d0ef1fec43d2f703342168fbdaf80a69ac6d631e8182d5b82554dcd5e276241b15d161507fae6b54081b2c48fe17c042d5fef733af94f7737821a7595e00e70f9ea2506280cef9d5040211f1147790f8ffcfdaab3928c02955b531d0f46d1d2df347fece90f6b4012f8e7e5f3aabb0b2427830c497a728c286931fbc64836cb75bff172c4b52ff94027351feb54a84a375c97aa5c372d4a07e8e1aee4fd608e08f67b898bd2c73a0dc930da182b401ba5fad54da33289f559ec0422bfcb359b5c61a982379fb8eec8668a71ab0d3005e6caf7bf3afc86972eb7654aaf26bf54eabc66fd5d1d5d9c2232a8c5af7b0913391b51d978c8909b8b48c8b8ff31f4aff611559f3d3d4c6302d6778479326c05025b6ff5a405f23bb07c3431e12c3d59ecbe2dd62e79756181e28542a34f2eeee25372b657c29ab265de3fc3bcf9c4508e79a74e6f5f9c93b35caeb8edae4ff4f6e1b5f1069a4eef5b1505cf09a5c404a7b07f98ea5388d0596c706bd14c04cb642364cf2c5570df3fd83abf1c2d3a565fdfd5cf7831e20c4dbfe692de64290f93f603f8d4aa7dea163cca5d10f59267b9d779122db90106c8d7c8a39fcc75d193a59a36cf54d7d094f934f8c8f283493c14533512e7d6fc31eb8f0af271cea6b2ae0bad6065b0d5e762786ee3ad03b3eea06a984c014212c94a287f82aac527f11b6d4ac32b99a8a61632e48513eb92e38f24bdb69c896b88b399e891e9d892b6d66e76e665abd9965eb5bad31660c61d3d42e30782ac0e97ed1402bcf44d57e0f8e4003aa6ebd9c2441b684199710721cb940149ccf29bba1e54bd581826288c2b629db0e459fb0fedd2f9340807a326979127033ed6a985307ffc787607487fc027f0366cc838ee5bab3d01db821263db7b22cd9d2d4c95cfd9e2b7a6bad4c982e85173ae6abb9bcfdb658a2a55db42da594e524e46185da9fb4bc45fab5f7c7c85927a4f5ca5644d0f26082d343119d19a96efb9206cafc5b0750a920eb0a0f61df05492956dc595f8343e53e349028a48240df1f8b4aa80ce049690812040febbd85fccc77c115a6f3042a2dfb7c5b96563aceb3f10f6027e72878b4080f3d5e3631fca313884e9cc5b20489cebd51a48423933f7c6a8085256749421ec5444072db4b53712f6988f0482d8627c5bb7b465f69a2944a214b055205218c6332b88f63c76b4e4775e5b5b45f2fd2a62dafe84e889fe775a0a273350f89e60f6737979708370d5d6a760fbbb23dd12ffb733b50e3410be263396385649c20fb47024d8406d27578cda8da9fd015c592d3aa65b2cf937d0f3c1e54d4f9dfe33e80838db498be18d48c1490314c062bd17432632e3298b4706166d213d5d463ab8e894f89c1ada16dd9f82eb01b254a570f8956b5711a8bf4cd3ac62af95336301e9c91c95321743305db5edbfd680765d5ca3c68d759b26d14a6c47b6d5d802e8f48a1e295b913d2e4b2d3c1e2664cffccea44ccbe1c30ee364f26c04dc06d8dad07fe74005195ca0372ad46a0cf5169983320f7845868bb5cc6f5eb3e56457ef4af042caf58d3ee1a6af9c2dc9e6eadf11e17e42b0415b79c7bbe20008e2b788c4fe9ddd74b0c56b6cca8208f9030247b2b144578d354b766054d96ba9cb0d235cd55050828c0b6ff533b8df0f1ebef40d2e894ada65754468ed6da65b18d4e59d664a754728acda2812ba0330c808ea62648533b2074fc7d003a1ec9b6aa3df97e4ff9664af9232e761cdd71e6455876ccac3910bf4c24785e13dd2b9f6a131afc614d275c42a1327bb0ca516c13b2096dd5ef001ef588a7d0b92ffeaa48a9a810c1d63539cc426f27f446892b0cb69f545bd08d6e07c7f92acabb95c6f91f5796f7ee3e44076f913defbc76385af7e1ad6f9516c27c5e863bf080f8a3c594d095164eb87066c6a3d4292798ee4bb8ec7306efbc6a1e116bdf7ee4aa3773f40eaa1e93e5ad85f7c1f455fa63a2c2034974f370a68fd102c570136c657cc47cea7a903de47aee03109a367b5baa434a1ba422991ea37f8e919608d83a63d4cbe7abcabf68b6c788a0dbdf1a7c62c15d15e4f11e1f144c3db033011f2a8ea6d727d5198e3af4492f1ba2f999a30cdd8580fe09f9241ede0db6537b2a0102e743c0f7badf4f49b18ea860621d1c36671d88aec0a7733ad293fceccaddd8e157a06523830069a81ef3c1290c519046dd3db139c9d02f880ff24fe8b7709036ab9afb1343d0de54de4d29484469f76b4c498f840c8ee8c969a6735e8ca34c989294588c81475bf425af6cffdc3c31644dc6d212bd59f367e1aaf3fb9ca48380bf2c949cfed3a0f3ac883095ee7124cff4619e35d5867260bf1960a0ab01bcab5c3b67794894d74861df6e225a033084d77098c500024a27743d78ae6b01e494b6f5da8330329deb449d4cdaeeee774e21f425a1409de9abb0747cb69e673da2d0251bdc419748bab054012da320e4963ef732b67144767e6ac8a2ded9509fd7d1ae54e6738efed705fc980c956db464378295f7d1772cc2adee4b3bd8091d00e4caf029275e17d32493e9b6a1aff8293a3095cceb167602dd26dff030deb3723afab908f805b47d1ff66d88afc9dd83ca079c1b5450d8ed94f536489e75f8990857a20925c6d361ff4d70e9d2a6008b9707b7271d2794653abd04c65bc61ce94d8e037a5506ddd025e1c9603a221429f81521634665a17f950dc8424c07122a2f534fb44ad05ba322316981db295712a7623c58e6d8783b50f3862a45adea460e75e4afed4201600bfd5efeb8027eb20447bd38e0994b2a75acb64a71f517ce0695a7aea40f38b17123c5a241c45ecd91465f9029e4b165d2abcd176894865c8ad9ae5a4ce4cd960bcd446c7d1599d89a1e7eaa7913e17074d7523da6f8d0b113d32f06950b616abdb6552eff035fdb2dbe6eba41b724536f3216fa669c981e9e228483c7eb307505a241a538ab6167b2ce73ed41e58dfe5ba438e03a175530b1d91787b0812774e1776e7e36a16e28d2b0bcd8b33f222816a743c33f1f73950c9385860c090171dc075cd523d6516a92db43cc16f76ae79acc33ac31ae07f2ec3496467c76762ed14652200c5a498ae2241e942246b6fa9c2a815669068e34453de94b3a894061918c0a5365bc42e8a6c0299e1b68297e4ef715b8b6ee94192b889a362d6343026d28769b97f524feb8d666bc1ae0e43d414f097f44f2f5fd5b4395fdd4a7fe9d0e0ee948d09d6bf79419b5dc977856936f8d147c7b7b30a2227287d982d9609bb0afe963b50ba03728aeea6a3a3295f697aa37d374ff4e7e882846d52b0bd8632cdbba99d049e31336b62e193fe043bcc5f71f1e4042a8d57668ce5843051ddcd216277d28f42b48fd6698a1ceb634e2bf9511cfe22128f084f2ef16dcad1118f34a6549d7f40ad96f635254a402f7d0816e8356225e39024eda68813d4c11a0c1520b198e7e1327afde0640c4731ce8e5a222010c0ebfc16178c476400eefb0cb5533f4808a3cd970894d2aeee8486b2708d9cd447fbaa4b8434d7f84dcd2993e7cf93dc9a26d0f9e509ce1ee151b9ea9ffbefa4ff5b481f701599c10500a8627b17a3baa48049ee65925d873c321f99f5644daa5b91563acb77947adc9e3d1620bfa9230db721ca1ec668311ec6cf6796d8365fc2ce6961ebe37de2ef759fba7b96b997b531b549b8d426d87d8550f531779537ff31b34a7d620a381504bd2176c56965c0c98e00064eec95869e963b283ed2cf1c13140b1e7843e9c9fbec7a786d9068afa043cf6a3fd76f1278744909d80c9d4a40f863375d4c33946aadcbfa18349fff668488572d17f0475eb9dfef30d25327e83d70e2904b79ccc0f92edb6c810e64f76dc147ad6688df7074f03bf318ae8db376646ba005ca7f6fa4d6badeb78546b3d1038a43f9c2f5bb06e6886325631a2dc087730589e9ad138209d187308fb3e5e0f670d85fdc0a7ea588311ce8e70d220428b2144cee35a6ed2fe1ec7110dac69781bb910063087dee6976e5e5977199c5e6737dcd33965588ebfe7277760922b7f0bf8a8371faea680812201f5ebef80654acede7740b0fd461b96b07794ff3d9e295846a6e9c46a17167937f2528e05ebed2063fa8e26f8afa7e1bebfb06be42e64eee4c7cad1f7eafd4af83d7f1b3459a60b68cd5b7b9a0297b5a779533da3bb7784eebec4cc514dc6177104236b4d2611d4723f9c0413848daa223daf9442b24e801d705020342bef9746aba60aef056e26c753ab4a51aabc8d5dc108f75dc3578754305afb3deddd5cccc39682ce18477aaba43555bf212954b547b1019ef701dba70a7552a5530730acda6f386e2d191b6b48283f71ccfbb6c0aaa5baa0ed00d579900edc20d648b519068cf980597c24199ca05fa891335efedf93569c477536a97d4d31ef2a67b97f083834099774215d1ad971b24f312a4314e23b45a35e77ec344b6659f26cf7bdce9f00cc1152a217a9ab79acc7a144e00beb71e01a1d640d3c923b7cf575e88f9cc01f9b140a45d7225e2767a4dbc77b07618515a584eed09b1372fcff7b31b631605c42721a3db8d227b8f470d3edbd4c11aeab77fb524fc8a7e2820b0ca02d0f5c431cab52ee2eb13e2c06a8864a0c6a705063be17a92e65c0358adfb7c32ef8acb94a0a768ffa982e178a97c90cc6f02170fe49bd4a982a349106ec147a18c4e19c33bdfd6acd1b8a7cf3973b4856dc21677afa2daba1eb039078013ef75549af003d34eec7da68e77673288a6c76426eb1602527550248f0aab6bf8cbc537b2e29d710ae8a2b97f6f4c4519a8a78518e337707e6f4d3f982956afabaeb8194e62d14eb6ae3f275a0088c8f9c2b6f52cbdbae58f01cebe03e12ca457dac3e57fd3c93c060d34c07932fb7d200b13d98959a3b2859c13917d673d15ad89f8821d2006becb7a7987ac0d78f575a206fe190573a595f153e3ea73dc8f98214751f2a454b4a633ada3cf5af3e48477d843e01f92814de4cb9491b419edba8d918074ed9d21533e3552121a229d70cd4a6e094f8d57dece81ac392ec08557dfe82ec01e99539d0a8d113aa2c549e3a834ab9135018d67aeae4bbaecd9b027f1d41c7434342c52ecb841806d4d5145ba5328a32c1f180d78ace0192545d9beb7306337994c815f9e60a1ec0d2c0425921f9e77d90a03bde08d9150f7b2c5eae38d867f0f15802543d2cec22cb54648dc7bad5a21af7a78a72896dc8935c53a1ba8ad3984cb19ed40ad653c89003b0d31cbae9da686d58e4d2ee3b4408242dfd5ff6849c0ba66bd3258045b2d1ace8d3105994b3b8c34cce4a97b4ed541a2541f3b2a69469d05c2a1c3e06e810a07860dd46f61824b7df02c39ae77a4a62237ebaa280a3fb666229b4cdd7c33e57bc87dd3dfa3ebdd9b222518299e29c6aab019fa527da94f72c0618a0712389e1e2b794ade91c1bbc276a9825f66078e833d1ec17ad7d250530316152aa92ab7016982a566e7652f6fb390aaaa7fffa2efe705408011ef50882bcbbe408c8641a53cd46cb4e86535469c796ad54942c4aca0ef57b655a9222b0bd7a7ee8ef09bddf1eba09c2b580773b503e99ae3ced1613e867a15cc94ae90ecbfea6c311317dfcec606307c82a30d03b11567a3b1a3d8d2697b61149752e2bfa723e38bfe19862338d2d2a062e58baee923d8bca28d66f06af5a659bdb6df2cdcd9b79acdf10b825309359c9829a1e60a3767ad077b7c6c91f746664a4bdd3a58a2f2615c2a01e0f03ecddf2e3b10b474229f1d89da2a13eb7481981e63577a0dafba0bf20369b3bffcdba446e56efe0b2f5a7a0b9ac2eb7f6532541b8a71a0ae150dfaff0e481f284e0d7812e199c034273e8d556684056be40464e932c23bf36a8b8facbee3532d3d45a587a6998ebfcea2fc8c4ac0b48e7997758bdb781f4f8d4ad7900c8e936e84a24fdc2c7db490a85b915271004130a00217dc7d9abe63e37dabee2a23fad95b66678d62e8124cb554bfdc91df0155449cf0fb09b522260bb9dd5c5d6ebabb5cfe448e5aae183ca6baf1a3bcb4934c1047e6c42484747483405653578e5f38df6f88c47bbcb123c4ddbc046a57d367aa40fb027e23c00a9209e11953582e7506770b31386d2b473c6100d333b8b8ce8bb351ce6d8a1f7258809ceaa1d5e4c20a8632559f1eae9ac431d52614309225b204771bee8c70c411128005959173e7681deeeb2abcb4520825e55a120f07bf6ab1dd180e2765e39434823c8a1c4fbf178fd9982c641273829c7a4b5be95b9c5290260aed6cc05d02d53c883fd39d62e2013a1a16381fb2a6b4ba2a71b5d894048a3de1f7614893a547031b74591c9d295a9da9a1205c1df0a63dfceabb67aeffce72ae66e99e6243a4f2b0cb76988377c20bdbd124fc2d781aa7d9f380882c645b7f24aa695079ef4f2b8bbd04143c105e81c88e40a52739df210c3e00c090816080dfac4d212d113122a2d7d59fbc10f10524fa442a4deb161840acc33a56bb154413964f1ce9692af5bba6877e8ea25b4add7969e709f23f491d040fafac8e016fb3f7266a14b800e86c713fc9c4284bf188f49daae0345a2f6704fe4292ec1ef9c4f83591cfdd785e163b983fdb563c16f8e7192bb50ec6880a077e221483d91923d66282fb27d1cbba6b9751045554d041ddd68492e6d15e8256b17af61ba6b2702fec186dbb652926768cf5754bed48d86532faf024b4c334dce86ef1a3351280746d88243a76575d0c46add43036c93c5b4b5c7b392d3c8ff47c9c7f41c031dd0a983c053e8212113bc0fd9d03cf04578565e473c566a14caa5b2f5ea13cf0daf03eb479a5eea7647ccf2dca908d6d0379ee5fd2053800ff3e54d426428e8039ea44e8d396651b2871110339ca7a61c424aa87777d4a0b88632f196035617481ca74a83d29948aaf6331a33bd35e846dd392c0a31944836cb6d54bb4a2e74dba41464725cdc1096fd386ab7e98aa8bee7373998404ac9029ace8ae296a2b287a2e2b470513a00013a641f86e25ca15ece7cc72d33fc7ed26bb56ccf9718574922c014634d941f076b53e7fd442ac25e46158a5fdc75a0be5a1a7cbeda9d1648c4fced51fa9900831e220d47b867e99f8abd9c3fea438a004e790bc6fddf9ad846d0b520287f8e3fe797554bac1eb6bcc362c5ca2bff698b9f85b9474c274f976544201fb3df018c9ae1dca1033481c142a054d0c90d667cac9823c0ec579b2f6c4b86bbd9f2540220028a2cbca9d8b5807a25b93b172538737f9017b8b31b13c6298e7eff340f50f9cf203d1171c787a667ea0498c6af521c1ff443ccbc4e22b682c1c805d6a4b24f92b1a5a34a853e7afd8efc940d59c7827719b2e65b31cae807cdde1b60c27c5616ac5a656991991ff4392063f43a10ba00d83ad4a95c2cd42fc5410e9e9e26ff5d637de292d853acb6f77b3b0a8dee32775d9a7eae0ea8f86d257448936864a858c7994e040f87b8aa0082ad5978a0de1081393a6d49f37fd2412c227bfbc9db9ad70dd986e8a103590a051c1a616848147e2b56ef8e7338a011b2629be52bec995a44a677bedf75113137a138e940a2b3aead3b4f26dfd8587f6996ba43fa7f6ba651c512f18c781cb0508835b474fc64f5699052365ea9e473c6bb4fdbb001cb836d555ebb903bc1521d876a845db05df8447bada158284bc1cedc1ba23ca7eec0c8aa88b28ab4801221410d42aaa10c9fadecef2bae689c4d3777971f61d898fc3dabe3cbd719af0f459ade3a5be08284c57ed58390d1f834ae9646c3f2c39febd810e1a32d8e901678f7b82573dfc330380e175c668feb64d71982e592881df9362c8295922b7fb195cd2b899f1a96185a0107a70a1d9dd23232267a146277ef24719938481853bc2ddd34164b0f4c3735771829701b7374fd296dd88d69f655541ca36340ed18a78ae5d9ec2f4df2a7527cfc3632b988c32676dc1a26358379daf986925a6d329e68a68a186952851a989d3abf113480d398caac4d3b10734e56ad82eb4d8278ab9f1739bde31ce7254bea9e7f42b4684bb752c5042c0de68a33f1ba5fa94d208df024416a4b4c0339ad3efd45578fc88d9ea44dfe69b2343f59b68edb8d9335e48d635edeedc04776b6d8b35d278953a0bb5cb4f79ebb6985388606e5fdd1388238bcfe139d06dd9e3b2d34a6e7cd8f79652f4e7d1fdfdff7b41f134be095ba32f9664065454112ef16e048e37994fc6f6f3892349dd21e74a1e9a2e9396820d970a05768405680464f2368fea16189c3b189f9329cd54398498712837674068f6ac7d0008ef3a30fac5a43241c084dec4d0a07f47803cb6cfac8aa7a096c227fa6c7dad46b97e74c377568a44e84d755ae9d20818a69711c003b8c950aed5b2bf5cdeea63a8d879bfd303f71219ce082e070b4a9612b6a1e677aaa49c67f4526f0e6abf6a9ab777785f21eb7179b54bd3a9a4e63e666df46f9f02b3692d103916a523f900140e33ed6c5845c6ff964d621f4020f25698fc24c485a1d51ca3f997d765a4a9d6a329719c1f0209d33c7177ac627967fc83987d78dd81c85a9817dc8f9cc6bb409fc140adedce223f2e442ea4fd1beb347e2f161e42f59c7411af3a68a54260608f7f60e1323af1ef8f3ea00180ea51af4c167c6e3df24a1efb36bc96b96f643f166fdf4dc12400495d2fd6aabeee868957c64113cc908f83b383bfdc1fe65cc05f86d47af989b82d1eea6e0fee0b2e35a31775f26decdd588f663a98004b39ec941f71169fb8df41185d16499b6ee56bac1119222c997c3fb11b3b412a6f9d218c5468249588d852cc447f48d9dfce8960bd81a18c4404e52bb84dd8b4640eda2235f1961d23d1b3fac495197d5a4a7ae714133b99c509141e85cb0c0de27b9e379575d2d0c7dac7a14c82e28668ba4e43291aa8728da2d5b50516b35dd09116f5967854bbfa5f80251feb51b638b5e33e6e198ecf9279d107e4a329799e6ab7c576094c474ccda5c54b0e3e52b4c6f7fcff92c39234a89380c9942ea43fa8110bcea52b49a7860dedc620ff9b472b2dd68b29c9d4ee19733b11199ac6762c3cea70ffb21cea1c20d3934daef24e9b2ed2dc8ed98234b0129764cfbee47b9bb21fd8fb49439c8a15f2099fe88f151e93d2c3f58bdc2ddb32fdeb210a20528d6c7e7a4aaa52fa000e263874cd18025cfa9e7a747646c0ac1332826faede05cd73241e9110e65ed396632a5b5ab0d6567fa94bb03fa8521f7e90a18062b040996131af2c1c6429e0854a9f75c53c16706fbcf7d7d9379cec68e6f07c92c501cf1818094c923a95e4e916e8c2ffdc89dfbac77fe1f19460a70787a034732dc1bec561e93332c579114d0e2c2ae5fc9fe1c2800a8e4238ad863fb5ab72719ad7b1618b596ac6edcd5074660cb49e74a7412174105415a789dd9b30f94ee9cf47f27b0184c34f6467eda705e19d81dcff0bf6523020d411efa438d8e556729a00bab0e84b536e8ce2ba9b3f3eef1f28910772f84883c2d59578c24baccf00a172e17afbdde6799149a187fc89d26f5b6df74fade6f724ef137e9e4ecd3a2dbb882ce3cdd0e5ce4b436d89c7e955d7c565d15066f9925fd84172767998773369ccd766faf4edf8c0f326ea1df07e8a1e1279ba76ca33821357981db1963f0b4988a516c84d51832911b43d862c81610aa4c0f397640498d14913d6064fb93c17269a068b86310808df328457ab1f9eaab23fcb10794a381ee600f2b77ba6400838d48caa26e4b90bd1aa9ae566e9b57f30ad4a2688fe414412dada63ec6ffa7c89097adbfe021d47887a6ce75da9241a4292679e3efbf2284e019f1bf78b366befd44f4ffbd67ef0329c429f345d7223a108f72b539ad0131a2934fbc452b8aa3c9a38d3b29e16120027352040c94c63dce5497e95a5f97cbcc037bb2807d8805afb301c256a3608c29dae129078de9ae41acb181df18de2f9c4e80ffb54171c8b8f5db1f12400c1e45a604c9bf990a2b0a2ecdc7d99a428e8b560e36b8d2eb6ec47972ac03ea12683a8223b83f93b6adb3b90bbae56ea606b3a8d3df8e9e44a3ccc41dc28f2508148f10b686482d47a1859f9876430b56640ea152132ec78fbc99e8fccf5afa2ca040a4522aa2e310671f256a9a03f7b9d9a2dc25910ebfcc4be837a95e24a6dce5235beac8918a5950256722182d58b45d0711f9dc52c0cb9ff515a336611aabbba3d7f5e86102d234b7e3f054fc876bfea09918dbe5ec1f8d630cacc24a9adf0f7dd551443b5c4a96a3e9485b234b88d8cbb3891ecc9b563f50e33e3b942c5aeaf966a24ddac5544697620624016eb029ce86ee90685c94cd64839331503462b823a184b2e33f1e1736465fa841e4e6a6454a803983e5c7cdab38c78dcb4a2a44504b1b371d4b2570b8e8db4c8a3dc0b9df853d546a79ad448d4c1e1c61d3b74d00122eaeb047fdf4703ed8df321aef1db298052e097acf46315a68b2b2bd4b9e7cebc8e7ccbde2315314536e6ccc6d1552f7d79610e6dc7bd6c4e15692d3ec2f84f0707673eb306dd88c5fa981003201a5527843e1f1c972e737187ba0d4728047d484a1f2f8c8e3ca6d03b640639d32636d382852f373c90884873fe0e91454cdabda06b84da6bebfbee8491cd4df6c55b37612f28c980adbca700a95156226e83a48a345a3c72aa7c685fbbb76606995b23f7823f5672fa0ddcc04a4bb862c6ffd6a32d0570f282e615c001964a0298048357bc2a3318a664422ee8cbd5e8f50bcc9e24bd0bd6fb7fe94f57e3f41f4e9b4e1dc54357bc0592111f3e98267b4b0aaf410c089f4ad0c046294678bd2af58a02cbf7fdcbd94657fbb054d68402df96f9664f32d1adfac60bb32ef234f2d141b1df0d7965673dc44f2cd946409902c5c546050434023c50b07d21bda84b2a101a088708155dfd5dd83d7389b05773b7c7a1525cbf85d255c7381d0ed1075acb85c338ae828ca32753119e7393eec76f0d92a9663a1eee9b63a93dcbf898f5e40d2ed38b40c88440ddafc7ce74624c32258e440c53245ed64b2d2b3055b714297e62c19467cc66e6796ba9d2ae9e25d3b54f7e89cf0030e6544ca42564b32068ec29e2f8ec88055226b23b087c27f17d9e305957e2ff955861fed434b74c25901bc8e1f7d781a0a547a141fd84f9ec756c90116ec40163251380e5ae5f26decc20bda7c0f9cc13b04454ce4125ff73509db338cffe2d4698635ba177993223fbb0d6b8aeb18bef74b067b4af0f38360ed0fe6c50d83108639c9f9c44b091c334cbd8372f7c10cb9d80e38e7583d52ec29ca3130ccccc47267c501458cde8185d2fb0157d63dc7c23178fea0d2438cce17e83ddea22702b7fdd2494e10582a52d6f92e42e145f52da57e3d0525ed189b3d4d58f87ccad6e433d411712d2717b27d9854ebdab5573c54343924fa4dbbcade3249fb8406e0032b030bb5d8fe62534c5688175a4e1fb3688d6025bad5fae5211e73ad6869c0a0c636854b1a64ca6814f5153c1dcaf0f74acab4a8007fb2566a7c80720695519060286ebecf9f4313dab3480434f4a228c6bf967596108223186536a2bbd502ade055bc0d366e7765365042af4f55b060a2a59a44f3325c957c5964388ec8d1ac30cc51e0a11f418d38caf5a87803107c0c28ec4997e0db9af18a74213adc56cd0334d36d9a8a075767ab855d2e83d9ae3b1ca0515fc724088b6189dcbb540c0d738519d62d1d91a0ca331a259cb87dcf5ffed1ba881e65f7429d12a395b9780c80ca8c0f8d18a2858273610de73190bb04b0080dddbc73ead03a1d407a565808bf0429cba2e86e6c9504c3a0195d4de29c49d0154410ad527ddbcf2dfb175516ba5226139842d5a8a7589f5717aa9ef6d086ac40d3d7c4b0aa369cd8e08cfb4df84f09c5fd41c3b1f11430b5e9e4cda403f59c2a5ff853680dfad2a9652ad1c0ec769f9446f8b8d99f9a948360b5019f6d331e5f2921ca6783290d3cc7d28862473557563cedf1515d47a418167a157075607e75c0300681a750f45294703fa15257f3f09f3536f8040dbe26b75642c9f216ae10fce1b63fde273b782484119355b4b33ff35bbf4c4f34074d3fd42db1de179a7ea120845d357a627377d052f16185649f835a6900cf9de2e99977bcf4547b5021db5d6bb49e2a9162b9483ecaee7febfb7037a7cd4924e568bcbdbfc6719c951c37db7354ea38a73b35868cbf72b135a588f8f181d47603bbf1bb1fe79ec32db0df8e72e08c01cc3f5da0f23cddfd67c22e11511a7f2af8e0f2e788b77f0a001883eff7d4fcb74b17b7644ccc7693edd5394d0ea8f4761092c40e16848d73fc97de4edf42497f90ae1e6ef4d4f2707b93f481be9d178c785c78d19c402f22a678039c251d318342e12c48a4eafb8dc4457fd695418ab3fe3ba58c98aa3e9ddaefc17fedbf81a07433844d490f5879294c1f9bb4c7b8f1da616d979f02aa5600004976b2bff211a4e0f804c8fa720dba3f6664e4d73792591498c50711ed9a1d3357b57ef841638bc7a4e54b6f414160194dfe5775ead6c835dbc0791094cd8e8030f6184edcb59ac07898a8edc636fa10b4b28a6c289914fafdbc7d3d61274735d8d289cfb6bce00d36585db27314b85a06207b9c15ad10ca7d827fb18e4aa8918d5ebc6125e1f736dd4a36e8931016200c70f3e40a0ee69c4660f750a5a35409e9ea66de02ef4ebf33501c585357c9f8f175717b12f1aa517485d1802dd37205377dd2096d955b766ffb646951d6c330572a9d2adf79ddf8db0dfebe36fd901469cda04f7967d1b0029df4d0e9b323656ddb9a1677b8b12438097eac03e26881981ad5c2f0d9a5d0f55c2951fc3252f90416008daa4d8f4ec3a5691e2030d34ba1f8d78d0e4c14dae17936ce7a0cd944340efdd3cea625cd9a74d1d9ea74c59c14b118061ca802e3a1f0ed83d7b6125b84f394e277003438beb53094349ac5cf0ca739dee37491c4de8150021b8b500ad52418f261d81addae9fc0e56b35f78b45cca78439ff1466c25804d62e40a1dd7d31bcd99eb7406d2bc655db133d9e0d5cbcd7b2dba8eab78cc417f3a82c0e8bd3821854d67b2d87b4ff407702cfae0369b6c7a9be75cfeb1449c2cb9d3b184eec2681870045aaf86beeaee7f47e092c064cdb01c0d7b4bc68afc3a27a8ab1716035d1d79b0afa20bf41b2c1a8b69560b18f846d045b94f623b4a41198a3b56fb422b02d0c3c452766fb2f35265360b75db0032f25852385d00b8e8dff60eaff706ae616a019ac8d4132d8c280e551647af96223d9b2106404efdb6a1bc4a6452cc0b5ac7d7a138a2775b588abf90a22b764158d8a2ddf90d8457239fbbd8224c2671526a87ccf8775c519766519a7ad3d3e0d7283f4953074187f00f34a9a107e1d54a5357c4c4dd0051489b081ac7719bb7e1bc7df078311d642635ac8c68e6d9068114459686854636e401a8eb3c0925d1a70c818e94bd3f9070ae5caa698b6f9bc149ff2e506b4c0bd373fbf2dbbb90d02dceed399f89e3a8c8a3dec2dc44c9a1111b5ece8a41c63db8e63221058e11c4bf9295b44c448661596eeb93525c782fa921bd63748125d471a7a1596eac07ee2319f3327f4ccbf7a74f261a3579766275cbdd012d93559ff99301b8a6e2c8f4ae45e7248ac6122b9e6d602bfaccf79c153eccbfacd41d792651e09c13e1c8996aa0136dffd90b53108e80a2c38cb38e341e9a96bb67bb17497e00193bc106186df501ec791d5266ffa876cbc6dd0cbf0c0e5ba8a0d8724c6ca067ece0480a3ad645abda8a749d966efce4b8a0ecfd803439d4bcf8d72a979bb94e2f6ef0fca9544315bf59d2f39cf653ac4448e8198e761550c3246461542a63d66a5bfd85a9d296e305cc9d119cec3a08dc0ab1d04993bd677f8ba4d10a5dbffb1ea6d553e5e8ba68c984c13c2c8b1a0f857a89e4226f25cf3bf8b3d0557db8622f427a9f2e9075f4bce0580ed4406ed24bf044920ca2e82739b1b7c80f1bf33772a76f8c179cb2407ac8667a67808e2013f7ff54f9c3201b8fc74cf2f5b82ea5fed93b5a73287d6c753f722a9b041edc3cf8c04a3dda5b9d1a4937bb46d6ecb7cab6aed153a9865ab801681c1112627791618adca89b6b4392a070ab492ea68e79d09aa2f5f0bb76faa34ebd351627caeda92948534291eb84685903c65d314b565b5894b3b1c7c6aceb246d3874697b230404981c68e00b21a37659db1382dfd5b40e5bae4f4f59204e08151444f6356ef4932acc74e54034b9c0bda59c81a4b906fe58accc15f041e28fbcb73cb803a5a7f5e86256648623a36ebefbd4694da1a248b4a9230932ffe1a0695cf908d49b33102364790891f839eb265b7abf8186acdd0cd4dc1ada43bcd851a7812c407fc8a0993177ded30cdb47b47c9f69951c3a2c66ef4a4eecb61220ac3e898c3a4bc3aed3a57c1b7cf312975e56f15de30d003fc279c74745b52fcb3e3ce4c09ca41a7867ab4b8771deb1e1ab329e2fc84410787e5601e9d208ebeffdc538bcf7dc4757a765a8fbb6bcf2623500cdb9e6288126495a0f4fe18d2c5c6121a788c52e22269be803c4f2046e494764b209e621be07d7970bf86b1be8d539e163804227e9dd6bd8306a997ce8db3c122bc0adbb0b62f8c71014c25854677badccca4fc1a717658a934bc0f005e682a19c358b72c9c48c4ea02bf28eb1a2018ff9f24670b34d6d730da33ead8b18d40dd7e247a747ece8cc24348ac8a02f9b3ca316a329064c368c530fde8db9b9e281777f4d1e66b360e2ade295db45232e8ac75b611eae7ddeccf569577a125c22cb18d901200f68d6016e8e43cce63f09e23f3746b780c790a380652778ae7a88ea13376dfc8f13fa17599eea3c83bc54721fa2a8ea5337f0c501a091d25820fa2cf48364173979622fa3c831419e3b84c8948f7bf149d9f9c1dcc04fcd067b399e21d08f42f088a78bebb354fbf1564e4e0cf623edc5a48477bb8939e6ee96d9391c71222366763e49080fc660c6b3477f9431680591f55297fac75213820a8c37c9e8485929d4a4fb7a5c915728bd9af3eae3f2e2f3b8b0f47cdcca3d5c38722086152d88cb60a954dbdc0e95c4f8237d548239cb1285c6e00eb4cd1baad9b70f0c1fc5b4254d92af267d833de127265cc05c688521fef7651e1d1278d968ebda5752aed2553e8b4da9d46db7c98f32658589742fc4934f11f209154ed403880ae38bcb2711f72fc6228f39a0d447210e348fd98e07f1548fbe94ef430e911347ed1bea707b23d471791cf76ed51968df5d2442fe6ea258d2421efffd190639ea35224fb9dda1dce6951764b999b02c59988926cc08f82d0a03a0ee7b9743eb0ab93f0cf9b2fb4ccfc403817b5d698bb0f8918ecfd947d5009eb1f876046a1382d0fee2b23ffb3161fe11eec12bec3cfc2e02b8ca1fe9eee00ca38a50859311ec00f955ace4a55e87a191dad490bf07540c18a20263bf07e3668d4f62b085b18fef8a6ba54a53fe75c2635718d3b4304ba7a82381636f5111d82f76389795585fbf394ca059d28615a1877e7627f1aa60b7b20f6f0da317707a56864789d9f9b618a40eb2e81daff7a4734717597f9ffd2027606f993240c9d448530c0194251d00947b4527a5d348e97619d1e0146e669b4b96a4a022e452b1567fede2fe36fd196fa0bd9941289da93007e935f56b340e154a03925ca809f36215bd6439bbcd59a18a0ff6ec1280ba3971dc06de59f3b74bab18f89fb8203b71fae2515013ebfe1d1653a307a3b1de22337eb8a742e6f68989d032807fb7b5a6105fee4c7fb3ac5212f8dbafee357b1d754dab49e0dc1221f24c053900c415d5c7e18baa8bf618fd45ed82fee694a25fd1b9c84a352485635b5efc0679eac68b20daf80bf6163987a56a7e6f5df7a67fb6013f79ad9f518aa5ceb0e23076858a58b3f9887ea3a69a720472bd4989b9d6af7efe4be157b0e72788dfcb95a2ab19885f4ce07ced665c4cea8fc87301deb89ce549c614265a30cce50d3f7eee1db1b7c8819a0f032621b6ae1cfcc658a8f761ca84ad2e910f9a596130eaed007cd0627dea4762029c2a704490ad7b43c97c5b854a5e935fc51e5c7124fa56b1df16988ca8665d3db162a1e180ccd051b39e8fbd76e58babca3bc08f0bf24134867f861b8ec67780818ac3cdaa997c421928d2889b95519325691820b94c44d1d1fde1927e9a1ba8a30c6f1ea2c5b4384c63ca06f3384930132d02a8d8b14ff6875817d7eaf652f96736b87c8705f8606f89279e19bd5916aa2f2c9e3428be90ae63538229bc3ff09ecdfbb860ac6dc5f1396e9b4a122d67efc53b99e39cd9918278b03725caf61d0848a457c1a9380e1212e36f2b307830db27109fe3c06720334ed6b912d7f75b3a067a426ffee1cfe1b7d62f1e4cb1e83696b9a782a1218420c7dac783eacdffab8a546e4b8835304e0a654803b245819b7f66782002e25b0a56af830561b136e67576ffd354fe88247d2d9fc7ce9ceeb06a674b58d585acb0352ebbc4d5bbdcb8d53f6861f3c77ee89c88e6b22c287daea5a6ab2aeecfd44222a05009d849f9bbcab4aee52aa6716db8c419e0dc23883c39a5a15efa94c4ef380b2570466a714dc5120caef26721ae16af71315d75b11f77f2cb4c8cfc4c908069e33f0fe063844b5cb59f54fce401f0f5b636c12e578546ce23bd63ea4ec13085b1313cb9b9020191e6de31bf2d79398fd1df084f9e5f1b4265bd32cb72985b10ab2960e461257258937ab37f5fcc0fa00f8dc524b8aa4fc48528bb136d713d8e74392ba487ca422e90206e41a93982a3a0144fd26f32ff2e038cf642889c4c07f9faaeb0dd1fe1eb42be632450c54d115e4cc5ad54e3c3bb39acbee2ca70ba40004cb2907e609fd8d058a32b68105658ce7e3d23c4c0944c5528c35658cfa4f74ccbfbe512b8d1baca85fc056fcd0771cea585821c11363a666139b2ca7a90966752cfdf969bdbfe01d4d4956165a34e892d6607ab5a0c08a79d854ed7b8e3850a242fbfddc3985c0d87310e9167b92e8d450a000897bfe774a076c267a60c26b0590f37059a27cc624ce0d5d1e643cdd9bceea7680985067a7ce4ae4c1ba7888f4f8fcba5c384976b3a0e4d92bfdcc09e799d253b206f9e4e8a1772f94af48d6a60aae198379d08f0fbfb85a516d316b6e6008d1c99d25972eae357a877be85070adb61148907660b2d2c0043df0a8eba3c154d1cd742e2b1a66b40146d539c1c0b1aa64225bc20486e019e83b4985a3a0fa8f8d6efab3ade28cdaffd243dbff92dcf5c7d90003cc65bf3f51f8fb5966e39090f83de0fbc2dca1bddd1b2aa5d5853880d335dd050d7bf3b902a48cfb4c34467cf55e7ac8deb62820750d88a476d14df5686d42783e5f09a998e18a7361651539457572a1e6318f949b36f8acc231545003c7c294009ec64c9a2d428266da86fb31aaaa86e87a82259cb7bade9685702bd7ded1f32e3becf3595f0ae90d232fc7795077440eaed658c85654160ba8b96521acde2dabe815903385c86cce09b57c42c3736872a6d712f3269d30280756676e9348fe060257315dc51d01860c3644f1d739fc7f57c7cec730f71a1ba1b3f5cf3b4e5c8137dfa38266cfc30df5b0990d46d5c3d7aca670816984f504848b9bdd4a0b9fcacfe49a5672e445a4bf270782c56c82a70f8b1c15fe7f381df0b6ec725dc0e94008107ffc8723caa0be863d19cd78d341cd4c81fd76a33ee13bebaa8582d40551634802769270b4b6533d561b0e85b6df7d4eaf2032638af47f5d32ed26e67e26605b4d9f655cf1c5344d2f0004d587b94ac472d7d588ffb1894bb95ca6c5b81cfcbc322eeb975b5001e413023bd2b11456c045c3f17521ec57cf717bafbdb3615e43011d6d4260a088d9d18c2b6ac6e6961848301e899229aaa9d9de04e0e9190e3de3caf603eee7017f1aa25270fef22888a66d81bdfe1509b046c414a03eca32fa883238dfdc05db37d3b9703231f4c10820c0c6b5a1978c3ecb378e1182c29cb9a9956ae5ab827d779cdbcc58d50330049490eced5211f840be8336e3f16ba3b31de6aa4c1e0e57aff7f39898a810ce18a9e894240fc2a03f709fed43281ad2cce5002a133d9ec9a38cc52b06e374b68fc676d87d0c1df542177713773aa950cb81ea4174544640a3914f5cbc74d029ab4d6ce2cb0ad1327411fb64fe3ea1dbd2165c05296021758959414b5b46617a687b6a81996deb7925cc3c3081f2e644091a2eafe5340385742bcd4ce4abb84c33b0a919275633a6d09a2102829300ef5944b55191ddcbba9b6cd0b0126380b90e8b4dc3f60dc38478bf3f8db3daf4d71d33e634385258a70e2a9584985786c7c8d1eb274a0484b62d835b934e0c978498eea587dccdd4408f33c006a1361e0ed523348565202b7bb427b08063e790c74c8829d0a919d856a0c5061baba451c11cf9e24377a584fd0ad33c858dfd208934018161950ee40bf14d00adc88c24df0ed8b40a88137e6b232749cb938176369997148e30627aee461bb6075dc9851971cd3414d4972963d334a5ecb62009bd298a03dc8432ea062abed7ea4222001e9ecf0482edfbf578ff9247e4131d33fadef161806a8900b4c54631fd1d976fa54d6ac29ecd32af4c0792c99c07ecba80b6c2353ad5590e1fc0c79ea8c7b04f15032f7457b5a2106e1c1a08572c1223d4561c45a69ae0bb2baab5fbd87bab73bb8a74c8018e745da6006f852aebdb05849599a200b27a0a7317f359c0a5cdc23be32339e15eaf5ceedeb186e132549b2b332f8cd7ed19f6cbdcc82b12a9bff7b5071491254ca93ea8abdab97019cc6b96521e6ce0be0ba48c04dac3d3bf5b3014da380712a57bf8b04ed5be93341fd26c2e9bba4df3d58daff8d8347cb955dee18f95321e457a3be233fd0af9c8db1cb3e7f0be7da2db0b10dfba8ace5d53c11c78c9b53cdcfe2059e2f4d810d38850a8898890902d654a5206e60b190cd90ba74c7f3365faae75ca024e7aa2973c94bd87f5bbb0fcb0c48e9a3d5217afc3ec109f1049f20b570081a304123af8c20452d4808a2c45d8a8b87042d2f7a680bf080bc0f0410821484c3061062b31a2e0a045051444f880a4ffd9e0cfd40952183555a6b8e0440620881e92a889228a28b8c0c2044438e1851354e8b0aa411250a0822592b4e00829248ce3b85abdabb5d69a833b67398ee36e380e2c41e568fc0bc7d9ffbc3fc735f795e3368efb7a03ea51f3f150fd9afaf2dce7b919cf7df712529246e850e01961a9827e7cfee55f441c5efec3719c4704f5a8a98179193131a19f6484d343d8e55dc5711cd7790e7cce39e79c3b714f632fe124332ee3322ee32c6739cb596e72cfd1ccbdbb5e2e9cdf64ce5199e3388ee338ee3bdc83dcc6fd9c3d6e9cc6699cc6711c47d3de775ee7754fd3b7ebdb3df75dc7711cc7711cc7711cc7711cc7711cc7711cc7711cf7cf859d33d8d65f06cbddc3ac685e7d4dd3344dcb66b2e7b01e3bbf92d3a3bb7a6c310257d7c4d13d8d2c18349d20229561bea57b9ae7c55fbfa6bca672f75e887becbeab28ee3b14ca3b10d4a3c6e53d5f84c42ddf7d35d50e267428b08cb05449fc2f21e8c7cbb77c8b8843cbbf88200b745f849cf407a8ee5b426be3a1eee7e70393f869ba2a811b0b1613a45c84cc810220a05424d2551dd97dc7dc8ac35a64bf7bbfd2a2edef0ab3bc95bbf7ee7b75721a73544b3849bff1948f5cbeeb9ad579cabbee1d8cee9de4a3baf250e7ca6951e7bbf797c7668ef931755deda1962077df7d218df5d8bd0d29961ebbdfc226f5d83d8c1298eb4091a63f1c82ecbf7c11d21382ac4b08b25d5dddef6e773b56eeba2ea688cfc5fbbccf7b9ac6e1c743d6fbee3b2fa49962314794a4a242764f73668e29ba352628412e6917b97b191f512527b2fb191fc14c21bba7f1510054644776df038813b22b91dd0bf111fd018aec7e0825f9080164f7b4e42347a24476744989ec3a4c764f513e7271915dc70ad93d4df9c88322bb1cb27b2c64f794e5232124528944769794bbf7f408934aa02291ddd768919348b9ebb6ced34627d690c18c50dfe6f05cb5706911bbf306956184b7053886270798be8c23b2e0ba4d1cf437d89116d9b1420815d9d12780a8e24544bbd2848bcc613aa1040ba820ebdb9088b60432074f0cc82afa0fb64801aa12e1044fbc6c1459e0a015840e362ad286324e48221801891469c31a3d90ddd4ae0fa1031669c3491e00c91054e49c467081ab3302391fd3175a8a172768c2f36ce8c2921e62640d27d9cd4e133cbfbffb94d0c00b3207ce0bd0b321113a86142e3207184c2e9082b45f4322740732871985b46213d7e10a1399430b6128c1223dad801a4ed28644a8112c48640e32355588d03308030c2431b286f5072ac8cec5b32191f9448a45e6e03a909e5600a51eda451249289135eca220676684d326dc50c181c9d8a1bbcbcf5d45132a606253c5bbc33b0a68ee405aeb9cf6ad75c00cf57fae43c9a06024478b5c450e04a93a32ab6949b21fa0e0a28a6ced65c2f4e80b34cfa72f346d41266592819414d8800857c8fe193800a4734efe5a2938b3c54260fa36135959a0492f7d16a015c8c8ece9f78323b32682ade8ea90eeeeae944469e891969edc5ab472571702f280fb3b4ae02fd205c01f892621cfefe1a30a70818412182629ad199013062c1a0c41074300c10ad2a7c8455c50858925a05c60686143ce29306105477ca1e409218820e78fff892142891c38c149148480842cb2822738811383292a1003879cad3c9f5ee95967f051911f8c70819431aab8408b28a40884200509264d18638b21908e843c7fc87c4a9a4f4bf3a9cd7c6a9a47c89306267878f2830e6e807002399f10853196a0a48a2649483742ce400d882046122c8880a1c85984948323a07ce02127085790d3a7e4f93487b6ea0b465d79d3becee4eded5f2d0c32e3ae2a3a95568ff45f76803d28a0f03ccfc332737cb9dfc3c1f1bc56cb2b3d57eef748fd5ea9dfb3e9f74cfddea9df43b5a8adc8fdde4dbf97eaf7542df22072bfb76a51bf87d389315f70efba2ed6222c5d4e8fdcbb8ee523f7ce3b527f57eaef6c5ad459e4feced4df9dfa3b548bdc48eeef6efabb547fa7eaef56fd1d4e8b3230c0e0388ec3327374581a8b95dccfb17ce4adccb9723f47eae74afd9c4d3f67eae74efd1caa45dc4d3f97eae7542dea22e47e6ed5cfe16c4a50c2b66ddb8665e6d872ffe6726d2e52ff56eadf6c5ae43ce4fecdd4bf9dfa37548bba8adcbfddf46fa9fe4dd522ff21f76fab16f56f382d7ae2897befbd58668e9bfbef6a7557a4fe5beabf362dea3072ff35f5df53ff45b5c86ffa6faaffaa5ae43ee4febb6a51ffc5d1c4982ff40a7a059aa6c5342c338796fbb59c1ef592255672bf7673a369aedcaf91fab552bf66d3a24e42eed74cfddaa95f43f56b37fd5aaa5f53f56bab16f56b382d1263bed046da4896dc9fe564563abb92619939b2dc9fb17cd4a556ee2fb9727f46eacf4afd994d8bfa8bdc9f99fab3537f86eacf6efab3547fa66a514fd19fe1b4a836d14496dcaa1816fbe489b5ab955db954ab7e8bd32297dcd465634dfdf6d4cd45eeb724faa52de5fe2ac67c810a4185a8b5562c33471dd1241da2df5f593ea2a75a56576391fbaba9bfdef4d7548b7c88dc5f572deaaf382d1263bed081d902fd9e5b64c9fdee31c73273e4f428881577968f86c43ce6dd312c3347bfdbf4bbc98fe47ebfe9f754fbaadf711c00c54a2b3785512c3307b599fd8d63c3864bc8102233c7eca7a5ee2baa553fc569d196ab9551ed10edeefff47fffd82fd33fd355fa65685196fbc120e0d27180804b6f050197be040a5cfa4da6ff6d81cbc692e97f2f5cba10d8f3032e7b95e97b9280cb5e92e97ba6c0a00c3038052ec1162ee92ad3f798c0254d92e97b3200a1e0725ac9f4c11f6090090663804b1c05e327f011fc03c961610eba69a3b44828c1b9d1d71fe733a1340c2e64fc798a0216a9d527809d62326e4475d950588c54ba558935f52af74dafac0a583334ec6649682968d112c6ae7b84cde7479999fc333299dd3cac032e6f111d3b61695637ab390feb60c2654341c4933cdf4f4c2e2bcb9477e6a3f2eeb3bc4477f3b2028c6dc708ecf762fcf97ca3501ef224706951feb6c91c35aa454c2c4e76fb4476bb83ecd6061d237079b3778b5e8f8df2567d0b0c7096cb5ecdacc5d32e1ff9155d2ce4d24b2ce4b26bb7d7e1edb19b2ac9251f4dec24d7b740f6832335cad2848802a67f9f48016701832e70949c18087e81a36401254f0974d307ce2c0ffad9cf1e6bb099587a960a1866a6604a5b353fa7386fa669e2ada186a6bd18014c33cd59a9655a46b7e818813fdd8492656e78fd3d20c479cee9d4ddeda723fb7286d65aeba44db74e19825ae7b766e79c73ce1c66b2d72cd3c4f9c935b491bb3969f51bb98633d96bf52994f5e9a0586aadd597a0ffe9e8d1e38452233b80a6c7796bbfe792e6405e0f75f33b47e0d2ab25915cc52cd3eedd368e9bd1e1422733274debf834cd036ed97f327fadd6b781664f8f13739f0e0fc605b8f472e77d9d4f87078220483b508737b78d72fd595ea24522389054cca1bba5089a67eda268512a5b54faac9d219e32e19606d87ea58010b8ac23ec25e9eacf6ed2feec6e13d2e00f054c8aec3ea70869268e233dce3cff08255e0b0f23b078a98a4093b226eee8d16942075031bfa588fa3e551f0f0e7039559d20ecd338608776b57bb52fef67af79dd8fc0fb96dcd1bacd0fb475a04dece1893ea68aecc4c9d95c6fd8796e347790602b963217c4f9a2f0be2a1d6804a6ef73ce398b80e9cfebeea1a2814e32af06158ce22d492aad5e124cdf9db39fe525ac480407126b55ba11d4e76c07119d4eef6e9b3840367f6cf4385fc6469ea20b3493953befa6d7a673669ddd2d77768a3478bef214875c8f06204f1187f97337b9ed725cd775dda2901ee75317c61d9d4c45182ace5dd7c4684e8fb3bf69912f4f91b6e612fe1e25e0f266d006b8bcd97382cb9ba7e75b2b0dbb06f1282b153f3dce20defc641a9d57d3b63b71ccbfb99b1d9d5d07e4a323eb6779892a12c181f4969c4317e9e680e8a68db2e9478ee18c6de28969cc1ccdd93698a1fe86d2a19e509ee0a6d33b74e2689126b67b2d0f8ed72ef680213d7e5c54cbd1175884cdae2997d7c92b6230f0a7dd560532127bc84385e6238d9cff3f7219bc19395d1e0d364bcec7f883c127b87b97086f533ebaf19cc5e0fc7e86e10072ba95747b4e0e18364a3ce7a524c73d478912254b7cf5f2625d3687668791027e69c1fa4a6be2b06264c0d08f81e9aa075305c73ccccb780bf3513fe910ed27edb239366253ba632f2fd087c6d3f7232d9af1f4dd0614d6e8f1e56984367a7cf919e1d8e3cbf7a7e3536344d00b8c087a51c9a03a6aec880cf17b7c117924b1d101c3057e791e496c5e44dade7911792431f138628af55ac29717c3027c0242013c00c2d023200cc01f201c5f2624c087618d0e42c2d701cc92254b167200dfcdcc1f455bfcd0a7a616426b80d0de78883e8ed0de08a787bea7f7a3df97db7fe82c2f40e82e0fd12740e82f0fd10f851e0beb00c2e9210104209c1ee2ec5b1fbdd5a995646355d5644b966523ac69b2c2f70a61c7bd59ed75d4959dd44eaa7112a5dd7263ba8bc7115858fd65c3601465afac4057392f1ba3f5e9d8630d1b3d76155c5a58a6ef1c70796fb5a8b42e0b6b51e92492d7b4a8749675f9688519058c2b575a445b240514f89da7f829ad61a3c71e3b99086a1e4450e141444be491a486032d721e9e791c61e5e371446c7e00cf2860e06431cf285758df638b590b8f24353d4e1b86e4b248be3c8e3882ca11ae1ea110824aee7042318493cce3089826e00945929adccda6ee1d1e498e4c1c33f338e2092e9d954f3e02c0d3afa81631119f7e4dd529668e96a75fc1009f864fff299d99919119ff43cdcbd195d30e16579e3beae1ef90668a72ead4a98b201e9e696eb1cc21e31500c28a12c39a0aab6ae2a00f86d5071307fd30ac1f6e5fbefdfe6268508762e974e814189a43ad5018bd42ea5847d578dad5c96da1a51ebf067f4aea91ba28d223ceea9c556b582d2a2318fa6e0586d4a292370b4f9f7aed3aa5c525fe697a76a8237eff4bfc3f7d2294c8873ec57af6bde5537aa4653d0d7156599bc8f43767d55c7ec842a8c2af10d634a1af4258c34999d6f4d32333c7cc7e45a62fe48621a27ed1bb3b66b5cb5f2c0fd1a71fa7e2567244d915422ca18bdc5f3b237d8a803a0454f4ec2b138bf63cdddd5db528bd8097a689f356c7c1955417378a1d541f74dd2fe8ae13719d20a1e40271b32405b9ddffca29f7db688fa2a68b896ff9d95eab7536ad0e30edda965594556b33b1ce2a4509a8f62115616880e9c461df9fba5722353b05dcddfecce9e6a4d3fb67fb9c13b4d9ddbdc53a71d06f2cbadaa309a29f8e1d4ae04933f17a0d6bb00c3d7261c784e2f914c10656b0c85e8e5e2ec76675d34697817e68a01f1b0e9926ce6c9f89403c641fb4c1fe57fbfbf4db4411f443f34f877f3f3ede9f0fed3391884cad7666c6676664667ca47de8e7237b4dc421e90bc84c9cf1d074eda0b3dd34490e55a60d4e03dc824ec1b6a3578afc6083cfe9b3a5e5678b3843cdaa4f1a804e4981cc8de8a943f6d5a2512c83786a30e812e98b2a9102d36b9f3e9939a87d6bb10d20a0d9d2275b9e7e3f366035215a5a5a5ac419b22f06306f4f3f1bc28cbf3f1bae11198b376c4f73f64500cc9b58e660933990daf8a8c9b689d414d26c7ffc7c64e4ba6d3d5a7bbbcaea7cf7bd7f3abeef3a9c7bc7719d10e4448fe33e8699391187172cd2e9de69fc2b3d995ae99106e9910c203ec291abc592ed95dc6acdcf1383047bb6f7b00c929de604f164fa1ad1ea1eceac7d9607ecc2545edd6219c4d3c9a8c1d9cf2f86d963d6756ec595c76f657f1b3299767dc4fdc01e8291dc17213ff17a88eae8d17d7ffd7577d33c2e04fde0403fbcfffe1371f87e92d9f7c3fb4f14628387c4b2cc13413eb8f7fe47f7de7b220edf77f7d331f3f5f0fe47f7dc6b9f8fef3991c88edfb6af87f71f0e7039593d7e4c1cf27bfbfd285203f2fbd9795e13b0ffbbd69133f8e8ebfefbbe7e9e08c443748690a6fba17eb3f3834624f264e7ebf763036467ce2fc49ff03d2528e1795f0c1d6f7e3148b0a7f4f4dba7f1a63961104f6e523d20dc0f1a91c8b44272efdf8f2244905ce78b816620fd156872ec6a484d5a7332e8a60d4a6f50b5094f50e2ad0304bff32e1c8841b0f5f4d301bad4ef8446e0f2a2bcbc2e96b845bc3eebac13451b7c508bcbf7911695176c69019fb67a34bd60b9688e0e729d41d619c50a2cd72bc81ac58b54aedfa4aec9c9f5bbd4363d72b27e8b0be856e4faf8e5ebfbbf8855804fd3fe3c8eb0526b051f146fe400b7c0bf17e3cfe77f1ca74c2ee9cae5ab8b58ce1c8aa5452e3fbf49fef9b8fc9c2e3249c623ef351f2cf84a76015d5c5e5382be40b3cbcc2e4f3f1d2e8ff2d1bd5826d7f70a76427c44a798a1fa55ccd816b93e7502f584d44a5b1347053f23704951255df9ad8fca75da70a04541687af4f29562c9f3ebcbf488b666ea8b485ff5868d5cdec832beac91cb1b323ed723b65e4412289672fdaa2d6979eebdb02cf22edfb93c18962e64f07158d2dcf29d4b18c3cc2edfdf8e995d3e1717172c96e0735f24b784dfcf2f06f03b38880bf9133525680b4d2a3d9c48b1f438adf4687e6ed8e81a5efb04b607091bd20ccd1df1a5d7899bf952d2a272b64c3408b96108a9e608cc09c80cf395390d34bc68982f2660dd91550988cd8e1edbd6d23263461886420738c0021630270e20ad232dd234da030d426e2042aab1d10090960666d0402b0920add315cd81d474615e0f7f6ad8186fc8ccd4b95ad55b676b5fcc3927b783e64003ab92a6622bd694962bc70a4cdf2ca5e2c06ab55aad561d44db1c99a145b454ce184dd1d284a14ce84d8b6054432869c268899668899668c9c3de1dc265fdd0e1ff498ee3d5b84de3808c322eccd03840861e3eb84df3b6d7ee1752b20bafcf25a687eed7a0699bbd1ab87794716186c60132f4f0016486ab7977ef97bfef97f8befc7c37b4fbdad53c2fba71dcfaee90f5901d379ba1b917e3fb74dc3157445a54de1d3d7c009981034184dc90f9956187d757861e32cc150dc26da6e8b2a662ca1ad523fac30d89442a413b49b5aa719a35a3386149ee6fd77633938fb8efeefb67142738b13af06df9685f6657f4682d0e82a145fd3ea23da8b0e7f3366ec0e486c5b296358a6abe84d728af51a8d293de2fe1bd37bd0e65da675ae9b5171cecd6742e5d746ef0fca9b9b0803b3f3f2f76c954f9d46817115a59f79d02c7222105751620b1048bc415f67e3e7de506fdb8ffd35770d0ddfd19af04712506b9946169547454485728f77e17ba2043debe308699bf09ccfc899f08da31f3f731ccfc893148b0279741bcb07b1aa7692e880bf96632f43877f4d817fb8c279777aafc0829241ea25479657f3b67ca91861135c286c601647f0f2ab9df4715168c6846e10227f70bb17e7fdbfacb9652fb582ddb25b625bcd1f6b4ab4d3f1b61b8614d9372666142d6c29a26552cbd25e4199225a203a3f8a810bcfb59e9c023b6ea41723d4bc0f4277883ac825458cf06f5825078f59060fa3d3bb4b9c59208a59912ba304f1fe48e72a1a4b778f9076abec14ea0f6586be04b9b524cddc54bbd8b2d98d4d945ee6ed3796ba7bf8adc651714808963be98a713b9bbb07c43f74667d53c1abe4cf9868640fd80cd41c6ec05c1359d5d8747976d76b12432df07b988530b84e6752ca0f48a2c5694ce1c5f0c124c670e9be7fb1743360521b880429e739c73a474e6f04ced178304d3ecb3c0ec220753c8c0053158c10b0b724e28d0a0d545163fccc0092bc84eab9a36a9d53cc39d1287dcef822b4a1d14e0d2853c55806b0a3a4af0b482cb31cfbf4ac07059238b1440019738cf2b7af00257318b22bc05352d7946c9a26687ee0336d02cdd5a963148998a1d16b8bcb4a7bbf705ba69c3db01065580f35cadaee43973786e1d70a6b4cb027f2e1f7402973f270d7d5a6954f162082e745082ea414d0a08add20ca65051031221a4000a4bc042a5071af0a20a4a8b1630b9e20a927ef5172130cd9d181864010661803f557039abc8d36fd00d81371c17ce8ca003e6a8e878c08e4567e465027c613de01aeb92e0b2784113474046c43a15a88ac08ec518f8be8ee00b7301ae3114c6c117490704d68cb0f19e384dcdfb60cfe3c1dee767643c4f0d2da4e8a19b36343c5f269db4cb2596a1057704ec421238330209735484811d8b29f00fb8085809be4858981302e6bec051ae0022777946d14206b91c592ca09452ef8f2902f7897ecdb5674ff1f314fb9493f3ca652d6b44c1024b6e185490f1e5f9d65a9b696fb5ccd65a2ba594fa886edee2333aa36e04f5e4596badb5ba775bdaaaaeff13a2ffb37156bf27080cb281e64b12a124f6108bd572bd3a8629a5747e0fa0afbd871ef054ae81be26aeb2bf8b15b8fce43e75a84c9f0b580a18fffd02abf0351ef4a55d59d4dd304565fc15d4774a8b70f7a94700c07f519709fe7b83ffa6f0df27f82f14ec19ffc569d18cd20457c67f592dea32fedbea1147e2efce5fd5e545c6354df0db1825e18f79fc59096549f833932d4dfc19ca47354d6c1332a648c818d3f46aa3b5d4c2796f796051f452b18af65bc4f272a2275afb3122e8c70a1ff32b7cccb758de4e74b194718c8803c8078d8f791ade22c53c8da72182aae8ae1e43f88938cb43331eaaad1ef1af10827e8031bf43256344904fd26f3ae6210cb2c024df43b89b404eb25b1ec2e124abcb47f665631dc28f5df83d43e0528365fc167f7daac134fc1af6c72d8fdfb2eea9ebaa526951b93191b1ebc55dc1d2a52333878de3b9a46f30149c3a85d44d20631ebfab6aab45e0e36f56b7fa05ebd88cc7ef259b99c37b8cdf4f18cf8cdf575e44c6f85d88c9001adfca9895f1af104e920ba910260ef03be56d3275a0909235420b2b42aef0204eec51a3c2d7f822240b6fa5b10d968caf64acc20a2c88ddf2d00aa10a61c33c84bf46d82f0f61568ff8edeb645f3e8a794c82c249de938f68eb9e5af7445b5d7b2e1a5faa90e74f1a5fb2f0f9f9fdcffff1a329c10d89443242ceef21a492f38700f1199301347e7ee75a0e306dc59ce338b1bc31fbb2af987dc5f0ab5858b34f700bffc5b8fce0ce7a1863fcf4d3d1e33fd80293bc5f0cd7e7630fe6691ac4bd8ca7f9e5033a609efbeed530e145f5885f467897f4889f0b1ff022de538ff8bd27600beb11bf47b4567ac49e17b86c56b36244d00f8b43b73c84dffe24f1d3af5913077e2f5c22e669843046c0f6e9971b13e427a4f4c31ef29e92dff590f74b7c9fb0c91e3d24cc1cdce3a728c718637cf10bf111e8e58b90edf2107efc22f6a8b945483c490ccbf8b320ccf8263e3e4d40158889797922f8635e441f313f4324327a087f8cb8c343f83f628c117892315f8e3122e8a59cc9f88a0d9248f122da4033901ef10c1ec2183fe803bc85b7c7adc7ade569adb3bbafb5d65a73c8ddd7b09cc99376e2ed115ffcd33571e0074918fcce7fef3d775ffbec4d197f695f193fbea78cbf4dada4452e8fbf4f2e614c112e2e5df72d1ece6cb7c06f5f3307cdf85d429aad1332b660641cd6eeb158c376a380228471021de01f5ef2270e97e16302bb93ee18c0ac2b2755a6f3ab40a703049e4f4f2a264af9f6cd948cdd26c900cfbf138776ab58bb94bf08dcfa95d45374b4d6ea9d306a2d2bcdfed6ce39e7ec8481e9d739e79cb5d65a6b673ecc39e7f4fab9b7e75de5ec96dd3a71b8fbd5b68cb35df5fceb0e9dd3db4cfe30475498ada9152c02a6350cd2a75c6b8cfefc273617ad5868081304a66e1f566bac45dad39c0aeb10acac58f27c181cd42bb11e2b8c075b6ba3d263c31eb04d81f1016c73b518dd36437441c2e941109290a248922d86900a42175e3c5122bb8b2dbce87aa8840863055af440450932865304144e4c41c210c8b61286d7caaa5ca184ec892baec8ae58822a53e800e644184a90b39582214471c4134e40a8a01f23914252426ea9000a57322de5cc26d7d2d6e4fb154bdfed7e85f5e83ef7b7fbdbf92b05cbb4d6ba84c97c2eac240ff9cac43ab5aac94faf5ce27c034bc5da4b2bb761b55e8e82c53cb57296dbb4dcd42c1b1f75aa75c342adaa69561b53897375195170fd9967aeaf39695119a44f39fb1b2dd5a27a7f7e3a281671791f70c51a4460f3fd39eb8d8fb49b5adb06f8c67a1c19e14837a818ea043b995e261b974da955ba24d625c55631980af64abd5c37ae16aac53a8d8c6cda0dc7c3ccf1014aca1c0f13477d53b6dac4525365235bc9433795eb7dae3473843147700df76949e44a1347fd7223e5eacaa57693eb6ba8edb52f065acaf7ab0d70668492584686ac543e3222446584869491196e8c00419d7c64a4c7c9e423233b4c363e32426353f29191999225f9c8888c25c57c64648cc17c64e4612f1f19f9bc8c6057cb47466eabb27c64a4b23c54bf6e61796d666ad1273be5fa34320f1798b301617033e79ca616e092d26e2e4856e4f99d8439a2240f4d317318218a3cbf9f98231a3cd4ac39ea2133736c3f2b2993726d52ae6dfbe91298192c2191e8e52123dfefb449bbe3e29cb686f66988a2480d64e4ecbb4c9c59400c3ddccb991dd97f8ef6fde3e1c99906eae783b14cbeb9553a2a37874e315fb0b305d7a8c8f3696be6b05f7fb6cc1fe27396d4e6f3e56ccdf872ba687c395fa02fa74a4689b30a35ee767f7694dead3ef154bf3ce4fe0f12cbff949f1962e91323961f0c23965846e97ac4f2e21717b1fc3c0d6db9a86addd6adb56ea23ba1384e2cb55d4b144785d7ebf5ea7bab0ab5ab1152b257bdb21f8fd0cb6a7c3a50a7d3c94934f6b98203a356288e95ec4f5b4132a538ae6a798204a357680cf422cfa75dcc17bed982ff37a98b4ee9f9148a9599a33e7d425573d55b577e7777776fd53a168ff5e87e4df8f441ade80d6d3d2d7d4e9f0fc6d7f5fab452fe34e6a2eac39e8f1c7df72b3dfab7c4ae3ca073add656b7ab3e4501973074424a3ac93f1f8cefd78c4798b3ef366fabb4bb33278efb9d7092ae56abe59fbfb999c1ab08438ffe8dea25250c4b32afefc9f6696c7a321583e4fafd30d090ba0667e043c709f807bc03fec10aafee4bac134abb5629a42352484ab2a7c777f76a2dcbf2606d9665302924d20ce236312712595e40296df72c3bd86e0ad9f684cb0513eebddbb68d0165caf747196306dd184a78631cf17934ca183b74c4080314c30b2c8615d9d3e2d1508c29d9d323c59df99d3cb513508a44539ac42ea1b4bbb3b0b2b83ccb0eaa9767942c33c89e9aa4b392e74b21c5f2146fe899002ebab7c8d2ddfd4a52c5892cbad00108af5656240655ba60410baa9472aadccc52110699191cd008f0808b243cd1c4111dfce00242d8220a0d86400de104a416b9ffc3a892fb6dcca80290679430a28491caa50dd27bd6fb7ceeedb8eddeb0daf77a6cc7d6566b2d919c3d138fbb8be5bdf7bdef9e3e9e23eeb7a7d40bafd85513bdebc933534a1b6bed40e8e6ac798a64a0612541ca347b9ea3c17596cc85130a89e3b830c80d1ddc14797ecb18f45e91e366f29daa3c656ae69e3e17deca71cf8994e338aede79afe6a961c3734ca5d289834da6b03cbf9383679086650f7b324b6ddba85c741e1193c026cfb7615961d906a9b07bdf33b1c4c1d5a73c1f2c8216d62b47e0bad5ed2da9c7b96dbf05a9b07c455b733331489fb226d6588ff3ad97ad58add0b4db6859c77ced5a1a943567decc31b31755ada37352ef6436bc5160df86d7fa74af47fcb3468ff8b345f1d816226aad14f07c0a1f4b33aa515a3f5a463f9f8f95ab8935f8167adb76ef985bdc32f78f8fde8f406fe542cfb92f6be6be8ad5bdadb6cca0f52bf51ec353ab66b34cd334cdeff41ade60a77b17d9bcf7e2396dadd5e26ced7580a8bf569a8cd6273a67823bea79aec2702297b56b0dea4f2772d9c9cd422e270bc8b4df4db0de45b5626d159b7161b52dec7dd94d8bcb65713b2cbc9cfb5d713b565cb08a8b5db785092e4b785182878a0c2a6092a0c5e41a96730a6d860664d2c866161509641be022d5a82cc0482a38185b21d7f003cd429ee1674f838fecbc17888f34eca1f99978044f27f2cc65a7bbd24d1b6546cab4a31e15421b07ca1738b4d57128ab16942f4cad56cbf59282afd1364dea52025458354eb7ab525fd8e078ea094eca5d0a291c1c9c2935c7009d4e384448a579d64a5b304a76573b36d5756ce7ad8da76f5932536ebccc8b403d0e30aad9e1491c7f809983e208675a01fd07085d6805f4df08655a01fd32e18d56407f7d28807892a98d70b63b099d4987507fcaf46d0cd1baf9fd0c6d84a38eae8a3c92a86865526f98b488eaa051785255aa5aab6ae5090040586dc27a12c3d05b2ba8c04248bf46383d441f01614d93d2c20c10d63479318bccfa7ac0dfba61e36142603d61370881d55c8979c9497e3a4d98901b60b11a2f0dd95ab8ad8573e2a7254e4e5f4c71e2c4c993261ae657fb9b7d4859b4e5216b6364d59a4a72165dcdc8f438bae0020c9d1b2d72991bb58e366ae4d2591f2bbf42c3609839e67b8feaa93f532cfcd441d980d249d236a0b807bb809ed025b4118e58fc1e5de49104d511419e04e4a62af248824a7242f14882ea717aad8ebaa180eb00bfbfb72cc9a27c6480a72d3c957198c77c94803fc0d3af251f21e0298ea7011e32c5c0c8f8193c1f8f07d26ab55e5c6854aa16906bcf9d5037a921fd3edd817c5643806cb965e3bfe5f57abd5ef835c1ce90582c06fbac782f2059d6ca5a323a153c163c1a7cc4cd3ba978465f93aef2a4acd635b590fe4b4b403cd47fbd006419731c355535cc0e5ee2155fafee5edce5735f059aa4aa280c89c562f7eb76a71d922d8f0be483adb5742556280f18a2a2f1b6ef1f0f4fbe3ff6385e16e688be3cd47fdfbe8c0f40b619c8f5d59af8b235e42a23d7efdeda884360c19d3ca5f8b0c4131f92c801fef294e2c310597cf8a1843d4f293e947c20f540a5086011360fd5b94dd0e890a898e06c4a49e0205a3d08611393d2830982b8b91284cdcb0b0296042436381d1bd40e4024301a7440c0a494509c4dab63289d5a0a0f6078b04881b53ca5f0f0845cca703ce02c4f293c5871017e3d816f9e527870c5c0434b0a0f48a498604aae794ae1c187faa27927968e0eb12f0ab8bc9e1aa447c29d74061a3870e9cc4ccfdc26fed94c9ee1c1049f30f0136668e61876e06286669ea0aa85a0fadacfdca02a3ee0861efb89e42c1cf2044c83c8811efbd62ff1c7355d2cb14b07dd7c1b3ea0a35f87bf8e1824781ce7f5603bba1ea00a68cffd8fec3b1187eeb317413d384e04f55f1c3811d4da4f92d2170264085d2d59a2c70c425ed4e9921d0aa0cf04558e99524a6910be21e0e951504a61c8d4854cdff1c704cff7c69e17b857d04d1bde0b8b5ee0100301ffa8897f3b8d2f08b8bf65e81d93ca9c627bc8f0d900b7b7cbbfa054045520fbed7f58fb9b08eab16d2288be86c32682e8ffd8361cee73939c4b7c66687c1453a50a12397f0796d1421a0ff567e138ba9056401f113f19f408830bb4ab12ddb43143293370e559c34c692e316e296111445f04b9e87d3176151d297fdff77ddff78151ab1776e1bdf7f3f976e5f2865a4d5589113549b5a9a6293fe79cf5deabddbfc1690e7501a101905aadadb556fb84184bca205e9e3427cbb28cbeacb5d405c486fd3688ced31901979e5a39cf7be8f7e33933a569ce8a5a587abaf4644ac53248e64aeeabf61f1b8304df5c06c9f6adc7e371022e3daf456503725f21601510ba169545a6833b949e9bfacc41356fa17aad5ad5b4cc890e7cfa2db2993b8ddba0e590fd2dfd0e3b87b650dfdb55ab38299df4f6eb45b1033f0a4cc0729d53fc79837d59c922c795056da1d3a4dc9032fd5e5e9de0eaba9bcc746bb0c46e12d8ea492a474ba2d9f488513d626b4ddeb238536d363eb2a5ccc482b132532c33c15aacccc4ca4cac542ac54a75dd5f162b6b5171e5bceea9c16e6997ef5cb2cce59e40b18595d18ad3227a513729d5aa7bed71d76179adac703451a3725d38dd3d751d8b76f784d37583dd60b7742d5dd7b5b4b4b4b4b4b4b484da0bc74a8f38a7471cc38f6f8ca66cabd56a75a096ada6456566ea5a5ababfac1615d7cbca9518968db4955abacb4ea90cc5ba81a55aaa9b15abd5245796984d81dd3589c402592c6b7f856f4975aa4bdd54522dbd62304bb2d68a2067b5c677d2c74c3eba2c8c9df4886f2ecb47f7247a8ec0a56d65fca9986d592ad6956a513fe9eecd4c5914fef8b313c4885993391a3243f87166848cb110795f662f88c11e8e897d9ec03bc8f8e78cd900a6b2354ca8a56a534d55495d72e324a5c269b9ac5cc1e2a59725c59ce4366ef213ea26a55ab13a2ed87c22971deb4113b1944aa55265a7cca4a44734959952191355b6c4495e7293dbc43253ce4e2c1f35e96256c634687c667cded7b1b64fd4d4a43e51af4f3ecab25376ca4eb1582c464d99899a482652934a366dca4cad29acec942961a552b1540ce6a418136259582c162b954a65fcd4e4250f9d62b1184a8625d32326a39a810656cc15eb76d282dbf39c148b7989a5ca4c31960acacac5a5678e9973e79ab14295c1d7fa6ab7efc56d93c19809402a3d82ad1ec12b19fcaee304ec3f593d828ecaa0920c9a7a04352819bcd223e89ec1b4528f60654295cc518d7908d452d6c6436076ba301fd5d70d4ba695415606539f99f246ad3733479741fbe0dfd47d7255505ae40fd2bfdc9c22c738a6088cf1e677bbe22539d85deaf73a01582c526649f02f75262da2a40ff8b7746daee9c2fc45815d622e2c2f4e06df437d5e0567c068aa1ec16d63d223d8f792ba6fe8a5242620e7def190721cf734dde1ae87f7bbbedfedd7bbbfa1fb779d63f7ceaf87dd63776dd523f8954906b186d32308a547107b08fceb21f0f117b8c6839ec697b6655336655336d5dd9c169536d65d07fe4ddd27e05f15f87705fec501ff4e01ffb6c0bf545ce0df17f81dd731f03312f85989de505606df943ac1809fa1ac294b55f03315133208b62e756bea581ed8d41563f5c18b3f261f5511f44385afafc2d7fa300f5e530661441c403e663ccc4fd25d24989ff13344908bfeea31043e1177168cab47b0d6dfa1925504f94d8fe04fd2531e02bf08397a08fcf710e86ac5ee8d87c09fb10c82497a04afcdbdf1d12575087cd0458f11b8b4a90c7efdd29a5aa40cbe4dd9272dd21e7cf02df856498bf0839c8d7984c0a58d5930a66df9084614755f663d64302b4106712b835f4f35a745e5d6830cbe600ebe63a9699b2433c7cca0eae4a3c9a453e05715ce944ae505f3e0fbaababad5ae8675ac4533e6c1f7928f3e0f7a3347f7e0fbc9513729f09de52ac8a02791c1f7134c06cc785706c1adf3ad62e5534723a42408a460115285076d628f9a1a0f8a61691b03b32319cc6a325803a482d82e0fa910768db04160ab4730e62398073f23d10827796f7c445d179794c98c19311faff3be5af38cae493ef22df3918d7908fc7b31d8f211b64fb00bfc7b3176307381602c83d65a6b656cef71f9800e19bfbdc8086faa47f03de175d223f89b8b786fbc27e0ec45b4587a045bddda583e8211413f2a0e5de9d7ad7009989f01537b40c684947e3ebe8711b187baa79fce8ba14c9839b6079fde80a083e0531308ba7c11b25f2017b147cd052739639f6fe223e6611e06e667bc0f989f211269e2f24460441f30ff1189c878087c18b187874055b760be94c93022c8a59c2a17d106f069f010086a17f775efb877777777aee3b87bc19687c0d7c4013e48c2dd6f0e7e6963304ae0fbe5bdc9e0f7a997b4a8e5412ea68816eef177b885a398136f6ce69833d7fb6da354376d94d62683b367cfda0c283de9c2001711e4c3e565bc0c9188cb1721339b2359a67dd7cfb22ccb322deb0edda64730498fe008927a049fa66da63d4c1ce0d3d20e34f03bfa65211562e2001f487fdfcbbe8c9f5f05eccb101bf643c67b7e7e1590f11eb1631ed27ad478bfc3255f3eeb47260eed69fa0b2bcb43e0dbb0ca08abcba39809007f0719b20e611e00fc0ac55400f85e685f1e023f035f860eb026d2243d825fd68fda4c1ce0cbe80106df573ef21efc1e7cbfb9295506df8f3438fbe4a30ada073d4906c186c51a6c01e76c530641f041d09541f0292c83ef24079f824f4f145597cc1cdc835f4de057f06b09d45f84f43cf802bebbbce5a31a42404222abcd2b83b00c7e4581ef2670926089415fdef9b520837eca2008be0bf831e0eff011c6e3282333033e7804d38701df03b6809e6fe2e3e55ddec5e565bc0f9797211269829fc874172cfa70798f48c4457c0f81ff22babc8b08c23f49108b36803fe321f0cbcfa009a4a60cfeb4018a35581bbc02fc2e7f7ddbb6af5d53bc032e3352c65fbf1ef665025c6a5332c6e971e5032eb59c8cbfeb3801d79f2afc03aedfe11d70a999327efc032eb52319977ac4a5e624e3cf727ac49f0d3cb42c5966e6fab218b5e9518551251a6a89257928b3b92e1f55d74995f189b5caf857aa8c3f331f5a2ac55e425652c072792387446e90f734732c6911f8de6f37d7498beae3bfa939475a8733d75d8e624f07861be52847b3b73d4db788e51d5bea46ebb65502b058a4cc92f8375a1fbf46e3926ee9daf8a8a649ccbca68a672eb5b0bc4f32fecf94f17fdff9441bd634c9448d498ff89d906984315a18e446d66e7ac49e5816c91e88045f25dd427dd360d49d8654302874a31acc47f6af9216510f7692bbee6bd5724b111bb4dc953974b4b657c3ed3b2c29fdedfd6bb8bd87d4455bd0b16d1dfd286240c9f4b38166ae69d31c1ab741cbdd5c48b396ea11bf0d6b9a9457092c73610c3353ed498f5873d2aca8dca844ecd755550b15aa11490000003315003028140c088442b14818e6a92ce90014800d82944e70561909e42cc9719042c618630c01020202000023a469031dd19040d030078c1b69f8b3178d0661811910d740039604f0fa75db77dc2951a0bcda4432cbe74bd9e0c5751fc6014d647173086541003a6431389b447b0ec892775638d1f0d0feab865548d17372758128a4a90cc06e573a51380514a84302247bfc7bcea662e9be0b0547fc0043ed854a116213fbc05020ac56235a132a54ee1bf63eb7bd28e001b3d5795dbceee41a1468fc46bce21b5f9a04b021797fe049669f28d228c8675344a7e4046cca9967f680710a2a76be104edda869fdd8b696991d93cd2653e1908546af5d5e9413ab2715d4cc21ca9aca9fbe7e5565ea0f6d7a823740d6bd0342839105d33f39d30c87a09e1fecaf47a75bd8fe5549e1ccdc690e306453b49aae4c7934b4fc26f083e06dd002072e34b38ed662c207cba501d41a7194560749b5cf4bbdc53f59cb560c45c86a5ab6a4f696797066a3b3afc6c0f1e2174abbc48d17ba7cf3816dee9c5ca2b093c9d8856a0c709e7b4a73ee3e3db612b819a204c853d96c71aebbd80c5fec22024b787e24286a4645db0be0698005ae5881779a268299bb8349defb4a261f21c7d862e6e6e725c1701e0d4b26067a1f88ecda8c2f3c0a0f14a9886f6020ddf30925d710a423150039cd97deee44e4cefcc69d607309e1e37b3f83bfaf423970e4ba1fd4bea415ee71d61b8e6e8e5132589aeacf50e8b7225ee19fa48337e60d1c359a24516ca9f4531a5690a7d73d620c1183762b6a7bcaf2cf8d4d7b8dc34d07c7adcdf837815bac2e1316628e1d2df1d380ac80b0c4343c86f6584ca78b456a8d1800307c9321c32057e29aad23697beb4476ecbbd175bf4af9d1947cc906faacecd24b68a035461db27a20c88eded6454ddec83f0fb5393510ddc066804ad1edcafbfc51e83b3b96dfb4f05b735a363db1cf0c03b5c6e89e51ea36823fb459e875a02a2e64e27b53ddde47bc9f1f3a8fc86d7f39e1086d4893b7d4e6e9bf3ab8256a1e076c83cf8931e9d404f063b0f4a4ad0960c990a4408ce10ff9c5f25d86a9610c858f86d722e21dc0cf516a4eeee08f33a5266d270e4b16c59a643469f481a59b0a5537e86316632130dd1670fa2a25f5dc13c1d6cbd4335a675084adc6a4941bc9482ef759a5ee731aafa5a3c5b5a54a504f383e8d839fe9a5a9f4c4d4ae0b20ca82cb0f4ace5fb2f4ca5d40849322351740a03ccb54627cf8e2bfe9a09a298a070da0d4eeb786279368fe43d0bbb18fef63afac9feb44e2c76cc94d5c74f5d6fcd7b3387fda6af2b0bd93236bdcb91913acbf36351db640dc8ec6ae97330605b1c878a73c110b0027b27609ec13c7e36e63ed19a1ff1cb102f0dbd11bd5a8a7a2ca361e84803a74ca216114ee42d5f078a28fce7a7101cce832c62f1174e1a8fbe437754dca86078f34247f97dff995fefc642269d87416d297ff9f5885ae37830777bc8652b9a8a56e667bbee918ac88ec4c76a7bb2663c99001070b3ed7ed5f2b2fd67367514e9c0a234949fcdedf42772a687780dfdc853943009da5730456add42e3e8768e675e613b1cfb601cc650155f5a24d6448724fd08f26483a8ffc0c9bf2484e62be618346b44f2c4392928bf6067d46a78943adb85140816e18902a3b45cfcdacb08f1faf43d2ddcb9bbec819fd10debd31f4601914ebd919b60e0b44a79ef30bcef32cfee317ccfb1620d7c651338aca8854ff3e11355d1a26573ef5d41c2774d68d8df617f8074ef13c9a5ee8702013bbd748c9465f79d29e852998166fb05e188e9ab4252323a85053b9763c5d5989de4da361f3d96814c7fd97ad893b72d6fe4bf503e7e19e9ff34261f25d4d46afd8c6f3e5f6467d7f836e30393b49d4f1888db02cb6543adbc99591938f4e02e3d92e5426b4336aca1acd593f1527596049621a6197b182f262c7257d51f38fe4d9e40336ef973d32719730fc240a96497aae8e20e3ce3b778e95e7cc1348a97c20fc98c504fb0595164e9502e9073daf3b94f9ca8278062e5c110021bf0e09cdc544c88362bc19435b4e558020af2e4518fd48c65cbdd0feb73e96967838883cb981733988f487553d3c9c7e260e0bee1f460f71e0846f82d0311e7d63b3a2ca50a51d11b192c9d52a4f220a7483fd3eec7bd734cfa8f5d7e48c22019910260c56d16949f16ecb1985f48c46903348e7f99618f4d340b927d7503c0d2324e761766a5626bc7a19078bace3fea27ccc71159df35b31b8ce8c1e0a0a6e51ec744883899968a99f977a4179282ae5908d3d95007ce10247e8ceb00494a3d19adeefaa5699c1ab8610fd35a62e6e527c392a0078c5456143c1ec308674cd06e3d6749169ff8c732cdf462bbfa87d45f4e09b21dae0102edf5b51786b454f1f1e72e6522d3601e2e8f447c0ddd7277e1a2cd454cb90fbb0ec4cd06436c3b6d03e8c3b52d8ea843747ea1fc307b071dab7c0b8cec1e165d5d8e91e8c770e4b92c04fd7789125e8620e0f02ba10dd96ffb9f857d88b9a2df10a0bf6ef013f49d7bcaea418e5951455b2376f77f7d191a6784c2cb16f8190d6ed926dd8874ad507d139b980a228d28dff3f255dd053e266a11f3627b26a00a2e0a444fc50971120a837c09d74e0d88ab8c1f08a1fb9eb9cee0eae68f77ad12cfac08e882d3bcb3843dcde38a706a11dd192d8787906562f6f445da9fee40f8265ffc19983435b20a673c175bd76eca49bb09eb69cd7d4b8b04d10a56395fd0c506617981521e63f7f410cf666d04b902a46cd77c640752cc8382b4f02af551108e82116b2625696b1a052ed86210d8fe47d8ae5c4c3e0d39fc81df6140a4ccba655214f98f4770568c94353dd6266fcdbb62b6463bbf697e46127bc612cf59144d842b198986c10b4cd171a24b6437839d5bf1243553901488e523b3626a9da9595c2657dd03dc1908af4275bd5ae4a6405d596aaf66d2d3d94999a1b724141980db43f0619bdacd12bc4f45f19a8b22cffd4a8103f1a172501959bac0a660dcf580dd443e70fd558291df11f044aa9c7e81960da957b055abe228f875538edf53890ff6cf373ab60b5edcc0f806c945039f002c15d53f31be0205c1716d796c1e6cab1d3786b59fac641fa78100af4fe886bc4901b0b9c42d99dde9b28166c796c341804fa848219809b8bc6ac8ce02efba34c8c313b5a9b3ccf1748e6927b980ffc42acd834fe50c359b48bebb274486d173bd068a79446febd37ad86f901312edf417ea619f6d6804da7c38835cc00eb62505ee5e2cc9e02fe46117e2414f0512a7c3321171d5f659c935f88027932ee70a07464bdbb68bc17b1a83f72b271bc2131ca7a870a1cebde103de414e4c2bc9b618ef60bb465e07b98fa3f30839b6072a8cfd39083b198e26703d74d55c7f2e2bbe917b65fe077bb2868374f1e9bdcb71ef409a46fa3be8591abac751626f1c2da870e050917bcaf3ca071b4d000cb4ea654fc568deaa81737e5362cacb1cc34d6d96564e4509097d6ab12e3be75995072ffbf14ccc914ff29ae053ae2b18a2ccdf734f88ce87112a92e931b984ee5be7536ec9316fb4618065f4bb1ca297d0a23ad2ba288823b0a0ce3dfafdf76be446373d5b397a4e9c40418af70d6c2929439b42f599f135f612ddb303fb288376efb8a372d97477c1ff70b9340ff6f062609dd84894ff12e30cfe5f1649ecaf14afa72aec577cd47d3f9402d9aab8a34187a95a80fa3736a04de8bb83920c34d6bf383c947b8117c5983ab368886c92b6bd9205144e0073ea5e5455c9dc43c00143082370558901633fa8a1da5105b84ae841ed526750bdf471aa3abca57accd22bb264d0484ed59c27a54ded6bf4adff827eb9df1931132fce02f80590020afebcd5734e402c6b95dd526d8d98327718a4e8a36336e97d790358007fc34320f1e66a8d31a8ac69d21bd404d02543e547d0e9d9b681d3c4d6c5f8021287efb67c7899ec857d0f39fc19abbb3de865e8035e5806af75c9106cc0ba99e79010a6f38fcf68c6db44a333dc1247a43d2f0e43126b404e7a7cfd96d2434689213ee9933a75528a80a27569305193dd74af3c5602638f9c8536e3eb980cd4ad4f208448c21f6f4ab33be2655e605483288ce580171624c673c2d3f166030d4826498a1f345c09c5a43a50003e3e03bbca389923a3cc9ca54ff9ddd8de8b229825c3ea626103e1a3522a207f549219b02a402e263c43fedfbbb6337ff952305a81dc54d6ba0eeed87cd461f7fee9159660d46d571138ca1df2422fe8e021897b64bfad92a486451fa0aa485023cd9e62ace58020789098373569febeb86728828c018cca226960f9701467b00c8542999d4e8b358d241f54c959628f68d4501de75e143f98a0f9c393e08a9b34800bb780f12ddf6f1f0e9814e936b30c0ba028a340ecbb6f9cbeb1b55d1e1ccf89cbad3d6bae9f07e51cd38f439c0fc829ff9c1201ad66daf7bf1871915776d9030b89ab4bf231377e0e68dd1b8bd878f9f759a034c1edd345acba0051993bc2fd2ebb1b100c4fe6b97cbb33011cf444c52e002f262201ed176550b9639b099430f8ba08e98b62846ecbe4092ea4f6464460de88253f8050f108f718078f937b7d2282aae70fe860e902200ceb42f0354b8a03d728f0b51af9ad7bc1d4038fb60d4605fcd624965b8fbb75337995257241fd3b7f13cc083774757daebcb91b15ee2cf82ea73d4bbc9a55af87d93d341fa8d600973e6c23ce39c37af5f6965194952e420dd98d9cfd099cd9c9be5e5f54273a02928b40cdf5f6440f1eb25039cf0faab58a5d14618eb56d29fa28d66276b6e4f8e8aaf209a0d96a6377ef40b6978e89ceb8bec049bce2cf514aac1780bd10af744c5d1337200b83b7f20571ebd8b977a3416ec69c1261d1ecc859ae10e1cad424d3b925d3c584a577dfdeee699af05b1c932cce482da3628ae6034907a5b7f13483be4da57c15fa595a4d9a99b0db1082303bee2eea9f83ca41ed18d7a3a19b7f88a71928f7e30564c3f57443de7e489d44321fee10025d4a3247a4f67264c97bd8b64252d881dd423b1a7bda0015efb58a8bf3fe848e89d795c5f423452dc20fbc84ea4ba8c1ef3d3c85c96294ee89192d81875715d71db60bd13aff5e5d1bbe4215564a150d8dd887ce98342337598b316abca93d2da0650c10ef86bf67468187cf85ce2b58090e718c7061f9eb45b863740f56e2341e003b92b07e5519a82e8bc6ac1c7373151aa5a2fc2d8e083fbcaff48f8baded2f4fe36418c203c0c4e4978361cfd2d6733482b8a86504268de2aa3435c7257cb83f208b127dc8f314ed1970745a500a3388afc0063ff8763e0e541e1a79a5babdb839fac4fd31129e49a29299785c6573362b40f09c3f23033ade60b5fff27787a136d5d1e0e6e7d08dd7b5b3aab2ad1a0603945d7b8270d4b65f8e54161cc7d1fa8327f4c6185a287374c3c6b3cde5a1ebfdedc79e530bdae720babd4a52e2c58efa0f07f662a433a6d0e004bc74c319042e2f2585578e5657685e3f2400613106052c42c8fbb7628d8229b82c91e425df1cf4da3e48d7c6cd58a765618f3917a3235e18c25494a1efde86af620fc76eec1078ec7c2a7092f373d59cb83b756ed5320f857e87f7c795ce94109a55d4b19a86bcc00d61ec3eb52194c7c70c2eedf5b7270cff2f0e52193126a9930b68a17dc7c2a1fe440bc179996c75a98afc1dbdbe0ef25ba3c3e40c926c2d35058cb434a5b0b9bf1d7bf9a5e177c7910fdba4958bd3cd6cb73d052ee811956a5e93147cbc3b3d03d280e42332d0a7e2cc8f674b74bc2aa581e4e194acc9e048aeb8da94cd3814bb93c7833a825c9b2ecd6e9ab8b42abb47eb5d8e0082dd8d24aa5bed4310250050c4187072d448a4756c2468bf8b1402cad9ea77a53e5ffc3555b6d1cd14b1afb6104f4e271f86f2cd0e5835fec6742f5468b10c6b5788cf79b72b10fe7c053385d0a8ad6de0f5dfef08b47b9786ee52740d2150dde49cd9ec2a646388955d1cf23663e3be7b1c3b45eaf8f5d3f32def64e1d0f397e1a05bd7814f19c2bdbc1ec91b6e890158dcf2c771e6e336160684e0ebb48f76af2ae7af013e50dc1879fd2e16f321063d12426ff5e329b67eed3b55c33e94db02f0d5218c5c3b4fda4933cee1ac738a3f3e041977a0d0f1e776d1b53276d753092d84a31d86f31c58db5a0ad9314327dae2b055058a85e980dace684fef32260a5d1b3682b3f4a7cd4c11e90028d1c20d8a0466833355786417627a5d0d971a4eea7926cbcd4cd854e3b438da0b1fbe3c5ae03a5f87859a244ae4f267fab440ac9cf5c7650d12f5fa14fe3a65c971fafecaca1674d791dfb2d1b24677142700ea03f4c50e48b52e577e1fdf83bbb70dc181a73b6f9117351587621f02b9f6405751c8073d44ea66e329b40411d78d2b343f338d00646888756b53ce2d024485165a0ca85fcd462eadcc30511ff1884b38bef2478bbe80dc6586bfc7160b9482f7a2db6da435d2b79ada3813107940531537b14f1406fac5fb85656b48a5d5c304be3fc2d388b5396d845ac93e49b0a0817ae2a0afb78d621945ddc5d0dc2b45cb840349f5194b245f2c8053810ecc2f98dd078eb569601102ea2e0c0d2695e64c08d6f4f87f447b2c1db5cf0b5e8411cbbb83e7290a54de2c1e4421e8a50bd9d9da968324a1090056b41b23a365a2962bcde2d1649448e84a75a64e6ad646cabb87467cc779fa638ac427763a98737bd9f7b20ad59733496089cebfc324db3265e0b114b07eea0defed5592d448dcc98730e7b53207b1d6de4982d9bd47a9a7153cb44950725ac16f48d4915efc9d89d2c6bb1157af5ac65ed45401ea25a8879b5d638ad88e79fd75958bda8c3f0562d9cbf01219f13282d7803d17cb5603381a21da80248570bdf44d0dd88256ac2a036d832c33d5025856161f2be3d562df2e723e3f61566224347be4a9a03ab85e09bc47d22bd831b1c7fa57442fdf0c17dd5a2d4b58954181aac004cf96ddfc276c57a15da547dbc301dd83d79d5427896da9da144371ec786ca45ecca40f25f34ff3f7e50a0a9c53d1ab4d91763b9c4994ef4d6c49ba30f92673eaf61aea5132009358c925356702540c323672d2047af3f72d17da3ba5244403883c91168394b8b6a8b233c2ee75c236c15125778615083e4e42e22db9436f8d2743dd44ede8f974ec2744d4faba822cc43ac89fd39999ee0e86ee5002b2d6e5eca6832b510802d442d782b58d06bd22090c2a5ab1f61eeae3785b6097eb6c4f81295b4a81994ed23106f8cdc9ecb2fc610e748fe01fea32bb162a4a1de82e6814cb08c30ba3eea0b8b4a3d1736a0bd2e043917c2c4a6242e8b55475f02258906a0c80a3fb968e6f95e1b98dbf52250b11f3034d8f91046c0875960c26a027670fed63c1a67cf108b8b021fe19a379b048168e41ae628f9914bfb872ed19d74fcf5e49b54b45af34055a86a66618cbb00578596633db238b9f17ffc3ccd33288f74307ebf343739b3940416a5d3de988351b74063f7396fcafcdb144d8cdfacb5e496c56c4ee32c8803f23a9460de81ca22f35f8c1fe4f01ac991d34fcb590f3ce5ffbf696c846bdeaf62f55124ec798c9dec259863461118db7712223b54b0a0ce0faf02e882b8081ec8cd4bc8423c1047d2e26b364a0107bd10226585523c6486bc4608fb2f899a1218f0f84bf10b858bb05a6cd930f3a447e55b99f25d02b3b8bd86276223600dbe1992c6fcc6e3be695fa36911a88d9f3b3cda159cb04465322ff96cb1d509ed7e92518d033c1742b9b5f28b10afda1ea8ca374793342ba7f22c481a11643c55ec0c5a3e3a2ae2ef81ca797f96ea6e7f245fac4b684e68b61c4477000e41c2b707e8ec40fc14a981305455d38c05b6e68adce0ca0f12e8228f1a91e81276a44bbede150c36771bf86fc64385df7656ac3f869e3b4ab144b5095ace93659f43f6f1c94be93412d00c480368625371100a7195208755ef7be2196c89104fc5af487bc56185d883175024fd340de6bbb06d6f5a0839248e423865faa2debb36b3a5ef465903c87ba3f3374a2af9e47109fae971b087200b56c5608040900ae3728f07166478cf4659c33107746e672e1cab5b17b6132a2c8db7374d70feaa50e03b37b3ebfeb7da6fd6bbfbded27faaaa68b31bbba301f3255c68c7bce87dcb6a58d6f3dfd0552bda2ea7de503edd2ca0ec4c3fa46b65498f66d3c813fcfbf6df5795c6d85bb3e24d4010dc0730e9a4ccc1ce3bd1b4213b00d9fd8a7ecbedcd708a2f964f6f0cdc651de7e686e6b050ab10d32000e47d6d7951aa972305abba30ed4a40366677d8d97a210f5982d4e95a5d3de046bc0fb2905da9f25954bbd3b333ba4da41d7eeff77aca61b5a89de2a734030da81e79d3d995fa19dfbc45e9f80d2e7b94d112cd0b36a6ffa8d70533eb2f153cce58c1c6adee1f47f2fd26d45251d698528d6717c2cf69a0e92073b66654fa8399bdac2ea648dc81e9447679117be8e28b70ea1fce9d745085e1749030e82069b9766766b21cb78e733023b9b5b8b48cb3cf7295e84ce18917231dcb13733413259f9c56329dc59a73c5b57f9afddd9c2e7647a309361d1b193a176dfce46be876f6a3a0ab70c7bcb5388395abf0d707656b6cde0fc52b5cd2e160a653093e3e35f39b35b58138901e41f7e5643c270a8f5fd8ea2bf1b5a06000e6e0fea7b87f406eb97cb13ca320a2898994a890c754ea517dd500ba31c51b8c378761e5c81bf2c3a16d06e3edc2185d515237eaa8044094603c84f1462c362b8949bc8223829d1ca8ea47762b62e0183313ab9781d7e03df622855d62761d078e940dd9c853eb97e0c4391d1585991e6cf52584be40403d3cf2d741be642404d50ff37c54fd80db7a2cdd8c00f95b855447c748d4f5c225385cb2d622a114e8a45c244048037180ce029377b2a7d54beaa9a5805579470ede5cc46b5a7d63fa75c8225a4011b06c61ef1a2c8404e12f14a6543151ed06fe6a72c67d53b912a93b43b0e486428dc6e291ed7427388e985deff84df2eb6ce90e6d00216d0593aa63f2f15a1820691a6e320998d304c1016304c72c070d6200b74148fdf01557848d724b4bdcbca27d41b3fd570306b8836489883968a657443ca0034e1d4754acaee92f132c20e852f54518bbd7a853479ab5d9db67e49843319365f938433b6c5b6e8d7b1044ed1182182df31bcb88d1761febcf4c2d20241ad0bc8916adac899bc9d064fb0a8f14d69a49552744dfbbc8cf44d809b9a728c9b3af233079776bc08b09def98960062f842991e6f31d4c9e6d5fe365a05fd572df50fdb6b3c2ffe27d932ae271d899575d34da9c4b7a1bc8c5b1b02c90a0a00ace42a2ab6d2c47742268487773f41ae47e8a26ff2091fdc9b3cba9f132bc2112fe5e87db95775f0f94b92cbd348fc313d37295149401e26181ce8db80d199dbec08c91e3735da2887ba2a61a259482b3d3d23e201669f838266ecff8009b1f0ee96e443fabafde585bf48399e64804108b5b765f9ace088186867e6688493a10bc8bb3863415280be6ae9022a516d4a798f4d1327e88025d57d5ece3600fa34197bcd201afc2cbf9dfe507b33830260229ffe4eeda36610bb2b9e8411d657fb01ce54480cc82266f50be40abec26fe53cd34ea40c8c40da3f7ccb0f9560a09996da92262348257eaa48482b86c5010ab4e4428988070468b2e7d22b421a519690614c090311730897c892b7adc6fc5297bc41a2656c3b9a8a45299fe2fd4b8a52c5f79810804de5b20a48bca92bb86719841da0b426898a8ddeb52fea6cae61ea69681e45d70de95a41042abb475393084cd585b57c8857d0ea9f84f4cbc9f5f7682686f97eae19e2d045e151f4aff3c49d69d42eb9a2bef525fed4252974b54b4df6e677be49671f3100561e5e7062e908e08ef0ad207ad49d6b85585b4c4379d4220215fbc2888e2366d44ed2bd4775599e659a7119e4335ce598c65424090e711ff82acde216cb418edd6c41fc220d21fb07507babd05c31d47254bf08b3647973974822711196f9041950cd6c7dda007a09b26102ba3e4cb9dd696b92b1b49710f0b5c5086b23df775d320733f0399268569206b8cbfcdb8840599607f181d1715b3d5d5442ebbc13653e6188f083ef4d9efc63f8e1386a1fb45eda1eff1d5f89bf044c9492bfc868e9004514903e987c228fa360f514d732a9d9aa10f799907cc9822cbbfc43c6992ba54b71394fc7d43d40fbb1388f68953e0e8a1a0e8488e1de502c578b8eba70a3d8a6345ced60702da5be5d2d69685bc834004d346b7111024b0f6bc0d31aba085a53fb4dd00a046f608c2bd806780661d32a202145d48bcfa5d70a79f1820f23b8a9c9798448c8d4178b8f325a96abf063e1a288dce52bd1e82940209f70abdfa193808bba2144830c1310d571353885c096eb1aeba86128545c6dc96660dc20790d7d0994d44cfa7ddbd8cf5048ced2e019158c0c63e235c70bc47c2650b58451ee65922dab32348c165abf6bd1ff2474f31c234b127d8ff0f14c6ebcb7cb9e8ba7508e2adb53528b1be2238099b346c5fd8cb5a119e85322f236dc8e3912480f0b015651f87e9c04df1405f1eb228460ef4a1d0f434d94171b2828723b4f52d332096343b9f10c4a7380bb009090527d72298646df8f94a69160ec13b52ad232d624471055b8ecb72b52bb5422f01b2f2b423b05f58de41c6934419688268da0e0e686f5399cb7a73b37d9c99f65111f0f5079e7ac3d9eae65b5c8695a862c116f7e2f833e8803cd1adffaa3cada1dccb4df718c02758784753a284ada8c84007ffacccba8cc0a8b64547fceef230d4045b95820c40c584aa16bdd62bada04e69e33bc9cae1a942c0f054c301036fc294ebfa91fae812063763004452fe25002ee0227b642cada3d3f8c4f40c8969e8e485bebb8a1ef2947aa0fa4480a5114edf73ac8360d990f5428b2af87f0bff2cc162d5da73dde9d14bfb6d05e732fb69d2dd881b706a5065cf17b3a7a14b8d57eed39c9e567fe39b7cd0b1e10a8ecd39dbddcfebb65a6957ff6963273841284feb3004c458d482759addc6c8b52366e866d8fa05138d57d9185862a972ed54b49d8ab249150511ba2d71665e1a10a3d2510078ac645ef4c44fdecd200240c76d92c949329dea8c53957122b39d261339fc1f085f8db60951f712b863f91d6ba55ecdcc3d1bf20998f5d6aa96ac64b5ee4ff4bb0eb55d2893816d8dc3dc400000129fcdde183d918080c7ff1429855bf18faba0082d5c6cbc9c09628be9ba896604ffebd2d99d5274ce7679e5bc906d66a56fb43d6d4c384dd48de9c0d18c1a84ffbc5a8803959558435e02a3091d335b32242322182a4e1834736c8c12b11c0d280cabbea6e32d5e4afb7486fd2e435e409007e98712c51333c4c866435d934b74c0b8122d9a6c76a4baae8049a3da8ac3c9131b04c3b14e40e403d31133b24b175f2c25275b591a251fded6cc2bb53411c77e7dc62fa3bc81ddb16592028734eb51cc4e83f8e09ebb009f0865c099013931bfab9419bb15ea7306b40de454627df7e83992677541ccd27a9d3932679a5f1205f91d0c1d7e60cfb280e8f3fed2b889b3e9ace03fa9c298d96d6d133cbab2430270c0505a67166caf3ebf8bdd8c7c3bb562d7f204dba6d4d21157a1cd59e6f9250eeed8b1763dc4632e361973735b80fd2e198284315eee04235e927aefcbaf2c34d59e22317ae92998e9e174d41090b62569118eac47dd64d21fbba5fc4bd37e668b194c2864a6e9de13ecac39017ef09718567b11ce4ef239dd0c4c93c5f95019060947ab807b9706837ec0ece6975439d75007ac5244e41c489ec886e40f9330600f24631de1da60716c6159b44d1bd555e299534ace66da40179bba5e491215f0ac0e720be97c743902f600ff1936d26125f6c6643bdde396e6e8f212cbb8d92ef6ddc706a07ea08f326a5da672b7c1776abe92a09d0380aab3b9fb3e2957ded98580a5e02bda05ce5198d4cdc5504a2a9800ea8fdb7089b948146749949826b9848d2f8d8759b2e009848f217a41e907125e0b261ca205763aa011306abb9d7aa2e581de51fa14caa237c254959247ca9f8a3c7826e1db4aad03ae12974b2cceabe20d7077e1dc1e733e05e1a9aad9a5e6bb501aaa7e19f6754897d9acb3d6779427512f06e7648c9578143eb064efc359d77bea4da0bc8e9a3816b52493570d3d7b8c760b4e0d7241d5b0ed4b8ab5783a22adaa2e8ce19175c39da10d846b7cf3e092feefb8696af557b31ebc1902ef922fe309b2cb76aec315a6962be68aae68517f9da7ac899f54064be5a100921ae563dda88362edcef69134d4897ea32270e2a95ede0c2a1c42c1ed58962857e131cf858a059ee3b87d872093282876e1e74916d628e468f79016468fbcf40e0b765ddfe3bfbbb38b33de94e5eb9801212c2fc05551a5023d7eaab85931ad84dfc84ca2f3bfaef6c745ec545285a3cf5af215e185f419db2319151d3743ef644988a4d62775094e157a6a550327c7b2acc4516a32b26257c95a4e61858533912974e8cdd5caac3db32d163522c5c80ac2550d75f459031c65b4f403be2362f2159279a32a326328f54416732a224bd08fd284660663483991499ce8dfb364a3eb92b144c223c695fed442c329aea3a70da613b9599180ee40ce2a4c19538c83531a685d243378f03074cad381e82c980bca56a74b6beba4dfddea5384f4c845baa4a8b4100458e041e88977888e45890d41538bda38e5fec69c39ac33ad0f5a747958eb99279ba8a12ec8e7de3f2485524622b3130af5ca2330a48c79bff0441720514166fd258c981d69008d94bfc643c22163aa8b3a868e9468e9eb9cc4a2d46e71663473aeb67929a499696e6d56db90929cdf7cfd38d05c9e8d4a0852a38e46210f0c626326d9f986a69cc313a78207021d1e272d599ac6070fe0fd32ddd1f05ab48ecef2ff555321ceaa03bf6b2f9b614bacddebf76c97802618aeabf97825115103615f599569a088b20e1293f1bd7e7c7ff3f238ff215314b05711880abb3aa39bf82e1a97ae9e1861d77af1d06a2be5e24c81d481397eba8edc4cb5cbe07756a20a894abc10ab62d4af91493d228cceede45dfcca16067a470005d8b138a8c74ab9b37377c406153f6cbb504ab60f1ea8fad28273e226d82450277596e4a36847678d68ae006f3f77e45c5bf33a2950b3bf9b933ffdc8cfdd347b6b188908d5ff7fb2f3df0c25a898a7a980e30ecd8f2c0f8f37eb06516e80043e8bb40db40495e049123fb3ef94684810b9116f449f81db1bc4351b3f682d3a1fccb0fa36b230a33c0e07228dcad707e8f1f685e5516b9dfed51fafca3e6040bcfa7e5dbfa6fefdc14be5f76e4d02191394928c8764eee2aef58b8c11207adbfba1898f3ba45f2605a8e0a986f6eae8bd9ada3555e8842508ce79a6beddf9c7a21db953ea8873b770b350b8659da6a6d576dad3dba24b93c5f5f5be9f5bd05d7f11e8218f9571a60bd99bac02088d5ca1bfb7a540f36c2d7ca42e8143f12a8c6b22f4dc0bcb6cc6c36818f8ff490ec6a94522ed717188ae894c445fac28e73ea5167eb3996a58eae66a9a2a03477f619afc7cdd9371f53d968ae249c0308b3421a1d94c8b0e48fc645c90173d6d59833b8ff7501c2449b75090705ac181ea0f0e78aaeb61d179e6117280f12768e8a9e117bd50b6eecd8a4ea584630ef8d6782f3af7f92b03508c276d51e6d0d833622ad27ae0260fc3246974a06eb9f201f9e11b920b435234f036cab1465ccb0916f6c054c909aba152d2d8d97a1825c7e52f8a55e42d43b360ce6f655547fbdd863e6fb926c726e416dee9aabe8efc6ccc46e57aefe3a7b7448baa46e85d3982eaeeee15b218f30f935dff33916ce9cbac3922a5233baa047c9cad72ab7610d295ed13f809dcadc43211bc7cbbf25b63d1e1406cae3220c25b9e59a03d0b2b3d02367f8ad7ded92f03035a67099436fd0c64bb119c6a843cd2b1dd7ffa0ad782ce0d3841db415068e20e5561edd78ec192579162761a1fcd39740298dbf72b01be32d7a1a91f7f8225ea7a36ae90f43b72a734c6428c127a5c7322dbaee4e8eb1921fb06f367222752e65c45613d793fa77fce834815778df1d4ce30c6639d67320fa965927cb0911138b0117493c3a8004f95d0fc28d798caf2513ab17e83562f26bb4b90b445a17d14cb955486eb97e1a40c0c7f0b886a225e4dd3cd22f8be3812e611cf2f87a4ad38099d194e6576276a1f50f21bca1614ecc22afb4119b10156af7782d82696955eec8c8d050d670c82ab9fd3a14d13db1becc5b38dfe72fd69586ee0363e815606e7d5b0bc4dbc2074cc23eccebe22dea85260a59708c81705fdd0997f9fd27c4c65f7408b2091e3b0186b15dce80816b5805fe93cf560216d55d7709e227612c276255e12cf70c55076f74afc746860dbeb11352d2f48608be22d87ab4f7529acf69da04ac8ca8ba92954f61e2da359f9652d826a29b598bd212f5effc7fe2320f884ac150db61765f0a34f1e9e0ed6cb34fb59b9978e9eb94fb77d20314b36a938348389769aa58bd5f2ec8b406e092091cb9f1dd6974188f9d72ad43ecce036b94fec0c6dcbbe90f31eea2d0ebe76b6d8210e1d7304b3ab1d0842a51d5b2fd88bd2fff4d733aa2e8bb44b6a9621ae7cd15ea778d328ea723b9e79da030e71037c84180533458138dbdec06b3e8f9740461d8f9d3026349b8c071c377ac27b96c032057d215e836302d31c4286ec0f5da2609c0dff149a5b3fa820a52917b0b6a2716a6f7ea0cdfc33ee3f4ede616e974a16a864a57d2969ae8c534e2d21680154c915d7aad718a72154990875158967f563b8f4127cdc27d4bb9f524371df5771e1ed11b34b95e3f1e675e27eac7a0bd8f61c7f2c72c737562d1134b132cd6e7f5876fcb7be2d9a6f52b989adb1b70f654ac17593554c549496c7eb8499b1ac4a4613175d200f3a528ba659b8d80fc677cc7b74927f6ba12d8e708f55a2624026e21e1e48052ce251cc92a0fdfc55340f282c4341f24b62669a8d321b62b8ced93979562c4d06ce5389b6d7570e40f8c1591b302a63e93e9fabf200bab31aaea1fa9a71a651be1b9ff0fa5cb3403d6bf0b0fcb1224909b7c508deefd1845d1ee88611e431429f4f30f94b3d993512a4dfc0ce13259cbc48d817b67a02560af56d141a5cb9583bd27426ac55737238f36610334300adf505354734c5cf2dcbf657b40a6eab45f0300b18d837496ed385038371f68e1a155e16329c7dadb4b27bce4912c13032133a817958f62a4c5761cc3c8fdbf3c9a48bec16a8cde38657da10aec101c562f6a763ebdfe1fda7c962131b07b9838a990f2025599142e70eb965fe5dacdaf18618577186be401fae21b38aacf1a91878249d6f9fc6643a393a3ca0eaaf4d9777bb9479e801f2ec70cdebd067c3876f4c8854b6ce03ce188292365ad9ce656db0460f64510062ea1ceaea87430e9c00a5392dced09336866c9cb4fca2075765eebaf328784a1d9b209671acda7211f8dfd85731aab70a5c14633bdf84d4cdc9299098475da246dbee1d1557ce852b54cc6a283ee0628b57e4750955eb7412fa36f7424589e148e80b64e3c379eec1879ccc7d0c11a640883a1c43b62894f6a01c9119c9ab4f3a5c3198e17b6022b296e1b3ce7849c28ee5f9481aaf6b86e417fb03308a794234186f85dcd9eef763d59b83097331674a5e3bddaf23dd66fc5135a90e8cc2a3647c052debd8568fa9b3894809b927e0d467a1a8d6afb48ac2297ac7168072ce3933227b526978d31ffd07a511d99474ad0dff6974249d9502ced1653ff71697f33e34a8d99670bd508e5acbcf62aa0b3cfcb93078bf246314acf1d68be633d81212c39c110557880b6d09f406607033c0e529cd8d25239437d908133e6de081710c08ce48d34e31b75a13e77e699f535fe6d16e2a4515ba35e08d2ded6a7b262d41271cb03331396198c9d2fe32f1aaa6442cec01804196bee5bf072490204388d20a98f2605f22babe6864f75bdd276426d01b1aa024a4fd0918020bed0d3191cacff6385a0d5fec9d0388181fc8a80286623109fcc4364e7e9b5710710204c626862eb44926d2fe09937a18e9616269636f0ac69806dbce2a36ad500276d283cdbb6bd2c3f1344ea779c9cd4bba56924993d9fe32d3427c2007d5b097f38e2525d75897643fd6cf46c1480af4020f0c5372a3858af2cbb9604d4fa09f5ad37094c42adab3d935b4f4f5424ceb0079168bc1083ce4a64b31ebd3714f4291bac89134850442e7d4494e4767e954dcf8d0d408d771d6a929de972cc167a1ce577ff547d0080ddbc01aaf9be1856a2f41b04e80b29125aa8d3163219a320252ad14355960627ed5c43ef666add3a8da9ce572104ea8d6ac66eaed960418030bab68490f8c1b9f65395b99aa430f6c83dc2eec9bac1a2e753e96a728eb22959db84d70010cbe98bcc605160ceb48b57d3a2ccded66a99e1ae52133521eeddb52d7eed90c4dbcc0f11a15cace067414f039b2f488bfe09f4f573dc1957b64fe643b2dbdd8fd963e36c895df4d24d1123169cdc453e2e7580865d28ab2d3b168445115b5c7ce52a5dfbe0344e947972d86ecd236d8dffb574e7fc9794b06590ae5f1eb6b2aa4e7b9ca59bb83e55882df5c9a8fcc530d15ad35c7729e462f379ea38ecdcd6de4c80c31692c078ee3a5eda01617a22c9e0652e61895da32e37de85a37af85ca4d796c9f5a12da4204d85a1f4b606319867f35b103b4b13dcf126aa4529ee53bc2cc8eb25f7ce49d81049fb839621d75c8b40f41bf50184a833c84433404f3e07b8a6526984394015153c8d23baba112c43c4513ebc2c90a8bf812507a8595113d0c672dfaeb563b46aa10345a941a7ea06fa413b7ed2da3b6e7da88d112223a8c2953517a941cf9146972cc4b638396b3ebb3106acce58b84d1fe8cb17cdbb1aab6d0b2fce160dba7e5d34f8590bbe5c189b0c834c47c20114aaf8ef9570b62c9a6f6c6cfa7a879dee94e59232a9067f4f99ce4734ce7eecc86befb7c6834c2f9c08958ca011b15ee075fa70807fac8596a7f483d1602e00469e39a81958e11043708ea371638e1843ce170867d4702323f8494dc06e0e0d7af549e73828acd49c872d8596320d88b2d53a929c5b5e40c1f104e993da3e92457174c81fac7b09545e2805537ba6caf7828949d822e88e89c3fa6d0e5c83428f5d772519e4a187a04b758387716858b3d12a2a7bd208308f3c49d254408ccba36fa3f01254f8085f68a0c63acd1402826e74050ce664c43171c930c37e4175044bd5758caa04f6ca4b24627b684f5de2943a5ef784389983b72774a9d06252c0fa792b11f2fc3b97abb0814517510baa9ccf842a8a297d40c295658aba8e0fb3f420810f718b4ed69b45b2fe49ca42070318544486120006a9d40957a2323042d8f9ca9c08ada3b384d4f2c55bdeed455df7cd45502ce9dbab2955282572135baba6be4d0e948cbd07afc8ab59e4544b2505d94c6349c4c20994532a7315c93e9aeb0454b5d4e3a6737c4071216b160b0bb11dada0fefadcf5d4d1a0f2638a21103b510495c55f66e72645e6cc4ddfae2460c0bd9512e601a191e3685cff16f46dc1c05436bbfb525b043f9461523b3f2d5ecff4987a67f55fb83ccf081eecc66ad0791897f4253a69af5a16220df733e6b5076dcf77d7b5ff6f90fab341c930edacf1e4a0345b5b40a64b49fad96f0eef40bc6d1f542fd3421f65b821ed434a9755171a85609c634fe63faf7efe88000e6a60dbff8c4c0e116073e62df03d3e69d81121c928d84361d9a88df885784305ab9c10b8c935cbba9d88070600d0397b4c23df3b5ac24034ad107bcf71d864154a6ca0a1b8dca53d0c96a9191d413863e0194dab3b4fe16836081389559c5d244f2ffc9c814081af39fd2e72748ffa47f8a1abbc9b34e9a7e2845e6ff1bfa79f6bfdd83c18a6b074a1182eff996ab840dc115bd7e3e572e7bc82f20fbb1416e846743404fc116d9b3feb305a2b46a7b3ff99e2dff424f49a13a1db4427c3eb793e3b4461d7acf279ca89b6eb228387c5ce766cfad5dfc890c1eb75d50d8612265b59c47a30fd682dceb5270f12bc59c9bec64340a7250c496dacf6f1a800adf3ed1d59b74ffc16a3808bb65344b069a6436807839c31f4606e8adbbd728de1a6ec51b3cc04f6f583c315f3c91b156161170e4458d8af31b82e3e1ada1e777561d375c70bcf600318fef76fe8e9f26dfdacaf97654e547e27e3ee23c8cbdc11496c9b2573f6a1bb88761bf3b4df64f39a0f02c41ac88fcdced1a6248d21762b85ab959702b25e0064497aed4a6c77088aa455fe81b7bd33260c59f4c1559a55a1a22c445e3749ca296985f310d041618d3cad912b70c39813a829e7a8f004191db117870fce92e2dd0c5942e63229c653ba4c3343d29a84feef7084a5ae869c3c78e3814df09362901af2df3bb7e198d14b7a85376c99e96c66a690a925212239f26e97b71396c00c30e6ce676d7cb3b3ebe9a299bf15c91bc6748b96b61753a857a25e3475e402909154ee214862f12e565ff4b152e46f285bb4dcf1a7883ca16e573fbbed992d201ab93340ecbe87581911d92e7e283f77155de6884e2a22b5a9159ff86966a4353df3bbd0ffc9584983467ba2a0d8cefbaadf62c64a7536f66767d43a1c499238a91286c947d5282315734ac94b05d5bf51951e3505caf305c65b681a7caed26ab5cbd403654fb969953aab9efe18ce0d2cc40f1a95b69bf2e36ec95853cd9452a6949e5d7a2d3a5f05912e71dde762f40780ff3e98d01c1d3199ccb6c727fc34b479618c68d74d7065815e7caec95b0e95ad544fcda3bae57cd1b17b465ade804fe19682af7cab505f1b248c80de1815968745a344c49b7d67b0d0f8eb3435eef3e700982688dc4381d9fd1a59b6b4772582faff6f89da65e55246086c91ad2e496263b10be5662e08cf17a08a3c32e1ad03a48865529c36361d36a2604358aba5b25979251dd8063e628e92bd0519d86821033aa8e9cce8e4fabe7104090ead175438382a575e6f9380d277d91f32c526524027c23278eef978b83588f35752bf2c0f3e3a639c3fbd723fd013199f032cef1abcc9f55494ee9a2986422ab27675dea7172fff3d6e25686285800e9b3d3c7fcfb09c361efd12517fea2b04cdfc2bfb5ee11ef4b4bdb28810f0af5d9fad2e5aac2687be30e25b7a5adbfebcb7ab0a715a5c9637fde97225817f45634be02f480757ef7e60469eac8eec58fe48a9de2a8fd186705a04a9d19e7c29d9f847326ea7692131cc16c036da908c7fd442166d52c169c48208a053ec15f6cabd648e250649093c3239e1f75c3d6713890bb96aa66a57e254b5726abf44d8e02316b4ec39b6c41ceb73c9414359d50379229a4982737b2fcced5877ce800b81d8e8ba8b74eccecfdf3ca5308c5c6416c9e183a66be1417cd29347fa0086f090c3af069587653b8d7d4b058b06a7210460a728a25f0ceb4600d081af85cb34f9c7a8845a1c76474f41c74e460c44c2e78ff7f52625d84f2b99734fc5bbc1c2148a82db2ff17fda98f29d8c726f30177fe10d70f1c442451b9de4547f48917718a2e57b700d8ac1a6a3b15694c84c4c61b991ecc8cfc4e47cabdca9b0541d8c86b612586ada22ea19ad09ab4e60e16fbee54007ef21d6a9c1949fa2be85d1f87a88b39a0c058b12215d4a05c967e2868b2642e3580e64464d304770b42cf470f780b18a4ef5e05191c55fcdb4f1870dac423ac052b0b369e3c3314e94fc422fe133fe397e603786f6adaa5a4d7ee52425549c388ab6c8456712bb308a3059cef3467f502059e2e81f83c8953cf46185f4127f1c0762e0b58205d2eccd2e969ba0a671c890efc6640bb5b02df328a1afdced2a88978b417ca390c2a8683efbaed834dd1955c0bb972435a5cf9185b0ea204348bc22611c4370bdb3f01df8ac417266075d8daa7d08dbbfef9c95b48c40ba273fe94cf4046cfd7a24596d50e2f9c5cb2976a2b601323901dd69836e56a632a966e38bb4a25d93e4b911124c4389e5a403b47105b6c0b25210ee8a9bc1cf38c888ad3f1d5d5d1d41d80dbd1a6369eb57050aafbb25b1da859665b2c4272f747021c039be5fe483cdca29cc9dbeff10ba2c02e1358dda7d750229144ba242fa498020f37148f3e36c445b4dd19b0d7448c736a724161812cf06252dec1f0513144f5c92938d920c90d2a28e8969696115775328f13f4019b8c008fa3d2e0258b623aaf06fbfe3ed050c531cc488ba99530d3b067f1415bb85ba3ec255f26e726ad8a5a71aa0db04d2c3e398ecadc67a3b18a4cfd9e30388b777d8e9a3ab4809200252480276bf989030b2c9d860dd3915c274e39947ee360e9c8d3626d7851d06466e4d95344ec1fa9f630884036624d8dcf64074da4c902790e165bcf83990dd0def00547a3962bade01171d6c40910ba19cbd91fd4ccbc0e2a0848beee4c0eab6b2f57a07dd53aa26618ce948b123318cce2e52d8baf09ef92ab050064d7e5e6a439f6d46296f4a0caac18fab3c26758cfae75cf25432f07420b018aaf3eb23792587de21baafcecb16495b70827c6f61a330864cbaac158aaffdd8025209943f095eb280a6fa84e3716a28270612c7366c590a872b744c59b9610d0d26507deb0058d8f4324aff80108968b4e186efdcc8df470b142d7e36b8a84024d70e8159f724b2267839e8879b5c6448a8c973cdb3f682c0ece6aa798f793ef8f3c91eaf1adf3b9196bb53c05033deebf264ff0f51b7dfbf410c49147a7d08c214a7e0304b495eca4313b356166e69907083e34dd326f7ca4808c0fb97241337691bbf893abf60bb7564e34462a992a9089c8e5453e201ffafd452856386783239ec208e448190d290f52282f26ad92a47c8735475b32389d481a86cb8d97b8c0f20343b83c32e97a7f60fea6b3ef68f2ccc5b9868650145e2e8c61e82fd52cb4627b078c0fd402fd983c132d9011bf3a3b325f8baa0207ccacc6d841c435a61723c36b1a07e4850861ce9da593c2485998b2df3fd24b64416d437d9924b8830f0a2f7b6bb80d189868f7d38932b823017db82c857b7739dea8c15a194008057f91480468e9ea33cb5e1bf3fb41fa9c92ebde5e018bce676fc4aa9e6c87fdea14a64d4b5c0b2f692ef09f8e7a0b834871a000b285785834adf2355aa46e375f7148fd7206317ed08bfa7003c3a7db45302e1c33ff32ca336cbb72f95406bca76717260164142e55d5f4fddab1dd1962693862b4a1ec8733e0a334cc516133699653a0657f034c48ff4af81d472921321b58f4bfbc6e47a59d0af108a8a136f9d50ff2b8b92954a2c72e8826d50dafd310cb2cec769ccdff18441c87966585e36d425608c235a60e9552c6ee4feaa98ed2e6759b69f2521a147c55d046989b8a31c57aabdc19e4c5a99d1d115a35a1e666047c4a22880a96d0779c168f68192c587fb028789c418a7aabf9ea305e52f02fd041fe9ef6c6de0303a8b981fd4dfc75eee0e7f8ba5f2664afcc1bdcf8bdf3e5eb2bbb0e66f3a468a25f1145f61982dd4b189f511c303ed96510cd5ae11d415867844cac062e99c85c27e58a97626d854c52d51c57409566fdaa804e30d73a97cc78647933adf5e7c4d4ae64cbed20ad9d7247c3890243f28bf034e6557c2a642963855d3278ebb660359fbf0b5796b84c2ef34856a6f675cbb6de86071b01a22c2e3f1bbfdf0057936d4668d48ca31d34a8afe9a5614fffee7fd3ff10e10803fe0de191fdd90e7c6160a64519b39cd396cafbf8e0796bdc3223e7bbe5559a86b34a7344e96ef96783d62973d987f0690b9157842090767785350a406ac54c489b90bbaf2e41cc25c405574c5415b99b1d49976fe8a30c74a71f6d6ce1e38be3a929f44687958be4a6392ea97e09c2bb5105ff73f0a3557671324233473db6c64d1470ac58a53d783ebdcebf628ff069233365d263cbbb7a29f3ea0eca2535efd8fbadf306a6f2899cea09f1a2cb178d1b9463dbe1a9693cc7708f9b3b3e5899bd2795faccacd99d9996c3bea24704566b2ccc514f2c96037ca2f5e88f731e894d6b640a337aa5503c328bf8ca3130a9f7432573cf6fca1663f16802aeb643c7d79c5ca7482ced74f3fe336cfb7904d7708f9e1a63a513d4986078316d852720f2b744c5571d7d81c14864ca7b331aafc933eda8d5e61bdf6aa705f9f202be29c5091a27d65dc5147050d955c8d5bbe56b00b0a67eb0551f8cc22cafc84516bbd80b03c361b6aa3ac200d39b4d5e4ed1b50703cf0bd06a2342cc300c308b8c8919189719b6d435ea2f5ac278d6a322d5c3b33ba75e53a217eb4ea04282130ceb62a8670d75a0a6860a83dc759c17e1ac024bba76f361082c7f8fdb69cc5adc6741700574202c8adcd3912cc3f6f05a6a298903e5997971e12ce8f837484349c383d68c88ef12578c0aba8da0d32cd9f803a1a60e7fd2e0af9844ca6064a36952513307066ba60af844a9c37401925ba73a9f8099aa91e24e1e4e3178de96142e1e331ab50153122ca6afa95ea84887073195dc6bab22a18042ae93324b599e1857b9d90436f78caadbe139f4cce9716d8ad1599480e6007d23faf4f111697f7d8b6bfbea8b9009798349a9ccc3bca231da4a1b5230c607dc982fbf5468f84a7a3dbd978ea8da31d7db04392d8dc393378cafa6ec0a91f7052f132473c41dd21b61d289777e9f9022d118e688ddf968a2fd29037acb5b9ea5b12ead4f2cb097ce1106c6f58e5ebf3742fea8de283f0bbd5346c8409566edcee3e3b10026e10d3695d85d281fd61ea422729282b63d21b392f83ad2cdcde69cd889479a73c8c99ba75bdf69bdc93aa3771baf4426c3784933dd89b4425a928bc0de0acdabdfa3ddb08bd04483b019a5de68586fdfa7502fb2f295bfbef2c892b88e4787239b1669afc4872836b3bf8ca4930405f3f6466b82277c81ffefbf8cc8ee161460ecd2e47c6cb75fa90c8354ac61fa9b41d185276a654912329a2689b552b2df093bb9f1d9a765ada9cfbf87495f550be3d11a06adbf3f6ee21b2f106a0f141e3521e65bcd904015c346dd0602308af43629d618a8d4bea08f288e5aa6a670319866479668f46ef99a8331a20786c5437940094a31aeea2734724c7fc0d965c8a14af17916724fe38e0d5c5ab5b42023cda747c208a5882078d726613551a001fb6f3734d38d2e3f38cd737bc0dc6b16ab82d4f85eca488598b025617ce2f4ec47c5851c60925fd70828921a7a6f18f6d0fb0eefb3bc9f918a93730399c3fa7ba70df055f65576dcfb8821e942fd0089dab890df4081779cfc1d64c995d26c9aad45c2b49a204ee812a74b5c62635a1eaa5c61ea873cd1aadc7418d7172b811d9fb709afd8ec61f6150215146fab0d578653de2adeded48ff5028f33e86ee676b1f3675e535844dd0c930fdbc1c75c797bb61bd0323d47ef87c3758dcad8a8123949cf76ddcb02f752d88e51b54b77cb017f0f115be11ad943bac4f606384a208f16e66907945c628ccbdd7e8223c080266b2c5db1fbd0db5d5b1554554670c05bac3e738a872aa6f8ae9eea9bbf2ca852bf50876e4bdd8247fe282c8b061cb44287208ab2e94c3f43c41e62a2ba447500bc3e7efc54369c254842a8112b11d31709df2e6e1e42753888b3fd2764e7d1402cc91327b75058c07ed8461c93dafddfc4bcf8c56d5b5f4e89ae0d90dde032e396801fce6f5c760185d8e1aacd9bec535159c4bf44aedb603d15e6b291983f36a3d3d362ee6863247e9a9df483111e3ef02c72fb722a19073f91c1d77442f526732d89033e831c47514f6c1207f724870a44a98784992817667868832b8fdd46f6721f9a755cca46c433054fc257ec0bf7d9465842f905a4e2bacafcd251de7cc054a67bb35eb839bbc5d36f3eb645f673872510865cfc1c7d9d70ebc77f50b384cdda115d2d511fa04df2135d7b8962584e36e33810a0681058d4474f00a2de04a2f2504308730a6e5b2c919a22d7f1c203b5da2eaa50d53d66096a74098a3141d59837d51a832698df358226a0d6b9fc1357a3fa64d905c05fd003c2ee6d7a615c442befb623e769e6178eb2c416440b0649d3fe66914cfe73c47c1774d93060984a834caa34066523825a2d256a40dd3dab8380d6ae88812bd85f30423b0bfc850cdce80a2eac397b68222606a07f01d5d9ad7f34ae72a0a165673955c4039faf002b2513bd5824ac65967c971169e377767d575dd7bf7472742c86c87a2c590ae529eb7d2cc2e8590ae3317dd0a4a45ff97803dbc99c3f3ef638082c56da22a506a4aa98790dd7bccb891da41b1f0cef7bd8e84cf464a90638f0b5a7d5a70c6022332af9868d4b8495ec009d667e5ec7544c5809b9cee77f45bf3cfdd08d189c187a6a0cbc194cbd8142d3fda1db6f1ac43868a84d1fb2ce6fa1a50b0433490123643da22e944741e1c13728bfd7dc83198b0116f783fe2d075e234020d0653cfc13be26f068cb88a037076e4c001867a441aaa1792d905671910111e8283e08188530b17470ccda60514ac718abcc70c1d5d9febd40cf0abdf5d85c7b5768f9f4b8d52038697d8b04548d17d48dd4c7d2a14ccbc31bbf8f8ef9ac9b931972acc3f16a4ad36f1c2b8ae83f3a04973dd300eb5daa11e1480fa7327628ea91b2decc63ce947f8cc56cc4345286fe6ae6c3f2900cce4457f9caf01efce8b2638667e2475b77d1941bcc2e81f2740db04220100315ca3abe777e1fb835b0e7408f69f32bc0e8e4ff54ab18a4ffd2dfe538ef079e0b5a98007433770253fa86ca5e0c66fccc85fa0e020365789c2436139f0886e60020c04cad4dd1680530d0830d36b7d7500b6dfa097b9e9961a3acf1b431c357042259866d9eb93c6b069c7625eee838c3d4ccd5288bee9b83064e301ec06a809b4377d852a6fd2bd7b5860c5c9eb9e698efc491b00ebb6ec8809a25a8ca5b826fd22ff3ae09aa9bf8a3036b411aa40dfb364041abc09116201801449081582f0b97186545439dde6203173d5ddc8523cddcc59591345b678737631dc2197de3e44356f2b5856582ed97e140a4686de5e598c55b4326faf0398a2007f7b40f99620701eddb079cba878a13368071864220ac9574d292d27e00964ff548e163ba21b065dd67b9a0e30b9de91ea1c083e9970af4ef991fb7c3177834fb50601fb9a407cb1746e9fc3d18c32b4e0284d219af789e02891ccfb87936bc9b07b097ba480060ccab0d5f0018db578698f67f51086c37e7e7bd39deb1c3326f23d51077b717bbc948639fc1ba19803b15bb446d41e32ffbfd34c9cebdfdd9adf49dbbdf6185928cb104e009abe36050f465b10f05a12d5431474976007092542cc8817732d1823543800235895a8e2aee055c85e0aa70b8415330d38af5e94e2b41d68bd52061fb2e33e3a36647e0bf94f360a060c318960194648b6bc638be138ab00e922e9491eb9532383f54ee5b0ef80f66944803be7532c944ad83c3859783562973a0a6255faf24622d0e4b6f4d113026884121141ade26ac4add899400688014a1d040f432bd1f85882b8519434312e3fd645feb766fa14bff213b598f61bc710e4ad2dd5d02993e14428f3fca589197d852d9b2f8a93b2d90e35c56e7fb2fa609bfbd9d8ce42913ab11532623deb5cb14c990a867df8f63e1034de221188bcc3428f2c655351ebe02e6d0e4b32e21c3bb7a6e75979d05bcac27f7b6e00c568a8c70f25b76168d49b68d3c41ac9604be42bac5952f24f1baf09d80fdcde65f76e0f236f2ee48061094c061e4c1345b9b5e655482752ff2baf2da397628ca24cc72ff00ec36cd6b1f4c54faf153fa84f76e3834f0af85177f232cc2720548c10b4c7d20de3c390e7602cfacdff7a405f6f3c3d494250417249894cb4ee1f02ff69222e01ceeadb6165c0d3ab22c2e6faec3225c06cbbc8900039d3498504f0ab98b942518bd44504be4a681412bfcaaea86516e8d27eb0cbc99ab10193900f03abeb27ee68744e55a5ce68d3749ebd3b408e78d55b20a5e780015064bf663bf850a8824c513d654c47d4e7bae63b67d45e1e2da24758715b37002e1d44fafb206ccb6231958004a01514fbea5af171844fdee72f2c955ace12e7461736724625a72c3dad9bb47e85b1c10f84cc1219e885a38f2a9b2464e9a0774de4cf0fb4a980e4c7b8528e8597312596e38ac481716a81ba8e9c9648e7facf8ed92f84eb6061800f1aae2300a804aa23d1f12beedb0286d3dd64361c948a4df06334412714093b016b509bae5f0a04fe2e8cfc427418cbaf215b3c3609ba37dab56433ccd5b62ff4be85ca415a163c0c740cb551dcb6c405c326d9441e2fddaa0aa09f0b5d4aabd977a7bc1d4eecde6836454853206164b73e06b9475019d6911f96d549b97b018880b315ec3ca0c2c43a790331730a484597e5b12b255c50afd22018408d9b842380f1c29a7bde83442ba8121842fab3bce3578908256d90a55ab63a0a0747051309c3cf5d93be770e1d0f0f9246abe12f827d35290529826fd4f33a28c420587d096e981328a000ea25bfbfc13949a5aaddd9b35500864e3d1dee4272df9866b77701aba973e0d203dc068fb533eb92214de55b2003565b29bbd86ad4c73b64aee343178e91e824b0b56f15e63d1b79ea2c409aafb2622b564c45dc459a1943bc932bcefda4eb69ed6d342fa8c1a0c5dd297a421c247d385639ac335b610fe28c5c8f14608503c594b20e9f99edddf8c4dcadc3f760a1442017bd1c2c4c4b686af31c35aa7d67c225273597bacd9558528260934fd3714924bb3e00fe7c1813ff40095b8222fdea8bfcf300e0e74dfdf3829a734b797334ab84a10704f9cf8ae0d1daf194fe21322775352c8904697ee2de9b2a6a4f4c87fd44cfffcf2a52e838392dafd9f8a37cb5e7789f9467c367ab42e3fbab47abfbd80c73ac4f65819404f71c68c88d67a688701dd4f97116678f425a2f42b8105af654c987b35339ac5b65c6101c972d497ccb7951163106107c09007a065f15fa1868f4a2d891c48d23945652445a905de0879a4e5587d935ca027d9910d73f770f34e6731d39e205467c930b0213bcb22b3b55ca9251cc7e8a07cba1354e4b781159d31be2861944b81616ce6849e76002f4e5d6b46f0f07d03e772bd0349d0919f1aa40152f60e796ef8916e0e1b1992b4c01d57e324983bb339d3020870f45300558b7a96faef140cd1ffd0b3a6639c618376aa59c869256790fea77ccc4a2030cdd641e59b00768123d88d0d3183be5b06b9bb3e5dbdb31d3fba17c16d58eb79f86dc74e247d7f3d01115df6b0c5194427473cf59a146bad4f7884afa89e4f6d4d46f906841cca3868a06de9c7f1b3ef0f8d8b090d0ca6ddc239dd700cddace5c9107e3245fa1eb678ca279205b348e66e7d817486bb3adb35e3abe6f9371dd35d14c20a022fcd111e2b4f4bf14c0d04be4a442334861b9e258985159f07e8a48a36bbc529700c61843c17c2d5f18e160511debe7762a49fb0bd58c5d136f1f7c2a50e07ce2196f42eaca2dd19b01ba9437a4ace0a883916e0a591368a463ae97ced6cf7eecf3853277a3114ed369be85129fdc8676acd08cee288f8787705f95355d827993efe76ad5fa4762c9807567a33948be274a69683e2a387ae79486cf0c24a61c70d3e370f4e5b4da9cf9198d98bf05833635ae55ae181979645403771630b50318a919f460c06d1d848eb08e22967a6d4c7fe8b3c5840b29102d0cfb4c98c09a984ef481796c16563a84c098bfca61e6fd30cf14d87470f0f21357c083e5d272a0ae248850c0f70f549afb5c521ccb8758924bb4cb827be3707ac9e87f0d558f42ec56be403bf1dfeafff92ece188f30424ef272b56d29526b79633a3bb3d122c690c1cb5801e791eb63f35240223b6ced2a0ad00b8479362104a8de5df95aa1a190fcadf565a6e425a2cb79768413732ba90204862ab3eb4bfeccc50542f85426a6ffdb2a6c9f31987731285dd7c8d02b4f8adbb50973e7e987d784bd8058df4be0e7edf9e6f514991529d3420ba3958f75c232547fdaae294ce875442ebfbacfa6f58a3c3d9eb2121389353868485f0a41aaa0a8332ec4a4e7f0386c345a1654b6c2c78dafd469c06eda3fca327e84fe1fed6048b7798598944972ac91f50ccb3932eb43597d6cab632b2026533bbc00ac3fe4cd8f14f4f137782526c75eee02ab63b882e2457761d98ed4c859dd8bd4d40f7d6e0f4eaa2fadb21334b81b0113caa353564884a2c1cc9a2a0ac803b51bc5ee3fb9cbc050d2c8f848c715eb7ba0d7b750f1268f62af2635d637a23d13ee20848332cbd6193a264db4a2c5f9222b592f44a4dd1a378c8e3d8cae26ae0ee000073c66ace3540aac04ad66be821ff8b924d5929abb2ee8687aa614b7f88e9dc1468b775bad224204ab1e4cb2256805d426a10d8cde09df3e42ab7c483b0693f232a448288d12d05c85aeb558ad6974f01e13aa4b864dadb81aa3263dd91fc3c2041c2594f56511b9f7fab868b1f1cf8da68fb09c309d36de8f707cde6faa10b7282a5a8356e5b93d5f49315ce7c0f98b671d2e9f73052eb0ff666f43a7cc2ee16404ea034abc1b9a6dc9de3ae4a97c9fb266cb9453550851fa004c3682ae2ae0a69d6f5d9fb36cfa8edd006d3d035fa9394e3a4d9651174b8f27936b7f3e9c2e9bf1128e1661524ad8a64246b2b7bac3e88dddb9a3af1ff782584234059f1b0c3903859880af8d7ca6737e485f88940116a87fcaeb5c9ed295d9985981a43b4733475a45dc3e2c67cbc4018632e505604268a070609a586cf318e2849095e96914fc331207efab821f8ad107237ac42b129082198dbb9051080e1872d4254c0e3f84875d214e5c755804dd8cac824502d106ad972723d11f92f65168433aea0d628e7e00cbba7358d6470c6f87576c75e417cfe8b712f90bd88780000c8d2ea1554b91a1a56d0ad1f4a1d9fc41d03faf0a2cd6ac73e913b272b4e0bdb733191abd83e35a14966eca2b85715a891d0fe51757d3601c3b12d4d59e59ffe27d26109c195102a1d130c565f87d314e847f0517136d9b3b2146d3ac86e18b5c4286f48457b097baf4b205ef80ceedfa25199f8e62700437482d6e414d8b880f222482014a7bb8891b5a94a33ba2eb11436a642ebcbd501ef7da7e1f323d660509dfafb11ae4f7c1dcd0726464562c4c52db7569d4fbad9448a89e5e2b47a6588beda4e93b92da705900e77e3216269f086b66515f2c6ff48017fa9454aec2630356ad3a7c255541ba462613794f59933f442c83dd348eda12133b4610376a8e90796415918428d49c73f3aff463ff4060f99109a28772ed94ecbb620811fd1ed226c9b1a1563943d1647db4e22bca7f38cc27ec3923b7aabef4a2e9635469cde0cf7d64d038e5d32eefb821ea47402ff615fb0ebdc163b0901cd2035330016d7ad87df3c20d67f2c367c9ad383fe4a823e04efb48fb3c1ad5a84cac988f4aff73933399b1c9a5055ee97fd4288fd0522e966c64ca71c8f52e779a6bf0e42552b035293fb0f096ab2ba23f37edd0372f96e41e83957b2940badb3704d4b493494c9b2ef3b58415561088ecd00f1786226f02a60d45f3ba009407c594aed7ed89f9a1c24c39b788d634dfb76bbbec9efa800b82cf44f4ebcfec958f129cef31cbd54df14cf59123f949af32857ead1977fb9a1edadb400da62cf6736214386d94a8e9cbebdfba3c1e125f79f1c4762e652556a21d1e69b32bd792a73b5827b4fef03025830b91d49d8b29d23e9a794c7e3013dd2f5e52a891bd1856bf922f425ab40e6eb500bf0d1ef7c8db23ce5d2192247a78a7188e308840622050b3d35a11ad80b80976f8fa580e3370f64d86f1c36e12f1eff538bb4825889009d199fedb293972d71522916aaa7fa5c7d421ce589b486069f83cde84d2f33430a53fa696ed316b534b8bd4452dd0dbb023a52542f0aa1a724c26b7e53764e3233f0d8677fd1528bfbfa245efb3abbd046c15152d7d66f999e90b4724312a87a15ec287199de21498e463ea0acbf07a82a6177f63fca7ed8d599cf1869818989c1525ef274095c0b4fa4ac72ee3d0dd9105c22c49dd6a99433c50e12396cc2cb72e463b7ecd0a3804e1cd32e262861269ca6a1d301f0993d4714b079ea79ebe4d43e011d3a99b6e928722e3ca9a1ad243be5acba6b0121493858c6ad2e83d24ef99557431d033d3e5b2fe77bf2cf5353a92006466abb19dd07726e506d62a2344d841b0832ce35b34053deb7120a67dab8e9e7a25baff759bd004598d629c146266145b9d2835e2b0de42eb06649281085501428e21f0e455822743b35e9ae37540b982c4a80a79b5e7d4b70c9772236594fcbe89941e4dfca69cfb331cc1946b03e6599e5a6f0f5c2a600b6491aa4f2ccf07e41a65e6d7cb08b1c262ef03f69060cc184ac8c0c65d8d015e55a84bd84685507e4175620a664b3b6a94f03cb3c04368efd11444a58877f834c8900f0e9892bfa88a9867c04be908f0a4558abf3f868b42aa5f6e44ee6322beea4cfe296e40a399b9557c9ba0660020a301bc9981e74dd4e72935b63d951255a0d5027099cfe54b03e1350ac651f020ad79f2cca5e582c8a75c5a2dcaf2390452f4925c76efb2e1a48014451e4757ee274a5d0c5f8cf083322a39fc414c7aaa6fb2c658f7b768e70cf0e3437901bd24e1f37fa172784af5ab6009f8765fb1a82a4b491466ca51f98db3b6fed7ba4181a41c6907af391ed27037fc74f0feff74a17ac1a7059afaada68caf3662c733a4ffcd772a69777b276f283e43a369d365af2485d2885d89cddb6f20abf48d7a8bc48628da334ce7c0296f2f2c947b6a9e02ca707e532c2f4f4cf9168e7448e4d45541f176c7c7acc06f518955a2191851bf7106291a8da543367701dc267fd56d91ae156112bd856a1806d15f82992152b9a911578666405c2b2382bbece638b108a6642fc269341f028de29a326cc5c4f8988ffba9bdd66bc233797bae3eea8613b92d0388e0e5ef28dce15dfe880df8deb940295b8ce4f12d88c4a7fa8fba3f3049f038dee81bc45f241352a41b341281952eed8053ae2e009d4c6e1db1a7d7f3a61b37400ad0ba0d874040c7836217b53217a540d88be355dceb96a12596e6a2c718146c5ebf393c66d93c838a48c1ddd95bb96c5cac169b9f9a9112f0750340a1178ab0ec6e6e554ecd48128eb381507111ae9961fc920d401839e47f2f974c067e791ec111f6ffcd8f0c69943daf66984399ad20eb9470eac2db4e9eb8e90e854a74415260f99a772eadf40b47e40205d2884ed7e6903c894d7ee9543fa474e44ffc899707664ffde0ee965173682ed96d17a2e1cefdec2490d5288e9a8a352f35338491cffdc4a1216af20a7082b78479f1592ad125f9b31ca89abf3fc107c9ed6208c65623447cc92ded8cdffeefdbafe500ec364583f3afda2e965870bc138e4c9e130e9752c1e873dcb04b7fd1fa47560053aabec1ca04fd22297be11908d44bf384860f70b52cf510ca6de6166579c2795ceb61f6d8274808a3280467a162ebf27153a2730b8969657d424f9639bcd60c83ced85df15e15fe06738c5ab3a1e71b1aaba00cf0a4ade9ba0e383d44699269b1c5be6e4ffd0823a90173a91edf565f004d91c6436064009003910fe0f7184e3471bdf920edef580f6f0450b7ab5b6bed8cb8433b69176dd7fdd7341f3b0a3c852f4b8fd3f6d0fc8eed5ca9350962cc6a052cc55423c4a274924d822a30e62121dedd543a44d71b884642928b3486749480bb00a383551f0793c065c47155f3a93fe4d5c3e30d7e228495e3837bf977980e7d010c283e9b1a50b1eda23077c032ad689d91bcf9b4b249e3dd05af2743b89db3287d8dac582150a08e4e73a7545d9c4dbd08a9ba21e03c212bd4a380992c555e2c34185d8482f47936de26a90a459ee8a2befae2699ad1bf5236b9314d7f0d598740bc20a90753ba5a4cd8f1427b21a28777fe8c60e1c806d5e2c0034873a54eed5718e28005327d25dba434b07f8239f68c78d5b63d24e94aeeeab1d425b9a905e52879012409e5eb32c2d39425b8ecc91ac7482e87e8afbcc5ac1f022b66340dc0ea94c5e99596331493f220c35b2cd9a0c85bb7b297148429044d643dd180c880eb1b42019928dd0cf4ca10ebd71ca1e503e69e8a1f79cc914122b0309d8101739a1cdd224e6a9f2c00da85427638ebdacc265434c61210012c55381953664dc9d0614ab44229a35edb6954e8a3197ce86945fd044df366191b6d4e8c72d9763779f9e717a0eccd104e746c4c76d573fe93f3fc16146e5f85385158127fa7dd9862b5e149a1a2f2c3ac54ca3c9f73ea7264dd2add936260dcd507b2dcce6178b33011b880f560d28b4457f32929ab75952b613ca2ece5c9cbaa40d41e10b01ac440a5f5a5dda2081a60d725035cccde7641f885a6f7772211567287dd416b5418e2605ad16f8872a4479b3db6dc5ae02b82b3fc93337b615b07e5906f97cc8f981f4959165ee16a75d9c5e1c7c249c1ebcf614c4eff7900528f2ce4ba3303c270d7c1e18a89a2743f1303dc05bf1c4938fddb1ae1d9a5130775c54b12274e459e94c75758bfe831800f32ee5ebd05c172a5bc3605a74991f9b38e7c2b21b19ce6756581cc2b041144cd371ac15290c8ea80d65ca1c42119d70670df410817171b1e85f484df9d5a3d46c737258c458039fd06b58b8f1db0e46b25a6415138d4fcac525211cecf69b3244d5a5afde336c56e3661e02fd5b28c99897aa3f9efe1f4226561e2db798368c90140086a73e021ea2f6ddca0eeb69fa5f5e5fc1843e17962426f68ef0762f0f281f211bc75aec079527853a4408049ab57a7a0767aaae3dab2a78ae3ca7e1911e79886bdfa23baa4babfd5cc4c150231fe8f6b02a59082743cce0e8d47f355f83675a6ccc90c065a948d1cc72b294f62f9a44efa91fdc7f0c57092ea69a67e8139a415fa69d8be84ec9b9100a0dd930d117475bf2542bc396c7d31f94a3cd1f0ef20a3b60e64e3d5255a9fa7cd5b1ed8d46cca673e753e9fde9745ef176299148cd52e487c397954d141da8a130919b9a5ac0e4979433c32ab9f9900da31e2c8248a8eca4f80accd6afedc78c86f6cd60149f60604ec915c7ff501de3827982c22d8c881aa9266ceca702b9d42147cb01778a0133a07d802cc52f7dbc4d1769c909038a5091988be9e25f45a22000107736ec0c820f8ff0e8368ec0d1478b90bee9e0c1aa1c15586ad67a9b8a91298a9c15474d2dabacfe78acb5dc9c81ef4db0cccb086a3cf61c230937e281cfde03577f96c95ab2cabced5a8bb4bc0113a72bbbcd0c0d73bdf1ceb62c36c7585899c7968cd2647676dbfc8f0002a142e5c6cd1a4c8a62176d8ac8a942909b9d385c49ad52eb8a521a7e97e2ac7e0927172a6999818d41e8ed297b705d0e449a7bc48e5e215813209b76d1bc2425327af2df238e1bd84ae393b38b5502f44893ba479bddb39fe135d9c14ca9fde4cd3f70030d7dd87e2dfa38583a19d837752dcc6aa1d5b382c936529d5078c15ac41f49a2fa88cfa3d7ecb3826ca1230dd99492326ecd03b04440c89c0548343951b550b384c03da6fa7a419129f31c80834b7e7d87220792524abf40ac835929484bddeee6b7c1c4c57dea9249ddb36b67680151abcfeff1fe320a7b16231ae0ab2096cb630c5070a453ad43885ff6357196b8251f320f52a6cab8a08062806ed19be8c9424c515cb3bcfb6b54a3c99e7d6d2dc7317271cb182a5c9bb9fec6a411447b7ed4ff4c9476f74dc9a06ee42f28eedbfc6bcfe384e4d9c51a84f2d8105827cf887af537a7108b7f0fab458bc3f779ccc2edd9110fc56e7c9b9eabd859362365659a5060fe65b2642a734ccc27eddc244a70cd003b11616b9d07fdebdd638294563931f3a530af79b312543ae0037ad3050746c17743dc817301eb0202c6210817a33fb03173a77b9c683105d18cd532612112ba208bdcc949f01dbb384597f0e4cf8b0804dfb7deb076da5a2f0ac2e00f76930b3ac3cb8fc90e59b766ae537e61c70c11768b92b7c0d6c921432e1150ea3c040c02def37604b6f7d9dea296dab2838f2fba1394157a91f3c517dd00c09e362c702875210700d6b5ff46c7eeb1058eded4f70155632128572652f272ae243bfa346fae64d04bc944255c896a2baa7eca163826fab81e3ae3a2b3eb8a27275bc68a88a97528bb34eb61c3d98feddb905df481d88097a8ed93503f4df26a883ce6eb9d25f61e744307a643fe4fd732439fc0703e1460d6d4aa7c44b12b21b9b7adff7cbf5ce3a2280eac229d8b16aafdac49f87a1e1cf99af2968ba981c1149deaefc79109e8b82962c86637154e170e714bbbbb2917d923d76a361a80b110d083aa0a083e0c8fb9f404fa2e9087eec7cb15d0b4f28989926e605b5c263ea093e48e4b4f1ca77f79bd7790bd90aa75c5a597787c78569279a88038dff76187d7a4cc60c0c4523529df9e1ad88684982c4dfca400e1fdaf80e33051530780ca15e4955122e2442b9713accca09f879900282be5785fce2d44f2775187fce897868a634af3a4aaf5df5b7f3eeccde5dd490f6c28718801afb9a596bd0dde051fb234fd4347b50584b35784b124a8eaf638c23853160489b58203576382b97ccf724dd94ac37dc9a5ad3b99545ac458b2817ecb273c5ac9340dda5da5055df229d5d5287344b52fa2657630ccce80d153504a14621c2bd9ffdb9010f64928c43a17a81c9494544982106a43c5d5c3b272954e1b448902e452791013221ca26e98fd9e544e0044762a8d5ac298d3eeb56501389cd87c57b00209482fb5e81d25ccab1196c4ead80df7c41df4e81d873ebc537574aeca9158f3359aa99e9d4e43fe44c6887a747f021db855d7085d022025de868f1e54637d2f2b49c1a6807ccedcdcdb9f3a9c2416bff1b2b77bc89cd240558d0aff5282c7d9112d28de128187f09a88596e19e1c64dbbecd40a39d1f96e5e4df8a000861d1f7284bb8c71315a1f4f163d19738442e243e9ad8d227c2ad72591d52e01a49dd7d397b1e46a2084a60f8565545d4d8e2a7a24eaf46acce57d32ae04aca803faa03e865820d0424a0702ffb4290bae70309447bd18138e261486c9b174b8460a83360ecabf257be077b6b8530e27933d4506fbe668b52295b04831b8b5aa07ea00bae534492ebe91b1e57b155d7006df3649c8de726fb9a59429c91463089a08f807f486c8f6ff94d03d4e9b05e594ef4f823eba47bcc8c1e9037c4df1dfbf598e4bc3395d0a8fae5c5de87d2b345d983d3cbad1fb60b74293675919f6db320c8353dcfeee228547f7487c875f91c0a39b75396cb0f068b57a48e111c31785b2688d146e810c1801018f6a45a9bbfff3709c6f76f5ac223c3c628821e6d7482e9aa8e0be5f872712c528d188938f6d6f57bfe2e1bcafc8e5fe5b71ffd31042c84c3c1cd776b5922cd6fd56457878c8b0dfb6bd561b9c509ac6d8eed990e8e450addc869fa63a3a70f5afb3795f06eef6df6f3b2ed4d9b60eebaedfdaea3f033a3aaa355a6c1bb533b0dfbf536a254e1befa90d8e3666b59252bb53bdeca7f2f9ab1c9b7777e67dfffd6def8b4f7fe55542cf3efb94c8acfb5e65869d8fadb93c573ecf6d0c43c273e9c38a75dd7d30086a796a6a52725a5af3c4d4df8fdbab365305bf3362df4f029e2bbd23f09922bdea2bb21848df4ee354bf42fe37726b6541f8d58f1df62b96cdf233a244be19f6e329a6e8784675c8dc376958f80ebbbb9b1f2cfca650e2503fff6e0c440e05e8d98da819ac4eb318c20d4678ebec09794a54f4e630009d43a15ba166b071ca322a9088e3c4719c74f4cfde14d115748f281a2cfcd82c8e528a5a53f2f9a5bb9cde4977397b323333bbcb195daeaeefb8defdb835953a63f9214c3579aac93ddb22cbfee9def0e7cd023d262d68c1e67e6899bd86605bdc118cc01ed84637ca05e99b7d53890da162dab1ce8bdc283ad11023dd5d6eda80976dfc957ff044c8f27a3811fb0dec03821ef7d0f070fb1d0dcbdb80e70da3f4b04ebb956e2922ac6f9da5335808e49d37a4d904502d940c164e6de3afd289e634c001cad5b916e2d024cb947a87a917ab5d76153d5523acbcec2a2a63452333e56ca9ccbbd02972b2db0e6b58a9a829d3416395b3a57cb33cee2a02a345233146648cca4451c4fd78362b452fb8dfa686b571d955a4c3ad43365e7615e170bf6d53b1745476db36558e9ccbae16c8d0992c3c452c31b8d1090b317ad46177031b1a836c5b01c2f227712292a47f09fbd82d64041d91c41a2955b00fa741c61047f0700412972e5afd2cf7a12c26da043d22cc03c564e17f3c451458c585f0a95d0d45cae63a13d75d3678b9fedb14ad1b9e5c8fe2fa8f4b6973fe0b506afd70d85a184a202b473998a2832086d4a06995608beba90c3584cef86207d797ae3b8f5ff77834c515c06d18dc6e088f4811e208a32a3b1425d1f235967cb8e2f9cc1859aa38a9e2843444cb861af6d3d161570d45b7bb23126dbe06a195ad444b975d34b4b909b8ec22820221b75116b27ffbbf9fd55f380b2cbb6850736b6f599a7081afbd0d27fbd7dffaaffcdf19b2907e591ffecc1e3ef635ebe8a5dd46773443e812c5cce3d2ce5e6c76fd3d2613e3414fc6ac8494c464320b7a02c6832669d4b8665072c910460d3451b0edb9bb3b46ff52bb299564db618451ca5afdbb938dc6a30c55769108b67ec5e291d128167524f2a2d79f75dc62ef8fa8ae2843975d385cb95f8f0b9fc95c76e1d0e5baa218dd6f8b2d17519b0b2fa764f9722bc7c87edb15e2421f12812c5ce71becdfad8a1f5e6aa80841c92284275b5c3105cd176d9ab4206b46ff492fe43e4be6adc06a518f0b65a017b650a2014b16362469d182af629f0c80c1a284142f2d3071430b7e0ef6e1a73432e8020dd2152c6068c1d7611f26629c41030928c860518527aed1c20b4f2b68b2419115486176280324650a24bcacf1828a2120d04cc9f12272174f6c89a1ca1a65acb1e2870d2cb0504693295abcd0c48574e44242ea77cf7171600ff8a897ab09191c170b686ce09261cb85386a5cf82a88d3ddecd32f80e1e50b0e9e98d282afb10f37f11ae34b125ad288a28b56100b4db7bb1b4d3775533be55059e7ebd7857c6b6f904b791fd04d713d2891a8afd5b93bb9d4acdeb696629e9f37eebbe3e73a1906f6e8df36a9c475f6b9eb26608f7efb3fcdfcdc59eee452dbffe9eeec6f25a4bc21cde27e5232d88f9d5240d23dfcf0060e5c6b91667128348bfb9f8610fe929c87df44f0dbc8c6ab1e051baffa7e95ea3df098e0bc4af54c72de868dcefa8ed3a6c57eec544428c7c38138fa815a2cdfe1fe074feb7d876313468c87e2c24ed8da8e7282e69c93a8836413e174f068430a924194daf915e674411c44edaa89b8c55c0acd82d5836d9e9c782ec4e10046731b4711a195ef702f647d877b8a03051b140474b3e078ec94024ece635f847750fd9099f561655e381e99db1eff92bb69dc6748cdfa7115b0bbb59675d13a7eca5f3fd3027b68df1eb6d42c8d3e771aa5dd5d86d4aca6dd65481f900ad8a551d36817bb8fd5c02e42f876bf6e62c0388ee3388e1373331714a1cbbaec8aa1ccad5c02cbae18c05cffac724f9be5471deebc920525be2873bd6f5ef9298877fbda0d5d155277fbda546e751f6e8d536e953cdc3a371caec609f16efdca3256afb576adb0d63a6badb56220a03ea02bb73ebba0e470b50ee866df28d411f91ff6dcd7c9ff653f519c90ec3d2382f23ea0cb791f7ff61917849990c2a83ef39542aafc78247bff23f2b9fbb2ecfb231781ecdd84ccfbf8b51fefcf3e3f01507b31c60a272fb9e7781282cd132c74818246abff87fb700da0a45165073b3871c17d720c11c512951b28b1254deb880bce18eae18b166b34b5fab9bb4d8fa7b174bb88cf88e2e4c50b15670c41860e30d00453510db65cf1f2323119bd616072c17045f7eb7e3a17ea002716a3cf4683d54b59a854d1bbd9a38cddad32e2764b9410a44fbcea55af6268b42d8141434449b01831772fa26518a5de4795248f9679c31d2c7eca2c602485244528cf8f9f218fb991cba832167ef34d9b9b3616fe84445892254170c83d62ee1e311faa9c10046043426666c95e8c53c21873f0e00edba3ccb44cab1b676f707254366eac3e00e183102233351951bb5a4283ec10245a3971d312666262b2c08f9212f556bfa2d4dade03dd6964025deeff71ef2244022345c4066c5f767121726189a159e0c824f23c136e03b426c09f7d40378bf623b6348f674383c948b182c58aa7258a28434a0f6a08f1d0c20f5638d1fa15b00f08780788bc108c0b5f04117e8e918ddef7173e64923d370f4128dd2321c3462dc9c962411002ee8936f872a5890b1f478d55535ff3ba7bfa4717e3bb53aa75ef3bf1698742b3e853cca2792bb05a5cdab340b3e0673cd09de7e369ee895da20118c830420718ba500383167c48c43e405dd670410c4e51aa2052d30ae25edccf8961d8cf67ee047f2e4177cb9aeb6387d3edbbb18b092b412d1b4e3e4828214707bb3d7318d83ee705fba8ae9ab1460908db31efd4e955aebccdee537126dc2a04fbe66bd8b4f7fb0fc945a26adb3d5b0efa77f820a1bf04e945e5f11db6d8b4296cbeecee220d8b73d9b565091defb28b86251a20dc120447f1821e6a588206355881458f7e050505b1600362e9f2030c31fc8003991fbc5040961faac882c6f5f7e1c44d6961bafe10706971bafe285889a1c7c6f54fe128091068aebf92ee31c00d0207a1211dae3f84e2ec0a228ceb0f8bdce50229ae2d52aea3a0960b6313b60dcee5ff6892f651c0131ba87ce18405165bb4fc97b40f673183d394264d40e1c498964717ae3fd462e6fac32dfeb00bf4874a7009c2137098f2859a304b7049233ef941a8ed0762c081175ad0505186152df7b1e2480c443a310ffaf48964741f7e8b73331fa8957aee519cf3fd391ef6e43b1fbb1be23bf3eba4d4b19f14a34d389df51dfa379daa89e502e9a52f9b28cb6ad9b7ba73b261028b57506b6ede0e3882dff9eca9e008f04e9e5427d758cdfb56a88eebd86fbe88efd0b7fd5c3fbda14cb8a0601f45b9f698bc279b9e5bd449929611dfa1cfadf670cc24cda24b7c8752fab2c989be5c435f3e5131585e2d6ee14081fb7ecec39ea86cf21dfad18a8d47f46352a41f25fd1ce9d2974f3388fe1ca28f39d1c7d6d0a14b832ec5b850ea1da1b25152e09566f511f380ab49bb22cf04a8556937bb1f1cfdd903b598e0680f870426fdcc63c2e3bdeff8641efedce2967cf9fdb1b3ccc3bfb9c5138b85dfed4bd4be8185975d58b65cf8587cb8fc2d44bbf07b5469ec17e1a3d0d85415f68bfeec11bb9f76dd43b2e3b6960fc98e8b295587fe40d77138e0a3c3175ef5aa57bd989a965448494a5a727a4a0bf1131b1c22a3a3aea175e817727ac8a6501cff3363ccaf039b92a3f46835b4bd1acc8353d183689ac5750c34bcd89c32fa70c9ddb3b0ac94f40389e7686524598c7b9009835362527271f9b16986dd61197f1d91c5f3434a299d5ade210596949494a3c5171926a5fbb5911bf9916bf1270ff221e8051ca3999adaa99394922493bf7cc995562b6b8da011a735127211c6e5ff914f9269c564b4fa712dcf136bb562a23999163936b4e97ece0497ba3fc9e43e933659a7db2fb0cf4c4aaae14eaad41f8dfae991d572bb5bd2203b749b8928f52d574856cbd16a652dd3ed2a83185fafd78b939292601b4929e5646262624a4a4a4a92da7477ed3d62dc093a2eeae1d2376f8f73e36d6fbd5445b97fe52ab7d5d9663e7993cd16ac9b4fb3cd6433d9242525311313135307313837c90549e9400c7cf1d2d2ebf57a25252519191919c927f9249f98989898302ce8a6052003d61be4b6f7aee270f7edb0db4d90ecbda3d42967b99fdee257b6cf59ef6b66b61d5feefc61a7c20a17857aae53015ed4fff48c8dca82f33fed38affaac3d3fe784b19151a8992d9afb7597dbfc3d04b9898c2e2ff1434e02de92368a2cecbfe97a4b2335ab5b0bca0c0bfb515d43e9205307cb34ab09a2814ecdeacfe9e01adf790a6a96378e477da7536328f6aa443411d683cbae2b66dc8fe7892b60ac68642b191520cc26a2290915115a5c57a4745d8cd4d03144509a1b43208d517561b2a2c4cd104ebdc374356653c366b1d1afae39d81b975d4f88cad87ad9f5a485fb6d9b4a4765b7d51825a1caccddd75d9e73f28c1e3d9fd373d2f0c3208679237443d8c3eb8d4627d8d6da39a96c71e1471a5bb04455a0dccc879720c24a1739f8d06588272ab0c60e9c309931250a30b1054b54650b6e8c9db08a185b9092fc495fda2d185de871727fd259bbacf8e035155083b0abe070316c4c0f2ed797a32c9cb0b4e6538b83ca18d1f20ca84ca1405780a0a20820bccc113068590d52282cb4cd23268bd2ca0d34c82a697880f12374e7a1832c75db56c0681ae3087ee5c6efedc9d2111935c41e01de182f9ba08dadbbfb1066d484b1c20508258c00fa428324285c784115173445a12af6660af85793819f13d22654b9791feba3776294ae565c99995f7a1409ebf233e3f0e7fb95b136a3e2820733888a21cd3c6156ac62094df385790959204926b8a6f68c51ef30f5b269c1468b36475baa192333d4eabcdd28a576f59c51e5c16e975d422cc0c0e6b8ec72c28566c6e65c7639199335b5ae276084a8fed2658c537ab161153565dd27e39d9b1b4bf0307ec3768610d5c6c2ef1eef5e729f3284baf0a98d3fa0e06c9228d783a6a0a0a0a139a7305deca5f8e162622ed60319177be2623e80b95814173b7ae162bfa37bb88b3d8d5a2ee5b9f14e0e6b4d8a802ba744914b377ec71bd77f0cda03836ec4a08c225a0aa360eed0cc0f39c03086539b25d21891041550347183972bd4884e628c9a9457b786fdb6eed1ae11530d7478c10e3a2cbd0ed75f670735d7a970f190c40f19ae3f09fe2548a97245b8fe940b82e50c946f2b6e1b6531c0ebf66356258326437c91c31a2a3bb480ba24bdd024065b307db141132c6ab8107572d812a4bd0ae41e51d4b8fd0e21874103931331b0a186354a2da02f4d723085ca0b4a52b858a0e274fd4b20d3620c70fbe11016638625ba38e30b319ad8410c2273dd05908608307ac042c50d572c14f65bad5c51b45c1d940d2af3537ecb4ff92dff8a9f1750051b1a927c7e7c90b1d8634ffb7dfc94505ff3beffcb7de5de78467f4c4af8f18d5cc7de1ff38eeb1ded7b43797c8f0f3dedb5d734eea34aa4d67d7f311cd8ecb19e8fa7b8ed99474231288102a2e1ca1736147911e3420d7a88230ac72c4d2f52605da6cf98b9a1482cdd9bdb4fcb7c39836daa1c4848b9f5b20b8924eea733c3d4976c0925f4ba7b24bbbb8ca8206c7c671fc93bfd1c67c3bfff0be1fac33701ccfea7334aad5dbd9c187dcc9b37328f18d4aeda9a2e415996650f7429cd2875212a8e0a30815f202981170338741cb598e8386ad5cf1e5ed661610c30a27c69c3430e2eac29e185170c8ecef0820b3088a461ca42092d4532f0a1d548ac91c351145e5c4a08b59a4d60d94584104f9788a6cb2e228eee675d4420dd1bee1122c41ac8e2db7f8347e0260602471022041bd883ef67e3040ca2a1de03dd0d2eb9f05d42acb9b5370cfa631dd0859d12bfd3835bc01e4ce6f260ed4544228f46484917cc8531c6086384114e2faafbf4ef76dabe8aefba218410c64821d28530420821845136ec26d88f7d71d814b12b9816ec08ab825dc1ae44a268148b22519468c43529c138270e4d967652d34e61c22c85914a512e614b10b02dd84c0bb69421e5c030c2ff6017ef53e23c04bfc8707cc51717dd14d98b9ca89bdc06d87951b3baf3a266c1c85db38e10fe6c9e308ec8e6d5b7da77d3c7ff94f4bdf94caef8c6fbe02552afa45fe30f1fcd7212de47cafb28e739dfdebe568371413a0dec411fcd9cfdd3e8d2ce0659cc6ba76649ca367eee759ae9fd74f4c90565800e90306a5588c397249d4661b1ab15f3e89fd8631e931ba1324ead293b1c28cc972f3d26358cd64461b1b15911b254e2210a534b76358c96770bc1c3c340da29d5ef949340d6ff506cf947d7e238fc9bacd88fe7484b3f4cea87dd4d3c1ee4b4460ec9a0a7a6147c073efc2e96086a79c792087646541985f72c84ff79b1a1a7824cc4ff6237bc4f038daa1c5b6b8891efc7b51c2a85b3fa71e3317b7747faaa006c3109416b7be62aa0d3dafea79f63f70f2b611bc356d6728ba58e6d33e35029cc52c7b69971a8148410c218e79cb08715b6802f4018563863524a297ce1ca5f21074f4f4f4f1853529c5472fd743e6a0f3177585328cefb58b71a9d7699d99c738d2623f8228a173938e165477276258d69586e961173cef946f865d2e43360805e07788b1e6e7c9f46731a4da369e4c3933fd12725806470e3bb64eaee4a0e748e6a014011b5875d96c1cc61577ffec6357c6ec3a86d224f69d90dc57ac255aaf3a466f9df74bee44ccd6a563b1a0fe348dec5c128f9cbc978196f6a963bf98ebf91642f8586fda2501cea1e2844938d1accdc510f6c805274b9590c21844160cf19197b0270db8e9eddde0d3b24cc74db3df5d5bb239e4a7947fcf9ceee2ed3e29e655ef6b3e3ff8050ddf71febf2fc98deb66465777723991bfd90a80860638cf1c78ddf8d356cf89fcdf9ce0fbb0f06991ec60fb320600f769eb383d009e79ccfcda2455c7e99c69c73cec99509e374d9c504d2f5b9ec6242e94ac9527a1403d6c584d1fde2fd582cf719bab015df1edd68999999d3889106281b48e6202ca5940d3733f13929a5940da59452cea0ca573e0b9140774efe13f8957f64fa438e8876fda5f447735d3eb3473e81dff9476463ff4d15a0470246d350bbfdb73d9e72ce391d624d2a3fb777c773e1fc3ab1f918ff00ee91896129d84701680526a8a7d64b79424f78b4523f94d342f15c2de716114a3d8afb8f2bc77195db3a6ebbe1b6dffe4bb1d3b679b10a3de1d1da7e28a7c5bdd0936ea17e6801aded53ddd0025a282616d8fe539bc78485fac15a5adafe6326d68fedbb281f7e395af7719b0f094f3bbbbb43941a953f3abb5321f431ef635d33723edbb0c1c223f355f7084fa08982c6654e8f048ce6aa30bd2cda7fec7d2bdc1bb4b4ffe9cf3aed6757811e5628b18356e6d3c5c58676cd0b6229885ad967ff31b9d3fb5875b34e7521c71eca052b1f9b125edadf58dc6f3e33539e73dea005f36855c438a58cd1891b7f3e4ff7c8ccbc514881cc3955d6eee86e4ec8111530d89d7635ef483fdf9f9e1388fe8fd3f78e3fc7aa573ee7ec0e84140f56a759f1bf59f189b0f07e22dc28c28d9fcdacbbb3eea74ffde1f3f307a90ce774c782b07b0be139e79c52627362734a19372afc317247d9b365d8f81fbcde336f20c41738b0c1b23f0e512e7f8c4f9088529b1036026166f64048f1b0e37ef369f74c292384afeade3d9a178d9a953d7cc905d1bcd8ac8c1b00f3f0ff6914b27a85fd06f0f9b8fe0360207c636bd9c78cc628b28b4e66700699db5d9ec1194877298b945b53b19d680ead4cf6cbb9fd390c84ef26a177f3b1a8447a9391bd4726eea77dec1d316843a9b5abd53f8b95c1a1eb9fc4194dfb60ed789d2fc7ddfe537ddbdd3ef6f67189300ca47f03410aedc3bdff681ffafe7193757ea13ce361e69def1d55b91ae3e7e366afd56ddbbcd5d5e2d5bc2ffbf8d318d51e8b5149eb99830a02c65b92fd36126efc213c1eabf7e95c8e5a576d198cccad8f89c982c0962217a4dad56f3aacf6e132a439a76f1b26e66e18b6d14c75a99705017b482d979ba0882d761f4a1fd5315c81b1dfea4a29ebcb2aeb1049c295b2b55ad5fadbb793fbc4df88bae99d0bb2cd1d52a2e47c897a2953325551db8c461886711cc771b4fbe0f715e8c628dd8f637306492352f4295d29d96fb564046bf221ed7d24ac56d6663d59d38ef6d1e06b9ee51db8fa7cb046dd3fc6986559f6b403ea3491ddb9a317354c5dc23d25ad279aa5ac8337abda43cdfb5ae96acf5f2f65d5fbfa75b5ff6eaee7f1d55ef3564dd86f15ff334269d3102761a97eadab157737d5974ace05a95ab7a373b44efb50bbf9b8d1cba45cca5ed607ba5a9775dfa751a04b3b25f2623f2ea537ad54be5f3ba5b0eeee91d2e0767752f418dd3dbac7e8ee3146f7d80fd09c386084db1eb552999ff25bfe153fff50fb02da2ba6dba7ba0c83ee5ce23bd3046ed30161eb18da2897baf16c0e4e776444f442d4acdbbe6e1df7db0da7b2aa8a59214b6b16afd65a83d40efb74eefc25d304f1d647824cb04cfb783fbf69601fa8656a3f533f1faae91e1c3f1f4efb33c7cf876d7a8881dcfcfc7e814700c0cfef18b827849faf9425c9871c16d0fd07c95824fbc10a0296c2f99fb639ffd3b4e39bc385b6f1ddb66cdbfa56d4c6a536ce6f4dd520a80d4b6d1aea06e70a1c2e68c72acf818d0debec997a6303e1eb6ac33abe9aad3836af13e202c2074acc4a5a58490b2b790eb8332f312ebfaeb8b5cf400f9e612e071b83e309b1675e4bb7e7731dbc8da67bb69fdf4eeda3e3e7572b64553aba7a2367b34e362057b36d553dfb85ab00efeaeb6abbe9bade740008a1956cfcea3f7b6d04c0b3c13c5ce09fae1f80d1375bdd362f8bf75d37f4adeebf137af2adce1bfa96e741b874f364857112802defebb6d9ae7e8e0cd54286835e762dc1048adb525d7d1c5513aa39b031a80d84aefe071d7c55ae86b0d5ce72f192e2e6747c79bbd1c19b7135e3aa676160e9e3747c71702ac07ba3c7601ef33dd86ad76c9a35d7a0922c7cbd0dce84be33c9d2ffb64b55cdf23aa959d8aae3aee3d677dcbad1f1f5a0f33e7ab9ad76504cc717ebfa7e9027fb7552f7359a3bbf9b66278149dddcd8b2aebe8e4e884bf64fbea5e3e190cfa7d4cef73af8ea1dec56564176141493665ee654803bb8ec454e079f803de6e374504cce76d35934965d476cb9ec7a295d792be484f4b5deab77e643a7d59adb2e70ed3a48a677e67fc78d800f96b973e9c9520a07c5b5d04e59f373b44d284a1d1d7c3502e6ab38b8d4504cb3e6df3899988acbbc9b26967e2b39c13ce6671c5c621ef36d17738651ad560c64c53ce043cbc5b24b8a2bf7731aee3481d3b81a1657fbfad4760f0c42e7d72e47b366f6d9ab60addea782ab7918d599de11ffa003f05459e773a5dbcf3918e87403070c8b6a9ad522d866ea9e0f2ec12507739b68cbedefeb605edd526e7f11d190509ba7283121fb91701b4557cc2656316dd838a959d3ac32107b789b3be1c6c5bc4f0590c9e9724d5fecab8981c020ff9e324a589b2f43975d5e966e8fcb2e2f4c37499015b2fc91709ba5f34b9ad5499434ab95246916ca8bfdb8cdc76b92748f1218f4c37d78c8ea61907b12968aa572b740217c5d5108b9a2284a83d3a589218e70d005c90b52a4810a7c2d288514524821851490b4cffc5593657a15b13f787828e599dd92de694f89075c2c5cadac7d390f0f0f8f91d5cadae82dc77c44b26d3007a4c2cead59aadbf3c5d434a4ff5b6134c678dbdb22c5bccfdeca823745f68baad7e66b19e6314e7f24aa2bbd249b6fbef9e6bdef40da04b42a6b639583cddca9420c0abae12a910faf7327dcb8d2fb5410dfe5f4c0399aa11de94625d1dbf0558ee841e4c86a5cf935466963a7b25307f5a9e04a8f8ad91c61fbc3183d46e603a03e15747b01adefb4336442bece378f0f2963f75302a6e460409082fc2ae4570af58e7fad75832d6e4ddac15b3b265cb05f416bd5db95237273e7631c8673e7a41ad5ea9050b33ca87bacbd72c6a87dc591573e9366b9097d95744b922c3f04e3dd924e097b0047e8a01bd8aa5efffac1263bfb02cb3f8700a281c0c925cd52d24d0ec86a9749b3fc9734cbadd88fd95c7f66d23df0f2b8f295748f9516c71008f012179afc40d3cac8b40fd47c706695e307093fb8c061060e3240b0dd1339fe8cf3b34c0df5103813e83423760e8ec87cec37dfea86fa3630b9e620e79cec501f10963be58d0b416cbb0746efe826db89b8cb35bab923d0fe30baa79aa2ea9ea892d605d604b2c33c6982f7438e48fc39e76c189b2302e5432e02b45fca1aaabd12e9abb0f9cc72fe76647e04a684b04b659d1a85923842fbeaf302dcaa5e0bb4e7d64fd7f9c39c1dbcb5b3efec21678208377b0e95009617c01f08abbd094ce2afa0b5b4579d2027a07df4be2237ab28adfb8a5cfad2aa2817a9df748a0bf283dd9cfb2bfdb0e6cc87117241a0ec56abab7538faabf30c4c10e1ce8fd3e384f05c8ac94865a8f6071bb1d8f8904e6859b0c5ce2f82c50e911c47ecb3d71ec3b0dfb820189532c3718221f1b17f009f00053a2ee61da15f1f89c69d80ddfa182784d310a1831808701a227480e2d2af1a91ec3122daa59ee6a9fa62dcf0a3cc11c93cfb14bbac238ba809c0d1bf03e61b470f00add101f3aad0c722eac618a715fad843ee0140d70bf0311347345d257ee777172b4067c494d102184b472560dfdc03b80e94807511777a47e69f607a28d071843369a06e97a253398eb27bb8af3548ad4fff311c0ea84fbf7a368b3d522d167b8432f7554f7bef9870bf82d6f2577df5b913e4457d7313d0a1e5cf9c053e30b23f582cb6c2df8ed40d9b9c03b48bf2bcafc8ddea671811ead9c73c958d45fc5665b92863fb43e8f2044ae462f2378edd4afac7ce1e59c8394013c27331cc611852fec671843f5ff2636fa9d818dd392298674fc8e45b2a56c297b4fb2b14d230b2a33e0adc291f5a2aaaf7261b33bc6c150b1f632eae099ee368bb870be2b47138c093ce11911fdf52b1d89f9015a1df373e15e17ed8c7192c1422c20c4c602e2ee6b91735be85d2b31ba9d3978f31f3c85ea3af6194e5c757358bff4aa4b09b04dfbaf4d3a0d6ece610965d460cdd4f87f504c8efeb0580900904726f33fdef4dc0683261bc3fe98e3378b1a2bf6871fb630c68a84118471c65f13a2ac28c154e5d544943859a3883eb0b984b2fbbbe7469a2c93c1ca3a6c230851933bc08c2891169b4808ed00853540495971352b45806285cc5972486942073c40bc468c09728ced0a10c2894b0214239330576a60658371603a248a8f4ad364539e914d108000000056315000020100c874322914820cf5455b60714000d7a9e446c4c9649844996e3308c6210320611438001061832423343c302d36fd0014907841320fa0dbd9e30b3d42eab1d8f9252acf535d14eada3ab0d49d61f1d4cafabffbd1ffe9c8a1fbfe5c79f53e9fd0dc087c1dafe4672f5f9967473df20d3dd338a620b05e96505e41ed97e468efe58c617634bbd6cf59c74364577d1b4f0d367d42c780dd94801ddcc534eaf47cd7dc02460da9f4de39a01f3a60b33b6c49b4504c09eac4bafe249392752b59cd5a505077f4059d4283af05d68aa6435432825a5585ba59b8694c11e3644b4c92d28dfb21263d687a6c2a2c6b4e9989e555f8521fa6217f0f387504f9a6b36a4b4e07b9c8c109eccb6d914037d78b318b4493d59dc2d48d99b2cf03448a23a0beca49274527b8ad9f05f56b0470916f2631ecd662132585132f185a9e1524a666305125d13c5dcc4b47eb1294cc081c96471f2a3a4ae1bb08338a33ebab31167490351679e437f19445ea003e4af0a5fb8201d2a599b3204fa23cc05dd3d513f7118c843116c030f775b0bd12284275c5a1a0a17c0d0e831bad1e238c3f2e9f896afcea14661cd24f1639b88ca71506c53a0ac2970de1f8601bda2e846cbb432eb78cff038ca1d2e5ec9bcf3da3da532bc1ecd9d1116488bdf5cbe1a1bd256eed0496bd1f37408d1d81fec1f9220c7833f05dad89db00e574a27145b219d4ab1b15524949908b337da0ef6809fea3cad6c718f26e64480f27f1ae46859a8f5f703fb1a9e7f9b054ae1bf4e52e927ed473d01ac203e326068250a6937258f94779ccef51651707743574cd4d4a02e4fd194e812140ec2e1a523ce6b9f4af3dcf5542ab794638eb3fda8d18c9a6b26df6ef3d0204f2bb240c2c721234b60388749524c2515e44e32daa529058f410705cd484725ae70285d3e51564a7175ad25a77a1095850b86718e65b0e3987cf1d712b076aaacf15527d311ac43421a8a98f9cea8af0842475bfae1364af9645b73dc44e338108ace5df3444246f391af2c6731bb1ef6bcc1948fb037e43a84357fd8bf47004f2210c30be5e9c88350ef98541921849111535f744c3ae84f17406aa645430e6e2a341364dae1df5c29f889867e401cda50b500ad8444b21cdacb531b69398fc4cfc2e815c18484cc8e679cc02e01be061efb2f787b0b192ca185847e0e52523019d4d136a8a9bf017d568a9418b23798da2d762b63a41b208bf5ab421aeffbcffa5f3cbaa2a6a95072554ad03f5aa59bde190a067a50d47344af64b47bd4d063871734a8ff1fa1d5ddf4b8f06c54df62ad82c196d5549068aaaa5016156ac13ea29d8e6fb7a965640d4f3b49d10b0c450b4a67a4154e2f6b3a6a85a2e414450d7ed9a0b84361018563f6387341fc6c5a1964738224e6b79d97c7609d3e231aba7b240ce0b66d608489fde360394454e295d762517cd0b742e4b25c58b0e2ac90e2e5986db4bb2384206d383b90a5c2db6f49efb72434c1f1739553aa19c18ee680ddbaa9468d3ecf82574b60df247f2bfd1b9f340574d24d59a475be2c6faf5e22a3f113509cd491d4076ed16a2a3462d359c3a34634d0dc8f197f5527e6edd3d83938fd7b86afe97f313d0385316cf4e3d9234da123be9ce42b6aa7683982de5f49a0c00bf0431dbe8e33b8ac5659b21828cb571aa456f63ceba0184a8157e29ece9c033e037951f743208a76439070cb5a7f10e89d072ba29864b621b5529ea2296e1cf1c96f90fb29263c7b430914767a068190a4aaadc6510f604e10a36c311861053500c91237b48652d2a8f7a33e4fe14a07cc719c1ed7bcfea0ae9990d38b15dc04b20d73254739f2b5d5006458c51173ee0012b83a9bbb37d5341205ac514c6384d6f0e3701d0b922894e8753b29f1f572135355d96f11585fbdfcf131b9276a747e499ba0930ee727de488feb87d1027733dbda40e27699102eff080332127beda3542278974cdb8ed872a987e672ae350c88c4d5512f420c9fe2aac72e5c453b5c55aa7bcd878587a9812d2d7970f418d6f2ab292d45548522c634ff340168c6571d5203b2c90b9066f01c53b46349d3aae28cc1360047f65d61e977a413446241553393f5d6b23e294356b89f1fa72466cbb0dd683d295ce2a2ad325a2c4a606bb8936c18346e7b4218e5387e9e5126c7fb3dfa27228ab46bb2fcead298e81145b3a52e66884d8d3bce01da6d734ee9f58e8ac598bf0fe7f8c199276a966edc3a06fdc0f2da8505aab5225d40cee5cf24ab31629b41e93bda8a87e0a48a6d6bcfc78e111b189cdfbdea969c6358e20721a2dd03948a4c51418acfa245f412342fc3b1979cc0241f2207d64621850f541aa27f9666dc5da82b3cd1c99435e0c738252e23e11444dd1c60f9e848e329d74db269710b4ccf8afc863de4796ac40dc1daa4fe0a79f661da094381e7ffd595e8ba083c4ad15fddaea41db81f924df7e66fd0d771a57ad49d473141034fd6d07429157c1a09ab7f06f6d6a644505af59f520868b23c3da08861eab269af3a039d5045bcfe83bdf91fac4c93f826b4845213256143d3076fdfe013c6db39e071bd22bf3351edb857e4bf30fc103eaf45dfe041161b5509e70e07800d524a7abd0ae5e89f59e5274762bbb4b3c2cc6be618fce08375a395e6955d75a542e15a377391d10e0edde7af80407b58d49a0c2bae3a14675c1916c93e15146873bc284ae033ed733826d1a5270898e530d243046a3cdb99bbebd1b2e935ef04ba2114d57d01dccc764517986c82cc0ed0f7c6393ecb6aeb03eda8a23ec4baeb2ec8825f647bcbfb5f5203be45cff91880c67523d421f5e7dcd2245d382eb6ca955639db9f79dfacc1e20ce4626b0023a0b6301e6fe72c845a9cf3f3915e449dd7f535fc435e7f1220736bfa41ab0da2655f28eb553c1c97321823cb5227a9c90e208b7c40c2f321da047687784645764a436a93c888875074b8e0ec870d772573ad91a53e820baf2aa650198df74cee4df6f1154c06065112149aec57c8af0442d895d10ee9797a8c09024986c4cd2d6dde720faccd930dab07cde86aae3b63753f708840b83b7672a64a9cd9bc97910b3f455ffc263a399df20ad77f475bcffc69b3c6b10b325db545329646ac316e99116181435263a39dd409d301235f3546df4e73ef916eb16c0a9b1f0b9b28d1605d0a35716019abe7cb441c472322c6d205fdfde56b18e882f8597fba2126f6b1d117e9ccfd7db85d4e24fe06f8ba1ef04d87b1b966f3491e9f3dfef7ae364928e1d1fd3d4b44408c54e36f0e3b79f8a85567e96200d1024f81868de26f3d9e40cdc30421577118275d06da77d9601ad6d963fd4b251c6cb3867d4a875de25e63350fae9ea25d19554b1d8356bd64d182f001b957beea815c7297bd23fe67d321add0482af0b427f318297c989528fa88e45741fba609a6517c25c2cbda75b7b5ea690d63765e6d48ce7131e97347aa57116445c7b3148766a647fc7eeb856680068f4bdd45f6eb6e3f29272cb132997f44eb46c9469c98f04ce75dd1e93615a35363a41d010216b4b47afcc806fce3e2ab15a0598b1e7acf7bc4d097cc24d760213e2dacd01b20741b5e8a8e71235f59b324ed14b79cc50d9c930227403e31d90a0fd25dd192ed48578da478d22166c1fdb19a62b3aa0d5a85e0849617db46a75ffb658bc4ddeb24c1f272950a34b954fa08544b6667fc862fdd159448652fc5e95f6971d5824f1c8d6f16e3e60802da209b500680365a5212e13c10f3e1f727acc7bad541b60a1738e031dffb04f3234b1c2784a6286ba0429c369d9697461ed4505e2016ac8dbb03a31c70598300f708624021024ee123d5022e89050f4271728ab6dbaa16b9be94dfe3f6a91882a88e2d727e9139d30f88c46ecf6441abab07774989e810cd59b920b511b3fb92f5439fd64d4e7a96af68f42c41193e688aa291d69e46419039c564e7f5153bbecdee27fb04e11c9992072cf3112a9e3b312363337ef1a34291fbf3ae6f1a3e2d83062deabe5098dab65762dca133c5c2ee80bec04a658cdc283bbc172c7910d76297998a48e692196e791302fb7e5b95b4ba4ae61a21dd01a5fd2ad28ca97546d2cd6100dc1d1a18e9ce89073d3ee98e2f049a61d5ba1941712d601cf0b418de668a07b0492b265d315ded11411240d7057654f9977025f631e409b97271506174b883e5a7f6d29c08a83754b904d1ba861c86cca44f2d6d0a43928895dee2165dc221c604e8a5d5b4b00bd13b43e9f0e35eb2862890a0bcab352a4879268918eaf9c5c2413a0cb7787f66b42c26ed642fa1ee7331eda7163313f8e0ff72e99e1a595f400749b8bf514705aa829c4d13c14e04022ac5cf8c33351ca201e8a3571fbadd41d29cc2b6be87e17e26ee7f3ec6dcaa5cc1bb3ed12954fd3fc7853888218345ddb239ae60815bc60a97312c2790acd7dc25a11c35ee944b87dcf27e26577b346a579e583493838d5ccf6e9acd8312a99adcf2b8ee03238f03a69a366456fc6a28402aa768cec389ed063d9505358c23a82009897a205053e09ab0c29abb85f42d66d59f832c5770ac132ed5a5af2acc3ffb2cef39b91dee9b5e4feb883292b40b3675a2976161e5f0fca479052c223701e0820e29b9a2155c66cd26e1256c9171e8752a7fbb89c34146a750843760b2dc802146cb0be219995fb0b38867c021949498f297f9d0b886bd536f177107d7b7c8498554b3c7f426188d2f12cf04b2fa1a0dd28dfc08ceac472a89c85d410fe872aab3528b44a6efd8e2a71800849204ef06ed195c078f6b79736f45d6eb2c658032727f4dd1ddadf3add52cc95866307fd543663b5d20f57eba423952258e4a691885f3ba7729cfd20d8322386566f768af7e19697c704efbcbe627321be9bed6824f91d87302766a356b27a224ec24875388550a4436ecaa69baec5573f1fd79dea071ca8bcb553d8cf0d3b84a68ca24035b5939f9e8860ddfef93f9b2bae05e8be2e7c6411496825624cb6d8b3048107c18dc09c61bd78e9187ff495459588fab20b8e2af8bfb77fc8b8b0eb29a42ed421d0e7e3e41ee9265f91caf6e7c996485100fd7fdb9fdf6093782ec397ed9c631f94224ba81f0cbd33d56b5e46055a4e07e310d4c5b91e1285d64acdd77aeb17ad375a01e87e9afa04e3786abb7d3923846fb422cdd2090e91e97a10a9c8752d3bd01f257d2de6f7f4dc381ea397afe6cca3f02f8bdafc7fd7ae23ce528cab18dfee8f9ee386eb7a0789369e892c295ac40b37eefb1ed0d0838520340519cd1df50d50b632222f3e0f11e597a8b8e82d06c65223094dcae22ea46ec8afd2090ff618401d6bbed7455a9aacce102682a1c41cba6cd12bc775048605991a946f6cebf8ffb801bd139da30b32126df3d0f299020f5eb519d7b8f6dfde13f036c326dd9f4d0674e3bca034340a4a0b8be6e88bc2338a3bf3d2f76e9be2fc408a5f34251989f5025883fcd2c929a0f4d5a7dee32d075c05bdb58d79e8c95a2cffb0ca529c2b11891dc04f82d6fa9fe7263dc5efc5b5cceba1ecba68d4a7c7282a6a194419ecc450cd378277018a4d0556a3ce7512e4793b52e2cd9f5cfab4b708cd5dd51909ed97792f5e5b6a8e3e000d4570851c7864f340f5c8b9a685044a6cde8e7e861d7b52885392f438c32ba1dbaaa2cfb2a047b1478e55c0e85eaf92104045903d01e6731d4b8f422937fdab6887eeb261e8b930991c1c5b956b759cb44d63764c39546ed7a8b99a82273a147ae4483a63f08d56e852bb8eedf3a36c0a11e7a1049191ce66739840c3ed16f66109188f06fb23b9344977a8c9c4cb6d035c8b455426a5a73620c4b1d0049a8f578a006fa24ce4b6c24dd832f03ed6797310d242fa7e14ae46a8ea95eda89997a8465e833a2ad820ce686b6efe6dd458c24ebd9078d56969a8aeaa87745fa7055a711489838f8863935958fccd13c1b0d8d07b34b25c44115150ef5582a7b48934dfa959a280694a71f1af10f7493361b275d066fdfeddcf886a469fec11aa89cee924d87e43485224a8945682783848ae51fdfe4ff41b2d46a79db4c5607fb7ea54b6c8aaeb41805bc1e66760b5b4d88be96248ff455146841e002e0ad788731f3dd8f8a86a960228b14fa5e61be3ec8070baed84919faf5377f5a4d3ea70655f4710d7cc010782055160b291e52f2cb48e1aa4a50f8f9daaf5c8f6286f42a503839461e9f47d05f4b9e948fe24b0366e5eff9a5788e3fa33892b3dbd509a09c2e8d04556a1bc55d9798ff49e735ad886c009b5813b1f25c30ab08fc45fcbade83dd809e6921e88f448be65161bac93aa9b828dcc5d0b216ca684cd033dca44113885d484ff8fcb942ad4a8b6b7a8e9342bfbda2604f35a12f25cc6bba003c41db424fbb4e184fa91002b2967371603b395c61bb4e5b82147c6537d249e55817361b73ff3493fc3886072b7c8be7716bf746989a949083ed57f406fd20abd1b8a0616f6455cf4f9f5d632c6fa490dec1212a21dd03b1103023255bf3f87c503844d08c0cf1591a0257e7208488cac7f2f57100c2791327fe02d106a4fbe7e04af80dce774654030a5c60e12fa9774479688e52ea357e3f61a9eaede1dff2173f6359768fe2ea81279f44abb1470ed205e58a9262c9c763823e5339e4fc7d3d9aff510b0733c06f64ef6fd1d12d95b87a53842153c8144a138ca2958b4bd924a46b701d70d70dc29df7a51914b0ede7a374a7f1a2e6b4941b526c92127a0b3103e7896ca86a63ad2d0384b76513b528b69f0671ab8bc279272991053e8f0b81dd5b9094ec7901b390f614077030c24efd61733b75bf9c8913931a22494a70c6df5076e60d6ae9b5ca81b85784658798234d69501b02a55d504ca4b1ea19d47cc78c783603f255fd8811cda84598f63ec2a6901c8cbf67771912daf12abf685e8093d3dc9bd017f2d1355e86b78ff5a476aa58da2e6d03a32fe2c6fdc062964f7f8f3ec39b6d79343ccf5c401b48e0054eb705de68543751d864167379cdc02e43b5e48423d46280a46225522ea63f0760e0429ae2f6fefd71088ed922d1c9068dce4b86ced8ccffed504720d7e58798c26ea988741165ede62c2be5b9a6077de3b562c784cf8eada256fef183497ce92b1180428933c75e842c814d721a54f1102b07170913dd667b95efecf38d858cc6d007b03808b3e0ad284b6fd698f4b0e83ca90b497386469bae66bdb0fb1a60b6827f15ebef812dd6329552134017cfd1430df0844a88cf428255336de9a2481f0cc8b1e5c074b8ef9a6461a8b4ac448ac4afc54cd8f0474af04e3f620b490dbd08a3961c974a8f8a29fa9ea854ac85edab771ae051468618ce09759a029c1cb384956d4e31d79737de84e9ddd639b1ffa8d6a673d2e70ea37641d16cf7d1e01bd2416a821ee0ae86479f55aefed315bff05f27354ab59df0bfc514db4ada8159dba88154f04e70e50c82f409be9172042eb91d9a51af8293b4a32868eb4b8b89b343d875e179a19f89fd10569a52291536641158b0cbf14c4f3739ac8abbb89890e7ce07696f16a53d22a2707db80cde6ef8a4889fd886104e1bd587431eaed92adbe8135b3986cb4f2fe9381b74039d426794022ab9e2b3d0739ffaf06f9a18ce98e3c594757212300ce471130c4c1da3cc099dd15de20423f809eb44b45b1eec813f17343414ecfa6a64d5759fd7d7c4c7f75fe23074e718139a7add93eb3116986a692d8adc4a5f47e8b65a8229e5a3413c7ba223c2498541917454dbc9ee0aee704e129e608146d34024848ffec5392bd88cc40cc5a8d106632c278f5d0f357ebef60f74d78b652495bb707dda7f3e773ef2c520ec61822f76244fa72f7e837332a38979728e43a00eee94e5338493f995dd56667114afde5c3ef8fc6cdb0d00590737892528e513959e5328de5bc435bf0eeef0c71f9c545a65d6119b345828d013d4ed224ec3b76119d338154c47cc57d44d6e80352b5de74090a88aaa137f6b3a5ce0aa8d4ac73b504a4d1361044e1be3f4ba7bfd798dcb8ec56f562c508eb024ad2a928a6dbc4785ca22291338d1480a2beeafc8e564c66b9bf5be50a640313f1651584a330377b73c72c73dc6407ac82431ccd6c8b3a953829e3ed3b25f311b674dbfcec6e1be308e495876e3afee2ea8ce6eb042a848a910493656dd31891a7bb566479560f551dab0ea6c9d096f8c7968201e356bee9fa68e14659a63d3fe503db0d7537543df84ae0b68bdeec6446264a26bf02b3e38a994caac2316699455d7d0d880b1d213a6acebc30aa27e8c2eaffd13eb75e3f2b9a5657862bc164501516eb94439694b5853e8e6a4123673405635aff179c178c812022308baabcf983dc1ec0e9426c2599e42026de556b198a0685801484d5a28c02d8d5582b98e1b15dc1e650d2def53fcc668cc4832c4a5f3eb6cc814f7a4f6c23d73f92f7372bd1e4a9b81faea2f8a5bef9fd96a44ca0085a6c9ad9a833326c559f5ca9f3590dbab78784abb561ee870fe17fdd708bd5bf52f9405a99faf51d93161732b81fb62d032849b44b5085531c6d00ca5a80bb56086b851e250dc0ddebbd067d034e904dc17ef794059fe17cd89c5247102ff683e614340f71bd32db19884de7bba403aa02f14ac38af62f5279a561b3aec98acc6730e262bb877f61489aa9cd460010d9cda28418c69b1080c43c5108f0380e3baa6a772706592ab4eb45eee5c8afc2be477f6d44faaf46d49901f06d834d6b6cad2274fb45ac6fd94961ed69fed9302cb5036a349c104c6b9c61a6a03aba3fae5758361ad04c6bab50594990e9d6664ae5e8e436047b3496054fa42369786f55041dfea4202ac0cd8ea522b116121c4bd5b088d1969d13341312fc36b670b692a8f89fbd03db2625470e48e87d81f961188ff7fb2678183ad67fa0fc17c32f34783233dc8d8eeb85946eb2035d8662dcee322b77237f5c729a9234821b48e2417d56fad52291f407e3bd07676af5f031e095efe0cd21945892eb911ed0f7acd7c52f6d70fea169b66d47ab72ef7376d3f09d9928f3e8e56b2b665b4beeef0d7b54b722bdf9e09010df483e0eafef4227fb526e82c7a9188129064c8cf59dc3a04ca70f1d4f74fc774fb2a842ea67c89da82118e408a15aef6729dbacd2f9b3a160e6bb8931b4b9839b55496f0a9b1f01702208ae277aa047dc9b4dc76370590c6626f6340ddebfb8dbc7163a492fb80bf44b6ec7b5560d990ecfa479015447dbeeb97563dce2642088d16da3fa2690569e9b314052a6df9e6bfff10b5d47a3fcb4ffd8785deb771d07d1ee8e5ac1068c5e6143ab1a8dcc9b0cd03ecc294eddb8ab0426b57c588d2ecd7cc16cec0aba5f9c775ef6102c575e1d7213761e3a9ff94d1b3ec310abe862885eb0b911f39c3abde4363883356b11688daab0a25d0d0836108517758d5f1c520a01f3183c8b858c8a56741f3bc583f3f4250c285ebd5cd2d631e199c290c521cd170949a0ad635867acfe4e2519ce6140e628bfd8efa26825390dee3b0dc9caf7907e917effed753ea2b5f576541d4c20f3f4e025f24ad721bd5b6d4726b1af37d2ffae7071a717d37568f3ce5cf0aa8bac07427216cc3a644470d8b75cb397cc0f50b87f669ba0130dd3ff01c16fa05d8f8d3096540684bbc66c282a6bcda61a78878d1fd326fa8c3045eef470fe53786c96879ffe30f6f09f2e0feb3811e1acbd4fce74b65e64b7c505eccee0ae13b9f0da15904dedab1ce07bec10b2bbd9a4fe707970cbab5624d10cd892d39939dafde3c120a13eafe757e74ff72e222a77feaf7bcdb6c9d77cdad7ad426a2ec94586400c0e7c0db73e7a382818c6aac6e00193939ad0b5488e14831ab281ae8e5a0a9d57cfb5a5cef202206c90d712277d69128982dfc9423712a6716f80328b826dc2ae61307c05eeeca60ff25b8dbe047b01ccf4e98456973fef9c8427bd3b2b0e0bc37ec50257ea7db2c57ae893c0d6ac3f4b4f3b12e89856c7b2a1e92ce0a3ca15852c57144d4ab58f9b9a9aa3a2673fdc34dabd40b930d626a8f8b2a160887fa3dc7f55b5507cd425eb6f2b5a5ee3b1539dbc2149bc4e9727aa6dfa68212995379c5a2aaf5f9f16a9a8b0a628d932e2c9e4e1027358d8b79048a8345318467aa0755161094c3c06017c8c7854a019aac544b3ee86629f11547202c71959b81ce87d81120fb8861a8f9306709aca794b05a2a520aa148613d67673e9a5f39b1ab61f15a5b0ac30382e957f0e1aabee2b42f5815829007dff876e3b06391c1642563c22443f2101c6225f5e143277595ad0e1a4475d6435ce5c4e9957c3cff5be4ea34337ad28b51ef0a08e2d48834d499ef86c4fbafefd7839f76f5ff04ccacbddb15bf7f7e650327202a3cc72af5acc4082fac940db0b3feccf7f2b90c874088d70a06a497281db7f90613d8cdac16a6bad099366e55bb56b931e3d7230aa484eb15a3d92a0028e5ec3aa9bac9d9cc2e25741b938098a357a7b9a4dad161e14d6d1b1b53ef009abcdc02f799695dab7a4babdfa0113165b60e0b03c42a150d962fa28b37eb9dbaa19f80f414271bd6f56cbbd129132571653da39ea9c6cb3d01729551f6e43fdc0abe6f7e4838e96908e5f93d477adb3dd5bbf5bf9dee222d703c2ffe415b4550dc16474669a977919bb78cb40cb2c5e4daf8713e98c8877804bf4b12faef1de4b1945de7c7d1e408c39bb52bba6d725a11c1643d9251ba5b015c61e56397fabf137cd604d0cdd707645d2f697ce31cedd069b110a8af71841a682261e47b4533f139d9ab78e38da61986a703510e9fadf90ffa4a17517ff552ca15f154f4340b02307ed2d09d6d40c1be97b32b153728e2108936e02978a25a4f77d4868bf1b09076e71804cce2801cf88aad88111046f87fbdad0d920f649a25bbe628f5092d241d5f31249fcf810dff9eaf6302fffb5d4e58ee8f77990a2fda81c00d186243beed5b8d32b38062e0b9919c707bfdbde3273d2a80535e6814a604d87be884435923440c995933e249efcf74368ecc6994651d3598ba8592b315d25038c63bbee6c15c71420007298afd843db05930ff0853f49b66f42c6e9984508a5efeedd73d1d5d485db9da836677ddd84fc643306338a9f6c8e648a283577b3cc703f65a564fe47cf5c24d93941f73fc3698c35d02f62abd7b5c1aa12532dca5b41da203e56db0512787258ce2262e69906ff3c993c3f007c9acb46afc0389b3f2b184fe30b1706c47f9f07f1f2ab800d42b558c684f603d0301d2d1923c148e70fe922ed7647c5336fb7475a3ac86ed55d634ff2a91c476a23a7a88f1e17f3c646412ae922ed51a02357756102765b9c576fc4c01b0d1648a8eb077794a72aedef30e3f5524efc3dd362bbd7289d75986dc7334466251635d1eb3e107211a7064d190feb5a64c45be8fa9b62f95e9ca0721c558b5293407487a955f356157da9ede2cabaf8ee399138c11b64cbac46e16e6427c237d1bce9161b53907974a26fb62a88064424da6550acea24228dfd734d43c10dcdecc9fc241455b32206b789880a77c99400ba13a154b550f06711e1ac4e45ce43a25782c3a9fec725de5a668349a861783f5ab3d7d3426420ebdd5eff4dcd4bac7d4656be18e1d6b0bde640c1ade8abbe533b02de9610944479ab870ad346beb16542b9f20bd61540541c8397467e753523cba093a43f87c43bfe07054d5b41c0d513f1e7fc98e00c1a056b6763741ee87425a7c5871ee9748deceadc9718775d8ba11f548b4c00e5010f251b5e7aa2670398d43aaa99e96802a1ae742e7d22a4a30385d46d9e5cb3999beada599c62f4ab8e8166ba6c6b3aadb40f9f2b53a2bed07bdb37abc1525d9cd42d21bfc87ecba2cee825adfa85713ee8f9e189acba70255f9f0fb62fff6652035f0afd4d3308972d242ec385f5c297e12f3a6a6d9dadfe37fc03582291ab9d37e7330f2c80b120ec0aa58ac754c8fff4b713162765372a9de6ad28091a124e09c2a2cb38e02864a13673f1f9ed814313c2c2afa701a9d21b378feef12cafe910f70027100d19abbc10ed5b6045558d910697b8862c99e0baca043ec14761e77756e03af26317bd31c18a0113f73bb47e986dc21b6b3a86c914c9ff1288f98571922ccced2f61a810c85578374671b9ef36d9c801febc063d71511a50a4848f60c0089f1a97d8fb4b391bb5c2f3b461c4acfd28c289572f51101d0330faa2c76a9d6479faf9ee3d953bc0ba6c053633deda13efbf63e2c0228a0a7cb3e2e10f94c2aa8d8004c8aa08db89aae18c82ce757564b87c12e8fb2ae66badc61b8d0bc5f54f6eef7f60ab4e4d8ab61d62e93adcfb6678b01da028cb1a651b2cda0e893e9cf19bd1eb3974396058c572a20cc24d202bba5d043f1a36d1c2b09856e270575f081f9505ae2655f309cf57b02c71994156e9b50ab3a64ccb608135b43fcd9d74170072f626d67bb70218c823b580e80c048463676f522f3f07faaf1b130245c8fc027e995282d715e30387360a8a0cba2b3667c00fdd349564cbbb64561ba07570737c7aa56a601b9ae1b20fce8e8842278e1747de09ae029e20a9bb2f9f7cc5d41553cc116e77025010867b4a5498c4ba9aac7540f1d5af2894373ce4a4f6f4cfca6d2d04eae836228389b17850b025a4386a6f450f0d83988d18d2eb9519b0b915a06f3c660375647d12ce9dfe8c3bea662209bae5d90983d405807597801fec030dcef5d9e043f96e38069a5f0773de0c900631a3894f981ab0d78ac73860d5ee29c21c7e094dec9bf35641b8781bc236f0b121472d9f264368826ab3652561f9eb992ef20809c725790cc771e05192234b85f0425331eb2ce0ca98606fe87aadcfe8da5102515a76051a3e22ecad3daa5dcb242c38dd415112a4461c245f6c77130179ad87eb0ec0e17c642c7402f4ccc2e9551290a9e4171b8c15ca19ef2394d9378e317a0c789fe818c00a03bea6cfa80f0034efb5a88269e45e5519d9cfbcf121a0a243a94c05021515eac132ee9491a6558f6c930180e6401639238b69638fcf5ec8b341f95b7da6e7a1f55b8c7ec037d25a118b1a6736bac78627013192b9ed2b246a99680fbb4f09f52e509df3d4431841c7e1a2a8d2ed5b1a6676c178f6a7641408cfad7fa2a49e0e5a23e345e33c3a235a3aa37e1f8bc5ac1c2549d454541aa7a5c8f725837db1eacd30ef8f75f1d62228d6b9975cf9ba19d4b78979ed0cebd176421df08bf33294a272821ebd0bb9b0d6e06bf40f80d013844e6087547f9b4e7b8e9bb328ae1f136762b2ceb02ed428981b1b751f500b43c8e4c46154aefd1a4437aa8f6b706557eff43fb9c66b435c1da9a79cccb0759926d4e43d3d1169510e69216bb0819a155d5f008357f5a92c405a6ec16070254507fa15cbdbc3487e1133ec23dca3ccf612ba603f14c5475417bf563f117b2f2c252622ff222b8ec3f660244922a5429f1d57fce093407ac2280d64a4a6bdfd39f7234d65f3c4ba0906d20cab69329e3b1ccd9ec2ed6afabda08b15183777fa1b2e69aa6254af491739ffd1365bf94e524018ca47820eb17f9bd03a80ccd8870748b9ebc899cf7a94efae65612e70668dd42729befb0fe10c107277fafafb7b8560a26df1c31c84c6491e9f343e6f4e49fd61810905f7b36b1c0d8daa7c06d2ec0c2914d2233dae603e85d1e633ca16a27f753efb96d057c94dae03fd010591708064a22fc0c49e66063b30aaf96cc55565299b47097dcfdde6215787b9b05473b35cebbd3856349b6e49e6264157d78f01a15aec04f46b95740f19d4f5da311c196e801c49bee98bbd9eaac0f193e2fe81d74a04b067c185eac0b14780ba0308577b2b79480c2c512081908ab582716d2da5c4e7b6c63875fc3cbb7e67ecc4ef1d6808bc42fa2f9d8f36a32c3c3e4e611054712dbd4de64632310329ca46d57e96e0841e1eeaac77d7f6d35671069c56ead0dec908b05d4ef308044c3d432f393df117cdad4ad3fea7f647e80f0aa78c578721a61346cf17c227598a0952ca03e097a5182e4daf8534d8c2fc84e7bb0164790a62b3cc33dcf8b45bf5d04f4c55cb7ffdefe004a418a4badf60a89522a45f17c278f1db25955a06ba72c7f93ca8bf16dabf76191c60a9f782a17f4fab3be9c392e69f479702bf34f88fc11da1b6717aa308e0b2c0b158fbcae5b9053e467320233053719f04abb028bda997285b4be89bdfc6a06b6c93c14dab12a893c426364aa4291c523174cdf5a96307c6931869c6bade5172c91e4fe68d992557a7f5c02736cbeb0d5b4775dbc52b37cab9a36521dde327709d27e69043b2f129d98f34038972116ce5088ae4a2321014cdb48e8107ded7cb66aa0f4b580cdf6d2a7a2790a44d871db3fbb7a3a476b03b9665aad4eb2a73febd0ed4e6d9564d06a971f9091b0484e97babc5a4e07f2ff395f72ecbc6185626796e6a6d9a4dd69652059162dae0c413686822852fcbf2f3d9c91ac9c97b46e52f020598957a496e3c2d7d27ac8e53007ab2ccb1eb10f2ff33a81f55361d79fdb901e4b4e26d85492413dde5a32125c78538eb02ebfe443499736d5c1c4492c19638d66463c0e12923748a8f6cbbcd619552d105907a6bc885aa43605ed7a7cc89eaec8d4cb1e0deb33bd9634c6e9da5ac568210ea52759149772963e844ca4b2e656028db0aec4f7e718a8f1f8dee8b9fc03b81d64b60357c6b00653b8777ed34fb1c6e8f2fb5e1053f2110c86758d1d43379c6898d63eb730e52737175b05e08af9a706f484b969a77db84f0c7f0ef7a567e250c5d30dc3fe052da9b9006d2b44739c4c14820c7e5432b6705ee808097408af2102ec7ad641d886f44f19e7e3c7a2603eed655ef76b03802e298b44079d1537856f9a17dbb2e62df3cab6acc1ceabefaa06e5a2bfec8ddc716f82d3d83cd6e96de7ac3f0dd3daff75785033a87b33e04965ca1a0c684491682cc00e40888ec155bf42370748eb9b22a1334461d6c40bced0aef4ac5dd92398a94a96884289c4897bc0de5fbd4390d03df2eeb5efc16ca420509d0e8795bd289a0308c08abaa772dbfe2e711362cbb4aea97afd15a6926603ec157714e8e4b41c604d64e6cd3311ae3519a1f1bce240e9e14c950b7cfb0644d865bdad95c53635332e2587498740b2b56a0478a745d532b7e0dbf75f1608c0d508b39fe9997736ee6eddf842829c3d21c8504143a92f74236f22bbc84b168c9c8fdb005bc02400b77f8a5d7fbf9cd2580876e6085e0d2b96f70dd8c24b8e38e89f60947bd7179223595eec2ce0f92dc3fe426119dabd5ce97e3faee06cef157a7aa9b68b6e4eb83aa8eef62985c34bec24b46f8d3f85a3e8d69dc9d9884b623dc861e205df3a9e396ea6f992065de4775dadb105a81f0bb0d324f94a25012740e514514201d1a616258cbbc0c4bc454d4d57b9c12bdc0370ea2ad701a19106b939ce057fd5cb5a99a03d5edbf646de9959167b31431925738f3042288991d034231ce04347b67516e383c9e1c6cae992e83be32e8766a0f5b8394dce11c95438549d75796c8cd194655a6da7a5fd7c04feb1d948917f6e4e200d202114ec19e1a59c4910d92bc193baaf312ab6065be198ad02507c00cb1226fccc784484097e5b97c6dde0687f8b48e29b82904814119bed32975e49d2655da554ac43d61c14f09cf38a8d7524ff091daab1f376fa32c13127cd5629072edb3599cf8977cbb222e5bd3b84075f206f9fbdd13e728d06dfef5ed20d6f491fdc17f9275d7199ec90213800d01a0c8db243fdacacb73d5b281269ee94a6e2c8fe419a7d2596789019e21903708e0dcd15b7185b22c9453db9dcadd7acfd54029d22e48c4d2032ef6cbd6400787b2481f3b9f8ffe616af591147858f407410da074592688d3a048e04444e9c4e3a3af316336ec83fa7ed0a3ec7eab2cbcb75eecf23cccd6174c2f60db4f5136a2bd8253e47227d2dd01be8185d9ca1a628166babc1caad2cac2e08888ab795cbe3e90cff76d7d256b6ee18930422e26b30034a14c5fa3a037f6e2b189394e866f62c1860f8242b8f884f8ee54a88130424ae5aa07e8d52fb1c54b7d65d0eff77fdef986fe5342f2031ede01b44fd8bd14519baf4e33f0010c976f80e0d3e9208d3cc48cfa27240fb19cb9b655ea1aa9b658ca10ea333b5aa9878cbb6b18e40a181da106ab2fc4d4cb6ad658d1c32287e71d229b2427a276329741b1cd3e77fef43ad712b1b829fd59db79c24b3b02e3fb52a1b1cba85c02160d24edecda4f327931abd58b720a409e7dc9ef58e23b2fb1a449d6ea6b445633d3b25eca49b7d45ef98b16725d2f5d2a34b9b999fd9a9931624f7baebb3b7e245b66b4f863e6fd902f5889f5171825fb2fb26967bfbeb1839050a15d506a00f692f9eda650be0b8c3a0d1281f05017a845410464ab77e64a251c1fecf8ff112a4640751fdc94f30817c19c8f18ee2516b31791b246c3642896fd7b190976a2920a030bc5a88f3e3e671cb3b4ec6229d2398fdac587197312daf01a34ffd399f5bf5e7aabd36fde05feeeb331116bc95143bc6802a42c974fd946b9e6752092b063514b61a9badd90a5654ba35dbbbae6120dcb30692550e704db1502f55fa02a87c52d83deaf94c27a524e5f6f50041edd2cd682422e534b6326d7d2c3ab9996c4bd7d298be7f93e24b30099e6866285c635115d9deed2f5e16289d2990a86eeba4b1568be8980a540a383902e87b9a39b459bd5c48489cdb829bd6ec2d221a9933c7b12c61420b06daf0d2d8e6f8d85a82fadc07513f94697104af1f525e25de90b0bed770d26a39cfc5a99f092d2014d53f7114df7672b43ce418269dac9d5c7ba9c532f4c608c294576abd82834dc8a826bb56b84e44d9c6842766e1982f7e52e0d161d218b0b7160e5ae7faaa13877910712d5f7fcb6adbd3457f7e993a33329aaa62986aa4843d85775c4466f5296e08a6505a11b2db872796b9115a1995661d70d476158178c173180296c39e89f6abbd33462c5dd33834c36d5321ae3abbebe9b68597b98d1159f4eff21b8de7615b2a618e02219147c33b5c7c001cb358307f5c9e0c8ea943cee1f3140c39877cf8877c2534094eb9e90c8bba17df0086bff7a720784b1581ac4bb7649c8a6e737e4d127c62d94bac1db0540a1587742a0531d0b82395a92969afb4ec722da8ae293751d3f3b94034da46fbb42f7db3cc34f6408c535f6d829826045dbd004f6f6a1c93f6894bcd6bd3ef97a5857cc64c3e30847ab6cf40a3172369a0cef3358143fc1fe8c1d3c85c3b8dcb691a9525e90684365f9b8c9c87e92cb81a73f7d7337e3d82fd02848ab0f3a397db896e24b20242354460dc4fc1b72b450067af9622de8e897aa9e0ca40a6a9ba0e3f6336041a69821aad4d270588072d35ae6d3d7d548c87065100698c5bf4a608d1c7caf117959dd0a2d00d0297b433b8005d4f55611dfced4ea2383badf36fa27901c309095a400cd9d9feba30e47c18bd2c7c5670d7c9c09d081a9cc5a8a4247b8eebb2054de17c1cded9cd958d7da039d2ce8f2f58895a859347f24e32809c5e30e7512116a2c4643c48d18e6437434ec5d3289426bedaaa83b3778d5b7526529934bcb18947dcb35d14b7648aca3c7a941b595b832ed7d48eaaa2766802cd0ef3f00ad698352ef64189aa2b1fe335818e293530204190d54902327a687dd0c443ccd481f7897769641c9909bac71e898e160ffad596d6d804e419ce4867e6406aad38ac875bc5d44e269e7d0473d2e3786ac5098f39b14bb507728548c97fa50abe3e6ac579a70baa5c0ae16db6d2f479104389e2fe5838f509468d2420e45ee6aed1044e4786bd3233ceef5c08ba85138c87a7dbf42d2ccab29146de4cdc83087254ffc56b96edc3db4f7b7d5b3b5b42d07b460cf4a17c4558083e6ecb59dc28b95154378bef58393799346a57ba5a94caa0be80bba85ddc215455b3ca163d05adc457f65a33328d33a5a8f039b0677522858a8db9b3dc3b2b66a10d9fa061c5412adc217bde1179607f3d646a6684cc4154f34188ceef29c111d71b38979ed8ef391fd32063561146b06fcfec9e99eb020f251e3d94bc27b41dea9522c7361d9a56a96f787a4295d07f940387c40e10448386a9ef661712b2622ecf3592ac9d2af90f81e27b2973590d946b1888962e297c12c077317a206972b529559d3f1ecc2eb4cefe37641b55758e7a669a27444bc370aa13b434a358122120809d8b3729a0d8edbbcc29b4b7158ed1ba50175286c48d047c16c09d0ba250df953f922c60a0ab751d648418913d4ae3929caa8bada60b94ccae6374481dc4b570788987fed6422f46b18fddaf4f6b92d15f895f69ca89ec9d8b572209d3d2f97d90780d27cbc9d0c088025a10aa7bcb81b91cf0ee9632e8964d56b65099cc9372bcb49daa21ac44994a61adc360b8decd9c0cd928094f0099344255f6b75a1e11f60751ea55f8aaccaed980fadc3c1a82704ee8e755a304e397d4d2582d77607c28424b1909c2ac8eca049067ac84f528714d6759b1cc8d048aa68b73ff40ccb46b87a4c0d8178032e84f4e4db1000bee774aeca04ac4aa6427ac696260b438d1b0059e5280aeaa2a549ae094a66bb8eb38da6a25858467b83e61fc0f03fdea3fdb5dc3874999caa0217b1733fec1d160a6e5a6b2a19d601fc36149b897a00ec8a1cbd891680024beecf9ef61fe5b01e1837342c12778abbe4dc3863b6b83d66a89ada05fc3a285938f69b689cc7b169e6f8bbca6041e7f94e703b440db1187e44425dcd9deefec712a30b604d92147f1a6506727dbb1df06a0d625d2a2f86bf697c31f355dd069e407701fd04a8b920e0df1465d33ba5c0062db144ec3b84af98f6de32b5058e55a7e740523e8b26d7c65ca63a6c371a4287b4158613d1c74074cff8644efa8f146117c957dc07ae55ad00f05a74926db206f010ca66fb8bfed949d8a0ffe10e8c5829dfe93bec2854d78f591559b8dc10bf7f94c0f71dc73b2ae53d35320498e7f2cb90a0b39f3b07405020c43293d90ef05032f4d1e65b8992b2563272b128c4e29d5cf5d81b0d415a24ecb568a15c5a5b0c17cc03c78dd1f55c7ef8e3811fed2ebe6b3e8372c8f2df3268c64d375d685d7f938706db10a7c6e337914ac2e95e8c13d862570f8a8995b2c61f74460b905d92896131ef5ee0dc4a383417ed0915ed02b9719f9db833c3512d153ab47bd447390f5a1f5529bfac54eeccc8897c372890a8aca5999eb63c36d537f08c4108849a1ca6f876f73396d059e8ddbe73bd77b3e4b943c3cb320152f79fa08dd2fe2f5aaf8a0c679b505c447fd1f32335afb0f197f2db9028bbe1321e972e997a986f5f69b02dd20491dc104d5b19c6a588175d4edf0392d2c882703b0454b4df07a181f2d83feb6c95cdaa0260ed0a3e08511ccd0e03fbf9d6a0e804e2ca540bbec8a661ec65bad23ff24c2d01a92b5d666f850e9c91f07a2e5d7dcd0adacb9ad5b6de75a8488209c98162d4e8c0bfd34552cd0f0548673bd128b45b99a08b6651bedc194064ca8cc68a3e41e104305380ecad3fa8e5545e88d416146794fd0d76bf583e90ed6e5b4c47581bdcb1bb9d41e148ecde310be6c0d3af772dd6d705437862ed980cad4bc4b20bb9ac0724848fa1be947cc805fa7cf2d80f35f6a1659b692ed7083b5d91b7b95f9b6b5c79680a3295c6df126dcdcd7bfddb3349a5f98763d83a885f836473b41fea3045c97dde17c5b15fc34c7d2dc37ffacccfb7793dcee1fdb87aa5eb15d30f05a3f2f016698ecb406476dcb3a25a5714c01fe32a69bdad0b7609e72f2af52db88401e2840b93d66aa32ead258c8d00a6b1ff40f19557b0e7a9a9d5149c31ff4d58f7446d7b7f7ebf51fd6be3f8be41aba247f406c82821c8e9eab9526a9b1c6966a5f7ec27b03daa4e75421e87d989d026893a04f724c11a199047d92674a082d4b1f1492c8227449a898942e5aac5fde566ac07c5bf3094beba1cf0054b131214a4b52a78920b2ddf556acc8b4b2ba00be15510771d2190ddd0078dcfaa7fe4fda966ce9e622cf6eb2f564ed7e9a7dd0679425ffb1c48a43cecc69c9b383e7dba3598eab2a81fa2e1fce482e48dd897abd7ac0b6426dd70948485bc8ce8a1dc77c22381370cd7c36dceb0302340b378e4dae41b91a420d882685e85288616bf879c31429222deb9b8942685128f7340bccfe8676a023c00820a6225cf6af0d953441f2d53b0a7f87740a27780910983a77c13cda4b2d75a9f634d4cfba831f48c6eab7eb70a8467f1ff1998d3e04615aa0d4809219ef2f1103ca49e68bf4b093e9e9eec97f26502778f1aa182bb7533fcac516340f3030acd88d424ad7dfbac6a307ec88ac04dfc3f070a5635cabba18239ced0c3827562a77f478c1928049282eecbccd2698f05ffb0c3e6eff15334f84bb8a9f2fbacf2a9b66401581e9e243f2699c2f89ada868f66293ddedfc002c9ff378864c0f74eca699cfc7a7f3d89d50b22ac9231c216e05093326594d385c278a974916e8544cbd3fa58787a909167ae7edbd91d33653fc884b4deaf4bcb0eb9fd6da5f7704fd6430718c6f66a1fd1bf4e0b69d1a837ea5f07710d8f030ee2add5907af6876f6b78915ba385e9ee26492cb02ce530c43e85cf233160d9b0c3a06858ddcdd55163c0cfc5380fd98ebd95c210ba11d0b41dbd28a934e3203a935db800fa5b9dadaeb5a2fc3a37b85051bf362b2263d3c41ce0d69cc2b28e789627525ef56b3861b2c61f8ac1fbc7c0b8cc6cdf528a4613b6872360557a6a50dd642902f96293da5848be63cac93df66223fec56de7933574886a98093609a2d17b6e895d7e858006b4339fecd6380b1d00689e72033dde68a999c435b4e12f7511a50079e8141f5874fc3d49a987bfbb4d22f30402a4857a5a0663cfb20df04164ed08dcd5ae69bd52604a8d393092dacb251f3920ee6207e257b30c7c5d0ebe702a077c53bae7bf9e4a4e0ac28145deb18e4e21b0540541d2d66f5a5e646b6653d1cd16aa2a7aa9115b808c44952c2758db29007f2cb24d8f577ee91a94e534823864e5049d7a19b69f01faef3c3706b8599d1a4fb0b0512bb5d4daf1a5f2a3c9ecb4b287bcc72c3e27eb3640fd20a0bbed1a4a90b8ba0e086369a64726003b8a3410b92a2d9bd851a881946e98c46b31884178dfb439741991d9e125708eb80b8667c5b78853a7c5589690839bc0cd04164fa07d717a789d4110ed114b579c6462c6c74871540f364c884a8af141b1c339746a40a8bd19ffd3e1610a5f97e9932f66391747297053ad8f5048b261a59c61899d95e897513ae316437e28ff88971b25b59fb242551a86f282c719215d1f64a2fd9c7963d04d4182510dc0d587cd25c7c618a918a5c3991642ebaf87036e7a3f61a2c39a7af651748443e4474d6cf7244eaf01167ca39755ec54db5115d8d3a79caa01b962fe72875968c6000ffb0d6d19cdf67032d1e85e60860c40ae37540caa23ba11c4ea168e6e9e00dfb1774917756ae89cf86b9c64a40e38031afd185b071d390dab1eaaf06e6957ef97b2e13a58283c1587670a2a5c0c35a1a8cf2e416759528451c61485369c8bb6b943255bdda04f18a72c09f490c4660d58ba5e2ba044717412418b12047e0636847a105bcb4f59be5b7a214c16e7c8d952cda331c155612c6e92b11a822a690abe3b4b0d83c7f7ec3bd749260890f9375a6e046e41516597f1f2a454771ef7b3e49128d8992bc4b3566b9814275057c202982d2c64deae9ac8a3567fbe4b8c08f70396ad452115b6cfa9e7bd5ecb21bf63ee466664020bcde60c55318e47b5824c7aa803df13986d727e6fd5044ccd187a66e5c0603e19136a0504cfac38faf9b787cc7599fdd042686681b9b48c28a25ea976d9af8f64659fee996bc0870ed8cc5d8a2f49e5cbdddb29b13d5808ebb66b842dcd98d2f6ec497e4e2399d081c591b218954476783af0bfc0d81d6e455e1449742cfcc4686ca2ce8e7ed85148b0c6229391dd7109b3dc50f0a882fc86d7a5bace4e6bf0f446de237b0c0a3e6a0721fb83ddb20ee0788344e4656ff7ae9f3eabe473f2424b09bbfaccf34db6913aeb2663d3b4f2c7f2b68f213004ff73cac72305702501a17228095c1c4a57d5efd705d09205943c5a14e28b502fda2634368f5b45fee676300aa37e885b6f965dd044e99bac952dd57f859dd0d3b6c21dc9ccb5b73ab1d31cf361a3bbfb01b45ba41125afb49367b30897cd9e6cf57c99de988a9933c71fd459e5885eb90866e09524956b90dc33393950ffc966339085f2a646ca74a0977aa93f40cd343c0fb33270b4787ed70c5487a8e239bc485a53602c637c4aeb9d95ca3c7abdfec9ba45c8be9cb75b772bdcefae53b7e81807761d7ba03e74dc712a870133d2386d5d2b56a7986ef8ce0aac6a67b72041dd99e772057d2fcbb9fba9cc4d36340c751f96ff20cadd6105d9d2b29381772417172be3fcea3f833bafc7fc16ea456e37d8e91343a5656af553c59be08ca643b51508947e6c177eadc0f1caf75c2749db9883c7973f1d0164f8df624a5f6f8bdc5b2c74c4b33fc4b50b673c63e85f3e4c4821d19a247bb808b017c90fd8a478c110c086214401c7b44809e0b7b78d455258834d75f6918704572a4e002fb65642c0736b35d237a1f862ad98e4e700ce6625e69151c88ff4a19439f383b80acf2aa57ed5100765d05d3e2ca89381c7e30346b7b6700be609f0d9e80521b7368dd400859d7eb53f6db1dd75fb1ce19fa0327c89b8ab6f58c5a7e39cf14f97c2784c0d25de905bd829d83526f107ace4300e329020fdc18ea84885f7ce43df6df8edb53895fb8f126d0f88f8bcd4509bc4397ef13a7d51834c9857bce6e993d15d5dd89cfb0e3d4708e8c2076267c7afee34303970ac3f057890cd1e96a02aacbb4f799c3150f683ab2c68de87fc6344c2ecf53975dc7086f0f520ae5793c3d69e354d34b6b92d449c3cca6bf21d4c9a98af2222cbaefa4d612612157c083a6505a1dc01acdc1ca5724860e6d9a0476dc02587207c3487a0561135b66f0e1f00880ed3781c82b256790c85aa827e5ce9e0972b011a23f6414cfac0103b34b8740bc9618dcb8b843fe2c1ba56e463000549b82d94244104a3f6ea71d4b050eeff382776301767ce8a455403b24eab22fa2d0bc57d74c3e6996b70ab9058301cb4099e03657c5756de1e77192e18004877d82dbf2ce590ff5ffc776d08abd5672c361c5fdd7d25d6297a38d2d74da8a45aa39d64f48051a064882eb659863adc6dfe8b3afd6b1164ad3247bf3dc3c9fe565a54c176bed47eec263c7124617bc91d5b2785c8e6b6ac544546be7613d1d79698608d97b5bfd0d0573ca1535c358fa06dd3a36f63db1f64001050f42f201f69d760fc911d323b0615dc66bf52b880e387f476b93d50f99d3936516244891a8adb04256e46d1f9bca4c7889575c32770d78157f520d6b3cf5d1c94b6b889c0c4a05f05b6bbf9239093d2cd36547e21ea064a905f22d5c996fb88c5a0f995e0d75c332434a50a8e1d4de4b47a8474f62c8037de04fed2e177783350677d088f84e3a90d8e8f5e353bb6cc5e819939f83942b928cadad787c7095513603e661dd3bf1e9f4b219cb00399614cd7434ddd01284e4600d064d0ab8d35400c7cb514fd73aaa2e9bbbcf64400c9d953a1d0c8c361b80212e73c22aa54c15237192afebc16c6b37906ebed14a14c462aceb54a8169a9ce442b39cba244130ca6948066d85b72aa9bc6b87a30279f6d8a46a59b3cb1fb149f801d33809cc0e02e5b950ae67ad9afe2d283a9d397fcafd5e3e04f3273749089fe9ef605b5b743ad49d0dbd3339afd8948199115c5a62ca346ad280b5b047215294da36aa9779f07c5bd58ac01b41484a1c86f2af1822bb22e47721368321ee750e3365f7b5fd7d67da3bd33164ef87a157afdda2bd3859abf6be36f9bef50d43f8b0badebbbe62778d30b460310362484e031d31a3a1f34277ad912c9129925d53ce585718fdd36ae0a6a4b264e4d500e50bc8f9ed83a91b988ba7b12037131918483088eac2e92dd55e96c6a25421d24f852c965eb4a8d6ae50e12c5b63ef93d7d33d6366ca12cf0d80d36c70aaca822c6524f8ad24322f33e8d4ba7b529a66efc4cfad0bb3f23e4c598a6ffb94e26b8bd019b8de77a0b6c8e0d67316648ad00fc11d79d7e32ee5f70a5ef5a17b38659e9102d01abc44b64fc108aef7bfb47da0bce04150326e39506f13b258dd5b8ab0c0d42bb541f7fe4b2e53fbe1fd173289a0e51630d43e8265c4ae0fa0666681b0e0ae7dc084e65fdc20ba72371ef8e5e95e1a8c17edcb10684ca368d4431827554295158e592451c919e1ac90a6a06cf1f417f941314cc0dcd99a42386b9e72e8d8fd06ed049e330876fa32d3de79cb7e170704eea271e6bb215167e413e7e2ec8b99171a0a846302330eb180a932c8c5cfd0c99eb564b5bb22c9807c655083fae54ba6d8141d7eab7b0813fad962b018701378eee10e579e6651e2fc7930ee6b511895dd969b0a219fddcfa7276e6751822e48f67665eb11832b0f69231c717a1775e25f2160822a76e7c0edd7f924dd2492747c5034aeef92943ceb258071ba7d4f81332c4a5eeb2990a4887156025466838adfe4b0f09d5e57977d2be911b80c2699b71cba344a5661f7e2dc1abc5db5fff59d34d42f02e2434d21d4a15aedf42afc4b3e7b9093c6a438a2008e7c0d6a0752a8ffec4958b99a612c00758167c8194c825edf60b2a6885e28d04f13cad8359a5411f3f10883f9ee9d23283d8e9c7b4b71dd1adbedc9d503a6eb70654cb134b7895deeda037a73779838d517c0e133821e9ecb77eacfedddff6941ade5936db3e47e10ce1ec3c122e26e070d0319244835a7c536949d2e84068da7ee73d305483f0e9b6ac507780bd7de26d6c679a5516c327dc5470f47a823b0c19f354ed3061124504bf2079c3bbca9058690147dd7201b7087b35f39dcf47340013fa6b067ece3d622f3cee40ffd2e7199035cb9a1892135f739ab93f596c1093e1103e8c4dd79a73fe3b6fe71705f4a6daa230c9080025bdb03e54f12d4c804be0aad791aa4f98cfc3e5f45b363851b310a340a60327abc01166c92f31947f8d1c730d95ae587897028199de5b77c759894cd781f117252dee825d53b6e456852ab08da26ea6013717954da601744058f22b1da0811a4e4779cfb0b32bdf8919ab5ef34d097ab82164f2ddc6ab8dbce184f13b0e6a91b42f7268563ca828a9ef3c6b309d345e8f14820c7bba22807305aa07ada241ed6035963495d44bfa92ac4c5a5835ab861ca0693713f7624bed63b7e6ebbeb70a7bc8ccbb21101d0778fcdc398a4449eed83adf3d2612f53ff8d4cd959cfb1b35068e554828b1b703fe08872a98cd6239d57ef2b615bdaf9bca9522ae22a26b1404a00a8007aa8d24caa7f2e957d2dbeb7bc5f9c9a3fe0fd7e4e5a2675cae4d73401b84a6f77f2b776b7b67efad47582b1934705d09b05b39e943d46ae06d548c272e8cf787a381dd10915b36505a14dd43c2d746394f00082dc9941423bb31ca186129fdefe9e96138d4aca6e2737794978a1ba7265a466090c6fa142927668e7f91cb6680133a181ac9aff8c8852389fafd4c7796c5f581debbb1bbda53bcff0f4821dc6b5c1e963d4a2b3291cb1efccca23c1b6e5d60e99d1e2f96328154c0d607b941f23c986b110c2bf75f01f4ab32f76a6e36d88db0434adba403a54ca6826690c4a75d6b989524a190d69ad0191c14dd071e447052bb6142ecb67f304b5bde6eb15221bdde97d11a2a119e8eb588983bfa9ed28f81e8043d02842712e8ec521b3c9818c367dd90119fed8c93e0a4c72d9b4ba716515dcd630e074aa6b7a7ac5fd204ad308f55328ca32fffb94b0e570f50e1f6c3f7d0a5d34e47addc6a7089dc6616429d4d295be1ca6627d4d7efd9495b87a47614807fafe48b4f67436d4f229e4d54025c0a80b11488e2d4e03fe35cd24c4a6a9cb11216d3115b0660309623e03291953f6066a7b2cfed3c44344f4f24e383cad5f11e105abac08ba14871f37ebff3fba51c2998e3852d13713278d5ba741b436c936db8753222846eb3c1571dc513c04624a4db46999f5ac461345280cd94e69d8ea487c4d873ea1b6d21699d2e6318e9218014cb21187842f3c4e491530e420d310a73f511c948dbde994d8b5475ec2536e118f4ebc590ac1fdbe0c8ad75852e19fde2d50ede6fe7904dd53c865c11e086b71083a05e52609e34ce29cd9236772eed0cbe90dbc987306d26256e0af7292321d32aaa68820281d2c8fc451c4f623e60e638b583be52da67e5e05e94aefa88395a381e2cfdd2539538e7f822508203a9add6a107a624c15684b8fa83c378ae7dfd8e78c81a461569a9478970d4eb4e89416027bbb04aebf7017659afc777d1e8bc481215ad74fe9b882c4377afcdb361616cb83850ad26aa040771d43bd7e3502588bdcf45a32c844eddddf3f874a39cc3be80db68af3bc80baadd8b81e131ba69294bb24954a2368cdda33c1878797a58be3eab929129b09e169ce5df009e45fdebaef8109bc8d683b622915f040eb24ff41328ddb584caee4d6b48585b1e4113a71231d1a5f8e1647a542d409757d43b385076c7ff2e09ce4efea3c99f62454544aaa4f2d1453d0f8409a7850db638f19b81bbffe502e0d743b2a11fa4bf438ce7a4949bfd0b5b70eb82d13754bb18234150f41210a89a7de4d4e6289aacb113c021f61a8bbdb85f4869bc0e69d63d794512cfbb92c89bab4505e6380b9e790f31fcb115a8ce9e0fc7202995b678276cd1f029aa06e666983e9ff8829fc83feba7c9e496bc1c928414768e7a0deeb8cdf3250b7142b48a3b2ec2034725ad1d3faf80ad1b24ec13dad7dbc62b4810ccf90160d4e6c11440c96455ad21450389fe4da95c1056b1bbbc22723266f1bfe9915e12be958a380cea474494e128d6df5e7e06be44dd55b2240f32b6a3c33bdcad824a5bcffcb32840b69eb1e5b9f1d7cd2d3f7a80280e44a42dac72910ac768346219a324e26a1920e6d140290ebb393e2b0523c08a36cc8215a14e6871588ad611ae3a2d8239431c1210e2df903f76bbd3840771f9f2b68d26716e058c5ffc1a2075460d77087df3b5808a4627ddb94e91442fc407bcb4eb392c8068b87083c2120219ab4daa24bf69dd0242c1a17c6ed92b98a63d59cf56e475ea60ba85885caf288988bc234679cf26170848180be21f495f7eabcd72d9738900a86fdf09061b6d15f5fad8fa1889bdf5a9c1b03f22221f50cede33122d221223744e4fa10a1bbc570eced70b3c83e6d899d0359af7cddbc810c5bf1ad2317f20617c2c4f5c8cb7af00e72ac0c1f66133e017cb260a42f2d7fcb8bbc81ef9e60c7bc39877dd218c1fc005a133e2136302c57bd7bc2c11c756db57209e6a914d9c211dc8f0e4a8238b298199fee803d011d91be15ff1c1af2ed6546d32981b2cbf83d9682489564ca5b6deaf075b23face397a09b940ebe4982218e53253087d53595ed3d9194cf8fd95409ba258a323adf225e8c18fe040986c7c716515a5517c3e8d277c45dd6b88e64c7564b72eadf306a971d5930c1b7dab5d7d87ba6fd0d1804a0b2e68b18be05919feae6f7ad03d9a5665cb5688ac73b50125c9440562665e554a04c344fab8fa0f9405dd05c92291c11c8a97f6bcdcc828ffc9f3f4f4e74baf7f8670b3e3a350ff10865224bbaca1fd37783ca5a478a75ce4bde4a82206839e375e4e84b16a1ad549f6fdea2ca51dffb9c377812aa786270fd970a550574f6130144cba4edbd9d65c46c464d2899c4fa03339051e1e70ff21aeb7f961fee6dc21ea2c11a5ce7948624a975ae87155839569390d500aaf8127f487716e348d0dbac368196ef6b572ab029810666326f210f48372e25cc46bedca3f98ab8bd01ae7da674a51ea49c1464394dfb0278a7899d05a18285fba35e9a6a36af2871e5464719e873261b496e70afcd6f5f0ed21c176d0610103a2182e9b8e2b53f05a6eda4fc0c2d9d1b5da50f16ffd6829b562b82881831147fa772e95acc76a4bddf898784c612a50ca0f2042816eca4085ac36b6b6bc85134df3dc11884b77a49bb5b489d037c53fc340aedfbd3a32833944aa936b6fd21ca06b56443b49e5786313c1017a245dedc5ec45b0008999371c975bc453368c41e286d371a750b5f128864a9d5254fb7fa1e4180d25656a0d74c0eab00befb210665c51eec3a15193b9b083f93e9b72bd560158131c344918211610a3165ee49783867a50e8b428a9e926f48a4c013e73307237f2576ee1e0d5872203c7eb233e3d59c68bd6cb9225d228eaf7314f974768b164f21c091d46abb9b3bb5ba420359f52db8ff323c18cbc482551ea525c9914405bcdf244a2d81f17ffb606d9ffee1c15be5e75d5b45fdbd0b7ca1e0cac8949dc5c16a374c8147a3acdce657b8baf90b6610a682344b52a708fff35a810e7505ae1b3722b684e2bff6da13ca1c8f7276b71d049d5c292b18d8b4eb0164445c75108fe09a551385a31f10186648a75c459400ff71023fb4051a00ab6a0924122fa26fbff0e30aa327e5ea2bd1aaf8b6fcbf120d3bea0897fe3fdf3e43860a8986e66cfd883d28cbbffed31ec81a93122b86c642591d6c849ea013f95317c408cca1a4bac5a2507cfbcc6296e32f2e9c93805e569179a52ccbe917eab38ca69b313490147a575ecf7738ab2e3b83ba44159eb52d3d69a35f6f3427f17720208b7fdead432cc416ab512ce266ef060a661dd19cd5006d361614b3341a634818d307571818fd7a789833acc435803c1f12c58e577607de12a5b5771ac68fcfc94807f30e1e20fe5cb32a56818953ceb16614ffc3d4f1533acb692095a64bcd8630e0ed081058dd4f444cfc2f35999626c350f84a7f9fa56d853d72e8d785930d7549bb6de3d94039fe6ca6bc97d89d1a23d9862f2c0144a45ce3f8fa5fd68598249289efc31c9c68726b1c971651279b29f89ac6cd69c29828e1ac3662f3a5da8288e2c85b4db627ee36fecf8e4ec273245fbc2732170bbf306365f7841bee75029471ad4770b587c501b65447be5db93fc8c75286b7b403dd86e7a2c17dad858c08c8546882f8949a86163558c9cac7c06fc412b20fc10b2c2321ff906e871efa5eb4efcd9bd62a60d6b636eb9bb270c2006a2af8a9fd045c0f97c1d98ed78f78be2a366c89f6fb87cde11816fe4e41be443b8e96d285cc2962e47b818672aa35c4e05bdba82ab5540cfa415b1b689a3be9adbc0723082eba2711792d10df3ff9d482e6724630df1cc6daf571fee6b11f4d4cbbddb03e67ac304256287610e3bc37a1e23f3409b5e10c977b832a042b5fb2d495175f1fb0dfce58866fa9aa379f4895abff7bd6e509b2bbd2ccde7064eeb6303113b5bc82de8c472851d8de3041c38beadeccde07266d216b64b21df0499aadca2a024380b71cd0c05db9a781cfb32f81cb9d4787c93c003dc136af3526b3b3d4edd0fc45fb1e6846434bc8eba140561f2c8470fa6d3e51d750b3405cfe3baf2cb32123bee442857ad98aaf4540a10957bd5f87bed8994480c95ae393a8f28a31c368fb028c96303f00f40248e7049d5e4439529e4bfa7efff6438f8208afce2263c1d8257f4136b275b28c5a585098401082230403f3617d6ffc7cb379968080c0075147500fcba7c63d714bafad3316af92775f2ff911e91b55e90bb5a737a090f483ee4cedb543f9bb771079f20cc9f1a6d8e7318562cd9ab75721d7710ee7140560bf5b9c12035a30047bf2278c9a7de6698b9e696f375dc850a53a47caf14206ba350f9bd07773f5fec36b667789aa141fb077b130f30a35a8dd86535c3963048bbe3061d6b4199aefbc4ee583f2a85e173eb9fdc9696b3dbc97eb1d8be86323198686c6da2003c0ce3c913ce14560056c763f21154e0ecc302d6934d5735a3db90110816c8612401373cda7e92963d24ded0ee806cb52b171cbbc1ef98fea965ff1e3bd20fc50b78a1cf9d0646803d23e5618d7543aed82e8f718d4e60baddc38c5c0d8719db8bd456fca9259b00b5f6400f5fcf3ec70063369beabcbb005149304eac58bc05920542a937431ee5d29c497fbc41e4b6e13fb28c15f75b0e6343fada727fdc079e94e1c900b4b7b7e6cbd0484e6d005a489cabcc445f9b0383845a84e0e9b2b5b23be64584722b497d3d7b2000184766b84904636217b6fb977ed0b250c900bb1a79c4d1a7f8cf03c55d799b332735cc7a93ae8ad6ecc2a9e775b30b46a66913732dcb8a4c01d3539fb4b8643034bf60f1b62529d50caea41cfc78dec3d7ade6386de016e640f7f1dc84fdedbc357cb10c9064d4a8e903997ce7a374847406bb1fc834b57e6582be652f78ba9bfdc985937be7ae5c9379ea2423442e6b22e7b3947bbd4d5de4dcf0bb9c56d8b7146a68e2359d7fb8d5b5777768b052495210fd6378ef3eeac55ebbccb3af47abcdc98b9ceabd8c6c0722f282d071d58156b9e0764c33c545cbb35bd1e1567545896b3b4cd0a40472290ccf52d5f5ec47841c20b0b59ec0103e60c983260b6aa5d213f742bbbf62d3b5773aa7fa3dec05f64c1abc1c3ac0368f7aedd7be5c929163aef7e3c40b47b1e8ee1be7ae32c6dc39dd3324d6a3d352dbba98fe7055bad598db1d61871a4be0e642ff5cef5372e0fda61c691ab0b73ca4b80c671dcab05030cda94c6507eaed7c63b49664fcad9b955b7dd957a2d12cc58e9ea1463e46d2647e61cab43752eb7bee5c6255c0588eada686549dbd4a37ee120623d6f08778fe3ba991b6138e6ffff9fcbe88b17859208bd54ef86089b39d7753237c23a1b184a178731f7c9f2621092209543f9922c94774384c94c2a48af86cef351c3500d600b66085bf59cd7c57a8e85ae4e61c65c79ca7341c2d64baf870b12b69e534155ec99fa62b9f36a68161c95a05cb930cf5c0893b910a672bf9a723f8bead1454a5f2fc9192c5262553aaea5abd709d4ad4fddb87494dd93919179911b98ccb9eb848c8c8ccc31c618638cf1efbdf7de7b5fe4e6ffffbfc80decefae133f87b170bfc285b92b55b06da4f403a5a5a515a56e398962dba85b2d65f07dcc2c8b355262e1ae7061ee8b4b123c549886bfb8b47136a8489261e6c1422ca630ca3932c4628aa41c3deed5ebc161207705a386ad57ca9e3d3ae9d761d97b2963ca99d30fa81795c2c8eef2e293bf5e83c58638f484ec41f1b47401a0308ff2aa653767d5680f92e46fe620f7a41d84a485fa65dfb3e94cab5ddd40dd6a245c932562eba15783aac97e33314a4f744124025dfd18433c1275f4bf09e7fc8b3c8a31a8de8f25883629277bbb89087cf5113fd2d5a4837c34142ad8790ddb19d81975a4202e0169fa7d047ccd2460ff2401fb1348b37164a751b73a499e454ae6bfae682679a26d587273a84681f4f0a7e51ed266deee512f7510a4819953a342ce1e67cc30cb3c423dc91f2e4a29a594524ad94bcdd44df233497e2a4929e5679d4ed2881a1b29ad06ed6a4dc95a7bedcfbc4ecbc2711dcaf37103a737ef0037d4902d185a5a68b7f3eed0cf6f77277b3dd71da2ce1d87ed1ddea1982577b6a35647adb4ed94488762967cf6bbb361fa7a1dfa2aa54bf2c0b20b614adae3927cb11ab36ea8a7d7a9cfbee1d80efdf60c738fed10e9d06fdfe181cd0b6135f7474e4d7a96a73168ceec14efd06772271b12b3843026ada81bb29d33efce46bf8362dd901df507d06f6f2fc78748761466f589d06f98d538161949977608abb771c85e31fdcef6ec38d0a38ec23b95abdbad3eb07a79340dc2222d32c9da616bf34cb1ab151c9cd9210ac1019e1e877ec43b718788351bd6b7fecc235fac895937c0d3ebc0d318117d865933961d62d68c4537f3e604b94a104a1750d7848d454afa157fa0ab2808bae45522b05ffcc94ec0cbee39457331cef903e66ec623f963c93d678fd9498ece679ac7b232b2f13e6edc905d9eb2a7d1540269074f64efe73817919a983133add62c7a3500494229ea80b956616bccb4985d3b0a07c91e9fc5ac6a59ad31ab356a118907469912120f8c907830f443beac943bf420048898b437355049baa42a8b3dd6269142473530b610142de409dd4eea26dd923d91290a4521a66622df42424242ddd3d3537f804c3f00116b9b4e8a2ccb329511dbaa39bb5be320841088200d2807f98a47d225e3b95379c474235ff6b28749bbe4574bab95b5b2898a887cb5d09164229398e4ab8f1a251f23925214ee581eb540218f8e5ae8a8498ca3669247e123bc5a4d0985c87e5109942c2f8f8e8e8ea4d09c4253680a5d2b5d114725dd9248d82f2a8931c6255eab90a838b565929c106652521548494f6459a6691a52920f52d2912724a427b453521390908c9090c040425a927326b151589724a49452080e4661bfd52a37f47a3ca06b2cbd02a9c7dae42d98600be6cf2e4117cc790b25fc45dcb164982193a6026907483244d2810f920e8eb4c4403b9ce1561d17518f5e0f945c5996cfe65a6bad155e9be99676ad125a8f54d3a8865794ae60208f98a98dc2c2b3ac502bc80385574cf2a723d3c36d3bea9aa6c10b67b7a8f6faacbe1ea250f8eb40d5600d09a26d428c61ab3d1c67a1b0b0761bf562deb66ddbb6438fe3366ca3902b9898799af699ee19b645363edb2c12b8d96d3766eb633f7874051532e4b673dcc6dd993abd1e43b2d3d0af0eb7da950db16958eedf2bb633b0dcdbab451c65ed061f45d800ba360db7bedd19ee5f97b97f7fddd1adec429aec3b76dcc456bb322c8632cc5cbd33ddb2695819ba75214d7619727619da86d6ae72a1247f908bfa1a6f7763e69a703662ed6aecbc9835e65ab56829855996b1f88081524a57dd1cbdd933592bfe3a90354c8dc0f5ccb909da302c134843fd5e7d3535bf914964f91924249f2c2d8b9c47f2fc4d2fcd3997e479f4031897b81a9b04dbaa485bf8e46e0b70110807b36d81e5924001242d982069e124c7cf6ea9851092164599a55b1189e3816d9707767a39100f20333db7ddc7ac0f0a80b0210a500084d52d4e8a136bb49ba39afe7663a6f252cc813ba473f07cd0896f1c8bf51be7600540984fc79677924a5a04dd86b52c5afc64264ff95bc1c098210f3576701c0c521690f688f125fa58b8450e84323c853485a55b19c2998e3ce8a28b0c8c2ec10b8e606145162d504a41012a43a4254db2f8c9318b9e1cb97e97c03ec7d8011a34110512212698a8028ca220a719789183348cc086ee6a556b77772f899994f338ad35a51d3399d1f9eca6e4385334cb1b7312e0062184526a339b74ce29676d2c3a0ed6ec15db4c6632932c3f505b6b561f63b78cab36d77a148bed6ad66acd50cb58407c9819ff38858293d8d2db758bbee7bb2eea8859c6d2524a6959badc1652d992ab92a32b9eae70bac209255b5cc1c4154a784c991545c8f2535aa1469641c88112108e5cb07494064c8d1182d5e6c16d0bb639439e2c8092271141f29c1477520a58370e94e416426e2b88c85d85f90214c4217ea694addc4b8690bba70e28a490c22340fea081ceef59662fcc32385fa59c4b8a50290211645a888004dc0c8bed56dc9621d212a022b1a76a683085b146144840852d60cd44119a688086135d7c01eb6982a26d0a99553fd9b4eddab686a6699a264411604c2d8a60428bd675157b66154e1c0e15729f861f394196f874b9ab40421544c85fcd5605175f73332713b42a3c39822205a721f4a00751480110a08052c4096609862812885055649a50d56e30b54a0227381fba2773479d8b40f2c5e25ecf0343b138ccba41fb761d0eeb6caf38b653ef7dc32c2ee67d677bea1a66717848cc3cb07adf2dd4b3db922ed4b58b8645dd645411fb43beb4efd4cfa358f0d9e76b670b72c30dea9c7677bcd7cfbb43a4e3bd7e2775d60ddb537f40bd47647bea44eabd7b97058f235d2816c437dd421dc2ba266cccac8ed561d60ddbe771d83ef10e918e7cfdcefc761ceabd7b7847be7e37393e3e36e5a9544e0a75235da8ab5c1ce942a16e2f0a15d42dd43b1c8fdc641410eb86f9ed41e4ab07614e6851680577892c0bc36257b1bbbb4e61bd0c91aaf0d95185ac596c4681ed3244a2a28c6ca920631eb12859185a2b160beda35d9dcb10890a25e4afa59429117b726f1b2e4297b665ad031006617266adf336c0f461e8efe8dff471fa34f47ff475b459bbcfd25ff5cc1ba60a0b5d56c83681a84cb3498cc1a18127063f10220a3220e3092e2043e789e88c2cca58c2620912282191291dd9bae7104a30b04a53b07e68ec3e4c6c2abca856361547a019aede4a6588440517542ca95970f15cbc40e41a5580dddd848bdc5b38e5ae2136e148eecb2e830970094bfab35f46133c02159e3c0189007d3005ec0117b94f042fbe58624827f508917ff00ed0922501bea8810045e4be0e1f6859966599a6a53e202d2000115ab400f6c0077dd997d2f3f14224c50718099225cbee39dbf3c18991514ab3eeee775f5342449043b4a7e81f146898fb7687c46c4cdca9cc5b14cada91c6c4d358dc634e8407f64f0ecf22482389c0358e8dcc002322f37f3ee64e211ad86799e363213ac84e3fa8d44314ca9dccf187c43c8da20ef9d89327155187ecb0c684cb5d14a32c38ee5d770ef52f2e614391c414e41951a003a874ffc1a3185ab35295a44b7adab5f9639d7b285d1afe78848260ca94d2ad3b45d2363105b1c55dc6253277940eb84bee2bf8bbe1ae82bf1acee2ef92c543865190b94f0f64eeac1b62feebc460eec73a1743c99d472873a74259d6faed9c0d282cc4690ad436dff605be32312f72d8a3d0e7b7bd872894b3793fda33b5588c48e78fc1b1981fc77e285d31a13cbf73a4cd3fc70c89e5fa79bf2994652e84e15f088bb91016bd04cc5c4fef1099ebb7ab1d754b6a4cec57879ad421a324a3222547454c94d4279664613feda922a9423f6d33b10f9883da86f5444ff5691b0ad436136b49aa36d4ad28d5881624fb69494bb2bcd694448cb6f9b4a2ecd4369f06e40d415eb5c4f3c2aaa690a74e6d336f40e5a93c35034eba045d4cec478178848822ca912e8a90245d41f275a4040c4ad75187060b16f6a34b77e73b443b31ef77423606b3e663de3f8e795f2706c7887462fa3a7ffc718ca80727761ef3f81511d87b63eefc9d4d7fcc1f83e7d36cea47c9a23f90469e255322ba277bf98ffe6479ba244f99e469137cc12348d1c40cd24823042c8002264f9de0ab9f2cd5a00814f8200104d806d3df8f141018c2044a4d1c2184223b00811a3e204214211851a1440a2548989890651567b584324a4084822649925006aca1a024066510e1c0690a360002ed22ab15b583da4517754c8e68426e2b2619c6181dc37842cd0d4e184eb94fc38f9c4903a62e43a43090b0448c4687ffd3ca0932f599986e72a81d837a7a8a6e9e6a9c5a4d50291e654f3fde8d45d12888a46f158b82504269bfb9a9a9f9fe03a1f01784d38f295434858484921a72416a08a9b1a481f124ca5114a7a904212a0ca501d43d499a82111458042324221ce5ce8850146794b225b63176c725e015193e1e651ee08473ce196bdbc45afb68068a219c9102c12b321656a8e0153704a809402bd37faefcdd0c6fa4cc9632f3cc28b1e020e4e141d8712808b7aa657466086dbaeeee5b4823bb3b6e2c80b0080821148146e9d48896b23862e98a8d061b3a2e1df56b5a0c2ad24025c51e14d21084e09434ea891030d1b73c3454a5944e6d9341892529762cd1a0ae245e8ac20af19a30a42519e4af457bb6259e1ea0286a203943899e2a40a4186821f48315147106114aa2f022018aace08a7410ab0c3537610cc112208c2e727fa6db668814c61659cb10298c1c1cc980889e25002925cd200a51124730010c24bc200808d08b234404c188294031a40409174f40598208219c408859834983f9a494e5147cb2c43fb4dc32fc108cc810a90ba50c79902152174c59762727fe649ed8e24ee698a395afa2e60642f95b0901287f750533c3cae91e18ea56beee4f856dd7ae4f911bd8f69f0a43a1b65b85b0a4760fd40b20dbcc291b5f9e05714ebdc40a80b08ae111381b52588824849efc5527454e9e204bbf20acde9f0a73a2fe93357c40481e7ee8bc926de6942dd7582386863ec40cd75803a6f19087f087ce4e68871e0e33c0340ca5eb8819227ac851d4d5895bca0652b2a4948280fa80c240b62c39da51af07eb86eedc71e8300ef02e44d821f0693b6cca3c301e5857ec83babd3e2e3e76087cca3fc80c03a0fdb335f0647a1cb9aaf79b0710c084d24b6d98039db598655956e9ed11ef43fd0f35c72c83a16a764823bde2c9277f3587218adc0d6b2904b59250a6353536d000bbd58a434996b64155d875afdd39d9c1a3224d32f43878f4132543d46bf47ac01a2aee78407dc3b55b47450465e859951a33d3ae065aa8b99e4e68c36459b338c17e32c86023094bff49ac8136ca3cd0d76e4508bb8d4c2138285f44d3c3e18768c84de6e10799e55b990766ee8bf4dbf5d95e8468c84dfe410620eb0b9b52bb3a71c311ba28ed6fb94fa47d5e1f804cd8a21108cdfd6e48531273a0b3b6f5c036ec53c4c2200c800066ac9f83fa767f1ae6535fa4c25038c200f423d189341c334fd6328a37279c3d145b4234984023080d24d02032e7a4dbd6e43d6559a6a1504d504f6add38ee0c25944977860bce38c119453c2fa55299e17446cfb466809182640611525252545454cc60628613afe3505b4da1d0e03afe83e15bc5f8c22174d3040bd6a74128f77f74108ee4be4e908cc6150c723f9553b9696c26b80306f89aa9ff8f57dd92484a3e791ec8c4306fd5dc340c6c3ff620e3eab9c9551e9aaa72015d590ce3e68b9c75913354ad286f2baa3fe42bfeacb2ec2729ea00eac89eba9107b0953dfec8ccf3ced12666d8ad62cb82a72df2b69191bbd4b91b619226bbfbd9764eeb2a1655e4ac26814493b9c35129267579fb1793b60de370b7b377bfc8453ec2a161769a945d45ddaee21d62126cdaa10754b77171247f313aa59a9cbc28624e5d1f22cebb3e3f87a9cec5ae769cb5760cfb4286590461285708d3f1361d950f3aa97b3876e9ca9ec20a80b0564ada1b2752f7bcabbcc78888b67bd84a57f65abda736fce5e0c86fe525e06a1c0e0d2814aae3bc7aed7217e688040b06163cc82a2168d2f311f30d39a8cd8e6175ba9505c9b22b6c905ab5f6b473dcb50d07c9d1f9d1ad1e373c416debb6731708cedceb9d9e8f17b8ac6675eb148783742bcbd139c3fe8037409aecd9937ed8c0694af2079fb06d113aa5906a16768d9ac5165318d5300551b56b7091440821a0cc4cc8716fcf476cafd69a65d29bd1abd72281935d0f39f3c45def9b97d263ebbf73db338d625194e3f4b873dcd538138891bb6b2e4868e7b8dc69ab6ec94e6b651de7f9788f5dad56301de70333f2a7a3d6ec35282f9c006956d3ccc85f8f404a699d28eda0c1762a1bee472b6b32c840c30ff9dac16298a4ba4ea49c4bf90e32f56f9572bb67d2d93dd2351b4a7b2d944a0302a8c86c245fe873a8f98c064a9a119729894b5109f26806f0c0527034e2b82ee56a5e0d45dd6aeed74261b94b11c4d96b9e8f99356c872c7c42596b6d0b06d5bf1667551ca7e270fc894af107310840282054f763e34fb7e4cf8f11dd92fcf508529f397719bad5a76105b3e276fc207651e4c3ec1dafd843c38e1b198b41441e9564618a519354b69450f21767907572606050e59a18509f97d026fbd4589cc050d35d2d191600f6834e363226e4871e341063a073e3de999b39f225446614a542dd6ad48d5087f64c887c699ad450cfdef53994f6f92f0aa1a8f60c7294c3da45512c3d209d331c83e2911623ec178522d004020bf901a65bad5d18ba65af0fd107c5805e0ea4e92b758c5a2cf290fa48d3342753a39fe7e6f54effb1d0f282a93cff2cbe2290843186385300954ffcf55093b5c71f237c344c81b4cf6ba3b074a9fbb7e2ba0787ba91e1464545e5c68874566e7155b9bda772239c5775ed4627ec556eca7f0eb3673d40e5f63a2b4f59b9877554bcabe09ce8838eca57704c05fff06ca74409b317c254aa430f01f7ce75a761d53d1f2fe4283ba5e116caa0e75d0b85eb72d0c1f39e793dbccfcfae5bdbc6418eeb24ca4b80a6ea54b7a30744fb7c0bd5e446828455fd655b9512f28393e779a75e0f6f871e34ed834d9a26278ed4d7016ddbde29dd4601d4a102d8eac7a56e89c31d64868d4addcaa2125559f244fe3a072cab5ec1ac34aadde8d394d2292fe59c1b9634860248d367c12bf618d19a96699aa6652b17c4cd466e4cf207bf88721eceedce5c1b7e409a3e0c5beb9bc933300440c29b99ddc04deef07ad42c613f98a40dd9d8c95b22f84546d5409351e7b4ce52ba5d3b2f8bdcb64a67c5407e7c3079466e5b8d71db36fc7540fa30af0f336f4f26f5a92b98159d55caae5a96235b4fffd56412cf68537a07b8d1e5298dd0d394855a22f68b3edafbc5f27e0492da2ac66b596cdc2195e4cf27f6c0a052c2b70327c6b0f23e2cdaa8bc5f03e491f26e282d00e7bf958d0f015bdd82738831c41e0c218dfdb7b281bf1a0248d36a58339c9e5b7a74e5c69ea8a3af726308622c02692c56e16f95e230bd338f4fdd6a28b9656c8a501e7b2e0c2cf7a65d7d7a77744b0848d3d77ab44fcb1f3cea81347d1876c800434d4f1a5ba5b9237a7276ce4261a30d39f22593bd8359e12cc4fcf0f0377d0ea57132e64627e9cae2d191a6c523548a8b499688cd3e73aedecde56ba02a933d16d5c02169a0cca56d5a9ebd87aa1398672b34c53cfbb38b371411ab8ade10171a7374947a871e9a2410018790a6615688d9343f9de6e7d33ced99575d56f6e903251827c3ac2112a35bb3a95bb3de1ab1dba1379f661390539e513efad34c4c6c1bc172dc194dd309f2b079a63e4f7b9eedfd6c52e1149e4ed23565606356e5b904ec29cfcf4985a46bde1381fd9cefa5f9669aefa6f9769aaf190aa16558b59ecd0a0eceac54968eca595ecf82634415eba47c05c7589ef2d8ca55ce0383e73a2e27a35eef57b372285d5cdf0f3ef55093675d597979696979cce5abdf3894ae1885868a8c5e6e383dc59e96557dd767f59b7ca16ee30ab9a11b7eeeee4320eadd131081723daa2657fce5e41e6a724d9ddab0f1d8ca5bced9b842a44bbee542e98a31564d757a61f71596d95d968a65b83b8e76c808401eb0a264c8f2b5cad02dd95cac32e52c8fa97ce53852e5425865b997f22917c2529e0a6cd7dab56a4fb597046e3ae9d64445a12ecf4b20c883049047d0f4aab0874caadb40d2c5d4a5486155324cc9f05cd6a5486155199ed3ba1429ec4a869ff32d45d86e92b536e5f878ef7e54495839c27ab7f7e99e8235c5de947dca71a44da5acaca7021b838e746b1ad1adf9e384eade789e0761aa9b235dd3891f1e84a5b6b09ffc9147fad54ded9a9f97426d238df2bc4c0279fca024923c8f425114a547b553b7262aca1fba3585746b6ebd7137de7ae8d1ec5bdda15b53871cba352f7fe44fb7663bb518b2c852a0ee0476ce988264dfd1f8c4d1ebca5cec5611ce140c8118f987ce3890464ec1c1992f2bcaf2519eb80c8fca46ecb7caf2d6889d6faf4a61ed9c41b348064da13e929911dd92d94fb7a49c4134850adb483a287bcd46d225554d5035c1c64ffa79bf3e92e57d98334be2937d98f9eb2333d3356cf6845764fb5f96242b923d8f88893a204d4e901c76a881db96fa74c02ff5e9c829a710b090bf99218fce767b55cf058998bf17f20b90a68f00f8b242f0c2ebb1cfdf0bb96f435fa71f01f85a71528ac11127c0228d1f585f07f8824f528c71842264d1c51127607d9d1c182000bafa42b05e80d134fd2034913848ea31a20a4994cbf04e108342d89ae7a68f9927fee40b0ff232c39cc9cf9e9907296db7da73b29fc623be1b4a1580aaf084c704279db6d1404de681bb77a83a7c900f401eda0f1b723c0079a09eba100d08fc43b79cb29bd32dfaab9c080fcc3eabd8622333c088d8a71c4503fb9c928374d1a3de434dde72ec17006116e7e4205d3a415a8e7cf049a6a714461f6b9baf079c51cf4eff83764a5f33173d1486dabcea0f9039352c94eab25018f5148e11a1b04eea16c7ec53af146c6f718c68bb133b35d2456f4f9fd5ab3c2505e3481785d285c216437a1c99ddef9f867be0aeba1096b201051beb570eedfa699b699469762dbb96653a748b6678876e512fc86643e885401e19945c377a1893dc38d42dfa6a05a4a1104a4673f07eec0e58876e510a67e8d62827b0493b71d2d1c9928c514ad88449be22ac75d8a18772747aa08f359d10cad7434d2831baa3cce09efae5f318df43f1f11ed70da07fda88066a9bd8af086b579076c52f4627d1495c8a3f373f393e2e8945413bf4d036484c10ca31ab5acf56b5cc044c72494600a9e9095293910998e6819880a95b309b80c9044d09a02a43b01f74e282807ea42b4e61bf085454245ff011c26c1c42aeb1068ca8316b48cc104aeea823c6f82e8a3dcb15160821313219b1df4d8e3828220e746e26b4608d1bf8404909a8008330a23e40e5d19907f9888478796fdcee2932c5a6e8045f3c2378c11a6988610414a12260f1f109be7892600a82135a801184273780b16e380ef2091533c061a8255d30d4d1b09169eb140b38e881329494c124bb853cb81391ef3a9e7b7789f0c0babe10d6dd9d2e46d48f5b5f9f7a633cb088633eb06eb0ef3f40e5f2ac1b54efeba8dea84b1c9347d9abfe008b5578c7aa60888abf8c5cace7b8472ec6c83d5e877be462c43b3835917bfd57c329e51cd973df51bd3e05efd873a9947738d63d05b3e88380f1c052af374694f2caa9cefd01f62967dd50cf5da79eabdc5338bc2344bab2a7fc0116e7c075ff20534fec91ae1d221d55f714bca3eab931ef2c6a294da554b7f4b17e778a75ea2d8e49d60da977d749e19dd85d478523907465a97bd99fc29fcb11f6dd73fa5c77e3514fe6ae4f5462f281d275f4f85727af696316bd10b6edd473b1eb47223cb0eda8bb7389f0c06a7c1fa7b93ef41ac003db70df06f2b94b09ec10b846e6811e167168d81f6b85b05a128dd39ed127bad5e3865634278c3627ccb31556384ed315aed42d992d29597264bf2c28cbaf1cd98f46c9f2dbeb0aa64f50ca0f409a2ce6e7e83663fe98cb5789bf5a393ca58a136c76ea53a40606c30b67cd6bd886c3ac89ab9293bad40390f78ab019ae3d5a946e492a83aa5497aae784cdfe55a50ff0c0ee7acc755c8fb9777d621d171ef3181cfb5d380facb573778876647eaf6203ed2969a8562d29a913aa4ef215f3cbd727f99289f9bd0ec6aced3806b3361c3b788748073fe63b31221d1cc738463424ae9151776227fee0c040dccb162e739c9338ae497c2abbcfbcf50f3ecdb4700c8a3f3197c1d128e80038cdbf3814938c62b08ed7644ef2d502ce512b8ecc0963283327ef357727e67fbd5f8759906c761d387ee72e4a008006c7a6b8f4d65793e79c5ccc95aea72636e698cb1c1fc7bff834319432f81ee7e5742b6341b29cd6432b6bb8070c17460168df0b174601cc67b7fbfd6f52ce8fa41d7278823327466df3f5ef7f575fddff1c0e8c8f83cc71c81ccbc8c8dc9b1a88d34746bf486496e5eb12e461b374e1f2b549be5c97d79eb2bcf624537be42be6f738fc3278c7851d221d17fe7fc7f5989843d86155caf171dd8524485cb8ae9bf5cc1ab29faca75b13725cc7711db7c9a5b689595ea34cdd924cf449b72414bad42dc99357b2a32c7bd236df0f5145e5a56d3eee2a461c699b20249950dbd8cb6749dae6dbae1a2a52d236d3a86de692b6e99834a14b6d837ad684ba1a9076648976b5208d49b7a47dca3f0d2845d5a93e6f8ab5c7e9cea66c7696615f9efaa72d49a96cf05be5954f91c34eafcae74d3d0b22bffc6548cc2f29eee5389d536ecd9c777a61863f0f8c1e668fc9607c1cbbf43c304aaf12b232bf47d953cc71b14b914752ceba1f4f66bdbd1eac8d5eedba2061cfc253ce5d9ecc029625883a52bea550a114bc43b4238359f432ff7fed50be762e96f9af73ffebdcc7fc3ab1d331cfe8657eff35904c177591743dc9a2b0ead04b807d8534b497364ae94667a65df39864f7ac3bccf45168cad11bd21ded4e6997ba31c3d4ca53d7e52daf367ce8e13de538cddafaa8955aa99998547dd44acdb4b59355d9bb1313f3f81d99376671bf8fd75ee54b06b3b88b595c7c0c667138c787c8bd91c3624ea4759f98cc63313131bf397eff7398cc21ccc8612d5ce430191c933db88598c772e08b63443af73138765b45e6313dc7f1ff934032d8c80cb098c7085d2c5f8ee31a9901f6e33b84909947af870a5679b935cf9cb377e5db5d6ddc8439f5c754a56ec96d93479bc5e96dab4b4e7850952edf3d75bda7dc98b92d635252ca3ea92444463ec9a61bf37bed325736c5fcbf5836c5fc31a8981bfb636262509f21e695073fa62d00c2862022f398fb98cbe018918ecc318ec95c7c9f21787a623ec40e51cef1cf0cb0183c6b861e2a7bcdd0abb449b7e46758638d352a6601b12f3d3d3d9ded3a6b2d75d22d4995a0605f4ebf02d68cba250f833525b449969f4fb02bffe8d174b247599e75a9926e4921f74ea031ec1f43fff2c758cad5c46ee887c4f2cbb9d83dc7bcdc2132bf1c7a3d5e305dd22d498dc8b02b5ff9ea29b7ffa8922cff75912eb54b7e7b773f9bbb961ed88f0e2db50d3d0dddfad1adeeb57bccadf941cb35a4de9d7a3578dfce712a8efb9cf30b226b1ca547dd2f6a5ef6e941893a660f4a338aa7d744355436e7b38b1a12bbbbfa76edeb5d39eab6702ef7526e9fbadfead3eb61e3f66a43da13dd925ff9bc2b1723ec847975e801e9bc72e3aee4e8ad605ead7ce52d4ad8952f558124bb3c61922ed807cc2c872c97a766b44d0ba6476c60160ba6407905d3201a456585a550dae67bb2a42de10290e7e1cc1b37a730936441397e5e0649339008799d923077e6b6ba35a553eaf28d6422f9a4d17c62e93561f174e909944fd3482e691bef9449128aaa3c24790a39fdb4d3ec9e479cba05b3d3538c9fd87392449dbc40a911d4c7a33ef4877e74c9f36853db7cd309ed4fa61ce7d38c3299e0d27cd23dd453a9fad5f26f3ee5c804a1b81c3eb272568fb95f3e450ecbf1d5e3e712e4a1245fadc7e758b9dc9a1ec000bcec27036af1ee34438ca41c3f4a651075213af5cc28b4c708192491b4cdcae3a510cbe3e590f5de7967f1563c0ce448146f8ac1f29ca24c319ed0c48be21dc891289ee74549c2a79d742775937ed1279d0b2ccc3e3f33b0fb4f1acda11c2e8fe17071e1d573b8e0188ce188aeacd33d3db7abc3af3e7318cb3a84ad5697d5c78197d53807d6c257388ec30b61ab16bec28de42bc75dfed596ff5bdde770a955ce15463d756752b7e25d684d27391efe85996b640618cc57b82d5c79bfd4512bd47ba849dd1e6af2ca39ee68a66250a59ade4ccd296174e5130557645e994ab325c97e1428ce4fd67c44d2360df444db349e47ba158f245911c102600eafc3faea5c7b0de081c13c7af32b8819c003833954c0cb85b009245f8d242e752bb6932649f59608bb9d0544ca35d6c8937559f3f02d87b9acf9d55d245d8af1c05aee72615af0cf0c309843d8bc2b0c714ce6acc7f0610e830f73ca449fbcc0de73418e2f6be21d200d7e0a0dec4c9e398ee3cb7ce638c878428652a640f2e5f2783a245f308f391e4f85e4abe531c79d30771e45a31c556158f8d53f0a84a47b4e81beb2d29d52ad3ca5c25389a863e538d2839e0f9e3ce15d5d077ef5f9d5ea2d8fb51c9e073687e42bd6a115c4ac54ea5ceac2ac529d8585454accf201b33c4f9ef7cbe136244ef755ddbb3cd946ea7eadb47296db42dd8ab891b870b55a2b3d20cd8198e7ea02b91caee089ac5a803896e33108e15b566ff9cf0c2c87cb5bc042708c4807c2c7566fc131229d96431c73c1b105af5a0ea1534b8fcb575fc47159f33862111898eb33b7851b9981e5389116b09119602fdca7080c2c078eb9f058cc9123c75b68bd85ffccc05cf8cc7d7e6660aebf808bc0c05cc0b1788463443a39eec2b1a8245df1391e6be1f8165a780e1c8b422d14e5f8cc5b8e5af0bfa894031b990136f319211c87b0d55d2e84b5dcee42188edbab2b7b2e8449af47e3ee329735ffc3e3bbfa0262bebace8bc0c0e063bec2ac89737c88b4dcc80cb0d589b4602333c05a6e6406b69a81c1b7e02230b0158e11e9ac0e712c622333c0e0a1cf0f0c0cbec80c6c7516b0132d87b0223330f82f3ae568d472e952f488587984e5926e0169879ca4924a2aa9a4d4487b47a14b6dd340f6a34b74c90988a92a8985a74b6d339f304111833a5133bc47d5e3b39eb6992915f60133d0cc90b40d6b62f944b7e2a32c9242570e25c1017e85e3b40c922f88637c503bc9ee934d39feb7c80cece531d7e70706f6f22233b01b67e1b286f41499915fe1b270805f7d857756875b907c22cfe48f2e35a57a60bf4eeaa4f85a6dc77b4af6eba14e72592ebf7159f37309580b5d922f08abb69be27b3a03a240b0d5719a02c9d70ab3e6a70f9460abc7d3200a248de491915136445d6ed673332148131b7fd94f8ef114880651213a54d4c263a36db060a22295d25b6bdea669b5c80a1d82288ec0606af28108605018e1c813653811e94088594506c6a669b00b2ec888c1114d08019117c0ba098aa62326272c81c50d26159389099586b3fa020d9bb2691a130d529aa6a1b44a8651770507613bc85704a0cb83923d249993d75029954d515961b131b3cd86f775f224890d7c0048e3791d6700e8e2810d3227801a43163c38c8dc0bd0650580807c59d0e59dca64eff0050664ae63c12f90c6635d20733720cd0b0654ee0ad2dcc840e60e5ddee55ded90b90ceaf02a10999bd90754b767f662993bd4e1755e87bf2032f7c845180f17c4d6f40c2e070d02b16a3fa48b56cdaaaa56ab46e72bb6aaaad507401a1e943a00d2504ae965104803ab76aa5d3a29a51487a803bec64cea744705441d317477cc893ae083681eda758c1899e0e1ab8cdd6f49994929678caa215413ca5a572b29e15286119621cdc48134f0d952adab5556245df0aa257010f298352d2b57014840ee5fe89a32421ef4f01d71cb1d8a63ab76902f0940d704e3e35181c5912f1b292c870f1263a0877f408c213b7c04269003052a6001c8a35b4100b471bd60a2c336409ad9831ab05c1aa0ab8992dc3b5464804c7896a45c18a0cbeeb021370c844127f72387599066c2e880ba2fac0be4be01695e3090ba1bbc91817a35bb752053cd03b94f41901bea9859ca1d19c4c6c375f541f73899119fbc70e26d80091358687184a0213060bd8444144130e24511ba80f59c22f7f6050be0163445a5898c0a48ac52ba75d042670517329a1565c034d1d2e5c0692525074bbcae7f6004cd8804aaee571d66b4687194a48f3005161c742b9c23c46045e2acbe384245e240ca224768a2323242ad39ccaaced880f363f516194ab09020863143c60866946eb0b05a864864fce4af0b22a3278a31a240196a6e3a16981419f99b391241edee469931861184b03543a4318280d310690ca419a51f4fb05544bb3a2b43a43184c638a20428c7733be810ad111b638c4f74e693f938653ed94fe643ff49274a674fdb7cf10927e9d3367d13bb571729894f6eda46061c1ab42cd29894f4dd6451fad530882446941c2fcd681bb9f42433020aeaf1510c9899167eb7bab526fd626917c5408e4089496230891e8502e408144ae9112847c4f0893e3e908688fda24d7c7c6402e2e54a31ba156514261fa2eec688e51313fbc1a520b1975aba207193e5f11c5a09d920b814ff5590f81ce24abe229428468eb053c3493ac5cba7f8d9035f3c443f46424c651441074af075430b283c3081154b426003583c5439b144d8be25c2da4726dd8a49f27c4a131b9b782fb07026e9970e3be6dc918170864864880144fc11e2b4830e3d08717272921266da58158655f9ca0ed4574f589221121947f94686484f10ca9f2cf1f32b9f2a9fb771596e908bd305a9def5f0ce49af470a66fd8039e53e604e394fb6f77bb657f54db157b5bddd559727f7fd81e6149e4a480feff0c1936558b997ae7a958b336bb57695ab4633ba232aa1884c289bb46b1e9e834d20cd6c25a62690474aa95b336a9a7d779374924fb367fec8d78dcb2895c8a26ecd7fb2499e397b12031bf3ea2da74d2268b973689519c9d7514dca53a95b69818d5f61819d2d80342e8034f39cd6ada8202bca84b221c8237e3e0bca3220fa94f5c857cb71aca4c0de78cc5798b0f22b33b05f6694e7bfec499e5f11b2da579058fa9515d8ec2b2eb0a8674690c713c883f6409a792120cd3ceacea7a8238d1925ea08c19d55883a86a46b1ec79d33f332f339868034f32f773a49d78f74cddfb8f32e174ad7eace0a676a0a419a89c6844e5d0b6c5276cdf9c9c40479749987533c6a27e972f95c31ddf8fcea378e83cb5b8ed35b4737af074d91c27694979e64ead68cf148e6f9a8e4656157980231b58d8cf8931233e1d0a746d2c5249f9203fb45235ccd75d2bb356253418c08d28f4b1eeb8697e7789017cc8a7f390f2cc86ab57ac43a2e7ff90b8eb5d4bc3cc7670e1cb32faf3984bd60a2213c32077e904350863284b1343c24669c6e4dc9342f9be6a5137cc11d2051a289268820510417b079f9045f3c468cf1c5139c14a1891d7c019b871e0e7d560d9de3cb593a39fef21c2f8f4b54d81c9f429087eaf3b3059007cbe7a70b208f954f163ef1e70a9f9f465349be603e3f935eac981883cae7671a334a8cc17e7e5621c6b05121200fd4e76908208f21200ffaf96aa1f579ca245faecfd3a5b671d236363e4f955e3e737cca7cce7ce2f8bcab75e3d1cd4d4d4dabf5af56533231e5498bf29c72dec67549c2c6a350ca31c368c3868c4baba65695ae9863d39caf813d765ef3949656b6c7d61ff5483169d2c51c3716712c37431af9950b8334f24151877cca8d29883ae4ed8d48a20ef9edc625a20e2148d30248e30248137f22506402d2c8cb5c7c7f04d9e1b220616e9c70a65418a7255fab1b77798b17a4ff8263cabbd1ddb837de82632dbf71e3460b6da1f4463c02d4ad9a55ac5abcab1bb3558ccfc9f150c262392bca75885c5d0873c9a1e54258cb16f68b4146e4f918847db0624b2689d86a4b5ab6b01f84a203f601b3f6c9d28e67167f3227161e95be5a4f9e306b267da49473ba353f9d26544a29c917f7f99c08f40bc2206c769f6f23f9f2ee94fba77b7a887650c641f5146e8809c605a6f8a884ec15a64d4d32453322800000008314002020140c890422915038201565d53e14800b91b4486a4a9948c32089610a196308218400100101100092d1a6016faa6b8a7620e9f0bd8ca4a81f571403ae30062215f1c5f602411bccdf59c9ca1329869d6216a7a0929747331b86a1e7aef3f80a695265bb3c7494e0c0821b72fc59b88067e32a0c9f979632e9d2f3eab48f0747e25c2f24ed07fcbcb0f99e10170bd9bc046a1cf2cab52b36ebf32237c668cdaa9c9ccba4a1f6f0b42abac73c0f8fcb53b0614414eb6d5048eaf533da2ac678fd64babc761cc3b6f070a94f2116ce09c3d04075ec5b25261f3a2bc84148747b0774e7976c4425f947228ddaa29004e256e12b69f2d0794a480a271a555b9da951b1a335696078faa264868880e38b62a81c035404f473b1c49977a6b73b0e8b613267b909387ef763706ee527177fc10db878c4ca1b862fc41e173ca700e74956e25390ff8a22efce1a6dc3c04fbc70b06e102370732b0a7960ea0be7ee243e9b80f3ba410b3312e0ede65a626f90a093e05701f06422a5e0345766329371859169ab050ba05f5dc4ff177d74e1a96c87eb23e5f52549fe1e7dc8e6dc0d375b66d2b0c5a4329e98e25fbd92078bb8dd2e7d424c51071fbbcf0480303311dfb596a2075b77be97cf777c5416b29a78233cacdf506c479e9998e20d07d51d8a6fc8ead314634fa04be7cd12fc4e48c7e2664909449f052f80bfa594963696f2cf4c04fbb2bc2b8cefcd712826e8f4fa5d19b55c4222c213097dae6e637214ba1c1c1d0ca565393bac8492af087d29fcd06e69d33404bf1d28cd586444d77fb56bd34d090230472e939497e8e67a0ec136c7f4be3fa63cb23521b1159e09162ac0738b09b62fcf60cbf183f1d12c40049b7f3291fa19496a06a4ad9f294a743236571f8568e86f2d3e283f6f91e35642a9c9c6a3fa7b8da91af816be33873bd0807e957c3ebbbe77662e29d0643782f22a399524a443898d9b7d9ae4f1d311764628fc9fa2f8d365cbb5596c8f95a429fe6cf2d2810f1172e359974eb15b8030e54c0c99e152e1da851e028232b7f11a2ce9abfd0e78f62f418e4144ff3ee4b80323447e016a411a715593fb3ca83b58221a81805702dda96840b63948bd0358beb53a0969011d04cb9abc4663bf4ec2419e2204a08304d41d612e4f51c67573c977ba1cf6a94c872a21b3f62cbb17ee467f036de264c2bfbdf6831f53da5a2fbd9a096ee52d40c385401fd02ac20e5b69a6feed42ccd840d26553a73d260835a7a034a2b4aee81ff67bf0984bfa3d176c750c42ff07e5abf8e41252ee9056eee65ec6840c382367d7503a8269c7ab65ae4494b60d9cb56a007990456e8bd82eada4220c3dff2c249c2e440d49dc201e66013364b252321acfb791c1a1049e4231079b4412cc73d6590df6f13a27e3c67fd12021242087dd1aa446136933263b5e91767a3a86213199885334bb70f58c8e854769dc3d5516c68ad7c000408afae89078e5d18c40e78c4c94c52b3b8ce6f778e3d457a10ff0a9d101e3ac221bca31a34818b182691c85a096c2dbdbc502445e68177a4844f1c8bf73d0413b152282f3ba53bc91d3bbc54e5104708619885ab0a1e5e1334a5be4b983f56abe3c1318f972a5bce7e71166be8020f9327c06d36b1dd692ef22ccb22d7ac93505515e3ef67680efe5e6d1549585db78bb89c1e817d816094e885aa9bc745769fe41c78d3ac0417b7e4cf49b4d8e26b80e5ca7d127283b403389915f00464c0ca5e7d096662df9542ec6510765fd8134ff13dd78ecbd72665b921fe383cbbead976f3329251806bf6596021fbe863fd4b4c643a95b44ccf076cffe25f53209ee246596e00634fb9495dfaceb9ee88ae68ce51a998020b217fff902864f6c350be7bac7f571f2c14c542ca41f22977010a28ceb107c5d1c227d684332ad2bd9f53cb63789591ab60b21f82efbb0b7fb9fba263ff80f04d48f51c25a194cb0371efdba614eae1bc385e8d1ce3c82ce7e5636eee9f97722c2ab72429ebbf29f642ec1cbcd242f57663910b3265c41ceea247379bd6288e03b74ec2be181845b52fb104539c10303d7bc3cf22be82749c7eee99b7e3dcebe03ef11390641a9f78e8d9aa10da0a027a3c554039d5136df0fbce6f605a0d583d1b3a33d3c456c75be1647afbf95955a332b2cdb612d4ce00ef3698775f480fca4758b233ddbdd3b37b6b625b5bebf861b3859ff5767198b5a5d829aac18207bd564a5836febd56748fc480a63931f25fdac4b6c249d140df6ec9de44bec31878f8e67e3295099aedc410268b594c567c7ddf551389b61d9d98e21069bd06886cac3cca2d8e9153bd755843fe82111ddbd6f87ae2f35feca6f0929526903bb385df0f2d601a32f85049e2ee97be6f99711addedd8b7d6c6f4526b3c5012117102793d804a30e4710d37195b11f4f7086dbdf41b5fb492a58d02351e4c03457de73a462b2edad15cf561fb17540428c4fb23930eed60edac248fd2285a97deeb4c7f838031982eaa308e449bdb00de93b9aee9829bb67ef471401f0370bccd107aedaed63f6c3638e6645c63f66686e862ac89b7cd03471997250f5a24ce8eab7adc4b2968a974f20a4e7986883dbf168a11c56093665a88ec7f8cdfffbbedc9c830ee8411cd405631fccf8f4114e53ad406c4ce83a515c9cb21619279950a45f025f99895ee086824218d73ebf88674a112e9ccf4b8c0dfc6cdd1c9821d173e3d2c366e48b4630848ea28ee9b6790fbba77003dbc23b42a6b1ea3341a06f998b2dc48b4cc47cd83c6a2d5319fe5fe0ba72c4c58e9c3e84f352003966fb90579fcf8f159c36137419bca58fcfae7e55570cbb9c0aafbe7ef8ff0f60327b5242e625b4c1bd772c898eb39936be06463ab6c9dbcbabeb692aa4b510f1cc0d4536bd04c00a11585c3736a073eede36596e0f8c0bdcaae591c6d811788cd0fc2b4661399ff574aef5b2d290cc138eae63cfc042299a03bfd6decd0d829f8bd52f0031353f0e320f5e38c83a190803188f29392faff251e3ed1a86de7389bb881108c208a8abb810571c861090acd96f57b2571f1c1da57e2820d6aca48d942d0937c57af2f694628f23d664e0bd2b91f1b5470e6a09c7c74ba5ef41f0a7a831601ebfe45d55cc039458372e18496f8e2284640d60f38002f9da5a9c35fc2d32ba93b3af2111c2c8c3942b04d36033b9d7bbada8c88411b9093f0f6b802f6d43a8c1b94a3abf7e7913c8708e6a15f681fbdadfbfe2dcae6dd63466464d70ec3f6d763f450b922c0f91bba12b005e4e0ec28ffe8e41f6b485ce528bb306fb8b946c4dea007ac77205019b4d99261ca2ce259a9071b6df68c584727a8f236ea3c72c0b62e2b2930008f2014a16e0885b5f351327592a53cd06462e7078bd2cf5812ae96a9e46c6102888bd5a9800500cd702fab2f290c0f0eecb6c502a0f528f5e1e14316aed4a1fd34d073d70d2a79bbbb66add279f4ec1d452827e2641f231deac2d900720083ee2963962bfe3e91595dae3c61431be56d4dd603753a3fbdd13d464cc80a030446dbe79995bde0c17000c380335215bed0971070eafc77a4803baab52672ca3e7d862b17f732118b1d3d9657e18f4cb0c695cf27ed19e5524b90fa0c950276c52ecf1d462d52daccd82d18999dee473db5242b96089df3de5840e8d3290443affda91acffb6b0fcf48d35ed1273e5fdb5e7119713b3bf3da16921110eb4d0b5a337de994e55a9c84ecadb146bc934295b17aa5f49fc353142aae938baf24224271c985c6c54d6adb88fd30bb1c57bec907e7d8bea2c2c742625531cea11d9175f798cb5e14f39d4be289768084be70f6707af813a273001ff2b6e70284f3e09792479d48ce3dac6b45f690fe4b2862ad31816dfbb9e49f4b0a97131ef5d2cb503f336838bab76c0a39c2f12ac1e4b0d7d3e8f00260d3a6a0fe07f97aed2871e43b6f56235a0843e0d3d366285b835e0a981366974ad643239349f46127d7c6eb5fcb306f6bd3f5f8a25fbde2e8a7da7fb8743a685fc3d34b63dea3d2bb6b0bd95a7bb16bdccd5ccf822b1864cbd0a7d698a5ba32e040622e0cedde4200d3c871625719e4ccb5dd3ed3d3ac5a0b1ba7db4d1492639716607cd544074394da6862091b3648315b880d5a15ec5c0d1fa0b423d18b3846cc1ad81b52ece2fa563dcf04e9a5a91d5f5a07cc83b07e7e31b03410ed8e6c8b4408c74a2af37500dd6981a359f90bfa30e8d301a40224401d9d5c0e8136be237c8a4efacae8668358f2dc86faa1e05113c57e344ce2f316d0df994cc5f8d18d5dc4f44cea3292409c513d77c2a31efb3b0fe9e5fb9c77edc1fea88d2dd26ac45da4696b6a1f2e984b7e026406f74d4826cc0ef60e8a8d92d7e079bfd5284ab48fe2418d7959e0eab6134b9f9594c12cf953b9edcfccfd4dc23bc276ce407aa1ab48efe3cd97644c5396103d7f230580b3e7fb181dd0900e69ecab2c80796b5a4d132509188769255eb3aebdd8da20dbd674a1b79c5538bf969da10fada5fed4a0a7f397b33d0bbd6841f16d1c580c838a7f4660067d184b9f0290e96b58f0c8618c8149e161a193e638cd046a6e5aba7b8c2134546d3c9159251191db29c2d89405b3fb648f76437bb365b795d11672b3b297895e56eb90a5336b0e63d131f70d4b51a26deba393c4efb2631628de4c79fd12b2090ef63dabe4b51868a0d15b84ad5e92544b822fdbba3626197f36331e6b5898358edfe18349e50d6146b35341ebac807f44d6395ca1246b670eb803397ee344420bfa067b2ae84ac9f0f96b5dbd551ae4c47ebcb9a1b247834c26a2413818e838992e08718ad1947bdb79dde41e50d64589b776cbcf3d732877af1cc469b20ba7ccf0181649816776ec2c0b1a0d1767493333131b43fa2e6aa55ef60c01bc8b2d6f65a7506864b75c6d79d3faba154ff1619624aab7308508b48c8be03ca1392bbb7b132ad08763841566b14e32586e896cbfd6681ae2125f96d25ebb33177cec4667220b373f21e418ff76a0bcd069d5572ebbd51c1811f6c5e10f292848573522927fc13b940af68dfbbab221d0a412f8abe770b678b44359efae0c5f495e35d6111dd772360c81ddd2d70bdd8452098b78f04a880d08b601f1d2c5e7ec0d66883b024bd1bdf4b21d348c215a1c156711934c308e8b63d0a04ef5779bcb935937d318155c59d8706fa0710582ef87d81aaedeae9f56bb7ab8069801386ad367708cab454d79f4aa8f902353d59bc2f38530458ea7eb47d677eecc4d85d9ec67a1bfe953521cf765610cf825e25948e94d578a36d081b132bd02fe4ae06871c15d16f3f82a3b7441eeb8c2ff5eece1bd55dfcdc9847fc01c7c27cc35dd8e10c8c24d23980a6814a00961ca9ec06ffe44215d2fa826451bbd7a3282216b385ac04693b78eb5c2091b02f072f83f7fe4a563ca9cce2d35719f0248bc7083c74604eeb3be999d6e0fa235f9bc574ef3bbe158a9e8625950e3bee03aa3cf7f2fe092bebcd041dfb5297fa3b9b4b27cb0b382704a69a03bd9745e7934f14572a6ce451e570f9847f84fb893c7dde992c121f6ace2cabd03a7ced99c0b5a08c0ac133654d5d97f80e9993eba1b4ead787e9f64e0078a253dff46fa4d1da65db52696b51158541c30568a7fe2ab793a1d74bb5cb6e5955a119014f6096105bf82f21833626cd1bd075f36213ccc142d8fbc44a36d77842edb9d676432a021c6bab0f300c2bdace1bb7d6809810762d6a2bb323151d296470f32b902e717ee1f0fda74077d401693faa03968adc4b00124d8dac7fcfab815185164c2eea4c03919c0a28877023be00d00f0d2acddfd452b4f93ed18ce332036a816ce603aa43367f6e3a42dd18df545a76cbaab0ab455dc2cd2af6d947f21d0d1cf0aa05bfd17296fb4158107b0c4aac981b5bea6af263cc1c35f41c26e4dba7bba681f0312c411b4205ed262a04d57a4891480e9dc9649f9e9e9556061038d79a2b43216a9b50631bd74ea6614c45cb13a4469e241518f73f58b92c252e4520fd1278b48ee6955b9995388f4fb610a0108395e588d33c38098072f00579f2094dc4284cd942d8abb1b51c954346a37d0e853ea67289f013e51887033efd98c95b8827e91dd393fb82318c4a7907059eb0f5661d0acba17cce7b2d48538c9f15718946f148b8ac431a361a55b4c30eeabcd0efddc184754749a01b00b75e60db1692748245af4219587b11085b671e75948acbc306f48645ac06d84fb9feac6df7e18c91a0f83b5f972dd4bf5098826d6a67a292a267291d91ca8327ac6d3aedb37a5bdfc1e854f692f38ae965890433aca8586c6c231f6bbc9562f479974841fb67a8073a2580e2e9047b190879ff0445b4040839b699263530f1b40ee8f0f3d8d2c559eff35b25529b4284611d5f897afc95d2878bd13c92e0816283a7f4e82862bbecf201a9c41e54c46cc46eee1b82fda5bc5fc0d281313b8f3aca117df61a34d662127801ada71a03db26ff0e300c83c09209c6306202f341fd4546a9851ebdeee47ebb69b86010d712bd6782d18db7b4009707c099008593cd3b393741fa3806e87390d7725911e4e972a0dbf95ec762ef670905b1dd5de0b2342c886f6faec79caa2b5e1a1b37d2c57e42ee9cd4a82e12097f440b429082ce36bac019d1ca4dc1148b25b84cf4706cb43d115ebbc9152270873999ea46f08a3e21f82be19cab7a76e14cf9d3c516e23e5226a334d28a591bbb3130bc746595426e54f50b749d407e4460cd53a586634f587592064eb82ea52188db45bbe4edefe189a9a4cd014b5d07ceb1ff5a5cd7437ebddc0cddfd4a4e8806a5990dcf89490c39c7971985a926e81044d2d4376439717101dd5c65713c49c8ff3be3071af8f80f8b9d3e20893221614973cfde9c61cf15b9d55ef5292e65b290896fc2dc3e17317b4ef24c470f46a82f6695ad523f6179fadd543979a9c8ae4f49d9d98cb07f15009882fe95e816dcb2ec3025ed66617b305e6899bdc8f1d2a8aa193a08bd8556a39782f32180ef6bba31b69c1c13c1361ae3a6d85e1cbb727fe9bd2133f914df6c7f4277817b55e424754ddc4b4ddcd3acb5b0ddc0dd15e5b0794d2803ff3842cd21977eafaa186e35ae8918330e93e979428e7091c915c95a2e5fed9fcff9379e8ee0c60a54e248ab45bf02da63320fbe228930ff22c540dd042e3b52cc67bf3a7f3f3ce49079c703f1316afa3cc6c32fd95bbe8d07f829a2e0163727e614fc2f9fe71fd2286e4f809a1b7820246c8db6df8e99d38849b4526ca1a7312dee350ec90067c977f36329c4a2484bc18e30145e0d7c6b97c25904f53356a869221ce24430f93706cc2f23fa6584f1d3f3e100bd03d469ce0ef0c6932e2c9c4cd698d9770c47e70211eef60822520073258bceed2eae91814130e5c91c67eaea1c64b4f62d5f7506d08fd17641a787fbc9582ddaa40a033bf40376eca86ee866b39603cc69f879ea4e54750a0628973fa8d340494e61847db346f5040950ec2f1a96a76aeeecffe00b70525c285bf028f29af8f42c4f4a0b365eb12f8b7a4e2e8d8c6ba35a26b8e5aa8589e278d40fd7bc685c750b54e8a9805e07e97590541565c690ee14f7592e28d69065a43f85d81328a7b5c4a7df413a32c31f1a4c812f089dc6803665af58b5063f78bb8655a8c08c01978e01a816d6a526ba81f6bd2a40fa209f7fb9bdebaa18aa581dc66598371f7331915f5457dad719ada068f80d3cb2c1650dff0d5f5da32554e5d543cd505a14a10694cef22fc28b8eb0e067ccd348ebd284f4fc9311a3d634415b83aa3e1099be1ce6d79ebf450ffcdbf998ab8d7cf758eb5f893f7a8a86261053d42643d817d0af7e21b7ed5f0ace48a80918ff7f6d0e80eb72a85402ad958e1459d710b55eb6997b5913b7bb0c8617ebc75a33e45e4ec4369be4e04089f013051f251c60f1f0c7cdd584eb38fdc9310b4065d4add21551033dc839e24ec35b79cdf9f0737845c08971861752112f46bd234d77de4161249bf44912e9b75d61d023d434d8903f226a7dc4b66d70c3c789b0f87aafef7ac0942b48c2b51197fd2b33b1bb8d1328042a3f5976f13b4e04467e6972128dc6d15e820c0c7f78c6922a698c6be6639d16b1b813ea11cbf0589586e6fa05a77d0c0ce22f702252f8737d03f0683a780e556f2aabc55e181dc008634d31f11b9a6aac50f809c0129fefac76e50d9340bde1dee6ebcdd7f0f7245ce33aef8fac1a8f4600b68149c111b7970d648e85037975bc34501206a42b73bf92525e4009baad996596fc23d76080166fd2ddc2d96a46afd10db4c787ba3630960e6f73a8181b458ebb4189640172f63544e8c01b7998572103c4f6fac1ca9421f5649cd0fa4dc1cf7b29ea270334b90ced1b183679a314ec2be6b89c160aa4806a5ed5ff83e49fe5389209738ee878efd70b664bb2dc8a436e24071c005f3b70334871af051501b7462232073e81dcacc6ccf13f8a2fca50206289812a1571a0557da00e68a30281efaadc5627f05980a301988b11b1faac6b222460871a0dfb236062d862b01359dad68c63edae216fb5f7cfe939c787ffb8916bce15b902b644e8272c066240971512c55a2bce816c2abdea6bdfb30876262ce66304d055fe007cceb10e075b4232b771a2e240f80fc5cbce0f52d714550c06b29a6a5762f13a553df8b59eae3caec1c063a599a864912b8e4842c92100079a22efa63fe4f5c5e94410ec4bbcf960fb3760bc559279bf49412c448e7941d317d84a88bce59691054d9a88094870e2c4523ca3630fa19bc612e3c8d0f3662189939c15437070896594dff1228a5150cadc4f9fa2a580d46cb77f5235bd70069e93c3c29b2a521bff65214da4248df38dd1b134692e57b24a3e003718f5b7da76a9cb91d54cc748eae7812db16b12d4bc68b998283e3b9d77a59c1cb7f66dad1bfb0ccbe537045bf6f91ab4691cf14353ab6a4e0e7c6500701a354a9f5b1859649df8434ec563e20afa710aaee5f0c5eb962eb6b2ca669db410872a1abc9b16123e4fd21803bdfa29909b9eb5847b9366f7501faeb096d716b95490eb6656c60493d1e264d78688333bc1d73489c37d5e4e55ce8b2fb4c196c9472b901e510defbb5d7c16aa1d67a5d25142c443913c74a4d1682d9e7019843a2f3634b3168e9f13085fcf650eaebe66ba09926a05f812ff74446adbb89230fa8177207313cabad728f2e284f1ef5775b807d79e53dd3ea0ae384b2f097074591e8b2bc276100070813d4679183e7ab8e27a734cf423aa7197c63f6ffe21d8aa42938a472dc3f0929b1bfbec796c813ec7673c095c575afe6db280673cde55d64c1847e1e81be906361d666496772c51f7e66870d2b0d44137187413b752fe2abd4f09c01ca440fc087f4189821de3d558c62ab243ca8e03b9da45cb5937f2b3a03ff9e0ee03508c311b8885dad564ee64ebfc0607115370d19262d42c230869d500f3a2e175e950e2e9176e838564bbc8a4286024b9290418f01b4482490229e784d9a9b02a7c98b81d28ad573bffffcc5d5a49fef6a2fa382fbf4e44b399ffdc7efee8c8ea9ffab7c4817d6986fe24cc7bc8005b61b3ea0cf3afae936997f1414c2f2ea1a08ca75641537553c055c1ae9b8152d3704e7b20bc427661bc8d487951f3ac0f8164cd71920b39c5d1e96565c3c7ab597c018b3441f4274bf7ff8ffb29ccff63c30c214cc19e520857a1ec5c3ac5c309003b55b6b11959eeee801cb295a2eae6d342e85b7a58dc2455ce871e78e43cf69b873f2ce982aec731cc6903616950c739aeb13fa41d18822b87234cd4b12dfcff702584ff517dd4c14e70746314d6741fad718776af9377052ce9719ad25fe924f5a1f0e58ed9fd14088e38f67e465d26c45c9f93817588812710e2927521be8d6cb2776bd5c5ace57db527459015df502b644062d5ced0c1e07035ce7247b9cc87396591628d8f206f64099739654b3bbbe78545b67c54886163e2aee36f7ff15724fc6136f9755f8d403084c9c92fb0fabb019d36c0d6ce89d1b6092b0a270db9ecfbcd6c1abb8314781e45e76c455b3ecc7144aeefe18d3b5c06738d4b33935d10b51ae748aec09ab85d30f0f7c7d9d8500894dbdadf7a9ff28dfd99a2236d84a05080d16715a267f3c936f5f485c7ca2791075cdf1ee9903ab0257d850c5c4965fa115c4b04b168da02c24c3834a375b8ca45c3b0975ec1fc8fb6d36a34d5ab849ca68f249eae26b63de746125beb7ede8664805dc2a87505cae578ee2b01a4e8bca141b5cdf711551432384cadd4c731d1857d759db261a09793c5c6dc93ff3238e225a8b3d2dec835bfedb34c6f1fd3469ec30d0b5572409283537438f0b4922a561089145c567524b6b0aab7f1da389c26bc06aee72194749810ad9f1b24f93844b8fa6fb6df318c1cce100688c9e1005bf95f04fc61e370698d14de2d6f317d40d1edcaf430ce8c7f0df88adadbbdbe0f1bf8684395a05c3e5a803f7c8dbcb04c849ecd48d96661c58a9b74fb5476962b15dc42ddd63be2ec90113073201217de4be611b32d450b7d2e763402a51254a0013dbeab7fe3438264fe1a8ec9c196074f18afcd875c461d4a1951daf16302c0fd98b8011f76f47b3534cd0e3f7370d93a182e036d86ccc04b8315881d327e7bee8e4b8325b14a3ba6cb7870704761c79244f0e2c60eda2ce43792c6dd1e0a3ba67b8d3b4387c9d57c5a17a6ff6a5bf709433ca0a33c1ed249ed41655b38fae4377b484881b475e03c7a61b66b4db5bff6a1919aba14b4da2a907ea26bf26d27bc0e14dc277fe3337ccd2eaf904a2861323f44b717e3d1ed5fc7d12ae6bfee8040ec333792f4693462c2247f7b1426b38528f5d19e22820c099316457da383e20a9c59ee627b974e8b5229e2520de5859a5021e02d4e01d94fce8785682005b688d7dc71e54a68dfe98ed9a48b93d4de50dcdc084bb33f531057639363eb39aced2a811ea38b648ab257a9dca895c1afa309dc5315e0c1511e9b1f49fca34683d6347688ddb00cba1c2bf5dd09ebb69042ac94f3318a1c822a9d5f3cd2fc603c938a2aa3ce78449c4a04bf5581bc579f18957425a97049644e728cea7c203f59297697594c4032c399304f852167d0ca4c265626c5bf95e57e66ac8bcfae90b1e5350d86084e56177e25fa1c385f9059269078969d1844a510c1c7200e6507064ac9a5d9a23c9acd77e07c2b614fd9b41ea24120aefe13b0c6c24fa2a2a6ebf741e4035a87e28709cb9eed518d6c42656cb1b7d5aa1d76d3e3b33c0df81a76d38dea65f6cf5c107bd536a4e00ccb6059c67801ce2e6d2b05362f4352b6b57577bc9c1376236a65be0793bd39ee690ed63970fe821dfd64a5b244115b980486574767bef73fa15d4edfadc7ead82327e9d5f4b0d46aca482efff65d65e348787800f11ef37e181388f9aebb4c404ecba002603adfdfed6fbf90fc9cb4ae95f330bf045e803428f4776886b96311e4b6b317a28f8a0d85a78b286ed49a96943033ae9391fb3666d3cef1b42914a8372ac5b2bcb1149f845998626be32896eee9972bb09a2cfb5ea04a8e679ffa02f92930ebfce4e6c7f63157e96eb6d732600726ba5d8dae28a405ad729c3d3cdc7caf1aa946c1cde7dcca14040f41ddcd2f18ca54d7882a880b5d87e47b5a5501ff2107caacdaa570e88c888e54684b0067563a47c74c2d1b42d3e362200c19b36352f59f29b6cf3012b5d781115822d0869c8aa8ba219d95778d38ae03130129196e73508be46ca0fa110c5a3e51af3b14315741f925afa79506aa0f47b3224294efffbb7548fd20529115db2e83de5806dfb9f45d704655f2bd68bc829d545ddb64b961880d8c1f15c66655e94bbe20532977ec91b21fa21ae96ac848bec9afbb266bbce6d0e94ad08110d577113b1e02694f81328e9923d5abd7a8d2ef063564d0a67d6854f3894f7a013de1684f29c6fa183aff1122a0a362e95e49d0e28e20322cb38e407973adbb529fca22ce3f3ced1be4906d2c7676c8a097e907a5508066ab5c1b00ce1383cbcc9fa83a867ac8ec03af97bbe595f6cba633f42e10a95d6cd255cf26111ccf6ddf2f1a376e4ac1cd1a1e3db9e8cfa862722418ae193e159cdfb2dff7efdc2b06ff6144187f03e09c1b27de99665a56f22d38be0c8123eea99b554d74be8b5424f25dfd43d9850fc562ac7a89f4ce83759660107246cc83b4052f289c73ae1c0a74b0c075b684ae0190ffa63fc588389db3ac1a8932795942a61184ef8105153a7fb0c58587f3f7198bd3507d3ee2ce5771b70b7653cbacd4e06c8af011373581874a95daf4a95323c6efdf33eed0fe9b91911b6aad07c39133edbf02036a95add6c458e2042aa46a5e4a57e57440900f1379bb80400d603518779b78edf463644164606b8fe67ce6c65d15d2e954a9c3c4d942801fb5bc108163594ddfc554a0aadebe5afef4f1ec6467f7700f10488cd159ab002f5ca21ab71fa480256c7df4516f37899bdb6020f141ee498a4e87014b48b82728ccf2faa2fed360e036f616e08ded3b85f33d8655aadfaa7b11ff74dfe93bdee6eff8aaecb7104193f8bd42bcbe593ed0dd0c4260146e5ee04cb27d00a8f14d8686d87f22630cc9f660cd921ce783ed3cfffbc9553a9cf8c83320369084fee5a3cac8f95b730c2c96c9ba471f301bb947e53887b942524adcd6080e8988741c48ecee1ae86f07515ece3a0dc65ed43c5f44ce9cd37b15431c887e0b3a23027b4b60123f87b62a817d59b4908b238e4ebe09d1fdf64da4a659661d3b05fbcacb3fdf607d6e7edeae14501a7c403dce8ac7f331ee5dbe45f5691a2b443b676f268bd1c47557cfbee3bcdbda431df10d52a508003db7ff666721ea449899fe38ead1d77e2d60ecad80b79afce461372643c74a3d605723c699768073eb58c0ecae1531a39d6bebcc4bbdb059cc21a0637746e781710225dd734b5c0196ccd89f5b0e2bec409946ea666417c1263876c5cbd68e45f4a10bca010d3d3a843db56b8af38f61f40b978f365c84202e88ee51932cf2689ea1e45e47179c1460f55e3e067b9ef830db5a8040bb0e2a69cf4ce8300720ba75b6bbea944e6ab12ebea6af64d43f34878d1c889bcbaf79eb4f9881249c1d4e3c600c2fbb8be4cf8ba5afc0d489a42d7313e06b9e76232b816abed56643e6e9db253c154bbd70b6cf010354498d242f9b4f2df674016e682810cd48ab5541185f7d418f8667739812d902cc6d99fe1a95708d425ce0d1882d13daef2553808805f10e3ea0746bd67e8cb7ac6bec0e739c1a5372dda3b508fb79a697b1270ba639d61455aeb15b3361703c1dc313a4e5f7a56c5b97c96e407943223e6421ca441ca57486b93a5276bfed90e1d8b39a2c9cbd0005c53cbee63a44b871815d6a6ad1033ce611ca5382c1fc92127842b54d0c04d215c88014ecadbe98e4048b17f7605182e802c937f8e21e942bc03fefa57af30f353cf79d26c8d4ca28a52de8c00ac4427f651638ecc09c00628800474af86016d5c7a0dc476c670c6d2caafbe260baf5456907449fa4ec9fe660fb405e59823d1091360ec7d384ec01439be56c0b44e4a2dfd7b9fcd22e07462349eb543522b3313e65ae5e7856f0ac4d7056cd9aa8ea94f4b07cf8807931b2a2fadc1e667030f75b0115021a10e81acafdcae17d88e2315c3900450206f253515efe7e5beb914113c81a1b967b2b4cc8fcb5d85fbc237e232fa00d6dcf00f67269aaeececba9180a428e7f5c3de67c156d7fd1ec25c0552b478076a1a2a9cedd5320d1a831fe7048347dc61150c61112bbb9575d304b7e485f92f59600432545c385bc8300ca863b7b103c86d3d6392cebb57e085d40cbd45a1f8af8ff985b74f89a214c7832f813027f8ecbb90d93d35f1ae88a338d5c6084eacd847511e1d89670c4281a87a5da3def96a2c8aa61ff8c10cab0daa65af368a15479fbf8ed6e6caa8d1134647f1fe403d16182ded3f30f19d8cc47fa9495dbabe3bf036e6d57bed218d5b32148b97089f044a4e235ec24f2430fb342296b5512cc0986234a1ce24a05050dd1d5a7a01f3b817d132c506c20688cd653ff1317cc62e63c76d5a75d1251ee06fec2550ab67d4be856ad7af1555976bed21f18608279a068f88cc415811766889ec0c6c120f3a0fcdffd839609240795671f967c0628c395bc375c2b438c2fdce55ad3afd8ffe458186acca201150fc7615c30afd341d876a177a036e3ec2d6b4d951973c219525ed6c536901290b0ae659744ba2f5857c7798826f07f1b2d416e62e84b003c940733f93125bb9d649d29a7faa7619d4eec021acfa6c2e6fc4bf8cec195bc74255db4581bec9a0c1c055921889504e61707e9873239f355375bbadb1a6e84ca669ae469c3054a77e5319d7fbd9e2899e58288724938010dea511591f5907f044f4581a8711b0a0b154149e5328ea613a17588cec5b1e9402f1cc64ce461be4fdcda924fc795ba3f45e331a6114309b7a2937590bc12dca2354f8c6f87fc8a2834363fb4f5f60de0f9945917b1ae401b94a47085b41fd1680ab6477000856a954dac00c8d0a2655bff15ee6902291acd70498770991ccf02913ce0852001c1196c25ced4de7c1126d47dc8d13e82db73336a071d4b1e1d5d66d3dc957eadf7f561a3622641fb88d6934521da4f34d1ab6b2e085adeacf67d787183b2df05f149c0e2017832a06dfcca47a7d8ece411e44e0164049074391e4ade008fa34889c7dd77b22ed9cadb27682056c05f4578d2e6cb3db834791510651cf2b2740e0f3b3c81dadb88abd6f7065ba4cd132f635ed535020004da0847c14ec8d31cb0cbe505387ef16802191d0a4f191d6833f2f120a09e1244fb56bd21a30eb885a6bf77dce49a2c64697a912ee5579eb7d1415d01f2d506ca1b1ae5b5fb567d0e78f99a0297b7d3e97dbb6dc389ef72754c4095749b805515ff198d50dba03c3b35cc83828760d5159064d3848b9203c260c899df37610ae7b4f224e32540a742b85b432094e1613d1cc55332655400400776dd499aa480624f62a7c7eef3c3f218449fbd78b8cf62cf7b10ad2422825d9ae84171d66dbad1d5899f1e212dba24cd2e3d61ecfa09b7219cb074c1b146a9b8ca083c3380e8747d02c3a32e332f6684d6eff338c696caadf2d2e3fb7572894c748842ef864e30eb6ff37473708beeb2d5e89d09bbce2a832e4dc6419b8177dc227cdae8639bbe6faa82d6dc8044c26587556606acd44ce0512cd575c62ed93d6155e162154b089e0de6c8a5f4a068be10e1218af353a0a94323192e2d2a7fd7cebcbabe493f01b9caf2ede605c800b31ebc88e9fb652f10bdfc5a60f4068f15306e27739873a0bc24afaf8871904bb76cbafc096fb1e5e6efa3409506575bba22b9c151bd440e2dc41225b880c1baf6c85b280c68385c4610e3161ba75b927dc44e68eebc41b35e19ca467603fd5808a910c3486d63c02e85927be0fe0a50f0e7cd667fd59fb77bb85738816385828585fe718b8c7ac8af060d1fa4bbb2f8742d102487ae35cfee85e7d367b5d776a1c030f48037ee7ae81237727ca43886dfde8be401ee38c339a2e743b74a3d9c73051ca33134611e8fe0b644e0f1bc3d205ef487e09b33c729c703ab0b9e2677aaef4aec808c435ccb61725f51be40410712716e338b5fdd8e4d7f63019905c4eda5a82af88213493946e9902c81646c77661511297e7288ad60b6e4991ab0b842e6dad1d3edfc11c60db613eacc349ecaadbfb92a2c7cd3a25bf57492a01838ce6e847bccff6bbc6135bd65b9bc80fcc6be6e66a4f5109f5dd2df828e3e70422e21a1e9a55c3a834cd709fafb103184a8179037a15cef87338ce4947affaed48c3d7c1e60044b10a750122d1d569df2d13f40d3252f634f214c6ce4e301c7ed47162c880584477c931f291dfbbc8b140e8bfc04f74c53219e68038ea14114804d0ef12d17d222073a7e60695945d205e06cfda1c05e3f74ddf34712c5250dc231f17d9ad5a1d1f975b419a55e91811642412fb0808434d0c65faf808e039e9611c363794e5d7a0a26407f7319c4481071356408e09eb8e3bd57387500d90b225236c7f8c55f85932044aacb1117db5ddf3e46949e1e9502a84ffe19b172d657acfa8d809b47ef95d5e72b40c38bf78e3af9af98d2c1930db3edd44c70a8b79289cefc711d88b34d36442fe5d51f98f0a01becc7b487c710433bf27153eb616286ac115b4d14ac7014d0cd7173cc78a432197da7f79e161a36a2ddf5c737a08ef45b0094b2b1562dec0784aaae84007fbb6a71adfe0e210a016578018c2f99a3cf87123967a78899b7b5ae6d1be9da90f090f1b3f13e3b5ba3aa725f6c21c9fdd9203dbe07910db63181cb4e428a5ec27460a2ced12e3cbf6d2d91479e66832f9ed886d78ebe37d99c36cc18f4b78074cc2432ba98259d3756acfaa06a64403f8cfba4c56e7a9c31acb2c0ae35a28dde98e0fd65f0244614434725061280dd12004e64b144b275808af478aa9d925b273bef779033a451f38b584ef4c5a96468c4f38b39e3694f48574e467c664d5058e5b1d8d35a2128a9f482499a8aa19ea832d4ac39437dba9a6934c33ec56c2c6839a68e7e334d7af88ff7b2b0f826dc2b19ccbb1194c8eb3bebeede8509c8aed64d3bf74feba9e0a7d8c1ba91bd1683de376e10960e3919da1e17a49a4fc0d8bf3d0f855fb4d118b1ef0fafb8a1bb73a4a536d81acfdc9889ffb0284e36f820165bbb04f7bacfb2949ab0050fe62ba9550236bcdbbe27fc19f5c60f8dae2547bf8d0ffdaf275fbfc6095a7e7d18a81e1542c650cfeb61bb833ac754a70fe68ace1aa7febeaab17beffc94f1b0231ed900a479c257b81066cbec5ab971a5834f99a0753dc1dbfba10f90a5b44c40371af38acf2b777bca34e07fc7a7186f217f8183f0d976c9a563658870dcdf28b53509d16a025620c85b57b95a80647a5d6b9c85fbfc02825e428f30c01339342f2a0488053ed84819d01944a48035efc693db1548f3afdb53ae1bcd5d8cd8c96e1bf5f6fa879f5a566d2270b7c64000888d437cb92dc04292924ab26c0ad6dea0370898cb67020dc01373d80b524248e8bed39094790f1f75c206217a87668a952717af6a5ecd99dbf7f9efa611da8dc1d65efcfefeacddbdbb7c3104fe13cb48e113ddf6885632c314c0c4fe325f2d46a253beaa728a935748338dd74433944fa97fa5382ce93ed2127ac6ee8da30a96e075c371ebc3f3d21c2d4b018d99c22d778bdf7608dc4307cb2140ca8c181518003dc1bf18c0b90a8ff1df6a0d6fc4d0ab05861526f45d723a4953e0941b2fd76ac3fe3ddb162bd24ef8b0710de4fbdd83e99adb437ea877e667c656491bb88ba34c2364838069777eaeeca59314110de77909483b084ca8523cbfccc0ea74e195c201828f0447b86c788f86b383bf0b199c0e5c594374302215161c1db53068b467743a175e996478855380afbb07e6b100ec95ad3b169f2915de97de446bcb383af56c56f1bbb8f1e613f2beb71ea13ad5ff997f0213fbbca4778121702857f345b3184c33d6f9a2575fe87ae6f2609f0a854d859479f04c0d7cfa84a41796dbfdd1a25f9f7a2928140ea26f998c69f485cb5e21c4062e7c2e123049a065f1857f287561a44f9384b7ecf86786b7209c8625124a1c117a65d2fe837bccf1468758801a430aae966fa3894971b483635f9531e7786ebe9a99a8278ed8816ec2e5768e3f307b1cde815aa76d7e38db0bbdc8b7d545ad5b514f97420388d5e76ca1976393adf228780d4a2ecad947d74f88000b098e820d4f295686cbcf5ad3ef6380480776c030ba10b29031f8af068afaa4f3845f15bc674bd69f3dd3bb30b811f7435fe9e57e2982988127a504daef18a4147794abadd6363531a923e5c6c21c2dc56dfd2b965fde39337319269d3e8cd7dd1521f0855d805148cc051414080fe5271d56b4bd8ea17e5686d699b88f0dd2fcd397f109bd675996fb1a027941c6a7c955d429b10e4b5e75e5422ad623482011ce0184b53174c80a47c07c7f3f75983603154d1148071d1355de32c26a196906581a7a8a29e467c837dc319cd183b139268130e226975d6cabae299162a38ec4284e009ab11db4350d128614d4ae41aaa5900c9b08a43715bef54103b857df7f464524fad6f6de37ec7087f8a9dd862b15a179d38a7cbef2fc49d2bd3fec2589dd49a963cba30ca3e3ab64cded1e9a09710b5d01a1a4693516f76a1d7ca6fa85fca5fe0a61eb2327369ae9bf117b56738382cab16d1c0a495486159c421aa7cf26e27c242a9115c65b70c3436155a60f1327a0825159ee38a41f2a21a290bcc1a9f7276f967ec274a81d4a1f8accb72c11f35e2b7c3e9d347c81ea7be01bf7c53385a43a34c990526817ddefbaa500dd1a9537f9504bcb828dac05b93c67e812f243ba1479734b764eb92875bb634cafaaa38342a406d4a960f9aad17e5095fa398d6c3270290786ded4bf2b6d404a60aa5bdbaa17b55513521a3492dd0da5cd8a414a10e556e6a763679573d9d57010de0d30d3266a2816543cbd793e479b052d7193762c22cd432f1682b7596ad3f02b3929325c06275917d6e7379466f17c7b42a4ac28422913e1fd5f45de5b791d7a14594f193438100fb6ce741b094cd67cccf467f872a3101b5a2f0bf1d00aeaa82ccbbbc29f067743a563710e1efc2d757005a31e68e55f3bf0630f83dd9b03f05f27549efa550010194ee02f20abb19502bf4e9072a7ed77dc21018bca978679348847a7a4433e60cc0f0251798eccc5f8b2d12edc5bd71d50c67d2071d1c18d313d2a3af6f0d3e356392037bcc68f90a7fe13badbce0e5c8fe587214971cdff97e20ae0d480cb346162c698dca3b66886626db401490ec943888459bce91c7884d7f55d8c1be2231a8ec735e35b70d505aa14ed7385fe3bd3b9f7404414b437b305f4a8191f2c231566b0014a1a06c888d5636b4e04b900961022fd8063af528255554ac619f8302e08fcf32e2c0484f1ef2579f6128e5dbffc0120e4e394ae05ce4ba99ee8b9ea060a114a17d805a89bfd1dae6735b4a9966575c2386567494202d8a0c98178f11461b14b25c31e6f7f6ac598b9d03e5b9690e0b9cbdc70f1e9b7c540522644a654ee0d86916ce7d27e61bf4d8062d384df4e63b3d57de153e6cbff042a1a753124036c98260f222365b5b6c0631a433b3b4941900063c1606a76281a05743757d43347b87e1e798865630d7c9f468bc359e171f62a836c10cd190dd6c2a05bdf94422d48b021c656320665e1eeea77a2177a7b1f89e70a8b835b3a91a6ace81c2b5c9651ff2c9463f3f5c1c2685fcc7a61b8ecc20883b142c4d896ad29099c48653d623be07ce01f9041aa6d80c5fb990470eadf37dd752d0753b586a9a017b483229e3de1493ea591b3180e8fb56cc46d0f1edd273472be18ec108b7a9f73dd0dcfe413500a136c0fe3c2ba1a01ec8b4de4625f84fe969d1179d2e0e7d029f50de8ba07aee0b35e69f866dd4f3e5e0d18aefff17bec650df8499cbcf60817e472c4677d2d3d614669adf73af81a4f07e351c6814b0bc51df26a11f6ef299dcf6573729335508ee40016b7ab15281a20d70dd7bdc4db81cfd4d4e03ea3548414f2cbbf010bcd47295cdcb686960e521788001575b72bad70e5909ff186d086f8d292be9b2238c2944645dff672eeec33d4e1c1f838ee2f87c1aa188f086615cd89617dbb23d9e7a4af8fde6dc4807097305f5f0e5c602d5e940fd8925fdcc049b9538801bcba3e6465e186c0353d18de4739731978e58c72e7b40b10de8242f47849809d36e53e8f0f1d3041d005e9301b14c491eae7204ee98084380f32442e0f31010b301ae39394b12b5fca90780ce43e11d3d998030c06c9213615534abbe00e5c0a822f4f5afa584895cec482a2b2d68570769fd411127e82107cb1b9816210db78234a88d877e36b76721c0e08f13f1cf2f6a079d35b1d7007fefb49ef25b90824f89c72382924243304fc833146bfca7d48ae1daf2d3ecb276d6680d14736fc163bea9e815594de19cbbbd4a5b235f54a69d3d250f292bd382b63b84339fd36077009dcf979a2309c534e6b03d7a11094adf7291c4f9bf3dad4dcdcb4384feedb20efe39edfc39388984925fbace39e2cef5d23a489776b250e632c268861b50ea5dc8b1b48b05f05c38031dbf3805862995268fd17aa29f18f8d2e0c5e6d948763bba57d38620903c73e4e8d55479eeb95b103d2184a37ea06b8c1d009f870bf124a22d9f3d700dd84483288f157e3c3305066c4eb8a3ceb4110302b8710ecbb14673f408312530c72aba142c839d4b58fecb4a8c25b98b44ebf453d93605584ef9a44e39aff035849486b2ad23b3d1ae66c6806047ceda18f68b9719997ff71624a1e3d492e6e80794506e5781f4bbcd8b031f4876e93a9f6547f577d1913ba474b1a0cb63bf11f55ffb4295b892002395e3791ea8b575f77d6c3245843a542877a181dae1c3520f3b833a4b30087a1346d781ac995c21448c79482d6592904b97d9bb417c5b4b02b356d24cd58fe0032305f515ba4aafc1264756ccd92a1854e49c5759e254e87662e40f3b5d17ad5c66f13930aa5e0f831578747cf4c80afaeaa2c8ba4dc00d491b52d82d40a069a0e06f855dc9587d0daa6fe87c7afa0088fa30d823eb9234547a81ed634106dcea7e367927920770bf90c7333e9ee21c9157c08f189e701c8d064d2aaed357c20868cd5dc1be51a60f10bb17b1d162ae326cf392809621420ea1526b57bcd2383bb04e35e0e212513a258829565b129cde696ecf4f05c6b857b725d1e8c191454539a48950e3d3616f7896f95aae532b83f8b8de8ac7018a312cd23640a18b25796d07890419051cc5e2c3671251d226ae38aa2c2707f461234660544d2ee470d84dfede94cdf393383bb126fdcbd69c5e33dc832415b06831a00f8e8fdef8cb152d0589bc6fc12852815207602e1d5e309a8073a5c599c05c8d4f564501f30c26471a48edb45dbc3a989ec7ea8ab685239808cf013b4e01e0963c24c0e8ff8bb25ecf2ad3d13788002103ba0ffe180cb77af484493f7be762c573c815e20c9b8768f4092398f42fe0b67f51af70a225583f4aa50301c91339c40fc30df08edf711869f036e1821d6817286d788b43d0bec3db41621b1c42e98c1ce5b3430bea80c7a6284a6472a4f5f3e6fc36567789aff4f83cdbd1719e574e14d9cc4c73bf1c058c90e281ad6da524b94edfbe9d77e14ddfaab3f52c1453d6d88b0d9fa21730ee03319f84636bd637353df4e0a6541a9fdb190becdcdd119c8127e4bc566c0d960407ae65c7a32894869048294202e09526483bf87e9272722ca006a0d3efa3e35573c9c99bbc38913fc3a963a61061028901d3b3ae1191af8286914670280ab49ce068ca950961a173bcbe38a322c52c62ed1a045edd1997814a66bc87cc01044a005f49c06b1cd0058b8e2792918bd2f167ad7b5566072c30213fbbe8ffb4aa1005055681c2f40061e44aa7851673e64213242b56dfd42c4e9f759fa646071a3054e1931f7a68ff3a27789ed6702c46352c82b0dfa0db5a94bb5cee36f7767b50928453eebac15547102517fb0835911ad07f0b1f50345273a4ec55d33919a68224a42a19514e109602d62db8610fd16d42345bcc7b4633588f8ba886f25aa062cadce6aaa670e862f992ba40064d6f740835bfb05d246184bd24baa38a1ba487618579ccca2a32a08f84334e3e6feea94348d572f4ca3228260ccfc74c4262e09aefade0cc3933b03db38ce268338cdcc7747f3e80929d1e149ce8d2feb8720b26c8709d64e3193cfe557b9bdeafe41179c0f5007a84dba6f4ddfa2c7ec50ecd9cf01aa0e7af14cd55fa8f2808d06fc4e50069a2823383816834e82b7a9c942f45088c416fdfc2b679bcef20707f81cf8aa080ce6d9c49c34321bc125a38d6eeae6f372ff82b8f412d3b51069a5a3d290e747a7c5516ce7a798b2fa22a14f7bd1843935805a1db92d393ef866c59216ab8489e7c6bb53b5976ef27b9f908ea6ad0187d796f6d35e74ff5760060673742c3008ce7d61b128181af3e30646d5527978a672952d3fd2056d2edfeddea58bc17705800be99a5ecb4dc7ad3c9db51397d05a1dcfe72ca6f6b2de544551c4be350180146c6e127d66969e3052b70e6f773346b8a1eaac23c23b49da859566a7476056c4f5311e30d09a615d06cf3877277ca88d2752c5e14a410ece8be1a2162007f417a4e67c825ccbcd50d5f4973887bc420a2232cca974b44c04dfb590b2a3160aa48d628d7e0dfced9975c6bb5a23ac9b1fc8ea4f99752c5695f4a52d9452876ddfba9294e510ce50ea155b01485716037ed14ea83df3911ecff47eae95077b87491af742fb3af1e7dd00e3b1afd6e37a710d4e4efc9614e84d0f3ee1d810d446f9d03c526eca27c6814659ebb7bce8a132e54001e8dc38ee92dabf0d3a946d37bfb1e4c31a1d47cb2151c9c7b0ffc3e33a8a78c6ff70001ef1511e11a75102358692eb042bd984d823caa0171a9ff56384a1678f186bd5b272861a66b4b4a60bb847cd824703143978a5814c0be40bc43d219bd5085591878e45cb45e9ce3937bb72bbeb7868b629f2d21c2c82db91aa26b00081f6e1fceac90bba5cb232cee57a7ba42f4876b961871ef3a1b25df476308e4a24a4e398682c53500fc692ac5fbc345661d12f0acb2ea2d1a24b3d0dd386437f97d0d587e0d53f8a72ce185db5154ff8b90f4cba82190a9b21ce0946f21d5a7f505cd4699b09b0b2e9c7fd60be85398076c04268fcefac8d79ce5262d0b86907566da5c6571ec9cb7a218bba2c2d51b7494b7b108c133cedc7387e94452439b20e26d8c57f92ce180fdfd165daa1f6afe6dfc41462d11c36fba4e48d32f788d891029099ad24e2e960c133db3dd66022ea2cf5814eeda3b287ca0ce391264a1dcf7724493387eb6ce863ddf496307f7047025ceaa8649b1d199c5b346408bd9267256b232cbf87d3a4d9ce62377dd7e7738f359f0da97040e050978a1ca902a76d018537a771492278e821a9d783dfa4d9f8e8112987f9d197a005969bf52045bd3e8cb941aa995c60681e8f3383195a78ebd9584223f557a10bbe9ade4ae02f3be56b0ac80801f6a313f5546a6290e5dfa88f988fab2984d12615c66434851ef04b6cbc566fc0afcf59672fccb53a63d694c8e9aa561db7cbd469dc24e3ed3e2ca9a43f2cd1dcbebe34455fed2aa228a3501752fa2e663161675e9bafe395cac3041c83daf89d9af305749f732d85b8a91d242f4feea133846810cb6980c79c37ee3ffa693270eca3dcdd967c226c49aeb6731929b463bb42fa60872f687b9efe050a56e2fd0b3035b0b8e394fa21e6f9ff52e33e707f83b7c7d22155e3d17d7841fd7ba22f77d335bdf9bc88e61c3fbc75b5de87910a003d9218ebd6a5d0cb3173dbcbe406db0fe755d64b117847e6835116123ad1e7fe52593e2db5e39468741b242673def1551fa3d31d0d545f4cd353012f4587e82412187da8c0d9664c662c13b0c378e81bb3f9e0699179851a69f46897d90f91943951388b866355236cb3b440fad5c417240c920fec7b49ec097e293cc149fa3a8f1a1d5d49789987a97fa308b03fdeca6fd28ff206d79231b13d4e9601c51e50b2e815d6ed4eab97d0b8f9946b986a4e71338583a45942ae052c8eefc8345fe2148e8b1437894c78d3c4791fb1e217e9d204aaec5ff029594c5546029dc0265507b3afa06bcc71603973528c736013b1f7b6e8a8aa1f0b770947a1316582ca1b05b8f93e072f3ff1566f7aada51819e74e42b2518d1b2b753dd4b847d72e66b84f80a7cc774624f18405553b4b78b4724cac2491697967b5f9b8f977d59d09c0e29d9844a660661e69b339c50d0d873b3361ddf93a1e4b4b674be8b686dbca03000b6ce66893dbaca160cb10dcfc22cfab07c28ba9b9e271ebfdf9fcdef60bf9f1a28daa5a1b08a86be9ac87a4773ad68b7398e31932056cfac6b260d2bb444a2ed8e6f4965dda2bc21d34c5d5fe7673af2a8a89cfc646e9883139d008259fe71a57662ccdd7e31d15a12abfaccb314982d15c095fb3a796404a0c5dd17519c35f6331f11bd3b345d80b17ab6b035bbab4760678c83e7124df36f44cd7938ca804b7563df18f6b7e0570645d1abe3d472d0594fd8dbdc29dd61cf8594415d1f380bc1e61dfadbd6e377438bba450ff00df0e7f52af871a3bcb155cdcffe49ca22ab2faefd7dbf0733719cc3cc5ee6703fcb19aac0835a3ac4f8f314a4b0240ec723865fe7a04b1798e2c3efc4894b76379f74ac77b852c4ed48bc44aba2e378fef5334cdc8bb772caf011c0ab3856547ad88156e60f58d45f260147ba39a3418c71c444283579b188d16cbef328214567f05f30a238dc672856f4ba0c1be0add96613ef0fee32fc5412885671962b3470035bfb3162827d26994a3bcade1b44c067c90071c67654e554bdb5d9a7f1be6cbe7f5043ddf983c4c38b04a56d0e9a1a5a9fbc64201eb1188a7d5d55ec6c3e9597690277605326beb67a36ddbda9e0d136973b1c7cd5d5c35890c42def50bb9513c353a446b934da58e401fbefd0974ed7342ad3954410488c345d135754145daa2087b5bfb9c0da9c6360c73dd3407a16f505ddf2e4a4f0377a820efa64e85c712830a284ff830d7800a2a5cfd922a6993271c8ac998f5f7d13f0b6728eb7ec913ce1092ae7207cd905f31daa9c1fb46535338629943b71b0a91bcab7369829ed513bf91382193dd55b1e32a910cc713f4d68a0f27bf1d6b2b9ea05fec7b0470e451567dc09dd06abad4129ea0eaf6a3948f04fc6042aa3a694a6101cfd02c839b0727365bbfe6b4bbe48ba27edde91087c11b21230e97b06fb136422719a3dea446deb3679a891a9d3f539f57ed71ae7a7a413ccefdab0ac098385398d0e2cb21efacc78b2f2fccd681f43647c616bd72a48c4df482823b0d26d9c96cb1a57ba9162fd1238a15217907a4df40bd893aa4196e3c69c4e07344328bd36a0ffda79fb19ef599ed6e649466a0021694e32c8799acae42f9da8a02ea247aed7100140f50a14cdac9ee0aa428aa96372d83bf0c828afd3ec7f2827a0bc6e43d863a79b7a7a523c37beb9f792f5f1ce51f09b555ab64e87412289411d04dd54b82a89804892db4a24555278af556a9865524225b591a10f85cbb8a39b474070fca9703178565e1648c369b7f2f7addf4491f6aa99ecf61aa6c2cfff1d755de4afc85fa4d7aebe12e4cb9bb3afd5e1fb1230c0d2ac64ed68b75d2efb0158f879862ac46e2284a1fc383adeed47b904808283d82d00f1bc20a81e7a7a1d3fa2479e101415acf1704707dda70cfd442f612eebeb668f1113bf0ae49d46429fff9073da01543428c9555910e9c013e6a57a041f3c35348d9584f5e1c04e1cd04e693fdfba16cd19b7d0c1d183cf381fc1d0e7ce65818ac7f89d6c881b458d81786a0deef20dd8c4f4fb473c4838537dee765f017d03430644e216c54534f9105820c3109109ae9b3182f34a8a07823303507e0acd7abbb4710c4f079244ceca1e08f582010acb860a7290c8a49a42dcc1cb17938eba7b52ae1b4915b01460e6112a02da4ecb677bcf32b43f3883eded3526a8bf6d4d7ae8711ea3d5d71d16c74a6d5073610a42308fb8f396dfb3492f6e6ac10a596a7666d9c7ccd38c142131cf503caa44b0921bcc69d0946a4495b2d35f53005e5610961e6f8fc37a627b5c817131f2d5eca3548512f8d674e8db0f475c434c24165b6fbb0e0b582a6c391e71822f83f331b753bf0e3eb4c9a0de3cf7ad67fdc1156679dd5a00fa5446fc4b3d8198d0a20c5138e4d90d5ac663d40336f0bae48b0d5fd6866ba91f968a8f99815eb25a34f183e2e1a1740ad65da730b2540252e6d01115e9514b2f928e0b988356fffd806dfdebab83d2d1b87a10d9b28430f962b2df1942adf511a3e114903068eec9e660b1accc0dfb9718df6b11b151e9019ccd4d68575f26b62687a6b76349c182c6c44d4a228e624cf749fd1cb9f988e314b00323153f0839dded97d208a87444867ee308ba4113c6af5433f448550359df80a3aa31678bbe340c1e43bfd6df5844e51432d5529c5e379adcdfdc2478989020de9ac01911d5105ed2926ca976c4f084b8ec26c636b77c4e19202982ca060c43e20164f07ddd14f367eb200fc64d8c9eec1858c6e42728eb380366ca3114742b7f75dc7d711ca4180e2d3077e8eadac39a8fc452c955a9590c2950a870b0c204fe5c68ee6d6ec336c89196ab334733963f7590bc5664982569f4dd549a3fa0cf87674ccd424705ca9ef0093d21b5be2d65517bf8bf8484a8591a82c82ea36d1035e2b45d94388b71cbf734a820e40b52e7fe8aab566562afbcbd82a88afa1776da12f040a3d0c9db55bc441b5d2e81581beffa8af6bbb7e40d7a9667f07b79af8f9b917a09dae5092084b8dc409835b30644d112ee640a115c05b09a8b9ce802df87dace7d359d7ea07a0e1d9c626a6ad764c695f9d76ee5c582e8951e67b4474a744c652fa8397a09d11d32354259196508562a1e4f2e38125d11500dc4a26363895c2781a2209611bf243ce0e584b32c17ea0cf8174613174853d7e380cd5773aca06d440ea2d0941037a185f26b67be19b16be8692e8244e83a5dd420cbb8010cdb91198fc4636dded4fbcd273a33e76ecff3af0484292bc4cb629ad84d0dfca4b94b693bd9b5692f3499565ff9c830ca85db79ec6cbceba208a83b4de62fea542473b6023217403d3021dfb3dc53b1c01fd0465c5abee88e3e52e9b629049c160fe06cdf85256ff76b9c036f58727fea6dd984be2e69ec8fa7616aeb7d24233817b2f3635281eeb241256b5067911226686b72f4c07acafa1e8547c4294bc016fb7630d5160ba198af42bb186397d1714c3207cd542e750723bb555cfb437fbc5ade3ab25983961f103d0eafc8e4b6278e01ad9e64d4865cc06e10dca83fc8b85b59d9e49097f847e0645e262202bc911423aa55aacbfe4b2ccc8b940a801f5191d678a64f304c2cc76078fc51d8ebd1d20d07eb8c4e68a172357cb010882f3885ee1e43cae098548827332429092902ed15144ba91ae0e2d06cbcf262bce1e044887f4e04a92185e92c9e126741ce2b8b268eecd05e2661a7af5b66210d1262caf0351287bf73f2cc3a99fa00a7ada22c278b993a96d1b54acbd57118563667412794c0ec210d34d95a6a74266fa197b22e73a30435ea2125a8de7874a624c6e3cca98c4a8f6835db66c1f2858197eebaddd33902b3e5d6ccf18edb1c4c6d66dd1f12af4d39e6eb550c86ae32bc05b5320986210076701fce6e74133b44073aca81e88eca536996c9376c0ae4253303bceffb4becde61c2f7ba45581bf236dd68570dd858d93886228389f3e89e1d49d218f68cf96818ce1d9efbc2263c280d53d90d6bf02cb1df4350d0cadfcf5a295acb53b68b7446a040c824050c17d2b1f71d5612560f7179e298268698f1d01e78a58456947307fa8f8c3c4a56f60c1db57a08e4556ae7c8fcf0273eb5b8cfdccad1bec44f366e8150925c2ca73449396aa03c4057fbb653d05da367b40d6bf870f3d4d0eaf658ce6be94844ff2c90305dd7ad2db4583ffa7d8d4c40700aa21aaccba08c2f61722bdffde812232e71edba3644cefbc2f69eca07712d57ce89af5f5827c5bc20377deb4d658ab6c31850164f3e9b3faba0aa1c223f1032a73c68541da8772bebcb7ce8ac24892aec846e90cfcfdf06b9d07e90c3ee1ba79dd9a93dbd8f881d091e7b560c88bfe89017aa7d2e0fdb4f1249ef15efabadcde130a9d68fe171a471dc7a2b737f1ea5d5daf2aaf001e45ffdb5362a43356862b2a4d1a10151aca2ae9686f0842b69acafdce98377f47d59c4d52bac95674af11e4c05400eb110d4accc391ae1ab15186a4634a0924211ef7f93f85e3da9866c70cb7656ff0b05acfb85e41ada0f558149fd2a39f3d70c368c8497c2355c93df6ba99a472e090e2734420bfba1753d81c672241ab33f768d9ab5e28eadbaca766153d6b4a8c4567630d3f61bf0cad55b2db3f4c76b6d5e809d5424217c8a8a23126627d202e00e3b1e39f4927aa209e12061270219ba34c731c940f7272c14dc169977a8fed32dc70471f99a54cf95e15e96860e9ab7d2c4b0b765f23a133d85aa45b7224541ee8c05e45adae37c3c91a61bac38cd969ee5bcfcc5f7eecd15dab07f5d8c633c045d1467d55d286d48daf22bbea0770c74611c1921bb18d0dec15f6b66a2e52d0227d53a6a333e64aca0e24823283b2fa7499cc37443d2722818624fd928258b641121918550e2b7f638930e6edf98cdf067dd8415060d8c24bb0019af09acb82b82df76f775a40b444d7e96d0cab9ad50d71e128ac9295d5256d06f358f76af6cca95416903c5c601cade340f338540d22f360f3754142e1edf9b4441ad161300d22be04635f99387dc0dff6821ee695f497a31b940b9a1afef55503789de555483e29834bca211d2fa6bbc4a6af87c0e47e27d653ba95769715e67c3b6b359ead05d3ac6951787c25856cfc8cbf256bc3e757ab661f2bc5f38e03480162bced2709ea08fa135d8ee7a066e7100e68bb57f71f88ba70f8b12987a3f69446fb3f7493ab69b5b7a137f946ac5015547e440cfcf1b85254b1165b506cf6b7d07053c8b61112f2e92dc408006a018e35d3f97ea01e8a57a525a548613748de2e21612314647aa76b10fe1cf83ee660633d4838a2cae0e09b288d8e357e955191f3228ced11e4df56bc8c95e5214d5cc60db1caa8926cfb654c3324d941aecbbe56571aa131d4af77c8f186929dceb48a771006469d7995ff862d88c7706fe5c6462210011fe41c29844b3f7513d6bd08d4bd88bc3a3358a892b4632f7bb1d1d4e6af02dc7b886a73c56e65525dace84ebcdcf2d9c513715e88e0bd45da9908fc74f6c85ed5e3bd5d12df766120686845e24b44b3133c837882eeb212902000eb74ba2ba6321684279a684c7275f9cffa4defb12a62e994c671a447ea188eefdfac86571af729c3cecf9131c81f36bf2ed4e736959ed12b30a40137bd36fe5204bc6b2393263a5cbdbdf4e8e7f16da1245d82f800148d93cac780436fd9b34b87e6ba110cae933cf31eb2a0d4faa5c358df4b0ab0f9398d5f2002fd8c45d191e25458dc3c985706f81d172255f2724bebe4dc5cd839c56d7e25cc8ee0e0728a8ecd4fdf5127b8f9f117e4baec15f31d217397a0cd032011ee6d89c11938cefee6040746cc6a41cd09cc4dd379dccd89e37d7e43a75a6b6c6190b0c608d3b2a869b212ce1f743bcf1d0990f611078a95affee3117305174cd033cb15003e9f35a5c88cb245430e7d2a20e5186a16c53ec2c5451779ef8dbcf17c17c7ac9f3f10d436e0627c79468818ae60806a69024401af354b5efd98872c8e37b400cfb542105b1e35e0282d94a0ef4863daace153dc63cc8669f33e64d0571fa25fef7a9cd87309f324fc89b80012d7b8bab3368b72b502cf621f4b0d259be7aba5a8b378e82dcb0c27155e30b191921d20518ee926d8025ccca1ff366e3e0b1b605e5a7c3d6d506d005db22b128aabb647dbe20d1545c8aeb9be3e4186adbf348b3c5084db5559c20fc400bd0cb3fa2f3d859edb26dd0dcf697872097b7da71acd1fa098b64bf11a2330f17d9e2be9835506d6039d2881ecd006027e399067a052be5faa370607de13250cbe3f554fa5b99ea35535b4f9a90ac1d20c0c2c6911e094d5bcd3a04cce6f15d2f96adda4162ede956306e5b21be2c95737c2d65d3982079e221e0cfede1864e4c9d5e182618204ed4d8d7257802b1b13a7ed8c6188968401acb4e8a67ee0f81d9f646356f439008346d85e25ea70553e749866935876b9c95738442cc4dffe7f289db0864e626099ce71d4f001fc1ffc9b7ec6c525f3c0bdaa12118b008bf01cad65357ea3240d61fc14dfe59835e8e6290ddf0585071d13c40b1a5c2812622a0f9ecead4dc57910ba10e38b1de5485f5bad5fabe66ae4a5c41082f940323b4ef35f000861e16fd75e80a95a6564f55d77e19ee1d39381118f5ee6409adf44d0c0b881a1f03bff56bf012701c6d79b42cad5490f2a6945e693395612b99bb256bc0fd8da203a49d86dad40f17d615e353f185e0961cd494003007d15ffd47172bde0eae31e13d64cb057d4ae2601e02443a958317d3e2ed497a7349019307d6cb8549644cc96b3ac514b248ff98996743d9451301f008cb402e22c20df273a504174b3b272709a90c001e1784fee8e07c8e46e0728600e2d53bf4faa6c8512abe31cc8ff2f2aeca2df2d61c455bf6fe3402a42fbed5756c13b1781b862042ad2b0a1e4c5e25d33379b799ec9db1d6a78483089d9e7829f56780035bc5ea8999388103aec9b1d9f8d22c84624260eaaafe9b882dbfacc1c84cf022f508e30eb04a59fcd1fb5d9a0c2239abb5997d32b0c36d2e425b1f9312b1684b4cbde1add3c13109c5f215d9ca328d3cb1ad5dbdc30c6315977e5094cfb0c09e8c3ca4c5bd8f98044c9b3ce866bd9843ff5ffc973dcb5286cadc973d2344c14ff8b5309f50a5c3acde84367542577349b1b4b98aee10cfe36d10ed5e3b5740c974064d0ea0000a401198996ec835492355325d526b702673c1f94fb6ac5e103171a82e13a682598abbda02394a9070aa7ae34b7bfec186a38a257294ca6291dd388f45e19e722269a549d8917c6fbbafcc4b402fb8306231e84551c5812203b953f903ef9912a51a1ccc42529cad53b9235b01e1f5a3617122e2818f5f90a2a31175943e19676800a958b719b29222edb852567dba1419bc31f039c1bc02aad37489e8f4622df104bd186293be1ca25d66dcd7f3ba097ec12361988443ea18dc595fc4a413f12a116db3232031ce6165cabf2dde0dcbf65f42cb1781d06a371094951e176554085c3a7d54247da300a1e3689c8e6da86c932ba86b1dd3024f3b111adf196e926197464e509925d3278b6de471e9b84a05ae837ccf6c9012deccce3a1e5eb2bd1dc53f0d200d13add22f004bc354e0531997e0125d46866064dcb0a4e8ba09bf88166eaa404c327bd793754acd4662f1d883ee117b479f7dd43b703d79175f35d2f3bd676e2c02d7128f739f4dcb0156254183a228bf8f49052c9436a476b22caf40f54b3660d98d2b01de4f77e01377c1cc59053d16f477ae43150fc328b7d637525f3aaed7610610bbeb1b26ca71ce670d6ef9417c193cf55a71497eb1d1ce1ccabfb57109f2dbeaa4f0c79d26a0a0341824c583089b682ca29aa92d193f1bddfef1c631652d3497e68cffb499ad4b42fd7741e040ef5e34c55beeeb3451160a5e667760c45bb4bd194d2c89ae03a7b85f897a46bac3d2addc19953784256723b2962639a59c193fcd9a6165b2570939649dba3ea08cdc224cc11724b5bac11ed74a145c6704619728a89335c00063157d4e5f4dcf33e945938332d139fa7c8c5788cb64c8ade73ee0af1506347d576a1f1d64275e054be075a04ab28156a7f2b0299d935a3ab9e45e0a016709ccb67e38dfa0507216a6a0b1c78f10758908abe4ec24622737481b8fe6954ff9ffe51095ae4645742ae73e523703dfa6520615764757f4fea344c097097d9b3293d66a3ce1f383c6733cfd249d612d542c166c28113fdcf518a661f055934cf9d2496e6982f8d87525fc51f2dc62888bcb008511fb3fd48063ad593a9d08b931ec487d2cb777559038279cdd8c9d66ec921a0b775a52b2f2296bfdac9d44d7d16e312a6bd77c0d1ddca0a1eab719a237943336b2eab161d608b7feabf2b9a3f44a9cde632f18d49b8d68259a267b780bbba5d8a796c31e58482bdeaede20b92ee3bd3bb0fb0f97f02a3fb79b323aa86ea91992513fda9cf1633e8bdc755566106aa4594b12633bce5f3f61119fa68e447e0705f1e7c70aba7933e8da54ddd0c874391f8e7b79043f9d46389989905430fc8a180af11c61b5aab070787a28885d1838b88b9ff74d13a6784a4c2cfed7c9dd79a090a118f0831cd62ead26763a7847601cfb5f7bb062fcba3db4df7eeabd7a83a802147cde4d5bac08b39b29c134e218ab13d626942750e2b1479cff78749663c56005902dc89da66f1c2ec001c6fe6e8d2f6273e712ac779407b95fb5100c0bf678c6c0104805a0c6d261c031a43ee02d2b7b5d559fc228aa34d62dcf23e5a57b0a756ee84623238bad9a41aa5a0ae0e0185f46704884970ded9ec4fc06957ca1504e72dd71127ebee249ced4068e0296e883b1ac913e84ce18e2540ee98e5b7ff55b2b6beb8e33b9249a630a19292777ac13be45346db65fc20ee68bfccaf86c41d337b8192079a76801799b058c6f512e594b2c570b7c0780fd78be9a9e6616ff89c9a0b5bdf214ea5b7557e30a93eef754944b31123a2177bfea48a5a0ad58bd447057308733e5e3b3832e477f68c1138448d4fcb4eef0f31f4eb7e9326016748d2b91f62c8e882cb26172f8dc231417ef3e169620182c4948dd273680fd52b847cc19ea52224311bfacf6bee30ce6bd7a1a8b22cbbf2ca617e9ab25c61f5ed8426dd40d668af5641247e9dbc32462a01fe980070ff19d4e06c4e929673c283949dedbf2a1b4334063349756fc1162e83082b031835168f4b50817bd6bd901b28ecd3829cf24f6a2db2bcfb550a8262c083e1949498f7d4267dc7344d3db61e2e1593d59a0f2b0a55d0e5b2cb67186b7c2a0e761546f1cc21863f33dc3f70a5d0dfdf1ae53b038a33f9875fc3b7be12459f6f0ec3371139e6f5e4a66d56bc3ee13c8323ef0dc9c2473cde73e426ce7c634a1ca0b0c81d720e46088d7766566f4f8263d3a11c36ffff842020097408e6dc2e363c326f1f33a344720f837f5912e164abfae92f7c3dba3bf9bd5c1e3a603e8b283962b7cc108d0d8039e5f87ebe32b5eec4c85fa05420d578e7efe0e75bb82c1f5a72ed1c20064450720a017e25d3d8ee68b53f120aa002c49aabdacd60a0b898ed8736d22f67a9b46edccb5994c42ade31baedf51ed5a87ab3e1c56f93ef5c0b1486d567959d5ae2d3b2b4cbe3528dd349eec2c1295641f550357037a72ce07349b768a90cdf19c499c17674199be26216da8a1d60e074fb306511585cb47e7d22aa0051d2794406e2967afc7002e72b627d466327d3f31c6f82872392e3abb6c07240add01afaf56140150d996389dc83fae0bc7f088daf31bb181d758b9f1a2fb4d8bf785ff42729e5907f9a89420e280565c0198d6ea66d184b5a3fe845c1574278da0ccab3c8319bfc6c2bedaa5712ab4669de18b818823b1790b0adb0cf5e659ea94b4e6a72d13689ac34b0c853f74be72b586efb905c0a5c5b113763414f32ce5894a275e4bbd37999f1223863015fa0e570168eb0590641e8c651d7c5635e47e3e666612997969aa026ec50df6d8ff5fabd250ae52ec1fdcaa96aad3afb6a083ef0870308110b0aba0d5df41b603906cbf90d9f9851ce3314a4dc4fd46f0cb7b5f495503eec29ed350de8a805783b20d1abe6524732e3c3127bd6fcea53c5caee048f8f6c76276b72eb63857455eca87b65989d0fac318d8175d297106042b0a560ea6a61392ac4877e578442dcced1070ca1171f4aafefd4a0d72f6809da76c1678df33af08b794e445d1e9395cd4c1a2c2b7f825bdb0a148bffd16dd0f52613d563dd47161d8579f568083ad44642dda63252be16d973b77e7f4ac7ad63988ff83cc5237b25bb4fcd57a741a09046fc7bf7e7b78a9b649a4fb73295bccf50b00edbf7be96b5af9c2f9eb429f6125f6ad135595738d548132bd598cf5acf7409963e070a04c007de3a7f73ccb34631e1ce03686278da343e1bc654a017e0520274008ca6fdd816dcced3b47b6c16b831a122c14d8652793fe73e039110b354aaa5414513323883e1eb8da01795c74583cbf8f831536aa1d82e72e899edb15150516fb0ab07429ae6544d3e83db6c8792b471f06e1c5b77a1792940dc95cf0af73e156fc3222acbbd647d5441e720f4956cc09c3d8cbad4236becf144e8aa2f6b3b6dbd40ba5ea404cc8968fa7df0a6fa1923ceba1b02fd0cbce49346e9c669994a96be3710469401d0a433c7ad8c1e8456b54ce7eba9275ad561fe53f04bf554bd5401e48686e2815b4b6d0bd82035e9cf7143ad7c7356025d157186193dc49b16d0c82bacb10c11039056021fe8f53f74c7d04334bad1da914386edf891260afccc02e7a339371ddb2551b82809e2cdb884558eba178e8bdfdc0e5e2c022207067ac60bec32f21aec503de8d7dd2e8ee61596ad8737a89907ab763d023c74c5c40bcf880322cce3ac0cc4df55cc021aef05f707bc16778da2d2b10a35ead1e2a6fa85fb0d152b1970fb2147c40f70b6c1ed00f46de3f321c50cf1821c21a57089b760199f39bae48a1406b2be7748ed8a69f614514ca9163d0291f7f9b91cae4fd554674811f689e0acae72b993d60ef55832d7e1d9856e444097eb2993a5efa5cd7831206935566a35ab9f5ae3231b82442f70ac87f4c8b4adeb8ef5a5e7b69be28603208c2ce3a7ad4ff73d870ca051e5625297101ad80206e514e5131f7c9b26a89f968956ce9633dd2b0992af89ee371b8b0cc908eba2a5798f03116dbf006cb9c34be3a98a470b04ddb2958ff018a024014d709a9c4276467f7e188c2c91f75a9d24b3c527c91772fb0c7aee03356c1e1dee634db1f4cc6543898769ea2011508bec317077c45a7c565681d929a0b09da1cdb609f6f6f7210e2ac8bbc960ce66df2066b1a5822715a96f34892fbfb6bc215c3a8abf9fadad7a81ed4e381d164ee206b828060a9759ac47a2f41dc0be0a55417caa9ad458f77b7b0b83ded6a3dc622fd88b3dc9c0e2360aca51dbe85a170430d254a4b0f5c56dfc1093b54d218ba4136ed53bd97fd5ea1137320db57a7ea757004dbb2b285a58dc5d0b8c205446cd31db426e144159d6a94c3675fc31edddb1fbf4fc1a3793be11a49db5eaf37b497103cb314e250d0b4bd76c236c1d270d02efc4e815da2c0239f66b82915491a025c2192143552ac69b214da60320c7c200466be485ad62ed01808d322b713049d5b7be8d2ad2c59f96ce39375fb96514e143d3fa2c8fd61ace3a6fdf3b6f25e8aeb3f33aa1a20cecbbdf906461bff84acafe053818e27f45236052053bc70538caffcfb475d6498e353d7f5d93ad64361f306786637b057d286de4ce000ebc0cdf044d3a578fde60aa763ff6adf1bbeaaabff4d32da71472f73774aa65369ce9e1f45b2a00eb869ed54880027fe383f5d6e03e137733ae930c80bf4193d1bec3d984ec61604db762c4d2dc83bfd1175bd57629c745ef372a241e920f117a469018846e03ca584e7859309a554d07ba499e4b9e4bde43d843d823cebd160e7a6e033dc70f2ff3232d4b857552ad30f2c33224f602d2c0418d1d3c0c053bd8381033ab73f31d45e5ccbc4415ced5e20ee996a1a9abe3021bd2dade6d6def2d654a2905260796077b07432e23eade2145efb851d050bf9c1d394f23f98f4cfe784e9dda6c9ccd663dfb41ecd9f6cceacab2f45c92bc817459f8e56c26913a2cf8d0f596b671dca6692ce896b7e8a65da51c1c1b3874e4e8ecf0ac735cc75332f73ff74d41fb67dadd5fbf2c43373450dca49d82cb39e5c7cff100aac8ddd0d841280cddc559037f59fac52dbab9b12e1a0eaceb37668e60c042ed7d5f5f77a771578dbe5152745354c4b36ed1cd6948b72a2f7cb6b7b93af62852f7e987a174316cec31a4f27633ec0c263337d6e35c780c1db734dac5358eff964a1ca7392540959ffa2ae5afb4ebfbd24c8c9e5163734354e5efd02dae1e4b47c8f4423cecd5344c13f8e2d234ccefdce33870a5540257ba721dae06aa3450a5711fe0aa7c827ff88783d8876b003c84674c84475f669e61c9cc28fa4c513ce32ee953721c2719649d8f09ca434407d46eefbbd43042863e1cbe130f2728a0e2ce7c90bc982c41d939888194a0628a4f4e405dd41d7d94547167ace3f218d6a3113c6a3f03b97488f2ef1cf53ea3a6439a4ef33e1bf6b5ef865daeebb85d151b50df390b622fa840b78a238a7e91f08f53146ba532d3cf7533bcc0828a8be4a7b6985a241b3a3870469d22b59f759e7ecf8aa5f2328e481a7592c6209ac0a00c9f2114b33ba358327c863adcea33e433e32ae30823325b037fbf03b6866d999f6ae1c095a250289393479d98a050140c512a1d4acea329a9d5f30fff18a58eace7795e4a6aa512babcbc6462a0c4808a9e2bdc96e8a2768b0390eb795374ccb352bbdbf9a78786b93bb92ca53cf13abb3ca9bc3628eaa80ccea0dadff9aa16bca1ebf650bb4a3944c6760da08f3492465a76e7384a53bb9efaef6a6edc85fa7e1323688b8b547bec99b7fa5d5261783204ad40c35437b89e2658e394c5336fb178c8410a06ca5555a3a3c346fcc3fc6cf03ae4d3dc5d79a21dae3cfd9ee4eeba9fdcdd5d7eefa71a1c1b1bd3b5eb02edefa11ee2a3760fed54c0613df40345fdc2c4b9e44529fad18ecb25b33f77774f3911c7519a4ac9642cb63b1ce77289cc913a7ee4aee644dacbd2839efa7be8b990b6d8433329cb5e871b2b468734336a6c867a2808e50aa9542af52aa1cb8bcc4c0c9a1ae757dd70aad4240a2aa678741872a7525af0abbc94f39af1515b8b29a040620075a7d80150edbff9c19741d9433793ed70abf049529975aa5d81046c15a72be85766ee6fadabfb16c3da1a2832a0f6146b0217dc6d29f7b98652cbafc2889ecaacae526e9a0ca718865a5407650f9d69220e899dbbbb7227fb9c73ce39e764097e00a694526a4cecc6ccdd297beeb6812973354dab9d36a7e6227ff418ab48bb1cd09214a6180431e40874d61d8370828931081d4cd941a5310820b55fa59ba67e0c6204620925aac2dd57babb7b1032a5697777770fba5d9895d2fb88754df99395627d77773fa1db0f4003d1b9bc8915ddddbdbbbb3b981988f3c06b82735a4ed1bda69acfb55bfefc8f07c33ec5356c87fbc0cd37900b6e8751acc8a0eef30b16261cc1bab81f28112b60176c4c7f8a3ac7d1d06818d6e4cfc7d13039fee3252c0b1396c53f6c186ec286fec4b6fc9d9f50fdc595ea53547faf8aeaa6a16571d98c75e8838372dc2595722336e2e4c75a988bbb648d48c47175e66c3ce016c4f0f20caa3310507c26aaef6063e43bef70307f7e62d7dd85d0754ee2432dbd23715004ab273ec751caae65ef4dbfb19e5bbce7e47bd33445504d9c163f669a03614222096a69db9ee338cff3bcd2779d67da4a2cb19d5037d921b831c0992b50c9425981febab823cd8c74264023104488784148dd2b8cc8a49e6531c2b7e0165ec0152e5cbee8da4d4013be5dde6f6336a5c3e5941e4ba022c9091749fcd48d074a76aac80d5591ab5c48aaa2573707ae2446c4376b07fa01f99c53c5ba331e4655b2386767dad52aedb74e0ec67dc987ba3f592596102fd8a623840c6cfb1d09e3de41d187aa813514c6cd39b91777d419979cc339959501cacf95bf1b7f83560757b2886adfab5b552db8cb4245928fba5424c96a0a02ae38812109551471931ab0d730a71b5055becfe9625715bb83ed5556ae76ed9299bbe949824d817c4030b283145acc9331ece4ef064f4a2955376c554657599212ace1d5540dafaaf8b0b4679892c61c33289664699a683da7ff4c4b50754375961194080f20bf0f8ea3f27b359f5b4c614a7fa842274ce82aa8521d7491a199ac9de9907f091def16c18a172ba0a9d94da94dedb9962a0f0ed6086b2859ab512f5a556e29a5fc969ed62a3c781587ac0ea6a6047705fbbd05cf0909c7fd6c0f639deffe2954a0a257dbdddd5d05ce1e0e9c40431a121573cee90eaa64b8334be71774b364d6895bb417dd414f7b21046b9ae7350c57d744596b80758707e95e6fa41977568d46d2bc55ffe4d161bb3b337b1d76b760a02e7dfa6cd5e461d61a8d543570d6a933abf37e37c82c4c6a4045e9b517042a4acf63590187cd76a7594f0874fc01c90417c89c28225044507f6de2905503575ec521eb642c88a03f321663190b2263cc1e32995117788acc2832c3e666070fe0d8c09143878ef771a512e72f065f344ddb386e7317eebdff5edc22199891c3058aec136c6016f3c681aaad5ddd41716a1cc7719dc94b2e338acc282d8168a419696a6c6e6878a0860d1c3972bcaf3d1aee728e91b8257e47b3315a0caaa208813d08f5807aef1bece1f4df778db7ba6846872b1d7695db263b2554dcb187efc17bd4abf86d50ef7d7f2a062b807aef754081deeb7002bfe78f46367ea0ca03550caa6abcdf6af381ebadd2c3fab97e14d43228bef42f28b6364ffb6c701697bcfe6ee8ba3d77e5386f9f7eda9e3fced475a612172ecb8acb4843d43911e3da7c96528ac06532b81276d81cc733aca24ced9a09ee86ad6d35d7dc14a97059fa690f8a7384e3bd35e1f57abd6662d0d4d8ec40c3033836dcb940c5d4ab5fafd7f4c18c9a9850fa264f4d280a8542a150a892a9843a954ea8d3c9fb80a0b1092491e8c72650c947c39c909090909088461a8b2db7dc729fd7a15028d44cca4acea3316866d4d8dcccd9a953a4e8dc7d73747678d65d74818a5b7433e5cb8dfb8d165248a1024405084f4d9bdcbdcc53501499e2820600549c6955f7f907ddaa982c4167a84b7da0fda91cfafdbfaa648ce0081a1431210757fc60049f203c4189901596c8620998cb50975bfcbb9a9a52ffd40e1954018914c4b200c20b4a7638c1e3094e2802115a00510116c453fb3be6e598b957b0fdd518f716accf605f2fa1e6394636864f4a255607e9d047b7fa596b1f311fad695acfbc65ee62981b495274c44bda166e2559bb5c7c0fa186bc7822295ce4fd30525ea09aa85d28adbf8f8e8c7a825a6c1e26df0eeb6f1e0db3e3103cd539c892ce699dde61adbcd0047e875a0954694888b010477c88682fc387886b9afb10f129c23c9a471414f529cfc36595c687cabc96f59007b69023a8b847329613e17867da40eaa0e845b51f858d9cb07484449f2c97e908e908a1c0d36c2c42c5f043824a397724cf049d87123b5ccb64cfcef74c4990f68ec8f5a46918d65c73df39c209eaede7904d93410dc3a33364fa0499734e9f204184f0780d80177474d354b8d79e7fa5e4c28f5383c6d1ab69701afc39964bd3e034f8bf7a26464dcba39557dabd532b0d3377cc7622ec4aa7b1b9f180370da6820c727777777777778f716ce36c64d7498eb9cba65bed1f0ea76ab32cfda693176e6f81ff2c41bb2aae9113149c00519b9f8df97c06ebc2690752db99f0276aff0c2836a033a000a11f11245c03c72dfd5440d9a12287a202eab3d2b74a464e3d7dbf17691822958c9cfa7dbf171d51c9c8a9de03e0450e00208ecfc0ad92c0f5962ba12a15fd508aa0fd02eafde4131788fe73d2027afad2b3c9891154f49f0f09d40603eb6a30943a490228efe24f582ebebf1c50fea4937efa078965f2481e259155d699aca8e8c84cc890110c1af6c360ad548a60bcc9d32ee2b24e32c30bd1c3478c90644849bd9021f5220546bf0911ed360112f509922fc3274806d58eeb763f4950864feccba119c95dcd830291927ab76b9e55dda0b259bdea2db002436ff1efa8fb49502503f5925bc47f6e7110bc304979fee877cc92a00ea1183eb738ea65aa7b67dd788eea2a18cf2fee88557fca52c10075586fc1f8f5167dfa3040b1a6728b48531d85832b08d608c6cf34ea060c90fbbb01f5ce125daa3fb7f0772cb1a6be783779144b7c01d670a9292f03e54f5240cfe9d084d54baaf0a1d9109f1d116918b165b55f1556d6b2243d0b12555001154ab4e00710b1226240c59127c660851d1c85dc62005e80b724dc110319f018499105134934b1c48c07436259f408e171797552ce0e4f7fcf2a0a8b8d5848928ada9d1c41bbe78893fa07e59def48e9992c41b52aae91e691ef489074d11123b19222231310ed6802a37a62f2fdae53572a21aa0355cc47b5fdc77bf865f8f4b04f0f83327c8096652b1b358c4a02fc01190ef250064f8ca0fe3399092827a0338dc243ce704bbfa9c2b8a55f355b252069c1095668c1083a476400e9420f21533cc1840e0db7f4332b02dcd23f763c4042135a5861a4c50b66ac608b2a00912489279280992c414daab84664a86e70ad21024fb500b7784b7efca7df838a4882144d50628b297a7cd6e503133a496ac00229a4300558ff100761d9491c89e54b3aeca40e9b0a2a72ec43021539e6ee7bb404154015d788ff789003f9a0e21eb9f34e2ce6ee4122effc308fd43429dd9d9bc71da9932b951d7739c7d19de6113ba9f637c7ea9286c989c9e410aa93bee326d8d9f1d9d9e1c171d78c6df11b413a82a476524a8a92dfadf4686ae53ffe2383520d23039fd30512edd053b8954a0d43a48983d56ab55209575e5e33316866d8f02ec7cccb9de4dcb55aad7038d5d5b2f4a32c41c559f9ddb56dd3dc572b20cff3bc94d44a25747979c9c4f88d7167c95de79c0186cffb47b3752bbfe76d4d74bbcc7d92d5eb52faf2362cf5a14b2ab54209757790b644273bc2f123572927478e0e0f9e9e9db994ced174d11705ba1dda20e7106abf267e0c1327a8b84738ce134c35f7118e26eb5c261e4e150757b9326b6bb79a941ac72c1170d541a9699ab649d0ad5b55de9adb6b9c56e2346dd3c295d46645379badf7cc7d3616212a3a82e4280952126fcf7ab631dfbb9ab7ac75ed14dbeaef2a2a8a378edb64c318f61bb3ac1e62b5cc5b0d4bf54c1e15b913f938f35f7b41f03ccf4b49ad54429797974c0cae613fa857fd4d75c7208c50dd3966e629d9864d720ec7711c4d49bdca8acbcb6b862bb11ad675816eccacfd1c9700935d1958db7d03d78de3368de368b0cbbcbb724e29537ea8d4a42667b81d21ecde7ee997da2fcb92039ab2314cc3c6bc6c0c83fb375316151515dd6c2b60de6596725dea4ab8ea905342b146aafa83724a4d6a92775b020cee6408f59727432883333adcb60eaccbc79b8de1aa2b61ec5f222554517b7c6ff5a99e6440c55e52f43f7ef87b0e96d81bf8cca1f02afa8fda737b0c6e825e0283fdb471602fb9292a72130a783452648424099292a49ca939a31c41998aca0373b5450ea2f637605d2b96d918962fae152b4358fd60af2862a302ec6a4e4dd35eb236fe81889ce9b3fde41bc839cb2244451eb77bec91471fc72e19a15b15fef941c95084a8fc1d773928416f061485092a6e526bdfdbf65b2aa581cc03328f9d1ffef17ebbd7a1e4813d780f4236af1e5c96797874385f74d9e90d6ce047f70b336934ac1a6fcd2f71105087736320241a38de9afcc3411c93056949a238b9c149162759f8babb8d9c1d1e3003088af92ebf5eafd7ebf5f26e0895bb31ce2693f6f2f6f6f6165ff36d388cf73cea74c4867d32842e284b25e9a57474ab1f076b6bb8b12110c0c7daef51df89a5fa4ebf03e647acd7d2f7db28d5d02fb1c45d82b84637cbd27f7ad4378aa5b2418141182109e683cb6042fc3b601f4b150018c0bedf01ebd83bfd40fd4c53f0e5ad9ea1f11a1bd09312547429a49841dac8510495394acc271550395271915c8adaaf836be05a6d34cc8e5a1052fb71e4b09182042a9af4d486d97e80b6594b737e367026427433759ed799906c98d0806b6e76a081534347cece7bde7bef49f95e89f37840c5255263d0f887d3ddbdacffff17a29a990f9edd5d8a5e4504f85065862444502c168bc9840ccd8814213252644429a594d2918e74a4231de948696a6e68cc8e8664d45d34231d29e528a536a022e7e47020cd10e72dd98ee378645444e4ad20388e86064e4cb631dd6cd6617fc77262a72d28a54744315389524a29fdbcce898888726239b1582c168bc5828258b2942e9d794e779fd2dd3bc52c09b8500f236c51eb0fee97037384b617e2df4f02dbbf0744357f47ddb80e5b6e9243cfdb9ad845aad3797136e65b9f2bab73ce2054dcf13b82f66b3713a7b3517ad3db94dea44388eb5e8237b8a660d3f302dd401a3bf850fefef9367238e7a0c8260d7799c059026dccae5c371b600d25683f581776e3afd2e6bfbc3571e6db983c900022882f08c10a2638016ceea8c112582c91138314b8c008369fc65dfef3e7cbde5290da546aced4949365cf131dd0d7cab6f85f64523e41d7368edbb4f0f5e29ea0a8a6281b6ae68c5d6d3d6f8b44991d82d67edade775b18ce5164732d95be3f1cba9abeeb4ccf5f273f79faa4b421c36571995163638ac2e5e5351363468dcd0d8d65de654ddbed52b44de34eaebb52523a25c5048a300c432d5c09c3deacd0b98c4c0c9a193637343c805303c7e73933872e2afc38c83c00023245907119999c248c807c046d91cedd9d73bab952479525e0a9b2043caaf41b3e88a5a2da3a48ee494a8e3a5c89848950ea91c84891119224484a5c3bcb59673ef1b9a227000e6585b53578dcd2bf2fc3c2a478381edc0e97538186bd00b7236fa1e8d4fe9e6e7144703f20391087822de9e406947f6adadc0ed25eb01ae6ac6dc996c4da90503625956bd8c0b02dfd5b161bf66f62d8cd68086a032a3692051cd647443dd62de50454eccd48fe48a02f1644cae4901c22679248c36cb2c8d81175c8fc035471749d9b910ebba8c33e616dd5264b01d5595bc5104654ee3456d769ddcfd36bacd3a69d4c1f4c4e5837b89a988c2a4052c51e774cc192ca422741a8d823912174237257494849c84654fbc70be6c9279337a2ad484887bd1909a9fd9bd176b4216d492dc5a27c7f3bb130502c0c5381f2629f9c9c9ca4b8f813172927271d0485257612b5b68f93d661244cc446b8c8888f188995744e87b39655ee182876d06b1c4bb3944e51e2bcdb52ae94734a29bf205039e7a6cd297f2e0b6b61305aad562b9570e5e535138366868d274457ab020440002f2dab6eb96d52ae561b16af12babcc8ccc4d89936e7cbf9ad95ba322ccc6ed82fae5e5cbcb561ea87a022c7a5523ffe3f5c7179c9c4a0995173c3c3d3a137a787628202723c1f0e263c109fe7470af330100cb31cfabbf896400851fb4393a70fe3c5f7e7e01abaef27810eaea1f4fd3e700ddcf6fdfcc3c668dfffa2590f14b7a88695d9a409ea2f3ecba5f267a3a5600630179f000308c1e8eb7032eb7e3718a0024c07068e60305c180133791d5010a0b1d4fd26b048ea4add6f0228ee0075bf09b81044f5866fb18501ea7e13e02d4cd3bdeff3bc55fbcba16bf7fcdff77da70f75fa3e182c1c968d1cdcc26f6291805bf84b2c1ddcc2cfb17ce0969c65f96159f85db078c75b3cdcc3e21f9493ff19b7e3d49f17787278e3b8cd935ca9c4b93e0f94a5ee4f0a549449c9ccec98f254ca844bf20588914c26930d0d998d458c141d313a4ab9cbf42f936d0c6518b3ba9a580bdb365a8362cec9b8a27136248b05cd4622d94854d4dddddddddd0b339241b5654332998c37c9494e72dbb67d6fe0aec844441c1161d4cddf8c2052d7075a1ca99389d6c510dd9188581579684748e5dfba23732dec0448aac843ed92301e4f70647fbea8cd2a59b476f2c3e1c3615f33fd4c7355b2bcca1f0e267091401714b7efd74071fbf933fe1b37ab873c37771aa6c19e7120c73c22528aa0dde7414155ad6af006d7f71613a1a6a0a82b68f77408b4fb9327d00ebc118276274868b76da29aadd37b84a023425446c178c79da12cc0461428a97cb233371424a93a423bf2105285789890b7a0de205fbbc163a81f0b88888ad8888f7cf240aa224b1e477b2205baa30c64fc73a74fba4079c0412b43f1c4b6f08fa8ca43cb52c3876c903ac63ad987c6140ca9fc2f170b199ae9ddeeb7dbfcb51a3ec4393a3adca197bbd808dbe25f02bfdcb530e6d9900ef9bb1779a8a603df5b3bc30914e8feaab0a9690c18d5a1e0808aa9caed2e4e65c32596caa6a4837a8b0b60a25a984a07b007a33ac5054214473e30659c5432bedaffcdf407b6cfa1e7d6f503f255372c10a4e0d9af8110c591eaacaffe00e283ed7b2c950ea7e79e037bf0fea4d281eba1f4dc8d4da9fb1207f690df78de73a0ca86e34e60cb9699999999999999999999999999999999595d62355117b511ab8ff8e391fad04522712ee8284df1377f4a8729ca8129d6ae3c7f90a59221679539704e4ecd61a6b95311b47dc8c427d6838a1e549da0fd2631dafc2741504ea7baff506d1faa332d4fd0ad8a38916a9b8650dfe9a08df1e798ef80a1f3eceeee1fa9a23c0a32834083badf33d81ae6c82dad9280f681b1c7ed41157b4cc923eefbe758126751ed5f9007aee22c527b8e613f9bc030ecf107259a46667570163901a288fb4ec3fc9be137768beae02ecbb61a4bfba04d6ece6d913a66287f5659823a5f9475beefa8f3251207c5cceb246c4a0e1185dab59feba74e18028b7e174f0216fa6baca8fd34bc306b3f4ebf0d3792b343c3bae3103ba82775c721623c01d80214946842688788d811608d24c80b88f063488a16209155f0c81df4a852a999219c98dcc0c5c6ede08a05cca4fc8928204042d1d342c44f5c6ad4e942a73e1c75a05067dd51e748155d64534a398165d9e4b2703edf29b02c4b1343a6c37d7528facf39a74b87fb9b4a719cd339a49b99999931cdfc8c8d11015727b04f818d39bdff94daefbf646662d02ce8220b941ff57da5dafd9ec05d96eff70bbdc46dad4d955dffafe516461f28461fd9e85383d10706a34fcee8c38364ec515264ec3932f6ec60ecb9c1d81383b16767ecf9197b8c61ec91c5d8e3c8d8238994a8d9d0d0d0d08cc84864e488119223248a22a36258dbd4bdb802155f0c04b44041bbafd78cce249399a9618f93984c1bc32cfb3a94c9e4cd74d82dcfc9e1897912bf64925ecc4849491d6eed919483d3cf330f89150ce10a49f00811e90001e171451451e0a008ac41930913b47b93fc306c06551cf24ab38ffc3440af1935f37df6cbeffb69805eb5671e911317417dff8cd758fbd534f0a3582f4d03ff89e5d234f07bac95a6c1e5bdb38b61ad6659181a5931edec30acc7228c827cb8d8dcec40c303ed3d92b8bf572f62488f243d92f448d243490f0d6d8cb63128134a0e68f7a66e686826c30f2ae1cacb6b2606cd0c1bdf3d552e01f56c40470082602c4052c55595b091054778572b959597fd7ea5b2d2ffd2dab66973b5322a49010810204094f032bbac4b17e366633417d5e4aeeebd77d7347771578c6ef5a9c60842b9abfed9a043f79cb76eece8b12428891d295ee002200c0891c41652d0820f2890807d600fde9bbe337d0f9d8a3d968a410fd421c43aba8eb5ef057ad34fa31fa7df460c6d6aecd5fe6ca8d1f958db346ed334be31dabac3a26876dd8c9d605c100dda2124e548ca91a3b3c3d30314e423268351e2dca5818582dc36e9724ee91f6724860e72947e7d8bdc7cd117bddf74ef7d0e900359eb2b2f32447e6e1bb76d520e131052d3a477fa4e607b9e4913b4a58a9eb76d9e364d26cf0237867b0edc65e1beb449e97592ebf0e5e5fd9788c0bccbec7eaacc52827294b90e413a3a3a3a529294a3c383a77bfa27a89779b56a1321ea2fae561bd3a6ae3349a9795aa9b4da1877b1926e352769006c0d8cc5b6740c5f6159baf49d6cb531a7a325479447ed544fed19101f6d8c9fd85d35dbeaefa22522d2466aa73e19d0e909511321ca75a9e6b0800d6f7595650d637a3e5a967675906e3563b1456a91d72b010968b5582c19643031e12321ca5571f5015191677cb473b673b673a4221ff99bb88646b28123c79442dd6c30bdd4be0968efe2e26232994c9f673275a695dccb4be6e8a809734e4d9bf309bade9261c86118223941db36cdebbc6e6a1bc76d9bd779dde6dacfdfde9f9fdbb6adb4994adbc66d2b39ae0950f0b8df4badf855f8437e17fe17fe17bf4c0c6e963dd44db0124eed9935df4179c3a5fcc22ef36e4fe1884b5f31e5beb8d67579cc673646c66affcb0922c9fa58bf8b132dd91e19e2c8101bb34796a55fb24e152544c5d791e6e6e666dfaef059505050502c886c680891b1085191cc3499a697c27128949e80b3ee64089d3f7343633b4deb3ae9ed8ba9174397ea02f4963773937f1a86166818ea51ac192b28e72d9e99386ed99e73f74037e1bcaeebbaeef4759dd7994a2f2f9999a0a059a102a8d42c9a8962e9d48c00004010005315000020100805c321a16834a68aa2261f14800d6f964c6a4e9e0b845990e3380c638c3106110300010600638010110d39fe7a2a0e575f234915c57cd5f16029242ea1c0266707d16ca4087b2718fd52afce6c219cdddac2b17224c5da7fc5ebd392522b16edec6731125aeebc8b5dba64d8e1d8d047320d2a3cfe403a918421622fc16a5673ecd9ca368c9494d9cae58a7af692aaded8cc8994b1beaf7ffabfdf0cdf331686c7da88690b369d964d346f54b009fcfeee131a9743390fb8e3cbac79050602bcf41da6cc706d83fe891fba093753070e02339f69399c1f45e0605e89940eecd03abe1c7307ac35afb820ce0105cec51755c488d877bd57e31ec9c4f67f0ea7eed29704101023e9609c56975c76a67e1c694e4be7935a8b79043a449ca144a1f567aed41afc8698be8077099518df09208ef3033318afed2f410e3cdee35edb3e40457e24cf40ccc311d9dcebe3ed23e2da129fe690fb5715c85b5b1f246eebab53a2a12d269e078036a96ebac100774ef9483573d1ece0b4aef8e94d699044b9d43d63704d590b0a896cb7335fe2db683e366fbadc08c4e4072a3531ba73de877b2d0c1b663c00e842d72a6181c60e9a5bbf5257dd05933b521d9115eb008e5853a72899f40150183909c20e497ce55b146105ba31076344ac54f55705036bf8575c8c2451774df22c14db055ce957302ce723c1f98429c70f244e13ca8a944d92122779681cc72fa790dbf7e4e29df103736569b5f7e093987b3409a3dab8b9fbcbd250baf53843006a8d58c2aa1d7eae6067a2cd9f95899430c922e9021c377b856709ebf6e3f1e42da3894fff14e1b44398693c614e12fca9e8f719433a142f36dc0665a0ea1640ceee7f6aa2a583669770124a1baecce7db215257bd16d46a633d588d494fb2f7ae0f03c8da714931361ab4cf7a42f85ea1ca6d46c153a24bfd3dec6c414381988cf9c38b3c952aef4c3d5fc13e467b017a13d04661da9576ebf0a9186c7cc8927c9bf9d3d3996e65e0da8a22534b88917c4b416b46f5539cd880ccf3db83d766530c67eddf0fa18d7d0ce044c0ec87b2c4180d323bca5c507258fa030b4878e2291187591ed8a20c6dd5868ab2837aad6bf44c2461071514896952782df46b444f65e859eface6a32478ee2bf9a3cc616ababed0dbabbf65cf23a1dd6aa11128ea0727c707ea224748d37ca76a93e4fd0f898792f3305203d87699fcae53e1a16c0696b0dd1eab14bcc9f48eabab2ebe9ba646a3c78fbaee0e031e8c6e0bb2c412b9611e88969c0a2998812b4830f063fa65a300bf9d49ff5d35c414ae9001e45e7cefcce9302e2d408f801baa6a4dda27efd17ccec1b238a89833589f39e06bac860f0d92c359e793104c2d1a410dd9769b8dc5235b8d3242ea8825f61c1c20cd87fd356ccc0aa8d4da08949df58320e9b5e7836fecc812ea4140af9cd338c77093ad73ae79393e67694f68f644ba951d8183720a5ba2aac12f12aafc1118ac09ef1ef5b4add3a611f07bfcad00784fe4e800a5692eeae89c52cd969e17f1953325a1740e80bc731407e91be192fcc1daa743e1ab2317e2a27e09055de8552dc51ebbd08e29a4c17821af4f631f3700c8e25bf1b18fa82c70efd7c5c833fdca76d05e0449afa99949068a2e07a5485f4251a3010bfca0e86fa1d815b3d009aec92c8af31050c573a8b69bdd129aa113b2ac73dbebb2458f43fbe17ed6369c908e274c5aebdea3a1c097584509c3592767be737a47aa250c6f92eb984a8c0244eb844f20e0dca493569cf985e756e1c1c0dff738c251fb38f2fe597b594aa1945539539870f16fc6142e6ac97b34af3bf4819d1c1b21422abfa677c3ed90b1633f309aa0f21e3d54d783d9b9bd7b4bc01d297ac651bb57930e3ec13a0c4e340a14e335b3e1ae2e916a5c279cb77e382dd2786513368000894bce1d57a03b2e110e0cd57ba6944cfabbb249787fa0962f29893ad33e389b596b4cdcc8461ce651bcf645a5cf513021128833d7ad980c5f75fcad2c2414cc5247588945c2b92b10f8d2bdac0d0edb862eb162862958e82ffa19575b6d760fda483e56f309da401879da5fc863b22117329a8b276d594d09637a68aec7af4f410ef604db127a43d075a86a0cf62dc8601f0656fe5342f3bbe0a0b8bd0a766bb782bd226f4f9764a348dae379149f534775dbc323dfea029e0793c7ae85dc4e94ec5211c47f212eea683a5680551c1c294a7faaced11e415ee9bb825be89f6a81c2a8808407b5e8438dd291229f570a8d49053c9c4c33802d9e7b212088cdfc20fd534a1890008dad60502dba7102b600686a08408cad6072c09274f08086d86d44e5967a80fc9d602081c56c5d457de17d1f65d9068684c4cd012d0e736509cbb0a83d99fa5ab05e49ce32662e4d942ef2b95160e7b40f9d28c15dd15ef17bd3bd7b9f802378a3b211f4eadafba6669f29b7e80f7bce82719c6fe760536c794a57a15913190c44dc046ea46adaaa0da925f0fa90e024400b50749e0859fbde953a7823330de5408f9b6f0ae036222791a76ca9e72483fcc26cc4fda52f2c67ba6abbc03436c73e9882cdf4d96551f08a9af5000030223297cf4f52dad8646251f5c02fc501e884a91e169816d2b693343a333ec34462f408f09ce20f358ddb4a0a9cd6cb046aeabbc8e2a1d8d22455d15b37dbce98b69ba4dcec4cf62f2e8533b17d50a69303af1edf2900f964c31253cccbeac5bf2c81df8b9d77bd2f6624855c38b85b7a295e75a20e16bef92b9bbd8727ea337786923f8d8900318aad68f77b9cbe1c523cd3021987a050f984213c3b0bcea2738d77fa26725839900eafad84df232e7a779ac8db4f087a0f98e8db279071a3e0285575c3bfef908144a9ca0dbff7f1b9be4a25259ff10c6535a159dded2b5531fbd01a70db280d1efcae34e6cab1069fd23c051f135cf3456bb5ea56a2a81a9aeb23ab7dfdd30f94a1e380e4e053cbcdb4b379223f7a35290be7f8f8f092ada983d9bbc87185cc593165b54bbd1c3d7f01541c4aaeba8e1bbbced8c3d7df8b003536ed64d9b8b684dbefcaac76edd292b1d1bb72fecce3c7d69cea93613e9ef1b7ee6c75d182f40559e9b5df3a1c4c2cfade69183c31d7916c04c4ebb7f40fc4f48db78091630cac14a53bd77f7629bbae2f0edf57297f658f99046dbe5e4fe4d52b722c9688d2da857f6b682a2bfc9a11893c12bc662b3381c41fef692e2a8135a739e582f9579c1b596bfbb214078a60391a5eb98655c24bce38893640cc0420d327720d3ef49682578660351eb5e1e3a8ca4cd8a41235085f62acbe7b284fd894c30a10f236689f7bcb5b3d863bcfbccd5f1da30c726b1c1ace1c3ea1534e48b4083066deba38d99c9bb45192adbde425aebbe54d53639c8957b369f9fc9ba3a2e818135baaf25f4d89c873e300b234aaf1a5c7a31a540ac15c820e85a40a76d0d6c8ff35a85e0147719879a4923cbe068b40cf3ec9435583c2a2defe0d88ae2bae7239f58114cbbf1b6c616c4ef229fcfea50379944e677bc352e1078edb23536581a14076d083439df869593f20cc016684d58431fca52eefe8b6b4012d14959788c98f428a276a6f08d2cb9a88f1c29c25905d624c2de442c594bb706947072930066f346779ce3411e8a694b403ea93be61dee9225d30bed18414b5d103299ef29b685d0956af8d9896b3d83e43819d58bfdb5e7e9eff139b6fe111602121206e540a6c4ff1d6f1dc1260bda843916f68102a90c9b74416f126bb21d34423611e964dae09b7a41ca2cf96456417692c21d228587a5c3ffeb187533c46800bf6dd514aee6f67416f242e340ad4a02cc9852507dd0033f1e07da25b03dabe49da792005e2c43080ca911cd961c6515f397bf85a249f9efa2b6826cb6a37c93f5b2dacf4457f7768487fcbc3f8a09f86987137dfc157c8b6e95ce0180f590416b2b882b2137c9879a917ab79e2f554e8b71bb5876b4df2fdafb6c2478c865f5fb098a8b4935ab947dd1c0cc8af71e3dcfba217aca47df3dd4bafc0f01b5d621a5f1e68e1c744f97c38441d60e46af8802a6c76c46b63e0bfc6fb15f139ba405dadbe890f617d7cd5181cd68f649ea276633701e38144d3722a704a5241121b79244f3432caec2b1a75cb593f4ab531bdad5f5136b0a7c7389480ecee8790feaf55e8d640de089bedc86f0cb2d5c07b2a274983f5aaf2c499317f31c16abdec5a97db21d360b522afb1da6f89d15d12a2f837119ed20e617417ca78ca90ab0e5986347a17a7c4ab641a525115c3787b421facc61dcc22107bf181baf49aeaea03156b2085087d85ff5f98394c1b66f8c70aa428aaedb536997885fd70a0fe1ce240df4e103fa965010f82638320b12397092e793356f0c86fe867b61d5b287c57b90cbf07327671ccefafadf84b100a808f01f5d5f2343ec229ecb1688220b60f15aafed6944a954b7d33c4f3421b0b33e44ffb93a29e5008c550c6c74d9c3fa0941b870c18e0d33242f5c03cdacbe3f25934a93f52965a769092e25551480546e780f883a6ce01457401aea64f5e512dbbe7e09fb92d16856506c86bca97146c7bce6b662cf814d838a4909e7ae7748182740a0108df884a2c1c153102a5f6d2d0ff229ed9524073000ea8986a0e5f54c63a7da4ba2c49c3d54a5e89b67d8a24f8b71afc911dbdbfc8a70874c37c0495060aa4a78d8a090ba1066837d79d9265d95747ffdba103556c4686a9140532a6786978af14b998d58fdee966247e1d8cc47322b90f2a6e882c8674fbc241fa899812f4a42ef356aee6f0e2c1c0de18ed3ce2d0031c140f268827742f5651ec2bd0bb8ede4130d26fc7e860c77229e10b794e71a3006a7b17b07073079c11e86f5bd8bb78df7c1c8f03e95006b4fb5b19d64038dba6bb5a9bc0d1fe7f358f495da3dff35257dbff0116385ec2802aaf3cbe9473d4b5ec9b96b165db8291e18ef679a89e050e7f962361c49ff834615b403bffbc8666d3078178eebea3a09bdb1eb54cce8f341ca9c52fb816f2eba8c4fad45e832bb279c6c10060546d8e34f048af578d70e0328c19711ea79bad98df2a459c4113bd2167304173ceaf089134fe041af22c86d4c25dd97daa3cc44055e8a108a2badd319d768005e6db0b86c531dd5e03c3eb8dce4869cc0c7dabe308eaea9fce486bbff400af891bac39498207836244904b0d87052727bd63692cc4ced72828813d025afae7e31d7b5f3a47d9498c11a8464476325e7f070385d702843b131a0cd891c1db95df58b9c7ec53320d7830e02b2066bb3e687898a25f04d11c1613f934a79dbbfd24d0cf98f66113df40354b59fc4e8a04518eb4a52f629c3dfd73e16d6642026b0ea6a5cd38a840ee29e82361ba956d18092d47a7335f4be76c89f1f044ef3487592c30f046d156036465c4139100a9a4546afc2c9d591ae429f10d048175188a8bb98f288e8b9414a1eacd01e7e58d8d28f260a373efd7e950613c59c91b9f201c2262543955fcfca496470dd1887664b60c42ee6866488cad21aabfcd8d41940601f303b739b6e0731ee8e975e63a099da42e090fc14778dd32b0187607c2ec1ce2659388b3ffda6a3bfbc6c1b1ade3d6b84e8054195f54e7e2fa20f749c6a399c7531d15fab4643d571f0466ea906d647c961bc72e1f2e0ae8e3843d9ff1e4f444570dcaaf6dbbfd8c3342138d7428274ddee6d75c9256acece3062ff99169f59097e49ff29857ff3682a674c02e89dfa66c2c2c78950dc8a6dbe78496fa40d090963de7e09a0fe233065d4983c15f7699f0d8e816c0b0dee1f028e90d3c59f6e1bd6fa157242eaa7163bb5345a0f5a4450000679b98bc7f9bfc8509d7c9204da840e5e23389808bfd9781de41186483431fb2e8de3a0370531190443d86dbe63931c285d28624e4335e7c4aaec707d4d429d7ccff453a924a044b2837773d5f96b5de2993284f51361020b3c8e4038c1e621ae61746ae483e2301fedb80f351e96620f9a1f431a288db66c5600699ad31f5c9390eca59629613fb2978df6c756f9bfb549a75bdf54061143f986dfc33f6a01280bd4e981ca78226d1381c4e50e8a904d8d93507990032532e53885d0ac7f80c9ab152cbe42894c7421e18c666ad7257e51886723207bdc510656f16e8b9d393e2d1108520a585c6b72cc1cd1663512887253fd209f992df109f66f90ba742feb197d80e95d5f0e534a4d2b9322b2361248c074014e975583c1740be031885c2414db0e0ba082db8690b27b21b80b22cfde0d8e8c20ea973ac395d9864e44d6873be86a608032704b673d8d81293d2dbb11ed2879dc6ffd76c2ac4f610b26cd16233ef632e6db939059c3b1ce069720b25c939151605d167b8f8cbd741b0048b00818b83a483fa5e745d54f23dfd4faaff269524d7cf6ac32bc6030d6c2058b87a0e5e59dce316aea81098784950a1f4ec5f7bae7dc90f5f907dbc0a648190a3f893e75116a5b0b6994759ac5c8512fd88193870f2d0fed9e38be309aeb83586fd2765998f8530f1d57be1092b0cfa4f0ffde236c4ea65b1b592377dd939d6f9a05f4f39d8aed307b52033e89ac99700bb7564192361d87e3ba61c440f78940bae363e40de9d13c8d9659ed7579636328e6c5731e80032fe0e92d1a92420cd120d005556eb586f99e9070748e831a0624d1b5c595366919790fc16009df9d35bed84562d3e6baf29191cb1464365d37d10641086189d520923cc71c9dbddbf20789f6457ebcc236066c4eac0ad6ec2fd143dc14b1f0df5d740d024985084d4c9817b5c701089a89fce601c187488b731c30bf12f21920f33a26c957b472fc79bcf6ecc738c10914f1216357bfe155c8966860be7f03c79470b0b8ea4278d12b11e1a3fae8ab003a5cde9bb494b9be1f537ef25b66604910c5b5751ea9700856e4ec17cae7c233f50efd87723078349c7acd393137138ef49e489a9be5f719912e3e09296fcb0b12406d5ce2ace12c27243b2486f4ad4f4c4cf02c5aabd6fdd0cea55d9bac06e48b1bf9123696b0b3b7e53744fce424c5bfe674fdd6738ec8981ddb06609f4ec02f862d25b09ab6c7ff5cc3ef2646e16fce5a089efc269f6d1920bd3add38f5cc885b8aae71f1ba6fd2fcb962c201c4d26b45822db31ef91e43c19cecab8ceea7ae7baf9751dde3a9a859e83f74bb9625c687323a22941b05b0fb1016f497d4bd6e169af49c241df529418d8ce1204283def9c072c5c708979d0831685709d120bcaa75ab61aedb0d7e7a581b8d3cb5f29ed7f1808af97028b8f143e650e5627d3007795c17487a8af70a59ed4f8ee8f925f676efebc1488c4891ca545ebc44cfcf5c012756729d437c9c893fa5e85574ece7a02143cc3f2612a7a84d30360ce3cb29a4e40002ac123dd93b1ef64a18e04833b9283baab1cd97b04754b2b1ca9bb238277b80884da0bee700fc135f2e0b291ec85784d85f649396dd9644f2669f0ab9f3531a1e716373e1678408c0458eaf8f2c7424d81a0b671c0c874a2bfe8a73049d2c434d0c29f398769660439b2fbdec8f6b9499b865ad06c8f7d3b38ee7426e2126101f9f9b3efdc8e3507ba3e82262cdc727fd38dda8c4cbbfcb4190c33f2fe0a9941ba55353468408a971d474f8c062d92f7869e17a928372af7cdc307fb4a5043f4a82d455a6690a91a4c6894b9af8c775c0ec245a9725dd0297ad56078445fbf908d8892b6d5a44e33ce81e5268a22172debdb61bc1bbaeeb56ed2637d6985bb64b6e5f695339e112395dbd8cb9391b3391d1dc98eea8e2a5e48767c5a00c1100d3d733e0cf6dafbf7df7f3998f4081e6ba51b8683de2890d304dd649a401fc198f96f7d13336f0c1ec678b9d986c895d5cb269f9166b8c9606db46d28174620ebe6b8c6cc33e280dc7c3935397c174b64c53dc73f46d81708e5103ee8621c7a06e6cde5955632b6e8f705e94aec2400c991498cf3eeb05c5f3f11997a122f4dc8f986758791f714be2d05d998146dae67eea4847b2b242d79fb548a549001b45242d3a1908c0b34a62011d3c975542d9a4c58fb931318830f49de055c448bc134310b54f3e6cb955256b6b8152632e41e00762caab82a5f2524e5eb4338b75ee6cd170ed2cc7cf09bc2d00f6990abf9efd58cb902e8a1e79de644c29a80766e6c993eb4e630ee3db17fec90ec8b584db9f2e0e1cc5eccf3747baffc89760ababda2b2e68bf1f5b748d5343c06490e4c97ab8b2575170f9609119dcd40b1a2978f7470d0bb12cffdbbddda918c2c97276181bc1f54dda1a36cba8ab086d44c97946db625192881a7cec5029c4e143f4905177e909f961ba924d8a395d970f0143ace6b7baa6f9a473bfabe34696c0ce197ee81a6c10c58d5c5e837d31ae0ac9f17cfc05d5571df95dca7a4d2a7415d1f6d3e85be96f9e251379cf2f7f7cc702c1de1d38078425f179236d0dcea70b2efcf02ae1911425d4b03905c9c0e7760a6bab68e6edc9e66f0b9d0dc2bcfa18bfd4eb7d3288f4e764a05791f2ceb94c72cef51c63ba4ae3a256f36e7aada8d96e5795841a7f0e03915c04be69412e118a8f482a0682d662044a9c9f7584ed74b3ee4df79768e559966dd11537757333a44b13bf49c69ea697efc081c9d929bc0ec15d7d88e807ff59fb3922c07ae744f0328050be7526f2ede33c9fcde882890424f1b86ee42cdf9dd638609564646b07ee5374713d2316f650230a871aa7e85dd5bb38f7b0a2d488489d36eaf9c4e8fc65d4dfc0235c710e6538f1ed8d9a2f65e8d79b4c800f212d001a63374d56d9a85569e9701672741047ddbe0ab2e9501ae1550e05a0ed0d787ef3c4c7b3fa61a24181ba537d3824595b0061099044e1e1dd60db2fe108ae299b4c348ce7dd24e43ff3cf392027300f96c59ac0b5d9bca3aa2404c53c8631ac5530825781bcec53b1d72b0203bad1838a8ae6e6b4c6be91ae78db56ef7ab111f52cccd916a1d8d0898af2b056d8a50c5024e4ce857c67af1b4bbd9b87b2144d66a0eee3b4b8a4d3ea83c19308a445f59c3a57fea5fe5cfaba586ea4d0ca273b19edf1bb9531073d4fba8785bdf06fc5f6b2b2ddd0f53a4afcef3ae1d0a152d6673f5fa619fd1f981919ccb31fbb49b5d0e578381fc995bc0bb50739f5562ef750bfe4e7c6037cb5ee21abd6a4b7c957c57de4c4f51d916cde39b47d31f9e2ad390e8a2da8a17ae198fd09012e31d222cb859665341fe28b396e2ed10e61458466546ef1877e1ecd9778f0648a96f8fdc9ed2b2b5bfd23ea3cbdf90da9c9dfdbc64d5504eb767fc878100823cf661badc741c8c11696ba5cc8ca7be06da0a65d3a8387b3e181bd5f3ee7fb0fd1e3070c8de7453436f8d2757698b5b5c870abad8f1a44a21aac0477e51f5e239b4727d62622e0f2be3c9e4585713fd9f4913d45ae5b844f1695d03084ed305d65595d753d6b28b470ed7c48fe0d566d627764c9dd98d46906e3d19686893b1d367bb9cd0c40edb4850475097cf02acc97056f9ca6b0907346124e294cd52ba497e265d079262f02f359ba8b282a4345a95fe880d7dd5bfe7b9a146713cb0fa956b87260e3232bb4c5a6aec124b08063cb6135fe72e16da7e4b359649029571b36eb8f1c88c1b81106b552cc86b8791d271a85c9af01fdfeecb7240840905623f8e59d3c873b99177d62cf41d14716ecf84709c9596ccbcd15f2e075c66f97e5bc95b41676b8a3e137d92286abcb00a399949cdd125070390546f335f6326f472100bbd1785096e460727b37b37d815c82187fddb36acccea4f75a744abc8463a224c89aa54a5f372df0b65ae00537367a43b20f91157b871a258b3fb688660f19c83683690e57d76d1bd88b4594470895a7196748961f2f1ba3dc54cdaaad2f8de636dff94a1497e13ffafeadf81d51c3bbc295060e837af925dcd268eebd94c91f52248da82e21460a538dc9da97201a5d8d2e8eda79c02ad6836e560380092ed50030360649737a96226ea0ff8b95708a3a32921ece60576820fc86342a65b2710138061b21eb0b0b68649283526046a8999b04bc7f7735e315804bf62c590861e83ddf0c58b6cd17ac3b389eb17221dc534c09ea7051220a4416a616d3c6a0b5a8ebbcec664349a7d80e3586f0efb72155f738f9881ad71d45709e15ab6288017b18fa8be36b9534fb00fe2a0de4c2d15a81235cfaadf61448bd96d18738b0c6e672f685d536a443ab9ae89c6c5ce73c5eb5e7f6b24a287fc166782da9d327620d811740e925efb62d5e2382d42a8c05deac47c8f045f00e42e0023a1d2bf6065b8d840e37c8318b27a26200406b9d4c869f9c1396145dbc43617a4202dc20b559fd7d438cf25489ef2a0b3dbbc34ee27ebc68512ed4504db66a3c2bb948aa8f78e08e5f2dafa4a13e82d5c9aaa267431a4ad7663729cd21959cdcf967985c5f27fabdb58383ad8e3020ce2f6facf348a618ed1c38e5e08b8e751c4b0323235f1e25aaef602c4f25d953369c0fb902d3c7a8426db37688819aaece7928e95897e92978aa121543a260a3643a086a3fc61b0736857f9519507fd816b92f6aadbdc8d0239e9316780c551791c8aa8c3f3763d3cc41fe2a81cf05b6a3a80dc759fbe2803816a99bf82db21d55e40be5edf0e733a6d5077c489a193e24bc62e1e523b09dc333292e036ee829d823d0c5b6413f54b61c1bf581502518f9c5c700d087df499f94b024249d0c4c59396e1afeb5f88680828e5bd38a1a5810095f4c9d08066ef22ee2ffb5a4ef0112182b571be4d5c5bc1d3d5a1df8ae0b7150ab3e33a98b06247e0e935eda6c0177c019f8608deca951ab8b7f19b9adb0888ff4f7b9ff9c7a51912c5b172b15e858cf05ec725999e24ee250c542d0af8ea6bbfba76e6ba021ed7479dc5c27c45181d675b622198e870ada3d77a9829517045fb6ebf7952b0e5bf41212de29d91c6d4e42d62bdd359c077a834afe518a2706880f02df2f3110ab4be239f3c7448a1ddc44bdb402e0ea0659236abb9e189fe0492b3ea443ea859976ccbf94704f79f0973c9f8bb184076bc80cf5bc012a5b0322018c2bbe1e08902fdac004c3b96fb32a4e8802debd4428e0c97ade3c1b4d3d024ed29534def520a3b3482bb2cfdd137a3d4dd0a045b7b42dc7abda1a0f28d12d0ff9a3e36f7795c58e7788280282767a23cf687528537651e1edca32ee59c4c09d55919be076aff3b9fdc2704f88a8a57d24d5fb96e138803966ea895aa6b48d41ac0fc245913d7bb1ee800fd54f02d5f3838367e3d894564df56d8ab215ca56e22fef4e8b0ed79ddf047eb2403eb37eddcd2eed9e35d1cf4b9082594abc4b8e8715ae294d92eb3a97715b3b9f89b8b0c9ae81ea5d9f8ab1e15333a3b12c5786d00e91367d9905377ab0dd0a294394375a22ec8062c8c8e367309d048d63927629e21955f1dfb51607dc0bea676f1a69a47b81a592fc5408e211ad74b2420ee89e8a2deb3dccc02944d6f8669f760a57de26c3fea40596695a74ccc581549ed960e620b83697e70a804a8b2c982bb94a9986a3f69b8c41d7d067331bb7c6c901f2751927015dcd2a25f98b0092df225e9000d12315e3b2423fc83d1ab5a034eaad3c0f9328549fc44594a9e6520e8e541cb1483b1bde98b44baacc8d44abfb423758e1343bc9097d9858e93eac6cd9c477843f5b02c707755c3b7fcdd0ab4fad33152de344c272c32625fc4e748742641d5fde07c32e753463bb152570e6d429546e3b4c2f921711720a994added8329c73ae06767b25a161dcbed696295c45d89b764e8cddc36e719faf2e88102ff7f9106203731c567567ce34fdf53640718b47cc6ad2d4cbf03c91b5c85b56c3074148f0a7e0b01dfc02833149dfda80a5ed4f5aca2475cabf1dd59819f0bcd8236c5a550ff658a2065f13b2af57585de412aa97749e89e8ce4556f3a4d94489915609e0672b22adb15f26a4c00b701544be37afbd0a2b6eea7fa7051cc25aedbf6812420dec3c502649e0dd89b581060a7e413e8bba9228ba1482c1e447d003c12c2b10b2bb4ed90813a4e0a7397045a44622e3d9ee46f324f5cb691657756a4c8c58a62ad20e1e92a9d018979595493c01bd32c65912b402df27236a61324f3eea3ec45d70d34c79034d03e48b99063ac5255676285f5afc34becbbff2429dad739983b1f36202ab9d881d81437fb1847ac21ca4e14dcca32249d2ee13f47c4638ba868a81cc80faacf12d295553ca4a610e5dca0c6d1941972d11138c0f4a71b0fd639f2ff1404c9e6faaad4fc7d7c150cf09a5d2cf30217220282adf5d4290db3bf7d7f2b2231fa253440eb554563515f4ce206c1b09e806cafefb036c5816faedb437bb467480cc37d272d0c689029f44b7ac1c0ebc6a3145007ed0a2da8c7c0cf39a3f0d8179e5a3900b117033d98bde131dde3103f04ce7ad52763067b1a1fcc0516ec89b3a0837a1bd6f913d459c17c6de3e90455ca4751443aaa07ef33d5421172979cc2b1da50cd96c80a96f26d47c00cf8ee6aae6cfdb2744f8200788e2fbdef11b6163c601b35c729890b3b23b289a867af9eb34d0af81602b5830ed7a1fdc2e2d35e062e78ed88c8c511a862fe330e824cfd84dde537aa89911889e2a99969f30d575a79f87b0af46f5045ab198372bdbd69e1044982ee3035efb65714eba44812aed9d4750741dd86757d6dcfcc7344044b4425a8262fa8a54ca2a12283b802d00a549003febbf53149a637710b140f6784b257bff82e104857140d96b49105ff2bbb2c77a4c3c7d2174621fa95494ecd7850f37716c62239235d1e2ef6aeea02cdf4d1aedab7967ffc98de3d77fd0d8b42a0470f48888185ed85f12b9add75fbff986fe66d43c4f7106f3e2b60ad9c0290eb5f90e780119ce2f11e1ff3b7b24b737c6d2dc37082dee4e9f7ecc0e30a0a2000f86ab4b8d9ca605c6e8b6ca8eac9f8205ace433864c2893a1edcacbaf0cb440c221885f1d8a01d940f2182386ceb5da51dab75c9574f7a94fc8b149a5e54cdf6350f65b463146b3834744ef7da7f37580233f8264f4f19b9178e02d24d0f1c64aaa7c4ccfe51387ff9a24a3ff2758fa43f37ce6fd32f2bfb9a30144c81158634654463e08fd9abee02835c95c2c780419f1f8b45372c0843f4deabea9dd775bc4121c1f3e8201f07646f029ae52462b93546bd393b07af953d8da58da8a8008c77709b495825c50c001662bd7504cbd15b36fa9aef24266f142add9a9e9ffa6f1b7cfb4fec9963c060741f750d97feed5b1da47f210f41546f33b539217a5330bfaa4fafe6807e0416a97b75616f5b1a67c056513485eb0d8dbc92fe09cc19e7da0469fb3c85ed279f10819e45766e0cfe6cac0b2da85f203a906f0170cef2fb1eb0ee4330949711cd557a700a0169c04c0fbd094c1f4ebc0f7e3fe4facf5bb1a291af200b441e2b8e3efcbda413218723805f40bbe5eb6841c20e60675f7ca1bb455c5cbe12f55a47d12385d5d01868a063f1880d4938c38c009b5ca147e096e0ad0ef98318bbcc313c979ac77bed31d5ebd2703a21480929769c47f351ef70608164ea3aab17bd2636a14ad369a54da83d3b7a84901a4c3ac2c0901263baafb9cbdb2f286ad37cbc7ec90ca69c6abcdaed228baf1660208ebe15c786d16280cd38f256cc0c0d5b049a20966f385318f576289c5dd994ae2b12426362b5ae6b3d863435ee6132800565f91a68c91e93b3e3e0f923940286628ae97ebabcf6d56fc1a2f084c40cc9cfbf3b394ec5ec0c44bbfe42090f9f74bada49fa963d2abd8a7dca116859e64b0b5ee045960e6bf0cc34a4a6e5827b07d0e43fc3ece613879139293f38341bad59f8dda464d4fae5369b95e15429da0e9839c2592d79afb7ab36a4d73a5a2677e3ddb0d021da8ef0adce6d083eca1e908fd0986fc83eb2c7abad59edf96e463cf2a56d802ee1bce582fa6341310d6837e9d3023ee2ee74782b1356ccbd002ebf921c5872b33df39481eac4d91d018185acd2a62d9494e53b34d13c9a131311a67045fc9c1275ceca1d9a8355a89370d62f50e01523262ff3fc4b0bc5d97d10c080f9f83c78aa9c2d013ae8afddeb2545870ffa0c09e5a7e02c9966a610ccfba60db2bae2dd4676e901889cca4abfbae0aba6d6d3c70c3d200d00174936661ba872e43a8b2a342a813353d90b7469e7ddaada0c6166ae923dc2a95f7751ed7d118e86daf0937bf7251aa1d65e8decd7a2d98ebf103e6989552352764778a0186510fb539ce7d5ff188b76de2d10d0d5483d784da86032847b2e159b858ccb3a4439b5128465810aeb7ccbbd391387249bdba6255b59137eca5c28c446080b4116cadb170e811385f292c8b3815ca6250f3a200a115480270d09d7a41c48a500763a8ff1c84f49a6ddbd9497b4146226ebab7c3cf732134415b0a984da6c5ada003480637a403ae7da7e0c9b19efef98006c2e46214ed53023eedadf5270ab00076e18b824261479ed0b6af71846c4860816bd594d498bd8e085c8f41282d4c5bc334eb155f60a310ba489e5376cbc7ab680e9ce80e3055377c0aba3daef992bedc100c62bd57a8e42e9748a4ce0adb084c1ede06e8049b0f014d565c5a7531e734d77ab32192e8b155f0b375f00eba3fee1724d5ae42cb80fdb178f5f2b99c976d7f43453a2eae9871fbc95b7a11c475fd3439e0ca30f979a019ccee8828664b225e59e2bdc5930f47c00872c3b2b21eb26e4f47c9857bc2ba55927bbefd6c01d0f989881ad754404a0589a1d4b06614153ee5fb9f2cb8e2dddd85f0514195af1efdf3554145f85ddee37ef45322c3b9b28fedc90ed303d03da46bb43a2fa70a783520cde64406008144daba0f5ecf1a7441af6b508c61267fb8d106f9e4ec38a452787144ec53d244569f7fa15bc232914e20bce8cbb5f97032a7d993e70616416ec86516ba8e90eadca4dbffb587a849fceb82c597c526d5e49482620ac36d1782862aa81ead958fb8e5365974283688e416b8ee30cc427f96805ff07de99d3ed48dacb6fd2858e5198eb3acf73a7be82fe3d9463a3a6efee1084e908e3a1620b72e7e95ff3f83aff8ee4453d94de3b69dd23963b739b5cbea92e44e0b2c6d0ba37d7dbb95bfe0ec1ca49acdfc9888b35cb11dc21f7b02e682658dce92e1ffb1d32f4db169d861c471da7aa926545f47bf8ddb41b6ae0e65de69cccd105df3c8c4f77a0d09ed7440656ffbdb6da024efd0944c507e77af7ca48efd308b17946d84dd0e39c838c566ab476320a1fcfd8942a9dc6304fc10cc169ccd36b681ed5e51beedd10f1b7da97068ba030a80341b8c3cfc3be0cfad386623e89e3f44c2eea0a70d40f234792b63e34fc0210890a7949d5e1737d2120ded4fbd602b523d5c9b2fc9a95965e62481000e1cbdfe776d4ab6f30437fc6426b556d0cb1d5036e6edcb8448baf38d5d73a8db823eca6ceb50b1bd4e45105506aa5b7413179ca7986ed4ca678336aaba68152f1a3d6a00a02438adaa920a813faf6694a0deb994d011dc88e8d45832d3ae2481deb06b4401fcaed1337eac2fa3b9bfb4b788cb9dd3b014b8de4d70055bfe4cfc5fe71f0c39be3766efaf6ae00bd7ea424954395cd1d6464fa2e5ca498d981f81677e3c967caf55f0e8bd1eb926074052b042a2fcd12b870054de8a352bb32ab7d067394023350e0a1a7c5b0e5b100a27c665b196e97e843322c6b2ea100384d5f5ba6875752068370ecd993221000375842024c68b204940cb1d88420a8462b187e425341e3976a413c286eff0d1421025daaf100ac544246a83a244b4817a3db56e20621f63a08f63ede322d224a3ca1bed1011d7a4c4cf1ba1993090b0928251208fa4dcd86a146dd9224e03c032416a0ac08aa3d545b7e8824d72fcdbacb123dc46ff2daab717f158af607e1961e36f61e506e3c4f4145d417c11db8d8b9384e190055251e53b6b0c89ab1f07c91e2473311885e5a0e744dd52a4f12167a911eb4c2070c8614e3a41fc0c10e423536f67e554eda8976b2a2a1600037d5be588352eb5a2ddd9150a0e0da75c5e9e285ee5802370107df589d3744e7bb184558ea5f4492ca01c47e94d5f4d5f5dc4e077604f2cb8b86fe890e3111cea5144b351cb344cbea5bd494908270e9b40071b3553b508ba3d3962228dcb4aacdcad679afc978bbaadcd7451a207a08d7a9c8afa0dd73222be4dc73f1fddef3f462d75e28ae6fe1b92620e2def0f80cbf88bc3cb48142cd958286cd606212280f1ee20abd6ba4a9d8cdf1b9155e28699baa094e5639ada5260edd179a18f0be811404e90f83bced8cb4ae065c145cbeec9bb431f65b25aa5df26412e68931c3a6cb6ea4dbb5ac8fe1b811de3612cbfe1bc3f0c3f3044a5e78346b9c7a516db8ce00657f497a8d65d11f1d4b786ab2451b19bc1aad52464553230073aaf2b8acd20bf4d815dbda542571e9a38d7e7184c34e40d2cb56530ad4b3afba074339ec763b595154b3e9790c697f58cf66dd4b542110896e41c6eebab890311892f044adac151639302e5662d58dc24c75cc95e9b5ac1ab05b3434fbe6667eed88362db4e3d2256cd158205ae8941d4e739466b4ca5d0ffa545c29d2bc50e0cf8805553b7d371fac71d335cc7b8d1280a6bed35d93a449c7f14302e3ef42b23060abdf3553dc880125926fc6e782f456dc34168a49eef1db5c55a4406e2532447e83fea1ba352eacc40d5137b874e8e97bcbb1df41f879b7ce91309835b515f28b0320d1134fdbfb625c885b4937702addf41fa90451045a78cf07746f94351d40860744c7318bfb4024498adc8e9b487318ca127db7c5ba1aaa5bda3c3041132fab50770074577db27b8bb6cfa95d05cdd0ec38e4577e635b8833b4401257e13d185044f9ad92eeda5d789fc435910c98c9b913b1654815d19cd7a468f362c61dd63e15f022977dcc42dd4a7106ce51a655f2eda921391b39f6e67d7f82e649c60adb70d2bc711a52eb73f8580b9cf38ab1e559bcded362ee525f047e6f674c1f12b663780bdaa19bf90ee6305ccb5e68ae10f466bbf939c1034b12df08983c6945d96ffbeaa57e4147289b9a3faedfb1011d155178cf512e37d225216e178952ddcedf6dfe29a577d15902a539085a4222fcd6248b2f4cc8c39f247116883712e64b0caf8e0554f3b946af81c439427df42507aaf816ca51b61f852a1be43207717ffc27b6ad0006a63b6ea00f0682cda61f8cc19ba90aaf0e0aa2c5166db97d2240276cdc0d4f0968368511656bbce1c647b26ec28c03bf8ef48da60b0a6e2b450a64b933e01e72a12fcc76abb52636845b1c5628159b8c599c041d3bb33486b05d71e075f6963204d29ca3b6805301f29e1d6371f7c1bd6136ed9fb79a43a6fbc7d677180f83388addaa84f58c995fdb4ac41f01e794d567208d1db77dbfa233c817176eb1d35dd09a450c297755372aeb5a9035ef36b51f9ff7f0e1c74d184fc2bfc100df3b95b640e574a5ee47545d918b2afa484715b1b2b144e6c92dfb843897e8ef6f61451c29d59303a7dfacc25d1264db1536c1343b190d8e975a179b2e22cc6de1ac0f29a23260d325c2a04f683afc980d57752213517bc64ef14c8f6c5b7967cf37cee232b3882bda2fcb05b03fd7c82692dfdcf347191e862f16e559de4c74fa594c73bc79b3b9e66044f2d10afbc45f0822e0220873796ab6765772136e25526559385ba0170eaab1340993024f14256901a2940b260b3bab8db1754c07dd406770138fd33ae69c2967a1b0aecc3bfc928a4fc927535987c950982419e82e4326330f48a0e8fb5b2843a4d0478e90fcd799298d3c011128e34d43522366292d1eb084e41a611520104f7a0856b599178fad643814499a366b428ba12c38a0f622b9eb2aacb52ec158cafe82285bd8d78c8fb944e40e409f4ca2a1bbda0d8974e41321e55e300d2f3b91bf6b25aefd931fc06bfa93c37f0e043382af91349f2f7911183a833e7e8cd6e13b3084fc3d74c25cac2e0558a742bc7f8e38e893b1a6308223d2ebe5031098fae65cdf261ede185e47b729139281d8b2fcae7922636b457da0187d88f8bc8035b26236f99f0ed328c85c5b0dada6d862c62635b9f60c73924d2332db51acf8f09ee18847b74a0e221e20a6471013adca9ca05aaffabb14d89de7fd7fd7dec21b9c656a5a1c13fce307252fea5290b94b8e6c3db7d9054ae255e541ca944276af5448af87a1a7e3ba652bda09afb4cc17ba5eb42856605f77bd7e86941f0de4e91e051fe4e4621acf64d3b9a1747dc48a24e4661a7484754c2128762de45e02c19eb52beaa2e82ea2655fd4e3422961071a7494b048486c5564a958b8bb5de1dd6ae921f4572448800bdac5609db9b625ac5c79955e56506f6858a841376e0e54b957f3d3c853f91b282a94753144d49a701372668ae4222b5d4733bfcfec97b9b7970ae9c2197060f8027bd15ac8dd2f7589f6d897e773d32b867925a964227f026d95d85b9a15552061877e403900514d698045588182a4ae5efce6a572458d1e24c4fdc6e9f5ab46d2337eb7d4c387e5c6d1f1026b284905d7b016daaaa865896971ef1dc607d0b23640d61f9a9cf3faefb071049c548a95ed1bd0110891e6670f638dee0ddde297d4783fd19711d1a7b044b86db85f9a1bee511a47a5edd1b8722f4967d001cbc4456fc973b029386d8b11ac2cf1903649380aa81a08d69dcc64c5667393e51a79774c9cb753d6f9c11636dd387383316e0f8e7ea69d808370152158581e335688c270792ac2dfefb281ad4db9020783aa23f874cf8f3b4dc3e2bdb321928fbc44db0723f33731db885d13df7f867633f7b8cf511811ebd9578ac7e0e5f97fccb8316ac7412672b7e737e42cc16a2a4e567ff1dff8f8731ed5d1df733d68fff67f0a1f854384fe47f06a2ee939bf7a7864b1060e00657cf7e0d3520b1c2e4921db5544af8b99f18d49028cbce0f69903b98d33ca4ba31733f61622259be863f8621a9005451c8b7a4be49564c09b2e9ffb034b027377e9296fe66057eaaf126084a0fb9a9fad09d3e6c5f35a4d34736756eaa0d3f7b3d5880a6f41051b314087e5a01c34e0819ce121d2396b415709ddd413d04b55b5dc58f04a49c1b818b5e5701007cc7bb9b60e6435aa330ae9432dcba2ab86910dfa18642dc52974deae8f4d1330845c435509647fed4b5fa15d2ad5e098822b483e5ca7e7e848e9da1e287829c4f65229d4fc610812b07f6eaa6ccad281d44aed4ab3d370432552f4d828ff75036fdb836650cfb897b2f015e1aa951a5a5ba31a4b6339bc0ed390e65ea5bdec4abdefb82cb10599769d1b26b318a284265c0c70fb6b8051fd19e48ed2ff7ddb161cefa6f5eea96a5abdfde8fdbc05bbae62672940b5ba57d0314b1a2d536734a43ecdf8ade4f9ff3e0190815971cd75dc11b7d9bd882570e082a37fc50de94a0f1888f0d8ad54ddfbab1ed5e0045f6757c343d5bfa47e6fea8f86eabf33458c79d720b9e7203f6a78f28c9647fb78da2f84f33e8f21613a15e91cac06d33bf099aa1bc08e5c5870733270d8594be409edd51fd64c8a34876a50f80708f6e05b0b8ef8886174f3f4d03945dcb23989e3360d605c4335c3fd36ef815e785fc6266313dd28ec4674b72a2bfc88aa3329ba55b01551bda4de98c7a22144dfa7ac3fb6b5eabb2ef39bad772bfb1769ecb1ccabfb36b89fa76625c5bcf64d17f6e1f6d1f57a25dd2dec0c122ecedea8213372c84e2869155dc50de190b1664b1c29341f3f13355462202ce693ed0276f5d01920c85d9d5ca0a7f5a792e63e05c2024c2b679e73caf4e80cfdc6435f1b0f15cf8975dea311260024577876a2be6251f5e9558e519cca5d719f5a2e58b3e54f0a97c2ece826f055eb08002dba7137f792d7fa22abce262eeb10e03b5be5c8e30ea3f9943e0718b95f6462168058450c43a57906acfd66f8ca8652048cd9d725fb701b4ee7f2098117e5f01b71513565d299dbf80aff4293c918c7154c0ea3e72e84daa48588bd4207b7d9e331f387c1d3411ada857cb9ca6115476fbcdcad6fbaf4252ac8cdd757205eebe9b2f22dfb0a30d9fa3a583fc9dbab05d7a2f6ec0b0b46c896e73ca96cfc5aed384e963cb976d3ba9589e52ba6c00204a537b726ad3c0bd003c1aa473d8549128da3d81ab11efdc3e38deb1820ece033b8621cedcf950cff8e87ce3aa108ce43020b8bc33cab40701e32aef388b6ec6187fe3da163fc55bba77783141daed8709ed58917ccdc810c0c0ecda0940d3c95d3c927d188e4024ac5e74771d4528cc4c1a06f20f259eeb87896df16d3e11c4efecf23921e40277cafba1c63881609983a3f984c054ec2267294e1fc03779e81f47e732c34605f47a619513b97ebc30e6b1d7d6f1544da5e5588311e89c3d8105cb31d4cb8897a310274c34d2b42a0fcb4438a0f2cef5019d2cbf3bc3ede07f396c405d04d70c742f6077118da873f8c3f77413d7c7e0ab746426a15a2ad0d2d7d6a7b83663c49b88513c3159531325d2676247d665ca2d609488f1ac8d03f006cf5eb943bc1b0828196f87fcc7d02642a1c1db9ffb47db5135b9d27a618e8b1e87ce0680f53a9cf75762b3a24c7444c6ee7c22dbe51f23d20e8c2fd1193313f7da31edf074ee6baafbc7ed7cb9846d171cdf8d8004022ff0768166fa984abf45e5a1cbc01945179c645b52e6370049d2d5bf1e7a573f6d4d945b49d5bcb4fe022a636806bf1004f9684fd15873833975d96c7fc9968a12f6c8562c1c6aeead97a0730b8e4b6bb6b7cb9bfaf1e7a924a65595fe3e631edbebac4d05fa14173f0991dad9cd3fbb30cf1301356727de60b7f331f205252e3d9c1cfb5a11c44e781e7f454d90b4e37f2aa0d6d3baab0c9b2659150dfed216b647dab4afe0c655966fdb7a8b8b932a344840b34092f1b8bfeeac1f5157810f4cc330da88c809b2b8ab05c644180f8fe61d715b192788f7600dbc0602f2f11bbf24a7111cb78d40b93ed2ccd2f2846956fcace78ca78bb46ef508a961a51588a30129818120ed5d49622149665031cd9ecd32105c24e658aa6690f46f7600a53b0e1e6e4568c27904c2e126fb2042277d2fed963d7f36078e24b93ff4b58991c4010071752f15d316a54b25f905fd50e910c00cb77b447763c5555298050aa2a456f02f623b246860c836215f67b6167830945f4a84d5a10ac32407938773b8e2cdaf2839545e816622c7852a7f64b01900b4fcf5170a2baac7eaf3e7319dd2623c000dfb8b4192320040e15f692bd83154d3d1cbf919a81dafdf488fa41b75d81a51556c30354289c840aeeb6c41b81bd2aca15bededfb50d1765c652a8fb433617779e5e1a5b40352b1d496459a73006ea521f09f9bee76f89fca9b3f0f29eff5950819f9b70ac839f842e410f8ded52c70c141c068e05388cae3f4b61d19e5c6f73e4e433b26beca836adbcaf40dbf1b1c4b880aaef2dd470fe749046797934a9023cba1e2654170deb306ba6267a0bb5b4c21d8abe8090617f6d2a96002cd0a2d9e0aa12e5e3284494844268446fbb07482c5d372b03d57c89370970837bc62051cbea26e9055c158d75e93b68e462e99146060fc355ad481ded9af0d5f0162db4bbbe971def48ab5e6721ee73804881fa1db157339f77a0d23157abb267edb94f49dfc31c8687168533d8677354a52d055be16ee911232d2bccac25899427163209c476ee2889c1168021f0cc85b6c864d2076cb60ee840033c3cf805843172850d60a449c2ddccda172170c1461f43a0f2d47f8d7ade1042522263e93c793fc230aadc920c13cb01c1c10b832711a786736bcddb1143bb9ebe57ecd120a09ae006e8b37117aee0d3ddc76217ac4c5f2cd72b33cad096713cb5a9546c022c3d086da0fcd1ef001a81ce5b56c611853409fe008551ab99aee9cfddde498e14ef9369867b99464dd46d5ed34944ac448785c78487b299d12ca3cf7966a67657dd2b891e10e88c0bf881adbd9b2092ff14dee50f1396f21370bc5ca710e40e689684d72d60fffe50ecbdc9e1f5e161f2ae5ba2f4762ac8a69624f795c1106819e3542b58d332b2bb2ac6cf2b35ebeeeeff7e7d35b2121ae9bba807b2e9cfa080ad0e0970e5776d072abb336dc20c2f668e0ab9e81588c915c30c0017c7391f5fe876d24f53a41fb3b55c00ff36b0613063991d53c34fa0bc885dc25ddf9eabc4789201a1666c7688f8299b3e453ace072131f9a574ee65dbddf4f4e828d70a930d4ad4013e17eed9e19ccb708e53aa02944fe56dc223baa792f71493ff9555b5ed362ad68d99eb25e03ad6a108efbfe978599a464a948720f0f02d6436b8cd72ce0e651994250e3ea71152098faf8e149a591d3609bda51cd0e829969f9c8da3d855b034b7936c89d197a609724821d8a3b7e8b8c7ca770214624f18e6c6f72a3aa361462f74a02f892216434ff673b003f4123ebf991fc6df10d44255975a54270a8e70ac35fd3a05010afd6bd5ab7b87acdec7383012db480a1c1c3c0ec420865b2eaedf2dc299519369f704552e5828f8f33912e1edd4a3641b66e198760c19cc4b1d062d279172b0066048734889e9197d78e41f56d4f6507a7aa551f920641b5860f5392a2fa4bd5c0d0f37dd44eba8cd2ca40da35ec91875d3703acd700208d5a3f398a641df50120b710ad27b4230a5406cd6640636c3542e6a0b1ef99563a04acc98731c498cb5b17c324bfeea246652cc7deb228b8ca7d2d47989f2270a1a81cb45c20e5f357f7a42db24e654a186a9a2de2964bff82f234d9875990115762cc0434c954a2e240f23dd01da9b7f52bd2ad9e21ec0df2af67e2e8bc507de61c33ba81bbeff9a9373b78fd80ee6f2d038261dfa508f5a6d8f11e7dfba9368d7e1e97cdf71b522face5114bbef57e5dbb323e01476d0af145b2dd623354d238e5761829dbd7b06497d1058dd0e1a7edecb14c46ea6da89d02c36d9f808ec62ea60b7284baaa092c66a2c22114f32ffe78f82c5e878b01bb40a5267a332d1aae8be36ff007d186e7334920ab0ece0c7478e1d935d1aba267d9230bc357c7e6f9a49c4c67c81448ffe3dc4188ffada36aa607b9dc832da8780a7fbcc399d6b0df2263a7bb9c7c463cf2529fa6fcb3e15c89b9674513eabc73fdd18e9c9f5280981d959a55f56277f318bb7c38bc3ac8ce61889b8a94a0ae592e0f1bc41c48dcfe31cd4ea1a527ea796420eac237760a0983c8763a28d96cee037d04ef70a0095064bc993764c53aea4d5643329ceb437c5481c901d971784d9bfe689a9c48a564327eecb0e1c31c637ba64b52543e13ee5a76a8aca2db330dc2698b69f8fd41317716df927f381186241cecab962aeaa9f17709715d81749be64d3e4b6d5850212a87550b1f3a0e0a3ca75e33daa4b34a65bac052be0ce1844f804cd47c8930bc207b46e43acf386283f4b36c08d10f9b4c5a1e6ce753cb2bbb070c1da9e0b7c8928a1bb64e3be6c4ac40e2ce4306a71648ff46885c4551bf3c8e6534e7345a3290c216e749ec3baadbe6210a9f16ca11427abc326023a4db901aa2d55096924200c4f7cec5ceb7dd41136d4bf2a611a9c1c493ee1f42ea266a32e0233e24ccc582f376a5d039841bc70542509098b08541d0ebd0f372ee11edb81ec752efc9daa27865c81f8c7b7649b1d0a06f00b358485df35aeedbec6bb65e3063b2ba5e2b324c6c90b2e24b13c803266c88690cb57f314bd24ee498b45460090297699f6772082dec8464af2be5f2274542b3cf7f913b69661c1090400b1e84af7396b6f5bb285c7ece48e78270d1f76bb353c6a8998966cc7a9a7ebbcad7e07dd5cabf9fb05e07fc7720a8bd0e35d23cf5ea92b60ae75ce322fa69970b63878613cedc357e18423d0f9efc66295ef756b2ee469050696cece596cd8684499bed3829df6fcf348427879ca7215d461b6e5869719408bc4f2b4352330525b4e14a150ddd77222b4aef918b7a9661516eca2938ca46e8797f75031d71843ce7082185783060d05e1a535925d1508ec6c5f7b08a0aa889523888a09c9209e0d42b874ef222c4295db9f27467e989d3942e53179d7c65fa7836e397b645accc5cc9f1b78657845d893a57ba7bc78af82421382bbe071cde23f691e7fae3241f621ff2dfda1f851fa7f9fbb0f2e913ba63a7e58ff0c3825be9def9111c9faf84fb388ec14d83a34c67ca2aea77f58b7b985da9c0de4b35240caa0253827965ff8687294012c587cdf1d1c336329c0145cb11a1a91fe43eba4d61949310c8a3aa4a23681784047b738028aead6d13801cbbd5a473f72f0a68f39aa65050a898a9f0368902ebe61cb8e29eb1b80c347d43883c9d250ed8c5dbd376476bf293a54eb115bc2441067f79f4f3a457e45548325c45f89db9cc859eca15dd6b51f94a39ad16980b0cc9d4c2adc61080a62801f4fbeed63629580fba22aeeffea1f0d152e8dc43dcdbba21297e765f51549748039dbb2fd4dc44942a4aa89151e7fdceab7ef4c061000187a93e239a4517c3c8c8deb3cb6d1c83dc0086f30749636e0db04bd2fd248739e0410c4ac05ff048e0dce14accaa2dae52b1b2c598f75ea85ddb93f42f1f094d629e155704627db5ad72793957476745e515db4ed709221000932a1ef3556eb0b3a81acad598eedb7cf3eee51f9da5491b3efc62e3f07356fd86f86839f137d81fe097df6784f3b28510e8d482c04db3f467ec2b18d8822c9d1a174a461bd2eb660f9fb79326ec36282819067071515bfb0de6e00db6be119b8df98ab5493c272e36d8b751964710742e707b30f2718a5ca12e8d91d1cd35b8c66692107f8372bd17290889b757d8fd8a0ef370150146d9cee1f7aa5d6e80e482ed2f65b49ab1a04b278a1d59902d440bc052f4c246e4f71878bed0ad544460145689b5bab8563c4e459ab50ad434de400d9f6853e6ec832d11f73232a881e372d211ba143dee293f3af4cba854a067910e70128280265b3142a3e004f6b19bed7667307839a32eb8ca8a87d60de50735c4f8b027047c1bbc60b952984e2c9127d40f26f13d0e60c926740fbc389d48a050d1320fdd0c8af0dc9801a11ba9cbb08cc4853a6177cb47bc829b5419b1ba99f508629cc7ed19f0faadd1d8bcf96d9e31f4af4d14491ca041c8bc3b05932a5b99e84d4d343b18d3e7c68236590b5c76cc3b971bccedb971ee921c68ed58a0f6a6a9558809e810bb8de7fc5251fe4917d04afeed3ba11c962d6d74999cfa043f3cce15ff5c8c26d3d96d0af63622eb994804ac52e8f6cfddd1c75c80f9c10f1dd6c3d65cc8fb940ce898271fc6d71dfd240b45af4d435a46b5fc8cc0ae8756d5f568c927bbe7c619a3f90bf008428ece64b210a63adf029e5f8fc8fd7bb181b8e35d070760b9211d784c2e724540aaef343ad8e4683f95805c465522fe36b46b71f3fd96bdb9aa02fc5d3ce996ee796b089f291ce3f39740377903f2fae1f6b3e4ba2d0a602671a8d324f7257985e464274633359dbae292b9ff33623865e22734e443bcc1ecb3a9f6d21b72c9d19f9af2d5ffd110f8ef7b8789095aae44c40da68c5805e9ecb7da2acdd1e8a699cc17287afa503e3dab65c3797770c187b8393185551e87d65bbd42a7b2a82a83708eedf65c24ed99f12bc7667207d58db31dee5d3a1f8fe6267d94c1ab24a9ecd126e2cfb1a2a6ab2758ad4bee6ac28be24ece05db853e55a119b13a0f531ed8f54d3647eee530c41a5645cc979e4d81f135c587bb0472d786f8280debaaeb366644066723d1090b29dd45a15cfd390980052ddcb81bbd745cb39c490379bb3674eeb4330222982808d9c0a7e028dcef61ba00960a2857538eb217e0c2dd035b9e1aa4a2ce03c88ee3790a30336016bff760746b8416a47a07642051080939c3df7dab2248a23b40e6eaaab8a00264ddb04c4fad3730c649e167b64b684f500529497dc11686dc0e9cb7bb54bedb843235c9937b3e0e3c150f044f44816a52312d09c9a61141744698258f403ff6718f160d7c23003bd661577fdd8eca61578a8410348c6402fc077509e8ecc6a83fc9016c4b6335d25ff6413be830ecb0ef308cbe08b6554d803b7aba6aa1cb7ff563915a8d11d023203dff400e7a547e523247054429a9f95063e126cf17518d12ac5b4c9f44d5bcba0813b0883fc03ffaf5f81ee697d5e60a0639a8e9998072588770a26ea57db0786f37f2fb835fc14931022cdce291b7b93e413ce5aa06e5ec418d617893e0966bd35eb49e9ca971250a7416d312e8025772d1714c86840009e4111fec6d2f4a0a49a9e5e1c62fcb215ec3be018dac6ccefe6af0ca515961e0078cd81c9da06fd56a1b09219902682fe9a8f53ad86f54466162ef4d3511abf9d66f61b4ddd63fdb3e5837e45b5c617484d0bf039c6ab6be20316229475d8c3c53993c1a209625b8b13d126d1ddd01d3feea0362e00df7c58306febb77699c0bba1cf8cc17b008dd2a9ff9a26da5eb6662974eb30548249b06929f40f3b4766777fc8a84fef011fd9d2ddffb80c6ae300bf4013d2b3e2b735c692041f553771f1e5b9e842e66bc6c2b02d2b155762fd10e9715dea142f12842a635fef6c6936753578a44591c0c43b5158ed10f43aa441e59fe86db5b9024abb041862aed9ed8d715e4d936ecf7afcc120409d6d1ac03c27644b9905064e68c8c1438e76c673ec6a58a1707346058256966e00d89e3bf319513ff030b4a06e10424ba4b39049d344a8f287b09586e19e56d9adc89e8df5e2b6a7a7bda86df4df42454f80b049fcfbebabf4eafe4f3399d6debdccb480da1190b4b82a7d437b802161a4a661c6affc0247240e4c52df64ee869f535d5c04afd1bb7af1bdd5a9d80e064f19e13f64743551f07c2776d02cb15440d3586ad9121b97765dd8a3c0a0f582b4ab0f3bcbf98358bf86875be5023dafde7a0173262a1c6f2a4efd762770f801dd27c4c750ee25eefbd3f84cc6bb753331631730cdc5abac665126b47063abfad80e17c09af9c27e62d722481b76187a8b4e5a88cbdd1b221464cb99f300661228f02bb14102aec4e0ed7d6bc5a1dc7c4b5772b5887fb5b05afe66065edbb5b12e23e51924d5690f6fddb02e5eeec5a5abf507e3d0e3b31e98fcd0fcfd6e48a50b9773728fec2e4062da17ac821e939fecf34e334a937b02f866a528476ab3525054251fa3990576aa7573fe9ee28199ad747a25a0819859ec7838889f34906dd65dbdd50a6d6641dc321fe28230c47d5f148d7b341c651891eff45a2edfe5fc5cbeca07cf3547912bb82e83b52f18f60e2e2c2a2f60fa38748f254c22e3a3e062c496133fe726799c73a7ae3912f57b3fc3da4434e028bf63050861c21db93452031005f16b9c0f81120387dc1e6fd2df73a0b3208fc3bc0e5897109a169cdbe78617371bbc9bb8e6d5ea39df542ffef6158c20954a53354e5cdc1e18a46aba4063fc0964dca6498f2e6ced820665850543f58bfce331ff8a8006a2bdf90a4a8238c3cd5edd8c0870454489ced393e49cdb9ca65e832fd6d6c1eea78e3e44bf73057d64120f81a63c9715b06e11a213ca46e85775512c9f322fe02cb74d57257ea1bcddc389f7ba31c969135a6954f000bdf62df0bad2f6852020c4970c3efcd250a886175eada36fb217faf96f23461cfe75ceefdedafb57b7f686340987e1ccb3b32e82c58410eec7be4eaee0d907cc7c955e7aaa5acf49610565ab187b66f116f0d99bb7e49d1093cd8519f279542f5143e0e9da2d410969c52a40f5543c065e149c10c41f6a22dd8fbcda293b7800fc69a2851283cf395004264b30938ab6c5468b56144e4a715c97366eadb81941772d65daa7b102653492790391de15979588205a27f2b6ddd5e904de226f6f68f8b6d30397f05aac8ef5924498b991a13cc8ecaf3d20f70b40239729aebf2739ea5d2ea1f8b53c6b13c5d090e6c369d1f18bc885ecf70ca9c9567b20b0c2000d85c76c14049eacbaff5e176653d131d742ba90f7bf3ec4b8904ecdefbfc421dc3e4f28ed717f2478770b43c6141dc001f012dd173131cb890ede229643e1cbf2d6ac3f415f24b891dc1460b91adc166ff6e96603f12aac5b3e12d8191005d02d94ac31729762809b4513e5c6262a6a118f0d05e5160b5b7e9df071a4b9bf0b05c60590650f8a8423dd984a7304503534c383925a22765ee0a28ab106787f8580eed7ff0fcb769915ef8e3592cdaadba3aca7caca0e7f918550fa77fa8e148438822cd3ca1bfb6839d8ff33a1b556cecd3679d3ac3a675cc599e4323aabeb1ef2fad3bf3a097b64f50372300f1036bda6f8c1b25e7520e76e669d9f1956a29d06df0a285fb90e274bee3ff3f3983f85984e9c76ae5c269870543a13ddd4c65c860120b1c63d3a99da359e33fcd0c3cd4b8f6fbc58d5117ce5622f0f8f90c69b81446e656c73efb59702106281533932f54febbba3d44d6684e0868d52ec8c69ca47bcaf2a26830414b3fae90e0ecc43ad6d2051e735094278de4e74260f2496cdf48e5064b07647881dbebae2575301bbd03805830d20d3d54294f5ae72e924bd59c83e1d96cf48dc6d4d5fd2fd2d977415c2227e62940dd9803e3091f0984217b4a726b533d44b034a925f584316c9c276be1126ba6834f3845592ce6b2de2b27bb055ff8543ace502a04d83c4c32dc571d6596b62f1a6bfc82837bd1da942e687f1fe6297f2a09ea3fdb927f90bd498dc0dfc3f59948aa7ce6a7ab8fe952789d5d9e83adfd3111aa46f5372893d61ef07a0fc6a365e4319153c4da049ad397c2593018d6a803f20136738379257f191ed669691e2dc3fdc8b91d1e98bb6d7e2057adbabde23ca9feda100c57bf1df26826fce38f7ffc3d7444ed7e0f2ac309e5100284646514c27bc183e7dbffd3a31792b69b6cb9b79429c914520cfb0be70b5578546e340a73869c7c7849ce5b49574e19e384ee7c8fb90907cbbb1136f5b0a1ef53a5ad242b575e9acd135a6247be02f72210c226120e3779cc7bf87c926a86a3cba6b7e0ce1785637519dcf9a0d06f70e77bce83ea2a06e3ce078168e8d32874989736d051c02eccf76a2efff29d47054943172db8706499d78168e0d3a8e55da5f295b3bcb5819f4bbf28d89134a2e00be862c373b28da4ec21991f7d1a3ddf515e25a330a704a79690ce44fd7204fa52e754b7679dd3d439d1b03df73f36e71f1cdafec18f1c9d1f393adc8443da8396ed5232046874774b1bd44f28f45263005458428665b8ffc777bf87391dcab07fce7c3e4d2b1f47370fea5bee1c03e10d2dda046131e0df7dd7da853dd0eb1f698686080ad6c666eabce70e8e38d4ed19e4d3c11ee8ddba3decda6d860d8e1dfd3de813f8fd3d021df660511036021df6402fcbea21b7484324055b7f4463e3868e253c96cf2cc3ae9f50e8a506ff008e2009e5bb9461c7da43ce8e2c224fd56d9d436ca043e6b78764ef68eee9b6c151a45a52ffb7e51a49573c8427dcc9ac8d47ef06d66e671a8e38e6379a218373c2bd38271c8c35dab8eede49bad54203cb4f7345512cffd48017660cc1a455042ac8e02abad08114a070c2135708210b1ed3fc95a018665ae41992750fbf9ed3ed9ce1e7a0750fbf1b63080b7f29a7af424dd8b10ee1757be85b2da90aa117a6620554a42499220b4da8024709a3092c5c2880c21147c81f004c0bf209b08308a605f90408e2820b8cc32f5f04d3020178e8566264cb2749ae6926f20710e400a12bff003207bffcd04b0df903e05f009b5c649bcba60e016cda9e3eb314575e0671b5a4cebe83df4b9abf6ad1850acc30c28a161231383514573c018616492861420844aff2ad7c92fc0fc2343668c4760feb379a99c2f7cbb750f8a51a75113363084cf030410a234fc8c0ff4df2fdaddbfeda6fd9648304932f8cb08668c28c5307a18a1b44810a12821863e7c472e6388ed6a6ddf93d434fb0ff022aeefd746b77f7a63da7b4c82f47589f53c2590b6d81e4bbffab251541ca5b97f0839a11483882062b970e0ca098c2d3040c256200610415bf28d395df41eb25d1864d3aa822306001915613a8fc20001d2c218826988851a406278902d28b42d80cd28b365205b692ec936c447f377115798213a350415c9d229e109bc5aa60a12a8885105a4f2499a15027e620ecef30401327aa9084891414d104c3a8302142165268c20da69c66ddfaaab4b16c63536d180a3ff9ae886b24ca06c7048c2461c2082a6030250c5e8212ba88c1ab49122648d0ee47ba50a50bfc1f15cb512002126860052a3f58920326421648d0c2074866265062049ecc0ef2caa7012b9b38c085145a60648b2f6c2084c903573c29838a1a9c118517dd2290711feced107484fd2b5f3e89046cbf879b2af7db267f6ccf5dd106473bc1ef1ccad0407fbe0df4a78743fcbd9fcecfa74a4319661bba2795f833c8863eb9cd956999aef56df0bcafa137c4fb19cab4b4b1c1b1a3c78ef7f43d6ea341caf4cfd73979a0e7d19f614ef7f4733e5efd0f577ffec9f3407e3e7560ad419ea8837c92201afa137621180a214f4c6a9027fadc2707fbd4bd2d81ed7093f74b29a594ef2d5b66d142c48e7f65fc599cf2391cc22ff9653844f2e95fb4c1b1239f1f268fd09f971b68f1f3f91dfde177b72ebffb006175dd7fdd8352b7fb50f7a2daedde769f7093e1f3ec224e04829241b60d599fcf7f2cfa1fd081d02f2efd51ca42f93467645a0eaa83f0b86f3e2cdff2fca3e71f91beafbfffbed1fbf79ee78ddd7f3aeff9b6782c0ffacfb374b5ab5dedbe82baaec5950f81dca27d11c8600bc8027aa20f0481e377bb0f89c07174bbee57c071e6765dd76f417f11383f04d207755dfdec1d91409d16498f3089f4dbb68d201e5ba8830ff46edff6f5f9abd55a9e218df6dbded9244f1b479ffbf74f77a4ed2588878dc88d956149c4694958f098865f644943bfdbefb90c61c7992b439a2890dc92c410146c7bd7bc96d2a5fc74e775d2ef7eae9b6e1be566f5ae3fd20bd5168834efcdc9711cc75520df75d2a8568e27162e5c8eb9000597a565a38b6b8b8829c145012ec79468e2862ec794608184d50f90ae0efdfeaf964baa5642242ac83b0e3978897e4f1afaf0120f530082055250a2075b6071ea1878910521b2e82963891314463c7106134eb048c289938e10403cc1832a94586109291560c20c2d8cbcb4c8c1134edd051329ac769c60440c2f6694798479c545c0119a9831cba20b26544e3dc0600195133c71c5ce13567c51c6162838d293440a473835922366b00516a6ec60e13465a2176038c10960cc60554efd80981324b628f2c3156c70ea2a6e3701c4194cc080a20750bc4e3a39e0f1410f9850826495c4691a610152088107547042ed0c209c16d08319153ee0a94115649ca88005d1428316275a9cd83ece612e7a4f724d9cbc96b4b825a018b8568b1b17a5c5cdf3401f08f4a1f73ceff3a0125c8fefc74969717b9e16b76d5bf91dcd52b323e5a1613bd917817e922be10a287a1e2ba0e8195483bf67c19c2127cae3a5ed512d6e545adc9eb91ad76ccfb3d5ed7e74580ddbc9da3067c84914521eee65e53a158784c4f181d1b8cce1e56f69b2f1deb3c1738e811b5a1c6dd8c6c6eb8f24599ad26dc88577f2fddc0b8f87c01ac21270e45814536eefc083c7be6223860492cbefe231cdb8a18af48d6aeecc54bfe02f3d901c0a07769454aeb7fcfe2d864aa56f5a3ecadb552239da11053c92d771f4658eee7004d2fff9d6010873713fa128411be9827f8309902ed0b45884d5d1a23b4889edc00de070c38f08f47097c21bc9acb7630407378eb0dce598112511d8d1c392be057714533db42ab6c8410fae38c3024db050bd00c9184ea6f8e2abb198665a6cb32850232b30c2022344eecae5580aa63c018200b7cd19aabbfd9ea15e1dfc3f1a8ee2a561574715b4df36ea5a4924ff1afa6fe1d7e27c0f493bba6f9c5207df6377974c43dd659a5e626b919d3a654adfa953a7eefc2f42584a2990f0eadc25a4e52428810e3f2e8c406f6f5becedbf167bdb360e9c00d7c81fcd39270cf4b76da3bfe9b0511c1cc76dcfe9c0d978eeb35ce546ef7223cddd421b1aea98618f208038769d5b1647ab65a2cbdce42f59f2afd5fa4c75ab8e3375fd59e6a8a8cb0f0aa9ec8ef699ccb1d1b8f731b8c69fe7ba09eef8613de1faf3469339b670abc9311847865b16b8c6c38ee525ff0fcb4ddd0db8d4922ef8fb07084220753fb8fe71d6f5e73e515cef78bab8ced5648e0e0b76210b8cd325816bfcbd8be2c48e1d2bcaf5ef586e72196e1debfafbbb10d8d44bb8f492391a06ecc20fd89de09bf93e2035711934715d5efe9ff48915a8ec13d378a803c8d505218c9077bbcc10f92c820e8a70463e582441831ec4884082104eed0230b4c882c88aa58aa98870459763aa17cdd859962d1bca89ed67998305753715d7cc0e47ee7999c353f4a717c135734e1abaca4bf38b48c91cbe922ecc9f3fdac28e9d1377eeb4383794831b4b1350776ea8d15526866df35de5a6397f436da82db5a9b65507935f7577ff6c8b51d8d6c1a1dd81e51f6fd4171858b602ffe808eb38e4e0a6f974c218e66fa9b0fe2c4eb01ecaec70c2f183957f03837af8b8a1bbc960e68edd3067eb9cf9fdba81be0c657ee4f84b66666666666666666666666666666666e618d8322ff13bd83c5ef212334b66666618ffc3f83bd632fee69934d95b153cee806528b77ff2f09866fc7cb62168ed93fa88eef84989640ed1e56fc681714dff8e1d692de6a6cee5a5f6cec551e9ce0b367d4ab38b753d8c23436f714dbb1399ccf1414917526ef21a70e9086c72235cea0f10e1f849c2fd936a69e962d74fdc07880f4ae6686962fdc7ce45f26a1b8a8a6165fab3a2eb8ce3610a64486bfd9b8a863e6dcfa01ae689fb1d1d9a41e7ba1d932e14e17347521777f4bc5b84cf1dfdbb98cce1aa1a7aca4b3ddac28e9f17d49cbd946ac2f761752f7095ab1827c8659a91c2ae7c0ce0d0a2162d3bb039304e7f3ea1cc8fef3fde2714fd2794f9019265dc8076027df73a6eea5a68df0b657e78de477e97037dcd166baedc2467ca4df2c4a796ebbacb613cd3c543a329aaa2abf9f2596dce3c06bb52ca151ed8ee572c68776cf7632585c057d9ee47926823c5761fca8eccf3813f3efffda7730acd7ac861e4841d71f4f0e184edfe29035f981358d09dcf20194037488b12088faf0af65de52c6f01616f7093ab80acfa46cafaf46ddf0019ddedfd0813ece8aaab0a7db54d39bf8d72eff56ee077a9b3944d43dfdd407b29086474db556d62d80a081884c2404c8a485204129a84c5719452daad76d2a2ec578bb2d6efee6115d2375f8db852256d98da4e4358de3e4bb8124a5418c44be090d476b23f244788974af2837849dafa49953c02d77ca117eae02c00a4a0cee91b6871563935c0a5f95e5831ee9c138403d7cc22a14cb538fde77b382cc1366a4a2a2deae8e9b367d3a0456ccbf772b846488b93fef6f5b95a8e10e7da578fb0c4175dccba815554c4b617312c58312c5c311e15f78f3c69565cf937e020e5cadf80134e3216fbc1cbe518119c5cf94224aa4d7e923f9d67ea0078ae7c2b9370e50f40e6f8a6d043bc32d6e1689fd07387f084bea941cc66348c8fa380ddfee9cf52b3fe13646982f510e62551cd8efef2973ba13111458a0ceac4954f621556244599478edb98999bbc8c60fb4335b023a5499a267151249726b90ce38ef0e48969ec7c72e4f65798140292db5f5f8ee1d12f0645931d26fc54ce08f1a7ef17381c87cc2e8b8e6047d27c9692ff72b35e8c00f1d745bdb0608a27a874ab6d7377779774d5625324475e2a5a84aa682a4907d29615b6fb432d9b056f87c936b7f9c49117959ddbc6fd064a6e9b1bdd36fabaf22b634ad15f3f86b56effec7ef91b4729dde4d6b4bba59cb5c90515aaa2479c60fb41aa22b4083d42935057105efd53cc09d8ed277ddcdddda79c1f9294dd4b7084a33b70867b8f7e951bf58d4f1a5a100aecdffe191a1b5120592169b1e542a19aa7492bb664898b8a9012db72144f8a269bb550ad56ab8542a1785ecdc3c3d33cafd76b955aad5292469b32eb96e0ed30e17e2965abdd7553414022a5ece1201afc54674db0630dd1c08e13d5137bb1521385424de17177cd6a8fa5912accc65caeee794fd554eb76ca4d124a7777f78b667b58324a9592aa2132983f3bd86142bbfd3d486666213db00c47d2f520427c072cfc000ac2358d448290b03e483b428842e038d57e1c3e9fcfe7f3f9bc10384e9f1dcff3bcf73cef85c071ea06fc886798866d70e9c6951fa44720ac23d800c2e872524a91a6c59e954bfd6fc410de0e938de5c6cca1ad34342cb3d1389172fb3f9e3c79b2cd168a386ef417864d8d02438f9893d6eddfc1fdad738321dca143e7d429f15ee7f479920ebb4191f16fd14b3a74f4c3d01f81fe1ffdb32739c480e0f08327b77f03a5fe91173878a9bf566b49a47f51bc339e15b123c77ac830baf25d5cfc402593a4aad0c492db6f4bfd3c7dbec0db61e234d2fb8577265cf0c1931fe64cf9e0c8ed9f7129c324d8f1b32ffbf5576167a026172dce9e399bb3d9337be66c72c13b7ace6ecbda8a8e79a9d4a119d8d96c061bd53a6b6b5661dd64069b75937ea1bef046fd9a3c3a32eede23a7bf5f1ce3c8f70956987bf8837e0d73c49c19da93280956865c8a8890436db5d00cec38b79a9cb35fafd66d24ecbb94f25d6e359ed70c27cfb8d5b6da46a54dff756f2640c9237ac861caed07a292bfbdce4946fe9894fe16e6c8f08b349491af73ca91e190871ff4b7af81a9c8c38ff9f46be0936d9d93cec939523b07f6b05958bf7c9a3f72cc6661e5e5d30c99487fd19fe4ff6e72da04078e0e23023b987072fb616894d39f6ffb6fb4d8cdb07f9abc2387e2502f88126362074a38facbd0a1b42877b8cc633eb0a3c7642bd7657d23d9637de3a1cc13221ed05aec2f7ab8860651122ca7e29a7e0e055cd31c87aa3b666cf498c35a8c31732cfa84c76e7347986494e9519ab022245887f9585de562c4f6f71c82c7a20d57b911eb0192db6f83613fc11c5e76ac152585d158ab0b3f2231c18a579ed10d8355d11c5b2289956dc990f1cc5c1de24c13d9ed7f5ac1191a1bfd37fa9b093ce0022446356263e3801d4cb9fd33db73232bb967d985f5e7483696bebc323c78a0b787793d1c25b123fbb5c08ef363ba84b7c36472f3676dad574e06694232b063f57f1ba3ba0327b7ff9320072d687ea0ca32e4497fd801eaf65bfa7604c5cac897214bd08efd3b7ea3199a06c34e1dac6e7f9528530360533c79628182cb35c7f0b8679ad153dd7e1bee14b4096fb4d8edf229893e4b9a507c4e0a375b821d2d4b14ec38599fd9647d7a9c449a2c77296eff87f6a979289bba6defc8f1703c933563a9dcfe114b8df3984bc126a78daec5ed7725b815756559aa3b4ed66439cd65489bac2db63dd960dc87f348cb4ddc7f7abcd4bf5ab158dc645d8ee3617d58b2b0e33cc273fb39647964f54d4ff5e9a0e572b99c80d1b75794b2a36c758e9997ad2572dcee08e4bb1e9260605b2e564b0c98b74bd9dcdd9df60bfda3288886b03206528b7d92e18c117624552f8535c85310d7a6c08e0cdbe1261b86edb021e5a0c8ed9f19c28e36d7c69ba65e068976c060471408590407516effb73da594f62064b33bb06365e9c28e150c6f7ba61939954be952ff4a1676b4ceb3cddcd4e32676eadca999436993ecb9120976b4b7bb498bcdabad27749ed13a8b357aab153acf686ff36ce136f3521676742850649c19df67831463d2e4f65b21fec4e4857ee6514a29bbfbbb2c4d928642a14e70f26b8344a6c6af086a496c6787c9e49d54bfd0bf72851d3f94250d71494d58ff51a24812c5a22be18d34392de648940ca5904d8c510e2f5151f94d941d473fb023d7422c3b726d828e42c28e65e2ffecee1e8364d1c28e5cbb2c7fbe9d5c435939e5748325b73f87e79cfeb9e41a87726679604739e5518d52d2acce0112ae0da65c79629959cba916c7b063bda3655046bebcfced9aff99c0f66871d125fec24e21b5a8fc8e58a44bdca30647bac477c46183580d6af28bbed94156b9dcadcc80c4175ef3f00d0be10c279779c83b43123d32c81992e8e91b197f793d94c12a95524a29e946a994524a29e946693802e162d7e77f808b5d1d7a0bcf9b93d43ed0ab43bfec97c734ec2d2eebc3bc3a7c52255b35f1038294d4c9ed03689b73e6cc3059e4b8770aa2c0bcd3e7ac6109646c68a1cae9f3f294fa4e9f4fcdd34e7d21ea493202b6ef7eccd327142208d1a97e9fd86f0d7fa640d4855dd7755dd7799ee75d814405e729618db049b123e5f6cf6a492ff6d3210471846c0e018829582b1670fbbdfbabbda2ddf33ccf73102cc2defe6a492fdac8eff39e78bdf7c211088efb093f1cb75e79b9865cb885349ca1b7585ac6909c63bee3c81c648e1932bb201f861f4e3a6ed8b833a3edfbca3d0d67e8b5d8c3a49e51de33acece126b992b15ab31ecd73bb8fe09a0e12029147dc7e100d2c9fc0601d184009238813f8e0042b1c985153e2889126185932b1f0c1f5172576b436667e86648469336983110328483493a67bda7cd7c34d0be8b9feb9de75cecd8e765bc771a5e16827cfb80bbc975c7f18da345128142a057df3a322cceaf4ebd16d77f714783334563a254df92dc1518b2a8f69c6397f8273075c43dfc1e9922e30f3e401976837bbcd6b9d734e946b02b183e9621c1d30cefc3a28d8d14e970bd637dc8c7d9efe94cd283c6efadeffad9ba6eb89b52e5088f2a060476e6162fb6c38612dd21f0d61e7b7e3c435f49d3c81b5abb7b9bd5aa44d18c79ffee51cf3e90f5c437f821308e902a51e92f9e19dbedfae926f8237803854f0478b3c7cb4487fbae66bc2666cca643e278a46ab39ca53ae920deb58cb9a67d6d3aa56f5aa59dd72bd18473a6b229949266baae66a1e6991d6e79edd0abf42ba305d13365df3890d1bd3355d3ca457c63bcb59de7297bf1ce631c691970cebcf81db6590cbb886fe7ccb35fea3cb9ae6289aefb48a46a3d16ed8aa25dda45dddea244178f02f5aa43f85d6229dcdb6df7ce93d2d522e5aa4de2a99c3c389922ed0a7df29601c194e20b886fe167636ac65b08ed2a679a483b8e90b27ca4b74ac366cd0d074e13833436b38d63b555550b356cd7a68b546754aba5c2f584cc623511295922ad9eaa0604797f5f071030e6e9a2739425dfe0e471b97e99ce8fbccbd679e28fdbe30a704a7391bc0118f871eea9ddf97c47df79fb7a17eb8afa10cd7ef4219a635642fe1f0c17d16bc965938d1b96da11706836aa0dd9e03969acdb175aa539d9ad223314e68d662ba719fa7607daff3cfc7a3009901620190b94c5baeb73d7ff7611ce9a43ecde7402f4272138d824bf3291558f44c8b2d9ec001a1795a09bd04c661029ba8ab9f7067a5518cbe675c339f82ad05d76cc135b39fe046dc39839095415db7c9b8b3a770e728ec900becd8b08ee4a66eb9eaec542a95a2a14f9dea948cc226a3105ac26ee187f2e838870f952be37c5f6512dbc8b06509cb735d453fc7f6732473937c8932b6aa96f46db4436309ae178e52b67b1feafd3c07fa60ef27dc81ab5225ef2085bdcc4c969b609e7e0ba08c49d8cbccbf80323e76e69caa997262475ff9d899f9171a242853fd82ab5fa09f2b73270f31c877fa02bb262dd277b0738d61391687a445fa5f18b6371495397fe3e4dce6066ea86d674a8bb4e640c78267816be8cb5a106ced52affb5ec01d21ec691ac108a03f896005d0af9703b97b43b7d042cfbf844db3e1e56b3c836878f91a3e7684b02700fc8ecc0b514f302dbc3c83bc08d738c702b916c8b938174805d0e758205fa02f03720f03d69797e87320b7e21afa1bc8ad805bdd1aaa97c2b9b3817690d70505b2813a0ff749b9a22fa1f77889cefccb33888699f025749a97e8b35a6e6ae1e96f2e37c13c7d79fa1bcc4d324f7f2382ed8f1b0ab615c43cfd2dc5382e4f9f4bb94926499de873aabe61288cbc2e7dee08e3f4d0af344b7fe3b9f4b7187d4a65dbb9f4a98cfeece1668a9ba971a6681475298571ab3923c966ea678abaa88ad29c4ad8cb355323fa9e0b28ef47e5a6d6824bf4297ddb625cdaadb806e4d9a53f02c70e358a329a9b3ad7ccd3e77adc447a4a698f8bc6c5dcd4f5b0dcf45171b4c6936296613db24b5bc2f1475238565138da0aa35f59dd8aa2ba9dbe499160f64562ad6aca046d829718d8514ea9e128a7cc809247cebc44bfcee8cb643c23b79a8ddcead2870153f304f32d8032dcb7f07cf2482e37c917ec1583c9ba1849f65c9ab261e65b780f00a03c753d6e922b5a57bb14d5023884c6cfbc570394a78fca4d39503ab3f4a3baf4b906c82700807c920f7ecceb9c24941669cb5aa42f37cd94b5ffa2686343df577325b38533e5255a9aa1b7e81435667e26cc612243c3ccb7f03f66be853087c99c99e18f99af11e6cc00204cf169e6c73a038384dd81fe0e2f51173d613d19d0a5b02f3fec0bc8271ae094c590c01bbc4485d0f2b1d32c2fd1dfe995ca4bf475e8d3aaac59d4a5f4bd0856be80417055aa543931f980b83b7055aacc14d7d04f5dfa1fd74adb90e2318d94a68ed2cd057f93916941dcd45270a9bfe3dad8319416292f546260e1f60fb79f474d7f12a99d5411596b62226929457a663cad56420a12d591554bfa3661344ffd276df512272c334d27bda2e2624999ec54a324aa8170c7d9956776c38eb9a42a888cc1644bb29e467b51c28e928a93db4d5eb2a7d43c167353bb6c1560c1de4ab4663c32d70b16a3efeff9e6de72530e5e92cf5ea3c9b16332d612abb0c4ed19cfd8311c529a2199b063c75ece45cc4d4c52f2949381537dfadcd38ff57c71a58871fb7db5d59ce4f2d6e82c57a562dee32e650fc691b181e6545fe6479f723870aa3f2f7d1a2aa9f261249692d63bd6d94c0b3ce96da0d7df17c5fcb6eddbb6f96dddb77dbecdfbb6efdb40df16fa361b0259faa14bb7fa9352eba69cfecfcb7e992dfccef9844aea4fb07ac9c9a83d2f30b12214e9a93566b7ff675847bc177a73ce392775ea79361a878e5191dbef7da8165b3c39e79cd3a7e781a3d1ce94165b682d76cb94965a4b4f0b172d4aec18b3e4a51062e7b2143b362e4bb153bb479072633816a5488cac6fd86b3ca901abe1aaf1aad1a4468d242d76cc931862605bcc921a4e6298c4c09adcfe1a4efa06e4cd39e79c73fa941e932486d562d318558b1db38a39d2624caac5de69b125384a32627d24774866863b431014611c19333201df6c6400810b28dc7e17d6e8c8ed8f41f2034b537714a1287b8dd8ac75c4e252bf8335a0d490b5d831b0188f99c21e61d95144c28e312eb0e38d1623b686ca4d35625eea24ad1a4b6aa06aa4dc14fa7ed69d3019d87152a172c718d8a4d1ee18036b21c1dcd4c26ab55caed7cbdd41600b055b7a5aec962f482c37b5cc39e79c24949b58663337b1c0c0dcc452abd1683d3d3c3c32592cd66ab95caf118be52616542ae52a18949b56665eeaafd568b49e9e97999b566035626e6ae1e191c962b1961ab1dbc2f30273d30acb5f586e5a79bd5cae566bb5ead4c80a76fc24794162c7991b92cd06c9dcc41ee271d3941015d04796eaa1d5eef89155959b3e2e2ec9dc2442855c6ee21389c7ca3eaed84a846a950855a3817eb04dd8900a44eb079178ac0ce67a7d6431b08fe6b535c78f2c8c79d2628f1fd9ed189111760ccd6ac4442837c53cc1a57e295256a89470fb63605cd3356435a0c4e4c0d6885d1af8647ff47293ce69c5c572538ece29f4fda3d6c8e526d1f78f5e2210f412e443f4203047e7245a5901737442ef263ea55457b4bafd7cb2a1ada04b141fd7ed8f79d2372310584cac6ff893e4b3a46fa0b0a308e5793f41ef4744d897272dbec05aec39e7cb939758c3dc3482350cc6fdf859dd7ed7a5cfac8371bef7e77a70b4d8376ee800810d02e5923b8e5e5e60bbe7501f2833856bfa472c1fb17cc4ba31b016dba66f6c10614751b4a1f17004f22e45d871e6ced0d018d8acddf61317bb330616d3735ba66704bbfd9c08b5d337f36f8af4cd46c3512b1c2541b549a244a9110b08fb778c81b16e7f0c2c261623eb8fe1e9ee465dbe377434aac6cceb03ec784c33ca0f28233d30240a87844398fcb0cfa721de7f6fc3e73ffff921df7b1f295f24fa2f9491ffbdce2907f4a1504686fe87f7a1971ffac29cd07f3ee77bcf856b2a98c3e4c7caa824f4a80f852518b2c3fe8a089491ff5e72b9f23cf0b0430d7c12fd4a9893c33aa72a0a6d68fb85faa117fd68834448e6c34b2099cee903754e3e4808f895a8ef41614e4e102ff9e3e025ff4f88973c072ff9ef50039f40df8f12f5310de43bf495922555ac15ab43ff81a2f7bc09cad007b9434b1888871fa20f853939a10f85d215b2bb7c8942bfc34522f0932706c970c4359593994f4399194220c441566be022956d121f613b061ecd9c99d59e6c884e737db0bd83b24a2ebaaee3212f0d6564e04b5fe7028139811d5dff0019dd4f7d07777807eed0d1e2b66d5c4973babbbb5392bbbbbb731fba9cfbc6b94fef412f5f82926ba62743fffb1c502851ff85419478bf79a190172cacf7fda120d8f91e0da5eab7303cfe20948895bf01f002db6827e7ef1be5225622e1752d631cbe1f33b712f87d0756b28c61bbefee1b6419c3d2f7983e91126515254acb625dea3e091f822577b74b2cb8c6632d761fbac276dfa826dd2ccb4f5a07a3aa7cb9a97bf985e42191bcd6273a7eb411bb07adc076cfd7fde3854fac3ede7121c9a6ebbe917984dcd07d47b25c23752f5259973f47e9babfe708c8ee7bc638f276df5ab017b71b5b8cdb3d5581e5cbfd0dff742fdddddd3f60730172c138f53b77777777afddce7d8b73f6b9d03ef7f665fc593ea765e55994ac7c5d711f11b1f62d98da4ed41be4ce359fff50613bdaa4a98b3eb9dd735327b7eb6ef4ac4bdd73279f71e40d3df352f7ecfe5ef7d0ac97a60d2b34ac845df352f73624796916b1fd1f97baef9ebbefa3d141d850b25a9c79edd9ed7e8402ebdf3dd374a10e9446c38c99c9538254f668d4a3d16834228d4623ef1b7ddf6834127d23fb8de69d217f8f7ed3534561c7d927701314a1466c457c1fe3d427a2a6ba21fabb6f6adfd43bbd25fbf45aa85879b9918d1bcc52ce29eb6c29c3d659fbe6fbfa5ffdda755dd775ddf781a316eb7723c6f97cedbaaeebbaee7a5df7f1e6fc1cf4a20f140621ab54a972c629354f392d9c98742ff38552f539a250a23e147aa012d07f40392d4a77212d4ada859536c7849b6cfdc6b0332d7a18f2041ed38ccebade9cfd59106815fa914f0dac6ce1f20360bbfca39e49e25bf9feda8680a84aaf6466e80bfabecd80ebbdb77dac8512aefcb6825bc638f2cac67e5defa5a7b8eb7daf7cf87c550a75bdd6f5bc9728b9d3268b92456631d8eb7ad275bdd6f53cef3d096b5bacffb558bd97a07cd222ac45f975be3bf756f4b64131d4db7e04093ff27d8316bcd125ef1dd4c135defd421b2f512cc8c77cef719027ef7b60a06f3eef7d0f8cf3bdf737f48d7ccf7bf61e0476112752fc24f8afb0df4baf93b0f57d6624f97a120401196b11488b52c6bf73cf91f8aa45ef1df42363d81b362d7ade7f61d8d186e73dbf27255dd9daa227ef0ec691d7f39ed98aeb3d5581e53c0bcafcb0a9d7397dde7b1e68ac23f7484fb64fcae184b8da7dbc0f240259910c3dd75a5b9e413f726c28f3c3befd95cf690925ea57c2205e0295b07c88251472ed94a15028224efca399fa596ffb72ecaf8062a8a15451ef3f10861aeef8a2b0fed55aab57bf0a7a9fef03616891880b03eb48fdc9d65a6bad1514fabc4f5739d0872e48890dcca5951f7588c2d1da80a8b0f309ac7ee18c327964c4722f276cc2dc44539fdfb6c1a5fad5868deab41afa15b0af27aff74ea3d19c46f3d86587c612f407cabb22af884546d8d1c6ad34445d589897ea5798b702b6bbbb2727acd695f71550de4f5ac1352b1fb3a409eb527d39612dd60f5561eb3b8d716c288dc0352ba1d35aacbfc4d26e7ddb373afc57472be0f8dec8f23dd01b1285c271ded0db5f59790f1cc771f474587765c75df995dfe14ce5b278dd6c910b852be028efcaca0a388afe131285e3bca0f75df93106e69a957014fde73fbe5fce05f105fd0e3e696aa803658d5c109b227565ead28ec55f97e8cc5cc2ca18118912e22622429c48901cdc4424072fd12782839788dce0a3c70e1c36f4452f5122f2bd44ea21d9994d4227816b2811c9e344a4ac67d03c3d0336f1898a2880b004934befd8512efd26c226972ed8f482b4e265ac6f4897be94318eac522380560100da04d28c4b3f8a2a5cca0030a41652099786ac6e7dc26ed8f58e5d6fa7201e943d0abb94ebdb5cc2d6548b1c4c057ba55eae56adc5a2b1563d2bd54c95e24971281987aac56a3418ade7d543a4babce44fa4aabce4bfc1ba2418870789ba5d125ce3efb5e52527b14222b55be9405fa6c26e5555d7fdc538b372200a48222e0d75a8211099ba2ab035fc804c5dd80c3275e9ecb6fca73f8dd9ca0c4844f156fb92067d823c498b53588ff258794747e2846b98307377c23849b07dc70db6c1b6276d92287a9da26a5fb8d548346bed6cfeb8c1bc63592654b75ff80a2ce802e5f2dc2c2cdff77dcdd2d559beb284df534a29a52c20df8f7b5a9f85fbbe8506f6fbefb7ffbea7e0f72fa0cc8f1750e6874b8e0c0d7dc43cccf3c9e5754e5ecb8885c57e2db5c5d1efe81670b6380a47fa22168fe53d1610f4b0161b04d12ec7aa40f2e472ac8a25f72306e7f0a15efafd1f9a11965c86e2728c8a9e5b4591cb31233861c0e59811a0dc0fcd4d5deb5323d92789dfb1c48e07b471df8803f1a81fd784050c7dc7b2eb6668f495abac2cef97251c73ee28ac52753d3ab78d8262d84186d01dfd0cf68e589e5940d06f20199c5496b5ce508bc73127b9d1fb1d8563ce6d09ebabc57ed0e568312027e36040ae93752c2f1561c70f6dec58b765384a59eed5d5be6ed384b0235d1db1bdba2b4f576e827998f0dbe12e209f28387f055c8d1f31468e36d626639702e7bb807c6210fdc905387b260d457768386b366710e939b9c840c59dd8949b3eb40fad534e55fda1b5d81fdaede76a4920554b8b64e0310de9451b5948a3e4c0fe1085391e78c1895f827eb06c71e2dfd14958ee311e28ee34498bb245e9fc8da394524a2745d2225dd1548bf2e508ab6a910a8f5110b6077965909152d2d8a5322aa333dad392b23cca721395c9aea42c975dc1fe25bd6813c65366fe501956bed30ae572144b82a17f9b75ce49e9566de4687469a5b38539fe6d8672c8bd0d5167ec939d2986225a5de2fac918152f6b6320a267d4830a974833b2df379a895191ba23cd260314c4a840d1f48052ebc019529d7c43870d0e284c9aab85b9f3720c4a0dee48821d212b75f5d4e957b0e37ce771c4096a4004258413fcf03a50821604255c610b9914190881055b0865880f065914524046174aa0fcc0052ed54c095390d1830413ae5f71fd88937b9df36b618a9edb3f3900538cc144142860e004199c74902852658a22384142058425c46009df9461c509767c8aa46fa680d2554a6982811157cb08279418622a41063f70b700307881ab8a2348b8010c4efe4bae7cbaa46f46dabaf2e5d3d6d3c82956f7c6a5ae2e098f69461ab3eb3f932267928b2832598bdd92691ef41ba8bfdb5e26dd176d60c21b18f6a2af6741891ee845653d4a29a5b49384dd3ac2b66fa0930d2bcff22ce190965fa9cc6f5b78191ef22a89f995aff12b218d51b5e119cc05359ab5809f0d2cfff22cbfd3e2f22fa18c8f1d1abf230380f7f7be256d6a8131cee7fa7b54be227d137affcfff3bd237d34937f93e98937cf46a6ed302731365b160b7a52536b6c8aeff0cece8b9dcd4f538619c6efbb1e575bd5b715dff15ff15959bfefd57566e7a79ff15ff95969b48b4d1ab753d6eea78b6d03f00a04702691e060cc0bf80e03f18d2802fbf813f6868deebef49a0ce0906d439bd803aa707754e2f304f13e6b03ccc7b010049ff02e630d99ec98f003c29cc217d00986ccfa01dfdf20108735aa84702739870cfc40718e6c81308f36198e3f230215d79697bdaf2d2cb8321650979ddb13e102e160388e5051cfd832edf813ce6a5dff1b8c90b79dab5c1d06811d2b4cd7c568129118cd3bdff9cc238de5b39a32c98a5e03a25c266f494eb3052fa666b79c93fa6c74bfee23f89f43de8ebf55cfe8e762939ae0b37d0a277dcfbe5429a9b5e5ec2161ee77eb434522d9ab61a8d225df21fb7dab871ad8d6b6d5c8b6bd138e275a09ccfa0d0ef68fa22918802345ca2bf63834bf46f70897e8d1d981a5766861a777e8d3b43253061a8834b74068ee28abc89fc42f5453cb65b431c5a009fdb4172a48874d24990dcf15bcab023cf528f43b47991f496542d7d750a5404a4fa682e2baff6c9922021fdfff7b8583131afeb6fc311878d5843e19437745b001f00e00c28034a50a6a44aae5840d9f2d12f38949e5d7f98580b8f979ab4a9514c82c239b9eeb2aa5de9f2f9200e2d6e50bae4740a7dd570dca2c0d046fa7a37b1fc0c3f949bde4bb56a2de9ffbf989b5c56a0236da2afefe5a6add625ff94cb0ae5d5be8734b33ceeb2925d5ff24a72b71aecfabfbcc08e52e5d5dc54abb524d2f8362c21a9e5b27297959b48291c363591a7ceaccb2a099ddf5286adb5c63c69d163482dfaaac14f2b2fa1b02e2bd005498bfe1be8c202c2be57f3ff50fe5fcaff53f957b0850623b5488e63b471f9511c9f74ed68e62652485fa1cd4b28ba843fbbfe2d2f37dde02d3cfe3d2ff28042526cfc161e04b4f05cff09a2619e565e55845250a594524a370ada605421cc91161d66270618548b3d28c2f5ff171847925a675cff1b698a79d2258f89328418280d70915ad75ffee07d37e090839b58de3fc80a12f653718d3f0bf8ad801fca4b209b68c4bcc43852de171887af9f9c068fd3905df76aeea75015dbf22b3fc2b8ae3f09c9f51f6168d79fe5c71829311650c6c7cecbefb03c87f22424160949df70efbfd5dc244fa4afd5dc44a3458391b989460a26e626796ad1480f13bb30dcbc1f504ac9a282d145953d29e94525492ce07043e760d342752ae6a626e269b4dc24aec0a22076bdd6d648a375fd5f40e9020a094223e5a61e3d31526266315cf40dfd1989c7d248b148b6e7bacf29b546f50edd7e1c5dfae3cca5355b7f86de1381a0d07ba190cf1ea857734ac371fbee3f5cd803bd5c28b968b1b93a9bfb615c6e5a797f98979b46ef2d2eabebbfc2f23b9ae547a31f85433e582863d9ab5d7f9650c6c7cecbce8b4ce7f4e2457059d118e984ba0621bc8d9907f7f419fc808dab03f7f49f410e943740d237df37fd42dcc4f25ded73897918c4366c6e60ebe85b323fffc71fff0f1c7fb4b76d480ec4c69d610535cd81c7838b07f9fc3dd4fb7909ee20abdcee679d75be9a741f77ef3e6007d217754297b4d8b4d562f7ed40ce7de04d704dbfb8a6bb7683b53d2f0a9b6683e847a21fc96ff91d96151b124970a36d350eb551412aa07f93827ca19fa5fb95cf736aeb7169c2cadfbce01a296c5e30cefc3e60bd1dc85d07d1e028196e5f6c3d5cd30eebf198974aed57826200fd08bdc886100dfe1e05f190b706900da170c6642c2f35873232b421f4a2f7b086503879bc757774281485eef2523f8f9b44b487d2688d3ec1a64d268515b75d288c71beefdf608ce37addfe8d157a3ea96ea36893a64efa6755d915ab674df62b87f1e436a72d8a9ab54923cdd9df4d563759cfb8a6258fec18f3ac5b1d65f4215046863e76ecbbbcce29e4b0e6c2f15f146d1cd635fed1610e035de6f65d9ec98fd1873e147afb4c64e847e85dc29c1a8a217b29d4b25b863bc8db0e6b0153f3147a16d05b09fd8e16d9207a1b0e99a950a6063ef9087537e7fadac5888f8b717ce850c9cbcbc9a233c529c1250e87db40be3c5164d7ae3d7ff0e60f8ce397721f7d2947564a29a56c39b223da525aa494763025d8c4dc3de912ed3a29977e944b7f76501cec5c5ca383ae05955ad56a2d89f42f8a36369d7d92f8365d0f10bad6f5c813fda99a7f95bc3cf7624f2fdfb958aa74aeaecd14e9459f8371f4b915c7e25a9c8b7b7932fe30bf23e3cfb55ec65fc6431ef272abaa90a8f46c5586458e324424000000006314002030100c884462b16034a068ba2a1f14800c87a24476541e0ba4304a2184902104800800000000000c20610300e0b4d099ced0b42622abe024e924a1c4cc17538b66a87f487e816044230ef33139dd94ad1c41b737060c8c6d49937e99fb6fe4361fdf31f1d1187512b35668ccf871a95982e18c0cac39382792d32031c36ab6df594d555fd908fa7c22ab2458a9ae0eb635a818a14c3823d1ad51292d638e3cdb68a14899710fcab34e4afe83d412e31b1ff242639dc76dbd02643d0d2c1c56421c986478e4211120fbe81775a0765ac90a87470d2baded36f0f05c98aff0ba99030f8361ad644b6dbe79d0abebc44d626125baebf3099ee35e59a0923e3225c860d62182e6450da52019c1fd4598bcef8f9e0152103478b3320b3fda1485c948fbc0947db33a3f4f286d70a48786d8ac25cc755eed82e9d9b3403fd403d100dcd1a636aa69da690c5c5325871462da183a584de8d92ed15773c99e8c5f502a5661cf756e0da7fa2d7e810f8722823bb544d4e896a34b48e2a8bcbc60c34c7f181726e00bfe94463230715a56e6f38d971fd561699cf4fe6ec4c55cca9ba04edfa4cc8d43db5bd3a6ec918cb11c08877dc140e756bebe1b6a92d520e9aba1845b4e886f2a03313a380479a2741eb0e779484739a44d7f1b96072dcf8d42dfbe1e99a72dfe62ec7e40d7a6ea4c1e9f05400f64feb9b03285277c37112c5e67c29ac123cc7cb811d30b53a4031421202811fc078c104fc1ff416749988a5c21a63ed7dc50e780237927332e814138efa83f504aec4aadb055cadef599aa0660c95bec2e37f567061df59375b40af6657bafe676e664124bee3e164cfcf0a305cee1d59dafdf2fbed259795e4ab8092a1c6ea9ec968bb9d8381c13f096a0e1917aa11d7b840fb716115600ea80ffcd8f2e06e160ebf6501f439948fa0fd0c03d3f2c93a87b158b02fa7981046a7e7b9126f881046e77c95dffbfe00ad2b9c1013e4386d51d8d33364528852c9ac73215f0d9b1e90f5c7d9f42c1ec8db9c09c43cb200d4b7286035f79b17181400f21b2d6a2a6a67b6a5d9ae028621735af995adf982b52160316c5da352a849c23168eb2dfe0b21ce10195ca7b2b7888ac0a38f39acd53906815455e8eec7cb1d59bf8f70e5120e8dde52c5f685514d4747b801503f1111e86070593903abcc8f52cd6aaa72f0cffddb0c5cc43314b8ef4c4c22a21d6ef256ec8888428af3d92ca25fffe55dedfabc7b0036f23cdc159cd43742f61ca288ab90855feae23eda5b2a2c53c5b6d5e5c5539a10267aad4052600791e91ac52a5b84044da42c631249d9ad256d4d91473f590d660f558c3ba141656e4a2499fedff4cc313d69ab00dbec4c9701e3690de50fd124ec263280038be808609982a0f1de4142cf0a7f6de6dbe8db7599383e82d59704e3b67bc9ae5bbbdbca2f915bf46d289c7d889c6c1384507f1d2a3ecdba1b27ef29858da6164e087861740d78a1c20f39fa5e362e35d55fbcca341115533c4a0c790c53e9719dc375a014dd43718e2df97355d8582beccf8474b504847a2aa8036191a0473c71f5541c293df45b25dac50cc2b4f8bdadd2e660c197181aa8741c43291306fbf1ba81fde82ddaf04b03c80d07ab647046826c6b07b0831f762b0d3b81969103a40388442a3f84b968a870c95d7bb9e47d853923a33831eccf33d27ae1a875525ea90b82fe791699a957af937b1b44f1e4cd81e40ab45e757dde1c4e0a5a72626f71f66b8c785033d05278be6fea29b7e74c296d536758d0d2bab521ba3b38a5ddf1419c03cfd5f9770435cb9f1e82cf10f4efdf817c65e8bf7b89a24de0fdfdb4e5e18cd6529b40f3056dae1cef762f7425d7ea845d8a6b79089a1921e282207eef8cc2de314f9d5107862dcb3d9f55acad728131ae9bbc1a17a34982d59d7e29a51865a12d4cabeb4ceedeea598b244f138bb7f066df09cac7c3c57ff73d21f8b85e32bc18f033ef96809515d87a6f31e1cd4f9a5bd8ee018158013453a7051f1f1d1a24f83134386e5847f28a7b5a67bba59b1ae6069a7728b8de7a2b60f0ff304904e186a570246854edb88a6f5308ff38ae8979395492832f48fb3dbc59131bf7e33ad55dfc5315f4633390b54cb7ebeee3c58c2fc4de155c645d2beb22775e150ec7d077af4f6e85fe24261be15b4ecd2511678c402186f81ee57e506274cf62e592cec17f534601b0436ac222d51bff1429155cd5fe750e4f8184ca523b333e6371392cb3eab58005d566822444c1d1ec05b7eb4f9817e5530939f4d1303eb16b3b811bc65beb95f0ac080716a45b242a9b44c1708320f5c194e024d11b524eb3484a4563902c48b77d954e0b70f66b94c463763f101792d246e38cac8283f5f54601125b46f1b9db803258a8aa0aab500f15cf43624b73ea1d72efdba9c736a3d11536b32f2e100646f22060c63ea96fc8fa32fe46ebee60c7468b01391bbe427f8189cde0969ce3d650ffb14f3a5287b833c1abb74db2cc41d0a6f9e8c51dffbba5b4d946fddd285dfd34facee5e74d85dd9d2405367bae325c1d1e1ab9e236e004721eaf3ea009862a8b9af249ff5290750ea0833b3d782285b0d18f8b3f6af9b4355c27b18dc657071fc7dc6e0c6c3495616471afc373b5c01cac090a08d28af146e6eb6970d11b447bf7cd57815562e81dbd05dbeb19237916cd0b92cd238dede813070fe45f4136a7debb0a1f775c3290095b77257b656a0f721c8a93eb6b9a97fb21cee19a4173805ebabf0da4131a1f6dd28cd46df7765a414ffc90fa234de379e1bdc51529aef59e41cdcc0851e1cb87f188e3880163491c254a36aed33af93529bfeabb66d187da2fffeed6745f830813869c95094b3ce61fccef01999487d11a1214a65b5dbf56648b1b396a4998f6210cfb496efede681f4fff7bd6dd7222d6192ff02b6e7afd922ece5020bdeab31ec808736fa2ceda1634abb0d0c233be034015f5ca73f39f78515574639938523ba43a8ae7696625a734602add91ebeb96f1ea9865b3a1cad6e867f4699980edfe29ad16067239b4701876efed8c5017083e61c74fddc444de31c91d5389855739acebe59fa236cb8ad8eb9344b111daa8be3bad4c49304a69ca6f0b483593796ca6e34ceb46f4c997bf78a638a3fbffe27a0b7dc8de8fb2d9eb9cb8e118affe712986f80c73a1d44cb988ad3884a623ce475e2f11f143e08a565681151df34eccaf0affdbb2b241309d6b671033c8ecf2003849409df44a66d90f766dbe7888a3879651fad6c6f4bbf5d4477931ef64eb5a713f2ccf6653118122a53bf766b7a3a6f177b8c4773686153906a946441c37c6b62fdeee8281943e8a4c5b52626f0b5d8abd3da6b509fa7ac58a958e77e265635020f93e1c7acdec2f954a897b9b34f291fb33d44bc1a5f15715586bc9597eaa2b36330383a6efbf1f13611948a76e27ace6715ffe94c7c377614ba644e026c7a6b9aeb9f0d8d61a2cb3213fbcfb2986edbbca1e92743e3ae38ab9d659907463c4b92b94846c27f8e63e9691d67e1cd317a80380c6212781cd0448f8dfc8a3bcb24759bc4adc43914289891af0618299d62e797cba26c4226c7eaed6dcdd69ef0568456dd9b9826c00bc00469b08270c1c8d57ed193214440afb9e10be5ef5b93b87c9795a8c5c6d8e66603d99eb0839214b9c86c0008f41abfdc244af7a55d155c6315d67880157c347bb52acc78ac45101c475d13b537922e217cba12ecedc21684ecf0fc2a4c0fbeffb11e62532a2a17884b8911ebfc7ae21da861e4eb1ede19738544512ce6271c10f6956158f8ea6ac4548cd7e5a3a20b9cbeb24688c07b7cd307c193b52e40d4fe3b0d717057ef494e061bbe07d147fb474c3200f51bb2d8763a02b4dfc52f32e110c2c425d7f44761a1ecdc237df2c4d61393b634f5cb051ceff5c87860c6a9b5a06046c19967543c805ba7e5e694fb4a804cc906426d8994b3e92fa7f93e4845e5249d9cc93bb7febc7d916ffb63bfd79446862f2c7cd87c6829efead65e8412e845b18cf76325387acbd9a3101ea3d3fd960da4710de255fa03069c74588299c9606ce44c4e7860a86f1f0f5d16a5eca94e6be675b293e4944b1de4fba75f71e85da4927071ee0fc71409e0d468b24c0f6e94d50b7b22149c6e6575515ad99a54b9625c1a88cc26fbbb0fcc1991f7957c9ec78b3e344b91bfdc287b2178240bcf8bac43cf0ca53ab460810d0861b6e0295e96e503ab7ee6334d6aeec516d08069d1952234b7083360d596f83453c59547c5c0a0c1db2bbff6746003ea189cec6b7fbc2890ae6032de816b0307685ec67e8e37e03e79764887f4a7ec7b079118e0b96016de220296a66d71b4b29859675828a4ffbb1e98b8c77463a06d606e09807a55bb5d843433badeee784246f9237fc882b4ca48d677223a6bd22a97c22008c05fd4045b37d9f4b116292981e27cfe1081983af975a7053bf111e9fcba8c8e47d5895e98553d0118e3500350ba2be2e20454b2482ce86f391607809a750da27732de00c52a19977e4e2736ba48dd1bd3faaa8a9d3b46e7f236b70d42c143bb52fb2d5a26fde41a4c14893bccf59cfc2ab6d7227faaf3ec7e586005abad69657f61740acb927a9d6da9f3b3c2eb29b5b156ad33196f542cc932732a6a4ed15d40c7f69a60e4b4a42433b3e797d2dcd24c83a55e8b120d4c0928c759d505e7591702123fd460114745ae51334dba9ba432f07b2d39d8e851b9c07d6058a1d6367c6c7ef540e05ea3e595c052e6551ec8180a72929d5cfc024c9686d784d2d9e5f3d6ef479154c02c6cc1b5069eb2365165d9f41324ceaba684ec88aa34054b0fdd6d38124d9fee129fd5eb00e49b13f4398cedec1049a5e4c0fd3b529bb6092f0f28f371a9eca4e41c9b3350c6bb3ea62f017bb7c73c4f5fe3f2b2d01de72b6029212b2ce69b34e404356d7094a029729772c0ad8605b89a8f45810c4cb84e6cdfbe44a352a05f6278dcb67cc1cff5c93470cbed21359f41a5dfed140955b6d8bb716ed4307a17a05c8ebe4bef189a2f6e70e00a2248673b602a30f5bac53ac01350f62339f595c3986fc59498e03a15cea45b38167c4da85354014d57febc6f8dc77a748be76a564e5e2dd1135aa26e7afb0aaf41cffe88f788c60b6352ecbd41d463978c804ddfbc1c658d896e74b72205731e0002e3081ccc160938894bcac5e3d664a07735dba34e799163aa0ce48a35b82bdb6e2d9b0a44b68239ed216ef98758b60477bb304123e566cfb6ba56559fc59576c17d7721c5fb2e506e18161bcb456d9bbf5d964e5355af5874c730f7ec8301ba2779ae659698bb85ad6686f89969d9e2bb81cbb8dc76b3653c75373b22f627828eb33f5f75d5b84a861b21bf20755b74388a74aa3225f77a27b7da1bc69a256377c64a92c040a68f6c79472a7d14b476925057c8973cde5260179328b62c3034dff416db26e7b1c41b61a46dd3f9185489413301781efbdb12d10a8557518572082d81a28067c5d960ab901c950b7b80373168b3e8791015e62c8779a5a428246bfcebedf8972a050287b3979679e51728f3c9d5d36cd651a4516055c8ca644831a2194002d7755d77eb076a488a983ba46834920b34aa620f3614ed4600704c640b2bd65836d3c7d5a1d1633f5fac095f5ed85920543fd854134229ed0e45ac84866f412c3bed6365c4195f129dde50901eb5d7a503075c6eca8159a41dc5fc135739bcecd4c0fceb55dae3ac8dc68b6ddbdee8ff6295f98c10cec5f2e4cd1efe4e88d34d3f3f59e54eb3a8b9c3e29833c88098b196560d7b02136124fd7bb9cc5789299a35feac053c7fd07912d960e28d1a259efe03f4d9f7a67c6ee52a2dbeacc049455313907a21b432cd5b50ca007a2d405964c8e3981f31a33dee787da4e854ff19073d44897228aa199d275c0222b8b1b26fa8a9a33ab05592a7675e96dcf6d62a2af189bbf8f76d420d7a07604249ab34166fc08f6bcea2432ca7b6ff3f5448e629a3512a4d6d1f050e29913e39975757607d74d23acb6bce19b6165c1cd8ee746cf3b4c4529c626311be1fb99435345fa44c514e44fbd212196e2b913a0911636d47e9886ad9baa12a7a0e3c15860e8863479c1020a719fcc3c220fb00545f77268a53097f3d851b00b338e4ba7cded1606719cd118fa3c86c27e6978f31a6f501e0ae4139adffb83fe2b11d399707b6fd5a584ea1fd2d060146662653f1498aee519032d0ca6f10da7f1a3065e9d79aa61cd2f3ed865ac1ff2667abd1af8788ccc1ffa89eeafca63d9070f009a94e3b52db95823c7d7b79807cd835f62303a03cf370c66fe09818a7b438d5c227ec4f2af3de3ed6be633ad8459250f688290e7bc434bb92c2e66b852bf5adfaeae3830371367801de9bc244742fe4fd5d81222906995340c10a30906923a7381ef3c732f88ec6311abde40a502d6c5950ce864b213adaf6fc3523d4fdc211dbdb7c31c2f258255b21fa1899a64b21a0a24303d8ae626ae7313d5a96627a4ca090784c1720e413f526ab5a14edb517d04f23e09b0c8a7d8ea862599780eb93932b2a749ad74c14cfe49ff9d6f64779a4a24f05accb99803383c39a8b9f9971473e70bd68641b63edb8ed5d131cf8c04cdd041b0b597a48af0f254531ab9b940bc22a45e0739bf764d839f727d93a500b65b12dbb16b22672762166bc446c4f5cb54b6761439931075889f3d01d5688423f311a6b959e0856ef40ce799c0713b9c7b76bcf059d23c4e7af16ed9d66fffecabff27cb216e863f5ef7c743ebb38e6b2d47cf2b4110d6f173e60f4dff311bfe323576940bcf89efe13eb59d7cded7a228927072dfc81562c64803fc6463826c001cfca99e178c831350a9f41cf3de199e6c9afbcbe7ed508117694bf6c935dd9a6dd0aad33ec094e30ddc5b151380c8fef09135b3d5f34f9b401dcf56ff7ce89d007062286bc8386d6abb7577e509eb9a50d30484c15fb5cd91d47b2c10cbe12fbe6db5d6a518abc0cf46a2e20a49d97001296c89cb03cb7ba4aa00606b6e0777122ae90bad7d65c84dad621b818f4142e22b0a83b9b325f671f0e440468aa8ed789ba84c56c682ad37df1e7af0ad410ce6ba507029933bd434baf8b5d8f26f9728d343200428d74d98310e683d45a196566ef512117c1f4d2f9c0b8c716939f4ce40ccea50d20ddbdf93cb7d09d457003babd2316399974d7c2d162bcebcf1635f8e2002fdfba3124204b5423e5c815d817e1e9f2964374e67ca3049644a257b33f708562d4e9247d64edfe222b36bf6f8b407dceb60be799ead08fa4ccd3aa56a8d5ce9c3016b139a5e8f39559bca45f60f2b42e26c998e71b36377c3fa03954365097393d7ebd19f9b28318aa95079fb369948bb31a4b78c0b776345fa7e2c8d34eb0a84f57940270b0259055c927d87465b900dd50ede5d4a1172f370d83f4129b4868353379476886b104c5f29d2b9b46090dcc4516f4e870ad4797867b7403149c2c341304795ab88dcf28ee0e64d5f959c84ca4e5a5aa54a35108228b0ab47b61ee891a3b0a5c2b42eac1df3ba5ad48d3dd1368cd71331825358e59994d6562d8f1e68d513aeedf36f7b5bdd7d882b65f024731176c610d070aab02d335764c9314082fad3aef83da517001b365fa9d5f9cab06a705d77e202806b48f341db5c65ba61ade3739a0ab7c6a793da2c7e0117d7c0fcfd213e44468901bae6a1e9323b90c7f4f7918f6f0629363e173ef535a0a2fb001779e882b0e512381b8c4c4a71e64afbf2bf6a75d495478c901fa6127259f79f7b473b9cdbe4d93e5c51e2913c353c320ee01ff504359bfe62aba15969b3833d3104974ab5b6225e71244a46b6465b878aa8619072b3a1d3c239d10aa1c3ebee39e41fa363e80dbae7df5c48a74e53b8120b2b410096e680988ee072d47199414ac87801bf39db1b9214e0fec9ce8dcb1571c9df10270cab0f6ca1187e237fa1f034c7df62696d80c8d2f09136b7cf55491b806382f760eb05b7d0d40709ee6d1022243ba351638360f6c44613a00c7b1dd22048b9fa0bf9026c9a51d88c4b9b41ff127841f365a4d5af0db97a3355754f3073e8250164bbdfdca4e06917e3db0e25cab8113ebd63f3a10a7601c189021763df49c2da6db4be3fe1bb91b2bcebddb480df3a75c7ae3800d64549c750d4d9148175cb123f8740b6ebeb058c0cf714412fa1188f1a658bb559ca114423935e5b46d21a9605d8a8e3b96a428700d733e5d7cc2a78d44259f82a7dbd9f4826f55f798308fdec10636d2dafac8c5da889513265bf8126262fc0783b2af9ca5bb87c4645d3eb6a98b041ddb3487ba827b97242e97d07da3d0b3b66b93430adc7d05b2dfc696db0c40a1333f491f86240c15fae4704c9f2645f49d24951b2997ac81387132aeeb1dca7c441cb72b1a38e92c8680f8bade449d0d3520ea276a11668f3cb6c1245d35dcc2d5185bb72fc1468887eabdcaf5e237d6fc33adadfc04d3ff80441ae963ba7064dd65ad7c26a8bce0fcc6979ecd1511f431565d99664b37962af339e33e2a64b45f56f6e25e8b77eb34d4b3aee91c20c92dbfb0f8e52e6900abfc05e81b09f6ab15194b68240c16e82b1d20877c83b6772d338a22d4f05587cf0f633f97da2f6640ac01dd24269b93010bf66b66f343e729dbcf466cd684bd21dbd9c74c6179de86aacd01423a66a46cc1c8782d20722ef84125df5e8252bcafc7829c789721a00fdb4d31b587c1b6ee8718eb70bb7cd57570284cf50107e484b544d775ac3bebbfefb83c77b6f461428677c8e1e025c44f4da89a865e8f10dce3b174c56db5c879e25b49b9fbedb043251c5ad7df77fe07629731727a8513784b4459910d033493c6e0d5108199996e084f60c251633cba367b20cdaac8076e82dfbf27923fcb2f14372e2cccdf38575856043c2e14eea7e9d829e455e0634989b630fe988944dab85293807c41e927f3ddc3a520d2570d74726cb1dde775ab8c8ec428eb32be7ae410e4706a18ac829b0c31b0052f9d4496577ed107482805ff76e32e8b2e7310e684a93fe70a3ed560532589fa5b5a089cf0201f8348919b4a150b4cf9bf058f93305739fb3409e2ae1ccab71e101067cf51c9b71bd859cc60425e2f41387ac4935abc478361a35df83ca782fe7dc30a2a74673af7e61d236b3abad4aa99330f2416f0b047c490d2055c12243a66a412361fd6a946f0379d48effae85fbdd852bc2b807724c3723fe4c4ea6cbb5708d0537c0dd805c87961e36de0133c85509e070894e941192e153170050df2ac884a1af391926f4d0493576abedf86a47cd700d4f5862e74c74521fe1180bdb996f95f1f26297efeebb3b804a7359d44b5db3fe875b1b62f35aab1c753a940db06fe075a20ece497f7c5d9de62de9c5f3e035d3bc67eeec985bc9d6dc4b06c01b541e70382020ef0332a306a99062f4408a08450d95e082e60133f26d5afbf0323f89043dfaed33249df385c8004e8d2aa16190f102b722209bc9b2e3969531f1e33d79922ae264e9d041508503efcdf094962cd76f512f39c50bbd531ae7072cab6df22f62679e532c0e0bad1f30d7cbacb6c878a147adba24865a76cc09704f9b9cc6423da1237770b127d7dca076d2174d2336a79b98575cb1736b791a8702703629e3e0846997e81c9f918f994b5430797a36c8a806a619970fd80af1284e8a21bc348c003e90f28855a2b8127343a045a34f73a894c0ed291c9ee683fe4353007b1d5f1575eb48ee826bbe725d502c671114c716b6a5dfeef6dd5f6db1c827c7f9277ce8172310a6afb9c2955446cf9e2a1245df8731d3657c39691cf7634252bb0213b56345d5ec3b1c37d20e144a7f1474f176b8dc06d110fe1c22653abb53e9177ed3fef7bf1e3406f37a049a8f04e700b55b9344caa63f37e74c9266622f171783684259bafb8c386fccec6b27e3ade807d9e3f681351f266bc0eb200e4336136a86bc6debac8b73cea21b49b6d8f08b0a7d0a56c8314a7b70eafd9915c8d0731bdd87bb50f55b3b55aca9027389911df937e30adce8a939098567b666e82f00fb2c705b90aac81444368b9e4309a314a5c06e5254ecfbb04842f17442ef69fe64298716175ae6f1e17e77d99dd3978c5e16ece52615efbf16940d3d91c6d4ca2cfc666519b8165dd5accba4b58391b8bbbc0e169087686e4a0e88ff624a42cd339995b4b59d8ee435d8547dc685d8a9f672f9eec68d3d2193c2ffe65ec11093d76dedc9db817c3271f6b3d218d1024a1ea42b161f3763d5c75b8fbda1ca5b2ffc7721b94e661274ecdf0ec666f22c71819d9c718ab7e511388d1a3df5496034c278e0eaa29640acc441c8e885f24bf700781f91bd30d13003466d72817a47e9ecfb6232d47917f0974875ca3301c1c0be4736c32521947177c2e1f555533ed2a269212419284e45bc076022c46f2cdbc73be4d7fce3d133c6360096b25380ebe4f8c7358f7b7f4277c99d485e3c61a4ecc5d97350e8b65e5d1dbb7a105e599eeb0ecd044436012cb047a667224f4cf70f525a5aefbbc62e2c714621e3535b50d4c0f898bb8de531b96c6c0ccf5986cb16af11a43b1b865a80b39f0ca42cab1894f54806bf32879b22d07b0491af327b474a8ec7513bfb643279522c28ef7b23c51e1d58325214a32eb4ad70fa34e2421fc30341a69e8954256a897cc800c3c31657e756e8b840e9efffecabd9d4d0f68ffe70f38ae2c843d49411101565cd4c5e945ca33b274d0a5d37be2ea4b755f6e22affdf2f48ec9ac7de1f5ade54a1397976e3521a17d6874bdcf0c1986a34eccf4977cba4c9d9a7e5d0cb10d1501fd85ddeda474a641609aa05cd16d7a3869c4d75d7fa6f23121f6d1d123dbdb5094416ec5d41924322d243009f9727b7ec0e4af8006918332f07d67e4a229d1de1edcb1bb50d0fd24e39f623496c22d63254ff831bd3ade6c19033aa00f078622592357c1427ab942e254b5c93578ac2580fc0e6b6f0e0b51fb5b625834592183daecb50a778d730051fe1e91ae61f5329162c336d26c00fdbf1443e7900f12a5c467e6421542c45708b5046bc09d72115a816250c7a0c1463ce3a80b5050b258066b6519ae1bc72c538179037f3f77f1da0c42647290ba506a2022db5a71078ce30468d5a7550170c54ac3ece2d5287918a3d42157801a8c59b8d8132d8e45c3e59e4cce66f49570e5c7354fe4f88e82ff8285939dc928d1b33e71dc2d8ddd0431564d637787ea1881e289bcf562d763e1d46b38056c00f7ccc33cca202e54e9236a53afcd26a64d7c0f04d73e94125b34db7791f22b16a48f0e6edacdfa18fc0960b019490615cd6ea67133ae9c296dd4c5380a4404153417eef8f5c5b103eb5100ed676221de46ea15ee3fe0c6217c2cbbdf502fd45f853882fe45b338f9464d432cc47359cdc7d08bc9ad9beaf174f19ed2c29cf5ff3d93217c75c9346153bd62000f1db82eb69ae51210530abc29777d8c1a705eac1087b3aaab829c2007a8bb0e58827f00e86b9ee020dfdb5a9e8c2d36d6ad0f2345d890c1f81965f72c2bc2bfbc5c93d037722e274c29f618a1081b99227d7c628437fd0b5d63e46903016d69856c19a7ac0ead0db573627367185d0912bd3a6a1d686de019229c3f765745caacfcef3ecf770f4d88783151726987c59b6eae27802d4122b1d6699eec762b5854c740963db0246ef917c3f1721385245686c65ba00c5a0585d11ffae9343a19ba414dbcb90b67aeff928810708f296ee8e81adca40622808a43321ea4af75fb811196c3a53a22a5e835c01b774df4c7d295d92657a55df8c2924086c4756f1c66a11d379285b14ee4a87e7defffa83147acb126b9ff15f8753d920010cb84c020b7dbef1a71cb5e4a448f0fc8fac949cf1aa535f2ea317010bbabe4ab2d8f9c9d8e8b7a08e120b537a185f7588ffa1f444247bf2a42c7af0298f988ac3d09122d4ccfb08f9fc7434540e4212c278580d0358274131320a5ac6026350a62b4c90a8d4e32fa8d3746b5ac2b221b6e3c93275f1919ffeb2f244dec00385c84ecc1b93ddd753e8dfee503fb80d6fbf0425a2dc9e55df4eec3e2b91a4724db92445f52d1ae3f8cc5184c93e0f978cda9684e8edda0f89f1501a6b326c05c9d354319579568e0f480c49ae6ecea6e0d969f6941c9cd46904047e6ca5446264dfe95b3e2f78a9d13d7695171a83268db873e2c06a22e9d3bf32995f4b53ab25fa470789a41bae56fd09b49d0c37a40834f9878678bebcd133f501ce4ea5b66b2db5cac04cc6a32137467495edd1355bce985b86b1b3eff1dabe9f5a3515844bc1da7ee402af37ab67e191c3192dc4e1ed24ebef9212fc2ac115addf0cf9a013dccc0c9cb0d17e0559a39538c2625f63618b748eff5e0871d982b8dabcad47e7f34e31a5a9dc75b57afe073004e3a571f47e6310cca527902b60dcdb4138de4dc0b29e9d481c2a8c6436ba9a6da687941b0c891b7a6c7488d9cf80c4f921062486f72f9733e764ede88e506067a9dcf4cd90691c85d7f0853b620be928a6b2ea476eba5f53d49cdd2858ea4050dfc18cd5a1dd215c562b4b4857d92fe7155284d0b9825ec59dcc288ca7f9b8134309f4f62c9df7fa2995037facdc723a1b3165e2ab6df057aa483b7b3869f00749a576c3f4dd90e30829481bd884b7440461dfd45446c44f71c1242db2482c6a041f38f8764c833adbb5a25d29615c32b9c50b2c8b356b07e7b4045cd7fb7c8621336f62d4b75eb182e5bf6b8bca0bc622cb9789ee3756411daf12a1613625d076294352ca0c9b42794c7ee593846f61b00ef344cfae3ef2d7c5c8ad0ee833c880c6d44602530c9a94046572f51722118c34ab3061da3ceda9dea46018db8ca855bad703259e02f5e816778ffa78853d5c3bcc56617bbdfc6b079b28d83d34ccc6308621789b5745eaa53a7228ddc69cd661c03103b88da582ffe482d68ba2ba25b253ee45071117850f8e8c72a91f3825fd75c27fc1ebeb100044df8ff4c415a99ee9fd5398f0834a327b11e43108dd4adf672e1a4f5c710fe37925641fa059ef4e9e4489c4fbf2a3b65ba02fb8d7fbe2e50ffe9420ea3511a6ca95e4381e4080f1de26b4f9b4ef171f3bc809bf731aa8f93fdf892cd80665de1458c6ea723e058921954cce804b774fb571525a5f3ac5b1e54065ce944b1e800f0555de89ff509e666928a7a335c269b93cf160376841e27c383f947cec5c2e54b5e7249f18b14252f5f9c3d89cb8623634b339cc9f9560470e0e638e05e32d3fd01d3b5bc458b1486efab79b522d7a53cb984c653596ec50a5e28e59254daf844493ceacb85e23334cf70fa59a073c6565285764e968bc4e00240a16f52430f545c7df30380b7179c59e033e2c3714e190db949a98854378e3e6a4ed5d703a770fb53807246b1f297aa784e63fd448f44947ea5967e418d819ce49d587dfa5c96d79a2622c16fe29e49f4d63e319289d2a77bd288d4a1469ab16a5dd0946eef7a01ab59a2c19da446dc4caee4b065a8b6fd540a439b776dc4736a0b9d06d12d5b2a9d4e9e25662ff1b7563900ed5c8cdf57051599ebfe392df6d2f43b2a48cb8eec46830809d02e27661910b96a486cc6a1fe04c86638d4ac5f3292a214d0a902cd7c733fa8ae67b8d0cdb3ab210ddda206c25420fc143c0901ccc9a9628fe3794ea6477ddcc13cf0068f148262881678d5a95659272088950c0c83fd05c976e087965c824db92333f6954326962cc8036359767a93abd301a8ab1cb0a1fe662e318a96296bcaa88e00145e8c6c5acce6c4ee05d71bb9115c6ff242e20e186ce231dc4ffd5a6adc0d2c5f17bc773c9fa9211f28d747d54cf4c2ef86486ef4fea524570650429e8aa0279b78085a590a93b64a58a96f74945905b5431bd410b5673421ccd99db9c59c23f6588684bd70bfc0bf3893debfa7c4bf449dada181c1c18fcfc843efb1fbcfd6f1063d369bf47624ffdfdf70a4dcaa9eedf0d2898c6129e97b27dbb2ea32e4f801dc99f09e0b6a89347d03a63c3b2254aa7c0f8f95b0e3f9e004320fb395fdfc7d7bf6cabf0b9fe4610e6da973563ccc1dad6624872f4207676ae22a60cca4d9e53b05cf86abf5094547f3a4953baf825577d93473304e672a88c357969bb3404f603d431303057e38dbd7989f6862dc86ea5c8e7778d2834b2044e12f21fe124e99f4b9785b48fc4c71491cee20948e0b2bad5daa2b6334e169a0f2f4ed9ffd9e7ceb245e677d10c342d868762d9d5c394f2f2d7737c1ee94d00467acd41d283f9dedc11066f48e8317a4340302c1f0f640c04667fcbc0a7309c3d2970cb4b4a3dc6acb10a6d4554a349dbaa549eeaacbaa1632262a69c4d8c924893ab0f4097d58ca97fef805f2b7a9c07a699e0af814ba0c02a818b495ee1a723b2f29ceead4030e4e7b9094c55d4db5f4f8250eece944aff4e7164210047b3b25d62a53c1d34daec9bfd0263128519d1946a607f2c136e01ad250caa46b2e8d61585aeb09155d34ea519d55dbd3f81fbda5cdf3a203dfd94e082325e42f3ed9ed83076401bba4a9a3c41eea3ea6d12898cfb4e8323206a8e835a51bb248efcc7e12762b9d5b8e62be0985d026bf39138a9b599eb72a37ae5e43f5ac991109a44391361b7e28043d084076020a9281479a398ced629fd9c48e8f11bd8156563fcf2e3b23e22ea08abf312b691722e381309ba1dfc7b8f2363062bed2484b82b6506ab2742cc1d8c821c1d84e9753b024b8cb76230d7fc95b4345d37bfeeb5dfea4abd1cde8c8344b1ad3277409f899c0900ca1f2a13067003393af19f50d2a52559995a2e4f04b0bfb9e7a2a6246a996c5783c505875efe59854d383e94daf2e9fafe02b8c96988412e7ac18b06f7bd90505cc9f71b0132cbad3277dead31781a00223aef064a1955342b5e313f7ca973ed65531e83c3ac369bcf29638419965dd6f14220fee8caf801e0c1e91023b3e8fd6eab66f52e0070e9834ae81e53825b7a5cd725ea3ace224b8cd7cbdae0a9b92536ef05e81e2215a257f77fc840f99093015bbb64254a3ee6673c915f126634e0e24a5588767dcf9d7b14ef06bdc280feeef8bc0b9443ca5499378a4eaf03282d2ce380dde461e668fe40c1d89ecd68729601cd9f5db74a26311891c1c49cf822bc7446e624682b4a34b8e19740afd1af6e2f93d04d32eca282daf742ccbf4146133005195639b8b7eb18f5527580c517c4718a32f17ead63ce949b47f163677a88c1ef64b12f14024e8ecd28bc7287321e495ff36c49306f5633ee847b70114fb947fac4552ee8a1fcfdb0ce6ff03434e2f7319e7f1c3cdc08c3a00133263c1db885a888b844fd2cbeb7458d35af952e911ad491e4193ed05566c9e08a678650c3f8ce86823454d0de9434106716b9b1f44d00b770c2b37a6758b2da53fd453725989c999bc4be86bed3376645876b8ea633e5320992abed941dc354d704dce4faa55c8c67cb962a068200216b31d06128e52dba4c6bcb7337b39935e2a599def24d3413f9612e3b7877f1082c183057560ea70bc3eed01bcad8fc2eeb7cc2db69a0d873840f30a0af34d950e3cc90e0a5c34eec33565a76ea68fba42a3dd93fadd1cd6f1670f13d29f009af09d49d6644476f706936d4c39c1624de549a539586667980ec45c7eaea9e885e0e89c14acc403b0eace3bc1b4d733314b05c9421f891f1ba349ee09f18cc0908bf86a1d4ada94048212b6455f8800857803c057e10cc52e448161a661f7063e157457521a95ea63374fad013f2a2e431f6b3693d0a24ecb849ddfb7bba5dd0584dc0f11e24be988411cbb9528e07ab4d33115fb49b7ef7c117487921dd5c2d9302e6af61a8abcbe9c6aad0bc2039c22c468fe78977030df9db5b15153d37594b96535221efb56b16afab922769ade1cb9d95f755bed439a174678165ad8d8d6e913b4a9a3983dcd3379f51f8b76b88795151f150af8be079e10ee9c50c34a0c3b772c8c3bdf3c12ed917a6fbde2a5b8d3c1c67c4a13fd62381963b6c7c73c75b507411a5b7a4c451766d543c3cc52bbe7a8153ea52180a5a026e9035426075d91ca7e56d7fd92e9b90420e78f0863adc0d9aae2254524e4c1600616043930bf0f603b4370c8a2d375d0279534f54b49dbebaa75c73695f86618c986c2e816a52285abba03dcb685f49d986ef103635e26d0f061fcc0035a1b548126457145fe7261556c187386020d731ef032dfc7d3b088654df1fd0883c4f80da51ced90d4391f13dce64fc5d1ef42c5a2a91ea43f55b02e97e5c0101f106b3a87ced7023520d376f8277d8344eedf768d44bebfe894745154b169038a9559225285bcb2ae6bb43e0a61175bb2afa62c0526eef40682f2286f9fa5de14bc6bad164240dec755f3a0fd1e30386fe33f126d37466b4dc74eda05a691481254795585cfb22b68c8d90c092c952919a669347e8d762d2b5b9a1c5962be3373870d08067e2d181e905588fb0a9416229ff5c1a039e0a3fe2aa77555fb668b90ee036107ac11689ae5199edcf234ea3000ee49f30d81171d3e49bc7982de910cbb31d1ddaf25faaac87168a687353e8401d773c15e6dd5530b39593dae07e982d05f16f73071a84f52ba91a6eb2f64e172fc07338ca3e61a3e82456c6f9a67aa7b0fc072b02a1d0e6f5482c6413e21ccc97c18980f284c9fe0ee6884ee1825e1c6b2e8b83da227ef984519ab11df1ca94ee0c3daee7f50fcaa2c26ab9cd5cb9eed8c61dc6fd2b7e6377a881ce589737ebe7a2c5928f0ef1909c3ba22e24dcc86a702473855864079737d09cca53056c845c7df09012a90cf1d582ae2ccdd860b1c1611c5bbb95e31405ebd53597dff85e2ea52f609a1293d9f01d48dc6d7cf3bc5303b3a797a7eddf3827f9d404db9b0f1c8b7609b02cc709d965c8326ae829043a00b9b74d6bef98caa4cd0999f59d39c6cd916774954812a85de3a9a7f2ad19f40d3d46ba1c3304b28021fc4f0dfe9644c0853fd517f3e1e9b19253dd74bb5834ab282fe69ab5b5b4ebc0ea8c1845101c6cfc6cee9e94335264e76e8e82cc5077ed7216b5b502de271bd41ace0af330dc8db1aedc78d04e57f967912c49ca971632afef0f6d2e1a6efda97872b51969fe90310516ecc34fa85cbc331685c17f7d6c645fb5859019719ad1f381a5bc73335d6659127b8fa43488c1e2b83ce3187b2452b13d07065328dca58062088f9c325d8be1750964142134305874b61703b151fe6d292c3a94026c28084632ebbe89abca43f799bc1f0367dd267954489339b8ecb887b461408cd77c4c36f9fbd4178c1c494f27d66e949f74ba00f7d21913d4ae4d6f870be58e2324b20abcaac11f4a237b72b134419ef5209009aeaeb6226b471179291c8a138cb30361940d7c90c587ed3d5650c4090af1680df8b4de56ea828c2bac594b00b76d765135a950ef020b8004baf2e9b8abfb88e82e31fdabb85ee1c08999f9f3348919861074fc93687b3575eac2899167a1a04ad27ebae31a7242bb63654501ad7d00b48eac81989363966743401ddc4a995bfe8aa204d573a85289f4ea33bb5a7db51b55ebb8d84c47e7e95a254815a02265709c1f5ce1b69bda1b505e740e1678e0ee8e4c9e8a95c7f446d9260b86c6ba0d55209fa1b600997d33628762310e0051928a1d17933dc0877dd8c37afc6a9e97d752919cce40b4dd1109d37a3f1c53280c1f90b090eb034b3aab7f0722504101d127eae24886f7fca3df4152c1a89e4a30d8593b966ae8b035aa1512ee21391e5bd7b8b019f8aa2c74dff00421d48c67dce184469e2930176c292db95dbca7142d5cf374e1d5274687005d636302b1782032316adffde75ed24c70452669b744318aeaf86b4eab843997051375f6f6926323c6e0759061b5bbe31d451eb25b2f7e30a001404cfcc0e5afd7b864bf81c8bcf0fee3c4d7f8c6e7011dcf1563f752c45b5674303483220911fb29122a17c65f26af7783c2d7d65c142a49f0e11bb6240eb3944df56308e469cd99d7aabf439f3128ab12dda7c609b43ad945cca72ce1700208f90dd8f0de5f4432d8f7df7e1295781fd64e10f11daff1faaf1dc5974aa0da5be6eebdba03b798157f62c9e92e151cf458b1a1b836c047a9ee48d29609630f1c262a3fdd6d28a6f9767c55a0940f9789813316924e197fc3af39c3f96d338ee96bb1d018ec6f2496e9a8914e528ef2829383254a46f2f8a9060a80241addb6a13ca8c48e0438d7c36815004429d822a145c2cfd3596bdf0547abdcb6058dc0ebb3c1f909bd3cc532cbb8e6ee4677c05d0af013712190337ae6090676532329608dac919b889f2c47553a5e39f7b4d851633e4f0ea79e016a6fbf0f92e04da5709e811310cd3c226f4a0adf17d25a7889dbf8426a81839ebea98538934f54a0cd19f6d120263306baa53f8337d244e38cb8d54424b8686ab606186f8869cff36123620e80292c3721bcf7b2793ea9040fffa63cb8d563d91c0823d89c8ce76c69de7b759404dedabc00044279a61791688513f2723bfa8d820118a40681c0a329bbab654832029dd3468e5796e24a4a8638a298de7553733e2085cf640fc7eb7d0860e4c0d34681f2067f6937936a9a2011e9c73a0055f2aaf1864cbd3e27bd7cce37e8961f7d060089268300aa69395137d8ff77211db0ce3036de680fb251df2adac50533b6deb9b83f101a1b8752d63256dc563fc8754c7bc8f66d1000a54db3c59b50337f39f83284c3a4596af771795ea95fcc59ffd8856db628ef35894e4c4de38e86844291a424bcbf6b66102fd6153cb443d5d16569ae086a03c28031ab5e64d84f32213868668641629d171b2d874336b439ec0c2111ec1269b72dfed060a2455bfe9507f51e05641e423e1d5835d5a9afb3cc4b32b3e214431aea6f9cc4b33932886147609865b3004087ba5d562b3236396c9eb88403526536e50840872a6f409ccb6c79372d98c849bbe18c215333fcc1ab9e4412b536d794697172c2a8c6e201204d61262215d450781b87ff0dd4aedbcf6d204e207afba055dd4f8a38467c9e05df7ba8b889a323ee0010226db876e1e6dc5c42d3f8b6ac9fdf5e55ff4c30798134abe6b130224dd91b6c703377e62546651b8849d598230a6b7c165d35b55e40bbeb1f5455e3194574ba1439ea6b4db0ab00f2deec011fb4b6ddd776af471b501c5f9caa34b4d97ebc21e81c7d606f3b9c500aef28a98a4cdc71e19d396eb4f41b9b1522e050bca6033bfce0e04e538fe42ee6514cfd7dfd12674c591d50ca211e6998eab8b6ba299f9aa818b3e43c0768dca17c81ca3d8df804bf22e51a45ba7e6f27fdedd0722ea807182b918d1dec3491393b52ff3754571c3033840da046b00532075c86fdcf2570fb35325e38df92b411de04cc20a64439e24aeb60203149cddb30ae441cd19e10c75d7fcc540f5664e944a0ddfd9e74100d60e4ffa624e001f672bc9c163facacac69dc923f994d18e9a8a48ff37a427a9f6ffa0bcfdcb6e6e5e091e806c2d90d650a139969360b3555c909b2bb6a08e9422e143819230333d731ed8856a52ec7a7145122d00a182f4b2e7841d89cf13c989f6f38ae168b36745b10d037abf800ed67bf89af3c97c317645f6eca493372eed63eb559efb6f52999397f7079275ad3d892b6b3cb5a6fafa1045f2cccc8e40c71665be7244301e172bf73bcf0da51a7dede5ec5fbdf0ef71d3127b93f042b69602351159577cd81a6e14ddf3d362d92eaf6038ed9b0fdab9e848a4d250f336fcd62b107d70ba8fdf1e5c72a3d9e3ef79e02dbb628f8d9b672e2c8cb0bf7cea4260bb85f9dc83cb436b3ae723d2724a772f18109705cc6815e09233527599655690d71203e1d424794bbe631103b19cdb19122b682a7f17a6e7057f8da235e91bb672047afd09b2012ab42379f229966495c3bf1eab644540a16d84d25d5a9a0da802f67389ccf424694592e41199032a13697cdd603f2bc1bc25c2145a92e0c418ecd2237afc420ee506527681c29980a012d46dbccf0df0409bf484d6581e14cbeb53f6208a17d447ebbc05455a60ec8919305fb8919b2f2c42e70bf1d72100a4677115449a1018c13067b88a6019b8d7b167ed00da3961f3b622d1f5ad6120e4f0d25fce31ef339f13f68c7429cdf6cb27d49f0dccfa32146ab9be3281a58f466057b36475e1c94ff6b6c96f98c5e0f78681b1cca9703a94d295dc2a28fe5055f02ac9c8d354727c0fc34d52889a8c11c5f65954b6fce3331b706e68b0eb36de00b82ceb84014cca119515c244d083f8f11b6009360a85ee62674261cd4ee0b9dcbcffd57aef78250d076a63e90f6bc486326131ec8b10509cb42355633be29318ee8f9e2f380adbec213b57175f1bb0bd830aa927d77d66f2446a7588e3b8b3de559704f8e65d111788cf474b85d994759ee3755339a594e7eac2dde246c166a2eaf1c444f1aa1bbd1207773e57f45f6e75e3ba7a8b4f0791b59f56e0a100535d44bbb21c575936f4d375aa29f2f908191e5bb5f0cc2b5b04d0b8e2612ad316cf6293c8e3644ce8ee81ba86b4d9a31c1b52088e862c0ac63bf76ed7861789223618195e4e65019592c88660387a0fb9fde9c90188bd9c0ae41632f259041853984f2c8cef59e4c27150bd3e8b5319b3629a1ee6780692fa01e809b6eb3f8585e320233855c45f83e787cb13c2f873714fac801c31621f87be608d85367568fbd704ba18cd13b65df34ff6f2eaa9b1f734fa78e80d9e5e855ce40f9633f6201ea46752d9a1fd3b8b6ccbb32e779b8c00d0102e9f24dec4b4208a91db403f41e0bef04263bd253d2b7001db02d04d5b908b0b7b2c4594725aa184a960e003552cbafc73817f21d087b184625bebb916c3a97708bfc6ab2d89c397304221b6c2c87fc75fe9ca054d3f25d7d6dff72fa8540b8d867a5585617ab5113cf0c3e33eca2dfac7ee337ef13abb85bc3c4751b9bed2a95a08cb2fe74d5cfda17b1a58252c886faa90345502258dda592403e59338859f4dc12af38319a2e17ba65ee06302868d8292ecc740625ec28d878176ba440a7c18e96158205fea5924883258c1695450b9b6bfa05e0a792d91f94d3481a1abd15c1cbc7b78fac66d25d83dd2309d11678b83871bf5afb4a00fe757feaa097e703410c3f81d946cac60192933a29c507885050cd4ff33e4709d42cb2a569fb151eec8570ae9c7d47791dc461c275093a9dd89b005a30b8416030647292366a1988c406ebbd8a1af94c217060d6022918165bda2c2d76ec04460f25a2dc797d27dd778d654f177023edcfb338ee7462ab4cfb856e597d2c12293538c5d06df86cb445fdf441f1b0cfe7fa41814a93d47cd813d6447615826910393adf117390eb16b2df8ab54596bdc490f1263492f6cbcc232c75b728d8fe1ddde8c9694816a0c63c67c80f8802fad931efee88c31701ecb1d4815a1b42c122f033b8aef186bb80a3150ae67c7e9c364d3f0251582feea12058f4663d321b8099f2947a1ef60efefa5a83cda11ecdda48b9c86ec3485922e89cad485da2c759506224dcaa6e05cf9d5f7273377f0d08db623c7b494c76dae02e34f53d4b0f246c355daaf46ef982e40e51930a4500340a7e04899216f3bcfea3cc924945f16e3b4fb2974b0fc5e16e1c819fac2692506e83fa12095e7164544a0092aedc94d608b2f238d81153535067b0e1583c63eabef2e9896c1e8abfb708ff30e01895ffaba9d2662197796ddf0e8af92c9c49bdec7acdbe8da6766bfc01e13a3a525af2171431d7abef076e01e3e23d904cd7000caf27aab38b8da8b23142322696492293edab81eed212256176ecd326d0d6d80fa44f6497821d93993830016e6e2852a9cdcbb9c5369dbf0a12d00804df9312f98fa6654d2800216196053835d0b1ab088aa6c99b5d3c414b94b9291afaff68fc7de86eee098a11640c37f6235b4aaa83a6cd48be7c4067cd6cbd4938acb1e9cab3c9af3c65ad69c64a97e728e026e8f0bd94f1d3fd1ae32f73c53dd4dc1b22cf3364d05305579c673c13979888602124d66faffd2772e37cef415e44fc0ac743459bd0b7974bdffa61920d5cd04c93122472a8239cc4e438776edc64465f9b538f81087b6600fb8a1ea958babbdf0eee8db9143e386525710c3e4127363d32623ccfe3ebfe8a3137b35707a0e719e73db243f52b2597f2001c283f79fce6240eaa441f19533a58be4b0815f18a8a3d7e56231ad4e367e600706d24a0738e5dd13f0236f666c4a284a7bf1ca293e5ac84ec15d37476539eebaa888020e2807e687f4172a04e4d3b5d866e893378b014712755316cdd0efd3bda817fe684ff920cc2733192c500c2f5a515785d7861190b078809655075bd9577545974c8c215331ccdd180d3f66be4411fb3662bba20af3fd89dd4c6fe62e2a734c8d619f2f01295c895f569540604e09aa7de0824a553da1c5377a313d22dced0870c012ec38f3f88de977ac8f0993682e04579b1643f7bb93dae09b6c8bd6508adeaff14ce19de2b24581a30431511b2964d12b831bff4664f28d95b56ce50fae3fb0e8f3395cf129c8be6fc24bf847304f7c62b986142cd568ae02da73b882847a76e67bf3873a9fe4634cfd1bef1364eee5c6f835b68640214d22c31814f1180dab8235e178d734981b25295ee56654d28f54fd730982c75bb11d8d99e8f9c3af58e740c1dde1aabc798e6478ba869fbeac50a72c6a999fb4f5f388ca0a7f20c6a3960d7fec82d4e741b2d8683176be3ae9b87a0a0f7beaabdd0ad4a8e5532a85483bce1c91bc01e3c989420aa5a4bc7d0c4fb2594453385b3456b8fa0de292d4955bd6b297626e5f8a37190cdc35f896b54e5416290c2eb4121ec2f3805f6c384428a7a4a0da65338f404c7acfa288014f8ad07344af152994e49123b9bf2519e6c1cd0938947ad83ada85c7d6eea2d8d3249cf695c6f93437668c6d1ae276fcbc61721617ff2033f5a01f560a3f23b274ab5689a1501970267532ad8c85791855bbe61180ad8f75ce7510c0a5523b22744ba19b23fef1a7c82f1e1715f2224267d4c23eb871c61db474cf3c3093a7a5e40c4bc63cd192cefb6c8f1e521caeb540d0de1b46d068f80ac685f411218f95613357f6df5fe5e403ab31f7d4658300eb629746eb042e1d1e1e4689a18f10b4e63bc8abb2b611e68d88c9bb1d494093971bda5c78af679be1e193c716983c4bc4cf543a03f9d9ad008be12e38f29cd225b2c3f6e2d25c6ac48a22283c1ca1291fb7fff95a87a3e20cd5df5d8a67e7e41d483b3351615bd723a7fa967108b5cf731781d50474c262db80a69ac92328e7f0762bef56280f7ee50d8a962abea1b7c3a24beeda726f84b560a65d44e1840d08cf394d612290f4eade206d3b6afc951d0fd661a872d820b029a0d1767ff08c06e437ff21661eb185c46948ab7bb6e5e75d37da7c6fd7db99ac7e4505f61b5cd6a702ee03ee34ad04fef77442f5d356f9fec481d7c57824f469f45afefe320316570082bba3589e5a898abdf9538aed96647f590aba1b42e03484ea56acd41eabff05a38b47f790fea172ba1d0ba754d5f7ccbb58e14e7902493578f6e5aa6f4b09dae6be2f17257ab6f955f8bbbee82cbe0778df3758f7d0402290842367617df840afe889ca8e82b31b9b44dd0054ebe74d4f963b4a954366ea41349330aad28d447cb28d5d4c328b11f57afaa83a4d2cde7159461694110087996127829661cf37d887cf4692b700586560e5d29022c4186ab06461758b509b37917f43c18bde28c7ec3c50c324b08a5d3dfc019b18a6075c55d7e43c87ca8e64e8e568711f7b6108775f63328b6c1094c9a8503fb519e084bd77d3225071fb34dc8996b4429cb3ef7d41346184af9a44770ce15d7e5397041e927d7e24dd772eef4cab09a15b641e9b4ad0381e5a5a2561a117696f6b8875eda8fd28fd68c21636b8682008618f4035cfc0a7e6e79e2301a0fe35bad53aa405bbd2584ccd48207f131724c3d7b4495c0d88e478c44e3086f5f1f483206be278bc8903953238f5957167fe760d014be4487d88cf53ec614f69960119554b510040e528f933202907ab30484b21d965802089dd5410765e2a7b8541de0060d5ce270f8f164df21887aa8252272ce7b7aee1167c556b28bd8d699e68cb37e792fe8995b6b32d5f4ebb2981921a0d58db36a44ca13bc3a1b173245fc583d772414c23129ed4f9a7a7e2dacbdc35966f8943b784e8648f901cbc74eb1b655989cf29390a7a67718d0300a6492a4d49fc2baabe0e1bebe9cba5ff0d5a3af7bea6da30c632d1ac23866b2c486e7a51df8fb91d2363d80ae472eca2b8e4a1e86bb70428cccd8cf19f349fbfd04e95ad93d36447b2c642f9d9b596e9c2f7d089f707a42244ca6b8755b3c146bac8b16b28f2a5d851af20d5942c05ce2d6801aebcec945c6ea27760de81279f7b8172a086fa25f8149bcb95e1444bd3fff273c7cf3a4cbe1b74a7bccef6754039779ac7bfe7fff8740f3d7740ea4a859b3339985bcf7148e12e855d6d05535b6708fae6e848a3719c18cfdeb6a97f770a8107f51ed2e447f76c7a06379e0fe93b6fe7287b47e4f068ef1a7d8a46e05422c9a52993d705f8ee8a46be510921daf616992c933074f351c24c9538a3693c14a90c0c65333af955c6a82ebfe6c143c7d54cef017408104e8d6f0c1349b2f3898bde8f4c75a58993d195ebbe5cb7bab93bab68121d3bf461cd421f07b002f3dc42d974b5445293179900bac2256c13ec34f9cc5a8eb8af2ebf914afa09fe77471b9c47d0619ca9c2ad381c4a455fa535f7bf42bdfb2de26b2c3effde0c1bd8f36d08bb46c54f25772bca05a06dcdb040d1e628e971e39955df4754b6079d1194fa7717b799f3cfb9ac446226d11efecdc861a2203950c0162b6aa0aa256a46fdf7f09704ce49912c27d7f57d4de5f28c3be2c8043ff4e9c48a855122120c0bdfb73e0d0b055dc866627d778f582db4589a855ac56bc374b5d27d28a59c52bb6a05f2b9c20cd17cc220cd3e10b5fde8579034ef2def362a85ce5d418bbd759ee359540bad68d24260d50c4380111e3a1f9d1e5497684da39c82f6ff6eedff64cee3bccaf942d51c37feebf2fbe7e513fbe5cbf6a44773bf91cb20e33c7144caa97a2d9227d02af46c90a0f9e764eae2bf894b5727ee5e2002e75b18ba14e4642c972d375d40f077137448f4f989eec704bd28d6ec7c60b44e591adc6a1074af05c258041645ac46f555cf9b811c0fb7536456af8c6860aa3f76f4e34a34069187af9617722532391a8233de44899a6dd0d04af4fab8cf6de928e28acb6f0ced1d089ec120cf8de627af9fa4804c65376787df5b7727c48fc0ad90627a864bb406e18f3c13eda503c78c6f0147c13d34bc0e61d2a9b60a69eb249ddaa1948a231dc2c998cdd37edd60bd98b0aa519a896c3fc8bc25202bf1fc167b942b88b15eb02206d12a5859d55b5874a2828b575c7357f10ce2a2e0dc252dca5f8bd57b81590ed50b67683223cc0047b30dd29f8f301ed8e737e1f28663896d12a77167d3c91dd3f6acb4cabd5d1a394d98c04ba7d840fa3ba59979e04c6e16dc19e7e0bc464e2dac637e6b15db47e3f0a2e10811ea91a70076293b1ac9268566a6b79096fe1332a9be4f0632547954af83a1258452179614701db5d1eae0f66bcee0d562ed30689de9393a33f3f19845e0a6736f0453af873a5058a63a408e511584954bda63c038ee29b2fb5d673070fd513ce467485958e07a533afc9f09ff243a5093304a659c8bc13e61fd229a9a0f0bdfa7cea87ba31fc32316a091306286fab6fb07df081fe0ed389cf692038f723f62ed09f97e3fa9db0961df98e0421475000ce2783510ad37c3e72ccc0ddaabd9b954f47870a46b6fd5f9c2adcdc699af4ea011f8f874de4c0cc0e8b3d729afb1ca9f5a4f80fe093faa21e77d1b169fe0099cb0245275ed033d572cf9c4163f06baa9c6fb573e11c9c0fec514722a4e69150c61857927bc5559500989005faa0ef1a749caa9c06ec28fd21e50aa000427b5ae2f153ddd31e815810e90d679676aabb82848ef993d232dba436b8fc0fcf2f9673080d18865232f1d3ce9624e2f67a73b922efee0ab51dfa3a28e86cc6562dc4dbfcba02c7287bc3b037bf0e627a6518652bae705bae288614bfc295624dd93ab9f6526b8a171e47afbbd3ca725720bbb4d84c07f83b6baa42d6f90f21128b1cb141837aa40e33a0665ccca638a70101db4f60f63c9e81ec0b20148e928ff8db86cb25ea35a4f29aeff28885a52afa8c151519265892fdc0f482270aa8899fb5a7ed710a488d6b35ea8d0eebf38eb71c08d00533747fc75049f6b7f518df7c9f5a626dd938783580d0d10022e70529f4e08e25a484319893fe0346ce2099b58ec0c1edcc61b40df14211856221cb9be195cc4ad100cef0313ba7054bd7d065b2014d7ad89911b047e4af8371885f9427003c2573c5b3401f40971f095a1de117e60c9049ba7e34192ee61913a32749a2a6b5256428bc532230423c98139ac3807e232f9fb2a2bcab8666506614a8b6086e30e40b5cc3bf3f2e863dc23814f993a8c9fde996721b6de9a01260a6211606161c8051286b1c5c2a81eaffd4f8686fe7f1ee150cc52a01d268b7029a7a17f096524631ee7ce48afa5d3975de8043df396c0c421b122f54fe13eded3e561b1c2a726f2b0cd12ac2a610535e818af546730ebfbe21d492aae80d277be1df9cf89a23e7f941c7012e2e425bbc8709a0109740fb4229a7d38c6f0854838ba9e80bc1911c32eaeb1c8a6a4e14f47859a8652364d94f1912317bf545c733051353e57486b82f11c2d501cea959382c1560e54470e9edd45fdd60dd39e820cf3022cd69315783605eb9ec143f91f8e8cd7998ad62acdfda24c5a0ed3a6bf093884ae18bb59c16434f467cd640ae496503b97f741c042fb041080dd976ca4708308edb7a5b4beb83de1c52b73a23bf00ab1a260444e83e406ced88a045338ac639f08cc694575f82a214c87846411f8b10c72982f359f557e36f387f6b36bbb1ab50fe8cf7c06c8bb9eb394bf24af15184bb507c7e62267a3562a847f79fa3fb25773712470ebcd885e9a6dd51a1a64408594c3d1b130cf01f41a8fea00976879a47a3eef19bdc3e0b9547b39f6e6dad28f00a23b837fa6722828079d42bbcc7ff848e6665f8c8eca46ef01c9bdbfd3734216079dac96097b95d8ca90fdf65ada837761759019a0c08998354d4ae5bdc8f75b6a3bd6a50f481a060212b81bd553a33c6c0f90d2622305468a33c871c4fe0a750f2d6dbc150cf1b86e2a4183f61e5505d9a02176256c68b947cb6df35dc82d215ca379e3d17901c13cf087b09ac09ece8f86f4a892670709e1337b45b3bf9e14f7bc14f4456963e921576cde885e4d5f0571b28f70d156ec507bdaacb1bdeb693a433c9e148677d6a0cf10e0ee2dc36089f85e5dd0ee7633cecf8e87af1ae6422ac3caa7065b875f8bbca2389821bcfed0ac8ec1f1d5e55ee33fa2dcc342d3514de9ac0626762f488e19e98f460c6668b8dcd99d6ab71293f25a92ba07982e800e62968b4ab442888fdd87c59264f64cf8edd63c7ad44cad5c08f6766db5e93ae8b6529ef32b0f1bab5f3016dd1ad39dc945efb96653d716fab0a67b39482df136ee2b5f35fffb5b34c0b918ed573b5937899a64442d6ff562f244e16166e80c7101f187138b637327023c87ec9a5d78cd4257d4892e16438f94253a1f5da06e01509d69ef179c1432a43861946771e8d78273369e19b147c251ffe00e5a51d0a76dcf436f7f0d36ab80cc105909fdedec8f5504bb8ca840b934cc556fe65daa355a319b78a760c492abeeedfd5bc9b2e28addd1ec191f1360d4680ff85520bb9c81e768eae781e0321920efb2dc900d36d37e573b4666d0d6f26c9e174d0a7bfe2f12dbff65bbb5e274e43da6e59699939e5965066f54b19d6cd8b8a0d3352e9b4e2d09f123c63e605ada3392fc6e16746d534b7babe344b3581346e24950fd6edc0b7bf6503fd8bd9b6a6139e0c01ca579ef600194d159d0d38a68ebc09f643ddf643bce5ce42be96c8ea983e7909971fe338fd5ae34a848adb7c4feb928c96d7517bc58f541f109e2c6f42bcdf17b84f3923cf98bfcdae51cf1cab1a95a76601be9a649a6588760e9770004fe22d28d08af43dcb150813c9d250fa464366fb9e4b70053cf9a4b13a0b7a3557e2c71a24f8d0553a99c2573202442adf9e030dd32af27d62aaa843bd3cf562bc3debb42f860942056b74e461d7047a52710635a1d3d18de43eeede3a33cd9f1fc3513769f14fc13641cd84b833089cebf82e3bbeb7dd08b7cbcaf40df755ef25f14fffb4e5e2b8749f7ebc4fa2f9fece726d92b7f07be41d0d1959f7fdfbe4841dde1a92eb6e5f89367237552051d7b3ed8cda04dd377f31e8f9bc264878f7c9123d8a5aa46332367b3d6c25a1cb42e80ce590ac74434e35c63f653f4ccf45b4434f33218ca51bf6cc2e94fc0f799c21c7443ecd8c35943e0320da0cce6bd71778607fc1ba57bafea0c7712c5e20d5ff7fabdf3f6a02f1f947e1555641d8000083319b6f71456bc8004a2ad8e2891faa6e99b758a95b18339518983c6350abf99609400120ec8b7c3af1585e42b1ff1330f69e8e480f73154b8e4a74d8666b2bf212704470dc2abf83a74dedf38ca8c723afdd170f56afbd6d991ab28cedb2adbb8186e43b3a148c658233cbdc8a107f3879256b7186679ac5177f48106d7b0a65e5956a24d580e711c115f2e10cc44ac2d970093f698e03fea7faeb2e8a8b3ef9750e58a73223469fca77cce0a95667a59f7a71e255c6ea20132be28ed6fc5362f0fc78dc8dd26c80b2981f1ef87ac918e73e358eba69ceb97f5fa6f9028584001439db986386e7f9c118c84d9ea4c4610ed4c04b408d68d486b582e7b9044b02c8118da727bea0a1eaa0a1999fad5196ccab6113799b0c4019b258efb6c424fc570eaced6046d23bccec8c72894c51b8b023cc3110425a44cee03c016b3768e1f378a99c7c355d2630d8701a6823589bc9d8affdb31078c919ebf3f2d379351137ae32db1bd8191705c7fecc4e424598f9c9c1d7db094258fce85253e4971b18a5a5d3c25e3f065fd2fae19972d2399395c3dc1c8cc7681d0073ceeab6788eea893c749cc16c71899417dabf0a91c1e75244f06286d04bf5bfe5d490eccb344c6b01abdae7bd7f0d57dc36a46ac2f750a73bad840e35e67c7097aec1b91e168c026ee9dd9fe8da24b10e20f25010ebcb008ae336bc8fa6bca2eef28a1a75c5f12c3451a7ca85b15235e6f81a166b855227203d0148b6876c66dd06669158b78a921af2b66c37c450c5eb48de776c32648545b5763a9154385a4b03edc3d9b76d0172e463866355bf7574a84a1ede80cb25fcdff65185a8e0f3a526a0e6d2f0ed25095b7f32d5c18395eafe122899c5b0fad504b317799f647c37077803893ef87c377f1233e9fd85f730f0d6f5134fcf1fb63bd727d027d60729f968d4beb38c6a12bad3c6de45143db5a24e70d58428d7031e7a442f4625132bf1de517683c3f559f6c41b96415aaab75d932a64e7d3f41f83c0a2417bdcb7b9ad2313ba1814ee605ddd0f3d415878bd2b17cd7363b0d38ac05ebc6370613520076d084d5cb632418c1044e388a556e5dc6646f7282add97ae5c84908a93b8e2027a36cfb689ab1f3ba2490a5139b36032f82b44323e401747d7e1adefce66bb1b92ff1b5f11400c7b3ad72567bb82590ad8c54d4e5bd8b0f1381341cf0532cdfc79b3b539273d701cf0457cec06d70b6f9b73e20122b9990ca209aa318ce480a966e3b30445b195982f4e8514092646273c4a42869f95468d073bab646f33eb8531c5635d2322cc15ccb75af429f67bee2d94c9765286c70e253780ba00664d097d6c753740610abfaa7987b7dcbff1eccb5032964f41bd4e9ebd35e0a7468d906690252cf6858edf98aea04c9a6a556b25cfe599b4acb57b7484dfa40cd7bf3386089c695e4b80e018273ac580be8667d67586a2e83577ef2db4f0a9f2770093e5feaeab666a4bf9aa8db1fa49d1adb34768c3194f90438466a44bebffdbcd111e3454701d104c8c84300f4571fe118ced43271e887ebbe0c28a6bcba3cb36cc7f98344a799bcae8e5e0d06a01fa2c2798509d1c87cc51d810d1c48b854e83f627822a69352c15038f30049b5fa60e293859967747ab490e88d011685e945617e8925ef589a9f94e9f4ad6e69cbcec4a3ef38208092455f6b4dfccf13e04e6978a6ace1c98b5f263a0b033e5908a7f4d022d643d3b4c063e468d2c4b842d81101ef7fff9706fc3fba8eff0788fcbf694821683606a222e7f80cc217786a6842444aae81541cd68b653120765a4f4353f1f0dbcd396d02d44af8702d79cda189f3a526ae0643347aa15919abb502189a573525d972fcdd38f018184f673b039b1ba835981a613f7d1630e28a2439943d61253fd4a5781883c0dddf97af6e87df0af64c9b2983ebecfd4a61ec3dc249a028aaca5090cc7117d2c7eca8dec9993569522139892be929b5bd383978a03f7c4a44f046008368cd18005a5045f2aafad5ac62e64435df181014390aeef2fa03f82588e6490fe18c10eade51976eb59c0023b2d96d9b7c8d9973931f6ba0c3aa89de90224b161c8ad968303557527d2250d0c7349b870e08779033b3782c9e8594d29903da23ff6c8d5aacd01430f5286bbb311097bd167c533c370e4d46c27aa68e84f81a2900c88912d959155fb1d9c01f4f8aea3ba1e49c2738ac3384a96471e3bc8f41a6cb1308099e1913974d0939e5bc202e3b9455b06029bb6d06b14173ac3141b6e140c648a64bb55ae7fd14fc679b261c5724a142e3c203a6fbbc565cae8fbaca76054238381705262f76d7400492d01b3341fe0b11f4bc7b5a8f745942c263d1684f49d8c72030a1ffea8d43597dc049e98d40eae4df9370a54deaddeffffe04b72765b92d7180c96035e7424893d8523846b83aafb2e7b3081a4d1169f4e9bbcab7b46ac68f57b9f5cf340ba90f9e9edeb6f27ec19ebf53755e75fd3f1602684bcdab2ce1b99ef5cfab9bcac383dd80c74896397f2b193c6938b9eb3999bb5eeee0c970f6de6a0dcf1d2e1ddca6ac7ca2187c94327e1d3009652950084701744f5798e530e0ee6eda86fd4c1acab9a94136bb409c4c943f3c5146e58568afdda6af9996fd537db11e0e979d271275efe9425fa94709d37ec8fc23cbaec3b9d9437e4cc1d76e95961a2acc3b5460251a791c0a06103f043deda59a1bf64d5e97d7acf5bcbb6618e7a85c1781d2024f708a6c39c0c8164e16b7697152fef0088f34a6dba36a3ffd5432d7802395518e900e05107b9993288841aba3bac74a25edbc4b1638a46c6c74cf2687fe9930a0bc858d8477bc3ecd38a521118407b4c19f7e65f8439a7f3e9f3f515a768c900f93567f5790aff6a6b7c064156fa1e302e016762f1e052a590bc612e1940a9cc4400a80d85004399abcd796d4dda25d2e1386d78b7e13eea52a10d8f986a5c78b4313f7e46032c25bc18c39ef3e9cce56f5a2ce6252eaac287813e18a1384e574f214f23c72b880bd023f91d9f05e6974aff6e97a7af3b925cf5e03fe0474161954f1f46074f588f05a34a665c038d52aec2309e32b9d3a8ce5528441af1e444e7c42b0e61cbf01138e6fd3fa495c1f59fc9716abfdc7814d3dd94c9e736ad5734ef8fb6b6b7a0c2405e2aae8cee98cd1f8bfd66a5641781fdafa34f1f90c5bebcc6e884c27667719cdc151caa634e295bb80b4c7f1ea4fc7aad4ad5f0285c264062b04cfe6546cf16476e87605c686a9f4c860136343c6350f19774164dc7c22e394999ed1f328f7949cdd60b319fff8372cd488a2ba9045751aee0f2e924b8cb49db56bcf8290ce571a3f12bd1d7a555bb7dd607547f6a3c2fa4cd07551d1bc93306c416ad1a5c05a9db8ce1d7d3a50058a8444a80c9b11b4a5e764ee7ab84319d014db88cefae3028ddd40ae6c5d13a385b4cae827d14f82afdb22a4aaad6ab7a123e4be881c3a0890f4262a5a2e121f41606fb1f022c1d59c768719284262723083b5e4bc73139d3e8526be222462bd51bb4a48343ed90b8090907c86c293f8446945cccd8da66597e3c60443b3e5e95ffd1c4baf0c3ca8b5b5fc8d4bf2c4216c9445e6ac03d5a15cb7a0bab2110b8ef110f5e6f48614e560da8942cc472db06f3153df220e1a44455f628151c5e8f8d011c806601bd47f50892760fce5728342341a0e6424499b65b82807f2cc3250032cdf259bbde6cb027262961adb05fd25124e62ab6d8a46110ff74e1021911147f747b0e374216e1e78e415589cf72c7f4936455ab713db20ff58d6b90e5b1bbe9c604006850c52c31a5786c41b9b2c434abd1d5b7d7065b29d07125c4366a81b3d6fabd32069c85ad9e1b8f97e86fdadf219534f3acd1895c5e4a57295138c31d0e58169d4ed9b32afcbcefa31451253cce0aa1426d3e75e949f957be284cb6e97aaaffce980523642dcd9217f487fe2a0713249a4b732e1deb200906a08d28a2b6e858c1ec76946686b1002f92d39d3149f2904665e33cc865dec3301ef07c57305c07c5a6d9cdd542eec6a745a455b85c2bc506587f9c2d74751825a813ff9f28e743aea3e8341f846a7cb595f0820d696d99c8d21daec520729e31e2d2158d8e5221e276e2cd8d99575cd422466b34cae76a0fd8d4059a0f0118e6379e182d717bc3032f80a764c778c1c315c9565ef97a26fe8355f89ca7c983d16a97491b6822594e0f2d9afeb29a55c1eb6fc635a03ebfa6dacd3cd3f207eff188818a9ad3c1f81fa00b1734e8db6104c608a33765d04e5c5f58f4ee216e532442d4edd9d5dda69467ba731605d7cbd04c97e4291bfb40666afbd766b708512e6f756584a5709f271397d9a07b597dba3e29c86bb34ea8810e03fd1b78cb4d984f8c661d8d13a55fc521f84048f62a6e3ded820645c062de90bfe58c95790ca50d6660ad7cd8a09f97b912995b674bc8c5ee4c0b1db25c7c3eac7251daafc8d6592d78084e619d351ba3bbc491d3220f9fc0cbd983818fca5f5ea50f10527f51625d6a46f7e111f301e511d4b3cac729f3aafdf1b6415df0b596f003dc47e56db68c49f50753d900a8d6f32ae009b341336d2a56e6ab911a5dd823a0d73eddf9c3dc50f5399dc812b82beb02defa0bb9b1070afed43cc71eb1e59f5c525ee1ce94d6a18b69b7f56dbfac1994a8a0d84c5c58f40081a7406b3075213dab569584616f0d1bf50f705c2d548d8cbd27000080fa3d6470d6e27bc50f30724fdd7f945691537bb1f019dfb410b971744b56bfff170dcc7e960e5abce9db4c5612518099abd614fd2354e71157359ee760f9be0855398fb343df915d0eb37b45eb82a0598e3fc41233489ef6bd57d53a957c1aa3a0c9134b88dfeeca608633371e14a58c1727f1f68b0b32b7a8d5cd43b030dfb7e00ec9801114ed742ab7d97d98b7dc3ab6a30719081ab92f6b7090722c37809035807c3d8ad0a8de29f8d2484c73d16f6017e73ca70fa2409a7bfec8f702a346f22c21c48c1488423d508c1105882910b30f03a8c618131a0e40abd11e3ff451c794246deda984b101dbe3fbb8355e9dceeafbe4ab8c25a266d5bf8f01b1f9be023544cc1abe43f522deb78660546f4ad04a8c942d1377acc70ec4f58501b1e9baebd3d05041699e83ba56f79c9b59982c25bf8d204022c5b14c99b21615e5b71c9e63f301cc27a7951f3aef4bf66072b0a0059beb8e44c9660cd83e82e4ce1a12e66cb54c5ddacc318cb3aa277d5a6fa6e08e0dec3c2a1a7ff20af7a2f8a23b65862fc912d8d433f8ec84ddea723c476294b1bf8be5c962e363285f4e47e5e204bb5cf067f0c11e95864b1af54a1bacbddd1cebff8834643613694b621f602171b02dc5663dea3bf14071069a1145a2771c6db9dfb4565a910ed4ab881b178c1e19f90f5f0380363f75ccb1b36b39fdef39bedf5068912f55d0fb1e1903325fa94d148c81281bf15963abd0bc2f99c1556706511bcd7aa37d5efc562d78ee8e31be05bbcf2d7238c6caaf7060857914f14790b91a94f80b7727b96d7c2a8773e744f687657eb62fa711e7c2a203aef29196b269eb6dea82acdefbc563838a38fbd487a59b4584b090f3c1c01d0c066bfb00421c50752572422a6405c5ddd804497b172381c562c129db03c0bfc84ff3e0a908da4f300b50b4d633b4e4b4dc601c2bbe569a176648c2bee42855bd36ef393ac60c95e980d4d2b47288895991dae7373fd4094b8d02cbc9d7481b551d7d3a0ba368188bce09df7bb368d68c81336a11eb30c05287a9859354ad51194aa72fc5f945e8737ee775143851cc6214893508be1e3551802a1893f49e93b9b5cd3f17bd77a84081afedbb14720423636db86638698a18c610bd6f5db5245432fc744aecfb51323f944ed4f5adc5378dbb43ae30d044b0d27c4afbb0f40a50caf62121008456c017081a3ae2401c97895ccba6a5b33c6a3b8d470e9515981634668d6d23be76f0c9c3f50381cff0bc0b615e059e3ff4685a0e129fa494e5aeccf89989767aab1811be53802040a40e189b87aeb9a7b0119a550f2e0a1c93dbc83747285349a22d24f6256753a506b2e1d426cb58193d439d1be5352a75cbb9b78e4390a63149a7a6b20f4798012afe1d9a67e4c5cc4500fbdb8c86f335ee6ad6ffe54d92f2890781fb0d10bf9076fe746b49bffc7578c25eadc6547f906579381f1fac914f6826b8b77616b25df9ba3d1f6083eeee2686d3864329c5eb22cf7040098256d5b4f46dd8dd2f6d83c64930968843ad51e6c866e80ab02c5a65ba4431643bf95b8aa51a2cba171e4171b3dc2fecad8e413228c2070fc41f2771d9139b3ea7acb6fb53a59134bb0ad32e6a9c549c9a6106ae128a3d423c11a6ac7b0bc3b2fc6ee022edff69755ee0769165b03f582e58278b298db1170184e9a12a40c47e46a7902c3c847ad5a128543a7bc3b6870cc8910fe1a9bf15988245004c59fcc74897cf476c6f5b19657c62a92dc11accabe2532e530e86526fb813889d1df9060d751cfa63245390605d731126f3cae9709d5168e68a0424d3011fe620195f8f71f1bb64556567f7b51b8e378f7bf8de1f803d02a528c998b7476bc6b9d378a6e7807ecc90c472ff87a62d4fef6a03dea00d8c228261b1b6a738e7e627aeb95ae2dbfa4e61247dc20e5b779c8965f0de3409e628ddcfe17491f09d78bc4e32ab29d561756afd4cad0f21bbdf84e4ae0eb9d707289cdf6c469b750f36ca21e645a79bb816f170145beca6dcdc4d54fdac762af5890878876fbc56deadb52e4afc1c8e59e36231c91d0f535aecf2db8166a67cc900921169e26ab3301475888a8800061e5ab13b0c1945e0f8f756ba1f83c075aac949044f4370627ca0b347cb5d29f7283931ae29f0c0d4d035a02ccaeae8e7078171321b8029abd60b0937e5e0bc380383d19a4edf3374499daf1a14ffcfc0d0838c7d4d79bee3c0b784e04acdf013e28f130b5ad8cbfc27a6a67b8fd31a647a9aad90fdabfe2206a33e483d0706aff9fc8ff696f90adc1f48e63fa42bcdfe58f80d449166d6b644b7784faa67b0208006edf9031982edb6a74aa245d9a6b5bac93eb8a13a7840d951b93cd15c4d93bf0dd080f092b226f0ab098cf83f2fa0c2d1d7e11e73a29f927c981809c31faaba11858f5b365fae37e05af30cd51548790b1003e4f10d3960ffde8418ac484448eb28c60bdd2b876732580138698f32b90f4c06e3cf01308b104fdf80cdc5b81c5ff211d852692b2fba2b704c155333dd4d159e2d9f23499344c4f39809c8c205db0f21c718f3e7b4fd7426e373a0e1b15e185d4723cec72ea407e3cc09e7dead718c6c11c796b5884a0842e315053d5818a8961f66bb0e5d74d4b5e08e62c609d567f9e9fdbf14189c237a049a537cde04ef9060abe6b30cd16db496cccfe37cff209ee5f06d3f235d59f807e1064a689a42d134d9af5fa1f00190cac6b8121cb9f7f1d4f9a21ce0541dbf55b2c86f85bd48eafc8ec20ac53635d4d8468c7f3e759e66166733ffc624d818cefb31f52dd6da3ab36368713893afdaeffd9f76a1a82ab81f7aa2174f6ab1cac0a72e6d64064b6b42a572adbf4acdf769de0900bc77d91111bad0e8a60533564366731eb09a4338f6d83213e90269fe911ea3f5a5db9325f47f59262f8cab52e6440f0aa7a715ee854b510d632887004dd80bfbbdf22ac30a5c4b294a0cbfacbc10d7cdf3d1534c71a93208a8b298d299d3657e4c098c6c4f50998bce4e310ae083417c854a09bad932786a4c1faec77a38ff313596d6cbd83a18d90be45816493c5f677a77b9f68f75fe3938b90557a68b3803b00232d8a764ead08e979475123180bc7088d0f755def82cc34685f0ffe42091bb3b161fc9c6e7039870ce5a26cf07130631984957eaa973c50fc4e2c4d64f8d5cff04b4851cf83b92c6e0551c7c44526f94956a711c496f11c7c9c3bec31dc3e910411f621f4d44d963795b1bd518376560da53a7b39b82fea1961424b48613fb589deb1e5f95b2901b7fba3cbfde2f23afe70e6e0464ee596e3e06861818730a42c504851db3832fc24b16328c67d52819d5a9bab3e7188f663606b6d7d3e6ffab446c1a25f49f9db5051c62df33aa42bcc8346d6e41109a79220fed62993c005f9b97691b105baa359e180b9de1d1f6745972f1f97257f0a6346853a709304eafbcd92e863c07021ec0df92fa3230df355e22f45726e345d2c54aa81151e7818c3e43213174e7180feae9c5dcfa60130ae81011dd91991984c55e5677192e73d03d520b87933756b4794fa27cf9e88ffeb62e9314ed1aca13d920f6c2f473de56ebba861c46f9e85ef709bfa795b31706b6671e6709ce434cb49c46e13172788485a807cba70ec5a1ea4f089ca8f018b39d08690e1b611c7d6823377485c394055b8b7b7042ab4cdf57168c03cc8747a6ab9d43911d9c58c788351dd8d2c8f962c66f60064dd964178c41f63548605c992406fd95828083381acca062c05460ed526d13374d2b91f792f17cd9c4fc4298fb6f6d40ca04baa87a09f9cfd95ab68ee65220accbd3d13a8ec3365754812cccebded4306af3863328b3fae0d3f6a05cedcab0c12ddcebb28c50c3200c1d37348303a22982f7e1ac93c5a68425f0919b403fe6b219e0327620b35760153087b9305334668e8964b748d412017e9ff5dd0ee697c9bcf13345342b5f7bc4e711ab88407bca8c4015b1941b795fe2fd4aca0b68cbab79b610d64cf0f5739644b6b47f3c38c20168c27ab69d1b46b295468c8a34c67e0e9f1794bac4f3de971f56c75075bc075ca3269508b31b1069dc8a6db67a39e9cc07a54aa0b5d6520be03f725fe8cb98290034bb22b5f4265275acd7609b8c66cba10fe1946ccc7add7761391250be84ae0bb630e777acbd7da7a54c50c71f675e8772cab5909f5553d23e9e5fa642d4eafb3caa7f45f994fc5284fb043b8c49c45666372e335eacb9b1979e48a91e1610ffd0c8c687f77989194156623f22f10bb6d03d6c49155302af2de4a484dc1bb3eef83f727583c3cb2a9dea826c64f9a113fafc5f69c627cfe8e8be26bbb4144a1deb1a0379716dc9fa45cae767c8c2fb91d7da38ec1850b82e51e7c83ceffaa3eb41e756631c57cb4f20601c39a970a061f728e7e3b1c9113a799a010158ee1e5bb6636ac216dec66968a7c08bcec00af5d23a1c84f753a6e4056281663abbdcd1ff6ca1a4bc09663e2dfd8bea1b58edfc989fe452d669926fe167a9dccdc4de2485571ac48b47c3783f66e002e38bd0f3d0f56e0e0da3c4fbefbdeb0b007d2b8f329c8b2641c6bfa2274ad3cc43a5e71821fdd11d09cf14add6881bd8e02fffb553ee2e2bcebe9af7a18b41d2a8aa23b4ea4d2c60a898c6be1c519bd3dcaed91f5f9fbac44efc9c1d81e8c30d96186b456f1e0cb5022797f2a1fb9c0acb3ff3ddede729c3454280d0ff91a80b6039c2eada9b9263d832212f9f34c623368bfce002c9f917b8038a1ff333e48f079f106994a0df59e2cd51bc014ddd3af3d72189ecbe055cf4757cf6f24224dc657157503b15c5c88860c293134e5e124a33b2d37b80cad11acb31961665ede9491461fc6bd6a18fde75475d17f3960ab11ba341a471c225c146c8b3f7c7df70640b3c9bf34b605bc6fdc98c7779fafee85616aec2886ab7be606e2185d347bfba7b6c09ce2f9548fb9a9ae6740e402154d928c7616009f856aecd39de6ba9167c1f1b0e9254e55a815a9025d05c00b2323eb8ea9c2477bc221a6e90f2454f25eef211585c76320fc50ebbf0dd0c3ec0d2e9817166787065d139996a037f9fbffafbaff8848c3f26b1f00eee9993325582788bd73572c5a6dc39697938780d49401e402740804ba490ba75a301816a731ea934267502d8c69155bf5d0af398c30205b6a481c98fb27b6c14618190350b6bb8e3b65ffdefee8289ed00fb7213e505f8d16a57880da33458157623818967483725146d8f12d2e359264ef2db7947b6f29a59401200a070acf0adb7194d27e733fd4858634516c7b0d0c25b0b5ebad3d66e64b606bdbb91fda9dd3a1e58e759865e91ef7b3a904b6b59c0e73c65ad3e17f377046e78011c12e4b251dea30d3333a3ec618adb5b700be4643661f656633ee9db516c7b6d7a177e79edd66d66e0f75da749fe1ba6dd9769b596bbf817a5b1d7a7a466fecf119c0614a1294d438a34ec13a99f18a199f602838e42a4a7b1a89d06315a50c99366d1a48dc5d88c35a6bad366dcf6ecf69d37653fdbd3555d39665337a1bb9b17ba0d9d9e3b56b6068d21ec1d8160c4d9a6e02c68e60ecf80cd49a911b72d8e104b63c0d49aae01c61043369d7f0e5b1ae33a5ab8e5f1299c61dcd470b259450220549249104124820a1c462d883905a76c41147489f225a26a5173d986aa8c75e03cd26528fddc4807b7b21daf16dc08ecd67da54037da530d8f25a881146188104a3a17322f1bb5caec92377ac2da2882294441e1ad08006720ab26606339881f5c15ac711340189bb07fa1e5882c88ff3f22322d387989e9153c2aa67a4cda6da08ddf4f196664a99829e273d3faf245c11a3944e6889434394734a291f335d331569dc525389b160e765050fcecb0a9d9b9715ad9715369667dbe327dbf2d856887d1462a6a84d966118b5c16eecaddb9e0a315fee6f57c3dda999b2cf52bb87dcf6991271152356859801118190419131d9361341690679886d1f53b0ad56ebbdf822acc379efbdf776a15f51c80b8542da45dac5f85e6b6d66ca624041f38508c6a46040d65e307c77452f82edecd59dcffd825d77ef5377877e45198cbb0b85445987343bcb60ef5c161d83745e1d7ae78e453c503b531890b5158aace9cc5406b403f4a3f3e393e3d383d3c3e3e279ddbc766c76746a7480b0ad9c201c20d7cf0d75b15f01a1f9d85017fb15101a0644ad11ac11a20efb1e8f07eb306b2fea627fef65cd8e3bbcdabea20efb50dbd916fb893deeedf105b7bbc01d77e78e8f5d4da4d333dbbf21f2d519e01e6240db6e40f3c59eab3df6d8da6cbb651468c79a96a3ce4e6605e7666bd466ba681a6d125227b66e2d6692a664563dfda718118dadfd6b41ce2e73ccb4365b6badb536735b9c2dcb71d63ad95a93e9d2c4891cce9fad35d99a46847b94f9c25dfbfc992f526690662db5b9bbb5d65adb6db779db7266adb59db5d676f75e3b5309e0b4b5336529cf55034b2064abe58306303044872040626054a997b2fc8cacd9d3098ea81003c120b42a9ce982717090c30da8a687b664cfe9f974eef49ed3e9e9a1d34f0f4bb7b1d96c4284db0a4e279a9343dafae1f4d64f6d6818628f1bc7717a179e4121fa30ddbe6572a687581f86dfc011c1db3075a7e316b0c220b7d0ecd3a7b6d90fb1c7e9f431be8479e3ace7780778e338401d378103380c600c2f62b78ac337c01df8a0dc36c0484fa08c01c4f1ba8f85c03743c41df4d866a6283d6dcd17ce64a305e3986cd83095e1d3c2145180a230051574a628638a8d16d37dcd9796cf707a9c43573c5a74b5dd78486f40f3053cfd26650bc23632e06f8057cad5f63523eea06f696969b94040990f87297703940104e3d60112e07800a011bb65784b4b0c3aeb210098c900664faac431d08a69367b127bfcf4f8966063dc79214e063006af0b79a77b31c4f0471ba7938d1312f962ad3493969b4e2b1be092d5bfd23e5017f036c0b8556005e58e01b40a68b9ec642206c1ad6653b2d928010fca8d638cd1647ac19c73ce5a6b75410ce0dd3b404985969696161b2415768c3a4cc71c67038c5b7657ee01801b2892f7e931ee385d051ab13b86e31be08e83e0bd373b81e15683ed2733451f4ffad1643a3d9e748c41c756d3c2e95b78383baef2441da7779d4c8bbe3e332525eaa007c1db739fccad86aeb21badc3dcf21b3ab4fbe34e60dc1a8401c46e805850d4418f03c4c0db003313887788a11177d0d31fb20d1b78bb36ce146e31b5b4c81f80785c2da61e05301dc8046e3539393913ab749e4ef74963405374d237ae29699db43e5dab992f73ae621aadcc2783e2daf4d9cf5cd960d16740f325be7872367d2665aee24e3665069b5e6bcd17ba5fe2ab0a1f7de3445b7405737a5a43572fa795fe906d3cbc36b21bbaf2d1a24d3accdb0718a3cbe92bf004003d79a20e1b3f81e1ac62dbf804a2abd5e93120ef5fad749c18298d7ce3deb1c4d13f5de6cc97ffd4f21308822078bac1d3ed7c11c04fe7e64b0ef0584af0b3ab01d415041f332368025b9e036c69f92f80cb1d3b01b45c486eb55a2d0180b2e5d1c763a6d4cf01b65c00e06f9a9cc96432994c0210c04d2693c964f23893d781f736683ab8c4c77d1cfb009330790175ac4114ea2d7f61aeb2d78cf3b569f6ca5ef3c5f496af56f76e3cced5563373a49c5d0d275394385bcdbcaf4def6bba506cc3fcd0aba9a5c574cc947198498b52d3aa67ca6226b396d3dd62aaa6eee17d8534dba433959b2cdff293177a609b40bb4da7c7b9ca7aa60bfde9b8628cd3c71ad7026e405fd37eba0c8ee3cb99c0ac277b92f94c97d3c401030c384e71e0c001c3e98601c7c4a1c1cd84651a9761d672f76edcc55162bcc54d6e76cb7a5ac015b8d9606eeb6430e6381c38f4b9ae868ee334f6a2f4bceae92e76b2c371ba71e8f0c8d6b8ab41db5a4730347d533253d47443ddfa726b1d7a606f35a29d20d72e32b7bee9fa8433e703bc4f3cae05e401496bb7ecd34d60dd35f688fb74d9dd3047378e47730439cc7ab21e7aefcd9cbc40db054457d866026d8ac3e3c9a6c71e384e5d1e9652a2003cb45bf418571b10001ee63d82e1a1dda3c7b8c2369f5a5fca440e318ef6ad06e3d095014ebf29992b1fa7df6ae68b3e3d0e50db893ae837a095d3631b96531818952a95fa4ba58f7e2b77d140a90d68e501d02c07800e33cb61c0369b964e3280d682a80bcd7a668ade07983d992ef49e09b2fcd4076ffaedf9e9ff87598f38aca98f1bc00675d3b109947ba57b01857acc443d669ac0b8310bf702d8f298a99718e0b8725a6badf50be0067840d2da2f5c6badb57e81f341b7987e436ed14b7e3c76a6c74c8cca28d3bd6dba5ef2e3ba055c5273d68f873a930f6da98bbec9e4e3470ca07ff8d03a8c4350b2b38bd46d329d9b299d674a9f4e3bced4e92018e67dfac170deecd36f9c8e4f609d291b8f3365c3860e4370b3434cb99c529de6cb4987729fa0b43cce17d35b7438337ff649a575ba27d0ced4b4140c710b6078f7a62f8121c70286da10420d8b4daf028612e7c33821473fea0933298436047a5dd6d3b3e971f6439845d9f43dc0244c562f00c679c28601933059e92ef60b988409177b06300993f0be78504de6c8246210061ac0cca10452d39e6558d568e642084ade4ad17b8c5df6ab52a93f8f1e22ddfbdee9d0ee480247608cda37953c1c608d35d4909a88f67b4d3bbebca5ab8f64e74702978c74e97b0d9872f8dab194717a1928f7177e391b1bb2638f0e71624592d0d295e74d02475488b9b6756dbbb19434a88a44dc471c777c9148241289ee45232e7f6705a7546f28901059bee68bdcf647545f44b722ecda5db6a195444c177ba964cb1a52500ee34e942cecf4d29edad74e9532abcfac0f6393f923aa62e8cabec8906edb09e34e417a50843d2f44871d28f04dd144a70bcb4d61298fb9923fe64bdc38c400e9028d994b7f7501461758ec30b56f121102572041124c88e2da811456f441500b84c084275fd8e06686253449821738b881184c62b280a2c4044aa8687d61735cd1f400073d8812851660010410cb5ba2831cf0800669ac4009acf8780049802c70446547b467d6521a56e48290b3d3ec207dc85df2b4c8a31c151584a814c33414fac466f5b9288081550b2cf9223c5bde072bb0647c4d418a2d5bd8f2b266bec4971494cc1721e6aac2a862a2580144d3350a5b3e4818c396576db16d791983f431354746fedee1090ccc1398f8440ba3f5e387f4217ffc28cdd28fd28f2df10f0dcc97b054ebcc0f1a80e020440729b0e48750a00bf94a67e95c3cb1a78802d096ff68de34cc54cc0f17fcd8928b2928d18325bc58c18f1496ccc28f1853542104225a4a5a158ca02741518e83f4317170429d44010b1b7287bc93308583101d76a0000680c07a6d710517446cf923495257d9f062cb3fb3e109098283b7a5bcb7620304cd919cce4c453177ba0648b0ee88435da0a800ca9ea72a883de40a484f13d125eae0e607d125ee1e29a24bdc21c5e911ed0ad33eafc26ad913863d75ecf9824c102c8b5d0322cb96a84b9e3831954616edf8ea89c1bc6cede4541f6caf651b6b2a4bd3b4294812ed49ec54526ba5d91462ce24333577a8cb4bf280b2e708591af1564c7139c056a0c832fc369df936d5558a28860d99bd4892968d92ee1607f97b228f6eb57ccdd40a1172dc4446ef0e45ee5c3bdba3771fbd9355da1177bfdd4b1d62dbb55a1d6144aa3622f7e8e1e8f6232d9dcc9412b2dd72cb264ee68bb42350ee1b978c74719143d944a78638a767e5965b36c126e867abecf8ca826767b1b357767c6111848d354eeb64b67f51e8bc9a60d7240f46e515b1c7c5407985bcb725865d49a9bc2c6fe198896a59fa9116b0925eb2f2bba27da02e982e6130c83cc82d5a39cbb108ec41beb474c20232d9be0232e97ebb2696ded2db513044b2a9e42ac9625cd521fd0d8d4ebb1109ec1e76bfddf7057377ecdd319d1f3b05603a54393e655192bbc78d75580763fc1063fcefd831acb3838f69222aa70f555eff3d760a50d9fee10f7f187318a3b176136d2bf70d7b40b2b1877a907e1f630fecdc47278131ea18e9d062748d35d65063876e8984b411b9b787db394ce2e46c8f994360df8e510f0adb051625797bdc9e8729e76ddb23ab3bc63a9c61767695d699e2429a4d1f99a9f96dd600dc914bc0f67b1b360e6b6973e99542482577fbddeebdf7de7befbdf71ee363bf1c77398ee3388ee3388ee3b620d465de57138ca03b1b2a8713708fdd86ab8fd86f5a26c16a27636fad9635b2a552a954b2ab21e36457c3fd9600ecf63660fa880f9a66cb4ee6484d42b6fb1b0b454fd48d3812fe36cc1ec356a28eed2c1b8b167b602deac0b2163017aa899e664bd481dd868c3d6c8037e28f951e37a20eccaee84c63cc40dbdaf28a1f3290d7cf7c01cd54dc319b56ecdf98ea9bde8567155d459655e56fe6e80116361b8762f45163ace0064cf1729b6e08edf8d05ef281f922752f69513da75cc265966551db7e638b9676323114038bdc62a91d4b3433014f39a59c0ec09408b5014754b544800119bb851d8f451f71c71d77e24e8421402880f0055a4f8a2bf943e34b7cc15e88903be20e386f10534dc4943c06ce2531259f81138998925307d18508e963bae20e79d93353c0845983849214f907f20822661151876cb98a3840d4b14357435c7415235bf23296a494524ad932dd205b3b7273c5a2636bad2c3aac8e458785b110161d96a52ed2671342fc777cce6c899ed2d76c4f273bee3065add524978425410d6b9aa6699a0573e4d0344dd3342dbbb7334dc3324ab57b4ebb37693fc26dc74bb6639b2ecd94bc33f583858463d5605467489812a474cef90aa05028146a07140ab5a1628cb73328116a87cdada87ca8fc1d42f75654be906749f9598723d4c6e00c2a1ccda0501b773964757640edb06dde3b9a7558da21bb83ed74a9f4a350bf5422934c990172e9a597d25bfac103656da9f4634c293d46a1b6f658924980f4449f1f3c50ff0c6a1bb91165c7577c7ced18e528d5487e3f9873ce39e79c73ce39e79c73ce39e79cab383f57715abad11cacbe61dbe26d0f341bde4ee73bf03e82989e22f1a134d49de330757996e64cbaf606ce489774cd10ec802eba812c43648cfe6a2b5d21e5a8cfd5a1db534a71466916a98f0bd46ae9327283faec39e9dcd954baa4ab931b0abecfdaef9b99f966beef729f36663b13fa6636471addcfbb9734b2d9f3be8dc11c7af67d935a1d66ee3633e929477598f3f785ecb7b51f97524c31a5f4664c9fda3fecf7fd986174326136ea3467b6d67edf8f9d0a53f1a9fdc37e0f492f0dd536a3da728831c6b86195ed81665fee93524a698c31c60ddb199548156473218f654525886a940a12ca2c2b2a39e4d96f34d22149b53f3024899ecda854d4a329ba7dba82ec4d656dcea5522ac8f6896969a4c3ef144da56654332a512af587a94b2fbdf4d24b879482648b5e7ae9a5975e7a5394aa628e74d90c2905d5cc1d183a53466e489b1d7d7ca48dcf9636aa15333e7fafb5165f5b04db6ec1ecf7139c9452bb9de23824bc377f0fd99cca47c2dfc2217b0be1c74c6b4b25fcadbb05b9ab7c24cf8eb26e9e03bf713639303cc5eeb15b9bf3763ff123c52276ccb39c2e95ec67762cbb1cb467cfb854baf7decb7dbbc518dfacbad184df3ddf7b771fb5293bfe7d58f2b429bb89bbedb489d340e2de8ef1a9c5a7dfbe81a169db287dc85a6bb5c99e8b26ab81c4ed4d7cebe19b6c7613deee2f189a6e14518163080b2f3b1be83cce817e1e5b1b4b977e86df3782e18714c138706383130c27a51401349bd3a65068dba8b571dbe6c43ac4c73ad22f8feee9506eef21301c127ee7b0c452a2d884310d9bded27727718f99d6964af46e60a84431164d5734bd3da5c0a6b74b4a8f99d68a74a954d22a31d423e9f05b050cf1489b7068ff3d7bcca4319482fb03896897e740cb443bf60f974a3ac421ae1b531cbafda51bdde8465f82d914c76c146bd3463a11d1f349549bbcd1e749a0a8ce541767aad326efa6d0eff14394526bf2283d47b7edf4f16edac49dc8f66b2db5f6d81edf6a1a34057636b7fd6a54d4e148c70f99405e0c2af5649ed72ec15c6dbadfae4d570389db243a91fcd045e7be59db85a5fcd0b3ae33c53da44ddd4ddeede9efa64d9ee7d96fdad4692091fbf64e571ebe8db8b07ba0d9579bb613b9b73f0643137ef4d971679bb0e6742a7ec8ce8e3e3b7e03efed2f6aa6a21129f7ec12404f9a2329e088437a6bcfc050efecd8da87972b4b5d2af72881cd81514e39e59453ea50027b7eea907be4c0ec56bb0eb3d474f8f9496380232aec620832965d0da1def5f71aa8fde67083bd6675ed8166cb34076eec0eff5e03c319bdb96bd65a8b009adde9d76f31721a01341b6bd1660f6d28817d7528fa8ccea196c0c69dca47daae85eeb7ed17c4de3b95fb8fe475f7a3504887a28756ef11188a9e5f67f4d53bd162ded459a68f2091bb0829a5cc1e625ac6fca041ee88a794725594851cc2ec1804071f42e40e4a53dae77f6421cb5b3ac138a5dce1a9206358a9646da6c367973732e6998454d63dbdfa08129637021c5161a593669addb04c3d0d3c4a39326aba22c6e2607ec4ccf904479f8136a62e5764678fd6074c39d5ed606284481fd8a78b02c121488eae5229736543beb36dc3d7d22c323d5d5196f72346fac0ba6f30f3c54e0f9c38dd0cc3cb4296c7dc8da9db853d74a08c2ef7dadd74d801adbbe1eeecd85ed6d571a6e8ae333593883b6808e8aec722aebe8295c4913a19fa38abdc49cc144e9c2e1db8b84857192b1ed7bab34dcf081ce70ba56510b1e5abcd54661b2b14a1b322abb0d32d2505de96f7a195c446082b58b17d94aa2a679dad58b0b07379cac6a8d858194b76a956bb844dcf19c1a22f20a09c97e864d35715a66cfa1c686c55d66466021c05902750ac406898b0e209265248e30527e801ab5631a5e7079e2e7e90c20b56fde74b1563d7a7e8ca03478832c51280a214d1048ba6881f9c00e18b2b00f1023558f5878b5d4fc37cb9bb8a7a2a109b52e18a3d690b7860d19b2cf7a242933d4b4fa96090a8d88ddcd873e2a989644740dc45300dfb9c8f9972d3542995e0d4c6a10ac69d5d3b191a664a9583db588e54cc64966558e5b1b14e0626036394ad753215acdb7632f1d67befa553c6d0fed8592713430390a87532b5d65aab56b1c8235a9a6956dbf027857b3f2970f76e18735cd7795e2894b70d739d17caa2d16834c298e3683024737e69e0880ab99d6de371ec18b0011c2fb725b6cdd976332296f604e3e676f8ad93f1a26c1da10a2154b067b49a2747b8628f0885b81ab2a1b1edb72ac44d8c6dbf191187b044c4410f4a5ae42aa2a5026f36cfd40ef581127bd09ff9924357d9b5db6f5fd8ad675b23a530b6fdd79343bbad9e98d49c1359d3479808d19efd475c40c114433022054025ea622fab0e0fa878c210580f4bdab673662a3f03254b9b41062c95df1bea624fc3fa409390ef19d5da55f4b5a14798841209201d16ec99ab43851a2c26f9342c5cb97a8449189b288981167b266b72c4be478299c062921f5fa2ab1964f0c45c653e9bab3edc9a849b936d5bdb15411b4ece7cc1a735b8b5ad4fde7ea04cd2c32c4a26e5e1697733c8e1e6da38ac0261cc4d50ee2f8bbced50972d3b996da50439cc7cc29a43d2794b1f3d75b6c4247a764ddf1aea6237287375a3984ac4d556b36d3d9b2bf64822f6a0b73849694a96b26d94bdb998e8e09abb335731f821bed9f6dbf6db6bdb8d07bcaea8c35e236eceb60fb7176cbbc4b63522cd80c9caf46d5117eb6dcf0639bc51b4b6bd6144b1ed6f18b1c74f5cc550177ba01b14775a1c93dca22e9dabe28efbb2c89d0eda379cee01d93797a7c4cedcb29b1ecb1e7f59e47073e5c03dac175de55645cb1f200f36c40d3353f637709a07fa3521ebcc947d7d62a6ecf19d18eb1cd4804f5beae2e28a3e3365bfb9a86bc877fb2121eda33f70735197cc67bad85b9bb9ac398dc1cc470531b360dccf012503b328b147168517763c187d6450883b6cc56e5f318539ae729cf682c82eb00c917503408f1543579bab945f39f3b15d14e963de3e04665166cabe03b31f30833253b6d3998fcfb6df5cd66ea0dcb8eef0bbbb2142d9f7cb2263971d033c56a42ea51d7e476e879bbf49e918b7f40247548e5498e00a1c0a398f48f6aa80ecd97745a6f53764af9149968fd282f758db0b90dbe24073ecd83359eb730cca9802a3200a14d82687767c45a941942831c03fe46dc757141b20516a5e64f8d81cd2b25a53930c2a5860e07141158fdec10900193a22541000404613dd0b42f081818c2156b4116c5064d474e0116c5e98c21d09379a0cd10d20b8c027369cb43ec54acbcd8d3178103a3571d9186389498aa096316e422ebc784e63d4e41686e063ba82a874042017c40823b31441a7852cc5d0c25bd9e92921c153e161552a9816cb0e543e4e656dbefdca11241e56a582e1340d51dca88811c437e254d6e617ce27c505911176489f3f5072e654d6e622d4d88c3216a11015362220784e70b212a50e083da11f2144dc115ede4f09b010ba9f1b9b143cdc16dd25420d7662a9d88010d290f0ba612851ca84b063c350c10a26854b1b03864a049feca5e9143b180e5826a7b2364701542d0ce6a421083ddc0b8c1a110d45f8992e71db0c040cd4336779fc50c1d85cc2767c7dd1b3c3bf40512b6a0a0a572d8890bd13aad9566e669b9a4bcad83fa417b9c2f0d89a5cc1030ad9dbf1a5c5143bac41646ec797163ed85b185ae06087b5725ff0fc542bf76d31c6173fecf0c4833101578a619a864d0dc356d75e8bd56aad16e9a4746673fb899562c7a20e99d188e928a38eb84696cf5228bbe3a914c65a2b0d31303c28a5d4e698a9989aa952c95a2a69c524f63a531886cd2aa576a9c36a738d339351ebc4346bad95b1473c8d3d78905b7a8f9ddd1eff954e47a53c50461da233b2bc51c7b451c719200f10c66ad515543c2e08a352f18051a9388ee33a19ec1e176b866932de3c63d66c86cdac52a9bcd08e2e5889471563151bbb014c5649a9ca59ab3894670e3d0482d1057b8c115395542a50a46519e6359177bd37dbd669659e73663b5f54b6ca8e58d8a64ce54ca96086d856e4cc7a02932d5fc487d69c1287085baae4e84cd9237d9ab0e52514f93327191fce9caf27acc1b2e567cf9c2eb841493073e86aeaec40b1e56913fab222e7cf66beec70e1e43c61cbd727aa4edd913ba47cf9a0b1bd1ad4cab9049e9456e4cc1a6265634076db9acca6892d9f0991dd64ae0c27cbc99eb03bd92b095bc290f5643ed9cf7c8992016541502863cb6b49b41acd86dec86bae24e6cbe8f21a0ed572349d28e844315f4e3bda4be3d17ab427f3857479cd87aeaefd6851342025b6bc2665be985a353642cc1795cbdb1bbacaf2d6355f562e6f93982f7267cb5b27e6cbb7bccdb13a7667bec828b6bc7d5927f385e5f296a7c7facc97f882e2b3e50b5bde5a7b5ba5cbdf9a6b434b67e9644a2c5fe96458aad82b51b862afaca89cd4c9a8d4ef768cfd29617f5e08b1bf7f9dcc9749177532a43a7aee6446936ed1439d8c68e67b9d4c0ebdeb6442d6bb8d2bcbf2ce75325eb61177325dae32b207266db49dcc96efb54ee65aed5827a365507cc449e9e5bdd925598241bd9533f12728fe5481c79439cf3c73088bacc640084728e132010f5620441334a8e1620a3b31a882456b189bba56b069c6e37115d748c5950c224ed6bca893993ce4139240c20f8810d4459456065a4e7ea002255c48d153c148c28c20a60562cfe74e66d6cf2a5c4e88903d527b3e24eba51244ccec7532335fe64993e0e204b9eb6466f644e08d20c48c70dd6cbb9eab45b8005325a460139560b3ebb769440b289dbb1e092752f06e8d0c67d3674ecce8a222f081325f7e30a079c5a63240594110921086129270068b3eaba1abd88433ac18620454f0e00a50b0e8339bf952bf88536cd1829d69a22c72f8219ad4b67c05aa41580bab4162caa6c79ec0a2c076b017c693655bbed6549b7a535df515844d5f9dd42b6a4ff5f9c1b04873a80ef55162089b9e42a15128100daaadaae202d67ccd72be264fd0114b4c81018b9e26a135d486de50da337d26bdfc99363f6cfa29c45c7d12315f5c1367e6ccf989010df830a5154248922b2b17b1b3a91073fa90ad3df7490a05c84e2645038843d421cf838c524a1b62664a4621332577d061a6e4e53b26f274c1a746fc62f2ecf9793371806043278a269af6913f2f940460ec09ce249bc70f89a3335f563b2fd8f3b2c97c69793db157a22b7c903525d833c7000921d8d865f6437d687dc6e3799ee7799ee7e3c59164501bc010fdfd64031800676dceade822c327022da356a0646c9e8c27e3c9786490812bc555b4ac160142369a96435deac504e05aade9225b33554f7d642b145da0107d643d346d24ef87544a48a35ccba19a0e6fe46c1db26c021000a3b4e47598623c38ef9d8d57d34d8967b036d6c6da581b005822e66a3a616d6c12bb46e184bdd9f5f805080808080053e6ea1a90925db50c6d927abcdaf0a601c02191e39ebb6a9a8ed69e98a9dad920d7d5bc992ef2934691f518267e3ec7525ccd973c90fa80f48702813488ba54571672285b7204b187912c5bd247a697d4a4e40f711542c1aeb205bb7e03b5e8425300cea6d56a01c1c20ac0c592b559e3d955e3b922635800ba04ace64d7491afd778e82ab25c50768d5a945deb7101b809662f307332252ff1be847b96c6934d7fe6aab2ea2916a2ec7a0aa5d381f4981903d03d80ebf003d001a0ab81fa84e84fad87a193610922e341654d66aa7ea691df64574f87b9556f6dce190f5d799ee7799ee79d04302cef954422914824d24900c32269ea53a25ec41e14d3f427a4bdea1c5d6628ea980f65184867a984c487aeebbaaeeb3a4d7d344057f4070355eb52749939bacc532f7ca210465c69a73ee22d45995028140a44a150a896a36ed838a15c68a1c4b2825241a150a88f847a81ea912887bcee7278b31a2ac3ea94a8287dbc70c82da6c966069880234a2b451df6f7978b2a92e8b090d01c963d0debc60c589aced465a29e4aa5aee9236a5c1d2a4c0fd87ebfe923ac2348301358f648b22647b0b45f7d847504093e82658f44ab79c2d24ec3ca73062cce2003163d128f30052e66c04292f1bc80153367d0740c75014d4234186d7a8076244a015406172c241909b0c0d26ef59178841280510516924c0b1f96a683cc19e4695859e6059131fd43ab19573d2532d54e8882c6159aa68f2051a1d1b3b150b3a52e42e300e41639b41bc7880aafcd9cd5a7ee4c2ae78ecbc7e5423271a61373751fb3472dc9ad992eb354922b38b00fb5247bce233616822e36d59ef9d059aa5a021928a30eac52cf068b6d67cbc7486ba4d461e623353d56251634531493325314038a3a72a8bbea3a53195d6d37d485fee6c6e5a29b4d939a4d4f9bd01775b22981616ae4302f5d3a3a15a802d59a634a0e3ae702229db308da4b7ba95454a03a54c75a5790ab56a0294055b0361594e2b80cc362a994699a944bac0c928fc524bb0ca3d63965d25abf295fad129363cc39a75643efe4642167df4657e93c12894422893ef246a81d8e42dd19148742bd7436e6b6977eec8dc7de6c8ebdf540517bc31bdef0f6d00c0ab53754a9f47f0714ea7e964a47a14e848d9cc264871caf0826ba6fcae8a1a8bb04bb118984dd6dcb39678cfb3ad2e8f1b723752011d2485f1218ca4d9af724d24d9dfe4ea43bf7af3bf72e67522a074cd77198c31ce630cbca770c721c0993300993589ebddb7fa32e8b468f5d0ddd25914ea48b60bbeb7067fa4e8474ee1fe9dc491cc6f8468cb1a5739b9bfe6a90332698e080769a482394f3a6553a8e2391482451a9c4652e94734817c1761e22779e5d0643d273beb70896535bbb2a950366db4a30599533e992ee2d82edfbbdddda9cb7ed7246b04d249ebbb596bb97fb9028a2f9e00c6962879bc20db030e79c73ba6a7003b963033448ff445f371a9de34423cd7df47d237dd2353beed7c4612cd2a176992371a413528766664565d3e1dcdb473b3b043bfb7e46bab6e76fdb77956f46ba3623373677eeea0b66ece94e6740ba6680b5accf12243e36903b368809fe82727609e27b398edb4857e93c8e1b8d46228e238171731ebe247c3148e47efbce8ef4fb6b3feebb2f9d52c71cc7a574d8177522f5107e7bdbb68b398cbf8dbfbdcd7c7bbbf717db99efc376cefc7dd95a5b44e4914a969861a2c23cc01185bf2be4eca287df557200f7bd046f0ede553acf2391482412c9bb48e5de27b70a18e6c7df13e12eb3fe05c3207273b3e3c09074ce44d208f07e6f27d2e11703f303c8bdd49b0e59743837e9a36f2006431ad7c6a99ef3945e7167d391f4fc50b537bce10d6f384ced6d03594eb21f8948e17795af803cc82d22722faf02b20c913f3da3da1b18aaf636faa643d5bd911b9b8471f88d31d66190cd8d448fdfde9d03b3ca3b766b732e95bc87f73a9d01d526127f1f1fa62ef7ed82f15322df6fc7e18cdcd9f771f2ecab8dd02d559c08f23991b31cc02dcf130a636bdd555446d39e7b3d0ef1e3f771b7c76038646330721ccce626a743fc884195dbeeda231de930e313e16e8fbbdbace34c752a60dc6111ac03c3ef8c9c3deeaaf21b44f6af20275be6f071b1ebae9273cedd45dbbbd0ef55401e90c82ddacf8244beef0343b9bfd168349adbbf9bac4600cdb65cc7759b4887a14fbe82a278053d612f398ee35644dd4eccc62598ac0a535f0f0758630d35c273dccab3f7fb4ec5ae8021e9a3ab5c12b1971f812c4364922e82755d373a96dc68342a820d219dd3e137770b86f6466eeccfda9c391390b83f6d523991eff82afa3bfed70dd93976399044a3ed190ce9d0d345b02de32db52782cfdd72f1f1df928c29a7d244ce2e37156df9679957808323a36022cfdf1087b0a3b2047ba571574a97641a8974b19860da9400d5a6576daa4d09d0a61b488044d2d02997a8410d9658423af964124a50b4b67c098a16132655a8750aaa8cee15c496ef5e41a838a1e244c4c2da20158b49cc6273c109b6fce682135c71aad2449ebf01dc523e66c7441032c266cb878cb0792b085f16524a29a594daa28182202cec8f09e1f705e8431513aae79c9582d1923a2c6d9abf99a220b0092bd09639a4935c2f9f23f6883315488b3c4ba8b9c25855f579a7a492ae3aee72931d28e59f697c4cd7ee94da0c96a88bbc9d1428aa44c9f3d27533b15a71b204236678ce793b41ae1299af3345475d4c909ba13abb863957cbcd501d0cc3664ec46aadf5116bed9c655986dde61266f39432be6656c84f4e1d1d5ac3b302923257a2295926ad080037ab78e104dac90759831520702b92a86b61c7d7158238e30a3b4cc94046cdaa58b852e6be2f72c861600826ce90c2097ab0c0c392220b2fa0c10e741083318a10854fa46255cff8e28733c438a30c00ecf83a238a3398d8210a05541ec718e7b6e3e74bfa987afec81d47883da49e63ccf9f8ad82d816981671077d944da16cfa90b4c29e4450faf05a3b623d5107fdb5b93d5787aeb6d64bd7e6da6c7977307979f6f698297f7bb6165dcdd7d5e17bb62ce93067bab5a54ed1f9435de8edcfcf6bd37424460fdd366e8708479c01032667986013c30c345c19eff832630a2c6b14219b0185aefb31c38a108e194220c930a163060ebc1d336a80659a08328306d6c60c1758192774ccf881b4c44bca14546496fc48793292c109424290141f886498ec4869222463831c2932c8324b00d91f2a189635568c40630b9c1daa8cd8e286065bd80891bf1d5f4e98c2b2461130c5241675f89f18983929a574f6cc39e7849973be62556bb3d639e59c9352597548ad2d95c01de59cb36253948343b9e7b19c52886cb558422aa5533ec6182310435da2897e9e66639945a0b65a750375c7cbb0a32e82ed98b9e584d940116c0799a9786d93e6ae5d0464abc5ca8e7542e20e2bd3bf817e6ea008b64d72777b82a61be6b781ba8b603bd32903a63ca8948c17a5412c95aa19000000004316000030100c8884229124c9f24851e40314000f7992487e501e89b324cc5114848c31c6186200010000004084ca2803a4f83de8d29b287ee1f7b67dd67fcbf340a2b6d67d54e90e3c60183c14cb207665082d29e096b5b05d3a54a66e4f6a8adfadfe6c52bff4a81726d5b5b7f1e49785820506d69de03e0f84e5243af8896ef131055ea5bdd3cc722041ea6171cac2aaf5a5b56f5ec3b8543f3faffdd5ced447dedce35d822d0c7d4e8419bd0bb2010aa15059401947d9278917034747ce26815e9642d7fb2f8f06d64d7c08d62ef502c96c230ffa1964f3b7378f1aab17cd211b02b0080fd90891ed7a227b7784e8889be1814adc101f4125d0f72696f348903755526cc59594c92114f42234882c33e33ddff5127a4df99524546ee70dcc343cee4beeee2b07154232107b05ae72207a7ac9134f03404d09d40a2796e927193ac69d5042c4572edaabc0daaa1731d4db46ceb98caeebe0885d17206ed74a7602f58053ef521a4917d3ef7b2e61aebf9ed554bd0696fe6531e200c3eb01bd3acd234d164a495c07310e935566778a3c84cf6d2bbdcdfb4a70af79e1833f00bb0b70c5f732172b46fd86dfcc091efaf415d574a90dfb2895966a3fceca78025fcd45abeb107d475f5c82c33e8ecac414500ae1b5aa54311dd4fc0354ffedcb8679787d079d281005c78319d5fdb46829a28b93011b36a7e4a71ea65cb0e4d387df959fe6e4d36c43520cd2a19956bfa591324a8d000e74fce5675939ccd17d3c4000663086975e1b96562e5ea9e2d106c54d020a6a8f69b663cb658aae8b3eacf8e728e1f358d111351ab93c304be0305843ac89fbd230714ed03daca5172a64b82905d7a72b52e262c38182f6be758528392fd5172d47851705eac560f457842032970b11317b5789e817c44dce33bdf14eba40385ebfce2842be4308a67d187ee6f239586cacfa003c13685eb99a9a63051960142775e1cb0971b5b879f5ef9ad88ac82c3e1444d4a9b88b9e89bdb5cee976fa8bd89c70e0e99baab965c695dc86a92994d9a9729eb2a5c39bfa92f8397a349217b23968964150b0e1a6194c6286f84c6976dd3037505dee331037bf3b596be953fdc4cef1937bf1f86e8b0a9e2c2eb7811c96154849417e669c88f81ed5dc5d470ae530ac5076c279c4c2263f6510ca89c8083c912ceb9087fff011215ba0132ea0168726f3b5a4a1212fd61945eeba0e6a3c17c6334257d4c9f89beb7c9bf4c2739aed951b5443cfa115156cbaf86eb03c6e6341396f8a07bcefc9f3532321ddd05b95b7287b6279d8ea2dea5d9943ea141f1af999a5301a8a49eccda68239dc41377a08fec68800f8daf9bf9f4659a18eaa5c0015b644c26ef6ca6a3795ff6ebda706d5dafdfe6e84a92f52762eeb1517ec9b4aae85fdfab553e16e7ffd19d8ed145190d81e0a76214f3d8a9453c6fd30dd4b2ce57e9397425613ed270ff1be63bf1f2e12b18cbd31c2f18077b15ff7f3c4f1e31925da1fc7ca67700e016a60f723e82a39b85c40d198ef904dc85241a52efe220b708e1af15b34f6b9465814b6ee8a4bebda082dbccee495bf2760c274f8497f051a9b2eccab7f45ab9bd9460dcd85d7ad6d4ff85e04598fcafa8852dde3a0cf61da1d04008e49d7acd5de22c63c80fb303bba70f425d55e247db119d59a6da0b248d9945d0d1a909b5d2020a76bb50eb8eb320c78a304e71fb231b84fa8258d61d35fa21ece28e1289c055d7eeb362f374f6d491685335d23db422777785b7f1a84820948fc402532bf92f31236b9c4075d037ba27524d2c3ecea87bddf185f4cd1167472d50ff31bd677ffdae2493777cd150e719aac37fb49d14ee26a624913abe6ef65a3dbe04c160af68814c27cb3762c714c39efcf82f28aa8b5296e10b1fa5a00eff4879a1ff2693db6be506b708f39c793397901b77874b62e6675681ae11617b567a0e91218b5c3b34a2e4ed97ba2101b2482fa7768cf2656902f60d5253b3c6aa0b8bd0e604b8e6c2e8d389c3c6efa7b36830319f3861af227df8308bb6d907e6c77adc0362fbf1b5d0ebafcf9ff3b2085cebe049d9abc5a223ec6024d6b351f01615c7b53266e3230c2dd905c87884f2355ce0c686c379799269917752c44c81ace1701705ead9d9966be1967aaf00ce6b58c8dd8a78754a1f575d90ad30326b0f1cc99b6e4829bf0bcf35cc120a5e1c20d23c4d6da105df2ce43f38762b2ab50b4f3debd1825387dba99ad68fcbfe3f1c554adc0bd830b5ff337f06c0839d129b79c6c1e06ec85214be88f5b3e2a38602c67bf027209beb805d4ae9904d71aae2c5d81b72fbf823faf31cd4e818d7dfa95b02583652e09386db94ad7e0cb84e14bab10f049181a3aa3854bd35e4d7a9d4eb7491fa4f8405fbf454dfe37ed76488f559fc1ad212809e9e64c442b256fdabd773c0a9835d5617ac2c31cbdc99a34c50c3724bc9807bd95d2c573a918e8dd4a26ee93a0c13a66dfba027cf2989296989c2230de39ee3f23add1df42022dfc1194a0916f491e18951f048847683ff7d38b44ac56c598b95d510cba5729a19dc71b45dfa07d18938ead64e21d69efadb3f95f7beef58704ef4b9d69e0afe2aedf49d1785d617fe93e68d0372bdbf04ace14ccc3ed018b8bfa4119576f4a1a57990ff22e57083bba30871f9a0617245fbbb457c871f681548a79c93478d7da0394006e670cc5fa5c4012cf92ad4cd7b24c4176099018c112dcb9cec293c6be581ad36f115f2521eb8afd3bed4f1167d5ef8783f1a7068bb11a15ef9a70804294504067c57796105a5f960d0e83ce4929e79495d44f25685c87dadfb01ffa01cf32ba5d101d9e40b6d8a48716a692b522a6b2bac4d4090e37020143c95ef277ab4f59d6ba440c02e1e6ef8d480784ca42e03729061fbc53109601759a09e4a52f7ca9b3a4eb31266affe2123cf3f3e06d2190e48a30eaf74160610468fec5c28168aa83fca0b3c96639e040ce32b865dc1a8d6e9ad2a0fd5b944ba8a4137b403a72cb9181890a707b0f45215dcbda4c960169a0ade028680cedec3ce6ab1447245a051b2a029177d7e46cac7e30584b11f83fb218af95ab1b4eae6e3c518f6400a7d2bfd1c8c6f265315858a0d719681d62bbd99c8fa1d63ed0b340e9462e0d5859d8bae89d573f1ac95fd8aa56a2b3a79294262f20aa93a8e1eb91d8ada7ea85a2d49d4e5148266bce45fb1ae155268c90c3b7a7c4d7629de1d18f100dadab34624a6400533cb3f475eb7573266e3389754402947e06d645cb3a30f3cbc011b15f9c80f8731a038104d6938cfe09674cf8fae3872e297e86aebf99c0d4def8eb1b31e5a16b189cbc2d9aa601831ff2c353be1b53368a87103f7b383be918f1a157269d4139ce214762d7ebd68887d717267e705f734952c17a3ccea8dd9650731616969867df5960e4f9b72086fee7fc75aebb95e611d9d5d030269a0be3f247a1a3f7ac43a69b3a495f356b3e69b3e0dac97fd55179a103ade67c5840226f52fb7a3c3c7cd96e0332703dde51a30b3d3204014c4dba6c5605d0e98908417802ed7e4ca328e356e8bd87a0e589e15ab5dc48ae4afd6d9fab6d89d3f977c74f2ae7f0112f87c9b39b71f7d2bd3eff9bd9011f218675cc25a4d096923ba4eb99eb7c34f7f311b550cb3903fab9fe4092f8576de7cd46076b0aa61f29bc1e061f9259f6147d572b8d242b752e1f31d688afa67a268399df90e7c5857e833177760fb1fc0e3406b08a294d46c6694004fa6b9a350e41a1677b38bd8c745c208ac08213314001f677c033cd58226d46e763f0a362679c4b68920d1f02056044e9a4f0580e66cc04bd8b0e74f2cd4010b4c66e6a28544e9633e66c82180481810110a4aa7e174c72e330413424c347f0a062f08427094f26cd80863c2293d2383164136682ae45163a3f0dc675ece3183c008220040b4ef2822f5ff9f1752bc581a8bff910bf3ce203938dc261a8208f0d266cb9f2bfbf54deaa06df098a7885330120f2de12afd2f4061b9fbfe658b8079cab6a5ad38273e148f1d28ad2003dde2d2d5cb9e0389e4458e90dc54bec5318400b2e3a6fd86ca6a8c84abb9087b0a543013614d4652828856005e135cf061170fde521174172dd82767d025ea314f9b24db98427ef5e555f1b185c552f632d22bdaafeab16c9d367f60d99130f31cdec84609bd0fad4336abc32c9a88450fd179ab0f7d467c61346dea97fae4fb0bfa34d2d4d3472ee8f242ff391b4bee9a2622f8daf8b9e69f9365ebdf93a6e217491e89119bda952ce4902957c5a47b7ca814bbb309ceca35b79ac2f807486e499b67da29741be4a79401e1f6f9f8a945019a24d93558b8465e531f0936ac2368407c6fb2ea75c6135e456c5381c064a21613759de83a01da5a2a154763fbba679d124b928d8baab4df902e9ceff43752e4b1fad2e490f543297b07082db87d7c1b0b61eb03f3e8a12ecedf6eb256aeb14d932bd0367914291f3b442346dc7c00659a631efb425b560f8d65f784a1c4d4252034c59e63bb8ea1830d1b34b53341db60a98778f9302c5bae3fe525431ddd0ffcadd792fc63f413fd19b186ffdd388fdc3b204f2b5fbea4a4493d9af8119b5a3ecb9035745480b0929dfe2e2513a3b6daf70298fafc3c700dc1b62a92ed9155a2a24d3d30468c07e28b53d832632428e91ccebe7f073da93c11a9bc0ad7a9f3dc3389a409c6977268de43e90b608ad946ae872321c4fb2ce859d51c9e23241a9bb4d8ecc0c8b269321bddaa7cd7b0e61880805d0f0060da00f9ae0e4e6118b9a3698b6467efc8b7eac4e2b1c9f66d173647fe170041efe37d04bba31ef25cd47d7fa4d5f6f6201b795f6b38eb3fe8e628e0224e1b0a0bab106a0d88e7b093f57204e8dd8d5d3c6c78ccc538c94041c65662fa0a3f9320286e0e8d4817d22ef9572b9b072e2fc966d81aac8a81ee5677e11045c67fa8f48d471d1e63a46fa8e00ed290cdb4f4c38779e990b094965a16fed3f1e091a23c9b9207a46b8eeca93a0a802e1b1ba50d128d5de67e752c96c0f96c29cd06ba955edbe22607a76e3c951e848bd48a429d202918f2c2a94055a046d13ec034e2511e3020446f1a86503dde5747820c3c22510b4466af0e20b363265b68816f985e146542e450047f6318b63de5b4e75d52c686c2186eeb2afdaaefd11febfa9d9487776a02f3f581fd32dcbd73c3fe6cfbf4228eb4e8409447cdb0100fc7473bf2f81cc079cb72aa9b21f07474b0413e49360afe28b92ba227082c1373979f79349e3cf99851cfca154644e1234d9b0eb056478399de307392785425d2a126fa7017cfbf1c2af7c6e4f80c83cd029df66617b223ee6ba17bd58457f35cf580d46d5d99610c5e27b45c09c00b32916b687d1edf978f8ea5950973b41ec15a8f39efde6c071ac23f3bb6ef022ba6f9bcc588e38a5add7e749a1f244253c26200a7bcd4d14a436c924a0f0502fdf8454457f51cddf03bae833d0be3140d5ce78ec5fb15190409271ee9ef367044a7b9ecb1602c4932a657f93dfaea6b4ed8d3d4481a270f65d53f4bf8f27bc6dd7e7eb8f95af5c2f975738c7443591dcda2b451288776bc40273d5173ea49a65a88c72ef2e415b332c2941e686c505ff96936a1c2de783c0ab6c9bbe9f450b3f7940db2adbb3c6346fd4a53143df726a4589ea654fed72e59402b4608defdd63edab52e57d796f6995b5fc8093358620b65ca1b6b1e75704fbea8ad6a20ba845f75f9011470a0723227cf7c7f9ee9944e475dcfbc523f7b7b9bc281b97fd4afa6f083968c7c320f19a303a53455c5aa20837323b199f1ea37e0f21f7ed5271c298d5f34460f53c068637d951b9fc9650ca3c6c0aa999690fb5350eacb31e152448fc380eb6dda0ecf8cfdad5546aa91076911a16830e0b39288d26f728eda1cd7654e3b456667d6f79b07d35c1cece6fd7ae81b49cb733cae100edf26ae78d3fe6aa08fd0024ce85806bb90a8eb7edd3853d447168672072449b7e6270417475c8f271368652936107ce1b3229e87001727e3c3bb9353574763dd13e9ac4d965d0dbc9786bdfbff0d2367003b6d353e8c606a536527b0b82093f161b530525b2e0d86274cb4b1796abf5a4367b9e95bfa8b0f84f5f53d6c0c416be4aec91a425ad9afefe887f76fb0a8999ead17d73dd5dd1439c7d9f0e8f01475664677d127f335a7032d425132d14acb6ef5eaf5c688011fe57b14e44d2a94c571254fd68ec3804296f0f48723b69b93485339c28a36d1ed009c76ddf14bb6cdeda756ad2664df69cb14530d3dada303a656046ac8229be87d71e6c2981eef36b96cf813d70c3d22c09a91475d5969df9269d23666f487e497d128aa744728aa66ce1d925086fad42b81e6cc51ba6c98fe054d9936cf9f0abdaab53c7f3cf55b7181b68febc78539df678534c4f3be392433037d2a81ee651370b2c2072fc69eb119ae99ad548a2e4c99bd603e2f9adf9026f2024a8ed011060ef5379fe30edfbf5728bbfecc72ab3256298c9c09631b0d699d2f082db324bb8a180f1457685750f2708aa0c9661ad0100f0f9ea2d15d815226084d49c281649a935e4605436204d6b75e6eedc5ed164d27db4faaa245bfd350a280664264fb137ef0b4edc8026be54bf65c7479d3bd64e2ae4234a4ce7c5644993cd2002429a04d78f6d366cb3f60a0629af2c5a207fd2d1a910f4e70e475b36b35cc0fa8102d6b64dd338320b536af7271f2abb35449b141768150c7320b0ca9061a87c117f9629aecc39c294c3e1d2be163b9237a1b227f8233a1728ecdeb5ba055329c2a97bea765f4f3cbff2e9da9aca2687bcc4276cef3f20ed9b7a048618dc943a71983ad316354a2c88ee653fc008505c214f4b94565bf252ab76ba4f5703f849b211bf1a71d87315cb696c6d88677deb5127f3a58828395800820ee0d37d76ae108232273000a1412bb07cb34a04d8a3afc97d365d07e41f00929608ba289ff060624a00a31d50421d1141e56fbb17144b23c798414a6244315ed77731ad06bd4d34954027e366f37289a9c5c013c5f2772b9879d2c63ae755249b66017a4bf4864a75a8a1f2cfabe827b38c62bd028f48b4cd3ff6caddd9a613d674d25b8c366220d93abdd92740b3572695f9c48aa77ec026f449d094ac82536688ad3e63afe802b4deae8433bcea4170c3af7f976508c7fad92bd44e114ebb33b68dac5dc96317f740b62479bb34e16437c36da131c07d0e4f8139699f65fa6dcd3479b23f46a7c8bf975d049381663ea5016ed59c14859ddd10c4b08cef654a1eba7fa259ea811c661aa755baeee299d139c56ae6bd6322d4c2953b84b99cc0b94df5e8af0aab6fb1560113e6420ec10653fbf7a7f190704dc66cabb488edf78a9ff83814a464e3183153c032cd635194ec83a26284b99fc2510886233676c51167ed03f11ea8177de2fcf2ba09d11cb37de2b2a64f34794af2ecc8091db8bdeead0a18f3a2026c397480cbbe1b9d8a6f13dd4b020f870cae3301add3ef989f665a9b5c7019b909c92c7f7a5d718307bda9596f5ad1d0cc50184e2338a9313eae5d3b284bdd286d4409b90e9052d84c61a91c94e41777e096402114f4cc4c3013334f40be68ff358029b3f6c88cf5067c8288ba66d58f2cd49ccef01d244b8fafffb864611291a515146c309e3cfdb139998953a775d96dcea4a820b522c64776d351666a0810b96dd425a9ce2fe51695d4bd8829203e634d049a9a08ab2f1551b8f6c4ff7efc3193be4c5d242cc1bdad25e0aa68131c7e9db1fc4c97f1cec05edda80a0e3366e72fbac860367551ccf5086042f05b0bd66e022ab9090076289e35c068eaa2a0e411800dc1672d589a5d54494f0a30437ed6075bb3df44ea5fa9402f05a9476023b4cf8a6035f79bf0b4516c13296e6dd30d183d2cdab6aa03d0b8b1dd286e2d79b043bc17ba7b7ce2477f2075b72389c024bc388dcb7e175f3fa07ce5155f31fa4ebddf9aa8a285095ff7a7d674bd98b9b861e774f3c679bcd7bf631b9b666429e2a3c1da5b61c8ed6a74d3fe94e29b51a3804640d7222836f6843491bb9affce92dd8c609401881821391caf60fb86dc37ee0f6e7bf4a57a0e00c77ede54d4039226aab8c5197d8ebfc4649ae7ba74b03a5009f7e606ef57e92b42f84da737db2b9481a71ef497c55bde150433121e57fdcc45bc5184147e04fd8547c4d5ae78fc9529131f67fc2a5a83b715553ce574ad28969c9ca8e128881d2142ac1e6bcfbfa2394518177906e5c23585464247e0e62f8ceed486c7b40880aae5875e4a22f7f33d03e5f866c2a5060e54e3c1bb6b9feb601fa616fc2ba84532a02279f8dac7adf8b747161c357c128f9496649736af49c439b6bed856d9bb8de9d9f5a24a84cf6cabf62fff86c2389860a3262d6a16674205605826922d20839a81f3128ae00af9b50843c82b70ea071307979871421aebf25bdd82f10be2f4a63b65a7a1e452eb12950d1ed5d9eca56c063c6a10b40fc394deff5698fda667846f657237f4a5aab0c140bcd7c816cfe6205e6bb51fd0845f993c58d6079b9e511d661d49643db7cfd14f347dadccfeeb38f5b16a931dd82d45d22f0158d511698d137536cedfcdc781a1f9b715c6844e6e6a175bb4115d02844df23a718f463530c6af049b3a72046e7253302988a778bab2a7e56e4dbd8d1eec6998b686212616b16b6511bc9c4721d307276fcb00f9921d0206db279062d43d9a83e30c42df65d39b27392b16ffa246eac0b4cb9f9c1dd9b597d1e88897bbe0760828430fb25a63a76b76d68928b81a3f38405b5a0d0795786f198e6cab5f379b5e918e30fc7518c7497a197c0a356cf89760a922370119a681776d6e6a323ae388037d86469b7a7e12779067a8e9e36adf3a9dc58508c539b8938140742e1511293a58142d97e6db51d59eb4dd76ce010748db58cd52a209bbb4096e8de29ff62a85295fdf595de8f1707058b9a8e137488bfc65dc242acae9ed5c5ef323ff62115edafb6ddb2e2723c9e3ad881813d65264ab3b34653bb10284725ad2d13dd63812c1c56c54fe40febed5555426a220faa59ef07d592cf25f43c1bb12c6681ba5802d4ea64afaa223f6245bb1abe01199beaaa0ad28b44f01305684f792cf5de9d4dafb2f447010c1ea5a30281c62dc7d1acadbaeb9a679f096a9c11d3417aeeba4ed6ae2225d67bc7eecc978e3d9c0433f464122d74ed8ee61eab1a5edcb447c957e625840c3ae16ae6e4f4524098eb05698feeaacfd7cbdc108fb3df4dc87eed688591a11178ffe693cbb51629d484c0bc0a9d5fc06634a91956e03ef56e0f293e836f28d434bd6e6ad4b5c1a0518d8a7472578b514f03f35ef4fbab7c0b5c852167c46ef823f787c47c36dd3be2355915d2a3efc32d4691ac2eaf9e87ec0f10e7f8d63fa9ac950db8417461272862a9d35d0a8d8fff576383f0232aca3f325729a1754598729195e047a6c9a748c2d1a38022294f88b518a982cf2ecbd92de6856e2e1924dab106a1078790d2fdca2511ebcc02de574a43c2ca992b3c1c050e2dae9f27edae0103750a6eeb253255f84338ad0bbccc776ade089198ec83e94a9e8146584f9f78e23125b91de6d2dd036f305d8c36f7381e2fd29df7881a6f93b1865f6f72f343fcb6b46af690b1ffa1a2424db7514da3254acec0cdf2909b08beb7b766e0173647b3628b29dc3bbf5f2625565c193254a383d50c9da6d61018269d7ce5a818ce419e0540c85b0942b8a2596a172f2483191e5e22d1b25ac30401171e5ca1b261de815f13c0e76e00db0f3bfdcb3dec05f7a68bc4f8c78c1ea66a856a5a46ae27402bbc93f42cc8eddc08934f4d6808a64051a6f186ca74e982da67f794a5ce3331e733cb4692f2e11c5f57aa3b9418f460db8b3725e44b6b649ef3d38f6ac40139e03f1d6ff4326e55b3f1906ce115ab7b70bc413f031e0565ed57a7500705082b3cbc1a01f43914dcd9091c2fa0d1a580d9a23fb77536933188e217fea13d0fe23a1408b3d37cb38eb469e0b85cd77e0e3555033ee83ea4dc1bcd222cc2b2d625ea91bf34a8c66db12cfd2d2ca1da24dbe95ce2ac51e05fb31b7af5116375e01c78602272b2a919a3a946416b5bf2b7ef5b799081fec04a9c2c4e6988c128e0d7295c4a72ff34b1b0d5a1bd3204c56226a22a32b2477240f760f7ef65b5140c9ab9bbfac774631d4ea62fa4eb6335dc0be190573800315aedc37067fe7ddd6b9823aa967b26120a7d89e07c8ec8c7885a8a2ccbc9795ec48be060140eda5f1bb1171994ee7fdaf8f58b466bbe007762831fdcd2a2c5256238698c4e9fc12509e83727c09847230ece8e9a0b21e1631b7e6211bdf91464210e5292e5a2a5b4fb908e133eb0f48a45ccfaecd2da2ec0b56631ecc893afb7ef531655e6927493084ae4cc65894de2f7c47fc3e6760c9edb759935212e97d7fc763a291c3e186dec6723a4e46990b0cf1d2ef7a64cc2cee86465344f51881a75eab87d163c01b09e536c6f17c526c96a764f24e4a135469e4cd1456a7096ac2d4b11fbd38c278e0ff9d21f5952c8a023243f64c0971f5932d5c3ade7681b2056439594e82b6dcf3a2b7a59e004d0f4c1c178df50fd399a169c0e7c8dd6df54ed8a7642d94631b4d946524918e67b2a7017d06f742a9d5dd6561e35f826601428bf160f48a0e227bcd9701940d4eec137aa298f272216b02ffe3e4bf0972004c9cb660b191e3837190853162496b6a38266ae8f75e4c39fbaaa2edc408ab7054b69f4371723408aa513d09b12246b98d6f09ec983f4d1a4928cd7f49182a084c70df5f38ffe26d12b57349ecd8b9c704fc4575e01b1b14458c6bfe965269fe5eeceaadd96210737f04b9672ed07c2f73b562be0cd5fd8d424daf958a9d541cd62ed1568b00843e6e96a1324f302dfd094ffbee01502421116a38d8cb4fd4d5629fcbefce2a9b0434a8a8feca47709c4e10ce24684000294e2e52fe2eb7f3d0ec8593c05ba305f84c22b996d24ac77a04641f1d30ab13dcbe12eaffe249c8ab02861beb5085df97465ac8e5ff42ba906911f0b9117dd3ccf48c0a6976d2d4c82848f81696006af4782c0b25b3d2fb2f78793cabf3577c904635da131146dfa77bdcb3116426c4385169e97c6049cabc6006e28c0bca3a033ba23a4a189944e3e8bec69fdd27a1b8308fe4df4209e085e31d0d2a67a132f391a9b8275376e8808bb64321f82aa74e773e132bb0230c2b1bb8085b9144efe053e4c6888c083e88e935086a0a828fe44d511e97dbb1c16995432a952f69b9d6c977913f19a89b444a10848f481c8b5a6ca3b5b1bd7dd22aebaeeaaa40ff5bd9431948289212afeed911b7cf7d953584ee26edc7bb70f77268366ffe7a9e4208b57b67bab9f03f7771185f62e3d6a2e8b7cbcb0566c0600cded72fca19760083093943726ad0a7cec436941cf3467c31ec1c1f4d4da9c041f27b5f7cdcd2886817717cfa90a6897cbccbaad3654cc981af185d0d018986dd3281ae0861554e0fd61b3dd4ace0d017dbb932cbd8cae0cb6600df063f79ea260e3f0b1cf7c9f8596b35d1a0863dc9adef0d22cedf289652e1b41b14e22bfcaa3fe0054aa5be6cadfb45b6e4be722f065d2de90fe5d8d31f8adeb9432a7cae63268e2270727a26a9464c1ba6c33fb2bc4f69067b5758d220d715c30413fb81190c4c8f9fc026a38a994e107574ba0a3a9c952d54f6d9910d6725ff13cbbec8c2eccf9ab12f1062a384053562580229940eb59bd3b538752223ed406459648643ba201ca3e91e903b156f4e82b7eb5792e039de02cdffd25a92ffe278c49dc9196e34aa3cfd3e00c22c920b626327eeb83400f3b121233d2ae06da47125506e812b92dbc8139622e209f079d79d57b67287a6ed634baaf3edf0697e5913a304c44427a9fd4f4a9cf6659597a8d3024e776c8889af000bae804a1cd6e3e10aaca8926a6d3841368af7b5bfe468986fc20f9de9258ca320272e488e3541cecc56e9f3fe8d01405d2d4466ca7b223c31883b1a7eb215c991ad05611305658149c7c599e5c2122dbc9e7774e5c8701fa81e76756655ce155fb232b9d04c254dafb8fa2e1c727a7e198270ce7d3449bf5806d0133e5c46ba5faf7737b4cb4d813c45bae62e7affccaadeab62a0671597af6750262cb430f29840a22a558102610a25023a854e353cb8fa2ade089c35062b5f53ffd7f6a3e77d528ed0ede1cfbb9da43d37afe1b2ac3c3c003c881191b8b17e6d0f647818c354575a341fc47c443e29448b3450cd89ee4054d5711c6c7e800ccc3d97968ca1a340e8d183ac6a206a7fb99bd74312be560c98235c8f3abe0d70e1b630d4e95a934905abc5607a6cd88579b1c3a478e94e02953c64d25f3d707bd681adae500369ca51dbd14def1059dbeaa3583480b71b4b8cce56867fdfd2647b112177459e2f0cdc7932b057f9ae86417e6b22ee462c70f975989551013bddc6e657b5bc51d079329b94b568ae860e579384c8eaa7f739eeb1c774a6b8cb5c3b8d8c2972dfa445865c749065b5032587354d2b652ae256b5c9908b0e52ab152839ad55bf90c4a845370344352148ba0a7aac35a47f90ceb025a946210e17ba54f5024d0edd6ab4d19910434bb212419c1c084d545e3ba51643e3bd2ba07037092282a7ecca396e249f42e1661605828ecc97831f0b95d9dac7c4b3103bf9cd87e97afd8ade77a13020e0caee1b0134f10c6d7371985a54f74931511d85cd4b21ab3330a7383f7087425effa27775bf0f13a2fb161de62c4ca8aa7ad0c755c33c056632d9b2544a102d2bad6c20c8b5a67a29d391b6147722d3dc61afaba205210eb5ce53303383ada43a8474784855d520c7a556af8ac999a6e52271138703c157ee5e8b0642529afdcccb4d40ea643ac038dbf09db5d4fb196964371d628d00070fffad549062508274ad014c4a123555a5023cd5a81441627958a5bfdb94d111263c7fb398c3c670030b55c82aa8858b185db1b154ba1b8f64e50de552c39389667f338cf195927777be53b240dc16f543621ad451f617caf247fd125d20bd04ad094c46f1af740bbcb2729554d32f68d1994c9d90685465dbb910d526d5679e7e39e32befd9e4865934b844271d3dffa9468b2f91904fc6760044aff62ed554a303d46fa673a80223b2b271e20b76e0357a56dba927574ca01b18e31fb78e2315d39b0cb7bf508a1d9978e890c7c1825afd31f2744b2dec8e11ec3e41063f45f79b9dcb74da42b16b9b3e2ee8fd5b5908f025b9a75f0d11d5736492e95aa8b47fb466668f5b07d3631837a831091a642377e264e9d65c219343994c70f3a3052027276f52d3a18d7272aabb43f30176d4a123d29ca94fd2dfa6b2f3d09728865ff6beffb9e81d1e2fac829f00d263d0d0757a8367179aedc2227d94200266590b180c161cb41168f8e0897f77d888a0420a6b3290d148db7002e7e34d9b0dea52cf622a03918821e805d18777c82242f5993ba9da3798e8b40b0e5343596a007d74b8039e11e360205325182195a1f9a24482199ccaba4188160903f54969359daed756f5e822aa32afef3e7540c5c58c63b6445e28e6a3bba765219c090f98e88beddfb2385238cc44dffedd5f24170261f204eeec41088a30594da9f280cbb93be96ca6092a5bc99c9030c9526d1f656d42605c6c1943c9f9506c56938f01c1f192d6d381bba87e26ca4acfde50ebc0a05a8d8800f5143db56cb3ca0eb532485a2ff411c5e397bcc20173f5b283c09c359d5a2340f406cf24f0c0bb1c3b518f6a0528efc76e4779175e792629baf126f047736ad9fcf428602b71fe9220f0ebf7423627b8845b3983247d46bed954327363f2eaec5bc543ddd1dbb037a4911e12a8178e2f5d2463fab7501f5f23cd9fa2e5556574a6dc1c96bca013be6c3227ef965409f6cce2a8ab774d155962c5596a7ff7bec48a4a8dc1100255c13347cfe7188e3be94d66031b58657d783f45a1a071c8d4c421a2e1c991051c41c6de0a0bca9a35b1041dbdd607d2ecb67872b96124117014501c458387720fd90d0926a6e1ad746ada80df69e1594b7c8246239916de96852220a55d1f6414939a70f765db4feed7b6e97733a65bc4a6b54f8c5588e31b1351cba5dfb4f036d132ac2ce2ff7ca25090f8829556acdc50cd35c6b75120cbceabcc1e2f302a21dd7734973b0c7bb2efde0026b84933112e7bc2977b42ed5bd50ff4bf3dab3110d54f808d63daf221fcd4ddd87e06fba8737a9d1454eac4789ddb9f87e394c5fe3385f24ab5000e3c7b08161f2dfd5a5ef08edfe181859a6777f78ee9751d850e5382779160f145519c8d66ad9e51b994768c0dd0369611926ff6f3d4390f292b1fc6aef2386b0d68a2414ed86b26683ada7acb5057e40f046be48fe89e47fe60c69256e47a86428df7903f9213b76454e15d32f8aff53823c0fbb10eb1cdb389d1eda994feb654ac704f2103e796aa3fd0b000f8caf1c6ea697ca84c1c345e4a557254c241bb1ce4d14d25367455785633ad81e7ce320b63e97785680473855da3f3851aab34a4fbef45ace74747f55630c33170bee61f7e95402b08b11e96587b262354a12b2e26674d07b19e3a3a6a6f0d84fdbffc775b9020b61c08f633f723f50fbcb715fbb01e220e88f5ecbd7d58afd8d4799a0d06f4b09e00df398d3cdf73d4892e0ae42f0febb56d1050884175a79b59b7d48490561d45acfdc6fdb35cf2cd88d4dba79b0eebc111dc7ef4d37a7e7af413aafd2abe0953c05c5da227b1f4b05e79f6632263065ce91807c47161c070e7bc67080b3bace75eb2e3e0cd2665550eeb6dc6ed9de0753c83ffbbc4bc67c79fb2432580a0b98f3016804c4d20f30778ff7115f4bcd04f00302b2cd0123ce11bc893953b45db7f0348d2051f860a73d743c3f200c9d1dccf49734127546fb07d210bb2e32e842a95460825201ff947ffbbe581f8d4c3a05f1032f2927c25282d75937d0d1c3d3cc30028d4bb55091973dcfa28e47c5f55ffdfc419a2ece848f429d8b455a0e8d10c682df400c1a1999f82ef748d9002e819943fd0e33b1192e3b00a2fd8b84c13755a33f0adfa78a60d5fa3086fe44cf685c37dc2f6ea42d6869205172809afc851c4b8705cd4ea3cbd40edfd9dd1f6eb3bab544bf07062c801cc6bdb24a649170f1a338aeb74e773ef42f9bfa09ad641f4f85d1c9b6e094696fe161021bfc7bfc40e43c25db6f3b35b29a1051e9e6e73156cd9641aff2dadc8091c1b07421f70c4e14f0457a886e021c842dc096934b667ad6b350f25b17e986907bef063678f0b5d08fe377313fdfdd80f6639e10af2de4ea45bbddd6b71892dd15391e1e9bf4f2fb9d2d570b3fd82bd2e9bb3a1f7685af461375a6942585b2e28a15eb08d5d0f16ce527340931d8ea15674850f72ef956d4b5f618951d2135840df247b6145cea34546b5fb8e5843eeef6af86f22683675cadbf0879b08528265bce147e1ba293c695b8168a430eb7e59eb8c2b7355c48c9e18b9fb124ad9822405c681001284910940609b4ffa3166569b7992698f77d057e44e77cbfc8cc3610e4c49f176ef619d58be16b1cc5120dba9dbf482606ebbd335edf303fbd03087ed13287d500f2e72cf4b7ea123807d8870feaaa32403f4f6ad2d0dfb1768236e7bdaa76ef87301313fcc976e2485d86b6ed3e4d0380d1d898e21f4b32310f701dc2989233a98668e41838e68789324aa4c3f5fae363810b601f8c9d485d72cac0ae3d9e0e1c7b1066034ee2c52647078a33aa848377881810ec4b04007e5f00495519786535cbd4dd82336619a9b3b8459766209326c11f6f3b45da5afb5106cb4ee64b6b9deb8eec952126061af7c33952073372a384d17fc5ace6c17425119664974eeaeadb4a04ecb86c1e60943ab9c205170d11c05bb191b387310ed94208e3b0474d485c0de7f3446ee003b975bff4cd8bf645f26a3617a92c720d122fa54032c0af6e6ae56aeedf4c94c19655161b2a6e1ec558da370042e1441b7a200410a6b76ffa682c661f5e0b9f1555edc92bbd16d3777714678ae7dba19244f792c176add757c7d76c82fa9c7ade37339627f22af18ac1f594377a3e36ecbd6cd96f083462d34d8e45ffaf518e4b91abd763c0bf77b33b12654c7976f9525893422ce96da23b63988e0a6c88eb8fd73dbb560c4f5c1d9383de2d9987a96e62cf282ac38f8d874d4fc459d081a64825f28bcebf3e982d61d47f2c3e81b9a3ddc9cedb89f88335cc04fe41fb7c7cb86c9d9f1eadc65988627cb1ef3f00225f0c244682ec6bef0c601bd538c534709735a0e4d1e1198967d8d183512f378956f9b79ca02f4d3ebe023cc427672fd278d4d1f9b4c71702262f3218701a32625326556176da77c9f36ae5168ae03d8d3c1b530da8a545d2e58199867fba920d47b842c8f077771e39356454189f29367a0fe868526b331712bc5edbc95adc02fca0a938c2aa46f000ab50c85343ca8600280188a076995e26bd1884c07ae29f00be5316c85768a8a93ae1c79471c3635f2a62df00ee5bb159d62ca2d851eaf2ebd7353b1558e5e1243cee56ac9249f2be6767f8e14146f9088c50ebcf09945e17c30debba5fc10890ea80ae610e1b290ebc2f2657c09fd4084a655f41866f84e80e333d0b6794e772f3044102ba2062429617f7830a8cc8b3c4a7a0b344ea3e0b1f19a21a0a8b05bf312dacda5d1620dba0b9128056b7b09a4c08e69390ee6b432f9845d0a0dc5e5681d63db71e331ba688452f131e18710fdf869a8520d6cb50a2b2819194c04ff31a2b0b9abcee1330d80da36d648f12e3390c949128e0fd3042ee644a13093ab8809b619b9358b8edad9289dd4d54aeff01f3c038966c08fa65a041324c6c811ec60deeff43ad89d25b1fc14381abaee0ea167b00ad7d6c95fd4024a3182e464431082e4c028999e75a02b86cac75586369f427518ff665a0a05b52aedeae80b1e230a03abd8558d0667c09a1a4a9d30e9d654d258b4a83d136bf4b6ac9e58b847fbc36ccae2b529d3010e030a7644358040742590426fd5f8528e6de8f41baddacbe4d1a8cc3933654ecbbee8b4357a623803d785ea8d16d73c86ce2f87489f0b85995ccc41b391a01e91b16ff25ef8658f5283773d2a67b170aa8b308c7a8d13333d49ffed934d383289b29c304c7984562df923936a1d402a57b45047b60b9f12c2e72334925644a213e8dd476649848504e9f49b347e3a3e0532875753f95d685af52605691782017146d7ff9a38513d61040bd8f74744492a6a8a3354e51424259c6d7ae0517adcafb9560f2f29a294d4c6623b0c0a8afdd1aed2a8f41dcb694d02d5d180927d83c57a7f32babcf04fff0848eb224d1f1b904f1b992b7328437043c18b7d91fd36a82267682fa0609c536217b292e90c86c11d56807b3cbb1115841f2840c92d6c7f2ad8831ead6b43b6d67fb536b652fb7878bf583b4cf6ba70f8fe3d0543b8560c43247f8e19ec7f532a140faaf4111395f98075747f3fa95f3f964e0cb9a461c4adcfbe68d0fa10286163b02f8d99032e34a0fb000bdf25bba340625a3979a2308065f256d12cb901af9de1f3ad81604887389314a80108899a2638c02cbc4971559e6a086d600b04506feb00af33921de1d6212c0a59aaf53ba5cf0124d2d3bf1244ff51d5cc45714c4062511cbee357c25b3b821876fde831314054b707a3e68561edc3e67614420a2a4e037f0bce37c36e3f6020a598e4a363fadb48d1985c002d3640a46a5ba6a643d079a0b2944f18e114774af6b7d1ce4fce3899c1ee822ebd2cc580d2c1826bd56ef3b894b0c963586b09b2937b86556a80a4c1c9d79397e8b6a31f38cd128a3afba37b58b116cb6e9a91f36c4aa818c2b29ab04ddc5406074d91b88f84ccc6325e7b97b80f3354f25d06974f58ad705835a525d850a6d741b7ebfd0291527554d85397a8e413a039197f4068b6318e6db0726ec03c7d668f9c8200c4a5b9d6d31070d4c150d535a00a1540bafe8122dd8d83240ebd42d24c3b8b715870f95602049e67885bcbad590ecd69b83575cbdbf92150f17173cd90f062008bef0ce58d416abcc8cabcff851e6ee7b05171be092c44be71a385dea6f6395c690ac73bd3618766b10e90526e20b47b1f1e446b520afcc076594a0ca9d796c5c2a91eb50580434adc41b4abea347f555bc345ea143a56904756dc90320b005b12da6ab37765b22f67e4532d211c3244f727b87afac8c5564ca2f151f9f2a2e10753e9898fc65b0616c6970548355b7a432f55042bfb74a96e41609660659cad359f3bf4b66c293469fb814b94a99f933080f8bd46e5f5ce1bfa2c8b3df2e8cfcdbe1686ba6e3c13bb85f50b60d3cceca58b3d0a987f0b4f107b840fc2c863528b5b2d0d15d20b5bf6edb28b0351f8b43dc4fec731f11c23c982f4d7f65888f39e319f27725d9675a532a80a99d5531b87bbdaeb338aa961844ebf3f8beb2c22a354472c41edbcd160f9e2f785229451260a2436d66011e50b18b7adae5331bca3d32a9e8c52e6d12cd3c67e1014111b6819e4a5e022684e515f4ad93095622a5e2bdb13f36f05ea2e80e5a17351503317a7273dc1d9e08935d1e72a56107e55544a0115bf90024ba44e2871b51b8955c8e379e1e1d7d2ba31f47b681d017ce8c8637b82015526b348e4f68e8b982d2ad398945467700c8b37e9da4f9ce2c1e1767d8310b6596fcf37f06844d66dd56eef8da4438d6cbab896dfc86ef7ba7192cb5205bc39e02b16b0a37c0374c687f0507e268a3ab3cf68a4461f28ea983a6db61819c84a053cab20090ad5a66df0c56032fe6c4103403735a3b47fa19edc80372326dfa0cfaf312f0d28497beda5011d6d70df5dd69cf9bf742e5128622a6fbf83ee468148844fedf21de1968ba457767536163dab7d92b7a7149bf310d5d7c4a18a3aa69838e849859e421d8b733bd63aa83decf80f6b0c49407087796ca91605b7ed500e199cb99b5c01efef155bae44806d7b94dba8c15fa7216ffb1ead380ddd42a1b87a7579afa6a3c42c2a375d303f74364b379c03ad45270169b22157ecdc434ca08d41b9865063001c0d8aa048200962c8f7449b19aaa42d9b70d32a21980f07b3cf35d19242a970b069088c0522f5fd4cbfe6b5ee59e8ed66ab365475385bd0d431042fe982c9626f0f6ad834905a5b7467929fabffb5cb5895ac022fd7a4a3b46aa5b1a99c55f9bc699158a2bd47d293fd5a6e0439dedeba15e998415ecdb39460c0edbf6f2dbd933e4a075ace9c6cd9de23e913f711b98f1f75b9ff1e9d13078e1bb2b5f3aefe275358fe67b51d9b82953b488a84b130f383d5aabeceb8b3fa0450bef1ea99b26910ef9f58f3e7a991d0c9947dda500616b0069966d2939425bcd8b8a0a039a480186058d27a86668c18c2a2721b48e23830e15a5169de124539d492f43081551dcb441ed62dc24e5477ee69fc18e32c8b8e85be9d831c1afe0406c585b804ffa948cf2e7c07c7fc1d75bd9acc9e82c840c200c13f3148f71c62f868e514854b0c93f87c866c6336b9a47c3e9b81911892c57e666e235540965ed144e2deccd1763aa8a374a82133ed3d91599d5dfe7c43cbd1fb3df534773b5fbe4119f7f7950bebd76a683ce3489bf12f0ffb20fdd9815d8ec31308d6c138be906333ce082352e4ccb07cf83bdb2a94cc7487865830c0da11d2e6c40a45efb2539c36a102bf6acc86cdbb8466dca4d62e6a57747eeb98201332d141d39f912200faf1ca217aa96f15333619d86176ae12682cc84651bcf11c18b0905ab1cca8d799978abc31fe04406bdd0483df9d7370a258cd18f3c4a65510917ab6dc4e07f893b7777b4c6e9ab17e05bb189fbc02c4f77619c4b36a86e2f2c1e57b8dcebc81d408a4d741e42112eba19b3596b1e4ec9b26b6b3dbc11b4c614f29f82728b8887516dbaf127d70cbc772c57c69e01f17738cf1bc6424f276f5a6687f14b2e47bcc127c56be586db90e402387fa0de8d68370088b6d6040492451be37f0001f64e65b9d057d6c55ff81f217489ad8eba8c0a649076f48c854f8f63103e108cdf4c858614c19701420d81fa89f0ede19f4f01d321d414bc03c75392ace29f022d014cf670a0056d203423a2ac9f972ec41db55b7fa5de5913b6878493c8f502dc30b9ed75097e0e3abd9f05c9544002b5803870e638eb29f58da64fd1b2a27bb578f445b8f7f2212f846bb4e451fe0668606a220139c28e08726b05078741e6fa0662a6a4d88aa817a1882ff9c112290f84b0da52c8c3974a48687c59b780281405a085be1a97618663fedb3c7f6f1d407f74a4053cb58a454622206f1e8786a972e56d2f3bca18cfe0b851484cc26b78bb1068ff2b5afc2538811a3b06d729eb0129b62207da7917adf68356168286e47d6aa3ad22baf76900ca3b8b030ff2180f7050834cb1c4d74487f96b5b220ab2650e3d9621066f805f4d637141751bc7db549f36fa8c839c3a414e90eaf2d81c07d92ee2772f5de5289a4c92d3a47a23a3039dfe47730eade817fa4d3c1745ece7d30b64adbade9e2269d2478b11b24317d8271d3656a37abf0676f424cd90cf118c29c3344127d7af46b6c9f5f1d1248ff6612c5aff551b863018a1205344eaaeb4bf4d0c730c10c6e12e70e998401f91dc489e43d42c20508b33127dd40a68be17a40c2ea433fc1f059f7174049d2ce18e40c341a5874be28502ea265e760d705ea0032dfffd4e90a002fc6ed2a4151409e7b2d6403545812db5cf9a6d3e67a888078c4fb827a6955fd55c548e16d156667090c8db3270b90aaa272f6d83373add7b786d0413fd3ec15ec8b75364d3a33618d774dccdf3680971b1659644238c8ad1df6c6088501de2b879cd544a8ce9a99f1ad0564ba21d107f0c9db23e684f54d4231cefae3b7483e223d9edd95bd02417c9a89c717f1348cf70aecc747390a30d193519f8254182fd325c633feec3d20e63879b6eedfc0f348f63b9c31ac322fd57bf50bc34d2a127acb7189db0372b10e4969c6536c30ee4dc2b8978aacfff64c204d44c7b211a30a0d17849b98d6683378902a80423d1c42a4a31e2c1374ff6693ded055e53df6a740c71fb530abd82a4d73da17f360aa2d239fcbe88292862ac7c0c988558280345f78a6f280441c9117791749518b6665006eada94303e071f94624d4c64821973013db99209b75988028c041307d30a850be435e6221bd4a25e7ccd214ad2abac894ec3bc1b6370f151a7a28bbb288f846fd37a7a291c477516b59e4aea8c87f8cf6ba61101a1c10814cd4ae0571c5c1c9019f08a57e6caa835f02ec9331b91361d0c55192e2875100130870ac3ae4440703012c6816b3bd2c248efcf8a84c197499c0a34f0488802950ee9123a4844cd6d639a1aea8005e82da0c0da26c5402a4e1c07ab7bb0eb3cc1c6c3172eda5ee9eb4018240c829c157546b025c616a24671e994d43278a9b1fbd7e09e8cda1082d43d008b0577032bf56a44a4e702121d9a0790c1b68e2417b09b02f1a18444f2f1940aa384b6b1c528248aa9a32b1f12f78bd3384519b70d4c3fb4125effe026c54effa1488f13e855533491a0ffe019562b0c06c7e5d8f188df84b420dada7142c4d9766f3cf3ed767254a5d9d4ce6c183bf96212dca28fb3c0fb19f02dd215266708b2cbee578e0406cb7c0973f8362bb6b6866d2199e87561cbf7fb9d6a16630c663717c4243bbbfdb47d21db9c61d3d96508a7a152b4b07badece3007a1758ca6396c7daa97622d9b372c73def65d6273a24e948c782aaf185bcbff374408cae4fda6864250be9589a56f2215e52318cc057424bc714aec49fce000fbab9108ed4ddc8a85ca973838e866837c8f9a7fc3e5f75d310eca198770e6fc465ea25705fd362fc0f198871f12568780688438f4b1ff4c91b8dcc463fc36e66ad0edce659e6dac9e38e3a428f6702f36ee0b6aea0b6a9d41a9ecde09add155e2a52223be50fcc27009018f405af0732fa4ac86267541fe2287b7350e860a235214587515c84721c0c9062f37d24b0a2f263ef33d4a8d065bae52aea47832dc9b9ec14fdf060001a7f969dc37c823d05e707a359800316c74e7ca50dd3e73a33e19c7be2e04726d28d91d66cb35945e7ac8774f3e4685298c5af8f6702b3999295451d2c6afa85e6b7de3994d6b66792a00909a0d659d6247e8ac45bbb92f2ae825bbb495e52270eb59bd227bdea16f40951e102c56eea97a260037f0a51689ca1d6b2d433ea50bfc615c9ecec4f8aca809b36efd4866d25ba4a9ae54f048f5523975ecef082d060606696cccd59901a709367371e5432f2d3ec4a95428c291950a0014940b5d546d9b2c015b3ca19ad41c154c92b977084999ed5b4e95670707145ca4bedd1cc0bee5710b754f04a51c7fe95a328e8080b6d556b1eb0b5d09393b0244b322a1afdbcc3b89664b11736b962c39ec6d2a48372807517c7f58512c183651a01a10e5965d25e0330743ea4df887b3323bd0b84b2db7e2fa2de0c47a7a70ad09ba2540e045eb57fda95a2bd331869d5cd0b8b544e8bb83a6e618148023c1e003d099b063dd6b3b835951000fcade50a0c62cdddbadac90e6af142178ea337039b1a4c68af5697347b9040136290d91c8a0fa2f9e8413bc0e3bebbae45bd26b40f99cd10050638df2e1c906ff4e9e30a71f00cfdf03fb0d25e04e952506987b801cfd21ac29bb53bd21bb1feff626c41e8b8d294a507cb91e8cdb832aefcdece0e8e0a1a0b8e9791d7036870cf48c9c7c459ae8e065105afa7d86952c209bf08cd3807b376e0a7f23c4442ae5d275cf41a74c111d008648e0175c41d8b0709a15c13dad1813912cc3af43e0253eabefdf95b8728def786165a730e26410b18843204f525ce64c2cff3f0190a09d4a9d7e583810013290a261b2ece1d4c9d00a823d1b2478fc642215b430b5308b07d0dc64429b34538540d2cc79116481ddee0337e9e7b4b123c6df3689a06bcda35bdee5231d5b974c9a8cd10f047960ad4b5d2d50b93b9d605e092c0eb2817c266e70667b15cb13c755c3a5966f5d2b8b55e998541f0e7c240da2526e2e70a0eaf319264298a27bca41d2b797a3003cd69a0d3a1e71957b3c2d8c92c133104e2cce80bfa63ff39c211ecff040339e5c44d1a3b6d179cdec6ca53b2a8e89a5919fcfbd2a661bb9434cf71f6fcb58136864de0b957a9dd4f60732f726b056fa555e4380334a0fa1f772477a34e8733ba001cbf7484641a0d14f3f02be186a1b8199ae392d83c6d4b7137d9a6fbbe0195c9fde6070f386a32844fbbb31000e35a0fd894a0b54f85d73314c8904e548dc90055ae008bca3e3320fd00fc5c7608b830242813a657891ef9252a1a9c179e55ad6fb6b4b09a885c2d159320a538d43b7005b52e3ed58f38d4046e352054bc652c0ae0172e7e75a7cf117357e4eb720492b2b6923ccb37aae7970e480bc243c38112f72a371ef305edebad8d8f012692772c6e8f03d53687d18ca29153ea9c5b1127bdb716f1cfaee1073cbb85b731c3ae6ac66742fc07d51e1d488164a093b296e5fdbd30ceac48f97107d143bb0fab4b1977a10dc79699a346d45ab1efcae80f9cb686c13e8a9a9468d5e1a70f9012c280c97ad42741f103d5ebbd7c3350be9d9ac7dc71607d3a2df1e95f644d908a843f914325d01b0f098235495a1b16097249428943e7150fe7e669083336aae74ddf09c8e5d61b99bcc6647c1025f5ec00276c9b49286b3a58073b057dc53c8b8d5b9c97edec8ef55c065184db8ba3405545079885d5702a3a44edbcc63f7398e6a7c5e94b2d9a0b0a845c5a8cc4e5b844e21211368c73b3e10de3c0b15fa6af00e922469577958042105d2ee82ff808f3731a6921c85ffbb31d137871c4cdad0ff9fa1df0cdb1c2a4a99f61e0c7232222f232d0943111c82ec54532c678fb5baf2eb43d12d0d0e888cc8458cb9a53fa764306261aaab8a15a566a5ebf792720633f86dbd0974d9cd95fc7ae40403cb8bc5b35a5cacd239e8b18f9f92640b00061fce812aae41f9be90f33752ae822461d230e41899fafd9be43a2b19308f5a63d472089a7d4b451cd57f1056e03cbc1c98563ac209961accbb2ae815afbd3618dabe8a42b615824f70ce2574a749586757c5e4000d4f6eafe48f0b41540b34728437b0672e9fa01a0ba7c0a23e6cf3fd10474078888cc1c7a0cdc52d1302b2b09b8b226e3c7a22213779f5a1492a8e1b035b024a1be8b405adf5670af2224c18cd9a6f04bd375e834442b004ac59d38ef18e961f000c8e095333fdf4f692b1b3c23ec5f824d72edf33cbde8f8a810df1554acef9890db168c58f59a7d025458a03f08d81494d1e91fd719a35b2849c53982484adf5bc33d69947c04002b437b3bb345d6c6c631779b038e33167785a88f0a0894f697386e304c9a334a1b033c80de67654ab2d111864d1af9c6d721c37c31c6766d8bc3e58175ec3709b02813c8416cdeefa5eac0e95a285822157617f60b4f1036d6738a0ed8046b94d2eef185f4261b667116da5234cdc0111d51a4c835fc5d72ad20492655b5bc721fadc5fb620328c0e1b8edf17f88c8311ccb55c32885c730d6cf14baf6e8202d24b8c041595fbd9135f32d6839e23073ce25f56cf4f821d4d648110046ac1918e50012f533ab8e79a33df13149f4d9298b196d528cfba5a94fa1d1cd704a04a45511445007529b14786f9cdba987e14cc3cf454a17404ca70018b9ee536d5a8e2ec1b2e492eac836975d84e511a70076bb01ebfbe8843e5766d89dc69da1d08c04afd9c07509731332b4d2c93d7edeb3e93496ba819f4431c11cc230f0ce43e8903005e90622bb10de927beace5459459d327db7c2e8791dd7b9a4df003d83a0aede6a66b05f66b8f1de8f39e128bcb8975cda34430cf2c9cc84a3658d33cc39fecb93f20cbdbce73b996bb0a699e5dcf0586f883003ae5d35d02fd27a475969b233d84792ea7886c4bbf5da0ec38510dc02c0f9530a2c8bfa3733ef54ee914b7d6e34c7ad667a1f215d3264c029f86095f158973e4a169a9e22454191fd6cc47b8aacbfb87a0048472a6d9c08cce39e209732bd6ff494dd465864a2bc3a16ebb3edf1079fc2557a77a2b712dfff47a0f211b0725ea83911418a741619b513f83cc9f1c0700054780708eff112161cb178f97a237162f6904032aad145048d0170f1340c7e747ec50108fb401c0f94110462af1b77dbb72b9f8238d6b308742beb1cb704f32247f9243234199e8d669cc0e4c2ad72f4af0d7bdde2265bc45191ed0971b454afdeccd38f80d56311fd2e3649d363f263dbba69b1745898a3089b2b4c5d55173af1cd73e5dd58b7587258983cd6d9c0bc921bccbc5c658034d9451b8ff70f6c657bd501db4e080dbe12e4ac7270c4eb7f864ae152d3e859c141ff2cb30d41c1e57385cc820d31ed9c66c3671b29494b8a937ad41477bf363236b4fe3d3d438e59d228b9efc58a5f3d5fc6283e1fa98e3571f112491a1febb0aabbe10216faea8797199b0978b3e5aa261de58f5db4bbabcd17da742616e32b9f166917a42e13fbe7b3b09fe8f37e84335780f10c0f68414f3f6d0e1f1aae6721ac24b60c50564f508802426a1b194b30077c04c25fa1ec573ad00e8cdc44a293e8491ee12341750087b2fb39015b61135839914a243405e67921d8dd8213a1268513e839c41e36d1522c91eacdc419dd8c8310a91d40265d8ca227dd1bd703a8e00b1d4139ddb1a1ad33a1c8396832257e3f94a8b9c3244918dfb5a8834160e42c3a6f22a1dc63dcb59374b4096fb72978866b91006dc920a525274bcd43ab7f336a03cbc839381f10ea45a7907e2c0a7153801997446778fa548c96b483e9605c252fde6895d5e4c01337c5f4e35f8fce31efb7dc8ccab822fd4890ab7ece32e09d3584c51e37e0105059a306f3bc0f5b6dd0a8ea0345f4fde79ebb048e1d801200f7d591bea8eb335467a5538d6669020428968d2a5593ca9252dc871f56eb2af16b8e9c8c8432a5cef502e1cdb7d0dcde2330d4444da0637f22f3eac8b81cf9a1798f910dff90b708d9a965b36a6c3980301e554631d2996a66f704e79d9d8bdea11aaf6536b412926036f6e3dc285516c2a22e51317cc6d6f81a602931d610f6fd094385ef486d3c82844284a7a8a576fbddc6409c26f00676f4831db9f4b830c40d66430c0797114573bb92cf47c5c811db68076d10c8d99361ba4236ea11d45b37d603ee78ce11a06001ea3cc65befc51211fc28ab9667a7915aec835d19fb93293e4693290a3914b2e2cd2a650803a6791d5dd327e0c3da53479a6252bec8c02f8bdccf336ae84b6f784fe6951b92e03a6de28e871e416ae37bb7d0536e15b5a2324b4a39b7ff901da5d0a060baacc9c5381962da56de8a1bf2f7b614fbde3df4fd29780029960a7dc24a0f09567d0eca066d4d163662672a33a1645eaeb1a3f77c64694748aa9dcdccf356078b1c980c835bef5431b6ae5eeb7da5f918747d5798bfbfbfa031801717039e6d72bae7ffec002a027aeffffc003a0e7ae7fbc50f9a9f08037e40860b70621440e26f8fb5f2fae1f0f28c97ad148dc669f4d33a98cb85c9e2f370018a50f27b9a54ef7abaa9888afd6e0d58f79b70200f0902e81bd955e851fa99fccfb57fe4c570aec0110381f6b4572144a432dd76e41b7228cfe454a1f22ea3d526e7ffb34153683a45820d647b5c8dabb84ffc9386eb149d71c657ac0fd4698f7210ad65845595d9bca44be27fbfc38388ef8df4fcc2181be67dadc8577535f3eb39c87e0906b42423096f4274fc3563dd243612974d82cccdbc3af9fb4ef575492dfdd751403bb23f9b05f5c1fc4410637358a8add81686ad07f0339f4f4267243f4535e8d73bffbe6c867d63b443f0db6a3402f02ffccd21333b05c0bd1f78af61607b83dc314bf12fd9a5b66169f504264c0031742f94c5f815fa9ffdac4b1dfe453ca3b4b585b4b3ab3e31e0edac1c635d23ed7aa16fa0831c470f623e50a27014e1d6ffb017bf284964a664d0e19dc1dc026075397a59c3632b110e4855086960368775e9a963b7105635ddb5f9e752b17b77dc1ae812699c1aecf0f2c47cb55c1bce5fc5ac6dea496437c1f94d1e32519a0b7b1a04f74610eb86333b4c4aa6b00b57ab22a9623b10c75176632031ca0099789876d32437bf608ab30970de7805a32d9f160c8ad0cfef15766914da86138f90fcf5a9a640db4bfe462ce2049bce547512bc0a8957129787506932974ae376c96b3231c8072ab29461deddf2f1ded9ff780e501028e11e8a08959f3baa0778f863b710f84df7ce898b87211dd3b843e096277b66ae2d47923ed05fa07226fa61022525a1fc4bc7b233f86f0faff21fdcf213c5074ce8e8e0b463574d5773757c6c96490077125954acd6127f32b4d91efec0ec929e812ee4342e44bf8416058f9129617066dc21239206901db096a7b3bb24977e1249c53284213d13a4a8c4faad22bc0d2af505aae5d9eb9314cbdbca2b0b63e388f2313b4f8007f4f440d069142db80163b417e2adfa230d4f9cac1c49adeae076af08f6cb0e99d3ac389f37d267fef0108ae56cd7c3fabfc7780ae5158bfd7c77dad649eddebb4b2ec5c48af681aba11bb4bf68d221ab888d176822e02bc5ca5ee0dcb5b966f6ccf5adeb1fa63f1c7e62ddb1f966f2cdfdadeb1f84b27e958dd49078154f8f01ba8643a94d7724944a8dc722a7e47be6621272ffb3936410ae85f4b5d951787d15a5244224f1956f31598e63e4b77574fe3d7834b782e315f3570e0016df45c3a18a8d4cd152668ba0f1bd0786c741212dac7c8691342db89a13141ec684687d47774f4b230a41f722ef852811d74be57e50babc245e443148680a8510fa8edfb5c0248c396832f32b41a2a2d3d162630958ac918ce6b1400b5262418b13c2d2b64d119a3a43e0789e348a45c0c94e406c2a2483d4791806214717aa01ecda73f94dc5e17d958d8d31ca0765892ead132b049a0d2bd2a0675c72d73612e0a4b5dc60c0858150e44118b763212a1a824825d118850b7fc59e77f9741a944267fe9cbda0e616fdfa0548f18a6029d877db432fa9d542ab8b7083e39ab76d2d0ff0ff6751bdfff4b5012bb73de9941d741b36bc7be150c4c777101707fe457701900bdf65cdb1ebbe654178d1f1d8e5eae3ac7af9b2236a2b4e11591b30a7fb309a8e39283e076af9331df22353730e39a18275736940ea7a392868df17975fd0300db9d5610b97150a502394786c6ff6d93cbcf769ebc3397f0028c5cb26e5b8b81082de37a89ddee2a26b2de10ca50072aa2eb884100b311836061ca6c227bdc1217be229299d5f9db364c1467f513641d3fde012c078200e22e0d108e04afe3634ead13e7001c4fa199d25c366564514d71b3d19904534f0c1b87f654d6d3e729f2fc8af3621d0aaa02837ccb5050ac9096c26e4f34bcec559e567abd2e931ff63c17b58f1cbb4da54c367b9cb68ed61691046fa052d5b0770d0cb92be5ee1c34aadae4a7ea2455fdc24d993dbb19eea5c7d2cd2e300d3ef2638cf8c2194b1af3a6e28a71ac1774f9798805c3a61022fc8761a72dfdf711b2684777b18214bcf4ad21c7b8cdc2f65a87b3bbdf88286481f5e64f0a6369fa11be841649e1b282e96ed9a739a879118662b4b63696c28284cd24718c8981cccd5ffaee4ae58b7f30ba85b60633b0e89eccd53c4a5a7f5152ac9841dc34dead9c3e0e026af9b0fdab82d76f9dfdb1c7993f4ada72606e475505944aab24954292e4140d588efcb5bd27dafedcbc4491f70c1d11314a4a599070d8be4ee599969f3a178242b85b38bb7185e51ecb3e4d1811a49940128a3b23c21ca9a560e7248d2bc076700e69626328ce773df27fa3b07897b54fb30bd8c363c0cdf34509b16b4bd663e7eeb96f0dba05aca3799d0b72058411ace24f5a1244977f09eb061751c2f8259cdcb2332ce56c05c5e960c4fac6d6ca296873c9145dd1ab86835b46726c98c56c2202d6690d7f00305b3fedd4761fbb28f5a0a47999f335e967da8e8c95de925a6ae7640c9797dc5ab7b4ec8dfb5b5e1b3d12b83847459f5a80b0a195b78177820ad1d3b04a47bee522702793b87d5cad881ad6ae7a3ce321cdac4e9d20635b4bf1baa81fcb8e86b35db76b077adc73e6b4186946aca820863a1d3b1986b48e478dec28c3ae99417728d73e7534699bcd06cde45cc97807f5ce71f6b076e28460bdb5ccae58406d7e57ad97e00f13378425f045e5489df6107ab219e0731852665ca3ccb82a0a043742a1a262510a705b1395e4cfb352cdac4aab6deb2da1af8e35ec1bf99f46e49fbbf88f705d4963514821c3456407a34c45a64a362b2f731cfb520b30710f441e18366dcde3b09ed06dcac5f5841b3dc54d5970af1902716d2d50537e1185f8ad0f4a4332c5158eccfc3b972048a6e8e0fa1a18bcafe789161a487059b82e5f19421896b70b65cad2e61e949d5c66cc1fe1b736b51135752d3312492ed6a7b87d7a027b04d16c03fdecc0448aaf211f6a4c52fa35a3d9d82511406b59c8367f8d1660bfa74e0f54623a5b48e7c2326813beb221aac16326501c91b935bba3766ff0881ed8965faefefbe29f122caf366b3c5ddb06f617a04decb0742d3b30f29429eb3b4918da57f6d0aed864341f4972396c088530cbf908d1fa2ed5cf67f76f2bd17b584bb138ce5e151515c7fd4b6e2d60904346d1b4d6d47a3abea5092ba05aeca3acb14128e6192298b0db807af71455688e41ddbfa96ba719ed033ed1da038cdd22383e262f6666ed1e80db20ede721eb660588018cbba66eaec63df371b56c216e41e7c4de475cec0e5e93278c98ce1acf58bd36c0d23f54dce3b38382649ab79e6b9ba989d8da318fb6406770e947d6e6b31fdea546d010f7018c0926f971ba1fa53a0078abf417843cbf87b24fe88494ac3e635895704b7767dcd8e1f69690319d0a98b2d10479ee379d26dbd5dde875c2fe5ab277e646cbb55d7e7fa819b130a3e07e8516756d3fee21ae1aa6d1101a3dbdc54c461d0d6d770a0d55ac37b9e7e41cdd39efe1339d43bd5b9b586d1e3e5fc3b4a0022593ddb5f5c0327634385c93ef82d48af134372ee082f05e984117527a14e71cb59b1017679d3eaf5d9ecfcb1f57f672c9247a2b9b5012ffda9ade661cf7a6d0e096be446153649371dcf34a4ce0f898ec09f9c834b076e58409f28dc25037b8a047592408f95588606d09ef1094c281a6dcf17accf65df43581718725b3e680830e1a874baddfcb3e538eb6f7eb10b93ec5f01ad6dbe030d6dba9b8d55fab7616046afdefb2c26063233bca4fcc718774d09eeab6a8d9970617c22a82e5ece301baf8939c20611918d88a482920305e807a4ac851a7776170f3935238dc263d16c7c1fcaa724f56fc4aca606c9b1b401c4a88a6e5aa6690146045c38a3183a367bf9e5629f928f18355a2713c940b0be30f7ca38d3336bd76b91b1c4147d21b6754645a9d7015ae12c5474e8809ac2a95130d5244d2deae9deb260ec132d274b0de178588a42c67edbfa79a75e5245df64a557fcab0c199e779bc451b76c91edc63f1e8766f4192862ba1e0557f1c794de9e146807765e3dc72b1ecf0f43c0080c1e2cc416380dbc4116739685fa56f57f08affbb269a0be80ba6a3fcb2bcf6041a81ce94cdb01a503ffa75679e90a0f90cdd284be4593790fb90ba1b82231d0152368910efd4d24528224e8eb006b48d7e98e582188a8b7fb7587eb10e567b565324c83a93f329b6cd33ee67a234834105d9e8763e380c0c7c7e821e4a66b2fea12e4144310215af80463aaa243f16e20fc2085454ca56d961007694c19b299d481eb51e32ad41c2c081be7247bcfca7fd1b116d601b9c0240e8b0628871a22fabee7387cd116f86d32d1f83ab5a7de6adc9042db0d536d7379acf38eb3eb2e2252bb7c1bde438ead7d28ae723a08f9a4a19105a235db509fda981ee952f3062087a6710d02ae46d82c9cd0497fb6f8ff8fc1a1d025179c1a23e72614f3b0f042a8eea9de05c5861287e774787d56288a101d74fe6eaafd2df91568c91a990561653a5df51703bad23e0a1eeacbe85212f830f9762f3dc79e9b5250d30ee6ad1a89d6fd01587f133f1a0f1e377305dfba84596ac7840041437ab4c38cc730b0aaf025ec93e7277681de487279dc496a0669753e98a6b367c346af325146525c267ff8064676ba8dcc27fb84a32a2a30661edd62259a46bacfa2b02c78845dbfec490e0acb72f4b23c58efa26a6fb5268a9167df0410fe24ffdd2a9cb16f98ae7d5ac40d44342aa886fc504f53ca6d1226157845e066c91b9f94a92176ca63eeae17387376cd796c512a8e58f29b92b162cd52844a1d57768a2a929a1b620ec4ad165a992f8af6cad8a2e8554b5416de77bace0a11b4dba882fa23be4e9030ae9da915720dc15251dc18a1bac6864e13802a6ecbcc794c838586ed5e5862a5045388e4387f95e4c57550ea162136380540ac0101ccae4ec60c03503ac4cc081557c7ffc6ee437350360df506bad11b25b238434b237d97b4bb903220991087c09dd36c248a47a921a75b35ae5ba215a5a6e8539912a49e5a65a4db554b22452dd5e7fd54d3355be95eb7eb5caa91c66f5a47ad2ab7daf512ab6be5693f5e1ddd1e8243bb22e8dd2fe4621912e43dcfc6c9f935b399148a48b61d89cc75656b6225b1d69df6657e46a2af5ddf6155b84b46df6c7e8f5a39f9fd188343aa9907e48456addb622b72b4222912889922889442ac20292c2a2635c36eb3543ef669671a6cf6b5e9f9c0ac947f6f9bb6ddba6cd396736c4763dd39e7d34622169d7b3cf675c37c4cd56b4679965b199fd31baf6d1b5795d1a12c9d911d21a4687dbec9048ecfad4ec689a42a66cfe7d85eb66165a62e34a58ac13ec4e3a4cf44bb48629124d6ec301871b6eb871a3a58585c5868d9595d34945c5642a9548a4d168db34ad56912814ca320cbb2e10c8b24a25db51124749efe63d5df44eee50ba8ac876d52964bbeace93e69d7f2ab68b77be1c24dbc5bb5d9330dab7edf31af71e6a0e713b2492081279a7a669b6bb461a71db37facd12c1de69160910ec37747d081b5a16e0143446c7b81109fb364f9f13fb66fa66aaf3f3dbb552e92fabe7d1a563dfb677e6631e331dfb564dd8e7b16f739ab097ac8a1315ab67c1ae7dda6a5930fbe3268c8486e9b02b8286a699b6d1bb78ab673fb277cd82930ad769b608dfacaca0d13c1ab75dd3aa253e444cd608bea33fbee11b910572852edf9b253e2b1ccdca0a9c326a500d290dd331ce4464fbe89bf68d53f9ca356df4ada62e36b1894d6c62d3b254fb8099ab7d3ba6f2abb18d5351f9e893eb82f8d83eaa1f515a6b77d25077b290ec03666eb5db4741eee81bd70599dce995eb4657b12a4ed411cbe8d835dbd3b28cec8fedf5dbab362787846fe91763f5f09dbadbb134783456d24ab6ab9b6632a5b693d2d890f065f9b19d7e3b2d822f12be2393ed66aee91ad7a5aef60d070e14cac5e577fbd55a5aeef6d730a4974ab63b5dedf5d576a7bb95b68df41269db48a4ad0b623ae91789882935ea517a673fe847bf46dcf6ebeaec01336de2f88eb8be6ce2ea61667ab55dea9ace038eb8be26aeab073d663efa6e1f956c97baa95490e6c970662563cf050f5f1436c2c67262e41dc4ebd5faee3d8b51088fc5e50b858916574640420ba130a1e272bf0eb934aadf33c0428b9d35c4d859830cfe73e12c50e31896b023c510c9154fe6295f57d5c51d23a961ba36aa27335bda28ae613a4217ac63c70839da287e30246d54a3517c4b09f03e8e76cbf88ad4d29ea250a474032e42bafc335c8f4f49769218d13142c4132286c8196208ce90203ef0d89142fda03ee52729a7ea53b97bde0e4f65894aa4cf35b67b5e0ee8c48e1a3c33902b26a2c4e999d223a5c7e70ea13a95fba6a515b56b21d0b414fd12fba65191716e3c5fbe3ee0e8a577728a5c624a8c975b78313cc50c53c07063df48299f481d18a369e1c64b3198075a2359b004f320ed143528d982276f206570e3af8d63998bd28075f09f785de383cb94c5e8986db36d03b79a29d25e11c38131fcd354b40d7ce137d1a979c239580881a707728724ef300ff4f12c4648f458b5c7b3145ecc83d44ed171149ac9b8f11ce5562c5456780c5f0c4927419880cee43af611d7387d93c350b014522e219798d4025dd8e953904edf31141638fdba2ed38e1c10e92010c8ca7c9c1aa7a27d53d979134fdfc99b2174d64abe924bf48dbc914bdcf8be8131f346dec098137c89a73730de24a1ed8307733d148d81ef85522597f6a86ea4a5a5a5a5a5a5a5c5860d1b366cd8b061e3c68d1b376edcb871c3d6168e85b3c155f176109920065959595959595959f141454545454545458587c96432994c26d34945454545454545c5542a954aa552a9d438f0a7d3c65549b59bda38d59ede8bbc9452b648e39ecc8fceb8f95eaaf75255ef6a456f1a076445d139e89b9ea2ab68529a912d8030224ebc7987f3c69b9cda31154ddc78661269466954eb4fa68b5dbc91e2808ef262829441c68d8f57783c6c8075f43c18f9f828c68b09bd8b5fdcf878c58bb11e1f91f0e88417a71071f062b2c7c79bb7038599efa215a2785365b66dfae6f24355b66b1c1f2237619b2b6aef342ad2f034cdcfcecf149d29529e48f1c9f1e9c1e9e1b9e1d9b1d9d169a2f3a4e6090a204d0ece0fcecd941b1b29364d7c9ad4f4d4340f7c79f9027ef172c4c70b7b2a0b7b5e8e78a68937f186796e176fe20d047c985c900d44b1270a011971e24dbfc4ab51a7d03ec596c5e41aa6e12117673cba8682b820d6dd19104fc63ad77013b6f966310cc3300cc36aaeebbaaeebba9ad8a444229148241289348baab5d65a6b1585321a13581cd3d4605763b4aa5e3cc5300cc3300ce31aa6b1b8057c02cafc297be5e60438f7fa0587041902c62378a761ba98201809c7a5e72c640b6ac73ad4f28e111883a36165a5ed9ecf0de950b1777d457f0f267b87e4d22e090f10601df122db1d89d961bbeaa946c50e871c71f3bd882040dfa8be27d8ed105dc9bd7b8471e800e282342ada8edefacc7cd05fe7cc0794f7a1518c55cf9e5922f29585408759d9049886868606b343843031ed14a73f3ac5ca5f1684f498057145d2e93c1aaa1c9a0e3b0be2ea0c0823343434344256cea3f97cbe28f663e45d2b46238d8aef35d4c71304c6acd85a6badb53e891d43344dd3344dd31e3fc4b66ddbb66d4f6287cc562a954aa552e949ec90293d46fb6aab891b427abced90483ada388dabef85be72a7f74281a0007d7c10faf80abc9899015ab13d45ac352cf0cb812f07be1c98f35ee221ac2af81658aa41eda04f098a0adfcdd330ca6a520b7461594874d5d1086b8e6f95452c65815d2ad7956a54fc8ccc0ef812df2ced43a362101fd1124e9407343434a515acf444e90916acf4440b567aa29668700356a2010e33a75fa2ce1b99d1373438300dfd7ee4a0ed1cd8052bcda0c23f00704a92c0177823f00536b90210da023ed1b9d007fa4ce8b3440095000480a2612458096ec1c341a56b9444bd2644f1c9a1a1a1a179390de028f8128f4d41002498e508df27037a0e34538acce9887ae1c8c9c9c9c9e1c98d148b1cd0c707fa1420c486f964e64c254c20cc204c22144016007bf0422937bec3626443ed2c1ac5bf74bcf81c7984dacd26537c6613a69938f366369936950966cda499f2a3434aa803eac0600549b9d309e0bbc0540afaf44bbc01b21ed0a7d9502b2d7a84c618d100951655165d60ae8fb58ca6908c1b3b9ed28ac7869b704d2b993b53673e81017c2b775d04fac4ec911edebd6cb53dbc6bb114e9fc6818280b0ca46918280b0ca469580f0c748deb341048d3b48338eb3ca0c6f5f02e66597c68efbf1bcaa2d6898416d77a7b5189f4ad77fd77ebb1147c7a24d4b8f4165f2174d18a521225519691cea7734333a8423adaa28fde15395d6bfbfc9086a99f5d15a2d9ee84d9ee31eb51b70c089f1e94fd189dda8b69a494444974d46fd943e9221217b2a9ddd3e9de8fe8100a93252e1f04c5ad6420218605c292344ce9f34a98e62a71bf19f7fb5ee8d6a9ed6828c97b990ffdc2b024f3252ef412d759287be8cfb4f76b073aa518117774ca755c77ea61fbcb7ea8b6df471c11cb16395d900f06c23eb43f999aba53e7ce791227e266080bcda076b5c29824fd323fbb979a50abcbbf8d992879d52669982a6544b63b8d6cf71f5a653dac2f2a91fef6ae2f02a27dbb202602d2df5eedc6b1fcd86e7da33d8c2e7a77c4f2835ebb237bd0b5f3686be334fb1a957de0743b22ee658b9cee2936cca4b44ecbeaa25aa70d43a7d5e308534ef654eb90d42888350a529adbd9da2888f1494e880c3932e43322438e0cf98cc89023433e23466620409630e0974a7177109e86f2c13c98186969c98ccaefa2bcddf24912493e7e32c2f75e5b50da5caf9251bbc696008526b7fabcaefe357fa83e7df0a545208917f4ec1757178c37023f7efce0b7ecf395191095dbb613c105dd191edce0c2ee07f6e6ba19255c685fc7354a7d504e70240c24c61e90f0ad2cc7757def4e1a3a7706c4b20672c366ee862dffa3faa06fc90121123db35debceb320b2ac61ea6aebf02d75e805f088b16a7a24f25eb1aaba0f8f28796a5c5acdeee6ba78d005bb6d170fb2a46555208bce2c5445f60d2184cc0376c47dcfe42f9965414c405e55c6354da40d22f4ecd1daa4f8c66254d0d0399b8065e9a735ad832cd0b9ec210efbe4ac83b8ebe2e6f56995847e81283723130285e867c80a5dd6e78561d7fc0502fd9a1648febd41169dd58d1c29826340fc020f026d1b7d398c20b510391bf2b220b20964afaa20e804a83d5d1607fac5593c88ab2a7b3566cdc864163723f38454075d94b39e09a1b79c448e7d40d70502550759dee19ecb2ab10eb2d51fb544f0e521941b622e2193503b9a73d9c8911763bd17784b83f0f4e5802f1da1f23bda4442b962c37477676fd411f0ef5e43de7bd0fa8f7a2d7878ebb23820b2d7731644f66a3b14da11bd1e08d1ab6d1e20ea35db3d5648a3faa9db4ff950bd7f77340c11ebd5fb3a2ca0dfc92391177445c87594c2a7e407086f5d9fa078af63b738d8f356d534938330a99675e00b9f89c872c8724e6619075a58d3a8c6812f396df3b21e0f048674c2f560cc83f0ed6068597c701018f6cabeaae2aae257d7610cf69e97ef8a790829715b06c654724eb60f32cfc84c6e468672333287313332a819198c9b91b962d6832f85c85b560983ac4bab4472d7419c12277c2742e674c27f42409f56c93ce816d73f17a7c449bc9320d42a61197a21d731abc4fa65db07bef41425f420db52321f7c81b00e3a67415807594a0fb2741e7420e63b08f9ea4048cb34f0e512c119812ffcc925812fdcb0b2b4cac0253a0bc244befa25e273aa7de00b7c43aefacb6a02f8cd11793a140a179423706c8ea88142f3e32277d890b7315fcd4ab6ec962c3eaac7aa7a8c96da075f843cf8d2158937edc525aa965c519f8c901faf6027d74355335df4695da56726eef18b7c897584300b9297b188ed8ad82b7f74117c2354a20d3c970f84e5bbf22f8aea1fd3d0f611e958892371fc526d572fbfb08e0cbb1a64359d5dc59691c3c0eddeaf52102a3c1bc15dbb7f2e124e8de7f9921535feefca449a26caac4f3b27358db6ca7a5f996865b3b8c73a2afaf71ac27ee0d1dbc8a4a2324d7334b7392b0cdcf9d2a426154a29a576fef928d94b8dc0c18274f6958928a5748ab2ab7f945e7d72f4d5dcfee6bce98fe755e64fb3e564b932591bd55738d2373b49b7b8f7b29040df69bb99cb27d9ce5ecb2fef7200f7bd1ee0be8776b8efd863c27d07f1e88f6336d0e91ff3c0312bcffe38c6c6457f1cc372ed2cdce39791b5c13de617cb76a7c73ae87bb51d153d7e799705fdc09fb63f60abea73da80567f5c865b5923600908957f70972f495d12c27595aca8fd99ce62e05690e37e1c70b8e1861b375a5a58586cd85859399d54544ca65289441a8db64dd36a158942a12cc3b0eb02812c8bde38ef750c143f2ddb45ca416646bd96c0bbb07a67f64ac975f6be33b4200631e167b6ab55f48e6d70af3f86611c1adc07e55e8d414cc35258c6e2c3c7f59215427a3de3648fd945d93967da6e47f6ca76a9ecd276a867d76c4ed6a05ff791fd1ac1cdb297ac1052f6999b9b89387e37cc8fcf46b7d63764010b5cef01740b58406b118d94cbc7aaed2aac39ec8fe33a1094aaa8d84198e807be1118c3392fd230da31eb633ba6d2447d645cec1a76cec11eb15bd829f689bdc22e8320fdc197f7b810d7bd9d1fae7ace7ab0f8b87e84db7041172808d34b4190eab1cd767c03e2442771a29b38d17511a7d244ed6e7ee08340a59b2ea464b25dbf0b94bd66af1732baca45c77aa8af17e9424c2709215d4564597c849e8532ec2c1330bd7421a6127621a4117610f74838a8a05fc7b00b648d104285dcb3d3b10e3fb9718aa8493455d428e5fbe4e07940d9bd17e11b23f872bfc8816e71d8e43abe61f1414fadbc2e04745dc8cc1477de3a0f18b9be93eb2018f79df9b1b22c3ee4a3b445b8ef916502d741177249b9ef422cfb02d9b0868b8bcbc52636b1895d0817970b21848bcb1a2e6bb86c9ac954c48585650d97ab7d13e276455c5c5ceee2e2728bb8088145719d715a39e38cd3ca8d2bb9e18ceadbca49a545635939a9fcb5d80e75b793de3c2c366c476dc876f56433db9d6cc976475deda92037389a1b37208d4a67479861861966d4bbbdaa413ac69154b0d763b3f47a4ddbec03666ec96e1f8da666facb30d36be9a3d7fa8dd25a4fa7d27c9daf9ff3b5d6214c56c5895a59eab54f0db32c159b53458d6d53430553b1016f36a22f773f723fc8a4534b3c01e770d184a5255d2fe86948ff7b8174dab803ad28638c34debc17cbb22ceb5d4aa3d8b21e75e0cbfbb3a048136b62936863f94899f2437576787ae0cbfb71a0f5046fe0cb3bc6411c0ee640cbb2200d84d0e60469e4a54cf939b54ffc0ecfa975e049925a968c3e35f234c99ad6e92f8b324ece939b5bf444e7ec1a2a6d9ac63483eb354c159fbcf50eebd730f48adccc6d8ba31783590ff9683d750cd3bc51f314de6ec96d09e45da10757e8c1a5e7d1d6e9f6ed73334e0167ac25dcd1c9758448bf8b2c40e2ed4768233f0d1e4972b907998f387d72b61fb1531117e232cc7693462cd66a9568118b20db558b077c3cddd342bd52427b18532f8f82314f464a18a1f6ecd9513023935db34aaa4de2324b18017d110c45dbd11d300603fcd2ff422dc3ed67c66d2158479b51bb7a9f18b73fa7e0f8ea978d1e925e72f4be0c48dfe052b645e8f653a59452cacff368961fe89b4b6d11ba9dd1512a051543e9447514d77bcdddb673c86062e2123d66d823667123779b8370f29c737634fa800e903ebc570f0e719f1047b86ec79531eb01ad0e8d7aef2da8ef1374319b5860592616609605ba2e0ccbb2504824aa20d085c1cbaa638cb1eba949b551db756118b72645ec18ebef3c05cb0fdb82c4016ae45f15b5ddcc8496543b2c368ac6d4234049411428292883df0e20e02bfa42e5473f732d10d71657c548bb8b156801082788421272a0831f36787155010a43b04118d0d8420d3438420d1555f08130890dbca0620b25a031851face1049f9d10197a30864e185f34318427353d8052e30376c0101f28354caee83e284aa82195025116817eece2b49edeeb1b9a0322e49cc10a2f62f0841a6944c10330441105076970d266d8c0011aaca88211a8200334c43528f1c5135d1ca1270a17baa9d03d430323301186246c8109cf0bd2f8510630d2a084315411061d74193cad469b810b22c0b0c6136144a10d6cd0896898a1055f44f1821376a8e0a29b0ab19b8b6e88444f55af4419b7efb2e3f74151a20b25a2400523379e542f7d31d565a3ea650c498c5dc5f55c481142d850cab8733d975955a49fea8b31c62ace18e5ab4806eaa77eb6ebe29c1345293d7ce14b4a79555555e10b5f4218ad182dcbba3090a42aa5941206eff95ca22a1289558c7fb7aaaa58c51f3156598c97312a915196a0ca7ec85bbdca7e8891d2eafccb2925941076a3ba670a2e8ad54a5695941364c4ed4b4467bcf5746048ac0c04938a8026a16bb041852b526c56f15cc3ea977c392a12dcbe283685f1f2e9a04960f643949608687c3174a419a271a3c261f3c5000ab8fdcde6743a4528dc7d3fbde57403c65b7b74e5f6cbed674ca81d65dbd59845a90f8a123bb06b703d978b510f60e6a15970e107c031dd1b230c7ef7aa70801d3224d49717f3e43b2d01d5a8140ea85d51e55f204485ac80ca893597a8b337c64bf932690f7fe3924b445ef211d6d12d89ef3070a3a54d049d4baf961309565cc194c45297b98e52caa76eb803a22e64baa3510da5f22593ebb95cda15b5337bf955ac22fc33c23c842e8f9d9746e5135cc82ab8f09916b57b538c20793b2479675cf8103c1e2afaa628a1a1f62f120f6af76ec4b42b9e4e29a772f6a374e565117be5bcefd9430f027b7d8fb2f05fc83a91bf8c19879fd98ba46e65e9d02ccb38e39e4c25637147945cceb993d2535b6496ce50a3c46ce08991c3272183096b57d4d810ab462213d12858a451994d94beaf079df18d2441e203ed8aca116039c277871477077923f049e099065e1a79390210b957693f9c28a308114e2a3c0f187304c2ccc8944c8a273ed86eae072186dd074509151ce12aa25f04920ae445b9cfca2c022fca85fd9a55a043e5ab523a10a10cd394d721954ac1180c4238258518cae59dbefd5c152edcce45e789cfcec368ee7bffdcf7e69a293df7e1dcf74e696854fe6336c3f55c6452b1a2f4f57cca078d893a2408cb684c54e62ff0d4201d43e18b8c2d5eb060455f51cb438271c1aaaae04f65b810fe512e84b08290f4043923bbdc7e65820b9424a270eb7d509230c2ed5260b85e8cdacbd1f7f988ef76e6231eded697e3354a6be295e17a2e40b80db7afa703725beba1a06cd96dad970332b79496be1c9021a4179e464e061f7029e2e272637c3a2e3742a600094d04865d553fe40f11565505bb8819abaa479cf3d59bf276a82e972fe9d4f286997f7741d1ffc1bcce7a5834defec1b7fe5ceefc1f0c9f524aa9cbc42ebccfbe466da051d583f428428846551fd2a8ea190a6a114b44a3aaec07b5cfc555041f09bdd55980bccff785f762cb7ac80bb54b5d5971bc841122902451928231ef3aa512cacf2240b7cef7e22692344a9e724a1a2539664244a5a7d495293943f3a494525ea94649286c524ddcc8276ac4b650e1217cdcf07517a81091a069ec0a15de88060261706194e7a743fe4908a58450460891b81edf373fda5059a2761401a148dcfed5965f8e78ac6111d59174843fa2cc1e2a72ff90b72f617c0ec5762cc0010dc3b7d2808f1547d8c2163f10e30a32f1b5614e59d8a02686cac4e3883246284914a14f509268e282ee83c2448c9b824e50410a632871c60fc250410e5ce8c0e00a4e70a20a27677420ca16a2c059c30aa4f082191b181441891e2ba2206389688603d678011661d862065f2082cc13c30b6c6045187690c616366ab88002d6808526c230052a9cc002085de80013b8d0052e605005109a88655ce03d2204218926585103050e6e30e3848e10d0c822055c0ca1494c0306200bc6708125c280820a240c41892cae907931d8019418ac510329c6b8011a30b0801b30a10654f0e9891285081a68610a27ae38810bc2886710a2bb806a08319304275cf8410d9a90048d0a4a47f8c2a6890f6cc600c3940b788009264851421b8ea0852114a0891574a08510d2c08531a2191e18de7b61b0600d4f00e10c2a72c08426e0e0054c887046cf195e10cb40dfab8e27c4bd682f46b4c8e9d28fa84d9ddfe1b8fcd18f306f56cb82475a1494a0317103c589e472397ab51d45729932d7912ef368eea2b21437e79e8a233f7a47714a4dd0ac0e29264a443689cc6c77da6cf7d73054523659a176383ad2908661b1feee75f91d0be0e1001f2010445e88867119a261b2cb6fa08b74cc93b91a6354c364568eb25f47712d0d23efe888e8666f699891ed44eff8a7464912c9887833fb5e0e3b1a5116b1f6ca94d27a8da3f4954469a5b4d67a120d71d7491ce816aa61ae4ba3e4afbc4bc368d7de2846d2f73abd94585cfa90f0e54b3bd15fa346a379496f291c0f7864923232b66b77d3be9d39ed5bfb5c8c6d7f19f72e8572022d92d09b51aea5703ce091c95cf61017fcf7d2279eac07394cd42ec5359179ceec57363f73e7947032cb8360a00d763aaf0be3188a464166e60921945cc1cb0e11829b34aa09b6e19bd30dd5d4cc2ccbb258ebb42c3fe0279c9209d02d7a1f40201d1cd0a89e13ca3967377d4c4bc48809b2288b63c70278340a02f6eaf1c130944bcba9015834e018f6cb0d68c0cb81450376280f4d6dc0cb8145e5770d20c2ebb0db4d61e44e9925358ad1502f5b2dd628ec0cb59344fa3ce99c53842acb02a489f03b0bf15ea2188340c0013c602865ee973ed318230f1d1d583be584ca3d0031db0ef28d568aa6aa5463ef177451ebd53981e070d9468997d4301633f3b51848bc124463aecb3e883bbd5f8dcdffd44ad28652c01a067b675966bb22a7eb82189fb077b187789165f16886d7b66bdab573d643cbb88d8b10143a48d65adfc3bbf53357c475bfa25f5c48747a11077a889bb91987445eccc217b00ed02fae6b9f0b3a0f2853d5ab5d451123866996758dab29dbc1a722c8b275ae6265591847241e420a42c198ecf43026744a43dcdf8bf58cb35ee165bb13c84e1be44eee0c88e8526abb21eeb496479e1123d6105a5aadd8a866e111bc1cf648a66561524a4c5e59966557765d17a8ba2ad0c4aa6745caa4e632d993b84ce8495c263ba523783960564151f9d5185330ac05b54b91baab4e9e6eb45eddb22c3fe6ad69dfad6c10688471de9486c9aa58035ffad1324f8d90eef69112850ce6e19e46b11843ac1038b4c2d3659e47c68da9542a954aa53a459a0db9a7c649c6098496e587bc44a4c5818af6b50555879e725053411a263e867b301f2954748cd3310e0e8dfc44078b46314ea3a22562c4e59c18816851a97ee9530a5338ad838c49fb909899b3ec3c1a3be55949182dd0e3d1a85e80cccbdecbb1635612460b84a3bbd3e9fa755dd7b54da954b4a305f37017dcc362c487de4c69ada7d38f42a55297a784a000411678f08525887aed9a3581e82e8dcadecbf1463116ad93c54eb7168dea82eb1ec8d32828547ea6c4f55c3aae4d6aa4a8dd0e8bd5ea22101cd2e1c0014195644ae993b1bad4edb8462405d7e8203f8f8231a1679ff4ca1865fccc8d444096eab2a6659260808ce8352d535f714144971c104f46f4c805014da0fd7a8853e244c8f6cc2a619244036442af6199ec9b65894a6a58267496c899c08910cdb2c48b6502dbb10bd17e7db34a9c08a9d7ac92ecf54a4217f1806cb8209879322cd39d307b59ee2695cf355254ab413a9034b632bfbb908f3c20c73757c216c08e9f3c79f2e4093f91344cce503b0e839497430a52204f0403078ea943c3641984100563441bf7e04be81acc5291315839ca753432843ed0674e102804021d42d82db9926fc578d8527647d95c4b2b822e39105f0c64d189a37a575555551584f1f4239222bb2425e324d2f4440d8bda310d8adfd60e01a10ff4f16152f9266b101aae7e97f215bd6b5b871f719cc6bd7e61976b72b17d68df8e856e73e1b38f9a5cf8ade6c26b1ccd853649cda440ae5b726337f36ec50765f290e34b2e8bc23a600fb6990f8c1066521804e2ea1174655c77ba18c8c576f1ce39a31a5aa5d9252e17dada31dafb2e2edaeb535fa482ca7046d41409d773a94b54be680737944a4a8b34aa6ffaa53f29cd8531d86930cb377dd98e525065bbda2fb2997750b96fa015aee752595099ab7839fab4482cbda0f2cda597a5faccfd25234103f3bc7efdb80a975b850daa98d2e47ac3f389404b8770c328ab19250a4d8c421325c3b2ac877c8ca21377e8c581318ffac0977e51e73dd199a2f3a3c3236f7ae40dcf8b91353dc78131510a3ce9d427b7771e1c72ab690282753ad53ac4add95b1659c84216b6d8620b1e1e1e1f1f1f2e70810b5f7cf1c514a630852e74a10b6080018615ac60858e5b74d145173d3d3d5ad08216229550c21d78e1851758c00216c208230c2eb8e0628c31c61043c6d8e76e8e2dc59032cee0ea96f4bbbb9bbb5b8455a11ad137566d03282a10a31445e905f2880765053eaf99032da5b3689dfb9ec354e0bc9d970537c14d2e37846dbb1b8afbeefbb96cc3264e0f8b94880b4a0ad2d0b4d87365e48992c3bb28e5ca77918c00bc8b3a02781777ae3cbda2812ffc9acbccf0e7e4d30379a075035ff82039c572b7e91bd80d180e18f6f7ba539539a78fac00b8b8f35eb814328554423ff0a545b5878f43739ee4c0a938515d9ec3010080e7f00b009ccb7300000002c0451d2e4a71b1918c1cb877ab2617d2d8297c6e4a77eaf679537e4eadf35ef8fc16dbd11cbe0d2b6d604ce4e1af5869739236b7fb46e5c7f4536a9ac7363dda23ac1ccd93eee91f68039fc01ef873fbb34f99fe042000b4894b633abf306abbf9ead402b27ccc0b9d48ae2331c6dbf60e5eb6dd88e36863d7ad5f21166534f6b1635c875917ffd232ceaab556914824e22a0b4d2cd4c56b59c7b8f7745c1c85f6bd1c169c24925d42da7a4ee19a726573e1ed40daa13b74a7b5783b94ae3d07e6d467736137dde022ed847149635cd28e182e69070c98039d704bef29dcd2156ec976f2f39dc5cb517a17dac098d41bd98e6ed606c78fc8763593a1f98c9394b4c309b7a361dc8ec6a886c96497f41448ea8a0a1cdb3bd4e8dd49ef4ea28ad54b228db64ce2b8ac3dfba571d7334d635295f27454e4a8c6686497e0907112799edcecfdd0ab5f21ae39749d6642b8f2dd4d6dc7dc3c912714b24bfa09d69209518cf60e0b3d5eecd6ab137ce92a0a715876f92b93218e18d6c2990feb113e728448642ad4b08b572653dbdc05a714dc3ee2321a97f90c97cf61e8384ac762fc1defac9c6e3057bf9e4c941dbde128542ad5512eff6d3c94f6755dd71fc4c176a71bec0ddb511bbf18bb713ac7b1cc2c9da78b9e8659f90e37decc18afb17373b2a92fc4f2ab318e6b9973708583270e76017b1a457a3f25804bfae83f9d2abda16f5360190d737aafbc1f6bf076b8d184da8844d915413aa56b60ccc9b298417dbac1d5e0f2df3eb5a7f2d4aa737a92bdc7cf4e9c8a1375e5a7b7bca5a5a5855fc60f0b0b0bcb391b3ffdb2c1adfc6463c5c6ca1bb5627b4e9de9d387e9f13ca00a076f9a97643b0ec3ed0470fb1bd76565c41aeee2765d53e373c59bd35493fefcf086367d715d2fca58bd559c9050c2c75fd5928e2d7b762fa1bb2bae988b8b39239a23c06db8dccccd01a461a8a4acf864450b15d1480000000315000030100a064442a1682c0d1469b31d14800c859a446e501b8ae32c49511033c6186208000000008021003234649c003d73dcd6138dbf34b6907de625dc91bc8d4dd45d0a18acf5750eabf005298d8a444f080928c641d5c9906ad05322d86f6962f3a8025ebf12839fb5fe6e3ad3595c6dc8819490d2747a545352fd4e787e25e8756ada0ce0e11b9e9d0765a81daf26411df1d91449d88969ac9b786936cdf3e2f1dcc03cbb6839e8de0a7dfb7827553d87113055d59e1d507cce3d29f9d8f22dd155b5aad8bd63b18832de7493747c96b3db2c60c2119af4f5e17a564641f4cefc91eda94e54c191a1d4ac48e084b792e43bfe175c447d1804531a7a63b22fce49e8d6db6407fc3780fcac44448555fe1d0d045e7fe626e51b890e5358a790d8f126d0e9f540b6eea5d6d86d1612461a3bdc28eb3a1f584d99404d78f69d55c3c02a230cc42d1689b19a4ca5c2d00d2a5543888f7a9ab23f79fcd5f0d44299c4a6ba68db57c1f97986cd102e0686ec84701e9f23503dc5d54f71a1474a3c54456b923dcfcdca3686aa242aa1ab4b89ded5533cc82356d28e570ad379efcf3ac2feb46b540c598eeeb7a730b570e98a720a236ed3861ca45cb97ece6b3540a0da7e7c6f1d687e0b4efb94912263123e02f44eb423b0f54239b33ee7d3b9f156c338f65ce60d244b59325448db46ca9da3c0bef77ea63c569459cb61855ac60562b2e81776ef7d1f348c02eebbbd8aeb1e36b51cb5b4e2554c1bb33140c66d300ee85fa5f25a2c6d265edf954aa19eb37d19436059a4a9364b292b75c0854e1f6865a9141f5c5838915b394821b0c8404773e5f4c6f2ec9bd8f849b7313644eec0de928d3ae9f9731ac67064f31616bc449301e5014c2ce1b2fe81e1417d0468495a130e6963f854f1853ca1abb74ba2a49349ec99e7655e8cb3d9dcb794d883f5c90d942539438d0ae093d3fe3425ec4cb6cc5707b32a2aa8ad2567b6debe66d9448099a7b7fc10c87fc028628cb23cdba32d5899f7f1599e6c552e089ad66dce35d80d8fd3b5ec4d467e3a22b60801af79e7a942080d7e32e72a1d18b5c88bcd95442331fd2023efe2b4fa471b985014f8906adeb7b654487512c268ec7653a5bfba8398d41c492e791ed6b2db2d6c3cddd393111a4d7116b78d6bda9843e2c4057b9ebd3a58a4cd3175ec433c574a5ba18caf5a492f30bcbfeca8d45defeeca8d47ac0f9dbf46595fcb12e03a53236ff45c75a08f927135432fd95071e3468739975608947aea670fa03bf3b3d70bc171a3fd8756090d5a18d7b2fac1b92bb5918e3fe6740fc3107ede5ef255e7f62e97bb8b921536870e07779924e7c9239a30155f36386b3ba0e074488eafbf6451ed84cd714f2c2a7219ffcaf9b49702166ff676809799ff2f24feb8274d639a0a5a5ef1144c1bc128b15ee74fedd96741f7e6cb2c718f00bb592384593b11132ee556a3463dc3dee6dc60825f3f824245c3e777a99dc2c0d74d4d48ab5c1e21c6bc33cb3de4c913808c739930f033396953f003a9835f8ce0b76d9f5213158c8810f64a773bac11dc59be385a42d867513a4666bc6b3f58444657a75417c167026596ca95a677c35bbdcf4794ad4deea2654987f66f49a10d2b62a491e8ecde38d3b943c87b4a16b0d5659cc92da6a5333eabe18233d016d9e2bbff5cacb5eb575254b10fdd58a5611fcc1f9c59b51571a50b865c9562d525066f52dd60cefcc1ca66c18d7e7cf384d1270acb9188ff55bc9a5598358b1e39a9af5fa6ddc422263d9058bba59ff1f65917bcc20e0a686466b0b7ff5049899397e2b88cb2acc17e6a996caa24ab46bc2c31c7124806c51c218348b3882afbbba96a6e1fa523ea6380fc11755c9c5ab8de9867ea75f1707c9d67f815a6bb6371d9b78913fd425d02c0d23075e604ef1ad8bba5eedf3d27f5c4823d3516a828b8950e49ee4deec2a4e31cc8b0464c388857c36c64a2b211b595ec751da88e4bc42d2f263c5c01d54c6a387ed740866c392cde947fcfc3f520fe02282801bdbf66caf4eb44ea22e5df8e6c9012a017854ad9209f7c7b713a40faa3de3c54851804fb4610acef013eda24af0e63f9d226cf74eecaed7dfb041038d2620be33f6d965fc735b13b6e2e8bc881aaa3cc945efe09ffb9bc34e23ef20452949f8fd74380ba8d08cb884b98571d73ec75da7ca76c35bf0a3d9136e09865fe034008ac346c54d56200db1bccd15287e55366ac4c03614d071a7f6599c5bf81644833fa5812059e1698b652f22bad5a46839fdabdd086ca8a78cbb76f9681a1655971c37976e24f1a81b29b5ff971d85119a309b2935527b9d8b52f4a226562aee030d18f23a1736bcb899e1f426c12b45294a64c7bf214119d0f183cf8e2275aedf7b66fed043bc441d925b51000054bfd2f652857fb69851224d79266f3930e516d1ea8be6046b6f76bb841d2cc880a6960c14162d90842e80ea93ee39fe0420e85c7d8c1638b0a7526f0d1b72f16e43ec884e0b1592e48c463831488339c2a8b136f28d0bbe2e0d2948f1c941fb1922f959cb64b4919964643586de493b5d57653e552de7e611eb8a952c9508b842db80a22747791b1a28ffdaf9fa0d860b3794b0066d89c031abb3a9f7c393899ebc7dd6fcfeb35804323425ec39eba1a5ceb49de1980860876ca32ce174a55cdacd8090b4e56139a70a46276ff4c312c7145cfc69e9e6ba0ef1d5af6c0e248cc8d0d6df4082a8c1312b4d6059c48ea94387481022f4d7e4aab8bc3488bb57e98ea9726a51b3e79df3139c65708eba4c7e43000a49266662628d0b716e8ae2011302844f3e5c9240f0eafd623a4c4bec21068a9a9b734f448bbeba82c546e391ed548d3fc4383d83bb0397b582555aa230faaeaa7bc986e0594d970d8dcce45872c99d13cd14e3f7c8e67c71abbf5976a6394496797e122a3166d54d7c249791dd36ab42efa547731940b75f441d66026c8654c9c17b8c97b971db246af2473ad04c0c01600f8b30bfed173aa3074582b4b1969308fb778d9d65e5704d4e8bc62284733579fae8a8b4f034e5e8308c946a0684bb04762af852895ccbbf17b41afcb2dc10c7f6ce97f03d29d49eea479f702fcaef8ebd24106689b620b71f03a7f590f58ef8f31f881944808c25d13c2c7957650d3ce87f0d4b8eb7278d5caca6fefdac89f4e9bd34e13c769385f7b9c24e3bf35e23a930c9235313c405f126f6c94e2f8f0ba6590ac58f9f2ace1d88c1157a249c083f7fb93a0a9c9b1cc37f17a6d2a18b1172efed04573ed875b8536e49d8baf126ee4ce0f77e9d9433642ca1e0f71e0a88d56a5878b7b6ea61bec7cf19376219f5f2f4792597841f7ced9573e80b65e2e760912c4a2bb6182facf2c1665c187821bb72fb1390a53a79490de1f31e467c53cb5be469204f076c89a260fcb1e6f737df3b66f7fadd9d9141f6e0d5776bf085132d923707c618f3001339f271cd2e4807a3dc4279a6011279801562faf05bbe005387846e49eb540abdad2938a01ac95949f17f61e407a3c0c8f0920f79828198ceae08d6b9c1b0cd89dfe3d923d0103a076f25ef5acd61b47285e18028591a4a72b13a2b38ba7cb43d6a5372c9521753c3d6073550a16cfefbacdcd7695a09688a57441a61ebca4ec704622b03d7024d53fa1172197f8c5bee0784f0b8356898b385cac63e95c203a0ec38b4b6f5f04e4ac38933fc4320eb43cc319371681f68c8e33c1e38e0f734c3694384f3edc47dfca5e6671dc67433938da0c40966f7cbe8685bf2da09686394758786de867b531324a6c3c8f56ebb0464b3864f0dd9063c96eb6150c93fef175dddc980b3abba870c05d4f470d234680d68574781de7113d20338b84bb032ecbbd8b5758be3d32039c9466ddf8ed4666c59bb5a7131118e27197e1347a8d9b85caa4c1d13ecc9c09ea4fd1b6e2975af5632c8bc9e3d320ba7d912d327d6861d0aa4f8cc6339a449a39d60b3a5cac4705da11e6b825719d0510e527258969554a91732e5051306b33b25e76451f30e6b9e65f196ae627b189bcc6f5e0ccbb364df9aa084604eead0d7a8c248c7570896cd7a1203c3b5183c1c44e5a7234f04b00cca9d5fc2be9f59df88a7bdab563d75883fd8256f73ce3207fad88b983cce281403d8db590399e0b8598b7d7586bf711e73dbefe35e8015eaf9c5581d936e47a65cbf53c500521bee7ebb35d52633f1c8ce5461207a73f3746430c1357e6380da6f70be4e3bb468ca30fea5be6d01ea140ad25c186e19a3cc5066a54afe1220bfce00c963a83212a8cc7a9f049c25129a03306e361c82c6cda137beaf1ff6339354d4a1d9cecdaa65871ce780c65a2eb8de00d6390aa8f05bc1815ae43a691e8889c7b70f32270fc4d9734a9583e66fea1f5528b31fed7b927e3373ec1f77c5b7eec7c86207469b2156a19f5cd514ca2b026a37feb1ce42d71e0516b2786f843c054b08e5f2aed8607027051c6fd8a1017b4b4a73e76614278e1008cb60b6b21b58f8a5a3335a3bb210a977b01c6e664736fd4f03fc98cc7f08104861953f909a2a4da734931923b2fa99dc932a800b4f9ced4c2da848d77c59780edcbd2b5a8ae1fac5e71f61ea9fee5ae50865bb84958f12420151b35fff6332fc0b39dbb75d0a912b331e3e0b31eec55265c9352b555da8fb2e461dd9592d53bc9bcc521d31f3448aa3b90b1f45db3cce80f8246e603171778f9f25539869030ee4acd93250261f5e93fcd8708a874b0d3cffe66dce7f9f2837e8c87f2818fb0ad6896efac29745a031c6a3dd3bd5a00c3be0c3376a8503828e19dddc1249e4d6f44038cae5396017e49a2d69b24630051a18186cb4039bb6726e8cc932c86e6f0dd2e2572a3c8a1bf19ad7504298034c393e28895e2f87b1dafbbecb7ec4dd7d27bbb879d0c9724a580954edb789181c63eadced2f85a29b8813645cec8d9d0fcb3d45467432dd0d62c0889f6090d6fae996ad19edd5f2cc745e4b603354b4599e336de90039e1b65918aececfcc961a98ec766bccae8d260a609c1b17b685c50a20df2fc0f7845216608194f57ec4973ed483575776ad6542e84c1b781c9eedc24a23a212ef644cf5e43ccd5b3a20717a0c2823100af113d6286883cd8bf1ce439af6d17cf720d858f485ac9630baf00e687a0dce3d86faab7ab30f199dcb30f2f88cbe46c1f7dd5beab9e9e51cb01adb4901ce80667c9c7e318bc9dcc59a779c1d46824756332b81317d03a98dd2cba8126433d424efc767361f9561175b36731cf4be94f4b1dc825a78372850c57f2e2c53b2eb1f33df4fcf1449d8e90a502d852eae6f0b698bb1e6b59363a1983b88b9ef8cd772cce89b582cc2860c1084a8e00f1cd333a6ccb3421e518426b8560a0b562e532fad0ed27636a2329cab04207d8110e000b09371c7485b11c89b703cb6b8c7ddab1cf2e6c095e9654614be9fe90282fcd03b4ac981acc0023995225132d3a38cc324c5d0e9e4fcffbae9de46e3c03a5fb8bca2038b80610ac044e15e7064d1a521cbe28cee8e5490a58ce1bc18b0a1ffd1771c556f8a5918d77760d4d27cf4eba1eb081b0f54af37ef6195b19c1d69ea103bd4901a9368e898c9e6f624f34821d8e3b6dd433e627ce56d03e87fdfa0cae9b124b1d257eb787ce1efae9bf8c8ff6611fbdffd88d7cb146f7ddd0a718aa95b513ae038f9ef3b11abd98ce8a75c0a3773e56034f63bdc756cc46a357b1bf3b6c4f3f5748b9dfd034d56a6bea3a43675332b43bc831b45a0aa4a13cb99014314076bfaf88f538f494de1b24f3a379d0a31bc59e877dd29789f3174689871a6e9c2522879b4a5f20c7ed9e0e45723d556dd7db4514abf23fde433fe8bc67667c3c07fc74a358f6d04f3f8a650ffda0a3113fad98069ec5928f57f44b79bc11844197f4f8b9d059e8b425c87d1b6f6eec5c5b6991bc4bb4e45fcf59c475e14589813c8706ee2181a27f3b210b9caa34d20178148541d32f6ed8c371838bf3c94e743d2bbec26dda90258d4145c3da589e502c7f93c239979aef574ddfb22631c7d1140869586efd8927a4dba19d7a373ca197b6a59119a0afc1efe9e7306618d31ff4238b580e7e5a09323eafb36650211d2b924835c27f9a0ad82b8ca5244d80e0f93aa1b0de4a00068b548be0a21eeb9f052307d40a93ed2dee00292a3b96b557ca89eef04ef378d41a1e962bc954ad715ab64cace0f50f32871dc4fca878110ad79859d320deafb0c0b5083c850047ab9660892fa01067af8f1e3bd31f7c5adb665b11621c52fc333bfdc826a5ea67e8c97e47c8dab0549e3935151e60f55827d2e39e268194cb0a1e146a680ed6fd102358405b5a2e1899cdf74424abd6c16abf13aa9684f9ff1978ed708e201b477878be481c7567e3803d31319d00969a73f4da7f3ef7d8cc620f9f60e4f33b88e4db46b1448a91840b179a6393260a0de5a16e0ded079a34a51cfb14f8df3a9af4c7a2ed19c44c590ad56341fb43f8e1224d1e85321a3803134adba380a38e6fcaa65f763e536128a8fdfa9986f9b3321a0cec52ecc8bea0a2652f02c4ba58d40951456f335f0dfc890f808f4913eb38fcb6a2a0af2b3c62bf3a82a300e40ccf0f0dad66a6a0e2ab6b2c0fc555e2f8b1126ca428748766981851f4fe27234b8151b74f6b48b9657a8060bbd8adbbc4b6ac5e73f38c15f577c5b12a2c275678ae74ba7348fa6f48377fe087a59cb69f91e6edeb0781112d2120255d9125f11770d2180385dfa2105418132361c65fdc15826a193d61d1e61a41e8891f766dccce053a1c43360527682f2333162914482d41a60c822cd41dcb62f90670c522a465f482fa2cc4ec0fff0c60bcc1544a304ea81fd5f525ff0a93a380fde8c438128201e63d5832b1b142bd7c65037ee33cf7590a407db1847053347f6a810ff9b73f5ff6191eedff461b81e6472d4c4ca7af54b39daa1e5f9b20b2b8ddac324dccf6e1ba96c047169600df7883fd88db2d296a8756c006c65659c36a4c01551065946b9d0995c983e5037c75f281f9cc0e453c3be5fc8a3a3348825cecb58ced6920a0b68ae8d1f68ca74f236c7011f99cd78477b9157a6de9d764158f32d10f70ee484f57c3965542b9d2852267bb39a3f4ff0ae4b4ea400f0693c13a142c4cd7e0bbe6635c7822b3673d71e1931c56b129d5ee45be20ccc5a3e00fe0ddce60dcf8c8b342695e0b3f4da2add43b2de584c65dfed2422189c95d372bf343fb962eeb663b28300163b6f436539e7a2b90b8e4c01e2219623f67684c704744ed5852054d16b3d67672c2382bb842319c223b1f1bcd5e7c699e91c9c0f81b1d8402dc59ace639d7e255dafd459ef633887f1eeefbe2845214684822db168333ec8751ee8a971f896806500567afc2d56025237063b4df0d23768cee22a07173aac74ee2999199261747e1068800ce6174203324362c0a3e6049d21050985a947f4e85fd70c00920b820f4051d55443895d9df6194b6dbba946f4541efb8129a164edbe2755f20eccd407417c8fd19543d4daec78813882292332e8ea50f366064964ccbdcc874a1e1d7c7b5e07b9abf881e2459431d2ae1a92ae22ef35d4728c443b1e1b1f8edd3d411a76762a43dc99896ce8baca9a7f5cbc18902bb1269b4fa77d0609affcbdf49e0c723119763b961ea84f4fd62dd7af7030284711bcc67ba8279d6098c7d233c4639380839d0092b703debe3870714b18e10079f0dec420ed35aee4f57cde8bdd76c319122ab5846fbaa301aaf6a10111f34ba9d6932a5d2ea63b8a9d70998cd672804f34c8ed4e8ee65b30a79c943bf6779027520d8058ddcac4801ec0e4e33aa5e2fc42dc910e45689def86372a4ac1099c378fabb1e31971b829c81236b40607288fa0942aff83ed366efaedce9dd983c5a7aa1dee414b9bd48bd83d18cf632025d60ae1dd748831b76756c27c0f6e4ca7b996c40f2c7fc26d2b8fe0c5121531db51a22fedc8d08695642a52d535ce6e73c851679add1b09b3ea0125784d5a2c9ab84b48ea55eca6dfffd16abd96da8e34cde0b8d4c4c6d0d53d41d0eb999ebc5884eac3308c953080e0d9835a054f58f8a60d1e4b1f0ff8fcf0cb7b8ae2eb88da13911c79f596ab50afb695e0eb6e1f79acb43d2e8fdccbbab26236f6f1181325e157119ac8580881b8b94ae28b2da4e9b08cde39a90f57d1feed970fe884b201b13013e6e28ff0bc1454b5f99486d9729ad4862c34706497eca2bcf5bafd77e6eb60262faab08fe3281f35819f7c8713b534dcc9e787954deccc3ed532b80403f764da49291d4a39030cf8b44c842b8643071544471340cfb42763f988c7c22e85833654b42a8e243458cb916d60284e1a425f1d1b2a0bab69e9978c09dbf0e7c832f076ebbc526b12d552db0b53969fda2a360835ace17d34d8cb55a0e4a598eef37be419dce6ed9c73a0c4f0d1d9c27f00e9d12265885e75bd65c4c09eb41939c2a64e1510126a0a94edefa718d93cbced18476d4602d9dfeb10cab49fca7dad74cd37cd166d42150f347527fb3c324d0265d21c16dd345993e07b1d4bcdd7f98ba97dc05ee96d6af109d60d9a780890a32ec749e519d71f4acdb3958136454a06ec74fee08f51154a78e8950874f7d97723496f7b4b1357fd4fd3c5bebba216e605aab0de15c877bbe4f988ab08740996ad4b44ffe3656b63c8d5f9f23b13a27cff3d747c2cf5a3b7363ba6c625191248a69c39208fa3fa2c5ece00650d3a4df0457b6f950aa56a2c1b4d166f48459359aef6cfa16e1ccc5ab4376f2e5422d7d452368fef4fb9d2f3c050624cf33e2bcd58f2c97d5c61cd2ac085150d48edbf447205b06e83cc38028c91448c040af30454421c05c239b3b7ba0678f2fb02832acd9fa4fb32e0d5467927169434d59fa3a8d9d95bcd16619ace04379c8663a937494c44a88e7b2f4b2a97121a8a16b45b346ef856c23bf666c9a1f6ea8a5fc8d069418f2caae288f651527caa03b18a31c0ae720ecd96b67d1f3ac0beeeeafe8515176c04447a5c244750c41ea98a4759121efd78399b536f8683edd1c26d893ea10bde273bf77337dd554c31c32cc3ffbd3f3c6ea8bf3e0781147acc12ed42c9537a65a7d2c14be0210b4381d6cd8bbee6d5c04172fc25582602b5eb1ab1a32d2c74afe699a74c41d6f658755cc7efb11b90086580d73743fcafd9af8dab895c37de9c78cd52756844cb4db496173cc0da506d86b9443ab2d87ac427e969201c5eabe1e7496907eee44d049f63c39c9b1cc5f6be10c1bdfc1e1443ad054f5f09bc61654a0b076d5646e6d1992cb04322a3d3a033f9884e31654022cb188d63a66af7de230f4e09e4344b79a82ec224d02eb283c3c5c69afe8a10f60110852ca20a9422ca5260d089e8d299991d285ce46a99721e07a3f5a9b9cc1fa038f3055661c3d9f3470899a02ca8835dad152533783cd5fe7fd7e96a3c41a6b77f78cb4351e7dba24c7fb0df2427331146bdf29ec723f77b6ae4aa5a2725b29c044878bb2e0bae6ad1ee7b83513346fe91dfe1b6be4d10056994a82c8dd4b13ad084b85f584ba45a12044e33c62e634b2a769801a23764f90c81465d5a7330c6676cc1797f0ded9b96d13947ff8325e2b6541fd82c727aa7ff3a8cd304d0d545d48c9793bc154fe9c4652cbd1f8919b2c36e05ee9217ac023e474ec3cec45f7019994c60c0628b7b9a52b02fc978188a8b6f2d2c641ae1ec069789a9537431ce578b109fd7b270a1e72eb6102dc9f21ea7da6aee740682c78709a26a4c0b905ada71251d691922041d5a83b91d8e462edaac0c1ba3ccd4c6640e4c080ecc3a8fd623a36109d5a6455bd66b3720a9a41a19e2fd45e22a0e2a3b469bda291acd3a53030c5f9668b4e5c84b89b6a6cacdb9c49e27edeebaef2a02a09185804fcabf483d2296ee6dfbf2a107a0cb7361b2c577c6698f40b6e847f6a069f8119ca148e94abf98a49f61ca66048c57141604f2692e6091bf47754ad5db730345885a95752ca30cfbbcce46f652e02fcc1538c32d08a4fe3fba11b8f6aff7fa8586bc76f02e46999685c2143c89fe6b00c6a8dfd0a7fa00fa7e868718e70b1ceaf305dea1fc596ded197068398f3218733631c1b087fc2ba985d253a84a9278f7995fbc2c0b2947a554c8c1a2ae4962a75ff12307b2d216f46c6f54631b310dae91b6ad267b7de973b26c612b0d6d3da85de19cc26e5ab4c9ec7a275246016b49c1341477a90389ac31ce91270e325210bbd86bbfb4f9ac5d0c2110929072ba59f3b45beee9933dbbf5cf7d5c2394ea407888d40f8983cbbfe2f7b1f9006066365dd544028dfd6b64ef012f8ef89e9eb8923433360c3d6c70942875cc5243eb6c8498136fcf2857bd21926b85ef7b415960dcede9be9ef8bc3eab6efb5623fe7f28793b26aa7f6f1afdc8e3e986bf7b88548c4f16af175097c4a2a3161c3680fbb42ae061b7ed83e1b0da6e9add57d8254feef759fa36e8fa781611e92c209e0e47c8bd273473ff53bc9c87d57eaeee8857dfbf54b5644a04d1e40f4c930503152bd98bc320cac21f555b16d7ea0f036cde3a9369ace2d8cabb2db3d7cdb6ff79b9ed09a51ceaf8cf6cffc09fe30f0d9fb4f29039682e4243d9cafb4bdf513214a796ff1445c50d5739c17005a3d953356fe68098fcd7bf5e5559163f0a9cfb61dac9b5c389170697a2a23f5ac24de32b53e3f0d194d93bc49031807b136d0adada3f6dc873960670f2f86e5efa937dc4dfaf3bd9f40d83d0ef76ea8cdfe8dde0cd35da57e93566d24066ef0865f86bf1e21e5138f143b094fa61016dfea0f7038ae069fbd0efacca83aaa4bba156943e7ac257225fd69c0d6b3007227258dfe20ecfa8fba23ac9ef6c61e9afe5f6c697f3d43433eb8d20e72c48ef9f92f94e8b425e242088fe0d999919d21189b3da085daed3f8ee31823e77cd9ce902c68876771a526fc81b5c689578515a97a39f7926946994d1393c11aa53d22de18b3b8752e24938b51ab09a71745be0189f53ad215ee8a2acc46aacd8486b0d2e650201a2c63d996f51a0e714da5381dc088ea38e7e889e7675c0ac8805fd3d8b8c6d19bbc16e42bcd0e077132c1530b9e8c6af90f6614890b198b0b0c8c2800b0e12373b8b8c0c4771ae7d1a48349120a0dd5fd5328302f8c3b57046a093176178b1efe26defb1919ea7478605dd167ff86ad51e4378c6c9b3a9716f1e305c97ded1bc410e1f61304446af3faf51abddc7b8abd81ec8aeaddccb53e9b3f37b6c087fa1d5338caa5bf4371f2c22b651424a195adfca96c32386336a5026f7a035c6aeae30bf59e1a1b18a14326a49e4e8071228c11613c804249d0c7bb252ad91f9b0d9a4085f791057c4aa062fbfb004c92a8ca1427018a21e3470911b3b42cbe7af094a490057bf044c7e9886d0d54f67a70b24786913078e250a6d14886428ed22521cb39a157d5f5920c1f5f33bc0af6e024c7cbed48eb335002610c535cb020dbc83e203c4565157d4a1df7d310990767e2c2bbebf37dee617eb457a43519b62c428a9edeed824a311acf5dda81fd661361128c574737146ad67057201f76be4bb9b436e1d6df2510d5a2a3ab3515942c6ca2fe7065fdaeaefbc10e5b0ec7e9c51061f1c10afc0eb17de1ca00456fe273feb3291abf29993f418f56759c2e3f9dd888ea3df83a4603f30531042eba16bf4502ad0e8194f0c8960e71a34f44c0209a88d8d1c8d2d8add113e69ccf98ec05db9d0b973a9e5b0c6c1ef0dff31ac139f51a39af1b4e0c0a2fb5e4b1b0012f27678d0dfb9c0513d463fc67cf0970141793cfa45ae3746207e9c88869b5036b88193e4444079a52e269d4356f15ec95a54a40733d4c9876826290f8f8af7a03e74d74c970d076a04bfea5a0bae8bd39a72d2c312c227b7d73d7582b4a6b92cbd24e43d9640f8802732fccde0a5b84cb827b8f5546f8660dd0e620d922634d426d278528e4bbda177829c220becd9aa56e6ee85b82781524137ab435389a72a6c6c00e7eca4c5bbe6a6422e4fd8da06057410cd64ad68155c96af63f3f01971414995608755514a83154095dd5e9b756eec6c6d659967cf495bedb71d4d7c0f0a20daa879556fbbeda47d61d082d7139bd0e7fd1fc8c6a72cc799f9fd1a89fdab2a3f3137212f2d80149f9ef08d3feb7f6abfadba6c847526e1dd4efe69292c25ef557ea8688f7d47e0210980f8d93b41e370913d1e571e72b4d0fff9a260bc195f8a607788aa1229ae9391360b2d17dab50121193a3667bbe2fdb79387d300f92eda68a503e97f997e717cd1b2168cfdf74bb60196c4ef406c7be2e223c5dc764d2725b5b1402602074de2d314f8ccdda9e26323ffb3696eaec6c427fe2256e7666e3e4e41a55f467477fe40285f5d26f8646d1b3606b160169dffec1f08d1e0cfbb423b9aa0ad617ee74a367f876f9f43fff35dcb20d694fb299a4d29dcf2c662b20ab5d548ae07dafe3dccd215499f2bf2d52a3946e2dd565a070bab130a43b9a6068e98f83f989800b8db76613c02744b9f3be4c385a3db26b34f0fe58639d2bfcdfde8eb3678c922791be24ea5966ce60b3e21c6bd1f9433d5e212f331e5c6d71811fc8c4ad75dbe91f059957bf9d9dc7a8b4af3d7f7807cf0254876e3878f1473d6feaf23798d16f52f04e120fa4518e8a9bad52fd1e19ed8f64b48b07057b48d4767dae401e1a0a249b1ead062c2984a258a7cea332af82d620fe3d1802b40186164281e89d30904e28335cdcc4bda0b468c10c1fa9bd753e021f383173c2903471cc178d43b37b28e603fe5647d300e4801117f0a2e78bcfe2358173ab516e69ee058f48083fbe3243def7e337bdceb913232dc5f06b7645710279be77371302eb9e71440cb49eb7947f419ba14871f4a20dc7cb2994d3d27a6e8fe4841304aba554fdf1580f56d1f29e75434cb716dd3ac4cd334ad2fad272c21ef091b55510402056d5000226aa89172528b109a5d238db012551c4a1b17b9e47d5cd8f1fea4710ecf48093718a557ab47774a2d248f352cbc739245958c03fbbf6ef5c5c1c3d4db367591984b489138fdd79f2086de7a4804cc8692c1dd65f609f59d8066a234ed759bca1d06b21b7cc7accc7315da050494c1d73650112c10c96fe6daf33e3c9d4b4e2f19096c7142b154afd2b553430a6a3c3de452eac5f1b8e1be87fcf0ed0c9977bce3f23bb825b12ac39b1115721dbe5f167e66219465ebf5e7fbdd9b1ca7c4a443a4162d0d351023744e2616049992d0ba8824cba1e8eef12dbd05a56f5e777489b881785b780787dc47af2dc80c5d1551ed845c0bdf784e16bc988447c4a3587990c2ad8d5074a85356efafc6455b43bfa25bc481e378bd2ee29edd10298e7af6b0f50824db92f284085cf749d1ce63628178237c5b45db1d05ec07dc2e48a6967a79ab6dc70e32e5cc87907016587a0cdfe9922a948e6888d01a45085d35b31b1da0ccd831a5f14e7246301415d2d378da41e2740c4db24b21763db620c02310e0535c40053c173c693a9d80212a2f7aac5f535341a6e927594e40b7119b70cede8ca60b8495a446566f59ad5e2c1db16091c6792ab0750b25447a28948d98939ca0fd0f49031604b2ce9e87cc433c1d492f6cb9572bdf29ff8a431cb6a14eb84441c1e7cce2758424767a13812e3a5f3dc8e6eb55795973b680dbbaafc7c8eb46fe6a3d038dd035418e42cad6c7bdec76b6b4e449e271358d45a1868d1d2a071ec325330687294726825bcfd7e544eab59618a4599f725f4bc74c868d872efaf9656b6c6e8496abff960920c288a224c565fbccef325e0bda9e72a2da0a4c5e3fc5d33bbd1bdc7c26b014ccb6014e4fe05f6830315bd84d04056b20a65ae026e2660dd57f646273e40ab6ee6ef8d690994bc75e67def339dfef64368362fe8d64d9072cdf10938bc019b94371c26fecb9b74b34a0cff1092ae999dd843e3ea52c03d293481aad9b90cde971927f183a8cc607ceb8e347ceb99e3ad6a0c2c0e203140df274485e7b2648d88d8f3c6abc6622e8b9353eb8eb4373cf87227b64b101ca386f30ece601a9b4028512a6d35cc5336d33f64337ddd481b3468c387245284ce0bc1c52c3201d5e69fda31f9c3228b56bd0f7365dfacb0e9d0197b3af7178440be5c87c9188dcee833deaeeaa4be8199a12f0e103033fba94dfda55da5d1c36927ee2ef21fc720a61316b75dfe71e2b8c12d27a09314baaaa26d339470a31d8852bf19bb6de3209cc040d8b038637b7a66d5bfc883a38b4570d2a21e354c6be9207d798c5646013529736399e0788f5c6dd918ef61a3c0b9171d8bfeb9a36072f16cb833b480065fa882b84bb465a6a0166bde14fbe80038ec295ae019b3ec455a6ed7efea3238586d6df999b75d784f79d9b75f635bdb9a1ae1ec7ad7374591c48260f4183bee35e2b5d46e7f9a1da74f985a400eab8407e6a520b53f7be6f5ad6e83a1349f561629f99d90fe8a14924019754fb82050f87b447d160a5ff48683a6338d6c7ae434430cdc93c0af263dd8ed68e29ec153d7e7a572694bc4d3db63690ba638ea6a5ab7511daec6fc82a4a3d7eb926e4cd5dd615b1bbcd1afeaa86c823fce35fcbcf200463c3cd19145ad924fbce71077684d5e8a2c257e606ee9fee6a56113d86160b0b96604375c6d32d161507ef9985f03ade96e86750aea23cf38d4bb15c97ba5bedc3b1e0dc2a4b6976c89d081fad69623136c409fad7e47f0e7e3ba12d6cfa088092befec059b59f4e0ed6c22695b670ab409653216faed2e9016ad2bf8184d2b2c38ed32e907e1322180b4c2574fcb7a74b65f0d77940f8e5d62bf131154b34c8f60f66dae15910ac602e5dc4afa9a5bd9996e77e231b7c2eeea7c8a6dee3e3f9c0719bb3b35dac7fd53fafbf995180f54cd075077fd3572a5b05966effb0f60d9f4d94b98be488720e2e177143a04a82254949b58f9b904d05bd6b07bb890d7572070edad5c50bc32dbe1e848924170586b57a0c98ec3a1efb70434373d07982a4cca892fecc97db5603f6b82578c051b4abeb482f603c4a0474ad3c96d43678606a6da871b35cf9e7750ce52534d2ce0740dc2835870a332f8bbc0581989b40390abda81db931e5618f3045ddf09c7660085092221d75ce0b178709a379aac38608e0928c8147961a828ade796c6ec9bca3cad23aaf8a6ab18f120a621fc4ef10669bf9dfd796ac2dbea11fabfe4dce494c1dafe324bbc923537ce503e9fa6d5ffa3d64360be93a4c48f6880092869d02dd18021123f9e02f0d680f33c450d7c2c0240bccc868a20e2673ef719e88f61c7e035524509852fd0d691201fab3ee69170e37677a248c653550902cd4d0b3c2e120939e4cbe5ce34fbc020709efc405c58fc5ef4ce2a99182847a1cb699395466c0c0eef1c4ccabdea1f43ba83a657ebbb1bd9243e5bda57bdc341ad6169fc90d5123c717b2fbe1bfd854edc65ca97e4f31d69ff0c652c89ed78d584bcdfcf4f2674a3cfdc9cf4fb75fcd0684ada09d538d65a3e41eca3094c452f4a863446b31df6ea0e9491da6dae748fe6a8f7e01f206cec9036126958c329731a3f3db8a622e9aab568c9be99dc6ca830146e34f51ad017f4b36e7f79d091d5fe29ac211352e77d4bd8efd74b92efccc69e3d27dcdfe99728babbe174bf57d59d79a9ec2a58f8876e7489693c2316a8f9691c310c9d192136738f53c1ad3a62efe3ae926116ab8c321d475355a80c2892d2df9931691ac28b1aad076f85e23fb3d8cb55671da6c39e7e5c71a943e9e5c61898403700487cb945054a4fe3413f61181e98b86170949d65c310483774c9eca30f22b44ece2342e53f0dadae429b3d7ae7cfb0426b75190cbc483eafdc281b17ca161389247c4783876b85ab67c3206ab1a3f4f391ecee192d00babd21e6d4e8a092bb9c8da5f5e83760146fe840c0e272fe0d749f932727a9bcc4e9dff6e2c74fa07ef52b8557ae7d7299071691f9f08ea6b89d2eab6b94d04d7419ebdaf9fc36d4c81dafabd77d0e7de6ef8a8338b645dd7903ef8dfa619d6cd19136626253a1b527d165285b6d49e318d5bf27d15d1b2d66ac72058d2a4aaa9274ae6e2f55155f20ae3b9b102ac0b088dd7b8f050bbc5fb9aa1d220cebd7f491818c744e01bf2b30edc67eab4b82a84a6f094608fa139f1e37cfdcb719b892808315ae6ccd66a3af38dfaf83b513887772e496513f5e7c2c98bf5ebff1196a3557c08eac90548da8f453729c12fe0978cc28ca040397cbadc4c38d3d5ed8d1a1f0a2e448b9b62100c055a5799b7b193f4c1e82a5e0cc64dfa50ec7da5809985582a24dcc5cb20db37b33c00b441c43a15c7ed002005fc62898159d766340ffbd9c45dcecb68737f0c882bc9cdf780586e9f41c8db2bbc88321c2ac1c6f6994ff7fafea025fabffc96315bd3d03bad42a2a47ad8988e89a4c0da8d99b9e58e37e93f22fe8fd1c04d51c9bfc8d50c790c715bce2466f3c37698735ac6861bff56e70eed4a050119e1c92aa1a367eef75ca19250d788d6ba64b161e0f6e427473e789159cf93f65c67a38a11ac142c4fb075cd9c6be088850bc553e6c331594e4fc4a59f6d3eb77a1a4f78c1062c0c013d48282b21f16b3ed258c12fcaf752db53afcf875a13ae25b59b7b24f87522d829808380804bdda84b42f8bc55d0d67bc28302391d2c7645f5c87e65e89a704aa6bfb8c1b6e9b9ce8f2b372fde77e65dee93e1818c71fd9462b4d6f01610b8b77cdc0154736b14aa4c0407126a34c98a46f4836c1d5b053d469a8ef3e6322c2a63e9359f7a2948b0f3875c6a89fa316cd527daf4b6f3ba2aa9ce3eb146559e7df4f3119270b653b41480d313a75f88b1808a2a361dbad07897407a3cf590322e17b1a2d5b42e447b8859a019b2af057fb79df2201a5a32271b57745a8a1219748047037efebadebeb658cf80dad08daf88801dfd9d28e7b6233a6df9914a2dac6bb3a69ceed3d77af11ef11d77baf41c084ea0a320374613a5a374a94f588a184215c0c4379372dd379b722edee9981bd9e5b82fc41194ba8a475c02e863d9070b7140db7fca8752d0eb91e4fca8363e8947c72e234258240d0c06022eaf652b81c69e2bc64f26273b4fb4209f5b60222f8c9ace33e841bfe5a8dfccc62fe002e369b3280e10d0a17d12788ce2c490e026d0fd443a1ddf8482948c0f29549c7857012fe498066eef9ae87bb9430c4b386f60c6f4131521fc4b13ddd88582122c5cd65bb18fcb08094e88914166eef2070a64336c9794de69ff4133937e88c407a72548746f6bb24e62bd0505fc153719f03b4612b71d4305bdf582d58f19d906e5c2634c94b9bf1a24ec74d12ea7bcaf34e6b090419215a32a1d3e7823e91a025a92a2bd2f53c260e679b1b226f5cc530cfa6cf1f59df313d9394f10a671b4f790ca4e3d35ad2cd185b846de30b126fdd58defa67cc31cf4bfd012d7edf40b04c901220f320367af701aff52bf3902a61f07c38a8b6983a7236f360632fd7558e952f9fdb1dc29fa3a09b1b6ecc8d882cd7605d7b9db9f8a69a006bcc2979e9f2c2dfde61d0792596a66a0e60a22ed605c4adc864008aa09365e82d2a261e89a0dce206c920eb6c5ef98c52b0b4c48986a6f0616f4d8ef5d713d8fda60647a11c3d03caca8921773c503017ee23090f1f28b93efd2c9e158c4511f1238ecd9cfbee8bcc38f1637b7a57f51b76448beae6caa7195b3ffb1622ee8bd76c21e8ccf3b11f5821cf709d54a4fbd45a4c855516c02abcbc383402b01a92768e449515a442e87a4ac70fc417e0bc1a20d075303f3c9da0bad0ff110c3c3819cb07d18b91bef0fe66cfb54e4871691ac6f274b4ccd2cbbcabef954c59e513faeb1a2f7fd31e9f00dac0f9adc59833b36309957a8586b2d9e9a4b20c6b0aba95e1850cc699ff915adeda6598d218bdf5dcd6943830daf2848dc3de1c519326b90885f2e82904505379a9cd03d46aadefcc843ae321526c776dc46b82e4581a0702918c486d832f6e4120827f30611e8ab8f017173e9728411894b65e2a05c1f11c08839b0b47fc2ed7d0da916d8fbab219227cce96c18736efd1a45f56c6443240cbdd96de8d5c08585dbebb3ac900412384a3d656adc5a248f0c9a6eeffbdf0ffd42f206b83750e316e4f68a2ed635c20df1f8f0cd0455c5e8da0016b71c08a5e1fa4db9f3f4987bed8fa37441f38bbeb98348e584966a69caca09d8d61c894f39c2be118409e27468e17bb97aaf643d30375318e2c7fdf65425c178270f6ef9f092ec392528b99d0c41e41271ec520cc936f3bebe049f2b9a0b2303dab33d7155bb619aa72149bde0389cca0e160eb50245055b603fe90384b8b3e2e13d1fe2c49324828120b36ba45059d137b711e7f364c6b4699d2ba617ebd6cb016993171642f6fbe176d0999285fe1a34b4e3fe1cfda627c89d11210c03d5162dd000d4a5dd39246416293b4064c3bdf719404adf760df4da2a0164b0507e7a1f9403e880777bed0fc8a6cf489a91fcb607e1af6827bf83b9d0ae2ef5395096e1c7e27d515aff5ed0d929f204a0060feffd4d09fd5682019c8324554f8edd58d8aaa296d5042ecec971424f19dec7dc9f644460ee68747baa4047b78444f6184f2bfb7f9bc085e80014ec5570c3d4293885005fa253f59372e52d5856bfc2e663ec8aa97c69195eb72e487630d4c508ce256f209915767ec412f53503b5eb357857fa7d3914812fbac2029df8953a758a660aee4697073314bcd1e8eaced01d4b779b7c5a5c3a19d98f2346a670b602791eb25a64dfd9c7ff48f5dda06c5a421abc44cc224f56f5c21b5bc0653f631f68952c9c58238a9e47c27982ecfe8367146082cdabf049d2b31cc5705fcd70a909261e5792092084c42ccb1a5f7843bda9f8ee3108a98d670e6d698a0018e2035d839d26a6cfa2601c44135ab5e835e561300bbe94e93822c96d4fe611e6061e2e5ade959acaeaaae723342b11ad2ed361e54fe2d448177120ccd35e1d52d5549536900631716c49c5773073d1829a230686164085cbd681291af941b65a88eb6e1015b4980d92d4761bcbee600d97339cd82a4944af4157226126f2be04c1f0a284fdedfd971023d72f63e595a42b4fc27e0db1c89378acb9f17241c7719142fc5670710a17c09ecefbd412cacd217b556abc5e9f43fb6bf6a8ed51728875a87bc54627dd9a095268009cb596e10be9fc44274af9db9870840e355d36a0035c6f902c6d13585f84b300234625e3e05e98e01e8850648fc151e6df087f7e8c04a31c3b3f4c4ee527240775658095da91a5d35e17b6deb1bfdf031e7481566d9ee50c88d103e173e2ca1f632d21ada68f2c67183bd2041c6a8b61306043ac21e54e315e2d24c960399589d7adda3922b99b98616d00390f217b002da276945c4e5f45e7323d903381dfe9080ed33b2b5b46b492a2dd716333e18725242274cd40d736d516fcf8fdddcf1cac2512f7a7f74031caca0878282b2f1c51f256ddf07457af3895e2599be078874ef8b1e4a9a7e0fca2b92cbef13a6c4296d8417fac3e7d14ef53c93d81b403882ee7dc6ff10f3074b54edcb7ff0038bb282064644235d89a0913ca53d8f58ac89ef920b2bdf462ca4cae60c763233af915f7329011a4e0f5a647b5abea1233c0ca6a427f630b410e044a989fd4d0807139cbdb30e361ebc7edb8ada0be1514c6775076d280db5b7afe8bf7f1d82f9edbb6afa49f06ce1447819d4f0586e37512f22c0634458b0ecce17c0aec44eafe5d43151e906658e43738721a53c63e6fce23e775b15dd05f079756056871d22337054b969285662f82845db70c9bb9784234ebefad4ab12c26e146511eb71f9d706fa081c5d533956fb0b35e9c28bbe2c0b2c69a4d1610b86c94338e64718b6e61757ff57456d38127318ac38042f59a41698f0803b2c9dfeb8e6e3eb04f16de47c0fe6daad28c02dc47e2a1e4816b70ed1042551e5aee305175111f8f80a93fa6f27d817573dee04eb946899463be57035fa6f32b0a0cadd1ef8c3c583843680885b3df54f984c9164eeadbdb073b51e252d69f033834a484ba54a3a2c5683f312f1ddd2573d11713b970ceea0877c31c6951a64e057b0e825c7dc738713299585a7a9d7a72947cadcd53b6c2afd3a8392bc50af6ce0dcda2943f2217dacd7a12541bfb53e4ef2214acdec2816924f1fb71a470f09ad66e18f021c63f0ce6300c65edb9b26f7433efcb111e905f36410f84efc2b4fbeb8c483cb8e0d00dd4bbe88c77796210248dde41b8380b37d896ab92a25be194e9348f1038d14225868a312a33686bb59ff2cf73f1aaf6bb4cc52c1d7df849444ff657244dada534120183e8a64d57e569612947cf485acefa38b9c6d8da3b2817c7b8f8425f61db041febb552832a0aad0587ad0d008c357c038241e183594945e233488b6f78646c4dd58705eef9b065d3186787473c5b33f3de46cfdc84323ae5653daa97c3423b42491c390e700e8374ead926906ba71eec991248672e362a0845688e1dc5a608d25152cdc44fee3ae2080279771b7370337af8a161e17d3c3171ba52d4fb56cedf6d960b0750e84e2fb8f0c8c785ca0ae6f3ce843238ec307ebef9819e056d36426c5584d75ed452f5d3de354d8a5092eaa863c3c3181a3896653c01932ef443fa2cf2ce3257ce2aca8fafe2f811b6af8f37807902f473c113b9a0520e40720f9acfbad356def39762f1c2e19c0b2880756aad2fe0760ea7a05dcaad34b08a72695c4326e8982dfe8012dddd923cbd3ed259659d06f8c4af2b5022f38af0fe1773264fac3a6d0b053b7002578c3a28080ffdf65f13f9930197a6f7b815270c5a0ced0d54ef93410110929c9dfcd92603ba226cbf624a446199d73900330940cca9ee4b2ded9b58b0b1877c2f14f9e0b96d688b8bc66291d4a1c8190ba712d1e9eeccaf3913d07aea287a4ef2fd4012b22459bdadef08e75fe90aa6bd266b1c3572a7673515725a0c8e4a0c0b5699092b4d250ebf00f94361eb2b566cd6ee18f14273434c6a1bd131d43425fb5e26725acdd70bb300eaaf38339aa10b55522ab6b70a1b09860950135cbeccfbe8b09e6d950ae44d1f3958e0b560fb09940b22c3539cb602ba31eaf42b7e1f6db08184f2d015375ac1a6dad0c43b1759a131d500ac999ddd749cf968c923a502952af514fbbd475d0df5ad46b7712d5096dc3b25093817a0cb3c3bcfa521ca2b02fe87e2c841067c990befa4cf97245fc1ff9b79ec0c602ac7b8e58079eceeeae3ec2bd27d1d883a927b0489cd778a67a9bf3700e50411f64bdc6eb3180ab1ffa234cedc9187919ecf68317bafb09887f982e2284c42f42b29921457295942da36518fc3316456eced419132e77e1218fbd99b2e92565bc016e8734e9c9a6440fe120fcdf78f78384a981f1d758936c77e4ae150a11a143bdf8503a550255d786bb12420fb47051d2fd1c0c80653261ebd31690fe7104a775064590c854a7090cbbb67c59276555dad1cb48e0c201e7ce6ea0df5990b3f312322b21934371ccdd4ddd10c4057042f37deb9bcf9782ae73fc00d891f2f42b9bb2f4a3378644a53fad16f43b73b01234ad796dac8abdeb47e42cb17314d0ed31cb02d8a7fc0a4e046017788dd7d69be9bd5ab0471455f7c02c054dce2d9e8545f88369a37cb0e5024201759b097cea07859378acd3bf00af6b61000d2d8f245cb657847d30448c291ac6bf152b3b000d31b29e7bf9d9a7336794c3db368310dbb13bd13ce28ba26cd06bd5319ffec8ffaa75ac166d9e3e1a96155d0f5274016675b1f604bef31b6cd21277b26f6b21a0a02225a21a52d074251beb63ab23f6816f7e38923b0edcf8528ca7ba4decf9391387562cdbfc5e7b17aaa7e5ac342bb0d2070b27637b5f5676d6c93a6b1122ad969df47b25c39bb7ebaad601a98c088ff812bc4a2b5a6196e12658063889bc07ceb28f101304d1b96774c6a66840962b8380d450b57f96a7988192ee67646e21febb062a2023e1b23735b6f627e3d56e3ebd6df0510e528208950a67e56b25a008b20542597890013a55163fed577784818623d6d274e03405c56a45aedd8ff7719a061191e5d303d9b2a9641b0587461e24f08b3b6f0fa9c98c3555d42a58a2c6bb13f64252a88332f40bd4951225d3c7ade109a84b4b09f56fd1c9a6ae11aef7bfbb0bde952a006744a788f10095c9c93f272b842e2b0c96e6ee07e899f71daf9b16a2bf3b069ecaf4d41bb814e41f40cd83d749df9cb9c1d06e38d51e6d2c95cfc586998b5147f0edd1111786f8a784d19799d9ba57f4fcf3ccd02500d5f2cc8bab07cf215dd69491a442d7e924e963f4d5ab32934f952286169561c54cf58ce7cd624893f32f85cb0d73041445a7e8f0e149cb54f6884aae9f724b08150c9598159f6f07e5b8208e975a7c4b20bc8474813f26f3e46742962b0b99dd79fa72ea4282aca6c2f66a7292666891b31a1d1015a91181b8ed721f2c012934248e4825811f0636fc366eb9f2b21999ad2b6590fef614710a2b2010b2589932dbb45da5881ed14e579918b6b2142f0d104696de981d8be8c8104051dc6126ad6ea165399270869de453c771262bd6841c87d61289d684144008b5fca4a927028a3fcaab04e14ee3e8408c51068bad8668dc955e6bd13d4f8125e1c4c6a128b8a59c99deaded50f768492f5088c83d314ed8996d9b6e259e0d19052590a086ea1b695be5637a623f002ed92cae98fae52ef4f7684639313137247f693fe94b5aa6b48abfb9c5e6ba16a0a653fc7c9b622295b8e33c85c4e9025f29d3ae4c902a52df731fa70b2e90bba1cbf5b0b217b7f45fa46a119da84dcb76a94bee3551f14271543ac7fd619ebd0d1fbc5b69d746e63d9228aded4dab979c2285c322f74aabeba87a6d879d1cfe86009c95ecdd357b2157ce1fa3fd75949b6c2075f26978b0aec54bd23527cbb7a72eaa3531bc3522096eb858cf3d740f5d860c77c8780424fbf4a5c91da4233b86787259ceafd585a37cfe86c45ef90f848123946fc92e94a839d8ac614eb5c5f9f2ccaa2b482379b5f9d302b18113e046b4c16aa8e01660de877a05bec84ccdb648031230d7743a9f4c54fd0a92e952ff8ea45cb801c276544c96239bb5fb4f76502e3d574307e8720ed7f22dd9e4966be599a22ca27c7ab1201f64d320d6ba1b22b38ce57d912c9a7a4bd17eacfbe2cce4753036e254e9ee33b52082317c85a30a65f7f5910feca6f920a35e44c4dcc22d5b7ebf284867c59c1576a4d05d714e851d2976ad985bc16e0a1d2be6acb89382ce8a392bee4eb1b3829c8a7753e85c3167108563c7be9813fdbb9d655d9ef9e167f231e057237361920cbe0e88ef98d21f39fad96a3d007cdf96fa9ac27626c459eecd9e1df2355281d499a5198c6c01525be3689c44241ff9259fb12ad94f18736922a2286db65db6cc1998797dd7e74601e8e0decb4d47ce48596c749ecbc844380e3bc7c80cb84209ec7198c8c91f4d4f1b22edc59ec43f5b628d90bef280bf189248fb1c493cc380f3ba7ddb949b4709c955bb07b62ce167ac792c61a79a1d835a728b7bd188095e18563a53c835917c0c9594a3001fb42589903f27b6c051fde225964c0749e55346aef9d174126f3c33696b741802c0d5e554dbdb15025b0b8777ed8f5fe82e0f6b5ed742103c2075f2f26ca36fbfd444c838207c5f699a63db95a7feb77d423b89c8fab970bb3aa53ab06a376d272741151434426c86cdebe313ec7445d4a179a2645e21d1273170784d0352a7628dfe23fd2cdad0eee9d0f669567cfd480e6ddbbf4a9d57f8eb97c51cd03d640b2bea6b6cc2ee696ee7f448a3ea5754cec1bfb9b8bc674f10b5d700fac6e357680f16422081edb50a6a5932609c5f9ca3166e822c7b5c60fa2239bd7087a36154c3968f670565314282c9dc3712c5ecbd9745f2abbdca40eaf105981e67d770bafcf4bc1449460a22d29b4834e3ec51baafbbf77ee1cf24e4fc314e84e8f52bd19bdc83395d476047cb46c2f5de91b1fa06190bbe4e51acfd550e97bc3d9d1ef2002f36d5acc4eca6b422508e184b28183ad4750770a2fb695702671ebecc536d51cd149a1d3c18cc30d665eef368719e317ff633eef1aa97a3ee73cabd611ce798ddff53b38d665bfacf83910bd0775697eeeedea161542654ffe09b5420e19b03c58ef0e59c1861e6d32c3dcbd99f8006a2a6f29190d05613088f44b26afd669be3df4de70838b1b4e908064279ed0679562ef441028504832f98a64c628c430b7b982c3a8c13ab07ae728fdf132a64b5e08f5df387425201ea8f644d77fa9aaba4b33fc9411a647b6f51ecc725d2ec2f176611de1743ac47f580818d842a87e439a57bc61b7497724d21163fdcff832bc087dd654ff710dde5205f538301126769234aac991d76b39b039679ae848d629229511f5ce00d015fbda6a06a87c614855cd0f152e59021745a4fc23e7fe2ffdebfbb63fa6fb855853a2223a63aaa65c00417fd29cb71b144f06711b93c4a06f7d4459c908eb4d445e4845fbe475894b54c9ec2221d2f2021e74018bcbc24b7423fa8b96c85c006c4c690c2da841986646754b3f75dbc0403cf405c85df4afe0a25679fb0463907560a136837cad0f81ac97f24f0c944dc83c48e1b37da2ed1d99769964b93ac4e1b88ccca38faccc4f989fc508afee3fd29e3a977526c8219856ee93b3c07938590ee924fdb4ce1b0476fd6c78884df8b7df7392601ace579dac4dea6e3e4561a1af1617286ccf441ee05b38744eb08d41e1c0685e0d07895828dafe3a68c840e4e06c32ea397cd55bb69668472277133344f2f3e1fe3e16cda4013a1ae9d6166ddcda36eb00a395c6b33df9e1a4105655890c02ac381e8d4cb0d53922d81e3c943b086599fdf6ba6d78315c852799d8800e4b2150ef558ef4e1be9c468927ffec09820a768f9aa8cdec0a40961acffc0352f150465bf80c5fdb3445dac236315790363149b3aa719977f9127188ecf39c2b703d99cf4329bb54f99a548a82d74284b0c631e026e481c7256efa07fbba5232cee086f3730306fba90303578ea8513c15c9e63380442bd500c3f7819e3ba44f1cd7e89482e5ecc5cd36dac8f264743623cec70b381b9677dceabf3b0f535955f3e8a6a227cec75b59d20623ba836f6b2d321ac692a7fdcdb448b13dc042d972e20877cb82d1eed542d77a823a2bef52b3650607b4abf529348b7b588fc18c643e4ca635e91d69e60c416324364d501146ed341c3a0bb87de3dae43cf3cb315a3cb6e0b11236b93f494981b67020134c745fbe9de96f3263e90d58ce32750c73b4775956dee944942670da7bf2036aee5ffb4afa24228320b5b1a7dcc18ee63c65892ecd431b59de7a0545f30cc8481d15b73eec6ac5bea9698bdb37b7bcbb2eb8982fc3a934b4e2648dca7897b7ad4286495c96ca7d42218d56c48a99ffdc8ad02f3e27589285bafb7544baa4e14edac338b5e1d00e95d25d51bb49e48cacc89c339f6821b1e7c2c547721e11feecc640bf6d123523344da94ad0bc376f6c6df7083dc4f8b8be3460b81dcfd623192f076dfa9f49352c288949e8d0330ba17a71a7061696e313183bd2f009b06f301407b885ac46f4d589e68d7448480005a61ecdea07eb3b8fb80166e9df00235b338007e7223cdb6d692a770da99c5e2ee46f652d6f2f83511a756de06f90b6ed1f9558f44e8cad014446881b218c0b4aa4692bb5eed2802ec573736642a81a4068d09f47b126b571b26c862c09a7c01bf5d6b919c0a7452dc513167459d147754905351670a1d2ae456ac9342878ab92aeaa6a0ab428e8a3a53eca820a7a2ce14bb55ccc944e1291a0487bf2743db189dde6079747103b49ace8e27448a7e44a12eab4a89ce3c2b09d7a8baa8398f07292c8a022f2e3f3440025e20a109924c4c795435516b0e892fe7467d63e4ed80d6c2d9d75e742d86271b5feed0c5805dee62f0302e01e54ad45180c0e0926165ec56096f0999a1dbedb344993a3e853794579c575bfe6fdbf5d083b4639e0e4d8aab0e4912859f0a5e2c473faff8d157da77a444ed009fae26126e9b50f8df26473740f5177e256c803ad0a9a5f7f48cf496068675ad62a7191409897e4466b6a7cdd9cdddd110c5ae699641a303ec57a2e27529d0c3803f69264d03b7036c725a85eb1a6a703aa6391aa5c3a033f23ae0654677057f495a4bd917ca0484b955cedd3bb3f69f963b09d0cbf25bf31c52ad456432fbc74dea99d59a21c5f240566865c59a7d1c56216e9cc3753f805a1a7e9e17c975597c0b8d1726d5c5a5b4906dc09f07ad3ee2b6a2a8c31d80d1d7f9abc11a86561ccf4e16b386c39a87f6d875caafadb95c75f9ec94062343ebb51b37152e9e62c55a805a4e48656cdb8d45e2fa3ed09e3744341fd83519e0d43d89fec355a40c38b8b7eca6fd05659a93b11313a0beea467c5edc7df8fe02847bed9d3abe6d36becb3db523ffa95f5a1137ba5d756ed64a8599be974f220a76f524469af11e9eb616f15e949eb7c58f0660d7cadb4cafecfb60db2a1761fd3389a81bf73faf90d0620ec05bbbcdc93944e77f9144dcea715324a0aaf453145cb742e854fb4c4515f61baf952b461beb8e32f4c65413ec00c96e0204205992d8568d9b0f918b1b03200075f453d0865e8a47f34efbba72e0e80da57623f8920d2c7c6f1f00a34ff10021b5c46c2c33de0b402a689fa0f7b3aa0681ba544a9be6384dd0ffa140603a281d7ae5ca10d901e08af4d98dd61a801c9396dc2c8c5e8f83f901ecbeabd2ee25f345944d418c35568d53d00609f9c748529f45ff66159e0fd7affebf395c7e3375443f95c55dbd0e9bcc77697dd0eb7aa44d1f6d6c33c8bef4ef5d9862e04b28dc9cfabf30abb048ca0d762ad609297c2a50bf408128f75195e66ef863c99a6e32948ca97fbad26ef5cae5a954e28202ed91b35cdf1a5250c4b0d88214095d9139f642506293904d54ba7251fbc4a7fbd2fc05a9239e23dabb7d28d4350fa1e4657b1e9cb42f1e6c19010858caed8b020858ec4d71980b09ec35826e2e25541ceeeed1b2e0ba8965c04944f070421860684fd1596ca5cd37d114818f5980c266685a884fc005828b935ba94cf6ccc57049fd09e0ed2a737983c72da6b082eb3d9a08ab8c38cffc418fdc0a70e74d1f28d5720df2406301138b87015f022dc0aa9bcde09b672ad6c00362d89b02c0e8691651c7f299562442752a4c7d57a0b793d2fa1d397b28b3c0e722ef1fe11c3cb3c8fbd6de120191130e558cdd2983f06649055ba1f514af4b613adf436b7a6b2051412536eac516932bd60b7a7ff76fbd85ad52ca19fcba774ada3dfb686366e133c0e4486f0bfc68cda2c8f9ba6c7345497237d676287b38de55855e407f720f5e43d3c34751229b3a175d7a4f302a862ec0d90922c34b2949fb75e560b27e8c3312b5f762b29e3d2ab7ad728baff1e958a58e2409a1d1e9686a2ac49dd519f9f8188fcbd60a78bcafb87ef8d12979e3ed015761d49c3a0c202bd439f29a0b7d788d2a705df589b14cbc6a508ebec36a60ea55432be949f1e576f68bc5cbfdfc376ee3f5df1d9aa99a9df721c052c0a2be707fc6c5c7fe326a1c4479d0865035a1a5c4e7a26cbc553e9e52b62cfe7f434331620915a02867fb7fb42ff01a38eaa9c1d3f7595dd6ca6272fd98d39dd26bd643cf94a3857e98144d4fb00baa904288cf1226b0fa39586eb6cf1525b49df2fb9191d8186a6a9dfab356175b1e92973a2257bf12970d06b31ea17ea2e5d78c69613f54b632054f3debd9097d00c134038605e37c8a60f45561a8ec36335ab916bad3a6f0a5a29c7160499a55a44631103aa61c10d498536ec159d1062dcdeae855f3e6298487ae11fe08843b212eb1939d8cc4fd24489bb949d90cf5d1261e48d9e7a1ac854c6a1949eaa6cec3631222b834fa2142196b46d8ededa801e468048982d97e3df14698d2b3704f64c1cc9914da850dae86d52563d6e198f54eb93f39c8f60ac473e566a443c528e3c280c6047f15c9ceeae19de7f15ec2f738bd1076c9c8de8367a97ff31adb51c860156deee39eaa4f9f8699cbf5078bf5b10617932818478bcf93079bde26281b14c97b9cd04ff952a97a56b8dc30b1467ab10d69c095f2900a1c91e37e22f863629dde4e3faa45825e1eedec15df6898e234f8675df4eeca6d26386e8993e5ed3cad780f2ca43dd49874b8cff73291eef83f6281cc5bdf0d53da1f41a2647543467b826fc4ed65563dab6bd036493cc021abce964daaa272a745607355922dd826640dabb21aac7496296bf7c307e17ac481a11dd37bf2ad43980e5deda74836e96b688f43ad27c2809ca52cda582034bdd15ce782457b8d64d299340f0f2669e14098e3a29af95135346fa67f99830542a75a26d214a6b5ad9ed37bef430b2bf424c23a55611cca1c4eda749ff9357eee47862f50c3f35011945bd6f4e59e8b6ce3261f6ab1b763c84fb29a3cf9a2e4c607af4ee2a53b5f5ac801887e410e9b13dd8d0ebacd63615bfd61b2948806b5116b13a65222a6610b536345b1d21fcfb4bc80cc4a2e61dcd880ae4be7933a47b2dea4e1a52526d35044cc219d998b922c1b578c2d14371ff2e6e39cf1fce3121ca2bf8bd08cb5b5bab3530643eada8a231c393e9287853bdfe7c3552c922f7b51a95f3ca55d352bd43311f11b5a276422443530a229ceb6bcc899bda6eeaffbc14cd030d1717f41c73bbc66b9f5b85d81ab5afdea3fb4b469ddee845d0f4a004993663e097131c5997b073359acd2b6c3f9e033a258a0fce5433020824820111ea04730f389ce971e7c858b7b399a1d7b5581f0e95a86bd6ba0e14341e478d6500192c75b4009646dc4f49ae66c70b54e366ad34ce3e3692dfdc0a82df8830dbca0ca1f92c8586cf107ba356f4a82d244755aaeb1d991b49bb185b7a0f2d1cbee9bf7d35c4a03a6a4ddf4f455781031da7e600074836f3b4eeb808ab5fe816803e46eef94bb71f1eb3571f76171dec7e55c7bddfb66c14f602a9761269e4035fa674d205b89c710c96b9c4ecc05a8b45ddfd31690a2a38958c7833f528208baae9c0f08e8e9d14d07da1e440c4613603a05bd87c3839fb8470d191bf33a966f9bc7559dae7669f687c8dc0fce9c667eede2a14b477174d74ff1ee93f89592fdee63e6d2b017eb168063c1a39ca39b72ed27894119b50dbf3f7b039035e66af7f586da64cce8e597fcf4f4fccedc843a95a05307008900d8a5824d6cf63a5236b56373178ed5ccb24b386ce6a484c4d7f3d100b0b4167be15c1aa69cf408b22c65a5fe0385f67e3988c666768c4fbc8ed74d3bf205d6adbe96897590fd6f69490a774e5ae29d4ff8ecb6d1db68c9a0678affbead042765282082c4614192030a6f15523e75dd25e5403a407414fa2de3bd8aa24718e5b5639af44c6c900b580fc3a3ccce91a3bd5a4ce1f13b294df5e61a6e7861e3e7c1fd486b69247d43f4aaebf816e2de2274b29fa2eb5ed6aee1165a231a80d7b5bb214e98ff49078e4aafacfb328574f371e3ff05633b59ad8c43752a226604d6e1fec380262c92bb5e38b8c32834ed5c29752741d6b2bb58700e47b69dfda6f09b58194ae46f1974cafeb1427ca085daec8967e34a9afebf25da3ced95a3638825702500e2db106c1ff7cbe327631b8d602ab809fdf5e37a1fb03dcbad3bfba9590c92b84cd1a7546ce9c52569e4db68d4a9b910f63c5c28513b9746ffa474e4a0f87d99e5a8a0ae470a4cd3a563abe82257e31408e6a9e82f545c2c21dce50fa52a45ec4a64621f22b7fc838cfee595e14035ee02d0c2caa5e20db91e1c6bd0b408fd59b16fd6eed4ae21b6f1d0ae866d3075c31a16c0860705fdb6737dfa31db147d4eb0c275bd03d62ae198c4a7e27cec2c39e02f1750a7c9924a97b0ef9b1a3fdf976aa0449b27259e268e4465e5020d9e9d714b5584bb3721b329c450f2caa64dc88d406ce5a8bc88af5b7db8468dfa96a88454ce9773c0f44e3a1a316f6270e76425d38a80ceb897245cff6a7ef8edc076106132651e0f2a2781233b25a72521887cbd5f7b0a83736c4c64aefb08a1dc9144ef59351b86f64cec46645f00938e518f1f2ccc48e1d5597ce4245e3e1e9f9384d5be213400319a42415d630a4402573e8c3f493985a5b0de6e4d8176cf9a2dc156f3d54504929a467913e47555ee88cd8249562e2e9b4ec31120210ea612defb1a9577254ca558daea226e88850ffc85ffcd80ddfac00566ab3e6f287e2a134b329c706efb40a4cd129b0e0d2e1a147c56736662b5887fc10577e064ba3335b3b15a48f0d1a9309d2ef4e6ba0e8bb6f48d2c55dc217730000a9f6c9ed01056330c5eb39baf37082eb7187e7ae813616f690c4638269792b012fd14c8cedc0b0cadc2dd43c7446e28a12ae352fbed673d421edd5039caca5025c049722890e2143db3d871379fbc3e9d4c5ddb17896c39f2500690a801e354159ab1cadfff4a158953a2c3d468e063ad167359145b5f3dce41a539431d9b9afb5122f24596da20ee6fd31d765a938d6974b4b47d6970a124a7c8c9629d3cfc559c16355c6d3b09b684667e03f7305bd608c3addb6f7001531a9eee374d46609a5ee951fd1f62f07bda89dbb7bea421a8410cb344ecbe73dd4724e208ee4734d5e99e7d2376da2f9c9e5b4ebebcb8480a55cd85868efb399f2235d1a7fa83dbc92cf015dfb059ba80745bd6e7589315cd7a84b5ac14568fc76a44e17ea0590aab72b03e76c32a7258b56515894b9a9ef03b8d325a555dae1dce0cc4d3a54ce57bb03abac51b39be1b957c9f6a02c91fad48f19e2dd7cf4c3587816d7caeec098a7fb02879f1a483fdd522d156a6bf0cc796d29914eb8d7b67d088f1ae2157d5a957d33358551d3ebd4c8a47f916f0350a31a71c23d4254309a99b2b6468ea176408d22521264ca81060d1111823c94d0fd0f14a359736b3a9c223490e0b35672e16f2e0881bd9a263419e4b314188cd245a6dee528e6a1782d1b8907927d23ddb4f209a6590636e28d6c05f19af2f0a89c7f4b4cd6b9b0963a695fce11ee98b7610734305192e066e9094780eaf7796149d2a501643dfdf777562c42e3a46e45264c7e8e379b05c40414c392a85235a9066f34bb068f8b4cc3c0485f9813b7a8a3261b702234249f72ff85eb19cb7a8209d16b8948cac501f1fd4f7c893b544f2f1eb3854fbe47fb01171a00c1fab61052842f8a8ee2880891672c64f0a891b26d59961623f40729c713542988b638021d0cada31c6be0bf65b7ab26a457dfd758de6137a75399d91c2d4fd4f8a528afaafc22018744691e343934b83dd71c9b1a9eec9742895a6a0d3ff08eed4b047894cccc0e6da23299f8083f80be11739b0313967b6acc591ec68bb2fb34caba80c28b6e69c4900eeac376314891752e27167f863c6275e34390fbe08ad59927c0d00c285f67c7954f1e78bb85feaa37a8ccbdae4f5bc8a7fdbdb63e078d9de55898c62e0f80e805b04bbce4b61706db6a68f7972eded64c042cc796297749866b7dc9f45c7e00288915e02b9bf3f15ff913770fe37553c2bdd97918c3180207c6c2d8093620171e241d0014a94c398f8f717f449e74804dc8d374627fe4acfc35e9004b8505a24c44295463e23c4ba9a1a08baa57bd2df9558e552af7870db3f54cb43b10596d93610d133da30399651ff8292243a98d7ff989c35159345cb2826cdad5d1d7c66ae3e38ad080162c188d83e9b9c63488ca876b23ddc047e097278374e192d8eb912eef4abe75782f7f9c2c74cf82a4e867658427b180d21374547e19a76d89b5a45dd072a17f80ad065e00928b281f69898cb4c0d0b3bc2bc81a0e13ca4ec686538e4a8cd308caed023ec0b1bc4632326cee136152e16066bb8bc84742e66d0c236f1c30cb73db442395189708d0505736c48983dd2924126251ba6c5b0d41d798c56b07bd2df110a5c15c2220b211eef028460068e1888321e3b101052eb3d406721957b047a45805e0bb81de1ef23e62c12491e1189715942229bb974642a299b69d2087796c195b40701000000dfaaaa8aa4c914571dea1f7a20765e361ccb5e31419d9e3af98d3b57df7637b3c6b7bfed03718bb4dd8769ebf64ff6b7cfbb6346bcbbfe8a3ff08e19f162463cf87fab952b78c78c78d2205cca788483060f9c2332e9b6703a1b74040617693b269cf3254a9270ce911889e49c1311028473fe8373ee8373de8373ce8373be8373ae83730ec939cfc139c7c139bfc139b7c139afc139a7c1399fc13997c1398fc13987c1397fc13977c1396fc13967c1395fc1397fe49cabe09ca7e09ca3e09c9fe09c9b20c1391fc13917c1390fc1b923e71e38e71d38e78d1b3270ce3170de5de49ccb39bf39af391fdc72ce0767cee544ce63ce7916fbad9c7bce3995730a9c7344ce27701e81730e811772ce093917e49c0772ce1ffcf13e079cf3065c6f4810a6021b76edb4dab15681ccf9bf10dbdc4edfb7edadd87fcf7b79bc026746eda0c95ef143d79ccfb35fd3d633ade2b7d015d8f557fc73bfe36e73b377378320ed8b46dbd8d2086dfbcbdd8ebbda96e69c33e09cbfcce896735eff2dddadf1fdb5d93baefd1fe7fce59f33e10aa5419dcfb3b3af18dfb136aeb70738e75de00e9f9c2721bc7db16be7bf3d3656f44a73ee994b5bbbdcf4be7e790acbb4b2d092d0f20813da6dc35d4ece5adb4b9247a0fdec2a7fbbcbc9f53b8b8d7fd6f9b1f08f30b867270594daf5b8ce08c71638e72038b3cd0fefd6f7fcd1b65efb39e78d9cd9066146fbbfbeab68f69765da3ad7e72f23beb16de159db67a351fb6fbbf774ad4d8fcd6b4d06e7510bd6ac38e78a1c4eadf1dff69fa7f5bfe3a9f56f6d34eb575483b1b41c8d6269beb4339c0007cef99433d300b95d3be5f8e62a19829a796142d740af30a139ba5c5cef512a768ea9fdb6fd76f656bb76d6ff8ed15e16d03efbecddeb9fc5c6d96ec7357dfbfadf31e75c6902673ed3b672fdfc522bccd61ff65f0f8d30ad50fbefbddb8ef9a4b7ffb59d2c7bbb6834f965467edb986786b85d3bd9a0cee79996fbeb9fbdffcba5d2b6332728a4b1a20052ef081f3946a4483272a680f335e713ea7c9ed5ff7ae556cf12adb45ced5a3df6f3317aadedb1d3fa6fa7ff5fa7dd3baee9b8de4e19bd56a6e96af78e6bbf9d76a7304cdf76cc27bded589edaf6b75abde0afb9b79fb1b10dc7d339f659ebcdddceb1f45be37a3bb53dd6eefec4e9c7fa9abe6da95dc37bddfa2bd2d61f38a808c7c6067daac1a501eee1f9dbdf05beb1b501eee1bd713f4c5ba736f7f6b73d87a5f9b0b46c7bec14fe36d7df1e9e6b634bd38bb3fe42db1a6fe9dbb67f0dc37ead4def5b677a668cb5f6bfbb75bebe19ff5a1b77abf5b7fdb5f10d7f9b3bb53df68eb5b13cb53db6fe552d776e634b23ecde32d71a5faf313cb5b1b47c6fe36ffdb5ededd9d7f74dd3f5f4dffeb69f6d50bd6eed636b7cfdf3afdaf5d76ae936b634bdacedb3d37bfeb5dfded0d2b45ccdde5f4bd3721d229e843dc169dfdf1f5f5d57f0c69da084735ee54c0452dcae9db01c73ab6d4e28d49976465fe7f8eccbde6ac37fc6c6b69dbd3d60199db22f1c9effedbb5d16049e7f996219dcb33776fe72bfd2fdd7f4f5aefd6d8f69c0799250324f524eb625d5e8cc79e54416a17ba5dea72365d0b61e17d7a1643daef70446880c11f2ec73fd8af30f9c69a089dbb5936bc735966f2920100c2bb3943a8b6fee948a706cc561c1244f979038259c356a59376c9c80225d535e4981b58146e16e920a33a50f2b627ae8949173ce08284d34de39a070018819105eca6d24597f535590a8cc4a49d88759e3910e1b5137a2940a6a307becf9b3025af62e95fd4c1821e60f43473348ca2513445210724267832b5132d014453e3e203dee988292671ed5c8f0a60790bb383d492741dea0113cccb304869c640d3c904de4c4087b46d7243bc8c09280088398609d31c9eb985ea6869a43461f5b927c232021ca3a3426c54325097d22c78ae0e01f00ca3049622dea42a3e62123c761e40bc9478d2c6b71e04e14e8f1dea19397a3ca0cc8691e1baf971708981c0e100372898b37f20b9b20972f3010e54ebc2c424c08c162420d2e591cdf4526837a7474e7682d66780f0f39316260a22111c4fdd6edd0f2984183d06203f93d00e71d04736d5100825f29167db1d98fae3e10383fb405f1cb519d852f1a83dccd072f4d29b888fc389c574142e7bf9df85224c81ddf2180750774cd964707381f91e3ef80812c1a63786b5c1b409ab71e44fe3466391754b121ad0c0640875bcedfaec42883010cd3d512cec13a2c80636ce4c2c991736511c6405c22ab3c6a921f3f6b7c30f97252191b7490262d41f3240b029ead6f9668d28c1354c638d18023c6089ab481ca9e269845932b909e49d648229a1cfac0c34cc999b43784008119b1cd42cd9a494e3d87cc2d081228581a33c96ac6023c5dce60e010b945922332480a107e28d4091549754a34156a6445c0552213495ba2dc6d5ba80852c34ca424218d844ccd8cb835b8e82149c58f3a557240d90345850d49771d478b04b6651baab8902401861f88132ba418203c216901182a93a86b589e828e920a88a84e95e40c0d4c6490f4d4a449912043263542b923114284a7510b3a5a0c19902305c083c81582d414ce22389294389132010d551f8e8791205b24e62833a500181883914070997377804b0d19297c91121dbfaca993a6cb020577910095bc611f21605392222e121ba1b52719590822f7ac45ea820c61864c0c2b31129945e26d6e10620a78887a210089cf230c40f49b9e8c3f2f4862b2305db4f53d2a74b38294c4431c5517d14919c32848308c8cd95b41c728a89db4848401908db1c501834c888104c9dfb010a9a2c80f304d1241ca53f3e0900c4a48e38320486628ce841579e400294e0fa42600852b084913d944c979b468d2621248005091f3b7e6911c225b49595e6874092369cc232c7cb8cc28e5b8f0ea70ceb91f1fb34fe0dcd3f275da8d61342d777e76b9b9ee6ff9c3bfcff5fa676ffab9d6e3ba7dc7d818a6e77708e7dce6ccb0181b57d1b4dcd9e99412a0ec5202d0b844d1b8e45b42d05f26451d983f1a9594a2980cc0e9b0d4015d6645f520b254a271c9e784f5e4a5f5a1d129c25282120cea5e8a6aca6b7a5b7a522ad07a5212d3d804a5d1eab083939b12c721a83a8d4acc0e5c6c1aa3ee31001a9db4a6924c0a94d0945c8cb882da8ae16179a25180980031e55913ad49ab39c9835282a637a638a500655c538f46651f146de96929b25109b5c4b53483822adf65d4d2ec294f2901538425aea5a7a50a515651564e5a4e584c1194913c2c7129917850fad258a0c252dba705be96d128014bcde5ab3c53da2d01a3b296924c864c5d4c7e4a5753ef1294526919a5542a934a266593d2e9c96ba9642264a21200f8d4645a627a954ccbb525daf26dda527675700a5322d23815d9a1b9b4ec6abaf3b0ace3616cdaf924497ddeb8417306cc172e5670c5235edd0239377a263408ed00534013d304097f7e93caac4913a6e22923061da751a78d192f569e1c0182e63400837babb06b45860ac909600d97261c3650389400e1cf8f415e1858161695291c8e18d9a061fae545cf615375e858d0364e92c468d1e1842cac661b2f5db05879e224898a1424a6142218fef9ed9929d3854c15197a71e098f1c2c50a003f7a9800f1c150a136015801808a12c7c60fefe135a50aedd153070c97295298085981e2c3530a87130cf7f01444cb9a5266ca80b9516385e3872934d8cbc353c0f7e83153264c972952982411c222852362833d390551b73568195573c927edd143270c982e5ca648492284c58a14281cf14c110f17a039213de27320606a8ed7e30913100c9f3b5098e83216719aa494948ca4f42839401391e590a4902490372d095d3e5f27d4993281b2638525bdde2e262ee5d6abb5cc7ab19caaa8a894cca580a829a61457d41694d753d389a9698929b9b4a4a4a47cf992e35301318d4c4e4c4ecba9a6362627e557d46007bfb126b2a5a7a6b76594807719b5345d2e2aa594cda59b0f341a97a6924c4e4b33a9af37238d4f8551f0d26caa4372ad4b8970f92ec5656994e3bb6b7e482e9f967c658c1af9784070a6c3ab146d86d175482eb99467db576c4e2941008d4b4b61808e5702ea4028197410d1b8e564186515657521ef6adb643f2d6a8cbb9d18505930999c94524a894b12273a342da796be5e016a1dfaec7042c0c6b1a9518ca92494125d93096ee9e04f40e2a14a89ec29efc9c0d2e11201139c87283a187818a2028bf97494b2f295d8d208c5bdd6f8209526e02df4522a60da6aebf0c404b7f4d434a574db63a0fc7aca5bd4f8c4b42725d8a4d78597f7e4a4172508c74569cc5a9ab53d2d45aba4969ea0f0c628fc687c6ad203ab9a6854523295dea5074b4f4a0a9610ccd541719d0e34e92d3d316d49dd391158fa3965597919e0c242d094c041a0810e4f4d4e26352935b73d40a6a82513975254d9e614b53cd0e9989c989e96684a0e966f74af5297524c09ebe9d46455c2e129d06a7ac27272eb60e707b5d644b624b024b034a411c1d4f24e298112981381a59700a8f2cb43a313ed555e95674ba51286310a2d00a0e72346ce5c417264488f121c3430da89d76fa552389400a190501090af815ef44d8dcc4081017dd985cb244282fa2c982b30c6b5c50449660c901f0ff01644bfaea2a096b65091522408901e3c7440de20243b80e6ac4163507012a444550984065999d24d162ae2eb9c8227a6202b1edd9cdeb81112240ad7966505f5d4c4e4d5f5c4c9e187fffc1aece5e145d7a06554cd29a9258e14244450d961ab72c4c8100e86856e6d5a564b34671015cec9b539312d25092145c90e182d4c60c88103878a3fbf390507a2de47ca01928d9685faa0a49f659fe41d253b2f9c649b241ba700a2d624d124cd24a92493288f241397155e026f58d3979297d456322b79f55a35ab94a892cd97b99c4a42293d259d9a9a924c4c4ac9e5ab7cdf25fec4b9985b805faefa7b8eeb2d73cb8ccb557f73b55b4ddea3f0aff62eec7f2dfbbe45baaee9ba2ee3520332ae64c839bf39536bcdae9d73fdefdb6fd1eadb666a85f5282fd448e54c5a26bee44bb9973341beb052f365e2025e25ac77ea6d4a5bba71a58b251853b2a94969a97c5f9e9574f2247f1f2c17bc9c49811217b0f4f2f77d9594d6925049febeaf32a9f7be4c6ff27d954b17926ff2654a6205beefd2cbc493af9453995c5a227beaef32995c3ebecbf74d3ebd8a92af13577a9749e57fdf0ac9f74d361126bb926f7269997c0325df7729f93e78b3de57996cd2a2a4649a7ab1def77d9370c9ab26e57be34dbe4bc9f74d2aa76f72f9e4b4968c7ae79a5e25024ab99729995c42954fc9e45b26a0edc5b08442e52901937cc9933edea5926ca9947c955ce9c58be7e549ce6432dfe43be86d4a2278dfa45232a97c5fb517ed6d7aa392c96472c9ee3d904c2e93ef53e984da6a32f04a51712563bc4ac9ad77f92a5f9e044cf6a777c993f112efd41785928b6979395d97a4f25d7a974cafd4ab94914c364595ef9bf24d26973d19e544f62abd2fd373090d7bbec9a7a5a624d3fb46df64328e72e9754a2e958aef5892fbbecab3d7092af93631bd49ba2458122cf9a5e44afe0a789792c9576ac9542e935bc964f25d7a97d7d789c00ba5947c95de29b7aee41e139453f2ad36453125df076fd3fb2a93eff2d57bbf927049af24549229a9f42adfe49b7ca3ef57122ac9b47c954acaf7757b952fd9ebf446bdefabe0054b3e2999dea6e59b7cdfe8fb2e6125adde65f2555abe7049a85799047b95ca6472995cbe70c9e4cb957c7a9ddea665f27ddfe8fb957c6252becba6e5fbbe6efdd542d014a74ca0f42a5fa777a9f53a3945a1267481bd03966f32b99464fa2ff3ea09a5f7bec937f9beef1967e25b2e81c35b28c220de23e8f0732682981e41861e8f11c23b76f8a0181c2ea803cd17f46678a00e2a3702c5e8bf073a2a1402f46b747c3ac010e979af279c0e2d34383f45c4ed8e140137b1a7b7edce1ba98d3a09475b97c49dd4476067d42049333b3f68b3fe449000d28c5018b54785f52c2a0e5985c8a94a2b785f7ee05cc90fc938e7809c730d9c6945c0df1e9e7e98b6c633774ac0cbf75e1d0d397f170970fed652515d3218f617cac8be96b6a776ec2c23ab72ed29fc13ad3f6b75deb37f93fc51160c8cf2769173feec73dde6ce31576c323efb5cbf67af75c2338df5358cd6c5fedbd7b7ad24c8682a87509944b300721ae57861444885ecd07744286b0ca17dc53a69702aae4e8d84afab360245ba5c91185062610ee0851b01661accdb443a805da8aed044b87993a306408d8809329c195ece937e7fc20c287fa871d8a24206099c2d4b394d6acc281234e0d68326e0ea2d92b2ce0c27e78bb9976bfd29ff2c7094080e901802cc6f02c0562a84bd9c2f079d69a513404412eac0391f10e2108d45018d305c49d11dce65c068e402eae8f81b0292f3034cce957e38e730e7fce9fa616bd5c3bdb9b5b1ada9a5419f88139eccca9ec8c834740d4f664f187a8f76b38e2101e71cc152524021be5426f9ab3ce49c3b72e6d4a15d3bef9ab665d96b6d34f8d73e6ba3dd356da37d6b2cdb7c9c39d5547fb8a6bbec6ffaeebe77e5dbfaeb9ab67e1ab6cedc6b9f693baefd564b5b3bfce15891aeb767f5b7b99cf338ce94dad2e1994b5ffb59a722b6a975b3b409d4feb1b3afe3fe63b9df3657dba3f71c4f1963d8d7d3fab6a75ababe72cee13853aaf14af79ab67dcfdef162af3f3cc75efbeb7f7b996b95bd952975c839a7eb7fa177abfdc3b1620c77faeef756fbefdb2737cc5f66f4daa48427def3f99f4da07271fde99c5a3fcc64c9f33ac77ede2fc159cc0507f718ecdd4d19ec094e2148fbaedc6af60cefece3fd37aa0dea7d723e9d55f85a979beb6564f3979df65dfb2d9503cf03d53ed7119f13aedcea14ce3923673ee1e16564dd7babfd533b765eb95531eb87d36ef98aa6e5ce4fd17efb0eff446b3cfbedd394e89f693f6a9fe9f8defe7133ce79a1a7a6fab6994e6eecb82f71a69310a6930ea61306a6d39653fb95ee659dacf70fc7f61c773bee77dc15746b5ffbacb5fb7ed373b7e37e77ab4e7f4e0b9c14309dcea8d458b6cbba5c5c27ebf0fcbb5c5c9f63ecaf223a9dce09900471dea3cca6304d4b984d3c788f3ef5e87dfd72ef4fd43b8b8debdeefeb97a9f6cf5a6faf95139393e39c9771ce97bc096636dd71deedf8676fa71e063877aac1148473feb9f5fd6dd95fedda09d3da67520a0edae77a5d73ad087ad4f670706f706e706d706c706b706a70697050b8271cdcdbdb9bdb5bdb1bdbdbda9bda5bda1bf4edf906e7f6e6e6e6d6e6c6e6b6e6a6e696e606757bbac1b5bdb5b9b5b5b5b1b5adb5a9b5a5b541db9e6d706c6f6c6e6c6d6c6c6c6b6c6a6c696c50b6271bdcdadb9adb5adb1adbdada9ada5ada1a74edb906a7f6a6e6a6d6a6c6a6b6a6a6a696a606557baac1a5bda5b9a5b5a5b1a5ada5a9a5a5a541d39e6970d037a81bb40dca065d83aa41d3a050e8130af77c7bba3ddb9e6ccfb5a7da33ed097d3e9f57cef99633950a71cef8b46ba7963ba3dddaebaf696b09a612004c251bbd5bedd839ee37b7dabb1dffecfdadb357843997c0994a506ed7ce6a2cdf355df59cf3019cf331ceb9180fe39cbf719e5c931cc239a772e6f2d1ae9d37573b05e39c7f71cebd38e75d9c732ecef91ee74a81699c2bdd7daeec153bb5aef1a87df67da63bb58c6cebebc5991b8dde32d7fe81d40e7f59f656cef916e7fcade21c8b737ec57915e79c8a7366d2a9a432955498ca2b3d6ac33397aef62bdd6f2edde97b7ac7f2d6ee7271ddae9d4f279c137a66ffbb2b804b41dd5cbaebf938e79df33792730ec5f97b85737ec899c92d76edfc306dfd30d4c9e67c9ebdb1d955b42bf4f96483fa6a352d0d76835edbcee8d869ffdbd75667b7beed18fb6b341a5b7bab130d4eb42e2a7e18cdaebf4d88c6399fe23cb98173aee5cc641eb76be7adbddef4dce118ee5affebdbeed839eecaf587676effd9bbcf3fbbd86bbaae7f9f7d87ff5c73ef5fdff3d77e79ab8dfb1dfbfaeed839be6fafade96bf79c7327cef9dbc439675ae29cd7745de371ce9538b7c0996f1ce75f71bae8eb2667be9d73be48cbd7fa2bd2bd7bc756bff55648feeee09cd39cc91fb95d3bd1bab5afabb18c66ad6db46a2cdf36b746abc632dad399f6e6849ec95e1bcfb1f6ecb6b9f51956cbf8d4d68b8b70b64256cbf60697bda09dd7d4ac17e00b895536459811edd7f46da331c6331ae75c8a33b905cef91567f243cee12fc7fedaed7f77abbd5f696fa565d9f76e4d6bbf9673fe7226d7e29c6771263fe39c5b7126df9abfdce5e2faaf7658e6d259bb97753b26eb8c1f9ee33ed3f15d7f7b8ecb38e74bce7914e7fc756a41058a5f696c9472a5930c1b50cc476656892c13cc64876226478c6062d05a5097ec2292219822947ab23b8e08917c5b2cb3463043886581603a8e28626181343184524ff6104a63452c2c905ae057a4cb37f9a678662832b8ec4b3dc3b26750f60c450699fa9b8187e875ef58860d4e1b98923d4b0473c3db971dea492c2b047383d3d8885ef7f6a6b10d4c634b631f2af4e79b7cfdf40f3d51a92795c6ba0315cc658f83e216a0e426470f1d923db9542e97cab70914efeffbbe504d5d492cf1ed4b169452a7e592a969c9f4b4543a31313d55503e358d252a97cbe552a95c2697efdedb93bd565476a5b19ba92bf5778c4e2956218354a9a92bdfa69e7c4a8a253e398d2532f5645f5af6a5ae5421d9df44a6310b4ae9d24206e9b242b227fbfb766e058a27bb124a2965ea5050afb44969a9b814b3a0257dc5926216b4a44b63b752ef5df677cc420629d358e2b227bb9252574695dd82549aec4d6f324b8b57e946206b05331ad579d752ba41f59749a984824a422539d4d258d703a7fe9408e469ac9bec409cc6bacabe402ae621f9d63526a398c41c97bd51d9df9e4c36f5a41460535f8a392e353cf5b78943a358880575caee24e638e2ad53f6100bea965dc924e641e918d547f4baa7ce24e6d8a8ecef98e3070193264d9ae441d99fc61a95dd69cc7144af83eabc51e941d907953d099874121bf1d639f526b1118e2116d439f5116fdd53874a8a41f52514d49886274726415e0735a6a1c8e0537fbb06a79eac7b12632acb94ba9358882216164c922e8d2502e9263b90eeb2330193fd95ea7a00b8ecc9e4522394b2f3a5e652e773a44b1657a4c9262e95a71cabc03b53576a922a5930214016c58333f1a5e6d298561ce972ccea85914c42312d259b66649cbf4d4a2d2f142bc6aca0a2ac52a48e2f41f1649b85071c6abc58e3a18d0b218f1eeb94fd41b247a3161b889258d95397ec1c011497f225981591ef0ea8261eed7a3b97765978277941712c454c0e66850de92b6d4ab671308f91d2b74759410948f657d9b9b48b9f71a8b7c9494cd1c2db487a7b68945ae04b4de6722f861cb1bd187692645c2996ec7b310ae5297bb227c7a44ba93c25df8b512849e6c4a34efc8c77de3b2750e16d7c973a975658ea7b1b1ba54b9d2ec9c4b4b4c4c4c4b4d493dd2bd9562fa54bfd7d97c4ea26a9d252aaa434e6c5b9a31490d20a4c1491d29727c9c640292d75a56ec5a4c5d4957a57ea04da2af033804abd4338e4dd496c2dc9c6d9381bef4b62666f4a3daeee4dbe74a0f852d32af9bec9f7957278df2e144f64ea4abc4b936f32e9284dba4525cb9696969494964a4a7da9546a625a5a367b924c69a9bc02084aa94339292965979d3f3d39392d3129f52625a5a592d21b682dd9f6e416d5dda4ba52e7031c846043aa3425c69d1c8b402df52527a7a5a7a7a5eec434d6c5d4c5a4a4b4b4a464e1954af1b364bfa394cda824591318145ba4159a96bc2b97ef929f71a91128ae542a95587e98894d5de9996ce3d1337acbbe4676229174d9cd00936e514c62566215a2a44aa5de9424532e35f1312b292993180773c28eb449ace9edcba5141f07e9d8d253d32b49d6954a3bca3f5cc40c9b7a17ef4d5d43862281bc8ea98b8f092efdb0512a95cb5e814f5ac17c3b2187ba65d7a0d441288d895850b7ecc964928f95f9f625679e91566852bbf25c22512e9f90d20a0204f0e8e3894637656f11294d2ae12dbb15d9ab7c95281abd25ff9463cb3109cc0a4ce9526be90526c5a374b9ec6fc9b638b2b70ed2657f2a354a97504926290793628454991c5b2a97527f496652b9b481d586c9c1982824ad0097345b36d2c3cfc49125978e2718956ebcee75918493874937a5e55ad24dd9d8d818d7d8d848a68cb24a0a72b35c2681e2042af037b99cc24c76be8499ec564a98c9cea13093cb2454126fd99362ef9380ba0d4aa8a81acca5eeb47453b781378aea9c775ea6eccade97cdbd187ca93b49152e2ddd18f03265af1095ec74514c1e4d763152655f72373b02fc4cd91944490bf0321acc2c2875cbaed4ad4030b3a0d455e0859a94a698965e0f4a4b25e5b22795636fb227034935bf4926098a420102064dbb808151d1b1250c4bfa5588080b357f183df1f123310cdb812e345f66b338420fd7870ae612952c169ad53af0d25393146044742b2cd91c89b89a12438e0945f510863f865b40d82dfae942a0216a6f3be508579e224d7eb820c4c31c20c581227cb87ddb327c2b467835317205074d32834a0549e6add304d0803c5b5c22367c4d8292b5c7eb0c79c09171ea305d18496345cd140ac832c52e60829c12ada2c011417b49036d525bb3f8030854972d3f0fca1c44e952a5011d98178f8065a030a16951cc0c7ab5f9653544ba90d641cd4a8e43d6ae6c801d9ee48d0c6eac88356ef1d5a91344245bc1f97027676ad09f3a619059547e0a31e06a12c0aaa21ad2c3b06acb54221a1866db064e50880934e4c713ad26544b5c1e3d39810843e7f8bc0084c1f0148e58bce083beabc8a5808cf6d050d5a778d52012c80fb228af4b80c08f325a5d0d8d1b86681654a9b9c9d29e9df10056d6d4e1ae0897146e78992fbdeedd0eaa373e00c308aad165c01bd3f43908c327eb71aa472420590c655cd1b1640747951c5f37959f5c5389001b0a81d193d145bb449535b1e59340c01aba50039969862581aca491beb0266ac09830fba27b3241e9cc4b4b043b581e7a53046044e0710fb40b6373002d33ba2e52dc5b8a221c150bbca0b01871b801327a4c83e68fd50ab5a93c535e585cb81460e33285b04668c2214d0d34cd140a6ab84963024b246935e93c3aac5786c278506a6ad1da8984e34a8c1c1254ba66b9b110856b7b11e4946acca9894cd024c087ad85223b45da7419d081e9ce418dab392c4b234410def43d89f47b57143a708101b2e4c9134d808e0231ba352438196302d0742670c357bce5c986c8572b49005602985862bf7a6c61db43c1f0a540a7011799005c1af74829b2a3d0441016272fe63023b8a8b1554116a54117748923aaaf2156b4a32c7c4a0ef5b1a143526754e8e36acb44a3b43a758ee8f81046831036333f096183162d88d1a606093d55beaa3c2cfa42558a22f401800f9636e7a2343368891b6d5a8790782390163e485902c0133901ee3e84a11d5ee0d243a14708d5c897cabee851a561c618402d04237fe4c893c83ca2082d44be001e61044e0fc1117387ba4cfc80dd747f7243e0ace8cb56f03ba2353656d514041aa2c4171a677c9d8533faaa302b4c1a393f6717b038765b4831868143e4ab4a0832d5b73716f6c46074864da4158554306e3a44ab883e681b06c01382c2053659714dc09b4a6ce7118528350e2cda32f10575d5634520c708d1b6ec6b08518e415406040811472dedc996eafbbabdd929c24212c4cf8a49937e930b1da42096060f791daa1973c261d282b137622bf83000e46c4a512a5222609208ae17268fd0041d42c422734404d662522c08b703ee911f67a22e253fd0f8bc4db20bd2f4f4e5029e6892e61f903984f2e428b1a7b454858f0c7ce48ac78a0012e58890e3e4e9c990bc0a9cae28c5065dd408d1a3ca8223e20b17e001b30f984154eef6c840f9f9713187bb10bc12a3522191f090ce6f6c87142bba2858ae0a09402c215802e88938c8ce00ec8385e96182da003848a8e4a004884dd33cbeb1da6168922034875863fad2fc79e2854dc09618231cfc282df1e2e019f428102519c80ceb136048a9c290191b63bac468a1e3b63ad00505b8b307d97d98d4488e91049aada79fac9f178f7fd6c09316f1b189c40bd330f6614c8a22027b1b1620b21365585865846d8522266fda8a0cead348667202436b469645f69800c70815742c12e1d44301d81535260200b5f834970637d918a906556f1d90c4211b613f8edf88191c46f8692d91c191b4dd8105816308acd4a950056352a2a18d892a43020c0c6942b7b91b806a8b99143f9c085214c28820c9e763c22b4b515903c2405c08b26143b4423dcbf325e8e8a747039a6e564c9626686f708754836949fccaec087487438424721f06c0c1fab300718707073fded4797e9dc823e88c170f156c5063741e1f0b211128e4e567d9e403d7c18022315c12da10636051359558532f77b64be4ec14d29208521c182fecba18457933c68e5404b34487e2a832445d342fac21eb514d8654b6b2be09143d6e5cbd21914626e0494b240c716e9005a92d5d7f813628a122e374d5672dc510a9076bcd2622343407570a1441d2f806815e2096ab427a80476048d0b6bc7408b8e1602d704542398ac2e7305ac70a4630b0f9f6318988c86085e6a887181c886baa1a409eb162134fd852d0484a1208457b5a5f7b4bae2865923a251635371ca86b502050038fc9c0c35f02276fc20c72034407179b3b515611aa7816f578941b92020d097f6286df163da506933e267d5769200245216465479898211e747831aa040e07ae41128f94a8aad360450f394ce4bca960842cb3eb73a2d5e6ab6daa0a4f55de92c22f6a2ec4088445e9f9b042061c195a54b30b74dd326d55762a4d74d2881c02e2bac6641d44d1a3554715028c950a5dd4408d59f14021082258600cb20c68788c22c804a2ab8b026f2a4438ba7d374c240eda5952e0c61b4424b29084c8d2b11c948740ab0e2125c06de2970d203748e495b56192230b50971e27425075f093852b068e813379e643540cb45993355645543577060908af0647129f28be78017a74c4cd94a39c1f56c40978909244a9a8e6f4f571aa72ea23892b025495415cb062b8d041156338c6478224e457a482a2975c170c144967562e68704a3006814b55f3870c5685434e8cc81405a4285ac46086c5642a2023448b2a31921c2953124004465d2e9a06490af21619090757a2b01248b8cd38102fa6650364300f67dcb4706264efcac48f019c209219181800620a4a8f0871b8063d46819130804028f21a7825b30d6406c065d3196416e385182b881ae9ae6a574f9ec946c8932a18e68e14a20272b8c2c5e788306ab040249ca9098218e11c4898dbae000e308971a249cf912d662e4f19ab1363612ce8a8423f4d703b03c0948d2c5b471268987a320b33e690d2160158d81d624a617092759920e94a965d0d2b0c1516ad986f1c29617448d2f6cbaac31b1a78575b574cc6b02684008822106107206723214cc2208c033c128ba838db3ee979a10c55c9b8e7b8e93280af9be1ba54a611c8a2d60616577e8c22c362c4e130c24347330886a38dc68e26310e684833adb043889290aa313cdd47920d8c467860d8e143088f125981680431f345070b0e9f04137f5651f2179f0e82c93d84361eeb58708ebd1120820a0953cd1d33841de098f84125002f429a641d5e35c1b14380e781f35186827331f6a5c6e580a946118d3d17d6444c31394240b5a0d00cc8b1db6846a6aec96e792405cb8ca0123e0ac4b8a364d075f2b0282ac4eb439f227e73a437775b860ef22c0123d84cb31df340890290302ad8a8980111d76031889af4f39c3ca8a236466d4f0f77afcbcd99057332ac7ccc1aadd07921b2a8d1c47a3820226c8e8e73667144530a061d5758aa49b27da6a0d26c795101ab8c8b4417740aa2968e268517ae942d3596f804cc49575c331279701427c485943b805e53aee6e0783a0b3c9e9850e3e8cf8c1e030071a57874f49822cac7fca511cca5ccf4306770d5180082973e5faec65c63539c002b2bbeaed1204777e65024a7fa9383aa2d42702d9e20801221c5b36e4590a8396d986c1f20055e58e2d6884e590da7a6272056757a1e61b7a84a8cae98bc621a48016e09e288d2d581c274c7114bce793df6080b02e20b9aac1f4e81cd3f7564783021530546f08607235eb8a87100057325c403ae352588631e09dd277a5f92e29e40f6d0810162f1c30baa5580ab8006317168e83c5605d6008206c791aca7e19c634999804beb40dd8a2e4b12e440d236c8f3f241d11d3068559b9b08432e148cb0e1a60b238a404527f2c5c36411241f6c55260775b4b4b26018262754d7a694f1208504181b3a5f5f1804653914c50228cb8038c1f5c40b1f545adb511b384a5a9442b1293d6b8e88aca6338dfae4fa70c0121952e6e76bcd1f2f314a6d54147e2a85e18249b54083014d4979a490201cc61921c9ab501543bf42ac0d36a830cc3755a25c0f334145c4027981d965713568662d4949bd1d7053e1da64f167d0766e60c4fa85cc4eab4f5de315a31e15a248cc8900494a9a601db1aadec545e1a822721009063f00f861f3c7d04fb38cb17e2386c9a03e0b8b0f423c6063e8ca66a3e2716e47991d320114e8c387af08d799316ab75f032611de06b4af53c70d330b0748322483903c812c03e24682407dac10858d489b83e0700f89e481a5229f3b5c687d2a2c707127020b5487848b0bc8194cc4423bb054c068b51074328221831eaa155716f312794401ca81315c5c875f8c5b2cbc44ca823540db156aa5432222c0268c5137529a0d285a2601e0f403066d1054d50091730b7420bac081cd9c071aaa24f2a2e5c8b0cf4c896d84b0312e7ccc39b3e028ccad88989d368ac65a89626690b1cc629587316b61081ce002d9668d980b311d9eb4ac1ca4908a409f384981297324c9f7816598526170b3818098070a6e460d8e20aba4a624a2c0fab19944c5854c8c1f9565161a04795b2c63270068a3584b1a4b54fae272bb893294883608c5a0802a4494ba50d588999ab0f04452a43548824d893c36b2eaecf4c278d5a852538823f9ce6c7cf8a25ac305894796c8328b96595338250faa045b1ee7f08910f946c892a2c6871d79584e9a34b99a16ca7a91a8a5d5c125dc78c1d631094f047965f15a20294da422299a005451c4a804d10a470f804cb2a373a28be5d4d66cea20515cfcd19c64c5062d46979426332762d87071a502c606385053323407f13a3ca183450e8a2e0002f418103aaf8414e229c0a61644e2e6ac05570404ddaeaa481a47f8a6fcdc987a63648710378b29c8819d222a483ca892e5a121e88510b4ab0314dcb84194e843ca12af0e40a6545de0b2d0a642c0334f45d934cf8ea61037119821b26cc51bccb6ba7106e139783af06615a4cea165ce933037817fd8dc189364692b8d0a064c0220d0a70cb6071fde82390c9803669c40a3e4c6bcc3bb1c21c200109f951987424a798e016cd1359a00634b4f9d2db71c82966418789aae68ab314052c80a0321a24fd31cda09465c47015c23b837aa96dc85be813950b884d424b62ff63c6841069a6dd8be3020266826c1182935f2807db93ec1112585161224cb222b7feae254c9d1a565f192084418a72e1c374360c068453d2eb0bb8680c4997003c865509c0230014cfe0021cc4d2823656046b198065460ce2461e1761706481fdd24ae1d61535919eee62ce27215e9415f3177a7c18f345f130aaf6ec509197c649ba4987103300455842b3259308ecefa780bdd9e0c1cc42234812e0ba4c5ae8723d3269be4f3c78b481a13d1941786514648fbea94903c9a80263590412857a84611d999bdbabb2bd6b7f23557e144e48843f672028b001abb2639f5a450426b43044d00977ab1449d26070d7e6eb4c8f10913298e832de164cc559dc31d291249513550d91228d5c21cba0cd5c4a4256142b99140d115cd972a389a588d1426191962571574a9765f8a1fae0ebba2151a84cc68184328827ad610e05a42e6826e0434b89741801f593a4e66cc238e0eb920617117196435e22dc1858a551c464b18793d69be89670c7905584cc045a50832511e3d6cfeb6702b0fd9358a980ede38ce98a2950cc1698c42d30104971505337bac043e79991f74a6d21d3ed42dc50f75d00ca0e8eeedc95a314998360a5b4380cd00859e6d6c50c8b2e5f464b4a84a4f8ca543366021b04c81fbf301008d01b4e650f19208ea07598d8089870aa7144ad855024786a6542849c184c489da511a03555a0519da846c9999f10c80911739032068e99598702748b5e3a0018a1b458d99134c42e4a1abecdbe0f4d04f908c012338aa4691597d7ec0da9419481039321bc031cb499baf1e457e01357e3d1931c215f8ea71424fb68f97e4ef0434b0153298a942b899c2f228c77358c32a232514e4238b2c0595054555dd3aaf57073444b065bc0e2589315543805088c5ba230f4b8a852acb88a49869d1aded8d0e5e22993f5b58376800a0dc2354527ab962d3058b75ea85f76a1dbb86e4dd4189c3c768818a5b9348d753af6890080811090162185cedc0bafaf3a582edc6d21e2489820068c581eaaa61851129977a39bc429015c9d124d394828565ddc153c46a41cd1bf94362bf5af17fcc81330102153f3d335e7ae0f9e1526485f902f09033908fa38c82c2b0ca7c13a30262600c44c12f323c828d0a715c098874970888dc1a103d36979f45321e972024185034511dd0cc517187c71a5321f3d630a7ce1810340310740558e28e30ac56dc202c0cf4804ba222ad2c83461f53b69c2c8744fe30d0d6e510050f11a86610309b590011e9d3064f9c2186e6a29c0e18acb0d47c14de2103478c36420001a8d1f166abeb4a8a481ad2071bf4903870a057e22fac8a4489e115343ee6c09143018c2b324fd50d23b4a29b0f4c4382809192e64ce49416082ea8c1143cc0bc08845426c2b14d13ec0735459912be29030099a2f6e71ac5a6ea0024087004d08a320409805ba8f36529cbd0239ad9c2c1a1386a9ee852184a61fa1a74a1c11a2860845878197326890041485035899ab720aa229c42c54e925e23519855fd2ba188e6260182482d25d44b84c857348fb66a4a19364586604a3259b05e50dd9521604648bd13a5b0ce429de10786c5e62de256210ad781480175232b3a7c7899f0a005020f4b4d12a3eacf09a11253cd36d03f4107541bb324b99986d0c91e165f241e64606f5a4a00c084951768409c2e3b7250870a7449a4d58e88e3c687a0344dd9c08145431b10b6c05c12582c13e59517b42484671f66451a5804c222d5b1ec7a7b746308a39e064ae430fa918485135e5379a3ae848914468e84e1fae27c8427e6eaceb1c599b39630818a8e0b512959735c2f7c3c697461aad0212260dc80c9de9062de10c1e211df5e610c22140e68b85325b3daf267514ad8844839186c4910234851b2b56840004180a4c5e07ba4e58b0992b229138ecd2791e580e3f12bc2a1c7415b71acf41c480a9425478835024868b632c8c02d091424fd58c2008be54c8e89e4dd840d43b2080040ea96344957b08896e6536355191a6d87e20480990ab4866f06a01f8f5a59e8b61811533525f00798e9950fb80676e88c22381adc0c390088e109920d3da455865966044901a40204167d8165fe0c08d13a5b4247a5e4c1dd2027768074c05348100cae33b328ec8181009681a63a21324b9587c9d3548d3f0d7036d4f130a7eb004b960d1d512cea06203e008b6175d1064792af0f60fe9ca4895cf371958bbb20150291aa464493c68e08649f291fbc317af60059538af2f2d6c02021e656a7cd02098f8ebcd22889e186049504318836640440d9dca8944770f429bcaa2186e8879db20d58ecb01c6b84d091a0c60b68fb28438d8e85165e05b264f7143b64f9514c00a06323d5a8196346873340cd2d0e070a2df203e2cb94ab481cee74e117533a860458db01240aa82b439d376daa4879c2c648b68398074e3d9a4e283f06d8b850c2e7ec7d1046f583e9aa9b02cff3045c9d1c50a43eae6dfe4670b5394483ca113d43113f02a7aea0185081d9851164130150b431f18268ef0d42db9855a32623f2640b397a4785ba42cc7644cc7c5c6094c7b24e6b6030ab7d690c0979d4473661f7a2c312013a5617ee303072b53563068dbee366e46f62b68c6cfef71dd78b539bdebe6c62b7954b77b5ff8efbaf696d87e7bfdd762e1da1008e129cc7d658de327e291e371c71f927f2e19c2f11d3d49e69886b5dc15a1b77c20db936b634bdb8671b54ef47239e04bc8d2d8d506eaebf75047dcd06e7531b1f9e8c4f1b9f73ceaca105b6f65fedf781d95b7b9f09ad1fa6ed8ad488833adb9c6a676734ced090426306e76985f7fc63eb2c8516def3d776fdf6dbfecb3f70869f774676cb8cc119515638b89fe86f1b8a8c2d2ffeede12d3792298351c3cc852cf4f7ba8811240604cef91b0312ea165dc09930dc30615ce1540d46c08002a30613460b027438e77338e76a98308e747fa2f39e3fd647a3cf69fd0301ed1f2f7e3f180eb8dfc2b3afb130b45cfbd72fd238b7f7fceb9a6b77db319ff4fef6f4c509ee847f9fffaf76db67fbfded9ebdb9be2f7ebf174d195c302a7263dbb6f0930c8073feb2a5b945992da6708b3b1689f670ce5fb6b7b5a84d6fe97a0b810575011cdf183728548d6ec5db5be606b7d6e3ad6273237b644e6263f3529141003735a69f3870d034668a28268a449caac1128520268a2bcc1483439e6ed0a85d3bdf70cedda0c8c36fc63f47a33636d67e455afb0361d847a3df3afbb9fe8a34762b45b1ac7bf727766b2c57b9805ad2dc29c44c1b549421458e2442648890c0e20d78d7dab8ff426c7fb800d7de6ac7b093f3e46c6250a2d5df365afde7995b2bfeb4362bb40a57454b7b4b5383dd9e6c6ed0abda5adb5af5acfef13dd3f5f5dfbedf345df799ee77acd5d2561388bc8413ceb58afef6b0bf7fdf87693bfef2255f72484f644cb2139519d8c4cd34f1341fa46a44d31a4c75056ad0af5fa1922020e22e4412cef9dc1b37cefa0bebe91d337efad6d2f59519428b3be1de9565ee956b77db2ff6de67e9b30daa07e2f1e65a3f231e13c461b7e3ecddaf74d772e7dfa9d4feb383788e5b1a39ae71ce932f9ca00f7e3ec860b3b9f6fced99b6aab171ce5fe60726d343234eb567c74321a687314c0f19c602e09cafe19cabe11efcf08ff5b6fdb5d335b528b71ad7b71dc333fdd16cb4339b5bd3375a624d2ff67bfe8a1f82076ed74ec5189e7e385e84f31e86d1d4d2daac6f50b80dceed0ac36b6bd733f833c6d7b33428b703e3bffbb6ffb575deabe3bb7bfedadbe65680a536d6cb79bebe19f164596ab5e3befff3a251bb3adddaef8746249ca6ebb5f8e371d0c36c14e44e5feddfe67aebaf76dfb5747dedd56e47c621cb39dfa0670375c31a7febdebcd7ef15e36fc7ba4aa3c14c4353861319183124c2f04504063ece17e92d13831717b3b93217a6b59daeff85bfbde0e2c2d6aaab8773689793ebd06ea0233e27f8dbc34eed102c474af0bcba3ba91a93d10563a46ed7ceee3dd3da2d63d4a29f4578f14d918a62902b53f169d7cefb1a676db47b8e3f5731be3df6cf9cf3334b492fa4e5004e8d988bb6121138042d4437e881201850d7cf231f217ab6e0b97387d7119b7317277ef3d8264a007ad634d3d09db150a6c79837629860f6bc3872c1b28567915e7104004c15e69408517a3c31e4848ec90a257a92c01d792cf227f26e880e211c88f7b1a547d98e47484739e01b686cd0d1483283408c1930982e48b458aee8f0c8537440b13441a20473c40c1104402471a4f380a603ccc1d186470d6518b65cf05dbea843f1eefe633fd6705b3df48a994e3694d8a342849889057375fc529857b17847eade9489f8e6b0c7040b12e822340df51446217c1c8c05ef02c51efcddf1dbd22784efd141b701bcf7408f01348f00ded61dd3cea96e297d17bc734b39a738a682ad280138e81b9ddb833698adbbf6a826246dcb1d287f8aa1dd39e3b347b3287a123411d0955920ebf1e600d3c05e01472c04f800e998231831668f10d6c31018ddd70a3d5e705d8f7fb8ee746c712dbf25ab0cebd1d1158cc68a2e49158119544c12cd25b34307014b1253cc1952049244d1a181821d3d3e956df14e5c47d3dd9f4726383d4b2b06e07d9eb081c0658e133a2018668c38e1ef69cc38c523bcc297e72e889c531b4713512683c059181d9718ac2fbc0aca050b0c26bde20187831e60f2112205e2848ecb39f11192281940b24eb24f728f812149384961a9c6d49a9dcdf4fc2fc4764f9cb959eb932923e176ed3494d7ecdaa918c33233f1442295ca1b25db2391a23e2cde1669d0b3d70c500f8e598100e75cac63e7b8e6c2bdaecd98b18db8c75159c62c5f01ceb908ec185ee5da151430b174f11dc3b047bbe7988b8dab6df71c63e3ea99963b63cdae4198d70cbdfed8dacbdd77faee89735c67edb81e3c635ee3ad9ffedb2bc6f5763a4d73ae399f67585afe4cfeb5531513a9fd676d6e87bf5cf5f3efbf0acfbecb71fdb78cbfdb713febfe44ceb919ce7919ce3999417021317bd08ff0cf6e7ae747f81738cd9b3a90dad9e13998c23397aebb94cd09753ecf12bdd5fa131b9bdec6c60e8d4f8d9c3736f26423573672128ddc8409ce9fb813e79c9768e44e8d8d1d1a1b4d3472ded858a2d1031d675af574ec1ccfb1bf67dadabbbeae7dafe96e97ddf4dc6bbac3ff8cf1d9b3375d25eb9e69d562c5628582d81590f5f9ffc5fb57ad902098560c56b8dfbe9bf568fd6fab67fcd91e63e7d8b6636db7e3ce185f7fbded8c4fb8373eb706452babf2a57504093ab42bfefadb70fded3379ab8de9ebbcf7615f63b784b7edf9e23b9ef72ec4b29fe33cbcaebcdd4abfedb38083d1285fa29596ebe6e0bfddc6f56d47b5b65f8c7bff98d433bcff6aa7ef7edbb7ccf5d70ff72f57637bfe8276edb4ef581bcbda7fdb5d309cf3173bc7f52d1838ddda5febe7dbeab75ada2e1ab57e98b6ce746cd75f314d8d3b577f407b5aff2da3d7d6b2bfe97bcae8b573718c5e6b8ded39ae6fc63ffdb6afcea5a971e3ea0fc8e8b5b2d7ced337c5fadb3ff0ff3acf6ac7da68d49e7f227d47a3f61d7febec655f07efdd5f963d207d9df7ba357d7b78f67db2ff93bdb6a6fde0ae07fcdaf89eb975d6f6d999cb449c8308a647a9d47efbdee14fdb313e651f8d4eedda297b341bed6b7d7d45ab726db4a7b50d86bec1a1b5b9c19fed0daeeac606856bbb5ead6789b07d76d3b04f94e92d9a7d7369b43bc61e56e19c3b9dce03f797cd6eff6b6cbf69bfeeb4bbecb173bc48cbd7daf76f1895bfe297a7b49ffd231c7a4d1831416b773de0ffd7a9ddf55bdbf6b25dd67afbad1ddfd9b697ad868b12a0e4f149e0121cfb5c87636da235e65a40d381c679122b021f04288623a6d6b938a996aeaf696adc420cdcbaada7dbaba09616fc33ed376895dab1fde7cfa0df566e7ddb9c2b5fe5cb39e76f32f9f436bd9c275fce394fbec99773ce95c937f972ceb9f255be9c2b71ded4a4c4b9922fc5d8b5d396e39b7b7f2d6d7bec9956f19791d1f5bf2027d6f132e02d695b2acbdeeede72ebfadff31efc6578f6d99910fe774d6fb75cc19bf6fbd699f663f47df5cfde7fdd7babc5b30384676e9eed19dcdfbe5effae7f37f7efc3f41d6b63bedbeaeb7b9ee9d88e6599b6dbfe7f47d383b2ecede0ffef3e76f6815b2db7c1bc07cf8489567f0bc2b135e60a06c27fbba56fc19aaeeb68f4d7b475aa55fc336d7baa79f7b76de9bc48cf8933a19d96ab8de7b86f91967f5d579eff6c78e6e6c17f919665e94dfbdd341df8e5aa9763afe867c2998ee17fdb5c9f65b4bbb3efa3e941bb06a4fd02ebafe5da336d37c7d8b8fe837ddd969b48d37cf5ef7a3eda0ffe59abff81de86ad788278f12d73fbb2b6d77b1b70feee71feea31e0fccde3fcc5bb5b52923dd7c2f7f5f7351e1b1b1b1b1b1bdbdadadadadadadadada9a9a9a9a9a9a9a9a9a9a5a5a5a5a5a5a5a5a5a5a1a140a8542a1502814fa4c7ba63dd39e69cfb467da33ed99f64c7ba6c1c1c1c1c1c1c1c1c1c1bdbdbdbdbdbdbdbdbdbdb9b9b9b9b9b9b9b9b9b9b5b5b5b5b5b5b5b5b5b5b1b1b1b1b1b1b1b1b1b1adadadadadadadadadada9a9a9a9a9a9a9a9a9a9a5a5a5a5a5a5a5a5a5a541a15028140a853e9fcfe7f3f97c3e9f50383838383838383838b8b7b7b7b7b7b7b7b7b737373737373737373737b7b6b6b6b6b6b6b6b6b636363636363636363636b6b5b5b5b5b5b5b5b5b535353535353535353535b5b4b4b4b4b4b4b4b4b43428140a8542a150e8130af7e6d6c6b6a69606ed93fd5dd35aed1e8fc054d4a5fe6884f7fcb5335dc78a339eecbfe0af01e168d41ad77ffe587f8777f767e787370dfc0b0cc49be2f111defdf54d2148fbbc0d5bfffc13e9c12f7361baef6dee63e33b78efcf3176c6b34b3480f332b29773d82c01e72f82b72c0822adead4b6fdd65feb7fcff1d93dfb39d6c6b5d58e61bb6b6dbfd8e9bbdf36adc7f94bc6397f0f51b9d450a2297d4fb7dc29e72f559329cb5e2b48d383f5bf5eb975726f94312f9a33854e14d28263bab00521157cfeef94d5dbf526d4d2751ee76fd40b158dfe3a4d0dde630ec233c84e99d3e924ebc9077881806f6c828217ba8c8b8adcdbae2d6ce9599b5821ce62254480605848382818f800d0af8fcf41033d0679787776755234e799d9a40408cac80e18284060c098d8a41e06f6e5d5c5b5a5958535e9caaa8aaa398929604a2a0aeac9e93d146004a7ef6db7b63a9dceb536ae7dd3b27dd3b2e021f80be2e3dbad9f6eb73e1af535d74fa75b3b1a8583b2b1a5d5762042270e9c094809e771f52d0d3ab5ebbf957ff62d0dca0554869de3ec3dadfff69ebfb5fe806f695042f833c6794d52987e1e71cea3d1de6fee768efb9f45bb764e6d09ddbabbe9d69652f969c0edda49c772d567adfed733b7c3bffef7fc7b54f673fdefeb1c9f5de7981f72eb2b77beab5c0e77c6200211e80b2487480c617191b71a07c52f7bc20c782ce350177d307b7823858314822e3d4b158f1bda0ce6f13a53c3d9b063c85f03ba09783668e73818c25b2837b8e9891bc1b9363628bd22c1cd6084444319175f0ecb4ef06990b1b884444cee49839545e215ae180a34a001465e1f0d35cae048aa108a9dc84b862d4f44ba6841f096e1b18944a299c1013244005297a7256251060220cae0b8b034c55028112ac9a3373e0c52eeea7c4880220f0308259f2409b9341800cd04628bc68883818b0f9e18a308142eec01b1ec3263c0e14212b7b60c03e47f01838912d4b722f4853c27058d6786272e3421215d4b446ebb72d6bc3c2d5ee8ebfe78cca180c517b96e2dc587160412da8dc353c5e156f3d065eaaa1b73b8e8654c93816ddb800296f1468b114b863c7d30628544cb061141614c13e08b18338ba345497b746b7d701c2e7e89ced022680392c516552b1b55d20c2c4e9583678f3e6c17c9cc289a40b3214111d19b043b4e68b852b482a54e850b7e8a2209ec9e415ffcd0140705c12040ce9d50ec751b8af04962c305a48c84c72a8c212e133392fc169bae701b7f7c28165a2cb7018f3575008f4071affee670b0adc4dd77a292a4659964bd8930e800088d0c1c37374d19c2fb82d62de55a98b3e88bd50d45c80b86e18f10361b087988740397b60e3b4ec6bcdc676c994695653dd8c16ec3f33c3341918c9df44361679842d5641a6008340094481d630643c245221275d50a930ebb456bea3349758d1c86042d309294056b0b851c0b5ad2d6e85c6893c7420a275222ad88906801020b34a8d4aad0c2802005b0f039cd2d219baeb1e6e2cf364a99812b2d4306b78e3dd09d8d11765bc0ed96162a8d5f0e39d07a6cc020a3c51a4323d180678100951c7da1dad464e9830b1aaf2b8a20d18622cdc4e36210150d66739ca59886017c9dd9878d3e311e75e0305b681058071276c6ac600898da59ad625e124b92a54496282d9aadd6c620d6141679f868af428880a9fb0ba44d132b8cd6b007c89192031e1b417193bd7491593c4aa1f1e6058d8cc804514b8a280ff2012d1bdaa0e4d8121125c550a061048900248e20e4004d4b9c9228b828231159e133b1829f40ef1b08144f1596105a3b73ebd15481c39eae1761c9aeb057c12a3652f7a5302ab63368220b79c7261ed2eb4891891a8aef3e5a6dda5425c47450ec4446fa1d899fb0602f146990241b0016c4a32a0148c8ea08c3519574a7974dccb2056a320be3a24df61da1c6b069b10a3b660acc10100281b0302c289120e88b04d6274a71644083355833291af628dd85b82e7a140350851b6fd72cd53a83a6207174455161929e69071557c311639c282913751d53c3a6910a28b93f280c00091b18fd87b2f5afa08efcfc0f0c1c9989bc08fa7e6ed4f80dda565fab08d78d9d0a3b384f154676daa2dae02330225ca9d82984bb785681cf258cf01dcc3463635496cd617d63a710421d9d246b8f258c7935b069d6ad8a1689474060b1463904e2edd961c6aa9416c40d901f1fd533d51a636093f6f035d5cf64cf0c472ea40af58fbea861b4642dca7789da99a93864e3577c61abb24003a33f4ce40d6459538086a4857a884dd131428c24b50a55845fa453c48124d4401f8526720426a27e05608827e68900d33e73ea243a4d0d4d9764ed21145d7260bae1040f2dc440f5546feba1ab87ca8429853a7a84587d0c395010b23484310ad5180ab712e119350e1b0a74149c20b54b783c15e29a46c3b7265c5c44c86be419a2912d8815e4ece8bdd0a3455c3344e462b6691cd8ddc33075b80051054e387cc1416f8a344e86439f06f9a2ccdef33041df8445ca433f4ebadc042c361a086ee11363c28933bb280a9e4e4c289c302641109caad284331c129e5c75b96520b041828734097d12b27608da6205b920029e0846223046b0c312618a0d821b083c20d010e012212c09199e3961382392004237fcd831841b0d9f8503147269f064d0c585a4c2158513a80a0b8c9124c7e6668ad0d0560c9ca06a01e114c2108184e450b576103e8883086b499e1fc2413e72b46647890e0795ec1529e0428b86410d830cb2269ac0f11518a492e284e8650b26386711b7ea66895510c89fa01d253867e4849143be8860138140355f813902e3c0b540fe00cc85072ebe3ca06a1f2098f03a5122c400a808f00a6089292021a0d88cbf407f4eb0fe3afcf1fdf9e1f18b8cf25b94f3ab83fda4fadaf4ede89bfbdefe947f163852d4a7ac631157bf82cfcc17d7c7d646179f0c3e2b1f9a03470eb654397814e24082d40181320d0a3590d2004483075d535c36c0341aecedb1f7921cee65d8cbdbe3d393d3d5fbe1f5ea3e7a723ef49818a461808341360f03b53c49795ff25a64e54df3ca00e125c2bb8247228937c886d757dc01ba6b72d778e7e0ceee8e1d113b453ba95d541d9bba1d755a2e173b38e7756e7a8a7e38e77549c869e79c4bc990f9d2186d1ca556aa334ec746ba4615389d96119c4e051d5d044e47802f28c439e7bc10b7c3cff02b1c0987e48fbc916f399503723afee49d3339e702f81497e2511c8a3f39f126cec497b8125f72254ff297739ecc260b934e49e53be91de02d22c7f9ebe3857443e5fed7490149a864f211a33691dcae9d6a6ad099b62b4c3f5c7f59e6ce6d5cb471e49c53996d60de26afcd1be77cdbbddb58b5796a93640389735ed6a3663d6a46c6e60d9b33b3962bd3d6deff1ccbf0ff56c6df3bd7faeb2bdde1f977db63e7588e7d7d33fe6cf758baaeb9b0ff72ff332d975de7f80c2d41afe9eee7fdfa4d63c9fabfe339be76fbdf34d7429fe3eebb3fb147bb3fb12c0ffa7c720fcf9ecfe7937b48d665fac3b4b563675fffadb7da9f3aa601d18c1aa576ebaf50a5fb7cdbb1dc7dedb7fdcb7176b1e7fde14172e0bc6cfef274f1cf64d3da67adf2af5a0a53f3f8b4a44600b76b675786ffccf5f2d68eefbae7fc4d72cedff7e5fce58e38e78d38e78c16f1b536ee1bf7e9349be93487d45ed39dda148889260e87a169cea7132a6fb9f73dfbb8d672e7bff5da6f9d3fd7c2b7fbdf76efc53fdff1cc4533c83b9a374eed68b4a8fd9e637adbb1730c89734e3d13e80c1e2ab5cffecb345d55c4394fc43947b427d8c71fcf00fa5a829930d9db6fd1bab75dfff81adff387e37edbdcc06edff3d762bfddb3b7df76599672ceff70ce97d128e7dc0f15ceadca58e16f695042bafe1266daaf8c944c09ce07d47c54c494be8c5933862e8c9d300e9c4f2d264f7e82ec320432de81ced41e1f98555a14d48536acdcb3c64410fa00b370c27070f950c58bd208bd328257302c81b368cb019a36a8bcd4324129aac128c3d0c82a0e08051485942564a704878c626803309f20f6cc45b0315359338684ca75e2cb569f381d910ecf340c20c0b2effa7887ce0a4a243f78af8aa4aa615b8f40a90e9cd922921bc0a8a4dfc5d8e8c3dd86c6952b4415d19215319a1224ba9266f00402b9abb7bfb2c39b514d2122766a88d31498e9c88d00791ea9429a7a026b311d55275d6513b0defabc531f960001b299591a5e49397237402076ceccdb149bc282b6c866b5c0992f5241690ba82f14e99944a150d799b80e7471f7cf244e88d01a3162b8b0e89ed8ab142f833e8d082786c4edc0d01c830844a02f390c01ba73476e30921f182f0c617191b79a1711e5fb688a53cf8df5654f98018f6479a824b1905e58f94240157d307b7823e50f4c8d10d621931a8cf842d0a567a9e2914390466d94e8fc3ba9acc13c5e67ea3793a45023974900d9684335e4af01dd843b333c9f424a2c233474bfe63818c25b245528a1b672d8907a91224b4fdc08ceade1c346d31dbe0c6d86b8a9f28a043783d191274898b878c4a0225405e6e2cb61d909be085b3d18c904026985692d2e21119373b27307904ba1af1176b6aa58245ee18aa180ab0f8e1ba2066af85c08038cbc3e1a6a8400ab0c11189db03608b6a40aa1d889ba8c684e21dbb381439d41ab27225db4207893e140ea4f645cf9ec984d2412cd0c3a2a74e4c965d60db46ddb025297a7256251df9e2d2d170e89f0a96205a20c8e0b4b147a3c6160e60516a14061988950491ebd3970e26869c110462b8402e0baabf321010a3c4329b67f0e8a497cc6ae947c9224e4d0a4804201d6a0cda4407e4c3381d8a231e0b871924b1240770609282e3e78628c225030c045f340884c5110aa2b10cb2e33061b40203891b522c8284a90a65b5b8601f2772394eb330438f2825d264a50df8acc000cfab246b6a5221986e5a4a0f1ccd0849843705a0419f8a8c1d78484742d1149b399e06301b2630639af352f4f8b17f84a243033c5c18ae9cc89f59843018b2f720a0a17cc8d612a5501804a8a0f2d08e413d2dda4bf8d4203cbf0c253c5e156ebd042878c1d7c77fe98246475d58d395cf4d6f529e2c7a34f2deb516560db36a080cd4631acbda29015427eb518b164c8d3c73dc18ad70058e01050cb12122d1b44f4e471ef23f952c3ea8f162a01be8831b338a28b3eb9029981392509b647b7d607c784198c4e60b1667d56dcd08aced02268c31123531e20040d10746fa8aa5ad9a89266a0c0d61f8ec20f031ee130e5e0d9a30f5b051394c02884264da30e2d338a26d06c44008345c67805481c1a5c556f12ec38a1c10a924e082f3cc49ede5518963a152e78293422f5b04063cba51bdbc2ee19f4c5cf8907fe90e2cac016353f2b413008907326fc00c6738b816d2a2c30eb3614e193c446d016f1cda45c16a4e05246c26315a61008103ee6226d4d1f899519497e8b4d572aa07950c0908216cc00f3c78762a1bd4e8103e4015592427a0271f1585307f0c85317043efc1cfffaac89bcfa9bc3c1b6a200cd9427b5d20e9b53d88c4a92966592750a8d4b22332af892507531e800088d0c1c1ab6e2a4ec5162e5f7e12a4d19c2fb82166cf57ce19842d1475b936b61cea22f551fec2434dbdc5000b4a28b90170cc31f2070a4296b4200053cc40316843c44ba814b0e5322b67cc9011a4b36ed3819f3729ff93ee062249206fdbc5e34aa2cebc1c61d3a1471fb441afc1163e1799e99a048c6af0fa31521603b2883547e28ec0cd3271f21a6407038b1d142f1ab018640034087ecd8ce888212388352256b0643c245a2111d1015e121e18361174954569874d82d5253a3ccb0099e64640ee897a4ba460e43812be2582111dfb023c94996a42c585b28e200c13349879803ae4fa12a6d8dce853678043599d1c724eeea6b0f98132991564448b422cc722580d920180ab458a041a5568442e8acd131342c7007a92a48012c7c4e733089963d54915f67c084d9748d35177e447850d3f465078d89e25699812b2d430473d490b3b481efd0a22d563dd09d8d11757cb0f67088d966992a995c846734c09901638ceea15164f9945b5aa8347e39dc10c3c0961d7c5776241a2b1b30c868b1c44486299b380dc952080853039e050254712494c4883a08b3574270559b9a2c7d7021e0431c30c931e9dad355571441a20dc5da4c1ea6353f6b653a98785c0ca2a221818aa8263910433c8af9752dc5340ce0eb3860304212a4a746b6bd2b1b7d623ceac08196b532c0ece00874341b04d681849d51a0906191b94b8db0af6b0898da599d820757013c7b5cc006e5c1124b92a54416a826461c9b309dd963c24f93490a360565e82d266e20e680f3204e8ad720d6141679f830e17d7931e6b1c3005ab084100153f717086e09b9c806cefb22a6122b8cd6b0c75c2897b4a0d27bef06bf92031e1b417113840b7be0e44d0dc810596b7fe8ba38e222e74c09102e17f0f04943f52885c69b1734190c4d8852e14b1310dc2f26885a524479f01ecc26d09122a4605096960d6d50726c5c6548e4d1822a00c64455520c051a4680c1cdfc97473f989dc02ad089c46169c8f40a920d6db43cec05d122e4004d4b9cc2814c84495417de3521aa166524222b449b61c16accd49757314d58012c217e14e2236332a8aac19b1a8600b502bd6f20503849410041006d95018b5415a1b533b71e4c5fc4ec444198f3a4b10ddbd3f5222cd56fcc8cb193c2c90481df96e3969a0b892aac7ec8355a0060d18839abd848dd97c228a6a3242e615202c834e6a0892ce41d1bfb860cae37668c4f0aae5e478a4cb410144806ae70ecb8b56960d547ab4d9baa84331820c2ae1acd221530a1d8898cf4335282ce993d43c6142201860b0bf642910648e840fde2ee3070294e5d61413caa12800407127a4452be30b2c54d330c4755d29d5e9cde87483616ad28ed74fd306e91a25267746ad0a856642ca95d056a320be3a28d21564004ae343bcb45cd116a0c9b16a92203eb2246546cdd58e13505660808014045009f6468b04145d50396052512047d8d28f1c3d153818cba095b33518a23031aa8d911767605ad08d923232f291af628dd813803c54366eb4a8a8915ac47310055b8e1f6068b07b922432c207eaa6a9d41539038c2f0ae492230424212b0af0a93f44c3ba848c0260603120e022691b2468c71a2a44cd4d8631f224bee4cd112894a0d9b462aa0e2fcd882481c3281d106838501206103a3b7051509e262704089a8d6d6bf823aeaa3a2500901ec143dac7954c5c09199c88b20db4000256c5030c30403e6468ddfa05d15c802e1901661f4f409a25584ebc64e85dd189626a15dd3933029555518d9698b626b82953693da299f8b301811ae54ec101282aae157414fc605115b785681cf258b87e823160641761fe5b072b3bb1165e932e1c4890905fa9c553e4c33364665591c4778f0c8f0d506c21fd8969d4208757491f6a4c96106c9c4950d31ac9630e6d5c0421d8370307cd264d2a8982a5a241e0181a54d80b4480356da4ca8e3e21088b767471900f41e5459483b94e0c6555a1037407e7cfc2520755714a520d180a948704aa83b02a609cbd2a000a5a3a96b0c6cd21eae86c9877f237852d5a0bb62b26786231782c80648cb20a2ba2b324d44c70b67b8080d5ba698592c7b893c757d51c368c91a1424ad230786e2b0d159c48ada99a93864633571c666c2d596248e9a5fd8aa2cd0c0f8b7c34413cfe29914542f9b8453cc23444a6e10f93b638549d68b95654d011a5216450d08d952d7b2c8978a4dd131428c246200270e9fa0881562bfc60ca364866e5409e5391a7285cd102acb2fd229e24092ae43399c636a8875e2a87c149ac81198086b8212137e2a36f03dbf0230c413f3445021164ff01a707876fb64cda993e8342d74853bada0635284476155597b0845971ce0887b06f59984018d0fec040f2dc4401668a0b1711025a69183225a5b0f5d3d5424dcb14267c796c7999361150a3627208c235c93f6f85df150425b274c8f10ab8fe1861533663d58373b3c93b696863046a11203a4c821c04016369ac8b052223ca3c6611306c0049b5b87c5a808737947a02f03113e197b65086ae0b130b405a95dc2e3a9ac0cc4e1321bd10f3a58351abe35e1bae504c2b345aac509e91af31a798668444b1e427e6cb41122c71971c9d9d17ba147cec1876e8043417c0d025692fa96e80016f27940e6450a01b8f07c608ad9a671603342915ab8ab0df59ab471d5e102441528e14ab64914d004901185571cf4a648e36020d31f1fd93b0469a99a69902fcaeca1b5e9a30353f637a004b7cb716d2c4f103e1346ca4c05d990c36e1096f2d08f932e1767c20d5414497bcc186ada6820b8854f0c2b8faa381762024561f13ab38ba2e0c9441a1c20cea4d4a173c10c56091b2ed014f098dae366f865895675015593063b08903cd4808eaa961415e9fa5e70aa4a13ce6e7c6082050ad49811167159575d6e19086c48327aa94d7e4c0479522dea397a7e416b3422c3471b824d37f0650288a2ad2f7fd3441978e0b15038a34dd60e415bac2017705814c6abc901460c55547eaac443b6c65ca74d588c02bb7c9103264513a0a8a2c856469421134f7adc2db4d60af868541b3260e749021bb30f8fdcaa434081cec8ae04e2331f695669934a00f6a8c9a8275d8be4a1c7c1df8b017a775a5fe074815c4330c00960dc82211e20ddaad4e0796b2c9bf2c7250ad2a42935964cc3a2c489781d17be1983f33772042669cb8b3d72b60a3c4cbc00e0c900d43d32acfa98d86a8883fec42d8ae9e2fb805531e7ca146549624200308e68347d046909d88a2480d00d3f75f0c8c9c2f7212a12119f5518db4096001cfc20a9b1cdb229948507538722285504ae825732441080f14a0d275c36a8448012950b24d342cb550aee68c0558327832e2e22c56923244b074a6d000fcd260339d230c560e589f5243b543caad1452737e6835fb38adc4be6cf728b058bab3192e4d8dc4c3d23d580ea67acb875cdad183841d51c8a1847e2b8e8988865bafa1051c308162643813d668bc6f081a4012b90901caa960e4881beaab0900301234c330e22ac25797d228dd0132308d48d48005e2dc04a40b160a349b556ec0e87224760c9d19a1d253a2c40c6d05ff4a628a4a5da2b52c085960c81a00e386e290385a8c4579d911d227238efe8f8d011cd9317b8989535d1048eaf8072cf83be2f4dd0c4614125c509d1cbf6cbc6937b2e9a606aafee6b11b7ea6649d505842891cae868a853663542f453e4d06f4e95974853b4e0353355675902186a80d223400db4dafda3e50d989113460ef948c8ad077e6ea89023abd032c1c30a99df80250c6e29593ff60ad5553bfefc286ebc54c8883e120413a2146189029cca22787160e7456cd5140545cfd658ad956204cea97151841d1c0f2f5f565d2900701af212256326b37971f2a68789052506021619ed8944a1044b09a84eb6a8d4218285adab678e90c63b3644c814b28ab155b886c00ba00683b81bd500a8034cc63b4d2d84f2149ac0984671fee2c2b826bc4e94082f70d9a0834122165ad4b4ab2b1a8d96775537191d9610a545b6b030e95cb568bbd1352db2a69485ad62648d0b12a107851e51988421c46ce20d9a867e15a3409c03681cd2c0bc41a0ed1c0ad3d8c47b82078415198ab45d8a18e853d174edda61e54c0093268cedc9dd61836783dd06ab6b0c90e68cab264c3013227e7e59b779848da029ab26628e0f5aa8440124c285179f89aabd284daa32d2a4f1a2628e0f29583c7670d7b858d15584cb95edac275fa8bc3a309a630764cf7005822a6475bac0790d109f78010715e444d7e28ba9343659b29c52d8ccf11217824d86e9100b59f0b25426be10d193c39aa319698bf040991b027c45de79511939e03f2e14114669008321ab4a199a2f17b6be440c419cc323c69a2a55a42953708f1834483328c906afae6213b0ea963c2a1ad5cd071afc80f142568550551d8bb8fa472382ba25006861e8eb877d717d6c6d7025b970d87c0a62f2888d961e0a5f88905c49f8b20744422123343a557ff4e8c982e84e0f322a480f8fc50925617274cc4b285a29a79007a709d005275b1afa0cdda01a62d536e4b05233e80b0b2b784e829e3e2a288a24ed196257402b650242f100ca0569c168129898990704d6b8b6fe54d8824427c88a24183636f88113c0ea8e88115660c894504ba3c21223e811012613599e33cf3591258a834717fa02884b0a03ab171a9e5253832c9a9670c5615ef9348a73225d79b230470aa942ef085db36b8acb0678868e4449debe05da08bc8bc286a6305115b1880e358c88c143c6aff64021757ca9a5a429835580f6d379d3f1c012269013be04e941c731428846eeb5e443d0a05a1729383ae025453d38c74a7c52c8ee1087050c4c0095560072de24d42582190d0e50407aa45bde749c7b2961b348eb0b639eb3253320a570ceb114316eb103496d02401983255f100770e3dae2c348cc20dc2124e7fccb5a6648cb610f2b44a228f2591e4424b2d1e0eb3af6080113aa326a1060e94802e6a13ae2310b8a9d61dc052bcfc069a47264a6dbf138896d3c75bef6d2e7218108157ec0ced400e4268392d10d1f3aad1f79c6f2c0d8a016015105a54913a5196b0900cb30148446342121100806722e021ce4893f71d63442ed0cc0a78d58862107faa0855175788ed87a63418f24c7b70f9d5591444fd2946b514c2030234b3ebae062b4ebbeb9c1a49f25bddc69b0a89159c8cc525f002cb8f4b0c14308f0eac8176393137410f45057c87561d162fdbeac19827003d9d4d275b3d3e895a8c8c01a16952d608f4f1b7be8b85cecd053f4430539ed5f647e561b47aa331cccb1916b55e061747c8b5b5111c13aa1458eb4e204c191833547193ab208e5a02562d0669098236e385e1f0084f94a20a8c05004328036d45002e14180330395022b2545375d898a9ec7b6b0a7610a0bcc9ba53529c8eaa4fdf102ecab21e78157863f3d124996604de261857db7c77ef9df5de52f480ffe386b7895bf604de7d95f30f0a6fdecbd8fadfd170c9c634146dfd765f47d7b7a4efbcf4feaa728fb6cfc07ffeeb671d6a605697a108fd1f795c564b7a7abdfde7a6da70a7667dcefffe3fa9ebf336bf53fd6d2f3b7b931a3efebceab4ca59e41f8331ceccec50ecffe27fe79b1a63d7d3bbf33ee6636fce3db2f76ff17cfa4dd69d7f455d676fb8e11dcf36dd35a04777bd2deaf741fbbbf3d5666ff78a6adb1969e69eb8767afadffdde7b877e5da3b3f76f68bce3233b21efdddc94c5235b15cc5ec1ff728e7c96618189cf3ee4ffc337d674b69982b08ffee7700db75bf033886b98234cc150c0c9347c3dcee4fb4fd9fb934ccb59d30154c1dceed1fdfddb42ce8bc11a9f4e2207542ff36f7f65bb8f68b89565fed359dd79ddcbadbf78f6539d6f639eef596f177b3995bfb9a2bed330dcff1afdeb46ccbf902410c8ee970ce934eaf95731ef3661629cebb7451ea12a48b5a9701f7617d381f5e0fab87878763871a96a478d300def46c729160173ae0c2c639c7d27c5bee48fff0b4749df7b5b4dd6d73fb02f7e6d867b3d858cff60cf8687af05be31ad0f60cfecf5ba4b5484afbb72c7bab161583b2ecedb63d40202edd0c8041c1010f61049df03d57945ee428d1b08145dc004621debc345cfefd6d1ae6da35d74fff4dcfd3e9952dcfe61540debca2c79b57a44cd1a8ec6f9fc7f9db2890f39711e7ef22ce5f459cbf895e44003c9dcfb3b32a8f5564ce9df6affbdfd256bbcfb1a0f52b4e13fd5f8c46fd37f45420a5a95191c339ef43a820e19c4fa272732e0015372a5ef7f6c799a28773deb955538270cee1ff2e98a2b7f863b7f79094319c7333fe9649a9cbb0dc6af764f71784e51fe70de2c1356dfd8178cd282ca26ca35079bf3d5994b5b5b6284bce03a1bc81b285f31e9dd0f9d2104a23e7bcacfb13c9a0f071cefbede919cab3dffefef2bf7b32c093434f0a3de1f3640de7bc47cbc8cc7a1959b7cd68b963e7782fd1ea6f3b1ad52afe27884ff69eac913dc97a02e5249293424efacc71a28673c41e95fdd48ebb598ffeebf577b31eb53d766ad6a3ddac477b7442c76b3669c49791cd26879c4f9be8357972dea3fdf6dd9f28f640490c019fe9ed4d2f9bb85813ca39142a05864d53571a7f525ee07f6ff892bb38258c4b102c195bd29584c4922bae55fc4a32f03bbc0789b61fbc677fdb34ccb5ad4a9e9cfb9a2b85b9827d8578cf3973de38dce67a0d2fe74a63a44664ad9972e2cac08423e04cc8d2002065f85c61b2d2a3b109ab816eea8b93530988af54bd39a30b60099d959c168d4e4f9c57ba9e14d2494568c4a10ac057201561a253f6aa4d358d40c235bd68db1e307b7b402df78dcd16e4fc5503fbba37b66ffb3ad8d7d91febe9c16e1d6c070adaf5af6a7f9f6dcf841fa6ed66dadffeceb6c65b3a9eff1d0cc3d29b2e0c94129973cf5f118f48112210be361e64f47dd2dba6ed7ede1cf7d9b49dec15e1da2ffe40c1fff3ece6d866f473dc27fd580f78cf1f4b0fde5cda8e0ebc69bf9bf6b323ec7e078037edf72fc482f55fa4edbdfadf74e14dfbc1ffa60ba5363c73f3687f37d3b16de76f7f67d3b2ddcca5f36edacfae7fa2bf05197d5f4de7dd7d6cedf9fcedef3e3d8877d37e78366d879de39b2e04ccb3f760bcc0c0f96fff069b3dc2f470c239ef71f768e3b1e57c8e3b618f6269be1d7c76b0e12fdfe1c8f9fd6d18f6760ccff4bf6945dac35afab6b9d6e9740ac3fe5f88bbf387a7f43d85610fc37e0ac3be29f9be1cd2b6bd6cf701397f99bc4b38e74d9cbf4ade24369a901c31f2165132e150c2393fcb1b24847fa295e6833f3cc756fb07c270a0605d9f2c08ffdbc7f5edb73f1086ef7fdb34df6d73efe0bf48c333de0d1a9cd3f597e06ff9dfdd05fa7f27889de3403e6ca10d2c9c73e79e8d229cf3db77d973e7988fd1f739e3dbfe357dc513fb339de87dbfcadfa6efb4f47dd375dd19f79adbef8fed7aad2d6fb97477af3b05e9bb5ed315bcb6fbbee5f6f96fe968a21dd77d5eecf6db77daee345c7fc5bf48eb7527fca774fd2f4c7fcdb57e7b8ea97df65633bafe17107465d9ff1ac175af8bfd05e249e87e52bdc11e883728c50b64d0f1eafaa020615f77ce7f4b2f95666cf875ef5ecbadf6aefc15637bfed77fd79db49e5fa7a241d9e0d2a068b2ccdd66adffd6d25667959bbd632c1a5ad4dede7796daff17ec4e2eade8af7d8eadbfde7ef84acfde4c70a6bb1ddb9e4aedbedbdfe6526b0fc73676a665dfa9d46e5faff4877dfdb5b4b5db715d7752a9bd53a9d4aea1f7b9b96e0647bb99609c36ce0a6e7d9f5cff357d0bf6de31f4debf1c6fb5b4959ea9546aeffeb66f2eddafb4936bdb71b7ef78e6baf0e0c2cd79e0408fc2f1d4ccbefebad71fa6ad6403c49a2d46d8b5b3fb13a7b2b7d22c52b45842ed126d3f28f8031df8c11fa6ed045950e033a194f64bb47da2ed07ffec3ef8dbddcdb4df6da507e9411bfedfcffab7825febfdac7f2bb882bb22cc67bb62f7ce39d16b6f2e5df57d919e13bbb3f6b2f5c3bd7bd77f2cef8dcdb6c7ded804053b5ce89c639f65d09db6bf3d9cb5bdde6dd731f7c3324da6ed7dddd99d363cdbbeda0d74a7b3cf749ca5daf475bee9b95fe35e46d6bf2dfbbceea4a6a971a9d47e7b985b0ff64fa5529db74dcbfd57e13f77fa9e692b95bad8afb11919b5ff6df7cedaff4a67adf7bf6aed78f659ebb73f76fe585f7fc52fc7b2f5ecce6263b9dbd6782b8dfbb7f52b765ff66bb2de3d768eb75bdfd7a9738371d4ec1d2f6afd9f69db5baff4d9cda53b8ded373d33d275dd7936c7dd17d280f2758e3b3dd3d5eeecce6ea6d79d54aa6077c2dfb6bfb5cc3eb0f55ab26e77a7edfbccee7e73b7b22fb3e7982c6bd89ddd79b7d7bdcce55e1970ce137993c312fe16ba82acedb3dfe6fabd4e115a22a04438855814e24f083c21de84d8d20c912504962dddcb0a90a1f5b202bd9b15e8d12dddcd0a74b26e6677c4091fa6ad216e84f8d0a36564b7ef5bbabee73fadef398e6a41d871cab2b4f9210a4410461019667f567f10794d10719cf3de19bdd68e7b6f823000c28973dee77a8fe231f2a6e3861efd59faee49a5a315e7dcf9ab73f66e3616f820877327960b7fb8c27b341ab5e77f337e0f85788f12363d6c39e71e069b1dea7430c33977c67637a3e7bef8fdba8fc71c85a2dd3bc6d63e6b9768fd593b0d73cdad4eeda92cfbe959230bde6bfa4acf1d840d3cf0bf9068fb7b4ac353598e13a7d3fbdbf6c7faed74eb7f767a7fb40d4cb813fe3657fbef3d2d7dcf3e0b389df6687343f78b7f5632a2e1c9cc4c6e4eae9731c231d97dfd7cd1c0faefbe7ebede7b7fc2d019e178fab1f09f265a7dade5f35aeae24b5172e4e2124c6199ae2a25b8e08673fe617a8e2e49c66876af34bbcf7bfe8a8a34ccb5e3a2d1a7cdade941067d8534cc15b419cc7533c1b89ace93656f67178d3ed91f9ece1f86e3ec34defae9d68e46aff2b7edb9fac3fe6fe3dbc20f0b80747631f65b339b2b5be7781bdfd42bddcda89e7b5b3db5ff7f953ec5fd9b56ec664f770c6806efcdf97533bd3878effe82703cbdbf3d373857d8cd1cd4bf8d2ded69ebfb16e9783ac7da29a3d7c27f91b1a6af73731a7a9a1ab763884b53238cbbbfe0fff5609dfd6f5af1b6a7f0de3c539df09f9fdef6d659eb477b45abd5e39c3ba5da2e179247cc1f96a95299c9b9f35f886df827bae19ce3253e729e08a19a4856a110e71582f039aeb0e5ce6e7dfffaae3b2be855688add70ce9db26fc65778dce88cc96e9bb6f66ca3ec15ceb953f6da5ed33d3b22fbec35ed876dc4b1486c2cb69173e7bf69452c1dad88d5f2573f33add8fd0eae41ae54ceb9affdf6fafc850ecc1f92be3fd559d3dffa9b3877daf7b72fc45efe75b5cf5218cacf0ec259e74dcff0935b0b39edee4fc4ced62fbd5b19f9d75a0139e7de3afbc46eed553d777bcd6a97ead68eefbad3fe701ddb77fcb383552dfbfaeb6e169fb146a3836b6d5c6d4d37fd08ceebea60a7fd9d07e46d6c554f3d135321e12675c3bdd502ce0dc6f9dbdfd95a5f7b40d9576999c1ff35d64fb1732c5bbbd65fc3311cbf713fd66fbb3fd1a6adb74d5b65af389d4ebb35d7f6bfbea770ed177f3d9d76abd35fc3ffde7eabd577ab53f82bcab4fdebdba6addd9f38ad7fd76f6f3fb57f1d6f19ffdc60dcdcdddc5337b3eb66f09f09b5745f343ab848cf888e883762d8a19a4325140e9f26bc996065023d212a618f84339c73a7937a7f7b5af799a6f69ee8ef68148eefa8645c2d3c7b683f2bb3654fbdbfe01f95ac53cba0647ffed7bf63679fb5d67ed1f75fd79d1fdbeff8eed3be69b7e3dea77fa6fd10a9301dd71f301aa54ee856fbf73e6b76adff3691569ce3af8d6f09904e0954aca2c74a25f4d947f043df3d0292fbdbd208db39f6d85f474853eb147a5a9f7df6be7b84a6abfc216ce1f287bf3d57d606e576b368d4fa15a351f8b6a75b7b6e30cefe8af13d7feb1cdbf0fce1583186a7b7ede532c16e5648d6bd63ec1c63e75896656f67e8868b5dfcb36110c3ec4c7f2d6d1bbe71a9212ffcc217ffb5500677da65bfa6b564076659f6768574bc773b2ee4dc49dff4dc478884f623dc72bf4848e7f4b71f6c44cffdfedd6e3678863b6bbaa70d0e36725eedf781b90f0eeac9da4ed3b76021ee1763db2fded718ee52411f4ef8777ff6ee0a7efd17fb1ca3d7061e062a08fc7ad0e5c18b0774ceee2cedced83e9be96e869d63dfed00effe18fd6d29a3763fbbbe427d0134fbc0f499e82bec3bc057872f05df02be28078ddc78d3011607b203ac06671a906830d880ef0dd953b1b7400f90de1cbd147a767a590cde3070e49c7704bd27e8dff67557fa5f63b9a6afdd9b69ff6d4705fb99d3f96f28b79bc1fed71ddaa37f687bfdcc59462d13ec09ba209696c9fea864fdae7fd65afb6f77c12f9f314a9040f647eddd3b66bcd206baece92d5d0b32fa3eea76ebadce4e15a452cb04c9fea8666675f6b66dbfed7ffeeb67cefa8cbefb96b09f39a965b2ec7b822e48f647ed674e2a36b6e35be67e33f8fb6bdccd6a3aa626fe5167fadbf1627752a1d41f77db67bb379bda7efaa97757967dfde7cfa5bb33e14cc765f0ecc9ba19f56b69416a7cd3f35e8f52efe9af76bd96dacf9cfd57bbbeaf3bed98aebdb53a9f39e12fcbdf3ad774b7bf75a6ed985ad3b7d5e7d9549b2b6fbb19f5dbbe8edaa380ceb986f6b30ecb74d6fe75f6a6f62b7d8dadf16dc7357d0dcc93d3cc3393a7238f43de02bc4278363877ceb47dc7ddaec3b3ff5909fdd7763d419740f6d7bd6346bb3e6080f396b95ff68a31d7825396bd95dacf9cdbd81adfb5dfd2f0cfde7476b1979175dbfe714d4feb9fbdfb97b1736c77ef7b0c7fad762fee6be3c1f967176b7a4ecae8fbba992d7b45bade6efd5d217e5b3d7dfdf53d7f3bee585a3efb35e05d197e5782beede9fff5554bd7d7bb26ceab1fb6f3e384ffa2cfde7632ee98ac6f6dae6d47e5bca66ffbd77668757638e74edba6e57e73e93e63e7d8ec0eefe6566d3abb5877a54ec6fda575109c657564523f9c3bcb6cf84b219d65d232fa26eb3057dabbb2ccbd52f7a8fd67a5dc496707fe742362f8d7d66e46a5f66eb52f0ed265e99e9c3bb377bcc00e7796d9640b22e758db6dbfb8c0ba80b9edde1d86b55c6cedbb73a6addfb6eb786e169c83e4dc499d83655aefaf1096e96c730e8213feb75784bf758eedfeb3837364347d17caf9e1f657ecd2a61c14ce9dd4bc0bffd757b91167bfded6c9513977ca75cebd1dd7b7fdebdebde3383f9c3ba9818cbe8fdae16fc35feb67bfb845b4b847bafe17e21a70ce9d5c98b6fe42f8b63ffc7f7d9d2e1ee04d05850a78b448d4308a0637098e10e7fc016fc2e18063f046e86dc61b84cfad6fb2befd3fb1ff7bf6b5e762b1739cbdcbc8bcb59bd93edbe76fcbb29fceb1b6fef7873b7d77698f9e39e71f6f63ebaf6ffbc3d47ee6743aadf7ef66b6995dffaadffe7adbffaced5cba6b1627764f0ff6fa57bb5919f573eb9b4ad6ed9aee66ddac77677fcfde9e7eb9eaa7bdd7f13dbf1570e3e3068573bc3ec049f5b7a2ef76d72fcabeeb173b76bebddd7d9f63a91b9f1b55db006d3d9c0364ed9d753aa3f7ec17bf36bee1e0123de204c1b6c63632ceb9f3de9a75db33e2b1a561f3c076c6e6b42668ed8cb36caeb9596bbfca7135b66d7abb48cbf21c7f459fed373dcbfd1b92f5b9177842fbcdaddeb6ffd7b8ffaf18fbc52895ce2e52fb99b3af47cf08d74c70ce79738dca9dd49ba66b6ab7e32b5d7b998bfdb51a1e35276ab55a81665a21eeac692ad58eebaf187febafa9ffd779549b9abdfd87a753eaec3b7dd7ff9a36a77141dd34a12a38e7bc0905e4dc39857f956bdbf1b772e15f53e79a5ba59a7db91acff14ff4dadfcda6ddcfdc6bb7fb4f8ce599d0acdb71a77ec558f6d3edff89d40ecffe967db77dff70977d7ccf7f91967fb56fb9f6819fbd7f7ded70ccb510cb7daeb97550aee720ceb973f0ef2fb077abdd6af73361a09d68a5f9aeffd7571bebe5eb1342f67e2ea56863d04638cbbe622cc3686ffce656bb148d73e76d7b79a669bbd3361f6f3a83f8da6fbbed3b3c3b69a7d359f6c9be622cf7fbc06cc7fdfeb6ec676c2cadffbcf8d7fd0ea2d1c169f727cecd75b3b82b4dd78078718c74ddf40cf14cab69a686736ec79b668ff5afc6dd8e7bb69b95513f95acdf71579e6978f65c3344b3b00478124072eefc56b35ffb7eddebceeb95eef0b7e7d8637defdd9ff8ebaf08d3d9fb6b6b3a56f4d95fb5632d9a62ccb5f07bfde9ed0f4c5006e54d048d10f840005806a9cc4799e023321e6483dcd9adf6f9cf392b5ee97edbfff6b2fdb3b7d3ee8b7f9ec2ffc2f4b67f754bdfb4625ffc33fc6d5fed76fd6f5a91a6b3d6f957b1738cc57af94acf8b346cf75fcd5ae3ec2259ffb7af3b17a6ebadfd7c3ea1dd8975fe0e7f6c4d9ffdecfdb55cdbf6bd2bd377161b67efabef3695dae17f5bfdfcfbafd27737fb76bf19ffdcbbeff5c762e3fabe6d2cecb1bd7b5fbb14f0ce4f1ac860ee8eb5315f9c9fde8c7fbefd149ef3fbd69abefa75bdfce103507cb30bc70140defd894d0390e6d8673fec9b06e21818c179f727ce342cd3d6dac033b1a6176f18f6dd9ee37ee09e3fd6401377360b9c71ce746ca57b9fa5052061d81760e44edbfe56bade6eff6d7769014004bc59408b13f812cfdccee67c763beedd29cb5e5bd30464340940e0d718a6b5b21cdff61ddf3381279709340df8d2957f622c77b30132aecd017a5cbbee7bb7dae1bfd87f15fe66b71dcbff8eb3867db67fbdedfee65821cef9d8953119cd31c53132a7cde8b5fdfeb6748c73cee75881981bce6b3a6bcb35572c087d8b65bf6df5f0b7633126e7dc39d8fd74fbd73ebbc73997e3cd0ec93977be9de50d12de7bbd53ff5ce5dab71d337e3bee4f5e73ab5dcbd5c68c5edb7f7630cc0f1f0cfbc2397f863d72ee8c4607dfd2a0dc302a0dc33eacd36076febf762db7ffecbd48cbdd8e9b6041e8d9da39e764bc09c6d807c13ad7c2af3b7dc3326d9df7be18f5e9e29fe7ba3f71fab5deef6bfdacedfec49abeadfe3aeddeb29fff766e30eeffbc58f685d1e8ffd768d4feff3a77cfb1af6f7ba6ede49af09e3f56cae8fba2d1c16ef6e1994bd7c935773ad7dcea605c4de7f9255a69b9ce67b7b29ffab9e656a773ac6d837265af38adff766a4f19bdf6ffeb143bc789feb6a773acfdff3a95e9e91c6b07650fefc1f13d7369adcfda3e4b5fe73dfa3ac7f6b4a6eb1aaffe5d10bade7897d6d6ff5acae5073bc33f6bdb3e7b8573db2f4ab92039b7fd6294cac5c83997720166e7bf2657976e15fa729fa5cd2d24bcfeb71c6f015abdbcfd358c9dcfa4cdad65ff776cd3b6cf6a21c95a6fafd5faa6d6ddd4026c6af19e7506919a68fb41ea840effb8996537b3de38e74e6ac7cef1af693baaecad319ef3b676faee79cdac26cef987ef3bd656b190706ccdfdd57bfedf3afffa5f7fdd7dfdb383582c9c30edd7fd0ee6ba3f314d8d3bf7b9b22fec7e0771d65ff861da9a68fbc1c144dbdf585a5774aeb638a9d4deadbfe2efddaa9db37945e32a8f73ce9b579c7331ebdf9eddf4dc7ddce9d9be3dede7a4dad839a6e1c5dfb4726365d8b4eaaae252352ff16655b659c5e4dc690f3aa9536aff3661777e9bdbe10fcf5faba5adbffe5adfbfd6cf5bad67fc357ded6676f7fe576ff7eeecfbcda57fa2bf6f9fb57f9481df9e5fa0d4d059ffdbcb5cbbff6a9fbdb50f7627b5d317e29a2ee34d2a37f7fc157f62edb5bf3e9be99fe8fba81e39776efdcf76fbc0ef5db9aafdb62dad7e43fb63fdf6fe829cf33fdea4026b36cf344f70ce9d5df9dfbee65aadbed38b9d31bedadd9f58e5dafd4a733b7ddf341dd8957fddbf614780208a37f8e7870081d3cbb2efb21c3b68266832fb34992ba2bcc9346c32959a029070a79765a953e6c23f6bb53b7df79aeefd6bbddd95b75b1fc3bdebb535d76a777fc1f98fdaed03f4fcb7ffce09c7ddf659183bfbac75e676fb6bfddcad7f6bd75c7bfe5d96e345b3deeb986b61cf09ff0b3e7b776e9f3df5c3b495dacbbab59fe36a27eb1febb5f1afb74d012478bfd25adaeef7179469ba9ab5bd5e343a98b57df6db3ebb9d1bc4f3b7bff3b787adf63dffd81a5faf5cdbeefa03b7bec68b4607d170eeacbfcdf5da2e73edc17a8a43996c73e958f1d75b58a6fbcf0ecec132dd9c8ae3dc59767ffbcf74bfc66483d1e86073aa49da94faf2ad5edef6449abe2b9445a36488b69fd230d79ed0a5904e78db6dbff8b3834d2946ce9df0a0541fe7bcffecfd05e9ece29c2c7bbb396c7c9d69bb6efb3e1817c748d7c9b2b72efeb91975a419053bbbd7d8fab7f6b7b99d86b9828bb0ffb73dc76689d69f6d46419b514c04089c7fa6e1b399db7f15010267ddbbf23dffd96beb0fd8846272d37460132a07941e77767fe2e29f7d2fa32efe994ad6e1fbdb77f329d1939ee6d30aee9c4e6bfa67079d9eee54f8cfd85890eabbfd3b3c7b1ae65ae37bfed99b2b65fcf0ecc48763693e2c2d379d1e7ff6eeb65f6c3a41e09c3bfbfc15636cbf7dd389d9e4873b6dbb379b1aedffafddf6d8de9567babefd2dd89db6b4d94475c271ef3f3bd8f4e49cf3aeade96bfdb79dbeb3582e3dff7ed37ecd26e6ff57a6469c77adb3afeff9ffbaf715da693241e1fd67ef26930cce9d596c9c6562b43d8326931ed3939bb93ddbd4ce00f7f09a4c5a4ef8cff1f5c3336173a911e7dcb948cb9da6ef6ec7bddb9e417309ccffff6a37371877fd6b634bd3bb656f73e7cabad9b30daa471667fd85d69a4bcfb5b1a511c63ddba07af7c7d6febee3396e634b236c2e2d39e783bca98484f3399ee9b8a904c89d787d8e7bede5581bdbdd8ebb1d6707bb2cfba6121977a6cdbe7fae6def35977e9c685dabb5d3f71cf7be42bcbee86b387bc786ef952f3c8804be7d586f4d25d7d39976d69de33bae1761ffebeadd5a1b374d711a8ddad3addd4c1e69267534938f653dfa2fc4f6f44ad3f5b69bf5e9f5d764c9af37eb2fb4e3add48eb71e3bcb5b6ddc7cc5b676e1e0226d07ff442b2dd77db9eae1f96f19f16eda0f9669bd9970fe17e83aa1aba8e42dab6864450c32a6209a9119c140004001f31240304828160fc70322a97817d571031480036cd4769c4217894114a41032c6186308214000008080008800510500ae97360a9a61113e3d6dc5f556cb82b583e126f0749fb2179d048c2a972c497047d666b685b8024dd0cf32b7037a009ac69495427870c40bf98e3f06483da79fe6d1ffa1cbac3453c9be1b366e7a0d585e6fabcf5ed3b0d38b3c268aa59d2915812d67ee29cb430277540f508dd4ccb14838cdf549f93d24adae0c6f73f7c769edf42502df12894a1d62f8c77db962dfce35275bb0dcd41cc6397ca23a0b3701a7e5095334f930c89f502b8bb2aad4c6f74a5e166b30dd051ad6c5cb3e65096c60a165f4636b6b151a198fc44d5712219a889450ec05e708dee48a68104d79841f0ce92bc51d3e84cfe517ac53a8d306d63544c2e3f1ec8b9185acc8a00fc5f200824e5ad8cb4a67044ef276298eb55476c467171ed8966a650891b69c5523753a1aaeaa06151a80a0fc64ec0e77687593a0ee0e56a8702cd231759f49d3243bff8ebed217ad9a3d171dbbaaadc149dc138f542126382d9fb2aa9101e10d98985309195bd666d06cad6190c022d915634243c6c2116a900923d86bb5674ad2026871c723e4b903c5b2af233b8aa8b1541b4f2bbba6ea82bc3c07bf92d5d9c7d9827534302b9932d60bd33113171eb22ca2c4d69a4ecd9130c42ff65cc027e46f1c9ec9bb9ea46461fb40b77cd8c950e839f8e288ec04686ab9cf28e4283dc18c745e9059f7e6d92759385378e9e763ba093e7ee584bb7e91a7001029114bc767d2bd44e9fccd4c393a47722d325788e082b5165b41e1928b83606c303623e2e69a665ed7f04c24f87a3e4816c27ac91c330fbda44c015eaf8722abe9d092fdb9ba5529610076346e6ec2cbe5b242ff4a1135deea7c56ff2f36560066d36f713bb7643b1ac45df7b116ebf93f047ee7358809ca7cdc130ffcb77c86f93ce47ff516177832017972301ba6e84b4111a7088a53c2bb7bee49b3eb97dbccacddec98ea067a36917f0bf224926164487f396da11892ad1f281125a060d943f01e336ac52464f2716d778075793564a8d5f72a08073bdfc22f94fd9b6c6b7a8360151ffad9fe0e819782ede3389fe107d011a35510eb92dcd23ccbfa58d8c9393c14af2bc666dddfc3ff06599933294a43910dbfe083597be28ec3df948ff27fc02ef51e5e123cde8083e72b82dd3c09358e2ecfbb37c07f6c58fb390c9d610f75644d82e104253018db061f2e3bde1bea626b15aaa758b352d7064476ce64603af912d9bc82600f890de475ff206520f8f6b20596c6d9f2e88d27777a667a804ab810d6c2b170e657dac69b0274d846e38e6921e20bd1dca96d83e61c9bc2af02158ac003fdc72b96b593effc6044647b6b73127e6b58210f703222788c6ada081ebf695321213955d081dfd693976caa34c1ffabb14dd41e5a813392f6d3d39eca06dc32ac4e15d39d99012e4ae051d8bb040754272e6b6070b3b09af78c33278a043061d287ab3b59a68bf3efe342480d79103bffe698170e156ae8fa6962889764678208498b882215e4f14dbd507cf59a545bed36e83fc5d1e2b3d2705928d8cb455feb42af57fcd6afd7f48606446a6cc1a9eb3debb7ddf3eacdd1b4f5b032867b0a7f7abf8109805aa80eaa3e0b280f9a5ccd72400ed69e487114f558ebc513856d43f40c1e4dd78f167615db715759cf50f6f70f3faa9c06cd536e5b3681446eb92ada0e93e730d5dba3e931011d2cf92996d90d9dea83168073dac28734fe737eb33a5638a863296a623c3e8e98971416a75c333dd56a57b46d7fc636beaafa5a074b1cff1fc8aed40bf1fefc966d25da8e615c8f919dc1db29b645ea42ead56f184d1ecf2b217eba26ef6313e85c6596fa4ef147b826e9fd246a4bce2e84bee792e6074b0de8cef1429bf1dec4f0161c8ad06f73fc8a7eff4d72311c382337a5d88ae9c821ca531933c555a48955db39fc6c65cbad209eee99233101a4f8fe64cf76db0f655fb5e47c720d9621450b373c4a31e9c58afede159d74815dabc31f65d6fdda34722d3b1ce30ff28f5c969a399f8b26a3cd5b97388c0f9704ea67b95bff3898460dae44028ad7e6985acd4b8642e2d5c673235b1eb1958a09c46f3e687124e4ef9847a1e92eab7f215f91874d3e730f5aa4d5da60428373a7b110575aefe3fb1f84dbb785f0413d3335f700540749c17baffe05687d05b6e5b0fb3eea654fe82991a2348f1b14a382b7b24fc50959c1c066d79329840ba73e0e0b76ea372aa6813d2a7e91af2c54617bf03d963d38512616f87ebff40ef95ee4fd4f431738e5bb7908eeaa7f7428678ec9053b58556a644c9f691326df5e4e5c06c7f11457285075b34ea1aa4b620fc0796b3f84070ceff4e378b62b399f102fe8215b2bbd3a5eb7e636c728b61c545985b5a2d6ffaab6c089f8a6df169de16d77384c51a130ded769913fc4e9f1882c6ece99a9e281db756b909b80037bf001f5671285ac36b32453a4b363f4a0e8ad9a6bcbdcf0b00d095ab52e0b8ce6e949d3973d9c576d14c3420855c4b303144fd1bbfa3d341ebf34465d1f516e885355fe0e060a654211ee995b6afb0a3499b8e8451a6f2f4f4776e4fbaf5cb838edf89ee25ef0fb640bd92535d6e77ffb49dfba2208b7a1aeddb6406581de0ec2e756f7a2a5dde6bbf3391efe9158911c4cc5b4df82c8c327a23112e1bf0dc062559b5868a46022bbb781471a1092ad1857e6bf059260a2dc4b80a1fbdfe6adc51a260094c105292309798e18190067bc875201cd4facf9ce29e0d93fcab625dc5ecdf5046febeaf6ed1bc194518b0a21e645770db9c6ac0f12aed44bf9cad6c04cd4d7296a80d43c7ebaa3dc62aa6fc5ae782dae8eb8a9407a50e20bfb1145b49b666479613c287bff182bf08c9929139ae2d49d28e088927ce180569132cd031c48d1e88087fe0308a4ca56db7e80518a85c4384c742b9e06911eb9ef3d6ec1e51194a6a4123f4a0d12135eb68a3bfe3aa98c569af85f5537fc38282919913f66bf7edd238c9e0494179ce84565022a29fcc9ac69b5cfdc3eea68b6da523219f250138ccc7fdd349b77777247051f934757061fb1e002195dcb818a7a47addd0cf9e082386127685e77ed5f517caeb753211acd1c5b189d61dc90bd9a5b6527f3c01ad6909d89aeaca5dba349d57f80317aca302c19a8fa3259e8cacdaebd9adafc74218e09decde210d02bdd44804ea17c57066664e8d45c5718801da5ad0ebea2122ef02dea92785e38f90a0d3c6651c1880a10f9d2337711b3f02beeca40805d9573843b157ff2a92f610b17664ba1070f0d8d42cc0958694663045ef749accef249f004348d16a669349160561215512429086312bc9099362e76fd169d2f60afbd1b1b094a1a8527270050c7b609d940ee146bf4b15963d31581cf48ad75b5001e09b3f09d80623556d5accf71e9137ec6f243df4ae57986030da7a8b0acabc923cf641335d03a6dceb624a679e96d9778dd9a2c8887711c85a04754ce00ffe0fe9035ae444ff8f315a9872b4dbc2123d5a04e331f6757efdf3a956014898369682c99f75133ab792357df2acf14bc11dfc52f60a897d0b9e58f47301d64e76604d81e3f87a9b99fc4bd49904df18de434689d0248bd80865a558a1a94eb684ef710737d6c94c27ac8c7667fb91fdf5ef3b8d10a41e022c4027fd9afb77af761ffeac3c2d91729a3182510eeb8c9cc1ef0033e273d85f8e19c3eda3bf9e7e460aa2c95e1e01e1005ab220e4d696efe58d7de5e79dbc7d0793bda8febda2ea0650b98b02453de3c7877e68c887856db9cb1ad24e70323a00b161bc88c760fc56b8bb6214dc6090ac84e1d6468e76e1b123cb7dabc92cedc7d927024aa5b21368a2e90ec2250b51cc0082e67c72e41eda78bf4f4f06ad9671e452e185cbf38d00934e808dee810ec838a2b929dda49c1fb16c1deb62ad6e8358d6de72745c63ba50db7a1b976ff8faa4f9d3d1ec2c9b8a19488fd15ab6512b71382968bb478840437441df653c7bf4e0ba576b8b3671f759b9848a86158d6962a6a56e837819a471ce09ffc8125e55a22a5facaa095005268eed3df1609c9b27f2335310883673c415d710ea8677a1d0b7aa54e2f44dcee74007f147e2f8c2d700cc75ed659da88136269d3e19e10fb734d26c7902b9feb30b06eaf5301a25d94a9b68674f3c8bf41a92b596a0fedaae769ff24a261cff71003d4313488b8599ece27040a26fb1e429f4bbe00e737984b702b6b775513d3138f21129aa1da28125f490fabb24ff76ad31a9bbbd65cd7ebbd30c2374903d1745165a0116cd34bce41ce551bac1917796d82d9810e11cc201c6423c94f9d44185dbdf2a88d682cd82cfde92804e9f70978a38666a45080088cf3fbb4c5626677905195a6047ff744a35e7811e6c3607220e344d3df0a0ab568da865492653f1f0f5c94162f5a2f7a2c495ecf4dc046b21c0d726af4f446e8a1aa9c2194f780d8c71474b11d6fc7a5a9e3d9c5add8f78b1f90dad4b6a783816b6908a6661bfa167f2961804701f2dd96fa951de72587bedd550d16cc06467b7c9986970dd90e0422d396c4b86c964cf14e583f0377ece95a62d74dc6427e36d0b841d44d019b1ed792aa26c332886027133476950f570fc8c8b65566cd4b46e4ceb8fd6ab0a3943b2c374655532977b58bc04d109b18715a9dcdfb036f933c39aebce53f9d1b89fbac09f0521f2c797da514bde0b9a62d559dbc5c68d12690e20d8737ee413d3effcf3e75b2775afb1411e933a03bc592b3727f0100152f80c5c3bc74b191a24f95b345f2d30bcffeac9cedf89bbb872cb7bca783206f18c90e382b0791870813e2b55dbaf55f6550678a2d4c93105559c88305f41e2fbf0535142b7cf4c0915331ab84a499e62641cc041b7686076097897bf4f3e17a516d3c60b4ba8c2acdb7f5d9678400145a80bf63bfcb9cbe3f2141fa9210e0cc352ef700360302f7e21d2406206783b63a4a470f65f98d2c3dc3ef0af9d621460773592ea4e468200124e7ed8fbab77fc6740f13efa13e1999e300713707264cf88f50c709986cb6d882cb28d5938ccdbc5b03c2f465e980a9a890e5b2455be675347075f31f1190da79c65c11927693b8c0c53b0083738ce1c96631e10bd55737bc013484e6168fc6b8e7aed16755a697cd34672a88c22f21dd70d19f22da2cb0e439ecfed35c87384faf8ef2e3040f98f2855e53332b16a3eb36eff489a5569da43006114cac256de424aaeb81b788b327f849f9705fe4ea80cf45b6f9c0968702237018a811f4a5755e6c1c149c234b9d8a0942e45327528aa174a8d28372c8b61c8a517e22d5b34b4e7c2928307dd792b9d6091c3c49a7196a817aea8282c67e945687d2e8ac31b649599bc57e00257be008fe104e1e2d6ecd150b24318832938cf10e3d24280526b80608ed28096c935b1a47aa062c39869055dd7723cab29622fceccdef18e61686a1b4e3a842889bd9fa1fb08e40d653c79acb962b094f9d3cedcc7b9bc963bdbd92b5a6cecbc6d17672f47f7be83c48eaab9e9be569d4d35f92c14eddb7765476ea1915d30783a616b8c8cd85a56680eacd5b7aebec2132115ba960f47408312ba3a5a0b351412c3b913db97eb52baa944c2d992fbbbd21d5aa708563ee898a54da64523359fccb44c15147b5a823f0c201cbd1702a75ef382c5f3a0b1fd04a5067466a2cf703520ea901cb8909ab028ed83dc697efd3bdc0bf752b69bdf9c96c61505fa7d5bba7de4a1a4c9c122209baaf2ba1d132d3e60953693b923fe2e2622a63338d1088e45656a2595334156f14ece837ffd465208cc813de57be89b0b4dbda8a85d7199b2af8d07e771d578c7a511140abbea6a61eff9b4b8aa92dd737d5c9a5498bfe0c42530d34a1c3f469bea8029456d93966d2871a24d98334ce8448fcb3a772aaa0e7e0e16bc8db1fea01f70ff47e691e854ffe860acf08cdda12d84e6208d579c4bd4e8c906a9b6509c8b84b60ac409615997590bfcc1ceb7ba97f905c645530a5ce59a728cf729e5ce5e635db66c98d99566e2fbdd1abdf818cd2cbb774cf23eab6ad8be4901c7e265e4715762a7c3415f63738dc173eaffaf0c064bbaaacc202a90298278958625efcee8ecb0ad90bec37524c3459ce271b1f621afad5bec4eac2f7be29080023ba49ea146b32e6ac7a1cb8f0594d11ff06602a1ab251c7124e585e40bf4ffcc16cf36a6b6ef4622a6191bf11b664aa5960b5b128ec4cbceca7db8f73bc24d0e84767cbc6b8e9d6f577dfcbac96e5d0fb251060e41558e6b48cf25058e5f0aa29124ebaa75df8f6c4dd836ed1196ceea575f41d2479fee3743009dace5af832ae50cde54819e31c7df06a4cbf800914ee8e7df3d6be133de63e35942309d93581cb14bef25a3324b2cfdb89e98d28b092f052893e6d6f577cdc819fd48e4af46c75fe3166102fd8b868bfa2ac1e9c6579c4878a02119fc8d5663a6b5469c6fdb52f7fadc2d44a390f98e51eb6289881eaad21fd83221d832828fef8f4ac28fe38f1cb2471c7bbb3a761dc434958c73ae8ea339fea76fa1dde93987e62eaae2d26d1b165079ca43a8e4e87884496290fde8bd374be76cbe1674b4aeafdc7e9783ca265b27c81517c9f223c0885bbd969f138ebbcdb810df15a51eb292e61c473b26af5cffc2e511d2e887d45dd10062421b5ea55a292dc3ea1e1f8064bb59f27f266a64071c870e03f5fc9c6e75aa0b3cc312f2c7a3308f3b85b553aba5456848203041892fa938e56af00e70890727f1fc70a279665a5a360b0b7123269262751573aa91160152f705b8033dd3b30ecd3ea974d1cb4062f0838f7f3e6b659a03c1c07c7a2c7db34462664ca0c8d16ef42ecf739a13551af03ac7b2489ee13e857e2f272972be152f2e8bacb0aa5ce25b1aca3b04e9cb4f9c67bf2aad0628612bee3a74a30186585535c8594b7f87b0664b85cb6a044db0fa983e82031b80edcb4e31b65ed786c75699b13a658392c9d541ddff55d46fbe23f7b64839acc28afdb05be573de2b743eb4049392e59498b7b573abf6ef58a78908d31f10d048e48c83e9d67ef56e26d332d73fb81bafd8ef4c328dbf7283adb99da1d0aa8870c0e197b84902691a4ad32106fa8eb6dac8b457cf9cc8a371f0d636f8f82e3d7e0e65bf6ae78486b29e190c5af2c746167de22803d620b601d61116ecf9554015d50e20dc63a5468575ee48feee2b3849737efabe44fde5e088272eb75ab21c898e95f01e5a84aa574511a6f736fdfd608e3cb1130455147ec94efda99b60b6f8dc5ef1b29891cd4e1bf4cab6c79bf41213b9d20023f00e1a093e8fef139e29e38714b5c3611ab9077afc96bbf386778782db8977062387e75e318b31d242f052f63f7aa6ac416aed41772a95f256ec50afd6145c01272010bff397d5bc1da6d01e7abe773c4bbe7a7ad889849e97277e806233ac3456488bc991c022e83684bd3b3799261adfb2ee1086b01267a0582ad48bd463c1e420d802064010e73b9a677db7b40f224db1a68971916cfdf6a4fb107e104eb4fe6ef28b36a17c01e24c4a56ce4cf5a4f721114d8d1b2586ee473d86a030c36649ec701384268538d7cd60a9421bd04c03c4eab745a6405a506acd3517ee00f0a2e6f058ba95fa1ab03905c88094c8c85a2f2f960417ace61829e34754a57d7ac99bf07b3a5d0e7da148bdfb452433255373cb1982008c4ca562234966ef24f4a9311900fb2d05e4523fd1f45505d64f61d90c3420144ea32966dcbd1b9675f42e112e9ad1d9072cdc18faa9d7c7dfe0d43ff52810c26d5c4c77f8d31afcc387bdbb6148b768f81d72aeac825cea611b0148afbe0db85981efcbe76e4768e20e9bc39d6b869d37171de223236d8a52c6bc6a9aacf7c2af476d995e532faf90d1b750b968547c209b9ce19e9ead38aafffc88283ddb57e3b792704d7dd531307b2e8eb14eecf84d4c0097d904afa38f4b2f5ffc957817640a0afd76bd276ed452387b241963dc4700546c1bc284d1efc10a7411644deb0d0199ed41c1db7fe961f6f0278cdc2bc6c61618ecfa4aefda9e545fc6e417770e611124783c587e8dc1a9d441920e477c651ac9adc59ca35e66e64d8e314eebddd91887ea63dbb4f7d4f653f3a33880c281f91f1139539c541fdf26f3d51b6ad72f93648286d2a6ff77235f37e27805dd4fc555bda84a3f7fc447f5d4dc0a709129ba4010f29b5d73d85923bc083112004b87f3153bafd809b5d46378662301bb0f8ca896d040002914be1cd10150cef9ae853ecae2cf5d976c07cd07396e25e27a14dd5167df0d125051f19f3d810a24d622ab0728e6c06ee4d3b660bd151e9c5845de4720af27382f34114ae4e79508d34026c185966742a4b965356e8768f6d4fdc945cdda2400f48b86ea6d7809dcc90e1e9320cc59cd5a10285d4729aad10b82775450b01d01feb814397c006d1f8ec46fa8725401fe501ad8548081865d7320f18a6c1d29f582086d315f589fe0cd574a103e181016e40b7d343d3156f5411299cc0906a9a41975162d6d4dee0fdb828ec801576dc8d85a6a0c1529130e77396aa499f64f36858e74d27d2c566731448b34b9cde960634075883d19ecfa3f79a6241bff4251453733e1bcacecf8e044319b1aca0b01741c788af02e9fb2f158d53ac9086d400ceafee258360f8d8d81b251ca4062caad339e1ea6a80cd809eac5e175853ba6ebce3aa267acfc2c0b6b5468dbd165456bce7a11583891e2e7e68e8002e06c147856c802dcb08ed144cad098b90dee142587d0016bf48ef4391dc5b8a75bbbe3ee954741bfd6a65599f72d01c29fd1d63255dd59e80a19b11d7cd51800e56193c8c01fcc34871674dda60f90132dddc4b157c5712cda89a0ea69ef0448ebe128c3f116675a75f42def0cc176154e281c29963b87cdf7bf880599b4718b6c2781748798f66e2632433607373f799686090da59187c8b0abfdff0b1c100f75b90732371054b03bdb638b3da75563e41890d6537522f6b0de22db7a46a5f2e78295158fcee167e3378e3ee9180997acfb3b1d73fe0c0b6eb18fbea504070a09401cb174a26cea4b585c07512a64306adb0dd8607918237b9e478457ade92c22e95e70e3f6606388b8630091043b0df5ff629e3c8f85d0990ab168206205c0602cfd1973a3d3d44f8924959caa7c060a963bb2d1cfbc5303a3a4ac9d5b57acd94a3aae8b82d35242a405111d5a11c70e85c2ae2b7bdccc93abb947e3ab0de8f6fee2901d18e8ef9f68dee291abaddf052bc9f1f3e6f91abf1fd7484086b7fe177fbb73ff77e44dcf790bfa686af26392781ae11e3a945b54815154a8d5b8631c4bcc7434b2e609ed224d925ea19e46f72e16bb70609b214068799691e3e9f2168c8c6bcb7d100632b86c7e55dea31660485071f233d41acadbd4c1c1e210eddc1c774c77fb8316fddd527aed88ce9764f724dd820770a68867e77983b374523fbcd8929e62d0bd20102a48ff71ee0f1632880d0a1bac7c964ba3bec4b6d75dc74d2b90dc912d2662a4fff4c362fa1798c3d34aa176df48b5c8d9c318244466d8b7a66393e73a0d952f95e7c5f92d7ae24a5097fb258da3541902d5e99e4cb4df0a8fcbe711cbd238dfd55109833acd69bd4e69928acf404b0841e3c6d80adc903a733db13a74f4bca9a481c212f77975c9fd0cbccb86e9c30f204b1e71c21c39ac4de65c46fa3af00a6f5a3c117219b2fb76b5de8db91d3baa7f5e21eb31ec4f2d69d76956d3670290e71914e69cb2b11b76ac4430799c05a3ccef188ed19ca210be46cd8ca683124c44042e217b6d59b98d43e6b5bacdb8cb94c242dbbdd239a18f81e14462672619f982ff3bc2c8801a973690ecc6d07ebdc827ff2043ed775174691320de046cd636a74a0dcd5aecfede966ea863f581c4dca9ecbf2cf718cc6ae6d1c03039a6dc776dd9c674da9f194e63aef6a59f3571cb311f482d250eef31b960fdae47328af21a8681828f04ceb98677b53ec0b46f5a87510dcb6a0b612f33e675a2d5c5400c2b86f8d95b677b54e95b4b5afe75a22d02d931251351bbe76ecaf5dc838ee49cb36170f8fac6b7435fe341d2d5ed13376bd5f5e932eb243755fab50a08cc33669f0e8145931b3f83d8c92db6fb84f80d20e90d9fa12fdc837815eada8d6d358735aaab6a1ff224b30c9e12aa098cd3cf8049c4b6392852b83b265d3e24498b5f5580542c77083e9daa6a277e310b6b16372a1caba1677150490bf47130610513e6d19d20ce41d52b75f11e3c8e7fb46c7091c6b636b43c5af328a0223e778fe344c2d10382f7f3fdf4e66a3716ec35cedcf341163669e3db59b1f990304aeddf2c6a9257fafc57d03d9cd8aa9c2ff8dca58d28367a1620a0f2f775ce73ae914f2c0acd1050ecf6f709b5ca0b4021b247847c8882d45c50aa8260361b244dc3d92361c149f14e984874e3dfc85caead88dc192ff1d6287e5977c14631f535ec08f321e727f21f56dbbe158c1139454ae361e4b5e6e4bf7828c1b5732870f230cd76a12ba7d12036690c27372b90109ddbd1e84ee2cc4bfc0f305c29f0ce77a66d9eddb64bca0b0eb8fa48ffb62dc7770e4c5fcf9df843cbcb073c575fc898b11fcda1b5c63dd86bf46a79d904fdd7c6fc2df75065f2a3af4f1db07e70f5b41dc454b846556b8177acebea2852791366aac153c81b379901c4c2326f8aaea9627510d44593bcb36b7f24d193858a96bad9d6eed960a8f47539825b96a5e24bd36105f766eb74916c190b8b506c85b44f8601a52d61f1f2664d82d2f18899b6691e8bb72994fe7a4c05e691333839b36d1745661b89ab3b164cd2920871253860bdb3f6a3388f64983a762c9779e6c1ee1f699fbe49a4488608853634692b6e74d28ee53fd047637fe41185536e97359b69dd8bb5bb969ac1405a9346d1a00454e6b710c858b1431650f4b21d43abf1e8fbd6f09c4382d74499cbaa3914b7b02a068c07a1cfe5b450795e8ee6d11daaa43cc5248e841aecc0766e4dad8bd4fbbdf5b09622b9f0d503298ae4b261a5f1e3ea02ceded0323071fb3de9c09de1622fa615d3e0f12306b8fb65fb5d94d803fe3c31949ab961b45d1b1efd9e552a9d3848ae2f18b12e8cb248358d060a866f295016b0e4cfb670264af738e0e6717b2c624a846acca3fa5767500e3d23c846affcc27940066de77522665983da5dddfd67bcee9200c66253cff9bddd77d54a24c14caadac447302ef3092decd34c2bb46e95a183518c0d118ab0e088f7872f539ec8870de1831b763c8e6e0ff6e1ef4d8ff1b236fdd727f7f9e76f4f4d9ce7944dc64ceec95ae7144b036f21531198851fcb427eeb1d9703aa730c03bb6b5948399d9d7650beb0ab325b820a2075969a0d8d941fe37b82f1811bed57a3cda2e6fd993652cfd8f439a6512c287b21c30072116ab06d3fb4a9526bf10c1913180e74ec67600256ac866f4c181a0036ca109e38c95370b0338bdcec2d3c206800ee4a8879c851ce6334dcee1684a59062824cbef6e164a0ec89746a45770c569c524e3e2b1fb264b8ed8ad46fb0aa38808c13219087735f3ec98ceb0bf93a12d1978b859e497ef5a0cb6c3496b2c1eee642c0e5e01b1000781cbee14c7f740f726e6c97fb3dc48bcd7693bd89bc04e8bd4318edaa87534bd2c00d9d5a5196f308add27474d21829fb5cb30f0ec80eeec4a43bf7667aee33d3da2b2733d0d34c9e01bc68502c6b3cf4507430d90f794ffcf7e70208d4f40f3cfe23813b67165064c9ec53c4b7173181ec1e7b37a2748ed7a58a87d2026f0890badf015117e20756e0c36b9b4ff11358cb5483f10d968d60309eae6950511783ee1344e49ef2837b6f02ead0955a8a1770260eaf8dd8dccb6e3f1312ee0539041f63c5aea65a136685a2a45ddf6c49527065570a30cdc386eef5a1a36a3b467ad412a9fc89015b1dd9ccea2ebb48cd9634b4e358b68715d7ca6be58fabf7bac25fd5cbbaa47742bc4c1e94d35f88156172e2057d8751c24066b8ca80c996bb0f773aca05d25db1f540b9e50445bccf7d5c7a46201537a390df2d08f3efc7a96404e63b03e893bed011d12a90c30621c1aed49c89981260fff98fd52af808acc6c7675fb756075e1d34208d905132c74ec740176e9ca9a00231e4c19334e19d3c2295af92febf82fa96ea9314a02bceb0f5159d4d1b4dd70df7533765740566e29bc42c0015c1c8ea34526b95fdfeb38870e897baa03a0f87d7e8e4be5a246c6087becfa6da1ac565363289a5444cfa34a22486bc4d14340794f937cc9164c074f2a7ea116d2549cd9c9eb45fc746eb1b19f54655dc7adce84e6072b28fefd7911e4c13506355b0caf577b103d5c24eb8390d00eb43c28d805d2536d5f67f4d46cb230595808001de964f33b18c11ff1962eea32f74167a01d655ea6d9f8cf02422e66c8e6defa0d3b47a7aa8a6fd20bf259ad203824d62f9b0ed8b4619454f586e9de8ae96aa5434305272aedfba84a09c323344e162e5900a61d7078a05bb09b152a79622cb19255d7a63f95118e4be960d0e7a3f58a30e83a9f5b5868f6e48585248f41498dea9b65d2c55ac194da64d17d26f9e18ec7a426c60b0e40c070d91973397a7669748bb65792998a63f16892df990fd3958dceee5a9fad3b358f1920d940a165a8b487c0d7b2b0aa47be58e1e8d0adccb53222bbef53366394cf12399a90f43f2bc98fd3ef363dba2a345b7e62f0eac8ecb71eccaf79d15edd53d80d70a66ee7a584479cf04534693fac0b188dc0c6ed86ad9b8d44ca605f134196423105743347a3a5649ed629f0c162aec69eb910f48f961756d04b976ee8ffefdbe13f872a98a2557cc3e4bb4c093b22405185f8a294de76b19b6adaeaeb1b3b10040cff6f0fee7b5c9ab425c5c059c1e04e0c9a8f87b9828c1a8cb1644991fcb25e6975ae55156cff52000d3dd170594161c62708686408562d5f038fde2c430e30f7eaf6502d7dff4e6e3da1ad7dfc6f0e7e64c31704940535ed6bab70fd11ac5e72a2dba4ca89669f70745bea5b9c6606a3a4386a2b6516b98d4787df32a326a794e1e4cd3cb19b6b214479ef5f25c0e7e66cd382eddf091f0f167f9496c926e512c3ce534304f45b99fbd63bcf2d3d95b23123ed954b77f98df1e0a5af1bc0d82ba307e07995483a3c122097c106d068b2160856cd3f84b71c00e7108bc1a8c55b5512d82d85a6f7bbb9a0465093d81f623c05e260189735b074809ac4b76f432446e7f8a0726af1ca4fd918c448f3f8ca67f6b6f6639355862d79d259a49ec8e204697921e867112781c442a45caf27359307eb69aa8668014149bd2d55d41301c3fcff1c65d96bcc0d5a3f079853fbd7fff248286044d8fd2ea0d317b65e407e11b7fa2ffc199ce7cadf1496f16a064c130750f13237cc8c995da4199752629ad0006cdebbbce66ce4ba553bbd2d9a8892d090a0758dfeb64f110a2f751a51de34b03bbe2a99c5a166dc80f936f709c3046657f33bf0d08444e59e649b00ee260aac9f80510b73a325b0199366b3d1dafe3f4878daf58715261ca4e6b2848421ad022d2aae1965bae67aa6e087f444e9ecad23d7ed0d5d67f99aa6531806f4319517d97ac81d379d2c8a640b7e15dd6436cfdc189bc1fb652421a6d71a5fb5c82a23a6dd21a6723b8c7c2c386c9789d84e39b309c9e68eb14a1cd2f36837b70d34136540bd573beb8524d04ab0d84900dc84eac84dfcd0d71b090add9781379e52c630bc3d9e79f22dad2e9335795ac95051c2351009d3b3fd25efa6c3f2b7be3a5cf54165645d376d74714ad8450cb93e6f6925af3aced08e152de1f540af81e75207add51902df5d7a4568d702bdf52ff3c762eb3c3617f46bbb8aef062348d1a813b8ef53efb9aff480cfd0a5d6f3811422986688d702b1f163cca0283333764439a5ae60f400975a0f2028053de2705e7e1562a475578422215a784388f0c5d19ed63dead440a4c83b31b1c858d63717428c61665f68bc2e6b7b871ddfb7c924e0af44a68605450c1395c37ef03ca8bf1bcabff875bcd95984366c7da2efc903d2fc92dcf133aa27cd133a657f9d0208ac474ccf4fc2478e9842d519a46d44adc255106be2bac3f9fdbaa007cface16387329035ed2b2bf68df1267fbf34da9fd21477838bbf5ee616d7cabf23fa32eb2998ef418a00bc1a960417aa6f14069f1c8ff78b0b2ce91f9c07635108a4a0dfa11fcf59932596ca8de750a7de517f38008c7979c8a4ccd448da84e91ab9d47036cf0108dc27b96a01a9aa0173ee611c370e3b6ec316a28cd54f6b371f97bee9d32fb22109a7f3025b838ba60bab17fd47d778866f8fc0bbf852aadac2e7dd2c1ad0f9418961d1ee5b44e141ad88bcba4a26d4b01ea5238eac4e7eaa66fce540afca424dbad10694b843b2119a44d027f84a031aaef150de8d6c3419a26246a4270d2b08e1a450d75c7b643896547c94a5ebbbf9ce31d70879de4de2ce6cdea34f8b427a941bbdb621051547d15dc87e0cda48fb38f7cd829f0d1963c6d91a2abcd51fcb7d06c36cd4207888a3796dc99082f517ea5aed5bdf6cffcefa5a0076fe4aae741a54851c5dabe75713f4a45986e0083e34038c88c8f5f90e45e0b96fb9e3678d38b3dcef9ced803bacf7e660d8e05decf5450d46a73c4eb3e45bd15ef06190a869c05b64c58ca984a984c464e67c563f4512c9c0a2f355a916ff4cb6f69f716dea4406ec81c3336c0edd26e58e533b9303da0a9457fffce76005678881296234bcd69c0e92683229d6716ae8b154372190baef2fe0d949d6b339c724faa39409d32c15d3287733dcda515b5337622ac17b94d94a4699da738aa17e1b4a2e26ad436ebe02327329af6c5a9496cf4d3ff84d03ff7d880716107b250f3f0bcd197573b3362e6986377dfe9388c116d66297c6050f48fe2a3a750e7ab468dd4018c074d64e94cac7ebfc129ec7609335f06937861e4050889640dbd2919a1c2b54d6fac208bf9d2d05f8e1d00ba7f725f28f7b4fdf3dcae23fc0dc4cc83eb835b089d8be6eb5533a00594bde89fd95b412f21e7076bdb80d7a70ab533d729f8ac6b394dcee5ecd200185e3fd119b3979a0542bfc5c6d12b4e29acd29e9413c2b46c56bb4bbb8a0a7c89e6e3b1a9281422015c30947a864cd786dbae0110d8621a6288ae5f1aa3e78cbf4db16fae2abba4e54d9552f98e1e4f46d3068aee78624cd365a92779145155fb010c800d7813e9e9b3814267b0954962bb6b0c736e1fb57ad215deecb5f401cd2cedad88c4df68316ba0e984befc4122d2d00c9767414ddc73d2ed6a251861fe178848a7a6d37a473c3533317343c27c858865286eb046f878785f0fc6ae7e1a4b73540e8cfc09f5598a63a4f3f088d3e004769caf013ce483e0cd558506761ffc68beb7fc02ce1ed3a2530872c3ca1dfae0267824738790bab2ca7b554e927a60f8d98ffc47f8b23da31c063ccefc4e3b6f6504732b78dc45c47302473c2bb91729b1c788c8e4f0cb170cfeadc034863f9b518212be4a46b2800f2d7235051395d37fa2b4d80d37c8e6c2cbedcf1ce23b4abd73713b0f60ed3d5543303a470e709aedb80b00181ba4277af985dff29990732cd09fbeabffa42e83dbeef9bc118028b6603d596419f4c2afb0aa25a1460173203d98121441ed6df81b3f8f082de1224d3d39e79df3cc99c1b5aff87812a4f9a936030bc828059aed29dd231c273ccb43381f00683d94b1f69e496c469801c521524a2e9c7bbcca3f682a7876acb81747ec66afe757e90b6981420c627808cd6239bbb2a34f4d879ee416d25b8cb1210d05deec9d47df2fdc36da49e63fdd773a5aab20d29334d85786ad5180807a7ab43ab200fef292fb3bf83987908b10d091b2004ab44ea4df8573bf82c31a1213846fbd626fa8ddc60a01255f7ce6778f75aac3e0bca182f63cf5d2ce300f246782060d39beb6108bbcfcd911b4c124faa0142d94a21c5dec0dcf62384e2498ef7bec2d73539708f0d87468c3222142153817e83a1582934065726c852a2c07b94befaf943d9bf4d814c453c72e961621d2fb4d15b4d771a5a8c5593bd6f525ad9a5f0ec84f723474993e782dcc912fd2e7ece17c74236605b350717b07ffa439e9a9a12db043d54abefdbefd23fd9e7af37a132347012217e31e60b8d57ec81ded638cc7fc51810c391c2ab0400a80236cd18b1b47f55936c50bde2f42f15f60ad04947d78bc8435b66655d4738ea280760dad40bb02a79b5120d1c0e19db3d2196fea424c3d754c9c144dae7b56dcdaf23a6526addce9220c8a5bbc04ffd652cb14b6b0843f9756000acc449c977565e8b7b7e632f7bb986118ee9c4776aae9b7c6304ce9acb51e6c9c233ec0906d8fa53b2f90970883d52d39f222a8c7d15572a4fed6a21f273308a77877e5e382d015cd272d21ad640951c2b2bbfc8f6577161d4f423ca7d0f24607edd6470cd1724b28cbb066db23ff5e9d03f571a5a7b335db61f13c34d9183caf10193c62c4807dabf8c20828c246a4256adcac9493b88d1c72fddf426c09f5f282faf4d0237cce5cf728ba65bc4d03abc85e187c881986bd680e8bbe4a7f695868efa6d0b1f164d6350feb43b4976b388d6bdccaf73fb193283e790002d2636efcc3ccbf8fbdd154fe17f17cc4789d867a013d82ff66c0bff56ce085df31bf92940790b24c3b8738cc82153111c349f054097065b7ca1b433e48eebddee5ce329793f95f4275fcb0e5802f568ad3af28e0b42cd565220d74ba06f4bd66f839b685c38b38967f71e9ee41e409aff9e5e82b8aca7c6725128e656809bee7dd818f5c58ccc8e640bfb2c466fe0bbf087a217da1730bf201f37599ce13cfe0601a0a2bffae720fa9407a099d732172370e88cba0352a2b33ccfc58b5a0972c0cb6a120a9c71075f57b44e7a5ba9b5cdfb01a23834cd6ad641a6c220b2235e595d9fcab565d6472066b82d48895931704db0bd8c7f72886c8ba90fc6c0286263b0db5e18d1b70cb5c1d39a6d798243af3843c90300e90eea7bcfc41f9838a4d6586f830ef2d5cbc8c83de2b5abf629d24e7cf2ad6b2fc3ad4d0bc356dfc6d5d27771d65b6e8aa04ff75a5c56c95272fb0e0cf460c95e910bb534a9495cfd3f7662465daac9b266a2381a1d39c8e051152031d4c46178793b9fa1f7785b049a2bf096ff0d32898ead345269173d01d07bfa1b123e48b738affc22b512c2836c4c6dffa36e8de46a747eec1dca9c2fec7fd390bc5ed735ef64b0c5c481613cd2b4ec3298cd1eb1c72afb2167c1999c7a6f3c6ba224b343c6a369ec38bf4f5e6e14181ff41a9c9c0d783c2321c43ced6e0acf3d31f3acb01fa3e66448fe6ad0db6fa5f8b72bf9b49082050d3db973b2d7d939378520b965f9af39458468f70e72b30fbaa1bd33992243d05504310382dca8719a9fb23827903623a749fe8a889d82c7b9bc31c171073fa34873e5d22d68428cc601989e15e4478ee50c00dd908573b5c0a34bda4e5b2b93d25e2d31e0f3102ee262c00e4c3e9502d2765283e574d3f6fff5063306a7962893940578b57fe27faa7c275aa88e9fca6ce49f0b8afde9d8dd465140916e76d03314b1d4d64df6940ccccc43b3036b06a97aabefa051226cb85718d964b05bfb6ddd189603ceb8d36d42a50b3a1aebe6138862a98ebbec2905a8c98d6e0d660956f5d6dc4291c598713770b2c910d7f6350eb44504ed8baa095b1aae7dd360e458012fb8d6e838e7d00b0fad4a067588ec4b9d99a91d25716ca9a06f80adfcec6c7089aee5216e566cdb479b826c88b1dd7acdd6da86ab29438d6da08b33c7bb8293490877d67c870165278efc8d4e13aa6ebcfe9d0e4a8e05c01d9b655c8c53f83b1b6d1d19a471747fea3953b523047c6b94e02e80ecf9d5b6e35e80d0fdeca1cf2189a534dca79da401c7c945291cd1fe901b4f689dbd349e98202ffb0c4a866dd0e0e046e285204d6933df8359c429161a6691b597b94675acfb9803cb823fe70fe71310236b2f76db64d831169c9a32c8a90c1136fc7c4f65a159698c3b70366c93c09211237203efb8216cd816d522d310d9b6c38f75d1e8ad1343acb80178b17d3f3a2aec0f0f7091ae1b32ac50825e6adf0cadc38b9b9f9ce5ba78cb5305e0fded858db571676b7e6a9ae10b0eeaad563b0383ea645428a9f4212dd9554b03972adbc1319dadf152b1fefe9cac78e94e0fc392e130347fe4743b271973ed6172533a53aca78b262944f6c087fce140e785cd1978433c8c154ffd4b9f301cae71ad74fb952aebedfa94cf68b737fd223b9be772bbff03270174f14a96cfe7d3314d58bf9e6cd1a8d1990d2dee28c67d058e9b9b354d5c932bbe569ed5ed5ee9de24bd97b3cf8ebdfbd237ee983b92e6e45953ea5accde6f7ff663f1c82dd5de9f0cc4ce6bf686012ff08168b6c77b7045d190b997d7402e87a6faf802f6709733b4734fe8cf7ecad90ec778d3fb4f3e7ac2d69cfa572ad6fe07ba9064514fb74dbd05ed1589098119be58b4a215d009d892970263a47b9e5e6c74ff93d681892c90e103b1d2d5154a4241f06f2f427ab1e903f827328a295bc701c63626ad5f584a942fd9410b1fef32b735e201d285c772244233b960244befbc75e9db8c438e958b42109f13d025cd1fc46552950140d25e301ba2a3907296e1dce2476c92bd2452cc9662a2d161301083d604afede662882fad14b65feeca557e1a8e415bc0adc0fa612f13c2c7e65131140a95a1e599d0f06bf2c0ef9f54e8bda617e6dea261595137a87a05edf0f66b4404ae5f8485e3a72f56ac1263e99519dad8a9345e7e1507d42bd5e17a4d7accbdeb8f710da23c1021cf75082a1422be5264438b8c1123ead5c8273902aa472c0a925945325c9268a8492e4c9440922506ba64d985c95e69a241d526dfad3cc15628143b5691b254a80c47a9e8a155ce122bc86ac551ae4cea95fd824575c57254b2c045b3b8562d2bd93252b7e8285cde281764e9e259bbac172f73f5a2bc7c79d32f480b186b0a66818459d030ba8b98671583a19431f652665bcbac88192d6ae6ad9c414fcff813340b15cd80a45159d31c48d46090357674cd66c2665ad9a894369fda062771635bdd6c9337cbf48dd202e750e1e04b1ccf34ce8ac8d957396a32e74c9d032b743c299d71a9b354eb682d764eaa1d9c72c79bde19099e11c5a3a4e4b9a27980458f83ea59c99e25ba478ff0f9533e104ba48f9aa781f15d7ea5953f0f864cf691b1045ea9a0ef4ff6915e02378d7de86fb6b3e20a4e565f921b1d621f18e026deef3951ea85ae0aac51ff71682aff33296dbfee86ac7fb5e0ff54ece1df0507b81cc41d2cc34143b2302946c35bda7613347cfa78580626f8e5148d29f8a2ddfc6f119a51bcbaa5ec1299a4fca7a8cf29d9dfd4306a7fb0dfe0a43df01b36e081135c2b473f4a24f31fb7377d4a5f7bbd327ab5ed74db9569fa033b0fb9d4175feb7e4908a949bf63439a02fec63985269290dcb08a9c285e969f59a9db0bd5802239dd22cf5929dda57371e4df54bcac6e26b3683335ea0fe33e037dec0c487693f94b22881af88ed6127fd365a8693a4f05a540673f0ee0c8f0280a4c4f1bddd280b5347e0b00d9b8572769640aca7be49f952f7a1aecc6723182d5cff1e688fc077cb8f2a53c5235b3427d7a3bf510001d67adc418d85aa619d7d4a82f25d09d6acf0bc9b9ee651317128bd029f0d5e73c17876620834ad432a9c30ee6f7255f12d68c479f803cd311af47156f9799ef36791ad080a84132acbb15ced2d377bfb342e3eb8ea79a4be22fc01061b6700d737b6ce1a5a21deb43a6e2d16d17ae196c230bca1f079747b1cbede077636669480a6648fa863315f90a3bbf1bddbe99d547b38ee49d5dec8c5916927ab486b1599ec5a61dfaf2d0e059d0c8e62e532e0598ad06372fce9a12e74c442394e85ca4d459aca5de3986626ae53a11cdefb9503f1f507d8d06ef1cafa017989a7af7ed79ddc947298ed6442a1ec419fb31ccd009ffc42010684a3154399060e43898cf2df100476965bc9ddb88bd09d5c5c07d63b067774c52b70881c589c4e3cbbfab707672700dd2e56c58b598f8f98dc9b12a8b0adc25e56231d67930b4ca6ca21c5cfb89def00505c587217bf7bb60502ef297a157c0aa1353661c7af7e1eb45ddd6142868604a3197a8fe691a43041c20ecd0f42edcea60f76587f9faf235abd3d29979029f563b9ccdffb025e21b62726aa6ae7e10dd9810e5550edefb33df5da003c827e08976ed120d937dd66f77ffe54ccdef97a838d3c371f958aaf9b15ea37a2c7eeee83218f8b0f23775325228662c1c2c9aef2bbf6a7f5b44d16834df05b17601e397b9a1986811e3fb4b8d06edaec519194d9e8c9f5bd711603583bf55c2d2bf92e278f4ce385aff7cc5033217f5fc6685fe9ed7ec53678c3b1e138df6c6aee109d109bafa36c461d9a2f9731df8b7849f1c3d1fe0256497d3e0bef9a10577ad5807c7081acd905d36f027108e0033b467a37a1e6c6a7cbcbabaeb8aae8c73bdfc48f704fe8f86cb0efd28e54068d230659eae428c536e98a86e129685b3fba87ddfdeb4f5d19139d8202dcb60408d91daa28997058700d4adf6e5c68795ea9964cb3e1fe54d58b2b3067ce4df895f3d57948d2cca1f19df0ef01dc5c4bf29180cca3862273a25bfe90838965f02267c109bb6eeeac7d69c8bf2949b1c5c64fd193e3c38a37019a1ca0ede589ecb29c3597d12c53a68e78146c94a7ca184f10ee6cadc01f39028a2e481eff3d07aae2f0a7e1841d4d2993663503df6a5a93cc07db9ccbdfba9ff521c8bb6e362dd0198b98e248fc34aceb531f7637428237a9a10aeaf0c94c88e0cd4c94c86bc7110033ddf99d6270fbac5e857af8c3ca2a35a20050ce5e54fd94b7318dea1756c49dc86e5575d21897af87d096d41cf3719f9371125946277c11c74a15f41b841d45fbb8542eb69780077a2b8e9f2f6f9304b9f8b42b7a901bf23ab9efd6a6a295f14c53969dfaddcba0e5d2e92fff8af427657f347b04d231e9e49ff4a48fe0af5f0e6eda8f4883a9be0f9e6bd891787d32fe41e87993da4d8fb198c3b03426a2b387127f5951b7e1c1a92c8eab006819939742166685d841ada6bfa840e884526ceaf9b7fcb469d28ef5f53aa01e7f75e30907ae886be282995dea2d0f808da86511b45101f45ab4743a8a5bbbf1ee8e55ed9338710be4630a004faa02f2fc465b22d484951313d500a197757f2998c35b13c0269dd5d982f374dfcda185189057ed67e0c1e5cffb6c2a198997c9fc7d62bd3e40ba25e13585e7ac08633ccd67c8617d0815551616f07d0a7fd1e182e2d731308ea8d9ccbf8d0866ecf1fd4c96da2b9658e5e29a643019aa229c4854ce24739f8b486e4077f73cc6e40b0db453a2b6ac4262faf39b14fc4f50318fc5c9a1f60de4626f57e50f58e2c222deb9998b84aa9570e91afba9dd3e18d0c9777bc036602e2efc51b5fba7ef03dd45e72188009500bffa0aa47c20f88d971e50b7f85fab876d5edef8631543699cb5f9ab984ab6fb290bbfcdaf34d1b129e3996932b6b704754013be0d89223ec754433d9378f2064abda12fbf1eb520579b91f8bdd564fea80237c9bd75768b85eaeb8ed11aca77fdb5ca08759b7ce761b88527deac66ef73c7f907dd8bbf001a0fbfaf849391ffd3f5c71e9efd0fb0dd628cd93f558f74227e793700f9c6256981777f0b738cec1d4f745ba099e4f79896d1f12f58e9c56f0e69e4e5495fa0e3d2791b1090ab7b86c3582ce0732f475fb0af08d7999ca31f0427211a9656a3f8c6dccf35fc1fb1ebf2f90873bacb8ed524f89bb9f238edd216c864f0f69cbcaa899c533e1e2ac16de8fd85fbbea0b55fab10a731a5bcfc67d788b15acedc7858b6e95fb2a3e469ed1cae34d3a9df74dcf87f7cdd86e8fc995f681fed962efc398c1dcc63907c3c80eda6bfaf7bf24d2b5d4e4345af7db1da0ce63978db31c39f1e997f0b46156bf0dcc141d9ec8afa397b98da0bce8f910b6b035efdd062c394ecfacd395b7805d70d578f805719bdf0d6e06154cf3abccc9bd8dd039b768f83a41bb0fdd065e094aeed957ccdd805df89a18a97a38e3ef0e1e760749b43dae1faab22933e4ed0374bd0aad140fb29360f3786b1fa53f69d171f682369ead6584b1b0f56987206917a37656284baf012afaab1053542046ce553a39ab0891bb5d17a74ac0c2541f2541253e0ea2c9bb7c5d4657db707ab70e3e8af54095d3622ae24a84e0af38403feffd75f2e953a44dbc075b82eee38534466fd2e9c457c40fc406c5385bc164f59ffd0c199ca9dc36b81c3ae1776d7f9108c3f8ef434b22cffecf659857a677d5f577f374fc268d96fdf59441bf7572f251bb86fb14e80f5f741aec2fa5bf1dbefa939c82bdf78036c8ed13bf4e40afba97bb91dace1966849219df8409bb5b2ff7a4470b8670ab5e2faa397580f3a7d077d38ec447383ec36f5efedf441566e75136391ce790f50b007cef34037b8bfd395ff2199b47d37f08fa82fd16c0aa13a4bbcbcf77c22db9634a76f40d4d6ba1c2cfdb9c4fd3bd153cbcc7359cd5dc81a8dcbbfbb18969365ecea0a4b6ec500dfee8722a961a6baf0cec8ef2e6672ba7ae2873213f19533cc3acb2ecdc164e792b897b6a6193bf4a7aa1cb2caed2d2f1cb5f7a0de3bfccf0d575860d295eafb0e9ca3cdc8844b9009377e5d19e2f4b1480d6715c6b95083347bd84c1e632016ee6440d60e0c90627d2c85780374e59086c4b82e8840f296fb6949c2577460f7a1ab1af551cd4417395404370f840931eaeeb9ea5f86a1c671bf48cc8a73bdce5247f9e3e88cf5797a53f69b4ce8df52c735bf7985efd42bf7173b139d55ae19e61457dfa1787f04b080c65029c40552f42b664dc13316b0ef908d7afbbb25e4c9c4a598e475c68af8f4e4076d7b89319e2223e3b67b4dd7c774a30e3e5f9b8f86ec2cfbf9da989773af091bcafa89721ede5fdb527a454b623ec9c308b9f1f83a3d1a57ad674b5a5a79374b46b15e01d07049c11e6251144213082f4a588d04a662d612dc212d1963e24da1360852a867d84a06b7f956cd5868599090a25154eccb7798e02436a80b45a9ad7205261c068a6e1b345f2612629ebed2eb14569de0805f923ce7bb56689dd93f39fd83b567bc1114f9ea63ef27ad2ba8c36ffecda374a11598f0b2abca92881716f97a47e7589a02a6108be78a35adf069d46b1146f26f4bbba80a4e20d77d4ced145608e238549e85a68a76729318fbba8a9ed98fbcd187c872cb91f372e2040a79e34c7624032dac694080e8abca1017fe8ca0804fd95d333f93d567376e67351d31e35d079ba306781f8e9b29de1cc51cbf3035a92e103bd26aa3732ffd7ad42ed3bb12d00399d7f13c4264b100d893013b8c739082abfd62a5bc3804bab73d1e4c98fe5f16b85bb36f03b1df4651e0acdbbd7b4d2644dcda46216fee914d2f8f3d880172f5268830ae4718e47a9ad07cc10c883487f3756695186e37636f76b6b19f1009e82d14dd841a4135804f1e4394ed7e9b317eac056aa1c1df5b10dca500e24455379d5dd5850580471e619f69584be6442001cdcf8991fe43fb95b7bc40c8f7d5e814452eaacfdd8e3f779118812a53b08257c12e6774971feaac86c70bcff269f10eb7abad2dce5fd9edc0355a3b5171c0d92dd5cb2f4da2fb8f5bb60befc29632d2665e2f24af10d2725bb9ae7c0cb81c10e58deb4a540d215500f0735be4cc1799d8e944f5e4d0cc2a7b44d83ac2e9f774ba589997eb8ddc12a7deebb0427be31567b3fbe6f46ee17645ad4a89c4fff9c7cf841faa4dfe4999887e7900d19334630cc3f997b271a063cc4f33a4b8c9600c28b5fc4424109e98d328163112fbd65fff8da630eb52d99ad89c77d3bb73dd3f29acd5df11c697f0327b9a730af0e291f73ae9dd3333f267f96746ef3fc1f77f9456f428ee9f9fbea58efda4df40d3d9a65d1789cbcb4b5ffb02543bf1587349d60282c7ce39252756ec77f1389e3ebb320f4747942f705faaf76f1f50e1f69d163c2e285f54bcb31f5c7a9dfd14fa8ff4834a554e06fc003199ec3251cf86e004d48cb1360f87ce4e78035a73743e36dc9e6c1fe31eb146487d72294553d236fdc6589e062cbcc6437e1054bda35eeb9bc95f5a33b61a9c073731c7a30030860cf965d0cc623412e9b618a4153c7ea596c818724e2e461164d064f9fda340f689f5c3f6fba463f1f42efb30ccaf7c69245a3f891649c6903753bc1a127b759bbf33641eaee08c289010c57e666cfee20ca8de5a6ba8bfeb1da4fd8ad30b66405939c33d3663fe3a82c03be05cb8f614b7e81eebe2de5ef92321e4e87d575077e6dc169f5ee65ccb217f380ca37e04812c708b11e9cd76933378369ae435c7c625f172366b28a107fd3565e3e134d1e126085b5776e27a66c398c23b43b841e5699cb79907d03db04d25bcdd3c23899c7afd2c64c38fadd9559df9fb5d56d5039b7bf123efd8b93cef243fb647ad2e0793b8738d283d8a264910d185287eb1f67e342a1db4d60e1d60d8a7fee55c7acd0be14a9f04ae04ffbfe960db1db356867dee2f34c8cb957cd1f0af31135982a912264e90f9c1c1dcad8d9154e93756796562055c4999a2142f1cd969fabdaff8aa6619fbefce877b36729582f8c83d485018837a7ff78e817b519df36d21055f001f6bb51aefa91a7d1402e0df7e5c27f068a50ef799c8ef82f287094051a00e54f3f29fa9b2f3f3605d9051ddf64f242a0e02dddbeff1fc0172364442be793096b7e346d8197168f1acaf4487bee404b1158d30fb16514fc7ff6b7dd0d90318fae50dd04c39d9019cbda17d71594133afdc077d32e9447c91586b7f90d1d077794659cda4d0ebd825b70c938c97e933a67e6d50a11d346526f07dc0903cd79cd08216a6b3546eb06b3a67fccdf5366223515048c92515fb17b753242efc178926a53f6fb0e6c5cada61073df7bee68affbecf5f60ea58ef6911ffef68b6f3ef1b30ffcf2c7af7df1991f3eec87fff399819b76629361b829732643b8e1956c320f1734db5e7f610ff97bdff8a2dbbb5090a8d7fce94fbf7de4477ffdee9b4ffae963bffce957df7de6471ffaed9f5ffaea73bf7cd04ffffde64b9f922f2650a9c01fd5d73e591f795847ca84e5ba6be61ae258620d87576cc36bdc810bbabf1e6bdbfb7c74fe8ee2fe92560efa078749f9efca33632de126fdbad07e7a3db3e479a9c88e0f044fd39fb989eb59e5140c0e29925c49738bedd694aa972ad3a39e089c72d1b644e298c0e01364a2c567a5ff8795b9bf56973fc18acd6ec06d7fb9afa16b3f0c77ff4eb17fca85eb854937990583d187f27b495a5a2318afe2da6fb0d0d0fcf6e499a0523257a9aa941ccc25df064f1e53221739542ad413d945e37103e7bd127116e67928370f570317939aec548911261dc4c2891e1dabc681f33a4827002a3429c897e3cceca42a2ba5b63c534a5bf8231f63fd7e51d7ed751cc880b33978fdf33893eba1fd13d1298ddfb00223f44c6a37479306e7d4bd21624e7ba4badc1e8a304bd2b67f2bf3b7ef58fd78da3364e8971c7a74a84f65f00f99ca23821ee7e3ad5cf6b2d83a1c82bde7d115c9959d40d857cc58f263c37d1c12aa14ea99bb1e19fc14b2c9ec4210cc21b1d44b182cf93ec6e435cd0ea84e497db637049974c1a2a2356c1c5de1d79223ca7d641636ddd970cc5957b049dc314679def31eb58374a15655764557cfdf1ffbd16aaff92b150344dfdbe50bf22ee2b3c7a9bda479a98a84efff80fcff57b834fae0e80e815f12a7e7d4239310de3889d3cabee38dc9ac06cf1e9aacc21c868a7513789154c760fd3ede7c1b4c9767a639bb207a49d45b0d87dec7a3750e2b4d2eafff17e597c2096d7d8819fe2e077ebfb05941a636f20b4dc17be0d7bac62422a43681b802c75e8d4b3296d2fe5e2b47105f39d3eb1e14d0989ba9a4f48c6b1d6f7fc3797d4ce7023c3b7aa7db2eeac4eebc2410a4427d706c9e1e7eaf8934624d5eafe7fe988b64cd6b307f22b9307f9e9a6d82748d72392fcffc2556cd96ce6b9ad894a9071f2ebca6fd862a56f15bf7d791f4bae6fd309209c360ab00b00f82c6712578ffa40f1586a6e86ca609097ff444818bd197f212336552692f19799850f399fe40304c0e24411ae687d1b33e565bbe17ba421fe55e542a9c7de7c5c1e31311f0a397537fde936a5efc9d6ac22a8a57f935d85d34670851789bb5d9e22d65912959d5ba8d515f9c08793042fb7c8107791c631f8966abbadeddbb856f4101b5514fdd6c2aead03db32ce43d998233d11113de9be117f586e89e598242c14c22aa590e78b602296148ac3dc246b227b9f75b9171fff5bace8950bb67c8bd1f9e5363ec15f3f93bd229a827a48c744579ba763d529a7e9a10a3b196c89401ba819d3642224d2024f43119ded5166e7d34de62374b715bd84d163b522d53648c2278c798e969f9f4e7e2e12123582102302bd0f63299e778d210d2b80468e28f643b687541cffcce8bbbcb81a762b75012b5292f939d1eb23337ffc6efe85f22ec793a963bea7cd5e7212a0ca862fd4b7ee5735bca89daa2499ac15470eddcc6c6bbd81359ccc0733c6ddfa09c052464692f2fe964f8b1a30e941aa717f3c11934e66c7d1424104b627b5af90fd3cae871f4fbda9150851785eea109d486e369093f96e157c75be778426b496e01ce097ebd55653e8b2c418d74ad59c26ae6d3cf8af820b80c53f645136b468baed1ead1c12837ecaf561aaeb82f415c70421e0ae9abe50849381170c65dc704bc552e7bbcd55e56511a49a06a4bb69b19fe6b29b64d519d733ba1d7d995d8d5c3a1a5bbe939dcd8617a1824ac30c871b5ee85c18479849acee753548fd1f16df38efcd68cc7d5f98185ff7d523ad766cc2a338c223f79b03f2e79d805ff4aa0439b42cb5f5eb30614a103fe1305c3457df344bc0231246af23e4931e4c530fb96163db2c280ae62940055e26b3aeed68c7408b90b25d524be719c4f4b9a798095856aaff1640aa4de5d152f720df749ebbf876620a131c9233f05dc0644e26bf0b227001b3b6dded606ec03d824ceb871d98ad362a3c9b11b2efc8bc07a9f495ddddbee3a1ec509cae0954136ec4273ad421787422e2697bbd9a4868e0593868c9524fbb1fdcef38670a7ef895fd7d38953495d05214f062dff35b86e04ef5b6c39fd662d1af43e0d39c722658c0736ef9d749f6f01746f066e4bc34ad845b32c05211a586e524aae999507ad0c087b40b3c1db7ee4a08eeb6adbbbe894197464c5292bf099da03d547676d9306b1fa5c042950d13ec2ce2511e8eba1fb4a9632e7518bdc0bffc575c46d54c929230fd1c7affbfb925a5cf416eb62867d62274f08d8785a11fe72ab55619906fbb8baa3b0741b24097044c1ce7de8fc6205a7f26445d49477acd9c860dec624f332673b968edd75e34778f41c19acf3d74fe31ec54143b4dddd7b1d2bbc0c79547321b0469eafec584f8a32730fa2121a68470cdcf26c9b84a4c94053eefd369f5e337ab7bd55b17bd19998f3f1fac621dfa0086181fdbbec0e85d4858069125100fad22d80c6001c744bda4562f21552d766357175d58496562c6c63c5ae09dc46112dba1bf92f1499d727a270cefbe7eb7d1854813952d6af078d41d54589b4a2a49417cc9bcfc5bc817923135a1aebc97f01c8bb9e9def9fc18d7337510a5261e6e9d04f3bff58f89c9b51d1c7c5e388baf77e5504fb7408b08816f1af29468ab979f4f4a269930b75acf112a1fa5ef37704135b8e93bfdb9cc46a4b659d8f1fe223dbe565f00c2621d7d8e53bad6d01761ca33335554c4b47384b03d7dc49ab38332bb1a50f52c442920b856d12d35898debde00b0c55201669a93cda416b3bd482aa043b5700c93d53ea8f130c51fc85225deb8d404af7d91f2b8a00db11f407fadee8db3bac7871452718dddb266d0e87732a6c8b5b5a9e2181e3da41d32b0833534c2f527b664709585cdef8b16a1c5c3b0aeb23a27f5f8fd1b98c5af69791f9e27cc59eed670c80b901e44878fd6806ac4deba256c5884f4e4294743adff80986680679519d4d8cedce5992b4279d8388c4258146cee3e18906d2af6fdd86f8f1a83ae1e03f34a9cb2d7cd8fa8c92a505e53260928ebf08a63e6e9418dc9af205cd34bd36a1ad88684cd793f22e4d1ffc206d20423001a96c3c02d055f75b04d5dfb9841a6d5ce62d84bc79666e5ef7d5b16f298b2dac8eff0029fcb66cddc4958b622dfed625ef8a8b20ba1915ac137a80b31a87124cc06b122c7c1cb3ae3c78cbc190f1bc5d53dbabee15acfb5073233023829dd458f9770e59897a261f27634fd8096ea2f95056e6d516a28b3f473e9d57b01eb5db835e313b6aafc0c4c8afae9cbb314e474d0dbc0010f932c8a85d931740abb9bed1e2a980ac4d05eb74a671de168b85f03e2fa71dc23bfbf3cf2c871ba631ce9deb4fbeaccb7556ebfc624d0cee0e8425bf2ad3e26d638de67d7771497d1afae54b29b65a5540d0e06eaaead4df789bbb52ff4a649aec8ce271e5d2e7b2a364e89e706a9e7469926a513c27148afb71a200875edad56e469f86494f275b4a59b783436c891aaff89c7cfc1b9345267b05fa1bd994b7a3d2d3714d65180b807ee0330395d5a3908c167a985c992a157ddb5a7ad478c80b1638d3072e7e7a44baf036c9b7b2f6e1164bf976a52f076d7a61282795ac11360116fc7eb6705a3dcfd3c8e10c6325397b0e5c00027ee71bd035a51db6d966869ddcbe5bff44fbc43665641657f1272f74b1ac18b9d8578be8ea9cb2c8f28bbdc61b1b89a744b165aea1045d60a9c4bea320585ae373a310c56f5c7afac6534697b4f4c338e43d6368aa4f374baceba4004694a34073e9ab3b163ada648946f0fede32c190edc1835174de279844a7488a8d6ef8f69dcbfbff5d769f08d560c8f97eeb6817c9cd348a72a8e3cdf533b728562889731a8ba778ae83c1dc1ef707f7b38cffea04126022becc9a7864ff0ac7e9e830cbac08937a84453e9d0b1b8c9aba08e4aab84149bba325bf648ae142b37f5469518ffc6b581ea354bf93c20cce438e1b1c212fa0b27ce8d727db0f9f99b85b184960aa0224cc4bd0cf75e3933c2c439e47691723d0a270795001a1265792a59371ca0d95ce554191316e7393805a2e6ade08744825458b3a5a6f41212112377ee249cb63e124a5d4f5796a5e3a97746e467f1f530f81a62a040e0e4da290105c37665b262deef3cb284b264a008f411471f9a8a34df20dcf8f26a7ba9f820a9af034f4d05c791e394ed1722c17a4df66714e545561a72740fd023687b10d886e25bf34c9cb5781d7c142ae99da7c0e717c2af8a0cec7e155ba96e4931a3936576d6563d809f9ca08dd23768b6f9015cd429bd8fed2445b4ce5eea2e9010680c0fd56d0a85152a1c8acf52e282d8a197849ea860d0e61ad4dd128c98f3eb665d1f3b5bab8bd5c5da86988b8c8967589441f5d68f117f349b035f1ec7356e8131d286c04e7fd71d18e36746a32149cadfe2cb5b17563aaf4fc7dff451cb15a31f0aa3c42eeb14f497333a2d3fd2c4aebb2a85bdc0cc135580c2dec75e424d153611378890e6e6613deaa336a4553586576dd7848a9c4d5998b31f1c9a352b9afeb0cb3683cee56030a1a4c674b1d0d7416faccac824e68a69f85fe25bcd7cf225da993af0e3bfe75cfc9eebad0d94f219a73994e471e035e1dae1a45932058698bb5ca07da76291f6750a737a46eb3c635ddd7e3be678c12080002871699d85c9c07afebf68922e1bf63f17f6c10b0eae8caa0c372013767cccd66e4a80c0d7c6985d0917ab781e1b437f587a55d1ec894d685c4fb18924b99fca7c72e14005ddabe6ede877469df12f90b0cd40ddc2f04be9786d8123c10b0b4490734ce55d80ec3300c83b8cd300c83f8f3c812ba4ddd1a8c7c99a414f9c98b3a08c5d7b18d8dd79732a524654a96e0af837261bfbfadd91dbf16a0118811cc30296c5d3702852839746e7b17afa860ea0bb7912770d24eaad44a76c6bebcd7531364bd496d5b9836aeaadd854525b1bcb4242744cfade7f89a6b4da973b7668c3421fa87ca1cfc7df73a2d8fc934186142e42af22ab698f9a1c2dfb812f996d4f9cdebb42fa3f32943d53b1fcf12a2d7c4b4658c2e3255c5543a8c112544d139a818a6a6ea7329dd04c64812a2c73edb531046063f5fb7705858384fb3d25854d8f208122276872b75e3a6d8f1478e10f962fd66b64bc55ee62b1e8d2a6c7996dfb8b48e10d6551f3142b4ded44b1032e7af3652840826b6eba56f264f85b9718dac3e468810a95609a6c71254b8e97fe39a4a84e3a2597961615d44c8af2d4686d0aa194b8931d599543d193b7f6ee5da6f37e74b148c08217ace6272859c1aba866ce3ca1f8f4a186c2408914aeaf5a3db76bfe2f20224478010b5c830e3eb960d9b33b671e53254d787258efc2082cbe96beaf4a9d657aa32e283c8b1a6aa7649e3f2b3fa8f4b835ac0364626e3e9fcea1f413442467a10c1ed6c8e9e8d13734ab58a2ecb4bcb173c88beb5b5d7db0e7b75aa8deb8a9f17e6599d8f27a51d448a79f763a9b976cdb736ae2b1c95211ad8e1685a38bbecd3e178148fa183e859bbdd6b8350a363b671cdce41b4dd567bca3d758a2d18d3b2bcb424868368558c907939c81cc3772cdfb941f42a77a57ffda99f42b5712de2344354a066358c2291524c7bb1b6d1c186ec341ace678d008d88c5f4a04ade92a9668b1909884450b559dd2b5b8731f2c7f31ace87d990282e75cc5bcbf65e2f371734fe258250175b4eb9d776dc7d0f359c8fc6d5595e5ad2274aeea262be2e1f27b6f8c864fc47104df444309db294eefd522ba5ef44ebd8f2afae171f3bb85c5a8748cb4b524edb20820c3a7ef7de96f4b9a5612e117c9b1acbecb6aab5a736aead9d8f272d2762ae0aaee666ad1be364226889d6371779a9e8cac164c52cd16afdc8fcdcf25f75dfb86a3c2b91a77aed5c6974f9bef1c6953f7046f49c5375defaf445ee842d2a445a5e382d9aa53d6a10a96b0d5532fc7698d485b4a89cc1bec379a912357d9c7635ecb8a2ba573e3691cb96a237677af61b7bbf1012b1b4cdabdb82f9de2981f0f0820c1efb458c9e822a3674c734e5e294c0f86825bfa598db5c11c27c0a23550e3a664eadd85a82acf3f164f4a2ddb792eb6c3165a71457381ca77e04d180e122c8323e6e106ad3f71e6e5c35abe1a845cbebb1520ebea6cfb5eb6a6146f42f26dbc6abf4c1fcdeb87ae07f34b0b930358126caa7dc629f0a9f82cee3c615369794a141b45c54b59236878cffc18debce208aeea5f49442b870f9c78deb4aeb08692eab9dffb025834871849e56ecf7f6e4ca3f82685e10830836ed740ff2621b57d64090e8bdb6cc9f27672dfabf470be71f41342d8041f4aea96f0b3f2e5c71d3c6f583c66b84bcb8879aeeb4cd7abcd3364f95f182d6de5b9e89a56fab15dcb8aed517cd87252e2f5c10ade8da324ed95099b35dab9a16242ff3b4da39d3a6d554dc11bef5e26a5e10aaaa7ed1bca7d35c948ac18208ae4c2fdd6aed35d59cdbb86a927e0048c4ab5f3d5b4b390721f48deba7c3710d036544cd75dac58e2d254397a74d5ec69bbce9ae9695b7ef86aff7d9a9b58228db2d7baa9a3a8b6f131b23828d3f595a30d953f73e84a9208accf5ba65a7aa252fc6d68f287eca6c2f72a7c8ca959918515cddb2575ce8186c6e88520f23e20457e1ae7edb927a4bfa7911637d5e5834cc0429486cb93fce6c870f9baa0f14683b2f4c8e75b72eed1f3ee2bbf70d7d9d3bd406434176e9b42556ff852e055f645aaecc3155616c2fa2c60eea4b5d779f2d53e4ecaa9be5733fb6ba883693b97c2eaab7b8beb40717114b97923f67c6feff98d3638be89dd5d9665cc91f4b0c21478b6869cbd5d4d2f2c79a582e3b41b49826333b636bc5a47ce3bae2c2a2a2f9bcb02c3741d4ad557bd8bed3b7e55104258818af6a4fecff5be2167745408248a5e476b15aa9d829df8dc7b547107527cbe7a2726f3db6dff2435ec361e1745c747b88006afb7b8b4adb718a1b57174e07aa8f1edc74e3bfb4dc628feac5062a2d2f1a8f4aff601153f930aee3d7daea5e1bd7cf0bcb8ae0f27fa9f093478feb6d389fa40ebf777b213fdfe436ae3ccd2a0a3a822df7bba9985e4357bc715d5bf08f209ae5087a622a17d4769d9a5b99cc4a26c3fa47108d53beb9bcb9d22ef6f5c44c93c6c650b975c6cb2f461eb92f2b2e2c2acb2c2f2de9c31289a4283f41d6578995697c6fe3caf9b4a868547bb1c76dd41e363f7d31b15e97d8c6757d87c345a7b5c06da1b47f04d1b8a2914342103ddde49758aba4dec3ddb876bea54545b3fae90f4bec0c836a97db16996f6be9939017f75d24fe1144730608d659aa4c89315dca53bbd97f205a9b9d9fdc774b06dd2d750f442bb1f41e5beff153a9dfc655035b9a46c381ba0e240c1e9d6f69f1911ba403af758b9a2f398e2b46b77125c2e908d1681859444979cbb6f8a5e46f3b6e5c7f1307a208d7bbd25c151fb2d78debb7703444381d218b48238371b1015fc5cdc958ed62ad69596a8665c8ca4a266af89846d509aa625fdeb86a5c9d0c0db070389a15d8d168029081487daee8967a0c5b32671b574dd2e601e40b1e5af0e08207101e40c2e0f1be05adef8724fe1144e38347f4295773d78ed1c1f6dcc6b5d3362f55838168d38bdbabcfda4da16e5c3b1f0f0f205ff0c8643e2c3193f90ee7791a8fdc17cde21f413433b8409498f25b29b7a5c472f1c69507902f789491c964323c8084c143d3a2a271e174e0aacec7250c0b440d3ac58c3f9bbd62ca6d5c3f2c51c3fea3d271017f5862fa0ee7a91f413499a27a0215408343e443010ab48d8702139040f3a6446075e3699b1408a0d1582af000d57056349c9507388085020d6040a77d3c1b5880e7010a804002ce78cdadac703a8002db772080a10002f4853ce000123080aab0b070385080bd00013aed575e0406a002d00b0460c5cfcb0400a09adf6834cfa3c222811df035cdabd93fa3ad38cdab743e1d38591d9d0c98b0709e97ac46a36734afcb7bcf07485453040323aad168381f97229da7f9a0f119801a408504a8c108232c9e4624839200e8595a8b4902d4d088014082a04227b4809637abb49a21c880400319e081810b5820a502149880042200810738a0010c58000441100475c00a6b142208555869a08203021185058535daf084142724618e26c0443061044b5823084140050441b100c20b20047c1620081ac183c91a03800401853a680165c007189e4ec6c70820084a01a312108a0ff5050822f102049174018248b80041245bd002049164018248b0004124578020122b4010491548a6004124528802141c305207143014e4e96452ca682b20942f12ca9861468f1e1e0b087971296df3da4b792e1cce8a05ccf88f8a6765a57161464a4b2181821ca8802012a44010c9132088c4091044d2040822610204912c0182489400412449802012244010c911488c004190891751f0c2c50b1608824490e2010f90148108081802028410042090fc00822000400f255a41e92216103492060ea074d13eeff97c192d48814b63d194f17e488f1e23106cee3f02f9d7c6166120e1c13f08822ae00508f2c28833a388084e9085162b5066692641f0e1703a207895cea703282778030491b060400d4380504c9009088a8009c08020c8a5fda6e5856405a5046690801424204104fd0d543c8946a29104f88225a00054610c0f70e309795079d871820b5c029ee00269d0420f209411380182e07b5e7c6834293d5c5044a0c6083c5006fc16951657dea371895c10f91f19cf26d87997cc26336ea0624616597020723c90a2cc48f1a8b0fc4765a5c195df7438b1c3899c9677e17c732f1e95222e2b90c3e24c701940299c4f8aa77bd03b6833501a48caa789a00420809f929272852b70010e08829d674f401004a1ac2550960850c68c67692d66f4e8c1e1b4bc313e2fa4d3dac665458bcecb161e202d9d17d743a3f9a1021f659011b540137da105192a00528646d323f386910c16321ac8300005047050cd4783f2015868fe0cd850b288104a16348050b2600104410608c00c5ca0e03447c802930100f890000948c10d297085217e9030c104259610838b35830ed880143bb2d85406e7071adfc2f1980172ca0041900b1a4f06940e34c2058d5f5171710901cb90965f31812016940e28008250b22005044128597ce420c9010a07920377802068c8b30c794f27c35196218fc28109a070808b11945632c2802fb2e2e2d22088c40c088200004106c0402520e8b3a2f2e244d0c251f98e8b104e18df1943034a8050349081a04c8ae7e3e2f16c6045e5858b14940cf08020940c0400854714507804a1b1fce67934281898030a06b28081186000086486194352cc30430529992c3ad0014f0a13e2f04617aeb089910a6801a118e00c08c5001d80500a208a0a40900620865280454028054802845280154028055808a50000805008b0090885007c80500850060885004280500810068442800f5ca009293d502e3006740109409005c2a099018462811140453e2a4fe5e3692b6f01134d4a16209494ac402038104a05c6f0bca054800794d203850273acacb447814040293d3e0d06100a0520044114c8941e9f2603086502859840159e8aa7b90928091442025980527a7cdef31d17cde785486025a587064502190157f4210249e07c3419082502405654dae7a1e63f46800794d2a348e75f6c0001382028a5070a04cae0a2b2f1a040e0051094d2e301a480a0ca8b10ca0372f0802e1e0000084ae9e129f2676834ff693480501cd005084271c0d27c382b1e0798a4f4e8fc191d0e114d8c9c0604a2015148e9d10019a4f44061001c1004a130a00e293d5018308687010e48e9f1699a1840280b6803ca027280b200302028a547025016a0e2d28240280ac802a725a507e703db1609a84302cac0280958000495e1e3f39e1615318a7c0afebdf801dff3ef0567a58c5f7151e900f178def341e37f7c7eb4f8d8c4020e90ce8fd1f26178369e06c6185d1461f1d1f9315a54c468e9bc6cc151f934327c3c1c0e700208f2b4705a80a0f14103488b4a5ce142888a87d322824c4a8aa7a5b8b692e26944b4d87c3a2a2ea5a5a5b4c0e6369f9797980511ce4a91e6d25a7ca00c60042803f8400fc6900837563a01c5e0131004e930420ad4108354602ef0020882461ef1c617909003113fb40282a01218b89041064728201671401064b2c617d8182301740884431034628227c440054d308216ea004150891c6ed0600d65f08315dc80206804096d54208b8e8e11900182a09146b8f5830c9460034b401044124664024f2061034850050441250b6042224a41852ad4611110049d5c410a738c34a2072c4e0041104927e470420e5c41054e3804413ab060c60e2b6c0851034c80008246c6308000a49400043d7a082013500a08468022004190a0a5b978529a8ba7470f212d2aaf753e280198034a00e0008920050420f801c649422801f8000000e0021400f801f294600445dc070500504604283b1e81b2a3101004791865c7071ad10282200d84b2c3e4e5a41122f07cc7e5062827687c4b21b1c149182963a09c2cc0c3f2d292420212a478342c2f2d283a3e2525d80084a24375e1058ac91c992e504ce2504649a398ac212a2825ad48699d0f1ad1ca4ae3e28505282549402929024ac90ae793f24a24805202a5a860e4140e402101040ac91a5978389022a445e5032b2b2f5ff090020401210943072823af7069bfe991bb89482303fa40e3614bebd10382a0a698390e0161e6d0038499430d10668e3420cc1c5d8030734401c2cc51040833470e20cc1c2e10660e332008da8100e8846407868d4d401836fc0061d818038461630a10868d1c401836208461430c08c30683306c6400c2b0510008c3060461d640058459a31310668d47409835e40061d6f0028459030a10660d1f4098353c10660d1508b3061910660d85306b2800c2ac310261d4f0048451831110468d39401835c40061d460028451230710460d0e8451a30c08a3c61610468d1e10468d0c84510305c2a4810a08938626204c1a8c803069f001c2a491068449e30910268d1d4098341ec2a41106844983419834200061c420078411032720088a400420d0000710c0012802b0400250169000090040020998c0031290010858006a801c4d803072e400c2c811030823c708208c1c1980307260208c1cd000e258038489030c10268e264098387e0061e2200261e2e040983884409838804098384c0061e200018489430210268e01409853b802c29c82141004116001a77810e614634098536c01614ed110e6141b8030a790008439850e08638a39208c293e01614cc10808638a3b401853a401c298e20110c61400803070b402c2c0e10908034724200c1c85803070d001c2c051060803c714200c1c44803070108130706c200c1c2f8030707c0161e0700803471610068e084018384e20cc1ba780306f5c02c2bcd10708f3461b20cc1b6280306f2801c2bcf10261de8010e60d17409837168479c30310e60d094098370a00614a210784290526204c29e600614a510508530a1f409852a8409852bc0082a00630e00007408002105081033820030dc06006408004401070e31510c60d52401837360161dc80048471a30e10c68d34401837bc0061dc58028471c30610c60d17401837c080202800023000010c308036000161da30038469030c10a60d28409836840061da180261dad8409836640061daf80161da3801846943214c1b1a80306d486065e5058246d28069c51a98563ca115368020122f14824822922e2088848b2d48b4e8703a9d872092134010646202088246484a0041d0086615403073380282e670400a1a8da585a3e208555422a5470a891c5f90f169e1102169c2af38959595165b5420888404edd3bae022152ba900a27286e78ca7f219f1841cae1859821c63b0012ad2808a95941e425a543ee0b9401ca680a0325a007dfc0083081a4d0c212d9c8e0b383f3e9c1f2d3e3a0f3b2a20f25e7038407e707ec087f0708a151d9822a1f7a2c8a7c0e53f658cb1d261c14a8705cfd27eb4745eb640a389d179d9a245458c0e67538690965f5951f994f15b3c845a74da86f3436503c4f3f1a8789ed3c5094a1180121890821010e40529bc803a9de80c15447f0315cf3bcf08b8c08c220d107484111a88420fa3581e4ee76fc0f9a4783e2a2e2505be4785451404e8118a2478fec5e35149f9b414971411745e604a6319f21cf8e2699d97160a05409e850150f4e143e0792420080108120421c880e0031e20e940161cf084c274020f241b20d10049062ec189284010c409221b08e24418667002039ce0b4bc70a26413a830c38c14b8f22a3145480bfc2e2088e4023e208884070906c680d1842a482e4062010822498120920a9050e0139a6041c7a5b1a4b4227f86e755309a288120fdbc27136b643c292d9c15f7c2f98027a5a5fc191d4e4acb7b389b97d279e1c02025e379a832e4e5d33acdc5a575a0031e1597cc191cce26e56111b7f2125d5e389f940641241398c0a6444e4aebe28c3744258c1ff0492450895878563e4569017d54a20a504a0fc75971293f5450060a542576683aaff1a87832f06d9092c2f9b4703c3548e17c523aef812092089040801266a0c4a20407209207380082a0119326985c611243783809046860032380200491346084041849a44050bab48f8745e5335201086245244ae0d25820121d6020110482b2e0801288f0082010c4592903aab431febdc878389f1417159594151796f644cc30c385e5c57d5ec8073865a46452cc7051f9703c2b2b2a2b2e443c22c8c2032922e888f1ef454a0752b27051f9a8e1400a09525c543e9acfaf88200b17950f07de4a7b1a12a4a47c7e25042148f90ea74588ca073e9e978e19669891927151f9a41471291fc8c245e5c38114f83750f180a0c8ca4b07049f164ec70c33525a8aa785e3a2f24969ede338ff5163861966a474547ec3b9808bca2765a5bd7c3a2a432e90f29f17cec70c33b4485904172008ea3cfc323c1c20425a5402ab923357ad922ba612bf4f2ca66c1e175be79792384410aeba4f6b5dc2d611ae7062ca1238443146d67f6cb55fea3bbe2172df8e37e9c2d451b5b921cad7049772d17576c7d586282ac86fb5e62e95aee55734ef8730658d66e98f201a2f4ad810ad15937d4aad35b773ccb3640dd182eefbe93e4caef9ad3455354490a9720da68aab36f9dbb8266519f2aa3f826856491a22cff5dceea667ce58231aa2b49f98ad6be59e19ae923344903d5353a7cefbbe45855303f5f170b848f512334490b5bb43ffa61b5f5a8668c1f61ad314d34275d79e26643119a2fcd45a6bba069f33f25361692d45a0a6c3342a194304d3b176bad131a8dcbdfa82b1117d8c2c42a8cf96a1faef1f41346694ac11a9d4fcddfa14a352ce7de35c64326464329dc53a1f97123522e6dcefaff17acd0da6b29234a24ce9f7fd723763eac1d4361e2686685bdf5a660e5f4cadb110ce4a18a27e2926c8ebc5d7ecdf3f683c1822b59eaab4985289a9e84b84b352a4f3435a4b50f28508ae872cbee663e74abd0b1abfb8c40b9172760b3bfd82dbdefef628e942c4b9923f874bfddb6b2a7e47f3493d1f0fe7b18665c88ba0840b51f4e474a9132eb77056b8c864b6e81f4134ad640b11aff66fe3ea72bd12e34cc685d33d28d142b454ba085336ecb6da9a85e8c1e75e6a7daa9afbd67d508285883f41c62eb1fcd7eadba7f343ae1045b8d4c164fae0ebe6c58050628568536afc3c9d8b8fb5eb4c46c3233f28a94294505d61cc96ed8b15f4b4a7b7840a51746fc16f71ed4b6ad942a8c52aafff08a2f9922944ce2d075b615b18b92d953a9b3232998f8ad3a4ff08a2792552885aaa54cd2f2664aae18a42c4d8aa54ff702dc738292844afbb96bdfeec94b8e913a26f76fb4ab5f24a6db3c4098c63a6832ad5bfc63a05254d889efaf890396bee91d399103d18d75ace944305d7a925707a33a7e59bd94925d7a27272305da7769e122544917361435fd932aa664912a287ab7db57731d89a472444eb1b2eb7bf7e84e89fc7b7bcc1a552b111a2de4fe956ad4d9d2ac122444b9372e9dac3f7b1b12642e41ae35b6de999b9fe10a2b79626f75a6f8bab4e09217ad99efad256a5d8672a0942d4346de6ca652aaed66ee3aa592d0142e4ab98527fec8aadb7be4565f39a18fe81921f44ac70154cb8d253e5b969884a1799cce6a3d269253e88da3da81af276c77caa7959c0c2e97891c9a051d28308ba2bdbd6626b4fb3d2543b2a5869998c0bcb6b5e1f998ce7496211ad95b09bf12765a59a222e9c97da83041691624cb97d66913d95a93caf889629c7db5cb97bdf560a49ae8872d5c15dcf8ba987ef8991a3f91ba888d14d02925644cfbd15d55ba9dd5fc64584c34526b38040c20ae5e6d630c2c68d29347e15dd1a66b3d6ae3a570c9239a2c4d6a774d54d0855b22aa2a6ff4e157b96ea53ec8d6b2aa2a8a97b259509e58892aa8dfdfed43fe34745d4ba34c1e70f32564dc511b9eda52cc1f552e2964e11a9bf84acbd6fcfabb53645d45c364d0ed527ccf41a8e28614ceb153af695dc6f44b025a7d49ddbcbcd2f45c4296e5ccfda6b55a8bf715d6e448f7ddb057d3d4e9a4c8a48296f71456dff62a66e23f29492b566fff9c9a388326d4bdbe0aaf2524c1451bf636b25053573990a45c4a22b6f4d358bd0bb5f23e20145b41c95fb53ef9b783b1b11cf2722f7ead8fe3fb798b2b28d6b7b226a2a9b397710321633b913d163ad9195622cbdf2861b57c5898845e79e4ae9b9e6de52ba714d9b889ceb97c918d3b65e364d444b5ff494d6c618bb796e5c351391bf5e4f969e7bbbd1459717888948b7d3bd7c29ba7aee4b446e135ccd5ead3d57b636aecb12512b74ee39a5a0734c5e8948ad5adbecd863759cbd716d4a44be126bd5fd8fa98a3c89883974f1b17a77eac6b771559288fe71638fd9f63ba50e37ae2912d14a0fe326a76272a9b9b8715d48446d9fd3b8eed83b547579818f885e726e91a9a65e7cb77ce3bac91191ea87cb99bfd32f7769e3aaa9115153ccdaf67afdad29aa8d6b2646440e32a6abfe57d93ee68d2b5b44e4b859776a2ea5f72a2922f2e45c65e36fb1a536dbb87a22a2f8b27badd712834db5b6716d4444eeaded6ef0751bbe1837ae7c8888db47ceeec54fed2a4344f145f7e95863d6f7d21622d26c4915c35655f8bb84889252f7b4d26ae6f245b671d51d44e4a93983fe9c9c15aeb871cd1544b4327d8c6c6dfeaedcb671658188d47af5fa5d2ad77e2d4044e9926aef791ff3e60b6e5cfd0f51764cef23bfc75c2ae3c6b5fd102905db72b2dc8e8bb9dfb8721f228e6db96f4dbd6a0763dab82a3e44cf0b1d73fadea54ab936ae690f116405fd3fb5a956fb72e3ba7a883aa6d762b2468decdbdbb86a1e2217b375d39995ad4a8787a89f3576ea60fbe4aab9716577889e1b5c4eed94297dcb0ed14bb5745319c2a4ee7588321de3a6dadae6d7fa37ae4d8728b673b604599b214bb771e539442df953f8f2b54df9ec37ae4a0e518c4b93656a9f31a6631bd7148728f98bcf6db5f662d6160e11bf53eadb936bd1b9be21fa54f95ee94b2f26ce8de7c5c50ddc6cdd2fff6ccdcff3d085e5a506e907491ba265095d2795329bad672c6c8854bff9f243d6dc9cd38deb735943043badedff4e0f21f4b57155716179a9811a22c7edeb5a73a78dab0bcb4b0dd2106dae9754d7aa832e2ddbb8aed5448286a85fa5e3d62ba6f72cb19c2162b77161fcd63c4676965412334450d5694a66f954156c1b57178e4b19a26dc7bcb9e1822f1792218a31bdd8ced8b1c48fa531442c7a47a858f6b64f832b2bcd17091bd16f74c53c3ec38e6dfdc6b5880be7ad11adcec5cfda4bad2daeddb842ce4baa48d48862ca8fcfdf7f4b236a2d997ae5fdcffbda460c11e496aacde9b3b7d26f3c61885215cba88f19bf7afe14716088de3edcb6ea5bebb7fb705abe1075b28d2d7e36984c39d1f042b42b5372d0977badade58d6b87d385a8b9b75569f7656b4fbb71216ad05b4556af31d5c5e651d942945a72bce0b6a549136b1b571bbc16a2b41e74b8ab59b382cc09c942049573e98e93374dfdcf8385a8354f566f294e49c5a742ae10a5962fa6ccc86264c9ad380848ac10e563a997b5c55627079bb549aa10bdc454b1f74c37375dd0782a44ee313e065b3fd79d185c79619942e476edbe72b37db9b91036d5259142a45c3a6d66f99b30794721e2041f5b2deab6daf71c1628442cadf5b70bf62a17377a5808489e10adc2b512eb7c69a5f5b9711da2029d10a587fdcf947d2f6deec5d38448bd57ad5da92fd5afbcb030217aca9e9a25b7986350a58d2b846d654896c0cc52aac59c94a6c472d7aad77e9d7be265d0f9c6d5a50d79b6d286bcf241a28468a17a6935e3f2e48a9524095152fa7431e62d5f526e1b572444f9e06a748db514f5d537ae443c4add4b19ba1dce3ae3b58f8717cb904f3f826882901c218afd9017ab730a6a6ccd08d1636ddbe38cd03d6350a1f12deca3f31f1f2fa4f362a47d219d67498d014911228e6dd32ed694efed8a44889c3655d80afefa74d721444d356b9b34c104d3fa258408763fd354abb90ba7d34526e3c2e9c04cc6e3c2613e200942b45ed99d5bc6171743078488557b29b9bb5b96dc7e10bdbee7fc09722a63a57c10ad57d7b6526b059d7e6e785d1a4b6a01490fa2e7f516df8adf8c5bb6584430adab6d95166ceba5d5e22393d1c2a5b1b42a2ca2e7f60fc6b4d06dfa5daf889652856b597c15dd5d6e5c379e1717cd192b2f8ef100f2454705f05b88a860241523ae88bc7f135c8faa584a0e5b1165727adb98aea69efb5811656c4ff77db1e5545a6fe3ca3c807cc1a30529d8278cac228a6a45e85ce3e8aef7edc655488b465f088c62fb305ac0830b1e29e0c1058fcf8b18994ce7cfe83496f8643ce4fcc86432990c18a9fb90d3a25895240b2373448eff9d46d5be585b4faa88dad8b72598de2a39531129558f71620c617a9f5c8e4dbabb49b3592e5d9cbaf575a9c8dceaa5ffd6a888226456d5c59463ba947144cffd7b983272b67fba839153449c69dda6d5dc0fd7251899ccc6d336998c6b346a0823a688ba7795fe2e1553522f06198123fa6d8c29f81fd7ad746f44bddc3acfcf5ffe4ad948295c73757a5a95dc3731e5a4305f7a4ceb545fee881bd1fa8bf9fb58cca72fd5072345c49c7bbc721b6bed29f736a297966b5adfe49642a64611c15eb6f8b5edf618fcddb8723e2d3e3219cea745a5d3f1e2bd4b19998c27338c88224a6ecb316fb9debdbe0b45f4568c9e1a841bb9996ba088d6d5f376c6df36e5fb44d4564ce8ce1b7e829f2b93793f2493614f44dfa0d34ed574d77a2c3a0e463a1169e355ef1783fedcabc789c82dd7f8fe4ddb5a09020983076cf90f1a512693c964323f82687230b2898835c72053ccf7351131e4c49e3e6f2b7af2cb4494ad9e32a8d17db3414c44df6c652b96ab55aa629788545a8e35d86274f56add12114b8d936ad9e2dba75257224ad68f1c95c58730364a449f2a6a4a8e2a2d8f17189944949427efc8afd6bfc52b841346262384b3d21a15c25949928812b3d698c6d5b771fdbc70d219239188a0aed7efe9b1f5a69c37ae1a48442cbbe3d3e8f0e55aee8d6b6cbff219794494ed69522c1fc35eed9bd7d23a4e035b3e93f970389d57e900715921a379379e06c6f21f41349e1147442ab2b72937e32f9862f200f24526e3a066e3699b8da78171467bef5390e94610196144b41a727f5ba598ab75ee452c6dc67c33b1f2aefbba4a909b763a63a79bf951d1a896e1b242066369dff978da65a5937e04d19031a288e8bd352fe55ed2057bb90b612411114cac4a5725f69c7aefb91246101125d6db60a763cc795d26c39646dd09238788a2c7e4d5ce1eba94cf6c8868b9b68d9dada6ef45a832994cc6351a84914244eeb5b60a5752a80a42d69d460811b5e7e2f6d4476571b9b52df0f584914144eff7b5f5d6b29694b60b2272bd1176fa0813aaa4de52612410d1b6c45cdd6a33cf850c88c8a5b8bb5e9ff53a7f565618f943a4b121a7e76053df5823338d5e61c40fd17a0e77238c09be4ff95ab0298cf4214a96eff897ad7f31ae73568a34178d8a3219f82e9c951fd2f2994c1b61840f51b3a70533ea32866c735b90f61075c3f7e8bc96fd675c7a88d4b997b8a594ed307d1ea2f8c9614ce69ccfad7aaac8081e22f8d2b79532d76a177b2dbd43c4b059467f95769937a7f52388068d113b44caaeb4b5667171829dea10add7364187dd9c6f55d2215a4e1699b9efe6dea7b218237388da5bffd58de32e15a353f6238866a40723728856c15faf2597e02655ce7e04d1f060240e518aed96730cb26b0bb737ae62a85d708858c1c5ab7d2f632f6a6f5c5d563aa92bae41ce6b893219cf47c565a5b37e04d1bc8cbcc1997bb5b6af52693395db57fb85ed254d8b2d177c87c34526d3791797d62192e9705e2683841137446a7999b58631c154fc1f1f994c26b396465547a030d286c8c5a4ebddf3ebf8fcd8107d8c6ab55aa9998aec710d51efb20477bf61b6b74b0d91eac60c9b36bf6d8f9c8668dfe6af3f55b11f8368887e976aa8d615fb15533a43c4fe1addaef7554daa1b57e701e40b1e5ef00012060f8fab192276f01574ac1ad3d6decb64ba35ea32528628ad5a29668aaea247f73aefb5e6f523880604236488721b73ee342615d9351ec35a9ea9acfe32aa966ae3ea52e4c303f20b8f1f2ebdf000c2c3f10b8f7729022493f1acb8b0a8b026f54710cd481546d8d8dc5e992b75f264c59d52266e66d81c27cf947c06236b743e9e978e4603811135226e77116e2ff75aeeb9271849236285ecd27a9b96aeabed2e46c4103dabc76ffd9f365d6eb5fc8a06b6bc462d8721721b6363fb7ebb254d911505864861c3df07973b77155b7f218a2f5d323bc8a2b2fcb870344c5f3c2a1d21ec85489755b6abd86b658b6de3aa59796149ed42149bbda1cb5cf03d5d6ae3ba2b151a9b84a86cb1585e5a84a8b8667969495c8862d2d7e4b15b6d6c761e40bee08106f421a4a59191c964321e178efa8f201a38b28568955baf7c0ac2043dc18dabcaaa16163beb6e962aada576b5c82e395e31bad6cc7e8c642152f063fbc6fdadde5a0d072ae5cec7937a040b11bf05574796a2f296f9565cfbbcb0641ab942a49c73899db68abc3afec615be6665e59fb242e4d6398e4e3d955ec3d7fa47108d0c46aa10c196d2132a4c8ca98431935959f997fd2388060623548858c14ddbbaa0db14219b4214a143189d7aaeda3a6d1529449bb0bdb163cf29a68b9ba210255c2b795b0d03dae0da8c919dc5f6808e4d44a95b8c2f35bdb87699725634da3c1e954f4b6359453e9fefb8f44b9113e8d044e434bdbf4ba9bc2dbeae70388e373a3211bdf6ca216c9a2a41b71226a2fdb7f4bdf449b9a44a2f113d5f08b59ff7e35b971bd7743e2ea9ff691f4ea72d1139d79439af6d86ef192b11e5b2bab694eb6615776d097450226277dc909f524f553b4fc5d3b6589d44e4d42b56cb5727f704e3c635970e4944f92e39e57461821b392d4945a0231251720d533f7ebdf857f3f1a8e46ea10312d1c3f7cbc9b58d6e17a76c7daad33f82683ea0e3115182a95f9b633159c7e888a81f4ce7563545a5a9d908ef54cadddb6953b166ad715fae4f8995fa4ffa8c88166b09326ed78d2adde95844f498c2f68c9db129d689021d8a8814647da9323a53c8eee948440415aaa7cbf1faaed7898884ac2947f6670997a943289719d31dcc96dbd019225733a6d6553b6be62e4fadd6764c717335d78ea54244bafc947954cd75e25d2e2b9da483105152d8f0b1e60f9bf74a300611ada7ed6d6aa573e856101173cb53f46df1b96c9f818856596c658e25bbae5a8088205bdef4d9ba522ab683e1021d7f88568b716d27c75873b1fb450c1d7e8858628c63ca0859b935b8ca7d88f6754116f51f3fa56e5da33bd0c187e8b5967a6daafb0419b28e3d44fa586f6a70354fef77e9d043c49c620d2ebfb4a9a382e63c44c98a2364fbf6f5a57c3c44aa9ff3ee56562ef5d91da25dcbe08bccb22db60bed10f1b7db66c7db12b2cd3a44aaaa1dd3e3c5da43071d229816aba598396e6c4d24d0318788d7c565b896f3d651b5212ad09b97058a75c8215d327dafc5f51b616a71705ea54bddd7d5da7757cfa3a6eb74cbd178303a4f841386fa1144f374c021726fcc3e2ad52fb9f8a08e37441c376d8baedb366cfc3c807c01031d6e881e6b6d39986a13bbb7fa8ed2d1866865735b6bad4ea7aff17d7169f1e1e9bc70e1f94f912d9ca0830dcdd7b794715bf3631675ac81573b6dbaeeeaf5e5519d613ab551e13f35e84843a42aaec492d9b5bf055726b355d08186e8c507e17b9019ee735467883875bd2995da6289ad67862d43c4fc4cbdb5f22d8bea4a8648256fef9ebbc85cd3a75293a0630c91a77e55eafaed5295221b0c7242b79ab53d75ad638d762f134b89695b67bc050f2e7868c1638c3078f41274a8112d6e99ede34b99526b6944baf1a9e566faaa5971173ac49094bbf24dd6b9a959abe470bd4c6d295407dd3f19e80843141f631793375fb77d5107182296ab1a3ed8586cf6ae3abe1025c8bd72458faec30b117c49d95b9de2bfe8ed994c26a351d7d105cde8e042c4d4ea56c95a2e8cbc9c8e2d44af156cdfd8d876aeb70e2d44919dd7378f90fbd9451d5988925aabea9e73705d75662b6479171532b010b58aab33ae7e4d697ea77d8b4a18994c26c332e4352e918b2893f9151716154feab842c4dcf3c4cca26ba61e26cd528d66ed8f201a1f3aac103d96e9585d3fe5ccacd39e4705ae56215a6b2d4dbd3e9d4355900a9182d9b9d2598a9e19932a0b744c2162b099e3a6b49e5d52aae579f7870e2928a5a954626c29f686ef15abe717135b6ce3656432994c7a1422155f7286cbf3b597261422c7991c53b6bc9fe9948e2744b05931a54d97ae76b63a9c10299731a62e47a6a309513a65ec75b657bcfaa50e26448c7582ec79dffd59d3b10455e7d65ee75e49d939ada6cffddf21278f9b3a9410357f4dce9a9cec606b3a921031c71bdb7d936ad5bb7420216a56c622ff52a91e4bafe30891726d3bbe98f199aa741d4688fa99d296144cf578bdce6472a0a308d14a87fb6edfbb553decedfc2a37cb90203a8810f95bce751fb75710c2e82393d13184e85f6bc93c6a42c8cebef3d1a8be4b11204adb113a84106d6be5984676d7227cae230851eb964b7164bde28acb8010315ecd2bedbbb87edd0f22e59253f8ced453177375f820cac4dacf61f295d42da6a307d18a1e53aef4f4165bee63112d05bdf9767b5c90dd66324ba3b08834553e4c9b71b3d3d92ba2cd5facac8f79c767eb0a66ddabb2932db7732fd7f55e64d029981edccfd68a68e17be7b4ef12c2eed703135644a9396f715b79b6c40d5711717ae516b71f3263e9bce0c1050f1f9e36076389b15cbd52bbd7aeea55459499e22a8d31bd335b9e8a4829e7fc3deb14f9a94c7244d92db2b4524c317df100f2058f4c2693414594de3bb9b52d394eddba7185ac6b69c0308923727e9e3155bbb1f8de5f349c8fcbcbfb21bba788603f3b53ae91b97b5b0fc765cb303145f4ac96830bdd75d55361a7b134d8361a229c0e531598c011f1ab4dd54e95e9218c7f0315cd0ae7e58e61f246b4dc52d61c5f6c5eedd1acbcb07c1a4bd2cda7b1a84fed526c52d7b5962e9549696f2f4fee5ffb5e7bcd35a551af75bce001240c1e6bd5077c3454bcd0d5b0ba11a5a8dc7743852ebdf5905dc1841411c3579f3a2ea6fef91db711bd971453c8128cec718c994c26b334caa3886226b7e0a7a8b2b9fb451145979ebbf45a7a27c6190aa596abed9556f24f7ece615bcddc4fa10928226de5f0a9d89236d7e85e3cea13d1abfccd6f0fdf3fdbeb78226231fd5b70f953acbe2b1b8f66b513917a9558ad8bac4b25979c88dc65e3d8dc39f626a2e469f9832c2137842c3b3d4c3411b198acd979354b9aeddf66224acebe931353cddd2bb6718ddf514c444cf77daef4226f5c79407fe1f19d170f67e5f170fec243b3b645a5adb8accec0e41251bf5c17a33bb8ee7963cdcbc4129a918349252295a0be56dee69a536b5d20874553644d604289285f73a5fb18bb7e2ad279168e904f0b87259549603289c82908f775c585bf1ccb77589e0c4944bff8a362fa9447670b6153918838374167f0ed7bae942111ed32f6a0fe8b11aea86915c3e411517a2a6e7ba79e9cae151d11ad6f5aaa5c42a79dd46b4414612f965a7a0f36a5d219919dbc2b25954badc49b58b36664cb21e7ae18632f22e257d5ead85f6f8aab268a68de6bdf39e7fa8988d2df6b6b3f2a7e4f61733eaa88881ca76e71e583a9ade6733ee9c3e41051ebf554b5a6965bc5b8a2f1bc4785c847c5edba21228e995e4166b15fec212a30e92a44b4dcbbe5d1bd72302db62a4c88483dc6ccd3fbb5f6aca0134c06116572f91cf55b71a7d61bd7b4f2c2a24e602288c8e1b707616c2ab1a4db9d168848251761367cba0cd34b2b2f62ec1d4c0011b97c99fcb99d6136741b57f7e2597f48aab9572d75d7759594a666b6af3ebdc6a2fc10a56cf5f46d7755b5abd23e44dd98fdc205216f2a6ef75206124cf81039a8961db316d33e4b6b0fd13afb4c1dd7296f4f61bec1440fd16ace45e7cfdd17730ca1164430c943b42d23744b29741a3dd747afc1040fd1fb978be9b7f61dd58a29e160728788992fabbaeaf4146c1af7e24915a2e2f168e15eca5855f583891d2296dedd5aa7ccb1985a797841068fd5e5c906933a44dd3a254dfef6b5a9f64f8b0a0b84a86c91c964321a96971637a143b42f46954a295d1ed79fc91ca2feb7b1f7c5055d54a7d28f209a642207c8b0b9d352b9ad72ad4486267160caccb57c4e37b1c7360e07d74c4a31669a5c53b357f94bed6ca95ccfea428470c270e1fc506f50d6895d5937ad65c63c93b23747b6a91b6cd7e0c6d545b3fa47108d16266e8858da7f91bbd76a6dd35b3e0cf89ff72e6844994c2663d286e8b9549a60dcf5d43b22adc3f9a43e7bd8798f66c5854525950d512ee55c0bbeca04dffe114cd610254e56ada9e76d6aa9bea76dc6708d16315143a4bbad0b21843179faa721fae7e2affeb7120d2a712a6d76658a53aaaed790db2a955a636e8a67885a46f54d15595b6eccfbc3c40c516cbcab9a6f7bd32b5886e841d6de5e356b6488d8afa6ccafd46a90c104069331448e5b198cae414eefd7632698b011b19814ab04936adb127b2c0b266b44093e073faa95dc6329f509266a44eaf253e9e365aa314d5d3049236a4f5527085ff2554ffd08a2d99888218acb58736e2dd51eb5ad4c66694696601286e86d5af0e9a604b7fdfa660bf6850918a27cee7c5f87ce996b349b8f0a915d324cbe10698ccd5f536e79567bd50bd147a7ba6c1feca8d145932e44ef5c4acada9faeadc64cb81025960f97b17ae6da39db826b0e2a76db9433b5181a4cb490be3a7d2d56cd997c395574d8ea539f520e72c1240bd17a8c5f2a4f4ca5d4169b60216aec5adbc852436eb8697285489f6f42d5b6b52d5396c96434fa3c2a2caadb0a51a606957ac7f786ea29e51add814915a26ccf6d4beccca0e3964b0a265488e0d2b5ea8d3554a6bfd8144ca610bd66a892bef3638f5f2ad2c6c86432198d2e132974e276b5cad6cae4ee664ee7346a5a29badbff8deb0bd15d69499dc5240a91526f9dbd4b7577d139d62650885c83ce4efd73eb37ea327942d49c1c2ff4069fd9351d86165ba8208c2ffa83c6b7267542d4d2bbe56fa5a8ac16f48dabf6749a34215ad5cd5ba614997d5c6be38ac66f5653a4753a2d63c2842832b6bc341566c2c6da6409d1f2f7565b2ca9d6cedf9928216a093b755595f6dab84c9210e5fa6ccbdb1daaf89d4c90b0162faf27e6cbcb73195ba95f4b914567967ea39a1c21ca16a152c758c2f5ce8c10a54e99f2717b5dacbc8a1045e6ffc7bc113ae5381221d2b72c4165e91cbdb5321942b47ea35ba6ec1874cc4408513e5d75171d4b9ddc5b8f467d3a1ccfaa4910a2d56e9dbf3d4b1320ec624c552f5e658cd36e27f7e9a2534da1c0e407d16b4d96d83fe3c6954d7c10c5fcc5ac9cfb4b6df1833f86b261d283e8396edc644e0d57b592584489d9e563ef1eb253ccf98045d416bf42f51ca67eab52914c86f12ba24fba72c1f4aa3d5ed6cb63287145145bb74eadd5cad69682dc8a28576acd9c7f3f57f61c2ba2f6ca1ec3e7a54ed73333af226a4c573767df5e53c69e758ea8c1f59a73dfd3b5643155a38ae8397ee7f4b1e6e26fabb640695479a12415514c18e3dbb8d971a5f8588e68b5be16617fb6cb085f0925a888da7a8ebb50bd8f0fb731c711a5d792464d5eccb1e5bc7175499f0e678c53448dbdcbe658334eb62d296dc13245c4b05b99f58b2dd74205399bcf8ba1e2a2052f4e43091c5163bd5cdaf70655743015e97c5aa232d41b913a76aa4556d56ae52e6458528aa8ddbf97fc526b8a31b6385c64324a876854e9907486123722d51c7cfd6cb5c154b01b8be6d3e1783e51a50395922252e56efdf922b306fbadbc8a17998ca7bf50d24604217c4ea9d77b54af8b69d40925a3881a36d79c71b7c66a5dbe4b11209baad1229fc542892822d5fe7c1b27e7f9ca75282267d6acff1253cd7c59028a48bd72f6e7f6f613d1b2552ab6970b2e4f303d11a99556e92ec71cfbe8d6c635bf259d5865aabb98ea4ce5ccb8373f296455ed4de9fb8e26b5a87e3843545c38480927224f8ec55429771b426e51d964322a0a259b8832ff37ad6edb1a5b6d82124d4491b56ea9a907dfddade63106196384c183f369a90c2599889ae2d69aeba81abb051d2622d7cf32176b2931f83a6e5c977e51728988354bb8e2766b4c0ab24c269329f249d514f96c1a259688965bb76cf7fa9c092595885a35aaf57cc554899352224ae979e7f2b8d9b4b16b8a743e6b12916acf60ba961a8b91b92889483f6932f6d8fb4844af2d66eaedb7afcfd62011356e7e66a6d98cadf488a8d7937bccbd3b866a972322e69453294b55c794666a44a4cdfcc1b6d2d35db65cc2884839a5d6820b3b9fea6a4ecb22b89f6a8d0ad9a78f4a9528c2e5f36a09be6b9d6d5722a277de742ec57f0e1722629753b953aaa44b2956de8e8fb753d38230faab9243449c2e2ac760728b75545d461b2252f65e830e9f2ea61c5c42282944c4bed96207795bba5da9841051ab4b1bd3d353fdbac7c30b3278940c22729ffa31d81cf3dcd734edd3ba607589aa82885ab9aa8d11bac294ce6532434a0211bda829ad08359379f737ae9c8f86b544a949280144a42b99bf7f55f5922b1fa1e40fd15a16556b8f2da5905374e687e8416f19df3eaf43fedc78aa164afa10c5676df1f306211f2215959f41f84fd35ad9f610257b2b2e153ba58cde981ea2a8da12bee6ac5e36cb3c4419936bea8caf1f6366788894822aad5a56cb29d796ae3b44bc8dad76b36feae93893f9bce6c2a27688d89b666405e3f347219c15cd775c34b04525aea6923a44ff70d7e5ebaa8f4b3d1d970e91bf5f67e8d01f3ac76e0e9182cfd66a10befdf66d6d5cbbc8643299961239b00c7a885854ec61fbf23c44cdb5ddbe4eaaa9d4ec788858c6f4ec956b2f97b2df21f2d48b95b657768860266d899f47b5f9521d22d577a5cbf0694b4d87a8997a1a935a9f9cf11ca2947653c366903da99543d4dafd728f9f5a55538f43e46aade81c8c9eee1e1ca2045f5cff2dbdae746f8834bef73b5497e9971b22d52054f7ded4eadbd8868835bedc07f5fd6bf56c88a0cbf465afc56d0dd7102d67171b6c061b006a881eaf06d3f3c64fc1f41a006988f87da9a62d2d8dfb5c03000d91eae79d54bd4c4fbf3500ce904aa5c612f3668628baa4ae1c2aa5ee9d97218a99142bd8ea6c533219a2c70a575a98725fb63486282ad8d8d37605172e6d36a2c4ad0d9b63e6bd52f61a9163501bfbb31757c1a846f4ead971f16e6aac9f46f4916337ebe5665e4f0cd1fbc778f5fbf7dcf60b430439e56b09a65c10ae0343e47061aab5967be5d27d21eae5981f55532ca56f5e8872b5457e30c54cacb52e44f9d19919e3c55839c68548bb1763ad637754cbb610fd8a9a96f65be7e25a5a88123e4fadc104bba5f22c448a5954ee3d1863c3888568a3b3087da9f550ff0a91ea324d8dbd29eb5b21622e5fb5e4a90b3ad6558894d9d355d0595bd94d856865f20837adf8eb9ea71031dd98aacc29b3e62c85285f3f4d6ddcaaadab28444ce172ec9eea561f1314a24f2f31f870a95bbae909d1673e8b0cb965536fd90911c75ea74e35e84da5e4264499bf9a304117997a910911eb866d13834eadf6b884283d771b95b27ea7ef9510b9f41a2e055fb274ed9310b173a7a6cba670458884a8a55bc81d55354e8747881c37f6ca0fd73de36784887dd9a9f4ec8a102d6d6fafc165de14362244aa75e4e418b32144a9a2fa96965321442ca1fba79b62ebb83808517c7ecd952f65d75101217a56fd5a47f8d869ef0f226d05f34585ec25630a001f4419d56bd9f1a5988b5301a007517284fa566e4bd1a554b188944bff913d42b6e9455844a9546646b76f9bb27f4594a25a71d763d015915ab6545d8470fda7d70aedf5abb5f4986345a49a72f85a212f16bfad226271458f99ab952e6b73442ef65bb0a5e46fec962aa2b4c9a9afd79791a3a722829b9beb69ed3ef52e47e4ff1463ab35e67497a3227a4af1f3426e2cb73b8e2831ce05557a4aa6914f11a965dabe9ab66a1d9529a26ca79e8aa5c7ae5682235a2ba60513fb77eb3bbd11b5d689a5c7aea552441c1bea5aff4df9c74d6e446a177cb0b9367ffe265244ecd636abc7e5ede0a636a2dc06d7cac70a2ad734657b8eeac58cfb2b8a88fdbb76f5223bfbfe8622d275da5c528ead1d830b8a88fd3b5c6cfd6eeac2fd44b49ea666bb223bf3e5d6136fe343d88fb1db4e440b3657d6e25b995eb9e544b4ebe18aa9386633b7dd44b460d2f71c63ac5fbeaf2622b64e77216330c5b4bc99887eb18aee978a9cafd562224a2ba5740ea3d3f83aed25a2e8b13da69a6ab7db5b22f2e6b9ac796cce79bf12d18a9bf6b5f5e2941aa444d4e2f3f5e0dbd8ef253889c84587ae25d5f039b39344e456c2f8da2a546eac45224a95128bf9924122d28f2c99db6209a6b347446eb597693567f594983a22dadef4be6dae57cf2d6d44d4d6bed4f2b97ebedc951191ae8e9befb17d499f7511115b5fed73656a2e97551191e64aed9d52aa23eb6a22a2159d4755112e4544f4debf6d96efab9a4b3d4414fd65a64ba7aabf520d11c1b894b9a9c80f5d4a2d44b4acba3dee055fc1170911fd63c9ef62be15f7c141441ca3826fd7db98e23f4144fc5cfc5c8cadd6f85e20a20859f682999aafa80f10514a96317eb6d55ce8f6bdf7536e089b1f22c8d6a56dbf5a1fa29571dd3276955862c687a815ab98e2abe79ad97b886254f1a5a62bf5ad590f51b697d2e218fba5f5290fd18bef9aab846b69d2c543c42de36bd385ada9a777885a4b70f3d3657aba1da2d7acc1876f33bbd8518748932b8e2e41b8b8add2953be810b55c5fbd58bae3741c5779c71c22e7fe1efd5972a7545ccc72889463ce95d9f3f29751151f76c421f2ef5f2bb26d4a868fd451d1685c3c0a0e3be01045fee72cd9f3bf0623f33744caccf15bfc8d17e4653744cba95330c296d48e36446bb1d2d4725b2ea6eed78f209acf0e36444e71ccc458e66e73eb6d5c359cb84997bd1f92d61041b554dd3bf6bd1cd3a88628a96f5af55a5317d5ed4843c462545fa9ad6a4743d45c7aed7d29a7dadb72e37a86c8757f3dcbc6eb5b2f33446d717bab78b5bde3a46588d29b71774c2f5d838c0cd1eaf6edad96a26ea6541bd75431768c01b3838d1cec58a3d5d834768841b9c4d15f6cabc5f41bdf6247187a9b572ddf74b6566aeec255eddf6b2ce37298700718a2d49847b6902d06615cf785c8a995ff3229c76c6cd70b11c7d7d63b6ed9efafbae2c2e2a3c8161e4f1b2393d9c28e2e446cfb794a493d312b4bc10e2e448f25764ead720877136e214a6a41173b2af50d66f7c695a5b51039f84a5f36aba7b75751b12c44fdfd71315609b3972b901d5888123e53e9abddb73d569e2b44de9cdde7b3d5d6b9358e15a27de511f2ead4674db971cdad420421278351c56796947b2f7650214ac7d255b68ebcfd6b0ad13f5e2ea13ff7f89c6bb4430a9182db6ebdd478d5d2f71bd728442caa420899d25ecdbe1bd7c5821d50889e3555f0e1bf4c69175b7d42a430f999da77fee9ab37aefcc50e2744a98f21eb96af7577f426446ea9b74eb5f8187e3f13224f5f1eb379be67c712a28589a57ba7fafba9698712a2071dfcc6dd5445f57c3b9210e5fb46d84a23db818448bd52ab8eadf6c5af6ac711a2e4c73039cbe7feb10a7618215ae93f552f06ddc56d998a821d45883231c796b9d76d5cd9f3a8b080b18308115ca996666b29bac2b4afd2f92817ec1842c454a9a50e32b7583d99102267a9dcf74bca1d8449231e5cf000b27e04d110d91184c8b9fa62315b5397d8fa0e2044ce3db7d6faab578951290f205ff8f0c28b0c1576fc20cac7db7ca563a6bebfc307117bafdcb2d2e83a3e5d1bd71d3d881eaac854c3b451bd989a462578128b4839aeb4ab13a6d65c5a58440d6682b1354e113ea85e11f15355f898d963bd366e5c5b3d9a8f87b3d1b47496a3a271f1b8228a2b977289a55eede3e6c635b54f5a1131c6608c1c958a30766356448e654cd95e57672bdb5544b0b9aec831b3652e7b7344fee938d95acfa92262bc123e37b79e8a6839c656b3eca59ea67e39a2c698356fa65129d64c4f50a1999338a2e696df7246ceb85cab5344fa9c5acbf0bd5fef6a4f4ca1addbacac526f52c9cefdfab98e8e15f377de720247d494c5c8e06b30a6e7f7276f446a63f386c91bc265bd2a9c1668b4148cf345e72e6372e585c6891b51f215bbd72fe6b958d48debe6a342e485741a90cf64167bdc0b0b0f2fc8e0e14e48c1c9d3972ea5995452a7b9ba9e6d7b66eb632c276d44e95bfdf6539ce957a68d6babcec7658c935144df1c73dc6264cff9c165149c882272b56d29b776d517fb0f45f49ce04b9df113f7ba088ac8a9abe66ff14aca6273279f88b4656ab0adf88c35ff047d7c5a5e389e88b6333a866e3363846bb1c7b3fa3b3f82684270d209e6d8264fd9d431341e8c4c06a2f19b77c289e845d87a59e494bcf7e326a2c529bd7d75f398366a829766ae6de5a5aa29bb93a9dc8e29b95559cc44f4f631772eeea6cc3ac14494164bd934bab3c794bd934b4490adf490f94a969a3ab144945c7a0bb2c51ee72bc34a744a2fd7bed6ea7daa764209cda5aa52294eab137cd9583674ca5f7a9e4c22822d39a3abaee69c623e85134944295dfb7bc8bf3a75b68b4b4bb93f826846a070128928bad72e798a29bed456908856aa7e75d7da6c3da74744ec1f7b4d3d63cec18dd11111b3c5edd235e746441bd7f5c6175f67aff34c2693718fa3e1841111e4f7043d1fc7d70c322e7868780009830717994c26e3b21611355711bab6a7995e3d5544e4b1e97faa947e3731978895de4a9526b69e9ad42a95ed4913634939a85c15119172b8dae3f7b45473ee0f116d82ee9526476dbede1a2262df9139ef87dfde7be1688a384d915488a83de595d2a16fba564f5db0b5ca1421a28dde583f7d9f7aefc54138f51e546dceb675b30b02ea53aca9b792f2f6af02c12939f72653ddccb4f7a352e97261dbf6aae9041011dc9451fd73e9c14eea7f88d48b1ffffd730926f8da0f115b502ddeb8d15d37eb491f226f4adbe6664b6364322985133e44ec143eb8ca3b552d6fb5c2c91ea27f979e991b53abd3b4ca60e174bcf87832193d44f954d2a554a7ca64929ee42162565075c2b878bddbb9b0a864321c153c44ae33e94bab5c2acc04ef107deb7ddfb835558a5bda788bd2ce7b929fd8216255f64cfda77ee5ab3aef585e7e74ded36963ac3edc3ac466ebf5d99df5eb6d347ee32774887e35b5f1f9b78c293553499d43e4ec564c4a652bf70f5f6e094ee410b137a51ed4c5fcda828db5272393c9a89cc421d25fb97e2d73ab13d3c7e010a1bf98db1c724bbe71d5703e1a1795333c2a6370f206eeccddf664f55ecf4d9d366673aefb8d2c37ae91a321e39fca4a198c06276e8814bbb75cf26f98b40d115c1895b1d86f396e852d1c0f0af64fd810bd181bd4f834fd1d33b70a4fd6107562f784ae50df5aaece682ca97ca2864ee6ab947a5aa55425bbc316953fbb72ed64bc7165e17c3c2fafd310b1bb7eae787dcb8feeb5d110b186fdfabd72ecb107d3c919a28fee1d557c8ab97cb620878b1333444d637cd530bd77ebbddab8725496f7a40c4b861d43a44b354c76d9b9fa944fd820e3648de8b33d7dced3fab24ccd69d8891a9a394963ddd3a667fae24ed7ee546eb95fddbd1331e8491822e5a7edaca0f2065d7b2760d04c3bf942c45023530b6e6c986fe18917229830460895be3ee942f4f0b1732e44ebdf31c72f2a97cd29df42a4be56640e9b6d64d74fe3440b51daf63023dbd4943ea70ec78b33389c30d686e1240b91aaa4cea56fd85e7aafa9e05b54f0238806c809162296cb6a754acf65bac6fce40a51bf6aaaade4e6a7aa21678c95c6a2f2be8bcd47c5059a132b449029d7aadf5a9bafb967320f3399932a44eaf99ae3f65f1513a73ca14294588a2fb695efc584eba71045b8944a858b41c82fb1132944feba41a560cc284430b18e1f9fe65a89b51ee1040ad153cc9a62fb10bad62f3e21726f13b66ede296abb774204135b2e6a624cfde953274d88febddfc6a23b06733d6a3a1c4d4be75d3bbf4e98a03a7167e24cceb2d752adce2fad7eef3661c2d6c1c912225ff79e5bc376f13f4125442dbaa7362e171737fb3a4982e24c2a354b96962a4d0f328bec3ea64d6eb9f97c9a0b0e4e9010b5065f74de6e95792f7c59f98e8baf93234419a152f8cd94f27344bea5758b132344a9625cd756e59c2afbe6d3c6509b4f7351453eab4e8a10b94fb9ecad0bfdb55bf1bb1872428488b1b243b83abef55cd2b54e8610b195227b4a35959f14a78d2b8b4ae7b3b4f3f1a4e04408918a8b153ef7d8324dfc389d0fd2c2f99169e1b464322c2f2d8c0927418852356bb9dcaa4f2c21e33146183c98cb0910a2d751a96ba969822aa975f28348a95e9be0730a7d103d8fcfe1afa8bddbe9a9334e7a10a5b6be5f3f3b6952ce5844dbabf635b5f698513bd540072c22854d375f54afd63186bca2e31591bbc79b2c35dc16d5e38f87cfd0e18a2845e8ef956b8d7dbffb5644fff6455d2cc29796d26545b49a6386adedc5a7cf7715be9e346972a69acc9a56aff4ac9db76d7397d6c695a5c3f182a5c389ec083ae6889a2718614a2daef68b411daa887e3dcfe4dafaab66bb5211c106d9fb772fe14796518e88578bac90a5f7eec15754acc4343b29953a75f76d2f4cb8d873c571449ff4c1c5a23f4eed29d6718a28b27270bdf6773a8fca52cf8acae7c514d1eab64e572717e1881eab6abc9ac1d6defa8d08fadae7f450bd958abf1491c2e85a57e326756db10e37a275cd295b9b6d912252af93aab69e63ed55523ada883eb16429f3dfea2bd6318a28b117d75731766dd82c8a88adf47e597c8b7fb964459a0b384480281da18836554cd1adf8d66bb59e4adb7091c974aa0e50442fbef86b1dae6f75093f11adca867163c64d551f3d112963067db5e6e88cbdd889e8d97632d7e2a726d89213d1ca0f95b8a8740e48451369208c822086611808eaa4580001d31200302028228f86c3f198545da70f1480045f68566a342e289246a2a1481c10055114846118055110023114c3200ca20da23300d8eff18b5d9c8a96bebbae5ed022b32bf7343342588bb4ceb29f4c104b0a5d9c893fbf6c49934ac7605397fc5867b61d13e4939c01153d2cba81b8d6ccfc54d725ab2be4b3fc55f2f9e64ae54ce75ae194b9be72d2b9a660d660a5a0ef64299c69ae554e39d7174e9a6b2ab3802aab7c73a572a673ad70ca5c5f39a1a3459e78cd2d7fa2df29d8900d9e71668d08f09443ffcd8693e696aa2c98c92adfdc52b90804000d52f48a7a57d59ee32afebd4275159fc55f2f9f69ae54ce752e09e737179573e9686658670eeca2daa488c889542d97818fc062d43c1905d543ae95e775cde6d41f48c8c42a2d477c4a131353d5e58f92ef37472a773ac72a783b5022ac21c46d682024b6104a446b8280685257b284fd7c8d34cb3495986e5df92873bf72a473a770ac7b4dbe4808703b70e58581da57a1731697ef99dd05e1b994a570a8f4027e329432708193298ea97e909e6ab4055baa60610682a50042b6faf14fbe53e8ae8f2ae3fe784ce4c3ece0495f3852be01d5e70ae28cc5f76eb110e9399c7ae354a6682ab1f4dddd28942d313a45baf751389cca47e22c5c1304dc84a1f150133a7ffb1f1941d8a9f4f7e93ca20e73d0c62457325574da322be03694a0595379f73e7072d0ee76dede627c619de3184ac8dd042a695d0135579e331612eddc39e20f95d77a067d0c804ca7a708f5958e191625f6ebb0d55b85b8094a2dafca225b31dc398f821ebbc801e4dc090e5ea4d19d04f8c72aa35e19a2818e111a0e4404513108ef2574d02675cface28c8a24fb9928367654b50003735f2512ccb1a6b8e06d554936c144a4504920c144d27a92ca0de1931adbf7774f4e22b0e97d00da543c6713ee0bdff37e3ca3dcc3bd46e951a3943b5d717dc1319b17f428b7856119debd787718a336737521570b8c78722e49b84494b25cff51cb7c2e41bf4f7b1eb08d2a47eaac5a67874e4ac68448931854bfaea84f5430cb8d1686e63c97a2140b3a7c5188b052d87ef95413b47e18ca87cff81043c270373f312141c4ed0634282818084641e83e27be295d0796031414ea09419bf027373857b45e78c8edb0c08641ebb776e153d076b27360db88adeacbab77ba07a2113d30648345be41dfd72c74f9e7b64bb751dc2c9fa9c8200eba9696e5a95658b90b0d456a0d415a8f94b873c7ac0028130346986526e2e9ec24cc3b3c113b4cf6a038ae13cec6a28e0353fe3b0a561f2b7fb3d2f333cb28ff2a8a7a80baac124dd615b26f0cacb7da46d9949fb841ca369aaf65ae9a4b8dee421c67f06a1b63173c4be4d5f8ccb7cd5a2c846647e90a26e54f435087837551056ed6ca268d72e216993de21794518955407d8996b389d82a098564795e7122fdfb8d7548d8b0e21817d70030d647da9b10cd07df14917c3cd027b663009746b3ad89c6de1369c00635a01445fef32e17aa4b455b2d1815b28b92a9c0be7bf014115010b6cc867d602f1528ba011cdab39b1e5b811687d6abf250401c819a4e8d01822e6b49dceff530f1c12121575b586d6b25182fa5712d039e4862db020a24025127a75cc8c28c845627c7639b46644458bda911097988f314c58d253b014a2c17b5698b91346008e8203e06d95edc59aea4fb100f2861e3991c325c54f0c66420c10c88762da121ce24e34bb8daa97dc63c82604edccadfcc58aed6f43fc89081568481cfec0e83879cf1d099c11e7e950b815f43500780e6f264b4b8dc1b416d2a56583687809f676c74ae74b12ea918c61082f72cea8b3402446a31033e4092a186d80878bdbe257c1da34632c1223ece12882dae6f42b46cc233f82122cd3fc300fe3b3e643a3ab11af29b9a9808763ff1490cb5effb96fac6e6e6183dee83cd7ac21d102c70d1727c5158b02bf94858f67fb7d0344e137fe25302f81a1c9e86cf40dfeda02de72ecd5d0abc7b9225582570727051f8f46e719c5ebbeb14c014e4b22578dfd1972b3ae2ba972e38815f43af4d40966c09d6c63d12ec463b32870a4de011ae6c41c880d07a170200d4dbb4d3eb0139b7918af111b92c2126a8b0e00d101bc1260f577e3928cedd00e72fc9f675a813af7e28da1c10879485c46e69ea09319771785696121efc690f0454d29a5b960fdc3a1315c19bb22f7c7d066de3644819b95849c42f0950719a6e38b4b8a33620a4ea84d8c186a7622071b8e569fe630f9ecd455e8f748b44d44eedc68745d2213164d9758f03710196330a98ee1e12f6b2274374db497856b22516059168da22d2054345b1db564de9cc936efd6e63183e137efe0bfb1083ce28cf8b0912ed223e6d0d75cd1d95f454f09727a0b9c616188abbc0825962dcbdd286f02b2f2f12da2d974af0f65e49f63a0a26c7944315c8e6d1bb1358c0f269e217cf7d8c5d799c70c7af509299952d67c7e103372755277499814a832a994c80deb6a788607741b96c754641b25efaa445110a47d42565c14b5b7898a4c681e6db06bf8f7af93a00020670f53d30dff9526a307259eb0c48220a1848fd31074d58f52f84f3de5e773d249a14008558dd104ca7d9664f22d461801e3e19b0697fa594d4fe90809b22ef173456f988e328ce3e9aa98ca1149e58156663be58c1c5cf40e3ea81d3d83b78af443562bec3bc379f2de8a2ad22c00e3fb0ee125cfb51cf04a292fc56f279373e63879b3820e30883a94414325e1b46eb4f4ef857dfa50e0ff46f2ca1e6900ee88697c3527cf84a74495fd43c4c04691f4731d55ae796c1a2b68dec9106dceb2b2e08578cb883b082a5c2dd0ca3d954a28e532f2107ec158495c5901aa079a4693bc9a8fe47cc01de8b981afa3ce04d1760a2ae3ff74fb5824b0109599cc323f01137248bc678b59d7e8e3412f830f8c645e4e86d7fc26bb6c0e92a33b279785c515857fe89dea9d9601f06ec0fb2b7930d0e16639961a5d682161f50ab6fd42d576d8098698b423f6db134859ea373e0257f96f30a5fe956e9f47e7ee655ab68454a48d6d263259e29c6f2abe2de6853be78916634ca1395af4a18e865a586f56dbf4b2ac25fc0b7a4cc0089e4b7ced86642ad28368535ffa3b70786e90eb802bcd85038ddec3cf06686c944303e1322d3147c29ee50f1252c8872bb8e868d730f007d3b4d0d6adb27d73fe8f41629be5d44ec1d0cfc0900af6b414c30972879bc940eeefb211b2c776a28d8f9e064a41aa9bdd9e58f08084ca51435425ad83e2712654fc44c048d9b6027e919771d7925a49aac85a5bbdc964aa821b9b6da11bee383ce9c8238f3ea667c437ea106e0a908cc9aef6503241241ad55ab44170d614b60f29d6b50f9b598e9368789237ff3dfa0b3b4b44b7675dec55608a4bcef84d764a0f2a35d1955d37cb06a97aa6fbed445a868eb93e4c63c44a6a43718b68534053a0991378588f8239d397af3e5a53a686e9fc3a71692d05a1b11296957a0feb728a34b9a50f52a8660f0520025679e8687326e344eec09ceba747239e0049deeae393d7d95e042c5cee7a69d2fa29108c5d0f49245b05b22d9f3c7b86db8d65305c47fb390a3ff4300fecf0b79273eaf4dbdcc2ba1601013cfc931bd3cb85f516e5b2672399246be2124ee19b0703bbbdbf28e076550b77fe66aeee9b6f9ec485e21000440f8d64b76b708f148864132eedb421fdaa6c7f9e3ad6e4348f5f49344069237683fa12109c0d3ccb39633d0e529ea1a08c8ecb0d50ab713c157438493345e8ec2639dfca11749c03b822f1ba27da43d1e534e14a2c2607bb6cd084311463853d0ee7b9cba101d695c6b69929134cf953cd19cda382e365ed88a1df8bda3a1a73a8243bb64a6147a072e86331af9a57b05005125ac8fd5dcaa4d8ba12a9d726739abc19d936e5d2b50b49b73d7ff77ec3d6e85798b43e687fe8f873a4907c0b1efc0e83f982fb19810bbd6d31d1d59a039cdd34485f089c5222464195c79dc3feba4156cda8ca7608eed411f2076f01448bc4e198750b0fb9bb21e44a197d203f9400124c04c3280a1e5e8e2288004d04307a05130ebf93480af7cf90098f407dd6c0cfe1295eae2466fa15d65867c168df920d6b913116c6a30d20a08ae5d162f19229f985a040bcc11803934bf914d9f30792348646f41af541954decdd7878ce4b7e0b1056b2c3c04132e23691debba7709ecd3721986f374ded6e248ceca2b308985d562a90f098ddcdc9cf344d5ec9008a490d29c9e501461a2a7384c3be6d586c7ae1883a13bf706bfb2c6348fa576460121ed6caa71a199c0b5b6acc8ae4f17b8a9743ce34879d3f0f887fa1f7271aca914f9633d8ba96615c8e65aca71dd0aafada00723b60c3abacef8f870463a917ed34dbdceebea21355b7e688bed3851629dedb3d2017f134ebc9eba043c90b1cc7ab1d26151ffa66fac4dbea622bb0bc0eb2067ab2439f8e16e54b9b7568c31250f9d417c8df9d56243293d5e27c9217eaba27ac931227032ceb44b3b4f140e5044b486e977dac251d0e95fd3a57a60e358c333d407ff124a756dfcacd2dd6a67ece5b286fde24ca985d831c82ce0f23ec5cdfacc9b12d8b4b3a5978a3e3bfe189cb63959c9d715c1ea65428da1be75dc97d64ee4cd01d33e6000592a954f1e7a8a9f7d0209d8c85a3e990c25222010a9a1e763f6f41006661084de109a70e78191b89ca78d7317e755a89aa0e8534b53b2a41ce83d9fea91d05b690f49562d8513d15e061a1fbe01a08b1e678a1e308141b42e106267de204b2bd06d84890cabdd20608472e1a52175856d8420b9aecf22fb257226ead43b7403593204a9106146370844f466357fce4be70ac648fa0127e3705a12c6943df5e12d899b35e4ffd9859f86bbacba45afce0118963cd963223d3c60ff07861cfc6f80fc6f159c1efd41756a52aadeb333671da17b4622440de56c3ce01229b32afac91001a30cafb852ca85cfcf78ab62c0724768b234ca68e9723421406298a76a39ac80955683ca10064ef5bbf0b603b7acef6ef7a93f422f2d4419be92d2617140aa0d7605a3233cca5a3470e8d7c4652ef5e3e4c0e2522af6651a5e0be3e8e8157341e7db16fb7f4e1bdbb0731378f6deb0ace6830ab0d6fa068d64456b864c414f8c2d4eab80c4cca42c26e82858cae843f0b0665437c4857e013a198706ffaa5988651d9be690b14d52ef690b84f196ff280ce1ef6a87dafd595eed69dcb0be6c9a9814f3e0af955cb9c2b0a2f62f6b521efa470699b92c3aa62b87763d83345dc88a7529029ed11d24b3a14af276134703b9fe85ea0420228a7f29507647e4830aa8111e46a176a793330a098be836113563a4144503b529c7314ec545247c7064fa1fd0003e362b31e6520ba0fb1369dc7d1b8f5a85004a9291722e5dfbd4da1cc6a02638c2ecaf3a20e2f5b8a6e5b9716fa63897bcf8577fa606a4ef362e8a36c30c71e993eb0189a80842fa9fd5562be80a771fae92fde6d46238490657fe10275fbe9ead435fb00c281e25287cbc4d3a60163f0130ce520896a488642b4c2e6832f224f13208ca2086be1c403bc67871f469505cf1497ec6734201490d13a79e6755ec68eb95ed5ad6403657db0bfaed32a10415e765610094a8acbf5b55baa44723dae62572c997d137130b568e6050bdaa908f207d0230b945486f70fdbe97cf57c499b5b189877255ba2fe9086d64370af26dd619cc29e5d29f86a2a2afc1b06b9e0c045c7c9ab0dea4a1454788308aece880c2207ecf0cb3cf339993073a0e528c66ef727034c15044705440cc6fcfdeb588429cea911b8db0bf172bb6c39073afade7de865477e90b21968552a286655805f4eeef73a1b5b7e728af3926534d7bd49c39fece2db90600aa39fe1dca2798c839e03182aa093b4a50d6eac26206fe066e11cb4372cb95ce1eb096bcc73b4b724e343dc8432a98c6570846b5f9f30038080d579c16302898f743d62824d9ebc4da12091b86af0d021b88f871d4599c8e1390548ea1acf494b32b4ac108e522bd1b207d0e3d591ddc38aa5e3b04af787fdd27ea2fd3b0c9d8993597bad7d6a574953c1c3826df510042b38a9d809cfa998a6aa2dbaadeb00ef52548ef33a868439d1ceb3b3601904f76330063826b3643b827e66aef0075a817bde108e494be36b48659a520700c45c620da4d4f4252f7c2bceeac48422486242443ed0ccf7ef55012ea2ee9109b90afaca905e1c70030c55461ed0f22eef62dee579370748e8a3359bb2b25c4195cd24a501348a05495030e9beeb7a4b4261589fb2c4d4e93c0278bc6bac4343ba34d2e790071d87adb6f4a766892ce914ede560ae5c29bfbce660c2d9713072839e438956e95040f10ee551955616a139bf94aaa3076fdec509c7a3f13be9c64d6bf18a51d3ec88b0ef52c881b4362795d291a015e1bdcd1762f419d06b3d37330a9f317a1e7a9d3c0e56f3fa23eae0bc9c0ac565a083c4ab9338f63b557ecefc008b58984f9a35c08c20d15811e8b9c8f9a7832ff86020c0aec589d56e0b8ed81738146f7eb59d7f9dc9bc57873fab52f3a554500aa3ca68eb6af1002f64abb1fdbfc8d8745d1b3baddd57d995173156de4692cd645fa618289be5734e871e39bcced23a056256c50f207a774862b277df18b629c2030ef1b29fc33ba6d82d5afe51237bc7282fd5301140530f2ecd6d16208caf47f7a805ab3689730a5282ed79b3ed8bc31c72eb0dc55ef303dbac3971a357dbeba1150a26c6445ff1bb530fb932de3fa052e37fd86eeb6934138c8bcf1546d285f65dcc95191fc0abea8217a69b0b2470f7c044c0852d4a8891503159145fc23ac94cd5410d1f442c90e283175bbbe4842d3695b550e5d5b2afda851ec36a314e30ff4d09d9cbb0a13aca5b3c77a4369318f01139430a07474ae430b77e24480aef0b3a16c132ecf0a41d9bb9c86d3f65123cbde0e15da5d54215b60908e623341cc0e011bcf21810aceba50818b1a3e2c85d43ef05c7507fa59a2875ad2ebcbddbf3c919d2e32757ef71c5e90ec1ee3100a759514cb195cbe45935cddcc2469dafe65d7ef970d082d8ba3b25d96726024a3421d73d9e99b2129141a85f0361088b44862bda337410ef221cd072639dfa6120fddf5fb483e86b7ea03a1d6a476c2f78f5c4e9651ecdf5ae1553bdb202a651a02ea2fec3debd82ac3b6dc00a546fb530e3a4d91d9fa1cea95fa7394393574eacec785259434a4d3ce341fab9c8c8fa8819130eddb0f0e53016e7f47660ed88a82364ff04100da3af98003be0f6492fc998d4db300e657eaf7579c7939883078ccd62dae5ac513e70f61e0751ac462e7dbdccc57473ab3716d5dc2936f4281af2e76903e19ccbab06aec3a03b36df7e218263e4a00e62744e0ad59a5fabf80950c642e126227cb2ea836893c62e3cc78323da9e4b82eccb68cf157845282aaa4895867ef0b1f033381a42ed663727f6e0de19a15a06b4dc87dcca6f816cb4a60ccec43dc4b0177ba33914af84a73038168ff3a1689f90a15ce41775e1da6195c4603d38b4418e61df1d6e0aa15f40fa0d88510388f5b8578a2aeca205d8560eeb02ef70febe2ac91103e6e30324c97e7a2663aeb5f8c84c5ad1ff7e0766db43f97f82aa991748d4748fbc2945f539bfe4f4a30e2a9b84070a83cc40d0d3d19e9b3bd85e0367b47b84603df53218410a759884a1ad4409bd47e264351af3ca778902184c672d0f43a4956489fe863d03429ea3286b9599dc48d0a2c180d691820d1d274de77f748047c1aaa13fe88ece4c6f76e9ff8391b855631e378cf82f387e460d929872c1f34099e6dee7079a83771ba873b35d9ad2bb0f83d6f9a1a9aae75c9ca0ad5c67f011aaf8df232a12467f25bb7a6240a3dca237ecc040038b17cb5d5c4a40575012f1c558cb29ccc9b8505b3689a3f683f2f4b617a709e1f2544dd4b096ae9c82d2502e8581173d66811947e4c96a061757f07ca04ad6fac2896a4fbb1d00c86b47df24052132dfa79a4baa5642d6cb0d6078203dd6944102b358a9a29203d7f06235b6b8c423dce19157e0abfd4b426c02852b3f6bf097ba686ab803d4d515672b00f38c7d9bd448075ddb2ae6364700e2c46aef284561153fbb582d267005ccaddb3f37a2155210a622694188db0ab42ffc157d49b5df34847f2da80d65ff99d95b420cf351165b8669227422b49250a79ae1315249ea1d1b928ff57e8ad81c2fa496771e94bd083aebde90b9f7c462df109df3a6279182c0e1da7490067587a57ef5423e6590482174d609ca094611fd8b33eea15d9dca64c27e2457833d0caf7940848b9ae9ce21883a8637f72ae2a94b90dbabcf50270c10284964232dc8ccfa2da338042f2f543ef8d797529efbab5d67c5cf71846819526326baf09d5cc73ca4c0adfb40cd19eda2a27f2322c02b8a5b158cdf7da913f58f317db7da5ea55228a021e667405643e99fe8299e07dab2508b75d74f695a5b83d440e3a8ab4b002c41a58b01a7464570db41951a3db55741c4183325c55f5191247936d68d65506d486e9b64961862655e3f943a1305cf0157c6be6dab06a3f72408f62b8020686e6cec700144cee5dfb92fefbae5673ae88c55b956adf03daf6c53e8345eb31e57aad82ea9d4d8a6b22828ca83652a4eccd2d0ee88aeb9ee034af41200a2901857b4fae92e29cae0a8e412a340fb5837638011b6dac25656cdfe394c04b69be2258ca6687d64607e28c5da108428810650f9f7be56c65cafd8f0637621e5ea8321c109ccf160f86488be281a04129841d5a22f30e71c0d8fbd15f0c8001fe492275791f0b37cfc6caeccadb0766926a33748200dcfbaa7035392bffb852c65d9600de4944f1ba0df54b574a73d91248f93a494612c4cbde675bde15fc91f2920e30ff21038776fa98a3e255a911bbd05bb1026eb79a9bf6f4b4d5eaa7ab100a8d34743d25bafcd4924a4a13480e09774e0296ebf79599c8c76d1acfe7ea03d4fddeea6187cb2432f3e5d5a54fd2e6cb245eea58653a3eee6a28acb58f3d22f060435d644390bb50c325d61a3b579694f5ae4bc09b8a8edfe110c80a5d786958fe104356e7e9604a2c97411d09347c04e9257b3e841c31fc08c5f0bdb69cfc7e274d2e704647be1dde03c3b240411dc07da3a7374de4e418f5d792b9cc0bd07c59f80c852804bfa563e208f1984c260c64bbf3dc7d3ab91bb347ce484db860a4f3530417866a3ee54444c1a586a63af859de46daeeda416176d7a11a8980e57fc64ca30a1e0434b344ad4120fb1c2f83ef24351b6eeffacdaa7677a99ad5dc0e709a799ad791081702427044c44157cc30994546f6ae840e2de1cfab5c324f2980e09c8618e240862b9c254859f89c61d03545092996ca8ae3edfc9bbec16bb3b1ce7e32eb5e5d249343bdca5d1595a47cc1af965d2b150c8750e40af6079d765a6d94533667152772401029cc5162147d5aee52546af94a514c2d3f3cb10bae0c092bf27b3997e7666048b633bc72d40c2a8bd6ecc7acabd9d26cb53aee54101aaeee1a0521528568f6f42f587995286587a5fde51bd86d129fcbfef89a5c2ef54abed791ef963f784c5e6adaaf4b6c8a7ddf4477e49db21e530cfd9423ad50223f17463a9f7e2a6c4705191ed30a00b8ddadd7cb677c929a454247f34cedb99d71ddf99663e882a2d27d1b603abc8cb0d45a4be7153c54617b2ab54b52c1975151b05b3b990179fefe9693c95c2a026baa42f9939d664db5f0c79f42916d6a8b25e2b35ad30ac730ccd344a30c38bfe43fe8f2d63f99e3af5353afbbea54a65902bf0e54339d5aa1a290dcf1a152370e4d7c6859849cafb143f356f39e15ff1e158ea392dcc97fe9ad5a2b7653d0f1ed6352f4adbcd92144ed66bbf3835cdf95053816f36c3ccab4432d1a65d72a55c1c72effcbb08b4d81181590da1ff492203d82447e34d86ff4c37337a792d710610b0a9c778398e92002bd072ec128ad55055e4cc71382230d8f682d7d4a9c6b43f176c29310ad692750c1790a22d0c8dbea7b4cc5132a61ea36cad715b2fcb56a1ea14558d67edd9d04e33931d010d03f56b96fd7bb3a89bd837fa943eabc5f9c242cbd9e242614b180f95f1772fc507bc1d874827b2747918989153a92fd296137318e80211fdc34e48cbb4e1f73b30bce9d375e26fccc8a770b6bdcc2c2ef22073301ea7d0bd44da88467b2cbeec0b0b84ff9608d9db3e2ccfc3014e5b03570878908ab8be6c4903d9be4ced0237fe2f6f457db50490eb41486c1cc22186686de36f841968749efde03156a14a2a4eec04ce0ec863a7d96a1aababbc39bdaffb5024ddceb7da530c808676fcfa159fdab4b9c8f30e0f1a0528ce38badcd5e387f41ae4884f3872ebdf20fdde3e060f760da3e09f1f55e8dcf3e82875cac2d62603b5bc7ef07afe540c57d034fb332454224b3a542a9c3f2121856a03dc04685c129416f7ff25ae9a54de8972abba196008f0e426458e21a1b4272a59a84b2e5ecb1a0a075b361a4b403433b46a5b864705861c64f9cd500591f1d3b31b725c6aa1be920ee5ba00e1fe492cfb50e4ed1c48328fce5e9f0ee7a74cde179eb28c7a0e1333a72b29caa5a668591772e670cab6cf88bb054e4539390df9e43b210f12a88addc5123edc3557fcdbe2d45653a99987426b43d63582b69a0b1136d7d9d82d7b29ed0efd9a4a70206160da1e00f70020829ce6fa96c3a443a0fa69f86560ee71c892be7927e3180b04d0bf62a1dc40f7526275e1f7b102a288b67678aed2d292380d1fef20fc9998c3f5425c52767a9171a75f4680908d983133301f7361606d299067fd476676e105508b493326252d9e3d06380759a803a916c3c6178037b7c408f65c721dc4a994c4324ee9a727ff18e41dbb3a68b9ee9e7bdf045149e3445539e5f5080c0fb648c7e883b05734ecdf7d547f9d9f0f7bdd3ec5f0172cb0c8f3d75fff61edb760a649202d2f34226935ec11672cac403c8954ffcf8a70e109b0db95ca2b76ce1ee55aa5130058cb7734d1cdf0e4afb265796acc827c0c11e960d1d6673856b6413328c346830a8b93c04dfc36cf15df918f65e909f82abe899d01f34b4f573279dcfd81b26e9e1986787ed9265eeafb76c3e6f63d2b318167f1c07c2271da809109ee732232249a61200c14b48a1756db3b0aae36b6eec450f7a7693ed5b97a0d0eb88dab9a579ba6e151a1fdbb954379243158a4955291668c9e2fe50735c652ab9dde0f3138a7ae72f9bcbac067e69c79c4de73b8fc3441f684593160512644f653a2c609544f8f347ea79c7bf5e86314ed78c82893003e835480aef80f6801fb45f13cb56fcce16f7ffe1b4e840e776213a61ab606dccb42377a2284b87c095beae89d01b093260a287fdeff9f323a4d0ee82b420542f2df6993e3b101de14bfea8c623081f7dd42fb80dac54978e0f8955372ca159203ee1bb23f6b9355baa037e7951f929be8fc5628e34ebcef1c52bfc789aefc9aae9a5b31c2bad6297e293ae00960c3bc309389ea69baae6b25c9a887601737fd048059352a98e9ee7c04af388c4d7bf048920109d504aa08e35dedd30b60d201d885436b204ff61a9c367d4e5f5b70ab640a23296d898d096234aed1a193a719c33c91b75c35453746e1f2c725a1d0cd043ed120b3710eeea3a48aeb01aad8ff69820cae2349f03f63f33a34466d6e94e98a95e1aa619a84ad02bc539ee06c4ffd9adab3417d09890d2a7c9b425b8cccac93d3a9cd9b1171db117d4974a98367508257a16950e96b651c8b6e0ae8bf827bcea9aa115b5f8ce07ac4fd2e0f6f56151d1dc65765fb1022a95a2d8ed40ad42190c605a6f9548923151ed4d646cefa4e529728b573c372f48dcd17be79416a6fe17755534aefd7b057db126f0c7d6117410ad7da17fd31e025c249ac823ba81ba19f5a8f7e04d56857bd6526351ba4daec9f92e719f8b29c5be217e26222906451f3e4a7d740fc565853e5be53065a8a60f1267d74f1d7ab544d96de544ef9f422cb360feb392dc5c8c10336bda42537bd62e3e1a32b3ac66a02b6940906ea01714db79b6d393999ff0d939c4c35ff534ce37904db3efb69890823c108728204270602a60e6c8dd030d44e3732f53693f4351890b8eb283d839b2822d22c67a274f0a215a84519377094641bab3968fff721fc8782c5daf1cbd9acb20552ba1df7e42aec0a38d08b07866dda4e920d4f713f9511fb0a067d8ded6479033b4ff2000ba1ae91111421af5004e376c0f00568cd1e31ac48069e439d479bf7d5e797047fb71cc6a976649e095315ceb34d69c5e8c2d521fbd5694c12d959c73a533961edffb1c516a040e2a21a0fb6f00adeb0af084fda4f2a52954c9f338d9465bca0ee716ac4fedf6da440bbf5f03ac2acb0c7ec97a478b94ea40a4b8887836c6d648b28c143fb46199160f841ca87ce0ec8a46eacd8a9cca79442fc7e67e890206a1c061d5f8a4aae891177dc44995f158ebc828cb64daa5294b73532d413c76710693ba11d8c603c5eb15967a21a5c740756ae502b46346ffe81b001280533f565f12b304b118df0b2d3173e9b5ea7d3796358208e5dc5ae630d8393f5c5ee7242902324dc100c8651573accc7d097f73880d034865aa8a093e9235bcd8ec289581dcd12157b04af9fe299ad2a0c0a0968bf5dc7fa08c3180287b6f63d263e1cef078da0f7ce8e3d99a25b4e3e50c95b57fe5c8b81a2d3e5272da8276ee894fe654e7b9f533aab99eacbab5e570b65d7100f27bc639045c3dfa83ebe64e93218c28df216b33e5e57f86dca2879cacd0a4335d1de541fa55f0904bdb5535c03ad420360ffaa6f4308e3ed8c4e032cf6ff105ce47a620062a509db93321372529213f5c5fc1d1188e8294cb2951f73885a80311867e026ad411148bfca547c4fdef6da2c4cf4888879ccd793df2dcf2c51b189575232386424850a0effb44fd7b5d0327f23f0167de611d2c5dc2bbacfddd36b25cc21bf136c3c0209e1e648c61967a58570dd10332260164106d623cd53c6c04d54304a8408b12cf26907eb75dade4d0f79eb8a5846249c90ffd250678f19f9b8aef8248578cacf1696a89872bca80ae5f133e462877379315ee6512fa531dce1f0b5ab1b5b71e622745514c53589e3beba0263a9d03ffe57763023e11368b95e9802ccdd68a6e6c32569395919085f9204d107311583e046e999898f2682ab079964d365d2ae34bfaa5a47402f3561e0e92873705282d519baf1e856e02c30b16a094884d70b8b8a264e4092c53e344270e4ffa00aa601fd625696eb8e9c3bd86c306c942a5a8101cd424399709abbbc3cca3b58747e1e21141ce37c410b7d80bb0b4876cd2f0d995f273f71a696823c243c2199efaf0429830ec61d387a8b033b8a980ddca6ed5b0c9f10c76ef2f45c127da967583714aec0ebe4472c63cadfeaa38baab6528dae9c0bec912890425484dc4328ca82d42571edf4c6a545afdeb6057fac60bf85483c3490d43a50874a4d380a4220eea1b2f5dbc73fdc6a517775edf78e9e29deb372ed00d846855a22c8247a0ca724986ceade20fcdba265957f6efa9cc9d5ba5ff1b75dcfa8fae21530edb3facd8d9f91221ccedcb01cf23d88b113913425ef7a469bbe125fc9880fe97ce39b5dff91f34edef046707e37215fe73819a18eca06c35f8bdfa1970d9cd829b2907485c0aede798e2f8758abc3621078a7ebf22ae1b33143e12acf7f585905f1cc6f5a79ea4c02e1ea1142791b6194bd4cb15f5436808d429d37303b1531a41a8e117dfdeb6e03e28156c152fb2ce8c21d96d87fc29d32ab737839f12decf9b8ff3367da06eb7c3bedddae6ac2eb96361283cbf3a3f9dcff4097d95ee6f6d1874845ce6ad3ffa4042ddafc976351fa644ac68ae4a5cecf86e7a795be784945440e417c166fdc8ccf883bd5010ae6ac43562948ca3d1c86ad0f127871d96cfa23a1114f85d50df190c7745641ef24761fb772b24847ed47ec658d215347bf8106bf15826d880d3ec3b168cb02103da86b56ac83918dd23387d34e308dbf6b4ce76cb523e075b8ddbd93034eb07148572f436aacc51abfd31d37c779178bfdfb34eeb7e4f6b03c5dd9eb0fdce099042005cbb83027d35c3fbccd76aead1a816056a2d5368d29a850c6f9e9cd05591206357df767d50cc0a20a5bc5ce3ef262e6342a8dcb0f1652acff4a6f5e8483f351ea4715e24081f4e8da3c0af9b4a80daa90ae4e69842601961153b0858170c106538f507f8a92f6c9900e9baaf4bb791a0f8c84d3016539ff86e942179c69c99c3f2c0f08008ac350537f4792980285f521f8e034b2747a3fcc6754793d9c48098d3f098fcca65540de73ca71697e9ac20a195e80c3b018b272abe425b86a9aebf6b841bf5d10f5e3141fac8f9859780d71877d95e63326df707aa8c121bddafa132c76f85b501400719310060d1c8210d6afbcef0b3429ec4a359ea1fb9a97827438b9da1f42a300f7406dce7867cb8f31ab631c52f72f5fc4e92dc6599369a56f3abae8dadcb89141a02153b8a8b48dcd7fb966742cefdd8cb45310fc98eaec05ab94b2644a63a1b53ebf62723f31cda6a90a2744cf8e10965190ba3fe0b87b33ca8c47e1f5e518c3d0b8f04ee84a3b3ae0154c09f12663c3d1e8d0a1891745a5f012c411e620eeba323d88cb4653cda67430f34317736dbde02a13525f55886f513e5df60df9d48b39129ba61d60c98ab4ef807cc7fd1c49c7493cf05760f2b03102682d26805d6e9facacb7ad7647e458af0f039125f8c04ae041889fc4ec82f4558ae78e88426e4041c48a3010f56ba270fe2f7576d96b061b6eecc61a49439049187388d6bb0500a712a81cde29e3415f62cdcec9e1d505b41d53b7576f83145c96cb7bfec218dfe90018e6739e201148f8b02069a89aff6efe74ac95c33d0daf151809de3f3a4646267adad94c0fb5473ed7a19bff28d5c8009b48c5f62030af0d8f1098e1b2e9519ae0cd259130ceac3001c523d89a7b563facf7c58700dce277534dac4441df091a3ef99ae72ac02dce026f93d9eea1a27a4203674fb833fe7bd4876d9de4c9e0e4f994517f69d8b119a5fb1fcf41e3de7a784d3c542f0fc694db9df4e26260f2a637c5588b50babf6312eafbfd3e9c65427eb6cf1e764750065b14075ad566ae6a62ebe7a54f549a5d6102623271b64f18424098b0fd8f2e4ffb4006be9e736502f59fb8ed2a12bf031373fd401ee8e4a4d3bf46c21030e8a88e5a11579bea885802be198be02f818965f08920ac91908ebee10122cd1a8791b624f9d0658eeaace34ade12ffb22e5b443507314781595cb797f2c52be7401927d79657888ae40b66c365c4b559dcbb997416993a3f3ca59c653341547d1d4563815ff6dd6398b153bc7ed6753e9e31bd62fd644261c04b4ca7c7f33d60c81e11f0d111f10c8fc918a66ac08ffba5d9848616ecd77cd79b92f2c67d2be8a950dc561d1cc5fc780539b71187129bae08914448f469ce5234340112f7141f2439170e24bf181d894c4181b6d2989b9d20836509f544e44d6f3c6a9487b1ab27d2f54c78947f6c7041dc9ededd251d112b7d3fe02d8da0070eeca8b88cbffbe77cd07245106858cf2496601f089a2f6ea17b96cc041ea02e4af58e8f40c9baddc72787b921453dea71915014e130ba449755299a642cab562f31a2b0fbbd406403f2f8f41ba2c77c995c9f2ca0bb21a23c3590ee373b98e60e50acb43150c3daf28d93f76962b7c252400ecd7bfdca71c6b505cd9b7ed1d943f4acebdb1cdde97bc85d85d1180fa18fdf51e757b849f2af8559c648bddd31eb471b4785aa8379f8618251d0cc5406d4ba49735649c5c38ffb90343b3f1f61ab2db0fb62a4751591e2a78c18d5b6da6424c7f76ab434fabbb51b80768591f2860f79a5cde2f9759822c65ec2be0b45f09600b17080c01ad22005be88fb9484db4381f1b628e3b70b6e8dff8ff9952c57765ddd4ddf41a5f07cbd3073d72713679b89236625fdd83a9011e753d7c14373a8b663ffc79e876a1b60f635efb0b794352562f3c0ee5b514d9044b3157c785feb9c1bc9ebdcd57a463fbcb19f3179f64ec1a2356696e078ff828ca1ca655de7cb35c579d2930b405e14d46fc1ea5cd75bb59f474b47405c0a31bf0bfd70f22dfeffb0bea6d7f10b803484ad87d6bf1f0995d98bce4a445d213315a79c776068325cf277f9cc5395f6749f9d7c4bdda9b8bff671aaabcfa48aeee1d02c7d958dfece69dc2c05a2b9cddafd4a8d798180e385ef7fab75177f1a431241c61a1ea2f3bc37ccc284780366addb97782f5674a27dee4434df58772032bc242d6494d856729a5f001e7a3c2dfaa74c762c441b7b3ac1a87ffa36c291c53ce858236d431d2727bfa1998c227a7e411e2acf89207b07fe16dbc120f249e3a24652e1f5ed6fc27f42504e5cd169679e99c62246c51e5e349f3a1a577a256d9347e9f2f99e31f38bed337175e0daad70ecc81912acbb0083715a6e37abdd0ff57bb7e82f85e8467406dbb9fa60f06a3b05f060eef14e880821cd879e62f8376e1fa55cdea0febc624201a12b3737695546010f5e7dff4fcdc2044f7b5c3a5d38bec3423719c25ce7e6baebe0c37ce7150e21940e0583e8bd36a14ab31d77ece1c019ccfec83b32e42f88f4008b14e6b67f9b37e48b6ab4b400c345d6e154736ad81a952e1ff5f085a9b801de8098cd5739de975778b9c84bbd50a2ad7d22617ed841d2788eb996d8d212692c7ce803349ded0e85b99ab949502d549458a89d3bee17f0c01005a4c6dd93d5dacc96fc54c589d68256235e8cb04d033d7950bbeba4339cad4f97c7180aa3523f9391780f6f3f6e4ec8c251072f631da17a99d8787b0fb7c1e3799ffbef34369fe72e74193d383b2e7d19a6ff5811c8bac99f2fb290bc745c0f23e782e086f79c014c019cab4360bfa554b38adf27e1e80e8a3c54b76a965fec878bd6357c4601c7ae234dfe36da90b482f76db60dd7730b2886f7ef38c6dd02f3f66a8bbd2357424adf34e23704d79e0a78b8d402b89487521f7dda8c35f69c4bc8d10067788fe0671fe3820c81c3a890343780507dd04946126725d4663acfad8f33cea5ad4d99ae5e4b3c23f4d49555fc6f38675d034036f45dcec30d5cc0bb5245a9ceb4754c263e82c14efadbea0fbb9a381bdc6798c7022c2804ed0c225543bbfb099fb0c56542848816383ad24016f58ebbaeb324102786e7c30d5b0a6e78f87b9062fb4d2c05c0c55a2650e444b31dbcc7b99698049c82846158717c12aba19e93fd384a36d6adfe24f96c12f3e0fff4f245100ae68a6538e3178e1f2ce8bf10a3dd1ee0a145f23b2ace2dbdecd7b2f328071807f78d95117b26bb25e85b96a180a5b04e10808c8f55a563dc5b864e0fb14d9ee986a9f86a975ef52c618e9fc8ee49507ba742ddeaab97a4cbc8985cc8d9490be255379b2b273074f385fc7de44f8a85661c427c2c9d4009f52a6f42ff4abf38afe93a3fa896dc01fdd1d7bf57a4fd037b99dbce9e8e6c3f2934ae348a2349ce6cbfc75e75f530f9206ac987abb10c5d0156bc5676dfb416a9c0294e57aeeaa30eefcebfd0ec468f8e5cbb59e322de53ce18883e758e86ee0cf0980ce19b9dc7a8a74cef96dc19f1ac5edf3487dd916e2941ef893c32e400522341a2c7da637c684ded7bdcef2738878c7e05c4668b59f0593287047e164307d00e580ca413ea8bacceec7561f3375765fa8f3b5421b4b1b0f490a067bce2d4ca7319baa1f544eb27cd75b468c70d27faa56fd41b602a2dc76719f43d97915d518a58f727c3c3a398daed20c35cae48b628dd9968faef5a40feb931f39b7bcf6223839f3fa1edeb5b3dbb4da28b2d61b95bb7f55da1f36a055fa4133c266d983c167fb78736415c817dae8fda4e08f9d9ac62388667e22c96b5a9cba6b0ec876dcc03547538577e929ca9af9fbb1220938d34aa49e6963674b8023e0f505a97d9d80d7a28e6e14239ca36dc17d00a8a8496cd331b027c4c4f63ed1b2f556ba0bfe16e29f6de8b6ab6e92f9380f20caf14f5b20d1d783d6e1f1afcf716fb13d30c749b1856b4fc1cd6480210647b3e15b371639d6b49154d032930bf520f44f943b028c347812f363ed66811a7f7fd67ce17f8af839fa1384c23b430f37f676a2bdf63fc3dfaf7cd73f7af544c9951162e7262e6380ee3fa1e7024d79311b51396f60ab2c8e1e6a376ad01bb4974f712df0adfc694e4a0db173768ec09f99c6ddf66f48def8380fb97798e08a84fccbc2e8a4240fd7d95e83ce463fa65e1f478e3b8ad273293f615f2cb97af94042b69308df677105cd97cfb3f8fabe8ca6094adf062bdfe7ff73d5c9d6f0b81a8b9b098efaa58375a6ffea8fc45cc25abed13e2410f32ae896a29a727429a27eb64c1f6c026ea568a71f79567f3264bf0b2a768ddb88043d3deefc51949cf18d0b40bad1b51e2e2272d1a2049b115a6cb9a0a3a9b0edaaccc0ea4d7f5b75699f24bf5fe9b55ae70164d6e6485e25866a65b8a12a078addf28b7f6a397c1f43aed0017fd5e7258babc5640d787a9e8575a189bfe90db826b007b6c5cd49a02401f36d98a7f154d00682c10b7e470435e3baf1a46e0f3a4949e456525e4a1936d16e7705f2238b307698e239505de33c9b5936fe1af329e8eb2039d9c86d5f7ce0b70e3313fc8d65ce94ea3c701cadc38e2e6524b7f83df110839cc02c5605d23b88297cca1b3c8068a0224bfcbad8f5d9fb24348e34b967c04043b755c72fccce5e5e861b130cd4dd95090dc6475b5d9b1749b60f7e7d1faba3ff7a1ebd5c5c7ed4e0baeb95691051b90d659b18ccb02d10b514c465d9c872ec9f842051e818840524b64be88aad88c0564c9429fc11cca8825928ecaad87c524bc98e677bcee45a561b31be2d45da56003064269e31d3238d686288c3092ebf9f58633585959e55db616ae1e651ddfd7500092c5782766b27de837ad4436f154bbd76b9e3127cfa89f20681ac5d0810d0cb4a7a1421009daf9ce53ae0015fba517d708cf656a54b526d5d2f949f98ca74d32fd68600c34d5f21dc338a6fab7fbca5138fd0d3355c8f02fc91e49f90f7bf480948a51821ad2f8f199b66e3581ca8b23805d618eb129487b701b832d0b0a0a190de976d73d16c6be4d5b444e6caa26464a9490c3a9e0a550658bf32f293e85684013a30c637a9a874e52bf80c0e3c14ed4a54cac3c23e90a55cfd61d4056ef0cf13b6690fb6cebea0bf4c47a19fa58594aa44733e77244311343eb6d92dcf8a065f4c213e2b53f448501922d86e89bf2fdbd99cb17e8193a2cb273d36662ae02c5123c758693983b997caf9b7a4c6bcf56c6056d3959e91661d82a041ca7f03c282ba37d0dabafebfa4615b63887b4ed765b55cc9994e18e76eb35dfd04f3f7da5f78ec4d8397255081a22a34510f40618f8d2c40fc0b7c39b5d0a93f170864c8074074b2b52469b289db29486218cfce7bd96ae0cb1d908e27ba4fc0b9cdbf41a47c18346ad491777a7bb61185925360d3b67405849a0384d28907fb1080f4cd2fb402e95421cdfe08d7b7af654cfc4dc3ba8cb2f1aa8f54ca8b63e96ef8857b7de13aa7cfb8ac9d68e898ea931e8b67f70952d1185623f7d460d3762faeadb67e6f82476adaf8e3e792156c4f1f39f2cda565f1f40c4dc044b2df2403c974c875a63ea9e37bfd7fe678ecf5bcf8a4f3e5a18e23083a5d7a836d28c9bdfb053d9a56b93cae211d98a6e13c2ab7579f0f930a0c911c6fe4bfb1b7ae22b2ca1e36a2fd1acb86a4efd4b0f1a4c5bec9a375be312cb94a47b16282a870dbd012b9c904162f20e1faa82d176a69dc5d5bb40d5ebb6342615bf27b2bce69dda19b364877628a0ed2e2e6418dd97f467a6f44d20c094e714bc1afa32e42c56289240ea4de5b6ada80a705c1774db70fa042f25edb54ed9e7234b7a49b353a041eae63b48bf8a5bd28023353fbc34a758bb21063caf2b83e687498b67b27bd1fda270a1d9f40a1a4e7efa9f2b804f15c407f87ecefc4356cc2daa8409915abf053485260e902e3fac17c65b0a3a649bea0ea3507f0f4d0627fea80ce1e41304370193c213920034470f7a0604b76c9b82d7059d6062bd1b69c6c621c0d14e9c8aff0d1402ac90847db880e06f422f779f65238d464784b1059ef085e6339f78ce603c679807c2301f2783243f83fa933e7612d16f536c9cec680cb58d1031723120222e5890e42b64b2436fbb272674146157c5b092add9841d1334e19040eba01faaa13056d4186aa326569244c05a70456478e5ba87f42759e9f897aa8f63b06209ecc4a67cb63a51f3c62e7de29d196112fd1fb62c8b64fc27753f2840a917daa980cc3d1df10dddd2d47b30716e76ffface1c79c2ddd382274291f12421441013a858690acd8f1fd0be7716935a538daca9c9f23d65f847286528565dccb5fa0478beb778ee0fc340adf4bbfbeb77266714f79290e9c46f31692fe3ba1b4e53fac1e79312cda83fb29c91d47bec151cfa66256c63439970b91761537c7f2e09aaff30f986709854fa353606c9c8e31137d2d1e4835022656284c49db7cb05024fa61ca8d1161f027aae372f9b13a01ec995d33e8faffebfc5e8ef7414af8d64f2271d4394f99ea146849d25f3104dadb736c2e0e3c2beee0bd0cf8c51f2a21c984872134635023d6f3eb5690dcf69f4d82997f7be9f9aceea057a87aa8ebe9900fee9be376155ced3d1aa9da995318480986eb8ebdc9c130c35f2d82b28a1b3259772f5d755bcf5351e106f8daa75dfef98f08b0009e01c245f47b126046e8fc92051731aadf6519ba641f63365f2955917969672c9350f8d92c23b1954d7ce5e58ec03a3ca5ef28fc3fc415e97629b3c4abe6d43f048e950d0a3c4ecc61fa7436c81a694409276aebe586af90cf9c29281ab1b079d07a231f6c02d87c471a7a565f3bdfaeb0e267d7f6369bb45be6ec504a3b16538f0fb06ed4c668797626d687923ea0db4336a7be3e5768a53e552234348656a0707035b4564bcb30f1c21d0997028a01a1a3d4c6022e0185ce0c3860b46439330f0f0f0f0f0f0f0f3f30d0d65a6dc9184895492649e5f0c6d2a6d529a5946492497066e20b67263e9d99b882ecdd48264d78032a0cd50c140dadaeec8c6785721d618e1f4911439a7930b71186d8ee79aad4bedfb88c3008ab1413238e4e96db4598c3f57c55d253f224ab08a3077d771f7f2622db4498bfeb42b2482a3a6e8b08f3a8e829559bc5b6b687305eeed4e1eb1bc2ecc9db728e9f73ba5221cce1abb9aba6a2742784e944b4bb5a5ff49b0761f86c1313f4bec5c80ac2a461a2ad26459b44036152739d84ecf31319151086ecd7de72e3f147d43f1872b69cb24d90b267513f98a427114908f549488af6c1bc15d208a593ceab253e982f25e6a7f4efc16cb5f516f96ac487f4600aef5cf1b574ec92e7c1301e92a4493a5ba91b0f6613565e1e5d34803b984b04a593b24be251cc01d8c1947458de59b8a87f39803a9875beb48fde920e264fefd515652b74967330bd57aeb99c1c5a59cac1686fdd7321481142290ea61acb56228be060de93bd93bf5032f13798aa2ccfcf5ce9d08f1b8c113b55909f278decb4c124e66e44b4f6abadd960989bfc294a907741bc068327a55b2224596f590dc6492521c40f631a4c1d74501da7cac2a8880693763d1154d0eb55513c832189e58eac337993443318276edd5f8aa5c38f5806f3ff86ff883092c1b0a294870a9796bf8263304dd089a63b78a40f41311882f49cc3eafc85c80983f13c2cc5f7aabf1383c178a23d8497d0bf2f7fc194c358cccc48a383ec0593b678649d0d19d9962e183e48ae8a5e91f39c850be6949c2cf8279d2d8a650ba68e9de4d2b8ce4749d182d124679e879e776c250bc63b9d72e98963c12427effce50599bfaf60d64849aec25734d2563057fc930b41480c3557c11ccc4fa4b4a6ea2e4c0553fca477e3b43705833265497687493aa89c140c3fbaa475f8b41e27170573ee1c54e5531d140c5fdf172bc83d25a62718cce2c75ee73e6def04734a497a3abf7ee7a809a676bbb317351e12c404434a51f47aa4a439f9124ca2b5df44eebeec558229548c85347dd9d4990493f2d0e962db9fad0509a6a0b4cd3a9f7bd0df110cfb96c5929a1cd33e6204430a3bfa41dc76d0135204a3d59d8a9152755c8a10c11c6f9f272ebfcf240dc1a43922ae9f7579be104cd943f2ecc832c1fb209823a4dbac794fca4740307eb0d2dd75a717ea1f187ef4ae7a6adfd3b50f8ce59d692a13278fd87a60d895e8a3b37be4508d07261397668225bd5f9fedc01cbfdfd3dafc8e9574608e14aa84e594ff943e07a6ff20b2887687a43a0e4c793aeb92d026a9ee1b18a2bc783c25da176c1b982c8bc7dff32ca7a435305b5049e538a75a52a581d12fb6e8d20ccc1d29e51c4b57914d1998947c9c8a5733d15d0c0ce12f4e7db04b29af1a000ccca7df53b668b9f2cbe3504b5a62bce22425a7ba89323a16fc8381821dea8a2b6c5bee0c4b214acad55aa67f1a2986306bcf2e50438b09d49040913074e4f8c262b4c2bca3add544d227ad6e0c5698d388b6de9f4ad513146315e6242fb64413fb65517c410c551845db88caf93bde418c54182e8997776c4bcb9bdbb0d1315061cc361961aa25051d7911629cc28f9ca9f52ed223314c915c78c916d12db9aa777bbbe78e66a662a709c528854935ebaa562785d14558380b173ed93a5aec0c628cc2bc7d622cdd9d3025ba284cea3bc9093e398cd4b684c2f83dd166737db25f48121486dc17e7fd7922562bc681189f684be5ca88651e64be189e20c470991189655a51cefb3f54d28991189d30cf6fc7cfdfc9ebdc3f16c4e08439c783d477310fba766ec2904bcce7745ca70b758b96410c4d182dccf359d2a9bbf46dc34626343196d4c5b01913e6502a4b9071ea1794348c2f72c4b8847192d2973ba70e5f49a523c73901174eccc2f82247910fc4b0c4f3b9f33ff74a1874b28d5bcf234aca1e83128976794457cbd599f1ddde75ba5dd49b5e3c0948c0c5163a0983783a798bb14bc27467913247e95441a46244c2ec25e944a9a8e7aa7981e7c5175dc48084f95299d23bf929412e311e61c86f7292a2c76238c2642284b4f3bce826c460c4688439c9c4f6f8bcadab2310c46084313cfc88eb0efdd7a14598d2749c2812c74a9a5a11c638a153ac64c2289fc4480413c6b22b7a864c88166d6d2bc5b3311061fad1214a672f39a22a310e61502d214dd59b94919f0b6218c21cd1cf834e79ee73896214c260f12aa6e5edb89f2e7bc3522d06210cea2dadbfc2938d4ae150dba2c140c1dfd8a2c1408131813f8e2c6a102621c954f6e71c6df1bc30366cb4171f431086b570c1276946522d570004375a102310c654d5c82213f33f2e38d432038030e934f912e5ef546dfe07634bda4a77f23cc9f3f00262f8c17cef7f224b9a92ad9d3e1884ca5b1f26c123e9da860dcf61c3c68e187c308bca398994ba53d0eaeec174264d2e75caee49a21e0c2936f4ca92d5851879309e52397f7f30b18e130fc6135a9a97655a253518c4b88341e3cc82e9cbed107208886107938ea7cf3e09b9fd531d0ce61274880b218a980e467f5ded578fb8e6cfc17ca344f0d47f9283397b7ffd4a72089393e260f2cb6a828341b958a53d1f0d11a637185fdc764489a822c7e406931811212719955f626a83b9e397b20b6fd92125b1c11c464fb2f2f4e3c14b6b30a5de3cd341368478490de6bc2336fa565298584a83c942b7256686e9f96830b7e50f4a74f73afc33184d9a7b14d3b9c48bcc603e0b9245c5b1bd1195c1fc21eb76382f214544065379da513a49dff4d0180c933ae59c63ee967f5e0ca6119eb3584a0f7dfbc360bc2cf17285ec21f7fc6030afc9ff0b417494dcfe174c7947f7eaa97657f5bd60be9484901dd3533ecb77c1a05cce536eb9f4b23c174cb99fdb834912a2bbdf8259ac824e2993d78271fe42acab349d26f92c184b439d0aa97dda421e0be65021ef1e42127eb1bf82692d854f1d394b3b7b2b18f784fc556d290bfa2a18e4aeef9c3c2df711154cd9f725a265094f415330edcd6d9ede28ed5d0ae6103909d593223fc7a36014e5f9498c52266d87827994697cc896225b7f8239e4c8292d62113f7782c9da74584a426e8231528ecaa247bd9a8c986018d30d99944e655fb404a3bcdea99ad816ce454a30293d6bc1774d565b94047ccd3c8ff68a0483d83e793b7b9e458a8e601e9de2d95cb64f5091110c1f5e3daaa3673aa2229852d48ef8a6c328cf10114ce12278d2b65d26e44330de09156ec48d67d98560fae01f6765b2637a104cd973f6dca7e37a7c8060bafc4996cce7e33c3f302791747171c3636f1f182d889fa8cf6dd9a33d30afa8dfdca9343a260f506d256e9224776012fd762985b2d95f0746eff114c28cbd8d4a0e0c2654e456be4b4e71600e4175d223423cc60d0cfa5b7969c6427cca63d8c064faae2d4d896f591ea306a690a2a377101d279962d0c024aeb1bb7e991e443166608a2f3125414da7c44f0c19986afdca9298ecf2f0891103a3ac56e668898ac827060cccd93c9db25cc1e5c2e71546358b2054d01e62c5c715a6b47cf93e4f490ad1d30ad3273f134245f1d0e76185217b099152ba1029986715a6b0f8153da5cac7f1a8c29ce7b3c743a879124f2a4c36262b76433fcce5a0c2b47fe184badc3985d1be4aee545e151d3ba630089dec963d7d65d14e29cc69d5632f97a990f24d0af38dee13af619762a8476118ef364b0d99bd798bc2a47aff5f94886ed9e95098df539a14ab4bdaeb068549449e743511f6bbed4f98c4f54cd98be5c8697bc2283a2e8b1249c9cbd99d30a553d254259d36da6b4e982a87678b9fc3bcbdde8421766c9d350f97e6b526547dd1b1a7239d0993162bf7d46e1f13d29830ed9c58a458e36d497c09a3e65fca08555bf6b3254c61d5175418d3383957c2ecd7377b97e25f71a68429445f26fc29b30ef3244caa36fa2ec7d227cb9230d9a5e5e816d5483a8e84d1a4f5c94b8fdf49842161502189e432f525eae2471894ac14912dccdb94d611066d376ad4f33a82691b6138ed4999e58c4fd02f230ce7b17d6962ac64d10a6011a6b2370b9df979665f0128c21026a8a4634b64cf9e1540224c218f691d7713e29e1500220c2ac43a0bb13e84f13f8fb8606362436c0843b46d2b11be4ca87021cc77219d270b5f39bc8430c52e119e42be9d640761b064b123229c90a00ac25c93bf823ea5c4a864208cdf315f4a59b6f0cb02c2f01f6d23b58ee55df60fc6cb0fb1cc3ea1bf5b3f985209354ff93e9863f588146e972447f860fed1cfa322a4084ab67b308887b0fe1037a4490f6613114457485f8fe7c1a0de6156d5d29638e1c1e83672d642fe0ea6d19f449b8bec600823c572fab2120baa837184d7a55fd11652870ee6a89efaf3760e3ee93998b346bd77674f48b11c0c42c54d93b1cfed6c077605d108ab6d0e6674c2e0de912d77e46d06274c49a874df2b264c5e7071e38b2741b1ddc4fe3939bbe709ced08449fc4d52a675b369fe9340ed8b7780106664c290dee34344cf2ab78d09c3e984381faefe4b7d9730784e42cdd2f9961add38b384f99357ec4d0faa847972d8fe19552a49c294309d7dda5da54941fd3f09e398bc75b56fcfc95e12864b49e7db1029fc6a1409f3494ffaf75f3d46f440c22827c9f308f3a5705a84b4341f3b8e307789162be931e7c4dc08730af177b1ed12a6654698d5548e217a92ba85bc0893e510c694948b1e3a5684a9bd9324ad7213615042854f17d29f65b88830ccae8704fd4bb69b1ec2a472d85dd2af8e91a6212aed1cb4094f0b61fa8aff1bfd6259c62484b1fe2b94dcbeca120ec2b4ab9f3ab1265db2144118747dc86d3dc9bbe3401882d569f514419767c90c40182fdfe93cdb8ea72e32e30fe6d149445b68fd9cdb66f8c1602b6adde9f9df94fa60f6102c09fbafe415927c30c978aa2e694246c46d0f261da383d2a6925ee95e0fa690d2daeba908e10017490704747091830733f260d60f5b692ea88d852bf16068c61d4cfab7ca539565ed3967d8c1a49d93c723561216bd197530d7e9ff3c13bba7fea7835923fe47d52d5dfe2f71c08c3998533724ec88745972cac124b27d5edf41589cad0133e260b29b20a994eb6f88180533e060caf14f964ac9c4523d38d4b6d8a26ff00e052c801d31e30da6cd889775da161d5cec6d1e66b8c1a4bfe3fd8994c2a13ab8b840066a10335e4d2c472c8b1a657e8b2ec0d0a2c605265023d530a30d9b4c7bd5f479bb50518e1b3ab8501b3650ff0320a0c302a40220b811003ecc608339d75beaf91cc2a15978a04616352850230b0dfc3700fd174f022f5a8b22a198b106d328f5702fb2434753528361cc5da2acc89a24c46f0004ec30230dc650f6a32149c87add683095e41c72afa792679625cc3883398891be2133b6e34733cc608a14fd53fd4385ecae666146198cebe17b97734ab2af27833956f72429d26b54275898310693cb0593b56ba6180c61734cdf46ab943460c38617bfa30a33c2607c2b975bfdbcf89881816edc38c19233030c664f152b669f43d2656fccf8c2c1727ebe63ea05530ada34ae34e4857670a881c14a98d105b3e6e8587117bfcd0a87da6f71da48009030830bc6d2b1ef94b8e46ce2df82f164a88e4fbaba453883195a30eae688ce0a8db36054ed146b93452bae8b05f399aa244fc83e253f65f60e01340dccb88249057166eeaa154c634a89c7458717601c3e0ecca842254d64379da1b7c2a76303d78519543098d708611244d7fe5b1cd501011b366cd8200128c28c291874c3439d9a2f99ee7fd15f804181dcc00c29987a94f4df581d15c1b41a5a38a086160ea861c306db59007830230a466bf1942feda39f89d3c2f03d2818475434928857aee84f3088f73849a5ce2944e54e3025937d37c1e87922672c84bc9f4dbe9c593aa72cbd0483b65ec85edd91645f259853b80893d425c11492921fb2450ed76d9160cc1f0f39334f6a4f7904b3b6cdee567ed51da1114c7a64c47287ec782aa484f112d8a29d8b09a8f1cd288241c47be9bdb8366106118c1d3d5d8ea144fba7919530630826551d53086689eb113bc9eaa46c0dc28c2098e4479356af3a9e9f03841940308f04ed11b97241d4f503c3499337b616e737b727ccf081d9e47b79c434b7ba6a460f0c236bd1e5fa1d5fe868e281193c3067adace1d9e2c99304875a1a5a60c60e0cc98452d3cf12e263337460d837cbd4bf113985090eb525c18c1c90b29febe55cbc5422c20c1c183c57c7482929a1ae7a1c6a37b840c982193730a7087613b46738d4769415ccb081b96d24a59cc783cad99f5103b3e8a4b756f4686739b620240533684048f65d26b2a8208207875af1e28b2e4c30630686f81e6ae5dd2103838734d766baa1a39d6c312306e61e9dec1faae3502b2bc10c1898743edda7d1b35ef2bfc214dac4e4a709a547a45790e10a43b2e4953cfe7b8d9a9056183f08cfd31f2595cdc50a93e54a31332f63ba634890b10a43bc9052ba9c454dab9d2043154bcaeaf4e7a25ffd2d4e0e12e800236d0764a4c2385252a57491fc7bc28a0a93ca3e8d13b7f29b133ac83885417c4a8ba723c6e6275dc01486245cef2feeb8e7f0f9c2480d2d1c80a530c988574168e730514210b061e304396cd8f01b5b0c4106294abb14cbf23722c406324671d650fd9811b295810c519832d455c8415f2a043242612cd9503abe36dcc6fa4206284ca291d3a71373392773d1c5d98e26c8f88439a82ad1f8947cacc51b5c20b422c413664f4ff1da72b06caa95d10993ac5c591ca11739c8e084d13faeb2c65cd0617e1c35b470800d1b3b4cc00517382e08323661109b91d375d0575949ed00c30b2e346110726765f749c265f9061999308757ad115152b84060ec2873830c4c982da5b4961c362c850bcbb884b9e245eecccc845904879a161dc8b084b943b460e2fbe2594ae350bbf15e74412c2320a312063db514a99d6276c30825ccfeaf6d298ca75af1a8d90d433bc89884612ced73ec502984a8dbb0214312e6b8c8ab964a62e5141b36cc6ed8d98e82838c48982a5bd0f9b2e89030e76c63bac3aa75bbf308b3afb7291739723222321c61cceaf8b69e2fabef92d1082dc8cca4362fd74e49abaf7ee47039321861d2cec9278ef8ac5767c78eee228c738310f43a36b04567c1d506198b30278ffb296699ca49096528c2706aa742ce2979f65413618835da4c8ce7c4f4460a4cb05e582017210311e610f2e99b30418730479e283a4966e9b42a0eb51498e046eadfe246219f022e4ef05e04a00f320c613cb7ce331d5bf4ad5408b3ac4bec68eb576d428430c855fa89f055aae71984a98332d169db3cc74f0bc26cde1d54b019935572200c6a562d98e8dc49b7038439491afb30b945d44bfe60b489ae21b9938a1b31197e30fbec666dc84e4ed2ee83f9b4cf3cc74ec1a176830bb42290c10793c4f59896526bf43e7b30bac7d36639a7f59e49861e4c6156495807f54158270fa6902574ce22a27cb41a87da16fd5fecb861822dc0386835b470401624d091835f061e4ca1474531db4b624f7c07936745f0cf6121840dd9c1a0549057924a3feded7530cee9e77442ff25c93974308d241199c9296957750ee6b1b338b7a0a296aae560c8b969425f8efa8a9138982bdfac256959d13d1ccc632a99a79054d4c8df1b4c963fe3f29ec8b143e80693aa69475acb219eb33698f6ed7e2ef4850d06a95de92b7454a58f65acc19ce43b5d78bc89099a0c35182f89e687a4baf7c3224290910653963219b29325030d8653a7a5a1e7ffeb94649cc1f426647d5347f69c920c33189495aa384a298fe3271965485e797613264406b3cd954a29e5a431184e07b17c7217be3a490cdb799bf00b35c9088369fe4e9edff88c48261960309dcafce8f0f9f28649c6174c69bffea583aeca30c9f082b957d2cfd9ebeb5b928c2e18af3b679fd816db624906170ce23e85d449a964a5f432b660aa4995ce945ae9387a195a3089aeafa4682a4c90bf8c2c182fd229b527821e1d7f19583084a42e447231e929e7655cc174b9e24419b1a184fd32aca0653511bb3b5905833ed149731f13662a98f654da51b92e82084ec1a4fd53f6ce22d64bf752306577119563cb563e45c1b0763d13b2eeb8e5a160ec6c3a563c73928c9e607cfb4ffa7f7f2e3bc1203caf43fc60ddae37c19ced2ad73a4b5033c1942d237d748f85cf394dd05e9727c84a305b8c2515fd8c1cdc2498b25ecaadb5f0f527120ca94b9fb2bbba3d95239852a4d6c9df0826d7cb75d11e2a82d1bb42048d142282b1e3854869d6ba5aa12118eb66bc73d87ceb5f0806d9f574577d100c592f5a880e212f0801c19c424687fc511f2ef403a3e7a88674d77dcff18171267d255b357d9eec81794599be9422f2e2e48171bbd56404318f11eec014fa7b54e8af2422d48149a76875272b9e03c32825d54ac8bf2911c781c9648918de39e55412bf81b13c42ec14dc73d29bdbc0fc5a3e31c23530058f32d12cf8a8574e03f358f2fcf9591b939f81614ba93439297e50bb0c4c91744d9bce517f3a3130e88ffd5b0e4ae8900c1818734cfee9205284fe0a93e577c8e575b9c8ae30fa8a4a173d7f2f6a8541e2c49137298530b3c27869bda2aa22f7445761cea5113bf6fb7850aac2e0913e440a9e7516a6c2dcfa3ea2fc7774102a4cf2c7dde52ce422e41446d19db2a262c714268b214f44d24b611e4f9782e6c4b9fe90c294feb6fe7692e87a47619e4bd132555617aa28ccaa379663aeb49d2e14e677d1ea24235bb16b50e8ad25e62167fd0983ba8956f56cf224c9130611a2eb55f070274c97e956b99292b73673c2e03d21670f267221e54d982576fa915dd284c183b67d1c0fcac39f0993cebf1d67a2eb681f13c6ba3c22e73041e7ec2f61768b6c22cae8791f59c224ceb3a5b94e9711aa8439474b26254e8825439430059dc6bd2e8bd8e89330960a4ac9565c12c6bd143ba705956ab41b09c38708d2e2a51095dc8584e1e34b99a7da13f9dc4798f327c8b1c50d1c5f74f1681406cf5679966e3b7d8488c04314e6e07f2331cedec7471c1ea130f758dc2bd36cbff680c214c13b65e7aa3f61d20f26262b4b4f98cb4c4eb620524861ea84498b878a3ae24dc3523861f4eb399db5729b288932533d34618ed33ea3eafbc2469409539f4a94fb52aae3586cd8b061238d3d30613a49db72b1f2f25fbf84b9f359d4f8b0babc1d0f4b984cc74eac8ea346548a47254cdedd622157aab8d6bc0b2fbc0b2f6ae04109939afcfb6b1254943f09b369fc5dce65a5f9214918624caad0d1ab2e043d12e6b51077b6246d7d0e240c7f916bd4c97d4d761f619cab90ff5d2eeb6de908d3c5e81cf4782725ee6b8431457805f1ea28e739069ce0c108838865e963e93cf2e3a83250238b1a85811a59d4a80bd4c8a24659a0461635aa0235b2a85114a891458d9a408d2c6a5479f13a74e4486b83c722cc717444fce67e4e0b2ac2a44a88ab70155bc157800b2d9e02788930859c7a54ca5e7071c308228ca1a385161d4c8cee9a0f61f4fd643b9f848d2a9d1a59d4a8a1c5046a709174dc123c0ca1a5f836fae275e8981a5a4ca00621834721cc311f2f479094b57a278449a5bfba124b66329f158f4198b2bd87ad119fed2326c1431046bd2042c8a22d67ffd3203c0261523154d29ab39353ec57060f40184bbd699f9c2d31bcb14523d982c71f8c5d69475b4a035a34c1c30f66fdcfe21e29c4ec2af5c178272c4509f373b9101f8c2364e4f2a25905a1b307d37968be960eebc1ecbd69132c7789ce6b1e8c1ffebf772be9891c1e4c4aaf435255c64509dec130499daca43e8e0ead1d0c36ae9a1e5c525590d4c1a87f17c4e9094a4ace32a0c30235b2b02278d0c1a07cf6e5b256bc8f3a0773e9beb98cac37a243d4430ea692315e2793b27e7e3de290b2f7b56cf21fc381f920445bae5ccf2a0098e0f106a2788aac4814897d2a3b5bec9cd734bfb123c78d4f81ba81208f361894b8a4d2c74e86f112e0e281071b4c1f2d4bc8a4103a29c4630dc649424dd28e6d6329e7071e6a309e89bf568b092a9d95065354fba0734a923cc4f48b1c3b72a4806b68e1802f72ecc8c1811b376cd8b061e346203cd060b6b7fef41aa5f3453c83c1227658d07db9bd8187194c9b7dea721c3f051e6530ddb66e775c0a071e6430d5f80721fd6fc3a46330a4d339b2699db05ef6cac0430ca6b952398d0a4247efdc028f301843469eb037b162ae8c8107180ca3a209793bfba02d7a63478edde1f105f39b876c7539c6af993894d50b065d312ac4b6904a7f2a6b68e1001b36769860477f61821dad857974c124f63a9662b59aa8100088f0e0825bddd1929b1a6db14567e1068f2d1844825cbcbbd6bf8de0502b2ae80c58c2430b26dfd1c9b547a67abc71a89d21c1230b064ba96448b438ff2e9919c1030b2669252d5f75770e8db35cc1106fb2ed76e84e3ae50b722047170ac8e20219b0e15d785106e0030f2b188436d3909b190033f0a80242bf56d69915c69be086e7d8e280d1c50d15b417e4021e54308ac829a7bc5b2221687784f112d080d9013ca660f011a3124404753a3b72050602366c74b1a30220b8b1020f299872f65462964fc98f101c6aef59286003366c64c1850ab42809460d2d26901cd8c21f79f15dec20b62347175d0600048f28907f6d94bd884969e250f322c70db30d7840c1b897af13b2491eb514871a123c9e600e2a9ceef0cfd0a322e8d316af011b36707cf1b743afe0e10473089d92ceb1a62618bbc4f2bcae28914a63822928710f1ef335565f8251d452b4bb246ac45637b003607828c190b2a7e8bf5627b413f467181e493028a5827855973b152d01c30309c649ba4a889494d2f1751cba022e1660c306fa15102d81c711f8e4332e92827ec58b2fba30818711b036bde833a3c65427c88163878d1454f9c2a308a95c41d4d797fefc7e01060574340033e041045369f918b1f34f884b3d8690de0b22f3e6f397fd010f2110cca2876b4c7299a05e19e6978490b39a163ded110493082a2fb959bed7d27a00c1a0133594655ffa8bf603a3e8ce9ea9adf9c0c307a60a1b124c23a88abd6ed879f4c070d96d11e74778d48d1fe1c103831aa147881c26ba8bd00e4cb2d7ba3d59500ba5d9b0f1c50a5e870d1b67376ea02db8b0b24378e8c014e12427f9f982524f61f3c881312ea4b214913d036cd878a41500c10d2f3c70604a62c3c2a7187b9f651d1e3730758ffac8fcac964ef4b081a96f43e98e0e225b523c6a608afb15fad4e738d4ce20a0c3027b070f1a9856cfd288adb061f60c8cd9a1ee254fd09dda97812167537ab54bedde6c845818ef038f181825ce97ca29bb65b9240f181865c3920af2de61b6f40a83fa4953c28336e941ef0a830ed141f6e7966ff6ad307af891aaf3e953d0372b8c7dd1c653aef6e6d3ab309ae4495194a665955815a6642954ca759f3e4e9b0a93099d1047ea7a6cd1a2c238c183103a227a0ae38c309d2f7e56d7a630e88821272cff08912da530f58d49135e6b79e2460a53f62a65a5e47e6c1f856947fae8513adc4d5a65c70a9a0235b2a8a1c30235b2a88174e49040185e3c1818a891458d2c6a84f112a891450d2f1ec78e7e408d2c6a74d127604f60210a53e659121f12bbf5ff5018ab5b6f7b55f524d65880c2285a42b595897042cf4f1827a4d44158bbdbdc77c313a62cb2373ea5605d3ad509d3a94b297f959fa854c12c60c109735e88cf51b4465012dd84e1b4e4506a42ea8626cc75f15b29fbb8684a448045264c6bd144ece4558418d2020b4c9876333c4d4e29b3f2690316973059ee0e16deeb92ea9c750c5858c22cca42a74e3baff0ae12c60f2254d8f1746ae58443cd0b2ed28d2214c08212a6fcf1c3a70f9f969c8429c70bb1a2ac2b8992307a4dd2ab48692b990e87da4a008b489855239c2a9116e4fd83432d21800524de32fdf18c139ae6230836a232f6625bd411a6943474caf1f6e0196ac4e133513b55f45431c27877d9a1a28817613ab5bad0295fbe0e15000b4590b2579010a462c022119c98ae8eefd77b4244b1538eee1d1e3c7de710e6cb39bdeb09d5b182d210c958b8fa0ea196e25d08de535e07296bbb5b12c2a04dd63f24ed552e9141244e2ff4442e0874f86e71531f55ee0b844154de8a671ed6b69612b00084f93eafee78929edae53f9852f5c52e779a8e14fd6072f5f46061746623a80f268b8f9e7fe563449c0f2631bf9849922a8dd6f76048c1e64a5eda5435570fe63861eb7bebe16e920793d81edb5172bb571d1eccbb7959774f9f8cb6ee6072afca523fd631c17f031676309e95fab01d9f536eeb6050aab24891952b51733a183d294f55c94fa70fcdc1ec51ed4cb4e53ad3b51c4ce7bb1baa422badcd713085e859ee4ccdd47b040e06a5b42e3674cdfb536f308abcca6fc2dcedeae406c3695bd8971016fefe8e3674b93db2789c0b58b0c194e7c4756bd984491f2260b106f3b8dadb8acc98b9a906d3d879f6b42d3bfeb11d69305c58ec8feaeff4a2a2c1302ac9a72a39a7e22508589cc190535e652e772cd88c434da18085190cae1af9cec43b89949125605106430e11c4ece8af10e624834148ef9a17fd1c2e2c63305d79b81abd4f0c663df5262fd45eda45bcf8a2bae8135c12b00843b51dea54ab922c81816491bfbb4e7bfb2f9cb2af263d79ac13232f1064c2df4cea91997741f51c3d048965aa3ae74223cfa3da9aaa483abd053fab73ac94104ff55a38a97c2239642995239c85b2ebf88a5b88db73b160eda724d782505a92f20ac9ea606bdbe6e141678525e419e956c1fcf5b260d993a59460418535725013d3446b2c3a05736c7cc556b0d1d5affc16a7bdf82f20c05ec0420a57fcdcef701669f68e82d146a7670b3b752b2614cc5efa83dbb8a8b83fc11466f2490941072f0d39c160d63741785a25af60018b26985a67e2cde5aa800513cc6b157625664a3f3bb60c582cc1bf205aa793a50c5d071737b6d8a29ddf7558404703b20b2e328085124ccafa4be70022811a59d43006031649484a34a5eae9c33dc00209c4f65c5f770fea92fc08fc5edd25a14ce5f0b2111cafc8fdeab9fd15a156eddf51a544e7872ce9a22990d6459fe046190fb02082f1da2b6c8de684bca62118e4e4f99895bb5b631282512dc6aa47868fd27f10cc25e2f76f726835df81608c1cd77f2ad32a3eff814149996ceebb691384366cb0010b1f1854d23e11829bf09c4f0fcca3436c988a16f5bb79601aa56ac2dba3089dde0129c710f1525164d681492767be460ab1f2e31cf8219e3a2ddfa6115f1c984cbee8ef78eda2e6bd8139b66aabcd04af24b23640a82492922c7e1d0d605103d38c744be9535cdc551a98b7b4e578dbb49c43333049c9dbf12da80855cac078d1de67f75cb3261903a3885f5c56bd600183528ea14a894b7a9557188212a24c59fb9b8bae30b78ac935578f55d6b5c21ccd538839cafc465618f48e347d39acd57256616acb4f1fd44c820aabc23c729683ca39df84244985e1823e0b9d92e52023549844f05b4b936f39b5760aa39cf68cd83b57713185e182e8115d622372ac0c30a3141aa824458ee2586172495fca49f844418e56626fa48d7afb84c270254be4fc79e3716650ec394c798a5db4912efa04e705175f34ab60c6278cefb75bdbfa49cdbb655d74d90c4f28d1dae44fb6fdb6dcea8000323067495a2d488db45da51898c2fbca4bc89f003030ae2953cac47f88cbed2baad3f1a44711aa2bcc97217792ecad3028b3f0a44b3cac30db9fd259d1ce95f30b076315a61c4ae54a3fa37ff6c61bd05085494492d39d0929456b6f70f1c58d1d4d820eec6807a05f418e06cc80462a4cf7924330ad9193720f09e34d705d340550612c6de3217e1b0b689cc220f12249136569e26174176914e080318549a7f21c3da73c8f2d96c2bca93713346c5bc313d020852988fc22299b3a5d91a5310a634449732222a288ca8bc22c3eca43fc9ed00885d94850a00a687cc2f0934ed45fa29a4a8b27cc497f2acb6fe2634d9d30884b92dd3ed2bbe56722a0c109b37992732139848a9da6b1094352cd113a9eed4d473461c857e2258cace8ef5d260cc1f6aedeb56254f23161ccb8d3a61e7f99dfd8d138d2d0ff8e1b366c3cd21cd0b884417ff6e84184b954218682d7002f0d4b184764398917c5a17603954625cce6b94adaa5b47f114d1a9430c7aec7ca89a7b3766912f7ab091b0bb5080d49183d09a5dfb14eabbd88043acef011411a9148010d48ec0a683ca21cd134d7f73813121a8e3077b4902d7a7bf7bdab011c018d46d06084c9d258275d6b0be9235ad4c8a2c6066a5c60023516718cb81492d26b232c4c4311a6d7ca9e5c2255f0d46149c432f1afbf43c436d140c429fb9ee8a424a71a04681cc294a7aeba3d295115846818c2a4475ac41709b275318d42182789ed90eb7f2d2fa44108b307f99eefb6134cfd4118dc73dc5a9315b105612c6defd4f142ce4a3c102639a96d275b0e4a450e208c9db112ed3adcf5bd7f309f1615764fd3d5c6a2e107c3769860bad45c6b4b39d0e88321c5fb748b91baa93f1f8c1d4465c92de74974b807b35c987496af42430f26d11e82f88d5b5d87461ecc39b25cc770cf6639e2001a78305d253d5adf2281c61d0cb17fbb92129dd3b3a3610793e79ff945b8d0a883e9fd84a88c97ff307a313cd0a083295e5d7d8af11a81c61cccff716669f4b5c36ed81a68c8c1acd75b6716eb3a5490c5c12ca3be43acd98494c2c17c3b22e9f43fa72335b470800e0b6cc00235b26800ee81c61bcc33e239a224a71cb553011a6e3096e9954e141129dcd906a395e8d65b09e14332d5c8a2461368b0c1245fb5825b9dca1ed78d1d396cd8b061238cc51d3b5a40630de6f78ee826a6c6dfe234d460be9c142985ac0fa6170eb51b6b35b470401a90709d5484d2d060f4cc49b6976df92a8b43ad8c9033187c74ca96d542dfe746c30c3aa0510653fa788b7cea925a8fd1208311420ec1c27fa0310683c90e317ba407757bd310832159e7902c5bec3214fc8e3098245efd577f0ad1fe8343918e5743030ce6f9104bea8db6e0c26f7ce15f82c3c517aaf0251284ce5b52e150bbb1821c899817b64ead748f37134b298cc4dadd121f41e94cf0df85e6a0d105a3a7f0720f0b9593e9718006170c328424f1b92db85e8c15a0b1059366874be5bd69c1b0771f827b9da59896043ab8d8623140230b26a11e225ed2295830b58afbb6e9ac957627640334ae6056d9be4942782a7da1158c563aca9a3089aa17bf5132150ad0a882b1325cce3d5ac59da413e4f0475430ab792c59bf11d7cbc3a1462440630aa6bca1825241c707f52640430a668346140c174dda68bbf6ac4d74b4ef8082615f435252c2277abf2303461e9108d07882e98286a5d4de3ce1691c6a58001a4e304ad4c8292ab3938fda0483bfbac7717bad0b152618442fd6e898d7124ca24c897d915d9e8392120c73f996dc731021564710a8a1c5046ab0814612cc27b3432cdab769974830cd4d945c4144978a1b8d2318d462a91cac92d8780b0d2318ced65d64f7a51f7d318197146814c1a03a75fc535f9d459c59d480c0d7d0620235cc0c348860b4f41ba1a65f12e4f0828b1b6dd82c4063086691a03f4d5eb594f204871a068186108ca71797a74ef8e72ce1502b366c008146104ce2f38960e1bb4a5f1c0826a91f64ee2aa9ac78fec0b015cac635431f18e4842dcbc1f74a49ac07a6eeb81d66f9e281c95329a5764d243d57da8129464a327ce4a730faebc094e52ac496f8321d7e0ecc9e924ff5d60807a6d8ea575d9f72786e607ad1fad221e548e3393630dc759fd259679febaf8139eedc77909f44656d1a1857822895125c2e656506e6d2234b849454c518890c4ca67be9dd97e3e65d3462907b750c0979e3fc1b9757a00103e367e4b718aac247f9f815664f39c49b3469f94be7c315e64f35e93b6e5e69576bcfe6a315a6931d9d2dc999d11f6451f86085515c334ddf278451e92accde6919a2642d8ce61faa30958c949b262af2ad28150695b3323b873dd51ffc4085c17fef2f27964e614a7b2adf4e45171d824c618ea6b405ed9f44329197c224628f8a1c2f45d79614c6fd14a4fc579a4ee3198529dc83f2cfeabdf4b2288cf2e6414777f2933314a60aff2b1d6e35694350984f2913592b09a57dfa84312cfdba56faf7fc7bc2f4a7e22f79adf35d4a274c75dfae6249b24caaba680a90047c70c2a02b481535aa2ac7906ec23c4ae286d26de972ae68c234315dbffd7343843c1326b9e0e3e9439a64298c09838d1ad752a2c5fdb397308af79924a584bdd6c51226d1296fdef1bfaf84417743446a6713153c4a9852cae177bf563f4be3c0c7244c4afae753ee1a33e9248952f8f0fdf6f1c25ee8231266834002fde311a675d70f1e9f5476493e1c61b0e0db769b231c6ad60083c347238c5e231f4bc84eb8cbd7c6e18311a63c4a7c4abb11b2868f45983cc67fbcf0d2a94b4dbcf0a108c3a71c3ebad35f9ef4d247224cf19eb2e49e60aae589e00311a8edd4d521ae1215b417ff05185d9c800b472a7c1cc2d47fb146e9144dcdb21a5a38c0061f86306986d0319f2fad1c1aa900086e00a0151f85309a08ef602ace6853ba0f42985284d02aaf2576911b84d1c53bd769b9091f8230e530f3d166969d6bbc00143e02614c1559d113dd9276310161f410bff24be79390bffc83f1732eaccbe4efdf1e091f7e306548ef2df5a2c2ca5b3efa601615cb3ea2529c3e3badf0c107939c13af2b7992fabd19828f3d182e5be990523f94f6901e4c42d9dbf68414b2c453f260ac2e893e5a6bf77b113ef0608930299a28a52b44f8b8836952e645fe1e2f2bad143eec6012fea7434a9260f9eb8f3a983fc98d2a51b9d33902c1071dcc49292d6fb2e382818f3918d27af2dfcb5b232a7fc8c13cd15210fa3e7af68b1f7130c50be69e4578f6a8101ccc39640bb74f61a9fa37183e68cbc85975d99cdd60dc521741cbe43851d7361845a8bc9d9ba019c16383398d127af32de764125b83f9e42475e93694860f3598467692a9927e1a4c7f2b2ac33f4d564fa2c11c5b41295326a284d770a89dc1543e6a5a4b458faa2133e1c30c66cdd127b5dd2e65976530e57f6e8f4afea1fd2de1830c1f63309a888eceaeac594905091f62305f8a88ac34119d45290c2611923c1d9fd7eaf64930984454677210a64a86eae30ba6aa0f5917e76e6d292f98af7394699b1cd40781615c20307640e0a30bc6882a3ae779b9048b77e0830b86602ac9dc47789864b71760b47d6cc1dc23e777432438d408692fc068fbe2430be68f9db42cf5de5c90ebc8d1001b3652402c0b66f3309ae1f9332ffdfdc20716cc9d4358bc287bf956173eae60ba307ea343eaad60bafaf01d4ca48578c847158cbadeea5972c4bd9325158c71313f8c34130ee1630ae6b39c267790bb687949c1a0ad4cf4c499a43d46ed05186d1f51d0c10714cc356342059994e35d240b1f4f3028cbf1a67492c409262949df6d45d2d1466a4d30c85c7f67658fa5df644c30b9c99c7755fcbcb5d11ae06309587a5a8c8da816247c89cc28f56aefcbeba12c6a649142f8508249f9d599ee9b1434d6e2848f2498930a13b24738f5d9c70f2418921aa12ded950e3157091f473069271592840f2318d3654fcef6e4dce7b3113e8a70509e91c492d64430a74bbdd735fe49c4c41e7c0cc1242979276951acf3230483c70a4914f80882d94c8824ac4d8443cd080a3e806010ea9467bd248443edc68e1cb9c5c70f0cb2b7225a94502224e90343d81b9b1445efde8570a895127cf4c0247285688f6149d46438d42ec7070f4c42726cc9cb221d3912093e76608c1851ff6b2409ad911d61bc045607c60aba8356e78eade5736088667217eddcfd62c63ff8c081f9c5cbb682ae7a8fe8c70d4ce277a4c750eea552fc610353be3032c3d4e3c1470d0cd252453e93a6ed5adfe08306c6f0147d26df53b626ac812f7ec70e3e66605e11224de9106354aa33f89081d92a88bb194991c1470c4cc12de4a44f741665210d3e606094f5706b5a439756a8051819e057984da71c497e1289f6c15a800d1b48c79bc0fbb02b0cca4cd7bf86de0a732555a521ec4ce25becbb08438b0ed0c08315e628f193d6daf68bfe5651ec45cab070366e63c14315c6b0969ce2b1a4e6561ea9302555d9465767d3122b2078a0c2dcb215578496943ef20d1b789cc2a0a263720891b36c8ba129ccab62d2466b9834cf4a615235d9176ef28e36255298bd625bd28931516ed1394e9063025fe4088d98a824ef851261240e8602a1602810088450381300131408001830220d05a3e16822aaf3031480044836344a342c14281c1216168c44224138180807c3613020100604c280402830103fb30a7c0ed33530a70004d73a3e312c435c7bd43a20e432829d8c6848a2c31499f0396aa21239830e953d27eff75b0ee54059cd8d4d590211b61d01d260cb2f448759412948f1bc7a56a9fe06d1a5c7c1bc464b62b8c95f9e6f4498fa9877c9ba6319c0967f729e1e9a6602d46781a1ee1c81681ea4cdcadc0de49e35bdd8400482825261fb7140ed0314f56cce5499b831a486133527c4f59fc5201146f2ef863286891f79769cee21bf4b9c216a9d65607e99c140a73e967d54b367c0f8361e0e8c2151422b1e840ad256c617bd2166cec1f01cd8b9afbfa799a9db1c7894bd28e5ad3e9dd982c5f8c249fa62b5596ccc7e308ee091999945b2ce91ec43a1781bab5f509fe444f92c1836dea2733c3413654ce2772bd18f4b0e782ef2b8afb9b6c46620281569ac833031008c30930dbeb5777c3a1eead1ac12a835368c5374f0589e06992d980c932708a8e34e046d29ce7fe352e0b40b704c4b24c3f75bb2717bcdcf75bd54b83e9e8c93e238c8076b9be2abd727f409b764d7e8ec25e352cad474c84f7307f84978f4f2369b80f75d6e457e4f0e7d4c3b664bd71d28f59e81930f9f882893ef5746cfea44870c9f468a1b8297ed7d29847f16e9c4f5d5f9661014284f5766d7ce9c822cd174758b3d8bf448f9b330f682defc877c483c64ea0ed8d0b1a8b61de3aa22ac50d71ad69a3ba01c151682c2194c85910930b955dc6868b978fb769029db09036e35f26480d752029b47b309428e69e67a7480ace05b260f6e4dfb2cffbe3e8eb00caebaa6dd46b12192767565fcd44fff8111eab6252661776e4531c88670b885470c88130a36d3c630f23c31364d88b59638e2d8d1d13761ab43f6c2d248783e2fe731ec1fc62f03c2470a5f4fe98c94442f472f12854b6f142ab031eddcaeab2d42f2ec9ce51cb4b5216391436068fe626d50fe9d2c15315cd236fe9681ea73e4c80ac563d80bc25604d3cdbbab4ab589926a942cdf747d64f9ff0e4f9319a52359f5f853d8a0ef790f95223c2fa1ea43746543a5150f0203e688185d84bea8019b2a4ee7e8d920d658156f09c8aed461732f96d6da98d01b3a2e26b86a2f153cdf1cf298fbf511b47a4de46ae4a9ec1c08e7e0a86f6af2983d5ccc1ebb89ba6e09cc970153026f9f40eea3b329b14c8610865652de3644007eb3daabf86cf1ff0f177d72effe79e95829c544b7acaf04e62609c08c78fc91908b2e64614d4ea9c0f38eb2fd82a490b24ba8fee44a090bf5318aff61ca064f5bb62d9322c28398ffef100080f83ad3cd71e3c1c4fcad2ddd0c5af185e346c30ea8aef8dd81ccb8120cc400d16b3153dcce4084e2e84a3f7f8a6c4b2e6173d99ca66907e8cca7065406b2c85a28c178fcc56c1529b5c00c9b79eae74b2aa42d8285587269ab303969271b11137304f490d9e8116536821b408c6c3c0b6db9a0c7db88a6e0fa0cc5c58427d3a4bb8addf4f061c689a39391f4926ecc48696d92c76039136c502ab4851541906f6d081d088ee89d72d2753ffaec79d91609a5c8bd6095d419634417d4346ea1146f6152c27c5db390d6793e247bc174cdbb222a92a63798ef029e22c4aa2752b1d6929b82acbbb2de7285d43645c15104f52536d9a12e92f37562a9ce863d36760b99a8afb0469c3eb21a2ab7d8cc751539dd81eb2fc960a153dfee704822b4823827c4df2922195c696292f28b5c13be437017b430ef09825838e21ab3ad03132101a67a8bc8ded888fa8d891fc807baf6a73c694850e8a057b014eba160863797c571fa17df2108b951a44a2822f7acb33f1130d97b378902c4ff022a4a4361b92d0e43637aaadb608a96022a044723496a7601c2d9dfe0d295d0bdd213364a811b07d880ef72ed11808d1b0414102f5028be15f339e3f12cc815e8289824079aa604a54f8b20ea64812098202f41ce20188288f3fd5dfcf5e5ad6d879ea315f5842c1e4f6e5c27277fc10d2c373689b3c363d42224e33353d964d68e3e643876d313d8dad712e3413232e798f10de509b0426cd0a3c692ab0822cf2a5a2727946c84f1bb61ee1684b2464640038088197ce0bf8c3fc64a6c53177be2343107848f6021a774ef8e34a66e0963302aa71c2f46d234248449fea3cb05f3aee21be016728e16362f0f9ca130390bc5c8386a9ca204233810f61791df313ec4d956da0dfb41460dbcf7e1a276925def22ba999e73fa4611f71a2f6a9d8c00a610037d820f91db326ccc8dd11dca6485c6d1ee9eeb82c2f639a870f56ad1dc29d6ca461ca789910fdc18380bcadcabe3cef92b38d773193496a521111270f24aefdb428248c54d643abdb3eeec37362c417c81c381e13838521a85d1a42448a4acc5baa730de614e2dcbd547cfe232963d1e29c20b0b62444026b88938f950851c665085971dc722c461b8f6e2930355f64115d95bd64b0ba734ec6e9f76f7aa618181737c7dcc0c19f6d422bc5cf743a93c3640f54704a3896d175895db26559c63c2def6b7b09a761591ace3906a3932b1500a58d913abc7a9b9a5545471d60489fe0829abe2d39c765c572b394b20e6817db3eabf95b4911967849c6935f75788fcbd0077ed87bf2da84694a6eff18dc747c1b65ce1aad457972d28a340a01a8ea704322faaa535b73357627fd2a7e276ba4b6b019d66998901052625514af2662eac8faaac711f33c5c4d079ee59640636293004091ee3259eaf47fe0921f3e2a57ad2b279642790cf6aa16225a499096a0b3a1c8e30efdddc29fce4436ad305392836ae850688e2f9eb93d41d42d27377c4e3af7870c92f95a51122aa1716332971610342f3c03e635908d3a0b04feed6c69d407ff05935e98b795f7c070382d325d8b2ea72c71d9dd03b80864765636b32f9285e891781b2429bdc5480e39c0dd96ce067333377bd39e920d6701924dfaad914863d75e46ec383ff4645864615d965f70692807559e916d2ea629404419265f1421e624859b27dfc2fa8a8d2f041330da986115ab309b05cc46db47665a18217017215eaef9f080cda202389a52ea539a0146ab9c94fa34c40ed91b5aa048802cececf852d22017f072c99550490172b500188457c322c089cb7c8317ebcd1156f26ce1e94ca322e9e328dde7a9e2f31e08002f27be2ba0afc2444fa9692684ece0fac9d2bb401dcd8ed081c24d9a6e24ea878b7ff5a3c651790c4e7408a0d0192210be4e2d1acb697a650c43210d1921234aaf9f4b8bf4c69d5c9d4550503b051181efbe9e15bb8109d3ab0da6c8a1e0b23186a66e689307320d0b01cd89829a7ecae88ef2c620d28c29dc74698b82e1329d45cae100b65b97e9e26063bfb838c9e02a68a2f9fd79645facd5c6df595cb68cbb1a969c8945e868569e5fdd820afd66a78dddcfb176affbf574f6271aac53acaae04866a663a4386f7c29230281acd761239fbc1debb27baa48f70228a61401f0e40842c8bab47aab7272c6f49bd516fb84ab1f84ef0a199f4c1368c849228efd571c952058d8288ea2a1742e66c7b5f28f6ecd5ecaaf17979250202c0e22ceee40c53db7d811403acdc3a550c4c1e009355d2e2358672780d193a83b421deca4b1151791c4838c2fad374e532046b6f963cd494a35f02b017d7cbf60ea77cf7c04c3da0222727f4573616d46788a8f95865dc6b4b53556ca610607e084cc7abb4918eb0c03a32450e307e331a300b7b65206254e23cdc4fe5f3adf4f4d07f8a48f30936bf88c8717cf73ef2e0cff7c8bef7dedd59a577a2763e31e7a4b6d2553e9abe4220d72eb2812721378fa36103e127828a3777735f82a518899f1990aac13a20b026bce598b96f11cdf09a260ab213bf61fc833a4d901df8a1d5cc6db65e380aa03cdf29ffde2386af7ce7f14da5646d4110f5ff6f65aa556d028154a2e23a5bb3909a3d432be0e92540eba682aa364db224eca2771a1e9917eb5216a2ca690dba7298bbcfed4094537cb5e3748d0504c1c6227583855f7081024071f1e1180204cb3db3af73fe990f69e17cd1c51407583f453d577f2e846338f4be621b5ccab06d2fb77389c4364e6506899471b5256e744a2178c112d46acc62661df2de425fe79f5184df5611f9cf94ff6ce56e1385e72b368caf34610dccad2107a6663d82d122d853c20f623a318472a13724a68f5cf3e1d57c69788a25100edbf06d69fcbdd08e516c2322badb7e5a0e593687782217a581db17ec61423c32f62286adadb8ae962326bcdaa78f0117a2c03d4bee52aa3a5d3b05a484591ee37b7055b15771d143ce5fa16b0ff5b6772a18ed92d442686e85222eb41bbd8dbaf0955156f020b6852f9682160bcec476050f18a440b4dcc63ba5dda0d40d57fcbe4ac036822bd76d2c01cd96db70004d2b24945e71a9a62a9662c9b1a295953618b743d778c3ae80e34d1c183159613c3e510caa31a6d664557c3aea21495c90a5bd58764630c94a88691b361661252f1d693856656e2917684ab4a144f300ce2ae5e59f43c7760e3b63762d206ac75f50a90aa56e78dac59889760c1c2d0d6ab238e246897182b672caeb307a58d96e3ea928245fcfc9ce0fa9d770561ca819ae9b8fc24443b75f9c15730e4c0838eb6c56f59bd0481254d0cb6d161ebbde5090b841132f059202a95f1a8bc60e83694ea53c748d450f8b55bea3d6e0bd3831ab009819979843a1377871352acd0fa61dc891a316155936ef57fdc60038fbd52503475fcf543d346489982f1061792a84d1ccafa01ac452d560f92080571cc616c0f8dc9cba91c5323d23eeb75d460eb4a5c913a805c3eb979d243489cbbf0c7c438c87f137a695d39358776071106ff287c105128e1bc9e96bf7ed47d2b28965a23fb44eb13989a7060d3998d091b8aabe01c2e52631a342c847df685520e205676d84e4850601395dc5d57451ba541c2fdb7e97b6697fa0bc99908e0a04512054fb2264464fe40aa008724f70ad50fc097d2a940302877cfcdb9f2046b86c3095b2a2a2292c38cf5413d285f72d9fc71613738f6bd250d46459c45f6ae8098cf213dd07055b02952b0a340a7fcf69669baa704aa9698ec2d1c8706cc221183811a327899d9b9b48576fb38e320bdc8addc9249a39f0a2dcb7fa3dfecd72b600f60097e0c1b029aa6f782c2968983b744ab562e98d2c25f966b30041021a6dc18e9833abd4300bd81103da89e1d1711b87c9410580586f844ec9d722647d91b4ddbb00727b5eb97ca21fb1ac49e6d7fdc2eba7c249e60cab12005a1f6d7090b4db484f5ede0d9695920854eeeb023bd73eca746e4a4c77a7d2d97cef35b32bceedf153fa60fcda2cc46f3a56c135a29bbd71c6633eb47ac341d4afb854c56beb8039ee594d3c86c471ae146a6bb2a1150c0f283176415bc6e2c4ea1380bf62052d2d57107822f2e0c377c9734c62ba6223f20083dcdcf9c572c8090923b042f1719cc434eb13b512a4de8d287ef826e9c495716ae4dc13ece2ba039d01ce50720448a0490d47eb38b43edd7ea20a2d38254213a0a462214c61dbbd8e185ca4347c4f2740afa96a96836046e9549313ab8de1f08de32ed8af02aab29d1d2f1a385b4a36a368475151a5013107a0d84ec1d984f65dfc381b5c4a0acd7f4e6009ca29b636a3f7c40c76f39987fe1841f4dc4068a3cc7351fe9e4349962453913f15037a879ee692fc19336acddf71012dd67f5bab9f21bc6bf19d74a5c3345dd5e18c116a4ef38ed468b9ea42f6dfc3c11aa0806f97646ee761c95decf82c9fe0fa14ea43c34d62b27fa83075cd1c2660533c29a833407da0e962a256a3af588acc8d76d3e7bff9312878c1e8d4f0d596b0ef6829ef9f4eb68fca82e307da6ff629ad4859b7f400d4c1782881aff78b136042d17a73afa8bc04a77cec0e8495e282eec7c2c2f6f85e5db674737113135a0cf3cc36544035d159b0879347a0a9a0287cc0c76791f3f7803492d69805ecc067ba9202ac38055c4071c03ce8ad018e77b8026f1f1b0c67ff84e38d48a3719f8a7cb775a8e15e2b15be50ecc8cf8a23f7be7becbbbe704dce698a2554a16c78690eec737e2c27d07f5608d9b37a8e320b193845e9bde39a2ac80d7fb0d1f73fa36021078b040dc576973320db264254ff9f56b5711ce07e04ea3b2d0580e17745e01a4e41e630525c8ed4265a9f53c5bf6bee5e634596b649ea11a2f0687c8bbcbad58485555f5022daaf214f260cb444c24566b0dc0a07fa9e4b9cb9341f0b422435c5146d2f54a6ae9c195ab2312655ee84aadc43e50701e0c1389b4f9c4c21066a27ca3eb1c059ecfe00b97eadf3d9f4e11d65d9d5b1208197b4e5dd2542f732699a061db2572b8684fef1acec31d13fff6c000009898297b6e38c23a0dc603003752cfee349634bc7b8823148b5f006a749c45b03714458efeb268dd2e194465c8f6560c26cc2f5824b8f4c9f47a61f6bc4600c19859881ab53aaea7127e2724f640dd9de5e4d887d7229a790b9c442487f3f71f4d815550b6729e8654a1a921cb30a64d504c74ae304ca5a0720dcf395b4de2c95e4b98a86dd6b873cb7a70da5db799caa0ca8fd053fd4a0d8dd644d2989bdf2c4deaec025965a0c65cec9cb029afa974d618903b288291a4b3357ba1d7396bac368041d00043c75a61f88b02997b5ed5334e060d610b973c581286979a36f037793efa319363eeda18eb4d516a605dbacdd19bfbf3386ad6344825ef46f4f7d607c7ac862a3e7fff9caf63f9e79b0c36b4585711cbf229b168bef5b2c2577d18fe86670ae02a9071eec6cf87a490dc8dc817660eef48712c1f9d9ff587faf88dd2cbf42a15f81561151c64528f3cd4f4e727540f6b1e04e1d71bc55ff03b859b03dbe73740576aebf5c79745fd125a62e9fbabb75e3d46d5597c5d86e2f3282aca7d1d5d697025d66ee7276defa7cd476dd4d2cb978d8dd817fb428214208905b054646bfe0828e6cdf49c67065a954c2a095e5a42ac15b2fdd331eba1d2a210daf8f7457d31afc0e31c98c2a165364d84eb168509c8789ca571ce5fa84aab5b5c8d056582836e6d997464c9cfa679c9d91d7fec3ca1deeabc5a58f2360b635a896447efdf516794324ae692d23cc2196ed58e3e8b3e3f70142c170c3651363aa2c62542dd7cd59f0aae3c909f326319b476a5fd0d5bdd78a11017842e57b45d3a907b1a885712239ee006d755e7e712d2be9e16f0127485b96ee8038952d9d869cf7dcac049c3ecbc73faa43929de6c138cfc555f491a7eaa7ea2da1180bb9664d3eaa4b25aa9d8b3e894434ec9ea8143d7a4f8368e17d11a2e23ed408b73fb20a39f4f1b82355ebb785059da58d08f82065a320ba13f68a6909f1b81579648ecd26e461c2f050f5af8c95b45ccb0aeb831c4b38d3a0b3e013848f5f12ae087680216e40eb4b2c99050b4f5652ba9d0b909e88d46082f5245b67d1c67d2ed1e16a6d2160fe4605d02be4cd9bb968c61f2888100a83ec1f548c5013061bced25a7f692bb02af5fcacadaaef8f0d4f8fbfcea1e323ece4206e84d60c8867c07f069bf1ad629cf426d4231b45a6c1f3ee48ad104c565359032531da02b8dfc4473115ca06781c18ba1b03c0038068da148091e09760cbfc9e4055024459b382b92db0e8a3f7069829384388681404e8083aa61f0a01fa204d0ef83296b561d23c1e5876748594266561766a0823793d38eb0a61e52db72f8264f36aefdbf02b15cdf2077c27d7b0dcd8056d1ae792f90edf50b95904709adcc172631fd8a67be9f8086b60a97101bb337b81f73b42cd88e1669e851a2814b82de712d15e3971b2b5a1213550a3e04b6ce2d87a62a1e154f1e839d4f5cb0b1c77c740ff8255d2b024a196d595c3a218d5dd0141672815298074038cb4f732ac7d3949a7131a7adbe03ee564ca8f198b4c184f1ef4ef7dd9a54d08f7273e7cc001bcc513a0fd0758fb859aacbe862d799b6f1b42e5a49ef9644829110de3a430316da0cdc6132e69b886c76066903a1ecda2e9c9985487a50e9874a6695b5f4d2277c6e9e80572883b3765d7e46b7e22e9590fe927da52fa332448d24fad6b8ac349c62fc134d4dcf8af0a613816c6c6788f7bbd4ab53ce0eccff2e2d4ab77c50eccbdecee91325db896fa054daaae573d0ca48faf39c0cba540b2a6812d85b5220b0cb52edc10b85865ec6713e6d9d9b62207af067f4f376966c44a6755ac0230b0e1aef4ab6e3c1c71972a3612ea1ac919b9bb82918899984ea22f6047edad4b81ff42a97d404bea5af548a0e4d93d8e62fcadbbcbe392a4a7b8b35ea1105cd47c2d498a186de399589821c621f31142aa33daccb683973735c275650fba6e58cc24c49b9d7fcb09f87fe98e036b7eb60225d04cfd7883cf6d272f2a5047441d90a90d9cd95ac075fcb53dc80ab6b0e48cf25ff3c4e910c13d270156729b0b8a866601257d887e2d2d5a170b175e7820f906372a3e18ae2b3a7a95a7917923d46acd049ef995579dd8c49b92529bd53b5f813346f510dadc5cb31892e92daac9ad6ea438986704381c86a3492c33b4c337b455e6f21c2bc6183b29bc8ca7f1488f4cc836e34926639010c5488c44a40967d1563817d4593e69a3ccad8cf8051cb8f1a077dd6ec60438f1546f84b1ba5ed9d3aadb13f03a5f39d46ce35a53b9bf63340613d85da61ccc5c3ef5658a272f7c44b3d04433ce9a6f43398f001de6faabc9fd7b11a300acbec9be8f6bea09b9abf630d68ded6b92da41b2a3551b5bf2dd607c7351067dcd23e32d010d762d587c241c9912f65460b5c3dd68512a0715e3eee8163a1f6a3d94024e2b812a8d46982986fcaa67358dac089769ae11c4ee4264ab1bb5604e509585146eef013c58e68724452723b641884a6dd0140c022d423f70be514fa495d48ad2c1522238a954b092a2bb82b12a21a47839e4b6aa0c03cb71ce71dac5dce2a62cf776fea01e128a9a33c2468b885a58d816e0106226fabc0c9261ef6679186e2b2e15c1102a331241206b028bf7034533e02dbed01997c24a9492fa64e6c3aea555401a37e90f3dcab9ae4184ef0feb8ad6c4d83ddeacc281cc37c2011e0f424e4747608dde000bc7dbcdfc656672c4bb64477304957da6749c78aa38d679ec2ae13749653ce261b13dbaad01730d8e45717beea17809454715a5cef1b4100304ec04dc6435950f8d131d09f4fe3225ba3423389e9d73d272bf3903417f78346b1d582ce1439d5dd758aeeb2ea017ad02719162a1e61c68302c5e3e95419cffe9053f75c7ca0a121f466bc1544066beb8d724ce664f4189707858ace6156ba29a34e98b77eaa16893da3d8f396e7081f034d95d9a545ea7ac502a2eefbacec326ec244e0e5e37ca37b385e443e1d7c505ae6d09f603942f629438e2113b5133e2517a66a7d47fe08e84046578dc72f947628b4599a0f1128df96ec013389aa0410e55cf0ae3532832e05a94ce843a697580d9622f02fdbcc57feba33755992b18cbd9995cd5f06f00ca2a32225b0227c1f8036aa5a94792e1000db798911c6153e7bef423a40bb0d0eb0b1a08aee20f5b20549e3464e6c5590a066741afc11b42b0a64d03e03ef3496f283c5ac113ff23828547dd62bb25397c13d8cf3aa210aec2e64cfe73deb0d36caf1ace176e30bf7632968285e5ed3531fd942a54f1b0cb59d2979ddfad9e2652c33f31fc8720fd85dffdc0f0eb6e346ac42f580ecfe1be68efdafeb98103dd4ac6238c418b4e45ee5af905a0a4e6c946c18b2d05bd58c084d06a64571ff704b7bece18d59df49dc760fd18d8acc670e096abb8338ab75b1e30338ee7aefb986eb32da7c77e61e39cf67711fee278b1e35f5ac028a49bade9339ec415ffd01f894c85b89ca57e7fa28923911e3aa108f84282ee7e60e3ce833df881463a831af5ae2ca6c794bd3ef651f8a40919ed23030104c68350cde773f208fc8f2e1f8823b4a444a79dcbe70bfd54e64e312526ecd9862964c930203031028cb426a53595cb17fcaf7decd9d56305e8595428f14614e790954a4f185ca413d9425fcb801eea0683f9f1bf44dba942da5ba518ae1890e7dfc44d4180309428cd3d01c423a339dd3197ce47802933b265c10b1450deb37bb5d310fe495763fb36525a7fb6b8d6df7a52f45f8764027ab888e089a29b67b805f7c4c03f9ffdfa4aaab892e262aa61ce22703b700bba227fcf535bef6264d0c2a0ee596395420bd972987b72f679c5fd1c37fd2598c5cad599db908ed148d14c7e27fc086bbf1e0fff8294a5e675c55ab1d601b3abcc6c62974d1322379dd11f586d9c765826c05b2ea1f264555236f4854e6c5466ad456a577b265252b3e0b2daa367a685345d0ad5431d5a376b3a63649d5491cc11a87b556eda39da0dc19779af4b4072c947f47147da9f26d2d3c15130acc878b3e6eb2a2e9fc1a308f0cb9361e9baf917e55898cfaf1856576420a2396d8b6ecd826ae4e0f3b7e208d50b6097d121e7d3c095fbc46e04e312e0536fb27ff989200eb7fc7975b7cb04986288a44d3d1ec53335456a2fcd48d14f9e628a08d9974460cf695a306459022a19a969a6faa1f77f35851641acd1d735b6c2f44fd3202ff8285c48e0810b3ac0134a8dd4c9605c4c06863133edca8675a817ad8be1c9dfcf0de2fb987aed7f08a8cce226f0f09933dac2b7ca02c338eac4da013640d46bec08b30e7cbaf695198d2e8317e491db1cdf84dd2d0c7c5c9119e56fe466f388c485c643e09f553392428df16961b19d84b30d00a5c497329a45dcc6ca1e18918e2782423560ab13af79a035aa55dab93eb98410994864e960db7a0f49a97bd321eeea238e03d85014abac471ba52f6d0448b4c21839ed1880a6a4f46d3c7ad5b28ae58b09953b703dcf066877cb351eeed9dde599bea4a0e553e6a3d4a9fa79fbd49e9c466fc25df4b75c40d51d96d2486a811162c43277635c72334d95cbacc32a1032a96ce63593d5cf5ca5b783116af9cc5b68d267f096061f491d31c5e2a419d4bab909cc0dc1bb76fcd1c90f25dd7fcc3a027e5a320b62177422e5fbb5cafca0a97a169d11036141fcab02e83848248637e4591c176accfb62ad39eb693394f38fdc9f63b2e8d1d51a35eb33aec82f42063ca66483a203e32a5245dcc0521a91666a2dd4b45662461e266abc86c13983081247dc3e9eba838b33bcfadadf071fcc033002f8d7be0241cac5c49d630e04ba815d1ffc2761ad462ad92611391712a0ee3c5174df61c20791b50e5e316a392b6f0d37a2530b4be396fcc86821a0326d3e24a921e8a2246623e43de59135b345bf82a1cdb3813b1af4161562368a27339478a8c679c4c5c730cbabe1476e636331e483f5c35cc79447a5ac9db265cace299ba92cdfcafd7448764719eebba36ac5f3bb6f67561529a911b1e3f0a316ec6be34c013cd5775692486d8d222d49878ed5e2a1432b8d1649509902b8d1823d0a588f16bc29809e2da07703be15433d08484f16f03603724c69851b2a6e0b39ec29807aad803b59752e8455fab2c26b30e6ffee43f0df4efb35f94c524377591dcb5c930a666d8e999f298219255a2268d88d1279354ed152cc27239fb6791bd6b0cfc3b44fd0800dd8f00ddff05ff40ad1162cbd8d6f71bc8fd7d13a26468eeac20fb90c0e9787e52cb94a698a551cd6254ec51d40bcb784b062ef2f544b5a6b1bde0e77eb030de186ded7eb7a5d0feb513d64d53e4c9d73fd266caa4e8caf5ab319e413487d49becbe7d8181fe37c6c8db171023ec007d838279e3745eef84b36805a830d2e57e03b7ee72edcf51b3e8ae074a708e5fa38c30e02b4ae110a2575ac76d0912591a80b781eafe375bc8ed7f1ead1aec2ebb9272ad3210dcaa23a8aa366d4a4688aa078aad40822840c91e89a9db36376cc6ed8c2288cf8886fe1857df89a22cdcd237c818f9d778a4fc48d724c47b4424f23e6824e0860e1ffa3b78357aafba7e5765ececb79380f9b9c991913e009a2a33a82236693ae5ef3c7175447738a816370132ec2e2084ac444402c5f9925ac3840b83b7a47afe86554c302812031980ef4a995030e38233eb6ca9db90377fceedff5bb7ec7eff80d876808e68279348fe5b13c96c7628cc426c005f6001da7e3749c8ed3e1a96171669a4b6337dd364d2923ca3d06faf712f4281d693991331d50f34a994144bb906c5fa62a347df5e449182397644f13645f95001803d184272cf486af532e0bb73ecc6083e4181b11ca05e97ef6529bea90ca1cee113625963e06fe880d7209146023d0260a48f5ae0f0dc274b98428ec010c4a2a324906356f1b2946e4d9a738ae1b85b5fa637a500ede80775e5e2d513daf00d0417b320db3840e8592b3204332f0186485d06375c813825ce8c69bb79fce2b60300e249f877dc9d8669b878320e45192249af2ac52dfa4d964c2f0b0c75c3da4acc8018df435aa4b415a8c9143e6043e7e23671c57e2eede4dad2ff85fb0e18067077b1c6a5bd406672100b7083e1d58ae5a7db50c832748d3e9b761320cbec237181638356018b404d25047d82f18241c698407c1197cbcd351060dd40180ca47157057b375c788e12507ce825d2540400c8b7c492cb80ff5bc7d5766a1b503af7a856562fd089016104f7da8fd41304ad4c5fe0964af81f482f8ddeac59e8e5642b58ac634bce825f3fcf8f07ba3529b97e37b34c207c58657f51e22b9482a4891024a0aa9f05ad489e5e621211498eaa8174d47ec3e4a02f1d91231c59c8a0833d27621962c9528295b0eeb0c9d7d3fe850ffa5b09cc9f34d02bbbc715086c7226ca546b4736f2295f64ae26740aee1f9f58661d9dcd4aa790b0170e6d86b4166978990f5ee352d556b8d832f78e7d8afcf1e33f6cc4f57b97a145e733998e72b2674796353d2dad0b33dfede4237562f745253b8111ce0760be0e66a2c8fdbb85d88d510f7a7706f18780b438b258d2aee8ff2db3075cc719c7cb1143d4329d9f7ac237b6b934237a464b3b6142d88b5ac83d775add946591255b516650f88ee732ee19fa090bf9d83c38600c71fc338f7cb1c5aba7b1f3255593da3e610bd43d63103941b83f2cc2b40287a1c8d62aec8ad6e029745bef9a37e226fa90eb3cb4d7c07a8b58f82c8973ad44bdd9443152abe8b77f5aeddb5bb766ba1166aa4400a5320f5523a569ec909420f2171faa23eea531c8ec371380c47e16038088705cccc4bb5b220bad44c30c488f27c640e51326b21077a2197c5f058dc880b71218ec7f1387cf6e15f42fd6e1bb10c66ec06547ccc2e40370623289cc459ffc99cda81415044418cc4488cc4261c5be5676d7a23a32452a504a55232955000f5500f755227f52999c5021a638ba2a73cca231ac11303622728822338822332221139110cf9000d5f860f8739ecc2dea7f3749eced3799a07e993aca0d6e3792fe4e4ad41207c485fb25da6189297189b6bc5d8350c2c4eefd9bd794fee518d228cb62505029a5d578e3630b0b4d001000000000070014d3f20967dbdb5b66089d9f7e6659249c2a2f40196ff2891524a49ca94db50373be3be9b88208edb40019b0834098f08b678f9fe417351c3c898b8f6e107746fcad5a05a3e2a531fd0abad75dcb7f6a4e6e5035a2aad5c9bdb4bea94f680f04eaf3debbadbb8f58050f5149f95cefc27d43cf45acee2d9563c20739c4e52c3db67fe8e891a637edc012d736949f88b793b27d30ee8eeb4b9c5d5c93aa0c56ff755fa4ae7d8241d90f1b2986416d3e5884bce01ada48e7b999a943909e5f01107949ad7abc165c5669e55533ee080f63371c1ede5ba7d9dfc78036a9567f145dda45d960b0f5258c08314167cb801bd5975b32cabdb80923909cdd29e63c7341bd0359a397eb928e584b806b4f83ac7a4f3eadd17510d68d9e26d8e26b3d89206d38096b4fc7771b328c4cc8306849d66529ab3d498e6ac81962b5c99126ad294fe0ce84c2ffd756655597a33a0c35bf3eb8ccb80188f3525738bbe96c88016577afe2c767269f318503a537f94ee8a011dbf4c93d65a9fef30203e4c6b3c6040be76d9b2a6104d1407321f5f40c7cca985d59965c1c437873ebc804e3d9fbbddefedf09ba8a1e8d8b123f8e8024acb9ca5d6b22cc60717d02d6bad31ee5b683e2d266a8bedc716106ae3caf5740cc9f8d002c2c3a4325165ef8ae0230b68316aa6b7e8e1b53c1610a6c5d3b2f87ae55740eee9a846ed192ba0d4e70f7fea992aa0ef645c5ba5e56add530199ed9269ba773ea94f01a55ccb92d294b89cd56a20dd4f4aa9949fc6982705d477f4b499a5d5a9f734d09d32d44f36ca957714d09a31e7cfa796895ae72083840447e7502121393a56727c4001ed51c7334b2da9adbe383a07190747e75039ea821b9470e0e309083f71fe3aa3ac91d39c803a196d1db6f3b5b43701f5ba757766f48309c82cdb6a1297399ddf4b409d909fd5b65102f25badc6d67d625c69286d5ef09104749a869754f4751ad742c4071250ff72e6d4ebf94f6beb98427c1c01a5495378b9d97fd6ed0f5ee148c1ede1c3080817bba7a589cddc9954498181c9ca490d52e5a3080879c1ef54735ccd3a1c0cd466d14cf7f797ca1e18c8cf9279f3e39ad24abf40ae7c716ea239fe76d41728e125b63bab65cec35ea0c63b3b96caa442cfc30b7496e95b65a83c2dec6617e89b951bd73a7fbccaba406bf98e314a0fe702993ab8671dfc95e7a0c105623cfd27d792542935e7710be47c36a92e5ffe058fd9003d6cf17bafce92d4f72fcb89472d50abf45cd28cf5924c152d9062ba4c9cd6c9ce2521090909894a5af6fc516bc7e7f9e0c043166819ab657649f3be16722cd0b2784ac98ffaf3a7bd608136b9b1625bd2e95acc7a054aeb67e125a53d8a5ddf15c85f2d9773f8bb6f17d50ac46c47ff16d375d02c670532099749a9e7f8a639ad021d7b3e37e60fdfdb49aa40ea1f7d79a6bbe5cc391568b1c57023b7eaff5b450532dae7be5cf9c2750a4f8174fdd6ac29754c818c5ab2177d3c37b3ba14a8d7abf149acccb15d5220fb33b433358f51a0e65c50993b2b29f5c53c4481d626b57e6edae89ffa50a0c5de2cbdb45a0705dae52c63cc768e6277fa044a89d98f25e3d8ca397902a5d9e57ad5d5314ddd9d40a76ed327956e3981d49212a7b3f9d9a16f021d4d9dce3a3e5dea536a02e1b9f7b21c579809a4ce3625bea7be6a4ca0c3c7cdfa4a69cf65628f4ba0b596e3cfe5366eb9c712c830ab194f6fa71268fb984ed5a5afaa9d12085d2d674997c966d54e02a55ace072da991044aeeeb8ccb8a0452cf8d66fb6e255d7590407e508d316e2f028f47203bb3ceae7487cb31a623d0df1a75e78df964bbb7d34620e5cb9298933abc246553060f46205b18cdaf77af3666b58b402b7d7d61765ec969d9eac143117d8ca9bdd8f55cf5b2088f44a054cb7277b6e768aa4d4504ba95dcd4211eabd3f743205c76bd593465ffa2986a0874ca2c6e4cfb3e2eea180b8196d4c4bb73b5180f422063faddee32a1e1ff978084440781d2975956f36a6a59cf181e8240aaff76caa66b47de0b3c02817c614da7efeca5d46931c34f560c093c0081525a9d9629e35579cb4dd494ea13c3e30fcaae792d4e34d967a2e628ed8bd9c0c30fe8b49deb5b16b5e846a9de0e78f401fd2eb4955c2d9fc0830fe814cfd2859dd344cd8c07384e5652cec81078ec01eda274ef74f7e95bac7a40dfea7e52a2e171eff0632a8f92a20347e0910764d6b31f46fc774deb281e56377db571bba983c71d1edf6c713b5f26f9d0f0b003528ebcc655aadf64bd4cd458051e7540878b72bbe16257737dc649095076b460cf4e96071dd0ae84fae61795121dfd384e508e218f392095e95e9355cfcdfa250764c8cabf9cc755beccdc058f38a064bd8b9dcd92f0fb8e066b78c0011d753ec73d66b9ea6413b59b83c71b10eb9a7dbb67b6499378070f37a04e6a27f9413668d6cda2b243478af1680372e7773f972aafdd97dbe0c106e4a9cc7cab5aae54b3b23578ac019df3ed54c3d633c9c9430d2821ea9a4b4b65133cd2807ef558d349bfa001dd6a5c56e69a2fcbe4af8196b4940daef39e9de66740a86edaa4da74565dd50c68514a5921f79ee7c560191e6540caa66cda7f943a07ed9001a5e5645355a55ad9596340c60ef3c2a6ce732db36240df6868fa572e3ebcc280964b4b632754674cad604096cbb22e87c609cdf902523cc87e7eb9edc9162f20d7857da96df6e1e5b50a1e5d40ae7dea96757101bd1d4ffa7f67be26d718365060a30c16d82021498f2da056cd6771c34a99f56c1e5a4046fd8efb73497d703b0d1e5940f68b69ae65cf9e55bb98860716d09fa547975f96e1eee22ba0e5a47b63d252e6afd69d287858012dab94a349bae8e2a2a90ae741056492f3f3da33a352abe53105a49e3acff975bbf1654f091e6a20db566b5bfacb66eb4b01ad553bed67a67e598ca6814e524a739539b5a9591e5140bbd6be379bc2e57dcb030a68cbb2ca874df72cbb20a2494bf3923eddc27ee9821b94ac783c012577b3d897c52c266a8a6d94710227783801b9a6fa4519f251db49d5afb4e3d8a1a30c939527210984471350fba2f4d21c555de6c804d4665433f995a5b4a02d01fde26daecd7339ba6925a03d272d95e7f04902d2e5cf6af91f44023a67707113aade6f95db0d42be80964b2a354deaafdb6342bc80cee2b32c35a6536e8c877401294475d6f5f195102e18c91650a65df8d275aee532440be8d2b597aba3d88a99d17610920564e628634b68feacbb4d140b68f932d35a3eb95167b3a262127205d4dda8c9d7ac3b68f45042ac80b497f55a16cfc425191d845401ed3aee45f574eafd53124205b430573bed52ccb4cb3d44c814d039edcc5e5ed7ebe1a99891928202f543881a086f77b1630bcfb2f57bbc10220574d2793cce9e9ffe75b510920632fe4bc9b4529992b20a890232e6d8a9f13bef942d1984400199e5953e9fbf8db78f9e11429e8056b73aa3d62c69f9b4588e1027f0ead3ca96b5ac2a3c8fe3e4be10d204b4cb1c45f31984102698efa5d6a76133b3278d9025782e658fa9d336c58d06214a40680be6c1e52c7e369382434812ccffb2fc2e75f009214840981c8fb6a73451943eb99182030d941418fc9b604fc5042147407a78a73dd91fe2f214428c807899c6fd6397d8ef4c4811509eb7554ad1b94ffd828150193c9dc6153050325fd62eb8929f4c6b13552980fc029dce37dddb454d2e0720be40ba4cb6f65a1eed30958936482f909e31ec2535ae5fffa701c20bb4acb4bcee36b69bc578a000b28bce64d4a254db395e124aea02a55f76f92d4373acd34c34b700920bb4ace76b73e65432091fe55589193afa860e1d8fa270b40909c91836c8b002082e406eb164e6b26cc7984dea9e9965ccf93b6f148db11a20b6400bbb5f9a536bf932be5a942c20b40099852c62018b9257a0a03405405c71019056b0e24056a10a1494f60680a462a52700828a07809c62a52d00620a098094c24f543a55008414eaa4a4240220a3700088281800128a920680806201f9040a4a8fe1894efcaf929495120d80700203209b2839c921c60a8ebf8146c36002209a38c921060440328101104c2cc825d449c9caab3000c412273922005209098050a28402209300019144c9490e315ac70e31444022517292438c1abc8002209028f91dbf23063ce04197b1019047a838426502208d700008234a1e00b288068028e2012089f000418408c8213e400ca1009042a0c570f7624ef6cdbd2704f2f67795ec96fbe6da41a0956c5958e9b2ccfcde8008c28004025dbebe51a9b772bd321f4000817cb97dd974a8f20ea32840fe80de8c6a1b6fb3e74f9715207e40f7ecea0c195542beed033aba942dcbea93fc6a59c9d63acf3da065e9ef7d42b56cdf6e074a9f9109103da0e574c27e6353903c20338be8eb1c02040fc8f75e999ad48e0a903ba0fbc5e5dc8ce6bba9c7c18313326c8c3106881d10be2555e9b4527540c92c9fbc4dadd301ad64cee326cd51ea98cf0119ddb4a85e6c2539a05f6f8e1abea637c71407b4f0c2475f311e9fd50c07c4b968797aedbe01352e6a6d2a625aed6e40c918b7954b2dbe6fae6d40e6782ebf16c7debc4736a0b4acf3feaf3335e6b30664e869f15f67ad7fecd48092ba79739fcc69004103b65a9fcc3827903590c9fe5cd672dda5d5cd19d0b2bca4563eeaf2939b01d9f9fddaed2f1e532f034aeedd6d6cd7f8763519d03773e6329eafd2391e03c23ee8b7aee77cad5b31a0e5bcd89f83788e49a8614047d598e52cca7a8e07c18076594275ce597754fdf902eadcdd4f8b32e6a96abc80d6369b51d3a75974af0b281d27ec3b567e67e65c408bdc0bf3622fb5e77b0bc83b97657e317979faac05846bb0d5310a390b28cdadb9a51d119f1716d0c2fe3c4b539a598b7805b4dc98e973e75ad65a0169a32f3b55ab912d5d1550e72bc364d8163775961d39a880ceb2490ab9f1ff735153409b0eab65922f66bea8ab817c596677a5f157c6bda580da2c77789964380d8499cefb55b3cd3246012defa59c6739db8c865040a6f2aef560fea57f02ba5e7e8ff183a98beb38012dbbdca55a68d22cfc540069024acd73b76a2dfdc38a41988092b2a3a76f514bbea81c334096804e4d32fda7d6735ad5df81d26720881210dbf91a57e67bedfb268ae305673b4eb807204940ab1736be6cff42023aa97e7d2e0797ef2b3c023acbaa5c8cf18f8c1c3bd497808444fd8a8e1495921c3bd42b358018012ddcbcc49ea7d70b4811d0f9a663462d0a93994a9fe978733bf80806facce3478da36a539384f80006da84ac98bc14b32d687e818c7ff5d9b9eea47c96b312b3c3c4872f509aa1e273c6d7f1f5b590f8e805526ea7ceb235673da649457cf002ddfee28c021b63d838c11825b031c6a6f1b10b5d20e549693ae6fc391ec5b940e6ce1e5b95eed4ea724ff8c0c59ad992c6f062ab7779b77c6725d3fd7a898f5b205bfa7a17d569a38c1328943f591fb640dfafe624bc5dd347f5510b74cad528b567699895cbc0cc759c7dd0e2483e6681d69276be55e6af6e36287cc8029dfef36eff66a1ae593e62815219a65c92e905c3072c904abfbce3fd3127fdb3525274c0e015e82cad8b5bc2331fae40aab1d352c3ab4ff0d18a9416cd54c716d77fb2c1072b50eab45e4aad3e5b98f8ae63470a193976989192c202d3467cac02996a5d69dc5f29a596bcc2872ad0f27266996f27b367d9e5d6f0910ab43eade5dbac6ea2860a74e64f31a5e5c744ed98e1e3148bf1827cfe78a2a281f830056a5f9a32f530a57468348a42497195ccc4472990295eabc6d41f6f743cc3072990e531aa55baeaa53c33d7f81805e2a5bab86eef13ab29c3872856d5623f6f7fd08c941493921bc364e5a4062a30404111c3c618366c8c61630c1b63d8b8f12b2a689061a30c16d84067b13fe3840f1fa1406adfccca526127445020a3766769a5d6bc2735f8878f4fa0435e922d9d66e954adad63e507c8c61836c6b031c6a9c38727d031e464d814b762fda6c24727d039776312e72d9fa7c4f0c109748dea5b9395a734aa4848bef0b1094d203c8bcae38ba74db2af4c1834d86b358f2f4ca0f5bfd694bdb9efd4bf04baede5bf6cd2f4adf396407dcc9eb6ef7c25d051a794318fbdf33d2590294db73429e63ade934069e9b507d7bbedb69104425c76937e4e4502a139838fcbaf4302d9bae55726575deae38f408bab61c3a3da9cb44c8e40b8f673d3936904e24e9ad4ac9f4d6596188196f4346fb8769c8f5a043a5eec4ed34617af2b022d9aaaf64dad540b532250ea6f65aacbf15d4204e263d07cb9db719e3e04c2cd5483bb3a3b1d35045a5d37ef89693c7d21509a7388e79b7e2db526044abeac1a65263521ae41a054e7e85a7c6352a78505817a4f2e6697dea6840b07e2a84eb8bcfa75ce9c01029de965d3f29702ba4cfb28334b14c89c62b642dd6366ba4381965a3621b7f2b9aab3a0408e9b5a2dbca64c559184c4ff0c9b82c827d0f16fae57deae74ad2f31e3838827905aa59a17bc5ecb6c5a9d4068cc24c594f493911727d0afd136d86d562ebc6b139ec7307232e95f13c84df79976a35a8f9ecf04d2e4f9f92697bdf93d26d0b1ea2fbb284cea18fd1228cdd3712fc5d4cd932c81f26c2e966e9a972eaa2b81f8ec52cdeed7636e2925102fd966f96b9d04d25cfe9c4e85ba543f258154f11ec555b9245b3e9140aad8789fb66520817c179396cf4bf308b4b8d8ac5dee7fbbd23902b5dd9ac59ecdca3bbe4620fe75b996316704c2b73fed45b1328fb92c02ed51c934b5ba24a20884c66cefa5d5db219208554ca7d7597f1622d02fccb3e8763f9ec821109beac5e3be68ca576d08c4cde7fc254ce5a4273a5616e380482150dac75bbba865d3f65184409e3ae51aa36aadf75f84203208e4b9743aca67dda66cc7f1282544101104529a7033e1c1b32b110904322bdf78e1ad0508b4d79d4b75b2745acdd71f18f38c39653415113f9cd6639cd2d55a4cb3fa70bfbd9b8ba3e93751c391726267a38c13dc3803ede148394143840f26cd347515d3605a8ac81e102eb3b8d9e8aaefa55d0f083b57be1f85ba24fd3ca094bcded9b0a3081ed0f14e9f96e49b6c79357740681673da0ea79a9eaf1dd05ab33c194ef4418a2a5959272a5c07744cfbe9f13f992e57840e887f172feb35b3b8a0cfe19863db3fcbf2ca01b15ad57eaf9c1795227140e60b5725e52665263f292a38729ce8ae081cd09250fde3727049a8fd6f400b5efb39aaf7fc14bf1bd0f25d73f2c26f035296d2eede796f3c556c40a76c679525858b93a53520a59c164dcaf42e3dd58096c3c7a4b4051f17b59c3420eca3cd9ffa8d45d0808e4ade83ab57d1d8c26ba036bf2ca70f3351dd82226740b9782dfba83e113320755666d528b34819905987bdbc5afb2264406bf132ffb7f45a36cd2232069447d7d8d1a44999f522220694f295ea7eba89840119e3c7d82dc6eca2f6d20f4ed6ca8e1c2b3b5e602eb841890744c0800e932b95569baaad0e912f20e3acc93a0f1b8a78012dc6cc3ab7e7a6225d409da97d29856e86472d269a47840b288fea34af0cd5928c1b2311d9025a657d945acef8fa6c13d182d23fb4dd054d1a225940bb6c9a0816d05acbfaa94c99b9284e6a885c0165e7bdaec1eff58d2c6205e46ae525b771eafab53710a9023acab3cf2dc88a0a288df256677db6a85653400b66ee2fec661f315d0d84dbcf2a9753f5b9495240c9d3b15b9de23450ba4ec66eef7014d062ea4a77516bd592bc5040c652af5a7f0c719bf50948a95cfa7d8bb52dc99d804cdd64bbb2cd26a035cb13abb4743201f9b984689ced309ee31290ab3baa04d46b57aff575c1ec739280b45b592fa96f97578b04f498def5989d9aba3c0262e77d5795eacce331024aa91e574aaa2c79da225204848bfdb2b57859827116e6954a2d85687a6d0830502366f31f5f692565ff055af7b8aed5d0ee57b72fd0a27bc96fd9fc956cb017e9e4aa3ebc407c12f39b356c6ad3cc2e506a4f75ff8d2b55525d20e3b89cbced5c2ef4d8bedabbc705fa3b2a8d7fa1c9c5f86f81d639f73ebf4ed2e5942dd039c73157aa65af4c772d50b625dc6595da937a4c0ba477dc2cab8e6f5eae9c05fa947e6da7f56f8ce664811653a9d5acfb9daeb158a03bf86effbe4b08426071425e81fc32d3ee72cc722ed35c81ecf8515cf3c421ad406be67f318e9a27283950741817dca0240321ac40b779f7f7aa16d6ec5520637ce1b4e639f58d952a906f9bf5c3f316920ab48d7ece3bd5425081cca2be49add15f7916879c02ddf3a26ed8b07faa3f12923405b274b35c5a75b694d34a8c4d4f11520ab4d8bdeabf66b95f344408291072e2e573f1fce7f4390a9449a93bde8d7cbf388bc28dfa71576b5628d0dadeff5167975f6d67d608010532839d7a09953ae5e73f81cce2b3fd784b3dcf326708f1044adeaf521b632bc14ea05b1e0f6ae2cd576a0e07219c406638f19e76f2cebcdb046a5799e77d611c219a40eaf76d49fa68a49292bc4c24de9d5d348b66d9335bd6423081d2e99ee3d96a932d4b2f819eb57d977f959ef46709b416d3e93fcd317ae7da3784904a205444b5d20d9b12c84ef74e5ad3ad86adad103209c47d86151ab624f62c32a2a9424824d06f5aea73367714ed9021041248fbac455329dc74d2e018421e8192afa5d0d3d76e2a5c0c18421c81d08e3e26bf43a5d24a8d402639b1f3964ab6dc8d1108176e3a4757d9498b3e0c421681d49ad4bc87151eb6ce9542882250c2c785f3a45ea3886f46db18e3248718651480092189407c12e2b3e9fedb054d082290b2e59c9a6d5abf090d09090e1d3b120e1d3bd231874049f138beaeb40c81f0bc72366aca96f3c90b8110ddf44e5aa67c0c3321509e1ffbf5d35eff3b21834086fa8baef346bdc3152208f4760eeab2cb7f2dcf8c869040a063856dee8bfd2b7308085309f903ca63ecf0fccef27cba6e08f1035a70ef14da397b36b7e0a5a9581fd02a443f271d2f4dafab11c207644b7737ad5e9e0eeada033a9aa76cb13db5985dba0524243f08d103b2f36e8c2d7d7ece9a86e401a542d3fe4529e3e69c9210820764ef976c59ab53cafd5582c6ca89778e903b20cb45adc4aa7a592a0ac79720c40e68f3922dfbb6da97ce540784aacda4397d3308a1035a2cf94daaa68466adcda78119ee2728173207d44b3b95e52f8ad7ad9703ea6499f76699b364e67140febccebe2cb3f56c0c07b4ea4bc2fd5ccc5173df8016b5fcf64a471963ab6e40bb6699793b492d93a66d40c8c6d25a76714ab6b43113c206e4ccf668329175b1e557d689890a5ec81a50cd2636cbd8ad891a0a0a4adf50596341881a90c145637af2e8a54f4cc3f984ea6d163724084183992a363f9ed0a4b5861e6d67675b9eeea6cee08a577dbfbebb19d63bfeb79d7f9701379d65b54c06f4553795ca6675f1319c77553effca54a618aefd2c3beb173e1306c475aee90b950d1e18d82caac5021a40e3c0621c38b7dc04fcdf0c3f57062600015f51d9a1a3000140237140010150d1f1090081ca498e564000ee00800004800367012100808a4a222180007aa515490102d02bad5274901c000003082301394a4a160080007c1c00016164018d1c58384018574089bff69e2e59e2b1823959d1510564984cde4aa8962ad3cb448d31046150011de6df85aeb69b962959941d378c07c298026275afd8d368622b9f71a2769c151c272008438d1c375c0ae664e58c13b5a3a4240161a4b1f22a37fe8601c2880252e5ebe6d6a5a555bb6efc0dcd30a080542e9a8eaef6c4c552fb8dbf9137fe0686f10473b2a2c34405a5a424016138012d87bdf2ac2d9b80eed3540fbb318cb610c7ab131fec0a8e14a0e0036130012d878b59ced954d766cf1250a65b10914d3a8b6a35266a27262529282b3852508223823094604e56504c54baa42401612401e1f9eee53f664d74cf769c95a813ff1c2a6c2b384e8c0a8e931594931c37525cc340027ae38e9a971ef96fcd0a1a24f8c1a3a0248c232cbc8e19fb4daceee4077fb21086115e97527bbe63d418e54218454054cad27e51c507292828290b0d23c1f8f76f3c7d3abd2f5b1801461ae43b26795a4c54ed0c23bf48de46455ff4cc178f6addeae3b14fc7d60e467ad178946283b8f02217eb6e623fe9f3981fd9c57eae63ca0ca3eeb135a20b5d90d9f09aa74cb6ac9f29d1b20447ca72b940e774cafd5b7c55dea789e20a8e3fe3b10323b840e7328d2e954b2eed4b8ddc0229ebed1ee509532d5713351c9d43a5c4078f636d9471821417909090901861c416e82caa921b650caea4eaaca8b4e3f0418a3a5bc1482d10abe596c93d73365f2505c54bd0d0b1c2642ca6e3d3890e57493b5416a305fafcb3251db51c97b4c7476681b419cdbafbccd4ea8b0a466481ceac533fa9b933248cc402e59fafea9ffd6f3334514343c1082c502b5c9fdeaf8917b5e42b503ff3da256f4b5cd6b2c6882b902fcb65b5381fef5c4a4a4c2b909eb3549a359ae64d254a6a1c5fa27252527296a2c3fb4649091a2bd0beee2a353d6d8e7bc29155a82239e739ea972e6d55678ca402edf954a838ad36a36fb0194105d2657c7d19bd7d6df21da740bfff78ccd2da9e6fec64c41446b28c9402596a9a937ef11b218559164e6673b86a0b9af17ee2a387f1a863e79c51a04ccbeafa85e6b84ebf2850e2a4742d8b8d95fb722414e85579b5f1e43755ab464081966673d6974c5cc8499d08463e8136e1a3a1394d5c4c5a767802ad65357d7fbfe6a4754cd4f6eca413c89c3fdaaa764d67534a4ab2334e2073302de9386eeed80472e333b6ccdb2ca7ad279a40cb4f62578b4a6ae13f3bd21f0f76a0340d463281ceaf5b76952c862018c1045a12cf24c4a3471d643551533931f685914b20e335bb984b54e99c8a0c9593151c2a5818b1043adb34feba0ebac1f595400bfa3acba925d9f34a4509b476b98d595bf2c3a92681ce94914ff3fe72722549a053cbe2ca923312e8bcdfdbba596bf32e410219b6b598f7a5d406ff11e8972f9785c9e92e9d76045aa7fca8446d6e04326fd7aae69919810c36a6eb5f072df1d145a073d3ca325d2eeb284645a0d5a9975dad7ff9f54904d2e59cdfd48b31e8bd1844a0ebeb5b8b975aea716de41088edde198dd2360452deb820aaf6f7e4ad8540e92ccd62fde68c39794cd4cc983042088476e717dcb5f0dc72191904ca63cb532b5c82406656aae595933ff57e20d0ca4dc9f8bb5c726b050864ebda710faf650bbeff01b9595e7e394b273f204e272daf472dbe8b53f701a5d25b30a5bc56baacf980da7be9ab3d6bad2df11e50d2765bd42d7ad0f8d20332c6aa33eddc25efca03525c6b3cd197aafd573ca0372713ae1b655f3f7a07b4e96676521aedc511ed80cc99f9aaf366bbd5aa035a6dd692e69c16d39c744069543db2da5dcbfd397340c6d02f4fb93972407f47d559c9ce2a77b938a0f65d637c561a1c90fbb95a1675fe0d6831cad3f25d26f3a5dd80f25a33cf7ae69ec4cb481bd049ec7d7ecd0b97b21e8e11362085a9f63f9961d2765f035a5c19b5f9c78e1a50a69e32c56627d5b14903f25f963dfa3a9f4c371a10e2597ed14dcafcdf2e236b301046ce80d2b2787a36e5fc4b626506740973a1b69b9dfd2a03b2b4ce3715729ed4773220f5dd8a9349c6fc5d3906e467519f7ef9a3ca66570ca8cd926ed5182eecbc190694cbb5ff27f3ca0d2f0306c47a2b97fed3ee376a19f9024ac7f4a5dddd8817902b4b8dc7385d254b9d3f18e9026a63d3b78bbf51766e2ea07756988ef1d1e45966640b88d5497d96eab332cb7a440b685d3def728b3dcaa3a01b8ff23d9205c486cba5a3699765564a0cd721469ae34043e58460040b486f59c94ce1693cadfc0ac8fd17c565251eb518e7112ba053b970526a2618a902ba73a8986eb96e30420563d4f2a22fb9283c074dd4cc189982ca881a3822855bee9c2ec9986b0edfb99134109ec5cff0fab551c609ee4a30120594962bff6454db081450a3f39a94f4fcd29d69ef64e409c88fad7b3dbc56529c5e627a881127a0b44597d309df31e5624a4c1731d2046494b1b5dedf6b4e07234c408c6a35df56d320469680d2bb95f36f62638b5f0988352dea93f1fa37d72909c895aea9cc4f6a1bb19180f657def2a979b1c5938f800ca7eab54caae7aeb34640baf41eb56bd6a6c557ed305204a4e7bb7059cc2cb62ce9fccf303b8804035d2f5b767f255787b381819251f9415b7a0999f717885742858ad79e5a2b8f2fd0aeb4f86a552b7b81149e94d4e272945d9a16e10562c3cb4b9bb5e82e502fd60beea27794264b5d20e434feecb54ea65e4e2e50ba526b8daeb57653860bd4cd7fb778b935b702915ba0949617ea5a4cf53b8dd5166897dfde4bf966bd32973210a90562b3d2a9a97932aca8fb01115aa03cfda3d4a6d63d6a586416c83a1763b37c6752fe9aa8a91c59a04cf485f3961d4ed777059158a06c4dcbf95163dcb35004164839a92bf75ecefffa5f46e415c82c5e7efd9c8522ae40bfafacbace542bd05a3fa74f19a775ca185620a36f9be6b8d91bf3cd20b20a747ecfe173e64e976d584415c80eb7199ec53c71f254a0cde59579358b67634aa8408a866b7c393bfeb32c720ae4acd25a8e468d8829905b9fa356d351257722a540c96ea983ab4e26aa352c889002995737dafdb8e970c92e888c029d89f7a8848fc562712c1289c3e150300862907a7a02231308303034248a0462e1904c57f63d1480035b322e4e34321a262416090662013118108602c140200c0a83c160201444712c139530ec013d255f63769cd1030e7f080a4c001af111017486b8296aef4dce122e7c159c720beb20150181c0fda5e4daa7f8858ef5d0d145e2dad24221218ea23f4750daec1a365fc243b08c17faa103cb72c6b1be43059f19d66ce7324ffc1f80d6f9cd71d65f99f4186673ca0d3cc88f1c5f46f5a5bd147a81846522456e56e4edcd68b207d118edf50b542e314e0a0990136e5de6084f34122fedf44900346adc0b425783280ada959c51e80f7bece4dd46457e9ce5937e50dcab23fb0341127c60d2dd8a96b432209b97f212bca85b1281bc29e896f810fc51efc114061c69cb072f568e5317bd8f50251fe7d557ab3a2dc1d67832b71c4cd743e5b256d1c9ed523bd0ee451a8925731566b5c1bdfc9de3558a5a110288b79ff6029b72b468eded18253eedf23f668beb2cd62aa0868c85230e042a52afbad76447e8ba6da123662e00b36f9daa5c9a1ec09d95c7e88e917ef1a50c2fff3f6111879b8060ace72cd39a9b9349da91b31514e2489783746822caeb6d40fc83ab529e9ab3101449ff25f5878034604470f9bce0c36120322b9755cab1444d0f204f4f1d45c25ab7eba66fc296c65af8034746d83a28fb10d9859a13185823fa6097f4fb1e7b3164b78e182b45a2e34827a05af1e8c1dc6c151e09b4c343c8bd6da821bb7e4e90492ebb876f7196a83e3384c9eb6550fcb3c164e9a6d5e14e51982463605c52a63bc0b9f88a9cb355dc82ea22e29808c4600e4511477417ba168573e4b72eec8cd024018ec062cca5f9447b9e8431369d3065b492df83a378cd9bfe7deb1ead17322c97d80baec9c249f1d5693343dadf1da780d9838511af59f606d065983bac9149b896b63e51e3b14f7bd2b90997a56aa9f9d358669bc6101c5c93b8dadd47085ce6dec16f90dfe6eb1d86b0bfb04f1bab4cf91c8dd4e4c5fd62e1f8bfc082066abc032807e5509d4a434b1d0d5c5daa82ba82bb1c505a813abbe648a380d8540a71e538d107bd6b80d08bb336990cf8255a1c589b7b208c620e4285185ebdfa69b87fe9c2f9396b0026770fbfe7f4862d211a150d10f53dd1132ce5e3160554064e2956311565b8cd6c0ae2250aebde20beeed0cc68a551bc509c451966f4bc3a9c8bb0fd9aed31ad033ba80933e52023150f2e4dc6318d5a4d9928acea3543a2a034342616080c0103d1c0150326b113b8f63158eefc141a8d91505bbc1346106ec9f9086f387491e0673036ce5deede41a30071d9352fc1f98b490931dd91071f086cb84c202238487cc30f4d6fe6628f85dd5fb3c1fafe42c34a704e7c249253c2290bd831ea1619d94e91ab90e8a819d175e75431101ba0e2842d050d86160612ca2346049802b5035e00d01da011bc4fb4f9f3a50052343b51c0549639a825a3d08eba144f8f5ed4cdcf8c118698ec60bd52eb606d39b1a35229f87a5fe6ccf3b43aa2729b08a4a23ecd13101264fa7a4e140691bf4662024c6e437e31c3624b0cc323debd4f05c049f14a14d7365639501ef42b643847d9701e36f76ab424f6cc6c66ff876601b343d9d8aca01eb0d7aeddb74f9eee9b9303639ee34a52977e26116b2bb17af2eceaa62e789b64bf5c1b89e8b8e0d5cf0041f5070c969603f6472ca62d9b1acb60a80d3a6d25e9d9d596cb205fd201b05f875125d984157a91f3a78bcb3b7fd6195f40cb8135076f794ef3717db0b41fb36ab42d900474ed4615f0ca5576bd304066242a448900ea8c898870afd03feb099064f063ec45a818e772d6ab4f3d051f12c4810edad33ae1581f408e692eff4d0f238f9fae2402247fa25f8fcc661ae562148591b31b75cd28bac3aee2999c34ed0889f36e1e89310beb12d64864ff89f4babfaa8d4dde54c546d3c3265ba6c46e625c6c690f6d34868967a5e90f2141a123055251886c7693d436551109d54de0d3ea5d9b644da59b238c3af2c45c030a91a0f16ec67c15bfb0f7694206a84cb800942905341528a9b4282221b66d8047faa12848570ee861d2cced8946f681afd2f0015492e662a7fb602d769bd2a10eeef2c08bac1c188f41de02780b138e241a1ce62cd430a6a72d53fe503c758cbf4329934cabb41ed08a30511ed0a9cd38374d3f907e508b3717c2d7443076ba262aa0b4c39ca0aa665b0023844622ad07355b8f095f409a8eaeba8797e1af02b28a6c9a5be51a723f043d5476d01785580fe70aea15072565d7d397e870f81015fc215891aa3099ec4352bcb055e839185107dbf1698339a8885765079c378c54c50ca9eb33f4e79e8aa7cc886a196b74fe0687c60edc747c0ba13418a0ca7148b9d2bf6de3fbb714f5f5f00070513c055109de530b7daee7b17ccdabf2685027e9e74b3223ec8ffa39c550d380cca0f87e575a4cf7901fe01a0f4e9552d18974af4b9c4e33cb96c4d7f2b0fe8c50011b7c01236c9b11123462b1cf363f8efea51139abeadbb56b94469395fa3d7d907403073e9ae885ff0f3e5033524917823020b625b29a65231a1e97e99118bfbd512d74e2b4fa080b7d38f6207ae5eafbcc146ce0b57a343c05f72c7b4df5687a48aef778e7fbe796c4e3d503d177786fdd95e049bfc7078203e4bdc1788fd25b00cad966356820f70e4e42353d360e361a425fa9d728c215331d8e9b0d44aa853063a0e7206a9522a48bf2d3546be69b26eaeb6e8bc3ba7bb81490640d4af1ebc67edf76dc2966423f9d56cbb51265cb997efac6e594000a9ddaf764efd1847c4c590bb27798537cc8b53b89c8641c10699914841e3fca3532b37a19b012590ce708417bdc71d0ba73b2a1b3a4bfa6b4b29d076e43a61f5944e16cbaa2d2092035cbf22d1cb4c0fd68997222fae495bbc216d0b6f58f000682ff4ba7f2096a5a3908daa00382a41005bc07f07ae6f638bf6dda94805eb28550d540ee87eb6e5955c2f1e5a9b7f69e94ba43c4c0d9ec368e6c7d565b10f1efd0036177e9371ff8ab4085b62ce1280a58aa35feb17ffd068dfc999879413a5f09866278672707c4797166c1467d915f856c46c2f2b479317980fcf5bf1c7e4baddd55cec96c82eae4a6e26ebc7342384f98882077dac2def911ea492ab3f57da38214f1260609268d13103db56c5d007b8e446b316eb9ec3743b0f8ecaaf4a631d91ccc2578ac4f4f08b6364da5f7790cfdcc28c27d80133fbbee418eef755d92af1ad5f7a379e87abaea80baf7b26983f7ac9eeaa22c0cd07e45cb302ef9c2db96ef358e3cf606bc01cc6d2089e38f21c40494057f80415ca452a706b34d09d2e3bb20d024b94b321d3ba1907cbe1a038972e1a8285b91f4bf4f513dc55857d3e309a405eaf75c655b2250369ec9ede3ce1fb2883ac11324490c71eab4241ba8e0de568074522439cda64afc63f8a985771e474f2b3f05482461e7b5e5b0a4c12c22b6337d53e1575e81925e146417446be5a5433ea1cb7cbf191dfd0bcacae17aa063900ad21cc28fd6c0f8024a066e2a48e8f7883e5720a4e1a201e9eda994df2f727557701976b10eb98eee0440a13ab803103c21d24984eeeddce2ea9b0b9e5dc6fb9458c8e88a74a42927923883ffe08bff1403b554ee0869d851bdace058412d5247b4f9ecd98da9b927586eaa2b7784964a24e8e15c97f4df7fc8f24e8efc3d6a0f092754d50442c8f29af07dc865bded0d97a0183768d8caebd7b1c6bbaaaa68866254c73eb755c6895c7cfc6fa716aec63c879f43159027456197bca394a6f5136ee3cca175a27fe73889934032c5c3911ea713c823283498677b41751bc6443c12c7f6cc60c29ba85432634ccf7cf21a2e2e51c64eee99cc7158b1b5e3e62b606c8c19e1500ded73f65dc63b5439836805a345b5b617782d4acadc361d0ca0c3fa157bef09f342894e61024863e63ddcb5b80c7a4a37c5bfa26d4e6375982b797de0635dad4a65dec20a40560e880ae108a81a735b7427df5e6cf6e6c69447e9ceeaace54f91bbefb1824fc2b37930fc15e89880fc749041c5e1447dcba626fdbe606a8a215e1422518c8fbd219a844620e040034fbd1c49f23b210a0e375a752989a28a99c54339ebaea7ef3bca4c3f5dbbba0a08a87502ade6023e902e571ec1e35257d30f9478b755c5f3d1470648d4585f172b7cc50114eca4a9e507984fb083030ad4b4498724e4f9b87b38ed13fb6be28c242eb9916f747e28b9274e7c44ade45cd8eb63a3b5711947fc8aa2dd5f65dd51079e5e4559435db954c9b4b8aa319448e748dd7d5472c70938b8d9c15a21bac0a59ab33e96e0c0f51e4ddf1a76c3110d0ee8a5852082ec11036b054c5f3bec2e3b7182cdf3b44ab88e1cfc33dba4a8b3a4af9ed5ba61e74ea07546477b14c7e148aa86a8c1910da58c30c35e20a8738e113d23fe8cc8e244601ae3d947c24e53e042c4b91cc8b397489f3ddd740a85fb7a404c16af28a918a8ec44672f2648d0587489ad6563f384893b0d0b8710ccf2dcaceeac3f146435468852151ca24c157557c5f4985cbd5e206b3540d04ffcebd84c6d029182ee11d4ee11c661e0242e4e4f252efd0fd10628d6e9e605effecf13eb2d2cb14283f95f0ae0a3eb3acfd5d850622e2904f6914009c755390a0b953c926d07637901db7a1b64c9edd339fa95f1cb831a34f067472dbb9266b7d57d281d21f8d84f867e7b52a6e5c1a06bb93f3498395b631c7aae7eb9ea9aeaaa9b556533312d26d3c1f0af654292ed31df58c712972a9ac77c1f7561dad5cd11d239942b14af10d087705f6749002410b75007fe2805e57133c55eae005b7bb041c552f85915c590e5ca5412540516a09c5133cf5bfa21896537080a076b07e2c0f04bc63c59faddd9f7bb0a5270ccef220c339dd48d2e4e550fb80af4851f5bc3d86ba720cf9680e531f6396d8705c8ba9c08742ecfa0befd0781391339176055c3d4a05105e7cfa277126d393e34e3059e179d01e4acb3c023fd5a129fcdb20559a51baa4a86f1f0aca64edf4f528b691afbbbf21e519bdf9f4ee964fd336dfbd106fbaa4fafe227330d744204e10372873a497f4e834018679ad030331128d787766712248adea63c49236e68cffb256a4cfd89c8c38e74d4f4e2eb52a70109da51a740a24f33c07b3e896d1759969294f10111a79f0e43c3a2c7dca9cbf77d7a656c89e71ab2ff469fba5877fbd3916dd2643ad394a4a0d73e7abd49e4c3adff0700638bfe08fde48d1276807aad19d5f780c71b088483e72c36c7f329b19ae7ecd9d79e08de4cbd4c1822ca00282303062d8bf95fcf9d620c059c1fd125819d6e0e6f0f418cdf29b01deea4519286d5b3842e211a4eac2a516282bb45dbbc90b4570e0b6eea6d272a785f35c87dd3c0cdcd80e70082d732d335bbe0be09aa6172cba724d1b7105391455d3503d7c485b3c51909618153c435d4ed603657da623b341fe5a970ade78f94d6eb2a3cb12b2090af0ba532ea887e45b33a31099057e84ec3068574d83c85d2bd69c409fe4f51c8145b8b3a97d30d3a087e47891baa864458ed568356adc6f9345281ad76d7699fb25c127882a82978bacc452f14fa5e67a5eefec273d242ae40070bd0ac841358bea082fa885aa6f42e69786eefd3c618c4ffd22d5df5a63e1c0c2258676c15c0d2e3168bc72a76cda7185d8893d687f3264cb17c1b68040b42d4ca109a777c6e294935011097d16d8e562a9a75bfbee00dc56faba44d39431e4ec0de9974992beb3c37e6e78a36800b454bcdd05c087421646f46c8bfa50eca3d2c41fed3d14d4ca96fdc9422d42b83824f5974b74c220d9ac950cc59f5dd48347ee4a7276100675cb6b32b6bfd835d9e996913e5af85f77ce435ba5633612a01fe8d889fb075c0e3a8197857c17f137e55885cd7de17133981ec9859c432fbccaabf45081af793157949a29b536a8dffba9ceaac4ce8deaf27eea78a7cf33c81b808f89151db9425db24846999c56915da95b98c482c0537a0e8dc486a0f80c85a9b14bf2cc5bb8af5c52b14d1ccbd4d669e4529e82b623c52a44c03e8a181ad3bf5cbd037b7e5a1608159c0e06cdb14451c408fda369031f9c6ab19286865302deb5433d1bed080d3e2c0cb0eb8468a25a99c401045a1043889c4b3c2ae28e89ffbedfc236fd28472d2cf34e400335f2e17a226a440773892c44711e1ed57bd6a98c58fa2b5a31ec952488ea730d6404b71b8a3a520492178c7fa055e283f9afc7f8d08786e6520e5065448db199e34894ae0a86b24f92dd4c453e85705ebbaa7a04ff2561df7dc6bdd1796c73af3407bb036ec2bb6371aa9fa228899d0bb5dc8f8d5c709fe958678cf34d060eb3cdd90d319d235eb6e88091d81178741307eeb61d973ac0f2975a3f7833897081b2120d303aa3a7a47ab1a3a361de47207d1055598d94e2b7c13f3aaaa0ebc83c786495fc267886129d1f408823a9745e82c0ac0893dc26b3a2e0e4da4effbc294cb32c68d9a6621b81e642a4ef4e6bc4c9fbff742cb0f3d7f6e58cd4907b7b0852af40beaefb7d84c5ee7963de4dd55e81f907744f99365a967f853040165476bbae917a8c7344d3d33507d80ec8b88d32f73b8282f1fccb8fc1c33dc4089d960f95b9fd62a36603c037021837d2931a7268d01ce0aa23630b341df32d86c8f215ba8de689741edbd1d48e0dfb539f8724accb1097a95cce50fe41c2ce60fb682d2552d1f9c09ac14609100fc02a00c003100fd01b80000458ca5d257a0e7f5dd4e9714409d00edb3eb7a3450f4f4ffaafc03264aa0bf012a22701133129d2603a54b06b04e00f40580ddb3ccf4b3c0013b094437803311e4dd0198b792c2740444d431795e922033b2f71ddcb5a99e42660861354d2ea2b50c51a13d058246b67434473f23596988bac52ead5b40b1e738b34980ab366f8d71e3add83484858ee7a5a4799c62aab5b0e58d7a7691b85d5e3f98035e80176df3c51dc6d0f39bd11ea2a9df05ec966e71fe7ce57fd8dfb522aa6b012f481290260755ec59262ca6d1f36653f267051b6fb1a2b7ffa712400824dc304c7b2e52742f228c42128c53499348c428dd0c1a56c7dc751849a40c70f22c29c86ef93b20c78b717855574c495d0667ea0ea6977afec9bb412e3fc371f97bd59db516438d4e1dfd45b3eacd424b75167b3e17cba369e6ab99807d5814909ba83908f71a4e15d5981f38a9ddc1572a97045a3a67f3a5eca3c0e0cc1ad6709b63bfbb1e96db1f055b69ac09570de68fb79b3b00b36b2ae01ecee86a98f51eb71c619201edbf99f40a53e4efab051b44935abd0fc4add925e066dbae167f9986ea353c542dcbf3fbc5385dd84e4e236b0e8753bb40445e54beea74f230cbdceab6f0e02a2f9334aa4e5b7cd988a9ab9c7ce4e670a040ad20bed25e7a41078908836f28871bf1a259e6de9851bff903d0ecae01735f12525712d353245cb93ff8cd23a958352a82608689e6924e5419faa546e9600d1c087595286b6233ee1ed61a60b9349627bbe17d4f7b6f2351c22ca4e803b1d82ac545b60b33f8fe60d46f9bf01068b7452e69ccc6909ec640a1c47f4842101d89b658325b92c1c76d5881c38507f1bd9e1aa0b05d4343a82cd034575e09bdef21fb0a925b20966052033a32017856b875238a0136c0adef1466e6597b5bdf722eb5db6d3129db3dd0474df05ede16cc9d8afa4eb32e677d0ce580cd78bf0aac4a16e7ef224691674dd776bd8e0fe157f0a92a77f0fe273268bc3ec80c99caf7c51ed6b33f4a71cd4849bc1f4d7d013ac1e2c1f4e9e7ac21dc1d84b1077d9e0daee4dfbabc1dc429ba26b10494497bda29180c1144f702c194fea9a8ce193860655d60d4395711d9c1fe4655f41365794781a518078ee0500b188efecbd805a4f23cb62c8123021e41a782da6cb746c7416584b2469935cca80e53c1065f9fd9816389c3dedb003e0a5df2d376f279f66bb5996781671696149d9b4293e679975d4b593d4183f076e97c3987686029b75fb4b13a57f91f5637d3ad79c7f71e4e552ded3c37317b78bbfb01bfca56a3fdb64b9413fdcdae2b97c3704bb8b9c09516b4cfbb4aba0a89c820837cfb36e81f243b07eba3252f7055b0410c91cd65eaaeb89955f6379a690ca2adc6b76b1f18a41d139e877f361d3e2adc345452bf4b323599c3a11a86569a82c56a82eacb3c563702ee43f0d218bca16db546c5451ba503bb3a06a28b11ebaf632d3e1c7370b3bb4d80b21294a6264451850a948c0902bb001be42b3892eac7be79aacac0c659a6c761a4b46b7a4179d7a6bb8bd7c878e75d62f63ea05da3b1964ff6ce65d26223f3951b42af9f81ce340f3061dd2a14cee33b589aa4d79b9da9baf41217b782f623361ac05b3be5508ebbd6241e0856bcbf20b1580f9541d1f7229ae93cca71660ec675b0a1e63a783894cbc2a4dd5b5a317d2d42af67e72ddedf1ac1c60994e9f23a358dadceabf5a5fea3e282d39ca240df89f702d4032e657478db92b8e51b45bbbad7591a99c86b2180f43758ce3a97d296082f412bb8e80541cf805ae758df8a28f2b0064335b9205d9b96caa9cfc2da1f5c8890c1c8d8d52664554232ae16827ccce40c8dc6cfe3d705c4ee135f197aae296163768cec2e6d93b29dd36ad4b06b0602a68d966c1567a340ecab052ec0de4222aedec84ac78235b8f2c17c7407895bb9142b3c035c317eb8975eb96f9cbffe795bd1d0159037907132959b65c82f78252049292ddf2890908221d340f8118e504fea86b7c301c05558602942ee468095c6646285fd7892a273e03e6b71439d05daa1a09135661622c871dfd9f0fe3e8a969c7129cac7bbad77b2a37f536db886ed422ef89e6050a48892f53c2b91a67d8f5759cb583312ca5f4f5ed7facdea6dff46073c772ef63985aad9691ff52c454acbd12b94732dec352c59e90bcfd1f274471edd9cbc518bb8b97939090cc92d98c0cd0ce551c7b44971aa97dc2f9fa4237046238e52912e942b565a85a9daf7d78e8e8b64b8927750884c958362f5576dd128a15ea6a23b0cc29e18ef73a48a4c44933b63717ca0fe769bf5c6817644b3d2b0c784bbcdaf5698c344376b4a2208b3d86af8ce0d3b9a202064dec1bf48484059a4affd8830990719f993c9a92f5fba19fdb4a0a6c8c18a0b1d7303d6b9342f39eee7531a7945a07db7225846c438cb272f905e60e0b1372c9c7f1083f5e5d1d7d2e577470a93889baf8e2cfe26f8be01fe17cd22e2aaac076d3061ff0391780ba38e27c62fcc2877ca72fe2a9435c4161dc3f1b28f4652afb2975db0305cf1ab8b927f426044f688ae9a806829debf43a65f7b04cdc91e9d4bdc0a693473e9d8da110a31b7275203579c1fbda8c6c5a93f1e6b40a0953d64a4dd4c1f6ab7db09247b8b988ded4362f5c5518a4b03f19da790889994e5adea9ce8d6c1abd7ea7285bf2b8d69d4b9a5a8e52a2278699b80134b5d045ed641c7daa9260220dde884ef444a11cc07196f47f6e169281b4d9a9a606a581a3c06c01579d040cf530d76e31e06302c9ab518e78a57ff0f839abd8a5bd77f00fd71a1757dc3e53a49338ae9ce22883757268e2369a95a31c5cacf8ee901f7ad3563ff94967cd235a5012636704f7e56707408bb1685a8ffde1a68aeac987612cc2c1e4f3afe1ba9ceab67e97bf5d13c945539af0a761933572442dc5fd299cb83e0e6cd2c680ec25d9cba02a1555a388a855f8efc78a413872859783379f24d4e800e9b2704178139b6bcc7f09736ef1f1d200fc62c6fb58522050e87801de4dbb6df5ffef98c2197f6125f9ecbbedaca96199e241aa0cdeec72e9316f28d3427ec7eb4fed81cc981a1a9f1e840283253477fa8da60a8f4264f7afc5494a99b501e1405e1ec12a26c2cf95a996d15ced9a25586866b890a884bcb9be49128e56cf80ffca0bc193737a71e41b6731565159234c6e33273296a3ffa8ab03b84ef44e078b1b4854e81cc2e8c43c4f16a8ff1d43266eef576784424c683cda1975c52d04960e8074f3fa9d048eb4a65880a19700704970c05dfbe8ce02908f24f1425eeaed6fbb0c9cc8384461ef09ebd93b11b525fb5a178588284769e5e3a13fa0414e29526d36c81f6195496ebf2c22a46e1b69ac39014efd5df8cde5c3981d58317cb5b5c642a0a64a5dd7114977abaf359e9491c99a66a10ec1313d2a1602d60220043a3a8513b73a7b40d9093d88087d121c4dcdb24c9234fd83029abb14ca0498565f451c557b54553102d49c6c615e9340f87d3fa5678bea55baa29951a3da96c8f8fb865e23e47c8d6a708b5eb4b4ef6f290e781ada15ca9d3dbc3b7dd3b59485078259342322e3ac21ca451a2d2b6be01ff71968790cff57c3448274d23ef8990d828061602813249f2ae26479e9aadae911c51cdbe0c23ce91464cb702","patch":{"aura":{"authorities":["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY","5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty"]},"balances":{"balances":[["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY",100000000000000000000],["5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty",100000000000000000000],["5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y",100000000000000000000],["5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy",100000000000000000000],["5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw",100000000000000000000],["5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL",100000000000000000000],["5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY",100000000000000000000],["5HpG9w8EBLe5XCrbczpwq5TSXvedjrBGCwqxK1iQ7qUsSWFc",100000000000000000000],["5Ck5SLSHYac6WFt5UZRSsdJjwmpSZq85fd5TRNAdZQVzEAPT",100000000000000000000],["5HKPmK9GYtE1PSLsS1qiYU9xQ9Si1NcEhdeCq9sw5bqu4ns8",100000000000000000000],["5FCfAonRZgTFrTd9HREEyeJjDpT397KMzizE6T3DvebLFE7n",100000000000000000000],["5CRmqmsiNFExV6VbdmPJViVxrWmkaXXvBrSX8oqBT8R9vmWk",100000000000000000000],["5Fxune7f71ZbpP2FoY3mhYcmM596Erhv1gRue4nsPwkxMR4n",100000000000000000000],["5CUjxa4wVKMj3FqKdqAUf7zcEMr4MYAjXeWmUf44B41neLmJ",100000000000000000000],["5FeDrZvvRmPRkAvViFjwZgsiCTA4EKRbRT5T8wqVxJbjZaKy",1000000000000000000000]]},"grandpa":{"authorities":[["5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu",1],["5GoNkf6WdbxCFnPdAnYYQyCjAKPJgLNxXwPjwTh6DGg6gN3E",1]]},"sudo":{"key":"5FeDrZvvRmPRkAvViFjwZgsiCTA4EKRbRT5T8wqVxJbjZaKy"}}}},"id":"torus-devnet","name":"Torus","properties":{"tokenDecimals":18,"tokenSymbol":"TORUS"},"protocolId":"torus","telemetryEndpoints":null} \ No newline at end of file From d8b2393f7d6e7208fb49e4c0250b708c8a36ab64 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Thu, 22 May 2025 07:06:09 -0300 Subject: [PATCH 21/46] feat(permission0): create new curator scope (#97) Creates a new curator scope for the permission0 system. This change supersedes the `Curators` storage value in the governance pallet. A new extrinsic was added to `permission0`: ```rust pub fn grant_curator_permission( origin: OriginFor, grantee: T::AccountId, flags: u32, cooldown: Option>, duration: PermissionDuration, revocation: RevocationTerms, ) ; ``` For now, only the sudo (root) key is allowed to grant new permissions, which we will do through a multisig dispatch. Future versions will allow curators to re-delegate permissions. The new extrinsic allows setting different sub-permissions for curator actions: ```rust /// Permission to review and process agent applications const APPLICATION_REVIEW = 0b0000_0010; /// Permission to manage the whitelist (add/remove accounts) const WHITELIST_MANAGE = 0b0000_0100; /// Permission to apply penalty factors to agents const PENALTY_CONTROL = 0b0000_1000; ``` The value for `0b1` is reserved for future use and internally assigned as `ROOT`. The `flags` field is a bitmask, so OR the different flags together to get your very own personalized permission. Finally, I removed the old extrinsics for curators in the governance pallet. --- Cargo.lock | 5 + Cargo.toml | 1 + docs/permission0.md | 278 ++++++++-- justfile | 3 +- pallets/emission0/src/benchmarking.rs | 82 +++ pallets/emission0/src/benchmarks.rs | 42 -- pallets/emission0/src/distribute.rs | 7 +- pallets/emission0/src/lib.rs | 3 +- pallets/emission0/src/weights.rs | 88 +-- pallets/faucet/tests/faucet.rs | 7 + pallets/governance/Cargo.toml | 2 + pallets/governance/api/src/lib.rs | 4 + pallets/governance/src/benchmarking.rs | 268 ++++++++++ pallets/governance/src/benchmarks.rs | 204 ------- pallets/governance/src/lib.rs | 91 ++-- pallets/governance/src/migrations.rs | 47 ++ pallets/governance/src/roles.rs | 60 ++- pallets/governance/src/weights.rs | 506 ++++++++++-------- pallets/governance/tests/application.rs | 17 +- pallets/governance/tests/proposal.rs | 7 +- pallets/governance/tests/roles.rs | 76 +-- pallets/governance/tests/voting.rs | 4 +- pallets/permission0/Cargo.toml | 1 + pallets/permission0/api/Cargo.toml | 1 + pallets/permission0/api/src/lib.rs | 63 ++- pallets/permission0/src/benchmarking.rs | 303 +++++++++++ pallets/permission0/src/ext.rs | 477 +++-------------- pallets/permission0/src/ext/curator_impl.rs | 174 ++++++ pallets/permission0/src/ext/emission_impl.rs | 371 +++++++++++++ pallets/permission0/src/lib.rs | 67 ++- pallets/permission0/src/migrations.rs | 17 + pallets/permission0/src/permission.rs | 7 +- pallets/permission0/src/permission/curator.rs | 76 +++ pallets/permission0/src/weights.rs | 305 ++++++++++- pallets/permission0/tests/curator.rs | 131 +++++ pallets/permission0/tests/enforcement.rs | 36 +- pallets/permission0/tests/fixed.rs | 13 +- pallets/permission0/tests/lifetime.rs | 13 +- pallets/permission0/tests/stream.rs | 12 +- pallets/torus0/api/src/lib.rs | 8 + pallets/torus0/src/agent.rs | 4 +- pallets/torus0/src/benchmarking.rs | 136 +++++ pallets/torus0/src/lib.rs | 29 +- pallets/torus0/src/weights.rs | 345 ++++++++++++ runtime/src/benchmarks.rs | 4 + runtime/src/configs.rs | 7 + runtime/src/lib.rs | 5 +- test-utils/Cargo.toml | 1 + test-utils/src/lib.rs | 67 ++- xtask/src/generate_spec.rs | 1 - 50 files changed, 3267 insertions(+), 1209 deletions(-) create mode 100644 pallets/emission0/src/benchmarking.rs delete mode 100644 pallets/emission0/src/benchmarks.rs create mode 100644 pallets/governance/src/benchmarking.rs delete mode 100644 pallets/governance/src/benchmarks.rs create mode 100644 pallets/permission0/src/benchmarking.rs create mode 100644 pallets/permission0/src/ext/curator_impl.rs create mode 100644 pallets/permission0/src/ext/emission_impl.rs create mode 100644 pallets/permission0/src/migrations.rs create mode 100644 pallets/permission0/src/permission/curator.rs create mode 100644 pallets/permission0/tests/curator.rs create mode 100644 pallets/torus0/src/benchmarking.rs create mode 100644 pallets/torus0/src/weights.rs diff --git a/Cargo.lock b/Cargo.lock index 5e3c6df6..a0a4cf53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8470,6 +8470,8 @@ version = "0.1.0" dependencies = [ "pallet-emission0", "pallet-governance-api", + "pallet-permission0", + "pallet-permission0-api", "pallet-torus0", "pallet-torus0-api", "parity-scale-codec", @@ -8885,6 +8887,7 @@ dependencies = [ name = "pallet-permission0" version = "0.1.0" dependencies = [ + "bitflags 2.6.0", "pallet-emission0-api", "pallet-permission0-api", "pallet-torus0-api", @@ -8898,6 +8901,7 @@ dependencies = [ name = "pallet-permission0-api" version = "0.1.0" dependencies = [ + "bitflags 2.6.0", "pallet-torus0-api", "parity-scale-codec", "polkadot-sdk", @@ -16748,6 +16752,7 @@ dependencies = [ "pallet-governance", "pallet-governance-api", "pallet-permission0", + "pallet-permission0-api", "pallet-torus0", "pallet-torus0-api", "parity-scale-codec", diff --git a/Cargo.toml b/Cargo.toml index a40a505b..ae028598 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/polkadot-sdk.git num-traits = { version = "0.2.19", default-features = false, features = [ "libm", ] } +bitflags = { version = "2.5.0", default-features = false } # Frontier / EVM fc-api = { git = "https://github.com/paritytech/frontier.git", rev = "b9b1c620c8b418bdeeadc79725f9cfa4703c0333" } diff --git a/docs/permission0.md b/docs/permission0.md index 4cf6d3a4..28c9ab93 100644 --- a/docs/permission0.md +++ b/docs/permission0.md @@ -19,6 +19,7 @@ pub struct PermissionContract { pub scope: PermissionScope, pub duration: PermissionDuration, pub revocation: RevocationTerms, + pub enforcement: EnforcementAuthority, pub last_execution: Option>, pub execution_count: u32, pub parent: Option, @@ -28,15 +29,27 @@ pub struct PermissionContract { The `parent` field enables recursive delegation chains, where a permission can be derived from a higher-level permission. This creates hierarchical delegation trees where permissions can cascade through multiple levels of delegation. -## Emission Allocation +## Permission Scope -The permission contract's scope defines how emissions are allocated. The current implementation supports only emission-type permissions through the `EmissionScope` structure: +The permission contract's scope defines what type of permission it is and how it operates. Currently, the system supports two main permission types: + +```rust +pub enum PermissionScope { + Emission(EmissionScope), + Curator(CuratorScope), +} +``` + +### Emission Scope + +The emission scope defines how emissions are allocated and distributed: ```rust pub struct EmissionScope { pub allocation: EmissionAllocation, pub distribution: DistributionControl, pub targets: BoundedBTreeMap, + pub accumulating: bool, } ``` @@ -44,7 +57,7 @@ The `allocation` field determines how tokens are allocated: ```rust pub enum EmissionAllocation { - Streams(BoundedBTreeMap), + Streams(BoundedBTreeMap), FixedAmount(BalanceOf), } ``` @@ -53,6 +66,34 @@ With `Streams` allocation, portions of the grantor's incoming emissions from spe The `targets` field identifies recipients with associated weights, determining how tokens are distributed among multiple targets. For example, with targets A (weight 1) and B (weight 2), target B receives twice the tokens of target A. +The `accumulating` boolean determines whether emissions should actively accumulate for this permission. This flag can be toggled by the grantor or enforcement authorities to temporarily pause emission accumulation. + +### Curator Scope + +The curator scope defines delegated curator permissions: + +```rust +pub struct CuratorScope { + pub flags: CuratorPermissions, + pub cooldown: Option>, +} +``` + +Curator permissions allow governance functions to be delegated to trusted parties, with the available permissions defined as bit flags: + +```rust +/// Permission to review and process agent applications +const APPLICATION_REVIEW = 0b0000_0010; +/// Permission to manage the whitelist (add/remove accounts) +const WHITELIST_MANAGE = 0b0000_0100; +/// Permission to apply penalty factors to agents +const PENALTY_CONTROL = 0b0000_1000; +``` + +> `ROOT = 0b0001` exists but is reserved for future use. For now, only the SUDO key is able to grant curator permissions. + +The `cooldown` option provides a rate-limiting mechanism for curator actions. + ## Distribution Control The `distribution` field determines how and when accumulated emissions are distributed: @@ -79,13 +120,12 @@ Permissions can have different durations: ```rust pub enum PermissionDuration { - Blocks(BlockNumberFor), UntilBlock(BlockNumberFor), Indefinite, } ``` -This allows for temporary delegations (`Blocks`, `UntilBlock`) or permanent ones (`Indefinite`). Expired permissions are automatically removed during the regular block processing. +This allows for temporary delegations (`UntilBlock`) or permanent ones (`Indefinite`). Expired permissions are automatically removed during the regular block processing. Revocation terms define how a permission can be revoked before its normal expiration: @@ -93,16 +133,206 @@ Revocation terms define how a permission can be revoked before its normal expira pub enum RevocationTerms { Irrevocable, RevocableByGrantor, - RevocableByArbiters(BoundedVec), - AfterBlock(BlockNumberFor), + RevocableByArbiters { + accounts: BoundedVec, + required_votes: u32, + }, + RevocableAfter(BlockNumberFor), +} +``` + +These terms create different security guarantees for the grantee, ranging from complete assurance (`Irrevocable`) to flexible arrangements (`RevocableByGrantor`). The `RevocableByArbiters` option allows for multi-signature revocation by designated third parties. The grantee can ALWAYS revoke a permission as it is the one being benefitted. + +## Enforcement Authority System + +The permission system includes a powerful mechanism for third-party governance through the `EnforcementAuthority` type. This allows designated controllers to oversee permissions based on off-chain constraints and conditions. + +```rust +pub enum EnforcementAuthority { + None, + ControlledBy { + controllers: BoundedVec, + required_votes: u32, + }, } ``` -These terms create different security guarantees for the grantee, ranging from complete assurance (`Irrevocable`) to flexible arrangements (`RevocableByGrantor`). The grantee can ALWAYS revoke a permission as it is the one being benefitted. +The enforcement authority system creates a bridge between on-chain permissions and off-chain verification. Controllers can collectively approve or reject actions based on information that might not be directly encodable in the chain state. + +### Enforcement Actions -## Permission creation +Controllers can perform two primary actions: -A new permission is created through the `grant_permission` extrinsic. +1. **Toggle accumulation** - Enable or disable the accumulation of emissions for a permission +2. **Force execution** - Trigger permission execution regardless of normal distribution parameters + +Both actions support multi-signature governance through a voting mechanism. When a controller initiates an action, it's recorded as a vote in the `EnforcementTracking` storage: + +```rust +pub type EnforcementTracking = StorageDoubleMap< + _, + Identity, + PermissionId, + Identity, + EnforcementReferendum, + BoundedBTreeSet, + ValueQuery, +>; +``` + +The action only proceeds when the number of votes reaches the required threshold. This creates a secure governance layer where multiple parties must agree before a permission's state can be modified. + +### Voting Process + +```mermaid +flowchart TD + A[Controller] -- enforcement_execute_permission --> B{Check Authority} + B -- Not authorized --> C[Error: NotAuthorizedToToggle] + B -- Authorized --> D{Check Vote Count} + D -- Below threshold --> E[Record Vote] + D -- Threshold reached --> F[Execute Action] + F --> G[Clear Votes] + E --> H[Emit EnforcementVoteCast Event] +``` + +The controller's vote is stored and counted toward the threshold. If more votes are needed, the action is deferred and an `EnforcementVoteCast` event is emitted. When enough votes accumulate, the action executes automatically and all votes for that action are cleared. + +### Practical Applications + +This mechanism enables several real-world scenarios: + +- Compliance verification by a committee before allowing distributions +- Performance-based controls where emissions depend on off-chain metrics +- Dispute resolution processes with trusted arbiters +- Emergency circuit breakers for security incidents +- Complex contractual conditions that can't be fully encoded on-chain + +For example, a permission might require KYC verification before distributions can proceed. While the verification happens off-chain, the enforcement authority ensures that only properly verified permissions can execute on-chain. + +### Setting Up Enforcement + +Enforcement can be configured in two ways: + +1. During permission creation via the `grant_emission_permission` extrinsic +2. After creation through the `set_enforcement_authority` extrinsic (only by the grantor or root) + +```rust +pub fn set_enforcement_authority( + origin: OriginFor, + permission_id: PermissionId, + controllers: Vec, + required_votes: u32, +) -> DispatchResult +``` + +The voting threshold can be adjusted to match security requirements - higher thresholds for more sensitive permissions, lower thresholds for operational flexibility. + +The enforcement authority system transforms the permission framework from a simple delegation tool into a sophisticated governance mechanism that bridges on-chain and off-chain worlds, enabling complex business relationships to be represented and enforced through the blockchain. + +## Extrinsics + +The Permission0 pallet provides several extrinsics to manage the permission lifecycle: + +### grant_emission_permission + +```rust +pub fn grant_emission_permission( + origin: OriginFor, + grantee: T::AccountId, + allocation: EmissionAllocation, + targets: Vec<(T::AccountId, u16)>, + distribution: DistributionControl, + duration: PermissionDuration, + revocation: RevocationTerms, + enforcement: EnforcementAuthority, +) -> DispatchResult +``` + +Creates a new emission permission from the signed origin to the specified grantee. The caller must be a registered agent, as must the grantee and all targets. Checks for valid allocation percentages, ensuring the total allocated percentage doesn't exceed 100% per stream. + +### grant_curator_permission + +```rust +pub fn grant_curator_permission( + origin: OriginFor, + grantee: T::AccountId, + flags: u32, + cooldown: Option>, + duration: PermissionDuration, + revocation: RevocationTerms, +) -> DispatchResult +``` + +Creates a new curator permission, but can only be called with the Root origin. The `flags` parameter is a bitwise combination of curator permissions (APPLICATION_REVIEW, WHITELIST_MANAGE, PENALTY_CONTROL). The ROOT permission cannot be granted. + +Only one curator permission can exist per grantee - attempting to create a second will result in a `DuplicatePermission` error. The optional `cooldown` parameter enforces a delay between successive uses of the permission. + +### revoke_permission + +```rust +pub fn revoke_permission( + origin: OriginFor, + permission_id: PermissionId, +) -> DispatchResult +``` + +Revokes the specified permission if the caller meets the permission's revocation terms. This can be: +- The grantee (always allowed) +- The grantor (if RevocableByGrantor) +- Root origin (always allowed) +- Designated arbiters (with sufficient votes for RevocableByArbiters) +- Anyone, after the specified block (for RevocableAfter) + +For RevocableByArbiters, votes are collected in the RevocationTracking storage until the required threshold is reached. + +### execute_permission + +```rust +pub fn execute_permission( + origin: OriginFor, + permission_id: PermissionId, +) -> DispatchResult +``` + +Manually executes a permission with distribution control set to Manual. For emission permissions, this distributes accumulated tokens to the targets according to their weights. Can only be called by the grantor or root. + +### toggle_permission_accumulation + +```rust +pub fn toggle_permission_accumulation( + origin: OriginFor, + permission_id: PermissionId, + accumulating: bool, +) -> DispatchResult +``` + +Enables or disables accumulation for an emission permission. Can be called by the grantor, root, or enforcement controllers (with sufficient votes). + +### enforcement_execute_permission + +```rust +pub fn enforcement_execute_permission( + origin: OriginFor, + permission_id: PermissionId, +) -> DispatchResult +``` + +Executes a permission through the enforcement authority mechanism. Requires sufficient votes from the designated controllers unless called by root. + +### set_enforcement_authority + +```rust +pub fn set_enforcement_authority( + origin: OriginFor, + permission_id: PermissionId, + controllers: Vec, + required_votes: u32, +) -> DispatchResult +``` + +Sets or updates the enforcement authority for a permission. Can only be called by the grantor or root. The controllers and required_votes must form a valid multi-signature configuration (non-empty controllers, required_votes > 0, required_votes <= controllers.len()). + +## Permission Creation ```mermaid flowchart TD @@ -207,21 +437,9 @@ The permission system uses a stream-based approach for tracking different source pub type StreamId = H256; ``` -Each stream is identified by a unique `StreamId`, which represents a specific source of emissions. The system distinguishes between: - -1. **Root Streams**: Generated for each agent using a deterministic function. These are the primary emission streams that agents receive directly. - -```rust -pub fn generate_root_stream_id(agent_id: &AccountId) -> StreamId { - let mut data = ROOT_STREAM_PREFIX.to_vec(); - data.extend(agent_id.encode()); - blake2_256(&data).into() -} -``` - -2. **Derived Streams**: Generated when emissions flow through permissions, allowing for tracking of emission pathways through the network. +Each stream is identified by a unique `StreamId`, which represents a specific source of emissions. The system distinguishes between different types of streams, each representing a distinct source of emissions. -When streams are redelegated through the permission system, their IDs are preserved rather than generating new ones. This crucial design choice allows for easy tracking of the lineage and flow of emissions throughout the network, making it possible to trace the complete path of tokens from their source to final recipients across multiple delegation hops. +When streams are redelegated through the permission system, their IDs are preserved. This crucial design choice allows for tracking the lineage and flow of emissions throughout the network, making it possible to trace the complete path of tokens from their source to final recipients across multiple delegation hops. This stream-based model allows for much more granular control over emission delegation, enabling agents to specify different delegation percentages for different types of emission streams they receive. @@ -237,14 +455,11 @@ The pallet implements the `on_finalize` hook to handle periodic tasks: ```rust fn on_finalize(block_number: BlockNumberFor) { - // Process automatic distributions every 10 blocks - if (block_number % 10).is_zero() { - Self::do_auto_permission_execution(block_number); - } + permission::do_auto_permission_execution::(block_number); } ``` -The `do_auto_permission_execution` function processes all permissions to: +The `do_auto_permission_execution` function processes permissions when `current_block % 10 == 0` (i.e., every 10 blocks) to: 1. Check for and execute automatic distributions 2. Check for and execute interval-based distributions @@ -259,7 +474,10 @@ The pallet is customizable through several configuration parameters: ```rust type MaxTargetsPerPermission: Get; -type MaxArbitersPerPermission: Get; +type MaxStreamsPerPermission: Get; +type MaxRevokersPerPermission: Get; +type MaxControllersPerPermission: Get; +type MinAutoDistributionThreshold: Get>; ``` These parameters control storage limits and processing intervals, allowing the network to balance functionality against resource usage. diff --git a/justfile b/justfile index ed132eb0..f6303738 100644 --- a/justfile +++ b/justfile @@ -45,9 +45,10 @@ gen-spec-file env: gen-base-spec run-benchmarks: cargo build -r --features runtime-benchmarks - # ./target/release/torus-node benchmark pallet --pallet pallet_torus0 --chain dev --extrinsic "*" --steps 50 --repeat 20 --output pallets/torus0/src/weights.rs --template=./.maintain/frame-weight-template.hbs + ./target/release/torus-node benchmark pallet --pallet pallet_torus0 --chain dev --extrinsic "*" --steps 50 --repeat 20 --output pallets/torus0/src/weights.rs --template=./.maintain/frame-weight-template.hbs ./target/release/torus-node benchmark pallet --pallet pallet_governance --chain dev --extrinsic "*" --steps 50 --repeat 20 --output pallets/governance/src/weights.rs --template=./.maintain/frame-weight-template.hbs ./target/release/torus-node benchmark pallet --pallet pallet_emission0 --chain dev --extrinsic "*" --steps 50 --repeat 20 --output pallets/emission0/src/weights.rs --template=./.maintain/frame-weight-template.hbs + ./target/release/torus-node benchmark pallet --pallet pallet_permission0 --chain dev --extrinsic "*" --steps 50 --repeat 20 --output pallets/permission0/src/weights.rs --template=./.maintain/frame-weight-template.hbs # Runtime Update Testing diff --git a/pallets/emission0/src/benchmarking.rs b/pallets/emission0/src/benchmarking.rs new file mode 100644 index 00000000..76e9c19c --- /dev/null +++ b/pallets/emission0/src/benchmarking.rs @@ -0,0 +1,82 @@ +#![cfg(feature = "runtime-benchmarks")] + +use pallet_governance_api::GovernanceApi; +use pallet_torus0_api::Torus0Api; +use polkadot_sdk::{ + frame_benchmarking::{account, v2::*}, + frame_system::RawOrigin, + sp_std::vec, +}; + +use crate::*; + +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn set_weights() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + let module_key2: T::AccountId = account("ModuleKey2", 0, 3); + + ::set_allocator(&module_key2); + + ::force_register_agent(&module_key, vec![], vec![], vec![]) + .expect("failed to register agent"); + ::force_register_agent(&module_key2, vec![], vec![], vec![]) + .expect("failed to register agent"); + + ::set_allocator(&module_key2); + let _ = ::deposit_creating(&module_key2, ::min_validator_stake()); + ::force_set_stake( + &module_key2, + &module_key2, + ::min_validator_stake(), + ) + .unwrap(); + + let weights = vec![(module_key, 10)]; + + #[extrinsic_call] + set_weights(RawOrigin::Signed(module_key2), weights) + } + + #[benchmark] + fn delegate_weight_control() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + let module_key2: T::AccountId = account("ModuleKey2", 0, 3); + + ::force_register_agent(&module_key, vec![], vec![], vec![]) + .expect("failed to register agent"); + ::force_register_agent(&module_key2, vec![], vec![], vec![]) + .expect("failed to register agent"); + + ::set_allocator(&module_key2); + + #[extrinsic_call] + delegate_weight_control(RawOrigin::Signed(module_key), module_key2.clone()) + } + + #[benchmark] + fn regain_weight_control() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + let module_key2: T::AccountId = account("ModuleKey2", 0, 3); + + ::force_register_agent(&module_key, vec![], vec![], vec![]) + .expect("failed to register agent"); + ::force_register_agent(&module_key2, vec![], vec![], vec![]) + .expect("failed to register agent"); + + ::set_allocator(&module_key); + ::set_allocator(&module_key2); + + Pallet::::delegate_weight_control( + RawOrigin::Signed(module_key.clone()).into(), + module_key2.clone(), + ) + .expect("failed to delegate weight control"); + + #[extrinsic_call] + regain_weight_control(RawOrigin::Signed(module_key)) + } +} diff --git a/pallets/emission0/src/benchmarks.rs b/pallets/emission0/src/benchmarks.rs deleted file mode 100644 index 765f8f9e..00000000 --- a/pallets/emission0/src/benchmarks.rs +++ /dev/null @@ -1,42 +0,0 @@ -use pallet_governance_api::GovernanceApi; -use pallet_torus0_api::Torus0Api; -use polkadot_sdk::{ - frame_benchmarking::{account, benchmarks}, - frame_system::{self, RawOrigin}, - sp_std::vec, -}; - -use crate::*; - -benchmarks! { - set_weights { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - let module_key2: T::AccountId = account("ModuleKey2", 0, 3); - - ::set_allocator(&module_key2); - - ::force_register_agent(&module_key, vec![], vec![], vec![])?; - ::force_register_agent(&module_key2, vec![], vec![], vec![])?; - - let _ = ::deposit_creating(&module_key2, ::min_validator_stake()); - - let weights = vec![(module_key, 10)]; - }: _(RawOrigin::Signed(module_key2), weights) - - delegate_weight_control { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - let module_key2: T::AccountId = account("ModuleKey2", 0, 3); - - ::force_register_agent(&module_key, vec![], vec![], vec![])?; - ::force_register_agent(&module_key2, vec![], vec![], vec![])?; - - }: _(RawOrigin::Signed(module_key), module_key2.clone()) - - regain_weight_control { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - let module_key2: T::AccountId = account("ModuleKey2", 0, 3); - ::force_register_agent(&module_key, vec![], vec![], vec![])?; - ::force_register_agent(&module_key2, vec![], vec![], vec![])?; - Pallet::::delegate_weight_control(RawOrigin::Signed(module_key.clone()).into(), module_key2.clone())?; - }: _(RawOrigin::Signed(module_key)) -} diff --git a/pallets/emission0/src/distribute.rs b/pallets/emission0/src/distribute.rs index 8bef9c67..70375c6c 100644 --- a/pallets/emission0/src/distribute.rs +++ b/pallets/emission0/src/distribute.rs @@ -1,5 +1,5 @@ use pallet_governance_api::GovernanceApi; -use pallet_permission0_api::Permission0Api; +use pallet_permission0_api::Permission0EmissionApi; use pallet_torus0_api::Torus0Api; use polkadot_sdk::{ frame_support::{ @@ -467,7 +467,10 @@ fn compute_emissions( dividends_to_be_emitted = to_be_emitted.saturating_add(dividends); incentives_to_be_emitted = to_be_emitted.saturating_sub(dividends); } else { - unreachable!() + // This is logically impossible at the time of writing. + dividends_to_be_emitted = 0; + incentives_to_be_emitted = 0; + error!("MATH IS NOT MATHING. PLEASE CHECK ME, incentives_ratio = {incentives_ratio}"); } let incentives = calculate_emissions( diff --git a/pallets/emission0/src/lib.rs b/pallets/emission0/src/lib.rs index a5ad1790..9af04d5e 100644 --- a/pallets/emission0/src/lib.rs +++ b/pallets/emission0/src/lib.rs @@ -19,8 +19,7 @@ pub mod distribute; #[doc(hidden)] pub mod weight_control; -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmarks; +pub mod benchmarking; pub mod weights; #[frame::pallet] diff --git a/pallets/emission0/src/weights.rs b/pallets/emission0/src/weights.rs index c5d77418..82393489 100644 --- a/pallets/emission0/src/weights.rs +++ b/pallets/emission0/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_emission0` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-01-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-05-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `MacBook-Pro-de-Joao.local`, CPU: `` +//! HOSTNAME: `NicosiPoneXSMax.localdomain`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -48,49 +48,51 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { /// Storage: `Governance::Allocators` (r:1 w:0) /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - /// Storage: `Emission0::MaxAllowedWeights` (r:1 w:0) - /// Proof: `Emission0::MaxAllowedWeights` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `Emission0::WeightControlDelegation` (r:1 w:0) /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:2 w:0) - /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(849), added: 3324, mode: `MaxEncodedLen`) - /// Storage: `Torus0::StakedBy` (r:1 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakedBy` (r:2 w:0) /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) - /// Storage: `Emission0::MinStakePerWeight` (r:1 w:0) - /// Proof: `Emission0::MinStakePerWeight` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MinValidatorStake` (r:1 w:0) + /// Proof: `Torus0::MinValidatorStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Emission0::ConsensusMembers` (r:1 w:1) /// Proof: `Emission0::ConsensusMembers` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn set_weights() -> Weight { // Proof Size summary in bytes: - // Measured: `339` - // Estimated: `7638` - // Minimum execution time: 33_000_000 picoseconds. - Weight::from_parts(34_000_000, 7638) + // Measured: `515` + // Estimated: `7654` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(28_000_000, 7654) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Torus0::Agents` (r:2 w:0) - /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(849), added: 3324, mode: `MaxEncodedLen`) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Governance::Allocators` (r:1 w:0) + /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Emission0::WeightControlDelegation` (r:0 w:1) /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn delegate_weight_control() -> Weight { // Proof Size summary in bytes: - // Measured: `168` - // Estimated: `7638` - // Minimum execution time: 17_000_000 picoseconds. - Weight::from_parts(18_000_000, 7638) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Measured: `230` + // Estimated: `7654` + // Minimum execution time: 16_000_000 picoseconds. + Weight::from_parts(17_000_000, 7654) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } + /// Storage: `Governance::Allocators` (r:1 w:0) + /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Emission0::WeightControlDelegation` (r:1 w:1) /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn regain_weight_control() -> Weight { // Proof Size summary in bytes: - // Measured: `199` + // Measured: `299` // Estimated: `3529` - // Minimum execution time: 10_000_000 picoseconds. - Weight::from_parts(11_000_000, 3529) - .saturating_add(T::DbWeight::get().reads(1_u64)) + // Minimum execution time: 12_000_000 picoseconds. + Weight::from_parts(13_000_000, 3529) + .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } @@ -99,49 +101,51 @@ impl WeightInfo for SubstrateWeight { impl WeightInfo for () { /// Storage: `Governance::Allocators` (r:1 w:0) /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - /// Storage: `Emission0::MaxAllowedWeights` (r:1 w:0) - /// Proof: `Emission0::MaxAllowedWeights` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `Emission0::WeightControlDelegation` (r:1 w:0) /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:2 w:0) - /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(849), added: 3324, mode: `MaxEncodedLen`) - /// Storage: `Torus0::StakedBy` (r:1 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakedBy` (r:2 w:0) /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) - /// Storage: `Emission0::MinStakePerWeight` (r:1 w:0) - /// Proof: `Emission0::MinStakePerWeight` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MinValidatorStake` (r:1 w:0) + /// Proof: `Torus0::MinValidatorStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Emission0::ConsensusMembers` (r:1 w:1) /// Proof: `Emission0::ConsensusMembers` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn set_weights() -> Weight { // Proof Size summary in bytes: - // Measured: `339` - // Estimated: `7638` - // Minimum execution time: 33_000_000 picoseconds. - Weight::from_parts(34_000_000, 7638) + // Measured: `515` + // Estimated: `7654` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(28_000_000, 7654) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Torus0::Agents` (r:2 w:0) - /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(849), added: 3324, mode: `MaxEncodedLen`) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Governance::Allocators` (r:1 w:0) + /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Emission0::WeightControlDelegation` (r:0 w:1) /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn delegate_weight_control() -> Weight { // Proof Size summary in bytes: - // Measured: `168` - // Estimated: `7638` - // Minimum execution time: 17_000_000 picoseconds. - Weight::from_parts(18_000_000, 7638) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Measured: `230` + // Estimated: `7654` + // Minimum execution time: 16_000_000 picoseconds. + Weight::from_parts(17_000_000, 7654) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } + /// Storage: `Governance::Allocators` (r:1 w:0) + /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Emission0::WeightControlDelegation` (r:1 w:1) /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn regain_weight_control() -> Weight { // Proof Size summary in bytes: - // Measured: `199` + // Measured: `299` // Estimated: `3529` - // Minimum execution time: 10_000_000 picoseconds. - Weight::from_parts(11_000_000, 3529) - .saturating_add(RocksDbWeight::get().reads(1_u64)) + // Minimum execution time: 12_000_000 picoseconds. + Weight::from_parts(13_000_000, 3529) + .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/pallets/faucet/tests/faucet.rs b/pallets/faucet/tests/faucet.rs index 06cd4e56..bba9e9f1 100644 --- a/pallets/faucet/tests/faucet.rs +++ b/pallets/faucet/tests/faucet.rs @@ -145,6 +145,8 @@ impl pallet_torus0::Config for Test { type Governance = Governance; type Emission = Emission0; + + type WeightInfo = pallet_torus0::weights::SubstrateWeight; } parameter_types! { @@ -216,10 +218,13 @@ impl pallet_governance::Config for Test { type Currency = Balances; + type Permission0 = Permission0; + type WeightInfo = pallet_governance::weights::SubstrateWeight; } parameter_types! { + pub const PermissionPalletId: PalletId = PalletId(*b"torusper"); pub const MaxTargetsPerPermission: u32 = 100; pub const MaxStreamsPerPermission: u32 = 100; pub const MaxRevokersPerPermission: u32 = 10; @@ -228,6 +233,8 @@ parameter_types! { } impl pallet_permission0::Config for Test { + type PalletId = PermissionPalletId; + type RuntimeEvent = RuntimeEvent; type WeightInfo = (); diff --git a/pallets/governance/Cargo.toml b/pallets/governance/Cargo.toml index a10f988f..eafb18f4 100644 --- a/pallets/governance/Cargo.toml +++ b/pallets/governance/Cargo.toml @@ -43,6 +43,8 @@ pallet-emission0.workspace = true pallet-governance-api.workspace = true pallet-torus0-api.workspace = true +pallet-permission0-api.workspace = true [dev-dependencies] test-utils.workspace = true +pallet-permission0.workspace = true diff --git a/pallets/governance/api/src/lib.rs b/pallets/governance/api/src/lib.rs index 60d9fd5a..75092f8e 100644 --- a/pallets/governance/api/src/lib.rs +++ b/pallets/governance/api/src/lib.rs @@ -14,4 +14,8 @@ pub trait GovernanceApi { fn get_allocators() -> impl Iterator; fn set_allocator(key: &AccountId); + + #[doc(hidden)] + #[cfg(feature = "runtime-benchmarks")] + fn force_set_whitelisted(key: &AccountId); } diff --git a/pallets/governance/src/benchmarking.rs b/pallets/governance/src/benchmarking.rs new file mode 100644 index 00000000..6513bd1d --- /dev/null +++ b/pallets/governance/src/benchmarking.rs @@ -0,0 +1,268 @@ +#![cfg(feature = "runtime-benchmarks")] + +use pallet_permission0_api::{ + CuratorPermissions, Permission0CuratorApi, PermissionDuration, RevocationTerms, +}; +use pallet_torus0_api::Torus0Api; +use polkadot_sdk::{ + frame_benchmarking::{account, v2::*}, + frame_system::RawOrigin, + sp_std::vec, +}; + +use crate::*; + +fn create_application(module_key: &T::AccountId) { + let config = crate::GlobalGovernanceConfig::::get(); + let cost = config.agent_application_cost; + let _ = ::Currency::deposit_creating(module_key, cost); + + let min_data_len = T::MinApplicationDataLength::get(); + let data = vec![0; min_data_len as usize]; + + application::submit_application::(module_key.clone(), module_key.clone(), data, false) + .expect("failed to submit application"); +} + +fn curator() -> T::AccountId { + let curator_id: T::AccountId = account("Curator", 10, 10); + <::Permission0 as Permission0CuratorApi< + T::AccountId, + OriginFor, + BlockNumberFor, + >>::grant_curator_permission( + RawOrigin::Root.into(), + curator_id.clone(), + CuratorPermissions::all(), + None, + PermissionDuration::Indefinite, + RevocationTerms::Irrevocable, + ) + .unwrap(); + curator_id +} + +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn add_allocator() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + + #[extrinsic_call] + add_allocator(RawOrigin::Root, module_key) + } + + #[benchmark] + fn remove_allocator() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + roles::add_allocator::(module_key.clone()).expect("failed to add allocator"); + + #[extrinsic_call] + remove_allocator(RawOrigin::Root, module_key) + } + + #[benchmark] + fn add_to_whitelist() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + roles::add_allocator::(module_key.clone()).expect("failed to add allocator"); + + #[extrinsic_call] + add_to_whitelist(RawOrigin::Signed(curator::()), module_key) + } + + #[benchmark] + fn remove_from_whitelist() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + whitelist::add_to_whitelist::(module_key.clone()).expect("failed to add to whitelist"); + + #[extrinsic_call] + remove_from_whitelist(RawOrigin::Signed(curator::()), module_key) + } + + #[benchmark] + fn submit_application() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + + let config = crate::GlobalGovernanceConfig::::get(); + let cost = config.agent_application_cost; + let _ = ::Currency::deposit_creating(&module_key, cost); + + let min_data_len = T::MinApplicationDataLength::get(); + let data = vec![0; min_data_len as usize]; + + #[extrinsic_call] + submit_application( + RawOrigin::Signed(module_key.clone()), + module_key.clone(), + data, + false, + ) + } + + #[benchmark] + fn accept_application() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + create_application::(&module_key); + + #[extrinsic_call] + accept_application(RawOrigin::Signed(curator::()), 0) + } + + #[benchmark] + fn deny_application() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + create_application::(&module_key); + + #[extrinsic_call] + deny_application(RawOrigin::Signed(curator::()), 0) + } + + #[benchmark] + fn penalize_agent() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + + as Torus0Api< + T::AccountId, + <::Currency as Currency>::Balance, + <::Currency as Currency>::NegativeImbalance, + >>::force_register_agent(&module_key, vec![], vec![], vec![]) + .expect("failed to register agent"); + + #[extrinsic_call] + penalize_agent(RawOrigin::Signed(curator::()), module_key.clone(), 50) + } + + #[benchmark] + fn add_global_params_proposal() { + let module_key: T::AccountId = account("Module", 0, 2); + + let params = proposal::GlobalParamsData { + min_name_length: 2, + max_name_length: T::MaxAgentNameLengthConstraint::get() as u16 - 1, + max_allowed_agents: 1, + min_weight_control_fee: 1, + min_staking_fee: 1, + dividends_participation_weight: Percent::zero(), + proposal_cost: 0, + }; + let data = vec![0]; + + let config = crate::GlobalGovernanceConfig::::get(); + let cost = config.proposal_cost; + let _ = ::Currency::deposit_creating(&module_key, cost); + + #[extrinsic_call] + add_global_params_proposal(RawOrigin::Signed(module_key), params, data) + } + + #[benchmark] + fn add_global_custom_proposal() { + let module_key: T::AccountId = account("Module", 0, 2); + + let data = vec![0]; + + let config = crate::GlobalGovernanceConfig::::get(); + let cost = config.proposal_cost; + let _ = ::Currency::deposit_creating(&module_key, cost); + + #[extrinsic_call] + add_global_custom_proposal(RawOrigin::Signed(module_key), data) + } + + #[benchmark] + fn add_dao_treasury_transfer_proposal() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + let data = vec![0]; + + let config = crate::GlobalGovernanceConfig::::get(); + let cost = config.proposal_cost; + let _ = ::Currency::deposit_creating(&module_key, cost); + + #[extrinsic_call] + add_dao_treasury_transfer_proposal( + RawOrigin::Signed(module_key), + 0, + module_key.clone(), + data, + ) + } + + #[benchmark] + fn vote_proposal() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + let data = vec![0]; + + let config = crate::GlobalGovernanceConfig::::get(); + let cost = config.proposal_cost; + let _ = ::Currency::deposit_creating(&module_key, cost); + + proposal::add_global_custom_proposal::(module_key.clone(), data) + .expect("failed to create proposal"); + + pallet_torus0::StakingTo::::set(&module_key, &module_key, Some(1)); + + voting::disable_delegation::(module_key.clone()).expect("failed to disable delegation"); + + #[extrinsic_call] + vote_proposal(RawOrigin::Signed(module_key.clone()), 0, true) + } + + #[benchmark] + fn remove_vote_proposal() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + let data = vec![0]; + + let config = crate::GlobalGovernanceConfig::::get(); + let cost = config.proposal_cost; + let _ = ::Currency::deposit_creating(&module_key, cost); + + proposal::add_global_custom_proposal::(module_key.clone(), data) + .expect("failed to create proposal"); + + pallet_torus0::StakingTo::::set(&module_key, &module_key, Some(1)); + + voting::disable_delegation::(module_key.clone()).expect("failed to disable delegation"); + + voting::add_vote::(module_key.clone(), 0, true).expect("failed to add vote"); + + #[extrinsic_call] + remove_vote_proposal(RawOrigin::Signed(module_key.clone()), 0) + } + + #[benchmark] + fn enable_vote_delegation() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + + #[extrinsic_call] + enable_vote_delegation(RawOrigin::Signed(module_key.clone())) + } + + #[benchmark] + fn disable_vote_delegation() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + + #[extrinsic_call] + disable_vote_delegation(RawOrigin::Signed(module_key.clone())) + } + + #[benchmark] + fn add_emission_proposal() { + let module_key: T::AccountId = account("ModuleKey", 0, 2); + let data = vec![0]; + + let config = crate::GlobalGovernanceConfig::::get(); + let cost = config.proposal_cost; + let _ = ::Currency::deposit_creating(&module_key, cost); + + #[extrinsic_call] + add_emission_proposal( + RawOrigin::Signed(module_key.clone()), + Percent::from_parts(40), + Percent::from_parts(40), + Percent::from_parts(40), + data, + ) + } +} diff --git a/pallets/governance/src/benchmarks.rs b/pallets/governance/src/benchmarks.rs deleted file mode 100644 index bf91ddb7..00000000 --- a/pallets/governance/src/benchmarks.rs +++ /dev/null @@ -1,204 +0,0 @@ -use pallet_torus0_api::Torus0Api; -use polkadot_sdk::{ - frame_benchmarking::{account, benchmarks}, - frame_system::{self, RawOrigin}, - sp_std::vec, -}; - -use crate::*; - -fn create_application(module_key: &T::AccountId) { - let config = crate::GlobalGovernanceConfig::::get(); - let cost = config.agent_application_cost; - let _ = ::Currency::deposit_creating(module_key, cost); - - let min_data_len = T::MinApplicationDataLength::get(); - let data = vec![0; min_data_len as usize]; - - application::submit_application::(module_key.clone(), module_key.clone(), data, false) - .expect("failed to submit application"); -} - -benchmarks! { - add_curator { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - }: _(RawOrigin::Root, module_key) - - remove_curator { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - crate::roles::manage_role::>(module_key.clone(), true, crate::Error::::AlreadyCurator) - .expect("failed to add curator"); - }: _(RawOrigin::Root, module_key) - - add_allocator { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - }: _(RawOrigin::Root, module_key) - - remove_allocator { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - crate::roles::manage_role::>(module_key.clone(), true, crate::Error::::AlreadyCurator) - .expect("failed to add allocator"); - }: _(RawOrigin::Root, module_key) - - add_to_whitelist { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - crate::roles::manage_role::>(module_key.clone(), true, crate::Error::::AlreadyCurator) - .expect("failed to add curator"); - }: _(RawOrigin::Signed(module_key.clone()), module_key.clone()) - - remove_from_whitelist { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - crate::roles::manage_role::>(module_key.clone(), true, crate::Error::::AlreadyCurator) - .expect("failed to add curator"); - whitelist::add_to_whitelist::(module_key.clone()) - .expect("failed to add to whitelist"); - }: _(RawOrigin::Signed(module_key.clone()), module_key.clone()) - - submit_application { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - - let config = crate::GlobalGovernanceConfig::::get(); - let cost = config.agent_application_cost; - let _ = ::Currency::deposit_creating( - &module_key, - cost, - ); - - let min_data_len = T::MinApplicationDataLength::get(); - let data = vec![0; min_data_len as usize]; - }: _(RawOrigin::Signed(module_key.clone()), module_key.clone(), data, false) - - accept_application { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - - crate::roles::manage_role::>(module_key.clone(), true, crate::Error::::AlreadyCurator) - .expect("failed to add curator"); - - create_application::(&module_key); - }: _(RawOrigin::Signed(module_key.clone()), 0) - - deny_application { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - - crate::roles::manage_role::>(module_key.clone(), true, crate::Error::::AlreadyCurator) - .expect("failed to add curator"); - - create_application::(&module_key); - }: _(RawOrigin::Signed(module_key.clone()), 0) - - penalize_agent { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - - crate::roles::manage_role::>(module_key.clone(), true, crate::Error::::AlreadyCurator) - .expect("failed to add curator"); - - as Torus0Api< - T::AccountId, - <::Currency as Currency>::Balance, - <::Currency as Currency>::NegativeImbalance, - >>::force_register_agent( - &module_key, - vec![], - vec![], - vec![], - ).expect("failed to register agent"); - - }: _(RawOrigin::Signed(module_key.clone()), module_key.clone(), 50) - - add_global_params_proposal { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - - let params = proposal::GlobalParamsData { - min_name_length: 2, - max_name_length: T::MaxAgentNameLengthConstraint::get() as u16 - 1, - max_allowed_agents: 1, - min_weight_control_fee: 1, - min_staking_fee: 1, - dividends_participation_weight: Percent::zero(), - proposal_cost: 0, - }; - let data = vec![0]; - - let config = crate::GlobalGovernanceConfig::::get(); - let cost = config.proposal_cost; - let _ = ::Currency::deposit_creating(&module_key, cost); - - }: _(RawOrigin::Signed(module_key.clone()), params, data) - - add_global_custom_proposal { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - let data = vec![0]; - - let config = crate::GlobalGovernanceConfig::::get(); - let cost = config.proposal_cost; - let _ = ::Currency::deposit_creating(&module_key, cost); - - }: _(RawOrigin::Signed(module_key.clone()), data) - - add_dao_treasury_transfer_proposal { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - let data = vec![0]; - - let config = crate::GlobalGovernanceConfig::::get(); - let cost = config.proposal_cost; - let _ = ::Currency::deposit_creating(&module_key, cost); - - }: _(RawOrigin::Signed(module_key.clone()), 0, module_key.clone(), data) - - vote_proposal { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - let data = vec![0]; - - let config = crate::GlobalGovernanceConfig::::get(); - let cost = config.proposal_cost; - let _ = ::Currency::deposit_creating(&module_key, cost); - - proposal::add_global_custom_proposal::(module_key.clone(), data) - .expect("failed to create proposal"); - - pallet_torus0::StakingTo::::set(&module_key, &module_key, Some(1)); - - voting::disable_delegation::(module_key.clone()) - .expect("failed to disable delegation"); - - }: _(RawOrigin::Signed(module_key.clone()), 0, true) - - remove_vote_proposal { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - let data = vec![0]; - - let config = crate::GlobalGovernanceConfig::::get(); - let cost = config.proposal_cost; - let _ = ::Currency::deposit_creating(&module_key, cost); - - proposal::add_global_custom_proposal::(module_key.clone(), data) - .expect("failed to create proposal"); - - pallet_torus0::StakingTo::::set(&module_key, &module_key, Some(1)); - - voting::disable_delegation::(module_key.clone()) - .expect("failed to disable delegation"); - - voting::add_vote::(module_key.clone(), 0, true) - .expect("failed to add vote"); - - }: _(RawOrigin::Signed(module_key.clone()), 0) - - enable_vote_delegation { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - }: _(RawOrigin::Signed(module_key)) - - disable_vote_delegation { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - }: _(RawOrigin::Signed(module_key)) - - add_emission_proposal { - let module_key: T::AccountId = account("ModuleKey", 0, 2); - let data = vec![0]; - - let config = crate::GlobalGovernanceConfig::::get(); - let cost = config.proposal_cost; - let _ = ::Currency::deposit_creating(&module_key, cost); - - }: _(RawOrigin::Signed(module_key.clone()), Percent::from_parts(40), Percent::from_parts(40), Percent::from_parts(40), data) -} diff --git a/pallets/governance/src/lib.rs b/pallets/governance/src/lib.rs index 36234c4f..a705485a 100644 --- a/pallets/governance/src/lib.rs +++ b/pallets/governance/src/lib.rs @@ -9,8 +9,7 @@ pub mod roles; pub mod voting; pub mod whitelist; -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmarks; +pub mod benchmarking; pub mod weights; pub(crate) use ext::*; @@ -42,8 +41,9 @@ use crate::{ pub mod pallet { #![allow(clippy::too_many_arguments)] - const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); + use pallet_permission0_api::{CuratorPermissions, Permission0Api, Permission0CuratorApi}; use proposal::GlobalParamsData; use weights::WeightInfo; @@ -91,10 +91,6 @@ pub mod pallet { #[pallet::storage] pub type Whitelist = StorageMap<_, Identity, AccountIdOf, ()>; - /// List of curator keys, which can accept and reject applications. - #[pallet::storage] - pub type Curators = StorageMap<_, Identity, AccountIdOf, ()>; - /// List of allocator keys, which are the default validators on the network. #[pallet::storage] pub type Allocators = StorageMap<_, Identity, AccountIdOf, ()>; @@ -105,10 +101,13 @@ pub mod pallet { pub type TreasuryEmissionFee = StorageValue<_, Percent, ValueQuery, T::DefaultTreasuryEmissionFee>; - #[pallet::config(with_default)] + #[pallet::config] pub trait Config: polkadot_sdk::frame_system::Config + pallet_torus0::Config + pallet_emission0::Config { + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + #[pallet::constant] type PalletId: Get; @@ -119,7 +118,6 @@ pub mod pallet { type MaxApplicationDataLength: Get; #[pallet::constant] - #[pallet::no_default_bounds] type ApplicationExpiration: Get>; #[pallet::constant] @@ -129,38 +127,36 @@ pub mod pallet { type DefaultTreasuryEmissionFee: Get; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultProposalCost: Get>; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultProposalExpiration: Get>; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultAgentApplicationCost: Get>; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultAgentApplicationExpiration: Get>; #[pallet::constant] type DefaultProposalRewardTreasuryAllocation: Get; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultMaxProposalRewardTreasuryAllocation: Get>; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultProposalRewardInterval: Get>; - #[pallet::no_default_bounds] - type RuntimeEvent: From> - + IsType<::RuntimeEvent>; - type Currency: Currency + Send + Sync; + type Permission0: Permission0Api< + Self::AccountId, + OriginFor, + BlockNumberFor, + crate::BalanceOf, + <::Currency as Currency>::NegativeImbalance, + >; + type WeightInfo: WeightInfo; } @@ -182,29 +178,12 @@ pub mod pallet { #[pallet::call] impl Pallet { - /// Adds a new curator to the list. Only available for the root key. - #[pallet::call_index(0)] - #[pallet::weight((::WeightInfo::add_curator(), DispatchClass::Normal, Pays::Yes))] - pub fn add_curator(origin: OriginFor, key: AccountIdOf) -> DispatchResult { - ensure_root(origin)?; - roles::manage_role::>(key, true, Error::::AlreadyCurator) - } - - /// Removes an existing curator from the list. Only available for the - /// root key. - #[pallet::call_index(1)] - #[pallet::weight((::WeightInfo::remove_curator(), DispatchClass::Normal, Pays::Yes))] - pub fn remove_curator(origin: OriginFor, key: AccountIdOf) -> DispatchResult { - ensure_root(origin)?; - roles::manage_role::>(key, false, Error::::NotAllocator) - } - /// Adds a new allocator to the list. Only available for the root key. #[pallet::call_index(2)] #[pallet::weight((::WeightInfo::add_allocator(), DispatchClass::Normal, Pays::Yes))] pub fn add_allocator(origin: OriginFor, key: AccountIdOf) -> DispatchResult { ensure_root(origin)?; - roles::manage_role::>(key, true, Error::::AlreadyAllocator) + roles::add_allocator::(key) } /// Removes an existing allocator from the list. Only available for the @@ -213,7 +192,7 @@ pub mod pallet { #[pallet::weight((::WeightInfo::remove_allocator(), DispatchClass::Normal, Pays::Yes))] pub fn remove_allocator(origin: OriginFor, key: AccountIdOf) -> DispatchResult { ensure_root(origin)?; - roles::manage_role::>(key, false, Error::::NotAllocator) + roles::remove_allocator::(key) } /// Forcefully adds a new agent to the whitelist. Only available for the @@ -221,7 +200,10 @@ pub mod pallet { #[pallet::call_index(4)] #[pallet::weight((::WeightInfo::add_to_whitelist(), DispatchClass::Normal, Pays::Yes))] pub fn add_to_whitelist(origin: OriginFor, key: AccountIdOf) -> DispatchResult { - roles::ensure_curator::(origin)?; + ::Permission0::ensure_curator_permission( + origin, + CuratorPermissions::WHITELIST_MANAGE, + )?; whitelist::add_to_whitelist::(key) } @@ -230,7 +212,10 @@ pub mod pallet { #[pallet::call_index(5)] #[pallet::weight((::WeightInfo::remove_from_whitelist(), DispatchClass::Normal, Pays::Yes))] pub fn remove_from_whitelist(origin: OriginFor, key: AccountIdOf) -> DispatchResult { - roles::ensure_curator::(origin)?; + ::Permission0::ensure_curator_permission( + origin, + CuratorPermissions::WHITELIST_MANAGE, + )?; whitelist::remove_from_whitelist::(key) } @@ -239,7 +224,10 @@ pub mod pallet { #[pallet::call_index(6)] #[pallet::weight((::WeightInfo::accept_application(), DispatchClass::Normal, Pays::Yes))] pub fn accept_application(origin: OriginFor, application_id: u32) -> DispatchResult { - roles::ensure_curator::(origin)?; + ::Permission0::ensure_curator_permission( + origin, + CuratorPermissions::APPLICATION_REVIEW, + )?; application::accept_application::(application_id) } @@ -248,7 +236,10 @@ pub mod pallet { #[pallet::call_index(7)] #[pallet::weight((::WeightInfo::deny_application(), DispatchClass::Normal, Pays::Yes))] pub fn deny_application(origin: OriginFor, application_id: u32) -> DispatchResult { - roles::ensure_curator::(origin)?; + ::Permission0::ensure_curator_permission( + origin, + CuratorPermissions::APPLICATION_REVIEW, + )?; application::deny_application::(application_id) } @@ -261,8 +252,7 @@ pub mod pallet { agent_key: AccountIdOf, percentage: u8, ) -> DispatchResult { - roles::ensure_curator::(origin)?; - roles::penalize_agent::(agent_key, percentage) + roles::penalize_agent::(origin, agent_key, percentage) } /// Submits a new agent application on behalf of a given key. @@ -422,6 +412,12 @@ pub mod pallet { ApplicationDenied(u32), /// An application has expired. ApplicationExpired(u32), + /// A penalty was applied to an agent. + PenaltyApplied { + curator: T::AccountId, + agent: T::AccountId, + penalty: Percent, + }, } #[pallet::error] @@ -537,6 +533,11 @@ impl pallet_governance_api::GovernanceApi for Pallet } fn set_allocator(key: &T::AccountId) { - crate::Allocators::::insert(key, ()); + Allocators::::insert(key, ()); + } + + #[cfg(feature = "runtime-benchmarks")] + fn force_set_whitelisted(key: &T::AccountId) { + Whitelist::::insert(key, ()); } } diff --git a/pallets/governance/src/migrations.rs b/pallets/governance/src/migrations.rs index 397d4be2..0d4d1b63 100644 --- a/pallets/governance/src/migrations.rs +++ b/pallets/governance/src/migrations.rs @@ -130,3 +130,50 @@ pub mod v3 { } } } + +pub mod v4 { + use pallet_permission0_api::{CuratorPermissions, Permission0CuratorApi, PermissionDuration}; + use polkadot_sdk::{ + frame_system::RawOrigin, + sp_tracing::{info, warn}, + }; + + use super::*; + + pub type Migration = VersionedMigration<3, 4, MigrateToV4, Pallet, W>; + pub struct MigrateToV4(core::marker::PhantomData); + + mod old_storage { + use polkadot_sdk::frame_support::{storage_alias, Identity}; + + use crate::AccountIdOf; + + #[storage_alias] + pub type Curators = + StorageMap, Identity, AccountIdOf, ()>; + } + + impl UncheckedOnRuntimeUpgrade for MigrateToV4 { + fn on_runtime_upgrade() -> Weight { + for (curator, _) in old_storage::Curators::::iter() { + let res = <::Permission0>::grant_curator_permission( + RawOrigin::Root.into(), + curator.clone(), + CuratorPermissions::all(), + None, + PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableByGrantor, + ); + + match res { + Ok(perm_id) => info!("migrated curator {curator:?} to permission0: {perm_id}"), + Err(err) => { + warn!("Could not migrate curator {curator:?} to permission0: {err:?}"); + } + } + } + + Weight::zero() + } + } +} diff --git a/pallets/governance/src/roles.rs b/pallets/governance/src/roles.rs index dc75435f..a75857f4 100644 --- a/pallets/governance/src/roles.rs +++ b/pallets/governance/src/roles.rs @@ -1,32 +1,46 @@ +use pallet_permission0_api::{CuratorPermissions, Permission0CuratorApi}; use polkadot_sdk::{ frame_election_provider_support::Get, frame_support::dispatch::DispatchResult, - frame_system::ensure_signed, polkadot_sdk_frame::prelude::OriginFor, sp_runtime::{DispatchError, Percent}, }; -use crate::{ensure, storage::StorageMap, AccountIdOf, Config, Error}; +use crate::{ensure, AccountIdOf, Allocators, Config, Error, Event}; -/// Generic function used to manage the Curator and Allocator maps, which behave -/// similarly. +/// Adds a new allocator to the network, checking wether it's already registered. #[doc(hidden)] -pub fn manage_role, ()>>( - key: AccountIdOf, - is_add: bool, - error: Error, -) -> DispatchResult { - ensure!(M::contains_key(&key) != is_add, error); - if is_add { - M::insert(key, ()) - } else { - M::remove(&key) - } +pub fn add_allocator(key: AccountIdOf) -> DispatchResult { + ensure!( + !Allocators::::contains_key(&key), + Error::::AlreadyAllocator + ); + Allocators::::insert(key, ()); + Ok(()) +} + +/// Removes an existing allocator to the network, checking wether it's registered. +#[doc(hidden)] +pub fn remove_allocator(key: AccountIdOf) -> DispatchResult { + ensure!( + Allocators::::contains_key(&key), + Error::::NotAllocator + ); + Allocators::::remove(&key); Ok(()) } /// Sets a penalty ratio for the given agent. -pub fn penalize_agent(agent_key: AccountIdOf, percentage: u8) -> DispatchResult { +pub fn penalize_agent( + origin: OriginFor, + agent_key: AccountIdOf, + percentage: u8, +) -> DispatchResult { + let curator = ::Permission0::ensure_curator_permission( + origin, + CuratorPermissions::PENALTY_CONTROL, + )?; + let percentage = Percent::from_parts(percentage); if percentage > T::MaxPenaltyPercentage::get() { return Err(Error::::InvalidPenaltyPercentage.into()); @@ -42,15 +56,11 @@ pub fn penalize_agent(agent_key: AccountIdOf, percentage: u8) -> D Ok::<(), DispatchError>(()) })?; - Ok(()) -} - -/// Returns error if the origin is not listed as a curator. -pub fn ensure_curator(origin: OriginFor) -> DispatchResult { - let key: AccountIdOf = ensure_signed(origin)?; - if !crate::Curators::::contains_key(key) { - return Err(Error::::NotCurator.into()); - } + crate::Pallet::::deposit_event(Event::PenaltyApplied { + curator, + agent: agent_key, + penalty: percentage, + }); Ok(()) } diff --git a/pallets/governance/src/weights.rs b/pallets/governance/src/weights.rs index fb69986f..f511adbf 100644 --- a/pallets/governance/src/weights.rs +++ b/pallets/governance/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_governance` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-01-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-05-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `MacBook-Pro-de-Joao.local`, CPU: `` +//! HOSTNAME: `NicosiPoneXSMax.localdomain`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -38,8 +38,6 @@ use core::marker::PhantomData; /// Weight functions needed for `pallet_governance`. pub trait WeightInfo { - fn add_curator() -> Weight; - fn remove_curator() -> Weight; fn add_allocator() -> Weight; fn remove_allocator() -> Weight; fn add_to_whitelist() -> Weight; @@ -61,36 +59,14 @@ pub trait WeightInfo { /// Weights for `pallet_governance` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: `Governance::Curators` (r:1 w:1) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - fn add_curator() -> Weight { - // Proof Size summary in bytes: - // Measured: `6` - // Estimated: `3497` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(7_000_000, 3497) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `Governance::Curators` (r:1 w:1) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - fn remove_curator() -> Weight { - // Proof Size summary in bytes: - // Measured: `60` - // Estimated: `3497` - // Minimum execution time: 8_000_000 picoseconds. - Weight::from_parts(9_000_000, 3497) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } /// Storage: `Governance::Allocators` (r:1 w:1) /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) fn add_allocator() -> Weight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `3497` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(7_000_000, 3497) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(5_000_000, 3497) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -100,42 +76,54 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `62` // Estimated: `3497` - // Minimum execution time: 8_000_000 picoseconds. - Weight::from_parts(9_000_000, 3497) + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(7_000_000, 3497) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::Whitelist` (r:1 w:1) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:0) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn add_to_whitelist() -> Weight { // Proof Size summary in bytes: - // Measured: `66` - // Estimated: `3822` - // Minimum execution time: 17_000_000 picoseconds. - Weight::from_parts(18_000_000, 3822) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + // Measured: `91` + // Estimated: `6731` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(29_000_000, 6731) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::Whitelist` (r:1 w:1) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:0) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:0) - /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(849), added: 3324, mode: `MaxEncodedLen`) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn remove_from_whitelist() -> Weight { // Proof Size summary in bytes: - // Measured: `130` - // Estimated: `4314` - // Minimum execution time: 23_000_000 picoseconds. - Weight::from_parts(24_000_000, 4314) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + // Measured: `116` + // Estimated: `6731` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(32_000_000, 6731) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Governance::Whitelist` (r:1 w:0) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) @@ -143,104 +131,132 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn submit_application() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3822` - // Minimum execution time: 45_000_000 picoseconds. - Weight::from_parts(46_000_000, 3822) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + // Measured: `306` + // Estimated: `6196` + // Minimum execution time: 57_000_000 picoseconds. + Weight::from_parts(59_000_000, 6196) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:1) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Whitelist` (r:0 w:1) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn accept_application() -> Weight { // Proof Size summary in bytes: - // Measured: `241` - // Estimated: `3822` - // Minimum execution time: 46_000_000 picoseconds. - Weight::from_parts(48_000_000, 3822) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + // Measured: `469` + // Estimated: `6731` + // Minimum execution time: 73_000_000 picoseconds. + Weight::from_parts(76_000_000, 6731) + .saturating_add(T::DbWeight::get().reads(7_u64)) + .saturating_add(T::DbWeight::get().writes(8_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:1) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn deny_application() -> Weight { // Proof Size summary in bytes: - // Measured: `189` - // Estimated: `3822` - // Minimum execution time: 18_000_000 picoseconds. - Weight::from_parts(19_000_000, 3822) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + // Measured: `175` + // Estimated: `6731` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(30_000_000, 6731) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:1) - /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(849), added: 3324, mode: `MaxEncodedLen`) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn penalize_agent() -> Weight { // Proof Size summary in bytes: - // Measured: `170` - // Estimated: `4314` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(15_000_000, 4314) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + // Measured: `160` + // Estimated: `6731` + // Minimum execution time: 24_000_000 picoseconds. + Weight::from_parts(26_000_000, 6731) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn add_global_params_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3593` - // Minimum execution time: 38_000_000 picoseconds. - Weight::from_parts(40_000_000, 3593) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + // Measured: `205` + // Estimated: `6196` + // Minimum execution time: 53_000_000 picoseconds. + Weight::from_parts(54_000_000, 6196) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn add_global_custom_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3593` - // Minimum execution time: 38_000_000 picoseconds. - Weight::from_parts(39_000_000, 3593) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + // Measured: `205` + // Estimated: `6196` + // Minimum execution time: 51_000_000 picoseconds. + Weight::from_parts(53_000_000, 6196) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn add_dao_treasury_transfer_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3593` - // Minimum execution time: 38_000_000 picoseconds. - Weight::from_parts(39_000_000, 3593) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + // Measured: `204` + // Estimated: `6196` + // Minimum execution time: 52_000_000 picoseconds. + Weight::from_parts(53_000_000, 6196) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) @@ -254,8 +270,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `316` // Estimated: `6100` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(33_000_000, 6100) + // Minimum execution time: 22_000_000 picoseconds. + Weight::from_parts(23_000_000, 6100) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -265,8 +281,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `216` // Estimated: `3464` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(15_000_000, 3464) + // Minimum execution time: 11_000_000 picoseconds. + Weight::from_parts(11_000_000, 3464) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -276,8 +292,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `1484` - // Minimum execution time: 5_000_000 picoseconds. - Weight::from_parts(5_000_000, 1484) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(4_000_000, 1484) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -287,60 +303,40 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `1484` - // Minimum execution time: 5_000_000 picoseconds. - Weight::from_parts(5_000_000, 1484) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(4_000_000, 1484) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn add_emission_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3593` - // Minimum execution time: 37_000_000 picoseconds. - Weight::from_parts(38_000_000, 3593) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + // Measured: `204` + // Estimated: `6196` + // Minimum execution time: 52_000_000 picoseconds. + Weight::from_parts(53_000_000, 6196) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } } // For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: `Governance::Curators` (r:1 w:1) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - fn add_curator() -> Weight { - // Proof Size summary in bytes: - // Measured: `6` - // Estimated: `3497` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(7_000_000, 3497) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `Governance::Curators` (r:1 w:1) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - fn remove_curator() -> Weight { - // Proof Size summary in bytes: - // Measured: `60` - // Estimated: `3497` - // Minimum execution time: 8_000_000 picoseconds. - Weight::from_parts(9_000_000, 3497) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } /// Storage: `Governance::Allocators` (r:1 w:1) /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) fn add_allocator() -> Weight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `3497` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(7_000_000, 3497) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(5_000_000, 3497) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -350,42 +346,54 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `62` // Estimated: `3497` - // Minimum execution time: 8_000_000 picoseconds. - Weight::from_parts(9_000_000, 3497) + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(7_000_000, 3497) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::Whitelist` (r:1 w:1) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:0) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn add_to_whitelist() -> Weight { // Proof Size summary in bytes: - // Measured: `66` - // Estimated: `3822` - // Minimum execution time: 17_000_000 picoseconds. - Weight::from_parts(18_000_000, 3822) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + // Measured: `91` + // Estimated: `6731` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(29_000_000, 6731) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::Whitelist` (r:1 w:1) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:0) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:0) - /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(849), added: 3324, mode: `MaxEncodedLen`) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn remove_from_whitelist() -> Weight { // Proof Size summary in bytes: - // Measured: `130` - // Estimated: `4314` - // Minimum execution time: 23_000_000 picoseconds. - Weight::from_parts(24_000_000, 4314) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + // Measured: `116` + // Estimated: `6731` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(32_000_000, 6731) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Governance::Whitelist` (r:1 w:0) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) @@ -393,104 +401,132 @@ impl WeightInfo for () { /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn submit_application() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3822` - // Minimum execution time: 45_000_000 picoseconds. - Weight::from_parts(46_000_000, 3822) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + // Measured: `306` + // Estimated: `6196` + // Minimum execution time: 57_000_000 picoseconds. + Weight::from_parts(59_000_000, 6196) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:1) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Whitelist` (r:0 w:1) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn accept_application() -> Weight { // Proof Size summary in bytes: - // Measured: `241` - // Estimated: `3822` - // Minimum execution time: 46_000_000 picoseconds. - Weight::from_parts(48_000_000, 3822) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + // Measured: `469` + // Estimated: `6731` + // Minimum execution time: 73_000_000 picoseconds. + Weight::from_parts(76_000_000, 6731) + .saturating_add(RocksDbWeight::get().reads(7_u64)) + .saturating_add(RocksDbWeight::get().writes(8_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:1) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn deny_application() -> Weight { // Proof Size summary in bytes: - // Measured: `189` - // Estimated: `3822` - // Minimum execution time: 18_000_000 picoseconds. - Weight::from_parts(19_000_000, 3822) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `Governance::Curators` (r:1 w:0) - /// Proof: `Governance::Curators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + // Measured: `175` + // Estimated: `6731` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(30_000_000, 6731) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:1) - /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(849), added: 3324, mode: `MaxEncodedLen`) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn penalize_agent() -> Weight { // Proof Size summary in bytes: - // Measured: `170` - // Estimated: `4314` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(15_000_000, 4314) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + // Measured: `160` + // Estimated: `6731` + // Minimum execution time: 24_000_000 picoseconds. + Weight::from_parts(26_000_000, 6731) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn add_global_params_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3593` - // Minimum execution time: 38_000_000 picoseconds. - Weight::from_parts(40_000_000, 3593) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + // Measured: `205` + // Estimated: `6196` + // Minimum execution time: 53_000_000 picoseconds. + Weight::from_parts(54_000_000, 6196) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn add_global_custom_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3593` - // Minimum execution time: 38_000_000 picoseconds. - Weight::from_parts(39_000_000, 3593) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + // Measured: `205` + // Estimated: `6196` + // Minimum execution time: 51_000_000 picoseconds. + Weight::from_parts(53_000_000, 6196) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn add_dao_treasury_transfer_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3593` - // Minimum execution time: 38_000_000 picoseconds. - Weight::from_parts(39_000_000, 3593) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + // Measured: `204` + // Estimated: `6196` + // Minimum execution time: 52_000_000 picoseconds. + Weight::from_parts(53_000_000, 6196) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) @@ -504,8 +540,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `316` // Estimated: `6100` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(33_000_000, 6100) + // Minimum execution time: 22_000_000 picoseconds. + Weight::from_parts(23_000_000, 6100) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -515,8 +551,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `216` // Estimated: `3464` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(15_000_000, 3464) + // Minimum execution time: 11_000_000 picoseconds. + Weight::from_parts(11_000_000, 3464) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -526,8 +562,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6` // Estimated: `1484` - // Minimum execution time: 5_000_000 picoseconds. - Weight::from_parts(5_000_000, 1484) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(4_000_000, 1484) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -537,24 +573,26 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6` // Estimated: `1484` - // Minimum execution time: 5_000_000 picoseconds. - Weight::from_parts(5_000_000, 1484) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(4_000_000, 1484) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) /// Proof: `Governance::GlobalGovernanceConfig` (`max_values`: Some(1), `max_size`: Some(73), added: 568, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Proposals` (r:1 w:1) /// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn add_emission_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `152` - // Estimated: `3593` - // Minimum execution time: 37_000_000 picoseconds. - Weight::from_parts(38_000_000, 3593) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + // Measured: `204` + // Estimated: `6196` + // Minimum execution time: 52_000_000 picoseconds. + Weight::from_parts(53_000_000, 6196) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } } diff --git a/pallets/governance/tests/application.rs b/pallets/governance/tests/application.rs index 607098bc..022a1d34 100644 --- a/pallets/governance/tests/application.rs +++ b/pallets/governance/tests/application.rs @@ -4,6 +4,7 @@ use pallet_governance::{ }; use pallet_governance::{DaoTreasuryAddress, TreasuryEmissionFee}; use pallet_governance_api::GovernanceApi; +use pallet_permission0_api::CuratorPermissions; use polkadot_sdk::frame_support::assert_err; use polkadot_sdk::sp_runtime::Percent; use test_utils::*; @@ -15,7 +16,7 @@ fn error_is_thrown_on_applying_add_already_whitelisted() { let key = 0; let adding_key = 1; - pallet_governance::Curators::::insert(key, ()); + grant_curator_permission(key, CuratorPermissions::all(), None); pallet_governance::Whitelist::::insert(adding_key, ()); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; @@ -42,7 +43,7 @@ fn error_is_thrown_on_applying_remove_not_whitelisted() { let key = 0; let adding_key = 1; - pallet_governance::Curators::::insert(key, ()); + grant_curator_permission(key, CuratorPermissions::all(), None); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; let data = "test".as_bytes().to_vec(); @@ -68,7 +69,7 @@ fn whitelist_executes_application_correctly_add() { let key = 0; let adding_key = 1; - pallet_governance::Curators::::insert(key, ()); + grant_curator_permission(key, CuratorPermissions::all(), None); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; let data = "test".as_bytes().to_vec(); @@ -123,7 +124,7 @@ fn whitelist_executes_application_correctly_remove() { let key = 0; let removing_key = 1; - pallet_governance::Curators::::insert(key, ()); + grant_curator_permission(key, CuratorPermissions::all(), None); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; let data = "test".as_bytes().to_vec(); @@ -180,7 +181,7 @@ fn error_is_thrown_on_multiple_applications_same_key() { let key = 0; let adding_key = 1; - pallet_governance::Curators::::insert(key, ()); + grant_curator_permission(key, CuratorPermissions::all(), None); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; let data = "test".as_bytes().to_vec(); @@ -215,7 +216,7 @@ fn application_denied_doesnt_add_to_whitelist() { let key = 0; let adding_key = 1; - pallet_governance::Curators::::insert(key, ()); + grant_curator_permission(key, CuratorPermissions::all(), None); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; let data = "test".as_bytes().to_vec(); @@ -281,7 +282,7 @@ fn application_expires() { let key = 0; let adding_key = 1; - pallet_governance::Curators::::insert(key, ()); + grant_curator_permission(key, CuratorPermissions::all(), None); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; let data = "test".as_bytes().to_vec(); @@ -325,7 +326,7 @@ fn error_is_thrown_on_resolving_non_open_application() { let key = 0; let adding_key = 1; - pallet_governance::Curators::::insert(key, ()); + grant_curator_permission(key, CuratorPermissions::all(), None); let proposal_cost = GlobalGovernanceConfig::::get().agent_application_cost; let data = "test".as_bytes().to_vec(); diff --git a/pallets/governance/tests/proposal.rs b/pallets/governance/tests/proposal.rs index ec362d84..3661a3d4 100644 --- a/pallets/governance/tests/proposal.rs +++ b/pallets/governance/tests/proposal.rs @@ -5,6 +5,7 @@ use pallet_governance::{ }; use polkadot_sdk::{ frame_support::{assert_err, assert_ok, traits::Get}, + frame_system::RawOrigin, sp_runtime::{BoundedBTreeSet, Percent}, }; use test_utils::{ @@ -376,7 +377,7 @@ fn creates_emission_proposal_and_it_runs_after_2_days() { let origin = get_origin(0); add_balance(0, to_nano(2)); register(0, 0, 0, to_nano(1)); - let _ = pallet_governance::roles::penalize_agent::(0, 100); + let _ = pallet_governance::roles::penalize_agent::(RawOrigin::Root.into(), 0, 100); pallet_torus0::TotalStake::::set(to_nano(10)); assert_ok!(pallet_governance::Pallet::::add_emission_proposal( @@ -417,7 +418,7 @@ fn creates_emission_proposal_and_it_runs_before_expiration() { let origin = get_origin(0); add_balance(0, to_nano(2)); register(0, 0, 0, to_nano(1) - min_stake); - let _ = pallet_governance::roles::penalize_agent::(0, 100); + let _ = pallet_governance::roles::penalize_agent::(RawOrigin::Root.into(), 0, 100); pallet_torus0::TotalStake::::set(to_nano(10)); assert_ok!(pallet_governance::Pallet::::add_emission_proposal( @@ -476,7 +477,7 @@ fn creates_emission_proposal_and_it_expires() { let origin = get_origin(0); add_balance(0, to_nano(2)); register(0, 0, 0, to_nano(1) - min_stake); - let _ = pallet_governance::roles::penalize_agent::(0, 100); + let _ = pallet_governance::roles::penalize_agent::(RawOrigin::Root.into(), 0, 100); pallet_torus0::TotalStake::::set(to_nano(10)); assert_ok!(pallet_governance::Pallet::::add_emission_proposal( diff --git a/pallets/governance/tests/roles.rs b/pallets/governance/tests/roles.rs index 48922f80..bb002e11 100644 --- a/pallets/governance/tests/roles.rs +++ b/pallets/governance/tests/roles.rs @@ -1,8 +1,10 @@ -use pallet_governance::{Curators, GlobalGovernanceConfig, Whitelist}; +use pallet_governance::{GlobalGovernanceConfig, Whitelist}; +use pallet_permission0_api::CuratorPermissions; use polkadot_sdk::{frame_support::assert_err, sp_runtime::Percent}; use test_utils::*; use crate::pallet_governance::Error; +use crate::pallet_permission0::Error as PermissionError; fn register(account: AccountId, _unused: u16, module: AccountId, stake: u128) { if get_balance(account) < stake { @@ -32,31 +34,6 @@ fn register(account: AccountId, _unused: u16, module: AccountId, stake: u128) { } } -#[test] -fn add_and_remove_curator() { - new_test_ext().execute_with(|| { - let curator_key = 0; - - assert_ok!(pallet_governance::Pallet::::add_curator( - RuntimeOrigin::root(), - curator_key - )); - - assert!(pallet_governance::Curators::::contains_key( - curator_key - )); - - assert_ok!(pallet_governance::Pallet::::remove_curator( - RuntimeOrigin::root(), - curator_key, - )); - - assert!(!pallet_governance::Curators::::contains_key( - curator_key - )); - }); -} - #[test] fn add_and_remove_allocator() { new_test_ext().execute_with(|| { @@ -87,7 +64,24 @@ fn add_and_remove_from_whitelist() { new_test_ext().execute_with(|| { let curator_key = 0; let module_key = 1; - Curators::::insert(curator_key, ()); + + assert_err!( + pallet_governance::Pallet::::add_to_whitelist( + get_origin(curator_key), + module_key + ), + PermissionError::::PermissionNotFound + ); + + assert_err!( + pallet_governance::Pallet::::remove_from_whitelist( + get_origin(curator_key), + module_key + ), + PermissionError::::PermissionNotFound + ); + + grant_curator_permission(curator_key, CuratorPermissions::WHITELIST_MANAGE, None); assert_ok!(pallet_governance::Pallet::::add_to_whitelist( get_origin(curator_key), @@ -125,37 +119,13 @@ fn add_and_remove_from_whitelist() { }); } -#[test] -fn only_curators_can_whitelist() { - new_test_ext().execute_with(|| { - let not_curator_key = 0; - let module_key = 1; - - assert_err!( - pallet_governance::Pallet::::add_to_whitelist( - get_origin(not_curator_key), - module_key - ), - Error::::NotCurator - ); - - assert_err!( - pallet_governance::Pallet::::remove_from_whitelist( - get_origin(not_curator_key), - module_key - ), - Error::::NotCurator - ); - }); -} - #[test] fn cannot_remove_from_whitelist_if_remove_application_exists() { new_test_ext().execute_with(|| { let curator_key = 0; let module_key = 1; - Curators::::insert(curator_key, ()); + grant_curator_permission(curator_key, CuratorPermissions::WHITELIST_MANAGE, None); Whitelist::::set(module_key, Some(())); @@ -188,7 +158,7 @@ fn penalize_agent_successfully() { let curator_key = 0; let module_key = 1; - Curators::::insert(curator_key, ()); + grant_curator_permission(curator_key, CuratorPermissions::PENALTY_CONTROL, None); register(module_key, 0, module_key, to_nano(100)); diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index 7f14a161..8b615adc 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -4,7 +4,7 @@ use pallet_governance::{ DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, TreasuryEmissionFee, }; use pallet_governance_api::GovernanceApi; -use polkadot_sdk::frame_support::assert_err; +use polkadot_sdk::{frame_support::assert_err, frame_system::RawOrigin}; use polkadot_sdk::{frame_support::assert_ok, sp_runtime::Percent}; use polkadot_sdk::{frame_support::traits::Get, sp_runtime::BoundedVec}; use test_utils::{ @@ -219,7 +219,7 @@ fn ensures_proposal_exists() { stake(MODULE, MODULE, to_nano(1)); } - let _ = pallet_governance::roles::penalize_agent::(0, 100); + let _ = pallet_governance::roles::penalize_agent::(RawOrigin::Root.into(), 0, 100); pallet_torus0::TotalStake::::set(to_nano(10)); assert_ok!(pallet_governance::Pallet::::add_emission_proposal( diff --git a/pallets/permission0/Cargo.toml b/pallets/permission0/Cargo.toml index 103f98fd..4892401a 100644 --- a/pallets/permission0/Cargo.toml +++ b/pallets/permission0/Cargo.toml @@ -27,6 +27,7 @@ try-runtime = ["polkadot-sdk/try-runtime"] codec = { workspace = true, features = ["derive"] } scale-info = { workspace = true, features = ["derive"] } polkadot-sdk = { workspace = true, features = ["experimental", "runtime"] } +bitflags = { workspace = true, default-features = false } # Local dependencies pallet-permission0-api = { workspace = true, default-features = false } diff --git a/pallets/permission0/api/Cargo.toml b/pallets/permission0/api/Cargo.toml index b1f52d24..c5df3db8 100644 --- a/pallets/permission0/api/Cargo.toml +++ b/pallets/permission0/api/Cargo.toml @@ -25,3 +25,4 @@ codec = { workspace = true, features = ["derive"] } scale-info = { workspace = true, features = ["derive"] } polkadot-sdk = { workspace = true, features = ["experimental", "runtime"] } pallet-torus0-api = { workspace = true, default-features = false } +bitflags = { workspace = true, default-features = false } diff --git a/pallets/permission0/api/src/lib.rs b/pallets/permission0/api/src/lib.rs index 10c70fd2..9d7c1c13 100644 --- a/pallets/permission0/api/src/lib.rs +++ b/pallets/permission0/api/src/lib.rs @@ -59,18 +59,20 @@ pub enum DistributionControl { } /// Duration of the permission -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +#[derive(Encode, Decode, TypeInfo, Clone, Default, PartialEq, Eq, Debug)] pub enum PermissionDuration { /// Permission lasts until a specific block UntilBlock(BlockNumber), /// Permission lasts indefinitely + #[default] Indefinite, } /// Terms for revocation -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +#[derive(Encode, Decode, TypeInfo, Clone, Default, PartialEq, Eq, Debug)] pub enum RevocationTerms { /// Cannot be revoked + #[default] Irrevocable, /// Can be revoked by the grantor at any time RevocableByGrantor, @@ -84,9 +86,10 @@ pub enum RevocationTerms { } /// Types of enforcement actions that can be voted on -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +#[derive(Encode, Decode, TypeInfo, Clone, Default, PartialEq, Eq, Debug)] pub enum EnforcementAuthority { /// No special enforcement (standard permission execution) + #[default] None, /// Permission can be toggled active/inactive by controllers ControlledBy { @@ -96,10 +99,21 @@ pub enum EnforcementAuthority { } /// The Permission0 API trait -pub trait Permission0Api { +pub trait Permission0Api: + Permission0EmissionApi + + Permission0CuratorApi +{ /// Check if a permission exists fn permission_exists(id: &PermissionId) -> bool; + /// Revoke a permission + fn revoke_permission(who: Origin, permission_id: &PermissionId) -> DispatchResult; + + /// Execute a manual distribution for a permission + fn execute_permission(who: Origin, permission_id: &PermissionId) -> DispatchResult; +} + +pub trait Permission0EmissionApi { /// Grant a permission for emission delegation #[allow(clippy::too_many_arguments)] fn grant_emission_permission( @@ -113,12 +127,6 @@ pub trait Permission0Api, ) -> Result; - /// Revoke a permission - fn revoke_permission(who: Origin, permission_id: &PermissionId) -> DispatchResult; - - /// Execute a manual distribution for a permission - fn execute_permission(who: Origin, permission_id: &PermissionId) -> DispatchResult; - /// Accumulate emissions for an agent with permissions fn accumulate_emissions(agent: &AccountId, stream: &StreamId, amount: &mut NegativeImbalance); @@ -128,3 +136,38 @@ pub trait Permission0Api Balance; } + +bitflags::bitflags! { + #[derive(Clone, Copy, PartialEq, Eq, Debug)] + pub struct CuratorPermissions: u32 { + /// Permission to review and process agent applications + const APPLICATION_REVIEW = 0b0000_0010; + /// Permission to manage the whitelist (add/remove accounts) + const WHITELIST_MANAGE = 0b0000_0100; + /// Permission to apply penalty factors to agents + const PENALTY_CONTROL = 0b0000_1000; + } +} + +pub trait Permission0CuratorApi { + /// Grants a curator permission, bounded by the given flags. + /// Only available for the root key, currently. + fn grant_curator_permission( + grantor: Origin, + grantee: AccountId, + flags: CuratorPermissions, + cooldown: Option, + duration: PermissionDuration, + revocation: RevocationTerms, + ) -> Result; + + /// Verifies the grantee's curator permission and returns the registered + /// cooldown between actions. + fn ensure_curator_permission( + grantee: Origin, + flags: CuratorPermissions, + ) -> Result; + + /// Finds the curator permission granted to [`grantee`]. + fn get_curator_permission(grantee: &AccountId) -> Option; +} diff --git a/pallets/permission0/src/benchmarking.rs b/pallets/permission0/src/benchmarking.rs new file mode 100644 index 00000000..d2ad5703 --- /dev/null +++ b/pallets/permission0/src/benchmarking.rs @@ -0,0 +1,303 @@ +#![cfg(feature = "runtime-benchmarks")] + +use pallet_torus0_api::Torus0Api; +use polkadot_sdk::{ + frame_benchmarking::{account, v2::*}, + frame_system::RawOrigin, + sp_runtime::Percent, + sp_std::vec, +}; + +use crate::*; + +#[benchmarks] +mod benchmarks { + use polkadot_sdk::sp_std::collections::btree_map::BTreeMap; + + use super::*; + + #[benchmark] + fn grant_emission_permission() { + let grantor: T::AccountId = account("Grantor", 0, 0); + let grantee: T::AccountId = account("Grantee", 1, 0); + let target: T::AccountId = account("Target", 2, 0); + + T::Torus::force_register_agent(&grantor, vec![], vec![], vec![]) + .expect("failed to register grantor"); + T::Torus::force_register_agent(&grantee, vec![], vec![], vec![]) + .expect("failed to register grantee"); + T::Torus::force_register_agent(&target, vec![], vec![], vec![]) + .expect("failed to register target"); + + let amount = 10_000_000u32.into(); + let _ = ::deposit_creating(&grantor, amount); + + let stream_id: StreamId = [0; 32].into(); + let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); + let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); + let targets = vec![(target, 100)]; + let distribution = DistributionControl::Manual; + let duration = PermissionDuration::Indefinite; + let revocation = RevocationTerms::RevocableByGrantor; + let enforcement = EnforcementAuthority::None; + + #[extrinsic_call] + grant_emission_permission( + RawOrigin::Signed(grantor), + grantee, + allocation, + targets, + distribution, + duration, + revocation, + enforcement, + ) + } + + #[benchmark] + fn revoke_permission() { + let grantor: T::AccountId = account("Grantor", 0, 0); + let grantee: T::AccountId = account("Grantee", 1, 0); + let target: T::AccountId = account("Target", 2, 0); + + // Register agents + T::Torus::force_register_agent(&grantor, vec![], vec![], vec![]) + .expect("failed to register grantor"); + T::Torus::force_register_agent(&grantee, vec![], vec![], vec![]) + .expect("failed to register grantee"); + T::Torus::force_register_agent(&target, vec![], vec![], vec![]) + .expect("failed to register target"); + + // Fund grantor + let amount = 10_000_000u32.into(); + let _ = ::deposit_creating(&grantor, amount); + + // Create permission + let stream_id: StreamId = [0; 32].into(); + let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); + let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); + let targets = vec![(target, 100)]; + let permission_id = ext::emission_impl::grant_emission_permission_impl::( + grantor.clone(), + grantee, + allocation, + targets, + DistributionControl::Manual, + PermissionDuration::Indefinite, + RevocationTerms::RevocableByGrantor, + EnforcementAuthority::None, + None, + ) + .expect("failed to grant permission"); + + #[extrinsic_call] + revoke_permission(RawOrigin::Signed(grantor), permission_id) + } + + #[benchmark] + fn execute_permission() { + let grantor: T::AccountId = account("Grantor", 0, 0); + let grantee: T::AccountId = account("Grantee", 1, 0); + let target: T::AccountId = account("Target", 2, 0); + + // Register agents + T::Torus::force_register_agent(&grantor, vec![], vec![], vec![]) + .expect("failed to register grantor"); + T::Torus::force_register_agent(&grantee, vec![], vec![], vec![]) + .expect("failed to register grantee"); + T::Torus::force_register_agent(&target, vec![], vec![], vec![]) + .expect("failed to register target"); + + // Fund grantor + let amount = 10_000_000u32.into(); + let _ = ::deposit_creating(&grantor, amount); + + // Create permission with fixed amount allocation + let stream_id: StreamId = [0; 32].into(); + let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); + let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); + let targets = vec![(target, 100)]; + + let permission_id = ext::emission_impl::grant_emission_permission_impl::( + grantor.clone(), + grantee, + allocation, + targets, + DistributionControl::Manual, + PermissionDuration::Indefinite, + RevocationTerms::RevocableByGrantor, + EnforcementAuthority::None, + None, + ) + .expect("failed to grant permission"); + + AccumulatedStreamAmounts::::set((&grantor, stream_id, permission_id), Some(amount)); + + #[extrinsic_call] + execute_permission(RawOrigin::Signed(grantor), permission_id) + } + + #[benchmark] + fn toggle_permission_accumulation() { + let grantor: T::AccountId = account("Grantor", 0, 0); + let grantee: T::AccountId = account("Grantee", 1, 0); + let target: T::AccountId = account("Target", 2, 0); + + // Register agents + T::Torus::force_register_agent(&grantor, vec![], vec![], vec![]) + .expect("failed to register grantor"); + T::Torus::force_register_agent(&grantee, vec![], vec![], vec![]) + .expect("failed to register grantee"); + T::Torus::force_register_agent(&target, vec![], vec![], vec![]) + .expect("failed to register target"); + + // Fund grantor + let amount = 10_000_000u32.into(); + let _ = ::deposit_creating(&grantor, amount); + + // Create permission with stream allocation + let stream_id: StreamId = [0; 32].into(); + let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); + let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); + let targets = vec![(target, 100)]; + + let permission_id = ext::emission_impl::grant_emission_permission_impl::( + grantor.clone(), + grantee, + allocation, + targets, + DistributionControl::Manual, + PermissionDuration::Indefinite, + RevocationTerms::RevocableByGrantor, + EnforcementAuthority::None, + None, + ) + .expect("failed to grant permission"); + + #[extrinsic_call] + toggle_permission_accumulation(RawOrigin::Signed(grantor), permission_id, false) + } + + #[benchmark] + fn enforcement_execute_permission() { + let grantor: T::AccountId = account("Grantor", 0, 0); + let grantee: T::AccountId = account("Grantee", 1, 0); + let target: T::AccountId = account("Target", 2, 0); + let controller: T::AccountId = account("Controller", 3, 0); + + // Register agents + T::Torus::force_register_agent(&grantor, vec![], vec![], vec![]) + .expect("failed to register grantor"); + T::Torus::force_register_agent(&grantee, vec![], vec![], vec![]) + .expect("failed to register grantee"); + T::Torus::force_register_agent(&target, vec![], vec![], vec![]) + .expect("failed to register target"); + + // Fund grantor + let amount = 10_000_000u32.into(); + let _ = ::deposit_creating(&grantor, amount); + + // Create permission with fixed amount allocation and enforcement authority + let stream_id: StreamId = [0; 32].into(); + let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); + let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); + let targets = vec![(target, 100)]; + let controllers = vec![controller.clone()].try_into().unwrap(); + + let enforcement = EnforcementAuthority::ControlledBy { + controllers, + required_votes: 1, + }; + + let permission_id = ext::emission_impl::grant_emission_permission_impl::( + grantor.clone(), + grantee, + allocation, + targets, + DistributionControl::Manual, + PermissionDuration::Indefinite, + RevocationTerms::RevocableByGrantor, + enforcement, + None, + ) + .expect("failed to grant permission"); + + AccumulatedStreamAmounts::::set((&grantor, stream_id, permission_id), Some(amount)); + + #[extrinsic_call] + enforcement_execute_permission(RawOrigin::Signed(controller), permission_id) + } + + #[benchmark] + fn set_enforcement_authority() { + let grantor: T::AccountId = account("Grantor", 0, 0); + let grantee: T::AccountId = account("Grantee", 1, 0); + let target: T::AccountId = account("Target", 2, 0); + let controller1: T::AccountId = account("Controller1", 3, 0); + let controller2: T::AccountId = account("Controller2", 4, 0); + + // Register agents + T::Torus::force_register_agent(&grantor, vec![], vec![], vec![]) + .expect("failed to register grantor"); + T::Torus::force_register_agent(&grantee, vec![], vec![], vec![]) + .expect("failed to register grantee"); + T::Torus::force_register_agent(&target, vec![], vec![], vec![]) + .expect("failed to register target"); + + let amount = 10_000_000u32.into(); + let _ = ::deposit_creating(&grantor, amount); + + let stream_id: StreamId = [0; 32].into(); + let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); + let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); + let targets = vec![(target, 100)]; + + let permission_id = ext::emission_impl::grant_emission_permission_impl::( + grantor.clone(), + grantee, + allocation, + targets, + DistributionControl::Manual, + PermissionDuration::Indefinite, + RevocationTerms::RevocableByGrantor, + EnforcementAuthority::None, + None, + ) + .expect("failed to grant permission"); + + // Prepare new controllers + let controllers = vec![controller1, controller2]; + let required_votes = 1u32; + + #[extrinsic_call] + set_enforcement_authority( + RawOrigin::Signed(grantor), + permission_id, + controllers, + required_votes, + ) + } + + #[benchmark] + fn grant_curator_permission() { + let grantee: T::AccountId = account("Grantee", 1, 0); + + // Prepare parameters + let flags = CuratorPermissions::APPLICATION_REVIEW.bits() + | CuratorPermissions::WHITELIST_MANAGE.bits() + | CuratorPermissions::PENALTY_CONTROL.bits(); + let cooldown = Some(10u32.into()); + let duration = PermissionDuration::Indefinite; + let revocation = RevocationTerms::RevocableByGrantor; + + #[extrinsic_call] + grant_curator_permission( + RawOrigin::Root, + grantee, + flags, + cooldown, + duration, + revocation, + ) + } +} diff --git a/pallets/permission0/src/ext.rs b/pallets/permission0/src/ext.rs index 5a3e67fb..77d6c6ed 100644 --- a/pallets/permission0/src/ext.rs +++ b/pallets/permission0/src/ext.rs @@ -1,29 +1,22 @@ use crate::permission::EnforcementReferendum; use crate::{ - generate_permission_id, get_total_allocated_percentage, pallet, - permission::emission::DistributionReason, update_permission_indices, AccumulatedStreamAmounts, - BalanceOf, Config, DistributionControl, EmissionAllocation, EmissionScope, - EnforcementAuthority, EnforcementTracking, Error, Event, Pallet, PermissionContract, + pallet, Config, EnforcementAuthority, EnforcementTracking, Error, Event, Pallet, PermissionDuration, PermissionId, PermissionScope, Permissions, RevocationTerms, }; use pallet_permission0_api::{ - DistributionControl as ApiDistributionControl, EmissionAllocation as ApiEmissionAllocation, EnforcementAuthority as ApiEnforcementAuthority, Permission0Api, - PermissionDuration as ApiPermissionDuration, RevocationTerms as ApiRevocationTerms, StreamId, + PermissionDuration as ApiPermissionDuration, RevocationTerms as ApiRevocationTerms, }; -use pallet_torus0_api::Torus0Api; -use polkadot_sdk::polkadot_sdk_frame::traits::CheckedAdd; use polkadot_sdk::{ - frame_support::{ - ensure, - traits::{Currency, Get, ReservableCurrency}, - }, - frame_system::{self, ensure_signed_or_root}, + frame_support::{ensure, traits::Currency}, + frame_system::ensure_signed_or_root, polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, - sp_runtime::{traits::Zero, DispatchError, DispatchResult, Percent, Vec}, - sp_std::collections::btree_map::BTreeMap, + sp_runtime::{DispatchError, DispatchResult}, }; +pub mod curator_impl; +pub mod emission_impl; + /// Implementation of the Permission0Api trait to be used externally impl Permission0Api< @@ -38,80 +31,6 @@ impl Permissions::::contains_key(id) } - fn grant_emission_permission( - grantor: T::AccountId, - grantee: T::AccountId, - allocation: ApiEmissionAllocation>, - targets: Vec<(T::AccountId, u16)>, - distribution: ApiDistributionControl, BlockNumberFor>, - duration: ApiPermissionDuration>, - revocation: ApiRevocationTerms>, - enforcement: ApiEnforcementAuthority, - ) -> Result { - let internal_allocation = match allocation { - ApiEmissionAllocation::Streams(streams) => EmissionAllocation::Streams( - streams - .try_into() - .map_err(|_| crate::Error::::TooManyStreams)?, - ), - ApiEmissionAllocation::FixedAmount(amount) => EmissionAllocation::FixedAmount(amount), - }; - - let internal_distribution = match distribution { - ApiDistributionControl::Manual => DistributionControl::Manual, - ApiDistributionControl::Automatic(threshold) => { - DistributionControl::Automatic(threshold) - } - ApiDistributionControl::AtBlock(block) => DistributionControl::AtBlock(block), - ApiDistributionControl::Interval(interval) => DistributionControl::Interval(interval), - }; - - let internal_duration = match duration { - ApiPermissionDuration::UntilBlock(block) => PermissionDuration::UntilBlock(block), - ApiPermissionDuration::Indefinite => PermissionDuration::Indefinite, - }; - - let internal_revocation = match revocation { - ApiRevocationTerms::Irrevocable => RevocationTerms::Irrevocable, - ApiRevocationTerms::RevocableByGrantor => RevocationTerms::RevocableByGrantor, - ApiRevocationTerms::RevocableByArbiters { - accounts, - required_votes, - } => RevocationTerms::RevocableByArbiters { - accounts: accounts - .try_into() - .map_err(|_| crate::Error::::TooManyRevokers)?, - required_votes, - }, - ApiRevocationTerms::RevocableAfter(blocks) => RevocationTerms::RevocableAfter(blocks), - }; - - let internal_enforcement = match enforcement { - ApiEnforcementAuthority::None => EnforcementAuthority::None, - ApiEnforcementAuthority::ControlledBy { - controllers, - required_votes, - } => EnforcementAuthority::ControlledBy { - controllers: controllers - .try_into() - .map_err(|_| crate::Error::::TooManyControllers)?, - required_votes, - }, - }; - - grant_permission_impl::( - grantor, - grantee, - internal_allocation, - targets, - internal_distribution, - internal_duration, - internal_revocation, - internal_enforcement, - None, // No parent by default - ) - } - fn revoke_permission(who: OriginFor, permission_id: &PermissionId) -> DispatchResult { revoke_permission_impl::(who, permission_id) } @@ -119,224 +38,88 @@ impl fn execute_permission(who: OriginFor, permission_id: &PermissionId) -> DispatchResult { execute_permission_impl::(who, permission_id) } - - fn accumulate_emissions( - agent: &T::AccountId, - stream: &StreamId, - amount: &mut >::NegativeImbalance, - ) { - crate::permission::emission::do_accumulate_emissions::(agent, stream, amount); - } - - fn process_auto_distributions(current_block: BlockNumberFor) { - crate::permission::do_auto_permission_execution::(current_block); - } - - fn get_accumulated_amount( - permission_id: &PermissionId, - stream: &StreamId, - ) -> crate::BalanceOf { - let Some(contract) = Permissions::::get(permission_id) else { - return Zero::zero(); - }; - - crate::AccumulatedStreamAmounts::::get((contract.grantor, stream, permission_id)) - .unwrap_or_default() - } } -/// Grant a permission implementation -#[allow(clippy::too_many_arguments)] -pub(crate) fn grant_permission_impl( - grantor: T::AccountId, - grantee: T::AccountId, - allocation: EmissionAllocation, - targets: Vec<(T::AccountId, u16)>, - distribution: DistributionControl, - duration: PermissionDuration, - revocation: RevocationTerms, - enforcement: EnforcementAuthority, - parent_id: Option, -) -> Result { - use polkadot_sdk::frame_support::ensure; - - ensure!( - T::Torus::is_agent_registered(&grantor), - Error::::NotRegisteredAgent - ); - ensure!( - T::Torus::is_agent_registered(&grantee), - Error::::NotRegisteredAgent - ); - ensure!(grantor != grantee, Error::::SelfPermissionNotAllowed); - ensure!(!targets.is_empty(), Error::::NoTargetsSpecified); - - for (target, _) in &targets { - ensure!( - T::Torus::is_agent_registered(target), - Error::::NotRegisteredAgent - ); - } - - match &allocation { - EmissionAllocation::Streams(streams) => { - for (stream, percentage) in streams { - ensure!(*percentage <= Percent::one(), Error::::InvalidPercentage); - - let total_allocated = get_total_allocated_percentage::(&grantor, stream); - let new_total_allocated = match total_allocated.checked_add(percentage) { - Some(new_total_allocated) => new_total_allocated, - None => return Err(Error::::TotalAllocationExceeded.into()), - }; - - ensure!( - new_total_allocated <= Percent::one(), - Error::::TotalAllocationExceeded - ); - } - } - EmissionAllocation::FixedAmount(amount) => { - ensure!(*amount > BalanceOf::::zero(), Error::::InvalidAmount); - ensure!( - T::Currency::can_reserve(&grantor, *amount), - Error::::InsufficientBalance - ); - ensure!( - matches!( - &distribution, - DistributionControl::Manual | DistributionControl::AtBlock(_) - ), - Error::::FixedAmountCanOnlyBeTriggeredOnce - ); - } - } - - match &distribution { - DistributionControl::Automatic(threshold) => { - ensure!( - *threshold >= T::MinAutoDistributionThreshold::get(), - Error::::InvalidThreshold - ); - } - DistributionControl::Interval(interval) => { - ensure!(!interval.is_zero(), Error::::InvalidInterval); - } - DistributionControl::AtBlock(block) => { +fn translate_duration( + duration: ApiPermissionDuration>, +) -> Result, DispatchError> { + Ok(match duration { + ApiPermissionDuration::UntilBlock(block) => { let current_block = >::block_number(); - ensure!(*block > current_block, Error::::InvalidInterval); + ensure!(block > current_block, Error::::InvalidInterval); + + PermissionDuration::UntilBlock(block) } - _ => {} - } + ApiPermissionDuration::Indefinite => PermissionDuration::Indefinite, + }) +} - match &revocation { - RevocationTerms::RevocableByArbiters { +fn translate_revocation_terms( + revocation: ApiRevocationTerms>, +) -> Result, DispatchError> { + let revocation = match revocation { + ApiRevocationTerms::Irrevocable => RevocationTerms::Irrevocable, + ApiRevocationTerms::RevocableByGrantor => RevocationTerms::RevocableByGrantor, + ApiRevocationTerms::RevocableByArbiters { accounts, required_votes, } => { - ensure!(*required_votes > 0, Error::::InvalidNumberOfRevokers); + ensure!(required_votes > 0, Error::::InvalidNumberOfRevokers); ensure!(!accounts.is_empty(), Error::::InvalidNumberOfRevokers); ensure!( - *required_votes as usize <= accounts.len(), + required_votes as usize <= accounts.len(), Error::::InvalidNumberOfRevokers ); + + RevocationTerms::RevocableByArbiters { + accounts: accounts + .try_into() + .map_err(|_| crate::Error::::TooManyRevokers)?, + required_votes, + } } - RevocationTerms::RevocableAfter(block) => { + ApiRevocationTerms::RevocableAfter(block) => { let current_block = >::block_number(); - ensure!(*block > current_block, Error::::InvalidInterval); + ensure!(block > current_block, Error::::InvalidInterval); + + RevocationTerms::RevocableAfter(block) } + }; - _ => {} - } + Ok(revocation) +} - match &enforcement { - EnforcementAuthority::None => {} - EnforcementAuthority::ControlledBy { +fn translate_enforcement_authority( + enforcement: ApiEnforcementAuthority, +) -> Result, DispatchError> { + let enforcement = match enforcement { + ApiEnforcementAuthority::None => EnforcementAuthority::None, + ApiEnforcementAuthority::ControlledBy { controllers, required_votes, } => { - ensure!(*required_votes > 0, Error::::InvalidNumberOfControllers); + ensure!(required_votes > 0, Error::::InvalidNumberOfControllers); ensure!( !controllers.is_empty(), Error::::InvalidNumberOfControllers ); ensure!( - *required_votes as usize <= controllers.len(), + required_votes as usize <= controllers.len(), Error::::InvalidNumberOfControllers ); - } - } - - // TODO: develop the idea - if let Some(parent) = parent_id { - let parent_contract = - Permissions::::get(parent).ok_or(Error::::ParentPermissionNotFound)?; - - ensure!( - parent_contract.grantee == grantor, - Error::::NotPermissionGrantee - ); - - // Additional validations for parent-child relationship could be added here - } - - let target_map: BTreeMap<_, _> = targets.into_iter().collect(); - let targets = target_map - .try_into() - .map_err(|_| Error::::TooManyTargets)?; - let emission_scope = EmissionScope { - allocation: allocation.clone(), - distribution, - targets, - accumulating: true, // Start with accumulation enabled by default - }; - - let scope = PermissionScope::Emission(emission_scope); - - let permission_id = generate_permission_id::(&grantor, &grantee, &scope); - - let contract = PermissionContract { - grantor: grantor.clone(), - grantee: grantee.clone(), - scope, - duration, - revocation, - enforcement, - last_execution: None, - execution_count: 0, - parent: parent_id, - created_at: >::block_number(), - }; - - // Reserve funds if fixed amount allocation. We use the Balances API for this. - // This means total issuance is always correct. - match allocation { - EmissionAllocation::FixedAmount(amount) => { - T::Currency::reserve(&grantor, amount)?; - } - EmissionAllocation::Streams(streams) => { - for stream in streams.keys() { - AccumulatedStreamAmounts::::set( - (&grantor, stream, permission_id), - Some(Zero::zero()), - ) + EnforcementAuthority::ControlledBy { + controllers: controllers + .try_into() + .map_err(|_| crate::Error::::TooManyControllers)?, + required_votes, } } - } - - Permissions::::insert(permission_id, contract); - - update_permission_indices::(&grantor, &grantee, permission_id)?; - - >::deposit_event(Event::PermissionGranted { - grantor, - grantee, - permission_id, - }); + }; - Ok(permission_id) + Ok(enforcement) } /// Revoke a permission implementation @@ -365,116 +148,11 @@ pub(crate) fn execute_permission_impl( ); match &contract.scope { - PermissionScope::Emission(emission_scope) => match emission_scope.distribution { - DistributionControl::Manual => { - ensure!( - emission_scope.accumulating, - Error::::UnsupportedPermissionType - ); - - let accumulated = match &emission_scope.allocation { - EmissionAllocation::Streams(streams) => streams - .keys() - .filter_map(|id| { - AccumulatedStreamAmounts::::get(( - &contract.grantor, - id, - permission_id, - )) - }) - .fold(BalanceOf::::zero(), |acc, e| acc + e), // The Balance AST does not enforce the Sum trait - EmissionAllocation::FixedAmount(amount) => *amount, - }; - - ensure!(!accumulated.is_zero(), Error::::NoAccumulatedAmount); - - crate::permission::emission::do_distribute_emission::( - *permission_id, - &contract, - DistributionReason::Manual, - ); - } - _ => return Err(Error::::InvalidDistributionMethod.into()), - }, - #[allow(unreachable_patterns)] - _ => return Err(Error::::UnsupportedPermissionType.into()), - } - - Ok(()) -} - -/// Toggle a permission's accumulation state -pub fn toggle_permission_accumulation_impl( - origin: OriginFor, - permission_id: PermissionId, - accumulating: bool, -) -> DispatchResult { - let who = ensure_signed_or_root(origin)?; - - let mut contract = - Permissions::::get(permission_id).ok_or(Error::::PermissionNotFound)?; - - if let Some(who) = &who { - match &contract.enforcement { - _ if who == &contract.grantor => {} - EnforcementAuthority::None => { - return Err(Error::::NotAuthorizedToToggle.into()); - } - EnforcementAuthority::ControlledBy { - controllers, - required_votes, - } => { - ensure!(controllers.contains(who), Error::::NotAuthorizedToToggle); - - let referendum = EnforcementReferendum::EmissionAccumulation(accumulating); - let votes = EnforcementTracking::::get(permission_id, &referendum) - .into_iter() - .filter(|id| id != who) - .filter(|id| controllers.contains(id)) - .count(); - - if votes + 1 < *required_votes as usize { - return EnforcementTracking::::mutate( - permission_id, - referendum.clone(), - |votes| { - votes - .try_insert(who.clone()) - .map_err(|_| Error::::TooManyControllers)?; - - >::deposit_event(Event::EnforcementVoteCast { - permission_id, - voter: who.clone(), - referendum, - }); - - Ok(()) - }, - ); - } - } + PermissionScope::Emission(emission_scope) => { + emission_impl::execute_permission_impl(permission_id, &contract, emission_scope) } + PermissionScope::Curator(_) => curator_impl::execute_permission_impl::(permission_id), } - - match &mut contract.scope { - PermissionScope::Emission(emission_scope) => emission_scope.accumulating = accumulating, - } - - Permissions::::insert(permission_id, contract); - - // Clear any votes for this referendum - EnforcementTracking::::remove( - permission_id, - EnforcementReferendum::EmissionAccumulation(accumulating), - ); - - >::deposit_event(Event::PermissionAccumulationToggled { - permission_id, - accumulating, - toggled_by: who, - }); - - Ok(()) } /// Execute a permission through enforcement authority @@ -530,37 +208,10 @@ pub fn enforcement_execute_permission_impl( match &contract.scope { PermissionScope::Emission(emission_scope) => { - ensure!( - emission_scope.accumulating, - Error::::UnsupportedPermissionType - ); - - match emission_scope.distribution { - DistributionControl::Manual => { - let accumulated = match &emission_scope.allocation { - EmissionAllocation::Streams(streams) => streams - .keys() - .filter_map(|id| { - AccumulatedStreamAmounts::::get(( - &contract.grantor, - id, - permission_id, - )) - }) - .fold(BalanceOf::::zero(), |acc, e| acc + e), - EmissionAllocation::FixedAmount(amount) => *amount, - }; - - ensure!(!accumulated.is_zero(), Error::::NoAccumulatedAmount); - - crate::permission::emission::do_distribute_emission::( - permission_id, - &contract, - DistributionReason::Manual, - ); - } - _ => return Err(Error::::InvalidDistributionMethod.into()), - } + emission_impl::execute_permission_impl(&permission_id, &contract, emission_scope)? + } + PermissionScope::Curator(_) => { + return curator_impl::execute_permission_impl::(&permission_id); } } diff --git a/pallets/permission0/src/ext/curator_impl.rs b/pallets/permission0/src/ext/curator_impl.rs new file mode 100644 index 00000000..7a2340c8 --- /dev/null +++ b/pallets/permission0/src/ext/curator_impl.rs @@ -0,0 +1,174 @@ +use crate::{ + generate_permission_id, pallet, update_permission_indices, Config, CuratorPermissions, + CuratorScope, Error, Event, Pallet, PermissionContract, PermissionDuration, PermissionScope, + Permissions, PermissionsByGrantee, RevocationTerms, +}; + +use pallet_permission0_api::{ + CuratorPermissions as ApiCuratorPermissions, Permission0CuratorApi, + PermissionDuration as ApiPermissionDuration, PermissionId, + RevocationTerms as ApiRevocationTerms, +}; +use polkadot_sdk::frame_system::{ensure_root, ensure_signed_or_root}; +use polkadot_sdk::sp_core::Get; +use polkadot_sdk::sp_runtime::traits::AccountIdConversion; +use polkadot_sdk::{ + frame_support::ensure, + frame_system, + polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, + sp_runtime::{DispatchError, DispatchResult}, +}; + +impl Permission0CuratorApi, BlockNumberFor> + for pallet::Pallet +{ + fn grant_curator_permission( + grantor: OriginFor, + grantee: T::AccountId, + flags: ApiCuratorPermissions, + cooldown: Option>, + duration: ApiPermissionDuration>, + revocation: ApiRevocationTerms>, + ) -> Result { + let duration = super::translate_duration::(duration)?; + let revocation = super::translate_revocation_terms::(revocation)?; + + let flags = CuratorPermissions::from_bits_truncate(flags.bits()); + grant_curator_permission_impl(grantor, grantee, flags, cooldown, duration, revocation) + } + + fn ensure_curator_permission( + grantee: OriginFor, + flags: ApiCuratorPermissions, + ) -> Result { + let Some(grantee) = ensure_signed_or_root(grantee)? else { + return Ok(T::PalletId::get().into_account_truncating()); + }; + + let Some(permissions) = PermissionsByGrantee::::get(&grantee) else { + return Err(Error::::PermissionNotFound.into()); + }; + + let Some((_, contract)) = permissions.into_iter().find_map(|permission_id| { + let contract = Permissions::::get(permission_id)?; + + if matches!(&contract.scope, PermissionScope::Curator(_)) { + Some((permission_id, contract)) + } else { + None + } + }) else { + return Err(Error::::PermissionNotFound.into()); + }; + + let PermissionScope::Curator(scope) = &contract.scope else { + return Err(Error::::PermissionNotFound.into()); + }; + + let flags = CuratorPermissions::from_bits_truncate(flags.bits()); + if !scope.has_permission(flags) { + return Err(Error::::PermissionNotFound.into()); + } + + if let Some(cooldown) = scope.cooldown { + let now = >::block_number(); + + if contract + .last_execution + .is_some_and(|last_execution| last_execution + cooldown > now) + { + return Err(Error::::PermissionInCooldown.into()); + } + } + + Ok(grantee) + } + + fn get_curator_permission(grantee: &T::AccountId) -> Option { + let permissions = PermissionsByGrantee::::get(grantee)?; + + permissions.into_iter().find_map(|permission_id| { + let contract = Permissions::::get(permission_id)?; + + if matches!(&contract.scope, PermissionScope::Curator(_)) { + Some(permission_id) + } else { + None + } + }) + } +} + +pub fn grant_curator_permission_impl( + grantor: OriginFor, + grantee: T::AccountId, + mut flags: CuratorPermissions, + cooldown: Option>, + duration: PermissionDuration, + revocation: RevocationTerms, +) -> Result { + ensure_root(grantor)?; + + // Root permission is not grantable + flags.remove(CuratorPermissions::ROOT); + + ensure!(!flags.is_empty(), Error::::InvalidCuratorPermissions); + + let grantor = ::PalletId::get().into_account_truncating(); + + // We do not check for the ROOT curator permission at the moment. + // This is mainly due to our use of a SUDO key at the moment. + // Once we move away from centralized chain management, a ROOT curator + // will be appointed by the system. + + if let Some(permissions) = PermissionsByGrantee::::get(&grantee) { + for perm in permissions { + let Some(contract) = Permissions::::get(perm) else { + continue; + }; + + if matches!(&contract.scope, PermissionScope::Curator(_)) { + return Err(Error::::DuplicatePermission.into()); + } + } + } + + let scope = PermissionScope::Curator(CuratorScope { flags, cooldown }); + let permission_id = generate_permission_id::(&grantor, &grantee, &scope); + + let contract = PermissionContract { + grantor, + grantee, + scope, + duration, + revocation, + enforcement: crate::EnforcementAuthority::None, + last_execution: None, + execution_count: 0, + // Will change once we have a ROOT curator. + parent: None, + created_at: >::block_number(), + }; + + Permissions::::insert(permission_id, &contract); + update_permission_indices::(&contract.grantor, &contract.grantee, permission_id)?; + + >::deposit_event(Event::PermissionGranted { + grantor: contract.grantor, + grantee: contract.grantee, + permission_id, + }); + + Ok(permission_id) +} + +pub fn execute_permission_impl(permission_id: &PermissionId) -> DispatchResult { + Permissions::::mutate(permission_id, |maybe_contract| { + if let Some(c) = maybe_contract { + c.last_execution = Some(>::block_number()); + c.execution_count = c.execution_count.saturating_add(1); + } + }); + + Ok(()) +} diff --git a/pallets/permission0/src/ext/emission_impl.rs b/pallets/permission0/src/ext/emission_impl.rs new file mode 100644 index 00000000..7a1a20ab --- /dev/null +++ b/pallets/permission0/src/ext/emission_impl.rs @@ -0,0 +1,371 @@ +use crate::{ + generate_permission_id, get_total_allocated_percentage, pallet, + permission::{emission::*, *}, + update_permission_indices, AccumulatedStreamAmounts, BalanceOf, Config, DistributionControl, + EmissionAllocation, EmissionScope, EnforcementTracking, Error, Event, Pallet, + PermissionContract, PermissionDuration, PermissionId, PermissionScope, Permissions, +}; + +use pallet_permission0_api::{ + DistributionControl as ApiDistributionControl, EmissionAllocation as ApiEmissionAllocation, + EnforcementAuthority as ApiEnforcementAuthority, Permission0EmissionApi, + PermissionDuration as ApiPermissionDuration, RevocationTerms as ApiRevocationTerms, StreamId, +}; +use polkadot_sdk::{ + frame_support::{ + dispatch::DispatchResult, + ensure, + traits::{Currency, ReservableCurrency}, + }, + frame_system::{self, ensure_signed_or_root}, + polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, + sp_core::Get, + sp_runtime::{ + traits::{CheckedAdd, Zero}, + DispatchError, Percent, Vec, + }, + sp_std::collections::btree_map::BTreeMap, +}; + +use pallet_torus0_api::Torus0Api; + +impl + Permission0EmissionApi< + T::AccountId, + OriginFor, + BlockNumberFor, + crate::BalanceOf, + >::NegativeImbalance, + > for pallet::Pallet +{ + fn grant_emission_permission( + grantor: T::AccountId, + grantee: T::AccountId, + allocation: ApiEmissionAllocation>, + targets: Vec<(T::AccountId, u16)>, + distribution: ApiDistributionControl, BlockNumberFor>, + duration: ApiPermissionDuration>, + revocation: ApiRevocationTerms>, + enforcement: ApiEnforcementAuthority, + ) -> Result { + let internal_allocation = match allocation { + ApiEmissionAllocation::Streams(streams) => EmissionAllocation::Streams( + streams + .try_into() + .map_err(|_| crate::Error::::TooManyStreams)?, + ), + ApiEmissionAllocation::FixedAmount(amount) => EmissionAllocation::FixedAmount(amount), + }; + + let internal_distribution = match distribution { + ApiDistributionControl::Manual => DistributionControl::Manual, + ApiDistributionControl::Automatic(threshold) => { + DistributionControl::Automatic(threshold) + } + ApiDistributionControl::AtBlock(block) => DistributionControl::AtBlock(block), + ApiDistributionControl::Interval(interval) => DistributionControl::Interval(interval), + }; + + let duration = super::translate_duration(duration)?; + let revocation = super::translate_revocation_terms(revocation)?; + let enforcement = super::translate_enforcement_authority(enforcement)?; + + grant_emission_permission_impl::( + grantor, + grantee, + internal_allocation, + targets, + internal_distribution, + duration, + revocation, + enforcement, + None, // No parent by default + ) + } + + fn accumulate_emissions( + agent: &T::AccountId, + stream: &StreamId, + amount: &mut >::NegativeImbalance, + ) { + crate::permission::emission::do_accumulate_emissions::(agent, stream, amount); + } + + fn process_auto_distributions(current_block: BlockNumberFor) { + crate::permission::do_auto_permission_execution::(current_block); + } + + fn get_accumulated_amount( + permission_id: &PermissionId, + stream: &StreamId, + ) -> crate::BalanceOf { + let Some(contract) = Permissions::::get(permission_id) else { + return Zero::zero(); + }; + + crate::AccumulatedStreamAmounts::::get((contract.grantor, stream, permission_id)) + .unwrap_or_default() + } +} + +/// Grant a permission implementation +#[allow(clippy::too_many_arguments)] +pub(crate) fn grant_emission_permission_impl( + grantor: T::AccountId, + grantee: T::AccountId, + allocation: EmissionAllocation, + targets: Vec<(T::AccountId, u16)>, + distribution: DistributionControl, + duration: PermissionDuration, + revocation: RevocationTerms, + enforcement: EnforcementAuthority, + parent_id: Option, +) -> Result { + use polkadot_sdk::frame_support::ensure; + + ensure!( + T::Torus::is_agent_registered(&grantor), + Error::::NotRegisteredAgent + ); + ensure!( + T::Torus::is_agent_registered(&grantee), + Error::::NotRegisteredAgent + ); + ensure!(grantor != grantee, Error::::SelfPermissionNotAllowed); + ensure!(!targets.is_empty(), Error::::NoTargetsSpecified); + + for (target, _) in &targets { + ensure!( + T::Torus::is_agent_registered(target), + Error::::NotRegisteredAgent + ); + } + + match &allocation { + EmissionAllocation::Streams(streams) => { + for (stream, percentage) in streams { + ensure!(*percentage <= Percent::one(), Error::::InvalidPercentage); + + let total_allocated = get_total_allocated_percentage::(&grantor, stream); + let new_total_allocated = match total_allocated.checked_add(percentage) { + Some(new_total_allocated) => new_total_allocated, + None => return Err(Error::::TotalAllocationExceeded.into()), + }; + + ensure!( + new_total_allocated <= Percent::one(), + Error::::TotalAllocationExceeded + ); + } + } + EmissionAllocation::FixedAmount(amount) => { + ensure!(*amount > BalanceOf::::zero(), Error::::InvalidAmount); + ensure!( + T::Currency::can_reserve(&grantor, *amount), + Error::::InsufficientBalance + ); + ensure!( + matches!( + &distribution, + DistributionControl::Manual | DistributionControl::AtBlock(_) + ), + Error::::FixedAmountCanOnlyBeTriggeredOnce + ); + } + } + + match &distribution { + DistributionControl::Automatic(threshold) => { + ensure!( + *threshold >= T::MinAutoDistributionThreshold::get(), + Error::::InvalidThreshold + ); + } + DistributionControl::Interval(interval) => { + ensure!(!interval.is_zero(), Error::::InvalidInterval); + } + DistributionControl::AtBlock(block) => { + let current_block = >::block_number(); + ensure!(*block > current_block, Error::::InvalidInterval); + } + _ => {} + } + + if let Some(parent) = parent_id { + let parent_contract = + Permissions::::get(parent).ok_or(Error::::ParentPermissionNotFound)?; + + ensure!( + parent_contract.grantee == grantor, + Error::::NotPermissionGrantee + ); + } + + let target_map: BTreeMap<_, _> = targets.into_iter().collect(); + let targets = target_map + .try_into() + .map_err(|_| Error::::TooManyTargets)?; + + let emission_scope = EmissionScope { + allocation: allocation.clone(), + distribution, + targets, + accumulating: true, // Start with accumulation enabled by default + }; + + let scope = PermissionScope::Emission(emission_scope); + + let permission_id = generate_permission_id::(&grantor, &grantee, &scope); + + let contract = PermissionContract { + grantor: grantor.clone(), + grantee: grantee.clone(), + scope, + duration, + revocation, + enforcement, + last_execution: None, + execution_count: 0, + parent: parent_id, + created_at: >::block_number(), + }; + + // Reserve funds if fixed amount allocation. We use the Balances API for this. + // This means total issuance is always correct. + match allocation { + EmissionAllocation::FixedAmount(amount) => { + T::Currency::reserve(&grantor, amount)?; + } + EmissionAllocation::Streams(streams) => { + for stream in streams.keys() { + AccumulatedStreamAmounts::::set( + (&grantor, stream, permission_id), + Some(Zero::zero()), + ) + } + } + } + + Permissions::::insert(permission_id, contract); + + update_permission_indices::(&grantor, &grantee, permission_id)?; + + >::deposit_event(Event::PermissionGranted { + grantor, + grantee, + permission_id, + }); + + Ok(permission_id) +} + +pub fn execute_permission_impl( + permission_id: &PermissionId, + contract: &PermissionContract, + emission_scope: &EmissionScope, +) -> DispatchResult { + match &emission_scope.distribution { + DistributionControl::Manual => { + ensure!( + emission_scope.accumulating, + Error::::UnsupportedPermissionType + ); + + let accumulated = match &emission_scope.allocation { + EmissionAllocation::Streams(streams) => streams + .keys() + .filter_map(|id| { + AccumulatedStreamAmounts::::get((&contract.grantor, id, permission_id)) + }) + .fold(BalanceOf::::zero(), |acc, e| acc + e), // The Balance AST does not enforce the Sum trait + EmissionAllocation::FixedAmount(amount) => *amount, + }; + + ensure!(!accumulated.is_zero(), Error::::NoAccumulatedAmount); + + crate::permission::emission::do_distribute_emission::( + *permission_id, + contract, + DistributionReason::Manual, + ); + + Ok(()) + } + _ => Err(Error::::InvalidDistributionMethod.into()), + } +} + +/// Toggle a permission's accumulation state +pub fn toggle_permission_accumulation_impl( + origin: OriginFor, + permission_id: PermissionId, + accumulating: bool, +) -> DispatchResult { + let who = ensure_signed_or_root(origin)?; + + let mut contract = + Permissions::::get(permission_id).ok_or(Error::::PermissionNotFound)?; + + if let Some(who) = &who { + match &contract.enforcement { + _ if who == &contract.grantor => {} + EnforcementAuthority::None => { + return Err(Error::::NotAuthorizedToToggle.into()); + } + EnforcementAuthority::ControlledBy { + controllers, + required_votes, + } => { + ensure!(controllers.contains(who), Error::::NotAuthorizedToToggle); + + let referendum = EnforcementReferendum::EmissionAccumulation(accumulating); + let votes = EnforcementTracking::::get(permission_id, &referendum) + .into_iter() + .filter(|id| id != who) + .filter(|id| controllers.contains(id)) + .count(); + + if votes + 1 < *required_votes as usize { + return EnforcementTracking::::mutate( + permission_id, + referendum.clone(), + |votes| { + votes + .try_insert(who.clone()) + .map_err(|_| Error::::TooManyControllers)?; + + >::deposit_event(Event::EnforcementVoteCast { + permission_id, + voter: who.clone(), + referendum, + }); + + Ok(()) + }, + ); + } + } + } + } + + match &mut contract.scope { + PermissionScope::Emission(emission_scope) => emission_scope.accumulating = accumulating, + _ => return Err(Error::::UnsupportedPermissionType.into()), + } + + Permissions::::insert(permission_id, contract); + + // Clear any votes for this referendum + EnforcementTracking::::remove( + permission_id, + EnforcementReferendum::EmissionAccumulation(accumulating), + ); + + >::deposit_event(Event::PermissionAccumulationToggled { + permission_id, + accumulating, + toggled_by: who, + }); + + Ok(()) +} diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs index e83074cf..f9db532e 100644 --- a/pallets/permission0/src/lib.rs +++ b/pallets/permission0/src/lib.rs @@ -3,17 +3,20 @@ pub use pallet::*; -pub mod weights; use pallet_permission0_api::StreamId; + +pub mod benchmarking; +pub mod weights; pub use weights::*; pub mod ext; +pub mod migrations; pub mod permission; pub use permission::{ - generate_permission_id, DistributionControl, EmissionAllocation, EmissionScope, - EnforcementAuthority, EnforcementReferendum, PermissionContract, PermissionDuration, - PermissionId, PermissionScope, RevocationTerms, + generate_permission_id, CuratorPermissions, CuratorScope, DistributionControl, + EmissionAllocation, EmissionScope, EnforcementAuthority, EnforcementReferendum, + PermissionContract, PermissionDuration, PermissionId, PermissionScope, RevocationTerms, }; use polkadot_sdk::{ @@ -31,9 +34,11 @@ use polkadot_sdk::{ #[frame::pallet] pub mod pallet { + use polkadot_sdk::frame_support::PalletId; + use super::*; - const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); /// Configure the pallet by specifying the parameters and types on which it depends. #[pallet::config(with_default)] @@ -42,6 +47,11 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// Permission0 pallet ID + #[pallet::constant] + #[pallet::no_default_bounds] + type PalletId: Get; + type WeightInfo: WeightInfo; type Currency: ReservableCurrency; @@ -262,6 +272,12 @@ pub mod pallet { TooManyControllers, /// Invalid number of controllers or required votes InvalidNumberOfControllers, + /// Permission is a duplicate, revoke the previous one + DuplicatePermission, + /// Permission is in cooldown, wait a bit. + PermissionInCooldown, + /// Curator flags provided are invalid. + InvalidCuratorPermissions, } #[pallet::hooks] @@ -275,8 +291,8 @@ pub mod pallet { impl Pallet { /// Grant a permission for emission delegation #[pallet::call_index(0)] - #[pallet::weight(T::WeightInfo::grant_permission())] - pub fn grant_permission( + #[pallet::weight(T::WeightInfo::grant_emission_permission())] + pub fn grant_emission_permission( origin: OriginFor, grantee: T::AccountId, allocation: EmissionAllocation, @@ -288,7 +304,7 @@ pub mod pallet { ) -> DispatchResult { let grantor = ensure_signed(origin)?; - ext::grant_permission_impl::( + ext::emission_impl::grant_emission_permission_impl::( grantor, grantee, allocation, @@ -326,19 +342,23 @@ pub mod pallet { /// Toggle a permission's accumulation state (enabled/disabled) /// The caller must be authorized as a controller or be the root key #[pallet::call_index(3)] - #[pallet::weight(T::WeightInfo::execute_permission())] // Reuse weight for now + #[pallet::weight(T::WeightInfo::toggle_permission_accumulation())] pub fn toggle_permission_accumulation( origin: OriginFor, permission_id: PermissionId, accumulating: bool, ) -> DispatchResult { - ext::toggle_permission_accumulation_impl::(origin, permission_id, accumulating) + ext::emission_impl::toggle_permission_accumulation_impl::( + origin, + permission_id, + accumulating, + ) } /// Execute a permission through enforcement authority /// The caller must be authorized as a controller or be the root key #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::execute_permission())] // Reuse weight for now + #[pallet::weight(T::WeightInfo::enforcement_execute_permission())] pub fn enforcement_execute_permission( origin: OriginFor, permission_id: PermissionId, @@ -349,7 +369,7 @@ pub mod pallet { /// Set enforcement authority for a permission /// Only the grantor or root can set enforcement authority #[pallet::call_index(5)] - #[pallet::weight(T::WeightInfo::execute_permission())] // Reuse weight for now + #[pallet::weight(T::WeightInfo::set_enforcement_authority())] pub fn set_enforcement_authority( origin: OriginFor, permission_id: PermissionId, @@ -401,6 +421,29 @@ pub mod pallet { Ok(()) } + + /// Grant a permission for curator delegation + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::grant_curator_permission())] + pub fn grant_curator_permission( + origin: OriginFor, + grantee: T::AccountId, + flags: u32, + cooldown: Option>, + duration: PermissionDuration, + revocation: RevocationTerms, + ) -> DispatchResult { + ext::curator_impl::grant_curator_permission_impl::( + origin, + grantee, + CuratorPermissions::from_bits_truncate(flags), + cooldown, + duration, + revocation, + )?; + + Ok(()) + } } } diff --git a/pallets/permission0/src/migrations.rs b/pallets/permission0/src/migrations.rs new file mode 100644 index 00000000..78a412e0 --- /dev/null +++ b/pallets/permission0/src/migrations.rs @@ -0,0 +1,17 @@ +pub mod v2 { + use polkadot_sdk::{ + frame_support::{migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade}, + sp_weights::Weight, + }; + + use crate::{Config, Pallet}; + + pub type Migration = VersionedMigration<1, 2, MigrateToV2, Pallet, W>; + pub struct MigrateToV2(core::marker::PhantomData); + + impl UncheckedOnRuntimeUpgrade for MigrateToV2 { + fn on_runtime_upgrade() -> Weight { + Weight::zero() + } + } +} diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index 85daaf6d..6430ae60 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -19,8 +19,10 @@ use crate::{ BalanceOf, Config, EnforcementTracking, Error, Event, Pallet, Permissions, RevocationTracking, }; +pub use curator::{CuratorPermissions, CuratorScope}; pub use emission::{DistributionControl, EmissionAllocation, EmissionScope}; +pub mod curator; pub mod emission; /// Type for permission ID @@ -141,6 +143,9 @@ impl PermissionContract { PermissionScope::Emission(emission) => { emission.cleanup(permission_id, &self.last_execution, &self.grantor) } + PermissionScope::Curator(curator) => { + curator.cleanup(permission_id, &self.last_execution, &self.grantor) + } } } } @@ -150,6 +155,7 @@ impl PermissionContract { #[scale_info(skip_type_params(T))] pub enum PermissionScope { Emission(EmissionScope), + Curator(CuratorScope), } #[derive( @@ -238,7 +244,6 @@ pub(crate) fn do_auto_permission_execution(current_block: BlockNumber &contract, ); } - #[allow(unreachable_patterns)] _ => (), } diff --git a/pallets/permission0/src/permission/curator.rs b/pallets/permission0/src/permission/curator.rs new file mode 100644 index 00000000..0f26413e --- /dev/null +++ b/pallets/permission0/src/permission/curator.rs @@ -0,0 +1,76 @@ +use bitflags::bitflags; +use codec::{Decode, Encode, MaxEncodedLen}; +use polkadot_sdk::{ + frame_support::{CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound}, + polkadot_sdk_frame::prelude::BlockNumberFor, +}; +use scale_info::TypeInfo; + +use crate::Config; + +#[derive( + CloneNoBound, + Copy, + DebugNoBound, + Encode, + Decode, + EqNoBound, + PartialEqNoBound, + TypeInfo, + MaxEncodedLen, +)] +pub struct CuratorPermissions(u32); + +bitflags! { + impl CuratorPermissions: u32 { + /// Able to appoint other curators. Though not used at the moment, + /// it will be valuable when we remove the SUDO key/multisig. + const ROOT = 0b0000_0001; + /// Permission to review and process agent applications + const APPLICATION_REVIEW = 0b0000_0010; + /// Permission to manage the whitelist (add/remove accounts) + const WHITELIST_MANAGE = 0b0000_0100; + /// Permission to apply penalty factors to agents + const PENALTY_CONTROL = 0b0000_1000; + } +} + +#[derive(Encode, Decode, CloneNoBound, PartialEq, TypeInfo, MaxEncodedLen, DebugNoBound)] +#[scale_info(skip_type_params(T))] +pub struct CuratorScope { + pub flags: CuratorPermissions, + pub cooldown: Option>, +} + +impl CuratorScope { + pub fn has_permission(&self, permission: CuratorPermissions) -> bool { + self.flags.contains(permission) + } + + /// Checks for [`CuratorPermissions::APPLICATION_REVIEW`] + pub fn can_review_applications(&self) -> bool { + self.has_permission(CuratorPermissions::APPLICATION_REVIEW) + } + + /// Checks for [`CuratorPermissions::WHITELIST_MANAGE`] + pub fn can_manage_whitelist(&self) -> bool { + self.has_permission(CuratorPermissions::WHITELIST_MANAGE) + } + + /// Checks for [`CuratorPermissions::PENALTY_CONTROL`] + pub fn can_control_penalties(&self) -> bool { + self.has_permission(CuratorPermissions::PENALTY_CONTROL) + } +} + +impl CuratorScope { + /// Cleanup operations when permission is revoked or expired + pub(crate) fn cleanup( + &self, + _permission_id: polkadot_sdk::sp_core::H256, + _last_execution: &Option>, + _grantor: &T::AccountId, + ) { + // No special cleanup needed for curator permissions + } +} diff --git a/pallets/permission0/src/weights.rs b/pallets/permission0/src/weights.rs index c94810ef..58ce0048 100644 --- a/pallets/permission0/src/weights.rs +++ b/pallets/permission0/src/weights.rs @@ -1,32 +1,287 @@ -#![cfg_attr(not(feature = "std"), no_std)] -use polkadot_sdk::frame_support::weights::{constants::RocksDbWeight as DbWeight, Weight}; +//! Autogenerated weights for `pallet_permission0` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 +//! DATE: 2025-05-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `NicosiPoneXSMax.localdomain`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` -/// Weight functions for pallet_permission0 +// Executed Command: +// ./target/release/torus-node +// benchmark +// pallet +// --pallet +// pallet_permission0 +// --chain +// dev +// --extrinsic +// * +// --steps +// 50 +// --repeat +// 20 +// --output +// pallets/permission0/src/weights.rs +// --template=./.maintain/frame-weight-template.hbs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use polkadot_sdk::{ + frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}, + *, +}; +use core::marker::PhantomData; + +/// Weight functions needed for `pallet_permission0`. pub trait WeightInfo { - fn grant_permission() -> Weight; - fn revoke_permission() -> Weight; - fn execute_permission() -> Weight; + fn grant_emission_permission() -> Weight; + fn revoke_permission() -> Weight; + fn execute_permission() -> Weight; + fn toggle_permission_accumulation() -> Weight; + fn enforcement_execute_permission() -> Weight; + fn set_enforcement_authority() -> Weight; + fn grant_curator_permission() -> Weight; } -/// Weights for pallet_permission0 using the Substrate node and recommended hardware. -impl WeightInfo for () { - // Default weights - these should be calibrated properly in the future with benchmarking - fn grant_permission() -> Weight { - Weight::from_parts(100_000_000, 0) - .saturating_add(DbWeight::get().reads(5)) - .saturating_add(DbWeight::get().writes(5)) - } - - fn revoke_permission() -> Weight { - Weight::from_parts(75_000_000, 0) - .saturating_add(DbWeight::get().reads(4)) - .saturating_add(DbWeight::get().writes(4)) - } +/// Weights for `pallet_permission0` using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + /// Storage: `Torus0::Agents` (r:3 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Permission0::AccumulatedStreamAmounts` (r:1 w:1) + /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + fn grant_emission_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `279` + // Estimated: `10986` + // Minimum execution time: 32_000_000 picoseconds. + Weight::from_parts(33_000_000, 10986) + .saturating_add(T::DbWeight::get().reads(7_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::AccumulatedStreamAmounts` (r:0 w:1) + /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `Permission0::RevocationTracking` (r:0 w:1) + /// Proof: `Permission0::RevocationTracking` (`max_values`: None, `max_size`: Some(353), added: 2828, mode: `MaxEncodedLen`) + fn revoke_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `590` + // Estimated: `11000` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(30_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::AccumulatedStreamAmounts` (r:2 w:1) + /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn execute_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `546` + // Estimated: `11000` + // Minimum execution time: 40_000_000 picoseconds. + Weight::from_parts(41_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::EnforcementTracking` (r:0 w:1) + /// Proof: `Permission0::EnforcementTracking` (`max_values`: None, `max_size`: Some(355), added: 2830, mode: `MaxEncodedLen`) + fn toggle_permission_accumulation() -> Weight { + // Proof Size summary in bytes: + // Measured: `356` + // Estimated: `11000` + // Minimum execution time: 14_000_000 picoseconds. + Weight::from_parts(14_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::EnforcementTracking` (r:1 w:1) + /// Proof: `Permission0::EnforcementTracking` (`max_values`: None, `max_size`: Some(355), added: 2830, mode: `MaxEncodedLen`) + /// Storage: `Permission0::AccumulatedStreamAmounts` (r:2 w:1) + /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn enforcement_execute_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `583` + // Estimated: `11000` + // Minimum execution time: 46_000_000 picoseconds. + Weight::from_parts(47_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + fn set_enforcement_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `356` + // Estimated: `11000` + // Minimum execution time: 13_000_000 picoseconds. + Weight::from_parts(14_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + fn grant_curator_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `6731` + // Minimum execution time: 15_000_000 picoseconds. + Weight::from_parts(16_000_000, 6731) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) + } +} - fn execute_permission() -> Weight { - Weight::from_parts(150_000_000, 0) - .saturating_add(DbWeight::get().reads(3)) - .saturating_add(DbWeight::get().writes(3)) - } +// For backwards compatibility and tests. +impl WeightInfo for () { + /// Storage: `Torus0::Agents` (r:3 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Permission0::AccumulatedStreamAmounts` (r:1 w:1) + /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + fn grant_emission_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `279` + // Estimated: `10986` + // Minimum execution time: 32_000_000 picoseconds. + Weight::from_parts(33_000_000, 10986) + .saturating_add(RocksDbWeight::get().reads(7_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::AccumulatedStreamAmounts` (r:0 w:1) + /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `Permission0::RevocationTracking` (r:0 w:1) + /// Proof: `Permission0::RevocationTracking` (`max_values`: None, `max_size`: Some(353), added: 2828, mode: `MaxEncodedLen`) + fn revoke_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `590` + // Estimated: `11000` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(30_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::AccumulatedStreamAmounts` (r:2 w:1) + /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn execute_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `546` + // Estimated: `11000` + // Minimum execution time: 40_000_000 picoseconds. + Weight::from_parts(41_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::EnforcementTracking` (r:0 w:1) + /// Proof: `Permission0::EnforcementTracking` (`max_values`: None, `max_size`: Some(355), added: 2830, mode: `MaxEncodedLen`) + fn toggle_permission_accumulation() -> Weight { + // Proof Size summary in bytes: + // Measured: `356` + // Estimated: `11000` + // Minimum execution time: 14_000_000 picoseconds. + Weight::from_parts(14_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::EnforcementTracking` (r:1 w:1) + /// Proof: `Permission0::EnforcementTracking` (`max_values`: None, `max_size`: Some(355), added: 2830, mode: `MaxEncodedLen`) + /// Storage: `Permission0::AccumulatedStreamAmounts` (r:2 w:1) + /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn enforcement_execute_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `583` + // Estimated: `11000` + // Minimum execution time: 46_000_000 picoseconds. + Weight::from_parts(47_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + fn set_enforcement_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `356` + // Estimated: `11000` + // Minimum execution time: 13_000_000 picoseconds. + Weight::from_parts(14_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:0 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + fn grant_curator_permission() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `6731` + // Minimum execution time: 15_000_000 picoseconds. + Weight::from_parts(16_000_000, 6731) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) + } } diff --git a/pallets/permission0/tests/curator.rs b/pallets/permission0/tests/curator.rs new file mode 100644 index 00000000..3b6fff2f --- /dev/null +++ b/pallets/permission0/tests/curator.rs @@ -0,0 +1,131 @@ +use pallet_permission0::{Error, Pallet, PermissionScope, Permissions}; +use pallet_permission0_api::{CuratorPermissions, Permission0CuratorApi}; +use polkadot_sdk::{ + frame_support::{assert_err, dispatch::DispatchResult}, + frame_system::RawOrigin, + polkadot_sdk_frame::prelude::OriginFor, + sp_runtime::traits::BadOrigin, +}; +use test_utils::*; + +fn ensure_curator(origin: OriginFor, flags: CuratorPermissions) -> DispatchResult { + Pallet::::ensure_curator_permission(origin, flags)?; + Ok(()) +} + +#[test] +fn grant_curator_permission_correctly() { + new_test_ext().execute_with(|| { + assert_err!(>::grant_curator_permission( + RawOrigin::Signed(0).into(), + 1, + CuratorPermissions::all(), + None, + Default::default(), + Default::default(), + ), BadOrigin); + + let existing_curator = 1; + grant_curator_permission(existing_curator, CuratorPermissions::all(), None); + + assert_err!(>::grant_curator_permission( + RawOrigin::Root.into(), + existing_curator, + CuratorPermissions::all(), + None, + Default::default(), + Default::default(), + ), Error::::DuplicatePermission); + + let key = 0; + + assert_err!(>::grant_curator_permission( + RawOrigin::Root.into(), + key, + CuratorPermissions::from_bits_retain(pallet_permission0::CuratorPermissions::ROOT.bits()), + None, + Default::default(), + Default::default(), + ), Error::::InvalidCuratorPermissions); + + let id = assert_ok!(>::grant_curator_permission( + RawOrigin::Root.into(), + key, + // ugly way to check that ROOT is being filtered out + CuratorPermissions::from_bits_retain(pallet_permission0::CuratorPermissions::all().bits()), + None, + Default::default(), + Default::default(), + )); + + let contract = Permissions::::get(id).unwrap(); + let PermissionScope::Curator(scope) = contract.scope else { unreachable!() }; + assert_eq!(scope.flags, pallet_permission0::CuratorPermissions::all() & !pallet_permission0::CuratorPermissions::ROOT); + }); +} + +#[test] +fn ensure_curator_handles_curator_permissions() { + new_test_ext().execute_with(|| { + assert_ok!(ensure_curator( + RawOrigin::Root.into(), + CuratorPermissions::all() + )); + + let key = 0; + assert_err!( + ensure_curator( + RawOrigin::Signed(key).into(), + CuratorPermissions::WHITELIST_MANAGE + ), + Error::::PermissionNotFound + ); + + grant_curator_permission(key, CuratorPermissions::WHITELIST_MANAGE, None); + assert_ok!(ensure_curator( + RawOrigin::Signed(key).into(), + CuratorPermissions::WHITELIST_MANAGE + )); + + for flags in [ + CuratorPermissions::APPLICATION_REVIEW, + CuratorPermissions::PENALTY_CONTROL, + ] { + assert_err!( + ensure_curator(RawOrigin::Signed(key).into(), flags), + Error::::PermissionNotFound + ); + } + }); +} + +#[test] +fn ensure_curator_handles_cooldown_correctly() { + new_test_ext().execute_with(|| { + let key = 0; + grant_curator_permission(key, CuratorPermissions::WHITELIST_MANAGE, Some(10)); + let permission_id = Pallet::::get_curator_permission(&key).unwrap(); + + assert_ok!(ensure_curator( + RawOrigin::Signed(key).into(), + CuratorPermissions::WHITELIST_MANAGE + )); + + Pallet::::execute_permission(RawOrigin::Root.into(), permission_id).unwrap(); + + assert_err!( + ensure_curator( + RawOrigin::Signed(key).into(), + CuratorPermissions::WHITELIST_MANAGE + ), + Error::::PermissionInCooldown + ); + + step_block(10); + + assert_ok!(ensure_curator( + RawOrigin::Signed(key).into(), + CuratorPermissions::WHITELIST_MANAGE + )); + }); +} diff --git a/pallets/permission0/tests/enforcement.rs b/pallets/permission0/tests/enforcement.rs index c492ddb3..7f6f94a2 100644 --- a/pallets/permission0/tests/enforcement.rs +++ b/pallets/permission0/tests/enforcement.rs @@ -2,10 +2,10 @@ use std::collections::BTreeMap; use pallet_permission0::permission::emission::StreamId; use pallet_permission0::EnforcementReferendum; -use pallet_permission0_api::{generate_root_stream_id, Permission0Api}; +use pallet_permission0_api::{generate_root_stream_id, Permission0EmissionApi}; use polkadot_sdk::frame_support::{assert_err, traits::Currency}; use polkadot_sdk::sp_runtime::Percent; -use test_utils::{assert_ok, *}; +use test_utils::*; fn stream_percentages(agent: AccountId, percentage: u8) -> BTreeMap { BTreeMap::from([( @@ -34,7 +34,7 @@ fn set_enforcement_authority_by_grantor() { add_balance(grantor, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -104,7 +104,7 @@ fn toggle_accumulation_by_controller() { add_balance(grantor, to_nano(100) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), @@ -129,10 +129,8 @@ fn toggle_accumulation_by_controller() { ); let contract = pallet_permission0::Permissions::::get(permission_id).unwrap(); - match contract.scope { - pallet_permission0::PermissionScope::Emission(emission_scope) => { - assert!(!emission_scope.accumulating); - } + if let pallet_permission0::PermissionScope::Emission(emission_scope) = contract.scope { + assert!(!emission_scope.accumulating); } let balance_before = get_balance(grantee); @@ -175,7 +173,7 @@ fn unauthorized_account_cannot_toggle() { add_balance(grantor, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -222,7 +220,7 @@ fn enforcement_execute_permission() { add_balance(grantor, to_nano(100) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), @@ -267,7 +265,7 @@ fn unauthorized_cannot_enforcement_execute() { add_balance(grantor, to_nano(100) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), @@ -311,7 +309,7 @@ fn multi_controller_voting() { add_balance(grantor, to_nano(100) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), @@ -336,10 +334,8 @@ fn multi_controller_voting() { ); let contract = pallet_permission0::Permissions::::get(permission_id).unwrap(); - match contract.scope { - pallet_permission0::PermissionScope::Emission(emission_scope) => { - assert!(emission_scope.accumulating); - } + if let pallet_permission0::PermissionScope::Emission(emission_scope) = contract.scope { + assert!(emission_scope.accumulating); } assert_ok!( @@ -351,10 +347,8 @@ fn multi_controller_voting() { ); let contract = pallet_permission0::Permissions::::get(permission_id).unwrap(); - match contract.scope { - pallet_permission0::PermissionScope::Emission(emission_scope) => { - assert!(!emission_scope.accumulating); - } + if let pallet_permission0::PermissionScope::Emission(emission_scope) = contract.scope { + assert!(!emission_scope.accumulating); } distribute_emission(grantor, to_nano(10)); @@ -425,7 +419,7 @@ fn enforcement_cannot_execute_non_manual_distribution() { add_balance(grantor, to_nano(100) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, pallet_permission0_api::EmissionAllocation::Streams(stream_percentages(grantor, 100)), diff --git a/pallets/permission0/tests/fixed.rs b/pallets/permission0/tests/fixed.rs index a4ced319..dec03145 100644 --- a/pallets/permission0/tests/fixed.rs +++ b/pallets/permission0/tests/fixed.rs @@ -1,4 +1,3 @@ -use pallet_permission0_api::Permission0Api; use polkadot_sdk::frame_support::assert_err; use test_utils::*; @@ -13,7 +12,7 @@ fn fixed_fails_without_balance() { register_empty_agent(agent_1); assert_err!( - Permission0::grant_emission_permission( + grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -40,7 +39,7 @@ fn fixed_creates() { add_balance(agent_0, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -69,7 +68,7 @@ fn fixed_reserves() { add_balance(agent_0, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -103,7 +102,7 @@ fn fixed_manual_executes() { add_balance(agent_0, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -149,7 +148,7 @@ fn fixed_manual_executes_only_once() { add_balance(agent_0, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -199,7 +198,7 @@ fn fixed_at_block_executes() { add_balance(agent_0, to_nano(10) + 1); - let _ = assert_ok!(Permission0::grant_emission_permission( + let _ = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), diff --git a/pallets/permission0/tests/lifetime.rs b/pallets/permission0/tests/lifetime.rs index 0d04c10a..05955413 100644 --- a/pallets/permission0/tests/lifetime.rs +++ b/pallets/permission0/tests/lifetime.rs @@ -1,5 +1,4 @@ use pallet_permission0::Error; -use pallet_permission0_api::Permission0Api; use polkadot_sdk::frame_support::assert_err; use test_utils::*; @@ -18,7 +17,7 @@ fn manual_cant_execute_when_expires() { add_balance(agent_0, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -53,7 +52,7 @@ fn irrevocable() { add_balance(agent_0, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -97,7 +96,7 @@ fn revocable_by_grantor() { add_balance(agent_0, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -135,7 +134,7 @@ fn revocable_after_block() { add_balance(agent_0, to_nano(10) + 1); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -173,7 +172,7 @@ fn revocable_by_arbiters() { add_balance(agent_0, to_nano(10) + 1); let grant_invalid = |accounts: &[AccountId], required_votes| { - Permission0::grant_emission_permission( + grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), @@ -204,7 +203,7 @@ fn revocable_by_arbiters() { let arbiters = [2, 3, 4, 5]; let not_arbiter = 6; - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), diff --git a/pallets/permission0/tests/stream.rs b/pallets/permission0/tests/stream.rs index 86c0e68b..ce3802ed 100644 --- a/pallets/permission0/tests/stream.rs +++ b/pallets/permission0/tests/stream.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; use pallet_emission0::distribute::get_total_emission_per_block; use pallet_permission0::AccumulatedStreamAmounts; -use pallet_permission0_api::{generate_root_stream_id, Permission0Api}; +use pallet_permission0_api::generate_root_stream_id; use polkadot_sdk::{ frame_support::assert_err, sp_runtime::{BoundedVec, Percent}, @@ -33,7 +33,7 @@ fn stream_fails_if_overflow() { let mut streams = BTreeMap::new(); streams.insert(stream_id, Percent::from_percent(98)); - assert_ok!(Permission0::grant_emission_permission( + assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::Streams(streams), @@ -50,7 +50,7 @@ fn stream_fails_if_overflow() { streams.insert(stream_id, Percent::from_percent(3)); assert_err!( - Permission0::grant_emission_permission( + grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::Streams(streams), @@ -82,7 +82,7 @@ fn stream_creates() { let mut streams = BTreeMap::new(); streams.insert(stream_id, Percent::from_percent(100)); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::Streams(streams), @@ -129,7 +129,7 @@ fn stream_manual_executes() { let mut streams = BTreeMap::new(); streams.insert(stream_id, Percent::from_percent(100)); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, pallet_permission0_api::EmissionAllocation::Streams(streams), @@ -186,7 +186,7 @@ fn stream_accumulates_and_executes_at_threshold() { let mut streams = BTreeMap::new(); streams.insert(stream_id, Percent::from_percent(100)); - let permission_id = assert_ok!(Permission0::grant_emission_permission( + let permission_id = assert_ok!(grant_emission_permission( miner, val, pallet_permission0_api::EmissionAllocation::Streams(streams), diff --git a/pallets/torus0/api/src/lib.rs b/pallets/torus0/api/src/lib.rs index 21359bd8..a721ab36 100644 --- a/pallets/torus0/api/src/lib.rs +++ b/pallets/torus0/api/src/lib.rs @@ -33,4 +33,12 @@ pub trait Torus0Api { url: alloc::vec::Vec, metadata: alloc::vec::Vec, ) -> polkadot_sdk::frame_support::dispatch::DispatchResult; + + #[doc(hidden)] + #[cfg(feature = "runtime-benchmarks")] + fn force_set_stake( + staker: &AccountId, + staked: &AccountId, + amount: Balance, + ) -> polkadot_sdk::frame_support::dispatch::DispatchResult; } diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index 8432d6d2..374d9714 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -137,9 +137,7 @@ pub fn register( ); } } else { - polkadot_sdk::sp_tracing::error!( - "no allocators available to delegate to for {agent_key:?}" - ); + polkadot_sdk::sp_tracing::warn!("no allocators available to delegate to for {agent_key:?}"); } Ok(()) diff --git a/pallets/torus0/src/benchmarking.rs b/pallets/torus0/src/benchmarking.rs new file mode 100644 index 00000000..e2e51d00 --- /dev/null +++ b/pallets/torus0/src/benchmarking.rs @@ -0,0 +1,136 @@ +#![cfg(feature = "runtime-benchmarks")] + +use pallet_governance_api::GovernanceApi; +use pallet_torus0_api::Torus0Api; +use polkadot_sdk::{ + frame_benchmarking::{account, v2::*}, + frame_system::RawOrigin, + sp_runtime::Percent, + sp_std::vec, +}; + +use crate::*; + +fn register_test_agent( + id: &T::AccountId, + name: Vec, + url: Vec, + metadata: Vec, +) { + Pallet::::force_register_agent(id, name, url, metadata).expect("failed to register agent"); +} + +#[benchmarks] +mod benchmarks { + + use super::*; + + #[benchmark] + fn add_stake() { + let agent: T::AccountId = account("Agent", 0, 1); + let staker: T::AccountId = account("Staker", 1, 1); + let amount = MinAllowedStake::::get(); + + register_test_agent::(&agent, vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3]); + + let _ = ::deposit_creating(&staker, amount * 2); + + #[extrinsic_call] + add_stake(RawOrigin::Signed(staker), agent, amount) + } + + #[benchmark] + fn remove_stake() { + let agent: T::AccountId = account("Agent", 0, 1); + let staker: T::AccountId = account("Staker", 1, 1); + + register_test_agent::(&agent, vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3]); + + let amount = MinAllowedStake::::get(); + let _ = ::deposit_creating(&staker, amount * 2); + Pallet::::force_set_stake(&staker, &agent, amount).expect("failed to add stake"); + + #[extrinsic_call] + remove_stake(RawOrigin::Signed(staker), agent, amount) + } + + #[benchmark] + fn transfer_stake() { + let agent_a: T::AccountId = account("AgentA", 0, 1); + let agent_b: T::AccountId = account("AgentB", 1, 1); + let staker: T::AccountId = account("Staker", 2, 1); + + register_test_agent::(&agent_a, vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3]); + register_test_agent::(&agent_b, vec![4, 5, 6], vec![4, 5, 6], vec![4, 5, 6]); + + let amount = MinAllowedStake::::get(); + let _ = ::deposit_creating(&staker, amount * 2); + Pallet::::force_set_stake(&staker, &agent_a, amount).expect("failed to add stake"); + + #[extrinsic_call] + transfer_stake(RawOrigin::Signed(staker), agent_a, agent_b, amount) + } + + #[benchmark] + fn register_agent() { + let agent: T::AccountId = account("Agent", 0, 1); + ::force_set_whitelisted(&agent); + + let burn = crate::Burn::::get(); + let _ = ::deposit_creating(&agent, burn * 2); + + let name = vec![1, 2, 3]; + let url = vec![1, 2, 3]; + let metadata = vec![1, 2, 3]; + + #[extrinsic_call] + register_agent( + RawOrigin::Signed(agent.clone()), + agent.clone(), + name, + url, + metadata, + ) + } + + #[benchmark] + fn unregister_agent() { + let agent: T::AccountId = account("Agent", 0, 1); + register_test_agent::(&agent, vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3]); + + #[extrinsic_call] + unregister_agent(RawOrigin::Signed(agent)) + } + + #[benchmark] + fn update_agent() { + let agent: T::AccountId = account("Agent", 0, 1); + register_test_agent::(&agent, vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3]); + + AgentUpdateCooldown::::set(Default::default()); + + let name = vec![4, 5, 6]; + let url = vec![4, 5, 6]; + let metadata = Some(vec![4, 5, 6]); + let staking_fee = Some(Percent::from_percent(10)); + let weight_control_fee = Some(Percent::from_percent(10)); + + #[extrinsic_call] + update_agent( + RawOrigin::Signed(agent), + name, + url, + metadata, + staking_fee, + weight_control_fee, + ) + } + + #[benchmark] + fn set_agent_update_cooldown() { + let new_cooldown = 100u32.into(); + + #[extrinsic_call] + set_agent_update_cooldown(RawOrigin::Root, new_cooldown) + } +} diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index 419179e4..7eb2ff16 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -7,6 +7,9 @@ pub mod fee; pub mod migrations; pub mod stake; +pub mod benchmarking; +pub mod weights; + pub(crate) use ext::*; use frame::{ arithmetic::Percent, @@ -34,6 +37,7 @@ pub mod pallet { use frame::prelude::BlockNumberFor; use pallet_emission0_api::Emission0Api; use pallet_governance_api::GovernanceApi; + use weights::WeightInfo; use super::*; @@ -250,6 +254,8 @@ pub mod pallet { type Governance: GovernanceApi; type Emission: Emission0Api; + + type WeightInfo: WeightInfo; } #[pallet::pallet] @@ -260,7 +266,7 @@ pub mod pallet { impl Pallet { /// Adds stakes from origin to the agent key. #[pallet::call_index(0)] - #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] + #[pallet::weight((T::WeightInfo::add_stake(), DispatchClass::Normal, Pays::Yes))] pub fn add_stake( origin: OriginFor, agent_key: AccountIdOf, @@ -276,7 +282,7 @@ pub mod pallet { /// Removes stakes from origin to the agent key. #[pallet::call_index(1)] - #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] + #[pallet::weight((T::WeightInfo::remove_stake(), DispatchClass::Normal, Pays::Yes))] pub fn remove_stake( origin: OriginFor, agent_key: AccountIdOf, @@ -288,7 +294,7 @@ pub mod pallet { /// Transfers origin's stakes from an agent to another. #[pallet::call_index(2)] - #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] + #[pallet::weight((T::WeightInfo::transfer_stake(), DispatchClass::Normal, Pays::Yes))] pub fn transfer_stake( origin: OriginFor, agent_key: AccountIdOf, @@ -301,7 +307,7 @@ pub mod pallet { /// Registers a new agent on behalf of an arbitrary key. #[pallet::call_index(3)] - #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] + #[pallet::weight((T::WeightInfo::register_agent(), DispatchClass::Normal, Pays::Yes))] pub fn register_agent( origin: OriginFor, agent_key: T::AccountId, @@ -315,7 +321,7 @@ pub mod pallet { /// Unregister origin's key agent. #[pallet::call_index(4)] - #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] + #[pallet::weight((T::WeightInfo::unregister_agent(), DispatchClass::Normal, Pays::Yes))] pub fn unregister_agent(origin: OriginFor) -> DispatchResult { let agent_key = ensure_signed(origin)?; agent::unregister::(agent_key) @@ -323,7 +329,7 @@ pub mod pallet { /// Updates origin's key agent metadata. #[pallet::call_index(5)] - #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] + #[pallet::weight((T::WeightInfo::update_agent(), DispatchClass::Normal, Pays::Yes))] pub fn update_agent( origin: OriginFor, name: Vec, @@ -345,7 +351,7 @@ pub mod pallet { /// Updates origin's key agent metadata. #[pallet::call_index(6)] - #[pallet::weight((Weight::zero(), DispatchClass::Normal, Pays::Yes))] + #[pallet::weight((T::WeightInfo::set_agent_update_cooldown(), DispatchClass::Normal, Pays::Yes))] pub fn set_agent_update_cooldown( origin: OriginFor, new_cooldown: BlockNumberFor, @@ -553,4 +559,13 @@ impl Ok(()) } + + #[cfg(feature = "runtime-benchmarks")] + fn force_set_stake( + staker: &T::AccountId, + staked: &T::AccountId, + amount: BalanceOf, + ) -> DispatchResult { + stake::add_stake::(staker.clone(), staked.clone(), amount) + } } diff --git a/pallets/torus0/src/weights.rs b/pallets/torus0/src/weights.rs new file mode 100644 index 00000000..6f74b80d --- /dev/null +++ b/pallets/torus0/src/weights.rs @@ -0,0 +1,345 @@ + +//! Autogenerated weights for `pallet_torus0` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 +//! DATE: 2025-05-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `NicosiPoneXSMax.localdomain`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` + +// Executed Command: +// ./target/release/torus-node +// benchmark +// pallet +// --pallet +// pallet_torus0 +// --chain +// dev +// --extrinsic +// * +// --steps +// 50 +// --repeat +// 20 +// --output +// pallets/torus0/src/weights.rs +// --template=./.maintain/frame-weight-template.hbs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use polkadot_sdk::{ + frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}, + *, +}; +use core::marker::PhantomData; + +/// Weight functions needed for `pallet_torus0`. +pub trait WeightInfo { + fn add_stake() -> Weight; + fn remove_stake() -> Weight; + fn transfer_stake() -> Weight; + fn register_agent() -> Weight; + fn unregister_agent() -> Weight; + fn update_agent() -> Weight; + fn set_agent_update_cooldown() -> Weight; +} + +/// Weights for `pallet_torus0` using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + /// Storage: `Torus0::MinAllowedStake` (r:1 w:0) + /// Proof: `Torus0::MinAllowedStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Agents` (r:1 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakedBy` (r:1 w:1) + /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakingTo` (r:1 w:1) + /// Proof: `Torus0::StakingTo` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::TotalStake` (r:1 w:1) + /// Proof: `Torus0::TotalStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + fn add_stake() -> Weight { + // Proof Size summary in bytes: + // Measured: `268` + // Estimated: `4322` + // Minimum execution time: 29_000_000 picoseconds. + Weight::from_parts(30_000_000, 4322) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) + } + /// Storage: `Torus0::MinAllowedStake` (r:1 w:0) + /// Proof: `Torus0::MinAllowedStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Agents` (r:1 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakingTo` (r:1 w:1) + /// Proof: `Torus0::StakingTo` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakedBy` (r:1 w:1) + /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::TotalStake` (r:1 w:1) + /// Proof: `Torus0::TotalStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn remove_stake() -> Weight { + // Proof Size summary in bytes: + // Measured: `514` + // Estimated: `4322` + // Minimum execution time: 34_000_000 picoseconds. + Weight::from_parts(35_000_000, 4322) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) + } + /// Storage: `Torus0::MinAllowedStake` (r:1 w:0) + /// Proof: `Torus0::MinAllowedStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Agents` (r:2 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakingTo` (r:2 w:2) + /// Proof: `Torus0::StakingTo` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakedBy` (r:2 w:2) + /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::TotalStake` (r:1 w:1) + /// Proof: `Torus0::TotalStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn transfer_stake() -> Weight { + // Proof Size summary in bytes: + // Measured: `554` + // Estimated: `7654` + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(56_000_000, 7654) + .saturating_add(T::DbWeight::get().reads(9_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } + /// Storage: `Governance::Whitelist` (r:1 w:0) + /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Agents` (r:2 w:1) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::RegistrationsThisBlock` (r:1 w:1) + /// Proof: `Torus0::RegistrationsThisBlock` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxRegistrationsPerBlock` (r:1 w:0) + /// Proof: `Torus0::MaxRegistrationsPerBlock` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::BurnConfig` (r:1 w:0) + /// Proof: `Torus0::BurnConfig` (`max_values`: Some(1), `max_size`: Some(52), added: 547, mode: `MaxEncodedLen`) + /// Storage: `Torus0::RegistrationsThisInterval` (r:1 w:1) + /// Proof: `Torus0::RegistrationsThisInterval` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxAllowedAgents` (r:1 w:0) + /// Proof: `Torus0::MaxAllowedAgents` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MinNameLength` (r:1 w:0) + /// Proof: `Torus0::MinNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxNameLength` (r:1 w:0) + /// Proof: `Torus0::MaxNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxAgentUrlLength` (r:1 w:0) + /// Proof: `Torus0::MaxAgentUrlLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Burn` (r:1 w:0) + /// Proof: `Torus0::Burn` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `Torus0::FeeConstraints` (r:1 w:0) + /// Proof: `Torus0::FeeConstraints` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Governance::Allocators` (r:1 w:0) + /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + fn register_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `68` + // Estimated: `7654` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 7654) + .saturating_add(T::DbWeight::get().reads(15_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `Torus0::Agents` (r:1 w:1) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakingTo` (r:1 w:0) + /// Proof: `Torus0::StakingTo` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + fn unregister_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `94` + // Estimated: `4322` + // Minimum execution time: 11_000_000 picoseconds. + Weight::from_parts(13_000_000, 4322) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Torus0::Agents` (r:1 w:1) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::AgentUpdateCooldown` (r:1 w:0) + /// Proof: `Torus0::AgentUpdateCooldown` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MinNameLength` (r:1 w:0) + /// Proof: `Torus0::MinNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxNameLength` (r:1 w:0) + /// Proof: `Torus0::MaxNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxAgentUrlLength` (r:1 w:0) + /// Proof: `Torus0::MaxAgentUrlLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::FeeConstraints` (r:1 w:0) + /// Proof: `Torus0::FeeConstraints` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + fn update_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `155` + // Estimated: `4322` + // Minimum execution time: 18_000_000 picoseconds. + Weight::from_parts(19_000_000, 4322) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Torus0::AgentUpdateCooldown` (r:0 w:1) + /// Proof: `Torus0::AgentUpdateCooldown` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + fn set_agent_update_cooldown() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests. +impl WeightInfo for () { + /// Storage: `Torus0::MinAllowedStake` (r:1 w:0) + /// Proof: `Torus0::MinAllowedStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Agents` (r:1 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakedBy` (r:1 w:1) + /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakingTo` (r:1 w:1) + /// Proof: `Torus0::StakingTo` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::TotalStake` (r:1 w:1) + /// Proof: `Torus0::TotalStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + fn add_stake() -> Weight { + // Proof Size summary in bytes: + // Measured: `268` + // Estimated: `4322` + // Minimum execution time: 29_000_000 picoseconds. + Weight::from_parts(30_000_000, 4322) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) + } + /// Storage: `Torus0::MinAllowedStake` (r:1 w:0) + /// Proof: `Torus0::MinAllowedStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Agents` (r:1 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakingTo` (r:1 w:1) + /// Proof: `Torus0::StakingTo` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakedBy` (r:1 w:1) + /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::TotalStake` (r:1 w:1) + /// Proof: `Torus0::TotalStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn remove_stake() -> Weight { + // Proof Size summary in bytes: + // Measured: `514` + // Estimated: `4322` + // Minimum execution time: 34_000_000 picoseconds. + Weight::from_parts(35_000_000, 4322) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) + } + /// Storage: `Torus0::MinAllowedStake` (r:1 w:0) + /// Proof: `Torus0::MinAllowedStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Agents` (r:2 w:0) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakingTo` (r:2 w:2) + /// Proof: `Torus0::StakingTo` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakedBy` (r:2 w:2) + /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `Torus0::TotalStake` (r:1 w:1) + /// Proof: `Torus0::TotalStake` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn transfer_stake() -> Weight { + // Proof Size summary in bytes: + // Measured: `554` + // Estimated: `7654` + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(56_000_000, 7654) + .saturating_add(RocksDbWeight::get().reads(9_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } + /// Storage: `Governance::Whitelist` (r:1 w:0) + /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Agents` (r:2 w:1) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::RegistrationsThisBlock` (r:1 w:1) + /// Proof: `Torus0::RegistrationsThisBlock` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxRegistrationsPerBlock` (r:1 w:0) + /// Proof: `Torus0::MaxRegistrationsPerBlock` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::BurnConfig` (r:1 w:0) + /// Proof: `Torus0::BurnConfig` (`max_values`: Some(1), `max_size`: Some(52), added: 547, mode: `MaxEncodedLen`) + /// Storage: `Torus0::RegistrationsThisInterval` (r:1 w:1) + /// Proof: `Torus0::RegistrationsThisInterval` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxAllowedAgents` (r:1 w:0) + /// Proof: `Torus0::MaxAllowedAgents` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MinNameLength` (r:1 w:0) + /// Proof: `Torus0::MinNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxNameLength` (r:1 w:0) + /// Proof: `Torus0::MaxNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxAgentUrlLength` (r:1 w:0) + /// Proof: `Torus0::MaxAgentUrlLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::Burn` (r:1 w:0) + /// Proof: `Torus0::Burn` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Governance::DaoTreasuryAddress` (r:1 w:0) + /// Proof: `Governance::DaoTreasuryAddress` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `Torus0::FeeConstraints` (r:1 w:0) + /// Proof: `Torus0::FeeConstraints` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Governance::Allocators` (r:1 w:0) + /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) + fn register_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `68` + // Estimated: `7654` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 7654) + .saturating_add(RocksDbWeight::get().reads(15_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `Torus0::Agents` (r:1 w:1) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::StakingTo` (r:1 w:0) + /// Proof: `Torus0::StakingTo` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + fn unregister_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `94` + // Estimated: `4322` + // Minimum execution time: 11_000_000 picoseconds. + Weight::from_parts(13_000_000, 4322) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Torus0::Agents` (r:1 w:1) + /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Torus0::AgentUpdateCooldown` (r:1 w:0) + /// Proof: `Torus0::AgentUpdateCooldown` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MinNameLength` (r:1 w:0) + /// Proof: `Torus0::MinNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxNameLength` (r:1 w:0) + /// Proof: `Torus0::MaxNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::MaxAgentUrlLength` (r:1 w:0) + /// Proof: `Torus0::MaxAgentUrlLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `Torus0::FeeConstraints` (r:1 w:0) + /// Proof: `Torus0::FeeConstraints` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + fn update_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `155` + // Estimated: `4322` + // Minimum execution time: 18_000_000 picoseconds. + Weight::from_parts(19_000_000, 4322) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Torus0::AgentUpdateCooldown` (r:0 w:1) + /// Proof: `Torus0::AgentUpdateCooldown` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + fn set_agent_update_cooldown() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/runtime/src/benchmarks.rs b/runtime/src/benchmarks.rs index bc641470..a5cdc4ed 100644 --- a/runtime/src/benchmarks.rs +++ b/runtime/src/benchmarks.rs @@ -1,3 +1,5 @@ +#![cfg(feature = "runtime-benchmarks")] + polkadot_sdk::frame_benchmarking::define_benchmarks!( [frame_benchmarking, BaselineBench::] [frame_system, SystemBench::] @@ -6,4 +8,6 @@ polkadot_sdk::frame_benchmarking::define_benchmarks!( [pallet_sudo, Sudo] [pallet_emission0, Emission0] [pallet_governance, Governance] + [pallet_torus0, Torus0] + [pallet_permission0, Permission0] ); diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index dcd37634..bd5471ad 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -365,6 +365,8 @@ impl pallet_torus0::Config for Runtime { type Governance = Governance; type Emission = Emission0; + + type WeightInfo = pallet_torus0::weights::SubstrateWeight; } parameter_types! { @@ -404,11 +406,13 @@ impl pallet_governance::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; + type Permission0 = Permission0; type WeightInfo = pallet_governance::weights::SubstrateWeight; } parameter_types! { + // SAFETY: `NonZeroU128::new` only fails if the passed value is 0, which is not the case here. pub HalvingInterval: NonZeroU128 = NonZeroU128::new(as_tors(144_000_000)).unwrap(); pub MaxSupply: NonZeroU128 = NonZeroU128::new(as_tors(144_000_000)).unwrap(); pub const DefaultEmissionRecyclingPercentage: Percent = Percent::one(); @@ -440,6 +444,7 @@ impl pallet_emission0::Config for Runtime { } parameter_types! { + pub const PermissionPalletId: PalletId = PalletId(*b"torusper"); pub const MaxTargetsPerPermission: u32 = 100; pub const MaxStreamsPerPermission: u32 = 100; pub const MaxRevokersPerPermission: u32 = 10; @@ -456,6 +461,8 @@ impl pallet_permission0::Config for Runtime { type Torus = Torus0; + type PalletId = PermissionPalletId; + type MaxTargetsPerPermission = MaxTargetsPerPermission; type MaxStreamsPerPermission = MaxStreamsPerPermission; diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 399b6b53..7715942c 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -21,7 +21,6 @@ use sp_version::RuntimeVersion; use weights::constants::RocksDbWeight; pub mod apis; -#[cfg(feature = "runtime-benchmarks")] pub mod benchmarks; pub mod configs; pub mod precompiles; @@ -39,7 +38,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("torus-runtime"), impl_name: create_runtime_str!("torus-runtime"), authoring_version: 1, - spec_version: 12, + spec_version: 13, impl_version: 1, apis: apis::RUNTIME_API_VERSIONS, transaction_version: 1, @@ -86,6 +85,8 @@ pub type SignedPayload = sp_runtime::generic::SignedPayload, + pallet_governance::migrations::v4::Migration, + pallet_permission0::migrations::v2::Migration, pallet_emission0::migrations::v2::Migration, pallet_torus0::migrations::v3::Migration, ); diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 9db24920..a6734286 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -21,3 +21,4 @@ pallet-faucet.workspace = true pallet-torus0-api.workspace = true pallet-governance-api.workspace = true +pallet-permission0-api.workspace = true diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index e3cfe61f..3d132091 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -4,7 +4,10 @@ use std::{cell::RefCell, num::NonZeroU128}; pub use pallet_emission0; pub use pallet_governance; +pub use pallet_permission0; pub use pallet_torus0; + +use pallet_permission0_api::{CuratorPermissions, PermissionId}; use pallet_torus0::MinAllowedStake; use polkadot_sdk::{ frame_support::{ @@ -12,7 +15,8 @@ use polkadot_sdk::{ traits::{Currency, Everything, Hooks}, PalletId, }, - frame_system, pallet_balances, + frame_system::{self, RawOrigin}, + pallet_balances, polkadot_sdk_frame::runtime::prelude::*, sp_core::{Get, H256}, sp_io, @@ -147,6 +151,8 @@ impl pallet_torus0::Config for Test { type Governance = Governance; type Emission = Emission0; + + type WeightInfo = pallet_torus0::weights::SubstrateWeight; } parameter_types! { @@ -217,11 +223,13 @@ impl pallet_governance::Config for Test { type RuntimeEvent = RuntimeEvent; type Currency = Balances; + type Permission0 = Permission0; type WeightInfo = pallet_governance::weights::SubstrateWeight; } parameter_types! { + pub const PermissionPalletId: PalletId = PalletId(*b"torusper"); pub const MaxTargetsPerPermission: u32 = 100; pub const MaxStreamsPerPermission: u32 = 100; pub const MaxRevokersPerPermission: u32 = 10; @@ -238,6 +246,8 @@ impl pallet_permission0::Config for Test { type Torus = Torus0; + type PalletId = PermissionPalletId; + type MaxTargetsPerPermission = MaxTargetsPerPermission; type MaxStreamsPerPermission = MaxStreamsPerPermission; @@ -400,6 +410,61 @@ pub fn register_empty_agent(key: AccountId) { ); } +pub type NegativeImbalanceOf = as Currency< + ::AccountId, +>>::NegativeImbalance; + +#[allow(clippy::too_many_arguments)] +pub fn grant_emission_permission( + grantor: AccountId, + grantee: AccountId, + allocation: pallet_permission0_api::EmissionAllocation, + targets: Vec<(AccountId, u16)>, + distribution: pallet_permission0_api::DistributionControl, + duration: pallet_permission0_api::PermissionDuration, + revocation: pallet_permission0_api::RevocationTerms, + enforcement: pallet_permission0_api::EnforcementAuthority, +) -> Result { + use pallet_permission0_api::Permission0EmissionApi; + >::grant_emission_permission( + grantor, + grantee, + allocation, + targets, + distribution, + duration, + revocation, + enforcement, + ) +} + +pub fn grant_curator_permission( + key: AccountId, + flags: CuratorPermissions, + cooldown: Option, +) { + use pallet_permission0_api::Permission0CuratorApi; + as Permission0CuratorApi< + AccountId, + RuntimeOrigin, + BlockNumber, + >>::grant_curator_permission( + RawOrigin::Root.into(), + key, + flags, + cooldown, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + ) + .expect("failed to register curator"); +} + pub fn clear_cooldown() { pallet_torus0::AgentUpdateCooldown::::set(0); } diff --git a/xtask/src/generate_spec.rs b/xtask/src/generate_spec.rs index 5cb4d265..a4e57ada 100644 --- a/xtask/src/generate_spec.rs +++ b/xtask/src/generate_spec.rs @@ -71,7 +71,6 @@ pub fn targetchain_spec(flags: &flags::Replica) -> Option { aura(genesis); grandpa(genesis); sudo(genesis, flags.sudo.as_ref()); - // balance(genesis, flags.sudo.as_ref()); let js = serde_json::to_string_pretty(&js).unwrap(); From 491524fdc87cd33477be8c713d2f48c4e0508e32 Mon Sep 17 00:00:00 2001 From: Davi Petris <37764531+DaviPtrs@users.noreply.github.com> Date: Thu, 22 May 2025 12:07:33 -0300 Subject: [PATCH 22/46] Fix the code coverage bucket URL (#98) # Pull Request Checklist Before submitting this PR, please make sure: - [ ] You have run `cargo clippy` and addressed any warnings - [ ] You have added appropriate tests (if applicable) - [ ] You have updated the documentation (if applicable) - [ ] You have reviewed your own code - [ ] You have updated changelog (if applicable) ## Description Please provide a brief description of the changes in this PR. ## Related Issues Please link any related issues here --- .github/workflows/check.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 9bbcecc6..da0b67fe 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -104,8 +104,8 @@ jobs: id: htmlUpload continue-on-error: true run: | - aws --endpoint-url $ENDPOINT s3 sync ./target/llvm-cov/html s3://$BUCKET_NAME/$BRANCH - echo "link=$(aws --endpoint-url $ENDPOINT s3 presign s3://$BUCKET_NAME/$BRANCH/index.html)" >> $GITHUB_OUTPUT + aws --endpoint-url $ENDPOINT s3 sync ./target/llvm-cov/html s3://$BUCKET_NAME/$BRANCH --acl public-read + echo "link=https://$BUCKET_NAME.$REGION.$ENDPOINT_DOMAIN/$BRANCH/index.html" >> $GITHUB_OUTPUT env: BRANCH: ${{ steps.extractBranch.outputs.branch }} ENDPOINT: ${{ vars.COV_ENDPOINT_URL }} @@ -113,6 +113,8 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.COV_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.COV_AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: ${{ vars.COV_DEFAULT_REGION }} + REGION: nyc3 + ENDPOINT_DOMAIN: "digitaloceanspaces.com" - name: Add coverage PR report comment if: success() && steps.findPr.outputs.number From b421a44c19b37eaa57277fb94a00418864fe6567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Fri, 23 May 2025 07:51:21 -0300 Subject: [PATCH 23/46] chore: bump spec (#99) --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 7715942c..ee41b9b0 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -38,7 +38,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("torus-runtime"), impl_name: create_runtime_str!("torus-runtime"), authoring_version: 1, - spec_version: 13, + spec_version: 14, impl_version: 1, apis: apis::RUNTIME_API_VERSIONS, transaction_version: 1, From fc6cbdff9990aa0941deebba82ec628c2ea96e54 Mon Sep 17 00:00:00 2001 From: Kelvin Steiner Date: Sun, 25 May 2025 10:24:24 +0200 Subject: [PATCH 24/46] docs: improve documentation and add Claude Code guidance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add CLAUDE.md with repository guidance for Claude Code assistant - Standardize shell code blocks to use 'sh' instead of 'bash' - Add spell checker words to VS Code settings - Simplify README project description for clarity - Add temporary files pattern to .gitignore 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .gitignore | 3 +++ .vscode/settings.json | 3 +++ CLAUDE.md | 34 ++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 17 ++++++++++------- README.md | 17 ++++++++--------- docs/xtask-manual.md | 24 ++++++++++++------------ 6 files changed, 70 insertions(+), 28 deletions(-) create mode 100644 CLAUDE.md diff --git a/.gitignore b/.gitignore index 68bc1dfa..0f5bbdc1 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Local files +*.local.* + # Temporary files /tmp/ diff --git a/.vscode/settings.json b/.vscode/settings.json index 183f52dc..906ad355 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,10 +12,13 @@ "coverage-gutters.coverageFileNames": ["target/cov.xml"], // Spell checker "cSpell.words": [ + "alice", "buildx", "devcontainers", + "extrinsics", "irongut", "jwalton", + "mainnet", "presign", "Swatinem", "wbuild" diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..760142ac --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,34 @@ +# CLAUDE.md + +This file provides guidance to Claude Code when working with this Substrate blockchain repository. + +## References + +- @README.md - Project overview, quick start, network setup +- @CONTRIBUTING.md - Development setup (Nix), guidelines, testing +- @docs/pallet-structure.md - Architecture and API design +- @docs/xtask-manual.md - Development tooling guide + +## Core Pallets + +- **`torus0`**: Agent registration, staking, burn mechanisms +- **`emission0`**: Token distribution with linear emission algorithm +- **`governance`**: Proposals, voting, treasury, roles +- **`permission0`**: Permission and access control + +## Essential Commands + +```sh +nix develop # Enter development environment +just # Run checks and tests (default) +just check # Clippy linting only +just test # Test suite only +cargo xtask coverage # Test coverage report +``` + +## Critical Safety Rules + +- Never use `unwrap()`, `expect()`, or panicking operations in pallet code +- Use `checked_div()` instead of `/` for arithmetic operations +- Panics in runtime code will halt the chain +- Use `FixedU128` for financial calculations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2400ba35..17e3084f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,19 +18,22 @@ The project uses Nix flakes to manage dependencies and ensure a consistent devel 1. Install Nix package manager by following the instructions at [nixos.org](https://nixos.org/download.html) 2. Enable flakes by adding the following to your `~/.config/nix/nix.conf` or `/etc/nix/nix.conf`: - ``` + + ```conf experimental-features = nix-command flakes ``` + 3. Enter the development environment: - ```bash + ```sh nix develop ``` This will set up the correct Rust version, git, and precompiled binaries for dependencies like RocksDB and OpenSSL. 4. Build the project: - ```bash + + ```sh cargo build --release ``` @@ -92,7 +95,7 @@ For detailed guidance on creating migrations, refer to the [Substrate Storage Mi 1. Fork the repo and create a new branch for your feature or bugfix: - ```bash + ```sh git checkout -b feature/your-feature-name ``` @@ -100,7 +103,7 @@ For detailed guidance on creating migrations, refer to the [Substrate Storage Mi 3. Run tests and checks to ensure your changes don't break existing functionality: - ```bash + ```sh cargo fmt cargo clippy cargo test @@ -108,7 +111,7 @@ For detailed guidance on creating migrations, refer to the [Substrate Storage Mi 4. Check code coverage to ensure sufficient test coverage: - ```bash + ```sh cargo xtask coverage ``` @@ -125,7 +128,7 @@ Strong test coverage is a core value for our project. All pallets must maintain Run the following command to generate a `Cobertura` xml file on `target/cov.xml` that can be used with the [Coverage Gutters](https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters) VSCode plugin to display which functions and branches are not covered by tests yet. -```bash +```sh cargo xtask coverage ``` diff --git a/README.md b/README.md index 489f6720..7255474a 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,9 @@ ![Docker Build](https://github.com/renlabs-dev/torus-substrate/actions/workflows/build-docker.yml/badge.svg) -Torus is a self-assembling and evolving peer-to-peer blockchain organism, with a -stake-driven network built in Rust with the Substrate framework. Torus powers an -innovative ecosystem of agents and incentives, incorporating diverse -technologies into its collective body. +Torus is a self-assembling and evolving peer-to-peer organism with a +stake-driven ecosystem of agents and incentives. It's core coordination system +is a blockchain built on Substrate, implemented in this repository. ## Table of Contents @@ -74,7 +73,7 @@ The Torus node operates on two primary ports: We have tools to simulate a network locally as well. The `cargo xtask run` command allows you to run a local network from scratch by setting up nodes with fresh spec files: -```bash +```sh cargo xtask generate-spec gen-new --sudo -o myspec.json cargo xtask run local --chain myspec.json --alice --node-validator true & cargo xtask run local --chain myspec.json --bob --node-validator true & @@ -84,13 +83,13 @@ The `generate-spec` command has been expanded with subcommands that allow you to 1. Generate a new empty chain spec with custom parameters: -```bash +```sh cargo xtask generate-spec gen-new --name "My Custom Chain" --sudo -o myspec.json ``` 2. Generate a replica of the mainnet: -```bash +```sh cargo xtask generate-spec gen-replica --sudo -o myreplica.json ``` @@ -98,7 +97,7 @@ You can also pass an `--api-url` flag with a WS endpoint to clone the state from Both commands take additional parameters to configure Aura, Grandpa and balances. For example: -```bash +```sh cargo xtask generate-spec gen-new \ --name "My Chain" \ --sudo \ @@ -110,7 +109,7 @@ cargo xtask generate-spec gen-new \ You can then run nodes with the generated specs: -```bash +```sh cargo xtask run local --chain myspec.json --alice --node-validator true & cargo xtask run local --chain myspec.json --bob --node-validator true & ``` diff --git a/docs/xtask-manual.md b/docs/xtask-manual.md index ad20f194..98e7cf44 100644 --- a/docs/xtask-manual.md +++ b/docs/xtask-manual.md @@ -20,7 +20,7 @@ The `run` command launches Torus nodes with various configuration options. It of The local mode starts a node using either a provided chain spec file or the default development configuration: -```bash +```sh cargo xtask run local [OPTIONS] ``` @@ -38,7 +38,7 @@ The Alice and Bob accounts come with predefined keys and network configurations. The replica mode creates and runs a node that replicates the mainnet state: -```bash +```sh cargo xtask run replica [OPTIONS] ``` @@ -58,7 +58,7 @@ The `generate-spec` command creates chain specification files that define the in The `gen-new` subcommand creates a fresh chain specification with customizable parameters: -```bash +```sh cargo xtask generate-spec gen-new [OPTIONS] -o ``` @@ -73,7 +73,7 @@ Important options include: For example, to create a new chain with custom authorities and initial balances: -```bash +```sh cargo xtask generate-spec gen-new \ --name "My Test Network" \ --sudo 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY \ @@ -87,7 +87,7 @@ cargo xtask generate-spec gen-new \ The `gen-replica` subcommand creates a chain specification that replicates the current mainnet state: -```bash +```sh cargo xtask generate-spec gen-replica [OPTIONS] -o ``` @@ -100,7 +100,7 @@ This command fetches the entire state from a running node and creates a chain sp Example usage: -```bash +```sh cargo xtask generate-spec gen-replica \ --sudo 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY \ --api-url "wss://my-custom-node.torus.network" \ @@ -125,7 +125,7 @@ The typical workflow is to first generate a chain spec file with desired propert Here's an example of setting up a two-node local network: -```bash +```sh # Generate a chain spec cargo xtask generate-spec gen-new --sudo 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY -o local-spec.json @@ -142,7 +142,7 @@ The nodes will automatically connect to each other and start producing blocks si The `coverage` command generates code coverage reports for the Torus pallets: -```bash +```sh cargo xtask coverage [--html] ``` @@ -158,7 +158,7 @@ The xtask tools use several techniques to simplify working with Torus. It provid You can customize various node parameters to fit your specific needs: -```bash +```sh cargo xtask run local [OPTIONS] --chain-spec my-spec.json \ --node-name "Custom Node" \ --node-key \ @@ -168,13 +168,13 @@ cargo xtask run local [OPTIONS] --chain-spec my-spec.json \ For testing in isolation, you can prevent the node from connecting to other peers with the `--isolated` flag: -```bash +```sh cargo xtask run local --chain-spec my-spec.json --isolated ``` You can also specify custom bootnodes for your node to connect to: -```bash +```sh cargo xtask run local --chain-spec my-spec.json \ --bootnodes "/ip4/192.168.1.1/tcp/30333/p2p/" \ --bootnodes "/ip4/192.168.1.2/tcp/30333/p2p/" @@ -186,6 +186,6 @@ When working with xtask, you might encounter some common issues. If a node fails For debugging purposes, you can examine the temporary node directories to check logs and configuration files. The path is printed when the node starts. You can also run a node without using xtask to get more detailed logs: -```bash +```sh ./target/release/torus-node -d /tmp/node-data --chain my-spec.json --validator ``` From b73f239a1fa7903b1e244fa920c2e5a66d516a51 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Tue, 27 May 2025 10:06:30 -0300 Subject: [PATCH 25/46] fix(permission0): until block duration is inclusive --- pallets/permission0/src/permission.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index 6430ae60..69cf9512 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -68,7 +68,7 @@ pub struct PermissionContract { impl PermissionContract { pub fn is_expired(&self, current_block: BlockNumberFor) -> bool { match self.duration { - PermissionDuration::UntilBlock(block) => current_block >= block, + PermissionDuration::UntilBlock(block) => current_block > block, PermissionDuration::Indefinite => false, } } From 8e69b45583d05a4058226493888c3d3cce3e5dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Wed, 28 May 2025 06:41:52 -0300 Subject: [PATCH 26/46] feat: enable testnet features on localnode (#101) --- node/Cargo.toml | 1 + pallets/faucet/src/faucet.rs | 2 +- xtask/src/run.rs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/node/Cargo.toml b/node/Cargo.toml index 7f470270..91bc62ef 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -13,6 +13,7 @@ runtime-benchmarks = [ "torus-runtime/runtime-benchmarks", "polkadot-sdk/runtime-benchmarks", ] +testnet = ["torus-runtime/testnet"] [dependencies] diff --git a/pallets/faucet/src/faucet.rs b/pallets/faucet/src/faucet.rs index 5951f407..6f73a344 100644 --- a/pallets/faucet/src/faucet.rs +++ b/pallets/faucet/src/faucet.rs @@ -50,7 +50,7 @@ pub fn execute( >::inc_providers(&key); } - info!("do faucet with key: {key:?} and block number: {block_number} and nonce: {nonce}"); + info!("do faucet with key: {key:?} and block number: {block_number} and nonce: {nonce} and hash: {work:?}"); // Get the current block number for validation let current_block_number: u64 = frame_system::Pallet::::block_number() diff --git a/xtask/src/run.rs b/xtask/src/run.rs index 67f75cf3..979e5447 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -98,7 +98,7 @@ pub mod ops { macro_rules! torus_node { ($($arg:expr),*) => {{ let mut cmd = std::process::Command::new("cargo"); - cmd.args(["run", "--release", "--package", "torus-node", "--"]); + cmd.args(["run", "--release", "--features", "testnet", "--package", "torus-node", "--"]); $(cmd.arg($arg);)* cmd }}; From 1f22d1b76d91bd436aad8ae01c1f95912c3bd871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Wed, 28 May 2025 15:26:05 -0300 Subject: [PATCH 27/46] feat: increase faucet tokens (#102) --- pallets/faucet/src/faucet.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pallets/faucet/src/faucet.rs b/pallets/faucet/src/faucet.rs index 6f73a344..b3652237 100644 --- a/pallets/faucet/src/faucet.rs +++ b/pallets/faucet/src/faucet.rs @@ -20,6 +20,8 @@ use polkadot_sdk::{ sp_tracing::{info, trace}, }; +const FAUCET_AMOUNT: u128 = 50_000_000_000_000_000_000; + /// Main execution function for the faucet pallet /// /// This function processes a faucet request after it has passed the unsigned validation. @@ -82,8 +84,7 @@ pub fn execute( ensure!(seal == work_hash, Error::::InvalidSeal); // Award tokens to the account (15 tokens with 18 decimals) - let amount: u64 = 15_000_000_000_000_000_000; - let amount: BalanceOf = amount.try_into().map_err(|_| "Invalid amount")?; + let amount: BalanceOf = FAUCET_AMOUNT.try_into().map_err(|_| "Invalid amount")?; let _ = T::Currency::deposit_creating(&key, amount); // Log success and emit event From c6e17029acbd15e942a3942356a92dfa3d1a3c38 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Wed, 28 May 2025 20:26:25 +0200 Subject: [PATCH 28/46] fix: ban arithmetic side effects --- Cargo.lock | 3405 +++++++++-------- Cargo.toml | 14 +- flake.lock | 20 +- flake.nix | 32 +- node/Cargo.toml | 3 +- node/src/rpc.rs | 4 +- node/src/service.rs | 15 +- pallets/emission0/Cargo.toml | 3 + pallets/emission0/api/Cargo.toml | 3 + pallets/emission0/src/distribute.rs | 23 +- pallets/emission0/src/distribute/math.rs | 14 +- pallets/emission0/tests/distribution.rs | 2 + pallets/faucet/Cargo.toml | 3 + pallets/faucet/tests/faucet.rs | 2 +- pallets/governance/Cargo.toml | 3 + pallets/governance/api/Cargo.toml | 3 + pallets/governance/src/application.rs | 4 +- pallets/governance/src/proposal.rs | 15 +- pallets/governance/tests/proposal.rs | 2 + pallets/governance/tests/roles.rs | 2 + pallets/governance/tests/voting.rs | 2 + pallets/permission0/Cargo.toml | 3 + pallets/permission0/api/Cargo.toml | 3 + pallets/permission0/api/src/lib.rs | 22 +- pallets/permission0/rpc/Cargo.toml | 14 + pallets/permission0/rpc/src/lib.rs | 48 + pallets/permission0/src/ext.rs | 2 +- pallets/permission0/src/ext/curator_impl.rs | 4 +- pallets/permission0/src/ext/emission_impl.rs | 6 +- pallets/permission0/src/lib.rs | 8 +- pallets/permission0/src/permission.rs | 8 +- .../permission0/src/permission/emission.rs | 11 +- pallets/permission0/tests/enforcement.rs | 2 + pallets/torus0/Cargo.toml | 3 + pallets/torus0/api/Cargo.toml | 3 + pallets/torus0/src/agent.rs | 4 +- runtime/Cargo.toml | 4 +- runtime/src/apis.rs | 11 +- runtime/src/configs.rs | 6 +- runtime/src/configs/eth.rs | 15 +- rust-toolchain.toml | 16 +- test-utils/Cargo.toml | 4 + xtask/src/generate_spec.rs | 5 +- xtask/src/main.rs | 4 +- xtask/src/run.rs | 2 +- 45 files changed, 2106 insertions(+), 1676 deletions(-) create mode 100644 pallets/permission0/rpc/Cargo.toml create mode 100644 pallets/permission0/rpc/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index a0a4cf53..8758cf51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,19 +77,19 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom", + "getrandom 0.2.16", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -120,11 +120,11 @@ dependencies = [ "bytes", "cfg-if", "const-hex", - "derive_more 0.99.18", + "derive_more 0.99.20", "hex-literal", "itoa", "proptest", - "rand", + "rand 0.8.5", "ruint", "serde", "tiny-keccak", @@ -132,9 +132,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.9" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ "arrayvec 0.7.6", "bytes", @@ -152,7 +152,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", "syn-solidity", "tiny-keccak", ] @@ -231,19 +231,20 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", + "once_cell_polyfill", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "approx" @@ -265,7 +266,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -573,7 +574,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -583,7 +584,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", "rayon", ] @@ -626,7 +627,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -642,7 +643,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -666,8 +667,8 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", - "synstructure 0.13.1", + "syn 2.0.101", + "synstructure 0.13.2", ] [[package]] @@ -689,7 +690,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -700,8 +701,8 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "asset-test-utils" -version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "20.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-pallet-parachain-system", "cumulus-pallet-xcmp-queue", @@ -731,8 +732,8 @@ dependencies = [ [[package]] name = "assets-common" -version = "0.18.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.18.3" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -777,14 +778,15 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.2.0", - "futures-lite 2.5.0", + "fastrand 2.3.0", + "futures-lite 2.6.0", + "pin-project-lite", "slab", ] @@ -814,7 +816,7 @@ dependencies = [ "log", "parking", "polling 2.8.0", - "rustix 0.37.27", + "rustix 0.37.28", "slab", "socket2 0.4.10", "waker-fn", @@ -822,18 +824,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" dependencies = [ "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.6.0", "parking", - "polling 3.7.4", - "rustix 0.38.41", + "polling 3.8.0", + "rustix 1.0.7", "slab", "tracing", "windows-sys 0.59.0", @@ -854,7 +856,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] @@ -883,23 +885,23 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.41", + "rustix 0.38.44", "windows-sys 0.48.0", ] [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" dependencies = [ - "async-io 2.4.0", + "async-io 2.4.1", "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.41", + "rustix 1.0.7", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -913,13 +915,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -960,13 +962,13 @@ dependencies = [ [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -977,15 +979,15 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line 0.24.2", "cfg-if", "libc", "miniz_oxide", - "object 0.36.5", + "object 0.36.7", "rustc-demangle", "windows-targets 0.52.6", ] @@ -1022,14 +1024,14 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "binary-merkle-tree" version = "15.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "hash-db", "log", @@ -1056,13 +1058,13 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", - "prettyplease 0.2.25", + "prettyplease 0.2.32", "proc-macro2", "quote", "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -1076,18 +1078,18 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitcoin-internals" @@ -1113,9 +1115,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bitvec" @@ -1163,9 +1165,9 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" dependencies = [ "arrayref", "arrayvec 0.7.6", @@ -1174,9 +1176,9 @@ dependencies = [ [[package]] name = "blake2s_simd" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" +checksum = "e90f7deecfac93095eb874a40febd69427776e24e1bd7f87f33ac62d6f0174df" dependencies = [ "arrayref", "arrayvec 0.7.6", @@ -1185,9 +1187,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.5" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec 0.7.6", @@ -1223,15 +1225,15 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.6.0", "piper", ] [[package]] name = "bounded-collections" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d077619e9c237a5d1875166f5e8033e8f6bff0c96f8caf81e1c2d7738c431bf" +checksum = "64ad8a0bed7827f0b07a5d23cec2e58cc02038a99e4ca81616cb2bb2025f804d" dependencies = [ "log", "parity-scale-codec", @@ -1245,13 +1247,13 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68534a48cbf63a4b1323c433cf21238c9ec23711e0df13b08c33e5c2082663ce" dependencies = [ - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "bp-header-chain" version = "0.18.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-runtime", "finality-grandpa", @@ -1268,7 +1270,7 @@ dependencies = [ [[package]] name = "bp-messages" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-runtime", @@ -1284,7 +1286,7 @@ dependencies = [ [[package]] name = "bp-parachains" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-polkadot-core", @@ -1301,7 +1303,7 @@ dependencies = [ [[package]] name = "bp-polkadot" version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-polkadot-core", @@ -1314,7 +1316,7 @@ dependencies = [ [[package]] name = "bp-polkadot-core" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-messages", "bp-runtime", @@ -1332,7 +1334,7 @@ dependencies = [ [[package]] name = "bp-relayers" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-messages", @@ -1350,7 +1352,7 @@ dependencies = [ [[package]] name = "bp-runtime" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -1373,7 +1375,7 @@ dependencies = [ [[package]] name = "bp-test-utils" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-parachains", @@ -1392,8 +1394,8 @@ dependencies = [ [[package]] name = "bp-xcm-bridge-hub" -version = "0.4.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.4.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-messages", "bp-runtime", @@ -1410,7 +1412,7 @@ dependencies = [ [[package]] name = "bp-xcm-bridge-hub-router" version = "0.14.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -1422,7 +1424,7 @@ dependencies = [ [[package]] name = "bridge-hub-common" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -1438,8 +1440,8 @@ dependencies = [ [[package]] name = "bridge-hub-test-utils" -version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.20.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "asset-test-utils", "bp-header-chain", @@ -1449,8 +1451,6 @@ dependencies = [ "bp-relayers", "bp-runtime", "bp-test-utils", - "bp-xcm-bridge-hub", - "bridge-runtime-common", "cumulus-pallet-parachain-system", "cumulus-pallet-xcmp-queue", "frame-support", @@ -1473,6 +1473,7 @@ dependencies = [ "sp-io", "sp-keyring", "sp-runtime", + "sp-std", "sp-tracing", "staging-xcm", "staging-xcm-builder", @@ -1481,8 +1482,8 @@ dependencies = [ [[package]] name = "bridge-runtime-common" -version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.18.3" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-messages", @@ -1490,7 +1491,6 @@ dependencies = [ "bp-polkadot-core", "bp-relayers", "bp-runtime", - "bp-xcm-bridge-hub", "frame-support", "frame-system", "log", @@ -1536,15 +1536,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byte-slice-cast" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "byte-tools" @@ -1554,9 +1554,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" [[package]] name = "byteorder" @@ -1566,18 +1566,17 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", - "libc", "pkg-config", ] @@ -1617,17 +1616,17 @@ checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", - "semver 1.0.23", + "semver 1.0.26", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cc" -version = "1.2.2" +version = "1.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" dependencies = [ "jobserver", "libc", @@ -1670,6 +1669,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chacha" version = "0.3.0" @@ -1706,16 +1711,16 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -1777,9 +1782,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.22" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" +checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" dependencies = [ "clap_builder", "clap_derive", @@ -1787,9 +1792,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.22" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" +checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" dependencies = [ "anstream", "anstyle", @@ -1800,27 +1805,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "clap_lex" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "coarsetime" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4252bf230cb600c19826a575b31c8c9c84c6f11acfab6dfcad2e941b10b6f8e2" +checksum = "91849686042de1b41cd81490edc83afbcb0abe5a9b6f2c4114f23ce8cca1bcf4" dependencies = [ "libc", "wasix", @@ -1829,12 +1834,13 @@ dependencies = [ [[package]] name = "codespan-reporting" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ + "serde", "termcolor", - "unicode-width 0.1.14", + "unicode-width", ] [[package]] @@ -1855,7 +1861,7 @@ dependencies = [ "nom", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -1876,13 +1882,12 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.1.3" +version = "7.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f165e7b643266ea80cb858aed492ad9280e3e05ce24d4a99d7d7b889b6a4d9" +checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" dependencies = [ - "strum 0.26.3", - "strum_macros 0.26.4", - "unicode-width 0.2.0", + "unicode-segmentation", + "unicode-width", ] [[package]] @@ -1902,22 +1907,22 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "unicode-width 0.1.14", - "windows-sys 0.52.0", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", ] [[package]] name = "const-hex" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" dependencies = [ "cfg-if", "cpufeatures", @@ -1947,11 +1952,31 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom", + "getrandom 0.2.16", "once_cell", "tiny-keccak", ] +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -1964,12 +1989,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" -[[package]] -name = "constcat" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" - [[package]] name = "convert_case" version = "0.4.0" @@ -1986,6 +2005,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -2022,9 +2051,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -2129,9 +2158,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -2153,9 +2182,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -2172,24 +2201,24 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -2198,7 +2227,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array 0.14.7", - "rand_core", + "rand_core 0.6.4", "subtle 2.6.1", "zeroize", ] @@ -2210,7 +2239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array 0.14.7", - "rand_core", + "rand_core 0.6.4", "typenum", ] @@ -2246,7 +2275,7 @@ dependencies = [ [[package]] name = "cumulus-client-cli" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "clap", "parity-scale-codec", @@ -2263,7 +2292,7 @@ dependencies = [ [[package]] name = "cumulus-client-collator" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-client-consensus-common", "cumulus-client-network", @@ -2285,8 +2314,8 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-aura" -version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.18.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-client-collator", @@ -2331,7 +2360,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-common" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-client-pov-recovery", @@ -2361,7 +2390,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-proposer" version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "anyhow", "async-trait", @@ -2370,13 +2399,13 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cumulus-client-consensus-relay-chain" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-client-consensus-common", @@ -2399,7 +2428,7 @@ dependencies = [ [[package]] name = "cumulus-client-network" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-relay-chain-interface", @@ -2425,7 +2454,7 @@ dependencies = [ [[package]] name = "cumulus-client-parachain-inherent" version = "0.12.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2447,7 +2476,7 @@ dependencies = [ [[package]] name = "cumulus-client-pov-recovery" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2459,7 +2488,7 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-overseer", "polkadot-primitives", - "rand", + "rand 0.8.5", "sc-client-api", "sc-consensus", "sp-api", @@ -2473,7 +2502,7 @@ dependencies = [ [[package]] name = "cumulus-client-service" version = "0.19.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-client-cli", "cumulus-client-collator", @@ -2510,7 +2539,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-aura-ext" version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -2527,7 +2556,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-dmp-queue" version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "frame-benchmarking", @@ -2543,8 +2572,8 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system" -version = "0.17.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.17.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bytes", "cumulus-pallet-parachain-system-proc-macro", @@ -2580,18 +2609,18 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system-proc-macro" version = "0.6.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "cumulus-pallet-session-benchmarking" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -2604,7 +2633,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-solo-to-para" version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -2619,7 +2648,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcm" version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -2633,8 +2662,8 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcmp-queue" -version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.17.3" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bounded-collections", "bp-xcm-bridge-hub-router", @@ -2659,7 +2688,7 @@ dependencies = [ [[package]] name = "cumulus-ping" version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-pallet-xcm", "cumulus-primitives-core", @@ -2674,7 +2703,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-aura" version = "0.15.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "sp-api", "sp-consensus-aura", @@ -2683,7 +2712,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-core" version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "polkadot-core-primitives", @@ -2699,7 +2728,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-parachain-inherent" version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2713,7 +2742,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-proof-size-hostfunction" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "sp-externalities", "sp-runtime-interface", @@ -2723,7 +2752,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-storage-weight-reclaim" version = "8.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "cumulus-primitives-proof-size-hostfunction", @@ -2739,7 +2768,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-timestamp" version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "sp-inherents", @@ -2748,8 +2777,8 @@ dependencies = [ [[package]] name = "cumulus-primitives-utility" -version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.17.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -2766,7 +2795,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-inprocess-interface" version = "0.19.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2790,7 +2819,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-interface" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2803,13 +2832,13 @@ dependencies = [ "sp-blockchain", "sp-state-machine", "sp-version", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cumulus-relay-chain-minimal-node" version = "0.19.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "async-trait", @@ -2844,7 +2873,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-rpc-interface" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2856,7 +2885,7 @@ dependencies = [ "parity-scale-codec", "pin-project", "polkadot-overseer", - "rand", + "rand 0.8.5", "sc-client-api", "sc-rpc-api", "sc-service", @@ -2873,7 +2902,7 @@ dependencies = [ "sp-state-machine", "sp-storage", "sp-version", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "tracing", @@ -2883,7 +2912,7 @@ dependencies = [ [[package]] name = "cumulus-test-relay-sproof-builder" version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "parity-scale-codec", @@ -2917,7 +2946,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -2928,16 +2957,16 @@ checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" dependencies = [ "byteorder", "digest 0.9.0", - "rand_core", + "rand_core 0.6.4", "subtle-ng", "zeroize", ] [[package]] name = "cxx" -version = "1.0.133" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e1ec88093d2abd9cf1b09ffd979136b8e922bf31cad966a8fe0d73233112ef" +checksum = "a71ea7f29c73f7ffa64c50b83c9fe4d3a6d4be89a86b009eb80d5a6d3429d741" dependencies = [ "cc", "cxxbridge-cmd", @@ -2949,47 +2978,47 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.133" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afa390d956ee7ccb41aeed7ed7856ab3ffb4fc587e7216be7e0f83e949b4e6c" +checksum = "36a8232661d66dcf713394726157d3cfe0a89bfc85f52d6e9f9bbc2306797fe7" dependencies = [ "cc", "codespan-reporting", "proc-macro2", "quote", "scratch", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "cxxbridge-cmd" -version = "1.0.133" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c23bfff654d6227cbc83de8e059d2f8678ede5fc3a6c5a35d5c379983cc61e6" +checksum = "4f44296c8693e9ea226a48f6a122727f77aa9e9e338380cb021accaeeb7ee279" dependencies = [ "clap", "codespan-reporting", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "cxxbridge-flags" -version = "1.0.133" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c01b36e22051bc6928a78583f1621abaaf7621561c2ada1b00f7878fbe2caa" +checksum = "c42f69c181c176981ae44ba9876e2ea41ce8e574c296b38d06925ce9214fb8e4" [[package]] name = "cxxbridge-macro" -version = "1.0.133" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e14013136fac689345d17b9a6df55977251f11d333c0a571e8d963b55e1f95" +checksum = "8faff5d4467e0709448187df29ccbf3b0982cc426ee444a193f87b11afb565a8" dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3007,15 +3036,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "data-encoding-macro" -version = "0.1.15" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1559b6cba622276d6d63706db152618eeb15b89b3e4041446b05876e352e639" +checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -3023,19 +3052,19 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.13" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332d754c0af53bc87c108fed664d121ecf59207ec4196041f04d6ab9002ad33f" +checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.101", ] [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -3071,9 +3100,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", ] @@ -3097,20 +3126,20 @@ checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3130,7 +3159,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3219,7 +3248,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3243,9 +3272,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.90", + "syn 2.0.101", "termcolor", - "toml 0.8.19", + "toml 0.8.22", "walkdir", ] @@ -3263,9 +3292,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dtoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" [[package]] name = "dunce" @@ -3275,9 +3304,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clonable" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +checksum = "a36efbb9bfd58e1723780aa04b61aba95ace6a05d9ffabfdb0b43672552f0805" dependencies = [ "dyn-clonable-impl", "dyn-clone", @@ -3285,20 +3314,20 @@ dependencies = [ [[package]] name = "dyn-clonable-impl" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +checksum = "7e8671d54058979a37a26f3511fbf8d198ba1aa35ffb202c42587d918d77213a" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.101", ] [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "ecdsa" @@ -3333,9 +3362,9 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", - "rand_core", + "rand_core 0.6.4", "serde", - "sha2 0.10.8", + "sha2 0.10.9", "subtle 2.6.1", "zeroize", ] @@ -3350,16 +3379,16 @@ dependencies = [ "ed25519", "hashbrown 0.14.5", "hex", - "rand_core", - "sha2 0.10.8", + "rand_core 0.6.4", + "sha2 0.10.9", "zeroize", ] [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -3374,7 +3403,7 @@ dependencies = [ "generic-array 0.14.7", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "serdect", "subtle 2.6.1", @@ -3383,9 +3412,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "enum-as-inner" @@ -3408,27 +3437,27 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "enumflags2" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3439,7 +3468,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3463,15 +3492,15 @@ checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -3555,9 +3584,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -3566,11 +3595,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "pin-project-lite", ] @@ -3650,10 +3679,10 @@ dependencies = [ "blake2 0.10.6", "file-guard", "fs-err", - "prettyplease 0.2.25", + "prettyplease 0.2.32", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3679,9 +3708,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -3694,6 +3723,17 @@ dependencies = [ "bytes", ] +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec 0.7.6", + "auto_impl", + "bytes", +] + [[package]] name = "fatality" version = "0.1.1" @@ -3701,7 +3741,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec6f82451ff7f0568c6181287189126d492b5654e30a788add08027b6363d019" dependencies = [ "fatality-proc-macro", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3711,11 +3751,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb42427514b063d97ce21d5199f36c0c307d981434a6be32582bc79fe5bd2303" dependencies = [ "expander", - "indexmap 2.7.0", - "proc-macro-crate 3.2.0", + "indexmap 2.9.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3761,7 +3801,7 @@ dependencies = [ "sp-block-builder", "sp-consensus", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3829,7 +3869,7 @@ dependencies = [ "pallet-evm", "parity-scale-codec", "prometheus", - "rand", + "rand 0.8.5", "rlp", "sc-client-api", "sc-consensus-aura", @@ -3856,7 +3896,7 @@ dependencies = [ "sp-storage", "sp-timestamp", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3899,16 +3939,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182f7dbc2ef73d9ef67351c5fbbea084729c48362d3ce9dd44c28e32e277fe5" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle 2.6.1", ] @@ -3952,9 +3992,9 @@ dependencies = [ [[package]] name = "finality-grandpa" -version = "0.16.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" +checksum = "b4f8f43dc520133541781ec03a8cab158ae8b7f7169cdf22e9050aa6cf0fbdfc" dependencies = [ "either", "futures", @@ -3973,7 +4013,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand", + "rand 0.8.5", "rustc-hex", "static_assertions", ] @@ -4001,9 +4041,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" @@ -4023,7 +4063,7 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fork-tree" version = "13.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", ] @@ -4044,7 +4084,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9" dependencies = [ "nonempty", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4153,14 +4193,14 @@ dependencies = [ [[package]] name = "fragile" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" +checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" [[package]] name = "frame-benchmarking" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-support-procedural", @@ -4184,7 +4224,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "43.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "Inflector", "array-bytes", @@ -4201,7 +4241,7 @@ dependencies = [ "linked-hash-map", "log", "parity-scale-codec", - "rand", + "rand 0.8.5", "rand_pcg", "sc-block-builder", "sc-chain-spec", @@ -4227,14 +4267,14 @@ dependencies = [ "sp-storage", "sp-trie", "sp-wasm-interface", - "thiserror", + "thiserror 1.0.69", "thousands", ] [[package]] name = "frame-benchmarking-pallet-pov" version = "28.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -4248,18 +4288,18 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "14.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "frame-election-provider-support" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -4274,8 +4314,8 @@ dependencies = [ [[package]] name = "frame-executive" -version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "38.0.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "aquamarine", "frame-support", @@ -4305,7 +4345,7 @@ dependencies = [ [[package]] name = "frame-metadata-hash-extension" version = "0.6.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "docify", @@ -4320,7 +4360,7 @@ dependencies = [ [[package]] name = "frame-remote-externalities" version = "0.46.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "indicatif", @@ -4341,8 +4381,8 @@ dependencies = [ [[package]] name = "frame-support" -version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "38.2.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "aquamarine", "array-bytes", @@ -4382,8 +4422,8 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "30.0.3" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "30.0.6" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "Inflector", "cfg-expr", @@ -4393,39 +4433,39 @@ dependencies = [ "frame-support-procedural-tools", "itertools 0.11.0", "macro_magic", - "proc-macro-warning 1.0.2", + "proc-macro-warning 1.84.1", "proc-macro2", "quote", "sp-crypto-hashing", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "frame-support-procedural-tools" version = "13.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "frame-support-procedural-tools-derive" version = "12.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "frame-system" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cfg-if", "docify", @@ -4445,7 +4485,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -4459,7 +4499,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "parity-scale-codec", @@ -4469,7 +4509,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "parity-scale-codec", @@ -4502,7 +4542,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f9df8a11882c4e3335eb2d18a0137c505d9ca927470b0cac9c6f0ae07d28f7" dependencies = [ - "rustix 0.38.41", + "rustix 0.38.44", "windows-sys 0.48.0", ] @@ -4588,11 +4628,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ - "fastrand 2.2.0", + "fastrand 2.3.0", "futures-core", "futures-io", "parking", @@ -4607,7 +4647,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -4697,13 +4737,25 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", - "wasi", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -4712,8 +4764,8 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "rand", - "rand_core", + "rand 0.8.5", + "rand_core 0.6.4", ] [[package]] @@ -4755,9 +4807,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "governor" @@ -4774,7 +4826,7 @@ dependencies = [ "parking_lot 0.12.3", "portable-atomic", "quanta", - "rand", + "rand 0.8.5", "smallvec", "spinning_top", ] @@ -4786,7 +4838,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle 2.6.1", ] @@ -4802,7 +4854,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.0", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -4811,17 +4863,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.2.0", - "indexmap 2.7.0", + "http 1.3.1", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -4839,7 +4891,7 @@ dependencies = [ "pest_derive", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4872,7 +4924,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", ] [[package]] @@ -4881,16 +4933,16 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "allocator-api2", "serde", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -4926,9 +4978,9 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -4989,22 +5041,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "hostname" -version = "0.3.1" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "libc", - "match_cfg", - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -5020,9 +5061,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -5047,27 +5088,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -5077,15 +5118,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -5098,7 +5139,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.8", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -5107,15 +5148,15 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.7", - "http 1.2.0", + "h2 0.4.10", + "http 1.3.1", "http-body 1.0.1", "httparse", "httpdate", @@ -5134,7 +5175,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", @@ -5144,36 +5185,37 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "futures-util", - "http 1.2.0", - "hyper 1.5.1", + "http 1.3.1", + "hyper 1.6.0", "hyper-util", "log", - "rustls 0.23.19", + "rustls 0.23.27", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.2", "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ "bytes", "futures-channel", + "futures-core", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", - "hyper 1.5.1", + "hyper 1.6.0", + "libc", "pin-project-lite", - "socket2 0.5.8", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -5181,16 +5223,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.61.2", ] [[package]] @@ -5204,21 +5247,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -5227,31 +5271,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -5259,67 +5283,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - [[package]] name = "idna" version = "0.2.3" @@ -5354,9 +5365,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -5378,8 +5389,8 @@ version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" dependencies = [ - "async-io 2.4.0", - "core-foundation", + "async-io 2.4.1", + "core-foundation 0.9.4", "fnv", "futures", "if-addrs", @@ -5406,9 +5417,9 @@ dependencies = [ "bytes", "futures", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "log", - "rand", + "rand 0.8.5", "tokio", "url", "xmltree", @@ -5449,7 +5460,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -5484,12 +5495,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -5507,15 +5518,15 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width", "web-time", ] [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array 0.14.7", ] @@ -5567,7 +5578,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.8", + "socket2 0.5.10", "widestring", "windows-sys 0.48.0", "winreg", @@ -5575,19 +5586,19 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi 0.5.1", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5623,24 +5634,35 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jni" -version = "0.19.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", + "windows-sys 0.45.0", ] [[package]] @@ -5651,18 +5673,19 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.74" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -5670,9 +5693,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5c71d8c1a731cc4227c2f698d377e7848ca12c8a48866fc5e6951c43a4db843" +checksum = "37b26c20e2178756451cfeb0661fb74c47dd5988cb7e3939de7e9241fd604d42" dependencies = [ "jsonrpsee-core", "jsonrpsee-http-client", @@ -5686,22 +5709,22 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "548125b159ba1314104f5bb5f38519e03a41862786aa3925cf349aae9cdd546e" +checksum = "bacb85abf4117092455e1573625e21b8f8ef4dec8aff13361140b2dc266cdff2" dependencies = [ "base64 0.22.1", "futures-util", - "http 1.2.0", + "http 1.3.1", "jsonrpsee-core", "pin-project", - "rustls 0.23.19", + "rustls 0.23.27", "rustls-pki-types", "rustls-platform-verifier", "soketto 0.8.1", - "thiserror", + "thiserror 1.0.69", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.2", "tokio-util", "tracing", "url", @@ -5709,25 +5732,25 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2882f6f8acb9fdaec7cefc4fd607119a9bd709831df7d7672a1d3b644628280" +checksum = "456196007ca3a14db478346f58c7238028d55ee15c1df15115596e411ff27925" dependencies = [ "async-trait", "bytes", "futures-timer", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "jsonrpsee-types", "parking_lot 0.12.3", "pin-project", - "rand", - "rustc-hash 2.1.0", + "rand 0.8.5", + "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -5735,23 +5758,23 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.24.8" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c24e981ad17798bbca852b0738bfb7b94816ed687bd0d5da60bfa35fa0fdc3" +checksum = "c872b6c9961a4ccc543e321bb5b89f6b2d2c7fe8b61906918273a3333c95400c" dependencies = [ "async-trait", "base64 0.22.1", "http-body 1.0.1", - "hyper 1.5.1", - "hyper-rustls 0.27.5", + "hyper 1.6.0", + "hyper-rustls 0.27.6", "hyper-util", "jsonrpsee-core", "jsonrpsee-types", - "rustls 0.23.19", + "rustls 0.23.27", "rustls-platform-verifier", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tower", "tracing", @@ -5760,28 +5783,28 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06c01ae0007548e73412c08e2285ffe5d723195bf268bce67b1b77c3bb2a14d" +checksum = "5e65763c942dfc9358146571911b0cd1c361c2d63e2d2305622d40d36376ca80" dependencies = [ "heck 0.5.0", - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "jsonrpsee-server" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ad8ddc14be1d4290cd68046e7d1d37acd408efed6d3ca08aefcc3ad6da069c" +checksum = "55e363146da18e50ad2b51a0a7925fc423137a0b1371af8235b1c231a0647328" dependencies = [ "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", + "hyper 1.6.0", "hyper-util", "jsonrpsee-core", "jsonrpsee-types", @@ -5790,7 +5813,7 @@ dependencies = [ "serde", "serde_json", "soketto 0.8.1", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -5800,23 +5823,23 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a178c60086f24cc35bb82f57c651d0d25d99c4742b4d335de04e97fa1f08a8a1" +checksum = "08a8e70baf945b6b5752fc8eb38c918a48f1234daf11355e07106d963f860089" dependencies = [ - "http 1.2.0", + "http 1.3.1", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "jsonrpsee-ws-client" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe322e0896d0955a3ebdd5bf813571c53fea29edd713bc315b76620b327e86d" +checksum = "01b3323d890aa384f12148e8d2a1fd18eb66e9e7e825f9de4fa53bcc19b93eef" dependencies = [ - "http 1.2.0", + "http 1.3.1", "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", @@ -5834,7 +5857,7 @@ dependencies = [ "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -5893,7 +5916,7 @@ checksum = "9baa9eeb6e315942429397e617a190f4fdc696ef1ee0342939d641029cbb4ea7" dependencies = [ "enumflags2", "libc", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5910,25 +5933,25 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.167" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.53.0", ] [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libp2p" @@ -5940,7 +5963,7 @@ dependencies = [ "either", "futures", "futures-timer", - "getrandom", + "getrandom 0.2.16", "instant", "libp2p-allow-block-list", "libp2p-connection-limits", @@ -5964,7 +5987,7 @@ dependencies = [ "multiaddr 0.18.2", "pin-project", "rw-stream-sink", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6005,16 +6028,16 @@ dependencies = [ "libp2p-identity", "log", "multiaddr 0.18.2", - "multihash 0.19.2", + "multihash 0.19.3", "multistream-select", "once_cell", "parking_lot 0.12.3", "pin-project", "quick-protobuf", - "rand", + "rand 0.8.5", "rw-stream-sink", "smallvec", - "thiserror", + "thiserror 1.0.69", "unsigned-varint 0.7.2", "void", ] @@ -6054,24 +6077,24 @@ dependencies = [ "quick-protobuf", "quick-protobuf-codec", "smallvec", - "thiserror", + "thiserror 1.0.69", "void", ] [[package]] name = "libp2p-identity" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b5621d159b32282eac446bed6670c39c7dc68a200a992d8f056afa0066f6d" +checksum = "fbb68ea10844211a59ce46230909fd0ea040e8a192454d4cc2ee0d53e12280eb" dependencies = [ "bs58 0.5.1", "ed25519-dalek", "hkdf", - "multihash 0.19.2", + "multihash 0.19.3", "quick-protobuf", - "rand", - "sha2 0.10.8", - "thiserror", + "rand 0.8.5", + "sha2 0.10.9", + "thiserror 2.0.12", "tracing", "zeroize", ] @@ -6096,10 +6119,10 @@ dependencies = [ "log", "quick-protobuf", "quick-protobuf-codec", - "rand", - "sha2 0.10.8", + "rand 0.8.5", + "sha2 0.10.9", "smallvec", - "thiserror", + "thiserror 1.0.69", "uint", "unsigned-varint 0.7.2", "void", @@ -6118,9 +6141,9 @@ dependencies = [ "libp2p-identity", "libp2p-swarm", "log", - "rand", + "rand 0.8.5", "smallvec", - "socket2 0.5.8", + "socket2 0.5.10", "tokio", "trust-dns-proto 0.22.0", "void", @@ -6156,14 +6179,14 @@ dependencies = [ "libp2p-identity", "log", "multiaddr 0.18.2", - "multihash 0.19.2", + "multihash 0.19.3", "once_cell", "quick-protobuf", - "rand", - "sha2 0.10.8", + "rand 0.8.5", + "sha2 0.10.9", "snow", "static_assertions", - "thiserror", + "thiserror 1.0.69", "x25519-dalek", "zeroize", ] @@ -6182,7 +6205,7 @@ dependencies = [ "libp2p-identity", "libp2p-swarm", "log", - "rand", + "rand 0.8.5", "void", ] @@ -6202,11 +6225,11 @@ dependencies = [ "log", "parking_lot 0.12.3", "quinn 0.10.2", - "rand", + "rand 0.8.5", "ring 0.16.20", "rustls 0.21.12", - "socket2 0.5.8", - "thiserror", + "socket2 0.5.10", + "thiserror 1.0.69", "tokio", ] @@ -6223,7 +6246,7 @@ dependencies = [ "libp2p-identity", "libp2p-swarm", "log", - "rand", + "rand 0.8.5", "smallvec", "void", ] @@ -6245,7 +6268,7 @@ dependencies = [ "log", "multistream-select", "once_cell", - "rand", + "rand 0.8.5", "smallvec", "tokio", "void", @@ -6261,7 +6284,7 @@ dependencies = [ "proc-macro-warning 0.4.2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -6277,7 +6300,7 @@ dependencies = [ "libp2p-core", "libp2p-identity", "log", - "socket2 0.5.8", + "socket2 0.5.10", "tokio", ] @@ -6295,7 +6318,7 @@ dependencies = [ "ring 0.16.20", "rustls 0.21.12", "rustls-webpki 0.101.7", - "thiserror", + "thiserror 1.0.69", "x509-parser 0.15.1", "yasna", ] @@ -6346,9 +6369,9 @@ dependencies = [ "pin-project-lite", "rw-stream-sink", "soketto 0.8.1", - "thiserror", + "thiserror 1.0.69", "url", - "webpki-roots 0.25.4", + "webpki-roots", ] [[package]] @@ -6360,7 +6383,7 @@ dependencies = [ "futures", "libp2p-core", "log", - "thiserror", + "thiserror 1.0.69", "yamux", ] @@ -6370,9 +6393,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.12", ] [[package]] @@ -6392,18 +6415,18 @@ dependencies = [ [[package]] name = "libsecp256k1" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" dependencies = [ "arrayref", - "base64 0.13.1", + "base64 0.22.1", "digest 0.9.0", "hmac-drbg", "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", - "rand", + "rand 0.8.5", "serde", "sha2 0.9.9", "typenum", @@ -6440,9 +6463,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.20" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" dependencies = [ "cc", "pkg-config", @@ -6451,9 +6474,9 @@ dependencies = [ [[package]] name = "link-cplusplus" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" +checksum = "4a6f6da007f968f9def0d65a05b187e2960183de70c160204ecfccf0ee330212" dependencies = [ "cc", ] @@ -6466,9 +6489,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linked_hash_set" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" +checksum = "bae85b5be22d9843c80e5fc80e9b64c8a3b1f98f867c709956eca3efff4e92e2" dependencies = [ "linked-hash-map", ] @@ -6496,9 +6519,15 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "lioness" @@ -6514,9 +6543,9 @@ dependencies = [ [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litep2p" @@ -6532,7 +6561,7 @@ dependencies = [ "futures", "futures-timer", "hex-literal", - "indexmap 2.7.0", + "indexmap 2.9.0", "libc", "mockall 0.12.1", "multiaddr 0.17.1", @@ -6544,19 +6573,19 @@ dependencies = [ "prost 0.12.6", "prost-build 0.11.9", "quinn 0.9.4", - "rand", + "rand 0.8.5", "rcgen", "ring 0.16.20", "rustls 0.20.9", "serde", - "sha2 0.10.8", + "sha2 0.10.9", "simple-dns", "smallvec", "snow", - "socket2 0.5.8", + "socket2 0.5.10", "static_assertions", "str0m", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-tungstenite", @@ -6585,9 +6614,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru" @@ -6610,7 +6639,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -6624,9 +6653,9 @@ dependencies = [ [[package]] name = "lz4" -version = "1.28.0" +version = "1.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d1febb2b4a79ddd1980eede06a8f7902197960aa0383ffcfdd62fe723036725" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" dependencies = [ "lz4-sys", ] @@ -6659,7 +6688,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -6673,7 +6702,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -6684,7 +6713,7 @@ checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -6695,7 +6724,7 @@ checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -6704,12 +6733,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matchers" version = "0.1.0" @@ -6727,9 +6750,9 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "matrixmultiply" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -6747,7 +6770,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.38.41", + "rustix 0.38.44", ] [[package]] @@ -6808,7 +6831,7 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core", + "rand_core 0.6.4", "zeroize", ] @@ -6819,7 +6842,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532" dependencies = [ "futures", - "rand", + "rand 0.8.5", "thrift", ] @@ -6831,22 +6854,22 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi", - "windows-sys 0.52.0", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -6866,18 +6889,18 @@ dependencies = [ "lioness", "log", "parking_lot 0.12.3", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "rand_distr", "subtle 2.6.1", - "thiserror", + "thiserror 1.0.69", "zeroize", ] [[package]] name = "mmr-gadget" version = "40.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "log", @@ -6896,7 +6919,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -6934,7 +6957,7 @@ dependencies = [ "fragile", "lazy_static", "mockall_derive 0.12.1", - "predicates 3.1.2", + "predicates 3.1.3", "predicates-tree", ] @@ -6959,7 +6982,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -6998,7 +7021,7 @@ dependencies = [ "data-encoding", "libp2p-identity", "multibase", - "multihash 0.19.2", + "multihash 0.19.3", "percent-encoding", "serde", "static_assertions", @@ -7029,7 +7052,7 @@ dependencies = [ "core2", "digest 0.10.7", "multihash-derive", - "sha2 0.10.8", + "sha2 0.10.9", "sha3", "unsigned-varint 0.7.2", ] @@ -7046,16 +7069,16 @@ dependencies = [ "core2", "digest 0.10.7", "multihash-derive", - "sha2 0.10.8", + "sha2 0.10.9", "sha3", "unsigned-varint 0.7.2", ] [[package]] name = "multihash" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc41f430805af9d1cf4adae4ed2149c759b877b01d909a1f40256188d09345d2" +checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" dependencies = [ "core2", "unsigned-varint 0.8.0", @@ -7083,9 +7106,9 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "multimap" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "multistream-select" @@ -7122,7 +7145,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bddcd3bf5144b6392de80e04c347cd7fab2508f6df16a85fc496ecd5cec39bc" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -7165,29 +7188,28 @@ dependencies = [ "anyhow", "byteorder", "paste", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "netlink-proto" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b33524dc0968bfad349684447bfce6db937a9ac3332a1fe60c0c5a5ce63f21" +checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" dependencies = [ "bytes", "futures", "log", "netlink-packet-core", "netlink-sys", - "thiserror", - "tokio", + "thiserror 2.0.12", ] [[package]] name = "netlink-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307" +checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" dependencies = [ "bytes", "futures", @@ -7204,7 +7226,7 @@ checksum = "a4a43439bf756eed340bdf8feba761e2d50c7d47175d87545cd5cbe4a137c4d1" dependencies = [ "cc", "libc", - "thiserror", + "thiserror 1.0.69", "winapi", ] @@ -7225,9 +7247,9 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "cfg-if", - "cfg_aliases", + "cfg_aliases 0.1.1", "libc", ] @@ -7340,7 +7362,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -7419,10 +7441,10 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -7454,9 +7476,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -7481,9 +7503,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "opaque-debug" @@ -7499,11 +7527,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "cfg-if", "foreign-types", "libc", @@ -7520,29 +7548,29 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.4.1+3.4.0" +version = "300.5.0+3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +checksum = "e8ce546f549326b0e6052b649198487d91320875da901e7bd11a06d1ee3f9c2f" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ "cc", "libc", @@ -7570,7 +7598,7 @@ dependencies = [ "orchestra-proc-macro", "pin-project", "prioritized-metered-channel", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -7581,10 +7609,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7b1d40dd8f367db3c65bec8d3dd47d4a604ee8874480738f93191bddab4e0e0" dependencies = [ "expander", - "indexmap 2.7.0", + "indexmap 2.9.0", "itertools 0.11.0", "petgraph", - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", "syn 1.0.109", @@ -7608,7 +7636,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pallet-alliance" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "frame-benchmarking", @@ -7628,7 +7656,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -7646,7 +7674,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion-ops" version = "0.6.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -7664,7 +7692,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion-tx-payment" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -7678,7 +7706,7 @@ dependencies = [ [[package]] name = "pallet-asset-rate" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -7692,7 +7720,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -7709,7 +7737,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "40.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -7725,7 +7753,7 @@ dependencies = [ [[package]] name = "pallet-assets-freezer" version = "0.5.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -7740,7 +7768,7 @@ dependencies = [ [[package]] name = "pallet-atomic-swap" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -7754,7 +7782,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -7770,7 +7798,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -7785,7 +7813,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -7798,7 +7826,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -7821,7 +7849,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "aquamarine", "docify", @@ -7841,8 +7869,8 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "39.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "39.0.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -7857,7 +7885,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "39.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -7876,7 +7904,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "39.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "binary-merkle-tree", @@ -7900,8 +7928,8 @@ dependencies = [ [[package]] name = "pallet-bounties" -version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "37.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -7918,7 +7946,7 @@ dependencies = [ [[package]] name = "pallet-bridge-grandpa" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-runtime", @@ -7937,7 +7965,7 @@ dependencies = [ [[package]] name = "pallet-bridge-messages" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-messages", @@ -7956,7 +7984,7 @@ dependencies = [ [[package]] name = "pallet-bridge-parachains" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-parachains", @@ -7975,8 +8003,8 @@ dependencies = [ [[package]] name = "pallet-bridge-relayers" -version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.18.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-header-chain", "bp-messages", @@ -7999,8 +8027,8 @@ dependencies = [ [[package]] name = "pallet-broker" -version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.17.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "frame-benchmarking", @@ -8018,7 +8046,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8036,7 +8064,7 @@ dependencies = [ [[package]] name = "pallet-collator-selection" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8046,7 +8074,7 @@ dependencies = [ "pallet-balances", "pallet-session", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "sp-runtime", "sp-staking", @@ -8055,7 +8083,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8071,7 +8099,7 @@ dependencies = [ [[package]] name = "pallet-collective-content" version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8085,7 +8113,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitflags 1.3.2", "environmental", @@ -8099,7 +8127,7 @@ dependencies = [ "pallet-contracts-uapi", "parity-scale-codec", "paste", - "rand", + "rand 0.8.5", "rand_pcg", "scale-info", "serde", @@ -8118,7 +8146,7 @@ dependencies = [ [[package]] name = "pallet-contracts-mock-network" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -8153,17 +8181,17 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "23.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "pallet-contracts-uapi" version = "12.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -8175,7 +8203,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "assert_matches", "frame-benchmarking", @@ -8190,8 +8218,8 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" -version = "22.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "22.2.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8208,8 +8236,8 @@ dependencies = [ [[package]] name = "pallet-delegated-staking" -version = "5.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "5.0.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -8224,7 +8252,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8241,7 +8269,7 @@ dependencies = [ [[package]] name = "pallet-dev-mode" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -8256,7 +8284,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8265,7 +8293,7 @@ dependencies = [ "log", "pallet-election-provider-support-benchmarking", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "sp-arithmetic", "sp-core", @@ -8278,7 +8306,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8291,7 +8319,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "39.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8416,7 +8444,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -8449,7 +8477,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "blake2 0.10.6", "frame-benchmarking", @@ -8490,7 +8518,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8512,7 +8540,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "enumflags2", "frame-benchmarking", @@ -8528,7 +8556,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8547,7 +8575,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8563,7 +8591,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "26.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -8576,7 +8604,7 @@ dependencies = [ [[package]] name = "pallet-lottery" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8589,7 +8617,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8605,7 +8633,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "41.0.2" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "environmental", "frame-benchmarking", @@ -8624,7 +8652,7 @@ dependencies = [ [[package]] name = "pallet-migrations" version = "8.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -8641,7 +8669,7 @@ dependencies = [ [[package]] name = "pallet-mixnet" version = "0.14.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8660,7 +8688,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8677,7 +8705,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8692,7 +8720,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "21.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8708,7 +8736,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "32.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "enumflags2", "frame-benchmarking", @@ -8725,7 +8753,7 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "pallet-nfts", "parity-scale-codec", @@ -8735,7 +8763,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8750,7 +8778,7 @@ dependencies = [ [[package]] name = "pallet-node-authorization" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -8764,8 +8792,8 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" -version = "35.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "35.0.3" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -8783,7 +8811,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "36.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8802,8 +8830,8 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" -version = "33.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "33.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -8813,7 +8841,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -8829,7 +8857,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -8852,7 +8880,7 @@ dependencies = [ [[package]] name = "pallet-paged-list" version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -8869,7 +8897,7 @@ dependencies = [ [[package]] name = "pallet-parameters" version = "0.9.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -8887,7 +8915,7 @@ dependencies = [ name = "pallet-permission0" version = "0.1.0" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "pallet-emission0-api", "pallet-permission0-api", "pallet-torus0-api", @@ -8901,17 +8929,28 @@ dependencies = [ name = "pallet-permission0-api" version = "0.1.0" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "pallet-torus0-api", "parity-scale-codec", "polkadot-sdk", "scale-info", ] +[[package]] +name = "pallet-permission0-rpc" +version = "0.1.0" +dependencies = [ + "async-trait", + "jsonrpsee", + "pallet-permission0-api", + "polkadot-sdk", + "torus-runtime", +] + [[package]] name = "pallet-preimage" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8927,7 +8966,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8940,8 +8979,8 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" -version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "38.2.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8959,7 +8998,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -8973,7 +9012,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "assert_matches", "frame-benchmarking", @@ -8991,7 +9030,7 @@ dependencies = [ [[package]] name = "pallet-remark" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9007,7 +9046,7 @@ dependencies = [ [[package]] name = "pallet-revive" version = "0.2.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitflags 1.3.2", "environmental", @@ -9037,7 +9076,7 @@ dependencies = [ [[package]] name = "pallet-revive-fixtures" version = "0.2.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "anyhow", "frame-system", @@ -9045,13 +9084,13 @@ dependencies = [ "polkavm-linker 0.10.0", "sp-runtime", "tempfile", - "toml 0.8.19", + "toml 0.8.22", ] [[package]] name = "pallet-revive-mock-network" version = "0.2.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -9085,17 +9124,17 @@ dependencies = [ [[package]] name = "pallet-revive-proc-macro" version = "0.1.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "pallet-revive-uapi" version = "0.1.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -9107,7 +9146,7 @@ dependencies = [ [[package]] name = "pallet-root-offences" version = "35.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -9122,7 +9161,7 @@ dependencies = [ [[package]] name = "pallet-root-testing" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -9136,7 +9175,7 @@ dependencies = [ [[package]] name = "pallet-safe-mode" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -9153,8 +9192,8 @@ dependencies = [ [[package]] name = "pallet-salary" -version = "23.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "23.2.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9172,7 +9211,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "39.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -9189,7 +9228,7 @@ dependencies = [ [[package]] name = "pallet-scored-pool" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -9202,7 +9241,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -9223,7 +9262,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9231,7 +9270,7 @@ dependencies = [ "pallet-session", "pallet-staking", "parity-scale-codec", - "rand", + "rand 0.8.5", "sp-runtime", "sp-session", ] @@ -9239,7 +9278,7 @@ dependencies = [ [[package]] name = "pallet-skip-feeless-payment" version = "13.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -9251,14 +9290,14 @@ dependencies = [ [[package]] name = "pallet-society" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", - "rand_chacha", + "rand_chacha 0.3.1", "scale-info", "sp-arithmetic", "sp-io", @@ -9267,8 +9306,8 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "38.0.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -9278,7 +9317,7 @@ dependencies = [ "pallet-authorship", "pallet-session", "parity-scale-codec", - "rand_chacha", + "rand_chacha 0.3.1", "scale-info", "serde", "sp-application-crypto", @@ -9290,7 +9329,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "22.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "log", "sp-arithmetic", @@ -9299,7 +9338,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "sp-api", @@ -9309,7 +9348,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "40.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9325,7 +9364,7 @@ dependencies = [ [[package]] name = "pallet-statement" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -9342,7 +9381,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -9357,7 +9396,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -9376,7 +9415,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9413,8 +9452,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "38.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -9429,7 +9468,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "41.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -9445,7 +9484,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -9457,7 +9496,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "frame-benchmarking", @@ -9477,7 +9516,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -9495,7 +9534,7 @@ dependencies = [ [[package]] name = "pallet-tx-pause" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -9512,7 +9551,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9526,7 +9565,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9541,7 +9580,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9555,7 +9594,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -9568,8 +9607,8 @@ dependencies = [ [[package]] name = "pallet-xcm" -version = "17.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "17.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -9592,13 +9631,12 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" -version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "17.0.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "log", "parity-scale-codec", "scale-info", "sp-io", @@ -9610,8 +9648,8 @@ dependencies = [ [[package]] name = "pallet-xcm-bridge-hub" -version = "0.13.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.13.3" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-messages", "bp-runtime", @@ -9632,8 +9670,8 @@ dependencies = [ [[package]] name = "pallet-xcm-bridge-hub-router" -version = "0.15.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.15.3" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bp-xcm-bridge-hub-router", "frame-benchmarking", @@ -9652,7 +9690,7 @@ dependencies = [ [[package]] name = "parachains-common" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "cumulus-primitives-utility", @@ -9681,8 +9719,8 @@ dependencies = [ [[package]] name = "parachains-runtimes-test-utils" -version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "19.0.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-pallet-parachain-system", "cumulus-pallet-xcmp-queue", @@ -9718,8 +9756,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" dependencies = [ "bitcoin_hashes", - "rand", - "rand_core", + "rand 0.8.5", + "rand_core 0.6.4", "serde", "unicode-normalization", ] @@ -9745,7 +9783,7 @@ dependencies = [ "lz4", "memmap2 0.5.10", "parking_lot 0.12.3", - "rand", + "rand 0.8.5", "siphasher", "snap", "winapi", @@ -9753,29 +9791,31 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec 0.7.6", "bitvec", "byte-slice-cast", "bytes", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.101", ] [[package]] @@ -9862,7 +9902,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.12", "smallvec", "windows-targets 0.52.6", ] @@ -9880,7 +9920,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle 2.6.1", ] @@ -9923,20 +9963,20 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.14" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" dependencies = [ "memchr", - "thiserror", + "thiserror 2.0.12", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.14" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" +checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" dependencies = [ "pest", "pest_generator", @@ -9944,26 +9984,26 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.14" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" +checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "pest_meta" -version = "2.7.14" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" +checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" dependencies = [ "once_cell", "pest", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -9973,34 +10013,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.0", + "indexmap 2.9.0", ] [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -10015,7 +10055,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.2.0", + "fastrand 2.3.0", "futures-io", ] @@ -10031,14 +10071,14 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polkadot-approval-distribution" -version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "18.2.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "futures", @@ -10051,14 +10091,14 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand", + "rand 0.8.5", "tracing-gum", ] [[package]] name = "polkadot-availability-bitfield-distribution" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "always-assert", "futures", @@ -10067,16 +10107,16 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand", + "rand 0.8.5", "tracing-gum", ] [[package]] name = "polkadot-availability-distribution" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "derive_more 0.99.18", + "derive_more 0.99.20", "fatality", "futures", "parity-scale-codec", @@ -10086,19 +10126,19 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand", + "rand 0.8.5", "sc-network", "schnellru", "sp-core", "sp-keystore", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-availability-recovery" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "fatality", @@ -10110,10 +10150,10 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand", + "rand 0.8.5", "sc-network", "schnellru", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing-gum", ] @@ -10131,7 +10171,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cfg-if", "clap", @@ -10153,13 +10193,13 @@ dependencies = [ "sp-maybe-compressed-blob", "sp-runtime", "substrate-build-script-utils", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "polkadot-collator-protocol" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "fatality", @@ -10174,7 +10214,7 @@ dependencies = [ "sp-core", "sp-keystore", "sp-runtime", - "thiserror", + "thiserror 1.0.69", "tokio-util", "tracing-gum", ] @@ -10182,7 +10222,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "15.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -10193,13 +10233,13 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "derive_more 0.99.18", + "derive_more 0.99.20", "fatality", "futures", "futures-timer", - "indexmap 2.7.0", + "indexmap 2.9.0", "parity-scale-codec", "polkadot-erasure-coding", "polkadot-node-network-protocol", @@ -10211,14 +10251,14 @@ dependencies = [ "schnellru", "sp-application-crypto", "sp-keystore", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-erasure-coding" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -10226,13 +10266,13 @@ dependencies = [ "reed-solomon-novelpoly", "sp-core", "sp-trie", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "polkadot-gossip-support" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "futures-timer", @@ -10240,8 +10280,8 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "sc-network", "sc-network-common", "sp-application-crypto", @@ -10254,7 +10294,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "always-assert", "async-trait", @@ -10270,14 +10310,14 @@ dependencies = [ "polkadot-primitives", "sc-network", "sp-consensus", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-collation-generation" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "parity-scale-codec", @@ -10288,17 +10328,17 @@ dependencies = [ "polkadot-primitives", "sp-core", "sp-maybe-compressed-blob", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-approval-voting" -version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "18.3.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", - "derive_more 0.99.18", + "derive_more 0.99.20", "futures", "futures-timer", "itertools 0.11.0", @@ -10311,9 +10351,9 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-primitives", - "rand", - "rand_chacha", - "rand_core", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_core 0.6.4", "sc-keystore", "schnellru", "schnorrkel 0.11.4", @@ -10321,14 +10361,14 @@ dependencies = [ "sp-consensus", "sp-consensus-slots", "sp-runtime", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-av-store" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "futures", @@ -10343,14 +10383,14 @@ dependencies = [ "polkadot-overseer", "polkadot-primitives", "sp-consensus", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-backing" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "fatality", @@ -10363,21 +10403,21 @@ dependencies = [ "polkadot-statement-table", "schnellru", "sp-keystore", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-bitfield-signing" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", "sp-keystore", - "thiserror", + "thiserror 1.0.69", "tracing-gum", "wasm-timer", ] @@ -10385,7 +10425,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -10407,7 +10447,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "polkadot-node-metrics", @@ -10421,7 +10461,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "futures-timer", @@ -10431,14 +10471,14 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-dispute-coordinator" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "fatality", "futures", @@ -10450,14 +10490,14 @@ dependencies = [ "polkadot-primitives", "sc-keystore", "schnellru", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-parachains-inherent" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -10467,28 +10507,28 @@ dependencies = [ "polkadot-primitives", "sp-blockchain", "sp-inherents", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-prospective-parachains" version = "17.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "fatality", "futures", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-provisioner" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "fatality", @@ -10499,14 +10539,14 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "schnellru", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-pvf" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "always-assert", "array-bytes", @@ -10523,11 +10563,11 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-parachain-primitives", "polkadot-primitives", - "rand", + "rand 0.8.5", "slotmap", "sp-core", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing-gum", ] @@ -10535,7 +10575,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "polkadot-node-primitives", @@ -10544,14 +10584,14 @@ dependencies = [ "polkadot-overseer", "polkadot-primitives", "sp-keystore", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-pvf-common" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cpu-time", "futures", @@ -10570,14 +10610,14 @@ dependencies = [ "sp-externalities", "sp-io", "sp-tracing", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-core-runtime-api" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "polkadot-node-metrics", @@ -10592,7 +10632,7 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "lazy_static", "log", @@ -10604,14 +10644,14 @@ dependencies = [ "sc-network", "sc-network-types", "sp-core", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "polkadot-node-metrics" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bs58 0.5.1", "futures", @@ -10629,13 +10669,13 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" -version = "18.0.2" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "18.2.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-channel 1.9.0", "async-trait", "bitvec", - "derive_more 0.99.18", + "derive_more 0.99.20", "fatality", "futures", "hex", @@ -10643,20 +10683,20 @@ dependencies = [ "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-primitives", - "rand", + "rand 0.8.5", "sc-authority-discovery", "sc-network", "sc-network-types", "sp-runtime", "strum 0.26.3", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-node-primitives" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "bounded-vec", @@ -10675,14 +10715,14 @@ dependencies = [ "sp-keystore", "sp-maybe-compressed-blob", "sp-runtime", - "thiserror", + "thiserror 1.0.69", "zstd 0.12.4", ] [[package]] name = "polkadot-node-subsystem" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -10692,11 +10732,11 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "bitvec", - "derive_more 0.99.18", + "derive_more 0.99.20", "fatality", "futures", "orchestra", @@ -10716,16 +10756,16 @@ dependencies = [ "sp-consensus-babe", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "polkadot-node-subsystem-util" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", - "derive_more 0.99.18", + "derive_more 0.99.20", "fatality", "futures", "futures-channel", @@ -10745,20 +10785,20 @@ dependencies = [ "polkadot-overseer", "polkadot-primitives", "prioritized-metered-channel", - "rand", + "rand 0.8.5", "sc-client-api", "schnellru", "sp-application-crypto", "sp-core", "sp-keystore", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-overseer" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -10780,7 +10820,7 @@ dependencies = [ [[package]] name = "polkadot-parachain-lib" version = "0.3.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "clap", @@ -10849,10 +10889,10 @@ dependencies = [ [[package]] name = "polkadot-parachain-primitives" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bounded-collections", - "derive_more 0.99.18", + "derive_more 0.99.20", "parity-scale-codec", "polkadot-core-primitives", "scale-info", @@ -10865,7 +10905,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "hex-literal", @@ -10891,7 +10931,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -10925,8 +10965,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "17.0.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitvec", "frame-benchmarking", @@ -10976,7 +11016,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bs58 0.5.1", "frame-benchmarking", @@ -10987,12 +11027,12 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" -version = "17.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "17.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bitflags 1.3.2", "bitvec", - "derive_more 0.99.18", + "derive_more 0.99.20", "frame-benchmarking", "frame-support", "frame-system", @@ -11014,8 +11054,8 @@ dependencies = [ "polkadot-parachain-primitives", "polkadot-primitives", "polkadot-runtime-metrics", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "scale-info", "serde", "sp-api", @@ -11036,8 +11076,8 @@ dependencies = [ [[package]] name = "polkadot-sdk" -version = "0.7.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.9.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "asset-test-utils", "assets-common", @@ -11339,7 +11379,7 @@ dependencies = [ [[package]] name = "polkadot-sdk-frame" version = "0.7.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-benchmarking", @@ -11370,8 +11410,8 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "19.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "frame-benchmarking", @@ -11469,7 +11509,7 @@ dependencies = [ "sp-weights", "staging-xcm", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", "tracing-gum", "westend-runtime", "xcm-runtime-apis", @@ -11478,14 +11518,14 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "arrayvec 0.7.6", "bitvec", "fatality", "futures", "futures-timer", - "indexmap 2.7.0", + "indexmap 2.9.0", "parity-scale-codec", "polkadot-node-network-protocol", "polkadot-node-primitives", @@ -11494,14 +11534,14 @@ dependencies = [ "polkadot-primitives", "sp-keystore", "sp-staking", - "thiserror", + "thiserror 1.0.69", "tracing-gum", ] [[package]] name = "polkadot-statement-table" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -11599,7 +11639,7 @@ dependencies = [ "polkavm-common 0.9.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -11611,7 +11651,7 @@ dependencies = [ "polkavm-common 0.10.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -11621,7 +11661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" dependencies = [ "polkavm-derive-impl 0.9.0", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -11631,7 +11671,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9324fe036de37c17829af233b46ef6b5562d4a0c09bb7fdb9f8378856dee30cf" dependencies = [ "polkavm-derive-impl 0.10.0", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -11658,7 +11698,7 @@ dependencies = [ "gimli 0.28.1", "hashbrown 0.14.5", "log", - "object 0.36.5", + "object 0.36.7", "polkavm-common 0.10.0", "regalloc2 0.9.3", "rustc-demangle", @@ -11694,15 +11734,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi 0.5.1", "pin-project-lite", - "rustix 0.38.41", + "rustix 1.0.7", "tracing", "windows-sys 0.59.0", ] @@ -11732,9 +11772,18 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.10.0" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "potential_utf" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] [[package]] name = "powerfmt" @@ -11744,9 +11793,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -11767,9 +11816,9 @@ dependencies = [ [[package]] name = "predicates" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" dependencies = [ "anstyle", "predicates-core", @@ -11777,15 +11826,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", @@ -11803,12 +11852,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -11833,11 +11882,11 @@ checksum = "a172e6cc603231f2cf004232eabcecccc0da53ba576ab286ef7baa0cfc7927ad" dependencies = [ "coarsetime", "crossbeam-queue", - "derive_more 0.99.18", + "derive_more 0.99.20", "futures", "futures-timer", "nanorand", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -11847,15 +11896,15 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ - "thiserror", + "thiserror 1.0.69", "toml 0.5.11", ] [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] @@ -11892,25 +11941,25 @@ checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "proc-macro-warning" -version = "1.0.2" +version = "1.84.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" +checksum = "75eea531cfcd120e0851a3f8aed42c4841f78c889eefafd96339c72677ae42c3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -11926,7 +11975,7 @@ dependencies = [ "lazy_static", "memchr", "parking_lot 0.12.3", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -11949,22 +11998,22 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "proptest" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.6.0", + "bitflags 2.9.1", "lazy_static", "num-traits", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax 0.8.5", "rusty-fork", @@ -12022,16 +12071,16 @@ checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", "heck 0.5.0", - "itertools 0.11.0", + "itertools 0.12.1", "log", - "multimap 0.10.0", + "multimap 0.10.1", "once_cell", "petgraph", - "prettyplease 0.2.25", + "prettyplease 0.2.32", "prost 0.12.6", "prost-types 0.12.6", "regex", - "syn 2.0.90", + "syn 2.0.101", "tempfile", ] @@ -12055,10 +12104,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -12081,24 +12130,24 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" +checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" dependencies = [ "cc", ] [[package]] name = "quanta" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" dependencies = [ "crossbeam-utils", "libc", "once_cell", "raw-cpuid", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "web-sys", "winapi", ] @@ -12127,7 +12176,7 @@ dependencies = [ "asynchronous-codec", "bytes", "quick-protobuf", - "thiserror", + "thiserror 1.0.69", "unsigned-varint 0.7.2", ] @@ -12143,7 +12192,7 @@ dependencies = [ "quinn-udp 0.3.2", "rustc-hash 1.1.0", "rustls 0.20.9", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "webpki", @@ -12162,7 +12211,7 @@ dependencies = [ "quinn-udp 0.4.1", "rustc-hash 1.1.0", "rustls 0.21.12", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -12174,12 +12223,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94b0b33c13a79f669c85defaf4c275dc86a0c0372807d0ca3d78e0bb87274863" dependencies = [ "bytes", - "rand", + "rand 0.8.5", "ring 0.16.20", "rustc-hash 1.1.0", "rustls 0.20.9", "slab", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tracing", "webpki", @@ -12192,12 +12241,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" dependencies = [ "bytes", - "rand", + "rand 0.8.5", "ring 0.16.20", "rustc-hash 1.1.0", "rustls 0.21.12", "slab", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tracing", ] @@ -12223,20 +12272,26 @@ checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" dependencies = [ "bytes", "libc", - "socket2 0.5.8", + "socket2 0.5.10", "tracing", "windows-sys 0.48.0", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -12250,8 +12305,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -12261,7 +12326,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -12270,7 +12345,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", ] [[package]] @@ -12280,7 +12364,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -12289,7 +12373,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" dependencies = [ - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -12298,16 +12382,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core", + "rand_core 0.6.4", ] [[package]] name = "raw-cpuid" -version = "11.2.0" +version = "11.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", ] [[package]] @@ -12359,11 +12443,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", ] [[package]] @@ -12372,9 +12456,9 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.16", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -12383,30 +12467,30 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87413ebb313323d431e85d0afc5a68222aaed972843537cbfe5f061cf1b4bcab" dependencies = [ - "derive_more 0.99.18", + "derive_more 0.99.20", "fs-err", "static_init", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "ref-cast" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -12480,13 +12564,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" -dependencies = [ - "hostname", - "quick-error", -] +checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "rfc6979" @@ -12515,15 +12595,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.16", "libc", - "spin 0.9.8", "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -12571,8 +12650,8 @@ dependencies = [ [[package]] name = "rococo-runtime" -version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "18.0.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "binary-merkle-tree", "bitvec", @@ -12672,7 +12751,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "polkadot-primitives", @@ -12693,13 +12772,13 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" [[package]] name = "rpassword" -version = "7.3.1" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" dependencies = [ "libc", "rtoolbox", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -12716,37 +12795,40 @@ dependencies = [ "netlink-proto", "netlink-sys", "nix 0.26.4", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "rtoolbox" -version = "0.0.2" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "ruint" -version = "1.12.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", - "fastrlp", + "fastrlp 0.3.1", + "fastrlp 0.4.0", "num-bigint", + "num-integer", "num-traits", "parity-scale-codec", "primitive-types", "proptest", - "rand", + "rand 0.8.5", + "rand 0.9.1", "rlp", "ruint-macro", "serde", @@ -12774,9 +12856,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc-hex" @@ -12808,7 +12890,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.23", + "semver 1.0.26", ] [[package]] @@ -12836,9 +12918,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.27" +version = "0.37.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" dependencies = [ "bitflags 1.3.2", "errno", @@ -12850,15 +12932,28 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "errno", "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", ] [[package]] @@ -12879,22 +12974,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.8", + "ring 0.17.14", "rustls-webpki 0.101.7", "sct", ] [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "log", "once_cell", - "ring 0.17.8", + "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.3", "subtle 2.6.1", "zeroize", ] @@ -12906,22 +13001,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.4", + "rustls-pemfile", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.2.0", ] [[package]] @@ -12934,39 +13028,33 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-pki-types" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ - "rustls-pki-types", + "zeroize", ] -[[package]] -name = "rustls-pki-types" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" - [[package]] name = "rustls-platform-verifier" -version = "0.3.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" dependencies = [ - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", "once_cell", - "rustls 0.23.19", - "rustls-native-certs 0.7.3", + "rustls 0.23.27", + "rustls-native-certs 0.8.1", "rustls-platform-verifier-android", - "rustls-webpki 0.102.8", - "security-framework", + "rustls-webpki 0.103.3", + "security-framework 3.2.0", "security-framework-sys", - "webpki-roots 0.26.7", - "winapi", + "webpki-root-certs 0.26.11", + "windows-sys 0.59.0", ] [[package]] @@ -12981,26 +13069,26 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "untrusted 0.9.0", ] [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "rustls-pki-types", "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "rusty-fork" @@ -13038,9 +13126,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safe-mix" @@ -13053,9 +13141,9 @@ dependencies = [ [[package]] name = "safe_arch" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ "bytemuck", ] @@ -13072,18 +13160,18 @@ dependencies = [ [[package]] name = "sc-allocator" version = "29.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "log", "sp-core", "sp-wasm-interface", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-authority-discovery" version = "0.45.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -13092,11 +13180,11 @@ dependencies = [ "libp2p", "linked_hash_set", "log", - "multihash 0.19.2", + "multihash 0.19.3", "parity-scale-codec", "prost 0.12.6", "prost-build 0.12.6", - "rand", + "rand 0.8.5", "sc-client-api", "sc-network", "sc-network-types", @@ -13107,13 +13195,13 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-basic-authorship" version = "0.45.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "futures-timer", @@ -13135,7 +13223,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.42.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "sp-api", @@ -13150,7 +13238,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "clap", @@ -13178,18 +13266,18 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "12.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "sc-cli" version = "0.47.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "chrono", @@ -13202,7 +13290,7 @@ dependencies = [ "names", "parity-bip39", "parity-scale-codec", - "rand", + "rand 0.8.5", "regex", "rpassword", "sc-client-api", @@ -13223,14 +13311,14 @@ dependencies = [ "sp-panic-handler", "sp-runtime", "sp-version", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "sc-client-api" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "fnv", "futures", @@ -13257,7 +13345,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.44.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "hash-db", "kvdb", @@ -13283,7 +13371,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -13301,13 +13389,13 @@ dependencies = [ "sp-runtime", "sp-state-machine", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-aura" version = "0.45.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -13330,13 +13418,13 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-babe" version = "0.45.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "fork-tree", @@ -13366,13 +13454,13 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-babe-rpc" version = "0.45.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "jsonrpsee", @@ -13388,13 +13476,13 @@ dependencies = [ "sp-core", "sp-keystore", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-beefy" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "async-channel 1.9.0", @@ -13422,7 +13510,7 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", "tokio", "wasm-timer", ] @@ -13430,7 +13518,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "jsonrpsee", @@ -13444,13 +13532,13 @@ dependencies = [ "sp-consensus-beefy", "sp-core", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-epochs" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "fork-tree", "parity-scale-codec", @@ -13463,9 +13551,9 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.30.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "array-bytes", "async-trait", "dyn-clone", @@ -13476,7 +13564,7 @@ dependencies = [ "log", "parity-scale-codec", "parking_lot 0.12.3", - "rand", + "rand 0.8.5", "sc-block-builder", "sc-chain-spec", "sc-client-api", @@ -13501,13 +13589,13 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-grandpa-rpc" version = "0.30.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "finality-grandpa", "futures", @@ -13521,13 +13609,13 @@ dependencies = [ "sp-blockchain", "sp-core", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-manual-seal" version = "0.46.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "assert_matches", "async-trait", @@ -13556,13 +13644,13 @@ dependencies = [ "sp-runtime", "sp-timestamp", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-pow" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -13581,13 +13669,13 @@ dependencies = [ "sp-inherents", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-consensus-slots" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -13610,7 +13698,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.40.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "parking_lot 0.12.3", @@ -13633,20 +13721,20 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.35.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "polkavm 0.9.3", "sc-allocator", "sp-maybe-compressed-blob", "sp-wasm-interface", - "thiserror", + "thiserror 1.0.69", "wasm-instrument", ] [[package]] name = "sc-executor-polkavm" version = "0.32.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "log", "polkavm 0.9.3", @@ -13657,7 +13745,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.35.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "anyhow", "cfg-if", @@ -13675,7 +13763,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "console", "futures", @@ -13692,7 +13780,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "33.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "parking_lot 0.12.3", @@ -13700,13 +13788,13 @@ dependencies = [ "sp-application-crypto", "sp-core", "sp-keystore", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-mixnet" version = "0.15.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "arrayvec 0.7.6", @@ -13729,13 +13817,13 @@ dependencies = [ "sp-keystore", "sp-mixnet", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-network" -version = "0.45.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.45.6" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "async-channel 1.9.0", @@ -13760,7 +13848,7 @@ dependencies = [ "pin-project", "prost 0.12.6", "prost-build 0.12.6", - "rand", + "rand 0.8.5", "sc-client-api", "sc-network-common", "sc-network-types", @@ -13774,7 +13862,7 @@ dependencies = [ "sp-core", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "unsigned-varint 0.7.2", @@ -13786,7 +13874,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -13804,9 +13892,9 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.45.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "futures", "futures-timer", "log", @@ -13823,7 +13911,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.44.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "async-channel 1.9.0", @@ -13838,13 +13926,13 @@ dependencies = [ "sp-blockchain", "sp-core", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-network-statement" version = "0.27.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "async-channel 1.9.0", @@ -13864,7 +13952,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.44.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "async-channel 1.9.0", @@ -13893,7 +13981,7 @@ dependencies = [ "sp-core", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -13901,7 +13989,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.44.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "futures", @@ -13920,7 +14008,7 @@ dependencies = [ [[package]] name = "sc-network-types" version = "0.12.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bs58 0.5.1", "ed25519-dalek", @@ -13928,30 +14016,30 @@ dependencies = [ "litep2p", "log", "multiaddr 0.18.2", - "multihash 0.19.2", - "rand", - "thiserror", + "multihash 0.19.3", + "rand 0.8.5", + "thiserror 1.0.69", "zeroize", ] [[package]] name = "sc-offchain" version = "40.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "bytes", "fnv", "futures", "futures-timer", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-rustls 0.24.2", "log", "num_cpus", "once_cell", "parity-scale-codec", "parking_lot 0.12.3", - "rand", + "rand 0.8.5", "sc-client-api", "sc-network", "sc-network-common", @@ -13971,7 +14059,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -13980,7 +14068,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "40.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "jsonrpsee", @@ -14012,7 +14100,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -14026,21 +14114,21 @@ dependencies = [ "sp-rpc", "sp-runtime", "sp-version", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-rpc-server" -version = "17.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "17.1.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "dyn-clone", "forwarded-header-value", "futures", "governor", - "http 1.2.0", + "http 1.3.1", "http-body-util", - "hyper 1.5.1", + "hyper 1.6.0", "ip_network", "jsonrpsee", "log", @@ -14056,7 +14144,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.45.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "futures", @@ -14066,7 +14154,7 @@ dependencies = [ "log", "parity-scale-codec", "parking_lot 0.12.3", - "rand", + "rand 0.8.5", "sc-chain-spec", "sc-client-api", "sc-rpc", @@ -14080,7 +14168,7 @@ dependencies = [ "sp-rpc", "sp-runtime", "sp-version", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -14088,7 +14176,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.46.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "directories", @@ -14100,7 +14188,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.12.3", "pin-project", - "rand", + "rand 0.8.5", "sc-chain-spec", "sc-client-api", "sc-client-db", @@ -14143,7 +14231,7 @@ dependencies = [ "static_init", "substrate-prometheus-endpoint", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-futures", @@ -14152,7 +14240,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.36.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "log", "parity-scale-codec", @@ -14163,7 +14251,7 @@ dependencies = [ [[package]] name = "sc-statement-store" version = "19.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "log", "parity-db", @@ -14182,20 +14270,20 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.22.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "clap", "fs4", "log", "sp-core", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "sc-sync-state-rpc" version = "0.45.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -14208,19 +14296,19 @@ dependencies = [ "serde_json", "sp-blockchain", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-sysinfo" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "derive_more 0.99.18", + "derive_more 0.99.20", "futures", "libc", "log", - "rand", + "rand 0.8.5", "rand_pcg", "regex", "sc-telemetry", @@ -14235,7 +14323,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "25.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "chrono", "futures", @@ -14243,19 +14331,19 @@ dependencies = [ "log", "parking_lot 0.12.3", "pin-project", - "rand", + "rand 0.8.5", "sc-network", "sc-utils", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "wasm-timer", ] [[package]] name = "sc-tracing" version = "37.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "chrono", "console", @@ -14275,7 +14363,7 @@ dependencies = [ "sp-rpc", "sp-runtime", "sp-tracing", - "thiserror", + "thiserror 1.0.69", "tracing", "tracing-log", "tracing-subscriber", @@ -14284,18 +14372,18 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "11.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "sc-transaction-pool" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -14316,13 +14404,13 @@ dependencies = [ "sp-tracing", "sp-transaction-pool", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-transaction-pool-api" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -14332,13 +14420,13 @@ dependencies = [ "sp-blockchain", "sp-core", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sc-utils" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-channel 1.9.0", "futures", @@ -14366,7 +14454,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e98f3262c250d90e700bb802eb704e1f841e03331c2eb815e46516c4edbf5b27" dependencies = [ - "derive_more 0.99.18", + "derive_more 0.99.20", "parity-scale-codec", "scale-bits", "scale-type-resolver", @@ -14393,10 +14481,10 @@ version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -14416,11 +14504,11 @@ dependencies = [ [[package]] name = "schnellru" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "cfg-if", "hashbrown 0.13.2", ] @@ -14435,7 +14523,7 @@ dependencies = [ "arrayvec 0.7.6", "curve25519-dalek-ng", "merlin", - "rand_core", + "rand_core 0.6.4", "sha2 0.9.9", "subtle-ng", "zeroize", @@ -14453,9 +14541,9 @@ dependencies = [ "curve25519-dalek", "getrandom_or_panic", "merlin", - "rand_core", + "rand_core 0.6.4", "serde_bytes", - "sha2 0.10.8", + "sha2 0.10.9", "subtle 2.6.1", "zeroize", ] @@ -14468,9 +14556,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scratch" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" +checksum = "9f6280af86e5f559536da57a45ebc84948833b3bee313a7dd25232e09c878a52" [[package]] name = "sct" @@ -14478,7 +14566,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -14492,9 +14580,9 @@ dependencies = [ "crc", "fxhash", "log", - "rand", + "rand 0.8.5", "slab", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -14554,19 +14642,31 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.9.1", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.10.1", "core-foundation-sys", "libc", - "num-bigint", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -14601,9 +14701,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" dependencies = [ "serde", ] @@ -14631,9 +14731,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -14649,29 +14749,29 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -14758,9 +14858,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -14794,9 +14894,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -14808,7 +14908,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -14830,7 +14930,7 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cae9a3fcdadafb6d97f4c0e007e4247b114ee0f119f650c3cbf3a8b3a1479694" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", ] [[package]] @@ -14863,7 +14963,7 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "slot-range-helper" version = "15.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "enumn", "parity-scale-codec", @@ -14882,9 +14982,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "smol" @@ -14918,7 +15018,7 @@ dependencies = [ "bs58 0.5.1", "chacha20", "crossbeam-queue", - "derive_more 0.99.18", + "derive_more 0.99.20", "ed25519-zebra", "either", "event-listener 2.5.3", @@ -14939,13 +15039,13 @@ dependencies = [ "pbkdf2", "pin-project", "poly1305", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "ruzstd", "schnorrkel 0.10.2", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "sha3", "siphasher", "slab", @@ -14967,7 +15067,7 @@ dependencies = [ "async-lock 2.8.0", "base64 0.21.7", "blake2-rfc", - "derive_more 0.99.18", + "derive_more 0.99.20", "either", "event-listener 2.5.3", "fnv", @@ -14982,8 +15082,8 @@ dependencies = [ "no-std-net", "parking_lot 0.12.3", "pin-project", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "serde", "serde_json", "siphasher", @@ -15009,10 +15109,10 @@ dependencies = [ "blake2 0.10.6", "chacha20poly1305", "curve25519-dalek", - "rand_core", - "ring 0.17.8", + "rand_core 0.6.4", + "ring 0.17.14", "rustc_version 0.4.1", - "sha2 0.10.8", + "sha2 0.10.9", "subtle 2.6.1", ] @@ -15028,8 +15128,8 @@ dependencies = [ [[package]] name = "snowbridge-beacon-primitives" -version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.10.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "byte-slice-cast", "frame-support", @@ -15051,7 +15151,7 @@ dependencies = [ [[package]] name = "snowbridge-core" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "ethabi-decode", "frame-support", @@ -15074,7 +15174,7 @@ dependencies = [ [[package]] name = "snowbridge-ethereum" version = "0.9.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "ethabi-decode", "ethbloom", @@ -15100,7 +15200,7 @@ dependencies = [ "hex", "lazy_static", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "snowbridge-amcl", "zeroize", @@ -15109,7 +15209,7 @@ dependencies = [ [[package]] name = "snowbridge-outbound-queue-merkle-tree" version = "0.9.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -15120,7 +15220,7 @@ dependencies = [ [[package]] name = "snowbridge-outbound-queue-runtime-api" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "parity-scale-codec", @@ -15132,8 +15232,8 @@ dependencies = [ [[package]] name = "snowbridge-pallet-ethereum-client" -version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.10.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -15158,7 +15258,7 @@ dependencies = [ [[package]] name = "snowbridge-pallet-ethereum-client-fixtures" version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "hex-literal", "snowbridge-beacon-primitives", @@ -15169,8 +15269,8 @@ dependencies = [ [[package]] name = "snowbridge-pallet-inbound-queue" -version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.10.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -15197,8 +15297,8 @@ dependencies = [ [[package]] name = "snowbridge-pallet-inbound-queue-fixtures" -version = "0.18.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.18.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "hex-literal", "snowbridge-beacon-primitives", @@ -15210,7 +15310,7 @@ dependencies = [ [[package]] name = "snowbridge-pallet-outbound-queue" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bridge-hub-common", "ethabi-decode", @@ -15232,7 +15332,7 @@ dependencies = [ [[package]] name = "snowbridge-pallet-system" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-benchmarking", "frame-support", @@ -15251,8 +15351,8 @@ dependencies = [ [[package]] name = "snowbridge-router-primitives" -version = "0.16.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.16.1" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "hex-literal", @@ -15271,7 +15371,7 @@ dependencies = [ [[package]] name = "snowbridge-runtime-common" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "log", @@ -15286,8 +15386,8 @@ dependencies = [ [[package]] name = "snowbridge-runtime-test-common" -version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.12.0" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -15318,7 +15418,7 @@ dependencies = [ [[package]] name = "snowbridge-system-runtime-api" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "snowbridge-core", @@ -15339,9 +15439,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -15358,7 +15458,7 @@ dependencies = [ "futures", "httparse", "log", - "rand", + "rand 0.8.5", "sha-1 0.9.8", ] @@ -15371,17 +15471,17 @@ dependencies = [ "base64 0.22.1", "bytes", "futures", - "http 1.2.0", + "http 1.3.1", "httparse", "log", - "rand", + "rand 0.8.5", "sha1", ] [[package]] name = "sp-api" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "hash-db", @@ -15397,27 +15497,27 @@ dependencies = [ "sp-state-machine", "sp-trie", "sp-version", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sp-api-proc-macro" -version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "20.0.3" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "Inflector", "blake2 0.10.6", "expander", - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "sp-application-crypto" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -15429,7 +15529,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "26.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "integer-sqrt", @@ -15443,7 +15543,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -15455,7 +15555,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "sp-api", "sp-inherents", @@ -15465,7 +15565,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "37.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "futures", "parity-scale-codec", @@ -15477,14 +15577,14 @@ dependencies = [ "sp-database", "sp-runtime", "sp-state-machine", - "thiserror", + "thiserror 1.0.69", "tracing", ] [[package]] name = "sp-consensus" version = "0.40.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "futures", @@ -15493,13 +15593,13 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sp-consensus-aura" version = "0.40.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "parity-scale-codec", @@ -15515,7 +15615,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.40.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "parity-scale-codec", @@ -15533,7 +15633,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "22.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "lazy_static", "parity-scale-codec", @@ -15554,7 +15654,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "21.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "finality-grandpa", "log", @@ -15571,7 +15671,7 @@ dependencies = [ [[package]] name = "sp-consensus-pow" version = "0.40.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "sp-api", @@ -15582,7 +15682,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.40.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -15593,7 +15693,7 @@ dependencies = [ [[package]] name = "sp-core" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "bitflags 1.3.2", @@ -15616,7 +15716,7 @@ dependencies = [ "parking_lot 0.12.3", "paste", "primitive-types", - "rand", + "rand 0.8.5", "scale-info", "schnorrkel 0.11.4", "secp256k1", @@ -15630,7 +15730,7 @@ dependencies = [ "sp-storage", "ss58-registry", "substrate-bip39", - "thiserror", + "thiserror 1.0.69", "tracing", "w3f-bls", "zeroize", @@ -15639,7 +15739,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "sp-crypto-hashing", ] @@ -15647,7 +15747,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "sp-crypto-hashing-proc-macro", ] @@ -15655,7 +15755,7 @@ dependencies = [ [[package]] name = "sp-crypto-ec-utils" version = "0.14.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -15675,12 +15775,12 @@ dependencies = [ [[package]] name = "sp-crypto-hashing" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "blake2b_simd", "byteorder", "digest 0.10.7", - "sha2 0.10.8", + "sha2 0.10.9", "sha3", "twox-hash", ] @@ -15688,17 +15788,17 @@ dependencies = [ [[package]] name = "sp-crypto-hashing-proc-macro" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "quote", "sp-crypto-hashing", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "sp-database" version = "10.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "kvdb", "parking_lot 0.12.3", @@ -15707,17 +15807,17 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "sp-externalities" version = "0.29.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "environmental", "parity-scale-codec", @@ -15727,7 +15827,7 @@ dependencies = [ [[package]] name = "sp-genesis-builder" version = "0.15.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -15739,20 +15839,20 @@ dependencies = [ [[package]] name = "sp-inherents" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "impl-trait-for-tuples", "parity-scale-codec", "scale-info", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sp-io" -version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "38.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bytes", "docify", @@ -15778,7 +15878,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "39.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "sp-core", "sp-runtime", @@ -15788,7 +15888,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.40.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "parking_lot 0.12.3", @@ -15799,16 +15899,16 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "11.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "thiserror", + "thiserror 1.0.69", "zstd 0.12.4", ] [[package]] name = "sp-metadata-ir" version = "0.7.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -15818,7 +15918,7 @@ dependencies = [ [[package]] name = "sp-mixnet" version = "0.12.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -15829,7 +15929,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "34.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "log", "parity-scale-codec", @@ -15840,13 +15940,13 @@ dependencies = [ "sp-core", "sp-debug-derive", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sp-npos-elections" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -15859,7 +15959,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "sp-api", "sp-core", @@ -15869,7 +15969,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "13.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "backtrace", "lazy_static", @@ -15879,7 +15979,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "32.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "rustc-hash 1.1.0", "serde", @@ -15888,8 +15988,8 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "39.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "39.0.5" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "either", @@ -15899,7 +15999,7 @@ dependencies = [ "num-traits", "parity-scale-codec", "paste", - "rand", + "rand 0.8.5", "scale-info", "serde", "simple-mermaid", @@ -15915,7 +16015,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "28.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -15934,20 +16034,20 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "Inflector", "expander", - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "sp-session" version = "36.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "scale-info", @@ -15961,7 +16061,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "36.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -15974,19 +16074,19 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.43.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "hash-db", "log", "parity-scale-codec", "parking_lot 0.12.3", - "rand", + "rand 0.8.5", "smallvec", "sp-core", "sp-externalities", "sp-panic-handler", "sp-trie", - "thiserror", + "thiserror 1.0.69", "tracing", "trie-db", ] @@ -15994,16 +16094,16 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "18.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "aes-gcm", "curve25519-dalek", "ed25519-dalek", "hkdf", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", - "sha2 0.10.8", + "sha2 0.10.9", "sp-api", "sp-application-crypto", "sp-core", @@ -16011,19 +16111,19 @@ dependencies = [ "sp-externalities", "sp-runtime", "sp-runtime-interface", - "thiserror", + "thiserror 1.0.69", "x25519-dalek", ] [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" [[package]] name = "sp-storage" version = "21.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "impl-serde", "parity-scale-codec", @@ -16035,19 +16135,19 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "parity-scale-codec", "sp-inherents", "sp-runtime", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sp-tracing" version = "17.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "tracing", @@ -16058,7 +16158,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "sp-api", "sp-runtime", @@ -16067,7 +16167,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "34.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "parity-scale-codec", @@ -16081,21 +16181,21 @@ dependencies = [ [[package]] name = "sp-trie" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "hash-db", "lazy_static", "memory-db", "nohash-hasher", "parity-scale-codec", "parking_lot 0.12.3", - "rand", + "rand 0.8.5", "scale-info", "schnellru", "sp-core", "sp-externalities", - "thiserror", + "thiserror 1.0.69", "tracing", "trie-db", "trie-root", @@ -16104,7 +16204,7 @@ dependencies = [ [[package]] name = "sp-version" version = "37.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "impl-serde", "parity-scale-codec", @@ -16115,24 +16215,24 @@ dependencies = [ "sp-runtime", "sp-std", "sp-version-proc-macro", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "sp-version-proc-macro" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "sp-wasm-interface" version = "21.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -16144,7 +16244,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "31.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "bounded-collections", "parity-scale-codec", @@ -16244,7 +16344,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "staging-chain-spec-builder" version = "6.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "clap", "log", @@ -16256,7 +16356,7 @@ dependencies = [ [[package]] name = "staging-node-inspect" version = "0.23.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "clap", "parity-scale-codec", @@ -16268,13 +16368,13 @@ dependencies = [ "sp-io", "sp-runtime", "sp-statement-store", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "staging-parachain-info" version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -16287,12 +16387,12 @@ dependencies = [ [[package]] name = "staging-tracking-allocator" version = "2.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" [[package]] name = "staging-xcm" -version = "14.2.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "14.2.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "bounded-collections", @@ -16310,8 +16410,8 @@ dependencies = [ [[package]] name = "staging-xcm-builder" -version = "17.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "17.0.5" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -16332,8 +16432,8 @@ dependencies = [ [[package]] name = "staging-xcm-executor" -version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "17.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "environmental", "frame-benchmarking", @@ -16358,26 +16458,26 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "static_init" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" +checksum = "8bae1df58c5fea7502e8e352ec26b5579f6178e1fdb311e088580c980dee25ed" dependencies = [ "bitflags 1.3.2", - "cfg_aliases", + "cfg_aliases 0.2.1", "libc", - "parking_lot 0.11.2", - "parking_lot_core 0.8.6", + "parking_lot 0.12.3", + "parking_lot_core 0.9.10", "static_init_macro", "winapi", ] [[package]] name = "static_init_macro" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" +checksum = "1389c88ddd739ec6d3f8f83343764a0e944cd23cfbf126a9796a714b0b6edd6f" dependencies = [ - "cfg_aliases", + "cfg_aliases 0.1.1", "memchr", "proc-macro2", "quote", @@ -16392,7 +16492,7 @@ checksum = "6706347e49b13373f7ddfafad47df7583ed52083d6fc8a594eb2c80497ef959d" dependencies = [ "combine", "crc", - "fastrand 2.2.0", + "fastrand 2.3.0", "hmac 0.12.1", "once_cell", "openssl", @@ -16400,7 +16500,7 @@ dependencies = [ "sctp-proto", "serde", "sha-1 0.10.1", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -16462,13 +16562,13 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "subkey" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "clap", "sc-cli", @@ -16477,24 +16577,24 @@ dependencies = [ [[package]] name = "substrate-bip39" version = "0.6.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "hmac 0.12.1", "pbkdf2", "schnorrkel 0.11.4", - "sha2 0.10.8", + "sha2 0.10.9", "zeroize", ] [[package]] name = "substrate-build-script-utils" version = "11.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" [[package]] name = "substrate-frame-rpc-support" version = "40.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "jsonrpsee", @@ -16507,7 +16607,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "39.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "docify", "frame-system-rpc-runtime-api", @@ -16527,21 +16627,21 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.17.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "http-body-util", - "hyper 1.5.1", + "hyper 1.6.0", "hyper-util", "log", "prometheus", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "substrate-rpc-client" version = "0.44.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "async-trait", "jsonrpsee", @@ -16554,7 +16654,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "38.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -16570,8 +16670,8 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" -version = "24.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "24.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "array-bytes", "build-helper", @@ -16592,7 +16692,7 @@ dependencies = [ "sp-version", "strum 0.26.3", "tempfile", - "toml 0.8.19", + "toml 0.8.22", "walkdir", "wasm-opt", ] @@ -16628,9 +16728,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -16646,7 +16746,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -16663,13 +16763,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -16678,8 +16778,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.9.1", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -16707,14 +16807,14 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.14.0" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "cfg-if", - "fastrand 2.2.0", + "fastrand 2.3.0", + "getrandom 0.3.3", "once_cell", - "rustix 0.38.41", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -16729,19 +16829,19 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" +checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" dependencies = [ - "rustix 0.38.41", + "rustix 1.0.7", "windows-sys 0.59.0", ] [[package]] name = "termtree" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "test-utils" @@ -16763,7 +16863,7 @@ dependencies = [ [[package]] name = "testnet-parachains-constants" version = "10.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -16781,7 +16881,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -16801,7 +16910,7 @@ checksum = "e4c60d69f36615a077cc7663b9cb8e42275722d23e58a7fa3d2c7f2915d09d04" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -16812,7 +16921,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -16876,9 +16996,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -16891,15 +17011,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -16916,9 +17036,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -16926,9 +17046,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -16941,9 +17061,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -16952,20 +17072,20 @@ dependencies = [ "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.8", + "socket2 0.5.10", "tokio-macros", "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -16975,7 +17095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" dependencies = [ "pin-project", - "rand", + "rand 0.8.5", "tokio", ] @@ -16991,20 +17111,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.19", - "rustls-pki-types", + "rustls 0.23.27", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -17029,9 +17148,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -17052,9 +17171,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", @@ -17064,26 +17183,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + [[package]] name = "torus-node" version = "0.1.0" @@ -17104,6 +17230,7 @@ dependencies = [ "futures", "futures-timer", "jsonrpsee", + "pallet-permission0-rpc", "polkadot-sdk", "serde_json", "torus-runtime", @@ -17158,9 +17285,9 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "bytes", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "pin-project-lite", @@ -17200,7 +17327,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -17226,7 +17353,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "coarsetime", "polkadot-primitives", @@ -17237,13 +17364,13 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "expander", - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -17314,10 +17441,10 @@ dependencies = [ "idna 0.2.3", "ipnet", "lazy_static", - "rand", + "rand 0.8.5", "smallvec", "socket2 0.4.10", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tokio", "tracing", @@ -17340,9 +17467,9 @@ dependencies = [ "idna 0.4.0", "ipnet", "once_cell", - "rand", + "rand 0.8.5", "smallvec", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tokio", "tracing", @@ -17361,10 +17488,10 @@ dependencies = [ "lru-cache", "once_cell", "parking_lot 0.12.3", - "rand", + "rand 0.8.5", "resolv-conf", "smallvec", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "trust-dns-proto 0.23.2", @@ -17394,10 +17521,10 @@ dependencies = [ "http 0.2.12", "httparse", "log", - "rand", + "rand 0.8.5", "rustls 0.21.12", "sha1", - "thiserror", + "thiserror 1.0.69", "url", "utf-8", ] @@ -17416,15 +17543,15 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand", + "rand 0.8.5", "static_assertions", ] [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" @@ -17452,15 +17579,15 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -17472,10 +17599,10 @@ dependencies = [ ] [[package]] -name = "unicode-width" -version = "0.1.14" +name = "unicode-segmentation" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" @@ -17550,12 +17677,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -17570,9 +17691,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -17594,9 +17715,9 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "w3f-bls" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a3028804c8bbae2a97a15b71ffc0e308c4b01a520994aafa77d56e94e19024" +checksum = "e6bfb937b3d12077654a9e43e32a4e9c20177dd9fea0f3aba673e7840bb54f32" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -17605,22 +17726,20 @@ dependencies = [ "ark-serialize 0.4.2", "ark-serialize-derive", "arrayref", - "constcat", "digest 0.10.7", - "rand", - "rand_chacha", - "rand_core", - "sha2 0.10.8", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "sha2 0.10.9", "sha3", - "thiserror", "zeroize", ] [[package]] name = "wait-timeout" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] @@ -17656,46 +17775,55 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasix" version = "0.12.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1fbb4ef9bbca0c1170e0b00dd28abc9e3b68669821600cad1caaed606583c6d" dependencies = [ - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "wasm-bindgen" -version = "0.2.97" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.97" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.47" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -17706,9 +17834,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.97" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -17716,22 +17844,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.97" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.97" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-instrument" @@ -17753,7 +17884,7 @@ dependencies = [ "strum 0.24.1", "strum_macros 0.24.3", "tempfile", - "thiserror", + "thiserror 1.0.69", "wasm-opt-cxx-sys", "wasm-opt-sys", ] @@ -17839,7 +17970,7 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c128c039340ffd50d4195c3f8ce31aac357f06804cfc494c8b9508d4b30dca4" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "hashbrown 0.14.5", "string-interner", ] @@ -17938,7 +18069,7 @@ dependencies = [ "log", "rustix 0.36.17", "serde", - "sha2 0.10.8", + "sha2 0.10.9", "toml 0.5.11", "windows-sys 0.45.0", "zstd 0.11.2+zstd.1.5.2", @@ -17960,7 +18091,7 @@ dependencies = [ "log", "object 0.30.4", "target-lexicon", - "thiserror", + "thiserror 1.0.69", "wasmparser", "wasmtime-cranelift-shared", "wasmtime-environ", @@ -17995,7 +18126,7 @@ dependencies = [ "object 0.30.4", "serde", "target-lexicon", - "thiserror", + "thiserror 1.0.69", "wasmparser", "wasmtime-types", ] @@ -18062,7 +18193,7 @@ dependencies = [ "memfd", "memoffset", "paste", - "rand", + "rand 0.8.5", "rustix 0.36.17", "wasmtime-asm-macros", "wasmtime-environ", @@ -18078,15 +18209,15 @@ checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" dependencies = [ "cranelift-entity", "serde", - "thiserror", + "thiserror 1.0.69", "wasmparser", ] [[package]] name = "web-sys" -version = "0.3.74" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -18108,29 +18239,38 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "untrusted 0.9.0", ] [[package]] -name = "webpki-roots" -version = "0.25.4" +name = "webpki-root-certs" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.0", +] [[package]] -name = "webpki-roots" -version = "0.26.7" +name = "webpki-root-certs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "01a83f7e1a9f8712695c03eabe9ed3fbca0feff0152f33f12593e5a6303cb1a4" dependencies = [ "rustls-pki-types", ] +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + [[package]] name = "westend-runtime" -version = "18.0.1" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "18.0.2" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "binary-merkle-tree", "bitvec", @@ -18238,7 +18378,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "polkadot-primitives", @@ -18260,14 +18400,14 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.41", + "rustix 0.38.44", ] [[package]] name = "wide" -version = "0.7.30" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e6db2670d2be78525979e9a5f9c69d296fd7d670549fe9ebf70f8708cb5019" +checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" dependencies = [ "bytemuck", "safe_arch", @@ -18275,9 +18415,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -18322,23 +18462,55 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd" dependencies = [ + "windows-result 0.1.2", "windows-targets 0.52.6", ] [[package]] name = "windows-core" -version = "0.53.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-result", - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result 0.3.4", + "windows-strings", ] +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + [[package]] name = "windows-result" version = "0.1.2" @@ -18348,6 +18520,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -18438,13 +18628,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -18463,6 +18669,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -18481,6 +18693,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -18499,12 +18717,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -18523,6 +18753,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -18541,6 +18777,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -18559,6 +18801,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -18577,11 +18825,17 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" -version = "0.6.20" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] @@ -18597,16 +18851,19 @@ dependencies = [ ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wyz" @@ -18624,7 +18881,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", - "rand_core", + "rand_core 0.6.4", "serde", "zeroize", ] @@ -18642,7 +18899,7 @@ dependencies = [ "nom", "oid-registry 0.6.1", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -18659,25 +18916,25 @@ dependencies = [ "nom", "oid-registry 0.7.1", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "xcm-procedural" version = "10.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "xcm-runtime-apis" -version = "0.4.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +version = "0.4.3" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "parity-scale-codec", @@ -18691,7 +18948,7 @@ dependencies = [ [[package]] name = "xcm-simulator" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#981d6c0fa87a00b72bb3b6211d1e71deed21f0cc" +source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=stable2409#492786da44f1b8ac433f6d98b659d96d2e74e0fc" dependencies = [ "frame-support", "frame-system", @@ -18727,9 +18984,9 @@ checksum = "672423d4fea7ffa2f6c25ba60031ea13dc6258070556f125cc4d790007d4a155" [[package]] name = "xml-rs" -version = "0.8.24" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "xmltree" @@ -18765,7 +19022,7 @@ dependencies = [ "nohash-hasher", "parking_lot 0.12.3", "pin-project", - "rand", + "rand 0.8.5", "static_assertions", ] @@ -18780,9 +19037,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -18792,56 +19049,55 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", - "synstructure 0.13.1", + "syn 2.0.101", + "synstructure 0.13.2", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", - "synstructure 0.13.1", + "syn 2.0.101", + "synstructure 0.13.2", ] [[package]] @@ -18861,14 +19117,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -18877,13 +19144,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -18926,9 +19193,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index ae028598..ef0dd48a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "runtime", "pallets/*", "pallets/*/api", + "pallets/*/rpc", "test-utils", "xtask", ] @@ -13,6 +14,15 @@ resolver = "2" authors = ["Renlabs "] edition = "2021" +[workspace.lints.clippy] +all = "deny" +arithmetic_side_effects = "deny" +indexing_slicing = "deny" +panicking_unwrap = "deny" +out_of_bounds_indexing = "deny" +match_bool = "deny" +infinite_loop = "deny" + [workspace.dependencies] # Local @@ -27,6 +37,7 @@ pallet-torus0 = { path = "./pallets/torus0", default-features = false } pallet-torus0-api = { path = "./pallets/torus0/api", default-features = false } pallet-permission0 = { path = "./pallets/permission0", default-features = false } pallet-permission0-api = { path = "./pallets/permission0/api", default-features = false } +pallet-permission0-rpc = { path = "./pallets/permission0/rpc", default-features = false } test-utils.path = "./test-utils" # Substrate @@ -36,10 +47,11 @@ polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk.git", branch substrate-wasm-builder = { git = "https://github.com/paritytech/polkadot-sdk.git", branch = "stable2409", default-features = false } # Utils +async-trait = "0.1.88" num-traits = { version = "0.2.19", default-features = false, features = [ "libm", ] } -bitflags = { version = "2.5.0", default-features = false } +bitflags = { version = "2.9.1", default-features = false } # Frontier / EVM fc-api = { git = "https://github.com/paritytech/frontier.git", rev = "b9b1c620c8b418bdeeadc79725f9cfa4703c0333" } diff --git a/flake.lock b/flake.lock index 58d87316..60b8f9a4 100644 --- a/flake.lock +++ b/flake.lock @@ -57,16 +57,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1741445498, - "narHash": "sha256-F5Em0iv/CxkN5mZ9hRn3vPknpoWdcdCyR0e4WklHwiE=", + "lastModified": 1748162331, + "narHash": "sha256-rqc2RKYTxP3tbjA+PB3VMRQNnjesrT0pEofXQTrMsS8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "52e3095f6d812b91b22fb7ad0bfc1ab416453634", + "rev": "7c43f080a7f28b2774f3b3f43234ca11661bf334", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-24.11", + "ref": "nixos-25.05", "repo": "nixpkgs", "type": "github" } @@ -80,11 +80,11 @@ ] }, "locked": { - "lastModified": 1741379162, - "narHash": "sha256-srpAbmJapkaqGRE3ytf3bj4XshspVR5964OX5LfjDWc=", + "lastModified": 1747372754, + "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "b5a62751225b2f62ff3147d0a334055ebadcd5cc", + "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", "type": "github" }, "original": { @@ -108,11 +108,11 @@ ] }, "locked": { - "lastModified": 1741573199, - "narHash": "sha256-A2sln1GdCf+uZ8yrERSCZUCqZ3JUlOv1WE2VFqqfaLQ=", + "lastModified": 1748313401, + "narHash": "sha256-x5UuDKP2Ui/TresAngUo9U4Ss9xfOmN8dAXU8OrkZmA=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "c777dc8a1e35407b0e80ec89817fe69970f4e81a", + "rev": "9c8ea175cf9af29edbcff121512e44092a8f37e4", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 44af69fe..be0fead6 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Torus Substrate development environment"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; flake-utils.url = "github:numtide/flake-utils"; @@ -32,14 +32,21 @@ else generalBuildInputs ++ [ pkgs.darwin.apple_sdk.frameworks.SystemConfiguration ]; - nativeBuildInputs = with pkgs; [ git rust clang protobuf sccache ]; + nativeBuildInputs = with pkgs; [ + git + llvmPackages_17.stdenv + llvmPackages_17.libcxx + llvmPackages_17.libcxxStdenv + llvmPackages_17.clang-unwrapped + rust + protobuf + sccache + ]; shellPkgs = [ pkgs.bashInteractive # Run project-specific commands pkgs.just - # Run Github actions locally - pkgs.act # Python pkgs.python310 # # Code coverage tool @@ -55,13 +62,26 @@ }; devShells.default = pkgs.mkShell { - inherit (self.checks.${system}.pre-commit-check) shellHook; buildInputs = buildInputs; nativeBuildInputs = nativeBuildInputs; packages = shellPkgs; + shellHook = '' + ${self.checks.${system}.pre-commit-check.shellHook} + + # Correct paths to build RocksDB and WASM-OPT. + # Don't touch it unless you know what you are doing. + export C_INCLUDE_PATH="${pkgs.llvmPackages_17.clang-unwrapped.lib}/lib/clang/17/include" + export CPLUS_INCLUDE_PATH="${pkgs.llvmPackages_17.libcxx.dev}/include/c++/v1:${pkgs.llvmPackages_17.clang-unwrapped.lib}/lib/clang/17/include" + + # Ensure clang-17 is prioritized in PATH. Oxalica's Rust Overlay + # also ships clang-19 but current polkadot dependencies require 17. + export PATH="${pkgs.llvmPackages_17.clang-unwrapped}/bin:$PATH" + echo "Using clang version: $(clang --version | head -n1)" + ''; + env = { - LIBCLANG_PATH = "${pkgs.libclang.lib}/lib"; + LIBCLANG_PATH = "${pkgs.llvmPackages_17.clang-unwrapped.lib}/lib"; ROCKSDB_LIB_DIR = "${pkgs.rocksdb}/lib"; ZSTD_SYS_USE_PKG_CONFIG = "true"; OPENSSL_NO_VENDOR = "1"; diff --git a/node/Cargo.toml b/node/Cargo.toml index 91bc62ef..3346f5a7 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -15,7 +15,6 @@ runtime-benchmarks = [ ] testnet = ["torus-runtime/testnet"] - [dependencies] clap = { workspace = true, features = ["derive"] } @@ -107,7 +106,7 @@ fp-rpc = { workspace = true, features = ["default"] } # Local torus-runtime.workspace = true - +pallet-permission0-rpc.workspace = true [build-dependencies] polkadot-sdk = { workspace = true, features = ["substrate-build-script-utils"] } diff --git a/node/src/rpc.rs b/node/src/rpc.rs index 4a419d26..4cb3e9e9 100644 --- a/node/src/rpc.rs +++ b/node/src/rpc.rs @@ -27,6 +27,7 @@ use std::sync::Arc; use eth::EthDeps; use futures::channel::mpsc; use jsonrpsee::RpcModule; +use pallet_permission0_rpc::{Permission0Rpc, Permission0StreamApiServer}; use polkadot_sdk::{ pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}, sc_consensus_manual_seal::{ @@ -84,7 +85,8 @@ where } = deps; io.merge(System::new(client.clone(), pool).into_rpc())?; - io.merge(TransactionPayment::new(client).into_rpc())?; + io.merge(TransactionPayment::new(client.clone()).into_rpc())?; + io.merge(Permission0Rpc::new(client).into_rpc())?; if let Some(command_sink) = command_sink { io.merge( diff --git a/node/src/service.rs b/node/src/service.rs index 331e03d9..693f1429 100644 --- a/node/src/service.rs +++ b/node/src/service.rs @@ -153,20 +153,19 @@ type InherentDataProviders = ( fp_dynamic_fee::InherentDataProvider, ); -fn aura_data_provider( - slot_duration: sp_consensus_aura::SlotDuration, - eth_config: &EthConfiguration, -) -> impl Fn( - sp_core::H256, - (), -) -> Pin< +type AuraData = Pin< Box< dyn std::future::Future< Output = Result>, > + Send + Sync, >, -> { +>; + +fn aura_data_provider( + slot_duration: sp_consensus_aura::SlotDuration, + eth_config: &EthConfiguration, +) -> impl Fn(sp_core::H256, ()) -> AuraData { let target_gas_price = eth_config.target_gas_price; move |_, ()| { Box::pin(async move { diff --git a/pallets/emission0/Cargo.toml b/pallets/emission0/Cargo.toml index 0e83d6d3..58eb174d 100644 --- a/pallets/emission0/Cargo.toml +++ b/pallets/emission0/Cargo.toml @@ -6,6 +6,9 @@ license = "MIT-0" authors.workspace = true edition.workspace = true +[lints] +workspace = true + [features] default = ["std"] std = [ diff --git a/pallets/emission0/api/Cargo.toml b/pallets/emission0/api/Cargo.toml index 1239159e..d4b6ebeb 100644 --- a/pallets/emission0/api/Cargo.toml +++ b/pallets/emission0/api/Cargo.toml @@ -6,6 +6,9 @@ license = "MIT-0" authors.workspace = true edition.workspace = true +[lints] +workspace = true + [features] default = ["std"] std = ["polkadot-sdk/std"] diff --git a/pallets/emission0/src/distribute.rs b/pallets/emission0/src/distribute.rs index 70375c6c..730165ca 100644 --- a/pallets/emission0/src/distribute.rs +++ b/pallets/emission0/src/distribute.rs @@ -74,10 +74,13 @@ pub fn get_total_emission_per_block() -> BalanceOf { } let interval = T::HalvingInterval::get(); - let halving_count = total_issuance.saturating_div(interval.get()); + let halving_count = total_issuance + .checked_div(interval.get()) + .unwrap_or_default(); let emission = T::BlockEmission::get() >> halving_count; - let not_recycled = Percent::one() - crate::EmissionRecyclingPercentage::::get(); + let not_recycled = + Percent::one().saturating_sub(crate::EmissionRecyclingPercentage::::get()); not_recycled.mul_floor(emission) } @@ -168,8 +171,9 @@ impl ConsensusMemberInput { } if total_network_stake != 0.into() { - input.normalized_stake = - FixedU128::from_inner(input.total_stake) / total_network_stake; + input.normalized_stake = FixedU128::from_inner(input.total_stake) + .const_checked_div(total_network_stake) + .unwrap_or_default(); } } @@ -184,7 +188,8 @@ impl ConsensusMemberInput { weights: Weights, min_validator_stake: u128, ) -> ConsensusMemberInput { - let weight_factor = Percent::one() - ::weight_penalty_factor(&agent_id); + let weight_factor = + Percent::one().saturating_sub(::weight_penalty_factor(&agent_id)); let mut total_stake = 0; let stakes = ::staked_by(&agent_id) @@ -239,7 +244,7 @@ impl ConsensusMemberInput { if weights_sum > 0.into() { for (_, weight) in weights.iter_mut() { - *weight = *weight / weights_sum; + *weight = weight.const_checked_div(weights_sum).unwrap_or_default(); } } @@ -429,7 +434,7 @@ fn compute_emissions( .collect(); let emission_sum = combined_emission .iter() - .fold(FixedU128::default(), |acc, &e| acc + e); + .fold(FixedU128::default(), |acc, &e| acc.saturating_add(e)); let normalized_incentives = math::normalize_with_sum(incentives, emission_sum); let normalized_dividends = if emission_sum == 0.into() { @@ -457,12 +462,12 @@ fn compute_emissions( let dividends_to_be_emitted; if let Some(incentives_ratio) = incentives_ratio.checked_sub(50) { - let incentives_percentage = Percent::from_parts(incentives_ratio * 2); + let incentives_percentage = Percent::from_parts(incentives_ratio.saturating_mul(2)); let incentives = incentives_percentage.mul_floor(to_be_emitted); incentives_to_be_emitted = to_be_emitted.saturating_add(incentives); dividends_to_be_emitted = to_be_emitted.saturating_sub(incentives); } else if let Some(dividends_ratio) = 50u8.checked_sub(incentives_ratio) { - let dividends_percentage = Percent::from_parts(dividends_ratio * 2); + let dividends_percentage = Percent::from_parts(dividends_ratio.saturating_mul(2)); let dividends = dividends_percentage.mul_floor(to_be_emitted); dividends_to_be_emitted = to_be_emitted.saturating_add(dividends); incentives_to_be_emitted = to_be_emitted.saturating_sub(dividends); diff --git a/pallets/emission0/src/distribute/math.rs b/pallets/emission0/src/distribute/math.rs index 9190223c..53516bb8 100644 --- a/pallets/emission0/src/distribute/math.rs +++ b/pallets/emission0/src/distribute/math.rs @@ -9,7 +9,9 @@ use polkadot_sdk::{ }; pub fn normalize(x: Vec) -> Vec { - let sum: FixedU128 = x.iter().fold(FixedU128::default(), |acc, &e| acc + e); + let sum: FixedU128 = x + .iter() + .fold(FixedU128::default(), |acc, &e| acc.saturating_add(e)); normalize_with_sum(x, sum) } @@ -20,7 +22,7 @@ pub fn normalize_with_sum(mut x: Vec, sum: FixedU128) -> Vec, sum: FixedU128) -> Vec]) { for row in x { - let row_sum: FixedU128 = row.iter().fold(FixedU128::default(), |acc, &e| acc + e); + let row_sum: FixedU128 = row + .iter() + .fold(FixedU128::default(), |acc, &e| acc.saturating_add(e)); if row_sum > FixedU128::from_inner(0) { row.iter_mut().for_each(|x_ij: &mut FixedU128| { *x_ij = x_ij.const_checked_div(row_sum).unwrap_or_default(); @@ -79,7 +83,7 @@ pub fn col_normalize_sparse( continue; }; if *col_sum_j != 0.into() { - *value = *value / *col_sum_j; + *value = value.const_checked_div(*col_sum_j).unwrap_or_default(); } } } @@ -136,7 +140,7 @@ pub fn vec_max_upscale_to_u16(vec: &[FixedU128]) -> Vec { return vec![0; vec.len()]; }; - let ratio = MAX / *max_ele; + let ratio = MAX.const_checked_div(*max_ele).unwrap_or_default(); vec.iter() .map(|e| { diff --git a/pallets/emission0/tests/distribution.rs b/pallets/emission0/tests/distribution.rs index 93044b95..072f8eb2 100644 --- a/pallets/emission0/tests/distribution.rs +++ b/pallets/emission0/tests/distribution.rs @@ -1,3 +1,5 @@ +#![allow(clippy::indexing_slicing)] + use std::array::from_fn; use pallet_emission0::{ diff --git a/pallets/faucet/Cargo.toml b/pallets/faucet/Cargo.toml index 7189fbfd..fa880fc2 100644 --- a/pallets/faucet/Cargo.toml +++ b/pallets/faucet/Cargo.toml @@ -6,6 +6,9 @@ license = "MIT-0" authors.workspace = true edition.workspace = true +[lints] +workspace = true + [features] default = ["std"] std = ["codec/std", "polkadot-sdk/std", "scale-info/std"] diff --git a/pallets/faucet/tests/faucet.rs b/pallets/faucet/tests/faucet.rs index bba9e9f1..1413e8de 100644 --- a/pallets/faucet/tests/faucet.rs +++ b/pallets/faucet/tests/faucet.rs @@ -1,4 +1,4 @@ -#![allow(unused)] +#![allow(unused, clippy::arithmetic_side_effects)] use std::{cell::RefCell, io::Read, num::NonZeroU128}; diff --git a/pallets/governance/Cargo.toml b/pallets/governance/Cargo.toml index eafb18f4..49592495 100644 --- a/pallets/governance/Cargo.toml +++ b/pallets/governance/Cargo.toml @@ -6,6 +6,9 @@ license = "MIT-0" authors.workspace = true edition.workspace = true +[lints] +workspace = true + [features] default = ["std"] std = [ diff --git a/pallets/governance/api/Cargo.toml b/pallets/governance/api/Cargo.toml index cc447300..d52f9e37 100644 --- a/pallets/governance/api/Cargo.toml +++ b/pallets/governance/api/Cargo.toml @@ -6,6 +6,9 @@ license = "MIT-0" authors.workspace = true edition.workspace = true +[lints] +workspace = true + [features] default = ["std"] std = ["polkadot-sdk/std"] diff --git a/pallets/governance/src/application.rs b/pallets/governance/src/application.rs index 2c96a00a..b640e009 100644 --- a/pallets/governance/src/application.rs +++ b/pallets/governance/src/application.rs @@ -3,7 +3,7 @@ use polkadot_sdk::{ frame_election_provider_support::Get, frame_support::{dispatch::DispatchResult, traits::Currency, DebugNoBound}, polkadot_sdk_frame::prelude::BlockNumberFor, - sp_runtime::BoundedVec, + sp_runtime::{traits::Saturating, BoundedVec}, sp_std::vec::Vec, }; use scale_info::TypeInfo; @@ -101,7 +101,7 @@ pub fn submit_application( } let expires_at = >::block_number() - + config.agent_application_expiration; + .saturating_add(config.agent_application_expiration); let next_id = AgentApplications::::iter() .count() diff --git a/pallets/governance/src/proposal.rs b/pallets/governance/src/proposal.rs index 240f1ef3..3ad2e355 100644 --- a/pallets/governance/src/proposal.rs +++ b/pallets/governance/src/proposal.rs @@ -49,13 +49,12 @@ impl Proposal { /// are only executed on the expiration block. pub fn execution_block(&self) -> BlockNumberFor { match self.data { - ProposalData::Emission { .. } => { - self.creation_block - + U256::from(21_600) - .try_into() - .ok() - .expect("this is a safe conversion") - } + ProposalData::Emission { .. } => self.creation_block.saturating_add( + U256::from(21_600) + .try_into() + .ok() + .expect("this is a safe conversion"), + ), _ => self.expiration_block, } } @@ -434,7 +433,7 @@ fn add_proposal( let proposal = Proposal:: { id: proposal_id, proposer, - expiration_block: current_block + config.proposal_expiration, + expiration_block: current_block.saturating_add(config.proposal_expiration), data, status: ProposalStatus::Open { votes_for: BoundedBTreeSet::new(), diff --git a/pallets/governance/tests/proposal.rs b/pallets/governance/tests/proposal.rs index 3661a3d4..b3a22440 100644 --- a/pallets/governance/tests/proposal.rs +++ b/pallets/governance/tests/proposal.rs @@ -1,3 +1,5 @@ +#![allow(clippy::arithmetic_side_effects)] + use pallet_governance::{ config::GovernanceConfiguration, proposal::{GlobalParamsData, ProposalStatus}, diff --git a/pallets/governance/tests/roles.rs b/pallets/governance/tests/roles.rs index bb002e11..d19228f9 100644 --- a/pallets/governance/tests/roles.rs +++ b/pallets/governance/tests/roles.rs @@ -1,3 +1,5 @@ +#![allow(unused, clippy::arithmetic_side_effects)] + use pallet_governance::{GlobalGovernanceConfig, Whitelist}; use pallet_permission0_api::CuratorPermissions; use polkadot_sdk::{frame_support::assert_err, sp_runtime::Percent}; diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index 8b615adc..fb7ffe16 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -1,3 +1,5 @@ +#![allow(unused, clippy::arithmetic_side_effects)] + use pallet_emission0::PendingEmission; use pallet_governance::{ proposal::{Proposal, ProposalData, ProposalStatus}, diff --git a/pallets/permission0/Cargo.toml b/pallets/permission0/Cargo.toml index 4892401a..60b60b8c 100644 --- a/pallets/permission0/Cargo.toml +++ b/pallets/permission0/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "MIT-0" +[lints] +workspace = true + [features] default = ["std"] std = [ diff --git a/pallets/permission0/api/Cargo.toml b/pallets/permission0/api/Cargo.toml index c5df3db8..04d224ab 100644 --- a/pallets/permission0/api/Cargo.toml +++ b/pallets/permission0/api/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "MIT-0" +[lints] +workspace = true + [features] default = ["std"] std = [ diff --git a/pallets/permission0/api/src/lib.rs b/pallets/permission0/api/src/lib.rs index 9d7c1c13..37bc378f 100644 --- a/pallets/permission0/api/src/lib.rs +++ b/pallets/permission0/api/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(not(feature = "std"), no_std)] +#![allow(clippy::multiple_bound_locations)] use codec::{Decode, Encode}; use polkadot_sdk::{ @@ -26,16 +27,6 @@ pub fn generate_root_stream_id(agent_id: &AccountId) -> Strea blake2_256(&data).into() } -/// Generates a derived stream ID based on source stream and permission -pub fn generate_derived_stream_id( - source_stream: &StreamId, - permission_id: &PermissionId, -) -> StreamId { - let mut data = source_stream.encode(); - data.extend(permission_id.encode()); - blake2_256(&data).into() -} - /// Defines what portion of emissions the permission applies to #[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] pub enum EmissionAllocation { @@ -171,3 +162,14 @@ pub trait Permission0CuratorApi { /// Finds the curator permission granted to [`grantee`]. fn get_curator_permission(grantee: &AccountId) -> Option; } + +polkadot_sdk::sp_api::decl_runtime_apis! { + /// A set of helper functions for permission and streams + /// queries. + pub trait Permission0RuntimeApi { + /// Generates a root stream ID for the given account. + /// The root stream ID is assigned by the system when emitting + /// tokens from the STAKE as rewards. + fn root_stream_id_for_account(account_id: AccountId) -> StreamId; + } +} diff --git a/pallets/permission0/rpc/Cargo.toml b/pallets/permission0/rpc/Cargo.toml new file mode 100644 index 00000000..043a1c20 --- /dev/null +++ b/pallets/permission0/rpc/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pallet-permission0-rpc" +version = "0.1.0" +edition = "2021" + +[lints] +workspace = true + +[dependencies] +async-trait.workspace = true +jsonrpsee.workspace = true +pallet-permission0-api = { workspace = true, features = ["std"] } +polkadot-sdk = { workspace = true, features = ["sp-api", "sp-runtime", "std"] } +torus-runtime = { workspace = true, features = ["std"] } diff --git a/pallets/permission0/rpc/src/lib.rs b/pallets/permission0/rpc/src/lib.rs new file mode 100644 index 00000000..9d235764 --- /dev/null +++ b/pallets/permission0/rpc/src/lib.rs @@ -0,0 +1,48 @@ +use std::sync::Arc; + +use jsonrpsee::{core::RpcResult, types::ErrorObject}; +use pallet_permission0_api::{Permission0RuntimeApi, StreamId}; +use polkadot_sdk::{ + sp_api::ProvideRuntimeApi, + sp_blockchain::HeaderBackend, + sp_runtime::{ + traits::{IdentifyAccount, Verify}, + MultiSignature, + }, +}; +use torus_runtime::opaque::Block; + +type Signature = MultiSignature; +type AccountId = <::Signer as IdentifyAccount>::AccountId; + +#[jsonrpsee::proc_macros::rpc(client, server)] +pub trait Permission0StreamApi { + #[method(name = "permission0_rootStreamIdForAccount")] + async fn root_stream_id_for_account(&self, account: AccountId) -> RpcResult; +} + +pub struct Permission0Rpc { + client: Arc, +} + +impl Permission0Rpc { + pub fn new(client: Arc) -> Self { + Self { client } + } +} + +#[async_trait::async_trait] +impl Permission0StreamApiServer for Permission0Rpc +where + Client: ProvideRuntimeApi + HeaderBackend + Send + Sync + 'static, + Client::Api: Permission0RuntimeApi, +{ + async fn root_stream_id_for_account(&self, account: AccountId) -> RpcResult { + let runtime = &*self.client.runtime_api(); + let at = self.client.info().best_hash; + + runtime + .root_stream_id_for_account(at, account) + .map_err(|err| ErrorObject::owned(1, "Runtime execution failed", Some(err.to_string()))) + } +} diff --git a/pallets/permission0/src/ext.rs b/pallets/permission0/src/ext.rs index 77d6c6ed..5daf8f42 100644 --- a/pallets/permission0/src/ext.rs +++ b/pallets/permission0/src/ext.rs @@ -183,7 +183,7 @@ pub fn enforcement_execute_permission_impl( .filter(|id| controllers.contains(id)) .count(); - if votes + 1 < *required_votes as usize { + if votes.saturating_add(1) < *required_votes as usize { return EnforcementTracking::::mutate( permission_id, referendum.clone(), diff --git a/pallets/permission0/src/ext/curator_impl.rs b/pallets/permission0/src/ext/curator_impl.rs index 7a2340c8..cfb0fa0b 100644 --- a/pallets/permission0/src/ext/curator_impl.rs +++ b/pallets/permission0/src/ext/curator_impl.rs @@ -11,7 +11,7 @@ use pallet_permission0_api::{ }; use polkadot_sdk::frame_system::{ensure_root, ensure_signed_or_root}; use polkadot_sdk::sp_core::Get; -use polkadot_sdk::sp_runtime::traits::AccountIdConversion; +use polkadot_sdk::sp_runtime::traits::{AccountIdConversion, Saturating}; use polkadot_sdk::{ frame_support::ensure, frame_system, @@ -75,7 +75,7 @@ impl Permission0CuratorApi, BlockNumberFor if contract .last_execution - .is_some_and(|last_execution| last_execution + cooldown > now) + .is_some_and(|last_execution| last_execution.saturating_add(cooldown) > now) { return Err(Error::::PermissionInCooldown.into()); } diff --git a/pallets/permission0/src/ext/emission_impl.rs b/pallets/permission0/src/ext/emission_impl.rs index 7a1a20ab..f968c6d8 100644 --- a/pallets/permission0/src/ext/emission_impl.rs +++ b/pallets/permission0/src/ext/emission_impl.rs @@ -21,7 +21,7 @@ use polkadot_sdk::{ polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, sp_core::Get, sp_runtime::{ - traits::{CheckedAdd, Zero}, + traits::{CheckedAdd, Saturating, Zero}, DispatchError, Percent, Vec, }, sp_std::collections::btree_map::BTreeMap, @@ -277,7 +277,7 @@ pub fn execute_permission_impl( .filter_map(|id| { AccumulatedStreamAmounts::::get((&contract.grantor, id, permission_id)) }) - .fold(BalanceOf::::zero(), |acc, e| acc + e), // The Balance AST does not enforce the Sum trait + .fold(BalanceOf::::zero(), |acc, e| acc.saturating_add(e)), // The Balance AST does not enforce the Sum trait EmissionAllocation::FixedAmount(amount) => *amount, }; @@ -325,7 +325,7 @@ pub fn toggle_permission_accumulation_impl( .filter(|id| controllers.contains(id)) .count(); - if votes + 1 < *required_votes as usize { + if votes.saturating_add(1) < *required_votes as usize { return EnforcementTracking::::mutate( permission_id, referendum.clone(), diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs index f9db532e..7092c22a 100644 --- a/pallets/permission0/src/lib.rs +++ b/pallets/permission0/src/lib.rs @@ -1,10 +1,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::too_many_arguments)] -pub use pallet::*; - -use pallet_permission0_api::StreamId; - pub mod benchmarking; pub mod weights; pub use weights::*; @@ -13,12 +9,16 @@ pub mod ext; pub mod migrations; pub mod permission; +pub use pallet::*; + pub use permission::{ generate_permission_id, CuratorPermissions, CuratorScope, DistributionControl, EmissionAllocation, EmissionScope, EnforcementAuthority, EnforcementReferendum, PermissionContract, PermissionDuration, PermissionId, PermissionScope, RevocationTerms, }; +pub use pallet_permission0_api::{generate_root_stream_id, StreamId}; + use polkadot_sdk::{ frame_support::{ dispatch::DispatchResult, diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index 69cf9512..c6b7084d 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -95,7 +95,7 @@ impl PermissionContract { .filter(|id| id != who) .filter(|id| accounts.contains(id)) .count(); - if votes + 1 < *required_votes as usize { + if votes.saturating_add(1) < *required_votes as usize { return RevocationTracking::::mutate(permission_id, |votes| { votes .try_insert(who.clone()) @@ -226,7 +226,11 @@ pub enum EnforcementAuthority { /// Process all auto-distributions and time-based distributions pub(crate) fn do_auto_permission_execution(current_block: BlockNumberFor) { // Only check every 10 blocks to reduce computational overhead - if current_block.into() % 10 != U256::zero() { + if as Into>::into(current_block) + .checked_rem(10.into()) + .unwrap_or_default() + != U256::zero() + { return; } diff --git a/pallets/permission0/src/permission/emission.rs b/pallets/permission0/src/permission/emission.rs index a948171b..5a625b15 100644 --- a/pallets/permission0/src/permission/emission.rs +++ b/pallets/permission0/src/permission/emission.rs @@ -121,7 +121,7 @@ pub(crate) fn do_accumulate_emissions( AccumulatedStreamAmounts::::set( (agent, stream, &permission_id), - Some(balance + delegated_amount), + Some(balance.saturating_add(delegated_amount)), ); } } @@ -236,7 +236,10 @@ fn do_distribute_to_targets( for (target, weight) in emission_scope.targets.iter() { let target_weight = FixedU128::from_u32(*weight as u32); - let target_amount = total_initial_amount.saturating_mul(target_weight) / total_weight; + let target_amount = total_initial_amount + .saturating_mul(target_weight) + .const_checked_div(total_weight) + .unwrap_or_default(); if target_amount.is_zero() { continue; @@ -254,7 +257,7 @@ fn do_distribute_to_targets( T::Currency::resolve_creating(target, imbalance); } - let amount = initial_balance - imbalance.peek(); + let amount = initial_balance.saturating_sub(imbalance.peek()); if !amount.is_zero() { >::deposit_event(match reason { DistributionReason::Automatic => Event::AutoDistributionExecuted { @@ -289,7 +292,7 @@ pub(crate) fn do_auto_distribution( .filter_map(|id| { AccumulatedStreamAmounts::::get((&contract.grantor, id, permission_id)) }) - .fold(BalanceOf::::zero(), |acc, e| acc + e), // The Balance AST does not enforce the Sum trait + .fold(BalanceOf::::zero(), |acc, e| acc.saturating_add(e)), // The Balance AST does not enforce the Sum trait EmissionAllocation::FixedAmount(amount) => *amount, }; diff --git a/pallets/permission0/tests/enforcement.rs b/pallets/permission0/tests/enforcement.rs index 7f6f94a2..ed03106d 100644 --- a/pallets/permission0/tests/enforcement.rs +++ b/pallets/permission0/tests/enforcement.rs @@ -1,3 +1,5 @@ +#![allow(clippy::indexing_slicing)] + use std::collections::BTreeMap; use pallet_permission0::permission::emission::StreamId; diff --git a/pallets/torus0/Cargo.toml b/pallets/torus0/Cargo.toml index 8d915c42..be37fdcd 100644 --- a/pallets/torus0/Cargo.toml +++ b/pallets/torus0/Cargo.toml @@ -6,6 +6,9 @@ license = "MIT-0" authors.workspace = true edition.workspace = true +[lints] +workspace = true + [features] default = ["std"] std = [ diff --git a/pallets/torus0/api/Cargo.toml b/pallets/torus0/api/Cargo.toml index 08ed039a..709cf0b3 100644 --- a/pallets/torus0/api/Cargo.toml +++ b/pallets/torus0/api/Cargo.toml @@ -6,6 +6,9 @@ license = "MIT-0" authors.workspace = true edition.workspace = true +[lints] +workspace = true + [features] default = ["std"] std = ["polkadot-sdk/std"] diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index 374d9714..ec79af19 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -10,7 +10,7 @@ use polkadot_sdk::{ DebugNoBound, }, polkadot_sdk_frame::prelude::BlockNumberFor, - sp_runtime::{BoundedVec, DispatchError, Percent}, + sp_runtime::{traits::Saturating, BoundedVec, DispatchError, Percent}, sp_tracing::{debug, debug_span}, }; use scale_info::{prelude::vec::Vec, TypeInfo}; @@ -231,7 +231,7 @@ fn is_in_update_cooldown(key: &AccountIdOf) -> Result::AgentDoesNotExist)? .last_update_block; - Ok(last_update + cooldown > current_block) + Ok(last_update.saturating_add(cooldown) > current_block) } fn set_in_cooldown(key: &AccountIdOf) -> DispatchResult { diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index f1708f1a..b8334534 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -6,6 +6,9 @@ license = "MIT-0" authors.workspace = true edition.workspace = true +[lints] +workspace = true + [features] default = ["std"] std = [ @@ -56,7 +59,6 @@ try-runtime = [ testnet = ["pallet-faucet/testnet"] [dependencies] - serde_json = { workspace = true, features = ["alloc"] } # Substrate diff --git a/runtime/src/apis.rs b/runtime/src/apis.rs index 92550578..1b09e7d7 100644 --- a/runtime/src/apis.rs +++ b/runtime/src/apis.rs @@ -7,6 +7,7 @@ use pallet_ethereum::{ }; use pallet_evm::{Account as EVMAccount, FeeCalculator, Runner}; use pallet_grandpa::AuthorityId as GrandpaId; +use pallet_permission0_api::{generate_root_stream_id, StreamId}; use polkadot_sdk::{ polkadot_sdk_frame::runtime::prelude::*, sp_consensus_aura::sr25519::AuthorityId as AuraId, @@ -213,7 +214,9 @@ impl_runtime_apis! { use baseline::Pallet as BaselineBench; use super::*; + #[allow(non_local_definitions)] impl frame_system_benchmarking::Config for Runtime {} + #[allow(non_local_definitions)] impl baseline::Config for Runtime {} use frame_support::traits::WhitelistedStorageKeys; @@ -442,7 +445,7 @@ impl_runtime_apis! { let _ = RuntimeExecutive::apply_extrinsic(ext); } - Ethereum::on_finalize(System::block_number() + 1); + Ethereum::on_finalize(System::block_number().saturating_add(1)); ( pallet_ethereum::CurrentBlock::::get(), @@ -462,4 +465,10 @@ impl_runtime_apis! { ) } } + + impl pallet_permission0_api::Permission0RuntimeApi for Runtime { + fn root_stream_id_for_account(account_id: AccountId) -> StreamId { + generate_root_stream_id(&account_id) + } + } } diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index bd5471ad..43183342 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -138,10 +138,10 @@ impl pallet_sudo::Config for Runtime { parameter_types! { // Base: 1 token + (88 bytes * 0.01 token) pub const DepositBase: Balance = 10u128.saturating_pow(TOKEN_DECIMALS) // 1 token - + (88 * 10u128.saturating_pow(TOKEN_DECIMALS - 2)); // 0.01 token per byte + .saturating_add(88u128.saturating_mul(10u128.saturating_pow(TOKEN_DECIMALS - 2))); // 0.01 token per byte // Factor: (32 bytes * 0.01 token) pub const DepositFactor: Balance = - 32 * 10u128.saturating_pow(TOKEN_DECIMALS - 2); // 0.01 token per byte + 32u128.saturating_mul(10u128.saturating_pow(TOKEN_DECIMALS - 2)); // 0.01 token per byte } impl pallet_multisig::Config for Runtime { @@ -301,7 +301,7 @@ impl pallet_grandpa::Config for Runtime { // --- Torus --- const fn as_tors(val: u128) -> u128 { - val * 10u128.pow(TOKEN_DECIMALS) + val.saturating_add(10u128.pow(TOKEN_DECIMALS)) } parameter_types! { diff --git a/runtime/src/configs/eth.rs b/runtime/src/configs/eth.rs index 35175940..5b35480a 100644 --- a/runtime/src/configs/eth.rs +++ b/runtime/src/configs/eth.rs @@ -1,3 +1,5 @@ +#![allow(clippy::arithmetic_side_effects)] + use codec::{Decode, Encode}; use pallet_ethereum::PostLogContent; use pallet_evm::{FeeCalculator, HashedAddressMapping}; @@ -30,12 +32,13 @@ impl> FindAuthor for FindAuthorTruncated { where I: 'a + IntoIterator, { - if let Some(author_index) = F::find_author(digests) { - let authority_id = - pallet_aura::Authorities::::get()[author_index as usize].clone(); - return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24])); - } - None + let authority_id = F::find_author(digests).and_then(|author_index| { + pallet_aura::Authorities::::get() + .get(author_index as usize) + .cloned() + })?; + + authority_id.to_raw_vec().get(4..24).map(H160::from_slice) } } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index e99d69e0..d24c8f51 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,11 +1,11 @@ [toolchain] -# DO NOT BUMP BEFORE CHECKING https://github.com/oxalica/rust-overlay/issues/197 -# Cargo on Rust 1.83.0 hard codes the strip dependency to /usr/bin/strip, -# which cannot strip WASM binaries. llvm-strip should be used instead, and is -# done in the nixpkgs repo (https://github.com/rust-lang/rust/pull/130781), -# but we use the oxalica overlay, which does not fix this yet. -# Should be fixed by https://github.com/rust-lang/rust/issues/123151. -channel = "1.82.0" -components = ["clippy", "rustfmt", "rust-src", "rust-analyzer", "llvm-tools-preview"] +channel = "1.84.1" +components = [ + "clippy", + "rustfmt", + "rust-src", + "rust-analyzer", + "llvm-tools-preview", +] targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"] profile = "minimal" diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index a6734286..9db62819 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -4,6 +4,10 @@ version = "0.1.0" authors.workspace = true edition.workspace = true +[features] +default = ["std"] +std = [] + [dependencies] codec.workspace = true scale-info.workspace = true diff --git a/xtask/src/generate_spec.rs b/xtask/src/generate_spec.rs index a4e57ada..784357aa 100644 --- a/xtask/src/generate_spec.rs +++ b/xtask/src/generate_spec.rs @@ -247,22 +247,19 @@ fn generate_new_spec(gen_new: &flags::GenNew, cmd: &flags::GenerateSpec) { .clone() .unwrap_or_else(|| Path::new("dev").to_path_buf()); - // Start with a minimal dev chain spec let out = crate::torus_node!("build-spec", "--chain", chain_spec) + .stderr(std::io::stderr()) .output() .expect("failed to run torus node"); let mut json: Value = serde_json::from_slice(&out.stdout).expect("failed to parse spec file"); - // Set chain name if provided if let Some(name) = &gen_new.name { json["name"] = Value::String(name.clone()); } - // Apply all the customizations from the flags customize_spec(&mut json, cmd); - // Write the result to the output file let serialized = serde_json::to_string_pretty(&json).expect("failed to generate spec file"); match &cmd.out { diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 651b2e90..8f12d737 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -42,7 +42,7 @@ fn main() { } cmd.args(args); - cmd.exec(); + let _ = cmd.exec(); } } } @@ -92,7 +92,7 @@ struct Account<'a> { pub(crate) grandpa_address: sp_keyring::Ed25519Keyring, } -impl<'a> Default for Account<'a> { +impl Default for Account<'_> { fn default() -> Self { Self { suri: "".into(), diff --git a/xtask/src/run.rs b/xtask/src/run.rs index 979e5447..52ea3997 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -38,7 +38,7 @@ pub(super) fn run(mut r: flags::Run) { .suffix(node.name.as_ref().unwrap_or(&Cow::Borrowed("")).as_ref()) .tempdir() .expect("failed to create tempdir") - .into_path() + .keep() }); match (path.exists(), path.is_dir()) { From e012a9945cc49a0738c03db4ffefb6e7de729966 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Wed, 28 May 2025 20:31:20 +0200 Subject: [PATCH 29/46] fix(testnet): add code substitute test(emission0): calculate rational correctly with rounding --- data/testnet/spec.json | 4 +++- pallets/emission0/tests/distribution.rs | 2 +- xtask/src/run.rs | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/data/testnet/spec.json b/data/testnet/spec.json index 936803ec..80226e72 100644 --- a/data/testnet/spec.json +++ b/data/testnet/spec.json @@ -14,7 +14,9 @@ "tokenDecimals": 18, "tokenSymbol": "TORUS" }, - "codeSubstitutes": {}, + "codeSubstitutes": { + "1272299": "52bc537646db8e0528b52ffd005874fa042ea346c314521060789b74ca74ead6c1d658a2d3205218441a45844164c6fbc8680c62c1c69515c2614871961f3f98d8211078134161ec640704d58ad29e430b343e5f1940745375be1f6bc8fd936d84482384ecbdb7dc3243168113bc13a9eb36aed578aba21e1c6a1a6f5597f765df472e09fc07873a3b734658439d7d3923d9b1f3708da7e3349ee997b79d7ada79220ff3b0c94362cbf555e9f090d8f273d529b0e9a7b07a7e5523efc3ced5d37538d472a8b5cda3c9d269df2eba0637cd8343bd9c0f5ba6b5eaa3ddfbb47a42028f1d1eab3fa724f0d8b1fab11a7efb749d35d4aba1de8b3c1a2b3a38d4dbd8336f3b87b731c5c7e16131c52f795d4cf16f78a698e2dbf01e53fc190f1553fccecb89293ec91b1253fcbdc1aa0f1ceaa541088775718e11b4c71d2ba45b6102fedfe7c41d2bd7ade438fd7e48dcb1c2b742f3d1f7a8b86325de0a13f0a6ef37ee58a1a92b1b8f35b7d2e3daf758dcb1926345c769be37c51d2b39ea2ac749a4d3cc9ce43dc75739ea6ae6e6345fe5f876d2adc4bac2b07775d5fd8a5fc5bac22a13f02bec3c3e73eefb2eee5811d595e8ccd768eaaafea2e13fced769bee2d3d4d59cefea4af4ee2b9a6bb7225f5357a5d26dd4557c5657d93ded2bef5a5dc5f895f6d36f74ddb7ba9af3a2ba8a75b5e3a277f1dd57dbbbba9a37be9a4fddc757dd7dd455a9741c7585e3d7751e7555e2711c178efbf8eaba8fbae291451e5f65379509d48dbaba711c387eba8103473d0d22d179ec10893451e6e1a0c93113bb8b33518e88693826c99b1b63343324c6bcab8b9de8c2a1cd2d074d0ecc23cd4c519645adbb70cc6c5d8e6ca399b9186311c99b38e2c44113b11f35741a933ced40667c887efcb841a3c52c95fa8a9f4a653972d4a33aeca8ad861abe12bd861abceb22bd3eb5899e9a28d457de513f50180947f7fa1a68665ec3817c95e34052a9afb4a77ca40ee4ab6cfef8a179af474d1c47f18f1f3f6af8ea7a0d75f5e3c74c3c101f3e767cb57d47f6fa148fefa0210790a7bea2790a8502c07dd415ea34f878ea2bd169f8aaab37bf7183695eff63c78ed3c083c74fdf41c3777c35f31dd87f3cc857a40781393607f215e940e0cd6900f2205fe5380d5f614fa16c6cea6d52b7f9cabb0dfc4abbcd7d9c4ea781475deda8ab1da7e1271e3f7db5fd04bf9af771d457dd5110003fbebafea3ae00f0e3b5ae00701e3c8efa2abe7e953d485dd550c36feaea5457a7dfb8719bbaaaa9f9a9ae6c7ee3c64f5fe1f8a9ae6a4eaff96aab3c9b82bf39101a361bdf5157357555f31ddfb6d7af44af75658386d7afb42a6553f0360ee42b51356253f040eaaa86ca044c69f7515722d14b7555bae6e3da57598d80565722ed367525fa967dfbcaab3f6c0adee62b1cb5874dc1a3eaea078e03a0ae6a5dd5fbf07e535734fcb5aed68c2a64f8a20c156180e28aca5bc207a2504219bc90022b4b5059f1ce435331afae5e9fa3eea6e07bd48da93d8f1d34b7a9ab93e93575c5eac10db6e0e5cb0b6200460f54342c1578400a4f741105327cb14245f3d54c35d1d495a9a248b5db14bc8e8ac5d43ec757b10eb129f81c7585a332015556665eaa2bd26f5426725456e26dd4d5cce8a4ba62b940cb19b4b8400d34b8f00555dc298cb9410b9e50811a5d904165259ef45557876c0a9e5457a33ae4aa399b82e7aa892b934dc16f75a55526502a2bf4a2ba12800eb8e8020dd068c21819a8b2cac455567a04410c380082149628c3165456f8d75758456d0afeaa2b5a73626abf9af59b8297b58ba9fd5e280571bad0bad2455b22ba6d5dd1a2b7bfee43359f8f8a3b7107aaf81deb6cebca15cd2fb10e27d122098bb3cdc3d1abb265639d3d7f6f185aa1edbb3dfc661f185ac8826e5b4b8ce96d5999a23f52f3f709bd2d2b59b4466214ef2ca7f87b0d7255aa34ff3a3d5f9fffa8877992517c7d1bc95529e4e635383dd8cccd8d75e82f6fdb4a134d8f5dc33cd890c32ae58d7adb98075b831c3d733d6cd363deb646bd20980056d343ee0749d7f4cb15d9180567fd583d318a799fec2f3e28f6f5e58accf3b0a62d77e4aa9fecebd931ef7b63a7def77d1f1d42ca6744635f4661e78999f7b36a79ccfb6c3a5e83dbe56d5325b2e5f47e62cb2f574456c928781e8e1e06e509b49d331ba34c8c829fbd2d25c8748951f04b6333e5f5bd9cdb52e28cc64eaf516f63d43ce6758c9a87f3f3584ff9794d7af1f336acf3441e7e4af8243ef1460c0d0d0d35572dd98b68b972555685b65cd7b99e92f0b1f3b11a041b5ef56404b6fc09099644cbc3968df5961f9ff8ed8fd59f7cbc1278ae1f1f2e27a9b7bd37b3fa5c32a34083bd97acb3acb31d2fbfacc39fd7982b12af418de77cbc3637e97db2f7d3fbb058a7b78c8ad7788bdec299245a68c1a86d7e4d122dbe589c6d2d6ed1835f8e65c518158b4846c5f330d7c336b3183209b4cde9e0f7da02a0e32f8743db9befcd97acc33af2fbe8758ce26f8ce22f770436c6283e0fa7baafd47c79d81fd67c53f4609758876fc33af1d1db5e2e9e8715b058cb632deb29c9bcfcac1f0c821dcfc3daa23af8edede58eb03a5609e111b47dd2ed3face13bde912a38a6e137d6810d6f629d6df8bd81d5e7bd34b020d4d1f649c7ffb08eef58e77bc7c73fee54d9122f1f8f8a3b55b67cb2e3655de2aa2db3e34bbcc3aa788c75b6e5812e1dbfb14eecf8659d7dbc641df8f8bd89d527a7970621c8823c84b6bd375fd77c0d639d0fb6fc7e9708fc277f74db4ae24aef973b222ba6c14dca7f10ca43791fb8f0f19af4b85b4d8542b8492f3607a6a96cdcdfd67c8d37e9c9e6b6d112018243fd5380a642b7250204c734151b0dcf8f1e50ec6f9343cb21e936d6d9e62f87040e353c0ff3f0de70f5e97a696045c850d022fc1763fc7e39257c9fc8c32c087bd0b4dd99245a64c1a86dc9a8fd724596517b1e5e1bcd021dfcb686867aaf91b631d6f9f8f0fb1a9a2c1d3ffe83978cda6bd0c318b5afa1830d9b0fbf5f4e0957c928be0fac18a3f6cba87df496515c9751f090e36b708b1e6cf6b6a187316acf1c5f8b7079241905cfc33cccc33cccdec6287816432885b63874f0fbcd684400ad884109229a10d0948006043451d0908026053450d0484173029a26689ea041018d0968b0d08880c64a054c5e30a54153c50406131aa63098be601a63ea82490d9a2ba63398c898c4603283a90c108b890ca63174507456cca461f2c2548412191c18e609a60966c060ca328386290419182531252a741841c7163a8a306b30b3c50c173306b4075c16746cc171061d4ce808818e21a9440e32a60f74599898305d9931428e2472982147194a28c80126c7124a592895910306b34c690a740a3361c8c8508a410e11e4682247956d06a42390ba20752191a1a4054983ad891c4a289940870e66a0c051031c362849512a41290a1c564a5d28ada00486d2164a6128a1513aa344021a056541890b38962899414b80830c38d4c031069217ba82d216d296d20c4865c0a105298b12975216a51394a0c8c4946e50a241c9891984d2084857cce06006083336d09184991ddcc062ca8d276e6029b1a07445a98a520a6e54b1b10489cc0d2b938bd99a429839c31685991fcc6831d36546072319e0a0018e32908c80c30c335c4844805e3629e02053ca0105632604333298c132a3848905a62a24169919b234a40c4c259059c82d3339c8bce498a22403a02e8cd20b4c5572782199a1a4a5d48292155d14f30a1212668410bdc0269086401242090b1218a42f48492029c17403d20b666e402a828904261ccc7861e60b261ec833cc88c114831c333079e18a603ac20c0fb6299046304386bb0257c6680c23344660188d19756174c648cc080ba32da315dc80821b0327060e0b5c18da84120c4a5970dca0e482920a4a53d03021a51899415ec154460214ccecb28d1969e1860b362ac83038ca90bcd8bed8f8c0b6824d04db084a35d860b061b16999b9b2bd20d3420e328cd2189921c170e30c6e0b9c16485f7064510ad3556144066e0a33435c17708ce9806032420e2d37c6d0813159816b82890a1c5fc83184ee0737bac02d61540698841932704cc881c55c63ba0087172414a62a7066ccf460962107971c31c841831c45c84104ea83992050334a3a3069313326c70b6692e8ac80638b0e283a2e6e70418716333ec83164a2c2ac62a60b8e0b3a48c089996999a6286d81630d79021d2e9058b82186991acc7860ab814905a4257054e0cee0c4302d919d41c7c031834c8d0c8dec0b59183230646464636460b228645fb2319914b2309917d912322e64666458a05c6457c8b690312183c295c525832b06170c2e2c2e2dd70b2e175c2db8b25c2cb8567055715171cde0da72297179e04ae21aa265e81a1713d795eb03d712570a2e145c525c27b84c7095e08ae222c105c5f5c485e57282928196817a81728182816a81628186a162a8186819740b340b740c3d833a8186419540b7a03ba03aa02aa039a054d02a280a280ce80b2816740a9a853e414f404d40b15027e01374044350125031a2875ea14a4c244c23cc1b4c2fa60d6611e6175306f30553cba48232615a319f982590684414c82c4831344ecc33c823482de40da40d640d240cb232a40a240be4153205b205320a59026982ac0cf2093902e94404232a619a618e815689298855c429a20a2215b1092603abc1636031701a8c068781c1c05fe031ec05ee027381cfe02db019ac0516c359602cf015380c97c164f0180c86adc055602ab0183c0596024781bf3014f809ec040e839bc04ce025b017560283c149e02f18097c0436027bc1456022f010b80b0b81bbe020708b81c03f601f3017dc03e601ef80b7601d700e1807ac05df806dc035602e4c039e016f611830169c05cb8063c05af805ec02be825bc02ce0157016b682ab602a780a5601a780cbc0286029f8046c022e0147c1246028f809c6c24ef0085804300c5007d00cf804380508064883a90614031a0156011661fa600e017a31c9402ac023c02f201266179009308b4906a802780268020d402684584e2ee0f33580010bf841890f09488200243b478c143980017a681e020c40003c10d94127c80d360009f26e68a853091aec85a230641c7ba634c1c012294d7a8658b244835108283d4b968870704c1e58a0281958228493254434e9010a9a92e38408a09e1f724c49041104d443054a1403e498866cd0514608283d52d6d820a02852a414316509508f9327529c043d29828825414e8870f264c994261a38c31e11e424082741539a3ce921b3403d414f9c64608919f6c993269e8e32ec9420294e7a82e80102800e32a8b1537aa61491838e316c4f50931ea020c4b04f9e3409a246471a1bd4e43ad0581b1d61d8a0263e7480617b8270022465c994261ae8a1e30b1b8493294d3040838e312b8493254ea4b4017e6000038828a207a86788a0223c747861a7f410d104ca92938e2e6c50cf941e20294b827a3440a3830bdb13d42468ca12219e38290203539c4ce981d273a446c719393ab6f0e44993209e3c696200338608d200949e275ad89e9e0c2c8912b42468080d38e9d9404a87989df2c44993a01e2196f4f464e0878e2c6c940c4071b2e408a09e227e963891d241507a8838a2c90fd78185ed09024a14284b9a2c7122a57b828012450141508a88124410bd43c715360351a200495922c5c91053807aa06c20ca92237a7c7ee808b342f440d1809329508a581244142a4e8af8e959120414454a0fd09220274460a08829437494b142385912d43305a88820687490a10129424069027484878e31848812448f103d7480d92947f4f82c9932e5889e2450a2389932a5a7019e0e2bec941e27414e80a20c115444931b3aaab050a238096a025484104b82a23c99b2c489946e025444e3d04185ddc092284b9c4869a01e1fa0281080e2a4c910416420034a3c1d626c4f5013219c3c694265494f113d452c0008217a34a081264000d131859de21344cf10414861a70441e901ea19028a93eb880214271938e9f8b241389902c5095090113d4b8e7822454a9325403d423c715284ca2788284f54363aa0b0536a743c619b2cb1d1e18425624993a026423409eaf1614647181c70f2a489932027509ce0d0d184f50922ca130c2ce9092a22881e237a6ce860c2024531c0b6b0e709069a04412922034b8282e80172220414274b96d0e89066708d418216627a59dab686861ab2220d9d5ea61728055ef2464dcd8d9a1b37e68d79e30653292993441432432aea4c9132462346294663ec3a6963131d20a59428395a1e018113258eb41931c3a598d600c9cb3cda99a594452b9937ee52a64ba9a4a5a52c677634ba96e18e28ef326001745763b99aa631dd8534ce13a5915212e987116f8ccccc70f7244bcccb2c578392d219bacc0b318ce32284cc1b2729a51bcfb0640829c4665863a6738394e5a494a964250af001d3219935c62084744a0c421c72c78e1d3ba89c74f2eed2c596d2200990928348d2887777bb2e898f1e25865976edee6877698064bbbb40b8060474b186ce66699669a448f8470fb107a57419874c1d31922a72004ab139b7d524c7c81826239552c62865642937f24ab9700d1025af36c3cccc9399a924d1d5b1970e86702543c917e5bda48c5242e6658cae5ca6524a49310c93524a8d2385cccc2aa6cc284923b618862db69c633707e7c801254b661293488b458c29958c31736937f29ef8c43f787977e94a66a60c99658470255d0977a164cadc3c2c592ee5ddc9909799dbe58831c63d18c3584a8e3b655cb94b77992ea5cb52aed434996170a5a4304aa69444ba225f9a94f4c258f226a5dc649492d288512925654a354a29b62b974a8ce3aec46294b20000000086c55d39e9d28c2195cb91621c299d74424829cd766a1cd6512a29b68c31474925c7ec833102e4907252968b71c42895bbcb4be9522ae5524a25a5544e9691ee4a18e5ee6211ee46c6816300cc2c805d4a9977e3b811939a84118b52c62839caa8c918312a65942c31969826254b4a9729536d77215daee1dd658e1293bb11dbcd28c52433472931b9bc928b8c458de52ecbb94966c9456696cc0c59cab8d1db6566d6346ca5943822f3f2c032b26422bc1263e6c8cb18c7c528a58c544ae6dd5d4a3972e428a3dcc5982333af9432b2a494eef2322fcb8dcb7257c28aed62916274ce193a2586ed707343e9102c5e72e12ea534ecd0a0c3511de8a4947298949229a5944e5a279d3342e8a432003487bdb038a18c31ca18a316258c314a4ab58943c74c27d3c5a2e495742e651a11d038116f2c1f011485881e2268f6a4874acf9325463421a2474903519e2cd10014271ad04094273490885d1c7a8032b004284a509320a23c79d2c44688ce0e23a26c2088479321a6f0f0691244103d3e3a3ae4701b39e0a001284e8698d264880335099af283660a8d57e31344130c3c791205a8869c263d40353c7a7c960419d10385478f06686c4c099ae2c4889e2b28882653a034010a5a12e4840822a2a06ed81c9c64a007484a6dd2f32488138d10507aa44869b2a447034d80a2044de1b13810e124084a1140754806828ad8315a1c8ce81962491014274052960431c50911363604458902b444881ea01e2180a22cd1d121872539f4f834798281253d4e80826ac801c887103d53a6f4004921224a103ba2cd01a8874a94207a809634992244103d4b70f0d1d121072941f44c09f22332e004a8870a0d54a0f444d3e2b0044a142753807aa82ce9096a02d403a547034b76c041071d7210a26749942029470005b124c8881e1f54a0f4444f548577c512c22893650961424222a165090969249290d064b134267b311321c8a29105592b5664b22c9688c9b2585864b184846464090945264250488859082e93655d4c96c512ea32262b2484614c96c5121262b128131664b1562cb962614c585008b284585108325996108b2524c44c585088c542cc6485582c968c4c56484848883599b0a01064c2824242422c66b2429075316141ca44685993c92e13168c4c96c562b1249365b198090bb220936541260f9860e0ee4222a634d9a3c3e64623d2a6d54fa8b51c968876d14d71c7c6457fdc812ad15171a7bbe8399087cdfbb69fb8ce3b7136bc1367c346e7419576e3dba6cd74e7e11b36ea69239166485a47d2489e0fe0994380fc353b13559ff542bfc034d6b6680adb8a2c8dd3dbaa624c5701266e947eeb328f5b931bf5324f320afb11dd75faf81c7803f6208cc28e621476ec1a2aee08e11476ec13d218aab12a508d7d39218cc296e8e6b17f42361cd02df36033ecb5c2064d8fb14e8471f4b1fa8424b6e8b14567efd49a77e29fb6c3d356b55c29808afbb6aca8416fcb0a2e9d89ea27d4595d22d9b16371a73bf62eee40157653dc191dfb210fa263d744de27fa49fb06bee80d20a147de493b54b1aaf34e5a5d00d67d09a8ea7ea8cabc29b0b5cc5ce47d1b48428baef19679b2972bf2038901ab1a9d87673c25a0aaab2751fd2195692d5784a8b82b415a43b5045471af8291aa1257191577eee51830aa4a6c1935868686b8cc8bbd1c0658630e8002c8793e80879c0f9d0f119bacc9f309daf6f5fd421e60431ef8dfa861fde89f6ced130f5b0a62f0697e5b557ce96d551185e663f57bb2f5757a79b251ace3c3f4557851c5155544514515b9c5cb8b6dc33af4671d4a2987845b52daf4970fb32f0ec398ae5f70d13d7a5b544cd15434d15e6f6b0a312bfb06e50337930decf9d8904bc297b7a93ef35b37d4f325d6811fe7433c571fbebce47ce0d81debc4ea43bf3d5b5524d16db2393773f25dfc3c360f3924fc5861d35a44d7415d47c803f73c733e441f727a1707c627347959da266b562d1836bf1ef6e93d40352f8acdadb4a5de9b38999fa0edb51b5c64ad489e935fee015b86eaba96eb1af5ae47ef01374021086554f4eb7dabdeaf8c73c1c0a2baea10fdb7ea586f34a5bfd11b40827e55cb3980a5a23ccc5d88f2a2fe96b5bb49b68c9ea75f6f9e7a496e804210ca7cab965fecd73fa1a65fec9adfaa69fde279a2f44460601151c84ad08a98adb1ea27d4f19fd6222ff668773f5b83db686e736585f23d3f6e5d78039f40db7b4bba29b1173650ce3fce1375fc7adcdb2359a16c180ed3b1c2181c007dbd871f644bf6f5cf5fdf6bfeeb5adb271dfdb75ffa3a13d6f986f4f5eb434c7df9e8eb3cd8f51eb09bbe2e04ef44d5f508b0ceb654d0445faf00ebd8b00effbac6de150664425fd778638fdbe485e1c6d10f2cd3dbb14efcf512ebc85fd78e891fd0f6a7938fad14b4fac3e6e7f766569f6e480ab87034757c843b5215fb7dd3f137acf3611df9dbf1384b043e1edb633bcba9afebfdd7f587758fb6d715dd279b210fb0f940b4269d5c3ab3314abeb4b31b2fbd2b52251fbd079054f2bb311e28a763fd21b516b9e7b7f436a636e0a94083d033a1b649b7ff366d3dd8db12d93337daddf349fb5ddea2c5a5333ecbff96199e39895e46f161ed1835eb8f96b5143dd85d149aac3dbf1c8567341fe32f1b816708998f5d8b0b49d06d0b0562f4e8d88b6cd5473b7791f7f149f5139d748d442261dee8dac83b219143434dbaecd8dccb29e9869a345202879a24efb39db4d54f6ef03ac6a818b99d33a3ba318afee3fb6017fdc3be09f8273ae48a7cd947a3119700eccb1d81c7b024a2633ea3c589272d4e1c6ab93891029d1c4aa249ff647fb2472779403f3b6668a8836c74f7a0adbb6f112888f606b43d8876f7e5922c69d2b947efbc9f1e4dfae6fd14006e2412a9ee0619799adcd8fb44dfb87eb0f9db216764c530529b74c821812be81f58a63f56124daaccde36e77ddbe1356fef03bf8d6dc3a53357ed1845ab8951fcda7304af26b4269dec6da1c0094dbad9db4281975d1c1ab41fd8fbebda7a31e812e47a5b439041973c68b338dce25cc718759da10704ebb638d78f6c330a3afa7988824e3efe937d5de7964811fef5ebdb12e1eb7b738da1317bdb9a26ebb7b5bc1617cad7814bcc0aca866946428aa845cfea27d4d887b5cf13518b2a149136993f27f379f83a7b0c6f90d724c4182599af1549b2ade6faf1345fcbe6b7d5db92224befdc203457c928292face393ade7e5be409b9f1deb6048a4363d29797806d1f129dfc4a85d4d6ef4d97922f44a2646c1a6029b4ed169f5a13ed04759bfa0965a98d61e9b7b392422d827240b0696d63e5b8a69ad32bc6162bc414f42de385a78c38cd27bb235a43e392da2d30ba2832f314ae45dcf3cec90fbc1da6671f658dd2ab1ba314a324a8aa121998f717ec6cfe86d63d779183bfd75e68ac4fab1bae4993a6d7a5460631e15183ff98b13ab4fbc3ce643bcc4bce83d5e87f4c230ec58fdaec39fad3932e5c8910ff9f21af44e91bd533cff5200cf756884f9d7f51a244c10b041b0798cd6cbfbaefbc428859530f96047acee06899c91f958b1f344f88b7ecc15d1485b82b26214d22bd1c80e9a4642424f2177d1f6ec229157f24c8cd2a847053615d8dbc60b97e508d62fce6ed5871e6e77ac93fdfa8a3e2f4f82ad2d5764e94cc728d1737a3be48a409ec8c3d0fb60fbd0c33327da6a6989c0de6b1eeccbfbe2ec3bd6c9e97de6758cc2fa8249e861d548dbe7612f578409f6ad9a6a6961563f5667df3ce81d9e276ede72453251fd648bae1d7a913fd8db3f04b080d0bb41b6fa89bc9f4de46dc398793fb12384a28bef3af28fec4ba3de370f8f7927587f605f1548e3f4e5d9306a3fcfba205d027e6fbe1c5844fe4ae4dfd731ae5f502c357cf612eb881e6f12695afdb467d7a076cd83ad6d87dc322abbe66d6f5e506c7a0df2c238828c429982d8740deb7745082f6f3bf3b0027841b308ac2546313df422b7740675c3a8f8eb67d455799827ae27bd0ff60f2c53a64c99fe58bda7de17147bbf75d66e2bfd0625bd6d1bd679c7075922b159223899d02cd0ed4b9db6375a1722907be4c891a3e664b38326470e7845077fe450040372457e582e98b90515e30a836d0b798062c4e83d4311e4410ef52e0f0b6fc0b144f60c3b1b142d112622eafd4231fae3fa0935ffdb3aa6d11faba5195ad68f2b156e0d00c186efba99cd0676e387d45424e9db960ac0349552c3c76f9087edf8715f5c11e8810efee25f1c123ac41959312e0821c422849221a4a811fc2916b489a5e5a7b7a4f399ffd1df5c6d7adb3d5af6acc5c2e1772bad5596c051d15fb9a18297874db04ea9e56b68ace8be273d9fd35fa9bfbdc2025655851ec22618251f81ee834d5ca1e557fb2ea6d298420756e8800b98a121153dbc46bd55416f48ca60042df0000b7ca0aab2048e0afeca0d15f4aa2cc1aaeb5708a082a7de1502a8565b80805ffd1053f2d00bad2b9e9892bfea6a0b10f4b0ae1e53f2b4e66c4c7d587fdb6ac17feb65c5f0012368e1821462300613def2345974ab6295e00b1f54514510bed8200caa55edbf1c203e34a4824db0ce8f96df1b597d20965e1a8498c52c55a04d20a6704881a56d7a5b2700436b24fe2e11a09c8eff66fd58a49dff221251cffa137fe63f593fa19687d7e0724a364ccfebf49f507ff1f0aa5068f579b26060e959e9e957f472020b061615a605bb0665c1c0c23e4f364cd3cb7fb427ad50364ccb7f12ca00aab45a562d4808dd00852e6e804217b07e46743ce6ed979bc00d50e8420bf613cb94692d433b44e08228b20c3112421b46957dff8d7c64a181174352ca86692d433740a18b213a802a2d6c68c1c022f2c08651657568c3a8f6dfd6f3bb3cecdef06dcb0431e820d85a867254a1064a68616848b5150921ac0eed67fd64fda4743cfc7240cc8c518517ac51656848b53edc68fe641a831248d11fd6101efe7b8625b8d2d0025174e9d9db224198de19128401c4ee76b1762c087be89675e4fcf43e1f08210cc3945a0dcd0aba6e6868684825310d6ed38b875c1138bdf8ae93b02e0ca0f8a2ebe459e7bb300c56e1626672193523e7830f3c76ae3ef0a724a2f345e71a041bbbf46063ac03eb277f7d9e3924f022e694c85fc7967516bbc4a4277fcdea833dd60f3bc51eaf31762a7f7af4f4c130d6814844d587d6ac6255bbb68d75806007715f9251f3cb15d9f3b0f4606fac13df6175d27ff0d835e86d8c8ac73c076c7fb2e3e3e3a1b70d45162dcfd71893f2b29e92c8c3cb7ababe1df4657dd5ad21639bec1835a174db82628ac67a5b5040d11a1639be163925f01ff6eb58a5322fcf479e562c831c9f3925f2b07ef0f2cbfdc09e7563d45ede448a042cbb2b65c52a4323344dd54514a96ebb40e3b80fe8964300aba5644178000d5e839e11d81cf460b320a4a107704eef9464ca4f38e53c7b14d2397d4230e99c94524a27a5a7137e7a3eb0d2acc0084be250d476cf5c0258edb3fb8f0fb776b0a5cd48a7f7619fa79e0f76fae89d92441fecf1db71a35e3cf434a6da84d78366c36bf2fa47e53c8c1d7345e0c2fa61e74a65f6751ed6e606bd6b46ef8bc7aacf3cffa2149b30aaa141e97df394049e9e569f79f86d8d3da09f1d4d1f349b5f52c56d639d9faba970d333e6735d62f583bf0e9b0fb9225c6ae6906ceb9bbf2a95d9f4da648f7eb923f20c61fde267f5913c2163c182a5b7e54497fe482d0fa4b7e54418726ad48bcb28b88cfa64f3a9f7b19a2b563327e48ac44f0f768d271905e77918639d9311d8f3b3620d4f3d1f9a1574f147a819d6959bd36d2d5b23c909e3e5fc7e3b0f2feb9cb81ae1c7477a78c93adfbc4fa4c75887e9d63cccc35e68fb804e2361c92213c082156394bcbc462ac08f50cbcbc32f6c5997511003dab2b6bd52db58e794249629d3f13e41dc1aa022ea789844efe88d4f5c0197d0d8a3c9d2c5f3e5451046c7cb6b5246e9c128bd6d16849fc6df639ba7edcdb7ad8e77a28918638e003a7e8a3a5e00ac231f6f3302321de531d6f1e1779c8adf38b38c92dfd6f05fd7f12b59e7e3aba4accb3b137e7acb29085b2218d37b8c7756b5871c7f39237c5931de16334741eb6d8920cc9eafedc06dbd251d1ce2de9609b068d8f0da72f2eb5191bd975e12d2c7eaf85d222724a296ff160a2d0f94d3b2fe907aff6d99fee2f93cd15bded62ba283870db99f77fc723f5dc76a0387b0746979bab35d868654fba1de4b8d2459877eaf44efb55d22a36b1a6bfbc8dbc5d9eaa715f9e1a6d7eac7ad1d7ef33ea1de608fbe2942ad5d5ef45d22d9478b33aa9ff678ee99b78bc3d56f7bdc86decf55a64c99355a7ef33e9611a879db22cf47562ab0e99170d3472e893c7f5b3bf43ed8f09133423fbae69d90c8d36f43eec8f65d1cb8793fb04c631f7927797a3dab1fecec22ef832dba46bd0f363d77c929913f0f371146cbd36babf1b6dc11ee5afd646b91a9603dfaa8420e896c7a4d5b6e543f568fbe7954b0deae791f6cedbb44b6fa6d7f42a47771b46be7899a17e3971bd59fd8902b42cf791f7dfc7249e46997210fb476d1f7903b02cbf45677713eedf35add0d923d8ae0871667fef23e3e646570aea12dd4b245cb18cf5ae050d31060d1f4f11a89bf8ff11cebc7f2d587eb0f2cd3d1939e8f171fb7f0231f7e7248f85c7f58437d4a22cfe7fab15a7e9b87b58d3bab2d405cc7ce87adb883d5151c525d15b6b6f701e8b66143262cce7e638aeb07bde83d6cc5d4fe8343bd8fdef6bcf47ce4f9d0fbe4e1a1972512eb272ff7cc25814348e469fde2653d21e1cff367f5898743cdafd0cbe2ec859825397a415ba8455b08836e5b20d8a25943ad91f6e683432dfac69d1ce7637107c7f95ddc299d6f8a3b37ce7fdcb131737e4edce9ce1f127748e76bcb1dc9eac73dfbe8d1a3e125cfca8e779e15d4ad746702aaacd40339c9b352732ba7939ec3b372ba951cf7711c9e95782b38dee3373c2b416ee5c681d4158f03f98c477353573f4ea7a92b9b1abef20e805b6102d6dc470dcd6bbe4abdc6c75735bfe133b7e15901d2a3ae6a3d8fbaaaa1ae02709a2107f203f9aa8603a9ab4af31d75b5e3406e25d6553c0ae7b1ae6e0ee4e6e62b1ebfa92b1b9bdf7c05e4381c556968dea3ae6eeaca8603e0b5c7eb5737ef5157343acfe12b9ae75057383feaeac7ff1bfea3ae70fe1cbefa73a8ab1b7cd4fa1bbef2a18387c373005099c8b1b1b90d0000c0573d0e80bab2d941878813632ad2d4e003c84dcd8e5a7b7837a71d1a1b203c6c4e3b6a78d4d139e1f09d1a767ce8e8e8e800d1d1d9a1a6a647f57cdcd81cc8cd0e1f3c6c78eca8a79ad4bd58038dcd69478f1a74767ad0dcd4c4eaf948f1d0d1f1713a0edf8940be731d1d1d9d1d6e801c870ff186f4d8d9f92af59d9d1a6a52387c879a1d68860cf98ac787e80cb1e171da01b21377d8e1ab1ddf61871e343a3ac7e1436c6af8901b1d1d9d9daf76ece80079cd0ea91d4ee42b1e27324487215ff5f81098c3909b9d1d1b1cae9353cfc357f53cc09d1dbeaaf90e75b5737ace57de89e490830d5fedb80d387cc80db7e141727c9cc8877c05e443a00e3a752544c875a82b1d1dbee2711dea4a880ecfa1ae84e4f0213d7008525701f88f1f35ec380edfb1c1060000204890db60c357a9db60c35735df390f5fc5f30073704ee4abd389c0003c87c879f8ca7bce57371f22a4ae6ca82b1b8e8363435de1701c9caf781c07e72b20b7e1390409f29cba42a17ec30dcfe141721ee4ab9b07a92b5465027ed5e3a80ff98ae643a0ce4e5de9a0c375ea6a88ce57bf4e5de9a0731cea4a87e7e47ce7ab7a1cbef2711eea6a871d1e80bac2a92b9cffb0a1ae8204394e5dd9f01f3f8ef3955723b0a9eb38751504e741be0ac05f7fd8d47522395426726ea8ab207515e437dcc3e1ab1eb5874d5dc72187e3709e4d5dff57367f5dedc0e343eaea17d2e3a8bae2f1ba42bd8790f7f82abe475df1f86da8ab1ef7bcaf6c78aa32d9d4757da7ae7452d7a1ae70a82b1c2e24007595030ed18aacab2d40c4d370791cbec2a1ae6aa8ddcc719ca69a36753de7061bea0aa77b109a20a7f92a485d01a9ef5eba8f8afaeaa61ab1a95aa5a47c1c555737ff510f80baf2715369a8ab2df4b5ae76d4b5f11cafb948efc163c76bbeda515736356753d757a4dff8a90ed9db528218fd79407071e683b0fed932cd1789b8ee0699137ad7bc8f7eca734a38a339d1e2b09a4549e4b973c7be1d7adb451e77e6926487b0eee2c08f2b5c1c78d137efe3a682f54f5c63a8f798f705c1e6c3665d90cd30f5ccc919327fc33bac9a377969e6f8095b1ce802c65012a2e8f88cb67a3e3b57e9f86c89d06b879c92f8ec90eb0106757dc19ccec968069953923dcb98bf5fa0d1f191fb59d1615ca687dcb173672ff3109b18cf39e7b788b146f3733fc79d92a045c767a77349b882db96dbb67b9b76ede7b68f364d3bede07124a41d3c4890cb89e3b86b1e771e3e8d30ee74eca75376630787b1e3743a9d4ede8e8eee788eefc88275767c5e2bf53845354e3d34eec6265927f3a979f69cfe6a5ef3ecf1998db39a77fcdac15dc7290bd6397dfee28a68da6623127d87e60121d1785c231d09f7ed1a0fed1aa97edc14a7d36dbc1fd8a76bdcf45bcf99d3e589bbe9dc35d9903302bf411aef835df3e594a49a7b8d474363d2e14d2918359fc38b68306ac6fb566dc3fb569df7ad46deb782530ad681518d9e87110d0ea3e7b606b98c1ef640af2c26c7715f0e88fff0d4dbfa011292d02509617c11e68b30bee8a26ddb72dbf6edcf9e7debb971d7b80d66c13adbf31c771edeb60cfbe8d847a3cf6ba3d148cbb64c2b423a0f774048b26fd9b689be3dcb9e6d220d7adf9ca267d7d9e8076ea3117778aec22c1835ff7bd979d888bfdefbd0ef79dba1b7c1ecde16fa0dc2c915a135284b35ac940b46659dd56f034c80a16bd0fb8c68f87b480879ff8754af5596b8eaf756454fffcd2936ad7e305e34a758ce075463a75cb00ef6f9cd29d80ba326e4d2138ea03b7b815c26d4a2677798c509f04fc901e1fd8f1c10ffaafed57bdd98a2ad13a3c2a02dd47285284bcb9a2bbe060951747c8df7719fce9d9ed3399dd3cb9dcec35c439fd31f7777c829a9f9c7bd7177e86df563b111eab11a7aa773de57733ef71e3d7ad41eb18707bdea79b5d61ed7e2d6a3c7799844e2c183070f1e67ae080f8ed3340d09556c0eb51da39aded60fa268ad66a3e97ea43baba1d7791ffce0b773f18c8dce266a8d2491485c11ed5c6ba70d72f0369c02a60226ac3dcc8f4436d7719bebb0b1b1b111d97cc70e1b9bf3f06d6c6c309b7a4ad2e3da7b689a361ac12b6a7ef1b8761e95bbd8fc3b9daf7146e24fb06d8ec533764c4e494ac7775cc7777cbc83ded04613cb68c70e6dc78e1dde28dbf1c82949f58e7a4a62fae8a68faed97840b26d3e92258d6aa18d4623eecbf9009b62a38fea2909cdb9d39cbbc679da6d3cac6116d6d170ecb8bec86f1e6c4ed376783fb0b5c3a6b7f1b669159dbc9af3c41a6f9bc6bbc26094bcc9a35c1825af43e47d2bef5b65134b12546bf59424c7b9e7a8981a8c92e72acc8223f6777d69794c8deb4bc98323e8b8af305807522d6e7870041d6cca8575b86f6211c33a333359f64c0ceb6497cccc15c9ce5d58075e36c9239d74d2979b000f93b41837cfdb2b9af4c81521cd78dba4ca5d18250fb36818e61d62157a75a19623a071842e483803095a7ca10512c81c418b234871842bbda3b765043146f862042e5ab3a169db725dfd56dd1d7a9e77e5aa5a37e8d5957721916a5987aebba66d9e3ceca0b66d18364fbd13fc36ab4f49bad31fe9e219f4c3c8f4aae1590db922f03c1183f5944474eea2737536c12829babcf605718b3823a8221aa487db213cad41dcdc3f8c8c761ed6b8b98f0ebd0ffbb0a6df3c2024dbbb23b1f1ad0342d27de64848efbed58fde465d466ddfea277ba67e3fb0b777f52371d0db7e08005bf4035b243aa724d5a27a4a921d7b56a318d114ac835dbee6c3c8c02c8c92d76a2015dd0fa4820a2a3a587dae6f4b3882ee8b67b017125ede552bd6224b125630a41292628290822e54481cb162a96efe811cd51239aa2df0b309d68967b00eec297afb8b639abd6879fe8286288606f6820940c307af68798845e52ef57c0513a042297afbc35a5e6ab97295f76d79a2deb921013c13b4017e7a351b04d67bf768a89e48b276708e15d2be068ee0466fab0867f40e897a5b45e8d24393cbb6e215af814e74dcdb2ac214bd5dc718af73c4ce1ec69777e52a0cdbaeabaeae0be9d8c218aa8b2fc9718bfc60708b31c688d2821941f5ccd8cb78386ef050f2e52deb00e7ac30cbdc9693953dccbb7255966dd895abe667fd2401b0bac22e747d59079664d8db63deaae4162a4c04343a887f62cffa1335bac12c5149aa638559aec61a3eb2268baa846979d1b58d1246cb675ae42911b4687aed8a96e788d0a5e535d2f75dc964f31b14ebd0cbcb2cdb9e6ddbb16ddb94486d9ba4f99c925c9fbfaeeb595dce07ed128dae63d732d1b7335135823d7bb61df360536844f4cc07f62512659c127951f599ffe4a7b09a1ee3944c61f5761f7af9fad16f357bb37a7adc451eeb94243bf7ecdc35566fa71ec9a3dee6c35d3e3bc9ab52a54a15d297d8c50172d343d512bb387cb169852a9eb82a2df6c7da68a8e8b8c7279148b4d3fa71d7ea49e3ea49ab49b0d3631af544bfb0cb07f321621796d58f5ebba665d43b65d5c8bc76ad6e1bd17c44d7ea07fba35addc5a93fb04cf6a8d54f743a3dd814b646dab8b3aa0df2c049f47eb44472840c1100eb6c0b419688b534340b74f0bb1a099aa0db86bd87fc4394124a0e66312f771e41db2fb6446684117ba48ff4f17a3c46e363a48ff194b1584a0fe94ff2b0b94f520bfdf420ad125b9c6d69046d3f2f9708fd7e2e11d8421835cf82cef96c7a3e7e1b3441b7f5b7f5dc117d5e004be48b833dfb4c61bfe11d8c53d877eaf96d7521d3f31bef9438857dfeb44460cf679e4dec6d0dc18abe86404563d8b19faed3f56d0d418aded61054d0a5acda300a9b8b433dd8ad3885b674a6bb1151438eeb49864ab4ebdae5c1d634c815d9308f3bfd7a9c6704e37cb06f6f6b0851f45c1c7a1e36c2c7be1e5ff3307e965df3b22f7724f33ed8abf1d60ff67ebbc61be7ed352dde87d1b77e58ff00715ce58048f799b25eb08802044daacb28ae7e7bed58150f0c354fd4bccf88de8ce8edbb973e9af6cd8e70f583cd191171d7b635b9651e9fafdeaa4f9665a2ed0b5b4fb23828b7f891583fd85c0fdbbb4176a78ae855b6c46b99b72d668db7b865de82e112203925b1e345deaa589bcb1d11c072a23125393b46013c8d3d724998d4d73538479f1016e67ae0698ceb81e70894fe11eaad0702585634762d6e9233c2cad23f4c1abbc67034fa84b278f0dab5510e0117b689b09a79abd2b24de4ad2af356c51c123ead9fe813ea2078d1f499f7d5e2b691fb31a28a0792186aa06514bd6414ad5fe494c89fd83ef1aa45983ac8d4341e461f7878e99d92f08f58ae08e50906b850894e06618bbeced80f5b0498c8d690ec7979fa08c42064897da297ff727a7e08eb7ceb45cfcff91f6e80f47c04503d6be87926f3a2cf0f312faaf302e09da99acf619d6db5c0f4bc10d6993d1f84753e46b10e4308e10deb50cec876a17171e2422aa5e14f019a17273e88f6c2be619d1f5806681f44932cf9e9f15380868b130f350a9969071afb6a8504127d6542b17e427dd5effac6f33f56635f1ec63c1ffe7521e1fa2171d50f46f8b34ef44e08602e493ca4350934b1cef5791bedf2b605842734f526ad1f3c43d33536c8e5c1a6de7ebec40d61990d4213c00242f3d006e1241a1e631d8e3b266b425b184527bf9d161f35d97cecd18b0cebc7df9f55c3470821fc8f0dbc764946f10561fd82b87f2099a697d7a974fd440e25d11fffe722934499a6827d9ecf61656ffbf807abe281241a88cad55358bdf2fc738de9790ee29fd8b49e90c0566367ae0876e92d3c3de651e196d798e106e1d39ff5be8855f63e78f86597ecec9099b97ed937cb568d551ffefeaa46167a2dab4f7cac3e7bae3fabfe0ea91634d844b74d000d8aa0890e36ff278802d4e890b1051b03e01c401e0307885f2e030668211cb10366680f202b0a6208ba6f04b267ef07b60da3e057cc82bc0198a565f65869b274304bcb4791c89bdb686e4ce931ec2211866a11e6c18b2e7a4de4cd4abdf5b0c919e12e7af4b06f9e769e8869226faf8dbc0f0671333cf62c3bacd9972b223af43091111ab7a1c73dcb1eeba769d1bbbeaca3a58ba88ef59b4074d796dbeab7ea4dd42d1360a6ae84485fd641f4d5b20ef1dde325a704d5700f3ded9bc7efbc5591bc2ddba1c7556f455ec619a1a26b1e769e28c2b26df6be20869c9254cf59b3f4c22cbd340845d6c6140a565f41f25b3f24f0d1fb564054b0c707c9d333a704d59f50f43e23fadb63de4f0f25f3b07ef1f10733e88ff5832a8deaeb5f10f7fc0fc91589950a567dea32ea0be2cb9b8f5c921f7d988575e691bce14f8f86f3d4fb564dcf5c921ffdc5cbf344fa79dfaabf7d10472e09aa63855918b554a612d15047301a8fe978f630d07dd5d19ee9efead8607acc0116cc7a79073a39d31f69c1f060ad968f1e06ba0fe3824427fbc3865a3e1ee382b50a9063816e6ab9e072f01ac3e5910da3f8378cbaea720a9e4dcd3e68c2021d637cbece57adb205f237de892a3e17629a9b0fe70caddbd6dbf2c1500e10b418a52c42328a7b5b5c84897242aec892ce47cae851911d3fbd24a48e97dee9dbe979a09c9ef587d4519eb7992b122f6fa02d94df2ecd5a701146f3e33fd1b3472e019153c28f975e0d8d155d4e8bbc9cd648390db923108786d7e226f270e8e5e2267acec52989ff60fb881ee1b76bcb19d9a1e3216744f4a87910e31e801d09ac22a161dbe492f006b90760a7d720378125a00a3b124b4015a54782fee222801d092c02d8afaf40bba2e35794e3228a8e8ff3a2d399cf9c7a4a60a79f9e904835bf4be43aa591fbe14af6b9e5a700fdb1ba83573ad197b8be45fb9048352f4ffa3617555ad33c28a2d6be794844a34bce08bc8def12f9727a3be7f93cd1be9d7be48c7850b473b7e17dac9ea92724f13ef0a4c717d1c993de79db974b00aca45a44d79f1c1a821f79278debc1173c08d3032efaa6b7d503297a70656e9a771a711ce5ae4df34edac83b691c771e9edcc525e1de832f1dc449441d4fab12585db154a2bac475a89a9ca7e5cab555ed3c3deb8ace5fcf68159af3f42b21ecb45eb98a1e9bf3f3178ddafc4993421db6ea8c98f5a47dce43584fda646569e68ac4c3393121ca9818dade7c39acc3a40b4540d53d80bb50896d7c3b12dc6dd8f85657345c04b8dbf0b6639007ecfb08ac9050f9008255dd0604123abe1d89ee3abe1c103abe551ee622d05dc779b8cb0eb4e8d5769b1c10349ff9e6711f7948d07cf4c94da0e6dca90704cd67ea6af452766d6ebff96a5473aeae68be8dbc55993c24b6d7fcc643a2e6342f7948acb6d33cf33e567f304bb7ad1d5cd1daf4a0887a3ef390887aceeda56b1ae426307ae9240f89d1499ff156a3cfbcf356a3775f6e0234af390f97bc15e937df3c566b175dbbb6e96d77de721358cd9cfb8a74d3970382e63575d59d9bf190a83912f548785f0921d1e3365efaaafbcc49deea5fd5d4afeabd9b3c2456abeddc57383e5357a6af72fcc65775e321b15a71ef5636e771564d0e88d1673eb90874a7a92b968a741dde0aaa48757a408ce6672a12dd67ae5d5be41eb0bda622c17df48ba315089a23b19d741bde8afba80a21a1e337e7ae2d1781ad2a51f3eda42a2452cd9cf38444aa6e97c8ac5f4e6bb932fa568544aaed9453120f3fe391de79dc7922e741d503babadaced52546df42abcf93f9ecf4335f225afd723abba87ef0fcf8cc83324fcf139be42951f399ba822a1f1589d5e9ab1d5ff1b8cd6f8ec15fdf3c256a7e731ddeca741dd7a808b2f48281858a204bd3cf96ad83267a97d0504ab7ad2e67f4676a79f9af93ef228610bcd8411461b608638b2b9ae89dded60ec2e04118add3dbe2c1145b44d1366a88e91dbd2d1d78d13ad8420753b4b66dd33b5d3549d6f4b0457d89e90d738969fad8dc1a37802a2d49c696a1a6bf9ab636daa6779abfbcd3ac48a2185b8862a8e9b3c67a39243740a18ba18d4332802a2d2455cb95d16fea0aaa5634546e55ab10574b5f79f5ca55a42ad4e3db5f857a2c71a5002a2b2c15e9a4973cd0f03cbc2b57cd7c8767e309712ffd5485ba97baae0a71f5ca55ddb7d7782b968ae6a700edf32dbce1db5616430da1cae45db96a85adbeba7295d0e8db67aec35be5a842a3aa04a9f4158e2a64e3a57ae52aee37ea95ab66aa908d7ae5aad1b7aa04a96e4c7ddb92811a0d6b906c7811a76497d0b012d181d1dfd4c2a59fac973e2b4b671c03b673efe20e57af701fd525b8aa440154a38d3b97c73806709f79177766ea95d1bbbac4a86ea1e72e7f710960f9cceae300968ac4aad1a55087ade0d05067c4b64ef3a32f71d5e8f49f94a6f5342b101dfcc7a4e30e5791e0be5d1e833cc06a8237c0cb536e021f9a9c0f5dc74b0e08eedb2307c4f6515d8dbe9db905ac6a54bb988287dc0256c5552ca6e05637a6e06b58187754908198feb0de8d8118bddf4c37bb438430106393c081f4b66010a67714464f2ff45edb28ddb658d0a56bf335d20f6c08eb079b4b12cff56bc119913302bfe789ec9d924c2f347cf47cbe29ac86973f5ba64c1930d2a382a3a511af797aa1a14705472fa362f59aebc7ff90c0c71b818ff5830c249b610dd27a1fa46d8b05613a8881b08687f5844472a141ef677a5bc278458a8bdfd0f028b802296092d118b29cc16511a37df4b6b26891e50a4d6e590244cf6a0eb4013b0f5bd1899e893cd1e1073a513d21e1a1a18e171a1aea0c7249e6b3fae1682ab29f643ff5b09dd5a0d6649c5b66031c6ce4e5616e3443d234d2cccc0cc9c6b58e741eb631331a7523d268e4f900de60d5675b942916bcb4e8cb3adcb1edfb2c4db40dbd2d2bc4f8c20a2ee28679d8115d760c6bd135b96d1e6cd836c0bccd2b314a740e74d95bfbf6eb5fc72540fb7209d02a0fb441741ede3c01304af4cb1bc228d1b52171e7009c125db45d5a34a445435af4e50ec02891a945ffb6cb2659e7a43dcb14bdad2c56f4b6acd8e2a4d51f046cc7868d5d18866901fc1c21dba2e0b976414e4299467537a56da2f839a786799f900f7a47b6b5330d15ddfb3375a6695afdb047ec57f6444833aad4b025621ae67a6357ddccd0f5c09817cdcfb9cebf6aa9b3efd6d925ef641d24237245326c513b72533bdba6e0774774be26f296b86a0b768d2ba265f547b6b34a434557eab31af32e2ff3beebf162f59352cf789e28a15843767186eec31adb8e6c43783ec1df04c9a947768800780ec03aa7d9c312e16678ed648799b79c5a300c86120403c9806160181024a1451086b2f42e9115824390d48d6743f3cdf466b2b97e4f84ec655fd7d5d825d4547ecea8449ebd293dd98237f0e136955459b7a8615c17ceb3371f8dc05aca2e8c6249f97375dd30fe2ea3ea8f10638cf194ca433824b1ad2b996c7ed357904f8810d90584b20bd90546d945945d64173146d945c4d213c2f9458611bdf017d20bd9e5935db618651778617d75a699ab7ebc4373d377776aaee3bb3ba7e3f8ee8ecd77ecf078c7c3db4dedf0765336de6eeae4eda66abcdd148db79bba2a67aa3a6a8efa61384af5ebb67e367dfd46fd4c36ea77d3d767eaf7ae7e41facaea27a427d727429ab7739b9018a3ec224a2f3aca2ee0958eaf74f3cb7da1308ab46d28ee70960feb3ed3f7889a9c65dea81f66a37e1df699fa99bafa91ea87c2e61616679ef3600e16679e674e76ad7ea89bf84bcf331339e899834a93a5935d641791b272f08d216841268cd634b8ed420821a55389dc76778688a9adafafd497bcc05c17fd75c915b978a2e48a4c4abf525e452455a2354fbcea988ef2659ae81fbdad35c2b419b2689ade561948d05adca61a128d3886cf807d55280682a9300ca3e47fc90e929f9c91d5c9fe75dd3f8cf4ebbb3aa25fa8ab7ea59dd1b377de6eeada5469e4893caedb358f264bc7d527a5e6fd56b53377c4875e36579fd5a0ac3ed5877e36636166d32aa661adf2e20f745f908ee70f741ff685ce21e20e6c612ba6851dbb563f0c83ad8ebf3c28030f9a6071e2e197ec71d6afa3f54bc733083a9ef841137c308b5e300daffaadfabaf4ea3c19f006f9b1fa9ad7e072b4fec49e138ed178e4440ea5d7f5eb1289a0181806926132994a2593a904c98064403272e4131c050c0366d32e0806c3a0187e462f298464c030ac03398a8c420a4f1280c7e31d6008a3e4471d764a279d74d249cf13e9cc9cf39918c833d567b39301799839843698d946f5a136aec18db3d2279b27cb4ca30ecaa60ccf33c74e3d583fd91c68dac12b5578a8218655320debc79fe7894c7b867ab4334ac9302433d41392fe61ac299a56e855e80d21d37d415a3e480eebf0a5cc2a167905c1c031fd414ac1401ee8332806326395fe8361fa0b121dcefccbc2349ca919fd4c96651ffc9e947a7e06664c1942307c7a9ec80c4d3125dfd50feb51e5ead7910179f830aceb4aed733d2b95fa3acc2a2403deb079987679dbb367bcaa69c90cb16aec180e7c47f4452196156c025639625ef3e84d71678828bba924a6e73108c4a6e6e5ca15a3e73348062403a314928161582d65c7fe3d29b5e818765dd821191806c35c14924182344facd1446f2dfa1967e8d2d89987f4c6e5d9edce6aa2fa21c12ebae89053825d24ba48d264e93ee9459c97dc11d169f5b92e1f45d8901c14ea37992296fd9347b0fb88946c8d7d88e89c938342fd26d37eddd6c8d855b1cf959eec02dec0cae03ce30c57744e6f8b0c1a8d46cb26d3a55b6b84d13af4b6d698a2cf40a6b59c4e7669d96ad9915a9007d8d956b2b90922a4e7a5173c2fdabee6bcec32d1a01ec615b9b49b9ee3a5dbf8e8db2f6fc528f9cc83431eac12b922b31ac128f9593fc97c4dbe265f93afe9459b93ced34bab3e74bb803c6835e78b6baacfb5ebd363fa9afac91ea24dbdef881e22129d43b5e8336fd16f985a741c3a44a7819f6c9e3cb3b37765dec781e6eb12c361c0f4f58c9f8971da9af719d13fb10c99eeaf034dfbc86c28c6f5f9a43f2946cf7f124c4fd33f2cc7bfaef4cf64e3a37f289d1a9a15741f1264fa8910e682b25767cbf9cb33a20cddb767b4fc934b619debf241ac23b56c9bded775e4951110b697fef8188724b608d68f35bd4ff6a4972dc8c375fa492ffa0bfa89fdc1e69464f5e386cffec92efdb1e81cc4ad61b24bb3761dc3bace64fa3f54cb7fa89ca6f412d253328fbe0ecca648e60559b6b823116a7067484cc9d3d40f33d50fd351bf2e47fd3a1cf53395ea67ba51bfdba8df67eaa87e28ae6eb53b767ad13f212daadf13218ddd07ecdd79b8bbd679d9316f7b7271650b2e586491020b0722e6cd8610420861e582af6cc15c180bcec25230160e60de774463740c737106876131380cfe82bb1c21b7ce9b2779d787c41d2346ff72b87fa8eddfb57f26d110d9f3899086fff84acf639c92ade18d883b308c4dcdcb2f73959e1fd52f874ccf73f543a1d1f35bfd7e46cf6bf53385f9bafe560d2846cf53355ac2fa75a06517f0866b630ceb3a93e97da1aeefeaeca2be9ce67f397df1affa4448fb64a7d9af7f4f84b4e897e89332f2e8eb0092d95876d905e4613b7bc615c96417245ad32abb8037401df0a60963c0b0216a0cb98463f8d2979463e8be126692f1f01242ae5af8b24fb7fc18d1df3525fc421add9027b020e866eab6921a67a8f1050d961357980145143af8e2034f505d44284313570cb2b0020752f88214ad2aa8d16d4b0d2f64dcc4d06d8b0c64c4d004317831411a5d601752806143d418725d5e076117baafd4926f5a9ea5e461ac0adda8b6d079d9739ed65965e43498326adf316ae7a441b3279da6c8b08c46eb079b560cfb751cea61d00772416255eef595d8f43eeecb9b506214464cbb7cf03921a1bf7e55566bf1d7e5af0aa548bc241a5c5a63c8cdc7cb43899772d2ba2d4ebc606c025396f3524acf86515200664820cc292f9e286b94524ea1a59452ce39a594f25ba58cd5cb61146ca121848ebd2d345afde5cc25f4a04b173f6871c1432d5bdb9c0e1b6ad81aa9f299fbb6208bc3e761a8840eda3077cdfc521dc2869a8741a0c58d533ef0f4524a31b4c4c085b9c5c9be1a7ba5cceb44d745e7d3f365dca048744d24825c118c7e5ed9ff852c1d6f83628dcbae5fa71c92f9ab7e5382618ad678bbaed35f150a76ecf2e62127af65dbc6dcdc1caa0228374f6e6e5aca6d41b9a13283e6e1c4a00c699f79c9b27724a7bed7d0647932a4b38bae6522ef0bdd90c61a137958cb8c0a94217d551f7a5a9904375460079b2c40218d2d9c31022370b15d52c0831ee4408b30bcc0832158405b2656c084185aa0052224a1052a560ac0b0a289315a5f308116d576b980b64fba6d79614c76e6672b84e60b807530f64215215cc1a247bd42b822456ba41979facfa6e39b6c2e24d731be3645470f08363d3df4b6e504978614766c89600cf4a2fcf5780c7245a2fcbccf757acc8bd0db16145f34a33a1316b9d098bf749f42371f6db6e8f1eb86d1c94bd6f9116abe94df96086c796e89cccbf91fd83ca3d031d0fba7eba01b8902de3ddc8d1b27d1b1b20fb6a045c32bcdb3d5f160622a52c68251f160be78f1a2b505172cd4c022cb982c528891020b182cf1ca9778250e0dc554fc8e15c925a6e219ccd4810e1627de0b53dc22a6e216710b2e1d3f06d3f1fc6589f0e335e6d3f818a917ac63ea78e9c5eac56c5d5a76c5e8e0374608eb32448276116937fb27624e8956bb4c7ba68958241289ce98a2371164e940bb92ad76530a9dcffc76eddfd65b2dc5986d5996659968835be8b678fd138944222a1289449a163d6e287a90ec5d1cd12f3ae38b7e6feb8c2cc8346cd863ce80f58404fb374f0493ecb4764db4759c91d20721a75ddbb68d2b12af41ee88e848b7c133baefbf619d988944186744fb977d1925bf9c110fa845df20f01c9764a7b3476d21d09db923d9bfac768cdad728803b92d54ee4c1a18eded771c9836474dbe28218fd959a7fd6119d7fc33ad9f928d6c1ce0fb244e0f9384be43adf06c803bd91edda978b8f1509fcf6ad7ef0f1acd6a2f71dd9f679821d0a766ccc506bbc6d1ebce6c1434ee469f53bb22d057b7628d8b3470fbbe48a64975c11d1973bc20d0f316e71e0a9378237cc6ac3a8bd064931d0c20c30b898f1831a98b145d6db3263085bc8a841991940218d1da82e3496b0451824e0c28a2e4ae8620c31c831ca80a5212a33bb80dd408607c81001cf98a067b45c6300d17be87d411a462e74f2303e09c258408faf60d4c6f83dc6f80a9dd07d9c45ef67143ad9f0504080073c508328aef02005652410843130a10765acf8c0158230c75842bcae31ba60520038100161eec0c006710598141914b48a6847086cf0c40b9cf86206315134610a6640818c11c0c0a2bad210959962383050984982e8ba72f8c10dc05ca1c9aeb765c6124d7b5b660c95aec0fa935ec82c2dcf10c3a89572084cab3766e9e53804a625bd64e9851f0ff5922e26b430a63512a4144248658bc52c9179be46bf60c17225ee5831e2ca101c32c208295286188209930844e0871f7ae8818767c8909c9c9842fd2653d7cdb98c8a1e9832b01c78b9faebba1bbbc3b3909e3a1b3a0676f8e40613c228388451f09727001c680104421a1edea0bb7a5b62c40073d0d1de969831fd6d6b5b2654e60531953a9b9bae339d3b437f288ce5159e03f098bef5a2a52031ac004dd8ac2009f003cd08220ccb64196620955186a90a9d9829c8eb92412b08011729acc0892a52dc804c197290c4962e3c58a3004dd8cab082c4b01e6360420a5e9c6002165d684801981adce0094be8020504f881568611440288020813c3883831023923e74e1928c06c106d7c418ac2105750c304587041143e60042a042f0061084940430b6a0ca08c156465c4a0745d619c70c20760d0628c17b230d28519b80008443841190228238a39061066194e4c134f1a2040a30858ccb8c115484040159490022d55ba000213f0a00625638d191ed318526018195ec8888cf1c51c6304f20a51bc20085264e1cb182c1b58d1a2092f665481258b20333dd048e0a587e9b43b3c58d6a2c1746363bacd0d7693094e01ab4f86f4751b93169129ee882a4f4cc15f14093e28238c344490450aa0505d20c042022f4230821898d1525d3b48010c0d64fd9e0c69ec07d8160fa320b6631ad25797be6e3384be70a8ae0babad2d93031a80e104315820031554171930aca1823388e0450e6ca0baaa8d89d60febcc1392731bd30da7e03f536fcbd4f03df0988e2aa1a0bf1c2f18d327d0792965a4d7756d97d7c59d2062a4008a2a645086165ca0badeb1ce4e5f37d9a0afdf5c6710e10c4c38d1c41512a8ae1b46c9c8554c9527e018377455340b6b34a54d6fbce06508a36c9085326c2b0b61482e1a1493858e7f858ebf1fd63a50085dfc06a18b8f12c2181fe515ba785e297cf1e2456b0b2e5864e112905163cc199c040f81d982c05db4103327a594524a29a594524a29a594524a29a594524ae99c94524a29a594524a29a594524a29a594524a29a59309ddfc07d36829e70c9a535628c6172f5f8c0186fe4335a594524aa9a65591852bb2104516780b2e5864c1a4e8b098ae4829a59452c6f8a11a55612ba6d6cb17609c10468ec8059c852a6860818b2db864118456962c0b10c2dd0f7e42b8517a0a1f67a5b1221e0b617a1b0b61347cbc162384db300c8dc13b4ab8834e3e4a3805a3164b1360569065dfbb52cef39c73ce39bfc410d5ac90b1868f2cbbd0864ee8b67585313e7bacbfad54626b39429eab54a97265884afe0a4a255fe58a49257f0553c957a9b204a65282a4c6d09049a5c445a6ca12289512718d2195fc124354124229a260d49829402a7ae1148bf36d0d1712a18359c34b0f8b29aa046d6fbee9a5f91a84b5f3be7d3c7346b6fa5099bddf8d51bc3bfc611b53f39fa9f7924b27b760546bcc1662b880c1e24b162f527881a575650b2e71c7ca1ce2a2061663b2889122a6f83b56249898e2472c31c5dfb1225b31c5e731b308b3088bc3ff62f2222febd7492f628abf318535fcf462892c8d159d0f3cbc52a717d04b83f9784cf3e1165dac5f58c7d4cc8497fe3a2fa0163a78fef432b7685b3f266f39dfd20b9abd330add566c7ee9e0e714ba527f5bef3f4cc72656867546a1e386ef72852c0daff49c928996571ac2a14d41233605a56c0a0eb129c8645330029b823f6c0af6b029c8b32938645330675310b529f84d41d3a660b729886d0aeea6e01709bc32bd6fd627f04a4381579ad9935c3ae805a3f63b56d84b4cede190115e1821a52565882d8660c2854904b088c00f71c70a6789a9fd0f31b5b7c252c4d4be8798da1d2b8c25a6f64a4ced87c4d4f2504ced73626aa11a31b5473dee588163626aff985a2826a6f6a698da5b8160626a6f057e89a93d16530bbdc4d424f19725f2f165945f0e097f599c3dbcd2fc412fbd67454845a0edeca6be1b0dbf3bdb927627e7cbc4727484218b0d9a2ddf6db742952a8c8156e84c5027e7d413c228d882305230851d9069c2952aa8e8b1b893d9c00a4d94200b1574010a15d521a38c6d8c31b2fa5df5c990a6179293c328f8eb3c9c137736fa31c2687a1bd6b99a8ad1f452517a554829e6a1387553eabc8d51264ec17f60ba6d8189a287e45c51edac0ade8677a40a476f2b0b57e8516f4bcc968b270f96f5840c7e60e58c196c418b107400c14c690a31559620c20d522006ff90441a520853860c2b7c11b285071537d812a60a587e508525d8061f80690c61063de842023233281380302ab05186119831a60b1d98810335ae2c193710c20da2f00210c288420e608c205955584108659ad081962c5aaeac133355b2ceb50355f39dc9e6f57b72d3d8a517ba6d55c10b2cc3052ac0c203583803095413879e938c2c3d6da8e654030c3cb8e2075d28e38b1854b36263ba6d55014c7ff21b7f4083bcdfa1df1f8077e050027ee09dfda442979ee96d51814b2f7724ee6c1a22c00117d6104306152d959c8297325f98800c1e204325e5cf3adba242182d7fc33b9d4a3e08ef4895ac32e836de8143a5e8dda03805bff05ce907ba6d49052d50214c7f3738d0f6e6e3a1e62f049a727180e03ba0b838f04158f3e2c003c9ffc0320d14f473f5fc0f2cd354624f6135d00f54a3e9f4e0e2c08a2d0e7f7ad9e2f0a1a76d10d6a2c5e16765ba676b74f0f1100dd681579a0fd5f8a2b73f54b30aeb0ffb0e79c8096d59a7087ff958f3215f169995bd6dc90cd9c37a391899210fb45d22712261cb135f7840045cc0826a9330832a9ee8c2094f40610aaabd89756ee81deafd0fbdada1219e1ee20ea6daaf1070422a64d1181e6ee9be52430831781bd67932a463993265d46859b55c57151aa2da32eb29896c79b9379032142306971890c1620a62c01774bb69b0051dc3a0b7f5854c330b7a5b4f9042a37a5b4f00410bba8885de1613ae68e8a5b7e5258c0ed2db5202999f1f24400c814b7f47d618ea407f53a2c025a88afe8286869e54a1bf202c433ffd05618105a8bf2032bcf4fe070907fa2be28956ef7f8e88c654b146ef8f889200a67fb64c1930bd4732448931bd5ba6f70dcbd0b4f9cb9b02fb3aac3e7c18a2b3a854e995ca8391a22451c7149aa19199045000631540304024160b87c379a6aa7a0f140012a3aa4a4a9b09a4590ee528ca2064902104184200000080cc98b629109398bd19fbdf5ceef7519e3d4d791f92f40cb43248d84b84e16960c9512b59ca21f3092da95313580a6105318f287b9365b8166341dc3dadecd2084197dc2e1514addad312ea8c9a4177d93a05c407d6d72dfdb524b716a070522326fc2bc66b1b492fb3559595c10b09202babfc2e26b6752c3767068f58d64bdc3a9105019e6d447d0ed6cdf47352bfc7d0add674a5f485f559ded48ad56117a7e3805102eec78f117b8bcd4b8ecd42404811a82c19b0730d2ab21cf59d98749558da0a627c1a977a8dd06dfdc9b297c2e09cf52f5e68ca82feb1e65b2b2f069bc4730be325ed22c6346f97adf3e92658c63549d4eab7ede57f20d58f37693a0fb4c476f28885fa20da887517da45b5b9a8b2f9f5a3759888623ee7b0b3f6f55f2d8775fb121733744b32cea0321dabad27af91bd668db74e8f8bef52aa6441200152b13bff075a66a74864f5eea6575a09cdc8209803d5146ee9b44f7126d96f2625d2205e5a8157f6031989ab622e78b6ffbbe467e0674535081372ba3115cc106d2119b570423013897ee46545c9d31b63d40addc960f6966786d09eb7788f197f1bf7f71694a483ad5e5ec3d0a7e589bc57600779e887c46ff2c75314399cd203081a1d00a091c8bfc169c52d25af24e1a8c7ef93838b7adaa0b4462a971463a2486c8fd0d7081918ceaed022e27874978b2c8583d524bd720b1c5348ef670ce04c511f81dce159da038ea242aad04ed29383c4b97fcbe025c2b0d30424f884985ba3a54a81f9f30a5e7fdedd6d3ff77f3af3588820aeb35802a251a129b2e07390060fd2a9c34dd275fbf85083e419628e05047b558cbad4d77cc941d9b225f75bc34d1f118abb422abe029f92f201352d5a0486236fd67296a122187afed555d6bab1f5bfbf6c1e228d1273bbd6983bd67d97b199e155db48b466172c0e054736ad2b6885e81ba14f90ca6c026fe895b06692bc1483bedd08fe2b87a5b6919935c1c0a6504470e62856ce171ad16a1e27fa4390a5e691445d5eb6cc5d81c5770e140035dc4ae485a837d2d32b9f1eac06c9e75051f7c89fd2f3f561ceb24f2dba4b8c121bc467985179957b10b642235057737c6cab7e13e7b664251fe5c64af384bac7210106654fc3fb24b1fed88910034b2142ec465338bba6c6a0fd39a044642ac431723625a06b9a5a873bc5db796e165f3c881db51438eb28f7ebdf8fcc386c3b720394e3895dfc549d1c23545dc1a3ea9e1a54bd199c930b12769479147677254bf25660c03bea8bf73a2ceb12ba25f971e26c573c3f111e26feda927940da4222a472842036262bab3f084af2d629cebe0873f99713011554797d6f986754e8041921b5a286f70a1a8a6d85c0c0e71f2bfc83154a70f68cde9c072547594080dcc388247bb03cda9e347b9fb8b4def70509cee167ac92c2688a337a6dcc6519b94c87a20faa927bcd1c2efe65ebe5491fe9b47400cdc988f3984d4652b2b9232f98c9c8732537f33e3019811ce462de876c788c1c13fc405c2861b330a22653714c8c4758d4ae985f5be79193e2df526a8bc7ae8115ced6ff43351f44f662099d8845eaec88ccb8e1e742568f80309be6d44538e39d41ab0ee4482cde537a9784cfdf3fca3cb1fa7ea74f734e8fa71bd48dd480b5115210061b7f9853534f0b12e2e387841e15777e5006fa1e9b2e8e7249841c21659f339c1c1edccbadc1b32b384ec98332cb276cfb8a24e89503b458c1204b34cd4d678948d61dc88890d600dd40adf0a9524db81a8d7b7187b565e18c913903a1c942b1c0e39605043057a69b59e7bebce3a23c246eff48a4fb60c326d8d4fe943d659ec70b465cd7b1fba348678093d46b569fb88ce491095b00542c620c4027c4b65f6190158cad9a1830310cab003e120860b35fece9a8a9cf9b94730176318367ff7f46fad0b18d00944da7c66e287ff5996cccbb38011640e5a8273d53afec6969911b367177deec925ededd16d81095c2d5923985870dbfbf1573f194b4bafc8f274fdf2055e552ef2cb097a24ca47d9290774f502fe7605b85de832af326143685ba8ab05ec24cf1481303b9884c03f3930596f679d9b380a82be9b109652127c4fe1a2a6ff25338ac5df10c9ccfc3cdda0cf73ac832f9bdc58acdfe6c06f2b8f764a936a0a8a3b40ede827e2a5cd0a4ccf2d740526d5d3db508d4072386e8db7848587747c080ba11510ae2c4044c6e5839efaa42cc44d68d1ee56b692b88f6d47f737081e87e8b0064669e9f3b2f5abe1a068fdc253b1468e567144a3f20005037e17dcea333724b948b852286d912f5c6c4af7de84c40ce003fe9f251ac408a9c9b14928cf81f13b194451bd174fe7ad7abbabe1455dc6f791a6c2c1f27024a20f616bbb29b2524061375c75a0233a0c1ea67180e11a37cc00d2240670e871910633867720aaf35af2e028663282250ab4a5865dc50a401cf7dc845b5bee5a8224ccf8bbcf5fbe73d9a558468a8ea35519bb2cdc125c9522388a5e66fe1057fb0b30fa673b3b5faa28321a30b5a457ddeb6e79a7598bd15258400c31f3c60f3393043e043d5ee0806946e7d3cd77f08f06c34fa6dc270c99869b0e1101b0cce086cc023407444fc350644cd9735f5c9ebc12d8fd8f06a3df4b782eb0825b34131f063b979e4022d773e1e1452e2d9c3c3d04257af1456205c3d9ba7953000d6d17dc1ddded3e8b3a08860beea5f96c75ba21e5cd1af813ea829f3a46c4bf4e0b223711f3f3df8b6252013a3779b80f3bb373f4914e20e77c7146a090051448787aa2559fd2a16108b7e4a74ad877e5510e287020a47f0df8575c42d3b3025cdda1651a9cf6d5b84fc670fb0144ece2cf27625d7d19a1ac24b14a335a89751e7ec8cd6b0659a2f28ca354a49640beaabe399ae2a6b5cb0f8a85bcf492ee9511a9e7a4fc14a62cd52e75025c93a506dabe608f7b727a846c56aa5df4a26dd18922351235d860215590ed401ab0369d4a294df19c25a238a1409cdfd359e0c2841248075440183a83449d012fc194d6c92428fb6c84372c83ea5b80c23766c074deab5b8dd8aa09a8047da42fcd9ff4ee428289b41893a32201d31287c55783d114640f45356341259a173cb6c31b345a3b242bbb7da26ac39127d31bcb63e919d664fccaf3948542b06a77b4d875b842630c4437bd4e003db7485e7b1e99e827e5e10bb595fa7887764fd712ef9b76df02423ac4ee5577fd004748ce293584c3fe7da6ed8a11a52318f483e42b136c75906cf8e0ea34a467a02fa5a029c0cc5400cb625536224cc1b594297c40cad2ac6f53a5c81e2522a1e09f34a70444dd1c8b6e2c00da22c31ddc130e721d009a2565e6df86c127e29ab662cf6672cfd33b4ad518c2344070973e2d8802ae924f374e0248f81e5f3ed1905b695faf4cbd4f8953fb320623243ed5d86a827840f34377bd0c3e4c5697c9a7e7c4b57de5ad5509795378691b073e7d3f07ccab64cff33518dbf9d685d6dcb459d081a5f3daafba0c23ce32145414031a316ff9cfa3c0f8c295d02bac1016f6c861e01e406ae20af0294995414a2c286ea8ab2ef82449091b6aaf115719cb1bca342c1a2ec45fb57a75cebee0b047d7179fb700d2bf9b68dc0f578eb53bef9a1544a331c964f2aa8a7efa5883fac183eb84906bedda7c82c15b4084d2ec324dc8aa77de3e10c5104cd3cc5200065f719a7001feb9bbc13c582424f2a82f033ea75099993aa9e49333bc9b36cb5124bbb439f75d1ae95c04c66fea09ece35a33454cbdaae6f44132c5c281db9500a0b972f3574cb9e3dcd487fd630b0b53adad41e7442e46f452587ea5adfff0d250cb4058f41e6e8d8e0cfebaab3c6eac615ad66acfe12439f4e3bd4a0cb0f069a231e7dad1a4673a1d8fd823e1a19e22a308f0356b13f878601393349f3a734f1c2078e6a8029c325a682ef65d60c0a71127bd93f99e6e4ca2d6781c37b92ebef16570df69ed3fd0a87cb543b3face9f2936bb5f22555b3251e5c00e20fb45782e8f4354fd4d43e1b547bab0a4ef402277710897d31004938d537663c3d66e485aeb29f456d9a41161119d7b97f794c5d04dfdd22ab66400fa01f18cf713d3f2cb58c11b6a0a243e7bff6b7178787f5afe3b6c16f26fdb349693301e938640bd7e8faac1065ba7235e2993972820f9e51fe3efb4cd64af499edb639d7fecf2ec1e0e00a2bb0e4453a5d860a7488802c489574bd858f5641b060d901ceefa82b8c66c813d35232368900ca645ba1ef9502cf2a05003f2f788b673771c6a1fd1fa3f80ed0f1cb889ea0e68fb31cc7a81f8cfa3397d979bed59d782ce30aa881028aa0044db722e59db3ca9f46b14a3b104683a0fd4ba35a493bbb672c764c791543e46546c91a81144ccc4d40c5035d57d470bba02177a7f633ff0f7794b0f45ce4071d744dba4743754b8ddedd821ecf179704f9b4246b554afdc7e578d291b63740f59531f4f70e4f26437a4f06cfaf18638b419d517d5569e2093f0a1a4258c16258ce719eef072574cc90823d8f4b974843b9163842f3a6cd78d3af3322865367ab4499de8fa9f22538555f88a4399efeec8f20573c560edd4c54b0ed11c3ecfa35ee130eeca7182776ea74c02df31caf89a1103078579bad4794c4dcd6de876ef2ff89d85fb7d95e19aad7f5260013f27ab9f412b85f3460ba18378976278e687aa3b0a32b5d2702910c0fc88bd756c7ea0021cffccc294ca15392e837d29a0315c488da58abb6f9b0daa4eebff3f8c4c9c1378e5cb116c790ebe885e64aa58a4efec815d14d707309ba8e288f835f0451ff4f8952783f0b464084761e91f9850bfbe31bc6840c9c4560d9022694b7fe1282ff2be0292c7df1d5e60502fc3bd6299605209f33ba3a3c2ce1e3e8e80f74c74eace9b9637a0eba492bc8ff444cebe7baf18806c727e4d923d077e311a1c3413f75981e84251ea9e560514f70323ee96ea4311c3555ad053caad04b104f54c4013f78bdef3bba78f1a0edbeb5ddc5b88f62c73a0bbea39342dfc9cd3fe4336a6f3390b26aaae9ba629afb135000c5b4a0466bc37de5794626600114133f84964c839afce30c1a251abd813bc252232f29207b71523073e395711254e1defa2a41ca79b66e11c757d1044dc56c19b0f8fed9c33edd65937d21c37f54b14d5b79894b9235593df2071e76a457b7ef54b02f6b4050f3ec5c7815414d73350bf476178adc9a6d647ef8a36ce7dbe66f779a3fe5b45f6374844f8822e09cba6aaf2c65a40868d344e3893e8f3503c4fa4f9705503744de4a3bf66ab847c8036312616599c90315e36a7526cd2933545ac0a989ee0e52651a9a648a4414931ef25fd4d4061f898e81015a8c19801e09873acf66f77c7acfbda0e4b3da3d15d0272811f37febaf84e4ffa9a84fafd661e3d123158f099b0b40f132bbbc5c76c4972a5d98a650c960b913f2260f2d42803bc1643624621a40990a737527f4aa808d2faa4b6c49af6fd254fbce580025de652f4a4a821851acc9b5ae3dc2177b227da11c73cacd3e0bcc0e5a6726a804e885702f11f68a402f10f48a207b497818bd9e541d62553ab2c0c1c87aa2f27524046a7c9a1c76a50bd909dab3860ae867588115ad044848bb0e167a48e9fa5f04db11d9bc2ed71df00d3bdcca8b00cb09dca24275c1067f0bf82461b724ef6a01746f24731daceccb80a74095d862fa89d1ac024bcaca2d5021cbcd315dc21004e58f0ea75a62247c0753e1845c09c6e8ff6e430384a23cbaf6efefb22db6b66c4be7c70983a808a6babdcc3a080e7a574cb26e33bd04fe57b45a62931853755ab1024ca5379ead4c170a363ce37e72669520e292becd693bfd731e7ba81f0b30a8f99eb73cc29c8a0bcd09b28f1a8fea4edd31de8dd32b698f7deade7d77934f51b68c37c79b614a598c5a126858f542a6867069f1dcae89c4efd53ecc2d77ad1e629de302c7ca5e225b9cd8df752d0e5000f18be4c1e8354d841752776b96aced1b4c03496eab15b8693d9c1d7f22e9495dc904d919f24217c4e86253a05187fb1954a11f9e27f2833e646b6ddb2b050ba13292e51d3b8989500bd94f501e468f7accc25e50f7a3776b4192e737d8d6e2069058221107124546772df430b42c131d05f936f8590acb6f20a49994482b227bd0f6d8224e82195ce380bd4b38aa3974482b3463c817d4345061fd5190588a47b16a533338762170542f313c628de14c96c2f1948a8086c239faf7e7fce3645812dca12bc99495df34ad19a7289869b1840cf7c6122a3a06a2b5205e959eb2c5b3be5b2b1225e8feaa0d3989931901d8494245e1e1423968f6e915d956afc5d90cc097ed367d226707d57b1b4dca75bad111a78233d872391a072316416937d0016ca20d37850522da38d9aa4161b1068af458485ff893dc4ca46ecd9b61dd00fe18a013f035f1b3a186b97b057046335082bf93d33e61fb612424027191f19fc42afca6ae3663bb741e4739d963ad615512e9d7a8a9b7d3afc1eb36c02653141bd8a84763a043596eeb9350bad8432275351f3ec4f7dbd8d72b79f2a165525cef657b2c9591f0b25b09a7bf502e501371cb2102901d8b5e4694c6d09ab3fa3cfb6f01fade350fb97f10a96bb0bce861b26d0d4af238b8ca9b119adebed7c41a0a3c39c4d0560b8d4bf55e07a8193f2d2db073c34495e5343c13703c65d82efa6d2e1ddcc6349bb084de862cdd9e84211ef74573797d9665030e2ec2430996ab5ea155a9343fde3b926d6f056b76ea30af38b3f1de4613a510931d571a40f08ceba941cf7424f6594d61654f82491f4e238470e6e5a32be912ec79619a8834f98f1a1e5959cba0558ad25997a5327c689bd9665d2eed749705cde335043d9e7a9f5e9e8044b1c6fb0007c9fc1fc8bfd3881a1e99d39393d34347d69523bd49bf2be68fbb8f3636774983a30d08252f4df965a62eb2b778dd2a486e18593861e063e0352e121a41cf884fa8943a1aa5b04ffb8e7d0b7c799bd44ae61b66649c46657c825b21897463ca3080f14fb45d42f1f3ac264af76b134f4493b47611f3c54428f1c6418b4b7c97266b650109e53b7f3181eb4ecd0408b3abdf0e8c0dd7034188c242c5902e2606fc07b12e25c2da7fbf1dcf0cfdb9494aa18564abab51f8933d4cb536db7ebfcce70dc51f282b3841e9a9cda4f10f27de6122f8f2a4a318eb593a3c439bcd671dccf5d02cfae4535fc9d71073ffb77cd8354ae1e6b26b62fffeb260f748d4a59f9b80aec7c5da42aac3dfee8e2cfa8e1eadd3dd3d22c2d50791d3c66dc2cfcffe8a27df7f3b3b3b15ac6b9fc020f8b9b3b4281c46338c9f68709e653cb895a723492a6cefdeccf97465cd0b96d87496ba01f003740e596fbca0376406fafe589a3e8813407f9e5c4b6ff132f0fc921859e51bfbe57417ff355f1d71072934c1174d53ab554b9fed7bd2e19128f4e33249549ab2111350be85b6672f74b74ce46e6ebd22fa64dd5e3aa08f4b5c3e834f50c5722f47d30948ce8870838922e3176d0de961f3e140862cde46042dad63526bf9f2d0a248eb5793c55a295c84c5ca01c90c8041d7f5037996d4acc910a7e504ecef03559b2f39e6d6d8bdd302e3d2809d2a4c8a3ace1eb94e5d020a09b59041b4aa4348fc50a85a967016797d69fbaa1d8d83cbedff7aac7fe50cbccb0ef97904d175811ec5f9fcfd0837b8fe7a18adb13d7bd708b64737f1b6c997af44087acfab634f76423c58896eb8185d31093c892b33227a5230632556222c64fdc4a429dcd9479718a8afcdb5245f1b768d276211c0d0c16cebf6aa3821daa6631b34dbab68e04b58ce1ff17e0c0f591fd08facffd28dca21a2061d55cc5c4c5b28809734457544626139d6bbea7333c4ecf0ac515220eb006115db5065274e4821508356ae122075d8c68ab3bd3b6bf23fdbdfa6f7dffd567facda7fcba73cc5b7ce0af8cbfc63de5b2e5c4c958c6ef089093a7924a10055adcb351ad6d4ef29867a0ea2aa9129f57e04adb7819e03b2d845192c4c2f7fc195ab7f9156d2502f899ea4fd520746133cec46b3b039e5372f08188d5513a4169cbe50f98a66db200cc00c3dc873fadb7e838f036648a19f53fc791c2c15f083d3fd9a6ad063bc4b8a86d6eea8399b3356d1dad958251db814cdb93bd9864815fb1b3903efc4351aa1e8293e731d13b615c8399cfc14c5f4294de2135634297aedaacac1d21dc13c1bc7894a96fa81185cf6b6b3b4096c347b6edf227b21a07e7a4f3bd06fe39da27192acce154f1bc55b3b6ee4b37ed411acd7a60fb209c19b71a62869a603b12e0fe2a4b54d4afe7931c6492d45bd1e11754a51846db058f8e1aff4c6e02ea70868db6f0e48d2a6c29d6ff7443d38e05d9724f5c5ef1fb4921b2254930b89c1f71202e7ff86bdd2158c4c435c63babb8a0175ea7d7bf0eb07785f6f98094be0a0b8276771cfdf11ceb66da513205833a75b927c3c53fb594842dae0daafcd752f417d7b4483e6e44a2876de2b44f7ea5a42e0f843d9b69e48d7a37aea087a8da242c0fa955845bb40595658444a63a0e9efbd0c0831458b47c12c4e4af89b63177eadd604a4ecd0ec5200662b4d11aedbce48ee3ea6219a3dab38fd1c5f3c25da0f19435d5d76b564fae2a13d5c9c2878a58e7b4fa29bde75cceef42dcd111fac9c28e6a31abbae9286c01d5ed0e3e66ff504edb88fa0505012dbbb98344968af46ea4655f05a78a993b086f86cb68bfba96f4d5228558bb362ee22eb97151e506e76cbaa0e9565c709548d53142ab459ab5cca3fec3f8fd82c4af6dedee0849a09153ce9a35109227a0eae7afceea79120f2bb6c46d6b20d8c9af2399c1fa0106022bb0876df35edc099d3522bedb5b336f3aaec5f8d986e21f45d33c2613c35f1677e7ecabceb8e6552ef89dc755771d48a56eec6517b8c1600acabce0e3429687e8aaaaabae6ac5a17c99131b383e71bf6df98ff782009cc37c71c7a083f2628b1b8b58e8eac2e674e8a7b291f84cc3791ef0ce9064a9bee687ba7967f8a8827ffcdb4dd99e9d5707cbca2424ffd6f10994f26c17d96e447c58b6c670bec4216ae0f8d44e5ed30e1203e8c06952b3fa64fd581da5616af4146f229e512f16197761f4be99c4e65209bffa6e56521c01ffd853e2af8f2bd502c407964ff83ed5ded3d73804e3aa5203f114a5c291273f623c18d3eed46775371cbdda0b8516e696e26e90379108323972d797aa17fd0b54a11a8ffe4bfbd7acf48e4042bb30fd2aea0a339f15021ac4fac42fad6168f3f2b3dc8c14ec8b8d494d6532e407acc8569fce98253526427e23c3584b55457d05f3360d57a22819f9730a8285ca2bc88f09224f88c77c0d350f2214e4a8cfdddc2214ab5702e349b01974d4bbffb4011b079bd754d5c42f3cbcb57348bc792a7c7b1c29e33d858aa0b7bc3058156582f5b80fc08424fbba9cbefe472aa062f1da9970895aac3b13e1268a63a61071756ab8eb5fda7cf9ba13914e6173799dc86f66e23c9635b8c7a2b8195b433e41b1494a90babea9635f595fbf9871cb082809a6ccb2e892c7144c12b66c56c4ce521f4fbab7f5aeba228aa7c516f8c18f240943a05b2408cf1327a9348a2b0099c07999aab47a59093bdf075d1372b8c6d33d5a38870c99e9f00c4829350d2df263c25cc0774ce47612cf6f35479fb069d4ea147e5d20a93385a07a1950413343e096210203086b32f3c0fd837fa600bb7d98fe02b68cfdd5c39a646fca9cbf2c174d9fe336482d54c45715b6819a64cdd69e080885dda2902fd26a521d5134ab5ff0169facde8dd46dc196aafc674e2c3d1f96960242e4d30171ad76299a2589b70e73c463b4c6f3961a1dc5d820220264e78aff66826fc9187b640094fa3e04ebd060715b0649e06b3bbbc341c72ba31c20a3511569a63ffeba9a70068ec703af33c6e702188d88b20e5c852126e0a82962087818b798b3552b96f66ba2a708b595d05a4d80cccb3f4638721fb020b2e008a767b96c04f95b568272c36a9099e4b1c296ca8ff0647ac32cc5bb2289a85f658dc90962d7f6eac882d9097f2d8b2333db188c39936b96270399bcf11eb7f1ed387011642d102926fbf4ed0b6ae6c74d30530c5ef422edd88994248668c9ed84c2d82f1cd4a6f06cf62147ff1daac0adfc1e18b38c9fa1083db97eeb45cb0ba122d4dd59331e5004d1f37961a8e8fb9721780b1f25a9e08dfe77c6bbda83fce337f0232c92b2b78795f8abf7bdbeba2fd9637485809e7a53a7eab6a182b6dfe15a8c5a23ec8d2bd5a80c11665974b15e8027fbde8065f8a170c581046d58aa90fc6c02890e9537fd2900e197deb174d34f4abf3bd96027724c968c38c966a77d8aada20045a52abdbf77adc4f65efa6948cb84ce020d69a2362f80a6ca4fd04495cb0216e43e2e53ec0e17178b8ad1d4511eaf75d3b083875015cf365968fcebd3e134487d3595a97fd22d129b4277ae23adef31f47944ba1ab7912442a9e432600f65f7ccec0c04d010386401ec79cf49e121eed53fd4ea29b8e6f76a807271b4f862ae6d69cfe5661d2042b88fa34e16f60ca749eb7a99218cb5319fa29dd23ac3fe6706bfd0bbbe30aeab6ee1f498e53940a17a8017e7875ed0dd38796d7839f8dc39178e757e046cdfa4154ca8357621c0a5c60369dcc571b857c7259956fa18edd23f556eb121d1299c5e1dc04f9b9008dd9dd8377c532795c19bb04432541b9595be8ab45e83d408142a8d44b855194d5da6d1437a500b17c58eac64a439d987f7cbc23ac16b9d34234280495b4dd0b4e89cc2536341dba65f81550f3abca35c6a7d3e24a68d029a3c426ba8f4d3e1f34e3065f200472865f8a8a8da52c7165d3820b5baad451cfb00daab65fc397552aaf83d4536b88e2645913399069892f241ce0d2ad2c23b9655c32183630f0bf20a33da8c560242a94cdaac491b827f79d4a4dcf6d552d4b7770829b88d072a5efe80668884de904a55e962093a0acc365cb2a2739712ad11326da21337bdfc8504c8f3a267b55848a7967b9c9a880e4b6a3395a5778f4014ba8c20f13e67697e7c86c2823898822716ee84b8a2d3811f66bfb2d8f91fcdf283de4f1d16a701d14bf1e96a828dc917bca1fb839161803738be3cba4305e0bc8e18acc0908042d8d5f95985bb12f78f1e6ab0e5d21fd48a1d4d0a847015829cea4a687e28ecc8d2d198b914d710c9d51e3de33d6bc4beddad7c6460d60cc097dc5fd115ca3ee4dbfe4ae8dd45a6cecd235c0c2bf6fe3f4b7db695a664e3e1ca1234e08a048d98f17ac90b6f93f46112d42a0be3ab648e086222e92d0f3099bbb15332045dc767fad04e2bd86a927c4c536ed7919ce5402f0e6d655a93fe058399d7901aa127cfc9af7489ddf6858262a7a94ea438f6c43ab16ba5e48aa48a3b52cb80940fa591b9690f82315db5f36a026c1d47b23433868d26ec5e7901ed2c2161e8a8e60e737275d7158fbad15706669c1755789b86062b886237b2f01c7f722a27800dddcabffb49c263802ebc8d1a0e59aee2909da9ef0837b644a5290c93413d664afb2f2ef8aff8011fd1dab59e473057aec480758d6e49af7bd2c906fd89f823b3f4761d2f0c064e8809416f96e0efb2c35811da159b909a3524d9ea10cafc9444b8ca555931d152ce11188cab2a204c67afffb0afb0122f8e04c5b3b9a870508d6952353ffa7819ee0b4c584124e18a0f4d8d7ce81450800b27c241e4edb505c051e4ec8b9e8b0d6b45f39435bc45225b618f109614f3a9756d804e4413e84f90ede1738a739ee515811051210d3da0dcd53b9c14df7b255146a45e0da504182f574515e4eceed27f48f15a781cde0c837333cfaa90eac7bc58cca23585b0298d1e9e4956b15172b20bd0a7d58a338b9e02b416a009bf0c19ac4a174cd743230314a7a296c8cb29d9da9b53b10164a581894588123554bdcf92aedccbd86cef024b0314d2c75b2878d23d1584b3555c9af0c5f451720c1ddd2e0036bf4ed892ca8ad8e690f96515b9c73f2bfb360b0b44c70cf686db2470f042bbf3f7848668a7bf09c573874d8c67b223c2970a01f4c736365994f45c82fa886e6f619395c84fd01cd5e15edc03827ac2505f6b0d3c6353eecfde48d91a997b835ffeea27ced04667a92ea80fa2e25b790d4726a6a8a8c94f61a4d5248f2683cdf195a1f497de582be1b00bd934a7594ab075829949003eba5e2c6d07586bc53ff1eb03c345288ab4ca7e8afb0a39a0269e1877a58f029d43b0d06bdbd64c9aaaf49c299f8e0bad0680b6306568afde94656583bc78d24ee8bcae0bc1a90fcd1aa68e1b672c104b741bbc82257eb14de4da08eab8c67f007d5b19e9df29cfd38c50980e7403c7745a74b43f224e46077ddf212270448d00413225e52d81e4392affd30bc345b1064f4fcb6e11baa3a1d9c35b1ff9e5f457727c34fb5ae3f7d03047a8ecf25f64ac53f53948549cfaccfb5e2079673b0d3654150a7793fd45edd82c4f2c3cd184b5144c443adcd041480a944e631fc44e30420e584cf294397a95990756fef81424cdc3809467899408a0f35443e06b6503a09a1ba78b10affc2df9e65392988df58c3ccf8cc37e4d18b53a1b29e74d13313bd5c2bd6fda2cb09a94b69a5f6c08949cedd0db2893f7874ba059c26fddc4ae7ba0b86624083d45fc611a4ba978a35346f6326d7e9d437ad3b2be82d8ffc5c4ba296c1ca45d3b932fdfc7e8e37bbfb8188df7ad411f7a2ea51c9906ac49748b001778733e67d9331b94c471ed9cc8f96b1bccd46634531f1b330680b6cf8e628f70440434650be9d1fd642cb40a019012102d0bdddaac7f5cffdd1a6e0c68fb5d435018789e6184fa83fe3429131542dbc872f3f90c8ea1a8df47b4087a7d6e1cc2542b857c7c554cda8a3c6a505db45aac5d90ddb790903574576bf5aed1c48019c8b930be67e64f953296b0acd8c67273027d778000138c63b300f52121f3e4ce606ef9f16cd39a2b5a825b788d10bf713f63e712879c632bb7917dfd3165c90e67b101d02cd9f8c96288064be02ce37d8c36d85801a8012a22edf5ca8c570cd4582c1d3fcf9821cb3ba6c8283644e90056ec803804f5b96a9402633c4a57774547167c48cb6b6d56bce6a6606d96114e3a1d20225bd97ef565c1a9551db3ab3457f92f28569811429c7a006c3a2db1c2fd5a8a9c90031e93950f1ccec65bfd260dd09c8b65d36dc56f2cd25b0352098bd76579d3e29d60626f8603c60343fb99732e2f8cb4dd5df406fb162c965aa8192ab6666d659b822c1d5c498c12af7a4607be7adb71c51aa47c1d4328933fe35c27be933732d9b07d6aa0a68cd0abb4981b06e19eac07029956bdf9c9b96c39016d781f62ec41a570240ecac36c1d22e6ac4fe137d4d7e0f9686af73a95b680f19bfc011fb941b730a6242e5f44a8da79c91967947ce8f149354d38e48090448cd45fae2ccd744822779200ba66cdf4dc6a235910fcd6529ca7936af307060e0bfa17192c2af175d3df8e2a9a51d535812fc21b43f95316d9ae1db6406796ba2783c604d6f2c5fb4df28d4b8e0def514015078afd3005638f3dd9d25cd0c83b6ba7a4c9b715156ecfdf6175737b7e1b41cc01ebb34b89177160a416bcd3d6a65716a2e56f9bfb8390213a44b4194a7f1f325b9c9f24167a688b29c1e505e42966e3010c3e35f4fb4075a0461e8a902edd2014b2a2d877431d12733664d7111d19ff4442efa0d19f26bbf46702f2ed39cc1ed41d2b05a6acb0a9bd3373bd17a61b49a0389adb95e3459a7fc367b0ae3bedb0aa26cc460f2a2c68fb249a94fe3dfe8935316f823edf44ad5211a5552ed25ae68de6cc7218f15c568fec932f619106600cdc4feda055fa0c6d160a52ba5fae73ce1e5f6996a947ec0bc92aaeb44f0a3324f5725fe8dc28d54006853678907780f0f5a34fc6396a05d4a8405785a1b08dbade98ccf044b7c88c23eba5ec80206449d8419d659b8adf64e00c88a7c42d78145049b324a82a0af14e471401e9a796a28b62f287488e2d6d4e88d916220938e8a879d71202e535612125ad69185b60ec429bfa831e8f35b62e03b802bd9f341a1faae910c7c841df86248ca3d87f022233224ac072b350ce12eb2f66b6e17caa67f01323df2188a3ce91e2d52e4667c5d16747b24881ca1b2fbc04b921e2ade19e460b39665daa9aa982c7963551314f62e3d72cb04e6d4aa960dd2b0a03a1fb12a1bb2018c627f17bdcf9af0a513610edd045b0120e0ec736a43207574fb0347b7028fa89586583c143821c7f5e3275f9f84288e461ecce819b500468531ed8ecf794aff62361d09d971e91c92a7548df31f0448f29138dabe817e887fd03b3c278af2ee3cd4bb48c94bf0afc07de6502e6a1fcac33e7954d37cd91d4d734ed8e2932ecc1c122ef7de57827d1e5d9bd9eaf317e958615a6200c3c5bf7fb62df0ea0df4f9d4b3d9224e5c17bbc9bf6c12c5c81dd436a740762a9fb4563bcb4a719a6c271e7166ea9a06305f4be745d19664b1c5d064269b57251c63a63be1672ae819214f180741d194980cfc0b30cbf77ed020d6ae3cca8bda4fe2604a9f7d8a5463540001333c6a445c23140e9f273b5ae36c4b3f8169885ea4b4ed802309306a9a00501983a87140e401ab0048d31c389787cbab1913f4fbafeeb36d1e8f8f2a5b37ce04dd6879792784e723054a99a117de8c205e8e7b0042c270960dadc32fea4c88119fd3315e41008291127613e70a57f41f7153813cfe39aeda87199ebe05a0e8efeb83e66c753ae10176bccf6781863b78690cf8f76cc04fa5b92df5f4bf0338e4b20d21cb29813345323270059764fa17ce8e8a5280cffce61d46f7b468ad423cadef170b8df40a3a597e3bd811a772304ec51ce801cf948130b44a054ea084ea97a07a3c8d7a9cdf0f7b029924f75775a96d113eef430aa78344e1bafe898d548bfa7c2d27912ac865d37cf7c1c449c3f6f93fa2e519b915592e0e6db2a2bda4126b6b0a410934d3e8f478ab3ff2a6057b694441a7095e426848c7b8e8bd474490b91eb4f6a80a1e86820eaa1251e8605fa81c0b6a4a4846a00ea99857d901a37f6c5c9cbea4d38abf7d16305114447d29529dc64195d87bb1c9405c4f779b7b217ac9f013144499d5da1015e16062302f8dce04d8261de5c1dc68b16a6283be1842c5e4a4028812feff45cbdecb4af722efd3a5eeb61cf84e746f9882888fb4208f936f4af9352de013d1bf39a9d41511146a427d757032619ea8bdaae603c8acc91340f0f0623fa2690444cc32a2cf48b2a39ee58f72236ee0704d6aa1096d74d922300d2e78a1c2921244db4a4b075f0bf45a62329a1c15327ceb6dc5b57b50dbab5896f20114763066f1070b1f39b7bd6d6e8b1943d51488f81c14d0d7651757ece2a9e9a5f1612157455d8601b94535447903329da6801949b6530b1fddaf7c845f334677f56a18c7c73ab6d755c995cc98633678f456491f28dffbf95daf52f5a91a6e3a581294dcf56b3a32dbdff0fc3a30d59337aae6e4b19a5fc8c9991861dc34ec157272fe8d34cf5272d1a1f7d2f9f23f4bb1c037109c98b37f196738354bd2103062936e73d7c69d31d52c6447a69c9d2d19ba272997886d81f62b841c4a77afc442dd6141566891c205093f260f672bf310f0e74a4d66e1defcb22e9b5a623553cc8670cb395807998b6422b671a5fabfa8b2e679d1f19f5785065c8454e8e1a3313ad2944908e020c7221c0043b98ab430025868f6aa2b338e7ca21ab01e2b910b3bbe854c98edc4c534a0dfd405e4f1d66173bbc80b0e18a2ef83cab64e278509c8f66cb0ac16c1bce8b08491efbebf2b3c942be4d2fd63ec270529c9d5d710289ee0bb5e2d71ddd6c699293841aff38bbcbd24b4154fa368b795339886e90520dce61215401fe4e36c200e95d3ca671f6d7deb0c192b2c6bd54b357164c4988391551c1dec24ec6a6b2155d0b9d92b75567bec34f95641c3b4dd3e6d6ae904de746566c27b88ece2f9e757b15c0c3fb7d76dfb8648d1b63adb1f05e2f0de4a2dc187f1290474d6f4c911b3c0f7a74109e787383e1bd1cf31a26ec1a3bdad9150c98b75c85cc1fc7863b5a507c1155458ae66325ff0c42e95e25bdc352b36f6f73c92cd267989c9cc38ab5a2cdf671747490ec6aa14843f3b666e5100a96de4d0b32d5e35f0e69722e5dafad43fe4325c8a89544bae99a804467857cdce2160de6c55e6be01d347b733f3799999b2c81cc36e2d3896a348a550a9010e2e2ee55d0d6ded505900dbd8ab4444b3df8dd21a2aabb817f7be5b0b6b085e18abd759c6e30831fd37fc769eb296e9f7466971de1610065d414402c50f3d433bfb93e133c5049d1e384824a53f6f25b9a9a2d154d6bd498f180f597f94f4aeaefb75dd5ce86e9bedd6310e12a4394fe21c18fbfca9b7780e9021d4282b11aa47ffd20e74826ba5d1f5041fdc949bda9f0097c6789faffa0156847cd7a735b5f0ea2e5c65551d2fa83d6b1b4906f01d461e163cd67ace8bd9d6478f3ba8fc9cfd73a1ba271dfc2ce86bfd8e800df7fb4d54f7fb260135f1564e7022022d83e4c0225a7cc5e3c35bdf68feeb2fb4aa239582ba3826543da9d8d447f1c81cedccf6041786eca48e0f55660427c2f4e3013960818e4b176f4030dab189e3f5e120f17bc01ff268717ebb63c3bad85af030717edda7cd80bf5fe01d05766ed78169406d5d91c63a39dd15e2ff944d78d96616cee62ca198808489c13d4673663165bd67a012cb84a7cad8c94895c902ea6dda282a211e0448ff47a2019324e1e2da7d43fb7a439d6c0ccee26ba67bdbdf3a3b2cab9da0e1263e4da2dca9173680cead850ae4108a9133e5d194a3571a44490688683445511febf215a1d086e1c7d5324faa5eef3a9e38307cd446e56a645c7aa3d97c4d44620ef3be2d824f96725411e44d8f67e9d0bfddb51e35aa246e0e1c96e67990b5b63060bc851547fd4f7c9329e9f74d90303cf9b9c9c4eea0aa4def9a65541179cbf98c8a531dfe25ef13217e201f288261d9fe5691d05620f9524dd0390612ddc13fc75b5388ccb07a4ec8c31405e7b1c31a78692639ea40a510eca2c79e8d02cd842079dfd9ee75a1016a0730406f61a8038c42fce9e963a431a6c384ad24658044d1c3bbe425593df31d7341476cf2c57d933e3b4962f8f8d140ff91de9650ffc844a17891301aa57a3959dc3705b11adba28c72247a79b897987c1931da4d0dc7114be1dcab060e62cc8fe58bea57b8e369d75db61aa3e58176d56a92a5df471df62577228b561fbb883dc9921414ae00307633d3453ac1e0a183ac1ecfba37350e800d127258f29db62ba26eb0f32672308ee8bf894e8c6ed35c632c8d4b51ef13a1ec5c328c35632ce01f31489c979a0a2d78993cb2b842aafcfd902b614f49f978add071bb060ad980f418033c4cd7c486f798c68c9d7f911f90ee8e9b58576b0276f34430d528cc9815eca04cf9fb237e548c27623f5c2bddb9de7b14fb8884bb52344e653f80258e38e78cae3a7deabe0220cc5ef6a5405b7e1ddebe869d3246dfd4f1fc90a762a811a7fd7706a1aa081786e9c6d46c56fe180335197e0cb23cc36b7de8b06243510176415ecd8242d3bd38e18394d894017e283d4991e36f8dac0ab76d8062273babb54b82be13c295d08dd414ae278722d398366cea6c6b10c28419fa60c73977ffa8db69163c09d16807d69bbe023e2d92d7087500911610e5eda95d0b171e80520be4360642ef895cfd026e14367ab3eed41cc0e243b0ef1bd03c4d6899c5f5fed00302a5ba7f5eb63d6bdd49479f7f5e6d2ae6ca0465dfdc9858a412f97ef052a30f99465c89e50d026b43d1b06b4020f8f72178386f01e6cd0d7119d5f7962f394d9331d6905bb6e834efc0a20ac6f2163e8ce8ba139235ca8e1e51227e9b4b32d902bd6ca0267b3922bd33130c3a42d35daa65f998fb3b361cfa95ba562b255a5b16f56bbcb16773ef414aa45e0fb0187aebdb84fa8b7bf95f27d3f74c16060a2b8c7847208a4773b74629840e7f73cbe97ad88106a9052072432ef5066f2f0b8965915f065dd07a9e74e8e6553bba3eb08025645dbb8f71219b04a76351bb197abbccd39668411f53fb43ff82d93b909093847ac4fdeabd9103b7f61ff1678d45ce8c9940d532a9a58e4c4302b8f4327e6bf682531a77b75d6aacbe16c00c60c3591a0b0189adb0445ae41fc3d45141f7bad94e81a961a6374e957c0d19c4b7371a0ff79f6661e98ad608a9f8776556fd103326c0700ca9e0ccbcc31c60ba4b6cef092bd0c23598b87d229ae854fc97c016fd0aab61e858f632e79ee4787870f605b979b7a522a8ca11850445fc4ec888cceab14714be060cb7668679b9169e5e751adf273c60207252a70f671cc6b619ae12a90d834100938dc712a8191113f5199907284ddae3f0a78a2b251914d0cb34eb4ba9495f479d48c5d1fb98823bd0e7fa0f7ed9920979be06b574a30ad1ed3c6544a5313f27f5232caa0a8493bfd9d996d2e44efe1ea0dfa711a14891c15b38ea2525221131f8fc7541b47ea8571df6b2ee7c2ef286df81bcbc342bbd53ea54902711e34aecec758b7470db0f46b0a252bdb1689ed0faf02305e72a99c9da541307131ac14701395b7d0ac1e4102977ae441098bc57e78eb2f4a48409e4c46d4b1437154bdeaf889862c670058794958b56fd205835431d0a312f29bdd86401787e1dfb2378dca80d95328f525b0a92a90b810e41eab662a283d0dd3af2002b559bf8dd329456d48900bf34c75369ee2ed0d35ec66e49740769db46ce4c78c4de16efab88bf9fc52bcb96abc2ace0e59915f0c737c516a6c5112a10b096f4ebc7ac8e2a1e3ef44fd619b45cadff3f06deaddb90ce3d31b7542c72e90a8ac187c81aea0404a8e310feaa6e804d30c28a331794b262c09f1efe0dc2aff42d44f87acb6fb0eef485e9e3f07d9564108fa15b1f90b0447b8721269c28745224bfc405aa3a1d1061edf29e0290a02ac5737becaf8ad55a0dbe02897c68548e85ae6d915d47d081e66191b1a174e9dc3508c57fd5d58e0bcab085642b09c315213c5a5b88f6eb69db607678d6ab3176a2e29ae600aae629cff5fc80019914e34c8a950aaa387d82bc24b8bce7de74bb37602b9ef3022b3dd8122030eb74f02849d622245289079fb0ac8bc83dadbb9868c0781b6c4656402b207e7541bfe649dee007b423aa90a1a572898df540180e1e02159e20f490afab435f450d09687fe48480e0d17d7b594e5cf98ed00035a03c8f0057eed77d9677fb1c3f708e3c29e3c7267673c2d8ce8f6353a2dfb8f57a5c669d9a2890c6689f7071530f99878058bc0769f1fa9b5234c6e4789b5ba3486f987a1a68cabb3918fd255191a6be3c4bffb2c433cdf0ff4647b4c982485ded1d9c7c8b400c3d20874adac7ff59c01501baf02fcea79c81d336bd65a2c0b14409a02c101b56a029a3406cd79bf652e58c118850158be836e2fbae41888dd8096a10e57a03e0006c22c8f9901d7d107c7642e6224c12eb1de1848d6f16ccb57db6a38d2b2d1705ab4dc539b86dfe3b44ba077bb998a70ae53f8b00426feefb01a72195bf145f36859fb34ab33973beabace85e9e855f6ea4d581cf17fbdc0bead7567c760a8ed45a3a4779160301d1d9532b931385b0786030bfce33120dcb9f68baa3f1a8f225a4cf2f95a1ee8ca53b877abac0cbb40e519d9eb8354cf5cce14af15cb10dd48f543d06554a20c167cae9b5fe3fab13040594d4a21c9f90f0da1680a39efd869a4a264eb487f91504b7f13777026899a9cc88813071630537dcfbdd05cb7c19638875eea9b19980db8c2532bd1e29c3796c96aa2f73daee6c6a79ed1e7d70316ccee78f90a28b7e2c0db4ac300a5779a302680827dd64003f1a28572e679e4ce12d00c823ebbc17a2a34bc1bc437202c7db6d042cb869f0cbac96b26d83b1610ad254ca6daa5d9b92177228d2a65f3c13406a5399f04888efd354ff4ba7059561cf8f73fff51377fa425e277084cfefb8fa19bf3ebfac3834f8af659b31f12302e3487ddd7e355cc61d2888b1484cc684076f38e3cd27c6259cccfbc9acc4161a089db8cda5e832d8eedd0d95002ebaced8af2e11551130e8e8c7653db446a0200e97211a7991276991f790fc8df1b93b193716021e81edd4505c190f5ee045fae2f1c3f5a1759563dfc6ffb34f877400f66ad2b2df5d376e928ff6aade870903ed4312a16dae5e10de38e2fe84be14f9efa629565af0e72bf64dc5a769cc027e199e865c46c3c0f5c68b0253a3cd96d94cc635720521ec6020ecf7056df2d4f56016bacf71da8f918e75fa9ec75de1e34110c82155c3afb094bb6d322f26ac6cd6446541347e6b1b5bed1ae3183a948d11ebc4aa7e858923710962f87a647037533e7c1ed659758f0e5cdba0a48334e73fa2b0a3c25d892d4d15fc689186f5d52fd5f81630eb6fab7d9506ca94094f8fdadae601563b470a53cbaf4ffd2978a8a756ee162db4d6fa519902ff6e1d8cecd23dc62109064a908ba6103acee7070e5224b5480e000d7e14238875a1a417ac50790160452cb6874118da1e90ca3d859d9299e4ca759b4cfdc713e0261165ab891dc049e989f9ec839290c3743c19090d1b4f4f9d4ca68588bc8df4aad5ad4d92ba4dbe43528065cd24b136ed95332ba49eedd6642ad4282fca90a17012b532ba0a9007ff698646c755c2e9168fa60dedf112466a04541d472da0201889a4e1724690dce20794551c19f444cf8bb91a4c5666b49322aed0c4041c7300f06a17bd5c595e48559ff818352663e5d893a5b26476602956ed07cf5288faf10df4345975f5383742a6e3ec820e89ce3a5c8f4798517d9786bff9ea785a6b994235100b4eea0ef3bfeac7faab57f34307d28362b3216776b58bc5855ed8616bfe1ee3d09d73a46bf2e1c9ce64b4149fab5f4771601a6bd865e246df96a67a814b0954bf6c30f5fd210823f3e5ed80535533256fd076ae787724a74babd06695fdf0e53a1d4d05600bcfd43a42836e8577287a7d95fd75e2aff42792a5a60a8cf5bb241a7c06794815073c77224c54e4671f95a98a1b3bb948db88f9fcc67d9e733ec5a12488ad72a19b2be2385bd38fd2381e7ff498f533714be47ef8867e8b64c969b401d2f02c4e30128aa3c0a81c475a640b533a5987377e6dde4660240eda0dfbf1c8f40d37f9062d59052adc87c7689ce47d9583625c701ed395494d0236b63bde6b099476094a9a4b625d6294d6999c4763aa40303686a0f78e8d38d58b8ff7a0389f4b385b32d32c0f46d1f150af0ad2e56f1df0a1200e66102f39594b4a0c8f534f6688be39b81b95d099d5448652edb096c605f244d8260cfef27eb01d33a4be0a3847d76b602c3941ed59fc85b128c7e5e84224cb774085e59067818239ce3028e80de249e2d4a5475ed990030d40f426e487488c68cfb0d36e32a538606a6312487bfbc0aa1491e2947851cf51f77c1a606fbd019916b125bf430b167cae81ec048e4d1339be2f47db97e1a9368387b5b9f97d1a32135d44caad2407f5600f03eead9fc0ec296b3319f0c4b54c36c48f26ba11ccad56350547db04d801d51006d5638f62ae86320cb046ca256649601924f9ac73ac97e90539fc180144b8655cff1e1ede1a5d972f691bfab0ae8218742ec9eb26157339c3236b566d72a9383999a13128e1a036e3ecc4b24ec0c80d7695ce0cd3ad665474cd8d220a0bb63bca0366c2371bb0f3a9111fc80800b90b1a744b33098561e5dfd758968be97e8761e81df92728962ac6adc0f3e5d076e135cfe270ee32db639eedab426254a165734c6dbb015d182b77b06083d2ddf4ddc73c694d034de753d93ce7a6ae43cd125cf542fb589b47d6a002b06c9fe45fb8c442ff113f1eef71726e1bfb12fe95986bb4b50a080d6559b71490390002ae3f88bc6ed721eb62ee26e574a24e4b7a0e9353a9caa3f035b171581648248705813b22ae797a05014beff671d9bf0414a771bfd3ffd985125260e5cdabc6b98fc277ab6e8816ab40c3639c9d0b20dc717b13943f49e670132277edcb8381981d33ae41e0d3e3628a3c942bc10077d2c9caf2aa9df941eef3db2218d8bf477f1ce382d4a7f45326e77b03783a194e68c9a4670f715d4492836a8f341165f1b18b97fc43d59f5c246353da724d9ee8bfc4987fe5222305f9f994484778b6523710957189120460f83d54ee3010b50af8540ac686f3a9954f26ad0a0fe5a07e47acba22442fb251d9abb9001762f78c2406914715f16b90af15698f905a58cc28ed47e27e015a31dd285bcf306a5ceef579660dd12c880901e2a8b9e28673cfea710b04b5da557e522f1c89735886d4edb11e8f977454c0418150d78c6af8f23dab100abba2afbdd702dfcc49e2652aed536bdf4b04682b62bf70524cee73d001ed24dbe68b0321fa9b2c8e21764b0f5eb5a9902ebdb54c324c2208b8c3a4fd604561e21f620400801975e99c9d21d92a44e5725fb4c4c5ae3de92c6500e384b5438465df54496cc429333a31acfc3a50d5220cf323581b49a85c08c80c4a6bb2af95765a799afa34973836a18739cf4bede69fd569193f4dd137173b3b11cb78b0532de6c1a1c5d8d44d35efc1fc3f3dd727399be4f4faa42fc18b0e50ff2459049a043e7234313710e2904a5eba1f534ec526c97a9590f3470288e436669fecf465afaa0662396674c337af1ac358463c171846f9128cd1e53c62255ff0915d83d373f324967725054f7897d51f430bdcc02a25656b709f530a12a7f6fcf1b65f7b2a405eea429403046febadafef2e4c6c08c2c2ae7db9071362770dcb9140c04005910e96eefa333a7fe150da521b57de8970ab6a6bf5612c33e56b090e9adb4bf04b91003d48c6b54fc2255a8bed5066277a5eb6bdeb2704c77a0e95e9b58971d80cbc4acd0f56ff2d6a9fa8833175ff3bf41459ae9492e3f681c718b9d4a792ff32fabd78a28b042bf84f31c45b26de6e2cbe86976311583f982dd07687988879b5f3338f7ef2ae70ec9ac781e721bdde72c1f86f5406799c49ef3523784c6901e7432b26788c09f68b2b14fe164d02e47b4c42977b23a4565de11fec7a6b4d769090ed06af29054f7836fb680c9b44ca66ff49e4041810c011b341c6500292cb4b91c66f8fd42e5ef21998dcf4a77f56fe1c9369669608edb7808e8cb4f4830ecb87e26f3d5f651acabef0d2ba545c66df3467cdfe846f85ee56596bc04b04a80dc0beed81f362e62a7c7278468d4715c86ab30ee603d7e170f163d982f5dcb47726827dcc093e276dd3d7a4038081d51a929126fa0959f6edc2f07a84d27eccecc90dc5755bd7190c884a0c2806a0b61be1c8a720daadae83944bff6fbfc994de2e43bc6ad15191549a85200fe1f55d46aa5c249fa150633be0f9930bb75ac811e63669d3531fee719bef2148a3b737f409588bd66810f04fe3ab890717787a9b43bbe01cf80c6b821ff1d25e3b69f3edf783dba0b0290215361ab431afab0d07b4b5ef4035d059a45de06cf47d5fb37610e1afd06acfe0fcad8a08e65e4fa99e8dc6a3dbd3570ebd74837859ca069b3793d90cb7114b87dda9b9eea7d493ba3b5ab7372182c7ff5785260c5a13b774e671a28eb78f051b63653172151bb1fab6f54b741715aaf7d606133ef63329f7bacd14502cc01f82fbf8992be3fc62b9de46d3d2df05b0aa574d040d1cd5aaf0dde423e968448ad085f9c3cb9f41ea1491dd709dc1f29869ba5a12dda5af62d094b44b0ab2538ff7b70465b710349e39b2f9d09624779c0f9d5f713d71b8c77796bdc9866db822dec73c5ab346ae29498e969e6be4747f987462147ad44561e6fc82df334e59493b30cdf1e8a7da6a532215e22999aefc3da1c38eabccc1ffe879c63f01e4c5a5f858518abd9de5671910a0c5b93370d93a83988b755a1855ce1d9fbef04f4b653046573bd3bb9958fdcd7362dec8e3abcce419f240b8b1f9a0cc6a9c6688c1b8cad783fba405c1fb2a01b2f298d75b59c6f5d91dc7a8f9f99a49e65a4781ccaa1ae3e2f428f737ede1889f560f8d3eec3c74404d12f49995d1ef6aa158b17bff92e42e001191a4e14e6f04ffa2553a805cac349976d9dee37abc1cbe4a06002291a21be2f40df45fb4921b3cb60d9792ec51fbe27f54e2b244e9038dd14c5bff1618a44f3edeb81e43f296d2d1416b58990344454aabc9b35de0ce1148c548f7e9a34d70ab1398c44bef29a33d72cd3bb72fc9cf2385162dca1f7b2077fb6c14a6de489ea4de33c23c17f172cebac1a4c45d68bb65e0b1d119364aeebac1fa79d2996cd2536dcaa27a3759f149d4399ec7b3d6007d1baca5b576851ceea3ab1eb17838686b1d8291e4fa65af154db0d4aba65f01665b4fbb2d96661bb705bf702a2262ad00b56702282f04fb194ff72a0d115daf7a628dd7c3ad8e091fb4244c73d0af4a6de01e5bffa23b1d078f04f5a913dbcd345802e999658c4dd7d0f244f5db310c9ece67cf58086faadd5e15c398a4d3b98fa97dcd96408d4ed3e132caa0a7de32531494d93358004bfcf54f83142dadb60ea85c9a2612dd41940693a43ca46139ed538605344601adf6c740258109bd8990fa1013c6adf51e7aca3fedb44baceca1cee7eb58a2ca9182cd30504c339d8d19302a961a3c0e392da30ad16deafc43d3386a6ced6cdeca55182fab93bc5f74c621ad59088642b4aae8bd9f3f3fb40c445d44be03b4d7e293063453233b660316e9a08908c9617fb9009064ec127752f8969b2ed483f167f4030b5f880cc430f8a0f66ad5ccb5e2ce8ee95dea29d1d6a4c8e29bb3536410dc82874a1d412d8ce9901f141fb3719907a65c93716711188007b50fa2d54934e56401d1d06fafd872a71857680a34b64005c808a38793acad7e7b9a6bca9784b0255ac50dc86248d3dcb566656e5d0024a2743a35b7277778c054a4349a7cdb07ee7c815484749ffcb405b77a8148b4f49e72da23777a805cbc349974db47ee9c015884b49a38b60577bb80448c349df6da65ee7d0024a2b43af9e34ce08e13908a48e3534f9be0cd79f55ff0874725c85cf3693c581f5d3bbdc80cfceabbd461ae23ac8a661e22b526e2aec08257a7587a1c75623b31dbefacd2a44c84a867ac1e0e9db98556244de246c8fac5f7fed40cd1ff3e268559ca3485e1b9a2aefebc4a459a1a9333f8f779d0fa122effc82c392cd32fb03c11fc151037502998d92d26978127e0722a9c5d4d7bdb87ddc2141b6377fbdee434f814d8e7bb6b56e198ba153b3f830695713d4d96559b539d5a464668940bc134730d65ae046f6eab8b01d26d943b3f4091f456630add3e877a7c3eb8748b9dc0324a20037a44ca98ca3b8e2cc47d575277b13a6388e0f9b5c77877aa8094ee7ed5ba9b7b5a3445bc09e461520c122dc5cae70738501df8df881fd44ebd2c4c700ad0658f0631385b035d57b75daa1412d211a4abc8ab8264b77058fcbeba3b7dab7aa80f572e8b30f8ede7072fa3fae466da33c75bc2f8a30d57fa10a2161d9931b76c1f60c71dff1c932691c28150c879360bcb1cb32fb488b98fe33ea77515e02ba1edca6489615bc20416d8a226940f46bced9a55e3d0ca8086e550599448a40b54cffd4b42a8247dd483ff8f189062a4d0ef07ac050f9c6c682d93f97759a1148d4054188ea21ddf6ec201ea4d5ea5946654a739cbf38317e9106771d7ce94ee859415dc903d49e9300307da8d4a92a2efb27c0659705dedc298d570dad5ed1d774167acf6796d34f0964be7a4f24c552c65f27b16e74f67f4365e491a03f23d1812412c739a2719df917339fa93e7e011cb5c0000348714d5f384cf31226d6203b121516b81b6b2bd5f02dee86c05b8afdccb8df37557f174b6ef7d22cfacf00db40e799faf03adb5fa0dbb8ed2d7faac6840d0dcaa35423277aa404153a138d42f97521f21bfebfbe57ddf99476685a6a52093d0003157408812923bb7baf44f1ceb0372b8b4d80ee3a30c32f10054377026479231be450caa997a9be0153460bc51306153e529b69219e8dd89b8618d7881c14087d14c4992f37139f02529446d09c26c83e10cad0b07b1951b3e569de16fc8e1388c7317577e3f475b8b3ba85c680572938931ca8b6e157499f143220c601902879e8e551b247ab1438d62ebd2d4adf45f27fa3f7537086192d714c74e611657c421be034800947940f9beabcf91928514f430f2775e3f1ee7b1b6ea167e1bf37b56462ff1d6eb326ce1e87214ec848eec0b649d21e34b6faa8912a1c6cfb02546e0bcf193639de85611b4d811b0b87f55026bb4c51bd158dea72927ef4fb17a1acbc4e2fbbb7128bf5838c314a235613189a0803d9af2a3a71aaafbf0dacd71f9bd6e6a7f71d479996b3465cb71a0d4067d5d37f745343cd837dcc1fbe8162a0cb81eb7d4077c8fee970d76ae09c70c4e7cc2737f391e166d6b15f8fe836c11ca3a4129b08bc31e655dae421b4046370ce27305f88a7281d79d078b8e2be2345a4eff91f7bccd13a1de9a1a28ccd42829286e722f5092b85e7487d916a01025e90a66e1cec343f9aa1522cb3ed335ada9efbcc9e2bc873b2e00509e1f9d689e4e49fb4db0056598f3847e9d8acb7324c127d996e75cad1c5323727c0432d697142eae0370712b9c562eede5edcfa9be85bf6546358dd3c5f72ef564d60961cdbd22eca1fa3f476d115fd916bc135506f9b901c02f3a544180f61a542c1cd7cfe7cdf31c3c2986815f88464b497a41588dbcf49d35a56476653546a6801b544a5e307cf1c08d18aaacd44841aaea60d0d5e1bbad0625655bd147dffad028243607e2e932e79fd1994ec817811bc89ff8e1abb77e48efe5ea576ae7a018c61fa42f22652a21ada4617e229f3effb21ac07d829b73c280295f2965894c911dceb6266cb210d76f1c227f8d20502e7a636edfd81ed7f4e5e4cf39626904b999b67ef0ecf1323b5819acce0c7698614f6913b997884530928577f2dbd41e7b5a57d760b1b71f2abe19b0d74871e767e038aa3d46e35332cb409410ce3ba0726127996c7f9f3d2d799d2a6561df408c039880c985f319ae9e373a5f289e61aed5b736fa2e4f4f51106b53b9bd71e5ca4f0dfa20efa03aa57b7b4460b1373932e89edc156b73c1f541d962a67fc54d9b893ad883b08ebf3365b4660d8dfc503be48817a95a251462235c8c88b8d787ee28183a8cc98832e908f53d68cbafae3666c0971df32d1e9e6419b1bbf03dbca729dd728ba721cd93f28e05d1a0e23f231ee4ecf730080e154c927adbb21c321804460d5e45f3591cb29ba4ce90557c238560014410d73038a3a7a92cbf76018ea615becb89fbbd450deac8301c46dcbda56759af945403ea17d79859409c15a5034dfeb27bd0587553adebc92e1407291e214cd04c16cb014ec75f0332385fbf0a033bb8ee206365076c9107dc19f86bed9c5f295fd54100789df745eb029c47412a41bc10fc51f209917bef2df7965b4a29934c016d09c30951090d4932aecdc54276e056be21a91b0266edbbcf32788859c3dd6b2ec6861fc667dce664dce662dce65e88e8630881f13284d4f0333efe0b2c0951f99719b745c61dc5b86fb201b2f2cd3d6ec35b67391e1132b5b6b2b6dab69a957f395e934c71e857978899e967f7c70e99fe63f5e47754dc27749b4349b9cd7d6e73a06ed4b56451ee5e4773349fa7017de8e9ed3104cc454efe31c92a355c141414141414141418170505050505050545745150505050505050b0a849d6c9c3b89f32c529b7b917b7b9e62acc80609f8b32eb8166fa98c684401fcbfaf801b821140a8542a15008ff0892e20906814020100804c2a20f7e008066320fdda0e6d32ecdb7d5cf198e3e85a4eada26cd3927f43764c89021343434344284d4df84589f09b95efba69bc3aeb6a6de0554f5734ed9590e118cc5372029524a29a5944e5193e61f607e7c1ee6c7ef617e7c6e4e99446d1a36e4cb9bdf4bcb8f6ec0583d7007e00186ced1df80011080ef1d29b4f06e9ac84f810f203ad0f5d000103e80e840d7430340dcd02d5451976a5e381ccbb22ccbb22ceb312cbaaeebbaaeebba5e47fd99dc99c42a3b7464b8690eaaa84b2af29b7bb49ba342fcd8d180ebb1dfd1d90e4d477dece5dda1e10c631886611886edd85efbdeb1610de3765875d3bad124428ce4518e109e1c9f460bb51466d8676febdbdfacdf5ebb344366b8ebb517923df6f60ab15f7fbb42b6b75ebb42b4bf8480fe33c3d53bc35dd73433c35dd8c957eb9a6638eb5f1663bd6986c36638ec3b8b39c1303e6a79911277d0b31c02e69825260266f9205c530339ebdf89ebaaff4f857f1491252e62fd0ccec230ae614dd3344dd3b40d8ffe8600fc8fac0803e0037043aace48c76a603d6dcbb2bcdadb62c291d936ec2db6276fb10933e1c86c7f824d260cdbafd8e2af799c09fb20f64f1eabbfbddddefef6d577d4d2ef447005f6e59a7dae0904038af90c374ff61a36813ec33c2029fb0f369db407e177f34e19363524ed647ff23dda63f68380be62df756aa77ed73ca0eed14ed9bb692e25e47117fc682717bbf5da4b3307bacd65f7f1c0527315eea8c43c1477a2f89fdbdc4bc283df12488acf88f5d1fa8705cbb22cebf1bc25a27aedc3c2e3795b7860706ba6f24f16462411e029c7af394388e4ce11b2e425778e1026b97aadb5d65aeb755dd7755d976559966559160a0a0a0a0a0a0a0a44b99eba7672fc7a95d888a1a1a1c1befef516c6f375c9e8eac9316539133904dbbd536681ed3af53ac59d60a9399b1b27f2ee7ecaf1dfe9f3f97c3e9fcfc706040281402010e8e6e4e4e4e4e4e4e46b5eb8938fff88c05228140a8542a1af79e1421fffa160a9b99108c3300cc3300ce6460c8cef038ccf03969a1bb5bce4ae532db9ebd408e536173ab96e6381d8eb6e33a79fdc26042ec44f7e849b009eb219e9a026f8115baff6d6dd7a98f46ce1272db35aa6e121335cb669daa959627dd8db39f27460c96221dda4891b39024b1bf69b24b0a4612792614741d20e2c3527b2f12512db3d1b9e1e1b984eb5fcc83665d2d3440c63e0a2c78f6857a0b22ccbb22ccb344dd3344dd3b66ddbb66ddbacb5d65a6bed7d279b1c5fbb378f88446261baa39dcd0d3bd59c769b7b586a8ec6ec36a7699aa6699ab66ddbb66ddb169f5a6badb5d66e5a160109f0b080065074463ac6829debbaaeebba2e0cc3300cc330cbb22ccbb2ac770349a81c224fe4ee25c9f15fea257197ce69411639fe0bc2d379d8f4b8eb653f64bffdbbee9019ee1981a4f8d855919ffd864d3812c76898e67aeb333c64867b28151dcd5918c8bbe12e0cc4fae686cc70167e44fa1d6996f81c5481ed7a49eadd749f637ca8848dffd2f2a347e4dd3c271e0a5e0a1e0bdecd4e35233d23c143d117611886611886f9280289ed9ea753d86daedee6aedb1c0c2c35a7b393632bc9f1a5e547f12d2cc5a7b0c4e36ae0e34740023c9ef4ca05fb40e88b8080fed35bb52e100c088e0cf6d6abc8d8cfbeb9190e03623ffb7a5dd390196efbfad835e13400fbeb7164b6c791d9befe75816c5ff1075fba59d8d5a6ddc614db6b467a4552e3571c1994b7de8423f3e245261c99209fd7de842393f2276f0a72bdc9640a523ffb2018866118867dcd0b87bd7dfa54844d21d3c9873e05b7094706f4d6bfc08f82ad3585b0e904b76018488a3190146badb5d65aeb37977df79aa6699aa6695ff3c269dfd90f6ece7ed792e12ccbb22ccbbee685cbbeebd4859bb3d85a6badb576d3b26b9b140109f0b08006784052fc7a81888004785840036d67a46356a8d7755dd7757dcd0b773d7dda25fab64b9fcfe7f3f97cbee685fb3c7d5197e8115ca318b0f2d79bec57537d7bbdb5aefdeb9a70e2e3c858d6e3c497b9dec226d05faf5d1a947ff1d9a539f9d0639726a3a98f7db5d784231f27e6f338f23b93b1bf89b66ddbb66dfb9a176e7b81123a01c92b63ff834d16d3af826c57d424fad6b54da2afddcf2e76ebc5d7b52ccbb22ceb6b5e380b53488aefb05d608fe8c7ef9743f70df4e3575daa9a443ffed635b666a1b81b42e6f9150e89dc6596664ea7d3e9e6743a0de15aa4cd48af5ea8ed2e96e6ce119284bea7f4869a05524821a4d06194b3a2d655b14cfb689fee8625930892de3ff8a3f96409aa0fb19d0ef9a5bba3b428fdf71612d9baa16609d9781fb31f3c68b91f87cd8dbb2a660928e274b25911a7d3e904b9bf7a8d7def433c04f6e10e870cdd08db8d46b0a48393fca598c26bac0fb142c4dc518a7fbc5ce452a1f845e24e070a4b177e71927f2a7bebc0de812695f8cdbd08964cd78b72428024d3975f338bfedf90bc15dee41a4b90ab2441ae33895cab11e44a4590ab6593eb7544aeb526576c48ae194dae9a905c372c04b982b0ac5e16adb62923f4d720aba9e0b0b97a6d7636baae09088524af2fe2918f7c9aa166582506a55956529133ab54d5f4d38a0a0d15bad9143fa9647f3f412a6ad360b9c2680aef0411153918210703506abbd9cdecdd64e958727f01ba9443937c36a96534fa1789ac6df8f16f748d9973e81afda06b3f5e93f96fa27428b99b73ce6418cfa159bc5974c8a1a5e829da8ac6a2b3682db27fd5a5eed9355ef62d7b4af66e46f60064bf21bb37b15d0ed9ff35b1efbb99bdeb24e477a3592615a214f2c2e93e7de208e1abaa29279453ca9f13c21e5c4208a1ff7c7779f1c21bb1974d8852c4542c4294a2c6873faaecb542ecc5f8ddafefcb22cadb79bfcbebf7f1bc1bdaff1691db6760e08fcadf471b316aa17eadd88632d8ce8667d393ddffd9506aad48f43ff2512bee3a8bec3d388c6ce868ace4ebbaae2b16e1ba1e6636ae0a8497b0f79f80bbc092fdecbbd6d1beeb9dd2f65d2bc91ecfc30748aa5c33a28aacbb446bf34e4c7a967477a9e2fa639878a887ef468947c45de67ca9a280ae42b6fee5ee753330c8960bb4c8136b1e5a0ad9c2dd3674f2a955addbc987e1849573562ec022cf0af3513567e48351542a4822c38f108336b608f6af48f6af477c481f5e151cb3881671910bf42940923b9aab2a4705581643f3799aedeb5fa0a751892af4b7b70e1fa8be4ca6be258224f8d635e144fc23c6628a65aed7b009fb0bb775acee6848727711247577a6835a488aef1eb150db5d64ccf3a5125a64f9ae0416793eed22cf973176f2e7cbf8f028c77cf935c0effc4739e6d3ea6d7097f9e4fcab5de2918f6cf0d1eb6858b8c77cfa3de6bfabfc78f37d0c158d68a3fa773bff795572cca74f710fff896dc0dca58ab5a3b89b81ddc498c4347ac92ad1b561a9be8a7f65614905fefccbeacc468c854d8fb3beb31fe65f261c887fc450c732f42b360999c101a1df1cfda983fef517aeaabf309d7fbd8ef9d78cca0eebafd761fd85459094f95bf77abf32d65bef993f7c990dbffccad4b7b04954b1685eeb2f9939a575fdc4260b49f02f6cadaab2e6536c6a99f915365148823f31852487ef0ecff0994214d8974cdb09326ce1644414a72ffce0a642e08a255e0005145e8053734476c4db8c60831318810511a8f841ca07504cd2164ff880083ae88108b4e05ea002074878c1168c9c74922c6151000927a001173b8002177a6c3c871014b9e2c80fae7053048a272e972a7a40033128610b4eb0c1110e6041097020061d1b13a8a00738b09830822ad050848a2b66a0048427b09d731384ea0b59a8220628299048c1491ee4a040082729d822490f0a8eb0410292c076cecd14b16bf8b5039a496841169b0d349c14ff65ebdffb004bd7bfe7014bf5b17fef03963effbe0858b2ffb27f5a465fbbdbd32bb3bdf6307b990d5ab30bfaed71e883ea67d8b47dfd0aba261cfa383138f43b93b1fe834dd95bf4ca5c170d1ad685afebbaaeebba2ac6f04b4bb603a534ce5c3b20e0b1a70da5a532130f76aaa82b6501e1a1a70a355332084f3cc119d416b5dda5cafd715ed9cb87ed52ffe16e4696dfd989bb942ce9ec6669d296dfc3f7550ed53ff9d5edbe41e20e26575f2fecd1fbec561b0fefbdbff07b0bd30a7796fb184e1b4a4b65261eec5451d71529eb0a203c148b53859a291984279ee0153328bf0226c7cb4a6ad340515bc1aa6a17ebabafba747df5dd39acbc1baa4ac21e557fddaa4915a5b0b4ad541f2bdcf1c8dd1c42e66e254777028c10ba84a29be10741767ef163d57855a7fc141c7439107f2f6658018a4e6a0ed004db52195e88308220ba288615e40a4a56437e40ae4c192fb4383d30a98a172a3823658345545d8317e80da51da0309860c1d327438b084bf484abe791ba172210bd3870bd17294fa83c28399e547588faa209d88e88526c03988b509e90a552565064264416d264bc98da0fede49bf09b43586d5df2b181be09d66fac06ec078a8f9faaaef1c9c0c7827ae6b3200c80e62b35b79df0c826c5ef44db491027b24bcd69a19d151bea11ca7250525586d2a154edd218105ebc2332b4171778416b4eca4351baa574a9aaa00422855e39a2770349d40222ceaa018c7772a92d825101182e9d2345420d3d327227aa810235e40eaba850e1c15254da85fa884e40059b54acece4957691c08adc418c4e6910e563740ed8bb213e16811859e21e5aa44246cb8b0c5f46e7a0bd1b3408c8d05e0eb0aa41f53372c444ee223f25c39f11bfaaa0ece06f393e078f3c234bdc03beccb17b2a38aa97ff505107159573c414f933cc392208593e8c10422825862b58e4a39b21ee3ef7802f3fbe0a0e6c7df45078c6df8b42a55dea92f5f4e7ac5eae166b0449efe97d48825e9810e240f707c590d82c1dc54530ccc2e8ed94fca3d885a598e848cf5799f29f12d9caf5bd2b7367391e9147bfbe8a621a9aaafaaa7a5193644352a42975a33242873c781e5b5a5a7211eddfb70ed947cdd2ae8a3dac5996655996655dd7755dd775d55a6badb5621886611886bd192d00daf272590320404b6987297d8aa1360d20784cc0c7731c70803c3c220f1bfbf18b6cffb66bab58f61b06c24711599665599665cf35b77569d366b5bdfdce73fc6e468eb89bd4a564fa5d4a6e966ec676b726d1af2e6ced564dca2e0f20aed3742a0425a9b01d851146a230e2899c5b729498225b6fbdb40ce1c9f1718091587c91bb582db2a5d42273ac885aaaaf5a3a51ee5ae8dbf8f9e5ecbb97af2a1fab5e6609b05e7eedaebf51af4a0eabc7858b80dec20bf0515b9665e18e5618071fc58728f8dcb96b29d9d38bb43baa673a7c9c3a93013d8cbff76206e117981b56346a79b14d92f2074000f9f15b5e0edda52e553b4829af21557ef76591bbc8fc627648297e4c54ff7ccc6ae28eda3230d155f57593998ee7346c7a9c361ff3d1c580898bd8b73eba2cf6271f9a2ad9a3fc8befec87f519fe21b3fd67fb897fd0c7b00ce82d36690f6222e605363d0e05df13bcdd8f766d93aadfaa8fefd5c7efea2f9f2f284dc049f1db8793a20f242ce6a387e977dd3301586329ee3ebff83e6089d21e1f62606e14e16346880d74c0c79c45f8981162031df07193ed00c589ba547d8c3874633ba74627c7aaaabee685abb0f5023c948f5ec4221f3de84f083dd65a6badb5201008040281409fcfe7f3f97c3ef56bf7167363013eb80b363dcefef6437decddde21339c297bfba0fa98f6db573c648603fde7aa00f97c731a06b27d73f6e2c480b0e96dd8f4b80d9b1ee89a405ff3e95a27f7070bd981eb8f8e4d7dfb15749bab11cbfcf30d49dbb5f9e838b6c5bf014ba6194e036df69a66b82d667bfbf561a03bf3f9fedc51cb0b245589596993795625f6b1f6ce70a03bc37dee0cb7dd196e663cbc2cb74cc64f5cadb5d65a6bc5b2d774609ae5c68e129e981b0e50408e1e6edc8851408e1b3d38a0c76e91fa5cd3e76b6afc67afc97e4dad6fbba6ed6bea7bdbb5f9809e8df60d49d746ab6f41b7b9d1df80011080ff11adbcf254100804028140a0cfe7f3f97c3e1f6badb5d6da6ddbb66ddb36981b313e6c8f3204cc72fb13b96120f59b0bbd8577d8f188c0bd808ff2dd103075e1ce6b362c6407aefec977aaa67ee83111335bb848ddf19a701563207b9b13c1d20b8c82432718040281402010e863370a73c37207e0a1071e6ca6722cf5e2c58b172f5ebc78f1d653eb6d5b2fea94949494949494af79e152de1ae259023c4705b306f889035dd30c077a7a6bca95f1f5c535adfc8baf0f7b714d296f7af12b2832311e059b523ec6771683f231b0e91fe56bca35e1548f1313c2a6c7c5f8fab0d08df12917a7face64525e0636e14f7999d0c7c0a6fba1af37c6df7f19ffbf724d36a09ff12bdf590ce8611cdf9acfc7f87b6b3e2fe3ffd67c7ec6afdc9acfffd719d734e36b56bee16692f1352b15ccdac7b8a6185fb3821b92b418d766e5637c9df16fc6b5b91fefbdf78ed8aaf2c980195570c01c1f6688ff35097ea78395614b2925fcf9d5a5f0d14b759eca8f3231738a6093ab0ae6e00d21f37cc9801db08a023ac31fe241e1bd47a9b522d1ff68d4b5e47e51c1e1397eb4afa3bec57e7b1dd86fd9d3d7913d8dd5eb905ffd4cd67ebbd7d36b7d75e7a51fafccfc59597a67b8eace703fbfc2a2ea29ad28c5f6e5ba346cfa9611b53ebbd563777ebdf1ad2b3f5e19eb25367566233a26ef0c97dd19ee92f22b292b6caa5ea494b20592de08925e7d104208218429f799864a61c9343ffa8b38ba13d6638c3146bf91c218638c31cad762772ba1573dfb613e10537c1c36479c00cf62e677f62615ca998a30bdd37c53f526eba907893641e84d108cc80d62bd00fe78249d9032e6dd782e7208f38e348b5b48aaa2599cab53c2e03e339cb84aab1858918f9e4565602feb897acdc036cbbf685469603b4a1190d980b951c442a059fc6bf663feab827b464cf47da0970724c9afefc7cb56344b754d2efd559e15cde21f295649358bc5e855c1f583d16b82b79e60f49a547e4461846b2b9aa58f6084a36f4526bf976495271fa6b9779fc89bc5bf82307a435c0dd1aef13e86307a255751307a21575fa0d8103c01f9ebcf8b14ad390c091573183d94a38446ac7c5803db854212cb4cd8db7f3bde7bfd321fb4a76e5de4ff20849eedd07ed4f292e9680e26e3617e8d5ad781dccde20f647b6cb2d86a7e31e81493b3a2d655b14cdb6c86cdd7f2c42a1008298e09cd0261e7f473addb406e88b3faa49c933a293aae343a61e177d44b00491093a058d7f08f488c9a257ea536d611574d1d82d1644230ea2e188dedaf65a7e1a3f842c4c7ac2b1f7bd9dfc062ef2fdf84777ea51646df3f8590d6abb2a37ef6412097bd8dc505c93ec3381d0f9d7fccc8f0899019e222f69f7d14ad7a063fbbdbc32b9365ef19fc7cbe6a17f4a0d770e0e3c4a060d3e350e07726137a8b654e1e0543bb3d769beb1aab2db3dbf55abeaa0c6b77a96e6409a8300c029cb0f26b05b12a6295c42aeb2200015d036b960aab28565958756155c52a0cab32ac3ac142f7e482aee8732d84f0b30b0349f0616436ba487dec023155ab7d2cc5d53dc9267e1fbdaf3395ab3041bf21e6a317a58cf171ff0042bfc9ed8ea13f580212243182ae119be57d3f123647d40ca11112824dcb30f85a868ea10faa7b8b7cd47fa3323524c540d2fcfe37ca9fabaaaa54f228ffa8c55d2757cf7e205131ca2fb35155d59be27367361e4fb3a41c0b19d3bdbac3b809c72fac129fca545fb1298873c109794d389cf7d54bace22ffffa6b3afe1163d1889d0b6e520efecb8ebb772166d563d753cbb2aea746b047e4ddfc1563ad3eeee84ca1e4f18025ebb2b08fd65589794f5f46698c314e1963547955340b7c9b55fcdf91fc8c6418638c31de88c1222231c618230ff439e4926fd19f5555d19f46a625f1235271157e37f0a16c469587ce8ece144a1e0f58aafcfd637cc0aaab1243bffa6b3e56310dfd39bf6f40cebf6504042cbd234b92644ff5129d1b3116ea3c1b48ba2182a2d4520a5d7ea1cee7318e1e762c137f62d3c5456cf1431284f1e1fb7071fdb81c1810c901c89d834ac2f4381bc89986cc701e882f539c6731f1445fca4f5cc4a2f6c1b5347d1ea9e0c9fefd022bf233d239289aecff9e7097231496e8d71815f8d6c7f7f2ab894def07f9d5abae09e7e11f31113ffccc704a024923c8ed23f781f59ff1fdadf7eadddf25363d2e865a2a383c7486d1847d989712b9ebd01dfb94340f0f20789e91791feabe2390940489eddc7fe48f475ed1a68724681a01b90149f02510ee6536a48d7ee99fd9786f8a6884daeee2ef4227acc8feead651062de425c6588593608a77e2c933774e13518028d871e9113e0e2f3a9ca1539e066b73e734a184dc59db4412906de20698b561d44dc860275631250c029a5842cb117712074123c7088d6862054d8ca0624d9c6ae5c2bac0402dcfa2d21b4d6ccd9dc3c415304738a9a0d8e60daa5ce21357442218264c8041f930222668aa4b59492e322e6856ee9c2578361be0d050058656ac126a45231b7a892a72374a3591f008117710074163ce21e418e3cb08e8148c8f5ecc59028a4ec99a3b67891bc4348442295d42c08352ccc8b9e9c9b9c1020e11054123c7975207982e8abce4f78e063b61004f56e6ce598289dc85c056b973965041ee42a9151b5ae8963b67899a7ce5ce714117b9b30106d5bf4229fd2184fe5042286f071f861316e26e267abc2fc319f89e19725aa0c506a7bcac8addecfd0a21837d864dd963ef9f3d8cfbd57ec32ff5629f5d138e3f8e4cad38d8f6159bb2dfb4fb521fb32cac6a6f6113f61a1eb55cd7fa7a5dd5cafec2a6fa197eec8eaeb7aacabab0afb0a9de97b7922f2b894dd2ba55ccc48955bc32f22736c9778fa9da34a87555dfffa2c9f267a25e9b8be2a40361119a249161e5d0069b098879e2ce6d3048c244cc7a7168731eddbb805fa1a8a5a50592e0bf1c13f026153d482da514926084126af26f00d1024b312fb0e443890792ea3b31b0f438f83ec05273f8818031b0d41cdd8978d4353cc3a710decc1ad4a631fa16d0e86e91c8da0674c4a6c7cdef87a5f8d29adff069f54366b8f9d655c1269c87632a4c035f460c447e73150612e30b2c4d193185a407dd53cf6115eacb7523e2c763928780d91f36c975ebe1dfb9fad52177b8bf8c87d724d7ad9b526b5d7e7c1d12472caadbcb4dbe59be59de07f11977e7410e0b8ec012c448a30b1a15a5efb9c443c85c7d66c00e4d9a34f92525f0b70458826ea34d7aa57f9906c7ff24b70049ee28167a50c80bb5a24ec16fc17cf4a87d1f8d686ce7a0e0943b0a84dc48a0c10eb6c0832f24210960e0601374aee001c310a840861b703008197e1462e8794078518881e733fd2cb5b030b7bbc0ec39670549f27b7205f46985899ce40f42f90fbe5b7dbc5dfc1b3e7af16105e16cc0e32ac42ff1cac4456a11eb3b6b80f5b16220d65f0f3319ebaf69510c92bc2b0df6d657cf494116d9b3ec87ecbdee3d064d603b67054660d6037c4dcb74643a1e571fc61fbc45367779d43b59437d6c31898b54fa79db59663662ae9752560ce4f3f6eb7581607fbd96c9d4cfb21fea67df40ea675fad0b447bebb16bb2aedf5ebb7efbec62af5d134e03acc71e47c67aec411788f598c53e2069bbef84791683fd96fd90bdf5db96fd70bdf62f93b140aed770767162ea535812f94c9e115e705efad5bde1a377178abb0af7801f24779ed74bfc2b3ef20dcc64888b5cdfb9133540e4ffd585ebf40149cfc245c0670349ef9d20e9c540d2c34040d20bd48a744631fd963c9e97858ece8e92dcef03cf92d7a2d669691d23f025c98dbb5e921a7deee344284b840411776e939fbbcc77a93e661bf2bb508edd4a8ea10c5732fccebef5d9cd5e7b6dbbd8763b6b30078621b5aeeb278a9dc647ef2d81a4f7d58581b2f3f9164ce67df329c93102911c65b4c247ef29c9b68b0fd56e918248de705470744791fb6772d3a8f4b3d59252d930fbaa1baff8c87aeb1bce58c50e42f83d60853bdafd5766a343b2aa1e135abf839066f855ee01e18e121e9daa9554312d73241f84309b31e26ece398f24491981b013cd193fc79f917bc47f3744e043e57ec7cfa649fdf0e77731c28fff7a44bc84a7c5a3f3e977b6a3f36728bf7c92bb99dc48e47e2b1ad1a4fef8f2c4fd3e399020c9ddebc247dda9485c44b672c42a3822c433d9a69c6ab74b7c485f57bda14b8cd061932639b867ffd7438897bb4993ec5da3df71eca343f80ed93134c27a0ea39c15b5ae8a615996d9901fb3d0b0988a3ab094a5a21158b26ea20d2cd17884de5822990795fd63164bb4804b6089a6288ac61393548f88c72a41ed9c4edecd13b4a1379688bf2f812599d28125894af5a498a44e19b5a38427fbc79d2e491b9bfeec7e93e0bb11588a4bdc0696626a49121d47f928431ff2acdeba81a20b77165a37d9bfa795048e968d4563d1647fec46244d92419022431c34cfa73c3c3c3cd99164098229ae542a958a4a80400b8ba2288aa2280a6e614a82d2133dd1133d412b4c37a84eb9fa6e9ea0690a1e1e1e9e8724cb2053c8548ca954ea2911448b8892288992a82d9280d2c6a54d94366d45963758024b2291b57149f64ec1e8449da8d3f9f378ebf213246a37770396acd295d2be6bc95d3b35c228add6e2c6dd7df7377a277ba7b27024fbe34c14d84183b3bcb3b31ff627c9b04759fa90e13f92945d113473a7e9910bb56974d591ec5f7d49177e721b6fa26b5cef2df013e47e47a2c75de016ee1299b84bc593bb789258748da993bbd1b379378fc8143a0bf97d21f703014b3375636499e46e24e2e99dd1c848c683444923f2884c224fd246de482291272e893d31054b13858a3aa8b8838a4ab27f44c1d23c9da291533c728a49b2bf4c45a944ee481d91c8da7892eed07dcef95e10e40a303e249e08829061a652a9f99008c285a35028d4f4d3e97472c92379dc2b4c3221626ffafd044b920792fc1fd7fffd0f8bc7034b9fef7f4bba061abac6655f19ba1786dcffb8e0cf8aea3b953b4f4d9882a5d7037520dcc90e9554447ce4ffb915135e9a4c981861728449923c79e00996662a056d52f00612c93e5190e44f97d81e26d91ff260efef29589a222616fb0e2e11893c953d27532254585504db554472ccc8f55f8f6fb81369197e3d18ad527ebdeecbdd2c1695b222024bd5134ef2f7ea89ec1591ecdfd51310099591ea06b37aa27a62ce39d310828a5ea00b2b985c60c14c021493e4800c5f93e2cf0cc7e7caeac0cc7058197ea533b39104bb858f98f8e8f524b1988f7a68ce64c2840993eccf235717bee4919247361944906128571343e00a2fc8f0df4ca552a9ec6d851927505585aa50152a7be7cc10e1f3fc79922f1259dbf394fde6f8800c6fb6b08625c835d4ba592284d511cd69a800091224499224e9410f7ad011fa3fe9ef99c718b3f7e0314298f5b041282c119ea5c78e5abf9916d4dab77b3c0f8bc7f3b2b062e75961e3edf828767ecaaf0b1fc597dddd2dbfab7e79fde4a3889de66de1a3f87a7c14db4711774138cadf0c7d31075542777777ff11247bfcf1b23ff9de126ae3783d9220c8fe32bfbe417e3465ff377f089a5ff6f06b161924fb3f48847b7c1db56e16f9301eddc55f36529b46072376214ff8b12b6d2009877266633e84efe977553da42f572e6d7ce4b18bc82432c9fe3d3e722d208c10420821c422866158b79db26b4cb42d7c14bb9036b9bb6e36225da3c22e6f248d8f6a17d99ab37a9f73ce39e94febc7cb1417a9d8e6b9fa5d8bd46d3b4561e5cfed096d0b8d89e6bf2571034bf561c87a434a38c961d0f8c84f3e7218a71cba31028c132c856edc82710add48216222eac2479e45ee429b91eca22d9460bb0d75937d43396a7bc25d26b63fc720842cb4905f5b57e886625de8a6db8c60d7de40e9afa3d4faf6e4eebac941d0501837966754d46eb1d5cb5317ddf06705bbbbfb7f4cf8439e7cf424cd922c7c603b1a5508eb8987905946263e7adfb345158dc50f629caf27f670f103f8034a99388a0b9eec5f21a5f6ea2e394abec8c413a88e4af888def8887e0c828fe875d5ebba2eecbaa2143ea231e5238ac447f4888fa83fd73ce523fa46b09da75099d2ef3c95e94747e57bfb218e3cb2277b33b09d13c5293b6643d2e05815bd558f0bc795a37afa55623ec2be62d7d2ea1ffcaaa338aa1ef4e5e994e7edec3e4ee2cbe10be28eaced51581d3a7ec4514070941f819c85241d3fe2483c89bb04e1283fe2a8971c77a0a84da3b37a32fc5aaadf5feba54fe208651641c49e9cd9883c59be29df64098224b28c41f27c793b4b497ef1c7cbf35f0fd54bf9f3bb20a210624faeb6f09112ec8ba190c8ca93a4a159dab84b10b1479edc65ce5a7190d8c3e1c41a727dd83b61568fdca2964e4e2e75d2c9a5f1a21893b742d8c3f5f4b1e59100fada63a087d462df5da241e001843bfadbc3b885259487ff097d662bee4419e57693e6876e37e9e44e2cff7da4ddcb44c88ce18ec710326fdaed66183023c7e82ed843fc92bd6457071ce8bfdce16059f765918561f469bdb00a0eff1ef4ad79e3294338635d1aa1368dcedec366362c796948ebe3fd11e4c7cbd146f5f5e208b94bb78279297ef492f6b1c221d8ce8902953b8c070c87b47bc349f045b0d44231cd13238007363efc8ac34f39622186b029393e4adf2002a287388261812c71c83c85b87e089ae3a3344bfc175d97a58dec89f07c7d6d87afa3f603e60b879a25ba74283966b8eb91e5fc16086117ca1137ee82f00c47e8654b62ee62ad447193af15d10f6cd712330ef9c55dec9cd65bd5c7afb053eecc867ba869c0eab40b5527c3ef1e931d9d9ccafd2f89114fb9ce53024bcdf12ce9c9fd5004567e7cf3f9ebf71c42e8f2d23a7990d9bf3a9455bc54a29e4b5939ec0761d49eebf8e84d3aa7885277a9a494527635659498868fe64862231a3e9a5f2facc2445d7ab056cfab2a6ad653cb551ff211a55fe5802f2dfc3e9abf2242c25aef52c0efe6b7cca6f24df1e79c5845fbecb157d9b17d7d6f81a50de358d875a676b38bdd6a6645a8f5f9abefd50871f491f320337c99f1a0e5f7241685a8bece7e73460dbe09ab48af0b77365ba2e8349e34a8844adaea9a1e754acd0c00200000d315002028140c0884c2e1789ea7e13e14000d7da0425a52a18b63418e62308a6118c610640c020000401000c628426b2b008757e1ea2eea5c921d845a573c3dcf66330a26181775b4e235dc59b2bd1f7eaad814242d9612f4587915115f75d04a6e5e49c0f107e48605dd499c04579a1d4642c8f914c8279a48dcc0108d5bacd2e735c550bcda950d060d6002e8db4f2a7a9a58f30e4b0ef149fd88901b049e964b115330bec04f273917549f77c546e2f8ca900d9dbb15721cd4b6496226bd5a02dfd4717ed4142bc042c395c9f709a9da4418540fe0eaa93699fe85dea040d0468c88ceaa3f6d3df5edab2f766b390bfea08cf3b226f42ca6a18b792fb5e96502e32c23319b5d096a4b1af84733d24e161143f00eb714051ce5da1572a244479650f316b5e97d8d842f23e92a168662f846ae36a073a803ede55292c9fcd272bddb9df215d215098d5d2c3ae212d4730868e2361516e975c4f650b5f689789560c88025ebe406c81289e0eab20b7b445c774fe6d1f52b88931c57324976c54ad9e9863c46ca3ca63c5435f0d0c55dfebe2893921f6059509a7f144dfcc09b620dd8f3486dc97f01274228d96f8f4d464f0fec4277827ec5fdf7985612d73865a0d3f185938a0565710482432becfd976cef01ef338b6c7561baab71c1e77ceb211fcda990d2f783016b60bd19fc46fe0eba006199c1129e20cb5595720690c279980556a64254aa5efe1e4563d541c986bb36a3077bc8641cadfbf623fc94d54a9a8d3227619334bb2e18ed478a7656ca8e59e2b93292c45df962768eb3486d660e62a7a9c0cc31a5604bc8e15f4638ef14c28448227165b53467d44b5c6eb2b9568be80180724599f210912eff37e81966095169732e8265f2173871e9a3a755a440511402bd3c9dbf6db3c7e874b4e2fb8a2f443e52bd18affd9d41980373fa2cf3dcc9d208ed6481d8431fce251cd01eee7d41e11006d578a72a649ab848aa51b0b141f377626a3b72b4518824e749b2341193a8c044b7f47832cf8e8096c505dc955cc142921b7a042d3c81ad92c72b53c46138c4ccc64606bb40c62a41b5a3ae5276bf22e28cc8d823154a8043050a7bb0309d2da01641b0376ded3fd12d11377819807cda61543105d6bd6ce740da3d12804d5190e51188afe2ef8c418a771185b9be0622da829965dcb49f404f6ba30282c8c3e077ada0de60f2832de039db1dbf505d7c93f427f6126296a46d657ccc6a726e0fdc810dde1dbe7f4a69f6d2f13ce5ac916e9d29ed396551b4ee9886938fb9098d8b98bf7f3f426b7f5c3e688e09c7808451914d3a4871b75f873b8098a35472d55608d8762bfcc8851c330b00c697baa8c8498b44c9e7cf8f600f9a98cce6b0e9f49987a039a2cd63d446b37d8083c0c59c4775fd23b8fcec4f7190bd87ffd6951d88f0fe45a53ddae80ab3b3e469701585a39e8e56ced436bf6433a1be2630a0dac0b458378c048b736c0caeb0261d233209d87c781f41f445f8f4ccd8d16ccbd8004e1b8eae9504538b8d1f2bb1b1833050a3086a85d800a070ec7feb5be015dee58c80175d4c30772ab4a8945332cd075be89216e3ebc48396d9420d5240d7151210d2837edf9902d297ba507093f08eb359316376b76a979228a441a265773de6da56d8a64b23689bd0148f4ee37d9c084805adcfdf292bbbd753772abbc09b385f2b869b4f91245cf5769775680d4d8645ef6ef9fb681fdc6d42d686149f193dbf4011d0103e898f953f567a14e231d68e131bd064e3a36287ad4c2b7c103e978399372cb298637262c009238c2d9a3fb189c93fff54483b8ba365186d91df213fa998927ecaf99d3d46bc0cfb7f1724e8fe2c2d96af49badc1eb860bf805f4623c00a75f76d9511b47495c21a3cda9565f5027e46fbc3fcc374d15dbdc3bde1d96931b4110baf3562b01152f0b91b53ce8f59c20f1f259a09ab6e498436900ff277592161722d528a9f9df9a3b7d79bcc9f531cc4ca72f5a0cc01d4d025a2dd2031b8e9a4cf636afab72bce37a3ad3bbddcea8a87bc69bacdc931573cba949a0b1b2ada8c4a5e280303461b9b357f691f2b673afe8eb08ce46c429ec15e50bf06e6d04eee46e0777d676652c1822f750615d59336ebd188421c90c2ffc5f91ed4b14d32eba6d00fe88f608326694e8e6b9ce0b4445074ed5ec7b1eaaf49e2481d88d2173c549da77b5eb2b48f9803291de41f7019c0b449b09702668b6714a47ba6d12a3e5d5d8a1eefba0ac9377b45e50efbce126ae21c8363ac8d1f0f6e973312a6db67ebd9bdc0d58abd722fea7aca6a51ab2d38ffc5b08a6efbcb7f999d7e6c0ba834bcdabeefb58d787d4c7b2996b14cb536a1d523ae69cb086b96a1600774f456045e535f79de4ec9d470a648e11649d9969402582234366f2f1347fbae594a37c106cc8848d6048b596902209d9b2c0373b1b6a2657c4444bca966568ba7b200c941c4accf93bd04c58da2c65b490870256eb9757e57b0fa0f45926714d78b7c2aca166b70b15d7c240490126de597166ff828905264838a4cfbcb76b39f1a5ec01bd8d1678cbf54f6b12524852d8ee6ec9441fc54ba0a7a4e19713bdf955716e797b27194f0fc6fff7889732750896613f528d7c1102db3c45be8ba11e11117cbd7e5e70575070d68bba5b4c78ce6a407dc76f881c064fea8b7c711a8bbf4cd0472555924f179d7ac0b02f019c760dfed0a52065ecd2027e5d58724c9a32f9c5556532a1de70e617572c341110d01e57a401bf5b1578e1ce26755eed9dfcd54c9ac56f3dcf9b8005ad51a1f156d2e17ecb7887f61649eb22af4e5290a2278179234083ca58675aec6381c508b745762831806570485a364d32d6b9a6ba74eedfb853b1a277d237e4fde4f8fefd9d8a56d2669c5a082f875eb14018ed4866d07a2f8d48ed2fdef989fabcbbf0ca3ba4ce3ea79d633620ecabe7f2f3f78c83b8a0700d521a50bcf289a1683578b37fca8cd9d5c11e2686d0dd9e6e2a28510e8baf553b065b2d4152c00e5853b06232e4b4b66c2b0bc192ff85848d9ab21076ee003fef64299e4ca5e05e1202fe9c9410020a84f7a0efca3a2dd665a93c395d6ab6de3fc7ef8ae06fb6f74b1c11c3ba6f7a8b6d206a48c3c1c8fbe633e5578e7fe58c53be50f95158d96729415191d9698f5e31eb863dd0e442aa46ed3a5956649ce85ac102fb08c68cd16da5bd2fdbd8c710c486b7b0e90050b68ddeeed1a79cae655f9c831b3df49e18398d9058032f77bae8366717b56bec1d6f5ab0b1e82e195ae36dd80ef1b1679cd2713a6f224877caab010651abde882d78b1c67179035d3b6faa6b603786617935935f9cef132407d050b75d759c49c80102a630631dec8a7f0ad5352a0a330727e1e79e2044875cbda249c7ec8089418cf30f261bb200b786ae589adfbc3cce24d6540fd4ac41dca920f1a6b47766f0e7618b2596cb9e362eca4c861fdea682554201b6f4194c3423f4e07544c11ae2ac042df50a618179b864e8a88c842efd7cf338131102b3e81f69b72ed6a1f0f7714f5d161fe20ac82b502a56f6d2df43ef3c00b88b1eb959ab9d83f1ef2880ef13c2bff5c4322ec82da1e42fb0f080b99e5523137c59429d18c9c8e5bda11b02fa51182ff81952f1dea9935aac4ab01461c09cf54f3a18250ebd28c3f17ced76820a01b35b6a1dfc4b6b488c36162bd732379b0eb158e4a4b298332e9b4efeeb5e046d0f30cc5b30e355bef2a56c228b3ba740645bb2abff5ac587f1a9785b5a9f041eacd0c09345441bf69f2527f9c45367ec58ea867f1dbf69d75c4c2c8664f2f73909d19551f1b62e69a09cc3271733089b802c8031d1b057731471149cc0cd9acff2a66979982cac08579df9b3f78f16bf5f2244172cbddd10a38b78575b828166eede1015d20883da30682ec89ac8155617eaa0a207b0c1a53b43edad96738c8f0e6fba9e2aa9d5a40f4ffb911497d313006c3bc0cab2c9f983a5086c8b2f8cf48ab1c3628587837dffba1c7637a8e0b82d6d58566b59d3f9f515821acf2145c4c75c252fe5f35b67887f99a89f505057b0134a1be0dc7edafcf4a0d5c0bbdff0d17d526c3af472ea632fa21b36034582a6399fb093943eb7c9598a1e82cd99931451825bfb82ce8d67d36e4180d6731648e200f46f5c9dc4035803119228b6811ca6260cd10f8d6ece318c8a62404ff65a477ac3e7046e3c2022bc676a66cc274f810a5a26935dd19236646519c18c12b8422546c763c8bc1ad4de66a58fca468e4ca7016e0791a9d62aa05782abb93510dcd64d8de808e6974c7a4374c1d6ce24089201984a552b22d50f536f8e726b1dc64206195ee81a063d394718c952b91205ad41272d8dc85a7dc790fbb71cd45241d4245fda61981a17bf05a4a3c90336797f04c0540d0a33c6e22345fd5d47c206f361cc66e7719ee8b0e8b088c61e0a749d036445e94d2705e386e1ac170715c00147a9f178f1d20d5a0227b4c897865c04a5470ea4c89d0e1909752b77e1150a9956c0c81f1c25e64362e841c2d93ffff690c68049924dd584011654f91ed6737bfcf29e50eb484fc8aad25c4a25f018b7bbb10dfe13c11d3bc857f1835ae4309ce77952a99f306d2330bf3bf96bbc2c7e3444bac0769c066ab9df8f52b6a6a0f8860ffd051e1bf1ac2d24313c9eb5d707809a46968659270f8e1f43c279eac4e3c88c22e3257ee28fcbb8fb9d9e28eca514f6df04ada32b8670d5621b17c5240a93663d9ce14a61e71ecec271f2a0fcbead92a688a7379018b975c250c9bb5db488b9c75d41b052f4b992af670a309209f8e30db127182a73942b6f50e61d6962dcb14022567f6b55ed3b1b62eec63d9cbf228b0d45a4149531237af936d87af5f3f2ff2484e9b48e5c9068fd195c341b2ff013d8a86849824fc4b39a4ee1f8bede63dc49ad12153c8b067222d488e1dc8c43961543b43e4efbe111b4dbc1a6d2e17c0f71ba65e939e2a9ea590fd99bc59a92566528aaee9edec670ea2ada90ea4b5282acca744bc72d50cf31c7975cbda204e9902b94d76bb380486cd9d0071996b499c86c1f42736795f1a265fbba03b77509a2f8e179c8c71c24f0ea38eecc2424fb2a3b8f459f9b24ef0b440b0083db17498093d9cceb1894cea96fa299b0be8fa08cd1040392253b89c38105f2f92f6858c29b3a1d89c7d5b3457550d582bc2c0ebbe33757b27ffa5d5301613b3cb203cf75450cdccd9c72363deba85420af3046eeb5c748865476c50a6ac92787ab296eed40b2c0e1f547e27fddd68bbc20635bbbbc8e2f93120840dcc64953f50532c28035f5968c3d7707f2d152aa0eca58d941efcf98f98a48f6bbd2e47ef2117d66f33a6f3f58f8566e135fc9c8d4de999ad50b299b5fab1332c59bba973214cbd0f41de19e85ba9f6996dc8c26a8ffa94f9c71243b70a43d58451a375822de9b09e5312d7a4f48df4bab6637a78e81598f2f3afd75734bf2a4198dd51504a29f54a3cf60bea64834e050ab040176bd3810b8edddf53834565954abf51e7b2e8646060630b31166a18751962b023263b903d38894802a3a7d70bc10a1699dce73d5eb612d3acec2e4c8589b0672e4679108aa3bd0206218f3154ad62bb7e990fcb8325c23a2835aedeeb0f849532d3243305c4bc719216ee0059cb33d893b262cfbc4e26371ae4d2fc45ac7fb65bf4a85ed90abf5164e869c00d6de1dd2042e9c30ea56b8d75f4401195a0b4320923a53adee65d5488a8dfd3326e709873cf1b9cbad2db25627dd041819dca6f0305148b494b668b8e21bdcf3f42b6d1226a8aa2a63e213c7ac07ef5b5146436032ff4d6424303904a11a830ad2a72258eefa82f03eb8051853592d3076329cc37f3177385b13526fbf7f2403adbf547b3d6cd89195cf3161810ffa3657b7ab0c0dc8387c14a0bdccbcf44664ff46a3c8c0fda2be74f9d6863cfce3e1003f0b59fc5155b76663ac78bbcb5e5fa9f957668b8706ad54801983fdda66b74044a69fc015e1e6c9621be2f094178f986e90554b150acdf1d6c9a4bf48a38ca186e364a5425918ac748e3113030d7e02700f9ef004dc34902d498baae1398458d47fa2bc13efd4682bf097f1468bfd2532139983f9a5c12803290d40754cb448ef3808d330c421d1890e390ecdec829a40bec048c3a1a18fd56f28e5f5548bf9564d4deca0cc54d8afda4b2e352347d70c8db3c60efbd961675e28e285a353805e94aae87261b4d93401c34f09b6a5eb3d59a0e7dc6f90fd2b1d0aa414bba0e4f05e9a2c76d04ae2b380b4c73e4c3a07a4c881a731572049e0f66991477d7430087158cf1f2b8fa21bb41565d6969fefc66abb02fea3b5b5b9de4b38878021e1de25ac6c36ecbcd639b4c6d2c645f8b38006f46892eae58fe334ac8c211a2b86195000eebe2976449cd0947f6b663eedee928dd03ddfb1c7f596e06813e50c0a6cb2fa44a4c62bc74620821ca70b0fd17a7588dfd7d02843e9f2e4df6bbd2e157627de5e17f1023f84a81cbc7d237274d93a6ac795ba88bd548804e17aa0f140315711c6ea4cbaeb85e3eaec84d246b3b16b050aeb062e35c82ddeeb19264c48db86d17bbf97fefce13ca19445c2c55ac8804a667ec9ae8f89e3db32142cf62985c03295f1134f98f80f14436470ac5f5c0847ac38642bfdf80e6e46cdbacd9134c1394f77ea30f3e4d6ffc4126cb36962284e0bd6485518dfd1df1af84772aa3a66d51ff8abd65f5b468070734cdb3edb0099a4f3a1a8be9ad0d5e0de808fb44923e6b443238a7e19c8bc11434cc3deebcb09f8e1ad3643016195b1caaa55c2aec18f0047ade515eb656568a13526c9c1fe6472336c29427cb65afcd94092019250834b044ebea9ab917fe72ba39b9de602d402b529703675ed6f83d21cb51c54705230f56adac87b9c47b68298ab71590328c1371ef29ae103c3e5cc7dc8dbe103e229a9a9968c62874b6af5242519f5b4e3c58166b1a5dc93d1239d8f7ae8ff29e6b200c63f03aba9a64ea07eb88442ecf56aec2ef4545d71c9948f1a439ac3bf93700194836e1b580ae1bb91f6b2a60c99c229d434f2e18124ef9d939cd22f20b0cc984f551f2522cba7a4c2b4c4ed873e0c1aa751375009a8c2842ccb165dc44c6199e2f85423b3484a527441e150ac14f9cc6251f8bf590ca523529f48f862ebc4db6dfd12dfdcc31965211891ae0c5df07c19a83d13327066250f448e1bb892c85c68c438665d0f428a622ab7272e5855c5ba2822d059bda82d9bfa6dedb63a533cee2556897ba82eac54bddcb225220bfc6e56543a22444444966313f02d66b80d37f11ff8dbc280061b2ce4c9330a06f02de1e11d203bb75c007422086e5463af1423a2ea170b752b22c21d84957fb0d8ad909d4b0a7117d8e2a4d583fa3103ea7c77e20d672c141d9ee204101a18373ac2a8c612194fe77a8bc4a9d8000bcfe24b5349dfec7af6a82a5424362aabc69023bb5b0d3b6439d6bd643047ff2f38479972ff0228d7eac04c23a6a629e645601129f5ff5154dd30453c15492932f37903a082eb3af5ad7dbe1bc73abf04cb8b9857e6155d3eccbbf1ede0846692ad64bcbc913fcd78f70d75f40379456b98e8da1689029c2734e4504bc9defddace0e75a5bcb0bdcce86052e160486d85b304ab022fd819ada20a393ef0f378bfdff00c0d1563d401ee94a7154a56717176cd12cdfa4056f935f914822139343c07655cbcc9501f2106af50e392cc5efb5268b2ee128837a67c1d621b73d57e992d3544cabc82a4b4dd288805ec30d9fec04041984702ef3f42df2203472bb603fe686ba2531b94eb1e70f982d5627ae8a2d20a018d2f18784f73b2cf75ddb07a2afb880d77d0b7d594f5236f4b789a478804f3d89447724786534b7e6782975b2bdf950a3ac81fc835fbcd4d3d9a2210d44d6094aaa3c4660af8bb312568353b870460dae5c0fff0a0d8f0e06a6b992c81a564060f60012955b3d81e856bf4b67fec1e6cb5b46b7c7ace0507cfec27ad30c2fe185919bb48fc0ee2c0d73c784fb016bf25f0ad07869f9aaca3d20a1c49a2fb0e8f09dc3105a37b88ee6969eef57a1b9265cea44d04574768c213b95ce3be112eca563d79a420a5f42e223450b73045ba05a992968c685afd3fb5b681dafd60782a3bf96a9423f133f0a00b8e1bacd3ea51b80d042dba0bac51d4fe8a5b0037e6c323b1d13b0de65094a77bcb39e5b0358232dbe54bd556fcce732a24b49a2140303a8886eb8cf92aba034e0d73c13fead20e28917173cb202e10115dede70d5d3a87874d57f9586bef14c62f93c34c8c7c98b97081f0fecf8f9fdf0e549b11c92eb0f75c5090aaf2a77b04f0399f2eb54e0c25c72d79b9f2e7714d389e151ffedbec6413a49b47ea6a732f6ca6650a318de10ef3c3d6fd7e97139de37d791ce3e66b29548cb0f0cad1fe7919653936d8ee32008fa2dd64d379e4ddcfe64871a22dbf49a4555b0b7df7d23856854b946a4eff147843b79706b15281c22ed914f23bd9a2a559734e18fe7b8386585c8409c8bbe3c2272aed46d4b1a6f185edcb3667430300ab9c8a07d5c2afd2e0020bb69696bd1cbdefe4c100e888c8e3e774a3cba398b7f479c01c66dd86c312f61cd78ba2099509deec108c5934ad2f1e2997e315f8708a69773d0498657fd98a6771ce112737fed6072d8d6f9d1cb742dd2347c07e578fdf4c7878408efd70dedf1d307ac8bbab8ba0498c5d299a074cc4673a84555164f3fe00b3cb1e45ec3a5991a3e61250cd3c0eb07c036e53004341ff09043ea7f6af0de9abc161767e85ecd3f4d85a18cd8040b971c7c8223f61db9900d9cb5cdd5b752506fd3a764e498f4e8e7b4b51a2a402dd12814e3a6966ce7997da088585c2054fad229490ba7ef4d181a47c1194728660568135b18f6c0559a82246b6834ba6aa5d6fcfdbcd84a336b5b4105d5d6f3db55dc04b3f77cbf74fecaaccde54ddca3dc16dc37ec5143e90489b79e99319bf4706faadac531066e11308c3fb677938fe1912f677949d67fd3fb0219576c4c6dff640fd926d7862100e115684739144398c879db239413a0fdd9fdfd358d451848b0bec27cf86db9f5ea4968f880843383b7c6f8c4ec2327ef4594239b10ea1f0ea0190becf4d0adfcff7a13fdb8210031a702dfca55c2707452475ed0d8341f648dd2e699c27dc44975e2e533ed4a4d6badb1c8cf0a5d8efa20666f737e4e0345375923b86041b3cf001e8f02773bc7226eb303bda880b1296cb9817a56aa5e4bbb3f2b07d76bab31d3b2f183b8ddf7f735d5087890987b8cc668412fa42bd1a627c99969c222e857898f284bdc0a2f5373627ec05b184b8c8c477dd64d93b1451a1a22a1062046b8b698ba22f03881828baa4bb08a0d05232b7ece498d01778a6d4283ffd4adc5a76dc3f275e6b7cdc34b141fe34b329c93122e9367e636a0d53680103d6efc27862ed8486f137a59941d63c9548b88dbd157d27b5b7a8a9eb638dcf5ebf82312ce309450ac6c3b3e3099a56a0ef6555eacec5a9318797149037ff0821d0a0ea1069bf61787082f8efff1161b9d6331129d1c8584b465488193a021854a3c7415c7298cd98c7761305c8d1f3515cd0dcfd3ca7468958d91c47018bfb2c7639338420e21410c7f00e70829b67e329223a4bf6eca4d81d0197e2ba9937419d91a0e7018bfaae608f18c44849c825d436f3e7bf3a0f7a9df93278ac688b531231992a86554b1c70036a5273d21a72295f78f33dcec1d61c67117090947c10c37164ac1f04b020e080de2687a437028a959319a2d0f1e447ca5442feb1a949d2202acae56d488d29b8e595e1041ccf3dc6f86661d88914cdac04fcc025a6495f3c8d789bc81017fc895769185c9c2016a95b15b0a71606eb55e7502e522282af6a116d20aa476b217e4511e5d729f1bc916a7887417bde1d3d2d98f4f821002068e4c07bcb12e01a8d1399a4d0eddec73cf0e497b10fb326e6719f5ede668e5272531911aca5f8cf8f68b60d0930cbaeb592a551e2b1bec386b5112e162bc0497b0be2eb025aa72f59ed77d5512fb5558f214d398fed9d0aa08688fa92020f033e88217d5e951cc0252a6706c961c9656cfc6b2e0ff8c54f591d356a3c20f76f51e26149b80e3a7e31f0c349961f7e01a4bb170f3eec2cfe1831b803cbe9a3c358b85d5ba173befb9ca9919ba38739525ad55218b838c5cad5971a0416e5cf395f174d0a9608f074fc7962a7bf5731698e284e604be96d05dcb7736635be96ad5dded6fc8965cbfe81902e9f6847dca0ed19f0b95b64fd189f6ef63283a16dca65bed90e40e236cab7505f2a05be397a19d3a0a0ebdff22420af1a5c11129997a4c552244711255dd9648f39a9647bb7db40abfa98934e75547bc4d2140854fd5a90da8e9ab5a8d197b5cbc03aef6e6abebda8f9b741cc7f2a9f2a2b3da0edf2ec017e41ad2e541fa5a493551a3dcc432de6dff5c40b627bea4cd593d7432c06a45b482559007a1c4d475172f0c56441f78e972d74e6633ddbcffc4ebae443966b05148d25582f268c1ed3f0f661777c6416ffd14df6714676fbd32bab152ee263e10650c28bf7bd3810fba0f7e19e24e2bc03783018270715662a42443cfa37f5e6c93266a19d4b5da258bcd4f90b651f2d510da52cb331e3c3679ca3a6f53edf55494fa84b2b24d702ef5357bcb0c36c8dda6749b9a22fbd0d35bff7e68a7b2d25ab056b8e35fff6306bb0c7d3d05dbe75754a59fc661d9862bd4e483feebc25311d2a8b0247ba40f2478d87475fbad3259f1de1bdcc8b01f4a2f38a1c871aa596bb24dcde0836b15ffb80a1893589ff4233031cf8da8a24009d9551c8940588e2156218672fd074739ac1c5e93147b9d1af4eeb31b65cadeee5611143c11cc0c9cbd0d800a1ba47e5bbc0d49f33d60473d14c29b3fdc2ef8a9471c367e06845077016e6757fd61b311ad5acf175eac87fd0b8af22cbf096477b90db2eb208a6167931e219536bae39a08e9ff3159fb31be3865b5cf2f7d0115a18e4606e38178e073642bad2f7a47354db012d9454da476f07e6f0b9a9fe8f0c2f6ab9d14514c19ca67183f0801dd3112ac3dd0bafaa564cb6ef7eaf78ec105e8776ab23231871e82cc7bff25801c0e7942e16fe39059e838968a4d85141adf21649f3b134200eaa43f96492e87e0b0ed141b595fe201b962cc53b4251f773f088ef082bf28f1b7f4c39251a37bf5a535afc1a3511755e08806cf4107ec12c41d1e66b6a5759645c990c40ba504258f70c2186842ea70d37fde8749ece36d6b78401b185f38208e535b8b5a61645451b5e8cbc111f4768c5b1d91073cf5c4dff84ed97d638215584fabe9effee88dba068adf7163f927756f3e8d6f2622ff9ba781ca8f20ef1060ed1f736eadb7450208be8b2b480575c2434bf44368f85ba9076996de4cbf6e09a03818df5af071bee2a24425147b790e1df89465151d748ebca61f679aa1da401c97f0b9d011cf9b947417d21f2dca83b84bff4a0ba5f5ee10553613faa81fc3663538c8716d149742beea821f316801c962955a9c412cf9638240f3ea2324f01cff9e48eed6f05857d8e3b595407743693660c0ce29ef4eb8f035ab3220428a41b688882c9f668df7cb13a2e3ea03b0c644f887dcfe945a8cfc032e5a1cef95ce6f2a87657738752dc48f00b79d19d913095827d24e8c710cdc7105ddc570b1202c5f710030dd288f7c34af1652084197c92064b5171c93900f9377dea6ed857baa16e00762df0f603e179a75f57f416962bbf5b3fc1083d80b902ece0f88d3d0739e00e5f8e67df49c6a663c01df2b59cde18b37d289ab35a6dc7fa958ceee85c091a05fc8dadca5e0c8cf73c893465ec7b9c7b55d3f989b3e4ea1ab1aa403d2986849aba6e007525475aba8b6a2ab7632a711fba1ba4de679fc9cca8661056cf983228cb4a35d7de44cf495077191b095f1d6ea3820b1679a601dd2a626d03bba8455edb5577fe9d0f4681cad626bfab3461efab28dd439dd8d5c821f550f25e0c25aec4ed737d3bc0c6fab9a400bd53818a730eb7aa08d751cbdfacde1a736db44c8422425acc1425e8828b640c76e362856c434cd4eba40977983047b6cce1e75ef5ad37b4413c30ee53b535e7b304ee3505693b7b53d103924424743db3bed0184c5226a4813257778a995e0358e4377f6d58d9972e0e6f1bbb96c7b79354c7d6f699e39f098832dd4b5ce966f6f984e0e2291c9bef8c7299816df265afc7ead53be6b457458d7f277f525602ae2a82d814ae16e6a2e0ad06a0d514695acab1a58e82918298677a4ab9e04fccce5ce7cd3e75ec8a9aed5de997a0a15dbb109c0fbc37d32efc43888e954d726c762cb957b1f4d7038606c042fafbc3c8259da635333f5ffd8a36be00694a1d83ae942ef5d48a467f7c77b27148949b7cf062a370c0ac20e644d342bec6fa07d0f7bcebbb890b21add133a44db1977987ab0fc2a566868d52b896ab5d10a5215d5b056b6a5423fd303df463d7ecc6714266ec8b9c2374cfaff5437aefda0b5878410dbe44fe83ac4bdf7c35c4a04519069e5a4fb52e741a37c5ae8cf5577eaa86a9de0bafdf30f01b9d1fb2f8cb17cc4faaf1d7de46030cf40a396b74ad1cc8bf9aaa7c07e679ca5a7d97811adf89b4cca96f8928e4df34f4b042f57cb45aecd74898a2649dd0f47896b6892573950e132e7b13894909286ded681c8c025150836c85df639da2a35cb5d9c706f196307616c047cc92e35d718d682d9e3221260bd4ff54578b8ed3fed772890a1c5001d8f981160b3b0ee98af6bc782dc4bbe0047fa8d48ca2f05eb4afc48099acafaad16ccc2700178f586473436c5e9a3ce089023229a68995032a64e8fdd84ee4876a52bce152783f566a1ce8b59ba3f4eed9929fcabd0b679a405cdfcbb3c65a93fa35d3fd5e79fe31b85d651a8c2bbcd3117e099812632031f96dc450086b309a518f453234333907f205b598ad9f624281f4d053bf5a575c3a5a4be6ed7092e21d3ecffee462988e6427346012be60ffbcca840d55af3ec7cd7136e92ed390394185a82f78a94d9ce96d68aa37fa9261c55a885797cd6da7c101c74d3002a1d7113af432b01c0fdaddbcd628afc06b7cebf8a9a240bf8866f31615030cbcda550736896cc6cbea7afa196827598945699763d09c1ae806ab56674ebc64bd16a8ce61cbf321281a42a0480fe2999191d3a02962034930fa24e5aae8c814f16791079d227d30f8e1160c4b35a4f3a6438450e80d888bdf089a4c1e210b228198638e340350d5cd839b292eb3ee55f16f446cced9135fba04765c16601824a925f0f29e357d3880c59d78509fa5338edbdd994ad76b332e2186462275281df993b146ae837ea78294516d586494b7fa3f268a02567d4c961a9cdc5b820b0dacfcd09a01c52102d76b8337e39205f5ea22b804a5bbab7ccaf6f6e82e7310f6215d2d0609250b10971b40732a979d2d069d6f2ced259123f6472139c6e52c1b19e8d45dcf19f7ac8b491196cb0c242108e4744fccfd4116d48c3021818c6cb55a4332274c916483f2e0bb3c34e3b91c5edf8bd948f0b71b7a0e0aa01bd1451ec8246ac8c138dbc110dab3df6b9f38225c81436ee3d047d5206adc2e8d1a4e600287fd2780a36273d889017e3e376a0e09a90fb81c5c0d735ee4635c847cba23b2d579e8a400449cc2224b88f3dcaa6c3052cb8e279ca17f082c6e2a38ed71ff40a1874d29f8c794d2c0110079a6826d4be54536cd31096a201cd0463f6a68de27a34dc7a46d409f05d07ff8b5cd04bf8a822c0b19bac875fbe9cefa45772d4e00249e618727380cbd6db4c9ff879e3c97ce68a123369ec7698c13daabb7dd0e8858a3b391afd79017913aa202019096bd1a7778210587631fdeef4eea07d166a169e94bd127347462e2134f31941c32ab651a2a2fc1e9f03083407b2acdc34e58072f282687bd96c1cbd4488b780e9a0500fe3a60822c3f7f2aecb87196728e8d9b51ec129c9f5b8680d40631a4b18ebafdf00cce7a8ee19c82d0d4447273b767c2873eea8310314563a18d01402759ba5c3549c55e3a295d052477812756de06a7452731e955a3d09c9a28072a4908f6bafe0156a48d198141d252cc8422d91c85ad6aaaad34eefc3021aebaf25978d6a9b6a1a1866ee30d5715e3de59381cc3154c30101423d7c080afd8b5119920b083f8f87cc211be26c4d103445abb1441c73e91348ad789f188143f05aab0cfa5529b560b2f31b92cc24142ed854f38fb9fe1e0f001e606ead5964b411aa15461e7fd800a18c355cdb8533c256062f41a22d40a47a4c81ab5af6c8c6bd1332e8a8b2f6484853760f9d4c4579d922cefe76e0447d4f218250043304d25391526a1d01fd38efaa0df96bd437893fde4daccf9ed7f61f89a582d8e614206111c01a4f6023f998ff79c42e1ab84fc1d9f051fe20f1ca0d84514843febd6a740a975471a9a9e4ab4783f18103cc7f41e282fc98012d62cd041d0a6cc2793c482f5b007532a2789d06ebbb402f18330b52dfb1c0611c37ba1ce379ec588cc7804d4ac6adcb0d1da3c70ddbb09d20efd05e5966b7c756645fc20a7ca1dbc544ef9006e1066dd80e0b775c4c7a20af45daf1c018daf83bd654b8c28d0062036db5b50c76b50f369218000dfd34021308f6084372904203ba72628803cd1c418eb8f14cf148618e80af5cd8a570303afc24ce8fe8d0a085a966a7f8c373aada93a3a0969511ba828d1d9beb4047d7dc32f4dc0b03fe27c7bfe7dff387f0a29b94e9156b35ffd3b19e3d2c9538ade54e3810fb780ccfb98a2688397e0942427824a23dcdcdbd86f0220c31107cb386f073108044d64b4858b30c05f85e643a1a28940bcf86797b16724f28850e5b39b3532ba4d5849e4d1ef24f0c8515dc0fb1852bfb8f6ba8bd15c83657b7e8017107bffaaf0f3c6967a800f110747dc75c1beb2696f406d4d2dbc72dad679329d513e8256f1bbb849e4d97f6386894dedcf8123d355dd233a097de3c0ea5f56eb254cf12144a79df9a8adca9870044f09ebd00c784d85f3d94f6bf2fb5f7b0555aac18e144f0cae07f0c7e63aaf980eebda44208491b051979f14b11da8842d1cf5b56fd2c5072225a5a04da38d6b50c7cbfdf968c34db6a912d96c6227cfe6ce071d7ead88f4092a2bb62654f07b51de8491a156e0c8b8a7a93c629de0c8b0a7a77d2aa78bd51acf4723f0e277d98f186d52ecbef16c2d545b41ccbca5207f5348d4a37844545bd49cb146e745855bcea5d691a510db8b839ac5c6eb07a74fde998d7a9765af3ed5a8814809790dca4b0425f9df681d973964627b9103c74e44b823ae16acf6101828ce693fc5ce16ee3e2158b96658139106c8c0dd532a8244643ef0b9f76604278c8a71698f1f7cb244a0e82aabcc35fb4ef5a5cbc0d048c68d1e9c96d0952dfbaacba5c0ed11cb2c51acf7e9f1bab0c8ba921a4ab8301439a3d94c9e418950ae3b86569d610b138d3c6587f460bce7956c25e63404dd578fbbdbf0837a130d978df5033ec9ccb3f87421d2ec5d0176b6cec0db811c1d9c7ce06bb0f07ad217e73d91bc6d54d78fa81d38420dc8f1d0636f10307482dc8dd18b6b8781582a2caeb0be23d7b1d5f3a1e50a7ec146cdd4cafae04c67711ff57c175e99e52d5bc583c0c18aca555e0c03d51d55401dc1f1c200bb57a5c8b71c26a34729d02bd453e871b91ed0914230b39e8b268df0abb547fc5e86b0855f1550ee800645ee7c73ffecbaa019cb1f16eb5cd3f113445e013f8261be15bf7d64fa4688a797377c12a84de5304f1d955e8d81d9c691baca538099f78c649ba3acb581cf94a8df53ec39757f1d4ce682d6aebae978279991930f44e51ec53d5f233fa6b4b5ad6f7c110f1f680b8023e6233164eef2a82be043388a90b6478f3e131b3d8358133c8b80f85768798e5b565c39760d9c7d1845835a7c9cf04c9b31ea70541b581fa2c2da036fa2810c2e334bd235838e30b7e5b521f3ead8b490471a1a279e8017fb662076493178300e1a46d8446752180fbd56300c34021abfcf6e3d6b02ea527c707fa8f4520779067b8ec48965d4a017762f4e1fe18b2fce5bfea39c8b22941cccd2e9b35d2d650fff0b39541e8ef531ee82e04611ff7443c1d946d0d86b0a084ec673097bbc5ba08c4fb08573fbd07db1fbe60cd4832a1df689a20dc6f71341edcc548f3a2f9f205652a042db20bc8b1e1a58d7bd45cff4a71a8c4a6220b1ceb0fe016a792deb543d770658d680a2b3f8af54986fa6e0bc0be332f138b85fe26399b7d1c4dfef03d51922d80e84bb4c68400deff44e17d42bf03ea002b7a62978c558a2f94b694c3b400da739d79c410ba291f5b4186d1300b471dba47530480ede3780d5b9a0cc935d78c1154d094bad637a4f4ba53b4314500637fa4b245efd80826a9cf718a1fc9304d0a1952e7d848059b7cdc5c2847b94029469f749093274d891aa632d06e180172a98b2faf663dab865c02ef412641011bd1619d3d59a814a05a3e68a38d6432f7a316a2edaae97e9aa4365700881c5766c513380a464e11f2cea6c1738b0c738be8ce0915388e3736c0f244b33660c28c473b8c10b92cc91cfae5571374d4fdab66a928cb354102df008222a6eb33b3a6edc08b70306cbf5949314ddb75c74b09b3ebae87a1625145a2ed2e05b6dbb0ec8351161140e7b8d16d14821b33318018d386ea9903656760bf4c84c6e9b8041498395dc91f48e30adf65187f62750f89a443e74689f2d19bd76b289467308de27af59c2e4563fb2f5cc1976999f6b7dbd0d15c045f37a32f25740020a5661e016270bfc540c5065a43880d42ebe858354ec22a961a42e25f9d950f2e20a37024ed3e6ced4781aa97753791d2bef66e39d0e19f14d354e429e7aebedf062bfaf2fea904c06eda3022e7eea9c0bd10080d3f2f996e200af2a5f55bff66d3f92b2cb1d7f57175fbd670fbed1eeec6a089798bb916a54ecc224a184f924f496887d624b5262058630b78fe38263d659dc328193cb696157b0137da0c46047b0258a4a1a0e40882f86617e57abc8f988ff6c6e7c1285f87cf10ad404dae3f4588dcc9f1f31cf104a2209492ed4b173d0cf36d246c55386f90739d9b6863c641d731e7d2891987fda3950694eda5738f43b1a047010504f61c46e5d00fb0c5ee80c06844dc918e19a8b444f178483ddb9c9e43c90b735e91919e789f2b1e414fd8d103b3f43d4b09ab951f82d4f68475001c65316a88cedc1856e948674c2f90d49b0e6f502abda8db2434e1948ee7d567a5e025fc30437ac4704877c187ee446829ae6344421011c8836817cbe9f9466308715a3f4e3a9f3c6568d91554812a6a905aead42b73bbba9d52a4ec0d235fb66aa875515024d88851343195c30d6b669f18c5c5174e54ab5a81d60151e2080da755bb8dea56b0af5409d498fb4e44efc4b644e1c3d58472d6f66317fe25b7a9023848bc5d87d83fe4c928af0a07ccf2c85e576cd94e48e8a436a26740ebab8d121aa094ee52a14075b8898da7c19f69f1278f8c32a92a8bfd4a6b6b1462e0d1d11d36f8c9f8da24e1791aa635cc5b8abfde841d622ff975b2c6d3290f0fbed217b36dd08cd8c95d4f3101ae83c27dc638aea0b3d8890913632374ec159a0385636c4d38ec7027dd2335b65519728a8f6934a031995b06d85fda18bcca2c4a0fd8cb76ae11672d3f99838da2d0d04e9d95335c5466c0fca8690e8ac0087854c8047dfb8cdff2ce0bff58e0e1c9806edbf864e1d54a0ea1b1d7a674b0aeea7a80f346efef13c72919fb80be34c6b8b6e72f534bce8f4ce78b8a916f7a61a71f4f015d4d3c830922b7c3c75a1a2fc118ff801ff61cb213ea46124474ab50342ac8d84106edfdfb2efef82ca82ec4187af8c7e66d05f21a1e61e5949fa2ebe9ca9d2af91286d27f9ba98f9a81234f121bb6b9a791d85c0a56f5e0bc1965baa790520f73f2f5d29feba9392841507b5553b9561c9a74f0b0ce918ca758bb0879b0bf5935804eb4bd1b330e5ebf1f8b99cb9af41baae9adcf36a766390f8ad4b86e13f82f9860fc539f06f8f718ebaba6244598bf4336e93a0c42d8796446e1b40eac58a0ee18dac471b235ffe5e6476ed1d4988c985ad0d249103e5a920b9fe4a022390f0bc985db6b5d8455436367e5030f6b55c4fc29b5fc1a6f333b448952b7692f1393b3e8ab33b85d505012ea06cdb8bb8e1bb16a4d6c6c81e2e2b983f0577fd393699e0bb5211882128396a2890969fcc37429e1b2c9b764a5a6834c452d2e1a0a3e1bcd6ef1b68b2f21b423827d11527e55f56c7a85170ffd64920b41b4d46d4ec4b69c80b6951088fb9e7f865660b9a88658a873663c4a1239fcf5271fbb5ccd5b4be7e4dbaac7b7c4774462a661ff3663d50430c7fef3bca53760107bef9ab92d57a93aa9a81c208897d07040f341562b8c88201ae3ac1ec91f5c64146507acbad77db7f3303e9d7eb6f3d575e618140da449a539dd275665574059aca6fa9facdeefce739559cb18b5285800b79a09ed9c3897967ff473cbdaec27b15055e599cf1f1f3df4f42ab2fab164a2c0c161ee65c4f460d21f9817a7bd2fdb9d3126203c4e15be060204938257f5d3d9e2de42205da799975998688b0ee31afc2bc3bf06934bea664967b54f32094dd0f9d7439d77d9902950a469e2b6f025ea0a7a4b2ac97ee011279ba502da5406f1e9269151bb10b1ed646e49fc71f49ac45a132bad797dec64d88868c039833f2b36ff925961d93415711e722e3870a24d80ca10364fcc5a167ee6912d28d59243e1a896e6f9400fb9a6e8f8b5b9b5e56d9bdaed5714312563a945aee78adc14224e580f6f11ea7528c1cfbbdaaa2fafbc9d32327f857ecc706d777d0ca38c9ad9da2268e15258a4d7996e3688d02baeec71e8ebc7b42b480351439ee41d6a2e823ed475a6499118cee2a385b2ae20151fd6a307a608b542038681c739bbd68798429dc3eca91f3316780f73b6369e39e6bb3647ea19f6628f4368ff0bd9a987e10555cdfa25fc03b2baf719d85fb9fadb285c9829e77bad44746f1757ecabb823e1b7c6394b541413c8d8ced20b02dd0867a38f175d88b5149204ccdc7eb6dc5a14baf11ab91612423737d8c49332f86dbef91089c3805981ed86a94082074d3ce446a49f24193a44c4041b458b8d15ce14110c853ea3d7554d3b0a662a5d9d0593e6f41bd5035ec5a3ec83f2756e39b7d222a3bfacf394d60ab3fca8131a892c74426713801f3e343c3ddcea5daf0aa11ec2aad364011b068d5d9fc9ca4429dfe51070f445c1d084631261251b0b2aa10297fc8f7dcafdad20b8cccabd5b1189e13a56e06a2a7e544777c352852391b238fe9c20d7caf8ef4b28b6ffc766acc701424f769d4bb6a633271341a5d427c838100c2dbf23b97b82ef61be19bcc047d4880f493e42416a4581e08415f6ede84c3411331d313b32b3a53cde2dbf7c8620bccb096dacf05708a1934db6ac88f736a35f442f36579f0527683a80e1c7e614efbf8f537c4a8830caef5229eeeb1a0317fdc82cb66cd95c169a9ef2fb38e8254d699b463c4bac465d3e025f5c93c99ea61d813804dd8bbe83bc54b3b111b191bd5c086e35e479130f53493a5e62adf428be70167a7346df112d4630cba1982250db0118b068d2b221b8cbb44dd9f25204a34142721584fb995f30e0c48984378432085fc2b8d95a6d5fde24648fed08b21950ea98d57133d1434e54dd316f0bc5634983aee37b8b1c2093bbdb3e9a9eb6408640b8bb10b15e893d7c295681b5d278297cb90d487d0276bc3b55febb16dfa3965ede8d414dc4d7b701aa2292c5f5549026a3775a0c818af7ec20712bf6617693091457a22dde2446f3366f0485d8c0c25df2f863952cdd0272a65ebfd9053837d0e04c050e32cbf4a20bb4cf5f0c8c130ec1ec910da1431b53c16c4c3f6b849f22329760a95783ad14e591a96b3dcd64e41c013b04fbafd53851218801ee0db3675810648cf3ae0d99bd8db90e21ad1d9b1b8e4351f27f100b10b2fd1b1c972d1f3c89da03c39b41f55523a249f81b36e762c200dfe00e17b692d046b06176bd4252775b64262c02259aae09e73a64808e907028366b4ca1dab4186f0d0eb7591375b56066c7219e3a9b4faa84ca6b0ce87c60e395fb5b606c40917a9890f450104525cd8002911940e716c39f120f6ff8cbbd95ac4cd1976e3d4744224db23cf58e6a15ed82e8664a5f9bd621bd9ec699c39cebcc45697818781ee7f446baec08db33a2db450874483906281aadcd70118830e88605f99e58bf36e738a67bb0f8d320a6d68dcd36598640fb38db5e79da771db65b25d4983b2127aee0ed7e120006afb001c2a1d0e5efcbb1df4da8aab50df1adcd55709ea1ef92c9ea8e19c7f6f659904609842d1f7b530babc03763fec4daa27324b649b226a0b0c643d9866d832b641b04b36938f8cfa1dabc5b9637910b6cc1afc339125f9bc178a32c42e8214a267423086980bdaa8b49a9c47fc2586639510607548d007813e12cc21022bdab0274b3952fa2786e008734c47cbe9974a69d6e9d9740ed941c361ef21b89fac3d8e0f8c3501548481f6852c87d49069ccb5afdbf410e8e780bffbf4aa32eec7f5af52d4678f5f5fed6256462f759ebf97acd308a9a5fd8c1a852b0a541bcf22019745b75201505d61aab613d97a8b146e3e24617c72665e4beed16a56344a519a0c55bbc68bcb57c9f2f0112bc192ed57b4f38cf779e40de470d594bee7fce41983758d5a78ea8c776e57cdc40c3c4f47f0acafdc079b68d3c35ae4d736223566036fecb50cc15b8399f096e00a80b2c6583483b804207fb95c0b74af9d2fd808b9807d0587f3505415e627fe5d894db44439501fa7a0ee9deee6f99626660eec2826c04f11d0d8bc174a5334348962bb8b2711c1cb7c3ae8d5623d3562d4346889fa600b71914adb5a429c78e746b6e1188b43674c95e808887b5fc8d9e34867394ba50f35ff84ed925930f3cb5c4cf0a937fe073bd58eb8434eeb381ca917f8039581cd08895722160db46095c1fa10f286285a17ef22b2e30928fc454e3a38e1b7014ac409cceb794cbb238e2feb37be58c11e9e2fb864bc4117feb0364652d7f7399ae9287aa15f8cfbd0efb3dc7e05b618648e146c541ff1bb9b0730485ca4dae90c79bc4e4060ad8ef4e0ebf0c2e56f82e086bf4b008675c34e102a711083588189f666258543464701bc9e149b1a8e9c626c227c702c3a645e4499f76a05dcb7e9a083605e7dbcdb66d48196534d884b4196d427f8103f523d85058faea35fb59f3a5440477cb71990ccaea3828d8333adeac765eb14135f572c69136c4b08ca0993eea007426ee6bc882847eff7c1d8b6a05c6ffabee9641cae1d51ecf7459dbd3be9c223efae871f49a07afbb96200acb3fb2a8389d570079c6dd1b36f201987c39e9cbc9856eadf5e1d01cc872446269c1eddcce514e89d039d5ef4e720525e9d4516498efc097c847286d4764c183500803abd2cdc796edbe88ac08039d1810627c4d2dc082e3b4a9fe99b80edd991ede9882213760213c24de756ffc2f3421b548b3aabe557d21e13bec220cf362e57bec879fac4ccdece7117d7e08588c55663e3eaf0d88646b13b52903be93031b947fbcae8e5c0684dc1ccb12a3a7153fbc951e463232a0b2e83cdb75abf474e542aa44e4e21cd37f2fa2b8d17ccff79c8f546ad169aa49e763883ae9eb14608293da24944d711abbd9586d41c12617bdf8a3a97da18069c473ce9cf5314641ef30736a479945ded38cad19678c798e995b71c883a59e17a6287a6d9db8253ad295883cad3c26b3455fb7d3cb954b234a8431ad12dc96fed0381fc30f600e599393edb5b88c5b74d397c01ba59fc5b5826c29a358a7131b8a71f4d263358847d4bb3cd3f91b0a14d804a9a9e7ab28b210ed6af931ae6789ac1112921ca160075e482ed1e9034a49a6a02b0a618c9def79436fc424ee9fe7866b1d211c4518c630494dce8a527740cc938b3070f0d0ab403e5e84bd420fd8f3382158109ab5094d47aaf9c38121afee086fd1ab6ed312d7bb047b8df549ddbfe45d19bbe5220ff30125e8bcfbdece4996e2a46335449d7445ac2f14fa3ce5f9462f5f2e9abf98cb1fd6dc3f732cf7aa5e347b8a74c203443c689201cce044f60ac017ff505a3569b3b275d2cc62e94b9ce9b8edb92fa45d653eb731209929f1c737bfbaa2c9d8965421eeee4df88215b67cae3a3a433844acf83417fa77ce3c780d1ddf32031ffe2c30c9694e4d38c3b1d45ac418a882fec8280de8c5e8c8ffb2405e1929fbd1d4e2e1c22812801c1409d270de023007c220069da604639a5b31fff80d3bd19cf161944f87b1e10a3884d40b64a13dada88102894e7483bf8c144d7d0b1c85b986f673f5df61a2002653e74db42229884ca77e42a70d0e02a9bff8a11c67b5e6f6e322704ea972305dc0536c552c94e320d4ddd0d8ca1325305d8e3463e3d16fdb19f8f6fd601a505b9906074d044314be81e5de7a42fd47b893c05236e7c1a9a053f94ab99af8314a8e56bea47804da2b81e63160797ee8c7142b7c7e95ee2917d0aa02b64f938b545905e9182119bc4ae884c0508f530675ec03f5a9f0cc6834019b66f46115dae1d6961c362908c6094761baa6f50800a545cc4c91b88a2c27de4dc5518aef33d546f153a2c04a701317fbd88dd44f637d4609f3a2e94b21b16df5c6dd22967647b75f52351b3e235387d01377089c112d9fcbb65d0864cbd9d3e20e6c69128839c36de62565c19ccd3e311fb2fa231942bd1f93fd99fa9b65ad8e5e2b379ff84d78817f9d7506813a8a323477dc2c18b110160f1f2c6946a84bf9c487b5a01973196026c00bc20b83656d6973b3efae89e1827063b5e97558391fb56b913f393370bb0c57ef5b95f998a1c81e589bc6fd56403853390d7dbc25b2e38a719ea81a4f395aec1b5413e034c05aa5559eb679c308196aa7cd9a54df1460ca9a456942dc776475c17a90c5b2264278e6f7d8d06546915987ecf49c8fd265cbd55a512d15ca72f92f8cc4eb541f69b5bb5287ab0ea9bd60884ef5cca34dd43a3a024499065c4830dc4f2732c78271f60ab3d98088a63bb1a73bf8c2a49cd7bec2d2f2f8926f674038fac2dca139e71d38d30806a7fbd89816e6edc49303acdd48b0135e59da38ee9e5ce12767c411cc4f4e6210e3fc6d4377499b093790dd04ae5ad57d222b011f373f0e45fb257f97a531a84550939b80f4c745f8b66e2d32018a3170baefc38aa3f2a0000374554a6c7e8028dbcffd0428e1dc34e765fd38b65e7888dde2c2e6900377657502072888838d48e3a0e107b1dab28773745d125edeee1e1682b630089e6aee93cd2a8fcca6294d4563d365b0e8099ce072a6a150daaf8324e18edf9ab68ca2b9620587332b419e4b62ffb30a00eb88a9a6c9545f05790a34657af9970e074f67e4cb0867b8219b8215ccd839282dae5f4b7050556fdddeb162b58321dccf6d12754f10a8ab5ed328123191007af0d8c81e974f2176b5e0b3800c1dca864718c4e9ecd0e30ff4eed9dbf211b32ddb60b534843c0e872ad467e00ded44a4e8b70170ca19ef108f166510fcfa114ceb5dc3f39bdc8fb10b8edbaecc0ff844d96e1e239cf28bf815735785b884d1a56b44edac69db7c1faeefe63065af0c4c6005e235db19bbbb9e9293ba9a1d81152a9b041883c4ef8144fc571c46098f7a84e772f02219fcf7153c47371c04f94d9f9ad7965b97d77a8ee4a6ebb4d0e7afe81a97d0e74c381de468753b0eb04e7f082c5cb4d184033c564aea131df984255b1addede56a0da67f486ba09b1087b19d3e1672449311f6eaa622e497eee2314ca7868953ba6efe5745656c60d64af453264758efdbddefc7170a62572ea296d9cf01bb48c9fbe599b73374ebbf6eac001efccfb3c4ee3e6aa4ff5e0958cd8d4e7021d625871835470affd6967ab968c0234738e482c9f8e59a42776db5b987c50aedf59cffd492f0652483d8aee010d81185229c5aaef7e868db3b2779d74984e64aa36b8edc5e7dc0cb2d281241ae902bcd2954635555fdc479e3b8da5fb13aa82c17f469168c86e1423fa0cc75b2c463fe191e5da2c0b43fa5ae05ab3455eb263aff2f22266391e568d50091a8ff4011d71c5f0568bc11042016356be00119bd5abc451a68434630b5ca9c33cd95c2998ac5ed7d55063870b01f32cb5677af42adcf26d8f7ef7f654af22fa0f8133d78725507668e6644b682ee2a7b74d50332fdc90f9faf3cc6ad36567498bec83a4bccaf77c0352150ea2ffa4fc9c4ea78e602f20a7ac098db57d45bd8b6849aa4ec8b06123f731ef5a8cd56cfd6caad99a47c4e3f05c7a515378b6d5782b31240991ac0738e7519f4f4dfcdacc2c35f62dbb121a9f90f9f636568d589d3ca49ee0b5d3216278b98369794a54d619a0cd5904d50a4dba441909034586089cc41cc5ec969ab88bd25bc4b156a9143161d38f4054597439de30629c348d16615caafb0d1a979a92557b661443c2b1bf5d4a02c1a07a5a869d404ec575d90063b70989a6982e3d0f660e10914ba04de35c4de0c59305a59493ab5c8b4c80da198c4691994640510aa3213c851f6737b0d59fb3dc2f8557529207117fb050efcbc5f145c877e8001c34090f31f2c622683da143204f9aa75c27eb1b7642e4b1d6d6bad91d60821846cb2c9de72ef9f0c320d590c874a1aa655f4d6804d7fd15fd792153c4c4f4e69710a195ac28f3c033369fa2d8ebed9d2379b7ea5ad6439ef9cf55ec289dd826588d7e29eb29556ce72ecaa1c3b7739a49cbbdc4ba7d2a974ba2a938ae927d34fa70b790579859556be72d871a7e195a79cb3df8e2e1d53f9e93d5e74ca4db56257a57223b0d32917c39e720c7bcab5599d0e79c5dd74b2df0ecea60ebb1d4e5fca572ecb102fe5daa49abb2ae5a56397bbaa945b73bae9a79b7262a3be45ce647aecb60e3ca073626f0027f6e9f2fcd34b87dd4d2ca1be1de260e78eba9fe9f6883d6273debb9aee10c6f8bc8f8960b15fe9f029fb9532ee443ed0f3a0568fe843759d1637687bd0b7bd47ecd1b794cb2cbcebb061ca55d5bc4d7f9b5e7a4e6c558de9f5a6d78f629f4cf7db69d34b29a82eada4a4bc542a5d659572cfa61cb24c8baba4dc7b0b0bb9741a9962bf1da6a77c4bb19f4daa5ba6db23f6e9b03f9b549f5e3acde8ce5d4dfde9dbc99abe6ddc456067939cc9c64eb15faa4b26eed3fd629f6e3acaae3cc5aadcb35faabdcb0ef556ca558e4ab9ca53ae82facaf54e234f96dbb39f77edb3cb81dbf453776bc056a9bc757aca554e4ff9e9969e724b87bc2a1d7553bc2a9d864fd6546fba9f776d52bd1d5e1bdb884672d827e3dbd1aa1a28d4d86d7d3db0c7e760b747ecd63b36ec6a1e44ab2c4f8beb40a0c50de28ea7b7c54c50cc1d613bca5bb9ac60b82441a5bed991e5bc6a376392e418bc1b7815e375611836f9d70d97865731c6795d2e97d972c1f0ea3ab4df8cc74119bcba66e085814c7a7a17c52b3278f1188452f0e2351d4894dcfed9f4e4d133a7e7bf1f7aceeb45f1523d7b2656ec065e6517cd0d4ca8feab5a56b12b238cbeec177fb4ec424aa6344a65b8d3a3289df407bfc84fee44386d7ea7cf2bf8a43f9b55471e4b83f05c7eb00ce9f291678794195dba704e48b78553f2d2df1c9e34bd9fcdaaafcb6307af6417bc9871f6846d6b49f16ac2e866ac7835318c52c8755cc7d9c92b5a7945b74d5bf16a7e065fd7756575c2f06ace19e135728131e6279ce9e24583edd3c6f3751dce78c548698c71c2eb7ab4309e638cbf3848b4f394e784446cf1db9c73ce39e58564e87175ebf47e1b0dcfb4a6693c5a6abcda0ebb19dcadbcda2aed7175abbe1efbc18adf32bbd5fb6df77b6fa7f2b572f20a2fbbf60fe6ba7cadd5f352dcfdb6d36ae9b9146c7023f990ea16545d45e5a9fc76797dc6abcadeba0a7b6b7b3ca65d482d7c163f1b18815ade1e3b598c56d8ae826fcdec1d905755dfba8abe755d9e5e161878aa9aebf2d7cd2e64818127b10b21ff7bb4f20b9e3cd037af0d6cd2f2f6905d77688c584c68068f5f03873a3ee2a09550445fa7dcd1eb447ccec24ec344b0eb23c50a8a3940155141c7c7f33c81df229be07d2dabf8383f9b54cb16548a7d98888b86d3e0054fa6b43c0d7f3009cdb19be141f1e01012969ccf91bf3369c11349ba496f2499653f999015143183ac201e803f3bfe54d21644fef08ae5a7947c4d715dd715052f1e81e2496f240821c46acee4fbe5484ab320737e3ebac2bac1639f3c443cc09c3e44fc7071105ecd1bac2ffa6ae7b119535e4bd820849019420821e47f1042081942fe0721849021e47f10420819c20b7925c4a622e27356779cd944baeb23c5ea8117002ffbe3fe61a7dbe3e3fd72666b8ff7fbb85e558d0d64d2f5d9c599cd711cc771f7064d662b8aea80d57aacde1abc823d27a417bd30bc8a3036c9d3330ba186b4af96f1ba703caf50a3e1cc15a0b5996908a1c7a1e08bbcbbc0e01846a56624bc97766933d502a99dd3c6a5e7ad3039889fcd41b0430cbe06c78c0eafc38d95cc8a5fb08dab2ba8a7bc92e9747819d006524793f00a13e215b6a4b1d360c7e146a4e23a580e3b3b36f9053b56270bcda67ce2c968ec1a88aa1c1c136f7627afe8b1e38043bb78646910de7519060f0e4551c40d8ef9a60e38d4e018f82e456534fabceede1d72ccc775f7ccd2203ceddf9461c1b488452ce59d45a5563e5a397733502ba995bb8357ac8357fc14ab015ef15176f6c9044383b0813138ebeec87e9009931e5d4ee17db331ec2d30ed23cbbd62fdedf0747773b0de381bc8a4376e5b458e05617310136b3a983db7d2e14d877759411bbcc3c3b8c6e0f18b00f14a0cde1791e8f94b0b1e5c220c471c46c64c4c368f430d1d38e6ba71fe06c7a8e225723ac72ff3b57e1c733d3f0eb334086fce74c4b0988fa34178d93fee346526632ab51a1db3dd33fb36955e7aec6674f1e6cc2e994af72e30069f645323dbd9d99ca54178fc1d9fc61eedc532c48349fa8b40fd04efe37a4e289dfdb2db351b08a529b661b3b3551cc11254684a2f07233e2131e64426eb3f29a5bc6a765dd7945870853046adb4a5e153f03030e40ce6755d1784105ac18b7fc286ab1eaa8a0a5b520ca5c20bc2ebf07a0bce3961ac7805758081a98103afaa0a361a180355afebf27ae86b5e5ae1c54f970ab93ae735279459f0e22f17977ac30cc5c2f6c556d5dc0f7e38f232de66a77760e4a00d082f8c4bcae2cc8e53ebaca5163c8875b454a8f9ae6c66e645b1caf10a3e9ed49f0f17780b527464b2a4e3f9baaa9073d1c0246798788e6719304634c2840a4c505e9d17a9bfeb6282cbaf1f068c1119094cd2042649d5e8ebd34a2a3c193dcf36337d5d73c49de4e6766934c33814c7f017e3515c4b45d5fee6bdd91fd7cccdfe7e68550d527f288e99dd10c6e8f0962069795df3ca2978f13b6d72c184a78f90c253f81685d794f05629062fa2c49085b76091da301f0018e3d2e929278c8e99ffa4942bf9ad1aebc1850b346e95d3f1285cf330f075e40263c0f39050f0e265ceec89babc95fec3300c3bcde15ae7360389c56c38e79c87d775c518d9854ba003b44107c688323c6070cc0fbc8a30326ea0c1a18613f234d0061e3046acdaa1372a99549e32655a7ce3e84583f01a078ec10146cac0d0489ad3613703751aaed1332e8db9f8c7b1fc43a9fea552ffde72ad3b7695b3d8288457f22e6c2c825fe45b2ce497ee294b83f056aeba2ba954274f5fb19dfdde29b2bf1f3a47b6e9a6aa5231153b3bc5a48193dd215b8e78c10a6d3a0ddbb8b4e9daa47a6463c3e018182929eb5dd1203c793e49c2de5ad81bfc223fad0e4ef0e47770cc07a5b0e191c3317cf91c3de8d000c77c36d049d76b97d7e106c77487cde44767b363d76593b33a6c0fbc8ad72c0e5e4509988e6802055d6f33d3f5e6e055c4ee0d5ed5e0950e2e72852b103608e3c9cfde48dba5dd5eed25737a7722a8732f5dbe4a99f14f5606bff0677cc9d220bc19444ca5fbe9e8d2a5bdae203cecda69a4cc0993dd2f4bfaa7a34b37e7ead1653783746db81ebd49a34be40483578cba507a5e2a05250c0c9452b3dc149a5f802a975665669b11f58f3bfdf34cff50a396a69f4bd36fd51486f70fa6f44f46d34d6a305206931f8cd7591a84f741253538a63b5f078ee1b494c7a8dca75894c571b2394cb6071d16075ec9932ccdac919299d7d566a6724abc7e080d353124cbb2c941ba2e0a7110a1ca32a863c7b0fbcd7f11898dde2f4732113e4c0407611f268283501e027210a1cc461f59b3cd7b1c13af5d2752fae9d564397ec130ec2e1c432f11d32f4be4747dce321d653d7eb9ce91b44bed3c945e351c6a82493b61c4099f6e2248b3341c3a02197a93dc75c41c2285f04f6c7ab9085e61671f8e19825e0ec22b6cfbc741aed3edd28b3abddfe8a77fdda1e9f42599d2e951f534477676bef79285fc42fac9427ef1be1c49ba5fceececd7bf3aba39b331ee39b231ee7c61fc6cecb6386ce6ccde3e73b6c3fb452344c40664b7b51dfb765bf15763d7c5e26522b888c62a6522e20128b5da6a9ba9c64eaf39e78e9e1ae809b3c8228b3474fcb49f4baabf1ded43aae76dd167d969d82b61d7be5d96dea4d9ca2b7a9754d31cb2532d5e7a305c7825511d5fabe771102662c4a51c402ed24fcaa7e7b7e8ad5878fc8f6b595bdec9ab69bf1c199790a2d61928331cb1fa45e161545ed7ad4bf0ca30648424528a548c52ce4b04bb62162666042846a8a299893c17c973138e81424e9cb43c63c131da932fb43c8781652e963c4791d1f3d28ee71f791e22cf401c138bd0f26c848a79a4091296a949aeab8993a80494281cc3c33f7888393beefc800b3e8001167e6e80062858120147c6f0f3c3040c8e30024b462584889084635849124b58862485e4f143e4e19804f81869395b3e0641a2e563112c83b1e4a310e613121d58418889cf0f27ac0740810549183ac1134d3881255f836362122d7f4348cbe3e09852cbe7086af91e5846b2e435b0c9b8414af9948fd7f2083f2def02e3ce2cc1fb64c88802134b6a9015af70a8a1835482371b0e31a1a43f0ec5449279bd28bc8f636209792f018f30eec24412748889243ac61925153f78359b5db2413cb8b04af7ac4f64e958805552225f22cb40a6a2e377c808a523cf94f34233304d848a8e40261d6bc897f81a44caa25ee96627ddd6a8bbf134f27ab43372296667188242c510199a9c014a779fbd71f7fad8c919f13bf4e08e17c6ae265ea9d3d96fa7bbceca6ff6d3f9ea23d1107c988986c0d3fcd9a2cfe19ed80c6dea7477a875a791ddf5683ffa6d7b4d7c2b5eec5d77bf5833aed6eeae599c1aeda7d7985eba3835dabdd7903efae9b64ca55b6a69f76e8b744717d677b0b92bce1ceeebd61d53bcb4500628501e977870a80c51da0c43347f8e5ada73987b76985dbb39dcd8e89389377b3677ec91c3aed91c6eeeb6b0d38fec577aab742e61392ca74e73dccde05a3835cc9db333ff3ac737875bfbac67fbd5ece2d4641fbdc67b361a8d38fbe87edd65beaed58b556183c73e1f39b843e9fd6e583bfd3ae023fb753f78492f616bf5b3de1e1183f79bf29b97f41f7442d3e3c03485b2adb44d785ac37fb3f9025e6c09d3f2718b330adbfc81170fb90d32198a6838d470680c4c7a236d50cab47071f81a9247fc91322d87bc0de0f03188947971a83abc07ef6177680f5187cf21654e02387c0492322596bb1cfe0729b322656a38bc75b905b8010ee32ab686dbe352c303709315c0ed7911c0571fd97b7b0c10e32ae7acbd3d01b8b7cfec006e4f0c95c378b52f6ecf6a0027c031abba3dd7dee5d4bab83d2a7a695b6ecf0008f097b7b03d2e4effe2436280d2f1292fde727a81c06001e09eed7971811480d533fa8b96abbed99e960b2485d553df72818c58bf8bdbd3e2de596ccfa67aca51b64795721727d99e940b44b27a52f75c9c74cdf688c0c5051283d563ba8b5fb68774813880d5c3fdc57681b4b07ab6b75c7581a0583dd7553fd99e0218e0026161f5646f798c0ba4b27ae4559fb647e50231b17a54eec148b98b17e002a15fb13d04b84054ac1e7ad5cb05e2c2ea61b97701bc5b5d2024564ff7171fc00532c3eac1de72015c201aabe774172fd99e1a2e829e1d56002e9001b07ae655bf17c80bab67e5deedb9071259dad9f688a06787e572813c80d5e3fdc58b6bb727e53da8f79cde53bae9355c2032ac1eed2df7f6d0f75cef99efe1cbb7dc5e20ccea29ddc56f7bf8aadbf3e2f66cefd1de93bd077b3d90c8521d00b6077517b7074864b5dc1eef3da4f78cdec3bdbbeaf6b4780fcb7b52ef51f9ca69640b16bb922ff0297b43bec0afd81f6c4cb1287bb239e40bbcc9461ef9026449766475c817f8ce72f09b4dc9cceeb011b3f1887c81a7f6f205feb2d3f2902ff0d2c61f1b856c2b47b68f18b1226183bf41cacb52341fc559c05b31afe010188c0859f1d37cec0b40cdf7696e1ef202142f38e903341cf202105a497fe148f329ed6cf02937fd6253ecf2b28f9efcc9ebf2ba11c6908f9f37a4a6ffba1da00d434f92748fd9d4cade62771db3dcf446d880f8c448c7cf3381334bb0208285119629633e81850f874511a77937608232482106a0284f80c292573419e20844464cd1c392d7536938f444074838062da82743462c511ebd32f849119cfc8c0c1937b4c01b351c7a228419fa6a38d405311c412448085a50c2278a155481358d5072831e5491862149c4e08416a09069a10abb8412b21550259aa4cc351ceac215fdc1f077fa57fa67fa47fae7fdebfe8dfe6dffb87f1ff6affefbb693fde04fdf2084f0c9e9743a3981b1b752a9a8542a959828e115fc77bae9db6972d4fa6a281b76153055e088115ec1d82512c9f39ad4755df7432205e946a393be8d46231e1289f403c9c61ef1e015dcb66d47d7753a3a1b7bcbc12bc871b0371b7bcbb22c0e912f9af6ed9ba66934f2056edb8c7c890d6367188661aba778b5d55a3df902b3acafebba4129ad215fe025a51c32e7fc912f31b67ac826f201d4b3de98e30a4c1e1ed8e1883c3c2c140e28c442b18fb8736293088ac0ad3f4f0a290c095183228c00858926b2f0a46716c090028750006408094e08fa91862e104106fc5983234a30e6c18e15b14f13d6111d3b7844a0c8138d449faa8357f3624d7b0308ecf3ae2e9be3aa780062fbbc302cc8da224767dcc841bba68e0fecdab7eb03bb363f790817e1051435c96e64225f188857f1918748bd3fc817be8ead543c4c18f9c2f4feb23c8481e40b9f8d3053215d10d270680b61e8180d87b8d0856623d0060fc6989fdf484013e049c4fbd8c804821f994819c67e5dc707e5f141cf974052267e0271bd48ca5c57278887c8851f38c1c3aac7aee303bb3e2efe3c1b6125dc84a10c392265226b5e329150a40c0ca28011d080899123522616fdd8a088353f8ba4cc65062843787878788260cd4fa122c9f33379208bc954d244fa0c993efc6436893c59b0556843dc482d5886780cd4f1103bc675ef30ee4621f9127f03bbf14834829d3b4e0eeddc7d225fe2736cc76e13d8cdf3809d9e0290c5044abc6e54326f2c92dfa123070f70c60f714804dab6cb23f2c49fe81383581c9c1b1c1e543c54edf590759d07d2216b5ed7c3b9b97169c02682734301c8fa317f1d27c7f6799c1b1c1eb8d3f3807d749c1c3addb573cfa1e37d3b9643cbb19d74e307e9b57bbdec2347f7f2858358fe912f436adc1001097bb52ac66e8a45ef4abef077583452c5f726360c6b46bec4fbe87698b11d2491441295936802ce684168840314a24905216bb9ae95288cf8011a8aae60822558984421062f88f2032894684148a7851b8cb4e033d2c20a86ba60842e4c41abb802e88a2226c6f153880787b2d044d24b298f90d1db522feba5912fb1099ba494ca2b98b4947f644949e5abbcb0e9b205303467e0045308018a167c9ef8c1621e2cf105246148c2114049b0f80877d90215ed351cdac212ca1409b5ce409931624e97282e3090720b488c883166d9f51184dd9cf834c000bec27b308954bba45a646a7cbc628979c1969584571461a6ae5042de934fc9431abee2c815476813738807879c8421092c7ae494810787aef801673442cf26f49cb30b5d1b0e5911a58811a45a5c50842c0405f102133580e230e881911990a1680c5260c289aa8439930042c2638311e4e00a02e801922453fcb8e2084660cd2447ae24bab8c41445a6e8016d92042e78610c3038429012b0a6154cb0c1127e4ec0c405b3041e1c2a72c2351cb2c20a4bb0628a8c4e2b92b059d104bdac4002615658ce4b29a534a2e55bfe4d2b84b47c8b94925bb9ac341cb2a20656c8a03f17a19e0bc27a61d871601abb37a48eff62d7d370bd5435718813ba1e07a6ebed315bce49020f0e59214a5f1f7d8b0ffbe4558f173b5e2decb09ea3daa995dd35c94eebaffaabfeaa95bb941d5fb9534a9b5a1ccad1781363c4899ac5e1fe381cd91f57312b60b161f4e3e7b85c4aac1862e809430c1541993fbe5065c0c0f02a72f4a82a70a129fd6326100f0e1515f514c283435308a9a1e150159ee8aee1501594f8b1c13a4bde46c3ab1b4af49feafabc0ec740d5656fd4601929c4c3c313040b1e470c1a3e07cb9c05afe3a7e135c0321e0f0fcf1858f0361c0387aa4044c3f3e018afe17338060e51c1a7e17fe0186ef8c8c3ab1b861ac613349c29f0b8e150932df47743db40420a0857fc4b043b7667c9460faa68382405261ade560c22870c494108035e9d258f572a3e1c22c3116dc30815bc826d030926436440d2368c147932d8615826fbf51996d164b65faf612bbfc06b16f20bbfc863965e8f571c05238d1aa242495ff75aa0cbc51cd3b0a273dbaeec33ded67c36e3475f219592f98b8d6da79151a7b1da8abf6e646317ca638d1e76b335673c7275688a2758c52a564329b5ad8bbb2e6542ad335066a6cff499d3258acb0c14b0983eb3274ec97ce16099c96242154c60e20243c60d5d88c15a1e0768436cd46cf1869c8085962de54dcd2098e317170d879ce044cf86434e30427f95491220487413c2d0efd85956eaf8afc4d2f11f4bc3472813e14b3c841c8c898797f045ca4f36bc076548f0053600c203c8c3e7cc8fe9299df7bbd1f4e27ce7063d7f753b50235aeb9b98455ff7bbd1f3e27ca7e390134670b134628809429367ba4471997362b1c7dbb8cbe14b7577793e5feec09d2feb559d6e0d77869dbd1e78d1dbb94b149f4e11d8e9edaa4a25afe3defde4410f7aa8ab42bdb5dd3bca93dcd9af3bff64bfee7e3b1a4aeede37cf72bcc2ce95ee17bb44b25faa49df207f9e4c4abe60e7b873a89fb877dc4ddfec97eaedb4d5ea79a89f4e96f4d4e958cafdaaf716f7ee1ef7ee1cf78ee36eba4452a761af4fa9dbbdbbf7e3de97fd387855dd49e5a3ee275b39a6bb5f6ceedc2a16656d523d3a2b881ec3be49c83c5ba2c193e72ed1e0f1b1aedcb96b936a7a7bc4aee78f6c74bdccc2abb15d1fa560d27187d3e9e4bde45d839e773a6ddbe6bd743a9db47bdf553dd34987dd63ab7b3cc9d46936deb3ac9dded55abbab4e37023b5deb4f75e336cdb3a5fb5db2b3211fa510c230298e3486c5addbe1eecab67177f6bbd19df76fd5dcbd7ff73a104f27bde33aee347a7694bdf1017bc57ea5a75cc5dec436996c8a6519e2956eaab9528de9dcfd52cdbdc78b3e75ddbb7aba2a547754f753c779f7dbd1de790753e9f05cc96af72ce97ea36b936a0b6767a37bab9e7b57cfbd729b7625183cfa788f9366f0e863b3ed78acc427281b4c7d294ffb62b7e168be7623da6f47c7d4b6fdf3eeb7e31053c5b7f8daa3965d587b5e9bd495c30ef1556c356a3ccccc75f9f9d5555ddb5bda3cc7c3abfa66b567d75a55cfaa5aab0ac32e5fd57c0b9e9eda4f4503b2c65b3b1ab3d680c808284f5cf318663379f5f3c49c5c14ee89f904b3cc82c6e805085910e3b47cccd6688df1f5416b19a7e4199923cfcf7b4128823466696858478e1e7648ecb3ef17f9288ef9668c981319f9c3301e5a530c9b986dd9684daf0f5ac763acd5f0b56be7671b1fcb72385a8c2fce8dccf13ac61edebc9f4e4f7a63069b676ccf2e4dca6ba799f9d931ca590ef3c61c2f8c2fc622c7d87c696cf07d983f8d9ca7011b8bf697ad612cce9b3327f6f73d842248e78093a3911e4239c971d362bf2cea8b43085dd8f5813f5b78256dc49e99f44c8668c29d8667a44c4af2104f7aa3e195a4d7959e0978e2757de0c747eed3a2a28e1e7218c1aba14377d8719dd4ac0db51ae095fcaae713bc22de685cf7c2f8ec86165ec9d3c03eef4ecf9e8d0468079b13bbfb8c94a921a55452434e22ef7a8e1e20d635a48cc464ecc62e0daf6c5cf7217e3ede4b02d7233d869dda9aebf6f001fb241a22487310cd2508d2dbe4a2a5017b62ffe2cd898fdd23ceffbc9a314190199943ca8c2e8b043ff8055e160986e015ecda4900023d5f8d109900898e3787af73cc7c8cb104d75b34e782ad0df05f348c175b061e2432c1902ec1908ecfc12f52c7ec815792044fb2d8b616a6b2f1f7c8ceefd19a3a382646ed3d9480a73f5894835792de7fc7e1e7cc5f399ca3071d1a76f3c292a049f335830f9baf6aa7b34b6444baf7d1bdcb43c23eba40046da0ce2de3a6120f7be4715bfc17b1cbe145f3dd007fab1c9f521f64b736109f73d1d09a19e3e0e18403684202234d12ca5e615783fd2666d1e3669eff5d13091e24220113f99eb6033b9dc3dfe9686f5e344b794e922048936048c72c66aa9d9e9788767582280059dab9cbb35d11c42c58417ced34ac5920823620c4c50aaa76fa30ffa6b7dec8f9167e790b9f57335e4e9f2a1a86c8878a9e8731c331b0877890c8c748cbbb708c7c8ddca43c95925ef3f2e6f075e155143c4804240c5bcfcfa338c687f73ce7451be4945172810806473a2312e287a847086bda75e68c6badd7b4c98ffc38cf37873522ddb7201d8ced57350beb088e0891243bbfb3bc71974788b3ba531ad9fdd05976a96dd9f0b563d7073e86f1e9f5818f93e369b787d719cd61e62c64b1fde8afc7fbd13967c8cad40553461abd221aa9edb2178a57b11bc5a3a43fcf831d339c569eab12229475f22adef811b4039e480643744b43a2213e7d6156e72cecdcb12e39b1601bcf8cc5253cfa7909af6b69e425b86ada5b64af756edb6978cbb66bcf72d0e97a1ac958f66db3582664cbb2acd6cfe5924b308dc2db81eaca3250a862708907897e1c6922d9a3f6c6a2d5309dbe7cced2342ea3a73eeabc68763d281ea3576c0e44863c8aa7e1539e41175fd705af25bceb3c89bcf96f365f315ef3a2f356c985ebb201ce39e7ac99d9678f8e65271dbbec66607774d2881e3ba5904e29a38cdbe769a4a34929ebc7c7b17e14e117d8aa9acfee1a66e735d299745d5766b556e939dca547cc6659ab3ba9be067b566f0bbbd8e3b33ac3741ac6ec97a5bc06f513d7425dc8abd33d71972be9998dd7a4a77937b1bd1c6e8fca63df46767658377bd4cd4ed35436344de3ae716639d6ae6abb34e6e98fa29ec76c442cb3f3553eca63378731fbe97cd8eb0ec6afd19be249d31741722446e1158d468a1c4624a4304490217845df8217d271f4d8d54448a51c7111300695c26ce2f11016c2399199278a8d9c4da214bc2884e4ea6aea8d3ecc3e43f840b9cf2dfbc897ff16ca977a7d8af08f94e1a2eda7ce6dda2bbbdca472111552cba2aa3e0a092d01125ac2440a950dd2b7d32091be6d1f4b365552761a7cd9885c220557016db85e7459011bc048e201e8e9a596fd23311248ce3f426cbd1f2b517f59ae013c0093ba5e9f39045eb284a558c24ce212299674121883166d557011f311efe3a29f59aba8877593978b2e9e968b78455f83e07dfc53945d248e8b248d1917fbe39f08a5328f5865434ac9a64bfb7533d89a58888a06e995e3b82957c1fcc9564061fb714fd3cfa83cbca2a45a05b4619ebe5a79ed1bc9b2a6b1e47bf9078c41a31c016300fd141531e1715154225f688412a3f0708c3c3dff8036d44ff9d824c9b2236993d73ee5d5d5c867d7acaaa65ebecac92cd9ca5f9af67a755a36b2b35f1f64cf8b732373bc6ed9c8e6eb836c9c1cafb987d7f36a6c84a4592e82c4fba212274d1f062752867f7e9cfc08f919f2f30304f4f33304e8070923458080667e721425f1f3c34238e61a7204b4e1b2aad7cf6af947c89028bcd8b03f2ee2987a3e9dcf6cbc46d8721124600ca0555115454571085e459f28240e894162fca9351e118b9082818094001531c2110aafe837242cf4f3c3487845fff192a6508ad8c787817809afe88d24f13efe019a938f98978be0214838868710e218f6e1251cc342e84f0dfe01ca1c8247533bea8d498e1c814530563de8808145ab18f98a72a401282322016da8a7fc43bf09e1153d1c62f96709af6633596689fcfc23657e19e893c8632029c345fc424fe16fe01fc943380652150fe115fd90f7cd50f9a9bd46e9fa11160d7b4414022a7abe12856049635cad5b94231c608c7a51300654423f89e07d2927d167a6e9bf2904ef5b35a5f55a2d62a8a4a64a60741e5d1b7dfb37a37d2ae1b572a6125e76beba9a599365576563f4a98457cf5765031bdd4fb676f922bc62a06c4ac1abd5d60b9350ebaf5ff7baa2ac1f5dd7ad918b40c183442258d2b055fe319011f94cf5961ae18c72c496a9c82c37399de51f1771118c410f2d53c14db80a21d4532791e66be033136c296110cef91a6dce8f5e233fb5793f78416bc2b2924975d284704212bc4a9dbca6ebc27e8d7e69f7bb46127eda92c9def868d2453a0d77f62636e9dccd209df412a954229548253b5f4bf532d069988d700ce9a45fd9b7d32492fdae4bca9ef26abf4ffb279fe570b7baaa6c995539ec76503903f18a7e16c1e3bef5bc241523f36b49ae858b1600e0169fd60503c085e522bca26f6167ac1c7636562e1be115151d5f6f641a5a3e563bb356abaed467af99afa3d7fbbd0569868bd33011118e24c1a2e3391a24d2bd5176716a46cf5ed37d94652fbdc6f475d5446af9b42d3ebaf1d12bdfe4ca69d885bd89bd72d9cd58798be56ca86e8b7bfcca2317e19816a72ba7a775be458b95162b6f61e761475a3989f495159b9d8d6c2a5fb12aa3a9d3b595c31f772b27b6ca86aa06fb95f2f915ab723acb453d75bf7af92a9f67208e219d9e8b18e11815ab72d8530448bace4ab2b0e78a855d5554ee173be57ea8dbe22e7fba2dee9a08a2747cfd066d6dd56b8f45f0eaed7139a7e041a2100881444138e98f819a1e3651088a908142f45c05cf91208a7e0cd1f190cbba1cba8f8ed9af521af96ae7bd9fe9b3cb417be95bb544fead7ebbceaf2923ddfa9c751d9fb35e7f757cbc98f57f959f763bcc2cec1736a856932ddd16f6f88a3d1ef32c696473588aa0083d37e1228e81435924697aa682639cdc1eb1e5b52024a03d27b6bcaaaaaab7aa7a6bae639a55d93892ebda2807bbfa38bb19f54ea21014e9f8ac953d3eabd05e32b3b073b8b1272c7c81236073280d4043682842f4c349c74fda8265c8bcb80e53d5f0b7693f9d6fee74e46787dd8c1c6ee6213c14054acfeb9a3cb13843c01176508ee6bb895d9329c51e276f7332cf784d2c08309a1c5ddfbad188ce89518dce4b64e3b4ed5ec994549903dab835cf0d358d59bb354efe162106e5bc58e49e473cbeb209042fb2a4d8b5d3d0ee4e6bf6a39faf73d209a3065f531067eb3a379d944e3ae345e96d9917c3eb36f7652b17044ff28bbc9c547870288b9fc6e8854aa168d57e5df5d236794d2947f35b57ab57656f974f5d8f965e315e1745a15218c528d3eba2922f958dedd8696cdae9fd7476fab29f0ed6cdb81ee5855d55cdf57a1a57f5b0ebbae8c555e1821dc72b2c8b999d586c6c468e91271f8361199057188ccc6a663f9d4fe7cbbe5dcb344c55931d3b8d0c93dc06b76ec61fe7e73db3dfeccf6b798974c72e11aebb9e94e1eebc33723046a5c276451a638c31d2eb1b5b1576533d0ffb8af750bcea19048fff7958c69d7ec36c1663c462c6d9c92b207e819d85117ee1a00daa7898e295f4828069936a874dc32aaab2d1bd9e46778fdd4f67a7a9a5df2ebb19f4d3623687eba5a1dd7a2baf78d5d10082c735c663f4a217a514085eb4fceb62ecd66bc6f50d460ae568fea2365896211851109634638cf199833118c6d888b8cfee6ac67d3ec2ce66f6ee3db8bb67aa9af8ec71748ecb3e9af35977069fceeed3755f2b873b7b0e77e4eed7591a18f62c3b5639263b3fab1c2df62eb35f7d074ea7c778d2e20f97592ccbbe69afe1aedd1677c5184daff15e22bd66f4eea6db0a5c0e6618269424444a38a2570d89a288d25150d1300d89a22842c4244a2f61885e4043222548d1444a40628e010948f429d5b816cd0b1e245ac2a341c1735dd6b341d086305a14040d8a210cc5ab7a896cc73cc84af4500108145c68d20216b53c4083155ca8821047c882459d30830d8a200d7ad8a40c20c2832206a8ed1a82b1cf39ef2580080a9f4984842413d2577a514f3c48b424487bf358199620b16448c3d0890383c1ab0906af36247ae2a723eb8920f20576a778f512899c60425f0d899c60d25f8a8b98d3258a4b17aaa63921d4f55ac7ca558bcd577890c8092350d6435677285f64bd377e74dd47e7a1bb3e91d5bdbb4f648d4e235f248a63ba8fbec30221a0640134450f8a7ec06a55e127063c3c3c5188d5dd916a02a377e761741ea07cb9173d5f56c5bd5eb58dac8aebac8a1b5dd5766febcec3e8dafd78747d179ff598eff8635ecf91ed2c138d2f125c99a691bec3c2bad139eeaab8efb046d75171dd77581bca54f24c25afb350be60a3d188d21cca306611ab945216233c7a3f1eb589214d2bad945e42b8be719a16e3f61d16e9d8765dd70df972a91c46be5cff89f49494ab5c4fb98e3a91ae8ee9225dde2f285f3c2d5a582b57aeb3d9db883bd74538a2b16e6b2cc50ada32ab4448d34a292511215d1f9ccba53125c1065d326e076491ea8d1f413c90ae4f6491ee5d1e7e08010116e93e91e51d75694a16f553493581d251c7513a0a47e9a7ab034bf790557a89a508abfec68f6ddb52b56af7e35a9b7775eee2b8cb917658d775d98ffbb58dbad1554d8074ef3848a3ebdcd1bdab53e5cbf5ee3bacaedb81dfdd545f3ea4da6eb7d667f3756ed3d2cfb318e1cdfbf1a0dc44909e94a70dc8874d38ae39883b1a1eb3dbbdefa8baab9ac0e8a4e3189df4aebb3848f7ae8eaafb0ee93aaaeedef8f142bfc3fa0e8b3b8c7ca1d7d109c261fae9a6eb04e128dd3b942fa8ab138403f594abe3c9177ad44f5787fe74a17c317957a77429e52ee97e39af3f6479174a4aba50bed42a5fb073aae1c4be6555ca401686d9ecd83f1e8d35c1d3d86bc72eabd8b3c8023ea97ce5609e8db4c4a203a0642172eef2db3d1050be74d9bdefb0b8abcaaeaa02dc47c7d15d1cdc471f5d9d1dd6e7b564713fba03313af7ce02118463a4ba01e5cb76d83820133ca8c2c8114498f0f0b062104901c83a6b87045650d244491286f0f0b03c1818f922cf6283eeaab4efb0a07cd9ee177f5abb377e40f9925d9e968f3cf245ca2bf120ab7b12d484211021080ff922ef5d270847100ed2b943f932ba3a4138462f5d9dd1bdab1384c3fbe8eae8902ff25ec75d1dd2e5f90785e4e84e79218bbbf4f6985ddf4376bd0ca3918ce90d366c8352060822d4000748307901911bb0200ed0f083841798c10a274c94c48f1aa59eaef821cf700626346082124523b8020442a040010ea038c115aac09a4b2052c2c8b48207899288d25a43222453204294444a0c215262881a3772e8a0a2e535b003dac05d346f2042c2043953050f122581454321958644488ad05843222447a8a87506ca0c15e67489e2728e8b38905ebb9f76d6ee9544d3b88b534347a7dde9fd46ddb761544a11100d01687292b3db21dd2af72dbb2d8e8358b53835b574af5e9c9a5ae2eac671fc8ac92983d0ea8e3dc3813046bc9f0e103e70208c91c3bdea74d7fd7eddb9d70ec218db69e4a6d91aef8cd78799c149b5234cba32adf3d884ed22836c9063a89c734e79eb8c9105db765da77056ce43a56e7ec0faf3d1f406eb79bff80eecf4a45f0eaf206ccd2904fdec39479aeaf02dba6b1a55692ad5479d4a65553534eb4ea9d6cabad3f08c07c29256a9ae9d52d546376dbbb6d1cdbad0b4aba88bc36e86eace192e5cdc8f62d1f1da0f9034eceb074b3a3605c2ca4956e59aec17db54aa3bcd7296d4bbf7c0674e1e1481a4b5af00a148b37ce59dea9afd66eca9b11c75a9da5416a786dec56b542eeee7e2949eafba9057aaabee47af963a00be51db6a6969798a0bd5c5a97171d56b5adc854a7595d790aeba0bc82b172eaed25cf05b2c6c00dc858500b09357f2ad95b39ce51dd869222e279dc556edfc1aaee3727a95b75457ddcf47abdee2627dce7271719fb35ceee27ef3012e574707103e6ad0ee728dff95aef216db52d56897d73e0db6cac56a35d8a0ed2de8e559e84acae670cdcafd767ae5daa1cbd5f95dbed9d855c0c78b076dafe1ead8d7701a5983d5a9e13a429ce5f2eb42240077b140f8f80370797e97bbdc1f411b090843ecb48bd509223d687bec6ab8935e83ca3795e730d10fa234ecb4159b9d845de55a20ec15e2acdf20ee9095625b373e50b6a51df6c99a6c0bbb7cc9b6bc8b612765da6177443fa0a2b54eeb7801da610e774b1e93978abd17683702650751b6150c8c1f14594979ed7e302db3d3eba217a5d7637611217d0b1addcc8ed47e15324c4920e983240db3ea01122d0f63662ac1d34e679c72930a0f12218144f3e36de19594216f58f1141eea7aa973330a4fbb372f5a3bbd33e8bfd54a72730a6f5e728cbc36406f46a9c679a88d831c43a9f68ba91673368df3d11aed3e3ae901a3cbd39d744967ad47d6d920aa69f4f3d107fa18e9f9fa40dfc3eba89dab679d19f46696feda2abd205c61d7eab9d3a897db692da3dd0c6de630f64a63fefa4ea364ba7797e5832397e503a14be352102408e7129efc75949437755d56565ed1282524f2a0849725fcea12de35ab9441f124f2e83f54f3452b4ba633d866ac614631c193df81121d146d17f702007d335df40db7f44de451f50d146ad13767e91b2fd53775a56fa64adf704adf441e54df40a153dfdcd4375ea96faad73793d4373cea9bc8d3f50d14e2fae65bdf785adfd4ac6f66ed1bc6fa26f2d0be814257df7cf68d27fba672dfcc1eb16f781679315ef6fba15bdab3946f57cc621679373337310b14eaf529f6fba151bfba1cb4ab7c8663be7a43a77c05038663aed24ddf3a7b99609b4a250fe36aca55eea7d3a89b633fb629b747bce1e6c7199ea9a8c7a31e5552509f28953b039512515c3c8d4cb1fced45f351f68b8d42bdcebad1fc065ecd6889a4bea5acce0ad3ccccdf5063c6e4e38710b03c042cff21c4533a3cae78c5abf21ca9623f9d56f96589b03c72a9eb2a8f1dafdcef62a661182cdf306e3e559a4ff0e4677ab27c679e953a8bd561b91029ef2c5e4ca5e8a3258d4ec36ce95316b252ce4ff9b7ea959499e19769ba173f7303c7f0f9d0744ef9c6dc4acab08266d0e5248a469e6a7ba451c7f79b4df0e423cfcd728c9c10c64879420743828414010a2a1284c48428ef2d2bf9ecdb96f2b8ec35664e76481b8e91d77529abbcaeebbace634a795dd2c667f0daf08ab71dd146ecec52d9d0ae8bb5ecee7410bc1d38c3b04a695c8fdf69cb8357f3363b8e9082e7078e81443428f2c94194c6eab30ccb6add11a4b7330f8ea93515c3b467598dd9b5e15a58de9cd9da9967ebe018ec9e0dafe603489ff76c0ef932bf43ca90ae0e9b1d36dcaa88bb1db60b737bb4b4f62d07d6430e274e76449b1d4545398e15f590c389931dd92d1a3db339741fd9ee565ef1e0189d0fdb8951bb363be6079f6c5f2b6edfcec1ed9ca6a3075ecd6cb6320964b73d70cc764cb359c401cf0d9874146a4d76f19b9d53237576bf882dd174d0301c18c160f08a08074332ae613806bb344f6064f08b0dd7d9614c283c48748326fdad56530aef7abd365fecdb7c3e1a3b4eec7a6deaab94e1d50b750e67f787cee1cce53eded85fcb550f6b0a9522ca01510ea6e89e9e67b36346e1c1ce81507ed0893c33561aae1cb365df56af675f0776ba79664438a8a25d1a12e140a89b34ec563de4d5672781faeb872578128a0466bcf699699996651b5f092303e6eb986707c32bface5e97f65a7925a2c111bdb2f295430fbc689c9bedf237da71b6db819dde2eb7d45bdbbfc8e760ca7e2b378739abaab91e7f3db62ea1ce9e19e9eb17d090ceae0214a4bf545318983a43dfe2b4c58da2e96ba09a9ede85121179d2940888496757f9967192767c0ceb1ebb5f1df62de57eb1538eb2df6cd4318b537359258711f3a669dab66da9337f65e57e44545beaf251a7915a0cb26149f9266d8bd7c847222d589e5958ecb7f2fa6a53f7d1627e447cce52bd465e7b2a12515d1d1f2d2e51676b92de212fe05bb9a7cf2e87eb29979d8dec2af7bb9e926261a36cfdc954b29ee54859cf70d7588cf0b6c3be33327825fbd26e4e0643a9ac280f6e2ca8ec713680d23508430d78aa9461d9c006def54308b2ff10e2937f511ef4383732c76b1ef4383d3c1a398964d7be6e461e1e56969d93a896f9048f3fcfaa95753f9dcfd3893caccaa2d88dbc91d7c5d715ae63d1ab5ceaaa35d6fa6831ecf172ecaaa6519b234f79e4e4c86fefc1f43df89b4e476ddb34495fb4dc5ab0c8c0cb61acda16ffcb612c0647e8b3dbe25f8d7558841d33ec3c99f9137302cb34ab19e1a49f8a01163ddfb29252d3b24c7bbddcc67dd366a03886bbf33328a23feed2f6d88ec9e7648f372f6c9cc111cd9db37cee9c879af111d36cacd8f62f7ed32ccae3d56cf131fe6627afb4ca2bed5ffd39a219fce85a6b54d5f02bafb4abcae1e25a649ffdcc4e1b01a8aea8a4ecf4d4a920854cd18c0002000400f313000020140e09c5c2d170442cacd20f14800ba6b24c64a049b424c9510a21438c218018430400604460309a0400e3e57745afe82c5c8d441bd52212b584685db0b0fdfe3d6be49d58f44a29125715d4d605345b71b61a579afcca75c14244bf90c221b505f4dc002567bb20703d6c0c62022036be5eb09c1e9fa7edc27f11c861760e40fb8033a771fda0afac0b02b11e793d2c7a576d915011dc51c0f3ac5b021bff128bc661610c5e1b1129e3d08b0292021b2bbd9cda69e1997e9ba1e49e3dbaed389c972e8c68ba48c14f41046bb86fc66c6f41bd5dbc7bea103a6efc4021115ce0262c980a1d161c2d34edfa66f90f853ca3cb1002fc8b2dae862a885a96525ec52da9d6cc2a703d8790e1a48944248f1ec1e78101aba21695a789867ae108328a55b23cf507f1c3500b5b017fae539a2fb0bede12862ccd2eb714f17624e0c07fe37fb2342165e0123a39282cb824cd272dd735b293c85c690130911e0752d2723a9d7ee21191b8fc57e3cf55c85b8f65124a0f31c2477a0c613b01023de0808b8c7931713a160c06b4cbc3c590b5927f2139e45a93c3e0c4922c88cf952901349e0e2e1241e7807db34b7a16fc6800db0b9cca1b1aa82ae2270e222692ad904dc141b745bfa474b6a2f5dc6889ad2c260d7f0918b5f7cf27b61e94a171cd8adf58486ac9f767bba413a8c53dc393d6b8958aec4550d1a76d534ebff6a9568d826f343e071235aaae6d37389c9a15f56b0615a21d03d05bb7f8ffa8790f8d3b8bd7d8b29f65ea86b0ffb499a0b643dc5ccb542f921304112c73f7d28006f3c087deb790656d3bd8765152d3f15d5a28a75493f4e0b7869bd21a72d949e4d51849a0d0471f9c93ded9e7f3c01f85c61e3b148641ff37af3818b6ec5f788f6979e4a58e4183c87e42bd0c0011805e8967019f3ce2678784f2f4fe82fbe4cf464691e9245dce97ac802ae3f29dacb322573796d1b57a5f4158c9b5f902a599f92910e40ad67f1c6b721c88821025cb868564aab48367e55fdfbc767a7401f5979cd9f5fade57405737195feaec6c9389b261fbd1a188551f52e07f1f2c3af09f6998fbe0d375751c7454c180f60a6bcb52dbc40ed19c2d4cd054e09fcd230b91c44229b27e778c44981ca64b30314adf242fcce31904d353fe798e7e0600496d8ab1e59a6417200e39f22081598ceb5586366d757af174baac68d8da2c9aa5b7a5355bc63350abeb637e4ac79ab31b0301eea4f469aaa7a72053ba906d08555286ba995ca68828a0da20acbb3c5a5bdad918e02ea28184d644bff32355589e8c1db9ee6c8feb0d0fbfe32915016c28d13fb1edf730ffa767ae80dcd34507b7a1455fe828ad9ff07ae89fa49cdcfa7fcad4177786cd91c7c8849c0d0106bdc1c2b86bb770d5669f6c8f1458de77ce34a1981009b05e936abe3d95db9e65080ef5056a0a1ffdae6725941f17b801145dadc12d577c1d4b7ebab57e659f33983e412b2389646f1b48052d9d0e49e97edde4337fb2aa326c91f7967a036912667f25376b942c159fb55d1184128198761f90f89eaf6d2d4a502f00928fa189fcc7c206e184f58ee0430c7c247a573c85542b6b06b702ae94d47d5573b0e51460d59320b0d79ed978544cfe026669a9627bf332854ffa34b7767ba159b48e544659bf52baff3e24a8dc2016f97f2b2bee830e155db8ba8ba0efd041a51300e8c8528223cd2b40a6efec6a71139aeba6b9cc077071ba658aada40b9b1cb40a061813bf6f8a571dcba5e5bde1b897634c90ca2ad190863001a7b8ad2b8a676261a611c896e2a8617e14102ad15578940dc7b21ece46eb9b8cd5e17f032b2877615dd560f9d6e20e99f180c5108bc3ab1316398d73ad24736ebbdd6ab2c7d60badc29cf13054703cb574f16e3b8b66101c74e7a6382aec7f0625426f4a52c187fbee440d7b7fe5990ca4312d4dfba7bd13203deb28306f50c982e5d16c78ba88669b44813c2d4f6c7478d97be036fadff8cae234a5891562090ba59f2320c62c009119f906335835b09d82af4689eda63993206dafb424449228ae6e646719541c1777c07c3511b85542dd50ce252a730da79039e9194fdad560ad76249f27da8f22a7446172a170ae03bfc8be140d557f7455cf533f0ac062420fa33c7d1306d8223e9cd504ce321f3b14fa95833fded0d1a192aaff0a00865ee26d4f444d507382dc32b9ba45dc9624f86efab8dd2e2a6f7183a1384a92054102e168e03140686e61c838870efe730a00a68256ddb8db3ed08571dcbc24863016fe5281767ed065c0abc015a9863c7e5b449ac59bb2d21a6d0a3d70ed588e568145972ad53c86c4e0bd49a6833b1f51395aa08f96d7034e416418bf0f20b319bc9c215ab192ab544a229cd0927c18874f360aa47125d221484e79d946af0682bac68095e180b9648e12af9f8e59be5f3b8d66c8acdc1f116d77628759560e7d2438e3673640b8082050431322742fde27a286d614399748dea959532989dd1d652295ab0555f1f60833ce168d4ac721565a91c291b468962d63d3e440963e22199e96fef298459894f0c43a33ed38d62f5c52d6d90f178e868e2375037b9c832c4c8a25767e5162ecbf236e4930299a254e70662b1abc989897946402c500d8ee1dc846882122072074b69689a1263f4d7b0355135b31d37a6d3ac73c36840ce04616db561bd9c42c2faef592667f03d7eb491f4ee6893917baf7bc1f8f06b7e2d0cea7c32caa40fdbaef9b8acda1d29cd5d6e30626d2db0273a83459ed7983bf91c544103edd77b747b52985c1b30ebc03b0125413220ffde1969ab13bbe4529c8f94ad611d3124cd6fbcc89638ddca5388a279a34408d5655cb7f67e199a9f7e804bf54f89f712c07055ac16652ef3b3680352724c06d0af7141be7744721a9a452ff1e67cf90f0e01819f52504620fa5766d6675bfd7b12fa42ddd5c572186758d1081f1a3c8d800c0012e2c6e9be8f2c565503936267c2128c049a9d4c3d38b0d32b7e6aaf33bdc64362c275c6c45f5f8ac521411f9f0ac5760aae3db4b57028f80e742edabc857c4416108b2272a071b52342db02257ef4cb28b4053617236be8903c2eca85b59850951d81c3cf45fdcddf8239e73f4f0fc16d0fb3b9e08c7124bbf85a90db57d2743699ae82839c3405861152bf6271b5733a15c048e2a7e76d5320ab579f22cdf6cc629ccdaaefc659ec1beef51d1dc571ea19502f75d263c498acdb768671117f71b8d01cfef9cb2835d776e6ee94731a9cfa34e45690997025ac0f91148e2fe3a15a10d15a51f183d053308220bf1c6ad8dd8f790c0232e152571c5228f8ba70c22e7837ecad55797dd4b80f73429d8bef2db3e53a0a7156aa5284753ed8335c508d5bc35b5a0a4a1237d1d87db5a33c2dd51a44a3380089b8bf5217d4809592a31f5cca399e96bd19606d031ac025513aff5fa228abd26487b084dd36519934ff78c74743d14bc03324f4d01e0384cbef98a08d89cfd8918efda7901556f856e0940f5dbd165ddb87c9187b725bc25e713d6193330a675a6e42193a5639c0d06e148bdc8f69d9928cdb52fd524f8e8f47ba20f83a8e628df4271506f81c83fb9d07d609310cebfe5fd097856267a1ac853ce30403148e460d8dc536e5982c4004dac360334a44cabdc1c3c07b981d1281ab15b5877bf9f013d70a11d9e50a38195ec133fdf3f85218666f8758c829f84c8155348ac176ece09167150a7a6b26d161398333e43213c96376c363972b3cf7398f46eb2b653c0ccbdd0d1e5293e2072b57a6940e1f380c7d8725b66e320ec8e8f7a2008f402e71c27b2014b9987dcc3fc02d2935c1148a67d1e262521e7275fa85fc279c6668f493903089b12f4fee8a17ebb271cfc2f8762618185f01c40c58cba1dee212d85bb42c2fbb962a2572c132e65ec9724242bb8ea1aa9521844669c8065548f6479f3069522e005d0e5a0968c414610fbad0745804e107fe596432a42939dfae1a0120bd39cdab3bb538dfb20a0c41df30b6fe77637cb57ec430d4893f52a3295bfdf14a8cc3543e692f4a6f8387ee8f43a9564213aa4a711fbcd48bce7940e34885559d6b0b2e401d33346649484e0842313f1b7a46735464162b90012992844b6c597160f117160ed077b60af4a6b7329ccf53dd172932d71e61106f5b3b2a270e787ec1d6caeaaa7aa2dbab2dc6c3c40524e39bf3aad96035acdef52d6990c698160888fcdbd7078873d49e7d73c6e48957e9423d3d8f74fb058af0240613ffe21e71a9aa3c28d0804c41f6e5a526270f120a352c599c57a7608542b9c46f1e34400ac80b0db894ba778553232a3205948f794aa5180452fd5470eaa754d429f8d810400f01c068119824db0197294eabe8f237b48064d074cd5eb102464cede868564a57e8b0fee9b021df2523523432d2eb5bf8e902ab557862f40ee6b4a404c3612547da4a698614a01ef4ada541be83bc0ca5048b9002b82417516373fdc7065c331f43d036e3e992c232d05be78eaa84302cd402b4ccf6e5efaf0db44d2f758169e310516a0be1ae322e1c2756d60d7b96dbad38740f7780d5eb4db1c5ac7364b364fff3182f4eaeffec1260e9fac72f87ecc8628b43eb11004ae3896f455ba22adff8c9903ee1fc7f24d02f5bb416ef855aa676586cdfcf737900a461f71ae25ed913581d948b8a53f95f7442cae95b23605a75ea0424ea35c3da200603e9686d13e631766e0f82341f00df690d4dffe6a5dc5ec7794e2bb84e61acae34f44224f65b8782d7a3644f7d16f2067ddaa1f12cb88e19cb298f88708471162a5da9a9491bf2b92920007aabbde01a9aadc0af39cb189a132bd6f8f17b915833c6e6a7e25f9c1140b28c57a4a6dc36f909af8a8debb8b0dd2ee6d493885cf316c37d21640546e80890d56cce3a4201d31fa1569e8f00a121496159b0d03029dd03a3efaf7121b0befdb39b44e98753c0058844502ce449ff21f17a13a07c42071560f6214eec3bae9c4a9eb4f73be15ad9ba880d8fc1fd46185fc8fd0a14d08d14215f614cb8ceeba84fd355bd73e43144568281c42d6723c4b08a038bd2c5dbe9a905a4a6b48987a5ad9a33ee2b18b04af0fcfd8739433af12a7cd199ac40e81fe7b093ab0eceea452214b7c917588803f6229fe7c0e58342fa4f5f4199419c7295737342ac7487e6a7cfbc34391dcdd524e33990d13ec71b4a655499a512793a5c3a0425531d2ad9812e38dac75ccc33bc0da72514925606c82c4ea335c75ea6e434df9e30fb1a385420612b8ce205c959d877e315c0ad919da563f4f1a042bd9b586f04af813e6207a89241aac53ef3d9c599b740102e49a93fe219af08a01efc3e02a7f1c470af02254d896fb1ebdb7eb0101c263c28e4019add530b060497a84521d3dc5c920aef3d3a57bd35a8b72f41000a4b15a78f477a629166111caa9c89ec66a6a08c252cf44ac39332e45b287da0200206e0a3444496214ee144621478fabaae95fc48fab7c43843e00b1ec78758e6c8d7312be726b989e1dfcd66ed74dbb91db736fb2faa6d47591bee9263da56fae1b04e88e8af7df55d47292ff1b7d7f7b90acd7e4a75f72fdcf6788e2d51bcc7d04f58c7ca68788fa090ccd6385ae288b3cd8754e31067c1d14b4cf4fa9a05eab0439582b8752c958c5da0fe12d767f29ee22735cc0eb66b280da2b573189109e493b9e8c42d25b59c60c250814af90fbb6a16d28d3dfff2341ba3e0c1cf01d58b352c166e73c64de192e2323b9242f4a5ca406daf6f954bd9f84eaf8295fdf36cc9f80e3677f224635d94f14293d056ee8f4e777a9cbe04e94d1e9108bdde7453de917859d23be12c4014e1a5e2a21299baa6a670a5ccf0c3f082d93f4d558735f205115cb243082e68e874813839ef23b9d41c7b18c2f49348143fcc9181e6942c40c8b07992b180f03d42218ae405362a13b448989ad464c32bd206a71d1f8abea48434cb8a5d13bd34a06dfc512d0f16f2f437694e5ea381d877e5bc3ffbf9b87c06f03f6094c8a24011dcbb0a7e55e25f236b4b1d96540b176f945c3711b49b3abe1d80af6189dfdde9c7112e39a7a0e8887416bd35f2da1e62dce0828485acc54c4065950e8f98c9a264cd434f4791613033bcda7c761d3667619b5ab17a50dc38ab07e7dbc879ac3541a73f347780e8008b035513bf201eefc04998dd889fd307ab841102520094faf42f0c89b8d054c665e2932a1f016f2dc7e0893e2708cd1cd41f41ae052b9d6f5d85628ba79d0cfe074ee0f3292fce907bc2708f8304f302df1e9a1f6083facda2fa2106de0df32d2115f8e0a95d8cac02c9d54ee23859130766cfc32212f3084565ab4bbcd70a9027589438938aabdb70b762cd9a50da7173f98cfd8cee796c6c63b7a6de29a6ea651a4032328a3c30a9347b032413c213b54f1e0316b6b0f3d109bd2d7c1e881e261b4a980eb94b3a8b7a64706b7f2bbb378c8645237dc581bdc7dd8479ce2e5c6c4e593e6ca1300dca899d92f4d3f9e5dea16ddc9a43d06b8e401197f642a254b907628363de96718cd72428e79f18cd20c310c1acc48e7ac7f92a8851ba449073266d82e7607b38f9c94cf5c04e7ad47da416233eefadf0f22a9f4a523efe0e253b4f099135d8207dc56e5be77d8a454393899e5ea67dd541f2417cbd1f4a407261e6e779dfaf9b7f6a75ebd0cd7f232a9b704e469d69ec857b269dcf116e686f98094c06e923010b100f11bffc088146b0020b59faa09bf011b719f0e2767ba2e0823de69163f39184fe12c247b9e75750e3e18079e599edda9525445b5e694b4cfaff4fafd2882d1ae15d42dd96edaca0f65997d88f6516ad3198d8e9a1311688c180a0e1f3476402c7791c005b97ea7ad45182f616a59291a911ecf15377203aedb51ce9a65c0c0e2d0d8b92b2f0f84e4af4e2d02a69646f97f4e438cd165a98abaee59b5b45275a9cfc7dbf4398411c576b20732ca5f8f891dbbe35b05ea2d6a9b22e1cee1f86831bfe708cd529a4744fd818378b4e34c11c1c499cfab98b1f774048df8d3e012c773f85fb11b10253d6e01ad9f77e7012df11ca0f4389b0a396d8ba7220232e73955146218f13550edc6c0f67dc1d15553e7124dd7590f45a3c848282debd3044cebac62938404582f82e6ec52e810f46d2f0fa2e64f1ec6b2840890689ecdecc17e0ef59692bb017003dd659b1955861bcb4ef91d8e7598b4151e7b3219166bf0b745367dc50508a612baea823aa11411d35dba232c8861871571ecdea76bd1a99a22dd55aa40e67a3c5e4afa8abb4014bdac8d59669286e3b9c84b715debebb8b41c04c0971bb85a879483e27ed70c0b033a66c6a821e91721316b7c93099930d0128b993ab0eab3bfb198be12e345977e07a9651d600191d2aaadb2832388d733fee8740b347d5187369f0544c3680a506d7e96a236b67459cd822447f5175ed12172445bf42e7f84287a4b0fc353c01106c47f6fd7f92d1a7ace3aea4f68ba415eb553a62622f5ab94db9e29d6fc9736394e1143045cca390717dd9f78f53a6dc8b82cdf09b545f53d5a487df864e93d2beee8f6c10ae9227d4c7646db9948ae91c97fd159dd6c48fc22d4be867ec63967e39b3b95a11fe328a1ed501eebc546d62c9eb254563de447ac42f2f5ca44f5bb22b45358d9efaeeda069a926d6faa101dc480ea9cc8e1999f5fd60f59f572c1cd56472ff2ade9e6532d082d5d05f728f1056289409a5fc6d0a5b4bb0e686295f61e9b1579dd7f17b9e8c6888b77759bd87f5b83e51af08b65ae8ef62404949f3f20692aee1665a7ef497921f95a2db94385bf030d0a4e951477572df630911431cdbaa7266e43c4e44d25a0cf42f157820743a4e36414ac99aa110f5bbbc6c3b0adb2e156e59eb6911a8229f93ec968e82f1d566d1896428c7f2733b0af024605fb67d7b053c6470755200e746a79aabb306d501d9e76dc7b6150b7ab5c85d8006a44c840d4024961cca53f45069297883a8c751cab408e9df38a3caa7259a21ff845211943fe426222864d54f018af399c23802b1fad81d54bfc73084fa1c03178cc3ce25d21ff8cccb79060de4d72225c2c9d56f0d08a538f0e4c93ae9a89c590255b16aec5858be50da8ec6639fc57cdae7f68bef399a2c318e5f74faec0166250d124687c9fd644e790e406ef09380160de0edb152b9c931488b021c7ec43aceeb781045a52933d2517dd298b864336426c9d85bce3a028da054ce57f3da72a2fec5e36297b38e890da6a0cf4f20f66cd4d7e2e61d8e81060c9f9433284c16d4417294eaebab05fcc4b90ac78b35998a3f0007d9200e374ab1eee1505bb60c2e666b765a4f48e536988a8006a78416f640fa8a9ba208d1403180b1e4127b7064c7bd91b3f975c0bd4d90ef7b7231a81d0204aa112e2a4bdce3b0abb35ae44fdf16954e8ea852c6898e217cefbf54988ef207f099d213c5d973a0540f6f92d2f2e73db2ef092ff76b69bdb02a6132b0b9b52915bf762746a1307f0a1ec75e089b60b0e8e21aba2ecf7fdd251c25ba288ca3194c9dbe8456dd7d86cda2f2387c8d1927f69fcfc799ffeb209b7766c903717d63e86ec4d0c9940331075227f4c618e72d75e82af9e3cb62e6307a9e9d88ec34a595bafe5a1485376ce39b388f45f3264a3332f51c7b51013d08f36df4da8153ed5a224e0d218e58a933c219769be94301fc3215b614831802a4903f5a226a99ae6480a9f4827db4549164894fcc9234a69096759510075d2abb1132e3f02100d29bab714b02ea56d2ec4e48ecb69699e9beab21f0cc687ad1c09fec999ab6977c80ba79e2816d06ff0401c3f9e8f5bfc76002e014f343f13b550ff34316e2626ad8c307e502c2c00e8783dad58343c0ab34e6753b3f03dfd1578880810035b26d3de419a95184989a32f6dd1334212be26cda759aecd41f0bf1f4643fc98b6cdb1ee467abc1bc3e0821decd938d0808bc1665d0a8147204b1a01f569974db016f8b028b8c5fbf57aae071aee782bc939a741e62e27de39b1828014918305e00889f52be6e2c11da8990054b071eac0ce6f9e031e81e857ee7e91df4544a43a9e092615edcdb14bb18de1fddca1d25ad3c13b864977ec0ea38c8dccaaecd766abfd906a84564e5929ff5320a03da3a0fe25922b2a08cbfa2c202794fb0248e8643545f33db3b51ba510f212888250bc6746a6689bf4f8f03abe271e0486af6dcf52a732e463a50034815f99ec8c20ee92a492c2ef2c1d9aac4b537e3778cf8eb81ed54a8a0fc1417c29193bcfe84e81fc9281739c1ef89812cd50a99f9aba0b66eb50838aae42c6de1029005c6f86deca5fb5628bc28ba621bb321ca6225fe56601d89415a07684fda408980fd8452b4d0a01e0d3402607f0938c4316459a6aa3461b8d00bd6f1d49f09e8e3aa0ad063ad768215514163e8c540a0659340612c0c3bba8ab1dd4444fc07fe87b313fe3c7322f1f8f225038bcc8f6de6abd483e38b3ace1856b3f218558246ce71851507ddb7495de860c43a5e2e0598a66cfa71c5cfd5d379892a837a3deaa0f8fe4431d38fb36888a430fd5719404810494fa8a4629aff269f67ac15c66e3f67e5570d1d79495ea4355bf616ac7c57f3cf71cf55fb957f540af058ab1a9b4662c7c6e401bd22eb72a716b7cec448ec8f34151d7e8f538e8c7085f43b0361030bbebbbaabbe9958b9fa7463d4cfaeab9cce0a24c286bd5d3ce795ba1587c7ff830c3b7ed5d840bfd9f7e3ba6bce3fd078cd3fe03aab832323217eabf74ffd0e0225c80a8d5229876bac39f56069a08e6a9c3deed5b3ccdc79fc841a75eb89634b5c41bf9e85ca6a71ad668ebbf7ef55403a4735425530550e14d44623638144513d9e2cc33bee603a5b6a8d3f4a0a812e88d7b907de7e9b21e33c28a094f0d9209acfb4ca6c9406393dd6c138d4704ef22c657c36ce5ec53223a32a526299e05800016c9e703cecd95510d1965a8aab1140d221e9c1aba2ac91d67cf6ff14b4bc73a622cf2638d89d6521de2e8ab8c252d70b4612d03969e5e0acd7d3a94cb4c1c93a2e5fc5c4067dc486297c6955f1d771288a04ad891548942042a82eec70a18411efcc5d72efdbc700e16dba7d9e129fbdef20f4014925aec77ee92bd1edc878760f28d528de80f3e969628ccc2acc9578c55180746e3d1bfc6c7b2b03d5eca52d59789cc233f9b86b836bbe7daa639fbdb142ec499a924a743db2963cfd2c78510a4d05c602bc266f28e203ffb712278ba7b1089c582c54e516801502dcd5a166f712201d9de1678a17e952d9275323825bc1888b2ae2fa294c020f3c113230725fd6355ca6352637f9cc61a4698c734101d95ea9ed11c2a6bbc75abd9875d009a25a216cb712ea44b3073ddea0dbc91272517aebc4b8dd69e0c2c20ef8ba7660968588825bdbab6cd9152e3048c6b559361424d48d6b6761410229b054db1f6e8695864dc87e901cf81e4e9983889f8dbc911d4760c415c4ee63e819dc02da266826aa50e2edc5413182c61d0c9d3badd78adbdc2c5a6c6b14f585268e1c361f19079f401b22311904b6f806dad88236a038b3604325d6cc382aea8ee4bcb61372874a5ab88f60fe74ef5841a11ab773125fbfba8023a73eb1b5e32ab31161f82844723d05bd53033e818fcb51652d1dbd33840e82a4965b481dd475f6fc5197cc1e28f9962db088691d68182483fb2f61a53e123145935e470cca2a5b976b27dcced20838050fc17710c862e6d8957eab76cf2d2ba0c4be2bfc79c71e8d66db7deee42aeaf22ea0bfc738188e2513bdca1545ff332d40a97a52a3cb009f257f7a661f6c6ddc6520a1c6c05f146d7f3ca319a9c3ff527ecc5a565d8260cad6a3888b1fa135dfd43c4698a97095b4d6d5f4c1acb3a6841dbe8d12bda29b8c5f6d5a4e694ae2725c4b673e90ee749de001f28c67a8904cf21a4f9590615a1e5166cd1e00bb27844c9497fdc54840316ac22dd1cd07bee32ea688fda148a550b373592e7d4828dcda89af6cdfbc7d71ae36cc1aec3c067d66e3a2d4fab34163012873737628e52cca49bbb417c9e7a807988cf96bc1c9b7020033f9737c0dc32f086e1a91efb90fe213e847d6de624b443c097410007dd7c61fbc82779868a02f54bf914830825be2814d5ddac1abf4eacbc516787d33ba2d629a93537fe9149700a24f6f43e6bbbb0974141dc1759430923db0771839c968bf44dfdd66fc9447cce1e87c6c34a764c3baa677324ca8ee906a2cd8e8fc567d0282376092712a8969e3008e33e8dd2a775db8b6e07e858b352a7989014afc573766a932e130c3068f99cc28f20b514af9678654a6e278a5b4ad35254363db013c2e14601a51e834ca5839655ca640b4123ea584148c709d6136869926bc0efaf0be8de3d9e7c5dd72bfe84a6f9601aea79c4f39e9ce83966d6965a0ce6f9ccf5acad0782bf90d4c6ca6290ad3efe3e3be008cfa5317362a029dd24d33f247d2a91a32037d84fbdc08ec451598345b24e6b811f8004841d561ed3c5b3215143068f8c166ebe652a752198ecc2b68d544d59f38c31fdfeb0c4858facc3bafbb05c85ff44b3c8078ef71d5ed069d6c0a1ac30435012f98bb2bb89572fca698d6cf54b4d9d97c830b35e4af5baebbff9cdcbb931a0adfd1d1d998b4631754520aa633f8c8e072ac7520dab9d43f6d3d059f5180fcfab40ee8a7da867533589babc90c29eb1d120c5bd165cf78d9c4d58f92e783f46d35fd10fd2380697a8c283d5acf7b0fbafe0b259f8eb88fa8411f04e2905c62bf71fd983fdc58e8d483619b05fa19119a2625b112f64169b3d84e9d1093e83b3ba48aa1f37f79e68590858689000cd8233abd3035bba2f6bc38f43254c22bae1a460e01712821c0bbf4dcfb7456aeb8bf56dbda3b1b8fc8bad7d58838dc927391e0bd6febb89becbb5a496f4ee06e4598bc3bf05995816738527a01aabd6106903ac2ac50d5791e7535f420dd03bbc22798da73da44fbbddc0d0d987864044e1defe0bd383035c4934570fb2639277d8e20d8bd89fedc22812ddef569975d5fa4b57b0e19ea69a450b33653e1811424252ae7e760c022e1613737be86584b5805cd986cfbcf76516f493192d8a027ca54beae3ee33584f28a8141d480e2df8e9b0f5f888fc4b4206a228ea6d99b34f0bf5cfeb427070ca851cf7082523c06c5af067ad5dc6c22e0077a1f42899a875e08eb8d143abe06c915e60bd140c43359c60c55ce15cdd1af473caf06f73cd9da2a7af391926aac9852d2493b8442e060bef0c825e3557340e57a61e82b93bef194dafb70d59bdfcb809ae5ac1da224ba509d44d8e429f0fe6185da3a2bb754d0ec5740d0bf924a66109e19d1500885fdef7d98c639339b51f220626bc3a03cd781820135253c9a87be989e67907e091cc7820b5924c20bc1eb683c1655883cf06cdaf1d78bc6d85d6002b4900eb4306c5221355794a52d2db0129def5ef907ad7326a97936f0c886fff0e5ae0cc2a7a529b7404efed6fa5e7e3962088602fe05c0b3d06b111e779a07de122f4fdda4cb6434dceb34f2bcd4fa73640f7d892687da989edaa1389745121465418224bf8b27486931c85bd98a3d97a419cc1f6637afcc0b794da9b9964c32c11291161a893830404b6e0ad026d557da041e3849059b1cf41c33d58c7e89473514a37c0b2107a5c058cb4f855ddbb8d624dcd6f30690aec38cae98a4ae5eb652c29c21e1a6eb5d4c096f879b18d5766dd52eb88493f7a0e42b358dd3b55e6b9baca4946d5bb1bd435d14e66ef5a474fd2d5bb925636247a8ab9144bec47543de02ceacfd7e13586d32ef610e59a8a81920b37243aa0ba5f8dc819a9451f1835c540ecd94d592b726e1699ca5003c23ec223825e46bcbf462e2d1d756ea7130222e3392af3a211c800bc858b92f8720cca2d281ca1ea2d3b557514884cd5c3b8b4821988db6f199dff38a3d303cc11f3440a2ce133f41b7046fc923ee36bcd51fa27a427da60025910fa26241c5a8292916ff49c65e8707dce36128ecda3866a5aa6d0cbac0cfd68a8c27191df57b1247bce5e90d74119859dd2de3b2b4c60fc26d69318a60222ca843a9da471913d7721e93dc5260ea9b712d644871e8b58cc751ae1d75dcecca5d9c09384cc421e5ed15f91d8f41848d4aaa09a8e5dcd1b1b86b4e58c350411507aba83959b776c8eb9a01932bc42134c1f9cd9d659969cba75d1410293516e8f8e8280b892c5c8857918bb82a8e7a880c5fc828c436feac3fe78f499ecc3f321e2cb33bef548742d43457585d53a0b396d40fcd56f8c19cb59e4e2299a942b4c6178aefe95da7ec70a8fed5371254a81faf10ac8aa602aa0c8dfc133582ca0971269841ea5844e602b45810eba5b3643cebff444990f40ebab067697355c644b0177cd1bc65810af64ab128e344f253e5d990e7ac2e3708413a64d5a57cbb638253e3f588921ec71587022e589a9cf689b08e9c1f9742787814cfa429aabaa83ce486e12ca9ca4f52b2d5aca2caa7d2c19d2066b1a3a71aa92314d9cbf8ddde3e2ec2efe2d695b9a6b82f4aaa5616054e22c228661121e3523729d0b43599237362c8e012404c99c5144c07c5a50bc9126951f05e8d31f9c8bdca3f508f9659a4fdabbf89237b66fade938ebf1bd6f3335e9169fd3da6010fdc2e307c094c767623c34db9ed235612b360f0a7b7e809e326e055ca7e3e3847240b15f969ced38457ba5a9c2c74009ee7a218aa0330455f6624e892c5baa2856a6d1e30a81770b2339913e193656568566f12ffa59d7a6f159a5268fbf3381804c4d74e538b49826cc0f82acd33d0a9b98e70c1da3c6541ad03424a719986afc1799cfd37f69d09fe44f193fc768d218b585981039d64f6128b021f8ca2565c469796cf9e4897e75283696ec7f7377858441b63afbd738146f10d08d428a9eb54b2c5179c429d0ec350af81eec337b0d1bf939ee1383d3cd0187eb787a1919ad362e95a2dec9065460c8aeb6ace5a1b56cce29f7513cbc946a8d457c6d23c6a975e4370d310236050803da59cd549f12ab82172482b1bf692cf5e2759d792fd777897433b15330973c14b410ba50070ba1bdec030791e74cdf1ab61a7b9f46a0231d401fd65e3000addc787424d057c86b4f16e3bf5046768a003526fdbc78c41e2e24dbe0cd5da851cfef7d813717720d8040982a30a92a446aafd4dff20e38b074e5b4ab3e3413b50361e2507499f4584ea7ff37fd30b949dc091fb628267f9990740d517f91dee10f6c370a75cf9b36912101f8ee159ee64eb61d00448996d89bf9a783b3dd09a6eb96613da2587c049c3bc02fd9162396cec2bb5137273d6b4e69dd47fd390a785004fbcea0b1a83ca5ac3af9a6ac806766b028f26020566ae82e0f03d6ed72c1858eded1700862103e86641b8fa650b67d35cd062a415c6618bce64a6956cdc43b0323df767ac7f67dd71f698b585129ef44a3fbd4ff292dd553ab75f5bc70ac1786020b80296c86a8faf22e9f6e80aab4b08b562f7c410cb8962cc2df1876036f134855c2ec91380f3e68ee0edaf07ff5be35d1d4465c7a406dbd0c4390a176962c6525e98dc2d3617ba3f3b3240960c3fdc44ef0688d903af986cbde626c588fb3d6d98f55d71ca9150c940f260d7d8f4ffd56f19acdeb5d1b69df23ccac284b4a5a752dd8a488a3a0c2db59c48f13147aa3087e3f45be13216e52c27d36f12c8821fef5b8ebb57ccc82995d496b92e0804c7a99146b460a8c13c7614ff86f0304002dc07bf6f50e168246c44e27782cc2062f77d8096fa243261d3786da11d4ce55ecf25e00506d5374f638f3f649db4ec099f8ea8d5cd8550c9bc39d40ee191e4b129f92cd0509b67ccda9ae266f0b416303a4093ebc7892c3ccff2fda4e04e944d1b0ec73212262a4af07ad9daaf9f433a919ea5fb0724a3a0bb935b1bd6f7b1736d1d139a96fee6e4713c7870ae6936bf892922111eb599de3988b92837974d7e4258e0577a9d46b01ff4bfe86ef0c573856fc66b41078f2a120e158813087293c24fde501c31828a68b1d033f421ca9623ff212abb647d7c7655d882193e268b54bcf024861986b5320aa5f31aacf370d97fcab1984a2f99bb943de9f5e2b1e3702dfa31387d552ebd80b1a1c6fcb3a215cf44ef7e6d8a5968ee44d7265c20b23419c1c92027850bc54ac3f0f9671fcc5ada98f9187839e04523c232776dbc9eefc4ddd38e9f83faf28607e498c6117bec01ba3015d01c1ee8a433221d41c24dd72d0f31293b72c5c9d69d8c31d4d37d252ee5d5ad7a7396d5194c7e50fd08bf32c0c415bcf59639de04f2820cb8abcb48dfef9e08629ba0789778689873006bd1e6b6568670cfcd54d1ae97ad363ca2a947cb4f405087208b3c83fe7caa082c9ca9ec74b776054626ee501c0269d81640e179a058a4147ed10fc1e91418aa108394cca7fb2a60e76fe7c2c4521dbc9bbe975109e3c3c7e04239a26d2719ada107c62c7b4bf3321cabe98ebac9f4de3169192c20f0ba0fa7e7dbee8948dbf864eb2aa4739b92989d604147af73966b9b49230c6ed020443167d20554e2d4aac3f6cb5cff24ca6cdc94d7d1a5ca2528adaa681631093346ffeea5f5aba6a51a3b5ab3425b5730aaa60ae43b36bfafcafde88570fe9a2c39f3f5383d01079322036af8d0c86d0368ec1006384a84bf9d23d3e2f9194228e36c9b4cd106eed604f16970a8138024a9df25d217eab18723c12b6ab36d299620b880de433d9ea25f7e749ef3510ba4d19fa279df42f13de22794b19af3fc065a0c3773f0bfa113e35715934f03aaf14169908bf43e49d941cca6c3d1d902406d1d9c6538be84d9f68a5e3438449ba4fb54d80cdfb5cc744254184aa6f354bd69e455b931cdf56e1b1861557cf0f0a5b1c96f6d83e11d9a1c84fecdfd110c10ada5d01ec35a6c3320505321fa470d5e9e91c4422013404a36db1200a724e68cb66907fea1be669288fc3a6f461b575a3ee44168530518809406fdc21c5b454a6005337755f2b41805a01d86c0e8e34075af380420e6349e90cc66a1b4ae49fd3406eebca2d1b986189dfe640b1332bdb7c96cbde7527d66f715cfbec3bcd988a4b3c1c09a42b27c0832d8c95b05710b21684881f32a077c3771edb992c5352fcbfb4bd077a80f34b540b8204e28f72c9eb3a31fa8d4bfb2c415973a9d61900387d9a430326a19716a5452ecff3e793ccb16764b30bec95ee3ab607f67b111a9d2087f21ed4af48a18f5f6845eead23725af21cf0cf086ea0e7a85d5795b8bd6f0f5c96304e529abf35190a0d39322a2662bf5aaa6790121a4a2053bb966a99fa196a7dec8e8376880e567313ba35a1e6b366359605aa7991ad1cc123744523ac6868875fc29d60d274a015c087c34f170bd490d5dfd2d5bb43430ca23b8187475fecdb4e96ad5d3516a8334af679e3d3f71b28b9175350b6883165acec28c1e2aae35ceab6a35a9a559b6a8e7f02a293bc58b3021ca0b05f31362f7e19310e9ddb497c32619e56c17314b1a49db70da549adfbc6fabf6d1dbce49a0a8d530ab84d9f1e8342379662ca1c93f866cc964d84cb720c03feeac536822c2c6e8501800756a5e784468bd413135ff595bf3529d114a28279123a9f44d49f00e3e687a3a290f5673ca2b8542adbe2c08af45d61804bd3b9446e16ab44ad1132214761295218016e165241a1116db4556676893f73428ab8091ade2efe3e6a2d6e15d84e9c5b6a1bf18a9e20ade6d53f0920716005a36378896f9156a2f5f518f1f7ec93cdde191d7437ab6ae25f7a2027098bbad561472ce8ab1955b52cb82271ddf53876060385b4170aec301496bc0f497e41ddde95ae365866300f512f428e21ce3a46af263c4394dc8c8a98e29e701c97418e637e6b4a1a6490b94572a379568c271908a4897284e36f5076b9676f2be0ce740b2164ffc003b2646bd83304373c198198d646a1adc44d0a476b327362bb98b10b9247cd2de851b83f61610e112d6a5aa01fd42514081f07122eeef324f7ae40eab72a74815c4ad346ee5a9ea37a8fa37bfd17fdcda985691909ca30e0d88fd0636d92b800a2e1e6938204520f926f93cc6fb15844e99a2ad8b74a516b7ed11702c8e7d004e76e91240b7d256c28b9b65b5d51397781490d9e83e4533f7cfd7e7a8e37f81eba0fb29515f217927761d2f410e304e0d6187f11bea59fa90dae00a465c62cbe743b38b0118cba434645dc2c9fb00ca391b61d1b761cf091af98785b8db5c470c8d5e4e865faafbb305a1dd3b06156515b7fbd7af8445880a1a724fee6686cf4d6069d122e90a6a8f2155aaa9db5b7edc7262ae60822a9bd589d42fb287fdb4ef6c67cb9d47972ab3427a1309f720248ebe14777f059314e930cfe534d04fb6ba192de994b3162c03e35320fe6a7f24a84a0ccfbaf29d909ed06f768666827ae5c4fcf4c8504d8789c0cb0a6fefed6b2e996b193bc3820cdf65305ea8ce046c505cb14614abfdb0aee2a391e2c7c1a74852a1403d135b265e0f13598233c598133bb7af10e09349712f4c089872023547fd0b7d78888c130c62d094292b5b3cb2502ad800d8f2b3c0b938747bf695d522b7825a6e9be03f02277ac80f6683ceb9e421dc733ce0ddde9310cebe9f255d3e04908ccfcd753f6a535e1884161378e4654c703a06eb9eb93a969460a93bf2f19652214c11aea288d84e7ebfd2d9423b60dfd11d9870f0bcfd7e117b49215bf7351de76b24e4db71fffa402d154deb9ea3592ba76281f5afda8cdc849a2dcaa37cd77e5744823bef36852cc320a41ddd4323b9d02de86f3f6aa16e0dc948b9fa09c185b6549f0d94aa0b7a9143e02afe295c9c9c4cbb55e5e6f510839e3285fcc322d0f3b5f5244155308f9bb89e42f2f11c40f8bebbfa1bc519cf1017e3819c07bc6779c4a2ac4e1a2164b844c85d3ca1fe0b94034cf261122b6ad3ce59e5f0a2432d0c4c9198bc80f9ac03181fd567a614ee349a650bf513dcf69eee43430517c305a37e7f08a8d30b3684ee40b08c689cc082a9a6ef7f17198102711304d179190ce1c11ca6c182aafe8c10451ad8185b47d37007758e766f208aeb20e53809233171f9caac9d22c3701401e30721abcb3ff02eaa586770c2253c3da9b8aa5b589b40787b6a65ec8efc0a27d50825c087bd913a8d079c7ffbac027f5bd59b42a0025c667c92ddfb312f8f06670cf846d96e5fdf5a14e93bec5803f0cc9309b7fc0b3f8915323861e7841aa4c4d511869a0bfcbdbc498453775f8ef4927b7bc8b2647b5b023297380fac7b97f4f05625582961c55f4bac523883701df83e06636b4d18cca3969fe4c3d8641a373d0f70ad2b8d71d7dce8d3c7ad815baa0e88a1e30af57bd66c721e796198cff1684fac610f48a0210c5d4845ac0980f30458d09747ba3b821dd3d1cb78ff823b1c42c6a9dbed4e762a795d5d627d6158a9838f756ba60ebc4d077fb2b2922b015bd34b6a252c087231d02c25261c4beb28565e94a890e4b891412275a481c42495d20601b3a0fa0c43f1e5861d13a581b8a69829d74a4b3cb999725fef9d5ccd67393062fff009995d98b44ff3c1c0e9021258c49a9063960d02f0210b998e07cd50a0ef533acb32f5112c7c50aaae411a40c30439798b47da8c587aa786d186b9a774eeb4c09d0b172ba86b7106799bb8ee397dd3e61910601f09bb3d04adc82979ad9fe2fde4a19aa6da42fa1f849ebf5a78c94c2b876724ab830aa0f8a066d2b4b59c6739a2b608d4cb9d5fc05f38b33a8bcfd9a715f83f517954b3b9008adc79d13227b9027394692d3e30a01fe3f79cf1822c234debc22f76ac4ad72f464103ad89cde5e9d5dabe5ff15ae280d0d57f346a92000e9b96df577c5b6130ac5034011523f22d1eb992eaacc752b7c09d64565324e73b7570d676664291e2fc2747b3942235f27fb5300628e126bcdc62252247fe31f73c751f5431baa8484ed7e30d5246fd0bbaea8b93a18135d512eeac0a73a2f57ab8e852daa1b851b14d0d44ea4a5ca01af759942f268b063482905e49e074c8b48dfdc10a46446c7030620ee7fa3633d3fdd3bb3a0ac9cafdf364bef0bf8a8fea6cf094d4d6f947eb681f8652a05210509d006f82a39c1bb76972ddf55ea0e4e33ebd47085c0005f46f232fcf447046c7bdcd7348df60c22f78cb1b69739669b8a1e5f5c5694de85c6fc6905057c047f310d914fe49c021aa7699249abb8475491b176c429029899c96f5ce319d2f941555079c885eb567172c133e48adccf29c383a1f6c10afc0ae0ffccc0cdd3b864d802bfcd1441c76b2e88bcae2564457a3b1801ea0f5e8cc9266137431dcc3ed72d381459e7ea0d44761b8477550a6f192c48a7ac6d6fba04c7f99f78fd4cfbd13c3d56b591c10cd79f570b0ed0c4a39d57f568f348bea06b307e892f019274814984dc22f9ecd074749432ab4c0ef71f02955f983a3e6b8ab5528c4b2662bbb7104d116e4e97b751feee7003a8cf814b013e3b191a8f5cbcb8d2cac18906417422f2c7d353003a320e86855fd5ddf07ba5f865c4eadd7b3584f0071712e997c67356593b469b07c39426a238016089d978306e2f9b0507f7104c975af42cdd14e627f6817c7f52dd9d5a1751c088fedcc6a2a19b9e1f4162db58ec2143349b2d3f6ccc77a9453fca3304ddb60f703c2a86849cf439cce5aba0391b2f42b8a5d46b98a2af474fb925a3fbceb194a32e518856fd12ecb8a57658fc006205a41d7280930178f1cf77b0f21c2b668104eaaa482db50d36fc38cd003c4290e6112a14ae70a84d4469b25433a4f613bcb4112d5f76d6afdf541e59004d6713443929931f88a392e22bbcbf7d5c7192e9b1cf48b57ed9339c332571cde1c344c5599a802f5a0dd8dd879215045e8e961a2ec684ba0122084b068a2b371e95f1df85946d07ce839389d3dd2bc7d75c64a16b392ca01aa83de31d0330150af94aaeb23dac45d54a435f6633a7583d05650f8a948711268e7e2f7fed367435b7a33e7788ef27f048550335127f3b3f07002ef1b8b498c197c4be8de716606a87ded3844afd9a360eac41fdcae41ef1ed394ffab056ca5fd2314d9bfe384910c457f62a58196896b5520911e9de8f6c031bdc9bf6168bcd7f5179708189bed468dc44f0e77c104d667d95d285b3525de8aba6327314c22b3379acc569a2f7f1a978eb1a3c144c01731c44475f669ad4de6e1852318b7e1608da7ce6aab9665e755a417f3cd09c2523e71576fb6350bdd5fa30a9bcd62033dbda5d4469cacf4433b645bb8dac706b6426aefc16b597ac7a042d4a2293424f1d1fb7510ec1e51bec8534c2a4685db45a280096c7115cba9ff837f89c6e914f6d749f4e6380366874ee96cf5129b5d95f1633f60dd015dd2a220cacb41a44d206e7a346679f1ea6f38dfb278a473da3f3f829949f9b896175d7167618ee411a628fc3c1d3d785bf04410c4286b6c0383dccb58ebd3b947cdab6b235fff9c26ab1d2338333c2ac7d2370db808e19e10edaea9155a19c3980fce6e3971b8f6f2665b11c4f7e8553e0b776e3b70b105b38ba2433afc7c6e02f4a58c437a4fe3f571b09d58d3b0a9b4d2ecce4b0fc59941c42ab098f3e82d1d271193c61cc7e771410d4f1bb303a504dce7d12717f5234a24a0746eaf94dc5a7b8a6c7522cc2273182f5edd71dcdf643c04c1df94626e9c832755b9bf73e5be21966cc949e543ea60855869d0930fbe490e634c867df3f521c590ef16944e6d6ac31c387da1a8dc231e2f606cd69cf9818a2b9792bf08d94bb5e0400894df8fd002ce2eccd8326e79665203ebeadfd9be47f999872ac3e6b13af9ac5f87e50f827863a1f403fc4dd3ad8fbbbb290a3dfafe9e35632788bfdc9feddc010dd6b942e2cb5fe3beb1168fad5f46e7eeff0025e72812bff925d7b9c329e4f8f3270c435e20ca467f2c7b8ff5cad47f7a128f0f0dbbc12bd35aa5134cb1333ecea2d18aad9bb10a39c6dcd2ac6623e2331e429860d898805d23d99520a13de36248963095812512a470148915870ab0b902adc1f3501800a4fc3c8252ec00b34c3dbe462b782ab36bf4c2e2cef8c9d567213f56b4b6d635e09d81385f01689bf18b592f0a02fce4ce8c8e2b0aed320dd0f5b7f16fd930edf1c4bdfe86b96dc8a888b689bc3927c87195416fcbfc53e76efd877f558009f4d171c4c188f8e43ddbc9cf648306f9e044cd272071e025c6002a3023547755fc9b1cb54c236f9a14e2b6fe67d5c545408611878b7f033e626e732bf72089546efdfb11425edad1891ef1d4565f44f00374d7ee8924ca2121f775713359c22bbf9a9df587107aa4174e2867ee494e22a62156bc3447a2719bddfaaeb5f3a5193dd0a314f428157a4449baa041c7c9b01309e89f5d00b111dffb3d83bdaaae07c0adc04eafd9acf8b8a5db4fc1fa9106a5142683508d263229d0dbd9f44e0dc6fe235dff7978f6ab1a81eeb557d444dcb6cb1da927d3edefc5164f773b80ba20bac5ed5153d0287b7c03e60f96efff7fe9b6e9d97ad97b0d247c58ec1d2c6c3faec49dd512bba8b25eb9be4555f558a6644a2e18ecfb54fe12fb42b83dd806c59f013119e1baa1576ed905a0d2b534f57381c116c55ee91fd5276ffa13c92b5472d0c8c4d02e39afb8e9aea8ce42c30901326bd1e65c921597b5d8ccbb7225370d3aee543a3e079ffe383e26d8c0e46a9bade452c2aab340e96dcfc5ed40d44325d60f4eebec7535c302fe49120c923a617dfd010871c2d5b38ca728404037dc535ff179d040c7440923a0cafc1308429b6c1640d0560f6a4e0ed9a97504bc68d41aedd02e6b42cd91cbccb9059638bdc01fd620f6c1256391b2feb389f1cb49be6ce07b983eec34e48f8d11956953d5542f2adff73788bfc6eb38e0ceef291dac2d925b5b92498f4f1544606a8fac0053a498fd5adce8c73371fa99002835717db5f89d3ede1931a8e7857bbc9ebd0c14f54e54c505401bc3bc88807f28298d50c214d5d4f7d80d607557f5e92d4e2a9364c5fb41401bf8a89658bab1c356786bb0cc0be57c9b7d2490c5411ede391286a3d7ff3eb19f1476491e63b1048e6ff7d9c4d14873e49c4d03780c89a5ccd2ea63f740eabf2d9f974e2fcc5f87a7b355cf28a8b0586c4ab1cd3b8bc2f442cb3ffcc4b69d1ed41b9edb89dddc28bd1125efdc309d1127081379fbc83451b96146978992395e8ae30a0c7ebd8abeb8b2ebdcdcf29a2fb033e491c5714cb81a835d976dad6b95f6d44e0192cd19d03276ae7a50db7119dce20f4afca3ef5b9f46426b608c20aacdcc94660f501a1952f7d49557eacc8a0fefc7bb67fb9c524089e046f39c3b14acb715df68f82ba6d60aff68463fc00d24200997cab4cd13e40748c3cae22b8b5718597b926e30cd89bf45efd33069a4ed8e8c99175e201a972f23ff8bc62c47c9224a69a0408e67d059385f3c38082b6633640ba0b1f46da7a2866018e580881b8ed1344b90b56e6d053e436717db5a50a410f9697450e3afb770bee1dbc14ef443a7005f7b88153f9795d44328663ef35a18c5e61ef68be4f635984dd14fe841d66d73c52609a423e672f19578e5133b6c3156daa34d63cda0bb6a7230505c8657f454fd7a60c413b0a871705c30e1f5fb61aae8060757bbbf7e21edee1656ba4b0e6ec9def60fda452050c79b4283bee6653c791d405f7434be6a281fce2f7cdaace8df4e649083269599a8391e5ac982ffe9ae88a4bb9e0029204bbfab4d5a1c42df2ef324267ebc249747b4aa8780500fe3e0cee2984c71c697386911376bb234645e3048258fbf17e65f30d3616f7263ccb6e16b445886397a21d0e40061b3b08a66484f5baba8bc98f6e56c1c87b0a9cdad18969cf0801ff1569d41949a5cf4ee634ecfce7ab148287206ed408b8ab5c64d87ec6e80a2d3db807bd4fccb482fa3dbf20aa526f81019b7e0ca7ee802ae2b39589fa2a452d520f42762ccfd8a3026c123409e3ecde33c29de26013ac103bee006e70570791a293f2ce50590f8efa728b46d6ccfdcbb67a45a10036077e64c3130aa4aa752633b6a535e7f63a5581a242bf4fcc39e88076111afd3aff681ca7c9641b8494f556604f3ebf7ce8da66ce1350713497da557b55001ce4541d64247dc82f3a0b63e389d310f1bc881371a4dd129029c1b88e96282d9ec63d6624125da6c449b05b524a48909fe60d88af4978e150a885fa51b393625eeb7c11c3c763ac4184dc37ec613b20de667ae29d778f21f28e79e1952127010409c92085db9c0e5ed11e11a6fb899851096b2b3e2b4318f68a0cbe62f444fc9a1efa45bd207428ac48fc4d168c72e43293fa5eff7885fb3da04f716032b07f7fd2e4941ef1c7cda8bf6d1e80a6f5f41883c3f8df521ed8c861791c5aec83c20a0998f8426cb1fd3e007ec92a5bae70b4ccfd676344d05bf302069a8dc64fec8ab1a0e6cb8a835fd8da358701f58aa87dc34ad01ff4370b22ab5d65ec89b6a20a2376c9d2ea21e01b7c5fa710468b7d2db8d5b5577191557f52ef475dcc4511cb4dc3ba88fbbaaf69764a1da905490d42a1264a5135f69c02a38314c1301262b788dd15eab368acf28cf50ef30402857e0c09c7d4ee8db10ceb35c4484cbe3e3b970f49d034411f40565634392a9a95ef7f9d03b88a5058a45583525fae004db0e8e338d96ee9e5f4ce8c22663f921278888cc1d13455a3ddfbbbe43a464b8b66852bf533696aab2195b649498a471e147c68ae70bdc49f5dea681e766bfe9208a110f0dc008579ec389f4468f2e4fa203fe8a4e5bb01626c0ed6eeb72bf9962472fda493365d1d685d3b0578f31ad13a19862155e65c571d74d8bcca9528595d67f431ff56ea13954ba58e962d78d126526ef8b597cf03ca6978d64c7d7ec19f6cfded61c3119229a85eaa4a5e1edd313d9d27daa76dff33b443aa2d2d74465398748fc61ac5c943d0e972463308f1fe81cf4d8ebf0246de19d399e8e1a1ed4b2967e68b9955557871fbdbe9d3707d37eff93043418da6871012090acbf2879ff3bab96b214c9d2d617a8ee157fe7f2426d47fdb0a56164fafd379f86dd00dd00d9e196109d7b228a4dc920c83a5e42126288b78d0ccb85e154fa5fc6e9a76fe844469df89ab97f3be1c296d2227a048b72bfffd09a991e8adafbf37ae93623005239bcecc149520ca11ac5c267e3f24e022a3c058946ce570684b5157b6beea8746a0f64d1cc02a56cccc014e42da6a2f7fcfd3b3428853140f2fb25fedd8785935e411201513c5583793601d1f55f590b322070afeb3100d8b01431df3dc88be6230c880c6a1f7cb90b6e2ad947468987f9c448431a8f3fa2fc0d2091bdfca9fb23fe4c24a57f2bedd42aea5824e3e2301fdbc3067307231644b93d647ef57497fbcbf4402717ed4319949586f9c6ed603cee685a01a72775016e2a5c5143d23455f6422dbcb8e8f3a5302dc4b4ccb7394311535e6b700fe798f3280a80f8e0a16c48ca3eca9646c95913ce84a2a26ccff1e76cf5a23985efe1392429234a358867be4c8d74ed2a4cd68dc161311b2e9914ed1e434e9f9829741c567d8440f3f4d4cea8d8f09374843cae5f799430f5ea5683b5038f09e6739d6461318c3c807f7af1447a2426a3483c8ed5da2bf5cf6795064227b93e0b73ab59e3e48e071badefd77886de623954a44eb8ec301babc716ed43fbd7a3fd0d43ec45b5495cfc1dfd42340c28c546a733e921d05258279e1443362285ca99023da0dc3154f7d0a92f666423b3fd98f83d0afe200898a78da22c59110590c6c328a051a07c57f344010a95166af5f9123cd3c0e7737e7899c204675f1a3a5b4ae198bda52deed7c6426069c015a0829eb51f920d7dac03b08f1670cd286001fdf59b887891a5d63d44c5a832714e1b471d507195791b29425cad12d54788f07d453ad1fd1e02324a41a3406f09abe25373f93b4a1213eeba7ce1f6bfaacaaa255a5abd1f0e1f1dbaba156fce9ef91d3e6a460942309625bbf838411e1defbd294128f3c6b54bb734af21a4d82786c9f8b4cc42397aef6cfbc25d09a313d8a13f10ba517ebcc60dd4b41c2dd009a2b05cd4bab740ed6710965747cdff557cba1bea08c1ffd4d3b5d02eecbe0f26c1e54b5e1cc1b2bca38440cd9fde941ea564d45ccaa63f0e549ab661a14e9636961b8392fbe523897454e966adf073532f4e11dc64dd2da2a52be6823d0713cbd42316aa55e15a85db0fb9b916f6e348e43c94827f88a3f376817879901280f2e9ee52c4a959a9c060cfb057604b92e6c28446d9cca99078764d8fafaf618091f012e25739753bc983ea1af4b9e904708c7a825660a2ef69358f6a92c0a3f056fac352dfd3dcd005a29a7fd27d51f3873e12c18b11d86939b30412d57aafdd649dd3a3cffe7334262a8ff449cc7292cc4b09c1e4e80921a18a165b3cae68a2db28ed05417dad55f8a1f4dacddb6aa6b315e9e7905b87ab3cb570bedd133606049781676f59d325f074a3c12ea6ea8d40ce0f636ebeb19b357a35e88c17e74a399c0a21e80cae0579703b7de89b4ce8d17e953cce44913a3cefcb2e5a07652823a429a3bc10bfbcb22b3888f204ab5ba724b4c9c4baeeeb511902f4bca0fdbe870cb91f873bf1d05916ee4012c27406f33411e3832750459edfe678925ed3045cd64d92dc7d6b9936432de1d64b704cfc3821de2d98a34a9795de42fa865d6e3c8a92c20f3de2ada272a4b458f9a547adfb1a3c7e0ce20a8b67de71c4a8fbe5c02f7181e456a077347233b8f558495d22f1e765f10113d6e85b5856fbe2baf491ae977a45a9c755759ca106bd846c0476d9762a740320cea13651e6b1a40b9fdc6018aebf25e3c4f4194a299a90223dd7a5a2639ac827babae31de655409c09d683c894613d80c5c1b5476869f2d8c1eba83d5dc4a9f50ff330c0abae1fc442036813b09a82e98d6d0db56c342747ee8d623c0d4241ebbae2d1a208cb45998d14f58886717337dbccc82f2d4a590a269793dcef26b62dd745489827047b1c438aacd2b593ccab361b9fdb994a34bcec79a6a1651b8a5272f4612847d607ff3528fc70b11d8698f3c264d602b55fb1927fb33a9cf12a2dd77b665db1d8f5a4dbbec8c5e3d303d4f5454924850cae3146c3d8a0f76bb0d5bfbad4cb3042dc242b1edb39539761d5958cd3cc1965fb02898188d74cc36c3558f22d7182bd6bcc27b4a17e44a8ee2735b5aec94b152ab76fe1f11546ea1693872e98b97dc4a29f6b1d2c4b8472facb3afd2b5a0c9fa527a471de3d91d6bbad4b30e454720d48babd517c87b2f4abc5668e6610d5f4529cce66f9e0e8a6171a4de8e849d08926c5bcf8a8d714793251b0d999053c88226b1ab9fb271c818810fb13ae0196a7781ad5dc223171e984808a4d56ad4740bd37129a64c554a73d8cb4e1ae224cc90ad7fcbde19cbaab08a42ea1daf7bc1842f621ef3487d2f4076ba5e67eadd5b73b7be32e4047cee2d7773d439ff20fd870ab7a236c62b94bef7cb1143e496baab0f89b04135b49f1041e62045e22c21d62dee374ff155acb96b990bcc59eb5480c6e058aed2867a944b5c599109b51c64295f8682609ae473531e301252724732c6528353093de8916e0976a2cac364ec6bd7661ba1eb49903c4208c62c05c95d2f409df433bb2817915999c6ffb3d7b0d2fe8c63e7ad6ee7cca21ad85869d87a8424fca35e3229755adcba7a23b1910e92b5e5bfaecc41b41ec1b43c9d4316695b08b07e11db8c20fe4154fffc83b84e93629e43d4ccf77244f2fbeb2ad2a35883d88e16d987924d13164fcc0b1d52613c9049433525feb25a2d18ab4604bcbe3dcf3b5412de65077e951653804199fef4bf897de10140205ea84c1ef05e26b1cc10885e8a46dc8212c139dc1baef8ac628022a49ec46013a6918295f4a039f123e70c29cd036f15386921449789623944972b1ed1e5a80b6838e0e8bbef08907cf349c456259769db6f5ead9c60bbe0d210b31ce0b8ac90b544174124c4aa83cbf812052921a07cfe69eec39a3603c05c76c47b42b75419e51eb0c780c96ab1176ab8f0ce173fce4f351a7d90234140ba8cf97524358c8db47c08d72e29e40eb3b5bda39d51a05406bc166b7ee0b94ea2c32d59e364d307b7c7d6d6c3b958a4c6b0ac943213f0fca8c6f3c7c87d15c03fdb5d64fe667c9d0754162f195a0bc0834bb06e3f7bf6d6c7a0ed2caff14e2c76ede2d8a03764f5ef2f19c09335790ab1b630d90b00e78c257512a70a4e47c81b6179059d7a6458fbb94a127c302d57f6e06f9b3cb73de4ab2fa00275b65e7701d5d3ac9b804caec6074090fb6f10c039c3f5c90f92d798b84bc7ae2092a4749360cfa3665fa25ee015bd8b60f55987468393d53d452ada2f6075849ed1c46fc848504d0fb6e4eeeb8a5269561783071423c53fe9084704f204f2b3dd5aa189dc459bac4f265be4912177ca6b9e3b88200b4faba878a94b19010bf42ee5f342adcf9e6ddccbdb0a210ec5267f92973a724ddd3948f7f73eb26ac531da955317bd5d15d49cf6db7d7f52a4ba3dfe23710406190c841979fd6f53b344f50f6e648c281765ab6edbee9058388430fe25148bfac885dc5f9bfa6f639a007a5ed343636cd3693181b4750a3a87a954afc326d7b39da9c06a63ec40de64998dd25031585cd8a36e6b31ce5d2b84c8901498bdb6a54104ddd41d3eb1f7aa98316cdff2dfbd6593cf943089103328a7b1e41773aae6b0e12b02f13604545fc0485e0eab23ab62670f519c4870564e7dde70cb51603272e7418acb8880e6f1b613fd98ca043251ac36566b87d14cd2185180dbfd7674eca0a907bcda5c58fbddfc5d7ffb801533592baa00568497b3d79335f968e6d70895193a623dfec5f870d6b02c84b0d18d411e52647b5192bcef7d8151eaae67c90a8b66e1205a5d09ff4f0e50f2552d6f4058221f21ac7668e3cc69bb0242189e6c2e874f9fb06f14209203c89b920631332d26091f6813530032b04d68986cdf9bb68c5f820bc6167924caaa51d10369a45377c8e400e88e9153388a05b5007e33fbd1cda5b53b9247c368d89d31d32c03ae9f1b9ba1b8755ca69b588a582ac045d992c82e9faff828b58495dcd7b7bfd4b42070a7e29cc908d12c326f3ab6e6d0ee97aa61c4a1677fc271547a57f6a41a5f76eab1db4790779f8b2c4e90489362e5b8ad209db0f8535864054962d1e18f1e86a6ccd03a5e0987a5d40e403a577f8bf0680ce5a57ca8b87c888ae81ccf8fc31f01f7a188071fac997e7fdd059d373166708aca3289908e888694c5d83dbaa9114d3cb1cdd6c148e35ee73ed5966be0272c930a512df2037e24b551d16d6879d705b4a3d0b41c6a89c576beeadf950877f88a897b019b312a198be67340710fce9175e4e50bacfb7036e8c5771c4a65f975539ea4a99a5430ce2aa12f997cbdff1f2d8bacf7305b6d52abb49d23b0a5e29f6d59bdafedcc3a9e81ec8314bdff4f4405491e4f15b09b56de038d91fd5768ca94ab62ede74c218c86c8497fa770dadd5c1cf0c0ebaf9ceee8457acd62423224b59df0a92337cbc1cc5e5ece7c1ef25f002f52f8d9d3b51478c29b60c56723f87de6240f2bdd6ee1e3238f8aa66ecc04ab22ce82e9cb93160d70e53b1be83bd50ca73a5fd3b9fcd2475e46506ba6a71f50e0504e0f29a3367a6323ac245955ad2f78075d2ab6ac3e9c014d08f79a9901a3fede49cf9ba409b7fadfbf4e85c68a648bf260af50d925cd685211087f77609c7c06226772139cabed55a2fbffc03afa65bce7091d4d6474f6b2050da297b4e2b3d1741549fad27345cb8991c86d48a3e0bab76922d439f387309dfcf74f594c6ddd993a89fa5cbbf11bc02c6b68a757c6986411894d34ac81c40c9b10094a12ad929d3f0e5f9f0b625243329058d923e69d34e3cbf2010dab330e8ee3421450a99b0e40e465d31e58626a865eadc27b4fd58762cbd5056f9cb608f0e9b414983b7a82cd613eca4ebf73d73183ad61182b7dc58b5bf6d9ec6d428b6d4f4986ad3a815c69817e3b758d6a721364aec5806b3acde0ce06ed43198f8dc17c9a2bcbff5d0a12ec237a1359f7eda13f138e51c49536470e93b805c41f501733b1d3b849c1bb77c3c28c26dbfac39fa92423393444610f236b7238cc1aae41665e04daead58269f2882eddcc814d6e85ac8c62d19ffd0852513076fc29bfc1f206049466221db7ef6579bc6a4f49290c8924b245df648415421be6884b3821a9254af1f9edcc5486a542e70e5ebf1319c778266a6afd70a340d8e2b56b51c1ab6ea0ac11d39415eb2575f8561092d68364a022ba2dec8175e48f90e739f0fbf4edbbbe67cc3ed3d595f5a08d1d6114f12bf4e3e4b69f4357f0ed006aa73772101953e0313352b697e887ee9313e4ee08d52feef5437b8b68d67a7f83af2ed26a031779b672e036b78f2e472bb1a69546fed848d09b6ca6346cd7e0cdecee1daef77aa32ad2445b639b8a759a9174092707e8f635847f9d53a976ae178b80a563067c0ac2db76adfe73ffd76ec49f0e8d00a68c39ac005802656d5e4143e887b32f7269f932bfe4c38145acfed9e42c1c2bef73a4c9d76a4ba094f99e7d8b8856b1cb352ee8759139966e782af17aca09f08a6e88ab788590899caa5b4c60207aa963248509c66f5e703586a31a628469d506697a3e2f139f5d758eff316b9d0f6e023dac6b990f78e9ec494a2d0b1a1ae2ed334a4b5a7061a69b0417e0406a7fac8476b1336e793807b1faae5f4be5d372fb4c79084ce2855f6179cfdaf0a186d5dfb3de68a4f15e422adfbb34bf9ed291040855d2426db8d9c48abdc406a5082d399efd3beecb30c9a3eb21b950914bd157c78106cfc2a0317e3304e93408b9b1d18e0c38d5d98102ff3fa20fa2b95a1a44f2ac3ce3586d987df53ab8c1235518ae42a1cd8d988d501b4ca08f94eefdcd3e3926113f2e17fafebf65199b997542668de23fb5019fcd42be1e188543fcc9c89ffffd64e492b1a65a740efaf511af638c91c40975119ce967835c8f9bc4950de34f3042fb03d43fe4c496ff48c5bd44d83b06955ecfc6a6822540527dc23f3db4024f26c89a05bc3d0c95f2c3474400273d22b1c823140bb5e69447f37bab0b2424c95448940c6e45f29af4ea5036ad1e1e222f7444ed40c062622912aebb2aeb5403a17b048027c1e52881f9fa3f1e144136d9f9b1b9875c8f87fc0b935f81d5370e758a3a2541c8bc9a0d14d83e9d69172b50ff2654836ea42d37113432a036233329448a12ef3670762488f49c554b185c6f2e5ffbf2b5213b9c4d00fc3f05556a4a4f791d5ada28b147ea7ac851fec5eeac1c003486abe628ca0468a7b24674a8d9368f81994c7cd201256a43c859156179266d21a125f46d67a85ea6d08bd5115d1ac4ad5259d276a0dede9d799f41f90d38489ee3b9803250fb597efadcf954e081f2117a3739e29ec2d02811e4d60b85a159bd55b4361c079ba9635e7984bf5cceb45519a15ce0fbb0b2366068366b18e3f9ee9e1e4425063692fc49272e19b1bc2d7cb316004e99b13178e8cfc07c94a15afe2a9dcbc9969277a9d05a031c49b9960eb17d616b718a82f1481479641921db5aad64ac6898fba8fb5b9c356f55d803865b96a3b5ae1d6aa45e2d46ed05e4d40e4bfbdf16a0fb1430174499d836ab81ae2b3799030877701cb224268daabbb16b65416b107d41630a79b2848c64c5b094f9bd4bf9d0a494d614d0802a139b85a2e066d4a954d9ad8b995e367a0ea4eca330d3a853ad72b4a3dae8fa3e44dadd7ecc68497acc35987f1cf86a663a4f51d0171ce4b09863345c0163eb4da030870b29281d49ee20d08512c75f0783f07d04120781f5e8ea9784effc8f4baa2985b2d4335791cea455638215f5af73b30dadc41f46d13e6568c454a9180185bb80743f7e6844e7e316aef78d81f58058c5fb203278a57b99727d7e8306ff48be44a6c65b9fea302a82dace5a3ad7f9061f624dd8d5b37d467bfcd52c9f23627e0105476e893d7bc6e0426f0b27feeaff64eeac769ba488cb2118504e81e24a897e03596d9299b2f98ae63b9386b076664a1ba9eac7b86eac87bde89496d4354994dc4603fc5cf2f47e81e0a801ee75bcc01b7dfc72cac9d7eeb517e13bf4cb7c7ae299de73e598317aee3baab4bae17299f669cffb5f48c6d167e4f81591674389b9a5c16f99f9c9b138ad07f319a9dcd4c2dafa64c925d517f6dc440e8cb4c95316b5fc33e275b4e12583309d5202190aefc9c7f85f8b211d393597ec28e6fea7c397c6e875cab805e87040fc37dce808e11e8ec8801c2cd646365a88a6a14c331dd77e123022f610c84cba822b4c1df2c2b770a7cef11ae1b32398af0f5894f43aa06b826c60332de0fd76272d99561c483aa70402703a342da011f72ff5097bdf1e1c1c4cd114c9fc7b26ef47698f04cc7af46005deff28b50790801108c26843b7fa46c6a16d82aaeedfbafa3899cc0068a7f66d9d87b4870beafbfd7258fd2eeb947822fb43d4638033485b3931cbaf946e49cd38c50de55a75b297ec02b2f6be15d1acda9ef7b4d306ec652631f9eaa95088007237fbf38d64169476f96032229516e6154b3ed263a8cd90a94b51f741f64f259f4b6e60986491c28a0ad3de25c40cfe8ead1c0a8aa7b25ae47b5afc08e25a20e0090efb66d6fb107fd42dd03eca218b2b3220d6830b66efcdbdbd186a48f7c775534957840e0875a12b628c20b637e525acf993ac4f0e437522281a26afe154766108dd219533309843048190fdddf56861bbb6f0335049279b798861754811c9227a9942348b1c80fd4fa844e5e12b8e7f49042ca0ce75c87b123cfeaeb69ad53b834f4bc283986ba7f02c815b2a482caeaba7b2e23c8cba3505b9750e7ca17c80aa11929e99fdcd7e8daa9b3d3b1ad96dccebc26c4ecac3c3e04e12321f5586635169d6b1921f540d1b2e4676a47a244e0909f31a2f5dddf6f511739b66b12edd921f121b348513d7a31b238d248aadff4ccc66750582a032b598ab80ffd0d77d7c4e1e4b571ec933a8add4b8a9f46d5600a646b52586346afc32bfe36b4f7d8903ff2696cbd2edc613318eb5fb0ca9d70743c32d98e138e143bf76f4d3fe38f8cf681d01fb6de98faa8d725c87d10faf3aa3f9bb02d88e57a6f84db058c540f051d44831e09d84cd106b2d62524dc0a8c0b04c0cb0e1c6674a4d7093da44a91903d069e479fba53826f375a479cdb261eed5d61601848184aba58a49fe887bde2362b99b719076c8b38f4697a4664c4ebe349f60adeaf249dbef9084db3e97e358baca2ad119aadafa644dd7249b54d68457c6e728d9f5f8b3654f2ecacb2f201ebb7466efe86e47788110a78ae7622337b96e8163da55f0c784d8739ac7bf8aed1eae838107c9c2672272006799fb636e90ad46e89e61c8022a4c896e0593a55e8c99ad9381f7b3d6cef60ceb473f6e4454438cd3baa05dcb501a906bee234b97a3f7e7edab767975ae1cc83ffaeafa44b4a3c5e5a6a500ce27d5ddf0b453b6fad1cac219a8e5a841a810c76e5ead4b4d13e278fdf663d4be67ef595aa11c2037a6d4bc14a80362e358d36e7d12c32f17a7b14c9697b9d80e9b8b75868c3ee3a1cf5238273092e16dbb91e7368336fe824d4d95e32d1de3f4efde7b0a86301e850f64922db2c6aa052d02d13146f00aa9c40f91a08d4f82bd5adf795e2d6fb9572ebed4a71eb75a5b8b177de9a34fb2680de02502dd81270aa294ce701012b7f9b3d035a86d63049593b30f609732927e6581163095e7d2602fcf2e709a87caf28a4f41ab27917d961abbf4791f1689826a4d2fb88fb03b4400fcf1d871cc5bfb6053a40a90e12bf937d34a88f332e0330da9de9d9c75989f546f2de4461be8556af929863299e33dfff349dff04ad0aaa83e4364670d70eef349903910b39cd4550308970e77dcfc7493bf57b36fd139ba359b967f61df5be2e629f6402bdc4540cc7a33c7284689059518a933dc42e4a673aee077378af38e1c516ab226aa04ef94b4627cdbe54daf533636b001b1ca68402d09397bc96e47acea9d2b81a08a6dcd892bb0bb04011e050db5e41ab804044cca0405a2725ba7ef102e1692ca6075bcefde658f4ca2e1e0e914181a977231b85c89eb0569b7808920a7b5d13ccfc9c884fedf54d95a1096c3a1e43724fbb9199825a965ce812298d89d8b8d8f458335790f3cd83acc211fdfe9fb631a04ace889d7403075bed4d246528ef70294ce74d4fed870a7e322072d60f71efc8e2a44f5289ac89a3fdbf451c88be0d12440849751e01be879b44ea0620ae61ebd2d8489c9e506f6c78c75d135723f13f3fec4c704395101a81d5c6183b9f296d5682c3099859703db103388bd880f8c3ce70fe2450156b593adf3bac11aec40fb6f47e76e18c98a295081bb4e8a745092f4579fd74b4d2638ee8da00a62142530fc1ead4c3fb2fa130dd3b1154915592fb3936273afac0aa9093fa2db683002ed91073a044d381b3b0fc0ab8ea86d1318fc259d5503c301c841b5f2e7a5da0a897aa1a586af94f3c0cb355aa79434564029248f3864617d0faaf3239a7411614c11bee27ef3cc4df5bd8314623e62278766b5164a3d9431e40e34333fba551431a7e2c82d1c7c646328bf95d7a749d4d66b74862cdb8b6e5143835ed9f4d7bfa19f29551bd7752d2f39289f78289360c31fbe69fdf8f49654e8a459da6d0812546bac9a946973d96e5efbc4c5f3e782f1f3f35690fe394aa0d66e52eac48dfc80610705aa2f386085267051e6b735c531d59bf229eaef70a00cb16a4ac79178d49161e76fee1060ed5c0a6b54c8a5b9534dc84137795685e4e02c6abbf92836b95d72c7f24978d097a16e9b922ed25c23b6b9b2b73b1c81ad88179de661672a9218a6b96009a6cae0fedb26241158c5518ebfb2b68aad76b3c877ad605e76c91c2658a054cebbd39fd1109a7670350494635372bbd179521060a3006de3ac0bf64ee888018c64402aae20920ad9a081bc18a4ce4194ba13c64a5d38eabd1481b3d3754eec69a9021987f2c26626065bdaa4ee71dca8eb7c0261af3cbea61b6e7f3befe3003cf7106aa5706d1e4ce7b37186b3d54f8b6fa385574367b5b783fef16e08f87e5dec423d095338b310e8f611bc4bc4eea4478b5e818c60b8b103554b271e7d0e39fb508fe13f5540deef934b1ec046385d5a399297a5929518072952b20c02b48eb5e3adba6affb32118810d7fd425d68a21304c0f59e9af227560100f0ec19b5084271b2aba4ba4865707fefff205de3fb838ea247feb5f689498159fab50ed2e1f549c8d3078b1cf4f44a20897ce95a85d81cfc5417af4468903fa06bff76fee8ebdb768c41581472a716282770513e4b0257f56ffe9b37f25353bf08514f8178424f09b55024e77c00f0be0826a1da6ff08893eb8b68ffa34a34c9b21e2ca4fcdd9d664069b8ef60a1b18c6db4ac54ca1edbf69396617a749860f6725f2b34c22c3381489ca1598c77edfb8cefb00f6b9b1e5befa1fa7c75c49d821516d08baa0c11213b938ab2d0e57b8146016e0da4c9b1b867b7fe752d4951cf5c7cab7325a76f94490f46628427a124d8456828e5ab5e0f70f5b0851fac68f652e7edcd03ecdf88b08c6bc576e2f7ea1a092186ce744d8e1d1bcce8d4c2182070d36e6b4793924126653fe8242fe6f9b684fc88d87e6b9364218351f04e2dc082d8df133a7b5901ad8b221ea0ecbaace8079703683da7cca7d016012e571acded4fa5cd01fc99b6c4fbf6dc3ab98cd6fa54738503abb1429eb2cb6da905e94684c6028a9f210180108c0096ebd353470ba9d60c4be085d20f7b523c98c7a365694007c8db643375c6be1780fed8e83ceb8d1d54cef197a09ffca6f3ee60981129faf4ed33129272d26b1376b18141eb3e87d4d43164f8f0e6654162613be90d40f487432ba8297ce5ece724838246189198ed7a859d17a09da60d831dfb31bdbff9c877ec9a175d603ae76500bd6d2436a8420c4ef896a2589a30c0e61fbd2ac1b0d8feb0a9f42b8d89f3f4c47a76ab1ef2a2152f91d9b7139dac6fbe581d8a4ba00d27b42f44929913d74b74706e4e4a6d9b0586d021c4d404d495436234bc44b6e43dc9fce216708b0fdcf1abbe37d9e87a3761cc155e306e7acc0a5159e3babdb2df6e06632a612d523c78803a7b10778c86a4e1afa1f49abbe3880e8c6e72472bd911b127769447fa4eb0d08efe87d7c6c759d60a340c9d3b2ad8ae04eedc9f4797bc821adcfe9a608fb2c8c4afd0b680375c540cb5fc38ff1995d638ed8c688d3f8d8ada668078c76a050e4a048aa8568f779105741b7f011991412e2d6ddcccbc11d189182272f1304430df13abdafe9237fd0c5ac701c7b1a7a903b0ac0e3fcbf4439a06a69f90bc756bca08efe5f3b9dec68fe92ff23e175b133ea7f8fab62a2a3f316c87adf8c70e6f702351ccbb6db4bcded7e8f4e3fbcf38bdeea00582545a91e849690d04db0f33acaa463e77b3e04aef8256369d19bfe8a198f6306ff7a722d10ae5c734e741f75a25827aed0d237446d3480998350b3029213125cee368c1a750522527154f3b76e000ad3ebc557188f104c195add99e36ad07f79dbce7ccbd38b1704287892523efcb9ce48929dab2874d48ab2fdeeb892451e04693beac57f296e9750966e3f28a9d3eab322f0bea59031e8656e45a5d010af52ccfff5eeca9c3f569effacfc3c08f10536f02041803f9e9b1b0ec5d482d04e9a7d6333d9686273392545b188a38aef3d0fe0b6d1e877695d20d198e9a2e1a095a1360ebea347e4bbda92e50a83a00de131143ee0a2bd4464aa99ff9f5407e8e824f2a3782329788b647a12bcae9a992952086658bfb5a97063e31eeac863f325bff4bf09e503f905f4ef7c0bee57f274edd4326228a689906f04cb2046e2884180d53205c59493a55c980ff8c6420ec4a93da2eb90cfacc82139ca44d6e9c504f07029ee3d25a72d817724f5afd1b386084c649596641efaa1af3ff24c7e78c73766de2f1db983aba8e96b44608216493bdf7de7b07360d0a0da20c77f1eda9afeefd050b89396ca98e8fc1187464e21409c0610e972074c2b2c9498248678a448f28149a34c385cc4a957ae1f22f2925211d0921237317abd5659e6d54580751119366666804838d80483e30573d43a5148e477c829ee39117380e05bd78eac5c828fe858b4fe65b7daa0fe63b6b08d872517900be2141b4627a9038dbcce0223107003ec64562fe61b848cc5f60534cfd091789b9ea1ecef55e0c0bce15ff98bd8281d856c14962b00a5c0e5b1eced73be19ca247269c59f4a8e75d3a6e1e993857c3d9f3704ea570fef33c6223e71159659555565925cceb4761708ee7939244674d1b5a9158640f4a68ad5378b0684852670ec5795c510b885aa561510b9634ec6cf4d8400962d8011896c005323cd1a256342d6a81d1cdd18288d117969c288213950a0f16b50049910f93a60d8b7cf230860d5e42a3eee92deeccc73c0f738f8e2e1e51a2713b8a303d4f4845674845cfeba85078f0464c1c4dc7c4d90e35ec192651d110c3f8c083465de4b3046ca5260de4f0f526cd95330e10de2be7e58798b2272221650a5aa9578b61d865b567f73adc2df67a1d9563df88b69b5c35bbd731bddeda6fd761b93de71291b0aba87c05472215ecc232ecba1b779dfb7a93e9271c8d4e6761b94b0b8bc9f4ed192ee29ebea2e261d709bb38ecda6eca3aece2b6ec56cc6ad961cb5a9b5dccb6587aa2c4a2cc7387a74321f53adae9614bc96257cd7e8fd4f3d875b6577b7a1deff61a91f60e47250dbbe83d769deef4b55ebbcecaebb7a19623d97bd9bdabe048642f7661d8e5a2dfae839dbe0b527977138e462b2b6fc171c855cf825d2bd865c2aecea8bbf68befb76318bbe92a3806b9a8865daeed1dd6e112d2b9ae3b03c346cccfe893e1784489e848ca066928fa78bf46580cb2192ad1c356c5d7bb38858461cfa865f125aa184a9f28ef900d4e9c2cb6ae97bad432219b96c59807082114628f09a13ada330c6842349c09b99fa79f4b48e77ed20bc930c53e97123d2d97d004e6e98574e6e9b14fc8bcc5957e48dc286fb0c189d3d3d3d3d382af741e3e855d7e3a567634a4cebdc5ae546ad2603a7366d8277679d89b342ea1ec423ae885b2c34e67be4e1a9d798a5d17df88849572faf434d0a499bfd7f35297e5d9e49c9648f1ab45e2ec70cc963866c7f9f20d09a2d5e9582dbd28b924a57e5e5ca5c23175af0bf63cdaa76f34b29bbe1cdbf4eebb5f3ea26f56f9e927d790d812f2ee7d931f8bc43d74609ebacecc5f0e538f9981b92d5d1447a3c7ed2bdf58b6b37c3b4b6797f1b8e52acf317e3bf5d8cb2744710f9d97c75c07e62f423d74547f394c8c9017ec7ab9ea5e7e15fb76788258b9f6956b87b0a5d2ce824d3c5176345437b48881ccde51c13f66676775ec70d43e2119153153d8f58253279a38a917fc6788f43d4325fc1c7d5c0e5b00f8cb977afc745e9ec22e99bfdce573f5b45c1e3bd504527f3911291c740cc420958bc396cbe7cb27240ec12c218a447148e62f4f61245050bba723ce160332f7a2cbd7d382389ece6120b333ab77e4e301f045a349338fbf783469e6bf2f224d9af9cfcbb8f8e0a4c94774ced1e8033223fe312510101050cf47a599fa74f9bcfc9938aacfcb231327e6aacfa57a912141b4f28fd93a564f7daed48bbcdcc55d3e97cb8bbc60212f872d19989f97bb7c3f2f778155dfcfcb65623e550d8a7f5eb010246a97c356349a3892c9a499bfb77e406c0f09a205f39843ac7aea32d70e278eeb07e6e52e9ed59e222f0ef3fc6332c9b181bf57e4e3a4b36442247168abc8e7a7e76514d289bc81dc278e10d561cc5d609e7aeaaa672f06db3ce6a9679b252e182689075b2f1782c4cb61b0cfcb5deef218ec4d9ad4773b1bb42fcef3c5372488d60a17593de6194ebde29c5d3291c145567fb98673867fccbe18886d8993acb00a54afd7934c7a5ef56120b673349a38a9977b633c8fe29d24a9d36f90a8e34e1215bcf48bfc2051a73e15a8e0c5a763a7e305df491389fa057b9326fee57339fda44fc34e870b4e4d9f530f8b4c89e1f1a88edd06bcecb594387f4b5e08797365cc965f1525c1c40cebf00cddb0c8e748bc43933c3ca1591ecad34b9b72b421bce9219ba3934205f488dd240f4bba7a41a043a015d6c07b38e88dea41c982327a66943f4df000c5bd11693691e284d2c31cafdea31c85ac5c6f6b8763e260c14efd9caf7988a2eb7b7aa39cec6e501f1f5ab9fa01e922c08a3fc8dbae1ec1939d592d595101b0656cecf503221bb333472c056d22e548c3d36f142ef1b2fc622701783bfeca47da053b20d9e1c91d762087708725b221c4346c6287a5be0d9bd841a9891da2a84aa6948fb34a5b6b558242d7ac2b10a6476792463507046f4ea557cf397f60955ed02d0d9b64a185143c18e9479b64a1a449164c5caf49167098f7075ee664a4c9628a5e69d8240b269da967040b2d9cc882881315c98c4d133fd8c1112878a1054ae021ca92160429218926578865484af2c21b823a3edf0975c89bd851ce6cb30679b0091b96f24c3482490c53200fc31b4589a481136746d2c47a0fd5048b225d6b65c13cd33315c358ba4ddeb0f406a5fb8625bc61a8730ac806caa0a9f8f73c810c695822e80b408081105a1cb80218ac58421deef0042eb422149c8ed1a6a5d006293b78dd9bb39493442bde8337fb5681bceb86210cebd181147e9ae020092de4c10dad4a86ae4f31e9dac40d54e892c4e00c5064d0062559b4aa0e6414493bb013abe20b3d0f02126c96f358f2863e66e1ce6b29a5550c35ad028a0dbc8ceae8e3557105ca5d54ea7a5530e98cba136648328317aa20826d5245925999a8e20566588282d21929334dcc5097b837672947ded0988ff333d239e91bfef7dea54943b7e0c92d78591e599a38d9e9e511aae4886442d4f4750b9e7c8e58fbc869cc47108d05d1189122b32584bd48d6ca1e97260ea44bd4a723ce188e4ab0e6499d595006767a5a71e699d17246dd82776f7966b43c6be208d156197e264d1980240b76ab0c303ef0e0141a36a5296954956684d7a3579a381052151c5018218a4a7248fac821f923878e3495436fa0a320249a05aca1a72a3894f024fe28c9a229f4620e414b181e782f1a36290312896d5c48431f7d90967234424a1d19a5529e77c3a7a5cf3c52e5b0a98680ad169cc98fdf9d3456551f5ba8166ca974e8512bde67b62246423b12f17108d68aff99ad885544c4c3e8a465bf699f8a88d8d21e5bda121f3d3d02c9720999d2d28e922cd726e7b4b7d7be22b32544ade0ddbefde9f4f99954a00c934ab70265742b1c0b94c1b16c28286343b540195a4be60265642eb046667fc95e3e3f0b036558981a0365d41858234fa18c4955730565cc95948132a48c0b28635e3e42192ee6172110da8b0c7b9e86616cc56ede02256db2882795904346e68c3f922563e052549a4b8efa45c326646012a548166c23325221322869170d9b8c41496fa70dba64948772ce4f0345bc2478618a17639e2f0246cfd3671e30ba5e03925584121e8ca63d5ff14ec5454856bc74c91878f908cba5796984119215cf830dda7870a96f632a3894c08464c1ae00544005e00f6168f80cc3d072e5f21a90372c972f42dea05a2e4f0279e372791ef2e6e5f246c89bd4e57fc81b98cb77764d75b3fd729de9f2e45d5e87bc51b9bc0e94117327cd5c5de62e2e255cea195207cae089dd2386058403a48e1db3081eaa55cbc4c316bccc4af5c57c3ab0061ee6fb2159f0a9efe5e32159f02e1f09240bbee5038164c1a3be22240b9e65e553f9744816bcf74140b2e04f9fe9ebbe19407c3160b05c608bb14ad23a6cdb0bbc7823604f86d131465c8406240b5ed1f05b7581578b783950ca8e3506a0da827b7396726a0b28852105069d03dd82d6a189189868e285a313e474ce6958b12f4469f285239b041c29f1021a43b222b6c16912863cd026472d9836b312f160932f3861cd84418be61a36094352e7194ac5565fbf1ab26df5f1323cfaa4a1bfd7f352a99fc53afa81881fb00b6ad1fae1b023a22706ad1f309c3434b09b691bd7994e9eca0a0baac5e5250513a35ac9b878f10f0360a687007c868c94262909600017c069bedcd3348f1d0d9a6f03a03e7cf3e104f872ec9a1810e879185f8e0de39b0f9f0dd83e7c9bdc003e18879d0460fb806178e0bde5593ef8e0030f5af31100c6079b005f4fcf8f478c1e00a64de20f02b8fc72aa05f01993e64349163cebcba81600f662489c16f859f3a4879ecff0251380af618d7c0f5f0bd6c8cf7c0d8035f200f81c006be4f14703d6c87f5f0d5823ffcf06ac917ff109e1e2bb016be465be07c01af9d587e38300ac918ff922006be4613e09c01af9d49703d6c8bf7c3a608dbccb37015823dff20d016be4511f05608d3ccba7036be457be0ac01a79958f085823ef7d16d8016be44ddf05608d7cf76100d6c8735f063e0dc01a79eddbc0c70158237fbf0e14016ba48d549ec2982a2580cc84b60c8b30dff8dc353c84389f3472e240a0dec07923ce5de7b7c430ec06ca80f05e7b43e306d6481cb0467e83000e28235e9cdf4019110601ad40f300b1d0f2340f3753c4d3bd17fb724445dad33c504d674f8d518a57932e206942c5154db4e04442ed107a1fd7188418bbe9c39907aaf1760e6b17ef6c58d3327c25ac3f5efdf1e6b71aa5dfb0c9168c5c32717aa699d32e4d769f41347c00d6cc3ba0a1278e563c11caf0a12baca9afb1690f799f630379d116760fc87a3e00a26167be7eb39c7da6af48b40ac76cfbd9172a004219ea8b3395e143e7791827bcf95c7fb9fa4124237496c07c19bc5c3f3ffb897b68af8f50064c43575c3b5321547ada6c4f44d6d21e5bf68468d881ada1422dd0c036ec765819f8006bd8ed580011292eb56249d6b0dbf14318a6a035ec764c286eb0c1d6b0dbd143d011acc0695144062aba86dd0e19190481091f98241088c8610a294e0dbb1d2e6640c29024af61b723a2e1086d10421353a6b4541a763b86d46bb3070edaf6f5aa1ab579e214958e21b1a5bd366d9e096cd7dec3474fdf27e16aec64a79b3eeddd77c23e5a67d24c49bacf98a69d245bb7693f7ddbbbcff4fa75b71f4fcd1f4f8d9d24a7c3e601a4936cd8abdd37ad75ba867d34d83dea27e01d0705d249b46fb023029b7cb456877798b08fd6f2be611fadb55d76fd7014a07392ee3c7a907412adf3bed32711dee91bf68157b44c33cf4ef21344ab0155c000d634a08a1ff803d4b4cfa55d899e9650bd10a11cd8e74d3a50b4b64d0747bb1cd8771ca089272d0d2301013528a189276a504213596869ef69d8d9d849a21d360f1674129fdad25c1a3375d865c252def34e78e80c84a579c02984404563270fbb8cc048adeea7375804039fb63b3866cf0359691e34690a6d79747042b89b4e43c710257a5a4584ec7b5ada69972388b656291e89449366bbc9845dd1684322d28c9062909431c8b5441e468937b10f48d43c70ca0e1096e6f1620962404263b7a71376c90ecba426225bda616bc370d2ec4cfc83dee21d1b3d3d0f04d53c28f003257a1e1641812455f3419e740e8285fe86c4d676ed2b225b1b56cd6f27727d7c7cead7e386ecf921606b9b3ca7293dbfd55c00b6b4243f315adab76f08a6e128c0a02b5b926cf119891e3d2de391c001d19069771a65e5d18304a59ef8049739926048e415507c027845f3cc1d1e500b47dad5b1a80c44fd23b6c5464c9cc4058fc4c94889147c5a187c8701a308638c91c643f918a3a41308dbe90652ad42082bac3136dda997c24bb1ae06a6b0d26b258cf82838dfae86c5f7f07683df0ec4f4d2cb7735ae64d55aa964d51cd9d9b8155368a3628a2136872241fd352c52c2486fd0021ef782256d8086453f4b5df48228fa046b17bcf82c6f4428f14ec5f13b1553ecb91e4a568c043cbc037fb16f04f116d71e3d80a4661e7c7afcb8fda309be3b2b6fd27ae44de85db11d4acfc7a4ae6958f4c3a437498b5ef0a4e9670ed23c710a942c5ac7e0c5db1b396df10ec57986c430e77d57b2f20fdab2b3611f23bcb7d9084aa704030b27b6e629ad5ff060d1cfcfdc399ea19dc228c99a94c84b49d6fc4ccfdf9e21a9134bed82238d535b10ca28633c626df5c20fda94d2c660163106c609eeda347daa1ba6d39b4e6b980e6574dbb7586fc8369d3ba5a7f49cbce993d7be1db8030fb573dae9bf2c4ff10e3ccd012ff10e3cfcebbdd88dd917c247f8aa69f4c3b4573b9b9b9276dd76ee301ed6509c354dcbbe1b93c7b5236fc4245a45f10df9940f17b13b7830468892107b12f062c7e8d3b0ab01b107a16c9cbcc941b697e7ed2a8773d36e9f31fbe22d5f79ce5e9fbdab7430bfcf2b38670f52557010ade559e62b373dbfe0201acd2a9fcf41b46ec15926cbce9de23c1fa46af63e663dbd8f1b6f71a611e7f82097e2205acece721fdaa7edece3de473c7d7e79c441b46e798ed770108dfa68b98f898368995ebb6fc159bb38df791f5a6e79ea3e5c3e7d74f7717fcada2f0ea2b50bce2ca7cb8283683e52ef3e1b9f57ce659cada6ceba742ea6ee27133e8fcb4fcfa86bcf1807d1f2f7134f7797da615d58c21bd87014d6526fd675b56379999cc9de5e171b336c3be107c13e17eb06223cc8a1b30ffc3f775f7976c1daf3f70e953aa12cc6d282a5ce738c27b59dcee3f20e757f9ed4bfe7eef5f974fa9c9acfffc7a5ce733ac6833acfa9fbced3552b9af083273af7e0499dc7e5dff325cc73679f4fdf531cca64daae3661ee1f04fb1e04fb4fefeaf7d44fa7947ceedee2f2fafc9dbabb9c7010ad4fefeeb2fdf40ee7cee5a89fb278d4b7d3b3cabb67ec2e5b55020639504367faecc3743a77ef2f5f39cb55602eaff2e7d35f6c322b93aae36ad4602e77658e7aca6296a5a670104d85c241b4189c635630051576d042671f3d7cf4b48ba39ee2642a8fea32cfa867cfa9bfc4a83cbb90b1aa95cad6945d89a8d5796452e7599d27e62ecea33a4ae63ca9ab3caf589e55326f798e399d0725935a71aa982396b0a80394548d71f1ac92b9b6ba7c7681c9ac3855b59d4a56e5359d5c6431aa95e7d4ef8b29d50343f590e954efe1a3a75747e19cb2745843189ce8e1e2ab67d4619e539faab7ac3817d8474fab9e5275a82da32f519e38ec84adc0b0a8645bcc3b99f35c17e7491d65538f398fea2dcfab57ed79aaaa175e2087263af7e0f1d1d3a8af78628ec2590667170f92c91cf51c710e64c5c7dc872ae641b0ce3e5016f5cc826d202b7e751f2e9e7aae573daf6020202bde4596c179f520a7d4839856a8e77996fb503d06679607e93afb40e11ce363e53e5850cff7aafb487d0567d583649d7da0ee23e62ccff62bcf313888d631c79e533888d6280cf520b7b38f98fb58499de579e5f43e548fc179e5416a671f2c38bb3c08d7d947ea3e567010ad570e8339c88af7d13dc8a9b30f96fb70f90bbe2e3888d6a6b7600f858368cd82f3e9414c9d7dace0bc3dc8d6590543c88acf1e8627ecc374ee3e4c98e2205a73f8620a59f1598653bff890158fe119c88ab7781503b2300ab2202b5e6218b0e78b04b84311112d542ddc9bb394533464e910e23835a518421a8754a3a3e03d1c5ac9e0c1e7f70ec47afe7a973f24baf0db49a2020b5bf38b3e4d3fa9ac38456da4a449825802135e3c185ac312166a409242496c900464072ca0c0440c2f5ca4218713a0d044138a1cb94108571cf52c59830d8eb840ca154d5092840f5856fab3615112487a5e7b794ec6664d1c8bcf30b1d1932dbe291ae20e3638936f50cffbd3f3f7c88fbc81453e433d7f8dc81b2079235731304f1d76437098d6792696ed43b84ef84e9a7933298453a98ccbb2eb70cf5c1c66b1b2ec74c239395976152ecbae737a865ddc4f598685804eb89f847ae8701cc7717807078fb87aee5bfd847ae864d975649e6157bd4c966112c02aa453ab4fadf8085873569f4b4847f5981865a28ccc755efc450c92c111081581645c1ce5424666ae44252b2f5e605764a21299a8b83092c1d1c9a499a7e8e4b45a4524172e703ce2e2d18a5bad56d8b58a4a31ae74563e31ae6c623e97904ecc61a45cad569f508febb8f80abb64ee22688525100a682573548ccc909215252b2e56772189241315262a322ba3159631323232581e7147315c8c5492313e3131586619c382f95c423a3030784e95cb857ac8c8044d2014906a7514cc6a48c98a921519d56526d164a2c24465a59a462a3c6156abb95ae179c41dc170305369c2f8c0c0e019f33c61b6d4e712d249a530a5312e9f508fd563b04bf555500ca64028a018d55129d5909215252bab98af281165a2c2444515438d62304da928924a85e9117794e2525489a67c52294c619e690a46e7e505d70a0303f309f5b88eea30d8157355100cae4028209898a35e622c76d921252b4a5654305711e1ca4485894a0c4c3582c1f52526a622c5c4e07ac41dbdbc9c7b797979c1ae97aa545f84745e5e7c5e5e704d3dd7a59e875ecbe712d26969c1f667d2ccbbfcb87c423d7452a9ebc43c855d308f094a610b84024ac11cd502b361d736a46445c94a4cea3144d832516192ba0a4cca2885ad939313222d3030483030d81e71472d445ace1db6b6964fa8874e4bcb7552296c9552296c93b2a49e495a84745a5ab04f4b0bb64b9326dba59e7ff9ae3d6231f683fd58179cd3b205b160170b10ea190342611b962116168c295979c694b0ac6c26220fbb3c262acf18939e37eab0abfb8631279366da8c39e9f9d4a4696ddd87216d183b9a34d3624758d2b6612c69d23c63492d6c69aa28d651b1a59e87ad8c2ddda086004042d523e500a4b0c1995c91e8bd9e974afd14880251a0ebc4334a1d1d899564a314b454836a1086615dbf7b74c4e8c749f5215a62a23494a42468e2fc04e0f4e8f6665554b4676ab7ad53c19858562f542f562a987944258893e964cadac2c0d0a315ed791ab1a8aeb35aa96054e811cbb7c303a778c7ee1d5b311dbb293beadec534fc6376ec7064bdbd024d1ca423483f51c9a7faf81c593a12a41434942487882892349244d2284639f32c837a78964302789644ac6769249124128c4482914ad367fa48a5e973b38cbbeda65176baddf00e77f90c85814cd63705f0cd1ebe39f34d2593661e00df1c9a4c26d174d2cd23d8076476befd63f6e92a5fdee15ef18f394f81808698f424ea39e7a791003e3f8f268ecce727d2c4597d7e264da5893329fd99382e3e4f8f4c9c1e3ebfb9f85c2e5e4447cccb67befa5cab17793900fe72fcf2ef2f04b0fa7e5e3e73d507f3fdbc1c7fbf8beff4f5f0fdb03c360bce580f1f6cd5cb7c331f003efc7ddf3fc98281d8aeaf7847e590a8e7918943eff5bc54ea67b16c6c5edec3733aff983a5c5e1c00ff3399cf5cfb02726040c317134b6062074cfcd8c1148543e282e98504961ebc6cb0044c1d62aa50357c2df16a54aae16b89251d6385bcf84c532f2e2d28961515981a05ea10a272668c3736d8d016c183af1a3ca131798914c3a5af1abc4ebfbc393d3271fafc094f225daf3dd1f5deeb08143d7fb23f7dddb16fa73b06614dcca79b4ebb1c7376354ed7301ba7af645f393dfb09abecb9eef4cd7258677fdaf1be93b15c85e55bf9f2e9b2bdd3e53cdd9dd361ab7cf9f4cdc3b9a74f37b867e79e3db3c7befbd3774d47a1bcecf5d9c53ba94e5223f2f63cbd434f29716c103cf99880790a5db127cef805086bf8d0f1f09086dec6cfcad33a5f2ba5d4da58f3113d6da553ce6ee21a3ee098381fd1f296ce1dfa53293f9b6c7508ea25f426e3908a8374d2f2abafa1eb51f7889edd06bc9caa124b38b4fc4c6aa825ac2ab10e485df127e734516c33afb0510857db8c5d511db4e0600d54aa43140ac0294b43e0942970d2f86cf1712989ec1a162de9a0514b31a0dc944aef60e7127695aec98a8c0383b6c59346c54f6b584407a2467159e0c4d6162fd961b1c512136b2680f5862d8e4c02c06fa7289e1b9454b8db862ea283172e5431b9624f94d8926db27ad01a91e23863ac15d71ef43b3e241c98403142d3b89d36e0c5c3223a0435ace1435b5b2ba5734a19bb1a91e21a3e340e8bf311366c57c3877a19bbeec81af211623d319538f6ac9126e1010fb7c81b39bfd19cea39ed61378409d4900514a0307242072e0cd1a3832a1859e2092938f184a29696ddcf9b34b6068639c992322ac92ec77193c31fa4f7622aabb0c1996c83c92c2553d24612219a5fd6dd7ed3b279e594733e9f95c99c9ed88f2a251d36381343dbaa77f8140e84995d49898f45da03ac99a74dbf4daeb3dd27339bc1b091ac89c3a2d2c6240f16d1e1c81a3c583407242dbd6b4d3f7d57d2d84e729da9f366f783368751d8ab9576da38bb7ad8cfc6133bc627a81084882f4f9c9883b88b401e2cca420bac61911c823a5fd8f22a0d8be440834649162d92834fa3645c1a4aad240bc3300cc32ec686d40ac3300cc3a24f1b8ae210d4b048498a011a16c1c148fff3529255ebfc3c8a5192553f6d5d49566d83078bb2b8a208790302124405c4ae37e2c711f20689d2928f140317e54de4389c7fd09a85078b94921a6adbcc19bc3ce3b1263d8773aae33dca3d42c1719c6400037ede9a0c98a74fad66a28d4976ebb0ca741511f3a70f31db845544c89f3e84fce93dcd7dd96b4efbb211ad713f69ff413bb34318e6242b1251299b08bc78ead978f63266aae7630c6aadb176342e471bbb97ac3778b028094a671e33cd4989af64e5ccc07180a499d6c2c0b3899103c431070831e7a52fa64c99d29562248b830dda78a729799040b2e4cd34f8c1ce6cb4f59240b2648c903ec61863aca7918764c9838005010748969ca185378f00d91678f01912c52722b646bc1c895a3e12c5d713790387a090374c6214f689a804e6f8444b4adb4623918864fdd0e624ce113e9225553cc98ab0465e09ef4e1a6c0cf47242d1d85538e83197634f34f606263a3bc5c20b8d7d1ebba574465388d98b6d1977c308d80901afbdaf1d4fecd4fce46d609f1cac99989a60cd66b78d7eebbe96d38fa5e5f4437d7e1bacb918eb7264b6b3819de5f763b9cab7935de5a72f673fbdfb542d87dda5bca73e55cbbbc396afcc4358934a7d99def4d3b52e07f64c7f5f5cfee2a26ab90a4777efdd3d98dfdfb77c35beacfd9ee55bf976540eef71e60ef3a97c3bf7de4f9fe9ebbe19c9aa590a03d1d5c07ef14ac6b041520f672a4a6240882b0f45bbf059953c58148548f4d91aca9bada194b0280a131d7d00539d8f68792f2503ef76fe6d2fe513a33071dab54ae45a820dcec0a800aac48c9a860bf3066bad95c22a070821a439c6db8821bcfd2484b5561a97e250122cba82084d8a32949494b449ae6a57c3f9de8a717e5f565f1b9b8687d05a6b63e9a5557899ca3cc3c9cddb94baa7b18ec6c671b7217b7adb6ad676c6c46a9562831b841836e79c37833de58c367e1066919a41d65a25adb2d6aa342745c206252cb0a858dc4b9728243ac18c36436e1cabad353d9a70864a42b475405bd376fb99368eebde9d60a6673a7b96c2c93e6d5583078bb078758601c326068f1ced1ffdb8cffb3c49637ffa5292c67efbb899b68ff51a27abcf36fff1d098b73c1dd074540ce3173f6346291a1e7637627a7c10ab6888af64c9d8d6c7930d8b92a40841a21302521ad9a5aa014fbf034f318fab69cf90124216944ad88638ee9ec2250a97285ca27089c2a523b8cfcb69da2aca9d881b98e81aaf5d8d23b24d671e3132cd9e757668c0dacedaeecb4874cd3db462711ae5eb6868a73ae44d8cad9d2a496d8764cd1952878e06240b6ad153c7c499b1deeb79a99cc2309b79ecd464ba2ff0a864cdc03878f14319188eac569066d6675c8d3dc2c6b04b6246b05fd61192b58a5cdb8fbb319935efe9b5281dab23472399458fcc3cbc83ee0c1a60dccbcab167e8072fb6314fb17b2c47b266fc91ac39a58c115112e73b236d8a7d36606b40b222929e30dbf4e4248775346078e0d99f62df0f3a8f062f15836a14283633d3d7e3ba4db3f9ae609454c1d36eded76da7cf9e3b99bec31adb75750d5e7cfc52dab7baafa775656542b193eb8aea7aa3f28a7376ef9bcaa73d69efd937efabcfbc0adbaba6cf932c546aa5c5d8d5c04eb13544d1d4de06514f710a61cbe99adf76e5289567ae2366f9563eeff4d924bc7cefc451c1a9d4bdb3de346d7ac6bc992759b1280d407d69532153a64c71d216c327a82639c70007d43cf68dfbb247245d9f45d1f32a1cd9d5b0a4e757b2ef74c7560e618d8acab7f2e5ecde6597633e67c73a1adbb5638f10d6e495cbecf42bb87639eab1154ade64d955baab7c2a7beeb04fcf32a6c2516f52d9ab7070ef6e51f5988e21b1f503610172c672bfd58e86bd1e1427271720dd2159f13af246c7fd6e38c992336c76e86b503c433a40b266087103cab8016b246be3b6981b4534a5345ee1c11a3d3d93038464c5a6f2c60465f0c4b630dac0834549519aa7760fe891a2b34169cfc6a24fc7b35ded537b9661ff613b7b8fec3f6c8e22faf2bce009a223acc10ebb07d4195d6bd0cf693b934d4dbcec89a1677740b19f382d0237b0db1c43f614778c51ea29deb1392e6584429e9efbe0a49934160a1bd8772eceb173708d61165f3a3f8984ecc9e4944202f5553976a18851261687ee3109b46df7df8c64d9b37cac4963edbb2f47b26c87e17bb18b5dec62f762d7f0bdf714bbd8c568dcbeefdbf6d9be5f56c156b948b1edc678e3af11f943a42ff64dfa50db9d6d2dca1bedd83de6d3d8b324d2dd318ae9983b30fa5bdba6acf032d796f3dadab8d8973de9a2946a7163761787e44dbc36b12fc72818edf00ef62ec7cd9ce9f9f4ed491d3713de70f6f00f994f78db1ea1d8be1ddbb05ba9c47e3f43e23824595852dfde2cd6619ad6e19d73d18aa880959543d12b37e19decdb638cdf70b462c5f4d3bd63d7ce72d4bb6de5d3bea940a4276dfa6a674e8e8c1a5b81565bc7c491c7be63e2cc638f4eb02750344c90a7bdfba213c9c28efa764c1aec2c9f8e49b302a8d4a72f1ab5093e4942524167d855be7bef83467dfaa293367db4bb2fc75743278d7dc3a215da37ecf3da6d1781fb0de7886ff6ec71487bb4427bd6d1d062527631db49171a2869aeb59f66352c3a0352c760c1c833d09be1800944142d94b0c0c2e6b3524a29a5b4c18262117fd0c1066d3caad4b48bac002a3a8351d119826a5011d211a4ae2bd65a6b4fb58861236fb4cf4b0c3676257983053586b79cd4c93b569f7df1e88b50341c917c1148b2eaad506a04342cb28289e6a26d38532ca2025e1e37976f306656db762a71720eb7966f360d837fc86ec12acfa96ddbb66ddb3a1c2f2a5f76c12d38d3c65848c062fda994dc6ca664b115f47c76381f9990478c74fc36bfd59f8e3867b6b52f1fd13c738a94d9f3db4fe6d1b9562312491e4923c9c45e42216f34fb18182758d073657b462324cfbe76b53dbfac829ed8877afc685f1b5ff67a4ad7115926a5733c8d1215608f512d3aff903cb377a6d6e5d8546e95a4f77c3a663a86338c99157d77cc1eebf0cec43f645b2428475e307ae2e4d5d8a4c940e44c9aaaf2798bbbf979ab124fa3c41fe6b17b5f6675ce99a87a962fc7a379274d7dfe5db913870493a6fe5e2f956f4f9c59bdadc418638c7125ae4413deb9ef1e71dc772b99f6cab7952f3bf7c1f64ea6eed6b6d90a66dbb0587f2a3563c4cf37752f6995826263e29d4cf6ddb513c957495d94c9c434328948d142052b9f3df76127c1c4894093a69e9532550b45dbed439d24114963bfa4ed5570663d918fa42d136d6fc2d99346dabe8b405d4fb1e0388a45544096d35936b36733c3f65b0c8c135ee61123f388d1db339c6dda5ec33b37db70d6b058e968644a8d45fcc1e2c85a830c6af92dca074034c83c63bd42c6ec01df06e516bde0d331c618e3a9c68b87513ea10b46220c82b893a6a6e457df52ad6a2369e46118c1cb29f9c166a9accae2d82b79437192f8a22555f13ee18b0bf290aaa8ea519dc22264cd2993542a226d3a9f512db1aa1e12d1604855718fd8f3345ee224f1320d5b8b07e986f28808c9f9942a3e894e128959bc231123ceb6e2416a2d45a5b0197813caaf476c4a67c819bf243f9f1856f1eae98d781812efe4b16c35629b54b6ce83f4b1e1b3633bf0388f88d07c762378433fbd8ec6546198a76bcf90350e61db36cd2322742502e46f30ecc33e3108618d8c9d0dd93d36462891b3525030f0a28f4c82d68e46a5740e81365b6b2d1603eaa15e464eda5a558d236a537cfb442c7d9d12070b6acfdf62f287882395dd0d8a23021886019139c2b9866d7250b230197899e33c546a95794a6c17f30e4de7c135ce32d51042f8d15759b1f5a4cae2db47f0aab42227010560d1f44801a700895e3d74083dfd357c0ac6bb1994110f3b621d8e1a3db206bd941190383890f18daf77e865fd28f6700d2abdd7d33abfb3a6411a185a0cc99ac788781986d6f3306c62e4003189a2d8a6d0900b521abeb810c5bc0f0d5f5c78d21bac999e644140b2e67548d63ca68497e1937908e8d0d9a101faf548623f43d62fc9cf5bf5c505256db1f4e4e3b7d86ac48ede7c4bbdd7f330f48808711201f398912696a382a8ef334b4448bb8f5d8d9dedbe7edcbdecda6b87839e3b87f3b67d7638eeb36b2f2a8cbaeb2c1e6e6cd42a47f62c671b56dd90ff4e766b2366fa62cbc23bb9f07a9284610c937807c33ce24fd76318f6e8738411242862870e2166e4d8b09ef2b05fec934725c284900523af2c2061c3e6014f367c3d5972d2db09e244a4981495e292f4913ff288048a628035740cb086de88863ee6884974c4f108d6d098b4d19fd2cf2f86372fe38fe9742245bc96f722b7d59d3e1ed147314019638032c800653889462ae7708e2ba7871ace2ccf3044fde21c87946861d2f4d0e5115397afe5437d2cdfcaa7f2d9af7ede77fa4cdf9d34389e0771522988f3431c160be2d8d8409c9c1c883363ce8032eae10fe0c1861d93d082ada90491226f45251201f1448aa45af108b000f14486c4292da18ae31258135fc46b4523c002c4d3181487e201e295884ac49f9c89a3048e1211e8b4c3510816205eebc9e42d8285a5c66eb3bdc498c5c2a3dfa9188633c6ec2186b34c62a3d4081dc649568a7e3151071e7c3501eacc6550068455c562a186910a3398c10c1016a1fb2e0d1b8f894d78f08505222ddf408d05261a4b1cd818e16b85b673f9f4fc5e53d0a1e37d1ae2f89a420a063f218a8850e66ad0b0bb718734c544db1449da15a0446919ad7da3dcf6ddd9d37d7ef0da77dc336e7ba4dcb30fc21aacd3762206b255eee27cedf4dd639743466b78a3f55e414ad36fdfe2776554e1a0bfd914469afe76df6ec8e84d7bbe35ee3b1adbb74dc35976daf60de7ed3f2e8435dab5fbb9c343466ff8043220ac99f3dba7fd6e17d66437c79e1bab942dc608c3003b1a9307d1625aa038ccc91c9c4869c28993284e9834fcd6f0e5e40c59c39793a32ca274a62d67d0f9f6ab0a501a5ae10573beaa20856b8313250d5f5660a2f3aaab159ee815c680fb7a1892019734f5b5c25a63b7ba8187e194dcc2f3a69d52323987aa15a3240b0e5ee67aae5e5488829e61ebcc55e149d192222039fcbc9edc3278f055f4d373f0e0eb15c5ab890b7a6bf89a821426a6f0a46fc3298e1abea640d20468f89a62494be8c4052d6f93238bbca67045cb0b61d81ab7e7846f7956676f1a3cf822fae90cb103899d67db67f8f22020047db69f91f349fb8a73244b8a8e1d8ed814db54e1b11acb54caf32c9e818130c3db42a206229b274a6928a30790dbf53f6c4fd9f6933d1f2be6813892c024fe0067b0c1994c913c796b8341a2193469e6a5b0d49028064d9c893469e6735e71b661519c2f836416d4d1281ae5d8d8e0cc8a4af9a994d77922c589d4b3a7259f271094017dba86046a9750c41308d6cccb23464658cbfbb4f489aee8d39af1036babc2dae21d1a12f3c0292e308087a34fab0e1d4fedd042c81b074ca10964398132b01b074c810a9005e7691d1a768654dc608b259cb4fe89333f63225911852528505e51407945e1e4158516d831ac347c45a1d4b4e12b8a28af2898583124dd7ba1a0240c4c94c2008972d023d405212c21851b9801891300d8220f46d22007296c2149092bac3029e204269ce06344040a4c4e60d882075f4f78a2096f68c21a94388a38600213a6c0e490c6b057138e1a3bb530cc3ef1e08b094cd82b78f0d50427af25c8a06dc3d7125cf08222c962c162210b39360b9715bf699f10eda76f9f10211deca70b915fd44ee5b5895dd1e4799306fb4fcf9ebcca5f3cf9f8ed3af1dba6934a611d9306d35179c42e9b49835de52f58057b7461d85db0f6f971377df4da75e835ec12caeef24e9f619d7864d2609f8f98862576451f7c24625777898b9834d85da6c34973bf62c372d86a396c452c629f3161abe57309e940a99ce513b25dfbca27444867c33168d260d72e046689675f3d1c87260d861d26896785b8848680b0a5e538d418fde99b377db0d57db0a5c99712aee80d4a284d49ea67c84da5c39e88d8aa9f2189a6c48630046c75618333f7a64b48c7c4aed89aef690d2122231116ff4422220dd5042c1622a4a3bd5ec84f6c591d211a2652248896fd4f6cd5d7472aa949c757c4a4b9a747497d89dccf9834f7d689779b4973ff483fb55329bf5d895d9f34f7114fd77d8644521e6689d79acf363a88d8991be5e4c26be8892d8a13dacb8f06ec2448084524a28c5a30716fce52cecb08446c11a5335266722c15b8cc6118928469f8128a41630d5f42447e5e3c96aaf256d24ae1a1a2b44d09a163471174686b6a1b03831103082cdada2d0610d6dad79234b4cd99829763c0903429946479af25477d6af85a7285ce2c2024e1e8650426add2f0658427da12611886bd86a03486d9269e9582075f4770f25a6283ce1abe9610d1221b9cf1260e065f45486a02b40a03d9ed75eeb17b8975b20c7fd2609737c47cb4b085b15c4242f2188693a685dd7e4a9c7534065b39beee6ee09654c6192795266933992002d08b084a62bc53c6d8c4d6ddbc7810a56754403ce4660f187d8035f13d60f441c29af81fb77b00c148fc21c3970f8cf48fe845393fe7690d6668bc9cbcfd60743458f187780b8507399a5a6592ce4b0cc3308c5e293d395f25ac4df43cec31c37e3d8a68205ccfc79969bc773ec328a53196bd58160c96f66253abcd7a288feb3e63f34dd426067db5818d7534e0949205e107846441690f4f0feb218ef85adc83fe8766e4d3f395c8a7298573682c47bd3dd6d980506e8e8ae9ed6ecc259f0c9df84c263ecd33977c7a6219f10779d8e5c41fe4a1f0e0e18ccc7650e592aed143490f833b34468de2c583271c77b2a955c7499a1923de60d6daddb8f8665914ad83b2694f382e8aee2e31fd80e404a507463c4ee2963c90d2286ea5a351b14dc286e23e53b7160e9a3a1a357e2c18528b598cf16231464b63d531650e3426efbd7789173bca1dfafa9d9be9316f5e4e422835b0e33cc8d56804afbe1e22696b6bd82378b1b9281ba558460a6c5bdda48c71474a1e18c92ae82c0f64769215643a323ca4c78728e8c80f911624e1d31a42044231420e6240052be0c0044a2b3b115707b2d8e20e78c8c31429905ad95d484c91a28a2cb6b8031ea6b494c035f879fda0063faf1fb4b2434833ed90077fedfc762ce639a277647dd74a6904e6a473ce0e47c4d945795c8d552be0c0048a0d59839fd70f58589daf5d0ddc134358236d3d3ded20f0edd44f5c037795a792d628362a6f76ea27a5525abe904469f939a7cc356a8eca33bbe6dae5903b51c6d7b817fbf2113670b68fb113e2b6c5d867ccac795ea3078661086517813823c5213f4f9bec404ab31abe74a0d450e5a503244b044b04141091bf809874ea7688409f51d1cf564d20b46ae20af4b4ece16b083e68f81a0292ae66f032ebcbac0ac0295b581c858aef2400b44b78f12c2885f49cd20a1bfc6781e0c1d7a1e7594b57c0b9c412489a1e364655f6d961ab624b243d4f97cc287a6e969bdff62b6fb6d71246daa6e1ab06501a6e11d83e6d77633b86bddeb8bfb34eec332696d56fb2d698c50c4a77e71e3769aa78877b77ee72be8b9cec6ccc735cf71e1e5a67c724f66ae289b4f806760c27319d7638b2ce70d6d11023a1b584b2cf98b2bb91b5d697000d618d26b569ca15b07093a68b77b4df672dfb16b90768b7a7eeabb5abb5d6e37c87781376600430a0210a55086a75376e6bdbc6cdfbd1474a29a7e19cf586afd5811775e0c1ae3f8d33e2ad3110c2c8b483408f149d8d53d50deae3d3d95d2da49168d8e5f07c3aebc9b2ed3f6cf7e009a2b9ffb0cd8335843527eef2bc684d8adeb0866fd66329871d2067d44fc605ac899e6445245ed6f08503a49ef862ea99906cf09f7dc2cbf472af1a40d170420c6b3c18cbf0a2814fc3970c9c748659b43c4ec3970c8e62d8d8b4dca2be72a08402218108f2327432436a40de642084d0015f32186a7910ec90376f791200e100d9840d78a9141d5a4eafbe70a0850df222d7c4860327ab862f1c2cc141133888c14cc3d70dd600a3e1eb065088d1f0750317a01abe9808a7e0a8346c55e5a19e754cd10c000100004314002030181089c442914834208aeb3e14000c9bb44e664697485192e31042c4186308180002022000301848e200745488543fca88b34bf15d978967e33275e1a8ab8bf723b65d9b3e5dc7f1695ad584043af7ca1e8dbc881724a37d26f7049f69ce5f04facc4738fa07583ac67a4ff5317c1b552a38839311d02622f157536d9440250ba9a003f8386471bcab987c98ff7ee1000e07ca2c1bdb1197ca07704324e529d2495a3209afd48b9c2c5519c9a0a2f4bba2f55f696a02c2a5d654606d1a650dde73df183777356e937c47586fada3f2d7a20a96798b0d452e2aa2610703ad24dc2b554c0030eac8879cae559f25f32293e828540a0535e73ddc01590cb270e4bf9701ca172950c7b4d66fb3e725b54b332469c0533f54579a871edf71f991e6e50b2688ce2c56909e1e45ba5f128a00b52215cff0127b1ed3de13fa0129e4a0307c5cfbfa8f4b1ada58173b13882001c7cc2e1f35b33b3514771544ea106509ba653004f7fb649fa3fb6ecdb138a2ef58ca955b5cb71eab7ce795a9ed706aad79c77904526da29d61b87ce02490bf6431d4ede249d842b5b9130a02b0384c223e451fbd318ab7c930b603c8b52877008c1112100ab469a60552451de475a8730a096103de3410280b1ab29fa829f67af8488f9e9d379824e71a5ace602d4c802e45f8484b3ab8fdff9a67f7018ba502e4f182b4ac7395ee656fa81366dae74ff3b06862d6518e5248d28bdb1b9d5c8662abe4484bd6d61e6181d93fb7a28e355093af20275f1f1c1a74a3489fe2b5fcd4b411902f110dbdcb4442082bd1437c5652636f7eed66857e901b66073bd784ddabaae7fa9855e656541d584765b66fc742906c5bf1b348c3fa8e0ca6044db9994568f0611439b7a5ff1fee2ba36257f368b8f9fe1a5c420a18c00f10436c651f1ec77509562e7bc2ec3256deb94bb7e8af4c0e28820bdbb2df64257b67399c34632febcdd8694eaf54c1fd3a57d19fff8645a7188547135bc54eb43c12dcbf72fe7c130b617e55c89ee071ec90f0678dbc427f5fb9e9e569b37a6cac066448a3fe4e144016142d6628e22187d92229f4d989c65b601a945ed7b9538627da06559505fa7ad2467facaaae606d8909e3581830bdb77e070f09551aa91a5881b35210a44b580e1303680eb14c2575e195d40752cecc5a0eb56e71ed5d188dfe756e0d206dab190bc7c1aeee609b81a8dd6557a69756ef2f8d0efe87725434b2f8489fbb11c36489df269bdf2f26d61ec2b7a12a7384e5d1c44a02dd2c84f3f74e1346bf5d2a7065d95d0f7bff665241ea143b003c9f4f53d2069b0714aec3926767b98c1da8a2f0fcf7e298113228c30b2cd9a787a6558a0ecdc2368f66628645d95d053e24b61fdb79020a73c6f9f95499ba8acfb9fe8f663aa2b976cef60ff61959e7ac75c30c04efd7d170dedf17e92fd91513a5f94a9b4879fd7747a94cdcae4cb663b2e2920df95932177f250b96ad653673d97b52441c5027acb163699d47ac54f2a1bb38d8d15162396c25aa4b837d41de35928ba640cb26a49fed50777f4a716f2ee1d247cda8a6532347dae030658e8fb73453f4bc43bed8caa46d884042d5863ec9b0472b0dffb4fcf4027da222d4d7b827c3abdfd10e128bf90b18d8ef8765fd78955c05dc108a5124a878aab9b2c9031276948d0a24abd40aa38bdf2589d460cff2bf277c3dc0b3dc25611d2ca536b29e14df7bd70657f0bf6d30a2fb4b152f6207586686c6a44040992aa09fbc940f6a61f7997c3e0351302ea733b3c097f0fc8cab15d5e438a605ff0d1bca963335796684cc37f35864be69ddaae681441528f237d19168d628f9c4f693e2284ee637d55d16e68746e425f2e43b130bc687f388d7dc14148d64f02898a320f99ba8ab753d0d5e903d551eda7ad073c42d7c78d2bf82017e64445b4b5f02ba9a993bd4ce59486da590caf3eada6a93022a43b01901d10a51d483ac0112dec09b72c59486b8f44be6e5fd98e8aa077903e31cd787ecf368dd41a344f4fe1bb672aca3e17413423e7b24de71443c461ecd10a45bc807c7dcf562e1278878bba34736322abce73654199f0ef5aa63b656e8517faff7047a9fcef0996368ba92793af63358f03966575215763fbb348d94f09c71351c7b3fe01f936d5cd60ef73bf50543446753eb12ca229339df3f214f26cc4a2132e9afc3f731096f5b7795bcfa9a82edb2e9ee76b0bf06e6a284df5da19d7f0b9b57159e17d0e0ac347e6a4918696bdd753837c8a09c6eaafb522a391534a6be66dd94310264926ac1c8df2b6f1d4e77217504cbd94946e9f1ff639983259015a272dd7cabd23d215c06d783c6278e1e99534c51111daa43d16868db0a1d2b42f119b471059dfc8122639ffd342204bb6fe4d0409ae686355c04ceba2e91da201f2a62101703ff7866bdc1a73240b3ab7f0b5c848d34c555ebe0fe5e3f75390138e7b811f23b00a87300bb0ebc4f07e8ac81277c99b0e11d88ad401b7fc160a7bbf385f5a242c42630825a1cf2ca0cf2018c636c51e7f654e57c99e6fba106a40cc09b92b5f38b1a0a20a88c6c2545889d9b66fa25d3b098bbc1e8df054b94ea5710607143858fda73e75ab9ff82ab0bbda447a75d4673810c0fa6df51728cafacabb6b317b2be3e2a6e2bdff7ff92f0dbb515f280fff63616f20780be0f47e5d9d4b0d77f60940ccebfdca96338935cb78efdcd962b4fc9cbe7d368aec406cc259c03d4cdafa4703db1fc2929b51598761268d62943113114214e9815d1533e9393112556b8dc16711284987484474bac1ec18f0944ac218b530b432403febe57ffa30b1c94ad6d1e28afbf682dd0a6390442857faa0f8c189b72540274c5a19203ead43bc412a1a6165830285098e2643c9b0941cef55438ea37fc9e30e08eeb064be409a55468673e564a2c72cfa01d7d8dcb331d3f385581abb42eac54453f149b0f963b4a4b7104e8819e58df1e3e5ff367188a1d5a58e83af3463815063df00e8ad9e48d01405af41b50233ec1b8f7157934f00eef9c91bff8c4621b3e362d110c0a265c0b0ac3b26d52d224c11078a05b931c6ff68b5306b3cb5302e85bcb795d7cbe8cb462c00bb03d6422fd45be93a1f4ea40c5b107d736b820079747d9d052f0ab98121c1b29d96832d1e9dacbcbaf01c14556d29ad6f480e9de7e20799daba74bf03601aa981dde389cd7e5528602e300aa7f1982d5f7796868e827cad077804ca4656f7344d8e33dc996f8c95b8fa7cd81780c062f53ce98dc00511c07dc2228c9533707ba28c83d7a49c573a47333426cd3df096dd3eb71578ebf18b4e078eb77c303539d3680765056a07b20d417a8dff9642db9fcbe896b1724d41c963c9ca9c5125cfac28781929aa9e4acc67adc7ea058595b0ca5506505ddcdea99f8487764368bac9846a3539e294838b18262c65b0d217177dfd63a950acb104288ffe69139365efa9fcf1753334fe5f9ed825d4c471f37e7d21d234a9743129b13d440abb295742eaad64e3720c6a671922de83ef274a75343469f802f55f1f2d53764c17e9f172e9adc7d340e2b303ee9a73182755a25e8678296b8a8c111b72d98700b0de0e695b9cdba4bb02795d04c56dd10112ca1e174bf7af43da9ca411356501ed274a81c5c9f42b2a149b3bf8eb69366325ba5024ab3da2ca34636e166e8b776546f8d400a24f19c91d82e87a6400cc4ec3aa9a8cc043c61bc4bc753c272a0f1b0bdd749e5be770357e3014cc86a52e7bbf4c9a8ae547f5e6b8849b6f76f41ba630f44c6f829fbbea3b8443ccce4a5577847422e595f13ff98f136baf8bb3eac716f8bbd47207a96f6b16b2f775c96266bbf42ed5a5c5f9c64ef33e9ccb5b9957d8164f5f27757f666f1f6dc040511ea41a41f006684fc4e28a06fb0af1838740de2d7a5651a9211825ebbf1b81a2d75e2177e3f59ad223ceb3b95b869adfa54ecb2e0af8e87d7e0e81b729732a615c7993c4fdde6a7193250bf93f7ad0b24c5036085d41066f58ec2a9398f5e48ac31a34a6ce4254316440350ffe2b7bd420e579b3e384d8ed7f1fbc981e8f94510acad6842dce126e242b0d6689f1dae67c1ba1777d976078d545055370acf274906e414d6206e909282bdecbf2cc8f91fc3ad5162ab7340720ad4188606ad41274528379578caecac45297403dbf82cd0f82be54a480dd8df04bfa44ce2064049690ae82cae6fdb4495f314bd1b098a8f24a2887f57bebeded349cbca065d6fb279b4d2db71bef2dc0ee2c4c1db289fbb62397ff699ddfbdaf2a68425a2531dfcd3dc80684f9bad06c542ec0441e7ed10756e5da3b2be4344cd907cf8d3fe5eb6c173972ddf6d1eda0c831c4ec48546fd2337e181b66a4a7fe668a36c57c8822a3fbbfc655175b40548c1903af44f8dbb3b05969be5a817d909860fd5eeca501887613f3b0cd733a2648924df56b6785ffbc5364890207edfdb97a38ccee856d38214aa86d1213b7480aedfc942b34d4183a453f469622eed66b4f5ec2e61b98e28ae4e71f8baef3f783808416b8cff552a23ecd6d3c2fe2c80d89656c9b5a86f83df85c338235d91288510b2cf48db518ac3c5d725fd6151a5fddf7ec816df50c5b078194370fb348ca380feb76d44e1d1011727610a97c0a44b04970063ce3f8bf8f5674cb81cd4727fce4b7d8e071addc68623e851e6257bd163f2c2b0ee3b3fea57a3b758b3162bed80928c01dffc293bd397585512c18ac6e9efe8106c88409e7662a9637896bffe5b6960a10f55ce47a76539a7e730f06a17db10aa1fe95460554225ae5426e01f4f3cce9e29b7ede57d1f1e49b3f34016bf4491e1d35f0b1ca282c51605da5d42a4f7f0dd2ab8ad7d0df2c4bf4769ad3f845af6c44c1e9f65bfdb89104b3e167b2173c4196a85dc76784e51b721e1e375b24757f5e35e172a3f8c901f29a1c78112c81b5d83b7952fc45db4eece3333df4def16745b83ac48e14d7cd6f84d5c600e8012f38d329bbf8aafe73862d4cbf66ac158b4a1c283557faa2ac9b0a9f6a9df8f2ddadcd7eb07eee66b936e86bbb76619fc39560a637de692f9c48fba1978d3357a9df891a2b5de4cdb2ea5eec6957859ae1e02509bf6b817c871cd975d313e3a8e8f9b02c18dd61307e64ce7425bab594acc946d85c519afe124d47e4f8c6f82345004b5b872ca7827850336e01e7823d9174ef1a11f066260de0d16adc080dfa258bb00ec1f609338ba49371f9eef75684b0b0b4fdda4e7f6a6b2061d0d82d857031fe8997f1cd54a90faf3c70bbfd45069e0a0df9c400ad12b1b0eec9b12a8bc1706c70668aca4fe37e386cc50e0cdfdeaca1931c9c098e5de17a91f750e959c97ee479ae22d6b5df5f11ce1af118bab09bfc61f0ec101b195271f513fca67ac52cd5241025c1091d615cd75e5497c5a36ad72c695006c457436663621047b8db57a651878e203d5044d7634a629eb05e24375fa85f114b8da5fc8ca2165ec94f9b020f4b4ff074fa98f40453a554444faa7b510244edb089730cbf52d0b41fcc7b43b3999c1104401e5fe142f4acec361acc943f70065e76124eda9beb304401d5a39e59519ce3ae9497448e668403d52222ba5f39643ce8bb8d59390af64a736d1a01fee6288a9069d91e1751d89e61ae810df089ba901856edb3d90c23b207abb9a71777d26d183272e52f68186481f091c894ef2fb5e824215113eca62eb9b945f0f8d682e667ee698e909571ccc41de88a0348b906c13020040392434bb27d248fa3d308827f78f9f00fccb562823a32d3b506108a73bdf8ec3cbe99fb4d293b424fb300723adeeda1e8435254ef98e29917c5800a141f52433ad0c72175195326468e12669e817467adaaa8f3f124cd80fd29bd6bcdbb299858b886a5ed46d7c72da50d895c88047f2c550bf6302ec9c0bceb4f2e68be6cd42676aac8312977bbfc0025636bc9545b547c0933bde1319f2a1fe5191f2257e33ef559bd0170159cab0fb75395f404651defe9e941c6ec382e991ebdeaaa25c80cf96a4c49573769d6b6d075b1424340fbd2c33c1a7a01c843e4ca86fe823fd7b9cfe02390aed26d68b2bd10fbc897d6e1dc40af49b6206ff068cef03184ea09f6272b91bc13d0df4d1be13fccf1ae647a3809a236fde46de0bad0fa3d18f4d22f27d6562d856f074f0640522cf05d762907e58dc8bee45b86fd4ba1c5c8f10376ca3f4b784afc5c1aae625952c48721306591ffae602a2493db5613d84d3b5b8000383825cbeea3530084b90ef126343be3a9f8753266a8c328f0ee54015128ca3a85991a23d2d99dad43a734885c5b5d2cf4d9d752590f6ee41a0d50fb6f2504091028ca0f9dc3360f63dff35a2d63ab73ed43e832f7f5c0d6c3d03fb9cfe3abeae999688f101e6cb505cd875a3253b868434cb5706775fed1147fa765bcfcaaab46c3b648c1f0482b4eb38fdb95d671308f545515c14da3e68bc7922eebad6e1073eff400256225152447c9c23b6e2c5b4b7a1dbca523007f9fa890de30c871b28e0951529281e54349c76d669235b8ae3e9ddf592e4c7d860355d43c3542b1ff095ed611f48472ad5e385a570b7640c5dd0d10fcf596770dd70c1dc979484ff27fc3562fb15a2510ccd4c23c31699003e26d4b5cac5ec03c26d5c600427b6c03281402f0cdc3f5adcdac42fea7dc8ad4b65a25e3b2ffccfd7eec671cad158a94da5191f1d7837b44bda1d14a6ec3dda68db859356d204e1c01700e6966b5ec0c126c3c7530f003ad4f852eed03582614d8bdc952bf09a0a0f63ff47b189f1642ef5f796b770e1752dc8474fa40d0de74128b4b9f441653727bce0ffa4d816f76fe02b70a0a111bac626f0d0cb0ef5dbfae4941760e51ea707818c82deefa9acd2b77ec8a5ccfc42c093c2c143ad225045d88b36bba664d3f2a008e2555932a63694b7afa5bfa476d383a354888dd2985532ffe4da22a642639f0b71bc8e5d8ba12794a4086746ff93c6d2aefa6d8e815569ef53e1ca8919fa6ddd699beb4c4371509698923928b7e0eee5124e3944666b7e65d649e50d0ec9bd1cf9c0a4f63654cc9b4fe9c423ebf92c62c84b5df91bf3133348164129e3abf3d7c1012783f8b6eee14295a9464b8b380ebfdb4a33e17b98ac0ead6d233638fc1d09a2b00ae7069d76017383b7d00daef28959c0149950a104ad23ad1e7ab75897e125f9de9c86af0f254f5892a9c3a94f3587d0b7e5455b6691e3e2381d38f2e49a4d3399e29a5677462c59fd8a342928dbf60d0465ee30001cda672f203d35e35be22080d63c9eb227733ff960880eefad4dedd41df7c7edb26e15b6d0d897ed5eca213b72a9a41436a5630760582e165d7628795647b4f038318dc6c9708ac3133b0ea0b4a7a6fb2576a8b7ad5c9c673a21dd7a43b125f8e3d46df5b31e0bb128f55552ba2191684d1f519d46ec30114a72c67c768916c9839325a940ac0786db759df19c601a9b9ebfed87e832abfe3050ccb03c6e51f7057b891e9610ef0199e1deec91cd9f849a6b866297808e528267ba20337f44b29d685124d5eb106b0172792b7e2abf975c38f0a59394bc8981d0d773f625de6a7ea0c4851a3a1eaa0f6d690c9964cab1c038e2ca1e7fe78e6076213415d8512d8dfa072c33e91c1382233e715a54177c875810f05c2a20501849c13bae6059e49316143864676681aa8670ad95dc1a658e0e5fbac7848ac70d3b860fbcee00c80c8587d4a9ed9e92ed0b30e92795445cd5e7c1e6fd8b88326ab05dde950962ae2db0d86bbdcd1c8fafc85f3d435c3a8124b7fb102f413e705e7462bd29c5b42f197e42b1610b73e769bf55ccde9a1fe1b75b417d46b14210fd76fd8a30a32c3dfca427bbaf46ab3ba61478ea01a9094f605952d040c755c16049a41dc5b71015b85701f5bc157d70d24888cc20b9e5644b95dfd79353da1f5f764f79d7b9144a4060671e216d928fea282764bd48fc5aede064005df0cc32a0a1d40d55276907f5123592197a45753961937ebacd3705a3b560e92be2cc97cf33de4b09daa1f6ae687f75b515b466a54f1d3bd5e03af94258d0e9d617d2bb5253ad7a8d5aeb7751fc297f2f9036225a9b87ca929e7044926d3850040e014ced1ed1ac2add688567fa5af8637099b4a1936923fae6362367c32a162b5febe59a9d78728523cb4eee53bb15673b54a3ba67362b032e455a018fc2cd861d0058f7277e21998488b26701215c1117cc5cbcf8d98cbb968407a385b37e1ae8f22d7ce1d2dfcdf1a8437a1425cf8c809179eeffaddb76fa2e45a021499dd6ecbc3917c83e7e3b9b35b7a45ebd765b07bdd99c7f5845084e2ffe94cce962fd3bcec49c27791a8020598630a78704754f72614bfc87e28f4513de24de18290d89ff37062b47e774ce2601629dcadfbb891756c9511af85dc1cb762cb4d0555f536fee767ea57118c7502d1b21668bfcbc32cc8717d80d1151b548a5bf0ed1a0efeec1a1d217772dee59e0e91f32b5a6c9c1b55a8357ea476dd408044ad8753b587169fdbd13a858446ec62a7d1021b8d825f49cafb7d7adf7345dc8d23b7da413b3d04a03ce2a6d63231b1cebe770abbdc89739d62d666789c990c65f35159af815f7a5a763ca49e15c9e51e5100978f6a729d5de46aab0ee759d1c2cd6bd9f3bd30c0162e0040d4210150825bd9d493aae5de4d309a766da7da39616235f9edc2176f2d2038d54ef4549728eb1ae0f167f90afd96c78dbc296d847495be6f017e2e31a0890b864afe44215ba9962c22fa30950d5c74751cb229551b3eebbd722747fe5c1b06faded5aa47c157f28707d89152922b661d21e883158296ac3081d7347fe1dbdd87cc2a8116bef77c905880bc86ecb7ae385fec23aca2634e85c781cf060a98838c2c01052ec80b1bd3523729a51d88cb42d2585d22200674c577ecd8de0a1f5d2c68a5267322c006055119ce2281a6e8f6d811a3aefd2ee66b845e9d113c82ae95e806ecefbcbbbf27abf71a51ac9c0650ad4eb41cee5964f2180fab0af08b70bdc7d6d429c06b8011c8381df51bb8bcd72f36c21a070e694c77368fcc7f948d22215501af065948702134db9db2b978ed1bafa428b1e65f81fa0f5a2046321ad99d2725574817583af7ecfcedb00f77551d6631d8f8df6b3c28c04ca954365a2364bf2d3dce44993ec752099a1605f1bb5ec3266585e97dfc4f18497ad38666b328161566b35be1738ed9de616a26414b7d87c0df1c654c0c647ca520e9bfe7d1af86f4b04948747dc007170a897af249951261a1b9ff95138d35251096074bcae662b66e1d92f9de571b19cd5b546e8ae0154c8ea4fbd3a98da27db456c588aae7c7a7d9d23d420666a86629ccc50901d605847688325a40730d9c188535e3003cbabd1999a54cb7023a6ea1839064eddfc5b6aa4148ab8bb2870a19ea616b12e279236ac68d9d85a7ce575824f760a61f2d0920accfd8d337f45f2b8517eff2ec2ba7e202c3432bc8df9edbdfbe84d5b082d9225b825df8d1623a670d760aff43c185f37abb496e26431480d76ba4923db08beba4ec02f18d0374bad5e8852a40c012f75802ce61e2532ecf87947b4da88ce28c65ca91cabe4be0442fa56327c887a8b21726bebc9861866a1fa82a13a2d8a8c0cd9c862dc2c19a4f432d8cd07d254a132389e1d11ddc6836101e82bd072b0c04e9b8053fb7754b2ac5504b52a4f7cbe721aee5f726e232bcf517fd2dd7de4b733e8f240d06564f89541b1b809be1c92f6c8f4ea663cc8a94acdde3710acad06137d9b6b69494a6d5f51e66c5e115e3d0a98da5e5cf3fcc99215f37035a6cce2bca294200539223791251fe41367c9a7d54d2f2cd9a6d5c20452a6c0232ae9795655253ef5190ec9d6ce25618bdc5c551ab5c0c072107aaf1ac5ea80c8b8c1ca60c364f21f3638ecb3ab1e67f4a43f20f771fd136b9311d134cb0aa4f138db83b63d565d0ed0db6a1ce58d037419ca1cb8c46d6b3fea515f01570026fd83bcb2a872e790e05a69dea4c4e4078cfbddff3acf490bf2ec52fadce1f688394bb3b26ce0a535ab41b6723eb82cde232c14f32e04190d48b97167647b3664e643a0e0cc8f3c626b81bd5845a326d35fb62090be1ee7f5bae1c23d3685a3f5e94696f31c744138720d5100a994c8aec705743ba83e8a6d99b0488730734a5d093e891fae214846c84c0145f4b2550451ce7a746d94eae341cd77bc168995897e081531c066e8fe8a38444a4a33f77e3d76450b93c29cb33820b61ad8528ab391faa22225a8b18aead333377b1516260ff3a5249c10ef2558f4e89d79bef983bcd37a789cae9b7d526612e4d00e4adb6fd50f36dec5aa4d2d88c59eb62e41353075ad5ff846e817a30d898a6b1292acde3f7407d0140c5fc0f69c41fca15a8f93c0105ba00671f8426314b02879e394cb2197a96e920192876cbe3bc340acc1ab40a37fd4211c6958ee34a96667f42e2ebc8bb18b2178371e7dd08b7228e72293077dfc86a449d3aa59d3a71cb4b7dcc2fa1e5f1a0a9361f186e024d022e4814f03def2c248d8442963925c877f634d96f3cccc703307716c6f1fd2053ce59e8e145a1459ba79834de6aec4c2c8956a44fe7456022054e74ab7a4aa63352b89037208f2c05dc53594e44788d271560780be407d1bfb6e5ba0e6283a8ae8c6db3d8ec80f260a50706f7387ac9bdcdab7ec28409dfceb539e8106d03a4b82b25aecbfc6eb88b48714d577b9af000001ff70a52ff0950a5ff55e5fd4ff96906f77d283812df54d0938a534d5c525dcc67bf0b44d3588333cd58b1ad45e3fe2b86e4e03b2a819c778bfdb4088ea9d09ff38e814f29f828e88c067b27336c9c3bb6c857955823363399df776a8b76e5536bec617b83cf67773e4564961619d3584deed7fe179893f34aeff9a6d04a70b19b8b642233891d30186409b3fb3db164c4d3edc7ccaf5516c2ae8ef1fdd75aa36ebc38e7bf83dc92af6b6174d32aee7d254de973f25637edcb6f750ea5f47d511fd49c0d3f4508e13b6153307e5dbdff2fda37ef6f77fe5b6eb996e2da3c59c85c62a2c254e7b7c26cb59210aca05d56881a2d62d43cc0b3761a0d3fa659005555db440153effeda6daf20e93ffafe73d5e9633428e8f6ad5824780379a5fbf38a370d220b98b139ee272ee9411b4f41817524bcbf41db4502f74a24196e66871e1067e8bb1ebb6ed0bd16a8d9dbbe602e157b5f1f8a6ed19283dd5a0085e7df9bc8aa1ccfee3bcd2b86932ae4af278088ce04fe08bb116d897107bd309bc3d9d0924aafdffc60d8cc8efaa06d12f822a3d2704b2b2e46f27745cc69239cf9654846538b91de25bdbe520290c90a14faadc4dc14e6a84e42292841ee53c65eb37e431aefae9e16d5296a1809ca59435ca2054f805874615157b67c9f4d11cd461ed708137deafafff96edff3bf2b3114c1b8bf7e268bc293803d6803f769a7ba4c1d441b26bc368e4a2cd834b6400c865e1771b968495c420da5fcaf914833a6e28c74a8ee3540f36307f751e0ac48937a08e46c6f70613fba9d5771178bafdaa770fcc43d40fc6448c17ebf7e333de301d85257bff18f50e51dd0e2b0daaa65c66fffbcac9b6c190c7e142827412df9338413066c1719b25abf71998d9ce486f9bfcbd5f68644e967f70536f6f5eb69aa1be6e2c156c61b3494c95ed18588e02bfc0c6a02fda94fdcefba66bcb7f784f5e55f9b400d222f26826d0f2ecac745d1b547aa84be7dd3ac52291fb697f224d452aeb83c43c40829ec85c01f2fab86c0a9fb1b2c09443610b53d4771e29e848aca3fbe0afa14625160fc008b5f790cb598581dcd51d9dac5fdd9899cdbc68ac84ac31cfc3204a9cf683a973b9a3e434b8272f505512cd9d56d6abb57716022a5c9c5299723f9be4a9fb3f4f329d6f3ebe47b5bc65630ddbc099c7c7568f1f74c8c866db7fe2b15f4921f64f5425a6bd7ca178bd755ae1b87ea04061265d2851ad493ec727d130693f9eb501eefa55bb8a402afe4debf3ba011d2c46405bc80c0daa597ae0aedc2e4a1c54c6e84d08bfc15d03eeea1f1ea87415d162e82821122448fc96caf33e38f2c9be245cabbbb1a5552f4a006f9d3b6b903dcf0d2480f7c340e0fb9120d95301d64bbc19ae2f6af8aa6e026cdbe1c46d6d1d701cf03559da0370913df2f736759e69c907fd4b9c26d7ddc26f069a563c0c55c8809c7e944ab03e0b830ceba5c3b2fb7faecbd3b4d68d7b42df469df664c5f67af48a3926d4cffa361f7a1e6ae56a8140cbfd2d2614d47515f72920d66db13071f0e6936e113ef56e0d6b298e727f2599a211ab9ecc80d41b460a7db1edf796b08b7132bfacfeadb3636c065a5071494a8e2d7310f698a04207adc0cfe806813d030171712a13221c7f376732a2d2117b4d2b04c628d4fc146d1901da84f6bfa60c241b8d90e3ed466143c9bad2a5b6dee87fd397fe3056ed29a6bcbfddfa654b8fe54c1f73861d0a2d8fc65a8785aa850d31440702d92e00c69687e1a992c611dc76d8c334f1c185ac4fcd8b11f83d693d9a29a6588310375a276bc4aa8aca6f99a6ad3af7e5e988266582369cc9a3fc579ecca9c4844efdc4bd2ddfdd3162f3e2a4e9c353c8112e67b442df92ffcafbe47cf5a9a61cdbd890976166619c86e2549bc8c0d53a4a5f897e882fc95600e28fb04c1a1999e5ad5e0acb3e32405c0e642f153824c6d717510c020cb72649d56f3f9e97b64f5e0f6511be6238fbf0ad4b21a4cd9a7b61b016649fad72bd72f0ce3f0aea9d5f52d6629b06d297765a843ddd0a01d06b91c2bba1c36a6f22e232fb5bc6fc15654403a58a9479f28109a8b57878750db767f3293d4746649cd186925f895f67e5e0e90b6894123730cf64410f92eaccd86b1ea870194ce71e868f035436c4d8ff3b47298745faaf5c276e4adacb12bdaa6c72a4eac9308d1880ed3a540f91ccbe9e424c571fd0d19cf4a6fecfbbb9072e0b333fdceda2f8d8934c3ebf48baea616d9a8d3f490f722dea5bcf15a179c571816a82a8f727700a0efe6e0db71d0159da1d89db9560d17181348fd035b9f706829484c9c946fdcd6310ba7ba3af0ef3a2c69ce06b9c58617477d86324b97bae1f237bffec5c3b7a74e9d8099aaabf8371849a8653a956e07697d01e7c0357f99c6ce7493721351ada106e6d474a496b6f92197db301bb6b1a06fe3f94c48c90a3e40ae14779bc0a114d8ba8a559a8a7707ce1b77475de0bfac4e1497cdd1968781cace56a5f46191be1bc589c632e2f2db981f8bcbfe4e1c3e20e0c12361043de049597b1449339323256c8840aa52841cae4423c5ea755d53fdfb26f8b31a1637a4e1fc7130ec780db6bd4b7fdc622b29ad11c3f498fc684fd52e7ec83622ce11fb56c20ca6337c84d1f808b7ea41942e50ad8085b5ba475c11cce56c2acfe6011af38631e8804e95c16545c0c6741ff13736a3ad71222478c7ba0020bc582aa1fe35427a2250c3020d93ae1fe3d18ddde4feb308b0109ed33a1ad3457d11cee57de9b7f422945a6d5e3adf1d4006cc68911c3952d9e97e0bd021f2e164c29d6e5265288c21db77135289137442aecb34badec7c9bb5f12357173dce7028fce6928f358bc6714dad0e08efa1c5d6e0e62519d39200ac4fd8303a730d9a0988f1fc4b37743209bf3aa17a861247f15c00de036270eb1245ba1bbc664e3b875ed92a02b398dac1cbfb685e6625b098147daf280681d26b2263d217fd13d9e42948cdd277fbdf1e24c6c6604b28162f91b35782af8b14fab01376df6e2496a2f6fac767949d2f7e423a120dd96dcc45cdf4a14ddd4fb15eef3c33084d403eb396791e38180063dbf1536b3a172567b69aa4eed0f659ee0b5e8c26d2d419b00b8b530156b62f4dae3e41d76a52aa4f46c755fa63ab129f02bdb9c59f85dbe353c85f3729b0d9f8706b57568dc7ef32053c49abe39a3481cf6e1cdc7cac1b3aae6eaa5bb4d94ba4aebd5de06862edd053803ac94a2320c57c833df6b4bb35b47c8d9319e99e4e46622cb49f41ee5fcb298adbe6868cc6cfb64c05f00c2d620295f9471b50d4305e289ef1b5019cec94b43348abf42663199b76192ec9c04d8689d4b30f62f4c7bb2c05d4114aa45a26a4c4e0efd27d358680ff6f2e7bfb1ec4a4bb9527496f97e86f3be8bdefd9954e77bc5bfd52214498ffad495c08c31abc46712d25702bab3f60a3702dd1ff263d6170213377d78dd16c2272bcff83ae107bc1b574b29c1dc7bc88fdfd1e740428027e1cef272b83982653269af83443b8511d1f4d17b96700fe9eec2d9ea453b8d1ce3c9446dc44f612f30829a5b14e65b27db691cbd1b65c9561eab12c8eb5d060f36e0caf491009114a1e93e052bc467ba2410267c64eb99800a24982a648b4615aae5145c2fd1aaf7d810e04e29963d609d3b7cd8698626f66eba98cd7f8a99487595df7a4f8ab454f1f048c6cb68760ba01e0aa7ac63162e29ad13387a7e580fb561039f6c3502a9b9eada812c4eee6be25b3799ba7d0cfd80584811f2cfb6ad3e3839f326b594135f1cb76fa465b98030624a673c2abbed054bd17f948989490e95d14a2d01119f4f052cd50b40541a15c63d9c4d83ed889e93900b5fce0494af66babf7912d6af83f14939c6a7d647d67bad230e7c44814379b18cd367135d7cab0f773c71107416c3ca263c5e8aee752686b914d6c6d2aa8f112f2ed5039a7ce68589ba80f867722aca1416db6416421c00e1ea9c1b831f666b5f0455f8c464368c4ce2ac87636807d16c510470d53ac07c6a7c4425340688afc2763d3d6eb9fac48cb561f84a64ea42ddafe4554c6927ae5a6e8289d76f6ac356df1db16beb3d06446381e888d165eed0ce7db23dd69ff3934afcf8278951a169ad2de04498ea081e17b7366f05bd17a65feb637be1538895e0b9b73eb44085837d14b2cd84813195612c68582516fa4564220bb7284a75b6aa9eb704efa1245c389622a6952a8e8287516ddfe1bd41ac943c25e3f73f35b2b92ab70009efc8f8551c57e8ac671995ee6848989926c490cc7e5cfb24b7eb9f7fb48f38adb94eb079b658195da4df94c635085ff38e50915aaef8dee9be0944b2493670bcfe7848047d6f306c88a0f4b18ed0d3aaf3cf883ecabc1493d8787ec56b1ddb02018a995639ee404877d8a1aa6294ac64fa725ad8a1f1ed742d5ef60c809b7c54a1347c0aff5c3c3ccc250788c3c9dbb47619688d8ed7dc64a1ea2fe4b030b0af2dd4b554dd2ee6267ee15e9ac2f4f5bb339ce587627b381ef2e8aa8de8dc3149372fa0fac0ac29db13fa9c0788eab97dc9e8d82c172651138298f922618ff2a7e61caedc5f8a63baf526a4b23f96a9203d77da8a72d61242467e83e63a5e5f27dd2b804636db5ec50fe707f17839a90996ba8e03aa63e14f8fa75b8d594338f4cff8261a9a3af957e0973521d693726c5ac6e60a30571bd0f972610cd1031974ce4a547d63336456fafe79bbe194f6a3746be989871aa34ed50ea7cffbbeafebf1239b86ae8763f6d82337f40965e2308f6d2735ddbfa1580d00312e3096261c673e97e1f509a6aebc487ba2851446cc410964ac7962e5931cabe6620d8d722420b9dbb27ee0e4ec880d352da09c9a95ad9195dc58b7fbf928e913d00af9d689200573b70ea0255f1036f726538cc83c6a9924d0efe79dc8b77919edc4df7ca57b240d17584c59fd82deb06e8cf7dfefdf1eba935062d18e6ea38d4ac7e86b4c3716ac258fcde03137d557eeec2490023abeaab35a70087181ad50f8980ca9ae37c79080e0618c07306e092319a9750475200b846f876752dad8e11763bb7bd04e024b969dcb34f5439a849c18500bcf28e45ef5460d3e81d4b6b137ae78b3387f81c29e3cd05e2ff365cfac122c7049021a6552d16845e08015964ef03c2c2161cf94deaf3232d3856521b1ca44883745521f177d14bbe500ef528031a95ed7ce9241cc7980f240ffe9414a6fc9982b72bfefd03ad4c163be8ec6f1c863f94cc3bd22ce83acb55bc92d1d48fcb1fb86c24e6c0dd47c3cf577ada8b6e8820587d1c8279f64a6da8db5a88b951597c8a11bab2d5c04b5cdf2925a996c97b556f135b882eecd3865df536a0c9c319fe5d8e7a00db7ac410b5846b1f6b444a8bdd40ef72d27e173455ee9a25a1a1446684abeba166cdef8e1f28c9b27133cd18066ce9813fcbeeeca557f42f3619c738cb89424e31eb360cf290f4343af8ab06f8276b1c8c2e1046045c7096105212c71a39da8075ada14dd49fc8dd5c54d110e7300856caa9f41d93929dce7567b83d52cd2895d6bd05fea3e7309c94c8cfb332a20b113659c96b61c16233751bc000b3db7d642d40177b5ac01aa76bab2ef89d4a1283c3ba955d88e04b03f1781be885fe93acc96601107d4a14db6b0e5540ba5a8df8d84c545b731442de2406e85156e5f848eec95630445c60facf9cb45bedef1725a4e71b3764ce51f237ec2d81bac7931ec8074325e4b77dc1475741f6d555d2f1beb8f4657b9477596d4f4a861fa96cc33d119e2fb348691530f5110f25091ff482ca8c5fdee3b7919d42844b2de816ec3f2ec725f560675afadc5a275aa9cead847ee1575bcf8fb92125a667eeb8a69bcad012a83c5ee8465558dd4641f4be01f5d5f7e88cf9283c0d9577ed243d4a2edd95d8b55cee3e54677a4245db3058b6626ddb9651bd0efa691e40d2b048067c4278b3b36acbce54e77d1916e71e513c69863031e2a968cbea070ba87415e6a8caecb693e77d80bb911d84125472e15764606df8055845f3dfa18bfb399834ba7685b8bef1d0bf386f3a592e7446e74eb26473f47e5cdf914a5dc5dee29471befe8672eb1df0ec1805f41d0314bdff78d6d282dea6dadd88d0b7d0ed5815d49327c03743fb565405663ddc0e426d1ac61ab729a131915c0325dc2a586ee365c8669d631a522e7be2f32368b2324756cc627c631a4ab35f5b7b6fa621e42f4b2a47efe63f3a0347ad936447967a8b1913f4b2b264986750a843f4188faef2a08ce4e4fb38246078d645ccf7ef5d4c6054784817710b13d23ed71b6adf912ece0d40ce0132fda316e25423fa7d0e84b366d217d7dcbd74219ddcb988e68bfe30fab3ac67f580c13352f1ece44a1491727b3c210c28deb92d98282fd57073da470fa5e2a04a6a8c0ba33abe399101474cb8925965073da5698dff0dcc42e0a2d5f39840165d118f74c093447b1c3efae079b5ed3d8b15daf2c6e3c0f8066f6cf482ecd3bd16619ce7d6090d29ae15b142d825bfa8a10c935320e06de170f855887d7d41628ae83505923f0ce315cb8066272c4f181a304a7995408238fea5560a4f57ae5afa90133ded156b15c7cdfb7a32d0775bcfcc2831b531e92be359fec25273647f0716b7238886d847b1ec4ca1c60140e1bcd3027dda747ecd573d5cfe18ed42471362913ebece94edd7f887b7ab68b231b8ee57984f9b7278daf450ec9a8a403e2d8b53d3fc857b75f49455a64d25c096406a46484e9ba11e8efcb78491733c3061f50681a6066d4e3b1cc65cb42c020f38d4ecd6af8a6461c4a076e6127f923da2741c98ce730bdb04966dbfe4d4e4601c19ca984848d541c6465003ab92f806560cfc55b3536dff4e630e49eb518ab2025c40a34c43f59c5424d079c9800a8c6a1c0d69428ab440bb0d579c5084c28b2408d4aac8f92fdb3b95c8a5902ce97a66db6c70172db39e46f9ec232b0fc8761619adf9f2c90813d0f53e52cc8a912e8b6c1267c808ba195f555982e501114ce034560d2ce7bbaf5819538c243071664a79e3aa8ad60fab8422dd19078a33b3157289e2f823ce4330b622f9c4231599e0b6a0c8c11d0528d38e1142c42977e1d6cd02c91720b9bbc0caecd5e75c363cc53206a2a9d0c520f5fa3aa8bdeed877ed5e6a0f98b2e38d3d22786639e3cb6821d3df492b42b19adb5bb96ecaaba25e7cab50d44985482fe24435153ea3111655252aedc112dfe31750028bdad9cb9f5c09acaef943e3e64f426807017b338dc524256fe93a04f3c4a202eb3e9d987326280092b083390e435998e1b0711ce2a8ad20e48b9f0af03889249f9b530b8c4c55a6f0ad0ec1191bc92cafc5eeb931a795553d05618f633faf1c3c1e8b2db2f5af4618b8f27dd6e2e4c5a5e6d7401621d580a80f78bf454365a1d0e966f8b53edd97a97a788fcc894ea28742db86cc434238bce9c30c84b926a850d79033e841afa6fadccd0683c4220b2e72e5a793ada28581de9f75ccb7961703c05cc961e625316b6097504870df0f342d44f94561773dcaafd643dc91a2ef7b80b33bb373022acc45ea3a92811346a07869eea7185731aec65404ea606b92398bb9049993be1d80bc8920455ae15b687211d4fed6454dfe75036be39a0424bb1bf0391c645c01bb0b880c03af916e33cae925fd4ce33ca1abd9d3789232c81acca050e53e319cea668002daa413f56ce0d81611316fb65f414d1d76ba452041064b745b7a0cfbdd90d6d0de474ecadd33d7f7a758d53dd2494a46d11c6d1540bd634459ab9a5a8c18d2d2c90e5b59527246505ba3bc5e9f449c5cf2227a92824701287b83e424bb91914be67ad0e9e6ccec991e8196a0448380e0bf12b1d3a898d70c54a414c4d90c09ef6704afdbc317c01a49563ab309d21380ce96a3fc77e4454b26e27c262f1d8c9496ce59895f889e6fd7d347f2266384421eb8d96133c02188b1eb054849ffe976d97c6195065beb9a9396fa80dd4a81b9ddf017d4cf9172ca60a6d6b9c0b73b3accdc93c505ce7b6b75089953944fabe035e83669d425b79c301e5f5ecb6b5de30e497e12dbfbbcc4f3a6e21ea46d89c5e74b61f4908ac74053ebf332581f2db4104e29a9558bb38ca6848a54d26a30de3e6d7e9b5aa5ee5bb696aa12300b10376c63bcf0981a4ac33ebe70f1a270dc2ccf15ef1f2dd64fdb12d38de19b3f7967e3893cbbf9a3526f6e2797ae87ff87eac08d49f349a373840bdaae30c70ffa6e8c092aaff2854a213918fcc5dc60389424100db4d4f6bdad563d0d6fbecfefdc69ff63ccc8a316651a3ffcbde3a3975e45420c806cb27702bb13db6d8efaa6f283e91dd1408a713591d924923b10db0f680ae1cbd458596645c7e48392d130a18a8140b68ae7ed13c2212193d6e5a9e316fad0dbdf13ff31ace068ca5be68327c65e2407358fa60948a54d4d336740a2556b28212d8d99a06892f46fd208eb092ebf82681e83502d9df84528bb76e607e7f3a99ac1ddc8ed99676453cf246bb0f4b5bcead792230c72cfeeb14b9b82febba5a7d6ec19a215221a1fd195448bcf546fb8806303eab4e500688a3d26e4f32ee98089a3c2a70ee4c7eb8d9d600e5d3838d857710e9ee4a0c7d36f8eef368a3e2a7de072c90e5efe319ec5b6cc076c1ec559ff2558608a94bfcd287882bd4e8f888a5b227e0ad6b0ac3eff91eca8f1edd03ac04a9baca6845124d0973bc2c5efeacb5124c1d81fb5f664d1601e5dbbb6d0cad76d315adb13a5e8dd5b2a9ac935b99c7a0ed28963bc7216dfda78fbe1827af703fb16a538294320155faa84ce8c3bbb145f474daab337242124de011d110531868a0606f82ad9309cd71c1ae88ac4664ba6e683c9e9c2af07a08cda644046bb2dcb81cc50e85c0b799082fa76854f5f420fe956ec59ed6b4c7ec2e5b761132525fa29a8fa5f5a3a605bed852dfcd42d6cfc8b0a3dcc1a668e1789aecff72bcf7354acaf893e8bad0b092a2d5221dd0468490405a922379b6dbbfa8ae84781e62bcc8063a17968e00c43d38f7c27b2c8116da9cd962e95d782f5283a8a9a14c00380cc415a078bcce54856e1a99410439e281b10eba89cd19475025d621938b1054cb61cb3b54cdb8dfd0fb560447c6e5dcad8af6620ecdc84154ac55dd6e2d443a2c9749ebc08b5bd53605b402a440adcdea3afba136f7033027609909a0fa95a3748cd2f72ffec01d564066afbfdbc92a169f5403cd404adda2147028283ef50a7abb8d01b45ee2249a93b31fbe15cd8c80c2f5295371e2875d596c9fe639f787b476a7b79b3591ab7f09a0e576ec99ce66c801e0372144a8f3d3a8f8a5695a871f44ca83d8070d5b48da62ce0ed9e202547e49087051a783365a0b4656e68f6c011f43ec3b9245e1ff082329337efa6589c9f0a568b98322cfc86db4aca33cd9d7827c42f689e1d7d079622dcea80b34023d0e2e1b0c4092569ca9173b0f1062deb342aa6b8b0e9cc1303f2da7525d28586ce2e8e700aee2132c94bc1bedda74fddefd73ca19b14336c7abc0afe25f547e669636a810c96d7ba9928e363803ba44eb08490530f2995c9a85b794f1f7d912fa4093bf274cec62ed7393e42fd961f4f683d689a98e5058029876760f53e992a6c41cb63661144c31894e6b0c8edcc1f32427eca2dd35da7eb62bffbfe32749c0f97ddd7533ffa393df5030b0b26916a1292ed32ee2212b7bb2cc3475c849083124faf8b42894c5f1afe05e16630515a5ba2d4ab766e22e3b321d8c7efa7ffea89240bc4c877e2117060c536f4b0a713b6a0c463f57280c31ef61cb90cd8f3a50691de6fbc275e33fcdecb7545bde033072ba0295e3546cfc3389d08a85330919e96e183a0d9aa38c17cce8ea1cf6b977f1f4e083cf00999841df32127b81a4aa54459977e6cc5f88e9d677dcb507862558012458cfc58044cf584a2e68edddc1e030c981fc4de32b9b16d3b343d22cffb8d7544a9b17eef1a94b53ecb7f639bd7381115e943a517e53fa92d89d608caeb1bb1fd6f13d249653d7a2954a2ec778ca2742192bcf76db34ddc823c61a97355e02b9c3354e3f9259b15bd876de88a9b8be3e4d85135610edb05133d3d8560ae76c2fca115e28af3c39e39796a54308a79b0dc37a6681c02e410a04cae721d41af380841cd173cc90766798f29bb23d46495579d721e27abe9dd7934a230d51d099ca157188242b7166a8d6ba28670a9196e1374b5ce8c9077c64c0f6fbdc4647a9478616a212ea9c682b217364e8225264c686d4f40ae826ed31ca7e4a3570edfe9b93e5f9a864de79acb7b20b09230f5221258ac2a769864325345dc1fb1e61c887cfb0c02c0d4d16267481981f62749b191d6f0bbf96d8df33aa49df54019199987d5611490bf6628484b2ca421e810730989c7a76862457d8c281c4bd58795863140b0189130f79ac2aba3f162e450f62f5a79593864295aae7a12eb256373f4f28719eb4e0a2d5d06f4ff5b9786cce2f067805aa97ef9c3910f89d496860285927869ec5860cdf96d22cdf7bc75a06d38deb979aa8be30693bbe4d86d8a9fc8fc05064481339444122f1e23af327025c4b12d856b1d0865744261f40b10cd00266fbe1c39586e3945f7168908fc930fb637b635f4451f284678f530f8bf954a27638b1cba6a9dac14a4cc610827cc6ef2550b86b4b8191a3136ff18e9274668c1ae5384d54e7772d0d739652514b14d23184a13fac8627894547d955f3288fa3f6888d2f44a237bf66250a0e2a70b9bea73833404ea46e11ae3abdde0be11764893868ef1b28d3a426cd1634a4d280a3687d2ff7bac3e54a32b2dc50eb8872479544b318afcfade758d3a891f7e8b1cf6c328b1d17ae5786c226190f6fa2933fa7be649fd3f8d93461d4a8eb65feaaf8f76d6b13bc8db4aef4e9ee2c549a7e9ce7961e2e498d743217badca292dda91778f676790da89d304c1c7494cb0387653a56158929ac14b71492ce3785070c5d6f100c68f1789b1f40ac44ded710283de061ac95a22290470f1a968bcb224352f94eddc9d8adae9894b2b6510a81c7d5431362612016e5bc09d0777f6e6888a308f24af97599171fea8a9fb658f33f39d5446467bdc25f8d8795df27e0d4a5241efd9067896fa1fa582396a8bc0df719973d2bb540a0f6f409c74ffda8b8f1463103d4ee13025c3f9075a6d5aa1b9ba71a630521ea9bf46b89fe7aebce72219f897102375f4bfe54051ad2ace5b7f951451929874c3e83921a3c3b2703eba45bf5cfc4372290e53c7047f002d79a5540d1b949c68a41c3926bc468f7cc95c2d26c17d3a1e19f5d41c01afac8e74237acb946160c8e11269acada6485f803b11fc3db2a4e65648d2023bc89513c6301b125c690a806bcced71be550d9236aa47d227aa15a982df15453269740182ffdd86033b82de91820da715dc8b58ef369d7bcb06a08691201987232c713075dcc566df9ae1b17301304ad82030bbac2022108c2ecf2b615154b54fa8f4933e7a290c971fe6fe63b4600d15c8cb1d795316b2ba418ef2538aac7d9c9f36d853557fad01a52e50d94cd2b7de88c91fa5c7462aa945de05f28060d3223ad249c862642137cdbaa88a014d977328905644e72b26e12b9e0fe113cd18e520ac120e791dba480bc86ee1303b980333844b6b66978d842f0d0f3a1ba876a0dddeefc1e25da9f3b47ca3ebadc8fb26f0fde2b11344e1b5378c7d1cfb35f7319c139b18675a21e3d03018afd7c470a506e086d5b1fb4950e9da116464a09b4f024a73a9265e21530eaefb745fa374f58b3178103b79baf13e22f431799a67b38e7bbeb9971eb9138b2f02510de4a516a8cdbb3819c17d84e623dc8f02e3d4d591e43cc986827b31c1f4ac9f693986d4d37f629a28cadf61a47cc4a9c05cf1976187da25e334c61d72d8aeae92adbb6f66e2321cd346fca7a95b084e160ae9c58b8c2cfccb220c417fc5e0b657996941394835f0e49af7cee454af555ecffb4f0fc058c2a1bd82ff69206ad9663deb4b286948ae8773d70053b54113c5ef3739c1a3ea9487ce6fb4d78b624399d10deb164c28042415c96b2aa5f658939717b57545c30850cd8fceef11b7f0b40c68ca521ab8448cf05f2cf0078c3f09a9dfa00f8bec180b0c5d8e199a7e4cba060b80ccf0e2884682708e12a8d6f1c422ee8e1e48d6f6137c8b1b7c7f8b467c66c6765a799778666a131133e4956b74e902c3c250b1fb2a2249cda6b458e557ed9f1b6250365d6706897014a222d229947276421ae82cfcbe8ea4ffb785cc4c247a83ef28b0429caf82457cebbf8ae7aa477dae77b211d9b80138775295b3525a971efe0ca0d76788ed8a5f3994729bd26fdb50a28e4559618dd2c2d747850cbf7afa0ced4b9e5a9187f19559a36467698908c01c8bb193041bd992e0aa7bd5e6b55109828db0e9c0d3bff32596e872643d77a39cb39c94f90898ca33d1f0e466f5e8904376104ae8889d0c7e85fa6ab4869d0f6dbfd1e56cb119104ea4e9300b3430ce6c5cb510a523e6b55e4b31b934e418928c63e700346ee786c58be40d4e041c871134024d842288dbcb4501ffe5ba6a160e4c51090104525b132262ff668f92043571f18cc212a49f340925f62c19540fbc067bdd689931d8371b0f9c79aeb71da266087eb1975e7aba7580efcfa6b0db87bc71aa504f9ad3dcd826675dba104cf87be8a7a99c223d4da14f1697ec38406945a22957a168f299e71abfc852fa2ea1d7712cd8561f171967f4bacd2f4a65c544f6d49150493c0a3bb1401d0f06bca110baeb2baaa0f0297a5d3736c958b92098fefbea29b9410fd34e8b5e1faa3323e12c3a87f0ae24f46785f00a9afe7360a716343916be1c0f31363713d7a7e185e3ce422a2b731e4e7a6ff11f6dfdf3cbc5b5f3c5a5192d6171f64892093ba8341632fbac0cc53d0199fac8b0dad456b3c97e46928c20581087abe90baba55ae43ccb3570a7927f40534d69b24331f55c15d8dcfd51aa6d1fd0cb4e7397cdbd81dd033b3bfcec704a401c90cc1c737780b4d871c498350f0130ead6b77d69cc5437d8915c49502ec367aeeabcdaeb133a2fe697eb70eb0b4b2b1b6bbe9fae8996c2462bcc054d7730dc362aa02ae0ad7b051a72053df68663c0019b11431a56b05401a5e03fb930376adc673b88b3b25666088e240dc05a41fc5cf9496d11322a36070e2af04846246ae7a8e3cfa1959261b3efa95c23b15a520ee84f1e0d7682a44dbe84fdc40f6a4802514beb8e7e3d769384d3eb09fd805708ac77585ef77d3b688b0a83afd0f8c6df0f520326f63163f21736daf82182f0415c41b09f4ad8375ef04dc3fde81d12ac94a41ac89cde04318f401a3c931e81275ba9b0f1d7124b593919bf4a9320ec42280848329cf36fde08051aad7bc65fd6b8cc3ef3e5211777d24383200057b5a3e88303fc150a02170c5a08fe4f00edaf2937ab00cddffcbd8059f0700b914cfa5fbc2c0f2ce449f1d61f1b50a002544cc5a0e0f7cbe4a03f6dddb42723f9cbfe23a77b4d7859678181008c301071c140b6034dba8029e2baaf264cc17876914ae6c11ed099dff2e920fcff3dccfd815e76cd792c2f82581afb2f1dec9db0494ea2226ec0c39139b68e2e0e910ba435c1ab7d0494ce98c39766d42580fd75c701ca95b559d49c853037f68d1fb85f083ba46f91250461e771cdeeb17788f380dd2cc6ef8354d159810a133d88760b4ca4d5e5a33bb3c7b7b89ce837f25610ad6f8257db49b2fd7b8783e152e3a3e73cfa8b55b416bdfdf865f2df1928a210f639aed4f05ad423315ba14fcca1f9de6ae9ff437cd1d2e1943099ac99cae13cc28d1d440b04f759ef5adf7afffc4b784336d32205678285c36be5eba056e3f9b8f3e815991262a13d30c3e4ad072809cd491ad9795b79fd3f6b45bbf117b620a583c0bab8056cfcce46f2b32a1c395249c791faff484091b807f5655b7f1984fdbea4cd03b90c2c00856fdbb4de380e33e3adf50e9ee9880539a8226c1d6ea9433ed1ff2d33c2309e01c3951e2a5d57ec4b83a57e140db47dd5336739baf342a3303737c257fb79384c68a5566ddc46fd6f730dfb4cfe1ccbc8a1d3aa0d15afe726f62ae610aa72175f16b01396a9323f40e0fcbc0619adfd0a6dde2f001ac44e2521972f1fe908040fa1a3dd5d9ab20a0ffb4dcccac56d9af65b5a9100a39e7a28a127d25b2c7c4b2834d1172aa8f677aa595e6e36c8b8858b511fc61d29a400b48f33ea91583c59fd8f62ea385a5b0a1f226cf795c8150e212608a97e60954ace462fade074942ddcc84cac29b38c5e426b53117363b8f9d4d89bdd95b5ca7f76b83deb56fefc8aded3f3cb530e631893b4dba2f7d45ff1c256e7bef6c9e1f116fa43f4f492d8608bc3a3378c11b1fdf6fdc43ec93e5326c0584901264b0f6457c1242811ae61e80411f5b2c8e6801b913cecee26aa0746f959bd46eb350d6748e34b2b5c5c38d96f105ff4820aebb8e937be0c5da8d946756eecf6845a9e9bc5bc9793b108289a7a073e92b38907281265526162862ba7ee491114209cb8929fd1274f32d656cac6902191c4013009dfebac44060337c0b945d65e2a319522211af6ff4a8b6c6b58efb765250d731c84c725313fcbde74a31d00378b2f318954dc1b688d06b9f40b370496bb49d5510947caa90a63ec8969765a5c4bfe8e1cf10e0b28f0992d8c18ebe69fc58977918d610361848de4a980f3df61169e543cdfb0474a544dc5fd8c15f6427b84a72ce841e8f9ea8a39000eb41eadfd494ab687779a6234a56e255b50c1c9688c512ff98e5511b07b79eac68606a60a485e510dc7c6344800fa021c132abe1255a61b354b4b96d4b7805882df1488b633bff89c985ead385a1878f6236e00fef4a37764f4cebf4ad3cf0235ed153e75e286e38431c207832b9b1c301d0ab5f5c20b3560f84f844a5346fab5a134184c544343d4fc1a4e0325d88517547e631120c0cf2423124be4a474c4d99f80757ec8b6823cbb14a3ae342baa7fbfd7117830eceb8d854f5d604bb554f869d98252b25477dcf421007176dd6cfe2dd45c838b4700622420b563803f1f09c8c3e09024ccaaefc119f5c712335189840f7b175d49f0089517a96e4e01f6ba5538166505f682dada2508b2b923f30a2173db763f954da9aba282f6e622394adab72391d5d751ca7f92e22755159a25321416684329d5d38aab5e372dbbbb875298740d184a86ad27ec5de73501f15639628812cd90de321f99d5766354fd4fc4a40da256c6de27a0561530a4ecb33de2ae0cc9a2ce6f4b45ca546af1425fd73c26fa1ddd59c00e7e285c1593efeced7dbcc5c669e591b7a49edb154b05d0dc3e8cdc67b12cf9ca6f437a953e005eaf54d8faa70a912d97d1590a1b051c25659c0d94eabc4fe94c05d6614eb88d0b70b9875e7b6c8ea00b920d3502012d0bcbafec6d0e2a4ca86e92c6db272d3a54410eb2008aec9d474db03da5b82ac535a1722a6788832b15680137d4a1764d4c3eb3974c212c36a183470ed2f3cc2f2a154d73476134a795cd9240cbc2471515c089766e32e90f725fca22137d542b05ee611f1b1a2851936f89376c24c2ebf1fb1e928e92230ec648868c8553cbc4e5371bfb1f454c6a3669f1ec751b6d5a010fd920027bd55725934625104a79685638a50f67aedb9b7bc1e04258f6142656d8073b7216b39ccc11cf503e46772e85d194441885b63db2902d36554ab5ca3bbfe874c03252b99486c5210c5e5ea5aa863470841faa5e80a4c2f48486460600ebac33667a0383199574fea0e0515ea0c867c5ae3d9e9f840a0790a54a644f5d750b4094934b292cccac3534cfa3a4d2c24528aa61697bd3a67c4e0ef848354c8fb973a5b096ef2b1a02c192294b1df0a5309e36bfb59717009ddc546705f9029ca74b2e1019064001d4313b9e72c16c4c845c49d009985f6c52a9470b922ac34042bc4f358060edc0f2fa5928140d6e1bd86d707e7a9651bd554104d55017085dbbccf36cc4b59614da77811360e83b1f70ade21c929cc73d9fc59207228934adff20fea3f984e14450711214018ec6aaf147923af8b1769005dface3838f10f283fb16a3b49e50b126ea7a8ad3a799db572e791689093c1ac2521c503bc8e0811a28c063e6c0c60622ecdd940a2fc00692fd02c3ec39eed201bd69c49d11ede230b1ef11c17e8240dec82bd60919e5d2d2649e3b7941169123e5bcfe205b77d1c39868337c061d71d811dbd6a1b1022dc84b1ce5794c9ae044d2f13288c026825f6bad1c20a36f1ca93240b42f4066bc9ced6074bfff27d589354c28392552116a0fa300ce9dd5da2156c3ea10427c67b76808e1da139ffff6e51dcc5224b5d46d1cfb7dad706c9ece98b7daa9d0bd9775a4fad9c0526e479402b404cf1104838ca916094aac0c7d5fe3f4164ca347b51e65a4ff9afb5ba02d2280d9b7102844bfb207fc2694092f56b7545d430fba4de9dfcfc6166f81e00c3cb75da0e747fa16c8bb026f4e9632ecacb2440371a0fe630a43e77649b6b85f1fa9e10a8b87895b1355d65b18e965d44b3ee44d94726a7c7749ad5b4045db094a00f20c16668eca9963e56d2fe5be6854b9a843cf319f4e019c0864127ccaca228384202a52c1364863dd60dfca052d96f32fc502b01b8c921c196b4549b3df28073e7c34bffa04cf7502d8919cf488686bc3802f0133c0196ef26273753d9c7321e37fcafcbe49ea81504de5da81b1fd503bf70d6d6c4497a63907a2c8274d7a2ae78749b3fa02b9a5efeb5db3905602244dd8cd55806faa4ae6e2d3fdc10b80a80955a7e93b01e415018ba2c41033b08c0501ffc339ff832d8493be65e67a20c8a1f8f0a130f5ff5f9048197d7625bc58afd042c6c1b48c9d83cbc572aa7084974a307b70c3078e1a3f72bfbe08fdb63303461116dbfb5a26ad2c479a044a4fbbd77030bdf9b4b4ccc4b70410d4bfe3696f728947e779499303f901b3435d39b2b63635c6d9f386474c1660c029eae3d711625b6ecc36e0f93ddc58dd59eb8a6c2e5b56861fc18cad39327dece23886c4885e730c2bff865a7662b5ac8b8843c3d3d7bc888b1d31928b67adc378fa636bfda03a57563a75f9e71c0c67980f149c52badfdadd2d1c3075a2038eca3d138c853bdcad9e9e098cf93659966f0411094565a430bce1b67022ea3063ca2e7b89c44fa7ae59732d99d27e8ae619a5ebbd3d720df591c464783a70fe199697baf4f954fa518a8e553385b69a6901ad80e308a5a637b4a723a53352bed8fa325342a4afb2be23a65e410f1bd269733e62841ba183b78591ebeb89736caefa3353b15bb21d7c872fc305f608e5a2ccc7b8ea90149c2fcc51cee9b2b4a78f9c742f8e5308c28909451b4fccbe0421690eae0a131b21d2c97d73d1b494e7e042e4179d40f9300f1c2d4dc768c6d4fa7a145e0d49c9af073065f8d9e5986140a8283088be583ae728940ce9ad74e0abdbf68e22bb9c3b6e18ef659a722d5019b46f4fd1ec0d3c72159af9a5f8e99f541979f77e0a1195a933c19fa4b3c0d59d5de87517bbcc942d4b5754bae72f4ed5759496b57bfb5efe70c737bfcb1f2a83d3334962f284265ebdc39fdcd6a5c93df2c6a8f1b494b982aa33888b09af0d4443a8cdd3aef201eb5069c751392655666fb5dc7c0228c965c62009e87a4d7fcec7ced2d0e6edbfd91cded1c0832b4a2849c3383303bf00df82596502d8fe913cde5823298f74f4e7cc546686c03b5a4f42c41696cd35631a8e615f3868982ca787fdebd10d74583c3a0cbd931f3284cec5ce2930cfcf426fde59befbf61396e6cae8d6bec6381ef7defa6175998d0e08ee24898faf4d037ec499ef34728b983ca797ac654c52602927accb812f529affa6b92e9402c5e06b64be462c1785edd643405320c375efc3140bb52e2bfe56006e5a77fabee61049df5640603e920c3bbc411251af405b05ac13c76f5881dcdc9c1e4a08000ae59d1b375c715301a88dd521922b542da10296348d7ac3aced7fbd8853911d4d378e999ff199be34ac95f69fbe0f389b15009dd778706e7aeccf4f638f077353035f7a100b25ed4732eafda325d484a6bc26d48b275fbc752b821e03fda36ee37395ac4320fcfef1f103bd801626e3f9985dbfdc464dd86554c36b73a5f2818489080669fa49c21f3871c3a8ed2da0190437eed2f858b16014e3bff2ee048fa2f5a2e3cbfcdb649b0200d9b76f0096113d0a24e81af56a3fa6b7ce290d1234e2b4745699fa7f410b1678ebb49160b6c2ca2f7a5d56856bd3cdeeb6488dff870062fc1976641245e05514307462d3b0089cc5ff5656f1ecfd5801fef48f501753f3a77283ce620cea106bf31cef8fc50da715e771cc55a5b25ab23d792e7c3ca97dbd8166ca4229e324def9c28259811d382fed625e65ab52923401ace347c2b02feed1244769a313bd73c335cf523058d0c448f5b2faa46f67f1aa57e8abdc8507b17804c4e31e8bc3352a8bb8871a270c0c688f8c6a0c4f23a701f5da8bce0b876e83723c6833a086e7061f4ad1c938abc58dc196cccfa6942e35d4bdd6aea3b85a8da8a6ab26d379f8179e0994f53ae4134098373d8d4c7f2af1afa16db3637ddf68c920e31e2fdf3302ef679daf379473f98df6b330390ae7748f5e557a57e413f7003e633a2e518cf9cefe7980d535caaecf016619c6f24736f4ee9a6c70d945f891c4406b96e3576a1778f6c54ead961f3c04d2f985e3c1bb353342e1c775ef6fccf468019a1b1987192c27cb62b1d43be93abda6706a9f5ef919bda1ec89b22f6d2c1c4e2a13d06ece3810bf2285fb09a287dfa6cfee180c3aa6875bbb3b19a63c4305ba07f93a234a9032b4f9adea0d779e40d3031deef3411c55e534649409a2d821a03b368235bd0c2bbe5c9d3e15cc296887a88194569e2cafd479d684fa57108e7e7c694d4d46d57812700da7118ce6214a1b3294b80cd9ae662c9053cf18112bbe2008869d6cc33a7d916a9b95c098119e80786f6864251d8055343523aaaca4fac28f76d036da52ca22a3732e0d36fa4ec993877b1754f8448c73ab706d13a1f33d92dbe1aedde98ae3149a4d6c1fc5d0b124b00799e5cf61b83ce9bea5bf551f34ffe5665768d6631d6faa84278dd3facca96c48c177b5149ed58ef6dfd766f64d0ce49e1359128cb3019b7d1a083d2db3d27d822cf1fde02bc301360556a956bee858e27e3e2ea66e7e4083b8e3574e8c0b1f4948aec9280a8bc2a150cd9083a4f5bd21c446f21b339fac4f4408b44e3e60087afb5f38fe67786dbd416160993ca5e6f7b627e8f35d41383b216097e25b2ffba5e63fcfd4db54cc5140a1ee8e9662c1124dc92a759a6dab55ccdd34938c9445cae3d193242dca1ab49486fc3cac9a5d7ce971da42bafd6cea0e73320cc7794bcbb2994419f7bbd5a1a7118a90a13138142cf2b9a6195afaab12e7ea4112566056ef6ea529e03ade7f172129d831e916f17eeba36ad4e217ec9cc668ab18875b781ea358d4cbf93a38872dadaee70a94d980fd19d62905aa2f88150e860a2c8bbdf0cd2fd5e8ea2524d2e4d044c140bfc3ba1927250e2f92c990afeaca3f3a301ef70a051dd470992aab73a861e34770a1d61284b4392a3fa3c241062fc3194cf75239ba1f0ee5c74b33448094784960d9c48f8359a64ee04240772c36d19ba7d6e4aaee70930720d3da8c8aac553027636326dad9a5e9ba5051c666633df5745420bac768f5f995aac7caca81c83f27271ac19b361c78e9957829c26459a7e73017e6abf7fe3e05ec0627fe030271c7bb463cc7341478cef6e935b73a1785254c9f10021bd5573d65ca09cd36d95a8b34deebe88aaa912288473d59cf10ad5a913f6f84857c7c8b28eeb11640cef7e15eae73537e877f2c92e3d0fb02f0feec5f89754e1770adda273e505c9dd5fef32be098db418d0e43f6a316035e831676032b59383b5cf0f7e564f78f5cbce929f3eda712286cef1e196798b7784caa9ba6c5b12d5d7662789822287729605c375abe6c06f98b5c4d9c3cb94a6b1a8e90b2db117b7d39b68f0114cef714fb7d40bba39550c0ac74b603f84ff3f9c977b42d9081865876662a7169d559228d8237fb188bba5889cd3ddba60066f44fd11c9bddb92304069a31e5baa01c9cb571b3bfed3caa334f443590ee8fc0d07c8322109570f411d361187c87041b7b2ab9c0ea8f535c50b3beb0968f6c17530ad54f241ea3a42486a3e18acd89bb1840d7998af8f17b783c830ee80ee5ebec23a4df3e66f5c76dc57b3be02a9b4750d3b03d7735fe150d320da2efff6178b00dc52473b7beb67c66f0ebfcb4c6edd5b668e7140831b96e8a613dcdef94135cc31d7b8ec8c3f4eba375fef38b19a7c59d4b9be3fa37778c08afa07a9f3a02cb7be31e59cfd36c65a6b794359fbcb4364ab6ffb3f0ff55a86a40540f057f9734b0b4985affc6a9ed8073ed57d8b745f970e3170ac5d357e19b2cd7f57344ad37ced34692ba07108a13197773f02824756132e86ff5aa9f100be9a81dbe8cc75ec0f9fe2d70c9807dadc1fdeacee3cdc99fe5240845782540fcfc734ee67bc28a2745b1e014d7dfbf6f798ae5de86bb167fc8828a874e99ea237efc93ffb347c7cd652dd8e71c6109b956d6734b24a1ca720722acfbaa3fc392b9c99bb22551d4dc834da26d5af1650ddfd04871a1a45a08202f9b4858027b7f90eba55e00bf354bee41feff2fc02a90e6c17d2fb1afe9879c98036b1c99d6d61234723966e7c50047568bad0a67e64ba5ebb0f65f79ca5ded7babe7cb065a13c7252ce196eb60eaaffc726119941099c4cb4174056fa44c5fa2732994b332327e1192fb745d8ca4e5ddfb143f16426df63810bd1d9970d17bc0fd787b59154326ecdec4353884416fc409bd481a14bde7b43859e17cc7d3b03a8739a109c24819c030ded9da07843186cce0efe33748fec050403d5fec4665a760e5f51970a6c2a67fd091412ba992c968782ceca510a6a528f6d2ff1da8b4dae18e45a1c04a9fffdf1dd6e9bfa71ecc59a4eb21a1cad8c37c30b918699bdcdf5ff8f7a05520cd6a4bea454387e4142ce7d0f45f397ec4dd6114a479fc60a2db21089433997ceb3b6c8fec5b7543cfe96d76fcb97948de259fed2e41d266fb98423b4e0aa0c9481612a00409d815f65c44d8195d5a0f648103cc03bf4917d80df2308be0f0a32b10e133eb6076356ea485c9cfcdddbba5a4d87b6e6396c9a5b3b9d815b9aa0f4c090bb28046bdff41e177613d6536fc514b8cde949840f6ba99074f05731cfa31a1b650b6a6c5d40fa236b8b17170d373a7535c800884a70cfb36f63b5d2fd06413ac32cff22b1254ccd8d27269275be3876bd158d52fac16224cd6212dc0cc9b92c088183e73d488d9065dd31b5c2d333b56486c440f38c0955013ceed490ef8f064fbd96c07d086e2173deb364de42e0cb2039e517c01566bf9a8b743567fdb491a345727f7f8fb4560b152ccc0af269ee1b0ededb7f835baffc5ba8e942b2f15d2d93c37c09f011081085f57ad09e4eec02a7b24cfd792371a0e247605bcfebb8c01e9bb0c222fc2d39caf82cd2cdd70b4fc4b245891ae828d71d3015e323b9e85e614ba6da2be474fea8fcc0e47d1a28d4bbbf92e06c3cc31be697b25c7748ab0a39ae4d94c2b39f59c16de362864a1950838a8081e31c8845ec25713406cfeab7d7371042e50f2994528437c5527b337808d4c62152a0ddb1081642c9bcde59393ad5ef601a4df8f085625c64bf9985199deb21857c9bb24f7cddb8580c9d1da804112756d907fa0ff135d4bb366c7b1884c48a5be97d492a9a0e57450f72341d67e158e77ab6e3b264d49430e2bcd5f4f2e4efc8e1c2ab17737e0625e6c342ab08557c1a733889208b9e3fc4866b2fd1d3d588961955acc000a0eaa6ad228a2ee2cbae13f517262ec6f80b86819473a095f46008ae43e64d7a642d7624171aefd5dab5a92590d87720eee768a13157c382046ecf815fcf24904d94747bf120b8a7b5fceaf5ad9e96ac6a4e628db4d9f0b57efb10be3dd50d481b09eaf8fad3c8f793211b7292368e610e22d13f84a6546d84ec9d04fab1027def31275a2ebcafbfae1b2ebcf95fa88a640473dc74b08ccc73dc41edbea4dcaeec25c230d2d49a30178262a6331b83c6e177babe420707ce15e06c93657991be0d782d307e4635349f3db632b05d1b97128943c6754446ddf16f33968cf9161d9d2da18a12bef6ab924e76f36521909686cc6849c3c00d50ac5778ad83a031195c59756b6711208395cd7ef50d34595e0ba918d497444fd9a6d49230b9331752fc9a7e0e78f74ac8765c5d7545bb036be445fdd12c62eb9d5f2a5b31f68a2c6137efaafd8bf29a5759b059a1a4f642e4ef2791c74c42dbb585c1ddc84bd981bd8150f412eb90d9b9c5c6824ad65ba906e82b99f435b60e530075d4525751c3a388480e6f911d3790b03abd9c3370ef63a0fe6639fd2c2e7e01a9b2b42d0f6b7bd6489b4e53c4a42533cb151ab1e0049b13f8971000f089f83176c9d0da115be8796b9240374d71ec337e8a25ae0a8914fb3820007180e24beef4848051cbf5c4f91a1f602c3f92c46140e382ad3924bcdf504fd2221e95b2b0d5f6c221055b58c92058023aecf95533347f18716c207cd01cd239f8a051d401a060547328003c76de803b0b1ae420034d3ec3e9980f6ebe413064929b1551b376578133436dccc4d7691c6324114554e13281a390571c79a4954ebb90671741f7bb32d800e166d6821d18f386e26fc7085c522d630b0203ede8048704e7b83f8d41b6b7612a4cae9db7677520ae789e0e1182a4c873262a67a463e1536d6a232cfbef6c5567d894697e4fb3bac3cd03c99e004ba6de9388b98aa2899f940013f929d4956c6d33b6ff3f8135d7afbdf5ae33b7b706fd2f17828b2abef6316ae1611dd213a369cddf4646f442e983a784f97e8b5973aaaf6df17052b8af170b57b781a6f676f6dc58504605170e5fd3af9b2e6bedc1c01ed47623aa41f34e09acd8d7f4bb9e6eff7189d4d4115d36c8ec69e642db2dc777c4ed42d1c9da2932d24402ff329d9ac7ff4c5bba48306d29f541fee716bec9567560275c017255fb7b282b259fb9681363f1a4ddfaead4e878074dec7d29c70cf568ae653aeecc6e9b8f8df60ccf89977e6a974df0286f4bc01588661c90baf4ef5db52bd69b9bc80272eff4370bb9dcd928c9bb7d071ca6fa72510a48da077a7a67d2472318f8cf1e961b61b9267bd20b0c1c3fdf7757d2248fe8f47a7c9707022294c8d1f929265b2348e7eb046f4b804124e5c75578683f40a994513a85baf70c3eb2b3810951635c209353e3380209f1b55138b451aea0110833b6f03f48a158bcbff0aa4efde79d84aa7adbdc30c9a064c5e6a0411fbe3ab900f306c4517c1595ed2d19d65dbd9a1921384457a6e5106cf75394936c009b828889bfdc77debdfce58eb81e03a4bb27c6f6b563e0aa53fb58901b3cb9d2f541ba9920135859166c77c6a83179f6c4b211c7a4550a2e4c3bc19a7c3e8e08e88a16f6c5b06dfe591ba85ae3bcbd4058af8981634c298c0abf82d04212ac07d3c8ea0224c0c5567f3c014a45d001af9551357beda6a352fcff9a6b30b4f3d61fbae2f68a68599cf3cc02e5b2236bc614c814404d0f6ba26aa550f7b6ca9026e27c90a037a594e5ad2c0114b07cbcae3fe70fcc05504d0c7003dae5daca2a7bcc5954ac3a867e1d62683105ba80990c7b8613c4602885b7e8088d99618150f6ed84550479e7e3564788668596ad46f7b3dbf79387d6bc32fbd8140dc118fe1067966110454bdb4053671844f1631158b3229bf02ac83b825449b1682027589fa58df72fdf62ec2816ad7bca95d01a11f2e81eb0b2570ae8c3fab8367aae81acbc3dce7f86a44d441840bbe08d9c73c56a1931f62c0a62e5f06a99893739306f58898f760aceffd7cc3a0a6a8d186ff67c8dfbebb354fa8f2629a6c66c101f7b5049cb8f3db3d1ef1818fbe9d9f02a58b166b0ccd71f137ef3a9fd7116d2aa8b1cf4a9f5f3e7b743e0403e6ed2523a8f90beb0c18215c869b4affaac24f6fff3255f7e4abbe6e61508b49fa655bcdf2cf16e2aca3d667da7564c95cc3c607aecea24381bc3db9ee912937bc48139c0e4835176de219e2859da2d78b1376b51e19df17484a8a7d54fad91a5bd0e1646aa773c841ef9a8e8d900d6c61a7189167854a997274c0adc83e80671f915eb20f4ee7934856e202fb260ac34a12f9c6dca3fc60c725c181fcdab319503240829b44852736c202aad580c83e183bc49f06c91eb20f60172273064ee5674ef681dff94d7339a71cd7ad541ef9866576f241092b9c57c6455b6889063e200a065416f86d41ef921a3768331a20d4e09e067b213078cdc115d442e41f69a02cf2e059cdc19adcd0da6e488e06ae89c5c0227b36aa2ef21e0a3abc736d5a916b2483ccdb36f90db975a051e400437a782693b4bf0d50ff3e6e5443b4a001ca516d4b5940cca4950e6ac15c134800912245da0499ea965610dfdb334800ddc9aa821068069a4d866986a1f6c50c50f1340289cfe918b193e710a6baff575ad1d5291651738de5caff31a73a37f53d0b9bd9f8580921524ab9b79452067c04c504650454a490bcf4880cfd4ec0f514a46b8ade1d98899606583056e5c54803605cd321d26247aa97d65430eea549a954ca00e331b57536c78ff4ccc558e58a14a563a9552214d664ab0c8d95ae49bad4965eb03b1ea0b73c2a5f77516aa6081172a2d438b22165eec8883aa576a99daa492a9409284630d218ed88fac5e4c9d6ac12a9586a96fa8c46aad43462a54ed2a8b404cd93c25825a034c305c6b8142aed4a0b60244baf518474c6588ff64685e2a19146a51618e9d2a1f4c407301a4931305ad94aed8954c98ed991246889061e0d30a824172d430e2a4a1c94a82e13964d2ef502e618a3d6599a9672201a89bc78b343c0b4282049312cb19b6199380924222b23b9222dbda730161430acd85b52c275e368060f5a3a454a0a00a31101460ba5b6591c56e9f3f848afd2051877d21be3975165c939b02c9de8f4590c71b32f11db049b7a79fc5a9b70228d086c0c898a1b38a59012c29230ed50b19387539ec2201924470cc0589b8005e9f8310a5266d58c54372ba432b14f8e7032b31ebd7e0a509e7bccac472fa29eeefe73e140fd5ab5c698244992244b8ced9c9812c05fe25cc3ff6a5dfa1e97252e7da73dc327af1a97196b329fba87597e91583ad91d4775fc3f1dc42c563b6cd77a31182cd1f187706b728f9691281d3b318b57afe367d2cf1f3f5eba351a3f76aa1d926e0df031c658889f71fe2d5609efdc9a1054bbdec1fd96afc9f965d821aa5db7cff27c7833e6e9f85b4250ed3acba97b98fc8b980707dd1ace9fc7e7d6fcdc9a0cc5c2d92ffdf359bd4bfcb2bbc4b97cefbd34a79dd51b6b03621645d0efe328dee367023b0ff08cb5bb8fdbcce2dd6122ee5c1fdb9625fcba3751c49bff6d997e58a317fdbe5db27a3aece6eccfad09c14defa07c1f9ea0da21ff7dd2f77858e45f96ff01eefb7d7b97ef01b629126d917836b463f6eb12d7ea06fb1b601b6bf493744344142276ad649240f70ec82fb50fb3282493cc927c0b67a15c620d3eff07c76fff1deb3683b83356029a03b503de45a2f91e2e910338b534d846e841ed9031f00007b786bf3641dd60ff8e5ddfd70f829040053410621b1a962104347ffdc0a10730302360cf80af87fc03dc7dfc81bf61889b10fce48006db088977e6ea25b31e9910f5228dd6bf01884bb41ab8335683a1042a1045e2614c925a9721ca21079748d65a6bad356f708924884b24bf24f1df8d7b7e55a66892aff99bc0bdf7de34f92c7f24282b1fee5cda0083362daf75cbb0de9922b0de9972a62481fce21abf2a53b46721a86dbd83dfde7befbd776dab3edf59ac6dddf7b9da6926737fb1daf1cff6ec52f9596badb5d95a6badb5d6da6c977e38040f3c708937bdd6103c28d2740e4280d0e012875f5dd50ac4061a5c62791643d09d2481ae7fed108881e4ec12cca2cde9393939227ef91fe3d7424c5fc64064f27c02ef8f4df1ab3225599ac01b42b024c9f2c90ec8f2ac7f8b3b04b0df9e253f2180743ffb42bd1eb3be7ad1a5d7acb65e592690ed5981e9e15699eae117638ad00063d6aff94566ef0c1c300885420a40fcf6bec0e157eb9e40012528fbd845d46dd7324cf22275093dcd075d3fbd92bf1a9b77adb8d3795257e2ca49158e9eeafa857a5d3fccad21c172ae94e5a147466d3070345cd50b12779bafb5a4b5e40b8b30b5e8c41b0feded1a981f6b7b712d5bf06b960f186098faeb25d622b09743b3fff02f5b960c6026504049473dc2f9e897258308d84ab46f2bb1dcbd1c027b65890099599cd52c0d2e506d20804115db400306dcd42c101ad060835b13146240c341d8eb11ce45c7bd1ee146e84561f7018742dfc1a146f43612b9254fb8131a952f1e4aa8aa36d3d3ce594a8f741c0d4ea4052f61cacfb632c5841eb3c25bd0f11a50bcd4b658981ea2c551586d252821205a0e69ff28da5b437a6a057f21c5e82325074a1d2721451f9ba463fc04d79661640b21628489a7e041e546110c9d167416a5a74414126f779c0a8e8613a7b2b825db0d6bb798e23d42745e0fad65c4a564a02c984039c18540d9d955793be238915bd6d926e175220987a2aae1b4939476901c5133349590367b4bc1e2ad0457b13735b797de56a4e92db03d25ebaac88e213bc98f1e3ab4558d2917fbf84405477ac2a3abaee82555d0283c696d88d8a6dbd2b9d267517625701d3b76978dede4857602a4afb8a5fcc96d8412bba62924b06d36329e2e7d7564ab90e22382f01849ba088edd24c6ce2182ae6bf3e14a6d3afb099eae42851fdb82ccca986c22243d8e5a4993968f8d46c20d223e3402991314794ed03dbdad27b7cd9e701e68bce94ba329a95225f4046489d3388aa281a2c5ae63fbd9786c2698ac68313aae0365eb50630be341b434112bcd048ac3007287a48f98bc68cf997c881f01e9b7263d9aac89ce96cadb31e478d09b91da93580ed79523bc6a6adb68da724a1aea88f3d4d83e431b0e48dbadf54459d399914727b791ded6d4b8514c3f71491de126a67457139452dad11eaa5162880f01b252ebd16d6a3a7b843cfe23c797def697da2e22a6b3b838d0911c533a49d38ed2c63ae224d47832a4bf80b45e5a0f6791a6b371e4f5c87111de769b9ac613d3585c3bc5111353daad6984d208479bab069f31a4c380b415b49e5d029a0e9791c76fc869296f6a6a40627b8d6bff1cd16a53dc4613ffa1b4c78ebc6ae0183a02c4579cf51c9de9b8c8db44e436d89b0653d3706251cccdb56198fb88d191bb78120108141efb859194197acf452fd62c2350e7404cddebd1cce7ef8c3d9aedf47beff9bd46d93fdba064adb5a4b5d65a7bd3acb5765b73dbd3dc1b97d662b32c317965eabf33f67f955cf13b3ba85866d1c4bd0e83f7fe70091c9a25beb6962de559eb86a210a6dfbf46421c318b2182c1b27bc9b22c7bce9fcf21f00887558ef1f4f2f1ff30c6bc9327deb1a1418006a47dce65d62395ae5ea4b9a1397a1d8f5e497c89598f5f5d1c1850c434371c2e91ac49bf18fabdf7399c375c667986c424c7781419572fcae829e655a7b9b935b584f9d2eb916c47f7f57a242bea452139823311fba9605ac623abb894b443ea940b8b57ef2cd5933a854a6a29303ac0687dae20d9c04b79581264a46aa9021260244b8315088d9a6b6dce07d58a1631cea46ef8e0d69ec080f2da61a527ca5c2a63947a154ed2b434674b49aba4023000018c6569070a46200fb05f6e6316cd1e99c35a925e7115496d8c51ccec0ab130bb57f5acc055364b44a5d6d548d752af247729578f94fce5ad1e241b60b048f1a2a192e84a6b9e892be905e31b2ec1ded55633fb310cd197478f57acfa05311f1ca230a711031c0d310ff32e433486e5633ec3fb329cc6169c0afee54431bccbebcff0c221fa41f425f830df32445b3e781a310e4ac1bb3c1fa230131ea6e57d4f0ed196dfc7f84e230c0eeafb0cff721a8338e80b6a61efcff0f705b53868f061dec269cc3868cbc77c791a29e0a016dee52f0c51e2697cc141cb7fb1e034cae0a0c27779013c7088527898cfc08ff900e4cff0e610957979fc7fe15df8ff0fdf0e5100980ff3a7cbc79c283f51f3d1098f527834f815de6871627ec83fc3896678a3c5f913b58fde47f1a325faf2f231fad1fda8eff9dbd730442b3ccc89be5c7894824731bcf08d1627c389fe1e053ecaf2a8cb05c31344750c420a2e0c4b8067ea5b185a223cb3f10c0d9e3187d6c8bce100cfd026f1a1073c537f0f39f829493cf440a8be087b8299bb71e42fdbfa7dd2e2c8c93f5c3eb6eb1793792fa7ebd7b81c5aab5e592660af2ecb04f069b1f2902c7f14b86f592c90d341b05975037e7c165922504f6b65b56a07dbe5acd5ad29e2cfd6feacb5d65a13f4fcf9efb5eaf7cbf2ef718fa9137b3deefde89d75fda41e5cb7561d4f209726e898c4b5030818dfda01847b6ded0082ad1bf68350eb86fdb56ed0af3f304127bffeb6569ddcfb2ac9d36259f972ccfa56ab76005e160a58ab8e4f6b8565b5ea86fa255ad69aebed1bbb9b2bb757ee95f8ce37a5bb9c1521f511afed88d78599f8f0d5ca3bb2f3b870069c78e6f48a80d69e7070cf59cf131ad9942e257ccfac47bce3310f485e522fca7423bffac30dec8b733f4fa85f1a10641b3b265e57b7dd989d157efc831f0bdd9a02102de9f871d1ad61e9f8b1515ac78f75e0255277f2d4ddfecdba5ff649aa02ce1d045d6a4635f296e6468c40ca5996932857494ab859253035395d1b7d2ccbb323209601c425b04f3d135ee01b0fc73b129c855781c28f76742c1c8836a72e495d542f127989dfd0247f5f2567b08a0985812759423955967c70e1e0209f63591a09279cd4c0c14a3a7e183378ac73c2c73aa71adcc9b6fdb73649b74f50385e0cb988b281a208a852a9a87a92435b988043823f1ceb747029245796b04a0fcdb52e62d941a6ae62fce52a3ab9ac03926f408ce9cc80745c7453265d901d56e6a86badcfe23e43c874ade9887e403a16be1fdd09eed365264baf47ba1c3d67fa7a3dce55e945212f324b2a6866b64c7e25046a9407e1a59a400a3fccccbd1ee7a03c601be10984df7d166ddd668eaeb506ea391b5debffda61c360d085c227b2f47a947bea451abc187a6e05d00452e8f53897539ab8c999851c0072d6f985297a7e18b0a09e73d639e32b47d78b32514ddb871c5cd74ddc76e4d2e4be7a4baf47392347b91d1ce6c57776f8805837dc27561306c4ef7d2f02a7be8c0c7f1919994bb47f8930577f0676fd65fe601e0acd4c603787555f4c83c806cc7a89b55620ef05fe06cc63dc6500959c1010c8cff64ac67d71b160902465f464b8585c9b1561633ec5b48fdf7e07f8b4d65adb625dacd18fec80cc0d37d381d1244789a41f469c685859d9a163125524742bd4664f68715b3d706e4bb0889e639e1b09bc274a534f7c76582080112501865e53dd93796fe5a197b4934d0bb45bb75499f7e618953949e60552849092195a6d4c2cc282884851b22549a4e0ad81b941f9d55d20aba9235456016b1c9d541a1317762ab670f21d511518550cb834216d3b8455c01c1733db6c71314ce65ca6207f3a419a44d9af07066343c1d2174633242746aa98015029622604ab89edae86e13360ce3967a088241f3774de96a2f27870f201f470ec0db5b9285ac2c96c762ab89d0b9304ea8c47f20081bae6a950e2445437e453865336e9e511562fab8ec82c60cb7152a1a388d4d00abaafb2e4402099b389601aaad3c27476b3267e5cf098c4e8c29858b889ad15e9a1d370f383c894d7ddd10851789eec99c43edf092877a69e98db27f44c143bc2afa0a6a5507bb186c4888b9e0d394c84f4d664a4b9a9fdf8903f3f156012655acf886d8273205067a4162de5933176e5fcc351dbde26b2767274fd0c85454143ca61413a019cd1c3458c9cb09e278b424aed298b282ee53aabba1224c5ad045d1c0e1c3d5067c1bcb66d73ced9e76bc33375fb72f6115d2057950e8db29c73ce39e72c55662065e61cc4a3e7ac73a63ad1736ec9a50e8c1c852667ace6a47654c332d5ba846a63afb646a4f16d1d0746069f885896fde432a15c4694cb8c3e94253dd1a7e3a24a9f595c157ea50208ba924cb9d09ab273dc009ed49524624d503f3f3f82462411b237a50958994e8f280850c3926bab22b1c24709bc40126218c8cea08e099f71b5e0fc3bbf998f3d679c7306e617bb2c84c8684491386a521630005c2e4878212161cfc65811142368a022246847e9ca16118bac2309cfd40dc209cf111f3e56562c11a3c146d278d252bd4a00d11982248553908d39e7c9c233751f40e78426d182dc32af44659f850f773c180331619f8b0620394684b1a8fa8114c633a4976f20e4e0c091d699607a72f5e1ca6cf1ba3ec70f3e58b9d6d178b1755547e544d705fba9c23f3e8220e4e8d460d0dd88bbc2e1b68e90cfa733f06756a4a7850e2650328cbe8a9ca832743ad68db8623b2341cfd8f201cf682b4361417599555445bda4a186cff2dc59f001338ef81c7984f6b670ca3c2f222f96e4b854705daf2abba51f50535067e0ff3cec0849cb1197c323c529991449e9867b4993a93cbdabb1229d01d80fd0cac77d3e1f091e3c533bf7e5f76d9d7f7860a01ce0929c75ce39af30dac30cd2c47eaed054dc99dd2549542b9a7a7e191435a5ed1ba8bcc1e0721a92e2054e5e6157e21f2ed3b779de3e5f145c8eb2cbd9bcbf0b70ac3a82ddad8140f19627d3b669f198119ea9bb8a0caa08de363dd22698b0c1214dec7c04d16ab1d575c10f256c41ae8c5d5324db1a1b94128ea5ca6d0f68feed9cfbec0c9c82cc0f545c77527a3ee4d0db430e27f9b44c5d3922d5651931fb4173e12336e756acf04ced7b974858d9579e7bab6a0faedf94a516c2e4b31842c67c322b556a447467aad14e329984516f45fc809675676a2fd2dc706059c629e9255510b9f5562fa948c0e825551c956fc48f2eaa371b2cc8509cf237b6f9c00d1faba35b5ae2ca841db352a54c25d2efb10d0c895fac8fcf9c2e2d1a8032c10a14843117867fc159dcfd82bfc317e25bf001f8720873a219ce133dff5f0f2b38d1fcc4dfc39913bde5cffc6f2873a232ff007896a18613fd0943019c687e0bdec2701873a2018f8da8840adc0f52869049340000800023180000100c0c0592288892140935df14800851d06c805c3c1e208b226128140ac4400803310c82300003300c840018447214d3811f337c59fd294175cd6ecc82680f2b78e8796fb3029a0178d3865d357691fa42ea464a261d9331887e6dec5bf7056bef8378f90271a56cc9e06d0361e384dda1a26702da1c850f5fb8f89fa4d4ef176557d3e4e69f6449b6c3379871a46b8881b966f1743f2f5bedaa3e63e58eea295cf3a108b6619bfe879693accd052a7c763240d831c1201b6fae80abaa758f2adecc3cec696c781e88b72bd8a6220a88ef24fafb12c67e3ab8d7ea76e04e631b8438af13a6fa51fdf5389feabb41b6528ccc20ebbd381f640a1b2965933255ed52ea1db19b3ecb0a1ec571ee9c4abf4c103a8b3133218a9fd00513034949480daf0e2e79a7d0c9b336ea181cffc436c7a1e7e58ef071fdf6a931126feac480b28710fb924ee3eaaa448da79ccfbcc81677b5d4883559978ec12965cbdcdf5ce8842e9cd0c12363fea8f83c0922fc0920a17dbdca3ad64dd7c289b9d29c86bebb5da386b2fba8240c28efd9a289280cc1700b8f0df92b6f9280b7cb356ee8c004b183bf8619e81e4148b0fe6b7d160918efdcdca11881cb5530c075e19c1bc700010595960b09a08f318e6204701f44d02e4ee14bdfe150b223c8e4a250e680c2c2fc74c66df1ee25d2d8fb3657b25a822395bf795cd6b6c78fbbac9249b5a51ef500b91b93220bbad3b4fadf2ce266a33aa8ae1bab4bc153818df282fc3b384bcc5a71d874d3a7ed6331f941a7333cd2b983e9ae233a36d69c76a1b6a5abe874c194e72c5796dc9950c031f095f23982a298344df43871361629dd2c57234d884856b4b1c90defeb6c85b43808f848767803bd105ce22b0bc8eacf04781983aaa98722329c505e772debc30dbd23d0a739f4275d958c32a699435332a7ac3ec1c2d0153eee53bf0689ee6420c72e135c18c95b11e8f27204923dfe0ca2916a7acbcb5986d050872dc0ff0bed4b2c84970725108e068ebd15312d7568944bca4bd3f7d075c2ad70b1f9adf8995aaea018948962123e042dcf38c604826ed7c951d690ba777f8248f35b56db8e950b6b63a0222ae17dbb5a05c24e8af1206f10bcda5e94ef5f5e7bb28b778ed7048599586d9e4956a5b0f06a0998935eedc1d4924a3dda6c8a476593270c8490ec4aa22c89af6ad62a5abda2f6bde82ae8027c3c929632370d2641ec180fa3d989c74e01953aaa5c9e842816f1d901a912da7ed4b68958f2dabf24ea95ed93bc427f81ee36a506b57ed8377319b6cc7cee7b64593c69026b89e9eec9fcc2187c321015d505cb064e48e318dd82e71d6063f8c55e4c127fa11c8244d17108f252861489cb3d3a75e4d817ddf923f5a9d0b2232868fa0768049726629b3e27cea0b5e6a00ef005faaf22315b480aa60420c34687f2c1e9b560f221761942944f15322c168a0e4b945f7648e777b3a93039f4743a742c489c3910d5d9ae95ade024118bfc2cc55b4479ca106c3a22423048ecaf95ce378efeb9e31facc48d760ae0260ccd5b93967fda50d2e4ecdc6a164ee1c55ffa4178c57e401dcb2beb5f57276060e33849097c95e027919081d3c91864e58d1f2ccfae665af3d26be254a12b45c821e010a81f8f757318407e91ceec950cc683eda14ed53bede129c7a5604ca809221ed106d414fa9714ed5ada922a8afc0e4cecf6ec86c712b349cf1d0c4d627c7db77b474ba13e21fbddc7468859e10e62da083ce052075bbcfc0a8a195aab8afb0e974eb498c3d16bcc9f1f415b7e4f6238cb9c241b826efbe77026854b03f1461d82788b40db6db087a951290740621bc559b558a51dfea8de946e98408a4f2d353bde10c00049091862c09e1dfff527fc391b8a0bcfcc10f3c6924d10cab59b2394acdca5d71094618f8710aaf5c197d57daaa1b276961cb92614917e4f6c0185ff158abc76ea9bb6651357f67b7945a9a894c31ddd9ad00d4e029eadccfd164697c19765b4742b20d3c05ee325a6f4b155b0d979850e971a7f575ae114867d46009ff858bc5268bdd7ab1bbe641c8457064bb2eb2acaa2f6b098c5a26d841ef233fe1a0d79e9bb1f9cdc58f26197a0fe57abbde795fb09f3f30562d1d80fc9a0ab4da761833abca9f513fd5cf289f2b350a6e0eff4e0b682ba8bb21461a5254af61cca08f73aae01367cc4222a183b6400dbd8de6221dcbf6c2f7949a3a175f0a653bd1600b0dac0fc61160522880e57c4d1b9a373c9e28b9e8e5e59e7270d05ca18b1c08b5f83589a2e43c0e2a462b4001fbf1b5244483ccea19f97b9267db897ab9e62ac45b972533de4b1a75deec25a59a648d1965d5a3101ca9fb8448138a38114d5aacbc1e6ad9c12a264536d4df326b7e35dd74bb03d450b8972a17f86d4c3f4030cbe2584dd80b33783b529c64421d32212d559a0c99be25a591915b1ff90442367b8094aeeb3715cc2f233bd1ca28dd740d14725a8ab71c23030dc3ce1109947c66e7f023970e7523c62540fd17f5cd9180294d88b4b02dfaf844aa45f758f590e1bfa80a47e5e7f3f67b001dbe7b3351ffabcb22121b2dbd5fdd256c7555e5e1c8291a604724def57eeb60b2cdd2e0574359820a3dd10daa73afaabd24c7df177b4a888111e9c93a0e6de030e342cbdeb949e061980f1ed2cfc1060443957cbd4832ce39785f834cb39bc87ba670d8aa3d0eec2205f28eba8c9de0c0fd3e2c8cff916b3d232a29cb8c9b7437e87a2d41b4310d6767134a1169ffa9ca6e2dba242d6716d5a744800f8f6eee566e01b62c0db8d3f81d8ecad39532b77304554d317ae2b5fe8dcb7b00f684efac2d9695e5cbcd131fce7573c7c32c7d097e93602063e16d1dfe081b5df5112957c4983d01774d2be74e8b232fc82b704133f80ab8caf87f334e94be1713016c8d3fe405f96f5f325b1724e8a52cd10ba275f8c7dd317173ae0c04efa52c8a74aee612399ab92495f2c371840df5cd897b97dab5e647ed5971d9e7c99445ff088b6f295bed88be393bef6e5c50df7ef4ff40511d926be2f275fbc16d97c29e697c697c13d4123ec40538ebe683ee09cd27395b3f42555982ee3ceb6d217d39f256f628ec7fdb0a4a609645e78be58398ebea8502c7da173e3bc08f73065664f8f8b5f2d63a6a3bd2e83a99ae54d07e41c3a89f7a4471546fa9ecbbaf5091e8cb7ed1d79d6cd9c99a0e303cae71a8e0b342c1e4f159195c4528223c9e993f243b07c1b4097b9bbb1df29563472c619c9618adb3f7281fa199cc49a7ab1e9380c63ecb9a67c7ad1cc6d08104450c3a9351032bb728096da79bbea4b926a5c2e85c1295b7a4acac9d4f883a5fa12e51e5ee9d9f987def1153c9b03cb63bac91fceef65cad7b540f06cb5917cb3e7609742873cf704560466b6b1e298b76be1ce83e40139fb055d3f0351701f54787c7d7dda475622d0c99b2cef1cef643cb9ef9e5397a1929f75da3c538a91daddb31c2828a4ed9b011c13e9d0617116722cd1765377314a2dc0349f87a7d14fbfa75e17d8a076bdf4e5741ca533251a2bb6d2a8037ab0e4e5e08b1c4272c28d85ff281de1a05ba4b2e83a0288d324d4494569e43059ac083cc94037fef33668e30414ca61644a39443872ebb4a654671872e37dacc614e2216e65642cb492bb825802a68987b707929eba7549282476b9f49b008e23a1ea5401ab7e47561af5081a2b5b30ae619caca36159e9d147a34e3e8d120ae1eb31e2e86844169a5c824feb0e0bf7242967c9ada403930626393ba34ba64dbeaf7bba33217d92fc263c51ed48212c783a58357a55acad831ade930579283415acc759716681b79740a4de44f92f46e4e7401be17868c4cf43e60abc91f8abc51804437b3857e0bdf5b10a322007faec0b80cb625f377f894db015582bbaba3735491bfa4507fae5fc4a831fd479f0757d5f330701ebf27897f450698939e300627762f20f0e02608a741adb64fc5535305039192406b9c84910a9da31a08da141cdd8aa4792c27e1dbbe5d9c279dc9e271a0fcbd0297516f6ec1a5453db7533d5d234e036d41fd739224ab4a5b38dcb1972bd376df9b1cf1f89387b771d95ede460966dc2dbbe359173b0533bf49d83cec102791c9ccf648149ea8b075985eeb6e959f7de76ded373b0e6c0c58349cf96307fb7cca2662d17229f8311424e33020a62f6a1836dac67259c6ff64f40078bf835963d97cb45ea5e435d8b48ca6ae4afe72de3aee760d1261860b15700356763879d833538a2cd8288f9e9194bb91743af272c4f43ee4a964c70205ecedaed6385fecf200df9fead7330f2d06269b8c27378cbaf471b529b5812818b7c07802592b249ea4490b1b1782c290f980d643e662df97a9d3a59f22a4a13021b860a98824118730833b806f2d86e8425b2f54d0836e79bb04ad78b68168ed10529d708616b21b3c003bafe3ad563a27103378632dec68d4c23842eefcc7207749a41af4b8173ce42f427045b559edfc90e8570519a693a0fc3979394f5695ab04500aae5b86209a24e7ebcd2688402b084111b223ca1cf5c003a4804321044e50fc3fa206cbc07a3a28c47ba78be95a9d019017436c7bef34efe34b78c3333efdde1a7a3b00d5af2dbce70bf079312ae3a3d48a3023accdf34797b8756e4efe0dc192701446893871e622684c8d17c8efdaa3f6e9aa6fe7c73937516ce3cb71a7b3fefdddf6eef9810687f6a8023a6acb93684f08fa19f57b163615530bcdbeea408e8beb789ee03fa9e16febf4ff2ff46c7fc554924701d7e880ce8a6c5625c8f47d1f92df1acb08bfaddc7647128b958f186ad250784d59431ae20e7d070178fb9057f783a659d3e8359e67302af96508fe37607491edc95a6f5126f07ba01b771f19715f804ef2916c98df238c7090aa638230767cadd0c92c3d53fa00a532b1b7e57fdfba8857867ac0c148cf63a2e7fc0c692a938162fc94af107870c696a4907dc6ba716b0951c9cb6323ce894b25381ee1515c6853cba203dc02aa9037f2022129a720fd2e2bfd4238a9213c477a674840b1f1ccc4460a2533f7a709a82b5c13dfcebd6a3f9b75855a292cac0138234e79495a54b4e6896451515459233653d032aacdf1ab400166b0495f66f82157181efae89d924472db44e74249f062358b7e8d50fdefbc57e6af61c5922ee9765e889e093b5ae023dfd9b876923ae9992e22dd68fa6f06b9c23410039d0977b8f4f2101c5847b09c4b337eaf17e140440aad31a19fe07adb486f30cfa78892b8e19b1073d17676ec5642cee0c648b41c55940c49a036c36a0221be2251c16f7210f67c5133f068e3884b61fcf856d86a2c055e8a2b6909fa81195e25cb5f091402a6a0cc54b9b0c2994e98a35f361bd2e25cb653e2d57598aafa6152231700bbb39795742c48fcd9cf9a71ad875601af9edce5b4fb047f5d41a26004f3d10e44b61f815ecc9d3b63da7ba54d43d1bcc9e7348e1c80c9c6e060378f33499d92ff8626d6fdf5478c0e6a7dfaf14e9bb821d271182011009b2d011977bfab24587492e445fcd79e9f4d477d9d748e187f5a1c7421f9f51a4686f95dfcc2ac071c9aad2f797c2b339b87c61e8e5d9fbf9fe271a260a1513222c0759449417440085522b3d5f90b8be55000d0dea24b7dc8fd219d432235248fa15192840e98a2c7fd2552401ca012ad4004a8715f4cf42c645efe3954c7952c20b4dda3803ac723e0446e04fa1c860f631725eaa5ce0a4aed0c5f70106e10613326491f207c6a37265e210b4552c30c5ce9e36b2c4b3dada519cc6823ac53fc77d9c504e7b616f482ff76658041f1d16e848a1c4da4675c229b28e65ceb6b2331e66e680650fb757a0bbc513b1ab4f7880121b054d2e15d23b94425fde0efdd38a58bc6a1518e69316986688e57fc6f141e2b80513989249df2a13a745149cf3b3f4343cba7ce665f428c059fe7f9e75971d75a8580dbcb0f39e182afd51b702591b602046141a0ce96f5f5d991672c4929855a83ed888b3d60440ef423c32095ec7bb7129df56157b8e300758c1b4e2f04cc58162526be5d95e8805650d8b0c8ba9f2e6efac18c191342601751d0d55f7b0c2998ba9e2d752356a9df9f999cb0a5a103cbc8949e7b4fdb2db3fd616f633ef3364e27ed35f006f0b6dc49f62007e901e1cafbe24a17f05e6eac3d9f67687b01db5d59c4efb83c96a869e14a87d08596d3d40ffa93edc940815a5a547b8f5acbe1ef8d1feeac4f198ec72d41562e344ba46f759721630cdbc01605140c9ce3364046ceeb8c5bd2ecaa616a0fb873b0aa0d371ee14ef5fc1762814ec3de0fd510d102fa18e0f6227c1b63c5d5a3d4b522a36e8b4abf93f6051028c6102277cf60db339b779a70f6df0146f4ebefef5914d355635594897fabaa288efb2ffd4b0c73ad12e0d10ff3b080f0a664446fb3b9101b747658174ff4d326155bc372ea5d2d164511f8183d2ddb78efc559d2fb02e61bc9ca6aeb1e137452f2116c7bb6f09efd91975c6ea43347736d25074b5d97b90ce80a0545a61368c56c626478db9de69291d9b55e6d6f1e9b1ac94adb0de3c90ce35fb379d3506dc9611fa7f434686d5b7fb24fecf9a42c194024c0f44d9bbfa863caba415a815b532df2ee2e41509a438dc7d8bf2efde568e2f7030e611d704b0d6505a26d58f52c22e6b44dc6a1d0f66aa3000edca353adef41c64420528ee3ec2acfdba7b18bebb6284d21869aae1db3a554af15db4afd1dd547205709c5d5b010879eae127dbcbc49a3e07e614834f560e6c2baffe3d0dd655334687238da52d1c95705987e7162b19f743f6a22037ef338dea4f167955e9071affb04e3f477cc964e0a77f2a17dd356441c1e6b011b1f288043ec2e25d57e3a42b6e2f1591949599008a7745f2f846d426e0bbd6ba822238b7ee58971642d7e4b91f5ed9896b7150914356026ef2e01d943ecd209bd0fbc24fb111859644b606ff80693642daeed2d3094dd57524a104136054f98bde0997c2fbdbf872a797b565bdc68843ae27b8882894207be81d00d8efa725144a7f10e79909e75858491c8369ccd4b5ee7b084a3bd19730ee146be0eee9548336084462eeea686d1a953f1c3aa4c01bf559307eec14ae5d2165945b1dd1be03df113585013918463105b9bb062bf6f5cc04e614c86f4d2170d27a046446b0bf565ca7e51135e6196297626eb7178c722064521f63345ad99de607d95f26c19e698ca5963bfab831a88e3aef2d48daf6cdbb79d6b121d4b03d4b134fb9d2ad950ebbf8500a71413f29837e2a9c3c2e7a406e1758e530d5bad89c8e463d1e82ee5f3967ed1baab088cfe8914e9817c65526ffa1327ba8287ad550eaa492ca3938c74253610e218e15ad074dc4f6706204acb297500896c59ee8e134ad33e38888bb8fa2471845205d3aa8f95996313e227fb68c5c3f66224fff4410b198ad507ec0cbb76fa6545ea87228fab06816165619bb683621f3168f948140de2299c50554ff3c6f512de6618cac6b59996aca4c8010a0b1857139594b2a150dafd06b498dc4370eb73c16729b4839ee83df15d02d714d4063b4798a37dc6f90d65995a645cc591d3dc571104522eaee2e54ee48ad260cab721d8cb13ec4dfe9f6e2b74c460768cc3dc59629829988cd2b031521bd804dca8d4ed0575996f82fe2b2d161f0680fc1ccffeeb371d38b84f022d011f411e8ff7a50de24b67535914f631e6e1dcae9411e82e301cd035d073f42d50351203cf85d9dfaf681c3d91593d220740dad39840d828b20568419342e233371601ec22e545d1eb09270174009fcc061e95abb1d7976dd579c0f1cd4272f66472f321cb9ca55b5d255723d776e941e9d5781712c424f0417c3cb21e60ab6f88102413f049fa82e0636933057c06207af44a8d38f8b7983a1ddd556ffe0d10f1cd8ae511924b5ae7d917ae040e10218fc60f9818750455872e0e7a08ab044301f41925457d060107a812083df255d39b4b91ad647487fc0228c107007ee847a077a040fa1dac1f2030f81fac12f23ccf0775567d5c2e66a8c87003484e460bb56a623387119957308abdf41fe818b5043d021f807d5080b040f81f215acd881e2e04fd00a04462e5df6ca8c603e427d555c1e5c0e7157d0e207ca08eeda4944f119b16d6295ece0b5070e0e57cf5a08714250b2e3aa4c39e05c5996234410cc08c7233c8474456b25795d6d5defc001cd85647ba0ba9c6c262bae4b6a61a8b88c5c0e55d792eca1ca55a22a1e0083e093c8e531f01e684876d5aa12423c081b68ae8a9bd5f02e40054350207c08542fb0a2d88186a5eb7e9d11ca5756124544732c8249018d20f09a8e2b8341ed541bea8f670b2236f32202e1c9af455732333bc286878b67c43e2f234559aeadd7ee5238a81c28bf6c7646a81f842aa7ea6a409984bb02a998074b041f8172b00c617d84872ad7020dc9b8ab825632e6eaa07288b9161001942ee335a781ab312643beab32e580770dc61e702ec49a0cb9aecdda5af0aeace107178da0c1ec9ad48083da20c4e070f10a59070e67574c6d83c0b5836672ee1aa1212977b1a01ce65c31b09e642e129483cc2530922bf738a7382f187c5d5ecae301e2c04d6a0f2c20774e2e94fe620f1bd7ea4c83ca559d7260770d630fbc2e640d865e57a37a07953e7060bb506d326cbb765f0e2a1767c44288b4996b7209113608cec1158cd4e969ec140023250b653b02d00417cc60078a16fa630e12a49603b16b6a3f44a8ba37e5ae17d57d3635d125292a74e0b0711d6c42f0102a07cbc845221808bc70a169219cfb62460daa612e4f791010080f043a07fb03fda5e02adcbb2cd1a0b8050e687092cc36fc5c5fcb0781a72497ab9543931082a37193ac9b21ad0bf64a8695abb35a1e9c3a101ee101c4352cab8af4d2ff48d99065a5a0f862397bb8b9e2681accaebd9583a90bed86587c4638dcb36a44d6e266d4a1b6e462516a2f003bd742f5b462ce8fc25bae8d15d956fa55e463bce16927b03ff1d834bbf985546c67704f22c4d520d8f6cad0e9524353e96200a961df765c923503f6ababcc94c13406bf51b4c8810631add7b84321b095343b441733016902d9ca4f01f195011904c0fab04d45a3f37c57d3aa1a59b1f9947375eb6d7a33729f2243d34694c08fc642f88f0b29a8616958bbbaaa857046e011e008688406618c80f7c041a87fb0ffc0f7a0ea412bbd1eec6694ed9c9ff4d3ee809b4fc8227f02222b702fd456e46713443800ad3719b70b5a69e0351ecb44b3daf7e99488ae39b84c8feb4965aed2531812d132bd7e68b7587c8a18451a7f033f116ffa5fc60d3f2ff9f215d234a52de633008e964f12f6f76673cae838fd790da311185ca4329c5da2ef86dee7ee06ed696f828dd0220e12dd0ae1ef376f0f112df6fbe145e97ce99a4727cb6fa28a5fad78469257347e79c5d53ea0eff2eee213ab156fc4254cb24db0931162ba02bee6a2fb9e92f0359e446a67571d13a62444f8b2180f440264ee2c85013da22fe0304e1aafd510804dd3b9511607fe668e58ce186457ee6fc6f4ace894e1465dcbb85a045eabc757ae4634110ac8535df449278ade446682da8ef98d4b4cf39983574403ed271ea3b0c563943420e03819e3d18c9f2234253089ad8c6ba30ea79993688b64302d58c37e6e4a4b4f54453f64daf85a2524f8af1c3fd5f3bad5777e3497c56dd80de9f357f958da0b6c3913ad49a9a7186de95b8da36e23026fac12786b70d3824aad92e9729daa1d0340871a22e72bca913ee6e87366496cc3b7ea4dc9b55141f015b70590737876c438c5ccd6e96ece6ae87201d81f507b2e3d18a858e4630701f4946ed6c81f574d2b6ad5477a1792975dd6c193d5b5aeee41d159638ced2451dada916d9ad28566e58627e29aebf9c6b45cc2e2af7df279d91e266792e28a9e2d076adb9eca3344b1470af66054631c8a402ac2050875c09365f14794609a2d99a7c5bda70567e0a343ce7d2f5359baeffe1b73b3d9a46ce28d0d59132d4fcaddb03c1b862f2705b30c4e5a85da52551e32259ad93d1c5ff6e26f528fc2cc7ab800a6c22424e721928d0c4f8066d76b68e97068b29eed399cc9a279f526b8f80d30882bc1d1c710782398b77b6ee56e97c25456f24ea718891967b46ab4ffac4eabac6d3586f65b466046403888df0be0e22ec74958970ea9323289c72c8717507a4b8f920cbf16cd56197026c190253be2a541c57e632386b426770386a87a40554a361d8884290e4249f774449355243e0bc145fd17cb882e3f1c4b4ac1026c988928a9aa477f428d9d9a9134e44779df40cdd6d369fe254aa6a002ef0c93734320da1885ca04824b2b9ed68b805bd94c954b3a13f3a2219440b33e48692120e3d9746e5deb1f55cd206b49d2e610980d6c41b00893a6377b34782473b903ca0846631f6d55d4b0585dc4fa5be3bc644e199243d02f81481045b22a7cc20a26fbda3da04da10bb34c2c7243ee3083cfd2b29c770a080893694edd29ddc3c9b0ca61550142c8e2bb74407614cfb243e47e09e8fa1cac333b175411ffe06dc231b00add9e8d8e7ed7263cc54ca09fd4ce426bf36f7bef49c7d2f5543eb6d952701ee18b30a321c3615eec1ab0469bd37679c0baa0ba7a6955cdc63e1ffc124cc19c5fc077b3762485818a28151034fe8a9dfa6d5a8744c6490600d2a8538e3c5cbe3105497c5cf844fb7242d7878fd417bee4966fbdb9c4cbde98346ffae81aa868533f0c41b04b0e5ad1082f88bea84a6dd03ef9908b4557f38333b2ea94cf1048fbb9e292529291671e8a4b627a9223e568d98bf61fe7583fe7ef0bb2b4601a127aca0a624dd7c6bbcbe82251dee00c2adaa8e46354ace0691eff21659ab83cc942a2e88652dbf170dd4928f22329293ac94c83be9737f998a550fa979a9461b20cb1d63e5948c0d8f8a8bfbfa1068cbc2a0281dcc9ebc8c0a22df9bfd199755909c4bbf6c64c25c2875dff0f406b4231a81e9e8bf39e6f2da637747630d603a0116e8fefa54996dab95729873f238d148941b55622c7c3ba1a2ed2aadb346e1a7873f5949f66d9d19985c593d40c32409e9a045c35672384fdece3ef084e761a7ecf5a9e414ad20dd9e018cb149c0004f88136a6bc9a5783f0e1ed139840378ae6a5edc3878c6eedc2b0b70b702fbedf6a6eba0b1267517dfd5b6d28ff4e9642d0205e79e590f5069aaf796fb5c6a52235bf76d4bc28ef94d0af8c32fb8c26ea954c925ec7b36753f9b213755d2e9c3a04e98d11aa9bf18f6aa8582f9e63279ec51e3094e59c8a6d6760e5b7c46f15ac6dde860389d1a01a334bcd036c66d20ebe53966644cc1144de64054192025792750f9f90e9c6a8b1d7ba746a39d9542efa8d1ef913c851b476a3cda719be345634fea70c579d5a9d5cb92233989ded85b903b9d4703bffdda82032a0aac78a399ec5e0ba2bae769350e1e568e62156cf15f3558d76211eaac1c4854ff36e6126746cff25de3779211d33e4ec3a6c429b4899e99f29244f0b2f29ba3109960f8edb60e001e37744b6ed980a612f75612afc20f166806715a8f3faa5842744b0255ab3ed93c7c486097e38aad3144f364610c6698a00cded2fca8c45310fa0c6d1313d568c71ea50639c7b8ceb3449dda54e99c376181f193b65e32fffd5b8fd049a18daa9af3fbaf05574778dd9457d6eb7d8926ae2964c11a1b25507dcea0fcd6be713867804447ba15e61337414ab5626e96a983fc5656bbb4004235e8a88d0da983bd430779092195b2acc9f0db008e9ad7424a128193b0a1b8207d0d741c2e3169f5f4429bf45ae891bde30b28c72509289a21ac374e4444dc4f7cac609460e5614350471321a5973bb6b9496459730ec24318738e2b9e8255b4d1cd395d3d0e5f2a771155e76b85fd1714f72326343c04d1b1d73fe6f9145ec57029ab2955b5e508c694d0768bae073fe3c510c046b830d8c38e1e698a3cac3f65eb02597fb7de2e0412fd938146a064f5434400abf8c9e634fba61100219f488028310c5271519e454bda4a8f5a25eca029dfa266d0c6b72d96e6c7bef2d9394524a29777906da05ff042aecea08cf31d622b258361760eaf139336577a448c70864000044860d179092726374d03d6808198af234935173448970c1a801cc0ba921a02a344d17cdd31846d510cd0d21c6186b1a1e310eb218679627bbf231753332a689988ae36848cc0954504782621429e15e775b81e6e252b1ca84aba250dd180225c78fec05052d7abcbcb8522244091224b19b26b226403ee67cefbd5f81e79b2f173a4311a73dfbc54c2c16b05201d55c156976e1a5480318c0a448db5b02aa6d8c9130c618636cc10bb0c90d499153b13a5da6aa7e5e4045a1a1de6862810698c4982223b564895106010a3ea25e48b9818cd5084c2f94722052664ad41317339c9c7c9c145747785e5954a6cc41ad9d84a38901212dec8238f12053c4c692193354472c20c9d5d04148059e1d0a980b4d6835986234a93d57e0120f0cf0860e3d314879b9e51013d600cb524f72c69172ba524819e7c5629e120d5ba5d1a44eefde2131fc3e8c49083fa92ae209116c38414b4d9d20c1448a0d4c0cb9a9241ce0304cc468b9e21254034692cd4c2d197346ca9a2946356afcb0a0022c45a864606108500f5107171e63a670ec6c5295c608476f5d401a2272e102132d5e101390ba20912aa23aaa310e3cb96171f23185851fbbf086f6ba70f5ef1343a3233c3135178334ba5ccc17d7c1d240ca636a1f3000a60b1051ee768596030d8a972c599094f8d41965745f19311fae5eb821c638c4735747783e7455f5540f9a8da2a22b3f3e55060f101d064e96c864d438a1a9099d81b318631746d7c5d188a1643a2b51c848b1da4d79a189912d244041d15163c02072030309db2f3c23c280300e7161483d275378702d6c65060a5a19b758301c90d66c696293e52a8f0833905e6ce86145680c10345474b1229bfbcdc3291d46ed6e00be00dcfbedb6b70464b731de613c9b08adf0c964e0236e830e22564c32190a3c1b3853030b69be20a93066616c2e6871020b5168b8e1ea852629356831410b8f1d39a2d8505f2ccd702da956752144a451705155c8c831056af7b4834818d86d461835464aaeb80b0f071d887167cb0938a22e4234b88847a48ce12265072b592a0c096c0202e7005755cea05133a4e9870164a03ad2ad70b493b14316265f96a61b6fcce026c436a34b172d421c601e1298d082cc544dad99f2e153423ee4f8f2c4821228516eb09185e80c9858175b952435544e42aa2939788b16abbcd48586cb833161763380b90109ad850d1c8610d960c47c7aa4d152e5d372c387189f8edbfa3e186a7584e7b648c6d93a4132e6240f198d92199c5a095906252550626871e1640a07f84a094c489c820cf951556f574f6057aec518dfdb42cdeb9c2da85881a6f5bdf7deebf7de3063d69c41c7be39ea8c8647d7615ea252127a0ea7ee0c6681214da85099104484301cdc33436aac0bc761a47a6031c2e3c98f291e0e1dade1eaf36e7a6b3dbf4f7bb7ed39a912bb8d27805c4d15e99835854940d54f0c687608735bc3c13563e5c8c64a93f1ca4995dd8d132b2f0e60a325475442d395181130387323490b51492a8c7045c7b46717b18f4eb43e66b4931d2ff20c73ea0ad4020385930d2b58a52162c293231cdc1e3d52285343d64324c827c6187f5f09b33ac273d67bc12c3c2574a4c8c96f4e4119158038617121890b1c601896ecf831662714c6aa8c904d2f093da9a0684a97a1f636bbd1c67b2feb0aa681de7befbd7eefbd356332b82c8ec32101de02098fd5ce4a8f9e305c38b855434a9852502365cd8e1f5eb50eb279d0cd839c3c08ea6f86692c954904e185273cb21965b49419c324035781119e343df142552308750017dabdf786e19719b4224066849a3859fd00a049172488972752c478232822838131e22303131d689450c1171a826640c981c4ca6a02d19a87adb5036d6f690525a04dc52489da7729c90d1aaaee2352d2f8b821c8132d0cec45950596c4d6d06a38d1e1c7319e73e2b0d10ceb1975d46cd5e143ba54f8c0eec5b1828d962421e20386d1971e3b175870e84093315da000b9b105060deb013156a286d40ce14102182d2d70d0f0b4664a4a04a220b19b54c20f992f493c62f8f2650a0304cc80e3d143c322a50cc61833295da6a611638c4316cb49f5899beeccf804142a219429f3fac042424243aeaff9dea1a82a2584061672a35e98e7a82ea0b4678f8a51a702666da63d3b4ee256eb1db43ac273a52c6464b0328414e5248721a53bf4446c61430614a40aca0959d2cc60ab68ecebd11a553ae6dd42182e84b9ba90e6051e166b005156601a538547149517a6195276019392144775ae07f2862cbd4596a30d59bab67d509c738ae2cb3fbcb619528d16429d7392e59ced6b7bdd3d43aad1680ee36c504e379a135ff7eb09d7df59867923ee8364e992ed1ba3399a6b514a73eeae9dbb73298ee69cea686e92b8a407abe0e7c301dee0f4f376de84c07d9102f7f3f7ee39eba3efadd8813f2657640a84fb5e106a59ffe2e0e4a6f2030f0a84efa9e7e9fabae8a68b70b6058ddbae6b1b4bc083a3fb78c2a2ee97f969e3cf4d548b1dd0f77491aeb9c6d55c91ea47d623aa7395e88deadca72fda84c19c71c619679c33ae3963a794d28c29a598524a7511cdf4b631a59f33ae59bff28d9aa0e527ea749bfab673ddd4dee8637ddbf84bcdd37afc22f2e79c2b599a60bbd29c647e91d426355acd2b6ac2e6b052162448dae57c2c42a0eefa39df346da6c84ff55105495ddbe24f7087eada9e5fbf92e507b33eebc1194ac003727c7ce2962308b3e267cdbb33cd54d32609fc2e7640693963f9e63b9ce083df477e734e9c6f7e0f7edfe79f4c29c623926545aa8560dbf83fa48ddfb1d541599c8db232a5123c357df7a9edbe2e9af8b5d736fe32376dfdad57add56af435edfb13aa9ef0206f449109b62ef2a81b6d4cb4f17f136a5f5d543da8fd951f78501b7cfc01ce07385a7f80939b36ce375d04ea9a2e9a2470b585f47b30e9c06da61c474c3978ac15130ea5cde4c3e483b4997c80402cb548e68980b3c06548329a825171a1724291a57db7d4ba44a122c605ceea402507215dd3950a5a88c0be8400cc161b42a4a840b94263a4749e819d89e1d175f69ca9ae6c6cecd5f69c5455ed7bb3639b3194ee91c6078f8f1e1f3eac58bd503585e95a17d9dc593ebfef5e9ba51b9b148a723bf8b0890963040434658cacb9810213a5213528b06623001e3bbc8001c79329535a575ca46a042989e14a25f2159e6c6ab645b2b7f4c3d6636516600b32bef7b62e169d7be70d9e1b3d377c6e04dd20c23a38df2b83e12bb3e0ea781a968ca0336109674688928d0e5668f4b882f423a32a8631be37e7ef33f2d5e044c940cd0a64470550599d2d92433536b0c6946fdf7734bb377b916cbd116327292cc95bacd66512f6f56085b6665823a71b4e2c4edfbc42a6ca0ab62949a87075684c5804868b8c9d12232398557174fb80340179021205840a4815102b206982f0e85c5d1032e2338b92e445933342545c1800828d19554255867c920451f303c4294d0e2933ccd694e0e5029e9d0d5fc0b400c54b1e42c257b7d35d8d9555f155abcab1d62ad4dc6ffbb6bc232d8499f2a3aa042541784c6d00c84b8c167acccc209abab972faf0576b910ceacb4b664b68656caeb5d6beb5d6da3dc773733d399f3117e4ca117dce48277754229784e2de176e99184e114e68a5400ad070f9c929f1522406880c302f96b844e180c31014a2786480c218610da11b41129f8aea113163d65fa32bedd9333e42c4e659e8ed8276443ba3ddd12e69a7b46bba285c7ff9de7befe7f9de8b734f982a8ab4670ff187193fb1c03a72447c9a6844088bcc82d8928820a636a6fe8831e6c4d4122a4562b87d99e2b56660effbaa38e12a50b80a0e57d161ec3a7bde01d76e6e3e5839c3c4c4e826668a130758c811a73439e080dc60a8415a967855082c5f6af639a78bab3ac2f39c1c9cbb14c26caac5435987b5384c61a4348c4d4598db1d471c8c31c61931c6f703418b8383af144c2a2625c378aa0063b564186b4063424982a2a43b3023030526494a70533e6a601191b32424054d16dd9a2adebda2f87dda06a4dbc29708b621480a2ed0cc96ec30d2a38782222fca8c7172b3212ae6b5f8e949f3a3cbd1948b1e24e43cd830810899a0a61ab49b88c3969a99178cacbca801122185ff8090952e40a4cca40912f3b003cebda81c7ea8d97284034d0b3c6a2459b0b364c80c4684725fc2d03e7ca8b4ed2df518d1f4930a72f05a1ca91a131523b7a33ae1a727470557ca52d41599122d4aae12ee691de4e6419c3c0894fb1db2927756c948e988b5656643140c6560b02a3b9ec8197ecc8e8c711146853166d3d072d5931d8c9840c50a0ea9ea63a38805579020295ab3b305eeeee053f022c8d2c22e0882b6699dc0fcf4e5d9b336ab5dd5f6f7e604adeeb1adc2e0a51f26411270b9ff0108d7b163c7d3a37649df6d33853f689fe8dcb3b44e96c94c519f7e6e9d367d902c3148c16f3ea88108e60ef153f77174b95e07bce0ac137cdd0d3ac66fbd5e7c6f8ecbb5efa8239225ac13083e0643f0b34cbe2f35254babb46f3e50fc2c9349e2e623f3b73e8ded134f83fa184ad29318528d3603928580a3eca07805c04d5409a3b83fa240f1d732b14f94760e5ff6e61500e31f2f7e9b8b9f75f18b175ffce0d5a28a6c9db45b265747dbd43a56f0e61c04a4f515e18f2f19bebc0abebc3ae223cb1d6b7f64b79f1b03bd0bca29dbd886656fdb6fe873bbcb45753628c4a4d4b33f16889ad0f64635d5183ffe10f8731ecca28a4c7aa075d659679df56f50f50e15b5cebab441d3fecc14e2d30c22cf3941fcfc39e79c20f29c249d73da9fac75c62d0f1f40f0b5ce1914b595591f9d44918eb67e2bb33eb6b67516f50b6fb0a6ad3d0af1d9f54220a5a509b2b63f2f92be3cd83236e00112a026ecf6cf5a5b1f4db44bfaa1d6f4c1b73e33857ed006e51cea7287da1f1068d37ff0c98ac18ac18ac1f9e087005d205952f77104a7ceda6792c84fc50ee6ebdfa0e6e00fb195519dfcef38231e371e2d10b53f19cc5a6b0dbebfce3f607d4b71db86524a4572c57767e8fa1e24edcf2461e3ffbdbc7d6db61ad2976bed479badf6ba7b24cb8a3443aad142284bb03fec84b3dd6c5ef9592f2de2108376e717516b3b7f49713bc42c57d78bb6f37b7e118718c46f7f7e2689fcaeb50e3598fffbdecaa8891f770bf469fb836fe8abf6d5fce9fbfefb9ee2becf24f8cd32cddf7ed765d5d5347a4a73012574741eca0505f54d19f8f42f004e193865a0ac848ecebfcb05a5eb436dfa79280fe5a159c351f293cd65d9641a35f1fdcc0534653c3e697a36f6ac5c6946ab8d9f68d58cd111f7e7c6e5a14c444df8d3a6d48653c48fbf4a59e0afa13bad21b9627ed8dddd7d62777777c7eeeed3dddd3d02f32bf6e9542b4bb0fd359bbed7747a72c7f8e9cb3f8afb3cf31b55b26dc7ffd1ff72d27612ef70ba90721235f13df69cb4f197d9b6f1cf99d3666d2209514a29a5f406d11759c34f5ff3a6659c34af7deeff55caa2ce6a6d97347b9ecd14fe33d368cd9f973b340fcd1421e8ef5ed2597fbacb35a78faeaf001d717f3e9e2f3abdd2cfb39ac12ebda7a74c843f0c7eb973b1bbbbbb7f9fdfc3071fcc611e9a2958ee2e57c87a5648ae00497086ac0c28d5d71a6d58a2beb6d668c312f5e7728da3d7a76469751be3bb8366561702528d06248bc1ec95dd61dc75b2dda0124039dd6ed355ba49f7e81a5d22d60bbfcdcb7fa6a12726cda33eb467dfb284ce8fb77d3f0f61fc5f0654fba3e13fca43796892c0ffe1bfb9a35f4b55224ae769e3176dd3c64a1b7f6893360eddfdbd4489edfe589c40269d2c29d5c61497873291f63c446bac59e2c875adf5e7a738aa4babfceabffe5e3df194e67bf557adc972e7e6688ee2684e490c2bd0b654b7ed06bfd0a989eccd6b6915cd792e763029f5b6b775b902692caac07f33b21ebf2a70810c882abeb4185f7cf1c517c4b48a4e303753804f29cebd195913875c81e79c9afe7cd1d705b47e9bd183d6f45e7ffac2646977081447a9700f8df16cfc1447a9bcc236c65b571835e1ffb7c278f6f5f1cbf104b84d27495f1e64194b4f695bfa37e3ae940509a6d52ee9b74408d4fd511ca5a2552d91024e96344741aadb142457dc9f5a7f7a629aa3541907382a5cce8a526a7529a5945a55227a2fbdd4e56930df35926058be76f69bf14e3abd91c4eff8bf1755f86f403d903764f92d1bf2922ce7403d316b2c16fbbcfc0a5f3b7f766507e8c73f63d57d1c5db15d1f93aefc0acb10bbbebb8fa3cbf54f7d534a67ad453ff480de0565dd51ca243362baa1e3a6b157d54adc511db18aea90a28eea6451b7f1974eeed0edba9d43a73a227c8c31264bf1592f222471ae4e1f3cb4f487d0ef7a8178e5bc3cef4130b6b507b204655bff4d756a912508b435b993b7f7d386dcc93b7f2c119caf57dcb7dbcbfbbef5b7b70461dbbee8912bfcf3df495e52cc8955a198a360ad4fb2c879e6edb6c52198b3bda2e650dabf3d261c4ffb6d386b204cdf7bc950d46ddf2c1b963b79e7b72508dbb804631b97a00c047ad70bc42be725e6441c4ecc893a1127e6445d1671624ed4b180c02de2c4dc2461276c7b9d37a45d9d76a5412e12c659137562aeee3cd01106f059accb62b158974573ad16a56a512b9b568be2c4a75422ad6ad98822cdd11ccdc920a16763b03d26201cebc1d7bdaccb62b1bc7b59f75920b6ef3f5becf059e3388e736459598bdca0b2c0dfa19b458aa0eed60ad687df1a47b2dca122ee4fd1b6e6e8cd71dacc16ebc39fa30de9f4657f260990f446b2dce3cc662c90c5d612594b44677bda206b81c0e9636d504e8e05cac9c9f9c2ffbeccf970c205e2733ce456ce7181c86181703d4e08113fe67c7e11391f22e75d3964f981dcb920705821b96337487ef60727fc4035101eb59cf14f1eb39fabaddb07d81ed3cfd1063dd0e65c290b8f526516fe64391dd0623b3841d28aeec02afd1b50cffb9cc1fca005df7b0f04df73511d219c5764ed230b7c1bd0e6c11f419b17eb25be3459b6d8348713e69a47755ef64a59e0591f7bd8ca7b793b63aad35427b242f1fd59a367961882fe694d733457494d2f931fa21d69bcfab86a0f607b4c3b761c6d046c8f69076cdb3dc7ecd5cff3f35cc0ceefd57df1f5ca09a4227f7eb9a8ce079c177f749ac32f514f7c204b8ac321a9eec3e71c105efa0dd91a47f241bc3c6f44cecbf3467c7879264b27bd4c8aa106cb162b3ed2befe52975f9d5c311f932159ceb7240ebda11905eadd46effbbecf7f6d57c96fd3bdf9f7fabbfff504075c28c6123aa026bf8f031b7c389ccd76efd25dbab6bb0443ba9abbd67875b5a33b9dcee5ba4d273850475c3a3ba0b57a77e9deae66adf5846723567f4d22aa73a79163c78e9d569f957e4b3345f8b58270f777b2fcf0ee22bfccc10e82ee4e3ffc40d6c7344af3a34051a2848ecebfcb85efcd3f25afa2ba4bb5fdafadfe47e230a594ba802eee2ecd148e83611bdbd80209d9d449da2825eb8be489d5d79ce1304ed8e499b14a59b812bd4fbbac1fa5d7a6749b76c599dedb2e77e85d62f9bdedea3fc932fc6943eedc52245d57e3ee4baa2b29ce7ddc608664c594d6bf4ad62b796d54079f98b33ae2fee8fad7d129e1812c4bec1bf2de2a767777c7eeee21b9d422cb2f5b2e91dcb93b6c3d38e774b540b235de990d360b01481643aad13ed8c633d82c0420590ca946c3369c9dd94a60916ccdd2a09c6ead17fef1e53f6d73564f4c581d717f42cde62cdf25188e749c3702564f4cd85dba4b57aeba1babee863010e6ee02c99dbb3f7c6d77e9fbeeed2eed70260648601e0aef3dcf6b80a701f8e4547e8fcbace4799ee7799e65c204c6c4e7c2b6bd372d9d810e01fe02570556c9d3207cfcf6899ac8175b277b6160f5f0624175266cbe268fe800ba4372267905b88fa2def7f05efdf05ef56a8807f18b04eed8b1639f0eda2710cc9882a7225cc43b5982ef5fe27777777711e40af0a708ea019883a804edd9ac4987487202006317000028080c86c242511e074204e50714000d599c3c5846349086a4e14820864110c6201083300cc22000c2400c2029aa99d30100a41c4545fdb17a867dc5ca562daa72eccd415e7fa736ef4548a5e8b89dbd1c0c2a04a1d3f526a815416eeda28d0c255b5e783253fbcca52c212b1e4b00544fa06b600acb87e46f3bbf70705e3af7169235cfcae4fed9f7ad6aa6954a32317ad1f1c90428f2e6a47124c3920a392b4bd49476bf763c07f7c667d146ff9045e1f810a9cba5d1fe2e820452f9f15ce2166987ede82287ef04c6ef58474600b6082be503b360359c5f05bcc3de11707566c9dcaac9fd7d6733f4563bf00aef012c574636bee1daa9bf669960472b5ca7e186f078cd1d1e0e911e5686bf7b9c99c5938cd5e1fbd1abdbec582be9266ffa312e7c46727061ba633f51b6122f3441e9f2c3d7b5cbaf210edc094e8fe214343c3fd119563619363c6048b32bc4de772206df47ad0cf78f72261aa2eba23bcd0cabb01bb3d823ec41c738f2ded0545e57c9808ccc09549d75bbc6548c386d35c26c6403fbaf3d6240b2607164066fa8263f09322355fb85be0288b5e32ff40ff89d29b4f680716193284cd50a09697866b3d68e39d2710222c657807c988e1d078c5db520829a2476ff095eb1f538d53e8c97a91c37b5fd097809de82c8185651c04f596e90b8dac792047b34b7816fec3660cf553b5d2220c90a2290897517e0c7462b2f24c812221eb3bd1b31354ab8265c68c932cf722ffb971311dfb4048841e6bebfc2e74380d7e4defee1b17d8c8a93c08bc64bdf7967802487a2a4a9a331b3a4d87082190956b5d533559ef97c0e3012a05b8e50e4e26d0fbf3d0006aff3e40e11cc21f61bd627b08a0333584b94f64acf697ab687089479228c9d09c2cb4c0188e268039a59774297c37a7d8f501470d4a94ddd942782a90dcaeed1284558279b4195bc5c0a7ac1df56c1cef4a0525c102e226d530c227aa05f31bca301a7c887bcb6b1f9eb8349f9d8bc2d5325c6de3850035ad501d2f7a9a62f2bb48a7dec14f1affb7a9a39e267c40e4842af4f798a22f282b8dec05246a3294f0645a97431c219cd1d91da0496e47af031f6cec9a0dbdbd1fd268374533f5da8f773e76aefdfe3f970376a9fc9a0eb11f7b3de4f0934d92a0b3a7ac28d9eef62f2d5f23a47b442c532fe07587528e90701fb5064f6468a2e4d01a5c75df9ebb8a6ee780f59fcaa4e81418c1a6baa9103e5917c41a909b9d839327fc3050c2394c0274855aa6659d7524945da1029183f5b048e3abda7c4bfaa73f9a5293ee8ccf3a74f47174f61d177ba98b5d3dc05e17413f87878cab818a4b20d466002163b84d5bd9755bd73ffd53cfff8431f7b14e108bdf720cd3802cc1236fc32259a5e77ddcab9a567f9f04fd05ca59e6ff13b7c2545b9279fb1126387bd6f503cd5b50cf1ec88d0230a33621fa06b9a4955d1ced0df77aa96b20b07900f6834e6a87d6c8ef473fa2919e46fa0697eb5f742035a041b5d4744c7b22e89a5c7cd9121c1ea0ac3bedf6619b9bdea45c3910623b3eb696cf9dace3a33bcdbbda56cf3b33f489c0153f77a1a2c7c1ac1f0123e4c74f7988e6089f3886c59ed82255426ff5d1a7a64bb227e0f4f1f9d78b3e1a98835eaff6a37d2d8b8dd2aeb4eb730e420538514a6bdb907d7670248c9ec9f0ff32439ca549e3e53500ff4704ae095820e880bf5d8e4f7bf584956d3bceeaf89efb67b45d9599ef09646e140abdaf11799798b6cc8b3cd51f5344dd0174da8c1eb88c45bb068063b416a2a7a71c5f94b8ee2a80aa07d6b8987ace618b0ea73c8faf5b424d2115e145e048cf78044dfe5ad36c839cedf85c5a24c06b29b0fb0494ce665a1331c78d9e95714ea49d30051090405a85ea64394bcdfa8356974ae21caf74962b7861504b673d6e447b889cde25d7f782d872ca0a7378ab16dc0d52d71e69cb25020bae7b00515bc3fc930bbb88c1c58d0927cc9c1940f5a2725b00227dd4c3e836e9fc090e95c740c5fed789bafdd41aaace538a3063418ac5351b0ad1ddbc73fd4ca381cc52cc21cc9da6c3116a386e6b6cb9f02109d8dd2b45ca2b3319292e4d31f73c2cf96a74110bb83364c1744d7b59e59a0aa6ed6531cddd5ad03d5f2ac8a834121f484d00e04809e05c8230142b311ccff32bb7d3c4e2b3a1b690a50c8095b07ba349cee0fc7f737258cb28ce2a25e01f2793b04debbd7dc60bc311c07898233246839fad7922b7f59c5b1bad7e3f8d8cfaa415ba12f218a94fec9699a243c079e0ac8e130e18cbd71d483bfeb08b05128f1ad8e21f431bf3d63a1620bbebeed1d0ea9f5b5c29317c56592eddbcbef8502c79bc4de656852c63f44678fa4681e6538b2252f1d61761b807b18f08021bd793485a668bdb35ebc196816ba8a70552c07b7b90e1c0b837aa8db57544794e76b68688153344f6d0d99ebd4bf842dc4e39eacc9bfefb42de85e74f021d232c3a19f75c247a8691c41a6aa3b636e699ab3e91c3420a3a2a74f8934d94f94806972b7f8b23c8c0645678dd5b0d0e98caae366265bba9dcaee7615552112b64520ac0ec33122dd2bf570de72ea1381aa9dae0d0a6d9cd341a040ee091523c4b5b8cb04ba7ce88c96c4f5c5ab33f2ee7086e0c005aa45378229b86e5cbefe048c78ab0b4b7e6c50e4e70c4404ca02d78a5c0e1e0084aee28cc7914d8cc77dfc27fa5cd4b82a98e6cb4416196e8ccf61f7a55ae9fe3913119318c331fd8e38db8de6d137c34517554aa818bf6ce05b00eaee0c791b321d3c65e70e3c369d3a431ccbd504db1f607ade13ddfcc3440c307022883d95cf60408a5b80f20d3eeba4e6dc3378b3cbbb110636a9aea0490afe3fa676a9f14562076e868c2689f7e8a87bd5faa6d3f8ecad99a28f886e2f924cfe1dfeb8a530a25217f3913446a20b7584d6e8be1b04cf886e6cf60551db5f7057ac42b38003ad7aa7f3029d344a9b3e7cad6982919db6826f0f4195e0f14f871e0ff7cf74d530a0eed23ca896330afa13bafff1aedbf101c9a5235b9f453909db78b82bacfff5305c2b3a9a1e43d0211a89e23ce0a1be8c3e881992d9cce9ed78c4b281d39d074b725f3c11c1d14ad2a88340404d4fbcb54dac5173d85a510a17aadf133e406dc5447acc084df84ec350f86e360f56f94514607f7d28ef680632e1d0da34dd22ebb53c21ec2f1f2811c32f6da856f8521f2cb6424f78ad20b85b003b9bd3dd3fe9710244c4c6862b913b1084f51dc7dd95f69bb7d32031090698c8c2173bfe78809daff45eb6f800f696f9b0d51389197e40763cc28091ae3b9bd072a36e1156cf812f9c5f8397621e99798faea18ecb217981100214a0bbffec3653d23054b0d096b1894a8091a34322df59aeab05ff329cec3c4b379907bb26169f530dbe01e303147e92fcbb67c6d15c79370f17ddabe0c8b72bc0815ab87022103a30c1699044e910e687efd46294d678f92cadaf13c44d5a544d19b47d8227e14cd6c0193313b08aa01a84bf3f55f59ec9fefef5f70534d259db1f5122d6e7fb4340a33496fbf934845ce81398c835be1f7be33c0960ae388ab95fd9288f8e1520a8dd28e44a7825ffa1e7c0403853e603c0930f107d4b6692b4adc4fc7c0c270ed714618fe14c480612266dce9a58007772716e64384784f97505fce842dc90589ebc0023ff17883aed06fb27305298059925c0b726842ca53c38428e5968b60a53e27cbb09c65c08cfb53bfb8ebade6e167ab332fed8eda65055811532628da34379f821699e0777b0c5197c626641b6e1568c3dcc88e800b460a6d5a257143522bbd0dc3124a3d5480963bb61fccf6a7ff6ab133a9b5c05d94907932176faf4bc5e2f0a098250fe6d254947b9d37b79310267c766d43bdc8e07b0c94914dcb03de2a50a21b6c3fc8b066470039241475cee65bf242cfbfb7b484bd0e720deb56f8a91746585303e9db588aac090f190b3d7487e9d63607e3bceff4c7df7f531687e0d856c7d20c906b8a15e1b591a6096767db182eb75ed119276620cd07c9a42c6ed84f433ef4511fd96016a3fc923e004c97a2840a5148918baa6961dd7351b87e434c5eb6679bd7bae254edab8a77a42abcafa33da3c096f66a45ec977270a372503149d1dff332bc63e3cbf1293679f68a67e1ccfaa7b58ef7db1399d9176b702e4fa3ffe9dff60a29eca1c28e162280ff894287d92e76a96ba1ba993853ea41ee94d256e8a4dc53840fddb44ecbec9c5a102bd5dea502be8b02d5c84681a9861be2148868f6e718e80431cbff080ad62bbc34716c282bc6a7237dc6025c8b257c77e1b881434b761b5b5e16f1a3934d1a3745a690c59bd21801f82814da1ea707ec7d3de5841ba63f3fd2c8e91a81cc5c62a92245bcb966533ce52a13d30d5ce8de17d29022d7fd4e264a2a25944d930c2d7445fdef0a0b1d3ab4002e0a86afc88cc5ec89a8251c27fa6c2aae0858834fd791596808a33b08ac81976493203ce48fdd3e6cf2959b5206185b45e5b81ae27d8e0271ee9737afa8c6036f8c9b4a216ea42fc38b0647502008a5a714b06518b006ec043315834ccac0a5e6412e23589f50d77cc82d13628b47417c99aa06ec74dd6daaf6dbf8aad0f84946f08f3e8a2282259f252816a5d8001af8ce65731e3a89633b7142e1d77cad36156f2e5607eec5731e5bc78da0ac244f5bfcd36a4609024718debe50cb9ad829ece1069bee76ae4503aa3dc3deb25f13d7a7dd7d370fb5f3d9cf3916ba77239d203c969ae1cbcac9810d5c9e56da57d673ebaef39f92a656a2c64ef66a3c484b57afea005dfd91b4f5322c21172b8575950a7058b7d4518232152f097ab912b845dfdb27054e72461d77e64867ea5d539526d47b425fb9e283aadf83ca1027c9714c2312a05c0b45a478a546df7c8256cba9e0e0cfb1c86e31cdd6a27eecee31184db857960a2da7be3dec26838c8da8ce2c19878221395a40540613f5c51890fcd2dd871d9a8ef718b4dfecf15d56c65550baa26d5eb930c37ee08776c44e8dea1e7aaf450ad0f9b297a51ebc273ca3fca06e38cd0524f6d5a135a25bd423e67686544260a84eade13aeea719876daf2506b2428e89e150e2625525b69de6c3641b9b66acf2036b88b697e4f37b545371c8f476dffef3d8b4cebb6d427bcb56ca13d1ab2864cb6bd96992e2db4208ab4a2d4e5f59df930751b3db43999b432ea405fdc5546d0361aea75fb088ca3a0f43d7d5e07131339f0233b72821586f5c54635a4ef09d276b3277e0b43b50093626adb17c32ec911754cdf13139dca0c5b78c5fd66277eb4d0c2935dea76307d0f00330ee3c7adf728d418eebbe30248b6d7bb9b17944fdc8c3d1d1b93c0115951f128d10be80331dcef4f1e2faeba3acc8d5b6ac5e3fbaad1f5e7400c23af705e2358f3f3c6913d94d6d4c542f6faae51714eb2e6cb247986e5e7d3a008f2ae4014ca6d46e3e15a04062d0dfb9c972f1c67b69a4f50698e04436859759e59bf217f3b205427f3d146778771ee3d1728c68c76ae70381784e2d81d9ccbbe793122e73608c101a01fb5bd56eced2d7b16c7097e205918aa3ec773b11270eb822a0205ce1026999940da2cc2a18777764d9b77c336cb3eb6ba87bed76188219a9fbdb21815caecbe238b11bccce2381962e3174ad3af7986545b3a6dcc40ccb3b63a2d42ee5ccea2836d0f1d3c66895575903eeb9f48186aba425bd3b6d5e365b448a93dd5965b277244218123d668bdd777eb30e88fcbd3b7a8b375c11c673232a56b4f22ff544fedf9f4b62a0d5fd9f2ba0255159ced1ba9e5e053e1acb7cec509dbce391b01afb9d37738481dad4b59d15d5cf724f168c0da4a741aef17dd34141977187431a0939142e7df71e4a12696329768b5e784e9055abaebf86bf559bb2e179ec5bc01bc0ec971f16e0659719b5531c0f74cd6555f2fe3ff0cd38048129ab2d64bab14b1a31f2215a233088526c1eab4ba46af849f3747e52993d3895d0d569d4c80098adebd3decf8aeb55a08b14f401b6d753edda01c7402d27ce09704d319651427c537579a6d8deb959fe7c89a8070fe925cf203bbfe90fa8b1d2e0127b5a23521877a6ba3442865e313aadd56401e159f639a19616d24d58a532f35a8503cb70714711da06a5dab81a9ac285ac8be38f947989904a1f2c62b041436bf1f1de16f24bab99afb4c21a064ad022d7130248cece8639eee861eaaf3f51aca934c66401ff1db89c84142fefd89e95ba7b4fd36218fa250811f054aba1c12454aba0e420107026db53f477c807c3353dcf3fb93da3de3653a04462e2167f88c3a25ca74cb32ed48780090addcafe3b31a2027615f6b9fb779c152acd7ea4a080992f97fae9faeb5f50a46a5eca26c6c626b95bcf4705f4c2ee2000423e027db1b26c7a3b55e65d41db30104595f2883d618ed8b6f2b9ea68cfda5732f4e07a9420726572ea85fdb03aa378b17e5919ae3ab83f53a2b428037ff95dfc1989ce59b6b04a4cfc285008b2f5da55dc1a47bf1e08cbe627f924f9cd47345f33df2aa26b85f30f59bdc7188e412ea26d366555be98dbcf522b81c0b2c0125b7ec5ab84b6cbd8d7e1fa32ec77ba26b01ae683cd8a464460587aa19cb12705dc8692c1aff154e299db77f2e8462b3dea98860957f0f7765ad8bfb9a29568db870476abc4ffa0362d73f71a1751791cf8d52e3c89b62e12ef8e3d0b3790fd2c28d5f078a9646c4b18f95687f308e4087e1843b7813621c319ee2d8522c575326bbce26b23a73648ed90da08b278f23f3f9721910a3b065e1d45c221dbc05078c00b4ee4a0701df01011e936a9105032f003d59c8a5e4267dc5e88df68aca3f136336b65f9d78702bfcfd600a6857cc4da166c75dd5943c8e6df53f2568fbafd8639409c2b700367f65b7a08527b2e6c6976a174d996cc437b8059e400f43b1f04dff2538efaba19474b647b2c0d5cdd5579164baad7dc605f520e1626377aa7ed96127d67274e34a23b3891c8f467299958877017f273b299e4d9b156145affbca93e3a418a22c901e6e853d8b41f0907df9829bdc968ca0bd549ce474a5b745dfac60169247a098935742b3fd4eed991f6be66dabe8924e6fc665947fe5aa4de347a762421ec79694a1b40e6c2cfe38c931a6bb222be3a75f6c77dd05a1ae675779924709ba8b2b1c267160439353d198dcbafca234e2cf67d38110957f07439329ba017e0c491b6bfb625ab92219dd5856bf78b86803386324d59accfedd18ef21aa8fbc5cf6baf64fbf0e34b25980a5d59ae82990e63533dc84355291c48ffb240e3aa941ed507fe4cde4d7568fdec84470847c8c6398792cedea2a6b28460363ecd6410d643f9659a31fe8c09f38caf288a28a3a07b1325c89ffe3ab0bdce09988a129d8e3fb15bc02b6a1ab9cc7d97442fc3948b8c20146f6c23fbba7adc951e131408361ab1caae7097acc5bf0ffa0d7cebff2a3db1e7b2a633ff71b1ed656fc0e94b1b123e9ebb2875b94a75831b6992cdcfae069f9cda50e57c917d0cedb9d41fe632a834625322add0bcd6ae7807c8cc0a62c475f52926c9b956621a96b161eb13e50f7d2676144dfd8ff07ba45803f3fa8a38f166229fb38853e2aa31664e4edd4447876b545e8780ec220b17f36a9c6f86e6a628e8619c4b23f260b0b07232695631aeb0ed381406b284646ca19c0911e4a6a072f0ca6cbb9703eb691b5874f1879f50e40257e447d45f2223ce06a66f6aa6238c5fff04a6278f6e4451ac0ebfcd5372e3434e9f222fecd66eefa558abbf235cfcf9fe5c9f03dc755537d3297d20833290f51b70cd97ddf5b8029739fb95463988b70f1252321ee2ed5323f9df8013874d3543c994be9022c4862f4e00acb4df3e5291b908e19558e1775894d5438d727d6a2f2e6e2a0774a6c7c4000bdb794d7efceb0197148397582c75cee28e99441493df12f004a351a9b3247d9b6a21f5916ba2f41751b6cf23f4a11e08dd78445d602ccc579e3e20a442bc67b1da21ba49060d5ea2eb53e77a9899c0e17970984ada7ef07133cba32cf77d42398235e962cb21447cca4aa21a9c70797b6149c56a0bc133f9a60f65147037b3a96bd546fa567c97c3471bc37ca588ab8a24a61b84d48b21acbbb24fea076e6a61e87e3753fac752999d4d1649b4c590ee66602e199b9d10bb1232ad71111416bf5649fc2f7f5d0dc38b839de6b64a4eb88bc3b94d09f1ca0e7143b6374106832c01cb7d0db455272d502e0da6e2db7c17c3926dd91aa413d7dd8b4de32c4fe7ce55ad09b98677283e14d548d647cb175538245402bc192dd6491fb792d342fa075365d355a3fcd88002a4e6346d74c2aaee4e819a1cde94f00540e32152e005fed32d260922eaf172d62b557390f111ac7f23c2d5a8098891d1e99e0d08ef26af4f61ba567c8f0567817f3213985e867592e628518a4f4071128c76e0390f60740d5d3d7e39da2c20c596a9fc5889561b2cd7b8504d7235b1cb1018efe817776ed9bb7612c650bd56b5548ed47cb695c2435be6e4053dde4c1ec6a2051af84723f0e24d363b96b9674a6b5adc4897d21042ba35f382da16e338ab3446d2e6c07d19f92d19d4366fdf3a7bff9e24e0cc13105b49caa3e90860bb1ee48f291233d33c829569cbf5104d3ec8e977bc372afc6f1cd6a50f126df3dbbb72ab49916798ff055855b93fee0d1e7eabef44ee28b1c2127384a91166aae2f24dec8fcf909c46f41103d552fde0db53876858220089cfffdf13fbff83f592a423d52228169c92d07cb4751a58532c7e4cc7a724b46d91181d4db830839b2c59a2405e6a724d7c0f741b2be4e076e20d9cf0e5371ce3f531c4b7acb4d738077296147089dce7f0c8d80e80c0d33f8b0a07e6d3a23b58c1650bfddbc821628505a52b1caa3856e4a4b9e42ada5b98f38a0b4e471ad0cd39201c20c1d81aefed13610428455fa2634f2efb57b73b8b07151c1aa15e81a91f49881f7c7984341f2c37621b926aa8a60b27ba68aa0bb00d8bee91ad4735706915ad71f27d9f25647e4967057c0a2f6b03dd61efc691e0763e01737af289d9ad41ce16ddb5572c7cbf3d8ec22c626c5b6e3ea8e83373d85f92fa6ddf79d6c9440cf5e39c7803c1d038973b9386cfc8f9e792707d45eef8226797d7a4225a9b9bdf521bcbebfcb0a39b9003a1b4084792222150e5e602782db5ef7e0ae08187c71d91388693778a875a9d96929dcbfd74056d4d5c63c029eb175bffd7ada65c65d621d6cfc3bac8d33ff313b0bdc920fd50ccd1f4c239890ca5eace8e9557e4ea67a7bd3ab03a61a0d0d2d181cbd4705c989d9c0919a54e52e49f040980896f86a1b3b18c2a2fa36d57e3a32f55d8165d01ae202116bb28873ea8a2e5d4010b7f08fcf5444253311d48cebdb7e5853eb285b02abe443fcb821c080c3a92bffdfc7f7ed1313f76ddcd69f128638e4c0fd159b851798ebcc725a7e16ced02d1dba47ca88b0a911d1ad31fe8ae2dbc375cc9268d32b697600fbc9b11a8f1ef5aa6182f946b27aa381c53211879ea89579d4b812783c3dce14666a6dcfb5131d4f1215ff38a4726aac26617945e0d16297589bf12276f1420514f287f4ac9e5cac86862ad769b438148ec26735fd94a26a49f4b5890c271aa9a7df5b0c014e84a12a5b4d17a485f94f97f777926ccaab4374d96a3a182961ab3647af3bfabbbd32381f1d591683e08e662e12c92b8ec2ee16c1e045a5a8b728e696284c4c434706d11f6e020582db648f2afc9127c81e8c1ba903921c0874ca09016c358ebc7e806ca729730404154ae519b43773b3d14ce72d4767b82237d5505923e061e08f2534d18c156cdd623036c96630216fa88d110d7de082ba2c43ed55d6f9447f562f901c15af66590ba696a1f5cfa5bd837cc91a07be3b263e9cf5b8f414098391cdb86563111019fcd5800c03a0b21e357e62bfaeeac2d9906b8f3a0ad167e66e856d8f3265dffdcc98ce50ccbc4fc4475de290160deca83a620358054c8181e6e1aa323f8acc4b4db1f79304f2b292301e915becbc333353d694a9ee2e111f925adb1976993996a7f5b337bbb1cc75c7876764350e0b9c58a922e4dcf115632d1ccdb7145c233605de6091be87730ca25b151d00b0b1ba473e877eeeea1addcfc2514739b50ca84cb74a4a44045dcdc7c5f79419970d0196d9da0ac9c52efb9fcc5cccf9f0366534d22c14e86870c5f2f46d1955f530ca4cd2ec684f9e16650645aaae5ff9b6b7801ca3f8243ad5a9de504813ee54cc760970d4186701134fc8ae6096f9d51eca153154d84b99c3210ea67ed0cb9dc3dc16959513ecbe88f29250c6046e8151d60238cb31a6238d59978ab9fd242dde715181f98853ec26ed58343fc563f79f26245a16b4a3f98a5962d8ca706f70f7b66363f1cbd795a4f30682370cd417c2fe6a49638ccc623ae99df18c3478cc627aaac8602646b338ff46c7df60983199efe56603fe8c00840d7999a06761740ef8c58aa5078889c3392a8bd92138920bf43eec9513c6646a799d0e9191778270899dfa5b8ac6fdfa650de3971fdc4ee95b5c232d94e2ff79cbddbde920d8424f180a438657548914cd621d31d8f3fbbd4944445479f92a1a0ea23054416bec6826825352382da8c8957b4383bd22870d4b6a6b88f8512b13a93fad91290cae3ed09911988af930ea7128f4127e03c9213f106d06f42b1bb07801dd37bcc240351d24e0e411f40c18437010e3d354747e4452dc7c1884409c67986857e8bb2e28a380aa10af62e7ef619032c9610f5144192d076c8ab8e9332124f4e1891a892143c138140bc1489b728c076f97f5227413af4272e3249e29ea72bf8c34b0b8ba2356fb023d9b7eec073a596369a94029946567c7e0c0feb3a116f50ee6d7c0c4df030e555e2aed4c6efaf2289e75956154df2574571e4502d0d43cbf04aacba3f84b298a7d0147d498d12d25d0d2c2cff28a4231b812b6e55daf09a53c0a665ebaf500f489687efd46e77507c0add1143de3cfe82b6c25a229aa46d12a9036df30068e555553602d3ad28f3f6af9760134f2b0cd6766269b217240904365c5a84ead0cccec2fb6acb5a6f2e2ad9fd205021edadf180a6caab9c115af2ea64ecfb2aec3a4051a3b31ed76a6514d2cbf09c05a8c055199c4519b22d53260eaa2512986b80689867b6bc792a7b6a98a840cf09899469db629dac5a32d04e8d1b96034ec4a97543a30f2584c0520d0ef926f6c0e4b53580735315569aa116b75d1f268e894d0b502bf2155577abea4cc9512275cac833efc5c30742d7f7d188660a0916752e0b0d783cdfd9aa563e45562d1b84315bf53825595499e8104018ec55d5ff416b37a1a30dadf75123e24c59ae4c7e654a406037549d9d49bc57928641825c1de73b9babfd4173ec25bfd133f34b6c5c0f2d57c3fd20b0d1945221efa7c6d8e70ab31f8d2e01f780adb89f6f71997f46d93921c8c2e3d2073950b8874a226b9e882355a4a5760c63931afb19aa6116428e6e057c0bc26393efa3abb8f517cd4ba778d078a8c58fb1834c384423491642043813b32ef6168f252f69041009c4c112b938c49c7eee5659991fd5b6ed4f3edd26b97a19aece231c7e99d44829b10e8897cd731199a6750e883eda2622e1e246c79f31418e2913bc4a84d611004d4366b51378038e1b97424b6e1a28ffecfe316a351c9bb6453c6ecc70119205b8d226cf1a26ffd0adbb3a60cfc60c7c1623cce906e4b8dfc2fd590b7c2b0eb4a3b682f0650a022a5d1792282392ded59193a8d3daa7e9af2e732148ffe6f78a9160454c7cb3e0c33d0b58cf0302b7584a10834ac2e5d964702bea00116cbe89f646c4cd7362aae6d62192675dca68f1c9631d366216c4909df797bd000e0440389272c2d17a672f88554e8bd39e1c78717284208f131b1af40ac2e536dd5c8d721573e94cb85a97a47cc123ecf6394b62b54e7fe5ab0fc2857f2d77493e1bbcfbbb04c67581f81018185a63abe2f547a933407bfcb5b9cee3b9b317319ae75ea07377519756fe5648c8c556af8dc3e8fe88f45f05d35ffb1155d47335b7a95f8c71b285fa8d3d1ce0e681a84a22933992bcb1cff4998888bc01f3b606d72574223fcd8cf5def61790e34cf0c0d1ab90ef3a0ebc4ae1e7f010a28662dde430b5c4f92e09ac44e5ce374396a2f46616f0039d0a22ba2555aa215e1d3f1faf712a569d82aca74b086c3976aa176176935b31e2a039142b4d13a5833d7834cb377e4b9d9635f167e1d3cb30d60e2f81a3894e504e912108421f4e96f1f09671018e10c4d3d23b2347eaeddaffe5ea4abb23379f1111b532161f78583c3197ae996c18438184c096724ec01e3cb13bc0bdb2ecf5c63fc8d6961a1c22b7ef5e10dee9f277bc1a47b8baaaf6c10fc5e677939eda93e9c629c7cd837165cffabd4fef77b605ca52d489dd57706bbfea5e4721d1d12ed65ce44b5834ed03079bfaa2a1aecb99b6814f030d9643ac4d239530b66d7042e329db5676afd1a2ba546b9412296734a75fc3c8c48dba817a627061480d01758ac6cfe3e88f60fb513e7e6b91b12178412519c9777ab7f70e53736c63f31ba96c8e7ebc04ef0f0ae1db77bae5e9020942b9c7d9d30b8eedfb9e883be99f7c25ca2b4ca5545188d7dcc71e52292f65fe9aaeaf888883950de71ddbcc8eedb3e56e97d7ad3a85921f8d437da2f542406b9f371f1c37d61ef6ef682724fe22373ba81c224c3c4f0c1149450c1b0ba5c134791ab3ca1da5a8aa2e9461d0aed435dd656dee388d13927962fd1225d7d7269257c9868c8c4776bafeb85927d471ab25de01a78a10cd9184eef9a7f0f1b49b102616d2adceca545c3fa2220fe086fc25dc5f1f6f85902586008bd5b0d55dedac7db52e0e8a2d1c5d29c873a3c936a7500f8538b20b3ccaf477a9257edce86f0ef9cb8100182137827c2a9ce73a1343be5132cae07a638b5051fea128a06654390dd55c7d01f1885d6b8f5754f280e7d7e01d9e516ec376642ed075c27c6db0908183594a0ad3474a2ad450564a4d2c9f0bdca3af956686de895b0b1ddfa0caf7d08b3696418844dc5341d3b5ed475163f09383a633c7ea96b43c5507a2cef927d5ab48ed71699a77a28ea247b5b19f283fd465dd029358795df3228f3d291435e485c03e5d647e758e35342e716351d08bfd62ebbb7033097e4f1920cb83feaade101dcb889a7beef5b9d3c05ad78457105d501d9d3566926dda5a1b26a616b014d456bc018172b49b08a6d5400989334fdfb0bea9ac4b10c5f2401030c0420f2aacd2d384c77e7501d366090f4d7c13f1eb3b735850c42dfb8ab80feb4b4c60b0a9f6e6517bb801f0e670fd655396820f6f7dcdc3f62f8e9983bed8cac53004f591d97f635536063c131f434beee5727042c9a4619ee7443df1201e25cfbdbf82a690b89a90017f0f4b672e6957d7e89ed9ccba23bb38a126fb62e3327e06ed826e64b693e463282a4bc9037b5b8816a6620b50135143d54cda40e1d6fc6b23200a8da015b0014bd576b9fe9826e81f6997ab2fbbbb48b3ab41386eb1cbdc03a2105823393ad7f9a64c47d6a206f6fba76755ce95eaddaa4c2d56d897ab58616b5bea39a077dae5e902a3b6f86237ea60bc4856ee49826fea1cb96ff813e40689d8fe5e3338fa2466258485d2f40104759f1858605cb5d5b06932c84891d50084388d64dece8b24dcd5a4ce1fed40b9509ac66169851949460a99a6874575f885282e986c7d2d5e0c59a162100fea9fd4fdb854ae06b0b618ae6c3f3ec95109cc655b29f8abb7394c1184dcd8e91e1db24b0a48c8e1c7419a6a068e11b71f4624742da5bf2af8a0c1f221d584b032e9aaa6c4527eb617a6e4479022a2ef9931b8bb0efd20a882ed2955b9bda8424bdb14a887e85031d604e03ee4aea010b4edc4818924dba2b7967f696f25bda224e286d5a9d851bdc857c6cb3628068a6bfc35e058a58276681646fe369224ab150318c0f1b3b0bb9d87c4c592be7c1531ca5f1297e04b474f196f294f94c9334b51c22431d051b504cc79caaad2a1a07663406782af742f6b3818dfa5079e314bb2341c8fcf16fdc5ab2baf2af9ed324a8410da339098e11c6300c00d8fbabf77ac4cb700018371c955dacfec92bb223cee6eae93997c2c36101769ffae0eb0d345e6b1c85bc488f2c425f1017520d2dd38426d1c1da4c1ec2ee08f1bf354f4e6e18ff503f416a9675e89019d5351978018080cee06cfb530706a41d16f35bf34121ddbd742206dec37d943a54a2795b8f6658bcb212f42b53234fb50c186063248641c9836ce4e6e11d79384faebb21de403a7985fc1be759c0cc02dc0662be8bfaa5a42a556f060040cac53d6e9716a658f6937fb7bddd18c9fad18aac8394554d750e3e36e6b4f34d97c4e5a5ea16483b2ca74f825725625fb3e3e248ab9d765f5e49d5a0a39dbf7d302857bb0c6d657123c8d3e1ba6cfbe9bb6f8b2c1b3feb60c0cd7447753fc53110eab6efb6ef3268b30caf7be2b2a57d56e00b2fd072e5b40cc82705d4b769016641f013e12fedc274c6fdc2bd5b8646c15a6894ff08361510319d4b2cf77709a4f17c040d81986f6f3b2834f69334eb7b6e8c99ed854f2804858b35ccd8b1bb8883a9723b3026f02fe49b6ad41c38172e0478396614069592297ac7dcb1f022f002f03c2b1d86f2a3ad7185c48a58fa6ad3c1f4acf554be3b3ec85f977c103b1fdb5dee063fc4a94053bed3f236ab9f923f400d923f54b34ae8f8f2aa47a784b56602509febebc9df7b082fa7caf20d6c6757567188bc3a143442b329a10c80a8cadd6ba904cad791fca45e479ea58687d520330bd7d511874219dc08fda5f60f4c6b216584561448c6f64174418fcd8c1a3fb46bcc300c0ff0b9ccf085ee31c67c41b9999089b577f7d73734f718128647ff497f4c1b754d41c73dd13f8fa0d1b89b555e2ed68f5d402919702f9cffaa412550b03bca72492a1292bf7ba90d12ae4b3cd96a7bd0c9e4f2c6e385d6f5dad248d8c4c3c2bcb647dbb1da3f17f3b6fee54fabcde33f9a5d5279af65dc24d285beb006cc14568c21313fe1769c4ef56f60b18dc9eacb42960a988d52356c92ba9582842dfd699fd41a4b923a54d43ed94ea0ba842378edd3f9d58c8978d0502b31580324e90d0696b8b0501df3e69e88e7c48647c18ac347e8493f4b4f6ac9d8657f1fbcc282bbc0d4862a5132b6c5d51d9b2ea1576dfc3b55a4e24a3606e8f013210df46ac7a386a9473138355b8fd563c7ab0908e2aaf16d0f931c47aa735e4430fcd927b9ddce5757fb6a5554fa4d72c4bc395d4d6c5d2e029a935d46161e8ec26fbe71bdd2c5fb608fa1deb423271c4ee81b2d7b6692781c7fc24835827a9eb501c466bf29a92eb31608126da4958e1e8c468e012919d70c5f0c64af20acfa7252b3b4f2c3b41053a4add6203f0fc4d81a03f15d7dede3411001060be153fcae49975dd3f894d48d69884084df883bdcb9f586b3edd1e4eede364f99264a5ba9a9de270805a4896771958549881e3916e9e15b3f1d4851747b755bb5e8d3a22dc33d92ba783fc77cc1214867bdfd0aa75ab7277b5b62feb9955339cdcfc46452c35d0870415fe816ba63333a2dab75ee94a4d01e62a92060460097cf7da67d57f40c772dc53290ab66c52c4631da8736dfc9c734717a17022b5ba04682412c8bf278db470562a1bf30b8aa72b208ae553710a8adbf65f69b3f04a5c6d0aa2e40257eb50221725ddafd18503e9225fbe69df959a04150dfe43c00f2ca7b8eb217f4756501234e77d63516700ed3aed5e267e1357b7e56e9316f6e59e4a96f300b1ae6abc3e657d1e26010f54eceb4d4e6f0badb9a12ef73a52f888a992c5fae38836be535a781862ac03c379293a6d191d1a690e4563a0bd1b1be0804885c9bcff92b24629d4cb162cdc6b8eab47a0ff4db274aa2e4e19a655113ffa0af31c1870c9abd7c100dd4bfebcb6d3daeee0829b3c1b7159396e2380605bc5cbed2ab08afccdd3fdc6bbee7d900f5c7d21bb5d22ecd8ad895f2e05ec36f166247d30071d107e43894af59c831a526fbd35e4b0c6120126665b59dfd2e2fca6bdd56210b39ba1831110399a2c871e90151c88c558b72103f28803c2f371b038d5d264a0ce4ff7c58742a08adb78f547202accbd46fa85937430b2fde35bdfad43c05f0c5d83cb82278bbe3fcbeb5b9d2d151d173c207123e9f2e42cc00780e16d5231e7586664d8de2c623b606efbfb12a31b9169c682720a1372d63294b21ed1663f2582c2e546ce7ce4de26ee181d4661b38076d1faf9ac0c8945a9433430ed962b9ac0761e97f11f7d5d5cb611b34aa9be72845e7eb5b5ba52ca016980e4964e7c7af8a4cd139ca2ec2a4a886ea438aa79e33acee9577ad75368b65a32d4c678bcc4dba9a4b705844f0d1942bad9f3a0c84e13283f7e97aac4768e934e44bc324df2d5219395fb0532629a69d7da7450cbe25775720ad0a1fc170bc2151467b87ffdaacbed4392247f178027e273135a848fa23d3005a5c1b6d2bf6eaa37b391ed543af1afde35584c64e4baaacc92982c1a1ff5819be8011928d248045680099fa56c976aed5d9b7eb9493e9dbce0abfe5e74d6681779939ea1aa3fa11b96b1b669c3d68417227e47a0287041cb253b34c5d8ad2dfe09ad6b8db89c9288e500b2ff62a1456ce4cf3691fd499354a24215d6f390e2013fac6b6c0d867bd4c90d7282ceaf4ad8db0e74a9a8fdb0e1a26d5fe5ebee7c4d0e57666c271d83f3a117385fd893b982ee611a3eca52bacb67985be22954914f596641819d32e2f329dedc6af2de65ae345ee7a506af77d0f89af80e0fde522dec6d1c198f63030cacfcbbbfe1037fc3623bdeaed954429e238b51595388e6f185002a1491f8a11a5265f8f39bcc9796fc49dad0edfada329b39d13658ca5fe8081a68a2bb44830ab4baa7198f9d4439dbd17c37071376078e32e4a1a3e5dc5432eafbbac412e2821e9fb0a50cd382d2198e927aa0c6a3d83f17af06dea29eb79e016cd624a1f82ca87a0c21c2804a4415e160461a3e932afd0d08bb874597a31ee6b18ba606a9caf6b5566e3044db442066d1e034710e5b710a3166c73c301f01f998bf652958fd5baa719e00ecdc0ea32cd1a0f1d7c049427341967358aa865e936448c00c1d2d97c01669de84cc0638eb438717df9957258b42853c27ad955ba80f95623a5307eb935ca61be9e347f7df2fb5d661c53d66828d695abae945ed9bf02791364cd9be25951951fbdd234d2b06448074b2a816ec2db1227b9d962f8deaa831b5fc2f302c458700d3274bc7d6381da6ea9d726de66f1d140273e491a3061e2c9e56d6447c7461d5841a1e7dc7a68835e0365c310cf8d1fe65a9510aae207db774d9860d41fbed88f712e6c32d443c775576ccde0da6c7abe94740bc6f4c4fa96e901db13f83957c72b596ad5753888fe135d024b306d651b8aa3e4a1e28e3ded75f06d7934dd6c8d4e6a24ef7fdefd2e67186c09ae7be0597ecb5154d6880f8aa218c9ebd98b7b6570254cbd1aae82027c7151f8e0acb093db4ba1dc7234d2d5a99521fe593bd93d2ec45924c0124369010e70ff917b00df69c2a733dea1f96c748e0c121ed5962bf5b98f8086f7e5c4c5ad0d177d76aece77d21f564eb1f26f57af93905f9f0b1db2181e10fed683a48c91e72371d442e3694e4524abec02717271c52f5c13cd5787a42925fab574b218ca402a02671ac152f80cd7a3b6e70309030cbbd106e33cc451fdf2e149dc0db3fde7173fe08f9481f78859d046202c0213512254067d1e18d04c1e42423ba34ed276a26d16cddff415b5ca6d6ac7bd03b8f49b5a567a56aa7385d2a4eac010ad6c0a35aaa4ed11a686541527437f9fba8549716fabd6e4f144d5c2779f39d393c1bcb8cf0158412f2efbb39d565ca2d69073e131e005143ed3cf12f573efcc512177c2b06cb5c85bd1a1001767832b159ac2986588580ace106737ff0cdf82d9bb7b1acbf1b53d6b7f1e082383778c4f6d58486fc64f65e3515e3a235960681e638367bd036ea36b5e1e03989841e465331d264d5f9517665e1ae4cbdb7899812aaaca42adba67bfa68e8da233362bba3e1805167e335b87b539baa261b878ce675835a6e754038b9e8ae54db3428a7877379513523f9dc827a0568da07ea7ba882f766964cef1a6887a2c9781314ba5937d87a5850945b0569ba1a1ae6461019b7e34058f55b0da33abc99bb8990d7ab02d6fd64efd89ea69358e3a4d4f4bc8f0c5907433cdb05422e104f016cc0783b335e1a65c25963377e94ffb9a32df74b4652cb1a6e0ffca953d3c558dbd56078315218c80bd1457e9af180904461eb3490870f3867ffa9393c41e4508dca57fd7ea49a15379439545f224505c0b5b40b6b11f1a2b3c4168f63e14f4c52f1d62d9eb3c17e096c7b053762ba7450058a66187437ff45aaf349b689947cc8b7629add7de9b4d4e2e9c007a1f215c0a27fb4645ecbfeffbe185ccf54fa07b9d19e2faa3566d893b4bb76620d8222251d69ac1c5400aa23a7e4b16c5eb03ce949bcb42ee971fee7ff6bba1c75810da732b97a6bb706d126e215ed3f812fa2a3a0b655a8b5ad51527ac38557cc652d335885a6ee559389f44b4a99e6b5998df1b5417296ee02ff37751f807dd6e931e7781bc04f457bf79f93931ff6c4bc4dfbd9907ff72fa8e24c1e57736fc2ddf724c683aa38543c27a86305d14ce01041801fae0342c4f70285173d322ce16a1b4e23eb9009401d91d7c102330442d074f33c21c037867e1842792e9933ea8d34aa7a5e26101569381eb51cdf0e37c7dabff5a490f1ff30475131122bd49926e24644b99920c91029e02be02de5fb37e3a7386716cf759c4d5b3fd8aa97dabc338f6338b71b0d4691f8db189a50e4fc6a48e0543b3d33d85dc9942260b8df835baa48e5c227576a6903a3b7289d4d99942ea481d47c5f0c0dcfd491fb3525fd8dddddd1d15b3c0dc913a3cec2c51225555aafac7e843ad7d5cb87d84463a6b55ab1ac6a99d8d743e2046aa6c6a034915509e397b239da50a48aaa40aa87d60fd030663ddfd24eeb3d2d63d13bb6170a6dfdddddded036b1f30348e32c173880da19a94524a292d7214a5521c45e9ca51b47de4d8e57f451cfde5c21237133325fbf1afb7377ae94619fffa2d677bb9156d386c20ea736638ac1ffa578c1d1b993ea274d2e8e228c90345df523c29c641c1fa1c25ebca15363c20db384abe870d349d7ea4fe22df5f563cab150f116c84ad4d0e36c49eac56abd54a65b3d8e6dd3e6abd6d3f9764dfadd9d45a6b366b0e51a63e441a225f24138b7677ed0dcfb96432993c3d996cdb5cb2e5cc8a4938043b3c443fcbd09893524ae7a4ff458632a57448a614647a699161723824d3260126538c933de9a31641f6a4cf9a384afef5fedeb91dc997f62772c67b49dfbb517676d38254ecfb620e5bdc5fefe8baae8bd2affd844ad722203d8ccb1c51a9542d6478764c96d12713eb9d932ccbd2b038d75b59bed72a2ffc74466cb55aad569d5112b5948636cf8a27a3246a290d5df1ac563c99cc6cac89548ec817f9a358d3b2494fff464a6d2443afd135ba4637110a94f9f97a893d46fa8b621846b1254d2e8cd2dd57abd56ae5537292451e34898441aa7c0e474d222a8e9a3ec551d37ee853b4b7ba295db78cf4d785477fad80d666367bd0da5f3999be9b85da6a86462c5a318e86e7db0fbbb7b47bfa4e1fe3743fbb395f52a792e7c831b72ccbdda77477579f229bd458d08ae2012713a93b7d3371eaa9fd0e169fb74f62425b0173933a1c82b86b26e40a0e6df6271c82f97bd267ddfd6ec8993ebb6aa6464fcdd0b038dc5b26d27324acf26090e1d1de74b9b7f7c3a1861b287bf9ddd3c46562ee9f245c8676f66f09b22dce9e961a673c42b96bc831288727158bc9325323a6f1ec89a159c00608052eb3fd67d7b02118f604f42f346ce7b073487109b24a15927c1794cb6c6f05e1d093c366226c307a8a201c76b2fc76c265b48f5a86e74efbb048d6cc25c82a1bb5b29c0b45a23f4462f1d4368c88bda3e4dbf9a14b9e94521a23a01867524c310d0f0f074508c3ac22e68f6ce23eb3c75173f2386a721f4e1e8bf326cf8ebfb29189d358bee54738c45cde84430bc08e6bfa8bfb162c73a377b1991b71dcbbdc96bbe3b2989edb2a0e31f7b32d129e9cf71ca6de53efe7b7d7d834996042fababafb1afd757996c9e22c6b846172060c7de55da68bbbaeebbaacbeaeabafabbb2713f0f6922172e5a5c9e38480642b37a632cce4716d3935e53ce9b3afaf75aae8844d38447d1ed7568e7ccc821295c3582481b8cce5237da48ff471b2f2ed237d805020f4b9a94a16bbfb7de9bbfbd197dbd5444f7158a4fbe6a66fb69b9b6dbbd9aaa3ba2d2a738a2c7229bdeaa126da3e6c226dc317bebe0fedcfbfbe742351e94d37fa4b0987118c6ae54ca73df7dfbdbec391c39e2b52b3d7e7b4cf2c7eeda955b355f3f6190e2318995a326f4fb79faf6d539b169d251c226932ba7ed484b830c2b02fcfb75045468855ac2f87453ecc62eba8ecbaa60bbaff3e6addad37bb94be464bd7498966df8d17abfe6259db7fd77bed5ed7faef767f5dede9b55a305d188ca82fc3a78cc8debbdf6fb7f436b2bbd1ebb558c9391f80ac9fd944fa788fe471d48ce1f6fd57a8c99d3aea306cd45d7fc2ecaf58fb60bcacb5b8af7ab73d80914394d490941c7b228b3c30f79c1140202116651c7fec6366c5a23c7ad26f59d823dda47f58373c2e337b5c885843bffd43ec82b246f67a63fba09192a671380a514a2018d95a2416e511fe302c361258382a6624610301c9d09a5145be3a286c0cda0128c7c49a287f723ff853a552a97c52fd07b8cce7b6507106a376e210047d84387313071a5494089a41861a52fd3971262f7184933a8498424495547f9cdc0449f4e418d40317398c505a28f3d193ec4850103ed988e718718c3daeb7f1972314c98911267fb411cb0ed40161fb8136181c9544fa83190e41fb238cd108ba9e06ba2ea00be802b2c9bd444a49c45e3c5b1584ed2722a50c89c8cdb11ddac4a29576f64bb3ec0689391b7dd42aa09231222499fef5a41bd3ff65f948b0f616b28861d1da08f240455ff9ea65a59e553a44f3283ee4441ec5460810212121393c8a1c57121866e5ffccb7c5635dd1ebcb99d24becdc8f3eca99ee69477aeec6f842c2f6c6f8b211710be6921e826fa40d1139f3d5fa99157264f8d464d20934963d250b3944f2561cd665ae4e83849e07c8bdb5cd4df12229d65acb719cf5b60fb9efbd925657de721cf74ec4d9f729d5c471b67ef74e643913f72b2b60f7b6aba5df7e4ea6ee03b95fb13fa71f93acd27bd267f67a372c7d522c4e49491a16a7148b3ed2977e059721612ee788cb7046e896a4fbef967edb3c1c76d8a3b44f7d59b51d8ec765b69e263f405824f1538475a2f6b169a50dd7a757d3b25ab1a88514db398c5a7894115c8a06371f1001a188cb64191b36a44983c6a3007199a6b1a94228c87e80b048e2a7088f52b113653e1492b047014150a8a4ca66681d9563fc189a992199bffdde7b4d23799ea769dd6b1ae93dcf7b92d6611cfa9ffdd0c3463c53d24b2d088ee93fae04bea6799ee6799ae7799ef636523b79384492bd99b5ec3bcdc325c88cd30fbe8d9fbc071fec4eafe193c7d993162fc83a54a99696e7d1d2d2d2f2038020083e0641107c1616161696bf2c2c2c2cff5780d3e974fa002e00d774bdfb5d97fb7ddff7b5c3c28673c8337d9316a46217722d2efa33c9b7ecc0301690c85cc917faa73b87e40bfdc946aca94f7f0ecd32a2ccf6f4e7192e23cabfde12185ffc4dd7c617c721129f8c7d46807f2bf1171fd935d4a7df4afa47c54e286e25ada46d8833a6b734ec1e32ae1f760e99be76eb9b6e29bed4ff2e8d2f15873619c39f2681e75401548ea470840ac5b20a3d43bff040f60076af1cb520442084000211910870b091e903a9b1c63d15b16c4599494344d18f8fba214b3c934c25b1077d4f071bcea14cffa23f87624dccd45fe8d3c720d6a06087f40fc74e92a05254c833f0a76564ea382492432356f64f83c03166401d41c0400e32c61842aadfae92b31504ea8a06c1fc911b394ba0faeda23cba2df3bf3c7336d3840608057ea8f1e14725f95850fdc62d32a8406d20835a7781018675117bd4f8ed2999456b2e32a87e1d0863832ac4e020080c99330eaa5f00b2eda0fa75c9dc4df5db923badbd883daccf3ca859a42263b7a5bfe89c05a97e9b8e4cba2d0d25c79ca5bc544ca55c52a954aac384b41cc0a56c69d36aea4b657765652575599dfa809246018029015202a4585200a452537aeafb8d2d4401bb347b1650f58e42477607d9acb02eef4f620d14b146fb7e8f22d66cdfef52c49ad2b37cbf5721674cdf2bdfa7eff72239d3f2fdbe92333bbeed77f7cd7d7bdfef54e4ccf7fdae7219eb9b06060685fa9fd77c978bfa11922f54a0c897feace572bfa3fbd3fdde748f9c107bf46fd784d8a35fbb25c41e2c17c4496caafb175850a5c05fb9dc9faef7a60b830c30a9ee5f70a04aeafb2c7acb38b78a79b86b6f942fa8dc4b72ff28c684994357855295fbb1d055b9811c460c1b627288fcd6c5bae6755d0f5e9835513471068035be68038aa031624892eab78933f1491c3d4de8d0c2136190720c0a8a5fa8b42c1885450bd9cc0c00000200a315000038100e864321e15824291aa67e14800e80b05e6a4e15c7d324855118330811400c3060000008c880d48601c883e03e0a448a36021304803a2c5cae6c8c108939932f6ccae7048ae50433e3a49ae6e3992a5f3e31738ee443335de77d3c3325c9a742d4d3015675d79c1bf3af1359e17f26463a90f3809627857b8d39a6827741b42aad862eba34422aa5ba35402f43ab1a88ba4f9971aedc055db71215d5134f55d0054d47e24ce8c9ca19d33c21f1656c9ebe4aed77eb9f757acf62aa56dec6fbd0c445061474a0f5c362953d1a6547dd53388eed8913af2dc116b30deb79a4f50915bb31a488f30465b2bdb213d9bbf5330284ae475bf1cac0fa4c0b1dcdaaea25a3cfa25ce63296e7c23c85182b5cb72fea4b04fe4854e62428881a4e5cb07049cd6cd396658f7aa84214a3f6bf25f401e694436224a6e5a7c00dcc2bf40acef11bb4516e201697ee8c6a980f903cac9a52a09ada65dccfc26f3fe6c48a91b49cf41caac4f84106bf0450306235cd7f62ce1fad753c4f6ce13b7ebf628d946565b2b6035d2b85ea34c54d3dcc80c2ba7f417b2d945802c413529b16c5aab710a71b7bb9633191477ea24ec8711373038a2531fa8fdc0ea3c7837fe3dac09b3f37a73e32947fa36ac87e6d3e3ecb44c6bdecd62bd12890b767129cd9a75943b1bfdd113684e3d8c22bd1c58877472306c2ba6475b43cfbcd716c1713572c854f4c7b3888fc717481e65a0232872134f416d4cadd18ecf9419f3a71eb49124c6caeb092461da8714b912705f8d2e814cab68ed34e57963c449732b2e11fcabab12476c3b50fab46d2a9cc7ff15bc59f393ba33e20005b41b8d21829d95152725b105202ef15af02417c1f8f299269bd6b77edaff77a2693387b9f6fab53583ec79f877d12d3a14d1d309a1d847c1a21b2800148315a46a27d408064c49bf9104469eef9e2bec9a88d820443aa790bf6c2832882d85704acf7d387a7f369efa90b7f892c25ee2f1a396ab3455e6781cbea290daf566018b50bdd1540aa98b3be7de128eb782d510a468f61749979a6a0f189b13c73c5d8b6bbd009672075c61c3b09f3f70dc82988ded8379d1c7625e1e0015d938e1c86b0589b866cf94c773be0aa9319569c320330cf11bb46d0acdb8255615d9ef3c2589d20c4f226c6030480156528a54b5925825e2c7dd19e679f4954e7c5705545eeacd385ac3ca8bbe2242cd72da5f2c1a4bfe347a4f9d1e204b03d6518f34c063732b26584cc84d682d4401746d08549d7a2baca0152bd1c578791c3f208bd43a8dd23d0edd172968ce37a5dab9bbf71fbdcf6b894bac4b8c57a5e7d80c35172807379bf77d96f82d5b39d757ef01768522fb00202ea43f5cff2af17da7f0f3701b360e59005d60e525e32437e85c040cd0cac0cde91872802c87460acaee92f42d7744bbca27d32685ae4ca710ace7200eaaf926d836299a173cc7df56a436bfbe313579e8b4f1d4a074def263f636819de5c46387eec80945a27a23ed10334517d49b8221835ec2d488430be43e4ebb60bbcc5f12899ad9c264d6135618114ad264fff18f88cb56879dc4802deecdb0f8f062f3715b2265764955e6fed0fe402eb7b72928a9cd82ba95d2aa8638fb3c07a8008932abe2b3e3ae8aa95e8808845f22244cacda10aad136d77074b03a6c57c4454856a8201ad4a83c2d9a2ca2aa1cabdfef37e0a2fa2f0188a5cc1dfcfb3881cfc6496b9bdb7716290c0380b68bbabb8c12ab290fbece46698cfa5da0801cb54a47e40b168df1b7ef7c01a5e391555acc28bf8b69506ee557ba1406d64cba1e545811fe2002c4ce26ed08f3b6010bd8c35706d2b1114228c648a9e38e63701aa506fbb7cc8b4e84f81801eca77555193c7989241a355ab43f378c63048a0bdd247de0c08c2196f11fc77543b0e9911ec93cbe976bd38e138bdb31766470d9076b549904acf12844e2d304c32f28510a98d1d3d48623b1102f60d29e2012f5f862e8c17fdd5d1b3ea70d375a4698000111ffe86a0defdc84295c6290f7d3219f960eedc8c0f4f65b8b26f119af4ffd4bcdcf8358ba56da2bdf28fba86014d219824637e77eb01b05259311a1b87b137761789810e19de3fd359b9c6343d386b6d43a074e5eb483bcc42a7e202859a6238ee64b56ce039e8a85eced794855cda5d25eff28c76998c75ffe0131bfc8f69ee2b7d7499808c07770cb173a1b7d8938b27eaa7d5f4133f08144824c97babac7eb79170ba1154b1065e03ea54d11ed5cfe6dc3e223e9d4406bedfdcb437e6ad15a4ef82c3f8f6748233e03073a9057a440d661d08dbdacf9549a99a4fd0f09ad21815de191e3cab6751a2f1a1148024719d7b2ea94a6a5368fa23d138a2e2dd43feee03707a1d53901a4754f619f1254b7c04ca6ce9409635b910c82de34bd7c58d98e8cce94ef69da77198a16e444674ffd52003b5d16c6567a180d55475508b8b2f81fb5b8a8690774dc03e5b903efd62c459217ab70a74b0ebecaf0e271fc35cc4026b0f81d577cb89aece3a49d25610a5b8d4a98a07301208354c74458eac39be8d025d2285f6ed796d86dc09040bf89b384291e0713cb82087b1aee9beae82b071b7b1abe6109be79633d6fd608ee280706461a0a65dc5c489621b203e40f1e561d5af3470dfef42b4e1a43b4b641507f7b7be8c9a0b63c756408ad3dd3c5976e7968ac7cf60bef0e702f1c8f7234c7de18b9abec8232172d0617a2c3a892ad40bacbc34363073120dc3a0eb5d74aafc8d6671b879e17c872b7555bacacf377d95793b079f211aa783ad18cf6fc87484f4a6d6143c9fe903522db515f037b241d4bf266ef811b728b48b23915c80a13d0d5baab69526ed2183e9cb0298924480284c6b4f1cd345052a30bdee71648af3469a4cb7886ab7035c9b744af2e9c4c9d80fdb001452d71c9f982cdce74d741b247056587028ced3b7d6826ca073510928e3a2ab7d297d328398f7409a98d3cccf02ee01380135c559e60cfd7fe02fab3e12066a7e73ca8f275e5b6a6577c8fbf228fcf08177530fbe298ee00b4371db1fe80f7214c8bf3bbc071be7e9721d906a6a09b07a84af770fd4a542fb1b68745207302348ed0c06f93cd7d57007a8f87d707aa503ab8e6eaadf5a09df1f34828e354e47c69d9f4e9aa51d4833a20b675e35863a004e6858c0aafb421201836df5999a8481c5e96f6ef388213f63d80ad4ab32a64ac1ff7d9380e346573aad5e943be9b5b3b11840d8bf5d7ae5daba50e7e87e91d7a87b5d0b435dbea47dfc3d4ceda350e54d5d2d5a2879706a5bc8243ce99719749ad95adc1ec15424e226d5aa3d8d46ccf2516798d01b5f5c62ec77646c352b83b79249e1f6cd520f1c8616f1ec4ecd044c8a70f82fed3b1175d12048293b8dc9c14eb09713d7f64182a63f6e7faea19987587bd17e270da859d99eb1ba939adbaa72521c15934cdbd5d629ba41f571f0571e5e8693266c9970741bbadbf660aaec0766741fc369111ed813519e5668a58b8a3af07d3a670354e1e97b6f86f225bdb2e792c6801f63a70fa392fe16ba33493b6ef09b16c259ccda2fe799bf7479a5007ae9926c4f84c1175afbd1b13821d8da5019db9f0ee79200e22af263cb5821747566a62cb4aa71579005b3b77fc25013f1c78cf62e2ff9768ce590708228ffefd4c731f048fd22d81b421572b0d5325a756920180f5d2deae89496c0f8cd933bdf46f68ede610ecca2e21e8208f9b8b2dbb2c8eaaab22ab2eb3c9abc1e3ed8937af066280c381ac60bc8125e5fcae02fc1445b1371d5df9118d69a4e2134a65c04b755bcc71308f564ec56102a233fa4526d44604d035c7d9699ac494f415336b131de6a52c7a13f3787a8c388cdde1e51b85ddf019a41ef67542bbecb051dcb75b206bff4bb1429b9de3ec7123b460fed8b5c6cd238614a0ef9daeb78fa3381d900dfe5592969ce22aa9f61b580a464a10c2b86fb6a048926737be59549401726883774fccb7debb2995d4561b49ab195bae3caadd449c8cb0d71c754740f42388b88300f681017b82f7f5c3322bca76c26d6907514ffe819bbe4886f0e27e6d8c3cd61e15df00e4de5633882dc2b4fd3b7a263e3360e19fdcc56a7ef1a619528c73faa40ebc96ac2cbfef9ada382301b0496598ebf800759b4ac29db377468855e4d68e3d3115f04dae19079668bf1c030e2ae954bfe831f4645ed2e0ce19ef0b5bf1a6b3e9486a2a05c27412a12cd2fb1564c50d8b4614dc2480a4ddf1a040bfced55a38c9c67010a7d85a09a86361288b4b3b5286f21658a4140f489420bcd8b96ca97384d92285a282b87783648a60f59f25fcaac97125731dea54c0ba4bcad5454a641da4a14eeade47632eebaaeffb570cde9a1cf6f5772bde75948d40168f34b9bc3b08692a38e18a4ff3c553463baf5a126f4f47cfc99c8703b7307dd708fb3b6a1a561b70bc34ebc10462273d3cabc1ff0d4b69b093800a9c27f6abed08f0a4bb6f7d4a83bc88a94841311f04ec477fe9e0aeb217562662c61cc6b419211e10d4d41c94b6d3fb76f8c8a43b94b6a3013ebdd6a749746ff03c7dd39c695bba3471c11e6faca73ec2a149db8f54768fa211aef9543417d4f91480eec55d3311c0a0456525e18385eee26980937a601a8b9a24df470b1bcb848424e51ba9e2a2e831a425a6b3b55d4f8fd8049ed1102e48ef81bd038c24db6bbe52af02de1689aae6d18c86b4963d66f32cae46d056e9abc231fd365373cbf83803e82d79022394aa32c67ca11be2a567a1b916d7d33bcac7d6aea46320e16460a34e5d79ad60ba63195c526b640afb34e9732dc9328d1786fd8a6666ae365f7591c16f688541f1d65ed89b4b7ff86aadc200bafa00e978c86b84cc10e836ea55a3f9e388cd68b9a7d41960229d40a36cb216d1de409e43d7705cfa53306fb3fd82414c148db9e8ac99a086081e733ae88d2dd088d0a19eaa6803541c465dc77e9fd4d9570c53ab19f8b13b281e6cb9e7934745d543c7018b9a2ba862b6a000d070f6ecaddf1fbb89fe7b243dee07886755b3d92aaaf152547322e6d6192ae76644a728369f36af26fcf07c3f80ac78ad68441a3ab3ced96765111b0db38381249cf0abc2f6c2474dac34534b68bdd2abd6226b4bd9d26dec2361d6add0191edfbe1157414b3feccdf456423541e1f6afe2de3923d19d0661a8a49eae620de94bd49e80a4110097a574b874c82f4863f9972dd4bd00f7761dba26278d2bec2d4c827d808bff532ab3bb2e5fd5d243e24bd985dfb9cb3b767be7d9284d3a48dbe4ef54135a0e01a9cc01196a899ea242c614b369fd6587a435fe82f2618919234f0d41cc4424011a3ed7f45aa04841184e30b32cb763cd07bc2ccce3572ac28ee83df2ab428cb8a4209b1820be76451a6c33e5765556877cb98b17353f9a6ae78e34a0c30e20b1be860b1b332a8b29fd4ee5006a476f0c2289d403a20e1ad0394f48ffd35061bb81013577d197d42bca68a443cb2a987ed88119291024534e9cbf48edc0b1241b9cc559ccdb56ebfa490096594850b33b8990e8ed1ea4db1c4a493112726c1939474c112274c183cb39273836324342b0d7b6918bb6159285526cdd868e89c09e80fb2c83b9a9ab2b01ed33daa5114a7caccc09c91313153e7702a155099b84679a2a4b56cb2731cea5d96870549cee7966632cf498791995bd6553f490f52900d33a3c717adc07fce35a529133acd4c59015d66d7e97f06799d4926abffcf11f9ddfc2e5ab181188a53548744361a2f998598ef7636109473c625a93d9e87f07061293848c3a1fe89d19a8d89a5046171c8321f001f8e0ac98a19976136d15179460334e60f0dc9801218b3e159288c02cd3416cf6141fcdba793a07b28f8a2abba7a7200b8d55a30a5bd559077295249d4624f0b4d3ad9a9ccde9fbada78de98e056fd052b14e88730b71bd989ab3ac96be62071069fb8e1530f13de1df022675220185f31571e9ebe42439ff64a97b4245f263f3b846f90b4f94342beead50a4372cfb3aa927468e53acf89622e3a471edf890e431e7fb4b235a72034228c6894fa0a0a14b6afa69c54eaf59590e20f84459e87715db10e385775836c1f16efb85dd62efd71d8b52971dbf5c5b904146ec1470f566ea5c849cea36a7a1e0a519dcaafca02b4117fa07f797860c11aa85da2e319784811e905d8c500fc6265f80324c23749adf786b477c86f01815277f4589bd0ee4c4d943d60c365f9e80ad9048a0fa3779d52a989db32f9dbe98eeb9cf776b02f7f124d52c1ea6fa6f01cb6cf7a7f4dde0c43a8d3db114b0070a17e36b6e603175f20bcc5a0767fc8c817ad4a6148ce79227057556727496e8720a5259fd52214ba5623a089a1d84109b84d9056b9acb763cd76606e12b6feecfb2bacecd842a1e208a71da64eb826c9a3252d9240cb8fa8899693983dbaa48e66924432e4f5780489ef3b0197152b49da419bce0a85db7fcf5333c4b49cd3cdd2861c74992ce0ac4b7a9c7b357aba0e0307a6effc78935fc1222cf4d3b80fa586ed0cdb867ab72698375a20fee7f016456e40956541c0ccd0f14b366c361f947e65e1a93f1a74a6e6276767190e52b92f70dbf02124cf55bc003caa61cce31fe611c607d7c33d0976011d726f8cfec39d0115a84b41261a9dbaab5694a433e72e80a284fc1e0d738b9bf64aabe02b32f70413206428fa960bbfc4fd4a1e62790a41084cd9006d0b3b435581ee7b70618a0536a7f1408889261a99c7277c3c16d262c51b4780eae6bd1908a9af7c1352963304a98ee619944a72d032b3f5642880d3399cd0390472940baa7d196593f9bf4ac0bfb370547ccea2c55ea74a1df72a537a21a10746fdb41bbc4fee13664767f8db76db2c03e0e837484a898eda7d8f2dfd29381fbd08952dd3c02c4b1e6b438f3462f5c818f96021cf67e05e01402cc6985588805d2350213fed39479ccafc242c8be83fdf241e565c5e3e42279c7bbbd2f42ea38d088f627867b7fc93e9f7e3aabf7202e5ffb0238b628ce863642c20593c7d8a213aa850875ec6a610a63e430b91c2e2acd6a0994779d50ba50ca7ffacc39aa6af875f870e618c28c20207fbbdb8a017eaa1c32d7e27fe899a51e8b37d3c4bfabb196b1e8df1ef42a79d960367c65030c21c7ffcfa388171eac498af59dbfbe4c9cb2033cb20ac8cf4ee7759d34f519c6ee595ddc12b636caca7e8fd2984f2c817f4422115a34a2b44400e8ef03946c60a0d316c848c5843884a00ea9acfb21def9c3e1526e6cf7ac3b1ed98371c1e79bc58cb6fa54b0535e43fef0f18daf5acd9ce81be5da0558017c31db9b11099d3f648ef02434218f82f94ee5d618c96f17348803bbf7aec0c2ac596e98dddf3313addf043d4248bbdb94bb9a5758e4ea20a263e3dc84e95c5d1ac6a36a64c7026b3ce50860e0e9e3f1c730b7abaec8d53088f5e93263c98dcd7a0b48cd9339d14502bba4fe3cc0b44e86d00f27e0799f20f8d6801b418723b2b6fb7914ea5e0fa566a5a8e56056da78cfe3f73449b2606d20670c6f031cd7552494e860061fb22f69b2fa32c85bfeb0e16a0cf060f64a0bd98a92236629e63792fc5782c86deddff436dd42df64891c02453f82ecc8bf70ad903bdf8e6defa1ee83b28f28e8eb4d12328ef51739ebea37c22a1871edf1f89553cbddfd8190a5b5e3f0b8869c7d3a6cdc10cd2c90728654be084d279427aa883eb8663499161ce257c34891a52f4cdf47353faa39cce05669293133dd6589989f816f1f08ed991a839895dbd9bc2998372803453d51b236601449749adb83de393ab86440c61f83994dc83817748e2bc5112355afbb95fccecf74ec53e296f9595626d2caf6313640bf455607dc48d97322c43abbd33c2113884ea8a7dfc0ecea1be7a73d28135ac7c8848674eb00213cbd9c2bc7f83941b97b39ebce1aeeeae5f4750246e94f615a46b27a623793d457a1ef1844f5f5b6718de801e8f3ff254051a3f4a245125f5237f41894740808fec043d05342eb770684ce0639c428d93672e4e8878dcf7165d05e334ac91a9e12bcc1089a68e30782184af608f0a8bd289a532136e4a6111ee32ce3e020f467ea6ac423c115d6869ff3175ce4ef9f8d076c041f1880a2c674d3d08faa3268998c6dff4bcbabe4f0b2ab54f2ad5531506024e1f68b6fb9ebf8c126ed61c4651a469951e852792a69e2e8b437bfd0421b539243f8a14cfe3464a02bc4128524344b7e07b6e975f4043c6961e61d323452e826b5a400f9dc83335a7503280b7ad21956dbb67e3f49ba5c62eecc244e8340c6d0cd1296fd2203a01a71435260b6f80e482a0dfc0d21118e6971398399c22681ad30e18fb587e5fcf95c046d63de60d0049eeef5f5217f6b760eb73965f126d9172abaefba59d4361b78a3fb3491aefb6e93ff9794dcec5e08edf6ab858a6990bcf08e81415af3cf2a3805d85f2db93a8c8b280971734514b4187ab735d8d5791655f784cb2dac92599767b3bc3d07423706e4a026d49f8a447df70e1ffc8e5cb1e52918404816473993204c42601477563fa64f1cf5ec514046093c6b0e545284cfe7047fd605e57974a01700414bb02da5cfe785b3092324e075d8bee820cbe028973886b80bf4f7a431a419122088e43bc1069082a187245d146c571586f31c0cfef10dd1033fce1bc6f3f883b5b754e062bd76b2064c9070b86d2782f79e2074cadfd2fad6d29f7967b6f29934c0178074307a407cc30a47049f79733bf62585e5a14249fcdc6af53c68fc68804a7cf0fe34b99367a61eb74a1615fc2ce1d7f71488af40e8b1bd2bf31b821fde899d2b8217df6e46f9d05228b05cef9514b53249ccfdea953d1ebc07c24a84c8b54d336b6f42b73364ecf5ecafc92cc00ca8fe50dcc2be925dd5c101116de2b6f5029475decf2cd5c4e97f37344f1dd4ffcf0aaad48216905c88a9da2add014dce821cd5c7e13b3d70b965579c37baf904e7543980c174a6f0ab08d5e79d35d71efa5e23ae398ceb8770775a164d32556026bbc57de7bc7901f13d91b6ae972c8af1522abc0a425a3e58623fce814770d0c9081c56289e07f34866158c434128d910c6c8f1f36e3f47d1f29af612b3fbd123ae523622c496192d7bc9a79558b9aa6691d396e5e3f9c5f4ea7729831063af2bcc27398f3329bce5ffcf9e9452b5f39464d9360fb8c3d3fbd38e5b36e48cc128b229150c412856837247a890163a01eaed3ac4eb1334b89de0d49a153ecb57209423ac57592688c4cb05d7e18958054def8f86b87dc4ef15bc671cbc30dedc4e6b6d9da63887727f4d7300e7bd795860839a19f04c66167f69c21239cd0ff8371d8ebcd308d142e799a22db87204cf2f343310efbe5ba21f6d40db199cf3b6150324bdd101b63821bda27956e09a6724c4c4c4caca470c9d35a2b5b128d110bb6672fa5bf243380f16379c34aba4d543ab624ed505417b203d99937a6df053e8d57cced1d85dbc5abaed25d054a958e2c49f2317bbf6059e51f9de2e2468d8b46984c1b1ae5f9904a50fbb8886e340219c8f2a6bbb2711aca3dc55d2b5c0632e9afc9a8ca1506b273e7e0c1762065c6c130e92c575a0904afbc288972e954f2d572a3b35c9540f64aa25a8691a62475bc24661c2cba10d6b5550ae5d0478749e3466fd7c786d23d1f5baf615886c990a455442d99fb496cf5aa9bf44df78ecc172c49b26bd2291e5636e79c582c7d47e4aa69678bda23abb238d636bf907624ea9ddee99dde393a3a3a322222020202f2b13d957b84988f4baee44bde684e59be7e88808c5e4742b2cb9096236fb4a8d32b540b0ca43a3b0618c875eaec918174e7ec9281c4387b09449e7093e71098f08aca0df0cae58d96c3e54ac66974cc949cbdd65865646d35d3e8c655db914aedb10d5e1ac955043569adbca821d248ae1cd45c1ec92e4443343aa4ec3a0913d31e095f4b5d917e93a5de9bbc084abb638735d59cba13fc31999a9a9a9a9a9a9a1a93c96432994ca61d3b76ecd8b163c70e1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1e3c78f0e0c183070f771e363d7f7d87a97626646fa989eb8a6435353535353535352693c96432994c3b76ecd8b163c78e1d3636363636363636363636363636363636363636363636363c78f0e0c183070fbf2107e441dd79d85cdfe14da2ad3361be35996a50f70b61be09433b135a08ed8af4c758f99242724812b1641769248faca55d77e4e91766dd1094c98ba054a2f5323aea82f1b410b6d343180b6bd91d5609500bf5504c6702f6d65ba8b3681b34172d86122298ae08f6168542a15028146a666666666666660688e8e79b4672ba6a6a6a6a6a6a6a6a5cf3e9a3edd861aa21398d8edb9920df4a497548d75c079df12edf48477928be91a42f2c7da5ae88fc89cdccf0cccccc4c332665cf6033dcb6cdc4996c6626cec418440a8b3cf6c110dfd89cf336d7616bec0e1bcbadb271f336f9443e89f289f49142c827f2897c2287903ed2472e21a5741e032601d003844c00a9ae6f2ac9b6506bc1291f380408e1870838f8db0d912b068d8e668f5ce9683e79e44a47f3b923571a75ad6a5ea957629c8beabece8b578a60633c13103776df5c24493697964446721e79b38bbcd15c068d1b9d8b6cb50e9a4b0c626573e9e6d23b90b2255bafc911f41bafb9ecba215d001abb793252071706e03147707900cebbd65a6b555fb476c579f7db636b73fa5e9163abd74f3dd2cf78730876c2379ad3789307ee33b8c5e01bcd7378cd05df680ee3b50db8b3601ccd3baf6bc0389ab7d7428ca379c9ebc09442bf0331dc9fceb98ca7d36cb0089adf40411d9d1b1c9c4ca20134bfe10738776011349fad3e80e63939b27ffa9baf4e69f3ca910905f3d53df246eb2a3104ade49d633e5fafd76b6e6ac206cab5ed0b797c610e6c12b588b42f2c7d73219a3a78cd89ee47c41c82945ee3697cf38542a886f24c9d09f1ad774f57c9d123bfb03fec2aaf790c0262a40ecf6e5ee562e2c2a55b3ae0c285cb0ebad5ad1ec11b35c8779052102b639111bb5c9d644aa50f5dfa7c124f9f87383e9c2d1ccf7225f3953ed43cd2c218abfbc21cf20b7b92d16fea869040823549c9090080ddbc186b3b2b3965ad0dad0280d8cd83f9eac5aea35de7d4939ceaba2e94e94ee8225124ea1b6d0c222232621bf253e3353f7543ec0238aff432271d8bc34b8ec3b39ee494906701d8cdb32fe3e9d4b84987d3cca0aa986a6874cca0aa589a0347576b7792e9bcca0b8aae128334ad62aba8c0be5ed6c31824c56b6ebbbbfbba22fd3d2c33e99b01d8cde3bee4494139c993d2f21e0e82ebf0743e0780d3783a9ecfb88ca7c3c3dd4f9ece0e1d93cb780e4fa7c64f5e3bcf03f165b6dc30326979f1519e8e0e1d3a74b80e1d3afc861c50878340430306dddd49222bc66e291b49a7f87b41068cdb7e8fb8d1dbdb092db19ef67c7494a7c06872c50d29464cb08c003cf94011034a0e61bca480d2a708063e5f6cd1841758cc0065b22841163f60b9c2d5056457a15572892e7e20c111518638228c24c007b460ca9421b4c8808a17c84a3cd1cc4011509891022e61a8800990bd05b91252861928f0420664109d01b2cbc01e59ec71873df2f012160081822a5638d173460fc85c448313299e84e184ca1820f31a2c31d0e0e9e289269880bcc408275aa4ec80cb0fb01001b2c7220692256e99549ebb78f629cf1e7f5a259378f628d42a89c4b3c7a168547a761c6d5c0cdbf9e84f5a358fa26cd22af9cd2d184fabe6378d722871495f38c8fc32bf90482412c90b03297d3b094baf30563746caf2ed24563ba9d54eda69557bf1ed249e76524f3bc9d54ef26927fdb493805a458ae2db49577ab5847503d8de7de12073765dd7796120a46fef8a7a3567d709c9d59cddec88bebd63c9158be1022d39c8428723345aeddd4eab5a8d6fef78dabb9ef6ced52ae9c3b7773eeddd4f7b07d4de51f1eddd9556d56fb74c3061adb55e1848f7edb64a952ddf6e85e46a02594bf4ed96d56ab73bed96a7ddf6b45b57bbf569b73fed16a85592e7dbed10577cbbad5f38c8c461e2506bede28581144567b2e5dbab905c4d9ea167b5d7567bdd69af3cedb5a7bdba5ad559bebdfab4d79ff60ad45eb7f8f67a85fbc241a416a985e338ce0b03a9dfce15f54a16f54df4a22ddfce1d1d712147f4ed1cab9d6bb5733bed1c4f3bd7d3ceb95ad543dfcef9b4733fed1c503b97e5dbb92bade2be7daba28a6ddbb6cd0b03d9be7d7bbdb617d1b76facf6add5beedb44adef0ed1b4ffbd6d3beb9da379ff6eda77d036adfccf8f6ed4aabbe7010494552a19452ea8581d06fa74272257d7c2865b5d3563bdd69a73cedb4a79dbadaa94f3bfd69a740edf485c6b7d32b5f3888ec41f6a0699ae6858168dfae15f54a3609b52d59885a252457b24763b56bad766da75de369d77ada3557bbe6d3aefdb46b397cbb86836fd7aeb48abae1c61bdf9e15655b322ebd9a607be6858164df9e09c95577e92e59c66acf5aedd94eab329ef6aca73d73b5673eedd94f7b06d42ab9f3ed190fbe3dbb72c4111886615e1808f6edd8942918f6f383fd1001bdbe7c3b76a555313e72d542423bade269c77aba6ff0ed184bae9aa8b1d6b7cf2f1ca469681ae69cd30b0399ab6e9f42710eb1da67ab7deeb44f9ef6d9d33e5dad923eedf3a77db2f1ed93876f9f5764175d4829bb482f0c244b16298d8ca4d1b7cb56bbdc6955e3e0db254fbbec6997ae76e9d32e7fda2550bb74f2edf24aabb46fef2f1c24d21069e8ee2e5ebaa85751a77b28eeb410575a357de42aba5c3faef8f3d3d3acd81ebf70100420e0a387f148c62e5e184851af48e89be81dc62d442f219fe8b13dbe88f8ed39f2ccc041603884e89185d86a8facf6242f78773baadddb53ed3fda73ba8defa09e243efb761417379ca82d6e388bb8e1acf2d1711071c3e9831b4e261ffdf6e08693e7a3775bdc50167df44e8b1bcaa38f2e73831bcad74737b97143e9f3d1bb19dc5036f909f4017d7419bd24e5861328fa349a5b5a253dc6a01f2e2000f52ab25e2cb8617771e2863da5891bf6cf473715ddb04d64dcb077b861ccf2d17330b9387cb861d4f9e8389adc1c506e8e226e78bdb85ddcd03f96588ff5a4882af708b1355af187a727baa20f4de3c9151fed57506ca5497879519e6a33241a3f46f4efa534870eb1d1349a443bf188d5c2d8c078faf5ed6a9ffee957a6c61136e2236d0b2d12eaee6e5ab73376282a95232b476fd05dda8bd0633db55a1c66dc7b7479063e513cbbec6955884d7916c2a6b42ac47abe55dc2afe215754de447747a1eebdafead94ba93eb465b2b83fbf96a4576bc30529bd1785724fa5da259ddc1073b55c2f1d73495788b95eba0d37a44dd42e56b529899b7dd82fce604e9db24d54d44472255bd21d85aa38a6b8a16c713793972d12c8205e3ab3f4e1a573d01050249081d4b99b400569d6240637a8c70a0c6e74c9a48a1b9d3e0741d129c9d0e0468f790e2a2207cfee00d4d76043373a56247ae6dc29bfa76b9f991dfbe2fa9390c3c58d1ebf53f4c204150617daf943edc339e512181864f88e34546bc3e58f51f179d62028421c9d4f913fa41fa70eb7635ca2728ff0feec14ed143b4685e747a7cd2162ccd2436f297dc84c10d777bce71be9561cd5e0a577e17dec84308e742c9d629d4e71d1f4d8c2a0e084954eb1e6cc38118566bd568217777322d24be89424d22949a453d207e3b0cb20315dba8ceb860c649442eddc9081be753117520291a3e7a027aecfb48c46fe300efbf6371f6e4e9384814010700e82ea303f278b35848bdb9742e537c24020973df6cf1d0434ed4b75ca8ee0629fd61c968af28204a5fb81eda2cab8b195ceb8d1594a29a5a41d0db45b45664263e6e841ca1c719de725e346676666e98514f3eca5605f921940fa5367447de185d823f9666429e9d7ed9bc604ece317ce25ecd143fe7a3c7f23086980d08faf3c25d69159d3dad2ed2bc69f90bbe3f903e1f9f3de395843a07667427592db4b318b751806e3c317562fc9f0d28fb1ecc84bdba9efae88fffc72b6add6221cf5ed9b9837599f5d6c8dca3daa0c977c86ba16c68873db2a9a92a8cf6080b81ce4b29783310a720135b9616abe0ff9a3554850a9395120952ccb1c43e267672850a06ca7a24e50ca72a373770947942ede376ce745a5323ad84c5de8ec84347a83b299030acca4c6a4399ac899e546efb6df5ff881d7dca82298d0ff1e8de7fdc738ecfddf57396d7b5c83a7c1c014cf5abe66b63d06fa8ebc91da7b9ee2abac32a5b0b00ecc8f01433d4006168ba553c3dd93d41e6fa74ea00f437f79e363901f8d5efc9e241af9f29b9dd2ac585ee32bd791b949d2f295d280c038ecdf33155f39235adc35f2244dc6619f8fa16918d001ec91a42e18d776e48ea648f730c4975ff881ef6f8a5f22631644d4d4e0130feece3310ed39c6c840ba99206e6420d8b3cbee84cc073da4d1c6ec4c604e45062223d6cd047163d64980d76041174a1891440a8cca0099db6862680d337460828a31c0aa4d8d23a6c9ec92c219bebd8db831355c0e0ae2c9c7e7a013f83cb7943f60d926371ce1d90477fa604b70d9adb8690469cf41459021bdec897bc50defb31053de7637449e203f992aeefcb2e7a022c0f8907e0cd22c1f7c385d4e71e34f6e89441c62201d98e7a022aefc50f95e25eead40ed80c7d0da1b3f607dfc2e159652f62b894bba2950add468996f113b2b0632d22b061b467a14cf9e42aba2cbf650f0196a40abfabb1e168b45832aba8f5e7560f4115ac54142f87cf49c6e01185dc8948f5e42ab603e12f1e4a31b914c7c7414aa606114aa6089b3394e12330e3b16304c2e8e1aeef36b4b12cf5d0b695311f763cc7918149ab0c1f50f5d0797d9230b61098382134ca2fb87ee2b1d6ab051823444f0c42505183dc5ababf32383a1161358be00a3ffe0950b3bd000056d84e1258b1460f41c5eadc0861aae33a24c21830c30fa34c1e0c6371d7171fc0087092eaa891bb296670945cda1eeb0c1a180eba1e250b9a84c2a101c0c6ecc971e3c514d4082246e1605194e64400214f87024022b97f2d0c4d59c7056d8e7a0283458c1996651d79ebad09e83a200916d561c3da922872a72783dcc10f7c38d8283e2562ab82b77bba21a71b32d2a95cb6531bad28c9e4bd1e07830040eaab8f33968081ed42d2e7d0eeae1810bbada879733e26ecf413d44d41504f524813add9a1e305e5c8e8197a32021bc7c7d0e82a2830f531818dddd3d553e9c0c72500a5e1f49a8dcc3e572b95c9119e5cfcd38ed2d74944aa552a99494a956ada8f451c577020e10638c72155b26e1de5c714c1163943e7ad4b494b25b8c9d6f27b1829041822b4408d1821d700d9cf8e20d1f7680d2a802b6773de0a860f540470d2c46f480c0030e43e85c71c5156994518309a860838a2f44f072c28b130421a54914274160fbc9864b2389409a14a84b2379d3be04ecbc5cff235e1de1f1010c283830038b11bcfac0193f9440a88c15ec7801db278b578c8510953692d8e10619d4c0ab2553a6c86205476451c5900d402971b8a1b9f4382087de85e8dae77ae93980b8210de5ce47d7a8774b0212a49f6cc91bb9f321cd90c8a1971f9d3b1cc7cd29eb9c73ce6c4a0ee3388ef3e1b81c26a7c34d9cc767944be7b8e67c72dcc64d1fa7494147679a9c433937e39c579317411d9ebc7267bcd6a49900ca4d6efa6630398ae34eceb9893b7d3429e8e8e070991c393cd923e39d3c09c4711c4772aee49ce4242739ef17c779ec62f218ccb88ccbb88cc3388cc3388c73d9c371cec5e75c1219b5aabafc794efa3c275dcf711cc7711ce724ce4bdce661ec62398dd3388de3388ed3a8db6aabad5d9b568ee3388ee3388ee3388ee3388ee3388ee3388ee3388eebcf8ee892adbbece8ab1f6dd1ec744dd3344d8341c94f6b3d79d4a9caa5a85395a853a6277712314e751dad4b6342bf75a6620bd6e37098eaf1995e9f3e7fe4fcf95abd4e17e7d5e592d5a74fab9c26059d183ff912f0c2783579f5d92357325ebdc27811c4e1c92b378c5d5a13bc6ef2682660721887f9668071d347230106a9bca9be0464f07a75180fdb9137d5b93372c1eb427a1a71bb0ca12558bf0404720219b88058a004aa11acde5de41679d42accab4b2eaddafc7585e4d0d7ebd5fbd5236317e93a798df15a6b0bc9fe91b5bae4419d2f7953898a5a45f2ead2487661208ce2b93b5febc4e1eba4e1abd7ae3a567dab1eb3c3e520219ebc09427afef5683037f912f0e4d1600ee30cc67834985f67b0ce17f54aabcf579d435f89be3a779b778e79307edd466b3be6ca1bccaf87923798bd3596c1abc802cad2b3d3d2a98106b0f2576756519d1a68f830aef1d57fc8557cd20356cf912b1c58c0ea42e40a0420b03a11b9c2c0ea29a85005ac2db0fa0b721561e002abcb20570cd60280550ad102abc71db98a505a609d60bd608d21022b690b584f2eb0168115c60b585f60b15a2cb07a1c6a15657df553af2e8b06201658dd7afddca37e2e64476254940d3243304a582c37a48f43cbe989db8d31a564dae18ab0031640203fcf400b2388aa1620fb8d411a86caed8ed16835e30d7cb25c398a11856adbaaa8d2b28220a6ec4c981f2e0709b185d2e676f687e1484b28f16b099593628c31770cc33c96c037edcc56d80a8da253fc591b36149df1f363a10524336b16b2643a5891869657bdb0e8f29846f90635890c1d8ee2d5921ea4f841113e4ec2d8810a28db25dbd55f1f919a471352cad05a19638c7163ba4c4b29a77c4137e104a542d66b0e6e78fa1ed21948ab8cb01ae3c6b57243c662328da9e272d016acef6e1d4c2e0bc66282c9cc115762e00450162e006118add1c609c6c072060d4a2085962b4235a0e223064d5dba4355b0e37c2f4d752aa44f297d1e88ec501aacc0021122934e56e348485be81415621179bd926c346b568e904e11792549818811158eb080e4851864603580c8ab012934e0c50391d7ce1247dcaee6699f1e6a5757e99f066a2b7da5851a4b13354ff744a0c194bca1edbaf484f21e3e7e8c9023a45db65dedb2d7d26683f6110f5a318a5685dc6527feb49af0f40a478412a7f854019281d525b2d06ab55aad4967c482d5a8dc2332d96846248519effbe6dbc31b11be3d140101df1e2280194785232ab0d0c20b312461459d9d155458e1c80a3c14875021f6d0a1d40a1bcdfa08ca23483b4eadd0aa1fa911728494d080148ca870c4474aae987dfcf051d9e0524673731a9a793f69551887369a7928f80cf1b4aa7b1575f0895c9ad53acda49bb48a839ce8f9f6eee9550f110539e1f314eb86c836613ea53028ed543518cddb69b2301a69190e40f6a26a7aa47c70f9069bf3f63845183e2f3599c94f8a8d466d3f97623d8c46df76f64d96691fed54d75e826b1fda5a5190175082bca88279902b9a0002db6b6290f8353532cf3318c1d077cd4fd94c3465df259ac881449734967882a3899f6f30fa91530b3e7a0b72a54385839850e259f0b4ba710404d6d8f5f4e9cd04716f8f0ee7c7c92b06e306515670c4183d187101a35b5ef1172334625003299eb098802c228f940180ea5183f2a6dedd3f589e78c9020a24bc90026ca21db870c389145e8ae40ab2e0a065d9a1352821b2fbc70989767f355ae6fdf09aeed0851099f4a2509e62d1d6801808a68beeeeeef61acfe25b03bbfb9525ca7737d3efc62f445906fa56c10fdfdf4edb6f3baaa1e0c1b7f748b5ff68cfe9530d8ee72028c850810e1ff60803a68b1c95540115e9b76dc044141ac44414fa24e8053b3e5e5e3a96d1602e1d89f450f0196a61157fd8296185036c4f81cbb71bc101d8413e65e05071d01245dffe42af1afc2157dbd6e1ccb7330abbdab7944d8a5d6d1ebdd6693b956a12a8a74325e437bea178cdd3a132bfd03ef1bd45875a0a63c06696f99c5a2633d91e316faf8b620871489cb199e3c71583734a39659cdeaa7089efa009337fcefc51e76d730ce330dfb6cd956c5fb80463768d9d3ae6b1d33984658dec61ce1d047c08ca17a1aff9f4daa8531306ed35cd330c631997bc6d54f6e2f531e80ba18f5f0c128681046519faf8d11089cebd077e748a81a850a594d2a58b20fcaeb77398f99d61cd7494bd270c9b6f107df4213c6c76d4d0e89841e5c0217332c5c0dc12a9b395dba8c6388cc338cd388cd35298597ecc37dc646c9e39e59557efc7d2bb1079862e44aac30de7cbf8467de127fb648fb20bcd9dc9b86ebbfda4635e2cc366aee950d9328f318bce39fd34dfb8ccb5acd66c73cd330eabd25a2f82d8c71209a1eb759eb218638c58ce6fdbac2792cf38ad7477c4be59b139ed64dd20c8e5132db514f34c8b31f389c15039af88e69896cd997df1ca9d5e6486e0330c02739b1e6792cfb6c938736643e8b67d3ce98c9c5b4e0b7ab52f957b841a90b5d605eadfe9da2ccbb22ccbb2cc397f692eb50f891c828251fb6547f2c6861b3de358a82cb470c4486e6995e6f4e551ab90c8a1d75c5e4db3f6532287402adc17529f1b9dae7d8f49a397f6a401615f4c2198374a4545948aba7bede9da4935fad65acf7ae759bec97cc6f01aa527ce95d9cf92bce651888cdf79da7c6d521968ad71548f948f5621b13d5a75bd74dda7c45a4e8b134605763463a90cc93a32e2e8c3cbcaca38a1ae645dd96a15923efacccb918f69b1a332eebddfa7a4a9b840b491144b310817bf272592fd9474f7f783fb69b15d674f944aa5acc8e6b5f31ab3e9b508fda9c24f8fd26a1749ea291124cbc5c0706acae051c7e8cf56d1238fe5e49030c27d39c24b3fd147b50a49eaa6e69c4e25103683a25a4bafa55896b98e1e057bafeb742d0fa5f7743afd8971ae0b55733a9dec89664ed02b542ac9d296759b775e91cdc6c8458f41488e394724df13e71030bf96ab996bda57ff41faf183fb71246a9d17abb53fdaebcf691592ef29a5f403a9546ea352cb6b6e8532242e94202e142e18ebe7318f615dcc85486cde28fdea9f283ffdba51fad5575aa85548fae7b3fe19016365b196de4e65d9ccec29c6c9e9ba755d0e72d1133dc53839a1503527ef81c47aabaca59c16f45621e2927347af5986a1563f36ae43e22305428c3425554d0b7d5c2bab472342dcce5bc1481497b160d8740cc3306cfa068129c3296c46032f3b08cce7308961d32306847d8ce465f5e267b3042299df2c93522a7d4a7c8054b8106d4e4a3d33867543ac7be6f491c1bc71b32f44a2bd5e465a22431bd25e4eb457890c6d48cba211b50a89f61aca32ed754b3d6c687103eae153f36dd658671608d97bad864929bf508bdbb6699be65d8cfbb813aa57a82bc4b41c73c48d198621f9e958fc0dcbb20d73019b2c7b12da5a03ea39e73463665936a71933cbb239e7f40c0b8ced6cb5160646c204980ca8b44b182ba35a2a44233300008000f315000020100a868322d15818e769d4f60114000e7d9446624c1c4a245290c3300a52c810038c2100000008316686866a1b73d6003e9c7fc6e0451c9bb93a5a006c2ef1181af991fa70990e563b6b9618ac0cd0c48f38705971af960ca5a0bc35c6ea32f766575bb0491ead329cb6d4fd2b113ca0c705dc4d2e6c69869da4a8f4f26ca8c2a3018d7d4bf8bb8997bda2a280feb5b76e9367a165da584b860e3689ec20b04a00ab2737cb5bd5a769e17b73feea8cd5b2cec825caa18ebc3bfcdead2820ab2f8a64ca0021f0476b256a7ccf359b759ee764f7235b9f504bfb28f7340034d3ca7f9bd9bbff73b8c060abee06383b4a76c6ce13f4290bbb03aab0ce58930aa24b6460eb4cbbb77f3d0e1cd68d2c1002092ebdf1d5ab8e198ee9ce2915fbe206561c87d3fbf27ea10d489055fc96930d037c6267b20176cb387d641feca5917338239e9950feff361d491f48c5b38da6901c591844214ae17020a89b706268bbd812a9041683af6d99e75a5947a5479c6763708ccde851e0c7b377983e3fa5f541ccce0a9f8072816e30c2adaf80280522c640816f945d8ca3f98f3f5b02c7752242fd9a0421a2ceb54d7f32bd84927f062849d54ba407c05effdba73eeef06b857d3b0e08004c01e75363283aaadf4591c1fa207021ae2e1b024f5718c442ea8121d58c0d3d25c401a822a4fdf605c1f9206b4683110f2a106d601a4c00e2b0b41dac8cb2fff194832d190cbe960c1cdef30a46253fd84ab0f6cc0eb48f40f61cd45f1a154a0638712842d96f8959267a1a78af102d95f741ccae13578548be648c50900abdb8a117767901d1db88888adb646a165d8dbbbbaed408ac93dec2220a94f85c92f0c4a9377c6acf99ff145acf3758047499746dbea7024f4f72a97b60fca083858cab00d2fff81272ff78119cd5841f5200253a1797b00a05891f19343ab84b8918f5294dd7fb0d824e9d1f01631f1f32515f96bca0b02148e39643e1379cfdf5f5519de1c36fde48485b812eb3f9e8e542e110f8b84ab80d5115c341ce829d1cb2440684e176d3e334d156e040ebb7c90a98f4997780570cf966a02fed79284a380a553016a2b7f1e69758520b296c11a20fada7b33efffda78a3e3c2b198920b01753807084ee2df0b7a524581de17017e83b3ed0293104e264b359b3c525c341c02a7b6e70b31b98a33116a97863cf55c27670e7781573194c883eeabf5492ccf2939c77553269c607b93a711e56cc1af3818725e5f2ac8f90d8caecef4388aafa9409e72025520afae24c26c909e89cb7d279fb25ef5ae71de4e7ab7f8301ea45d232fb99f091368efdb871fbe3afde23af0091897bbc6761259cda734faec6a4a009b96aef2c67cca483380e68e4a0fadcad5f9167e20a3fb0bd27126a3efce073a34907c77d51f1af046b24b8fe3d168257bcb0f3a7330bfc0aded24bae99cd8ae60beb23c11ee39186b0fef4737c00a13f5fe83c19fce8606246b91dfdb74b9f7b0f3e3cd50b76ad9f268186b0e4fb65a6defdde9bf387e45f0d54d7738bfbba8452fa3dd4f8a3c3912440625a368b31ab756646d787e8c3bbc320b416ca7491be5fecb6efa8cd219646004e309ebeb8317321bea7654869799684401884103e07311f1cea086db75aca8a71acf6c56ccf9bc594c24cd1f4635274dc99a928016d958b4bdaebfe433d4fd1e6a23af215cd7819710d74ed6b2c6a4a4347d89e870b18b163d21c6e8fc815fb64d5ef873bd3c7d1f0e8bc44db4151535339cfdf5bac0a15d2cdaed65f8180c860f432465d54b16bbc9cceefc04f5c297ab5783b0e7f6b622ad3d91078f06ed96d9e572e508b107f210df30b21cc00adc0b1e947eedf6cfa75a03e5131a9964208a219c8fef7d7398398df49d75088ea541c1c2af7a12b8aa5e6b910157a40c21f29b5a95ef698c28cc0d1a2b198f6d542a13c87617dcdc51b963f25fb761408f454fe90fbde59d8d1381cc3c3615141995689e9dc824b2a92695add649fa81184459216492eaa1dafa463caaca7762e63facdb5b79ba04b78f53d13e8eacab1a5d77b74a4e749c2360ed173429a54556ed61a24cfb8118bf8136972373710a9326594797a4a7971ec0a90bf54a143559bbdd3d15a41f0adc8930db6579737f75193c407de1226a05cce9e6797e43d2d0700aba3ea509e526270205c17173e24955cea6d75f2e113b86a45ad9a2c2b15cf32becc3444905ad01a1bcbca982bf443ffbefc860848025f297d79aefc4e810ab1a3c7d1150fadd8e48eefe94ee6b581bd517647cd6641256ab7b3c4627972e693c17ca723ca94bc536b6c7dc89ff931b3489fca0d60167ed885977a72b4a4d6282530244cd31dcea9442ee890a5ab8ced7b0970a6200eedab43dcb231d7ca27c89e537bb70a8b5d8c8de5496c6e1e1b57f9098f3945f9cd967bb6b05167fa848651c8d1e34049c6771c23579de7379e5c6e4e3f0878b20cb41aca40924c25e8f5508d8858082567815f89b4dc7a1ff5ba4f34a57c66414f0cdac6346b7bee99a2cceacec98ca2b055838206b83b954a4af7e8f4edcb7de21f2ffdad4f8d514a2ea2c02f7678000038a9262a57581ac20ca6215a2b8d4078d7373bfd554da1b25e85f0fc8ba699a2f826158c4f943909e7fe3c16c46327d38094dd4a568feadfdb957943022dbe209c9c27d9cf1ada3b5573b1b4f9ca62571c1d0c18f5da6d1975bd704a83e2d46bf916fa59b29701e7389e7abd094e390d6abd93086b5bb880839caaa2fb6df7da86877301918dad023bcd3e7b09b265a49eb31b7767d65def9474c1f156abcece9e239cd18b435a9686d07c435797fc2db896663c5d5fb543f1bdc6567518bf85251b925287a9ddd66743e164891ac782486dd9215d3ffd9c64367aa173b3912e08a7333a0bd964d28ae8c19777a2e555fb4c6116709b6bdd85f95caa1e4c44539ea255fa8bf09c1820e1fc2bbaed67dd39138e2ebae2fac2280fe3fc571fe08b91d05cf22bee0813150dca9fbb63b3f63ed0a91b84562ddde458eb465306a77493890913fc06a62cb060cadc1e1bb077a5b214e55b5d552fa77f2a60a297ee4eb3609996885ffffd613d6a83442fdaa695d884eaff3e250bc3c54e0dc185fc16e0dfe83d618ceffd8218cf3229211160548b193144d89219c1ba084abbe87086de3badb531a97401369ae1d648157a44dc2033b3f1957b41012e4ef17f5554d94ca6ed4a42d909710aee10ca3f4a60a280104184d537bed836d7615809252c7aa05414419b2af4a552ec9648f0fa6ac5b67ed5eb0ac0b6523316a233fc8d10111bb958ef59c6d628d62a405e8b455a873956b5f8eb049b5c712532c9fb8699aa28d66c0dad384846d72c9f02d3672ae837773a78107c44c74dfd575c46ead53cf86a20f48e6757af9e43e38d48e533d9dee56ba808f4af9225ca7f66af18b7829a33582337d67d4d460d5489483b897a5c75614416535756d5c52613f075d189e61f5887aeb86c03c5a5bbbb74e3250c8abb761a2681c204ddf20275091d391475c5a6cb0e6b43b27fd28f5f0e37dddbe6e9951adfdfbb8b2de302b2e2e54c7269c2c63eefcaa6029955cb86cf4c5f3166512f4ec3264c1dd2ebcebd38e296761a3132726314ca767cd50956866a13509282021e5e337e0b88a0c0489b1ce1b08a18de50c334d19f610430c070984cffd5f164bdbae9402c107d0f0696dece63e86bd1c0e731fbae0368ecf0eb10a6dd4fb3cccd16696750504593df713e425d717674511ba6ddc83a5268c4fad11eb96d8244326d6b9e26eefb05ed2857a438c11102827a4f44d0a36e220b6170216f1066fbb024e300ccf139d5b0ee506deb4fa531fe541be34fbd6546ac61bde4afd6732c2276b388df6f036d3366a4f52150e2a65bb6b795d3e1455d26f2462883b478cca1c86d51d62450027f0d6819b5e6b7ad0e54eef4752c3f89423b2af5423289c1efcb5c23cde002b9285dd17163a3202d11d6861b932e69cde55a20bcd6183bedb440126157be12b725f3677b631b3c64eea92c011982d99eba45ef285f3842d17c78dcbb16d28dcc96fa9c56806048ecdf825d1c05ed65a6c86b1d8e9928aa3e69ae45e28c8c349bc08f73db18ba9ca2a358d258bedafba8f3a92bd48a6c98629b650684dfaa0ad32fabb54843e0aaf621e073b31f71f5a23552d1c58a944a464252f594487c2df14afeb581b8954259e85ccffa8ccf5697873bdc0ca46edd19beee10b39fb3c9c99849b5b5380721d86b3a5bb65c442f60010887e5605bc351508a5fc37ef6771f7281969cc2c91253351f778df50584e4bbc3926b464b4ea028bc540d564dc134b7dfde70eb9dedc0e72f036209038aab781b6df5ca858525d04688ecb71810f43a0ee43962be0f5d49bd7a71d5a3dc3931a05cbd7adace28b02a3a5536c25fc143b7ce3f3d56d03a8e5ce87ca742e667b01488673642922f4a8d3535ad46456a39207937a23e425d405c57236f93a8f8e88e0131cd6b3bfdd7ba42e6fe0453507ad929dee40bed465263076ea539a0decb8e26c21773a33e43ca186a2222df4454b1b8a59499fd35985e5327eb82ea860db125fa532569d11f3bd19fdee128f2e3557b5dc710ed42592463ccdf5fb8386acbeb910836fcda4d90496a6a47059f859b10096af60cc8cf186446a4046eef40631c3cd91c77ecad278b347395319f7fa08d6aeaf687281dda1fd19f7342a3fe9cb2f33364bf94cc966d4d126ab7b3a1b2517fa453e326ce8f2821ee4d86230f7a4842cceb50852fc50aaf146219dcabe1074df2e4fc7e2578525ed25d1c723b0a7afa163669c56eaf9841529700f882b18b1a517d3a7b1a1f84734475aab79f67713d79a6672029228f5f0e612e0e3b1bb1b1b7480ab5f0e91059f891b311b730cf4512b8a8d712497c33d30c7bc63ea2002149730fc3ff3838fb93e6069d14eb4c09086d0c32032fdb990b48b73160742e90f0c97c67ad9266e15dcb32facbd5cacb55846d915df6507d82a96b3035efaf59d8c5a86b258ba203fcacad7e842f8d17fb2cc343ebaef1062ca9ceb72625dcc5cf3656aa9ce17b08bfe3c1fc28f9bfc7031bf40ee3ed332135dc03e986ddaff61b7c6e41de1efe16b58d798787cf2243f855c0cd57967f898280a6032143baed658118d58404f252776071e544c6aabd9c3f994c2dbd50660630d450d549459d011250529723ca2f1dd2357f62278594597c94ab9e524ff9908d6dae815065ea3bdda02131444d5af288e2a005b750346dda13c292bc21c273bffa4c371f5221e8acd409e55449d9a1e5b90fd2de66da9d22e6f8179e5169fe58ded8b29e1d4bd13f13dbf0dab002827d27dabb0b17046c319957b06a59b66fb4c57b56bf33bb1f60be5d07aab5348a5f74861207d4c4af5489fd536c661db5e78c052d0546ad935a331b2f8d020cca446e5480c68ddc7e3ae7937e5abcc805619f4f4d00a3b7259395d4355ec81700e93c9c5dfb5a4c07bfb9a2e85fc3c6c869ead94162bd8f23bbc4da5e8d7d496ffb5eb0aa34400f37044d8307951c2fa3b0d2134f14663a4dacc40b90b58b5d2536f1e90ceabc3e4d62ab54c8d3fc6534c3acef40cb70f43208d99a921e9c867059cf789f875b889eb640caee81ee9b77aceee00dfe72f6149bfc4a7a8ff9eec40db2547864a75d17916fe6c5cbc0c7caa7765abdf7e395269b1b6345f04059afc00c5a7bc557243fef3ab1c045c7ed6a11e83c885d6890c9f2c30ed0b7efcaa571d680965cb897d8c3b0f8d8aed102713a4d7779837b61874437e6c3351f1d68a92eeb0d39289637259c61a726d581ca93cececa154c7d66d5e65c803ce86cb55a2c38eb08babb4ea472a1961f0f8fa064813dc87f802797824a43c5f916c38b2e96d7ce6d2241e0d00bc65c610e1996bf52f95b6167fd62e2917639cdd0aa332fb35a53191de13a0774091f470a3aa51263a87c08f04ac65a8cb7412003b751b5c637241abf0ec6ea405bbb0ddc44d409e494458f1108a5949ed3ae2c7e595dafe0635c2c5a2767db0bc7f91225b8f8aaf18e90141d49a99718168fb2da4bd87f2eade10bf7e93af5269d84f60573edad63b6b7bc8c25f53f3593f24b0f8dc460fa331953e969bb9b880f78b89053875e5ab01da37176fde637de3c6d47f4d7adf136ceb2200a44d0b5ccad8bca00c2941f2390f1e4ca0ab34575dc3a821c00b4a20087eeddce3f6765e85fcf8d5790dbaa2b75e2bf8a510526f4bd38f13f31aa4010e4c8d79f1d6f2e1cd885d67318858b9b86f963a48a022297c70904d0f54f6c14549a94209620ffefde477b83e35ca06977f619bb41ffb688fe9ad613f13799a708337e68fbfb34f4cfa4fcb4468cafe02473238001e3b5bbe26d9c9eb7900b4ee18942433c5bf647ebba6778524c124215f8d5670c787c7a3ecbbbbcd45b5e5fccf6ffe40a2052c74608b8ec051a250d3739e01507a8484f0c7ab0012e02bee4e806e8dc88298bf927864aa3355ede903af504642a2f05eb532c5415bb1bda548f71c36094d90ef6085135915087b649516b584df5ce30fb2373381922a93b8b4c730899504c30d746605049a845fc3c94ff94c8bff08a55cd73634f8430442c1172a09f7637cc45982781ac229223171a02c8c6df612e0b2b3e54841c93dcb1561f6e81709985f00704297c058865140be9797a4d3be28b88429f61a256b706def43a650eb3d7b9fa4cea5293ed97773ab4fefe7290467e18367f1cba94a006c9a5f875eb815a99c893578fae9a58697cd8853966ec8f0a55a51c2918064eb7bdbcaff08bc3441d4b949cfbb55311d94bf4012b314fb0bee261b254d90cfcec2d212295241cd6240a7474531a544b30c9fdf385005d253ace895357c3afbd51dbfa49920007046dda89d5870172422c81958e1146300d312b54576bae6384ff6e3fdfd0c88b1fc50e057591fd679fb88f3a17c774706eae499c7df1f10d0b1f699843fe51ae76159feacac53b76d5b2aa9461f84d920b0605a2f7c8b61183a4fae0688860ab52834ee8aefbae08cc245c2bbde108088793fe4ac7ac0f4d1cf35bf436bf6f24136a3774154a4ddab3711cfec646001fc25f6d5ce38bc54555740c667aa4cb2c7b90cf2284e2530d80792ce6bd6d14b7407084e28e1595d730d0135ab5670e1c073ce2965c06749b8cd8a58d28701071ce911b794e107b7b0530b6446460ab6ebc70fe7075e0581c39e10693a992b78573ac6f492dd12bbc9af87f11588882ee8ce0227f479c8bd9d152078eaef0b6520d08d4948410a8a9852621f98f9e36d2214c40c255ab97c9b628e15c0707e1403890a2e1a7a1193d846c1ad2403b0269beac4ffd66d814e0cf068983a883537668a9110053273e0c43f692c15a5a426e2816d6987d060ac77e1922bb5cce070b1018dd874e05be02dd79b3eb230ab05da4581458598621f7c1f5f9240d7df471fd4afe4043a223376c8ee18b17c41534716953891593e7955b86a5b25c6f23edd120c8ef2249d8e2b8d8d14f7a18277e1a5ea3bade067d70c8b32921175669da5c324bd0641db360bb21e02499d2e6226bff21c290f24a52282610503ea96933e788faeadb5fefc97c2f994d9b4e90558e45f00dc19e5d2c5ce38d3c2255a569c50e5e4779389779c8a8ca3637f68bd128f9fea5db04309a79feabf95b85166392d5e09735cb95d366c4e3b243fbc2b0c99d32df10989c9924f398a9b257b2291e4bfadeb489aaf509076b4ef6da93ffc2507771a2d796b838fcca96389f27f6ea53617b71f99002d60d3eaa6993c9c17415e216452c10adf8af111594238e8f3fa0cb2557461f2d6b62c019ceeb1e01285b9b660d023eaec0865951658de855393298d7257879c3d4e263deb7bc66a134cb70db29bd64222eafd15abf9ce8f9cec4c05e5bc3013e99f1ff08570bf816b089d75f495004bdf0d339f87df0aaef02f71139ff69e906e4e616741e0474f8bdf0aea1a213a3635d94a81f9cef8f770d3aa89a9c259787530d8b396bda6f7741419e8f7c104677d8bb46deac536c6cb3f4c214cc0cd04e2badca9f8906a67d41112b1369e16e5f8565ecc666afa0e2cef3a6752907781f0412f2ba1a6ad7927582828b50870fde8f6e184b9ffdcd1e2dba3bd2f4e330e831f56f45f8bf9dcdff7c4c964b1cbdcd655efc397b3f4368b18a1ac57fe35ecfe1e11da32eede34dd59bd902dc1665f72226681d82c27908459730f58cc1b024ae60418cd8d0a9ee3d530187f6e6eb585cf119fd23d632b653ac80d8df902582107b669450016e259da39f488d4cd2db1708bf9e5281817e15af825a4f33e38c07f1ad5ea30fa28ff69ca7b8a07c219656575571df6685dfb9827448ae318776687ce05e59964f731fc0eb418a1fe15b7d82183921629621874b933936d0f55104a02d24df2f1589cf926bfdb808d26f230622d99e183eb4943ce4c5fc90583470bf9f62e09695c0f474c70809a0afd42fc228947f4722413696e937bad1951ba7c91abdc104a36ffb035c394b6b1eeeaef06e9877d6c69eab28b9a1c7fef457f8d24665a6003968534a58cd615d558054328db819921cfaa414dd8af3a125c2166fe12301b26d6f9f6716712d4d2ac447159ea538e88720a5bf9cecbb3438ffeb4fe0fbd09ffce3b76f67eaa9c1421c13a9fd44415d2e8b67804bb5d92c656502acdba23d13297bb46be799c21c0378bf84ff460fe67236f3b5eaf3bcf1c6bc616070f0d4f74ca7caed921592d68655adb7dc4d4f00877a1ca6efcf8308823a008ed1054d605150abd31a56c19d074fa95536c4ae5eed9925dc5de97b4c1a576e932bfe71522a8b38bd06a880f7707edd81b92b08b25607a10b3b4e9cb2b87570ec82acde6b06849d1f944f4d612ca7118f2acc6fd15f5dd7c3234a57f0a41f733e4938b654d9daf0d5bcdf06c0a43fd0d883740dda7cd782bb79c19dc3cd4712fde2adc0b5d97a61edcd50dd6dbd95faa334b540ef6b0cf39bb3882c3406b69a16ca9446e8bc03abac60e7d9fb97cd4ebcf65809e49ee61810c70f696f1cde2719db2c6a25c5d06d7c85aeb862d7fa291afc755220c0bf00487d3f69427b37cf9be235794c6bbe233a79366b14d58ec22bd69bd20c889fdb3eda0cfbf83a0ed52d8bfb871c35bee43009886fcf09d823d5ee3224eede02c2afda5523276686b8a61e39ed2e524172483cc5cac9d6ad19fc8a9da39ebe4f17a2510a48a6d76461bba1a336b586eda41c7c949382098f460a3d602adfe68eb6230aeac9e676710aa77dfa277db20787b5808f86b354a773166f229d1cce421a3404ed5483d7f3235650499c2288b8296493decaf56b3c16ffd1428399269f94d78cecd4f2cd3ec6d215f4b1579c71aef0542b4217a4167409e1b749ffc84495cf365faf22e64e5be8510a471a19f4212eb3c6f002873cd153b844b1b540b68b5654a18e62c3f5d98308dc5f01e444ef22a2363874c757621911f100adb75b27a603a0d5e6aefc9f7e23745d2affa77b20b64d68dc18df3ea7b2709ee5bd0de397dbc647afa6dbe9b0bacfd724ef3a19ace60c7ac6eaa0985756e6efefb95535c4e67ef7727ba7cee14ded0a0a7afe8c715d8dc073e47f17ebd80d7b7f7a5607ba55e67f6c973ad793f6424393d5f6cf7601e6208e6efda3915a25d7bba09998ace7cfee61c2395f29c0b5841de1677073d76a05da12031da713e28a6b5e716d14bf230d50d5da2df90a10a1e132a6909a80ad10ebee26a9968c107e994c4699a60562c16e31c1972222174a76758d67c8d5705f5fcef5ea2daeffdd93411b5e43334144494dcf72d5dcf611d37d40c94b2e6c4a29b524fbe29623abb07016d0d4844856e61315ce6ffbadafe6a459ffe5f6636b63a0c3fbe83890d254dda1fc51e577919058b7cc4a42f6c7b8b92997815d7be618229dc95251785c87b9c0096fbebb1d9b83144845067428c6348cd2055caa844ffe536eb193519e04996d1da3ecdc83f5d4c2d91efc45b19f6e2e22812f652b469fd1874d1e3dff4118a83ebc7284b36f7f49d0ad2b6596f076ccc5fa379cc2f7b8af0e89d0637874f8f422910dc16bc55386ca64fc4d1e1ea580440a6d3721241dea929ea806dfb950e9882ff929bc0bb6e71f745b1d2026081e38e253a4bc10d1a44f5aa15ada1d5e8144272b2c60306315893ca6defd0f0bc725b50401a076b01fbaa2a77af0aa75095221d48a91d2bde8c18b16124c8a604026a57ffc753b9e9b5f4d1ae9dfc3a2566fe17fa233d7ad9aa8264f1fa331c7b727fba134ec66ed9862f5a8eb7409d1b61f0bfc17047a22607c86e675d7369b131e3bfef1ec3973b500b6f12270e0b12397d47eb96abd580b7b4362f9c8edc4e219b2d90ae04d94bd81a468e2a863c04d394de555a0a45e7a49184b7b510ca033317653434725b07fe4d568c57a325efb03b55d0f505ab5b34b2e01c968b822f63783d7f782453e6219472462797dda79b80e7aa68b71e2a55a13dadfbd3d821628f4d4f13f42e5c8ec1754d60aa7a17daca75a3e03ff6957b358345fb94e8186ac51ab6c24e8b3c89e745df40effb38840bfcfa33425c74aff587681909f3fac3e332fbe1b81454c3bcd5872079c7e67a85e2c53383205ffab884087545f7179a401b2fe5305fe94a2bc266650f0b600fa21a74ac72a83660b285ffe39332ed9043cc0437ceda4fbbbf01c1306b2652dad34d8e4de4393571fe24fdb91c20373b3009f21a28ccf8219f2c8401e4ca999514c748b824a7395610537afce82989a9760164a7ca41e4276fb2560227cfd794da01fa20cd4bfb80ec7031607cad27b79fe585d128c80957e1e43d8f85168a01e24e05d73756e7a08187c0876e8227fb6e4218d579e7569bb47ae3a33007e24636955f72871cce77428f2b596fa5888c620f6e18532e972bae1e10b1f1ff885f782cd01be4c044ae464defc6d5694e3f1ff7cdf51ac29f41be7504251497fd950e0fbb322bf05319ad16b85d99e4c4358e60eda87588dea5c76e552b549587011ca519584fc9e6adfdad36a01642cf732838761880bcb8717f267208ec83c41397f01bf4b0cf8bc8d2f91c38428e159376ac1dbaa6a16f53154f262c5e0d5edd7f30a53ed9a4f3c4f74ed87c72484a889e448980d5d7861ed99725c47f1e883bef438bc06334cd19113ace78fdac6d171b9abe0c3b482c965e65cca2e48e56b4e3601ce4398b1a88181efb384c417a7eafdb01f28f015b9c828e5df5fe9f36f8bada03dd7c6a081581b62c552f58aec58b556f0bd1d29fa75e4b92d9ded1a6860c7c05b0435d11bcd56fc868bf0b4c52b1c66c232755b54c5cd40c2eb93c8df062dd283d68777250afb8fbbf9c27a4a6805944551a7ecc5e854a4319d118852fa2d29d825f47362654e2d8f569ba11198beace9136ef328905ab6008a81b6122c77d800add2cc5ab64cfc1879cb956fda7a0a69f47c61f0d285879845b9a50fa43dec0d8bd47788052203412e7fb9a6ed737c6cca29f1a7d523614718130ec827581a3ec2607289d1352bb549c298e5464a48a3d6045e4506bd354a16446eb0da46538520f919dc82c3445926adcdfcf73014991836769d71072876d0e896ed69bfe013d668d99cd171a0b9e7c06dbd2004857a37c939af8dc650a5a68a98c59cbc3e637235c552e76c8d55e59b5b22cd374fe04dd7caf7bf3451e4195f90696f87ea35e748939d540dcae563ab17d253dfad509783b8a40176401bb6a98939a69b4e11d2ab41c42515ada8d2470eb735023427c1e1e84ffdc151993680cf007a0c376dbdb8a5f1afd2a7c508d0f3cd740c31b6a573518c18efd138e735aca85cdf56348e4f2ff381612938b3398f18c179a1214071048edfcd1223b6092b3cd2b23412c624dbe57653d408bb7fbdf230f9e237a0332481962f3ea6dd474a2807581e42dd88f817a12c6c8156b57c3f66fca68a7f7ecd81ec97549471637f8b6f3c2bfe1b594ac7054afe929421ab3d6d11c2afff5cffea8c921d300e444772286d9ebf7ef539f8450a50fbb90e1d25f7e4da973dbf2e47b01413b6d2ab706b7479ccf98c3e2b98326f9f032d30a36358e57f7ac3971615f5641d9b0f5fd95875ba63a2c17d94888f8c1235af9a79da431af23cb89814d9a5703b3aebb77d989a86693722d66b42a21b595d7c8a514c91c4f5a43fcdb404fcb1be6f413bbe27a0419104b458db5279ba223221c20f0f512693c6c1001ed94d104a7b8d314bc8fd97d5aa2fcafd83afb87fd9961c2ef5ff0aae41a8e0e2921bc969dfe13f8edc2e07fca0ff02f2a76e5468c44ab4b67e76c900e2a89c436bc838548dd4c1dee6c9729f861c5b799b5ebcf21c3c19087f9df096af93060a16ab05bf6958cfd19e00e15957003365055029a9b1de5728a2a26980d916920e02593745912989651d72582bc8272daff9a170b5fb983fbb0fee05d7d986f928ce5adc91da9ed3026de128a06dafdd155c9c483015ba2fdc6c163f1cc112f298d71aac29acb26076eb7842472d5542f04a2594e52f49a384f84633b2371a1e20178ebf2cb69c755a29ed3aff6c8f8f8e485c3ce94e95f06c62cc7d33e5675e326db425532b517d7a5ed59a6e26ace9e23c280eb7581f4e7be6c3d1d6f353ffccb4b5e9e6007ca989ac072662779150a1728b58d4317493f13294e6de44715927a25ad04494c56bbacf09c5d807fa17fbe4247663a9cc74b10a50db8df854fad01aa84552d321c443e0f320feab6b4a9cbb2705b14714651a9c2d30872a52a07a23d3958495d3a84804d34c1e9886232ce2a8a5d9ed4636ee1962c5779019c876967c528277e13401efbda24e1c0937dfb03826813ea4b9f51d614f3a2c8131730a0ecc9f9d818a91c727490007844b104f83d64c14a0e35c329937c9c452f7405f025e720237c25dfa9d1da809ad630013d47fad79a86e33af2336f324d578a711e4ce4e7ce1cc942820d1dc0f3001a63b14bb66eb30919b40cf04c58a5b56262667d7309eaf5e6c320b4039887a8e0638288b98e13e284e7ff665a145312ab1b6308ea58591c7df17b2056113d2ca35218f0035c33997a893409164a654e9599663b637725606f0776ec984b4e99ca29319970b74e1ae9c0394a1ef561f6f4e50d508565503fb11e5fdbadfc992f17ec070d1f251b830a19f92eb7f3d4157ae30a2a3e5cb3edc3a0f921c4002de6629ded19c93142d87c543b06dfec451645a8f2920365e77ccc301d714e7b10232a6c7a8f0ca1afb731d991c90c6c5c0e541af49ec536af46084b53b83a20800ab7115171f0d39fbafb0d983b99873cb380cc86d555924bc5b934712afd9c2ca74834ac9d73f888bef595100047446dc3f113d90d32e06c3c9cf35e981a9879413ed97877953cf86f31bfcca46c9b4576fae9a7a7c91b54748f4af3af4a16aa25b5708b01713b36636d70f7de5e073947417be86054d839e4af2df27f7e1785eb7669822051463ba0fe4eb75d9dd6c43d31166284fb245565b9aae01eb805d8e29561dd4254d90a02cfccbc8ecaa8596376a8b0c980697d166e8ad58c366b71a194332a8e383b3b107b173a9eba3176dbd5fb920a1fe04c7509c69588ba10436decac684ffacf78494198cb64fe3c3353e742b32b990a12ed5c18e5b5905950931b718e25c1de7adbbc75ad90fbd992a95217cd3794a02eb0b25e09fad0f52fe3e3c5d9f12cea993a121a57ca6b1cee7c8b8c57bccfa044a3534c02f24034bb2f617c03b2d97c0d3192fed738d4b866a94973432bf0501b647ae8f9fc18d92b64dbce65d74c10b289b52b2ec67632d1e6695507bfa821db4aad0a9d612e6da6cffc7314e2f8f0e3cb2e23381a721cd83baed662b85c13e7816dd41f5eb2361ac02b7ee06815f569da3a51718bf296bdd0563f8d9d33362120834c6cf75445dbb7d72584ac14d8dbbf10ae744dedc56681679bf3647f3dd461828fe086c812541f9471210f81d0eaa69444de63062d4a02620910115e58ef701b9660a3fd8080ad57f551a87a9f1740dab86d5a37262f3a8416852f0996129f9454afe15361fe0393bd1db0c390d88366fa5deffa7907868e2224aad2bffeb9f278a3706b42ebf4786330c2c5dabf9980a0ad74f8616ba8491f0a686a8803ae8680d37a48403142d251be27a7cb7abfefda1f0299fe93064c6bf9d87a89f893992b857d827546bc6cd9700593c30615dd3ebf61fe497cc4c8a24c4a970a32b1aa14b37b1e30ff76961151b657b89aa2c03f57d10c9625f9795d73503a6715b1089bd59206def38e0165ed3bd30aad51f59221514ffd3706654297616a532ec639b51bbc6c5f77f752471b426632a4432db7d2e231660aaf5b9b00729d9510f65285a41bb5936c2b1099b6f46a1e9f79d3608e5a90248ba47cf51a685b1fe4478298ea999895d87a450889cd8d91e4d93e43a9bdd3b994f3ff8b0d2bb8af47b29f912c67b08392d33d81d85a7f0765e34ee0cbba4793c43ead2a8cbc721caee6bc7f86a69d81dfee78de0b923567493173b6b40d3d160f128008f4827bc0aa9bb282c2b76f0cc6e19ba23ce790554c9d08f8635f93ccfb2a45e12c807fb5a285ee8f0fa10484ecb8b64717cae74594a4a64655fef5bf76c2ea885e5a48208ec469bff811a0a5211683166d099b3b7904a55ad2382a42961de6cfde0af0ed3d1aa8d594e87c1c65192a849ad8fe48e894ab73d86331a4ec3e9cbfad6364087eabd568046eed2aa16296acd49ceccbf879b96d79958d82565391fc2f51be7a6d41ec575efd4c3c927cf78b3aed9acc9b16936135666f5c58b4823570b04d9587e56d84c316d2b4eee5c0b6f0d4baf7888d782325e44bc65163aa74f0936c3122baf5e2515ccf287ed54218df62ba4b0e382273c774e45ce2c16d71fb578f8b86cfa8956142c8101934054a7280ebe2d36f65783d3e14b492cd3919ba2de3fc2d147dbc360707a417db79b5cafd1c37a7647e49dbb6d3cbe5e3bdefb4528c487527108bfa92ae1b24a0da54d584f2352566d81e70060453d69264f4238483b4bd655ea124b44942f8d90236038d1aa1ea9bad68d3436e96418820de51d3e1d5a2ae5b6a60c1e070ba5034d82c47cf000e21c1c21f90336725815e2e7333262c0d6c4bfad73c6c90e52a8767d35b29f38ae64adbed64448632eecdac412023383977ab731d017b74ae11d151ca3d35b99e583e13acd687238d8679b0712e6e080f1595fe696bbcdd4148f1fb8c6103c9f65bf99e21074f34ecd6b590599fc1c81b9ae0feba1deda6f21d160b13612842d12198cdf24cacaa1ea92c54658ca26b1543bd9e63088f728e375e41ce7cd2a0a92637155dce58641727fc4483f64e600e003f0a8dec647713cb10b8113aa0e18d18ed760c03fc22868baa39b2baaa46db1b31b4969d7913a224740a1fce6aabea97de99feb0e8ba94bfe24c8ef701282ee46cd336c58c12f616ccaebd60daa87a722bba89e16f10e22e742444425c0d98a06da66ba1a7c1c3a15cf106b52eec3d6cd3dd50475e4c63022ff01a1013da7ba0b9fea72284190fb22bc9e30b8aaad1e995e04e06502aa45ba05eb063c04f6a806b982ee43d2d09e26da75b4dd9f57ef9ad651e8701134154af15919e51730bfb52dadda06eed53797c75bc66cce5c701a5882dee4eb1100123a66b50016f0f97c5dfe4061ef500bca9a35e95c027b11bdfa00ee4af5531d6b7995b9b561a05e6e4a5b89185cb767f4e4e5b9a679e82f0a2ec703a1dbd689dd3f9c6cc8dede7241ac80fbb9cef442e3f108aa5fd91f6a50ee4d4c6e523369a4fc0f01dc62dd643c321934a9a548def30b61fcae41f214507587e3c1e9f3b71e0762f58441b1c17697781914da7e1472103ac5c11239cd25481c9862aca07621505db6d3b278e403fd087081de857ee22c083dcd6155cc86759a9a08ca8397a009b361a83e7026fd5215ab0ac8be353aa4aa2a78a55ede6af20ed33c5e6b63794720e5a483282ef496186e9cee049015877bbf28f28f68d690edef57fd021f432a38c76f817a9d6cefe59cc9e2ecba6fff6e8f09f89857985266f614edc3c76a95ea01e153c00777e838b0919cf9cad6c875087b21c1bfa2feafbe95ee4929dcea5f9c35d24d3cadc25d86aba73853033ed718dfd4410b7be51985e465c3b0b3cf1b7142923792f792ee342d77f49e07a5a5e11d335d179df2e0d900bc98332218e7a7bef3808437b2f4eea886040ffb52d1bde7208294e2bef4aece0488a17421b70b3ff2b143216b471f198060473b596e34eddbbfae1e3c9fdf5c17ce07921dc8bafdc634f6daea6d390cfd7ba2a933b9d29074505fa610dc270d7010b105b605b24d877c3141fbe5bb6202a940ea6408053087d802bebfdd19b88848dc4457c558e4e7ad7468b082ce94057f38e9ca011ae14806f868c4c1399c43a11e5fe7b92e6f8cc70d038e237932ec296c284f3b9f4794ce89c91a030a710601a42a700d510edb9e80e958ef4b6953357262450c9d3348f7e32a50afd84b912df87b51b23d0eee3a4120766232560eeb29f6927f6dd68dc61f78604e885149626c42dd89f7cb5a6838c97f9ff1c4e43d5677f697c1723f6e9473eea71f7a141368b6d0bcd88d007c08b27303c511a2d84e63103fe1f05e48205fa96873ca5c0d7a12914d3271aba13980fdee5b72029d5cf3791473e8e7a1dfe4ebdf68f95ef3a812601ec4117c475a528ee973fd9b20d1b2d6923ac477940af7a4371c987de7aa251f215b680a35a1278e9a7321f96c57116419aaf8bb90278ee96c8cf90731a35cf603f311e4f4c1fe82b2fc3b9089b0ebc91ceb8334c03ce8e8649dcbf20ee44b9665a3a06a0478e462249a2ebf593aaa184f818cc91c6794f774b098bfd2e123c1a0d703ed0883c21d015d8e9707d741a34e248ca38bfdf33c592fb0c2fdbc4f3d31e8d50dbcf5c8e5c9c7d117c7f7d1fe56b890e9703885419621664753ddd1e39b489eb8f320010ff6f4b747bd4855da67653e85af6ec0c98f43b4f573580dfd64ce6f2d2184de535a91138eaad40cc9c9999a23027b734fc27020fdbf503aff379d5467e50a2825d80abb7f79c99d8419b3356ebd34a7974c61fb35313097d2f0f3f0730ec493c2e774dcbf1e7dce0f73aab24e67d9c80b0c51ed851deb1516c36104938b9c0ea50e61cf2ebb791ba2ef294daa2119dcc57de7d5f855687a33bfc54a1a31635c431bce95fb8fccd1252baceb31ea57f7b288cad0a08cafb9477c43555e37d40cfa788ee93ca710e3c09c410ee9a57eb339ec64c950f628ebb457b58158c34900fd60212126344d1af1687e9fa0d277a199ef3b4f5a6915628e4b29a0574537d52b0d932ac03cd25e44b7410d7feba26b5889de8a1d7e26e2bb4f2abaa94eed31d32589c09dc98796f3fdfebccdcc2291604641c472e055188d7b1c42e89ca4a8a1642c2f09f788608e012bb3e86896e0399684347caa586cadb700e0a92ca0cae92fddf5e0c00a43ea2d0274e5f644a063a91d17344115dc70548de0ca550070608c578389b331ac44c465329ef0b85027dfe8797838527d4df9d02d98f80ce5e2a6432158ebc8f5c948647d85063044af7aeea3a3c213bdc3552c1431511640be5ae90c005178e954708fa176b6a2e4b1d21f8a19e62a700679ec3efc68857b12a2c39d6cff2f91d515b114e878be165a299c7a30f905b174ed177d65e758a9108613c02d55cfba68ec90078663db2bce6e0ac312a64a4b9171f596d4da9e5f1f0aab93720aa5906b1725a942c21cc148067a929ca152d857daf230459fee0ac60b8ac928379788c9d483dbaf89f47cfb3a0c6004825053d5585644003cae751870997950c5998d7219856a58f16d406a3aff1b13ef27eb653660a051d4a29302e049a6d8807ddb6c6f6e0ce1066d72b15a7db13a973390976e7f692f237c32ea1bf4bf9cd49537ae25ab2170e2ffe36ce2d903d6b61890b5753d4b37552188b5eab8480506d5c1cb90db8e77e454bf1b854191ebf7bad79da999ee93174f3534d374bf12dad0e6b8e36e4eeb845340ec0055c8d18ffac36e20d6627c94488348eed67c5837b46b95ae078f70ed19175237502415bc2f00b70c8dc993e935b8781706252b82d5fcbdf684d361bda41917bec14c0968941a6a4b649771c3f2ef9dad148c5b7caeaeb4d8b0f9944761f7d7526dd4805802f4ea6515344ef669048941c779dc029107d2446d221e1e9e1dadf9ae330d21fd41fdc76ee6ab8c99895bfc4ec49d22954b7f1e584abfd69a7e9ff3251a16f31a900d2c4ca3b85a26b7df1e91dbc423824e4364fd1081ae844fce28e07ce575723f2e4cc9c054b9350ae0d79ac20ad88b98009c0a425ed1fac80225390fe22f99383fffd667328e261a85e849a14f6ba502e5907b8e3972cbb9e693e5059ccf22d6000eefc6551dee57d20762bd8bc0f73d9e1127e45e442ba96787c6acd9e0966d9d62e666e6f6aa25f41cbc0ad7c08a930d25bbb15cad53a7af590c913b4ac080de3c27ac0b37a6541ca6d90524ae1feb88993d7e0d73ff3dde69ce08e2cf03616e7935d01085e8e56387b9f8617477961e6bddd43a77577835074b0be166cebab01c57f9de47e519381878e9f1d58f9051ec5989adbd8107e36f1da4e21d1e1b3cd183cb5f13285de42bc0d22d9fd41c5ff23c98e3ee5c846a267f5d1314f2da0db18b912bbb9ab95277b1e238d2bb4e55bb1c8a82f635a1e2e0abebb517529a3fabb0d2dd4f2afb1cd58ec9f7549dc3acfa3e7f91a0f9f957d7ce681ca3ebd504d90da84badf5c543a909ebfed97cebafe748c4c085a5de16e56f9d8db4af66db0e7e17a7fc20a89f8deec65e0baa14b2324abc884389a38b8b8a89c6560aa4e1c3959a2133e0f7a3e9876e9d7db756f2d6c8dfdb29c605733085e10285be2c5557abb848f1a47ebbe40ca3c8ca21d6de4b38f2032a9aa93fc229c4c68790f8a6ce56ae2b0c7591953ae8f0b275542964c20e36679661146e189b177bdd96923813ae6b26a99081a7520a91a17cab5bb30d95dea580ca9fe0a2a952fdfec01cc1f524a21cf7591bc11e9d4d1eacb1563e6c0d04c3f9ee6c4650982153fa5379dedc10c6bc6f19fe1d58168973ddc880f3c66c1324c514eb60cf5e7791b9c772332611fc12bf9eb15768e8611c9fe5d65d1945071dd05f2a7e602d1f6e031dca162e42dc42897c55afecf9714969f6cf990d7cbaad4f26bc4f114c2d3791737a540600a2797de6f0f0456ec4115f9d42a3610e2632f1ba871c53ac0799ea9af2dbcfbf8c9fecbf7c00a51886a67aa0a5ce8c1f9dde52660f405662baf180fcf28d681f6911dd7db811db0722f26d0ad821e032f4ca2743c24d1011ee44d3fdb59a8bf8860044cd791375239cc969372f63f1f91e8c7a8355b3905bc25c037cb0c18279d9793a6331175c4855333aef9edbddb25894490a1afb3719129a6fb4177e3d5631bea93df4ef9960da015473b7140c225080e38e50ba6068fd3e67a72af069ad7cc5b2bfdec2fb2d280213419667bc752eaf3f0d00809533dae7c93d752838d06c995decfe1080e847f8d2db562578d0f7f482341ab171ea38dcd38b48bb597d6fa832c18e12f18f8a2ba2f3f687d7f53a1186463db1f35f56fcf3470c63d9d71b9df1e1a3d9946be55ecaec0aa29fc520eec85300128827835c6363eb973e188323cdb0751687af84f1593918920ca63b4f832637d7d9d8622f1ec47bf2d3c52ec5119c2ca21803c9929ac81dce2822980c6f971ff2ad9048b1974db2d03edc9b26fe3cf29de670f4871c616078ef6d642e0236dbe6f2cbccc85ceca037a5bfeebf3a0db8a07aac145fa3fd21be6e6760c73f0ed504056cef8f1b41e33d491850dfb4c10ef59cb070b02023944c01bab6f1a27291161b31dd440155d48e8b482712b0eff6543bedd36b8f77af145a613909a6b94442aa5e4de964a7c2afed343661efbb36eb9107987fc6cd0edc4cdef668fc74b7d8259940b20b771935d79b8d5bd840c5206a5c4a7e8406ef1ddeb16de3a23dbd90a78cefa3702fad24a66cba4ba88d171320d6ca267504d9ee3478c2b2b3a4b20b715ca4111eb0a6232ff56ee944dca9f8663befca01bdc694f3da8bc1e9b7778d19556b8916febb1d3ba8b7c8604db46011090bc65cb37808897f3df3858fbc64582c4d80e0465cdb4a7825163bb0e01f17a9ac52ce53212cc6bf7f4173e1957209147b7ba9d3424a5c262156d0efedf896d195d7372efe7998c4367585ccfa76396a46dd98a2f94bbd0a2ca3c7f34d16c80594d7d65e904cc2a0f828f1862dd8099193a5b1164c4596a73943a88a8be0a788298362e50b58aca1b3c2dbf9e5c03e2e302dc355c0d8bae03ecc0a54d2d74aab86572b25ec1ceeffb96a0cf557d10057f15e5d729366f4856b3e998897059ef66f0cea949cd8402883b112c00a7fd32e87430dce526c730c0894ae71b8867bb804ba408f98f2ec3d4bba04f27f8f07417ee6c0248b20cc5b83c7fbf6194f46c0d8514cd75e7594bcb48fe52a0999b2bac261b8cb541afdd302f8690211d498f21982c7f504974b0f9a0cc670d0eff2124026aaf44eb92afc67f44d2cd003facf16925920942a6e0e117b3fe5d8cefb072dce5dc1faeff45ffdecf3c0b0eb3a37fe875260d22fdaec0036f9c22033848b623e258e0117187339ce617d57ef499a265623d482a4696abf76c420b4189c74e62b4a1b2d6d12da44a69464070919093609313d65cc0b30744fd9ed4ee24486225d33899e5cb9fda87e215b7dee3b31464624dd35fa3cfa9397f308048a24ccee0c048a243b93665e1733eccf8f4e6d001cf155b2f250d90a9a4cdf84f654fba353eb98658ccc8ba698dbaf63922d86614b7292b5523478ceee39819bd449ed1c69cbd6b9e222e6ecd5af2046c612318086604065d5487abca8620a2320ec80258355db2646d0b9c115463d5fac5a094688e20631b80190133556fd960adb4fa70df708d9ee5aad9d404830f22f43cea0a638759ed68e6009245d9313cbfe73d2687fe555bf5f867c010619703c55039ffa49b79c331f6e3f8f42dcfea7a62659e6b28c07ce9991a6e1c8a491f97be49beca761a648c6e1f62bb93d5d1c44113293a6656678f818228953acf6e53531484e936cc4c783c2287246f5d38639f4718a40dc09103b78e336d17d37ea38d9be06a72284253a21900fc6a50cebcf0fa33d92ab8d25535106ed6edb3799a6729b36b38514afdca6913b3ab0213c543e6e502032c48522ee936b994dc2a440b2aa97490a3b7998a6d8bee5e441c26030186c08cba01fd5afeabfa97f4bd226658a45b1a3032851b80863d58f9a29243fe020c9132c1d1c218317acfa553385e48725de68e3ca4e151f1e56fd3733852488d8174d6c61e50b2a53ac260d97e423491439a372c1c24e3f551a72867c1a1a0740600b29339b469d248b74f0bd7068056d0e4e90214797c5be5f831dceef228a299745d2b554589c185a98293267da741308db9b7c607f563b53d58a2086ca78830b1e3c9162c18b286e28f2e2480a24acfa715698a9efbd2fbb31eafb58ce346e3f392be591854963c213eb384d76109cffd70f16264db33053149c60bc4c3362a61599b9468fe5bf70625b7355be295382b15b79869e38ef373d28b716ddfa252ae53d9927f0d61fa419bb4472b083253fdc1738169524e60e7322712b11b7ba00ca04c20ee61869983e1b6c12bc226cdfe66dfeea1aef4b326d7cf3140eb3c70cde8bb8b9fc34c3a7c3ad1fe6c07a69ad36baab40ba3dbaa461b9f18f04a0072e9e20a1c488bff45c54680a28683cb9c1df7863e5a4bfac53fbbe7cee391146c8f6dc73e31107c460b58d30fe39becefc5485bc1c81f1e73ec7588dfc544b56c248e805f7854e08ca12564eec23597d94f21127e51cda81c118f7856d2889db7d0ddf172b27d6013158cd7f8f4aa7bc9e3ed5f77abc2a5e8f77c5ebc1723d2b8e6efdcfc72b82750df80ef4732bcb16d5fa9e4f979e9007f4a5f7b3c4b6350eeb456016eb852d9456d4c74f2f6a97c31f9e6bd2d46f99d9727395b4b5b98c38c6b2dab9f2b0099896df9e1babcc4ff52d15765ebedf4ea7ba2aed4999298ff5b1743cd7b421ddfade6bdaf4adef459936feb5898989ede9aa2cb9de1060c43ea04ed6a9ff5eb77eae5b3fa15b636ed955e96e766b675465d6c89b899dcea4a9efb13cd5d9304ff56bd71ae2d61d6e65b58c2df46a1b6bcc4f957441256cd9f1c46e7dd0c7969d163cb77ea7c5b4e15bbf1b9aa92853bea3b2b95c7a603de6a7ea4524198c210866b16138847befe5a7ed3d17d8437dbab4aaff81596ce9b92cf03dfd6ef91c5f5ae51889f829a6c9fa2dc6a042fd15be31067fc34328969fd6a74b4c178435f932d622f1bbdeadf52749095bba4ead7fe329eae3a7faf545f45c3e9eda5c7daa5fab05c7ed356e439bb881acefc1af3fefcf746afb39d4a7ba45e953d562d2d42f0bd0637b3277d49f97fa78aace93f6f5c764a7e673ebf7a087e0f70cea60b50b9456ef29cf354ff5bf2fed9784604bcf75eb24121abaf5b7a1ae09bffef6ea9ad2d7dfa2708ffefa25718bd264fd50dc5e4dd62789db5093351c37d7a4097d6ce9b9cacde5a9ca9ecbf35cf4967f5ddab05a95db8159acf61cb6505a4d3f696d58bee5df18bc8e240063df834f55bfcac70d0a38754ef1b6490ac196d1d65ab29634fa378248b0a52ac9ed18f39456aa5abbebe41ddc13f1140bc1a77e232a1397690052f082de4f37fdb4696e5d6e85414c9a1653a09797b4b8c52d6e8d25f8c4962aa6b7398899b2f3c46f2ae297b8ede4a26c70dbc7a4e9075f6a8c9551cd78e2a49507b7b8e5405d832ff8a8a6b9bbbb6bccae694ec31f9abbb6f5d6d4e79c73faf4ba699a336b1eb2ec7ce6300d0fd37077f7766feaeedebfb97bf36fb7091e8fd0b0e22e6141bf06a912db3f6f39ef4dcd09af13ee9398d0edf9048da0db7f84c5236dd999428933557fd69bc5fa7f1fcd62796466ee51a70d5b2aac0d33e52e377264daf8b4e19277203269fa03f3d43f8dbcb80d04d7ed1b3f35e98243d8d279660eeb13ac6be8ff9b4cddb0ab510aeb1a7633660f1fbca3bfdfa94c1b7659a72280c66d9a2cb7b7eda9c8ed63a4d100708d9da4f1e830216ba4566b4da620287166d2f0bfa778f8e01ea7b983df47026ee9e336bda5110a8497707da42d4b75aaa800104ca6e8410a12588830c918c34a1242414c9c0831cf90828927da68a30547d0a0a9c06ac00311497ce0c16afebcf9e6fc9a92b5a13354450c25495633619c01c5892e8e9c28c26afe9400b7cf194c20c8602da1cb42a9d675b050b66d1be7795678516aadddf78dc1648c2006ed9d4463bc200459241a4307520b1b25300c4352a914db8c2cc8443030ee0b8b4430281707d812fe6869c1810347f8633e112c083614822492c78605e964ee9d6e7103f1b0765a4b3a166b2056e9f93ba87f6c60c5e5ef26ac9dd6121efee958ac4ab70d5a3f3f3f40943e53764df1dee91def9d56efd4aa43075bf294cbef53aeb0118c0a63a9ddc5c834a9e3065bf295cb5fbffb200ee292677ca56bcaded9e99a925db7c5b3d6e1259328c8e8f2f30e161be85c1ee2d7f73c6364c826fd471d61fc832e7f37c2b850b35ffeae0b8104c526cdbc444156dcf14ea21a44b9ec2310287ac21f736b0102450512e40a1a0a7a35396f174f54b92e0209f2c1ce2ea0e8b9df6c7627018182c9a40112644593b37fd88998beb025bb78d5f2734572b1d73db37e98593ece9fdb75ffe8fee99a26d3997bec5085ceab3d635eed2ec2aa24e8af5f76ff74a20e1f98766eef14ef1024d4291356fced7a6288bfa3f07751d79870f97b0a7fc3ba8699d575cd2dfde329668dd56bf9265a5ac46e42411afe68b29b38785928e05bce9898c4898b98a4058798a46574524e5716d7f60f16b7e4bae236c74c9b79d98acb2f76a6ae1b586ef044184da84059791a8fe6a3f5cc284fadd61aa598e522983633d6b7043ef5e7d0f24188d9cc8da3d96c369b994c6eb89222624c26936936d35c39d8f82c15453c35278ef6e4b4c171b547bdea46d33497242c90a52e61d85a6b8581e56fd25330dd87284fc174234c0bde83af81efc39106ffefc191062742fcbf11a6fbb9a2a11bc926b59fabe9a7b9e2c6e680f71c6802fcb922459448e2c1927aace53b51e34c93da93a6b0fd2509ba9061093084be37c26c3f5743fc61b6d142b1832770b8f2a3a3b332f949e3c16a9ab693440b6e40421741c0818795c68413407042c708253088d17769cde9209315a133453c3533239b91cd4c9afe3006b6645639736bad55c6846cceb0584a2ab784131466fa54ad7744f49421675039384186b8cf15ad9e5ae10341b16562e7e0e04c9c4953e45e573916c030c3ca1a5eadfb46298b0174d43de5f33e4f85cee50b4b5e9316b66426a0775f7146306da6cdf6fd2498365de58ee5f6d4047cea67a3931529814c267303072532ffff2e2be219318df85f869c41e5e00419c29f8702d295a15e148839639026fb431c1bd879e7859993a6fb79fb56e055cff841bf7098852038f5c5bdb697f60af256d69099a9dca6bd70acf840d0e424326168727e39d2503539df4ff399d545b0a21a06aadbbb3793397d82805af3c808116e204fd5e65008db454da553d3a6968d855464cb2e32c18939f2b4d9346ee2f6f312b307fbcca0e3725f89e4d2718a01b81f87ecfaeff2578b5c0de3fa8d5d5487a2d05751d940431e100154630379aac3e053ff19b77f508b8ac098d2455dd460b4154e9ca4aa492e2a2ab2adad85e3d6be98623e0727c81097f951add69a4cff24d9f23a289f896ee4272fd539272dfdb42f2693bbcc532814f9a6b0875597c6b2b65891758c3489e3a7161146032d8fe3718c34d096ee1126274912fef1611e3fdde0ce2576777726bdc7c09774d396a4c2962e73a369635df66ac15d58d6fe5cf99091fdb27f7a8c643ee4a4afd55a6f23a3377ad9e6c266d25d4bdfb5f4a5c501c57e39659e32bd8c94a1645d126f5ec40a5a147082e40819d224bbcc655bcba58b7fee20394286b840be0caa050d5bfeff3f19bd95fe931379c562df4d9c2b6f7b39b137b15f7eeab754d892bca869e3d285d5ee7ced0c4192d6f474922497450ecfa2213942886c296d067bd967a828d238e302849d5c9493641ba797647f61832b56bef4a17dc9631be7d4c6394fa779ea5f407dc013128a2d671149767751514e6b8342a59aadba51f9c0998e048f1391c5ce56dd99721d3ff9f8416742f949d3a2ff70d2990d6be7e1e169184fc3781ac6d3301e8da7a799d9794a158fca53b35ad3ab54eeaa449fc974c574c588b19cf0a61892854c50c39aa0862d299d3494b669c896a6db538a6891c964722b5ab22232188abc60e465717c0a8ea75e4a5813f86b2e218718a55356a44bf0c2a4e92f2293bdf025c8e2868cac0807464da1c80c263f3882071bb008c10ed4885245145000257143504c8a1274404209a30e10e18411daa0810d44107b5a3c4b9a9c0ff439f7cc589099f834397f490b87997f059b82a34027534a49fcf974764a8259e1f678d3e47ce78ee2ee3c753e4a5ba394524a5b4ba2e93439a951cb1b96ce9a9c931eb50ebe6e6e3e6a723e3b7def66762174aed78b8bbd625564dc15ce885ffe65c8aea175bacc34c83bfae7eb9835adba535955478469a1572f2eb326c95dd2a7ba43b5c1c87b6a0fdcec45ec958bdc11379b34fd9ac819715840eec12561eee8ef22c4fcc429e1f697a4cb99766cd9b2b007db323f955c8c8bb91cc196fd0a8a519eae69f97edad335f6fba94fd794be9f32a13fb449d7e0f8cef1fd54885a415d74a86b5e5d53dfe59bc6a6ecc51535d99452b9426973b0269b4828e896fd4ad1d51445cc830d77b0931b72d9922b2af25407d47145b78b601d1089c7feede7629c8c339aa94a1404211fbca1861744acfab9d94cd13041d482216643b48165d5df59cc54c3a698a92eea20eed152e68e8e11b5172dc56d96e5f6a12203ae8bf3f5e4e8f25c91be8a6158431c38eadf74cb57d176557397797f1777b9e9ef7bf95793dd515eb55adbfde29a8b4999a95e623a01e376dbc08cdb97abc239e5346ee3382e76fb5dc44ec2559a2c6a724a933091a970ac49fe1c464d62e1191f35e9a966f989bf1be8f2b78fa9795a2f7ebd3ad7cb10046026520404cce216f354a3469133aafe9f2c1d0e1c2180cfaa7e370e15dd92241a7a4d3f717355c71aaac0a4057e003be3c9cf922c8ea8620943f8489982e8499255ff0cc9999a45108210541cc560081d8c50d8a1e8091f36806045082a888209287a7c9450a28a690588c7e80933b268438755ffe7a10a7d294da12f0db769d43b24a651c7bae6848eb51168e76c49c396dc722a96aeb8a8c9fe2a1ccb8186e5263f4d760b74c5ad9724f69b610ccc3359b32afd56e396dd2d3b36695e92d8be25787b55c78ed129a41d4ba95018e909ebfd39d302d3869f25fb60f054ff804ffd436043a7970076ccb9dd493cb69549d3f4769558c73af66da5d7e82ced86e3f0dfb18ec53e97d7ea2cd64ecb9774cd09b682a6ef0885ee1b9e939967c8192342baec85ab77268d2b99a7eef1e20671fb5993a607b66417ce904dec22148ba7fad81ff7c159d50867220837338f43bea02651eeec4adcdd7dc69c7dc7a564a640304ffc5782c0e2451c3927711e9a344da44ffcb26ae462d67109d55a431d9845593bad253c20ad2fccb5cc4ac4a710f154903e759498cb1776004dfa8255eb37b7162051501979a7c97e1214b69cb1993ef5d370fe0c326dfa07b39ac54a260d110abec4c88060d2742c16a3b473018be5ba410127484e8bb5c353bbda55994cc8ba98257b6efb5adb0766c98c90312103410e64b194ecb0582cd674eddc2809a288259c802fae18978c6bc635697dfe22d3cbba582c8f87a37e0106198c00f18f10bb206175dc604b15f7f4cc1e9f39553841426fe6e32687d9c8886737aa3ee9903808f216ab7cb454cc47ad5693f3b678be88a7c2ef87c1533f0cc442330526e102294258a2e5a468d5cfae994292a447063b66608145145156fda1e889261c614fdda08e1b2c7d279b47182679c6c9ee6e99219b747616ea1a2041557e3cc52bcee11ed5101788708c4cb758feb9dd385d53720f15202f0826277cbe1df2eb89aa1dc01f8a3cda01fca0886a07f07be24c3b20e57d4fe99ad9c50c5cb79f61b14f7451460cb3d96cd6a23ab3d96c369bcd5c2d336b6733db795d89d4914a241218cea8ce116dd9d9ccce663dc4a6fcb80e4c886767368b4d8151f9f9f9f9f9711dd7719d180c06b342424242b3ce3a6b087eb3d96c369bcd66b3998f1a2f9c2039428694481ed7be9fbb113ff593446f94a1c91f39a10a7d834c1a18ba570f937f9840cc54e51e32b5324bc6e3ea46faa951205fd3c51339d4b410fc3c5632695e384b380982f3b22fd3eb5f30e40869923731c8a4e1d7a80cf76061ee40c18bcb329724e710901a2ab62fa698bf51f9c0791d3ef6a3943b740e800e1f0e7f3804a84aa552a920602d04b6900286192fd65a6b55aa9e162b4c363933c537654c6f8a2101c0849d93c674e3a91957add69a4c35f039818d6457669bf6d4250bcb4417051c0edd725251e2f67760a67cb00bd3862be906fb77bac1461298c054a17f4e999a33122c039f7692b3cfa4e967998f4c26db3457a96432d7c9a109a018111014790186999e29674229ecf41317bb89559816bcef5e8837c2b0109822cf3ce38d114c708c080888c462b1981257ad3299366dfc769eaa3ef5a7ab1bc76d9abb96d081c16030180c0683c1603018ac64dd4856123d46d2481a090683c16030126c87644ba552e9ad08a3014b7d2cac6483d7ae92c21a92c2f0036131a3120ce6556ebfc3603c945c4142cdb33383b93aa1aea956744dc862b158ac582c168bb98484844a3c3c3ce07fef914833d2ccf424ea66d20a5a2e47888e0b10b5565b4113cf9c1c4f31ab798a5a3fb6e41f549f5aa31d72921ffef9a955e301e82808ce94ea5eebd7265a8aa0807b74df2f03f7a8df3fc3b4e1be5f0546faf9615ac821c4aaf44290d800c5d11231c8d0d1b16165ff009b01aa5c993b43163c87a25a803b4316f88d6ebc31f81b6fc82a9342f0932185e047f20efe4e4400efe0afe20cefe0e744054c1afe4ddc3169f871882ee2b45851e527fe921836b8f3cd66b1990eab410b9a3ad549fad4cf477dea1e9c84b9a3590993a6df41b099894f93202fe9144fe9537fedb13c659b36a469e35e4bc8533773ce5875bd60ddb226fdd8ed5d7a604b9eb9b46129377657fb224d7eb7536d457f60a63809b3e4994ab580059c4ea2a843474b0bcfb8b65093fd339ef12c89d849c4d6e12315483eb67c2220285282b73a38df539c03e98310b3991b7cc4339ef18c67b3a39435350edf4ac80e02d545cc662d1b7321c3fa9d62d8b2721cc7715c8cc954c147f27d3776473aee91d4f1635c90b09a46baa061f9921bb7553b03180c4679beba1b4f6d208d1b4ff11652a67891c29014b0c943951b32670fe9defb927d9875eac88d3e8ad3d9c7c7a7cf604307066333a8c06030180c4665881956d688e12c32ec860bfc532a952a3fe4ff6130180c06fb72f0ffe4cba0a6944825924c46035b4e991525bf5e80c1c5435d5339e87b9c3ef51755980e5ef58cd60f4c4dcac878e0eb2525cacbfde52f7fbd6445c030c3ca1a2fc8ccf0f031963264ccffb793859549c3850728d40bf58a5274820ac5e3a6ebc45e592a6c8952a1a64d77bbce316e3f60a658077cea0fe3c919f3073be84e9caf979428affae25edb4b7bd528550a33f35651281f50281e2a1f375eeb514cfd62725cefbbff50ad692a906e0c15cb5fc67c17fcf035007e386ae07b1512208e7c966065110318f464208725def00111985491c40aa6fbef35e07d38d2007a4fc3f7ddcf150c83220c8f302d740f3e3f381e71c2a310efbff108f8de2359cd704e9aea30f4e74a25c2d011b522f16087cc14121c7e50830a22a097141cacfa89ccd40e1a34a101173c78020c9ed57cf9b89184252821464b8c14121d269600421441576c516505de19fec84942358ddb34aaa15059dce08142a150280d09d71f173eb2222f43cea02a57b9a3ca554e0b5bbe0ddfde5e7b4aa9bfac48859124a515b42f734e34726052205d1e6b8ea7ba79ea2f5df0a5ddfe7348dfb03194ee6cb2489339b058110ccc4f6e36bc7082e4081942be0cca412ab3464585f8e87c8e79197e927f861fe4a72f4cdfb83dd296e52a8cfe65c8191491212e14f9408ec13b61300c21326dfcf9d45f2f7f2e49d040fa2f7cf03b05d2fd4422a08c1b5de03817246c396134d0f03d8906f043187e21210c8f2d90fe7b0d90469906c291c87338c4cac3f0833f573dc2f00893038ee3aabf0007f804a81af09c467beb0037c4852130180cc675a00356d6c8e2066c081b75fdfd98ae3fa54e3531067647e265c81914d7033b5f40a60570305086bb731ae5e76766668de254178460084e57d1cf4f13a020a19658941f13d3e0a762c145909f1f274d7ef847e31fe79f58132736b8620b29dca6d12f98433004b9d955219956d0a2c81995c675136370cab973593cb1fd42114eb6c93499cbbafafffedc1a3e6e50c0a993da29dffb003b2378aebc0638b873f68a7b0b29dca6512dbe79024d4dfa372d34e557d8fe278fdfc6dd19d60af0ade30c8320b9ded7a95d4adf8ff069b560435c200282223cad253ecc30180c0683c18e983acc53b55a6b32fd93a4c3bc865b4d82211032b7ff2b89d39bf42df278247c90447a24ab8fc1509cab19360182fd4ea54fe2ece16394518092c82b923857a008038e47c61b76305bd5e0402b27dd235985228c90f0494f1a8f10a08855f848560c04fd9cd2f7aa340e0187b0306de629079add2f67128c4c9a7e9208839f88e0300486a60e1434698080bc11080868db5c9bcd532b4b538179acc97618e5cb21650675b02e04dbefb07ea7d2351c8b5e45f4985369b255b71dd65aa23d57e1c21f7e069ffa7fe01ac275d3a5625f3a3a8cdd0c2a3018cc61b0161537c3adf81a9ec58d25dce20183f998904556e406059c2039301479c10818d60671fcd41f8a457444a1494dbba10f7ef8249827982998a9c93d627847bf126ef7148b380d7f6822df8f27bb93fca3b0f3d2912bff519b3fdfcfebea0d0a9fd7fda6f98cf13100599196d7de0ed30ada1c9c204360b6242b80225d55f70b87852038afd7eb3529b7699b363b72d6341d99d8e4a9f9cd39494d18cda64d779dcd7a7685e3644733d8d0edd96cda6c49984ec44c89609efadd05b77d87db6ec355c39198530d97811a50e840c5ed27cdc0f62d7b36ced9a4f999b54057fce3a71518861fc965138660bf4e2cbbd751847d163d8d878787e7a6c7b2fa58da4d06ed6acf893cb78f341e1376a058e88c1ee9740d1d559837094bdbd15ad4e8d25993fd46de2426b6a444b846334a8469d3978a44ee5f9141bb6cd4649b6eff04a78dcf98e53a1b38f6cc03e4a6e2c1dc66297d6e03b949c1da35253b39dfe48577ddbd9bd1344a29a520a5e2534a69fd384a7d0b35122db905dd514dced72105e7ed3470ac6975888d1e097f705febd89366abe10fee396de4d6425add9b2164eaa4906e9abb0fa16d7401162089bc69dcf6aed1773a84563bef0349e11024d10b4008c215c0b19b349b37c327d64e059ec84d9a6aa413b5b963fb2ffcc1ade0526781b67174db384aefe4919f3e27ce8c731b82e3384e7371d26cad7940d3dcb7ed5d632e8524ae24ce509c737ba7effc758e343e6ea7dac6d56eda4c1edbe7f4c06943faa1f3d1270d3dd2556eec49a33da7750ddce783923bff0b49a88e04a250dda4d1bc19c039d953a149936199127527d57c0157b3c075edbf9613b4ec70b947730fee517ffe366dba9fcf4d1befe757d6051f8711a1e8cd93f6208eab052004f66eff7d633769346f86ebdfa9a013b949538d5ced07b782ebaed12f5ca1eff669333ad4171b639a99e427d3643f0e236cff0bf8d326076e8a93469bdbc679e05f72e0900344b9c084496ada67c20d006881c9061d20aa6bc0901482e2d53cc0050044e168b125520ba9ac218718d572b5d57285754d18def939e821e707a09f2b7e28c38731901c018422a0104263091facf85045798aae7200c415d4e98aae72e084c9e7478bcb392e3f03b110bb3486710c76f9e5f2b38c8d78a6b3b15a4439b872390097bf7d1aa885b8e76f57bfba2887cb2e1d6b591b750d96aea9aed3051197755c7e6f398ffb744dca9b744de742eeea228acbef435d0373f9fde5450ef358d75471991bf9ac0b2997df8fba46bcfc5487b2688bf2744dcf0f511743b8fc34a86b0e70f9a990f35397f3d3173f2d82398d51591008b8fcd488ce341d8dd535f6869eb22b7e8dc75374c54451b2b8fc1a93ae11c0e5d77e34204da86b529787ba86f4fcdacb5375c5af1539e9c3f007290c1f0c7f84e07fe10f90bff7c21f9fd77d0d7f74b556fbf283db38552a5a694fc31f5ad5b994f675cac614630c610a27a09c816505bb24263db1a609e532ad546e2b018a0f1b40ac7a48dfee97ebef853f5c75b5af47b8dad5a0547135ad5404f3cb08a556f7ab092d5e41b8fda02d11c14c34db71fb0d772ed4182272e2f6eb36d1116e7723c1074760030a164a782208225288210496245e30c59395a6c5d5a02041c4d51e854e752d1d1d1d2156da07c971282b4d7b1788d02aec846244910d8770adee4c511d14adfa6735e95459f5ff02664a07ad55ff0326940370e1baeee2466f01c6eda7cd8511e3ed6ffb03d1164c1670fbb904847d310dc56e0f79617c2436ecfcc945615bee2472098107657c38b8baf0d270b95c422e204af563cfa5be80d5da0abe74d512b97208c3ae9978959050029328225571f95a6118246f8916d8c5d73511fbb4a84a14795554cea8fb71d99688d52c80c8a1fd007159d880830a6d469e444b43a1d1d260ad96890ee5b216ddeeffee79744cf038ca53d5f60b11162e7bc7149298d54e4d979027cabc056bb5a6f201d002d24e2231746ebdd4353d4708771f48676dd80b32b7feb7c496ee246ae2e3c5acbd93a849cb3bb2f54ea226ac4f8a7db993c8092c2815b060f9a913634cb4858c7e6a899e88e2d23b89aea8e296a64bc6d7dd6e7229c2f26ba4ef1e65257ddda8badddd1bd6ddddaaa69a3badd564eaee6666e6b1694fb19c4fdcbd566bc53b693f6d01fa4a7fde983721d3359fba77c93fe7ec3b3970e32718ffdeb845981550407b2c1970e72883d6aa9c18f836a13d775deea7d19003aca3b3da5e0b854cd76a1b7f05fff6b15d14c8a05d18bee10575b02fb66aa41eb76d3c52c34a1b273de26366beb466fb92be466d93da58e7b67d27563fddf840c179bae897aef099134448e79041bf8f2b2c7fe5d1e4ecebd46f78c7649065d9647aea84371258706add7b371ea981d402cab5b76f5cf5be90f4839634de28579941f6df3a06bdf33a23757aa1fd3af734cad5233adf88fcf5bcafab5cc9bdc5358f72f5883147cbebba77ef9ef33a6f2c5550bb6ef4fea19c4667a069da3b0d57f04bff6b01a9465d5cc21ffe1d5ea0b49a3970956e730638348d8484d6debe71d5dbb6fb91c012580a7ff85b10051ea619ebd34cba35ed6719d365077509ce08b9db4fb27e3fc15b9f65b8dbcf7aab91da64df4d033fd29cf367b5aa1b21dc83fe7c53bf6bd54f261feb1df797fbc25bbf0fec466ef4bcae5a308bdd1e07e83e6eb847d7f05095c406f2d34ffb34e9b38d397eb0fc1f28f2aa13bb49d6300577fbee5615d47085ee6eff75939b34274dad9cd83f4cb6b9c369b81f0e1ce10f7f9797ae61ef9e492c7ffbdc66d23f29f8c0c0e7a3210fe65761c577f9ab35bd4c0cc54365e58697ff861f873fc75e7e1788786bc55fa46bb4e77fa16b26d1154e2ebf0c5d43bafc465887596c99d0cb46b8dcd3aee971b93751d4a5fc732b5f7ab790ab55ee46c158690f1259d173352857ab82e86aaf853f3413a55d33c3b8fe950a225c7f108995a975fd63fc06457746b95e45cf75a782888b9aa9b9eafeb91c6f3b5098feb9d22ac9076bef2412aa72dbf29bf89f9ffcf966d7d0190870350d080c05e675edb77106d6b89b848432ef7c8c5251fa7313ebf66c67aa5f1badf6ac8d8d84d6d0dd406002b4aabb137024c41a443c31851a41ab8661089ea22d5e90c595d9aa1d07b7b5328ee0759721dbbad632dca83850cef4a414b05ba26a0ebe292305acf695bec2b5afb4115fae251bb11163a112e3dcab319e2863e4bd73952a35655fb9d235251f19b5943ee52b22295c8ea5b190beaf091ffc19232392e18f8f1b616a1598da52b4ea08248a2640a268d264add5bd46d1248a208d9b3469629bd8cff165b79adc66965604062c528b34f6921ecb2c5a567294e5101b469294244b54a9e2debdfa7de92cce99f571eeeebe24658233f1260ee441dcead637d924f0e7bef4157cb4634c932d3369fa3daf7e0f754de92ccfabc8d335b3c7e7a7495bc137c5d5abde84fd9b6eb1ec3761edb7c77df37865c7ecd6c221267152822f62121c2e62121ca39372ca5ac4244eec9845cf30055337b145619be0640a1710109010107f26b82c10f5f199fd37b55a938bda38a5e34d03b5500735c92310902b8acf6c369bcd66b3d96c16a483a8a4ac198a729499a111000000100093150000280c0a878302a1604ca8c962ea0114000b77a4406256381607b32ccb6118a59441c61043081080199199d1b6091cb46a0ff20d594fe3276673f1075759a873bc5f5c269bfea8a681f6f77d932a99744037ae140ea0e4075bcde2eee4a134601afea46e4819ca41e9951c8bc92d69260f2610e2010badd89c06a5998c9066122acc76dff422acc376f69b06e50c94e9edb58bec26b637bb1956baf2e0f08969607bf6c01984dc08365adc71720d40796dc5f03b516ab680c21202b49e81e23559b39368a87ee656b6e7df1ea71799e5d9668b7c36e88d5698af758aec89f5131b26942958bff710cb579f11c8e3dab22cc3654173cb0b2d172bd06463075a9662a956a021aa06f43d3612789a3908963a07271fd09abbfc9a055d2d705874cb7abf686faa23e4108a95aa4a0f7c73e91873f062d68e6e1ce076dd6520446a4b6c2eed200f425ab7ea3be5b713fe664bc94d822f100c6e8e91359711f63a9e93e94710a3df5c26bf1762652371eb8e5a7e75829b8c096b453d373a88e0e8325a4233861dba5ac97cb709ac00de33570d101d16d42052168383ce5b06bd050f1ca41328e58b5206279887c2713c73b10f0a61020102529bcb6c392997b5930cb10b2d7583b18594bfbbf2d9c22565f4c397818e8029187276a69ecc95427735983d88d225dc28818a0bdfe01c8badd25ca3edce7c434513c732587cb4f590793baa10ad30bca4a53e848d707f50ea9603e70c974d6ebc4a61535eebfd7b9566d872aafb276fb4531900c14bdfa9cf4b46fa96ad3faa3c269f8d9641d2fe3c5832152460a34991c18f340979571aed0fc6ab234d18cd8e4e428ad5f9052220fd8e2cf3dfeb0a971ec2a1ca83fa8684912dfdf12939ed8c5f647ac3a5f1aca8fefcaa8f0e10741003ac8215b7b47c15c25fd5abe2ceba1cb616c871616adfa08e054a84c670851b2a061b3fe908d7d272a35ad77498e665f1f1ff43a6fbdcef4748765e0cb5ff52da0cfb2fa4e837d3db832758979bbfece64189497b0022d8117b5c5cbf02c50aa482037d58bbc32950526b5cf27e666c315e1d219832e026f5c0b56dcf021915ef47297397c1700a71aea3497dcc4190d681c33988dfcb0cc5ab04a0ced838a34c265142008a230ba37270e696e704f3583e38cb995aa2ad6e9a622ac54b8df955d0c9303c81e08dc181759eebb01e5073e7ff5b4c37113c13823f684752078772f1999708d9c04870c47871675b575ee0f8df23e29528a9cab6944b973216ddc6a47c57a3abe29840b1678c77e5778098b3b8f4317c135bc9ff54a1da8d0e20daa30ca5682707af7c08bbc94a14a6e073c3d54bc5738aedff44d10e4ba3d9cc99c127f93f67906053c0a324c275861c0a500feab29da8212dc6f74825b31af520dd82567da05cc4b8451ac1ca54ca4eff4612cae86b3b009b449c28dbc1d2ad885106e469459d639aef2bff6a946b0916b7d4c956fee3407e9c16c40efad73de31e79062026700b9778dd7644ea0f41c0693634a6ee0bea283711a4f899726a1aa7b97a0709a88d3559741bd9a242df3fb776604ed84c8e8ba8078356e68de861e922108329b0920457e94fa5d2afa942059e7615b4a31ed15dfe6bb1fea7dc2b96b6a5c1547a2a09b620ed32114b86a85baaa0572e6fa3df2855b9664359e2699f236d45ff3b95fc32a71ba4aa6f498b7ab9bdaef4ffc71ef89c2109af67011005fc0ed536704eaef674d6b82929050bbfa355b70f8f82893dc2d48ae038b9fdf03f69b30fa7550a645f2971e35b34d9cf3b93e4f637818c9678a7aa18ce7d66662b1e4a399e45d61272ab121181ff01a7a8c68e81562cd508acbcf5edc0bb19e170823320003e0d03c5580697c5426dbe1f266a50a32ac73ac322cd1a49b0d01ee155c4a7e17e3338bd4a0183699b1c08a22c5e4d43b06097534b5b1a6f69788aa6f934a6775b876259f398d8a71d108f327cc9c002f0576b8401f170594bf41b963d659567d0af35e25c03b11d0e3d79c71a4b16f6792ab3aad21e7be20076b3bffed6dccdb10e469bc50fa92cedcb6c41980f5c32d49ec579982c968444e1852a7bc7d72ddfd2fcfb9ed6e70dbd0c6740a097d10b9ac0bc84b15b858ec7153cba453b0a4669c865c0f43fef3427da866b9458e2f2024b98026b7d43c2d9fa1bef533c267b0b9f4732e8ae65c8b683dc05d2d79aae2dbec8f7b2f038b929e685e3b9d778ed0dc5820c24745b332245231131f047154b6ed3a30c1e4e493e231d574f2e5ef6cee3816af106187d446cf8275bf6374da226e36bb0612fdeaef11db724dd4e97169a9c0fc6f3b56d1eb72a3d9f473b8ff2d0438929ba31ae6a678f893bf233d302b81e0e4cee22f7627947088239490f5759b981b6a4bc055ddd5d966db5b746e4c53b6a99ed61d744befc76a712f18ca17761bfc5365732aeb67bdd41da0982b4388c2ed06f37d29df7d6dc7bebe18943c664a378e8bab97b31ea42d6a2167d1e1815b98310c4cfe19c005ccf7d99711632b4e3916724dd4505956e0927b5140cb226a3b73a409720f39d3fee5c1a181de8edfba02bc38bcd4f5998d0731a49f0d393a63d648593d4ca264252a67fdd253e90a68a3201553068afe773d78e597712489322f52acdfd57a90fce6fed43739a02ebfc24bc739bf0e5692abf65d345b3a7771436386547984f0bd68d43e9c7ab37c24e1f3ea50bf4c62b6b0da480adff70a1b7c399aec60bd4afb9c6b1cc39adcb3c1479c5bbd8c7ef7f570c0fe26ff2e9b7a11870f0277dda92d0974b17bd0ec3835a6bf391437e2a43ad282c358f91e4d28994c2ca41ed12bf3c5fd3bd4cf0f16bda4b82f778adae32c139be96567f763fce366c3d77fc9fafd35d2708e7d799b54e404faf976b9de0d3d769e587f6a35817f6d3ef499bc1646bde6280306beaf1f953b5f7790684d131b35869a6671aca7a48a9ff804245a32f730ccc045961ae47bbab62e4a8dc85f22e0c440d01793a9162539e1683db00cff1db858765dcdeec888ec8e0efce64322ac0ae208021cdb4e251b6646bea05c7e431761e454136abb5f0a362538a72ee31922b723246ae38d1afb0595ec1942848e51780e0638c76870700a02f00aeb30e46a459c5bb91ff76e16e6e42a3c7bd19717911fe00531eec62d36efb7cedd5402a8edda3d62bdc8af8af074f6edaa8cb1eaf853692e9c1adbde815dd8b208df54d18e368734f1eeab247d71165b300389c0a4760a85bcba4dc51cdf7269addb7d4b328163d570968f1230e74d06c5b1c03796a1ffe50bd41aad286cc25ce763a38d2dd1e7d8623a35d0e61cc0863434f2bc4af9630e68c8a01f466e2b268a6da2625ba56ca141662ba86bb08fba442c069fbd7e60eca527f05ad8e7c4c9c84df17e2fa892b15ca58ad2843c1c81c61ccaeb0e4b87b8bd9e82adda357ea0a33f9b05243051780b18e31d01b0a1b437b855ea126bbe65f12446f46307f1e0f43d78ee77e57e9295d5156998e104a3607ad06202387e12d61638726677bb7a027711ed92e20c124222804f62c1e9126080f06c110cbb1f2f96f60ce9548fc67c8f58ad95067495e8f74e9314b4fb46102a4ef161fd10360d4f29fcae5e5137f87071545fe1e3181369c535d78bdac06ee791aa71a2079897c7a1bf6cdd9ab41bd176091a8d46a11b2c2accc8d299cb6551a8e72f95833c986a7b448ceb83c4d222f1f103b82635a7e7165be9b7b24b670beceba5cfd64e5e88cff7da41053ba33aa0fac7eb50c3e31df4d4f8ebaf2c5a396e01f6e1d9b8050eccfefbc13400e0c45687f4aaf88a249a3fcf71beea8f4e15ef623f5b5d20aa4d1714b5a1c0dbb0c592806fc05841eb93c0c4d0f93ff294ca7348691511fe56860b71976c591b13c11ae1835ce6caccb267569c82ff02758f3074e62037920e665336818359cccaf0225b8081fc098060cdcd55dab7e112e7af557c84e68417a1591e650a1ceb1ede065832248b915c6388ddcbfbafbd60684c3e654f1d56d4d204f281e83dddeb5914ba4de4a3c8fffa6d28c78455844d5c900b974abbbabe0d6735cbb7d573edf26f0c74e51d46f1051a4a524379d6f315162afca47313f5b866be7d29ee31c2fdc40ea5f9667997853d65f86d0d9e05556a407b75cdc6496857543c629dd1ee4bc10d898e5e3bfb084fc4745fe4b54df20e3fcb60d844b43d0700e88a37926203e207f2bbb8fd76a400da5498d95801608a10727b7815f760882bcc4306eb7fca25f226514ce803ade3773f921e0553b058289bccb31470948c501ffead26e71b5d6cd0cb3a999cc01fd2a19180316e377cd525a40a7c9689da59525ea6ad4d303d54ecffc5be7fe2af48c6107ac5d81ce05aeda765cc31c8fa47007adefaa133f502fe031ddca0b82e11849c7a71a5472e8bc9db848853fce2a7961b0eea63928ea69c534a06a63b2aa8fdf67b16d1c1d2ea67a631990116146f7f408d0e8f1efb225cddad2af20a32fe05c8181f0ef586d8cd4d5644034ccc6fd8aac2ab19c520af502983debd86b9b320468927847311dea780ae2e1de6136285e06848c4cf1529f18a0a49b4199668ba6e25f8e3efdfd3f4c869aa3f2aad2dffb0e7463dfda1295720c2b36f5552a9ad0f479a6caea661c59e323df984b5ba405b9105c4d09e0abedd036539cde5e74ca06259cb63d9dc54b8025e90418fb17eaf4786dfc8a371d1c9d5374610edf1039d9a4d1fd55c0ebbf0aa925a819503e10b887a27e8bdfb77d9fd710821928eecb250fe10eef351fa69447481ab94df6a9e3486bb60dd5b871170f29dbba1a9cbd8fdc66c562b8280c6c0fb42978663b7f0345f404e9c0ba79eaab52d01ee23868d9f0ad2f11f1238e38e6a9c529787a3fe26f4c340d893c1091bd8aef77f98583a8b0c8bb1c9d197e97a48709904646bb3c33ac397ac84b03c038eaac479092222a3574bd9b173158bb98b54629d62039d4937b1bd3c89c816f81f281a7673c1fc48e77fb9c07c7e10949945b3a870d6dc37cf2af0cfc967c680628882ccd0674444ca6b1671f7008d65d3802563771e4904ce7f98b630bb72014a59f927ca5b11bbcdc30f202bcc10b33c0c992433f93cbef1389a73f9456f955c697155db74119972f32c81027eb5e4f92ae9bc342a941a3f7533b316eb2cb30c4e8fa963d0abd3158636c4ff323447d1594a79c9f4741e9dfd0df42bff3ab8d8f65375eaef8bfd27dca921e3961836ec8e3bbd917221d42f199066327c624eab6c70cdff3ae3850eea83bea6bd98573ed1ff894f687e5ccfd912cb8d5950b5fdd35bae198e65398648c3a544fac9ca418fdfc96c487ab5245d32f5edaff481d91b1c6052f574bb54ade22530b244a92ae6fbe83dfee27d479bef088c4c188f1edecdc4bc1496c0c64aeebe6dc521df38132810c7c51407631f7e8649dc9765935e07252b873fddfa4612356cf43c321cfc333566ce2c9fe4074ebb70253f3c7ab81840b38f3d24fb55e9368d9c564f7a58059218476fb7f2036e333ac1310fa394ced99b27b4c859383118bea6c1456a87374f96ae19f229005b769a3ed32a9cd50f52e6b2e4f5465e5784e61acc3a8d356f1b7e1870e8cb8584509d81451e5dc929a7454877b30b12193335533f936b69db72084a3cf0a27b16c7b81030d243e68694a2cf54854f8b7ef59420a8c475c8c58891609216bf0bd6fa5aa60b615496712955f4a7dfe3d393c2caf0e8ff46aa44c17939411ff17aeeaff3cdd401ae28f2e4541fc43e8237328e0fa06e112d0a5cd12446dbbc251f4a460235c5fdba5da956e4477d3a0c0734c002c0c39895e7a435581ad6dc003e008340a70a5543f25d79aa16f54dff17ae5e42f4c18c91b991ea0d8c3566a2f8dd2fc0975f93f93c5899954b50bde67e86c73cc6a90e0ceb76bcc19ab8923885e747eb1e09c6d81003db4fb0a647ef64bdbb7be4943ff0453163ba24c69d884db869c78b9017d85c519d3dee90c7bdd0012cdb1b0453ce50fbd605dbc6c6924f8799634ec00a6c7964215e55d11ad8b54fb14ea97ae97f96e716d988f85a477f4b2af230c93069eb9b5180e543b6231fbda39535a9201d25e5c60ed6bd4552aab70efddd4d9deda829a2c924a0f7cae1e9e3effaef29e1fb91eb01fcd740db93677fd9ba45b3c581d40fa08dbf9a80fece0e61a223c8ac3fbef668f8fdffd97f5783179b59998089ba0ab88e8c8277173d3088b7c574481783c34336704118266338b86423810eea8477f52a3e9d25ba52558c69eab63ca8125c915504f458d306d8e85c1f77dcab55bc53fe617c8e351bb626dd3dd55dc5216a41fcda962914965d2e39bda261d37efca35af4e784cbea0f8dfe06ba36abb661b42bfcba8d419212fd47316089e15fba3311f160aea93fd64a37a03beaa911167da4f7599f0882f68988522ea612730f57339d0ea345f7af458cdd81e32b8a37aee6bd3923160676a6693035376c1e54706795a8a878932a61ca7ae93295d8d166d14bb7e2b7d8ef648ca30ec713ecfa069365d8c0e6090fc2c9a439b1b7c3ce1f7fe6e18c4f3dbdc17041c29c33da2c408a8494d325aedb5c692eb2e3773b5cb7415981ef598ab2f1220a688a6f6a6d4a6d668ef07337182ea3ee9b105fb32a956c62b43edd0a7c544cbacde83614506a9bb36110dad363680795784a6c155b2837f01a14c3931d1b03be62533ed3f12220b327a214e5551d53ec4f48c7984b39e6421f65c6529546c9e8e737dde1f950310a6a6bcffc40f4cdab145a141b67b78cb0a7c5557c4730b0277e5536947486f4ab3afe7092451461121dddcd43c900b4cf4b5e6eca9af4ef1a214c1493b16ffec118645df6fa2cd3840edd08e425161ec8c228b4441ab49859c1ad945d8c893a9dc881eda51681f51be4cb05cc7986ec6d75ae9f958d84e061a3f6a3501d4d09c959f83233ab11bda91031fbbe7a375905a9d448a761bf3b16806c6ab95180cfb13488979c0e6fb731d1bb7f8100a79361fb18698796bb21e5bc48484acf96bcdeb8019c0b177452269d3946e059cbf4d56f00208229cff8b7f6b56348ca13a680d344b7904dfeb6f6eeb66533a5bd2f3a12b0fa4c203614c628dc9cb7b346c67b42589afdf61e79b85e68a55e60117ed283c3e1feaeda81e8ae70ea1d16a4fd329a3b41d6f578a46e8928413afba1d7d5d17f61c09a3ab912d2f8638bd8d6b4fa58c58ceaf9f38366c90aa5ed2f42423e8d3edb29a58b4ab0b1dd32fcb448b6cf22e55cce3a137bd0a60fbc22391adc16d6f2ba1ae6b8ea861bad79e9b68cfa36b4dd74ac30f28333347e245353bff8ead892cdd22f874f0e6ea78e5219bdd9c4de8c4327267b4e934414ec3d78730a918e65e1cb7a18c5300200c3e8df5f4eeb8d45f3dbd0b583f5c7fd5a534e5d7eda363ccc25d5eebe5a27565fdd593ed3d7455ded9ca7869f18e3aee70774b81836588341b9d18977d4a1f1997a8de09094be8ccc2950e632aa6723fd36d107a05bc450482adf530609bc018f01c1830649d470380263578da4aeaf81c456385d014e4d48290a23aad703cb27b9370ab2259c21bf2d2f04a1561c53203a5b39347bc747d13803244493aabd222c867b9e5f2b0c1cd3d8f65d51b8df738e4f078044a486a9099e8c4cc0ec1a5d68eb267195b8e19ea83dee05c7339c203f38c433285e220dde22d656035ee0407de7853ce08f829a50e92c9e8e244764e1ce80242f27063dcc885a038cf3798cf3a76279903f2210957325b1819ceecead3ccafc8bab741ebf6416b589c0c834af0a2b5848b6bb329ada4e5f58515b627d1dbcfab9839e1a2c346a15a8bc96b3d29adf869d8bf2c8be9c44afc05c2752c888040d2b100df0c77e0f3e77abc04a61005e92707a55b45c285c72d477988b4c9c8f5b17eed70030ad5b603c18a918c2b81ff9263b30e12a6ad510839c2388a829798204e49aa79776e954c8e814770b60a203133db8414c3d076de170505a9af6ff78176ad386ca65b32af9b2eb0d56853c1869bc624579886d2d8db64cd2de003e86a178f4f4d1e72db62ca177c779e6d12f1b8aeed5c5d00c5a508ecb4167cbea69e7c20b005a082a0af557c5260b175f67445445d37519b3c8b03ad7942b469e39e07c47eb2c4d20a3b70f16a484cdc76fa75740d3d200fa83cad87077c8ab0f58423fad41e7043751d2881e29ec2d5540924a44f55f3af77d76ec1c51812f9af471198d48a3657b5d43956d6f279873111d0d608d37713bd072b799970e2932e91477b6a1763d28c8c261c76aa0d41297ac69706d1d62259907847cd3a18ed171cede18462f63e1276d92d7085b8ef8a04ae9f6ebf2c50735d5a9ee7744a30e6fc73610a9ec27b90ca490ce1c8c4181dcc259938d4b243ad517b8b8120d4c45e590c6395cc96c39b12aecdbe1db5d51fcd0f609fea4223ee06dc94f0b8958a46c83eb2a6c56173616b1dbb7547f508b14f6f6212dcce750e2460908f19d98981c2bf076aa19fc793ced0c3301ce2d8a7553d01e16842a05cb89784970a62cf0f1ce02b79143072d6eb80290b52acb12097f5b02b2c08a55ed4ba5790f46177e78de310803e81660544b6df008457971499e23704b045c64da396cd4ea24b72af99052b6786ef31df63fe8c030f29c5f2c0b6db6d34e1237136c09a81221a032360cd26acfa9356cc4179c1309453b00666cd184e0c4f791606f4c6afd1018bd83051023afa71d94556ab2680660df54a43cb86fba59c964db8ec95680f4ee6090f17216e9ee2f616953176729ef5d941721aceb701470ca37db3900cc08a408707406480154fc5671ee6b374a9a40d87f960ca7e10ffbc8103f787c05e4f1c07e2061f10723ada89ef80d2fc7ef09e62a92e0754fd7b5c180794fef4582dc5ab6d217c6a80501247e0812f6781f285d199e69f978d935efd9c4ba49161e77f815e71a92b072d579f3be772124b748adfc6daf841d1e858833faea6b7f38669a6d1b1ed91400dc9dddb80fc24ebf66ab3ff410a81f8a6076d279358ce83cabeab07579c0a60faf2079c197e58fe07fcd03ea2d2c4d2eba8eddf31d9f2c20d903a9e505e97c20be3471fb0e3ac4c9fbac8bd0f599d3fdb652e5fb4e38e9ddf12b732c36c7d9044859e8e69ffa06cecdf228e4f7df6c3e155f983bbac2498a99a931257b11b46144f65ffd73e0b997ed4ad462f836c2ccc19ef8121c3b60433355d60291942f447066b072568dceef20364eb0755522698fdca5328a5f720a84a21efe69795efb6518ebc261aa9557ed35c02f7e78497999e39031dbada64d5410e5d7d523168e7a7ba80d4b1891d5b526086def8e40b7911367b79d1430c4515ebca7a5f335b9ca9bb7feb64b4bc7aa0bc9b6c2441e67d8307fcde448465bb38f3c3037d4e39fbefe7e0083f8d2369d6852b616f9864c80dd44c3c34c39b90def476b35aeb75181a73d61a50d2436a800528bc9c2e0c45ddd80c2bddf197004002c70b73cc1cd435bcfc41cfbe2f5642528da6deea5b9551f0b0536048e5ff2b62ff405de6a0038b500604963277c1ba372d8ed42590c8d2eec620f71267882e5e42714315ecf826d379f3a218ceb70958f0061e9d0a33c2eac1768848ee51afa72c36a4f79258b518aaaea4f60c8870a27b5424aa024e188e04dcf90106bbb4b66c9ebb5a2f4ce9b6916efe6c6fd698e11f0e375e490e92c8f7d0dd67abed3150e50d62044136faa9a0aad779e74484546d964d8f3a1050de612c55801ee691bc1df256d95553eb08b793a5e3c2885116828e4805b0a045bdf21f5098b73d1d88fe1221e1adc2eb886e698a3829d87e1193814cca5c73690eb85bde0d4b12c234319bc51cca40cd52f45d935b6adea611a4e1d452cbf6951974675deed4f869b49759b05de8811487c6c2c96f571ea48fa71d83750916c6a0b15c662f467eb0a43f6e116b5017b9408ddfa6aaedb88dc57deeece318eb5f036d1e6184497bd624a4aed851fe631c40a1a9a413008d05a11e59ee3631344e2a10fd32e64107eb457d741d6caacf093401e5bac905dfec8181cb369720b2c0476c8012298036165d8af3814d665b6cac9a3a869a859576e1ef2b71b0d1a2159ca40bf569a3c8e96a67634833065a3dd87b43a366119f2a8cd1f38da3024a6126f02be9161398eea12f97f563fa695ffbb226e8a037e16634e36afb51a456db0fe2d1644489c542aa5ecf5e6136ce8b881e54231a7fe082fe5cf5279648049e496f4b06b8d1b368fe17c908394f81f1e84e335334fc16dcd318c7001bb318ef5283dd25f93c8c21e4a8048b8643e7707bd81a2fcd7a1ece917fd44bae65b32a64b13b0a2f04c7a1727787ee2cb42138a0f7539176362ead6f2d8924429ceb1b754922e77b7d53bcef31550b1bbaef71192fc3b0301272d530372de51a27b9421ae3e40db429fecc6b4fa1b81f5ccb6de9a9c58f4ce3dcd4275e0ba383196592638877aae2edeae2aaab248846659de93a92bbfbc8049ee14ddfe48980a757be7648ee38deed1ba6ede5cb3fb4ee5861c89aa514050aa44d8401e125cb1d3faca5b5ce62453f609960973bef748ae1341ab0ff94208f63b52d4e7c35aa3931736d9df84dd7e9c39d5810d2b6e589fb7b1c0ca11f200fe6b92ae76aeb15cc5ca8b7c5a7d36af769b6ad7295d3a117ff9d510c2e8d10259970d9eb4a0676c16fa86faa5ab7c338e86dd5f60d7a03891121fff3dce0409e649e06bc9c26cc8dd2e17bb24d67719362aa9f38c5354c62d6cbe7ef627448cfd0cafaf362d67e2c97586f6541de4a9f96699fecfc5dc026b54998ec1277174e8bb320f33af6d85ca74ab47ad11770e1cf40dbef6b3c4a60800a29f1e205308fab085b6610fbcac3e3c4934c9a2b7bcd51beddae3f8562c09db3f0548e1aac6a6acac7f8b2e5fd1d85952026dca1c6733a24876856606a763e004ef0f41eadf4d6f0acdd0ca8aeffff0063903a633eddc6f844e9c3e5f309fa2388529b50d6db22efd251ac8392d4604b8e1663cb6051eb5d9416afcae5de1e6bd152754e29355ed4843cccd054b69f38bd56e2dfa48e9d3bfcb9fdd05539367298db62511c72eca567d1b6e09c4507e0d51766d101d05cd47e55ffd3b3f65558b26be4c5ff20f25334031c324535c8d22bce9f6fbe7c3e4645df12222b7946b5d1db8500ab387d3b73961a30e679cd83215d5093a96e81ce662fcbb91a38d28e3eebc47559ee2bacfb8f0170d9115a9387a66ba7118cdeff8abc388fa4cd81c2f2a19b8d257bac05bc52346cf00e105939293d69ed0260411cf9f431dfa04d3953736ca1cf756918c974961c2a6826ded6152a6732612485d6e9a2be6171260921f9ed498ca032c5046f2d3f97f7e5ed6aabc2fd7d546ef0019b3347896b8d2befbc9978a180fbf31df84f7abe57bfd81b6d975b778a93915b8690a9c0602879e9f6f129f9996e045ad7442d45ecb0894db34bc903d4f02662748d633c8b210129dd48ec3e97f47e2f1fb2876d6cdfeff147a74476d2cb2c2e9fce0d64248629ae4294f45166a63ea345d96813335826b50f8982e68d9c6cef4c403bec53e8702b1972107cb55f02db451fc2e1ed5a0fb01c4f10ce43d1c4277bbdd39f603e1e48635a8b2336e2fda14cc073f29244a82acdaa702e2e9c5ceeaf403323148800175f096a2d92f5e7031f5befb14a1f530da4f467264567522ab890666fd44ab3584a9b52e43085e98216e7fe8adbe8c4c23d3b6b9515499a87d79e3e68ff41050303841d7e43be90710332516964f5d257797dee0d6fbf760cda01b2b78fbe12583afc78380d8cb0e3a40014f2811590e05e57ce080c10e3a0a93122a8e6411ebac6bd46d2e7df276b7ff5bc8f459fab1c12402b447682a64904ab458a53eac5f7e084836ee19f76ad338eb251388f7af4ba1d283d741f0361a6342f3c3f928993fb12a8eaa0c03c7b25de9a5e4071b1d69f98de1590e1c6dfea1776de4e56f52fb84dd4f56ceac2ad87fd501942c71e58d3f4ae1304ffe067dd04cc5f8924ce9672e49a7e5f2cfd457511019ab6502959a3d67182a48da95aadb56bfb16620b8258ff05d83a622fad56b5a4fc0da54609b95f07d7285f45c656a84242261226298d39838e89e6b9e59af7cccc236155b8f230a6b5cd42ea61b8e8ab5927dbb0242c3e10126f6940d8a454234bb4fad7438e15a08cdbac40bee26c8bba09d490a506e945462edaccc2525b18802084cfe5e315d3fe9353b5df62ea0b81ce2fbada1a0a27c914082397db40506b2ad2d7ce24974f8fdd25eca1aa48d302702d4c79c9bbfe26c19be9bc6d87d39acd677cab106c985fc411bfc8b0b1b70c9f5faa818c425f82029ada70f905fee92171ad12fe80b199a1f7fc4b1520be62c477a40b72fe22a871b7ac38cf913e19492548eb6857582d0c622297be741fcdc3877196c785c553b85febf8184bd28a76a8179e542eef88a636f1c8ef2d62e1c0b088318fa7aeb5686abbeecc757104b4e2ef449f16fdb4d870afa9f4638bd05296bec511aa94e74762d3a79e77a07ec91ff7532195db3f58f150c2a1023a90605aa5bc4362b0bf7d2190c68c0c86abc34a0ab04fb8fa42c84c410590c0f65ed1d52539ae581da5faabce2e393be22208ce8d3b1a48e3063a6a63a7b80b3ff5385168b752858ddb95b8dbf415ced9307bd462a0c8d192909a53fdac4e646ffda4c487ce1bb79ba3d4f577c85f65f6c19da5ff14102a3fdd06bef8310e54f95ef2c7be32e7be647140297c66427cc8e4260c207c476b116ce605b007dd0b3bb1843260ed33dc82bd8a26d833786e1c56266746058fd25c8fca293c3b214f82067c33b404e861a85b4c774fe1fbc556daa4284bb24ac68c436d2a78ab34b4ef4a024ce98ec2baaf82dd85ce35f7701c59b92e272587fc76fc74946e9fc4329c6746c905ba37a2cb5ed6717866455cedf7049a9a3d9c073887c75f9faa9ca706a9730213b3fb90f1eb9e631bec668e08e6b8e0d005799209b500858061ad77466f15c8165794076b8f3dac5b8b28b841b03698de6c607590e14229b6a6d310d8c42ba127319abaaf7d6e3385e44d71e4a902d45466b2cab556cda17cc14b185e956e7cdcc40ca5548fc703c8d24a5d85145dd6e19b15e1c1a631bc03a100cd7eeb7b3b40bf84839afbe562cc6830103ce294669a9121012124f0f34e6df44bb10f87e6ea649e58440b6b3283b416c8e42fbe942bdfc0fa50e0c8bf216229832f204ad3e05d3ff03fd4d0d024296ec9a1247b874b3f5e036d687b94561104e7dc4a04c28380b581cd17e2108bb4f299d1c117ce61fada9a09281962d05da814e995492fa42043cc3bc5021dfe6067465408a7f1aa6cbb3cb108eda2f1579ca046f0fe00292ed5ddfafbe9bfd03e141a8801bb0e255fa1ff8af024203f6d801a42af1ff4ec9846ce0f49f8ebebb9f22c46f0ecd17619840d4cc3307a4486577ec7c83dc6ee93249fd1fc9b9e202eaf0a48c03f237512413e91a4952c5aaa037b89f185adba6968826786d158d2025f18ac8ccaf5ecaa71c1b27e83cea74e6a43fd8d3e1f870448e1bd63581dc81cdb2d0f68c054850d36a72ed0bb32509165210c4911f1077e571e7a1581d9e3b3e78cd213e88e99a700df67e7ce7540777d89d8d4faad0edf2e90b036759319d76c761dd5418ff054beddc31b87339c7b51ee4ac80cc64fc39789c106991ae2b28777b5c2a794cdc9e00c33bb555ba6898d8a207bea607d1ece7af50e935397439ed94a00587a6fac4c69d58a4c51a68bfcda9409376b4dc60de28449145762ae9ebdc2b11318f520b64b6d8945f32f1e26dc47722f1d51c3ec9a59e86f76504b983cca35f2cab2c6c43ff5ca990a402e111704a60f29d108c817b28a50ed7e622db161c28709ee86ec7341911f8844536f5ee78e35f024efc6bc4c8107667e9d85cd1edb7bbff1754e3174607b0a9156b8062c206a6b0be6bd996d5d5eb35457d930e7213685d67dc43f35c0ea1704f73bbf32a11cd093ed4c8391923bc6115617958d830056a362ce541cd1f2468557b06ac541cf400415bedfd958000398962207948c3b2241a9671e864b384e713339aef8413eaf9b7083afb3afc691ddeaec6c8af39a8c301c7a0270a2a236c958b7e88cb37e5289c3309b8b09d58a12d64c20215c1e8ccd44566479106d1260d4cdc1b2891d3d435ed7216c9b3efee6e6846e0f2e5da1c18c8368027f5be349fcd6171c1c8983e7a15e48095571eae889fe145f4c8200124a0f2f7f77e8798d5228e1a8bb181780b41057c6d8192327eef1d6f65af83ad3652d342a42c7c574345b78a6967cef21a730e4c49fa61d1beba94ca7cc5cc8d12178ab38bb1e6dd86ca5db7748ce52dbe6913373a5cff554435e2bd5ed9bd3819f62cef36a002f08d96d99a6b3259b11d073eca4f35e81558c7945e9f97ed91ab2d604fb518da332021380f1683790de5c5610a1b98a36771a8b9a6f2b12b0da613712c7e29ec0477e0c53abb08de521eca707b13df9e330042175ecf2b428b040a6cd05af733f0d98e099807fb163a6e6112b5b03f1fce55435817132984916dbfa00abff726a40bb6aac9c9d4824f12db45ce3aab56159fb349bcc524fc2308c442328182b3f91beb8429aed89c12607787be2b8a780308c736a6300e865cf47cb23baa24d3941a27899f646dcbf253171304f64017b5ec797da15008a9b2bc84d624cbe6b32134467befcf698f4608af9d55ca1a1b59b739ae4c606fa6ec7f7616dfce87aa799e316fc98ef0e9688643990dc6d4b3c3933deb142794124fdd7961685694bf8487741d4d9121fd27d6084e0ac4a972d178c419bd8966eabd2ef12c10ebe021f7cd2dd0f37ecbada70e81549622bfdf8b8e2177cfd0887dbd2c3596730c8f6986f574e4ea7b2460386da066028b7b2f12e2b6efa87d89d56d0c425fc447ab4148c38793f8b29a8c83cde6a519468c793f3073a4c147b8aa1f81d01346d2cbef25017b2e4f126aac26eda67e96383fdcf1e90936e39a400b30b7f63c11c59310770a9861699b55b56a12a11b43f2de12d338e5de134c77c874874646a8cc8469aa05ce5d359bcee147a4442aec4c79461a081f6d0f29699e0d3242a684f60975dcbf9e707d964e08802d3d016b7d4ace2c2707ce4f9ba356b7f1d0d92c4005e23e36b819607521afd465c271e79432a7313b9e0a55376a803aee6b71a529255b57418ac4bca7726be3363d3c4040d1a0c25d9b8ff7a110321b3b2ea2d09caa2f31207691753fdd8c33bac0e97b365c56f4cb154a305bc9eda21c7c8a4d6026e4f0845136fb43af6a5c662188eca9839b8d8082477fa7e80e3d0bb25a28e10edd6aa8636a598cbbd53c68e9a647d760d9ac6d01191bb93c798e7223ef08717c97fdd2d1487f8c3528d348ff599a5bc98f737b4a27ed45fa9faae5653828e9b1dd9108a6933d4e175c4f25f64612f036504bff19876fc56361b26066a93f597f588589d8ef6594dc45c308c590a481550b089ae1a5bff421ad8016383d05a10785233b3ebb893ae8474d9ef4685ac45a9e40c7bd0cfaa082b7b95500d0910b9801e0950ef585e72a54f03406d563941b1b63a80ba3e5dac5534a69499e11ddb0091eb48752a062833e1cda00c7107093666af76b1440540b515dc8154ed501055e814591be4aac93728017221d3ca772bee36b8c19f5f853c2e0388c710f18165032d18e579d3954ecfa510114ac3e2ee4d7c85aa7bde1fc59d21c6fa434c63c844251239cf535a4cb0185127430188dbcf349a383da8026047946721c62088d1df736f4a14ec9801e058f0027d92ca9ecce96ac1ce1ed815b4377f14e50315b49c2b1fd1c0cf11ca826db83f1309629484bf5cf66e2968f60b603269f449d3960b3738b431aa53248efa8a4cbd7cceaf55ce8ce23ba970977b3529aa84b62c7769acf443d0d3a76e91669e947816030348685c01671f27b8dacb46124a51fbbbe45dff2a6d53a05da1f9675656b3c5434d85603f830b7643f58fb113b67e8505753c14f51a44ef5d8e133d5d064da6570496b71984540fa16ea415945b4f1dc6ba762418a3a97c20d82bf992e0b4d7cf1096850a08f1a4c3fa44f807ee45397a4048c66ccf8bd65ec2e59712fb1db929a26c4a3227c68b0fdbdb9c3d7568883b74938172af7d150e0bc7c5add181daee4e98010ff0b396fad9ace20fc3564239f866213f825f788eaea0b0396ad8c4ddc5b6b4d32b635701ba750202665a1a18a2bff682d9e044c81c7f93760f164b68640df00da74f82a26fdca5d465f9dca1bc752f375204bf75e233605604ea7829249343ade33e0324c375d5aa436c0b28bec879911146600ae0ba46198f0d987c62e2431c758cd1c0d73a069a1e7992a430e98a4bec3616820d3ecde38cc05185b2268beeeaa41fee1d468f464ef79e3bbf8be6bfd7752b439d87f8bb73a3c0101def396ae1ace264a861e8d8212d2edc8107232bc14ed84bae43254c039e61cc1cfcee30d1660b08406564f3552d9fac715cfb7ca7e035f92ee28c2eb4829543b0f454efe87d108d394ca81cff5808b1d6a5ae0b88293d8da02ae7854c45f4aa4bb20dcccfa678f6d1176613285ac302cfec95fc580d998a1294b7cb728b9dbf1f25b032ace0649b600c095b1c486c4b493cfcbd84c452bc802e7ae0d7331f9c3c1ce47fd1682dc3c240d2f72fcd9f0e64f5e2cc4b7c0560aef98001f7253da1238e08ecf492b84679060c0d38ac60736d4bb831d37726da7420ba475330872ce971308dc5034a61c7176a3750ba6ce8cc966cb9c98e07963a2fbdfcaf70f0c9ed0650987b53001c0e7b87517349aeab606e3fea71014e048e07c880aac8f41edc69eb8548f7e0f17d98e9b7a51d84fe14c70395649efb752d98db89a0ebb26cc4438c76e4329e6303b9dd009429260e59330c2821b405adc4ffc8390456ffb3eb858eb147803429746ea715ad25e7b13854e24de256d01188978f0baf39fb2709afdeed0eb5b152ffddde063b1e2130c0dae6c0068df4bc1c68cd486fdd292b19a9289d02da6d917bfa108304d81838c500ad624b7ab16f79a0357f1818bec86d4ceefe5b1fb886ffa5d95b2dd04764ca60b94d070297effbbb933dd88212732d660283a289f83cc3b659c4c61d7cc0b546d856f488b0987b71e95bd7081b18f8a4103cab44e5851c0a8803bf6894575c428e4d8cd0c9fdc80b03b1698934819d542a0a2db43a589620008daddf294f342b81808ee423ee01b130b34a71c5778e05172fd765a811915d1b86783cf05606fb073d96de4f3db2ecac1c4919a40076fc42000c386bf151aade12028955d09bd007a562af3ee4c21667632fb494c5dd7f96428fdacfb34eb9d7ce345127ddba506188431f5ad0f4ab39a444affdc65de530d2cae1458812a25e6f75f8f862aee5f2ace501458843051f1e1a4c784d8293d0740533617ed936c4b8478c620c602e21c2b84b4f79f0b4747ccfcd14473d152652e45c6f3c44e68be741730fc26d51c11b2cefaaad23c8ca01494b4c4cdb9c4df8fbbf6ca343af1ee3bd50ce9ebdfc45c4b3acbc4bdaa50bbde1c7058f162dc309b91ed98c39d8bc1fd13d2747ab8b974a42922a63271580eff57d4b971f50f8e845d4cce200f5be26adf186e53a76f8d1d8719191091bed832f68efd40c59af0c0ed09ee103eb75b1258469a6546d450bc0eba109920679031fd1d7d1fa88efa5bbf4f30a29cae362432b12ab4f8a91bfc0d0c404b165bd03c1806e7d8ae455707234d56cb425e6d83e55443c400d8b0b13c50deea83b196da164cbb8b68d209c8dda084b29bd6e605825e57fe4d772545da57cd9ba00b56c590f24dacbdb0f0b552aaa431df79a16b46899d33747f9ce061c0d42c7a54be7a3cb628dded8632b5131a3571b38644c8536688ec42e2c373f02d98bac8d382e9dfcc436d93a78592bb13a3f7af8e4083eedddc93399acb09a7ba68218b49f054c3a33cb1971c886ac572f0b7cacf3c0ec07e08d81b2f4e406ca44b06b3d61f95254cc6526bd544fc328bcd324fbf2699e4e94f30b9a14b0ee00ec4b81b7a6800aa129bfbdc231909823ce4cdb0719600cf049ab83870977ed22a5a55a63ccf5fdc378ebad02a3cbc0585ddb719eb47b8ae30426c16652735d3cfae01993246c6ff33c1dd21c2c5bd20c2dd5765f69c66c3c5622b241b7d48d56c7e481d598c1c7e104ee5d0cf8b967474c9e06b7324f5e5054ebb5b04e50289dbf5464bb72ab978d5548eb5bd8dabfe9dc4bca2413581a452a6bf45122f6707723731b2e5f7b3872262d7d30617c26ca756b4bfccf9d8f0e71004a3141f24cf5ceff73b66d02b1effc6803cbff9f1911ae865b0757045e14c7b69c741bd6d2c29f7d6982ff8832a0134f443c612531c3eba51036adc6c1827dcfe255d52b33ec1fcf729f1669a0f769bf9bfdaa5201b5e6bdaf464328a1f7af2182e15b52d1eb34ac23469780b00286464f9165145b38ec258eeb54613d51adab23073a8938892176b43a252539d702c0f3977d59f4feb9188e0c3f0eb0e473b45b0c37a40c0bb482ac88b69b9e2de0ccf079a273620a1c20ee914402c290593b1e665c97a5348cc27af43fed97669e7f5b26e38f5bd4713112cfb0025b79390e2a981dc408f75e409ec049321d5a97e501d38aaa51637c7a4a4b267b960516559fb9ab7eb0e903b1d8964bfaa8afbace9af4122ff8385deaf27183d675e1886059d02518c9ca18e46a65a3ed261979ed3fb177ca8297dafe7a2d6104ff481f332adabc748be76ed6252d3202177715dfd9503ad7e89379844d15d714b05e072acc7550aaf91b9171d25d21c2ef1c5cb81484eebb989e86c6593f60f19db63e75e71ccb890a6d903ad73f857d08a1a46c1408dcece090dcbd40fa22fd9ed16a0bc488df45b1043f412fbdcfd9e9ceda4322d531c40fb7cc2123c6918796e3e9078fd3f0920834c7bbe826968782a882363f556446068706605067f0d82426d5970db979dbaa0f30ff4c8736ca421d22b50aadd5429beef84a68dd453b1f1db2d7a188e2163c045b969a86c30bc2631be10366536297b203e4fab8a8cd51877ae37b93b19bcf497b39de6a0324ee2e78abd5f12bce2799bed5b7e97b7756295a7da5b545bb5942531fbc38141bc4202f0eee48c9c819e00c448e7027b4a1b75d1e8fb7396bbe1be9f90b021e18fd85e6b97325131ec6854e3eff2d1486360cedd48abf67bb1336638cbcf40a0d6010bf5269ee65a1bf580a792c30cc360354cfbb69fb9c87d6ab60fe1ccde1285a34a1559d0b26b4fbac2b3dc3f411c135b58e32a461bd3e33b1e82a16e14ecbc740366a9525ad65115d96c9b7a313afd6cd599e6beabbcaac9abeabd26de94be1c49731b946fdca6ff26deb92239726ef1f90df68f4c4dac73b1d7bde960636f244addc5faa6d6b86c998cecd0c016bc1e60c693e11b0b4fc8942d29f0ba21ad28b4aef7f43fc038a426792f61329fc157578f002da9e9d3d5c473236031183c21597ffa09721c11a263bb2c67ae8af2a87ba03d3be43036d540486cb49384775b0a128e0d693a6716493bc9749a43b9800c0d77a4d5ebf0b70810b15339b19c8a905705958485f2bd2f1758d03744793b7860fa9087a56e30ce470ccc280fecc2e4e9bbd3f39bb8b79f653990f92236b88163b4e7253be3dd9ec9370230fdd501a030b51c35186634eca328d4559fa45532ba0ae469a1cf62c94e33332a98ae6b22cf7b5644b0336c41e2684e0cb019d7cd6786136e1da13fe977d80d104511c8140329bee187ffc8b172a555c001c7a1b4b9026147af896866a34c6d7c3af300b9d424c69a30a364a62855ce3ae052c4e9d23f9b20f97a40616c4e585e89accc80f39f922b47781bd6821b3029d659773fdf9d80133e06418b8358fea01b6a73d290dd4000626a3cbfd01ce88241e276d97980b53844a04cb494e760889bfa75ce0d5cf1d38fa0eae14325da46329f49ed9dac8f693e3a316b32d084c4791dbbb0b523fc609008f8f9e3b033bcef928fc5711267d1f6c14bf3a9a87877910b3d3e3180d63807baf1c00846107c050075967798e906237462a1f5725b6d86a922a121a9c750e4089200d9b0340d1d618ea2a20ec5e9b0c3b008c909c7b5712565d73156779faa7f5c4680bf3c30d20c0334f8087912c13e376b01ec1789d3d0d4b1dce1b3f912268ff108194e903b2d0f850ea35ecbc30c674301ceeafe791fd38eb0f2c48329371734207978626188886e3dbbfdb013e403657a72b9a3f0d5b71c47323937178a38c028968db90e2fbec28fad7de2d0fcbc1a1e2e2a68bbc41514b51e24a03e161253f1ed275e8346208137c314a4c57c4ae221803904a1a8ab8cf085a2b650309dd418900257c8996fd452d00ae019243157ea6671fd9031ac6724fd01a2f34297fda1a762e31e3b80feb18db8082f8ae629fffc6f373f84643c78b6c109c63359483e16885027d404b25b4820f95594725ff7c2b6afc2e40662eb707635fcd34d18830ad285ee247df4725c135468b0a60aed307eb0b2375e9631fd87a39899912508835a4bf1f04fb0db94a032951b651174772d60a25bcc99708f78d06bb23a812a3b01c0e1d2e19b1590ea6db5baa89e5181341250a2551f156f06e49375b005bb8dc4ec8085aaee8db5ecd41a555d49a6f9c47d9518ce26ddca16173b0e985ff4a8ec94d79f7abb4b06770e8da7e7f2040b349871524db591182bad7e5f26f9a4c3cecc9bd2af2982b5784e9cd1c683920a6637bd12f7534d51d2d54d3bd34e1f3f52f11ade849fbba6d3c37d1693bacb1eb9599da10a43d0421f5578dc24686267f0d2eacbdfacab1fd2c69b7ee2e4242cc1750322466dd24a7fb50532a7620be13170b5ad1260abd1f61e955442d1a72c6420b58283c1eae5509ad3582a9ce95462f24429e75a81607a4d576f72febf94416dae194719cd6c4cdd4753ff58481bfda39620f3f545b286927c543392d8b30c5a398aa36b15c4fef469448c772dd8efd57b005d1bce47d163d8da25ab6afcfde6fd55231b3dbabba452b973142f6eb2d13e83b134a4d202e6ab7254cd0f24ae58c950a87b9c505665c5bd7d4a06c3b93c79d76f1857ab6522f9f265165676bdd212453685ab63d678f865240151b89985c0ea5022ff9fd7bc13b81beff5c485fe3634d4be71096754b7a21da650fdca7a309901fb9cec0777f2c57a468e5b6c30c429aa5a97fc94864b6d38e6508e7a271a5f288fd78f61b5a752beec76ba6814c69aed1fd7dacb18a7d9355c862a4b0a2304fbe9bb02eef352b056b54e6f0b014e80e6fe2ef616e336cb11d9c863a5873c18b63420c9b0b1d2b850f875ff81a51f954b78a638872ac27f3196fcae4ea5ac6c92b77534d464b885179972bcbdcade711719b4c96526d22ed5da3edf86642f429b0e91c817a5c7eb6ce18a1a2698ab0db68df9f71c7b4f08958880978c12f8634230b5e63d94afd874320a3a954c592a927df515b9af78e13abef1b9816dadcad5155011965c08063f0d2ba5fae752425ab0722850049d18df654b3047ae7a0c10d16bbfaaf8308036818085dfd6790cfeef166ee2f40ddd186a2b992dc48ff2295c5cb9bf10b21771f7b1d29382b8ac5f7d2e416783ba2425091bded79e9c31a0c800b6d938d2fd9807baba50dc67aaed484db7a2ed3f4b7dfe84cc98bd37e32f3b320f1bb0c0cf59011983cc95597d4a8f9bbe67df259f62d84cbbce218a63cb1da5e93bd9262485ddec21752c24ef452816738a27ef260146242278cf1e060eaff8c0b2431c0e2491d54832f6c13df59450bdd8132d532b30b29cf2db9ea22b66a93566ddd8457ed9163296e8b4b7bce6ddc2c80c88e4c50a7f612020cfed9a7d43d743cf02a8f98b6f5c18ad1684d6c42f644583eda5ab66a1a708c7be03890d1186cc7d152b50c098b70238c98937a72187c74fdb1122840034212e2920da47f63b489609d1dac792f7481b088525890129558394df53f19a4c234f5460c080b7e3398152c7ecfb8472cc0ca254e567183506d5261494ae16924ccb420cb20b75360231356faab4f067144a708620021ca6b5a1363f2601aaa407f83b46b9aa013d94c4ade6617495e77689ffe5855e075dd43dbc8998dfd3a9029dc00fbc4a0bb11aa3eed41b0662a26472cff75aa72b35331bdedf4d459e20bbe740b33793de69c73882b7eba6db77dd50b7d0a1265b08407bd02551c563183de57b6d740425ee9c9e282951d42266a07849d4e1fda5a5c36d5b3fc9d5f0ea42b3a38f8482d911088ad77eadde4a15516208bc17cd2beb7ea44d44c30a9de3a1cedb44e34a2381f02687a9160acc1a82d455d69f3e6e74eff1922e8350e521816805e110066e92260d125d61c8f50e598f635d528984087bc3d9f784a901db6d4e9fb76b059ae957e66fd08a38a261a45f11cea77bbe8ea74d58e44e462a822b252dda050faeee30ddc830379eaeaeb6652fb1823030547915b8d3d392e9a8fe39d6920974a535e61901128669b32cadda9e4adce55660cc72faa3f376f581a9f7284bc5dbb2ae15797cdada9498117381dc5213878fbf82046cdec3f0875f2a94e37d5c26d5f69c5efa9d4d61296d03187a7cd18eab1723d575b4ca4d342a9afedc8e056f9aa4d6066cc7be50a5a6acf5eb9dc5802cd636ec6ffb7bb3e66b41d9d6c98e97faf07dcd67b69a88c86babc397ba0356436cf086bab13e413759b1f8f311c769f1db754f640398e5bcf0f739bca450a68be98410e25121ae0fbe6770c7a03b7b878830688c0907d3ae197960ea4b1312c53530dd1229e45a5ac469c2cfa67b4dc127ccabfa6f1c957bb882a23aba3000d4a1a04582e85804f81c86906e866de22f9f189049950553ea693532e684ee2db2b07263ebc623c50fa49b742c980c257f9f1422ae89d11aa387a2b5e3b55ee3d658708bb254f712f3c99d167b13c51d5689d0140ceea50cdaa08e4e2d9a3ac167f30e72246b0724ed62bb720dfe2e6e8d30076ab60dedae8822496ed45f80e77bf1540a65fbd23cb2dae8484be8fcb8f58e28a0382f74c0c1164c33244acca6f0b1892e3fadfe502b8050343ae97ee40c0fa9f2835c78340c361a4a456b140661879974019c22a51255a61aaa900c63c855e09cc8fd548c4cf9a77d8965f3cec9f3291512da11d5015d2fb0da5e8818e801b6fb219928c5e5aaac3f9f432e8f37bf398dcc406f8c26771bf02df21a4177c13518cdb98ac0a55ad0c28d5f88e2e43919a7b1ec50296dd889488d4af916c9486d15dae6cf840b981632c9901b9d5531ca1c2bd3818a0a611110c56dcafb6174af09a988b9c4f481508190e956782709c319760bc8db2a24d3ea1e8812245ce5390deb54c8c5981236d14effb0b4063dedceaf10a1f6864360eb8616cb7432462cd404cadf5b4c18f2221b8f32fa53dc7510c2477762514668a285e3b921a5001e9972c6d741b2c7fa56682a3d9bae9c2124b31c36dd75bfdbd47b393f325d0fe0d97f53c3d34e57165980143a05b5cd27897622a86e8c17be27de59dfb68b8937b82e2af3448fbdcf34a14ad49697de3009b6195a46cc64a2298b2393153e1860ed717151b31627eb985060b18cd9a894c972d430290711be97d6c7925848023817964484cb87b19d69aca9ac8d643b3c6d03b23db112ac57bff94f8a850dcc152c84bff4f2665f2e8b019236c47bcb576bc89a72b092d36a2fc5d3b922d5e4f4fb9a737242281a60b368d36f775e6b1e4f3aae0812db4563d5efd1e1f032e9f1628f8ea225e3eaf55a8f22bc98e4a52d0ebc7a09d4aee882bc1b6c21d19388b411bb80727c980be9affe0297c25c4f97981ae95e04dfe213ff0eb2fd54414f7b22b3c87ef38d0b0f283c0972d010323ff9d43bb723af0d66aa4e87229e1aeb58a9be301daa54c0416d20f3c7f609701ab6993c2cab37f452e569de617d2ff17f992839923e76fb23c9871f155d0a3afc5ee394272d78a9b6670324753f34db7f5eef12f9332c50866141f87455ff5aa9062d2b0652d0a0ba1b5e85ab4dcbac1a27478f1ab30f4037ee88bc12820eea1d258bea2efe29b5782157df29536d80662ee70f1e9850433d6e03afd515fd319085ecf654e7d5c9886d9e4e07ebc925b8b9b0f11b1b1112cf9e44915f39203fe0dea3376250e428febe478c0230cc9df5590ee87e36e839bbdab198e680a7e394aabe574325ead34497f44b4a0a1a886f49f063afbeaaef5fdc7320cca66f31f5e4301dd55958716a1d4258c45b8a86a8d63064bc7ac4a70a7474c4af6ed88ff774466a6d88753f7fc6bee5c88f609bbda5262c938e1e32a699aeb042af82c1950050be196db81348d39c8238d1369f3670c96f64c69763f72ca587a6bcbd719d41fbeb4d35a16c753aaf3c574e54637284a7cef398619d6f83242fbe3dc66dbe8c99b88bde1da535e94cad458d6815ddf9a3dc5b204243a522f88a7b1319561572f133177c498c356e69e89ff027b17cec45b4ba421fd5a36bf90873a0d7173576faed5f518e2ca1b913b7e05add464d24e7fbb4621734207c87bc1c706b4795c64d4b3a852188126d29dc85d20a348aeef948631f1a894d525bede0a328d6ca982a865bcb1844938ba853a6480b5adcdf2a8dec6b47e8c206fab73bf48c91291d34fc0bb6331dc607c330336f03e91e999f73359a0c6625a01ea542818d221c334219bdd111e249ee44021e412b15a90e1aed933ba3892442a789d372468caf8d58dba30c0b94a75fd72af94f748372f90fc3470886622b53bb0f2434ee8c27a3e89892619d808e22f94ebfb1a813baf98d40696caf354a969f882e0522b3d543c7c2086ef66a1623e29d1a0b1f313b5de613df9c0fc2c54c04d40c69e56f2e102bb94ca690972eb4ff259fc8a67b06c01526be83f780679dd1ac26eb2685d3eec90d3cd4c554aa95fd5136a022c5607620c8d7858c660bbe707c72da4c5f4d38ba2ee2a00e424d4372b77de5c038cc8612fc54d6a1ec40d4e7d9ffe8be218e23969afefbfeda59ebfc099c18892a75a2b795561fbf8148177476ffa4ed1c077a3e466dda0dacb0bfa1b58fc36b4524ed329aac515455e8633603d7a1260a6521980d769d16d6606daa818c5a02e6f77062bb619b82c306abac556351b6ec1c9f55484f4ddbd15817cc3dbca90bc67d3abdd3860ebb4e5f7886fbacb76a542d730fe0c9ab84d82887435ee6e77eee2a6ed84f33e278d0aa511df3d82fb5a705aa3cb6b031aa6fb665fd7e5c6da9c33a52c1a1fe074a74d9d4a8a2565a42950cc2d4327f2b81fefbdc44d9446ee6a9d68661414531c9da8c779824233620c09fcabfdb903332674cb16cd528d116645575963fa3e2fda18f0389bf6dd9871b19b2d77b7d8b20516aacd11363426c0538d262c8fd763228fdad9cdad3deec9c26274211c355b803d2d4e3e5ddbd16d074c0c3343c15b6b3913318a7d894de74939a53cc0e56cf00d9d109646f5d022141ec2015602791414978a241b0a394a58df1a23d835b96021fad98c6712889f7f7d800d07e8a8e8063e5ccdd821db2291c9c36b2d1942bedd53ed0e116269c48332bba5ac90c7d7468cf0e5966ff5d1f7c4d8347435fea8f23431210b47d4cc119e3702e81edee37210f0db874c4ea2394a544a091f0c81505c54d91ac1bc803427f4802a534468de4058c101e0775958c010d2fc96acf9adeb9b08a1cde2b78f07423142219806621e7d29e4c8b742b54956a8c05108507155760c2393601267809e8d2b3922f6588a22c7122fb497fba1faab4f931a1d1e4510d9efe2d388df5c466d168f9a1e9d83f609346083e32299575aab90a61b8e536ce9327cbe2ee0544148acf49a54cf9e17585d7c36a0721ed04c3789b024757f0f32e12e61046aa769475613da0af95a76d48616c34d4bae0056e399b0a54395f901cb3f38aae7f9cf0b16d6be72ceff596d96f5abe3728df965e6373e29f45daf3c7b9a51f1d2de7a87ea6447fb5f90188665f35cd03bf12f7a99775e5202857b48458ec388ecbe572187f710d80ef475df49b521b27514af45e3271ecfeecef0d0c18cca7bd9c2933ea0d0a7e861f87680a288048573b385c7434cca668be10ab46d1c353ca255619abc61874c5b4b3c0c306a5f2d55a887593efe8b2d0af947fe4b596d3f642a813b1659f511bfe082086ae144e4cf09d43d6bd5275a8d70d49925d84da1c3fd958da558a9a5f1c63e4f188e4b0031a2020fd4fdca79ab032353bdacace51bb66f5116f8af53ac1c1b4e3ed778df43b07936eb474e33de6c903cff820a618978538e2bc9fee5b2ad5298cb309894db8b089c0f654942bade6b5edec773d1535cd965dc1e9c83f2198789ab6bdb01b5c19f31634028a4880db91ce2d91c6b7545936b08ad419b31139cd6c70b5646f2143c2fcdd90931663e9b16a96ef2677beb9b547fba14204d5b2772166455a3077e137d2c776da4a8c4db6e56674a699c1f1ab9a8e583d896a29d75defa4fc4bd60d7af9dfb3b202392005b4a5484cd75b7252486a3d989993d6620d20324c4cc544058be99557bab2c610ce3c5c5df04869ae2e3c3e31ee05d5986466b1b8e3cf30c6d467a9ce85904e25974cdcd532b66f386569318064671f90d0cfc11c98446efae626564c87d7371195fc23999c43aa835ce5fb0c4574cd055524b50e3ec0f2c7392bf422891ffdebb5ac56a0dcd3857bb85b83d2b99d714f2207f444736980c7671d8970670278cc1bd60843b4815a6947bdf514ccf9c6fe2357eaae3ad3faba62ab05d61035655adb43945ddd23cb782092063793ebbc97e63470d9d3da2ec68fd07916b4f1a6c2910f8871215488773738d4af586cff6468b336240d19f96238211dc873c18e2de15bf973d5f32c1e9e66dfc31d2facddefc59bf53efce05e57c5829e1a10cfffcdc38f13df4dc09a40c677f12f8d9e8fc621c9cb6157da30ff5c0edcc41dff615ec1f6fb5905f20709cf368594966638003a2fcc98ad6dc816dc43a831ef4e1dc19d1c0e896fa120674699ea5ccf18cd0c4f24abb7219152c6ede7f1b575ae92a0a387c7ee86d7bf7fbdfeb9bbb59d19202a36ce542af4906d7f7246198a8989af4f5ed570e0c33dfffbfb41dfc6995589ecb45316437384529109332f559d08117ad835cad56e41f3875bf4a9baa5ffda2d3b26cd2d008df5f2d663ca556d700f0f329590271d103b71469ffde3762afc55e39ee1b04cddf918a0aaa152f6c3f58d5b899082ab724225ca0c3efcd823e14c3200b6813bb0dc0884b30f921a9efb034c4310e2971e154c0493f4f20c3a677211afd095ce0a32bb12122d842988f02f43f65aa2ae6b29579049472f0e335019fd271937f1f4a90c416760f8f154baf46d572e7b1ba4500a0699e679f811b0faf780f9243c5b38d70d32777ff40564dbbb9169e5f9e3ba6350666b5d0c8554ab3516502c5b9dcd03f0863644be7e1c84dc25c54e626c8a78c59898bdbb6bf917c6a54d7c24c25513e148f6aaab964011f6df19e719cc250223c9f3aff577af492931026c6aaa99e59522fdba552b170b7130306e1b72fd8762a03c6b496a850d931e643a835274e5ed33a1c1dc9fdfd762d84e0c63e1a00da1208f910dd4d4872194a3963845cebd15e5d23cdf63a893bb9c421a20952c3046d0eace3282f139aecd6eac30b1fb2d2130eed3e1b745c4a13aaa558290057e84ebe079d35e6412e5b00f117bde305c6f7fc7898b5196d5b15233f218e128baea38e2017a876ec4c0bf675e4909c1b11b3e92366d2264ec7dfac71333a6d41b1a232336a0d46f13eb37c68d1e1660e17aed5f61294f8fa5a815e646db0c609d233364d763d96bfd4eaf17d3af6606a031bd80f1eab5922aa15a70375fc172dc9124a51476f5f76249092a1eacac230297af0d07f900ecaa0a613b4b60a9de824b541bc2b1fd0c467cea80b14b2d7a8ed65410021497c5d2df9fed3946cb52d48e17c8b54439f89d66aa62b75b88fac3d591e96edce352534038ce9ac59eab0262b92068d64eb6a5cef475f11d1ba8602a42f2944c1429eeacb7d84a97502dcd8379dd02145c3993b560faedd64c6380c55e3374c8b4160094487723558b05be17951de86198c966701a53064f034ee6b6f29f078fa02fdf2c0b9ef5a9866856837f357064ca4cfcf7d4e490c7b2e75e730429a936537c836478f92325845f3154166c30d638aad3a72930e1fa29b970e74711e4a3668dc2775222102e7f439bd189096cf281b6f300c500df2bca9c7e0b4c744c90a22d7fcb9a27ed478e07e4d954ffcd3686128b5b94f0575f144ceec34752bae5e8ab7ca14c3fecb0891ba3b114fb193f32d2488d04af6002c6ef267079f52d65ca514dbe5527244eecd7193f386660d775619c068ce543a0faa5ec25694ea1ddf46562df1fbb510e8c2b9604727e194ef21bceaff9a304da6cebf265fbfea6b0b96affae65f9c1718283361984a2855e68d86ccf80227352168f11d041d0f5502472e53abb8bacf3c32ed0da1cd8e738cb91759a8a1bd33aeddf00038747c75d3dee8df19355bc464c61e8d22a2417be9c77c1fc9c096985f34167d5a92cf60f8b4d23d97f0cf37641a4ac05aaa19b0d6ef9ba1bd211a0dd9a4e66f36b24499d629046a10aad7ebbf0af07ae1d2f55f0bcdf127c43fbf761ddd2ec61022fd5d4c94821cd6ba5b5389ddde284575b53030696ac6e71caa8061680eddb8a339b747b4453d96a79f54e111fd528590c36687ef578e81b91f5fff4c4e3c84a86c518e80dccb35e0f2634f02248ef0b954b26bdaa1f508f4ad5a42d9ea0081884138f5b4688be4d12cb20defa2b395439ddf39b0176bbe328aef2a454788f537a3c5362be835211b24062e32871fb35f916b1faf1e3ab30273e6e4bf7bc5d2329ea62c30aba9cd13bf5d3d7165a36aa2b3223952b2c8e0e874e1a3bbbfe249a4f34fa81f2b20f07ad844bfdd1bfcb71f00b4018a5462f42cf368d0784eb9a5dd53e59afccfccb4ff13b3e37102afa0e7af1302ed8bd924b11c47df0d00d1b4229d505388794bad27b7ad24fcd303b081d1dc72f0afd049096f8a927bcd863286c8e7876d52c20eab9d8e2d8414ee727f5bc977e32c1cbcada81f2273255aee256e8fa750b8ce990499c5307196eebd106a3030ac575161376824f32bb6a3784881e9d6411db26d9511849470b359c713e7ecb0017dbb5576f428abbb3b7460aa50f5edb6d4c643f516419a58348c6830346b277c7e569689e107f51575f6c2451cf425f615009a0c4737b55e808dbbf5d75b24fbf3cad03c97f4bae57b595cc24a67d2a637968f33d2d9662d2b3e057d0aa28f5bd11bbb49f4ba61a8efb30bf26003760ed60d621b2d81247b579eb1704d84158ee54da3a9747964a3578658262ec7a62bd11bdcd3b3ab37448c23b0e3aead633def4ccb9efe23a4ddc75233b56a79996c7bfe4fe86defe4a934a4ae9493d5b21709b7f89fbd07b68ad943f8baf876e2d9a3e1dcb2c99be5b4c73f84f276cd0d39d38ca4d69740655a0fb03a1159d397f09e7ad4eaa27299f288aa408fbdea253fb12e3af99717175431aef3352cdafa3339df56cce0288bcfeb379d1ab4364d2e4333f418b96f944bf1cfddfc323504cf5ae42d28fa6491472eae83b859e250e17793bb382ba0ab2c2fa9a18fff498cc75044fc6d6c756691e79755f3f9bba9e39d2b3765a284809942e41e9fb10bcde7834d017d58323658b2c221cf8124c74f3503186f737d0cb36d88822ce0d26c633ccae74ac8433d8b939b67a9b79805e357b6ca2b6701107fef0bfbcc397f975c9c7e76c16ba5b226457b3a5e34f3634fdb35cd72a14332729ca41e9f0bdd2711fa1679b1f49e71daa274346da7c4ae9b72d141d852b4b696755ae5f1508ceb11aee3fb7049ce7bd52af3284aa66dc0d49cdc21b6ab641e9d1b0f7d652f687b8d77c50e7705b6d76126d9a155574aeda243211ba7aceecad5d2eb7cc5dc3543f39dd34a0261812c37f57b04ff33aff1022f5d48453ab9807dec49865473c17cf6e25f593bebc5de2b18a41999a8d9bdfcfeb40d2ad757bea165f77ffd21ba3760ff195d8ca40a3bc1489e7734ff4d023ae00fe49c34b4a347e68b1162ef4bf5e1233cfd130c2a0067b42137bfb69c71e1400abd519b14facb14c5388670791902fcc22001965e686a747b025d3aa573e5e22840f5b9c56432c4593c5cf9255d2537a0f2e9f0dfc4660bf7d32aa439084a6a0478dea2ad84806e3010b663d828a0a1c804703246fd328edf9e1835121936c8253209d3160d83e1c1e45cfb39003a5c6b1aa88358e4c193fd454750af76ea540e43f06f061ac2797d5bbf888e0bd4594204e3e00ed8ef3d5d8a2b1e8fb0ed5396a8e707c578eda42e94fcc74fbda4c17623a1af19791bb5e475e8e5d71546f90c79473bfa4b1492b85afd3171fb71b5c64d0da991e2e495f46548b65ae08edcc9c40fb06376ff21baf5928b150ae9c2627ec46edb249b236efe71614a727e79ae616b05234f0b35c5941ca26520d4f438d24e1acaa81917308cff25035082f4a009026e863ad668eef4e40b38fae636b6b9438ccd1ddbaa1e7b5f0e5c922c7e50d3860699180befc08a95e036e422d7f6dbd06cff1554ca951147d0d3dda857916182f7dc60c1dadbc80e360763fb9d8e623bc24c2af3b951552dd7d1b3d9dae300b0c499f21512005d957779dcb95c4086513d162d87cb4ffb34ba837cc4273852c173b3c5af9f35f194e385669aed0a400aebb3a1029a8255a3312ff07edcd10e520dceb91d354eb678d0094e26866c73c28c570090fe013c2e037a1ca26e5a304eca4a07b9babe82479ca4a48a16b7ad17771fbef4469f27869255a11a8b1f52ae5a2587cbddb9b4ea36db67b8e312e9a80003723d7d82389a31225414311927c181cb3210d81a529b9c05f37a702c4d2cd964efbda54c29a519076606a1060b24612b7ade4b841f2f828f3ab749ffc690af63e3eb7ca4167cf2e5cd35d71ccbf596ecbc8619e34ad4475c01e9751c890f0326a35163280751d11112921990be8250e8b87142f0435482e296dcb2be76451e24e775ce3dfb9ac5b1b7403c75fe279bd765ab03295b1ea1555952525a8202c452958b4eea25b42f1cf7b46979e338f9bab14bc4984fbaf769b1dbc1c39ef9dd63a372e539b46f05a43eeaa3466a243d4323d5c42d74e43871e4b452adf5fd72acd5afe3e0dafd4ff75ff82d12ddf01c3c35164b62a12e859e7474106b45f90b247f81246c81a450f38a52ae28bf5f3bfaa893d5d54dfe90a01c43fb6049642598284326542307918ea21dacc44b0c05085e5a224d74e4244ef2e125e0074c33d3793ce38b3ff30482ffa20873174ca87ce2e4e888450b472370f3b685bc31bc0332e33ee568209e22c674d7510a823f8481091205dbe5b0346432d99355c7c9bc8e73b1c40411013051f54747475134a104c784944c0463e684eabf5b48b47a0d3990d7b05a6d99b52cb41fe792f83060321a3586721015cd25da649a5ffc9760e0e5a71429e768d6c87cee1f8c48ae0eb040d21bda19db83fbbdc40592bf7a2d90fceec5bd7084b08d214708c0c4ba8d3d68dd42114250279d75b2a5124182804a825860691b39fef36577cffe62f9b1dcddddddddddddddfcbb1c749de113cebb6324183ea72d3a8d16fd7bb8fd37eea18e394d4707ad131a23d5bfa8633ff3df7154dd9da4a4a8ee4e67aaaabbbbd7aafb97eaeff2d2759dce40d591c6d0d0f8d543d70ff7becd3af3752c93b1108d1f655516245dd2255dd2258568c858484ad9a432d928636b3546194d461932a682d4f1c785c2b73f60130d923f7f7f260cd79441a39064f9cd74a8468bfd757704b1539a2c95594243dce3cb2474b14c11a9230c46e5c8979255d7692aa94a349f64f9c2c173aaf72c078dc3e7cc611d1cfd626334eb4060ceff26eb035d375ed9023746ff0c9925773f1e1c54ded45947d0e74575dc50fe91d543fc772c0976a1fea38b4370d5e9af6f688158fd711dabc51e656d58e79ff851e8285dfdbb9df7bdfcefebdd7e575dc8f9124bea266fb87f08ae3a431ff57396b39ce5acf01d88bfdbe2e44e63e24f67d04a1083e58915412cf9d3293e14fca99b595d71772cdf06604fd10600f4f9013f8a455d55a8aceb64e6086cc891873eb009fafc806f468812e00fe8b3d5eda0ad8eeb54464ee5ca93e6b5d9c013a920524e88c92283119353d415458e6ac061ca0bcbd5c5ae604e462bc0cd2787d33851fbfba902d25089fdb018cbe5e3940689cad5754a0355c79fad0cac7620f4fb531771a8ff833e301b34b010660e0b3f08399aad193156e698f064881444997997ba410b3ff030e589255db2cc7e587042039326dea41932e352bbb99928cf0bd4d1750ed466c01061eade68c6fdbce8e27bcf853f5ae03111d133811fb31f403e31b3ee816c59689871ef853f663f807c34ccba07c2212933e3de68463b015ddd04c430f31fabe509334c6640b69a0b33a14e00ffe72cef3d2e14ea5e3d3ab8efbe0b7f7061cf04b8ef9e0b7fec0aaaa2303303b219a962c66939b2c6cd0cc846466ac685449d007ea3996f9269709f8ee48db5847ae8ba414da5fd9d85e3c21f4066730e9cdd19a351dd8d015555b9f9014fbadf5eeb405babdef85c44e80575943a0ff8bc758a7a5eeceeeefe6fb2ef94ad9e1b75861df014befd919d8b0865514759f77b7e263a90ebc8a1ebdff9537fd07ff9857ac63aacde409df9b250165d88a03c4d5da0a2108172619504eac8aa465b54cc4041341f18aa03b53a42778430a207158871a28318176655d7d18e525a8030727a08d0629880c24cb906105513c378c940005d960810a607f0874b9c01849901830010f124803027b842a7a89f0ecc14ae970c184c264455003a3067c037224e08268cce0650492f3043b000f014f5607aa01a6ca16d00064acb47cc1100c024f1e931a2a601acf606cc80d575744b924f575bd37a2103069385410a93d4436b502c402eb40c6a585a60b025ce8b9a0f2b17432c8135250c2ef052c3a076e4854b0b928b2f7058b420e202d8940e0b56d7d1229e8aa8b968f7c58747060c261ba3660c550b4af94b0a78a811472cba2f3b743b60683c5f9eb05a5e8ee8171f1d30483b5eda00800575d4f272448bef0b928e172ead15d41454158b7a69a2de10529f971934e8bed4565e4e7071514a5e97295c5b975ad7258917b3f6c47d7711e2857c9262e3897e77a1d2c261322d515aa41a68ebd8d12e2a6c10268acb13027082c2a50c8b1a92053409a12dea3a4da1fa4962ca98142806759da6d0ca5017759da6d810664a0b73a694b042010dd9acaca01974f9b0d00c763882c309564868abae130e2a7c3ae0302405cac2cd107a4119255c7ca0b4691587ead4759292830e49bae79ca194edfeadbceeee8e6bfeeeded9dddddcddddd4dda5f7d6ddddfd5b77374b47368f13ec2cb8a5b331f69fc7bde9eece2eabe53ebb8dd1c5b68e73a0193a352e1756e8e8f2995a645861baf881ee8f5d93a92124930143f485f1fa8942c71f18df2faefc1655be84d1186a9177a54b977277777777252c8a1fc9e10f7885f6330f6dcf8daef37b6c789d618f8dc1cfb5eb8d89a67ac8a345fe913c52566584f0b1a3e04ed9eeee6ebbbbe1b86dbbbbcd5d16b8724d2deebe3fab4e56edb695734e9f53ee9473a504e51257ea2ce2a95ce92dcfbe585ef9eab8c544f747b91b830ae99a98401a15ab7c5e27dfc2a858b9762d2db4b98cc0cc35e61a736ddfbf9bc422ffb8d7ce8872c851267d47118f1e3e48f871c44490b80875cbf76e0c419d1d088a608b2d5b4d12ceb73fae4eb2407d5aecd6121fc9dd99d15191ad9b67d74133acaaf2b12ce91dedd162cf101869a4b2db2aa5cdc8be0d5e40ab2e336d898b8e152cccb433bceacfb49d214132d51f0c113a1df0d3426ee21733b5e8aff344591bb4edd8f7ef3688fbe5d16343a17bd03f6e04fe8d2988a9637c05e9e8e8284816a7eaac993fd7a03a468f8e8ea666be4e49304975d04e92eacb551ddb5996da85e3f3e811428bfedc2a42a7ac49e1faef875ae49592254b962cbb99795f88b9650f4996cbce2c63e775eacc53481bcccccf5b518bec55553e36862ff7e2baf51134eccfc7cee0dedf7f048eb1090ce4abd5c882451db7aac51134001ceb9de5a3db5b1c417f3ad6b82c968f0f033b43e7468ff7b27e80561138394747b5fb550883c7ce58e9dc1081e7d4ee7963ac56a1a8338732127f46f2e7a48d39a08a17142861c3c64b988d69c0c41333d4c8b861618a99ffb7a383bc0f8a3ccf7b29857ae173618ed64194a345676ddbf7516dd527df834ee816baa8fbebd573a3913ca11c763a2278d0aa5cc8483646091bc31fbc81feb4d84a814ea9439353723f67f773ca9fb39bde26b9d5779482202fd956de36a7ce905790ceb3049f5312fa0d2581cb538b4e6b5a6a71f3f797ac260a1d590d534d6da101a9f68d16b5bbc79fda213365e15a8b2e3df0ff48d818fe2df64d067646bf3f093ba3b51ba38552a03274b57ca892546cadb26fab4a09190a3779a22337e9a4b0368867e7b90625a8550b9ae1d00e2f216ae1f1bc78498bfdf4c5e2d50a3909eca76028d60ddc3855ac432d76112a43578bddea81326d9984949454d4d6a436112693c1c49f32f30541640d15496c52ce299b61cf9e3d398e86d09c9c4c684a187fff4b25622756b1ae9452e477b70267092f6830a8b219f10f3e1b2a2d6532211a32061964904196d110920951574b3651ea48eb08824fd0265e174f6955e647fecf4fe59fba8414382b14566558d4759adaf205e1eec426c917040f39d102f9e43a6ff5fdcec95bf80b345b056db85431757759a783663945ac386da1c28423841859694286336688802384cd8c7f999b9b084cf40013f980edf8e58ba8c50e75b4d8ccfb45eeeddd8723f745ddfe443a8a5c3a4754d4de3d94a3e64ee4ad03173975e7e767592ed850a190468bb25fb222e828abb20ac968b07bd883a30173e6cca9fe451f740cf4ef6767b4aa14c1566063fb453b83abf2f9859d315f2a5919a4ca4553a55c37557e062ea2e8b8513297b988d01775fca9f27b8d46f5fbcf753af838ecf1602bbf51edd7f8af7147b37e75daa8ba907f2f9f166508fa7fd04072d554297329c1222f74d11613da1bc39f23e3e29f2fe572b8cbccbccccc2c7d2595bea633e16b06d15056d77a81ca0b6cfd5cbf6d21d1ede57b0653823229a54b977484174a73f67cd9dccb9e2db4d1950bb74eb94939a594cef4b94ca8c672d9f1418bfe3bb5f1920e921be7a30709b127c2497805a5dd325d0ef3e59669bd76b87fc0b3c5bfc746a3f258a3f6fbe61b3febd57d110f9fcadd8a94040762ee8b5a47077158237c12837db04d0d8cd60bf4a7eb6d8a30751926a3cdf6a9ab039655efc21156bd7377e9d35dbabb07650ef9d66373467d573e1066192e0fb676fece19742dcaad1d518bfc4523c7494e72920b252739c9cd579194443a3a687b6ee32691ec246f52d6d8e4b66ddb26b720d4b5bc6d1bf79a5de7b6751dddb68d725bb771dbb6cd3986a92e4d3ed3fcdd5dba4b77ef74681fa2e77f6fe108db6f5d797620c31e2eb4d15504ae4e544f75a44ba49b660f8a181733737737b7eca86ba7ae1395155f53c24a55aecb23255f0894c97fa96d767737771d950e0ff535a206f2d7d16251377fd18f521215fdca95fb0be45f37716c50e5137590fca904942aa7ec883a469d731eca21b726dfe53383d20914ea48b91796fc2c1207cd22c9089e2e1bf7c62d8a01a2e7505af49e436fd2a2f7e34ff5be3585f6aff75e4769f5d6a5746c67deefe84aa3375509dad22849a2cd4641a50c0acc2200a93ca7b62bb5e879938de1bd50bb92c7d6eb28f84ad5fb0ebc868de1fde702cbf742ed357c1d0ece835fa9de2a1ca50b513dcf88c52ea03a243c54d47b26c2493a0884d52ec771dc6ab55aed0b046ec5ad388e91701efbb7a650fea2169dd3f181dcdddddd2d7a81209f2bf7b2ca711c47b7ebbaddedbaaedbe15d37c44345e74b6e478bde412078bfbd7f5d4729c78520e83c08dc6ffd38fcda093908db73edd1a2ef68d17f8644395af46fa9808e9de89dbb5387edea64914bb539d818fddfc43136960e7b6ef09cbacf73ea86a308fcdea4c57625afd262fb528bbdfdc7ef17a0a1dc7ffef2bcd5f71a499054fd594af91e6c95e10b26f48dea6bfcba36964d657dde0bf9ca0b3b4e8bfd3a5ba32deda9b3b4387230721247e260638ca11c545a03b52751fbc57e72f7ced24f2db68b4cd3e4d246859d255bb586d37c4c1f735c88265483c67577731cd7dc4abbe974c034a6dddd52be4faef23bdcf5904346425a46f2980f127c24cd151869ce9093905a942ffbaea3d4077be1e4388ef321e59a25aa943a5a94dfaa92874a7eebec8889b05454298fbe6c1e3c59ad42f6b131e4bb88501de93146624662a41e1d24398e070f0b749fbc54a99ba676618f1677b47802ddc20fc2960aa8fc71a1aafc6f6f6f6fa6b96852b32205f274ff10030158dd6d254eed00d4e640212b537c84402d2e5843fc10044f0da1d0ca0958fd5d832faa61a2c6c887c6cc460527cd0c51cc8086062f0a48212a8a0d51a0c0e162c68b54946d7371c4cb1832539e9043264c9625e63829798108395ee60619e60d28d8b8ee16b4f4103798c01282848fe04ab91a21b55ff6d3326a88c0644e6a8ad4fe1a445ca4c017d348e1018184bb23c13cc47566ce686c7ffa8223e848eba4f3e7d4f916e7bbc0743304dc8b6730a63a4202504452e0049c249010c3441b15dc60449423578898ff79ac678dd44aade4402e7a98dfb124521064747a60eae169cc1a2250789420cb156aba506913049b1a6ca0428b1226372431fbd2822e5f4c38738315435a8a078f37756455d59155c55565e4aec852764d25ca28698714541842c39a2e3504bc900426aa88216d96901a1a8ac34896402848a4c680423ed000ddff8830b8ffc701a4f6cf6775e542d6a42d4e50c706abce1f5d2c7a02235aecb0e40527529003959533496c929a4092e28d093fdf8e1d5b05824e2343c7aecef7f2edce981e0f1b3153e05b05d41d0f5081ea8bba3c754190d2ae9bdd7c7161098a98f3260a184cf0146588a5a814d2d46468e34455916f7690ac4d1bf3bb4d0a081495f367a4cb6af5407130ffea7dfc5b7d61d1eaa5835584acdf7f2bae42bd7a6d857510c728e80e8379d7c12aacba4ff58de3b8effbdea8ae5edef76aefd5fdeaf0eab5bdf732aadcb95a74190de4ef7486ac6e0989ab54896aaac24d5a645a25715b1745717b49a516594a1725468951bc81338a36cbf0f63be78eb03fe7e2f0edcf834a50fffd2773fe0cdb08f5b05585eeb39c9fd1a52a67d96d1ad4722fa9497dc4521ee5505eab1ee5b57628b93af4b97ab416f99fc29e1b2cdeab5c37ecb931725da3babdbc3a82574998b5a35ae4ef5a8bfc8d44a77ecceaf951d6273b219070d64c9d007eafa25512ba3ed9f97da3da33cefa842704f29a75934e804e27f1d49db08f1c88c5a2496f7737cfcef3acc76b338fe267299e62e14a2d7a9306e26f85a373a9fc3ae128abec59de9b2abfe7552a3fe7525849aaca81e238107f2b09f590d5ca41ca6bb2b3fd324fa951433519c0a9e1a6f6993b6ea717811d226a0f4098bf7519e9c549bcc4eb66b376ddddcd497f8ad2d494c4510c55e31af3e41695f9a772c848bbe4b19e0b62d4f5fd3b3c266bf1dbcfc32dd6ea2f7871edc5514d3d7c84809b6a7fc8495a16b208476ec2e14ec82bb0c2b1eb429983ad14e8fa409987b9212f37612d0390fcacfb95bf417319d0fd2e128f71cf3fe448cfbc7d472908fe1bf1c4d84b8d48478c35e3dfc1cf833f849dca4fc253e50fc1dc9057902f463a626666661777c6ccb26d8897b6291856d0ad8e30bed610ba349ad39c26d424a5778752caf009929f6d1df6c8f0fb7bc21e556ecccfa545760f257885fab3f7a6a91d1a6dd4cee8e9f08319ee60321ba481a5a22a53f95b44e84fddf7fee5e565eee6ad622927da3631538b55aad47e8e2e538c855aa9c8633cdbf96ffb297f77c2a256287a5fe43167373a3a929a5a811ee3f78dda1f591e6d2b22762015152b3353e6a546b87e2f9561b396cf5dd6a25c5618ce052abccbbcbbcccc737dc257bf58a668aa72fee6727e8e0eead80652620c753e8c8ef5cce6cb8022a9ce97b999cdaa12ea9c5020a9f375744fc8a973cedf95ada483fd0e12cabfbc51bee9eedf2edb856ffe06bbbbdb42dcdddd7b888be78fd4d562a3ae20a89452ee0c254777f7bbbbbbfb880ddd415c9058bedd19f5050f43e93cc6decfecdd466458164fe4ef4cca999103e1e61cbedd191388ec359acc49a85ad836658eb85a54a161732b93248909a86218c3a6cb4c3e18031035b490c60a87b36c86bc9942880b5cc678417a8a1345862d41b0600bd5538bb6a157b3935554579e8c4c99520186d9500d57c890046569cb4cbea1b2b223a48fe880a4719c59c11c2e4f6bc8c0d929a0a802cd162a44a829c3823a5f6431545058466a7733f5f7074b4c2107aa8c949a2366462e0401e6a80b0c474a4f3c8a0844a5f0c314706c904262046ea8a851530407342d70e3440954490b9045ba89eba13e2e0a46f95019321a52d0a5f140411765d5c8213444c1176b2fb05c454439010d6bb828b16486593f1c27546a435401d1a42a0e152c2a8ab088c579628bf3667669a860b126aa688209332c28fa095827a510289434e150841a1bb080a0c20a5280849c336ee2cce409535b58cc11fcf9f9117f367f72e588889737429c948161269db0a0056c9428e160a58a996c5325c763d5d4963c3a686b551251237a827c7006acc54c5571c1070d0c9961aa0417b684b1b246d0f065c99b2b2c68420955132429e554126b0a0513b62639b79552ca87b599a9203a5386990e54609ab8c2892b276c949b20b60cb1c29427244e50d1f1907b808725a416a89850a1081438d122a586aa159456e04d4451274f1b2240be622389a928949c34f5e084260e13274b20b1c2045030b184142508304a610a29234c6a70d66c31f2614e1a275156389142155349acd057607c854d98249307174ea696c420e58a136080828dd31628b6948088276cd87461d568edea0ddb831b354a545043133938319b5a9a509ac282262bb6f4b0668927235740056c1366b65801849132416c78009418822899e343961a9608e284304a0491c40689253454313b818b10214d39ec4053c3c64a096cb483104c45aa98e10a37531c00a26a0b0a575491030c69e6d73832a5ec28f80bdbd8cefc68e6de4e64353b29a57c51016ca27855ae66d8ad56ab70f440d7168e544a97cf3432271ba512363056270b4cb0022a5f966c90a36436e54c55a1d2448e90304aaca142852d052d583bdc9c53f290e9ee8600115b7618820a0b564481660525b60994a0c4440814344d8999f54f8bae058d4ea0864a94384c807182c3aca1c2342d3992428a224c66ff2363b97c04505b759da6a4608165e53aa564c9a7f241f92f7d98408996274a9832c686994c33c502a41e6e508105263379a6ca3552555639a74f1695d27d06e66ec7ced83aeae8f92002ea7c713e6cbe6c4e24b3f939883a483aada9c975a4aa365d92bbbb93e0a9ce77ff9da9109ac9ddddbd67aed0857309136f70e473fd76dcbb90c3d10b5932ecb8e31688d70339c31e1b3160f085e59bdcb6edb7f9da46e2db8d4d29b775be20a1a36411848e12ec2437e594d3753af0edb97ad54351521220557fe6df69c3af99c4dd5dcccf8bc1172a7dfa9cfe3d13493891e6c85556d549c44368257e49a56343ca6991a5d87171b40b5bb26f5c073137b96f1b23cc4a822bf1ed0f2b68757070db26db9d3ecbd5411eb63fabfb42d7e8df759b6bced9f916862056f91740015da38bcae93c32d7cff5374660550f43102bd822bb3bef6c49afee4fffe0bf3fa32bb19ebb2766a64e893b293a0556bd78c44fe4b1d6834f4a4e639d67666666667eed6c87c7baeb2805c17f5184755dd7512ad475e0f62bd90a63010284d30e88d3d7524732190c268aff7dd4471c1036ad57041668e31ef4429fdbef133f5a6eb7dfc9520e82cb07a8db2f04eacbe3e6723bb70d04acdd70ab52cf0f7de4b10c7ef9a92ed7ea72545d96fa76e3d4d56077bfc8632f7e5c29f0c7ad72b1bb44b00b7a00f0fbe1d881e148310847d045387e2705e3842e507229b5505acab456e7c160b5df3dc81c00bc9899999901f0da99062fb6b2fa652c4080f0de8a93f7429d40d8f8bc22b04033889b4fb80553670e07a81302f5e52dd05c1e0ed46e63cc0982eabb40329460b3b478ff753ba3bb5f7a2f89b8cb238fd9f3321ed5a2e7b47da164637eb440de473941f5f885eabd081b81e51296832c15d5abf1d4716b2f2ad1c690336b2d4aa5ead1aaf75da4e3bbe717518bdebbb05244a4a383fabd6e173fd009d5a2f7abd78c6ad18f9078acc77f6773c92592943af23a8fc8a1788c7b6f1361a36c74a9ea8d3ec5e3bdbf66558bdecfd78ce340de4b9ac7e69254f2d844f23cf9543da6ea79b356bd1f6755f57ed6bc9f51de4f29efe794f7441e6bda8ac3917e8b707c5184f18423acce258f2ee92ced2c556f3d9f48df44aadebb00823acd6372d6ad425a65e9bc067594df0567686bc7d3791b474b1eadc7870379ef09b5e7b572a023ac7adec376f5bee37dcb7b182d7adefb4f079ecba8040ed8243564666a0400000033150000200c08864362c16038a2a7cad80314000e6c963a725c349889c32c866110638c310410030c00041862805166a6c80a00cc94878d8b2a782c44aefa2cacde028cdb24fc5d13c1486b78db9847f66f3887613bf478071ca4d25426add90f57afdf70ae7df476d519168fb06200e38ae82dc0857a72b923008d391bea3cc978ad0e14260ae0b2310f77924e934a4985bf11f87a8b08fc96f27e8c82ad0ca0c70c9009012ec9f7f748dea436548f3aca266292eaaf0e6faa2e094e99a124d20dc8451087ff5b5e27a0b218dcaa9a08126e0a22e108e0c0fb0a2df9d29308a2518baf14ab07938dfafa93115b73d9b24f7dfb5942124c67385c2e5b86fda901f3e5187caa8466f1899b97ac60ad08014003d9267703889306401a30c1e005d7e2f747d840a7902298755bacff7988ce80d8a201d995ea77ab543a68ecce28c4d6f2cb0ffd6a484195c3fff2e812c952d5fcff83fa82aa29bc9048740ffb851cbd92bc47c95c42e0a366a98a3ece1fdc873b3c55f4bca9b5ec87040d096ea5556f0676635a7c84c0cc532e5e94d8feb2390345460e9609343bb4fc8ddfd613b5cca9dd8998787cc08c72c45d3ff65139347c7e3ad90d1dd6e0d86a0ca441075b17e90cd735101940b2812af0c2ac070a2f08b94c764a2060b30c9a4fc522feeb036c0b882105e40035c77f78b46a817d7b85e04d5956b4ad3f0eac14cc14c40944138aa83cae18b0b89f34792a8efe90a6b1064f95be1843f29391beb65bb82cf7ed3fbd033dd1fecd4d7e0adb51a279b0ba5d77bba9e5d4f0c8925ca14903346a48639b337e0256b9fffc72839062594b5035f0411991a0b78067051777c6896fb2c3181ebe0659f84660c7c1f905276a5b24dec9847c76218a30b1b2c912fa40fac27cd9ff6dd706b7ebfdfdab36785b085e9ad82fda6e2f1129a132880ef2b3a10b3ad652f55ea61837e0a468ff75179ab7314691efb290392fd7fa91a0780909171addf121d1a1db79159885b8edc02aa3b81aab758d5c90a77fef44402f68ff84881f5ad7c5aa32fc5ed2ea99a2596fa3a1e1ab83b3a73021c8bf43022412d97058e31fd42307b9c9bbba24eeec44236e0647a51fc4375b22b2282b85aa0c453c6c7fcd41369eb949f5ad507b231010a32c5710d023dab1324c03ada5c7760b8d28ca2bf0482c0f9e34417c5d50799876156c4a56c51c296e924495871ad38f8f69693a8a5c9504a869ea1440888b0e384d0930a1a8cedf7ca100d1e2a2d292a5ede138f5211c1770b527ebd06fa6366f7f89f2c47bab9fcfa81dfd76ab334eee823dd0856ba13a45004dba6ed6147b83c9228af6c929f7e39c8f67019cdbfe59a3949fcc041ad6dd21a3bc802d3614e140371e56eba7f40aea9423af44e0d26e419dfedf1e0145b08f4e039d783adc85b54efb9982ea5f45153a4655411d168d65cf026b2f530e93ec39eaa36ecd0cd399381554e1930f82a2489322c03164a3c22f76788e0434d89f786ec04506012d5da9f19c3d2bf77aacf741e02fc0083c825d0c19c375318ad55c1e3059a12bffe57dbf9e243417e7896fa16c390da6131726dfb5def0ff41d177bed1431cf546866d31260d61da90ecb2a3f574af91a45daf5b83a65bb44252da886058730d7b3c9238499cd73f5d095bef15c5eaef34ad6e64ee7abe1e0cc9af45fb88ae0e3e113e132f06a774a7e1f87c757ef32c18a5295214c4c2644f5f8d781b3620c9d71d7ae0008658fea1c3f47bae2d240ae331033a3723d14dbe2434c01c02553c6f7d725bd482178a1f2e308bedc6f85a2098cf40f83a70b9c2bcc36970a99f0c1f7320f4751ac2b1cac5453fe5c7b3c11a285c4ad1293bdcb0d1c00ad2883a2e6d67de2df693cf3978569be8125ba076b1af2654036d43ed295b3c1e1180ad8195d057efc1c6566073ddd18d9dd2a5475a310b13ec95fc2470e1af63ce7093dca8f2da764ca958fa6945476faf5e1d20608ba40e304dbdd3f1832ce51ae4f4e9283518af31cb62bc070d53519dce050a6da4ceeac0ff402f0bf09d23403ff8b6c486089de2ad7a65790f7071772b6d13aa2df4e436ffe2e888aba9e3888071b4969b772f62aa00161a4977ff761b5e400503d0a7c524f874fe55a9b06c3eb7bca7c36aa056280dbd9ff85406b9a5baf2ed12a13c4fe375ebf5701f2340c4028df98df462bacf607e624759e9a12a142bbf96b85e1aef012495e1590f52f4a03a4752021eacbc285616e13e60cadc3a091f3aff948b5e5fde7f2da14fec17a9fa85a4be1d4bf2256eb0a95daa4591d51df903f3a576b9ded51f569181667ee420096e81a6c3a697d115c26a6a54029cdf88e45d99b37206a2920cc72f27eb10c1753a550420aa208e532ab7847033e76a3093f6ef8676fb51f99d1c015a961f56c89868c06788468dd0e6d3d7028af049222e9a12166d4ad665666b822a5e33cb95b34463bc21e495b10fae77bdfbd4e057361017acc8cbf68dde2f7aaa41a7f87a3d0fe58a761041ce2ee5fddad4fb353d9461de943e987e01d5a8b1c220e7862d44f52340408d81d06a360f58c7aa44bd84d7511aceada8ee2c45cec284a38c5bfd11f07ce168209ce23a4785a6d9ffc411c2ffa52985f35f50b51b6b9c5461c2445d036674029c175baf28d41835ce23a1f18652581c651c006ec2f8c79d39de39ae8982ed3e01193e1a0b85aa02971c1a1d0d380c7f086313dd3daacd038a5ead33fc647be5374ac95e9ecbe1f6814edc792f8993014ce286f33d4648e9b3c97fb2c219da769c61766892573236f44553894b7a7eedd82be3bb6ae77e50b4d1478190d0623b13519f27ea2e806e7c60eba8ead976618a338da977bdba7fde910b3ad1e65f3d72e54cd93670dd20b89a16505d3c20390c145bfb378be1910909e5885ff7b22e9e99294377ab48854236878d53e0a3b4bb60573cff0e35130e2a2454d8a38885ac1cd31854b5a415bbfbe97a8fc23832385a0d670ecbd30115ba0865226b84346d3cc6cd29817e40dc07ed73a8e0885bcd055c1a7ecc1f6515ac3fa2e09d4c9ce7d2651fb7e436cec2c0a08bf254376df0a8116c9f434468bb409c595cd4f83d73a4d8ae3c67f85e03dd6e483b0e28b6d5a438e521247fc01fd21fea8ec0b950ed4c0e2a18a204a7e93350ffdab14aa94d56a5a58faa44b3f640ede56ee79422ddc799f3f774617d7c41767411550725958d947ddd3dcd9003d62f09c6b2c3894a232f3b67ecd24e08fce541fc968768dc649ad2eb6278c6eef266b1e9d1b06e92328447830431d4069da607b0298a5abfa92c80f6d82d903c8f459342fc2adebb725db1b68fb1097efcfaade4ca99e6df63819e1c85dcead4c4cbde3cbfc27b40b199af284f5b046e8a0b09d1ca6fe935085cd1e4df23049934aa50e5d230c67e08b4faf297b860919d5ffe05478831ae40352c7887dd615634bcb175eadb9dc58a278a05ab14bf69edc600c03c10be8541e684396d2d24ec0e14fda7ac61f8921d0ea560e52458a74706d55a1b8090e11ac09123be7ce1537ef580089b5b8d0aa86ee9f9c5cdd0019cf6c21a3625785b385fb70d9a604e29004e16350ae02498810dfada008fc768b20161c8dc0d9f48448e23cbf6d3974e6f1f3ad3dc4d1f98bf511705974edc3f16e55104b46b016c3905c0176e5871a5f98daf5164b2efdef6291b43744dca1d1090785bbea536a647f40b55bc17c1301bddb63931c532dab24b89fa7d070dfee84a71a26fb77deffa8ed7c8c56bdd29a8a225646ed4c3502b71d4566bd16d7a5ffd6d402e1611adf1b7fd0a65b158fd15b66862564f6ecfc24e246acc3c908a314a21c1b3223dc72384f0315f137711a6ce97de63a659e2035b2178fa31d5093d7259c4893c79c714c9eca3aa81f151cf7d3b2b3efa1a63ef342e3406bacf4c1a48a60c6d2af0ae26337763d62459e9a6c9e55d3a54c40ec90c9fb25cfd74ac121de0329045132714cb5357ad2f4c86b4eec59ece318606944085864585ebf6e73c59031dfa6833b127894c1b1825e3864862da24e5db9e29ac0012adbc1e7876ba366f1f21e54a00b98c881b8a8209213c10452b6871bfecf50226c7b64991038cd7c91f09f2708eac3f6c3c540d02427c6c63c744ca4429675d56e907c08e2714fbd00942ca36e236e60ec16650db51796199ae43d37946939bd5024f533f334bbff9f85a50ba0be19c155d736cf5d22d010d733a124d666071a2fb9454acbbf63846fb7e889f1ff90876e22ecc5918ffe966fc90442270c5d5ea1d42aa291ce6f6ca55679cfa327d6698f59e2eb8d4c09b7ae122de8451ac703b52550de2347acc5fcc1b9b744769bd710916da276c1161994b35e4b03d417a1ae6909507e011a02b4b5b0861a3ab923cbe43f29e3a0a507c514f7bfe0be2bde3e2c1f4f6a7470a96f70274ee5541c06e63df17ce2736085ab4e983baa7b8354bac9fc8f504865b8107924343afbe409984187af3ba75610d27ec0a2a925d468c2ee6e0016984d82e98f1889518b3b55cbdd3b52c2595d09aee6e80b6f885308ba8929905c060fb91a82e1eca5111fc6b8056f08e8c72f8d4fdbaada08b56d9a431b14507265771e62d80145fb04acd4f050d54a36b2d4ee6fcf27fae645a268f0509777aa1fc8b629f2014cd4a4f2391f35a26f4879e58f82761692a767dc8eea5498ab503df5ab6d8099d3d4635a4155aa3cf27d18c34927abf73711f7d44564dafb532c86b3d7ace11eb658bd54f2604c8b5541b996cdc66cf88a07cffcccf0c5fe445b67ccbcf1b1dfc4452fd1594145cb74f5f53ceac19703bd077c103224e578891e23ddc6361f46c39f88ff2b2ecec08ff47c0be74ee1fd9bdcf7ac199f84b2aa1704f966eac9444cdf5f715cef1d2ba5cfe34256536053afae238fbc4af23d08bf0a646967cddcd1e0ef7b3ceace435964390727dc04225a95bd0c80ef0609078a946b2ea4a8ed46758bdbab8248315c44b6ad55af545d29e24e9ff034856e93688b8fa70bed3ee417678c19f692fe9cdda831e88e44e31f01fbc7ee834d5f97067ca6fae44c106e0095c71964494b462a7b02cf542a46295e07f89f6b04bf89b2414ddc379e3faae0439f1fd624e4317becbb39a9c8f6b02498be9a228032aacacd3aae4d1b34e78992920a5732b868b1002e7ac7c86ce3fafffe06e02455c39cd5617e8557c155793bf3e34648b38eabc125b3318f0b0c79543e308ea6c120ed94294e5c7e0ec737bbd671c44d3f22aaa2e81c9a4793201d0518273184095633c6d8731b7270911ec1d8c0ec40834cfd51115199f1f3453f2ce86f3cc92ad055e200ca52b982e1d1e7fc1308e650c7639c2863ed9b7117a05a57c9c098757c863af6ee264c1972086242c30015f12c2c1f88dd041510f966985285dfaf460ee037d21a04ce6c0635d11622617ab70f808f912d3f920bd4a939309835f57d0f3207f7941ee0e7d884cc2a02e2e8aa8e3139a93a45c364d72a901bd24197628509a206a31f2a38d86b81071e4cf08172c003fabde69a85c5608ef43fb20098e95391bb71e94e472e90bba412ba01a644be623a8c0175c1e56a7273678985def1df14a1081fef8b2617226d057da567acde897d6932b51162b6b4b3fd3adc053ed86feae6b485a754523964904384f3b725118d22862910eaa3f0503b84780c5e48d7d4df21db6442091abba9bbb0f7c5701a2e9368c4f35503513897a733dd1bc46093ff4d791c56abf88e5f5d501f4757842ca4fd7b65ce82723255d624e764309a062868759f41f4f68ce9a282ef598742faba4b7bfd24a90762db10889baa0309b5a7a187f2b7f4e9ca1426f0e5d6cb022b12fa65765be83641477f849d300a0ef77890fd182379e47be0a64d752322bc9e5f247bdb2a956ce4a6993edd9e2258a48a2449816883a6f646563a30719b1341d2ea4d6d59494d61ed9aba9d6ae3a0b39282e0561bcb803493e0adbbea708d2a9ab0e362dd6785f26dcd293555bd7dd94fb5a2b114e9aeb78188b4405d265582dc59e843b00bb424d4bf9c96d61ff75c7d241c5bc0d04721c14b51b8a260458b5caa4a950d68ec8400bd372aba220e7e8a94e7d5347abd9033b09d68faa6b02a4d519dfceb0a6e413172db40bcf8ded0148968d3606beab38eb318a566f11f4df46f4ac63ade2470fc76b291a46e83b525d1dc4df1f218de3baa8a57d25db781429aa61931ba3547319d844713a7bc8833b18d9fd75a9a7eb771973a5f688e652e7115e0a8c0fcf121d481e60e9fdbe6b14d208101a06c3ae2fb3522147f9183a3575947c567478b0f2be3cf46b3409c1d70acbef1b188547aaf39436f3ddbfd007ade714600b9e581265d7e2c53fddd9ee614b4b5b447621ac54676359795aff2276c451615df131151e4c00d233de2a125e4007b90895f1b1a2e8c37768e80159daee15eb38a22dc26d32f0c98b761053dff5ba58046f41147d8f91dc17cb102883132f425c540048096f2119cdb851e7d86fdd91b96dacca00ef1627d6eb02294e81617d859376c9b8f4d3f4ee9d70c773a2786b06253e0e08e98cb225411fc7f003253aadeb9f14ed8945412073ed2e7b523dd507c5f6d88bdac464820ad82b9c0a4eac0a6ed4bc5e54e8d0db3bae201f4030427a2f448da04ebcfcce2095aa3bf52a777d5913cbcd00451146b2d6bed06ade8e3941438b870abfe41036056480d638ac5e26338d284a47e5f6ebe5f809c0ff0053c808abfe17aad723591228f2397829538effe10eb8cd21e1d224ad1413ad63d688d5a24274e6c66fe62c3e177164c0b3192d41f4984304f21285480f3f9b0759a99880e3409c2ed1fe30ea28bd0e667194d1fb153d86cf741c26586de3b6af65070c0dc83d3d0fcd03e5e371d99be4ee1508ff6f8fda342186d614372b24050bbce2ee11b350f9861ce87cc5004713fa32ec67acdf5008f3cce477965ca5fef4fab8ef028b47a0bcbe19225474f695a2c4431689544d4c3bae499f52cd52a3a615be0c80e24495684f253238a6c8b78e4276ee17da1b265212324335e98d6c5405696ab25b33d031a6b86dc59c30866e865c8865118f3eb340cf0c0b60bbaf7ab9b0b0e065600095fd8a45f993698351b44f58211e6b2db58e7da55de99eee673aa7cf4807628fc8b5719709274aea4e6f6aea866dc67485d662217c3d2cb353f7e0efa79dee0fac84c2c2b8f587a62352649854f63fbc272fc8daf4cbb227aa8c7c782112a281a5281109a378ab593c46af8b85deefaac35ac7cb674b0439c7fd26a2bae07eedd400d0ab1964a7c03d40a0d5bfa40d0545329bf0ab802f5d66c90e70ad62b10f83d72709fb85431c4e0219e4a2a6779177f153e3cb18f7ccf36c1f0dd2e9c0ed17518c6d682477f70d1cab15a0db892314cecf0f72cf05393f167b6afb32c204b5992e49cb9fc8ee3c2ae9d4c9dbca960f6a192bd3bca172d4ac76ea2fe9323d923690b4f363fc38ea88c278f7a01e5d10bb0f4d91d552a551146a9c622b85a3890c1d89ffba01d8ce1bc51d924b3ca7bbaea5d57a84b0f27928c47c9d1de0561c263e95c041d061d3061fc478324c26deb76ca0fd5c3fd6cd810ce463720efd0805eb7554d9a06763fcb8b38f09adf547a4d8015a1ba256bfb5f853c10bef332a8953deb8d12cb0b2548c6711fa4aab2a90a8ae77c003e8c8d78f46cc181c9a6181072ab8091b430212c6e3823d67d9018074da0a3e16de13dfc1962b20743115d76da1f6e09513490fedf8e1e60c55675a0b41d36e696b625aac2ca02a49a272cbe7d84153fc01e50d382ec049ba0005b2c7576595a412c88a0714738536027508cf018c138b9b35db5928d568db874d5a6699cf233621328a5795835c6cd576f41b3774f26de42c071fb382c601d34299fdc43d03130fa515942ccf69e3c31e048c7d38312733f7a9c10b2a50931cff5e8d2173afe21d7dee8b803bce439c33d56086170e2ecb0f5afc7b778c0e00a0e9aee144569801fcefe51c4aaf1a2c0e4298e17aca60be252eb4cc5dc8ae19d65b4a3ef45477d3b68190e793a9e287769c190b8954f7b8982e19e922bfbfe3c445eaf88cba15074afb02b74f01b6a3527016fecafb15ea1f04a8f55ff2a0f2545df1eb184fe29cd26927241d581980d910c45a846fba9110234e2db4428ae690ee9fbd5400fa07a75d25b012b7df78ea411669dcbbde9268e681c23e240234e6cd38773947103f739304a96bd8ee105f0cfb29d37004104d80af726c8e22341b0240f654280588209c97b771bbeb1020f00baec86fb399c72169edb45f0a4875773c97e5cba20d5b988251abd2633f46c13f526ca08b26021f787354c95755c3268d7a22edf5612fbf31694b8aad7220a89b5319155714b9e646aac3c73cd6d95090015707df88fd8d9463da526d7bc24c9252af35cc06c696189ad02e0c74dfbd2ba9c55cc6f93404d127f6d37e82e8dcad280decceadb769952e683b5a35b4585224a3f9faf5c455616d83042784b92e78edee86edb38585d6bd14e9198a033e8817c4d4d487716c580a6fafd769497d082c64855b1b52e6ac70c04a7d7ce5679bb0b654fbc8ae880252ee9282d70033b0e0e5ab3d55da2f3f3abbe71b78f72ef57a61e07ad78a9c9d8d456846656b5848e170a059c3ab8170dbb040bbd7016b7626f24fde066e7c736ffdeb80066dc11e7065027b521d1499004f1ff0ca3bab0b50fff8423aa2570755f4cbea5538a763dae4101688a6ad63832b4e7960bddaff8c7e51906915544ba34d16b39ecd423d46b74073b7caf69adb3ef5cf33c91f13a2183b2dca75bfe4419ca4be13ddaaa28dca04f44d790610765cda9c964e8b30cad98e23034778e34156bd52a212eb36853534e2fcc709231ed1e84d8c21564694ce21d95ceddceb0cf79b328e5a9b76fa22d23b14a452b25dc0d130deaca4adc6f571be434d36eb8f4131ceada7c274ba301bb8e440edbf1ea00969a580c0092c24b6d33ac0f7eab697c06f545409dfc4b02b8610ca8850d6d7ee5698944aea38f335699b222e531a62863e5de8e4cba18aa1433ca8ca4439f7543cfe5977fbca0277f0d696c84979633d159f81518d82b03e4c1f03ebd0b48eb98e26eac64b3f150725f43c8b1cf25a4ca08a1571c293a6920da9d293ce36e500f0503301572d92cea61fe93cc8fb4884678ea062bd8879633786d9805480503660b335a678c5f428d1e499d716c69772c599c3a9567604f4841b095583b85d7213637f9b6952496b6a8c47b511ba3ac51dca94462d958648d5cb0e511bafe303a0e9def886b0db68ac6f63b63281ecb9c6acb8108824ec9e0d80a85e58f351c892f776e4e4866712a0ee8ad97e1d10532147d9d61601da25982943557d50b9e2361355cf5a20d204a1a5c0cf85036c69bec8181dddb932aaab5c24f226bd2b56c11a0e8b05cbe119261c1afcd8c9eda0a2f5beb56d881a1722d39967f17fbffbb2c73c0eff9a35e83ac57ac5bbe6b91573ed41e91b1de8dbc8f4c570c85fb7b9679b43a7742ee60da825e72eefeeabd687b81977f729691e44af9d468fec499c5bd530a80b01f8ddfefbc130c67b3d443057406b4987d0e86318a8170078cfadb1a090851d7ae9cce34634c068d57a381e4167cbe605ed64de99db74a88ba25b3231ccb692291051d7b777470415f3d2f632d5edbf74d39b27d8c20132e55fec3f2b4beb3bb5e8d9a827e637a453bf9269e540a68a543440f082869d07ea1cdac9878846e3d62e9a1f6de9d6a4be401dbae605f5d9314628bd31d189b1ddc12cd2facc00dd4055846476462368567fa266f19cce97b8e7705d976cf288246e60685227db9f033cc621815bcd3bf76bd95542b3e58d06560bbf4b16675e7de329809d7b0545e5abfffea2fee6cd5f0ebc3214d3e229cd63628bef4dc6326bb5b8caa2e010519c1f1aaef2e7dc1281749c2c7e7ffd9bb544a44390d926953ce8608d64dd830db252e54f48944d3649e05987fe756fe59e8968093a442981fec20dbc75c8a140fb886c1b511d8b60d8db915b458f19f57a9bc185a830d6cbdd77c1d004172fdb4a3841067ea42cfbb8c6d70bd8648107ed31f7dcf0d97cc01acbb4a1b91b2fb62e869f840d7fede4657d79d90f0f60dc7cdc2069df9bb23f62a579a9e114abb6b08e6564797083e4add156b0c62940d833ad3d78cc1d881e1a1bd2ffd6bd0bde807b0a3344065661bfa876b0c9952540f52b335af72d7718ca01395d2a794844c409065230dc33a1ed534833967889ee40cd82cb12dbced1d6bd1b813df4b0c2d6dd4bc16712e0563beddb64ed19a532079f6d7e5246f269153ec9f994cd1c22feaa76079a96c34ffc28e22aacedf69445d7104e6ebe9e0f9451e048c789ad3c3cb45077df116fe5d25b2171ed6380af0182e9911b17ecf3e984f829592b4847196b14c3542593baa5455cb809be2fadeb55f626e6746e116a3ac4293414451a2a7c67b3f9ce12068fc6142986220dfff0b8adfc3993fc907431eaf6ebb728769641b32811f846f0024e6818ed4855805df5826897a5d724f04273d2ec0e1a9d01cf085c22473313d981e43a2612c80326848ce4d92532549225cfe7a99119f508160e4398c989edec23f78f2d77613dc626bb1d8fe37ddee200b3f6c68758ca3e9ee16841cabe00408ccd7b181ec627e190a08d6e025bddf7619a7ab2befad78c2d75f731f2c0d0d5be5a2f3659885369c4475ffe4446fd8d7c4846671ab4d5f88a840ff50d26ac8cb54fcc54d1eb0a1d45b4d290a21bd938e0f5628d4e1627b75eabe7586153e4fed4c59953a680ebfc302c2fb3319ead425beafe63aed0b6a86559bb32ce6188511880a48711fd7f2b5e26230e6deeede25504d95fb619be7c852467f9b915a34e49e2c519df4b4985f1586189dcf3acab01b7bcf5ccee44cdf14c5581ab066558a7acb4db771d92d099519c79ea5df6bd0a56e71047fa468ec283b61142e32ec352821581b34bba2f37935ff389fd32714e187890fd20268f908752c886b4bbd8946bf51f050de69698a2091ca52bd34401256cb288fc699afba7952f8576c776e61fa299e54572be09df5ba4f4c0c7b4e6320fd11ad349e87e0cd3882e9e90cdfaf6bf8f08b51636f68d5501db1cfd0f0d402750f342ba638af0f7f0845ee9934e1ae032e419226098b868c5ec2e694f539ab4338e01e0e96a6d91d4e1a5e092592a44e5bcc2512898e2ec248ec6de4b04d4c94aef5fa4b2a3b30c6af9a66f71f651e32cfd682e90c8990bbc8fb08071b31c00379a98e734e968ad32e8782c4d3b74171aa6a0035fcab5d4eecae673da5bbd25b00133847659cedac47c189125e8c158d2ee3a80220d786bce789800ea2d3a890fe02d995f94320f395f8c9e79d0c59cb35e4a8fde4f54ef46e713a9f80d0a461c1c5b80af8627c7f22c831ce14b84eeb3331425224cfb1673438b58b368e1e4df617223fd3461337bf58272dca94e787c73cc35ff3126a547abc01c095ddbfbdfe4563bcb3f5bb97c00d5fe54a700d06c27359c58f7b563ce127e3ace7ce73f27ffb29d31af47ded330a5ebe56879c05a30e4fa6d29033cc84f4ce10722f02d0aa65f92613df69a93e46042374b798a7f23c5548ca23911079a7b53adf3c68f0dd79ea92fffcb28df34638b99db682b0d712c5c05fad793e49fd5757fd4fbf9257c49eec2642ac4ab54e8c64d487ccde52e1341d8ed6c8016b73f061fcaa7e5f59df79d4cdddd84c347b298fb1437a828143f3c2bbbaa0ac66436947baa8dd20f005594658eb7a83c77c6039c92e10694552662eb264001539ec5ab272eb4106c5c8404b6573240173803fa6d4e223c370dc265e74f2edd6912f1ad0bb4b86ca60067624f3eac476cacd52e5e1f51ad902645503d48b3c4afa1b5424410e61214e3aec9b6a56d5d4336c215d019abe0c8e52bb0905c9726ae454c6cc922c4791d8063808c7d0042c76ec6dcbb80ed80f927c6e41f80e7dcda208c3bad123d56a61ec7d79522682e9b4eadf5fa64e69c5d266cf450331009edf911742df9cae435accea109e7e12cbeec69c07a8532dddb9fbd6f076df147c8651813e318cc160b4bbd5a584ac7b4944cb64d72e2d8b4d906b2cff50502b3eba8d1caabd6f0068b6dc2f528a6146a0cba56e1f59aa53351b6b61c5737c7f742b1a3283a180a546f782d361e5e757514951f36edce3c8a137b948c8ffa59e8c47fc0429d8640783f9d2860f13dba2085886c4e7004f65f92afcbfba71ab1eee29f60a5c50acb4d21f126ef90145ab3b4968dcf4436924f6da1a80e3c1e76f8bf56da6e22c32f85cc661873bacdecfbae2a644abf93e611ea8f38c6a273e33dcbeee57eea9c00be47192e234da277dc1ba129c039cf86306b01a8b11ecc1278c897439c6cc9b01e64067a004472c25b2e1e1c4f6edd8971ce97a54eef57d9af5ec4fa65d7aced42226296cefd822348cd0f05674fba967e4d42cc944a3132a29115e10f770a817e7e6b134e4a749c8fdeee28ee56f5f35a787b963a9e957527b01bba78d10128119b73313117a99be599f33e0b30bb84d487d5abbb4bdb6e869e95eda81342cf4c3e648ccd408310369de45ad4080e9ae3229168ace774368ac7d6b98219c73b7e82d18e430cf2ec41ff69a389df2b22523efd43b970c94022b7ce9f89032ec9246a792fe94640d3e650eee04ae6e5458af9ec32b73628079cc86df4df07843c42fe7ce1d205520694371bafd8a4cd204aec0a31a851bf186eab61005b5be0c0963aed52e8b453ddf5bf8d0db86c27f9bf049433797ae0705a97483d19d67f1d2baf120d90783a9000969bef2181027e9c4b63db6c6d7543e4385083069bf300fdc9110aa98fbeee701d731f167dbdc451a0113a9cbfbb9852ef7565a8b46209718982510a06e0f7ef5f009497794090ee26007c338f7ee09641df66bd9dc840f997be29ada26c16aff30b354a39c33d5f1cf5e9f83fb452e83c3a9ee8d03f516609949ad91012e728f5f401bdefe47cbc13b37c5197805a67396273f418299c9106c7c4d83deb3f3ef90fc1beb3ca96960e60744a444a4e72aa8fa244c4cc0856b9d3a5a27762e7c1ac567251384da14b91dbf3f258b995b24d99fd0db9b2bf5ce09711615c6057f1166de509a6a3359c6ec4331d95819b3605ab5a3c83ea55802910903ee98517fdcdd4562ae74d5c6300462c0c331c452cb02dd24ad93d1365e251d68d773ef350a3a40450bcf39b941db74ccf90f48a1be68755bf86cf332fa4ab9be22f9f6846252dcdf9ffc260d11fc887fdb2c8fa329df58a51c0d582211b08cbf32932afb8aa8647da26d92f43c132c89a46f94d88003337bdd43f8f17571871710d60ad9f7ec7abd3e28aecd3680bc8c29f165e45db84b81558df79424c218dd269df21e201933a2d893d3c103d8cc67d1660ed1cb9cc32324bfba4281a2d48afc22d198a0d274d034b9a6f93a1bdfe3eba12a864c72989b2b1df8fa619f405044231072102f29e64f48ed658a2b11910823d26336609a34898f8f222613d9a547dc919441304a8ba272fba857668ef807d50db880870d3b4ae6760d681b0eab58e84fb2cc3605e3dc7559c6d0cdc85b3c25469c8819c7d12949c0d10b735e0ba11b076978c10daf2dc48c99b1c9c918fc7168b0412eef6b51d01565412d03b9ab2fb09784417b147f8f032cfefbcbae62bf393fb67388da42ec68fd4e70936206cd258250859d4f6bf4dc905e1562250ddfa05fd84fd96ab1800e7715afd8ed72d37af868276969643e0814dc4cfa162e23d3b74089eb469f9042770ec950162deda8a8253b17c3c7ef40d33f287e68313bffc17211f5493c2b9fb5c1dbafdc49b10a1a3b13041955967692927fb21b1ce63449b0e6969a27cd4e96bc3f0b8f2588c191a832fcfad296082c84823299a4e85a4a772921f87916ee33ec5ab746d319c8d6a62cef5b4fd53d6c4c4d8632a07a53e1147a79a139ca8e4441b1eb2ecdee1f1113692835afe7d3cb2b4a822bdbe565e53d1e982c3686dd08f510d133d775494ad6db923f8d140c677e534426bc38b616ac199c7b8b735110e13af30ba05f61841664b72887b805224f719762d0c1cdf6a48dedf7cab4ea7e13d671bb530f214cbfbb3aff6e2f340c687e7302f2eeb18dc98f74a4abbfed723adb391f6f362815569a122a22f0d6fe17ea78c235eb5818dacfeddbaf647c05a16d9cc1d60008bfadfe5b61f1563afac71314299551384ba4a0a20af1d1e870831bd52648fcc4f682521897679590a5f4a860152fdc82608965fbf0b926ee6719158115e068e208e3db225b0a1d50fe6cdba1de5f5a25cb2d815ed58170a300408fbcdbab08d598160b58219c6bb99b40642d8c5915f8484ba64f5773cf479d54d36d1fdfe46236bba665636fa4ab6eebf5e8baae8aa21b1ab307817aada77e6119ace50e9d64493e417358b36facd979f11cd2935f381faa27ad39d5887d17e59caad893fb89e5291fd62461765f3631edf72c5899a5ab75f10997adcbfa4ab073e78386e3c410dfb0f4ac612629c6e9899c66898b92e2ad60919b8901aea86eb7718b9e940baee1e0cd4129dd7d79bd9aefb29e479008ed37001e16c014eb130e3ad1e238dd3b5e2b864bd13b0b8b5580e44ff3d6eea1ba29fc676154cf94d0a36c8ddf28b2ac64b66d1dc10a467ad0d731e4583c37fba234061628b120dc25bcf2bb2239c1439bfdfe122152a36e519be46b69485fa711fdd727f78a2db87a921eb7720016f347fde543444cc6d39291fc57e3adb41cde8f88223d1618fa6ba1a50d7326b225e7a6879674d8c8a5d0cfe6499b3a7e260e6b23b05e064eace744457a0eac90391e5fbbc0be461dd7f794401679685ff274f1dc982802b48b9caf09e63fc1a420f8f4523776bf6c0c306dc320905c10726b774c7021ccd16d36c4c32e791d66db02dc7e806b845da36df1e7d3e4c231e1ed6478aef8a7a1ccff8e414c2cd16279c161444d00f3cfe068f69d20b8a11d7b530ad33ec44f95ef267312daf3bd3328a3c2a2b4af8e3f289a1999430fba558f7076df3e8cc0c13184bf9db824c3d67e5831691f3514f618b29b4ab63176916e2b7a0667679142b6b21bf5d41dac209d2854d213c0804ca53e1197d04c9cd130f7756778cb24e7566260848b83cdf440dc26da7b83811626becb75b9c882d08c0f6698d3c59776413669aad583c196b75de50bb6bc0566bb22d761b45fc2d364906e7e19723d7b51e75ae0e4a3c1defc22640d59fbf225cc956c01d5d9b4f91e3c25831c19e8bd00e9d00c9009a02b120c002d5d260801f46131e9395d08c0a94fdd2100d97eda01d509278e364c68582b84959d4002003f1795bac8d1d78068c28419a0f355e50690e162fac700b9da741a088d21dd7463cb121746d08de3744d470848892db9581b468c98778ec4c01a88aaae31a59479440ebf64257bf95460696db9334898a938cd21b0f105fc63f40ba0e79007d20508c4e15bddd05f8ae1253b0f59ebfa4c0459c938452031e8abe099983c540c8b7a4cc81deae6d037b8701d589d8a7df0334163d2ee512a3f899321edd605ea904e2cd8f3afef97eba606de76eb04028d3b3d7f42229ee42502f138ef21eb518c1244a69b2208d3e8943225885973bfc1c45cab973007a24915ccfab9eb6c7e84003ae7257b3a6e243113e786ed62793d199c7a3c7e2ecabc0706c54f71fbf84c9c7e0deb3a269ae048e4702ce3f6f11dc2edef0b84aba6f9ff5306470bc44429bdb8806e3d61becffb77055bcd40c1cb4dc053359b8b200274560e1faa9a63ecbabb73bbe0187b4f1c58b10d37937a81e4b9af1ca37cdeea93f24bc7395ca0a55d9f883fa588c93ee437d5d3b6ae72dfc0d29af8690d59788496b67e800eafea06cd229e23794b3445391c50833d636c99b2a62b17a9af2c44273005d05068549c3951a3ed5f6d2df40979c4d73c08f6d21a2a5c5941bfa9419fac51333402b515d2bdd6b9791ddcb66c35b096a98feafacc478f5c5434de238599e9f9f55d522a4825c6c48304687517301823843437f62c05be4408c22e928ebcab895270c52d6f682b1703b34ae1f89a7fff6660a0a5396a143b1c3de1c29b2636a94362d0d1cf34bb197fbe8359f4a656887882715312f3f6d80320d36bfda00cef3171a20d9cf9b33bb3fe0d31b7238afc5154e47f41d7eb99bb17c518a74cee02f97d9c9c00f282684789b8677e0ee81c61b6794335ec278827a53f6ac3282cd8c5965e49ce1968848f03e3708c2ff926e7adbe0a0aeff89cd1e59c42e6e48e93b7a758af7bc92b9b5c60ae3e7e812efd30ac6469fd97f04e04389c0dc4b98e64cfa9f2923967384d56416659336454a3aa46aebc8fb93799df68509d043072e413d97f375b31eb12c8d30d87bf23239a694ecb111085d0fe3929e1d3950a0e60baa5b793e8594b92fb21e5b632fe753b5d9c6dcf4dc46afea414cafe3d1771d68609e2f1b630d2d42adb73ac083a0c03a49490ca208740d2393bdb3a878ab4254d310393364d75f83798947ea4bea266a1e63f1c0556c7233729e4def611a48bfdc2f9f60655d2f15e9698994da76f19d7727be92ca90012a54f1243b805106012d0329ae49110f0853aa7a2f9ca7b28edf45a6427ec0214fc5747539395677ab8a0c60dab412029abd5b3ef27f5cc70082a34ea9f9d3393b9756ec604152b0fb73693b0a4cecfb7557a118fea5ae5d5c4926173851d1def9e865e565c4fc8262d86debe97ac553241ceaf97c0632f3eda5279399a66c0cbba70fbfdaf83fea05c7bd456460567ab85d58787ff27cf587fd84980ebdb137faf1191634a6d3a6fb44cb38bc9a337839990d9b96004f875fd484812d7354dfe141fa429a144feb8a7d3731f2ffbb63e45799bb3c5cd761f7a680afa31e73c90bd88c5f87be650c608623b2eb890c14d3182cd7c4ec13df8be5db042001ba453469b41cfcdc104ec4ba3a08c0fe96312ee4375f318678ccccc60d8c001c4233e39c695272cddb4ab0809677a8dcdfd6ca3c110f761d072c980b75776dc948cb7aad82b105241c8123abd4b79bbaf23acb2d03bb484e4d884ec1f2e5401351cc4551b58ff9d2a016f5f8eb60a0c40cec00c353172dc42c2d38dce1728b04d490c3489245715854ca80a282019356168299834cf4c27c72dcfdeacdf7da1b4f3b72d606288ae89901013403719e7418acdb4155198a1dd0ee878040c49d98d60cda2520fc47e140e00025c45cf396a072ea801766636cb60892417e6bdd9bf8ee88cd9f11e7adf8ca7e0d2084bdbd2973f345a804681f938b6124c354b501c0982465e6497eb7426e27ebdb804f032d6ae179229a676a13dd03cb74af1c59020796fd4f59fec994b4d033ec12ab29636da28188490b89d176965aafdfce306479586c9d223efde534fdb3f9fb347ac14b2c0739853be0237b7a1f6cf8ae9c16d992cbb9fe2ce23ed0663928e98d8fb3b5a77f6005fa5241ba060b1b9fa69175fe4ad11123b35f8241bf564529538ab55b12946bbc697d24d18cb5a11eb96c0f6112f9809e2dd921470c6fb225cb0566e8bb03f69d2dcd5c6b8dbce96aa9bc787936366faed7cab782921a895bf76c60c41fd5ea1172243a3550c89bde579b3f698b2ae12858664b540f9882f0128e50a2dc635afe77e035353625ce044df15dd24ba3a19c5a93ad9f695adeae38bdb497cc58cf46b6c0f12b89afe353e5327a71919061116ba3c8053eb73467918153b30afe25740bb2f8b79546646279bb1f31118af3d2eecc43608044e73820aebe5b014d6993188041db412a82aae6516a90ae8fbf7d9f088b4af3fbe7d816211d59ad63a6829a41980dc3d5c2d20b1c2878ee5c9dc2893f02afb3051c92463fd2e05ffec47c72a827338f50fcd8a44ea8c975b34ea186baad0e4d346dd2128477e4697675419ba3288212347a2a9425bfb2f16ec53d884af9dd115b55f91879f41df5861e0587e4b8bb4daeb352968b975401fe29f9507f4d4ce96eef2f8f1e456632c06eb318028a6d69fe1840247bbb08aa7d728db8fc39100eb38c520e5e619275d6daa8565fdce6b265ddcf3713ffdb22629e64bf083a3508d1c406880468fdfbe27ffb9a2e65c8920fa8e4b7c2853c1a490c38927a7da6a1c0dd4844678979949968af95b2c9c0fd94d614c7d0e26af8c4d11434b1d5fe1b4e3d68314356d12634dcb417c88d06e6da1a43368b98b2ec2d81d42ba4a01a7c0202757bcd7a1a7c12de59bdad9c14139e22e6b0733b62a9ac0b6718fa60ad9159b7c8582e1c715e1732cfad618d36681d96c38bfb8cbec948801eb07a44c44b6f8416b517491685eca15944c6333a9aeb8fa06f6d90a7c35d209432e6bcc8a0448dad3b9f59f1ff39ec05d0013e9c6eb3f11b0a80b7cc76ba4c690badc9815de06378dd4c0197e56c502bc7314ea90560a7b11a34adc1a96636e348a2f0db33db974beb06cf490fe9d285e1fdad586811e65d70624b9331519119180552dfa02f68e42a935c2c9e719b969f51b8e9a7b84a2755faac99a3a4daa84f28c86a4c1d04af2168c9490ac64a4d66bcf02f74241b5c5045a662cd90d9a40b3fe3f61c16c35149c8bacb358503b40c0d770b3e9aa6c6a3e20b98f0d6160961d387b5c77ba896737dc779604ea20f8755e35b48220319d98a234a39a7dc01b80366b21529da5ef7f2b20a358c95e06c3f378bf8455458e4ef594b12344ce1b58971c9da8f12581c23043d204c1d8fbb2340e5482601cb3c2612a442d8920d6d7181d2c472f78b050d3a7bbac5bfe99ea5468eb2cc14839464f6f32a719cf117bd9929330acc8c2a3c46300d9994ffa7021493aa044f05a813f14344bf6c8025bf4e846e8b71632aaa3e2549f91736025fd98c54d0efcbb23a4782d79458411035af6b04d489dc14701d599ec8adc645c8a478da8f0b9975515307d23d2aea68108dfa61a3043b362a11c6069091d45084873b01019a541fcee3b60c6febd9aaa16c31f58ac0897c5be3d97a9dbc478302cb5467622cb1f344e7913a7395843958dfad31e7b9d7d650a3729efe32b7b35f7387e03c0bceb624da0ddd2b8cd76cee05da6c7c172399b3a10173b22c29d7083fe7b42d98b10cd7695fffbca3046dd557756c582c07199acd6c4516f76fef477a3c362a1004296991195a7638d6f49d7dd5916942dff8fd7c3449c937529659c5b67a29e9910eab2f39b792cbb3238ae49388c5cf5ac43918decbdc7b998e78dc476ff0a7b5686e8e7d8f1d72a93ed3fa0b10205a961c56784f0ae7d48d8f51e3e8ba1718a37e5bfb8ae05d19f30b0466deac5e7319a8b9d131a5bc0a1c37e3224275c42da0ba632c1a60610e19a5cf393e959af16f2a28df761063f607c6551b08fddd92be18a009dc052700adb28814b3067ff415c38aee5644fd5ac0f7e344614b4957dddeda606470e62648c9e6a8e06f6efa072ee38228735b1483bb8ac408b94f6e702bf6e8c39bb244e3db8826e168da8195dc262229600d6e405144bf018b99fc8735658cfd0eb45cdaf79b77d8c01b0aa3acb61236db0086a751d36f39281bd751dbe4be88bd6cfcd91dc020f23819a9380192c6874a450a47723341c777087c59302861230669ad1723a729a1ab6ec79b24ed7a31130bc9aa8dd8452aff9c02efc5f08ccf1c56b76cdc6294f31abb183f725175c76720d49270be287f1e33fce1effd9aadc490dc20994c9877e03c877bb05a9c7981a222c207c21c0ef0a1619669100398c38924e9ec550d6a4ce00d64fcbbfa2eb013c9334e93b39a2cada304dec1d6f783340db9e8464ed6f4c4b1ea8b9c04d44e2df1c6828c33e7e9013ab948cd830d1dfa8bd5641942d45ba491a5405a1d2322e6007ce07b9cd7c3b9b999113d088cac9e037b3890ea740c44e4662dd7b02d784ced5114870a45d2255f33eef6ee629044e58f1021abea07baad57a3651aafde3a0253fe26a4ab30fac2543569c00d620ad935a285f2827ba17cd1ab02220e2d31195f3860bc385a6dc06184e9b7860029a91d34d0674c9365f34954c3ef073160b3f370d4952b3bd1cc5f0de695bd40faa6abb4dea2908a9dade35963cfb18193759bf8de594c1c13005f771c1e670016941d9eb660b58b8251ae449e8cccea35e54dd658ce9129fa0a8a80630d2f35256ba0f1c4b50aae3109e79c022a6e9c06e569ec8c3b5589508350c97d051db6d974a2807846112bfd19aef7e758ab0f563069ad938a186c4a4bbeb5a53701292fcab8261834a70a123b5a0cdbfe183989ba09853b729be6afbe05ebd261fb04c368c9cc6f32b559ec671853c40efa6502a640afc5c0b51f7399c28759b81da30ee698f709d5598a72ed577ec4746622ab70443d8de7ae906664cb8f60d6db49e9f1efb7d02958d2c1ecb5c3539129ca315cc997c2cbef3d38b20b42535f0c7d0677b1646814d8218719f601ab60d302871d0b9e4759fc266167e96c3dad808dffa706ef4f71284091a15267781da6d68561c177fc7ae8e348e3aa6572c3728039b090a66dce3c9c74566cc88c54f31775063c33890bc2e7a9d53e89e17f722ce1066477871f3696e69e574d526e05258590d92d0ed6940fb449decb314546cb3ae105146dd03f53e34bcf41fd83455ebd761c341f470db1f842c1c14da89de058a9c535175886eb9c262d61a5b73397a7b3dc6f481e278be3bd65b592ea3b76903f1d58fbef50d49f462a36707558cc742c7bf9eed59e47fb4cb7c029215657464431dc2b216c1b44ac6218b73ca77c18d25db207e354f6db0065a0f1361698166b7ad30b7f0f212ffdd0084f3f349e1069333fe68d72fbd218870881bc8d619c6e2994cddf2837cc6a6b1f6abfd015efe8103649500a6b7c1bfc19fcaa672a007c666d38eaeb9949a41e9824dac8475adee2710fc4f78273869915fe7a6e4628afd3ece7b8164927b7c048a9e42c16816ff64ec2bc4a733337aa63c80e3a187b7e3f1c57029761b5199a652f814741094e8a9ac50fbe3784e1b166c6fedb27cd06024f47c3a014f2bc48b1662cdca17cb8585fba736f8f1f5344db22d2090f1a128b47ea14b6eb85333de124a14300d280b1f1a61e6445bd8301c6f90ede2bddccdd708c8310e30f895598bfc1bd97f0ea7aa800eb4f27463dbd4c9b5ebb7d15e8424549ca7a512719631b2f087e268b935c2ae22756c39caca6e2e7295b65cf1ec494221482925bb9b26ecae4e7e15f2cbf092e6bea9617f4b954e2dbf2d82d28b41240a3819befbbd963fc1b68c865892d33c7657d05519ee6666b1d7f0ca113214d6ffdbadac6d330ef9d9cdab1632c4c1cb48a7ad096d730450f7456ce880693d399e8d0342a987e4c8ba02c533f1be12df77ee05ea8b79c04025db6a83428f569385aa54d612bf5d68c03f3a3a9428b49bf168eef64a2378a263cc2e546c0d63c5a6094f79edd6103c9892097b68b99257bc03401a8f3b9309b9c5c54e5970593323454af12b56b47be4202139950b1822687d11b440aebefda83742c8e5623c06864bd69cfcfdacc436fc75ec4df23b7f5714b9d9dfed7f4676a03cd7a605822578d297670196c79caf767d8b8dc6da664721d20fcaef68962a54fad014289673773e893abec3ad0b70b2ead535c934115a2662fa7619a12d71fa048c79e557ba0071d644af4e39c3a8b5f4e3471e42d64ab853bb81dbdba609c785f20f373501088e0c7304c9fe963a6889b5996c382ba4037aff326289c62f6c20350f49c8916a0179b59d08e45f22d516b99e240c5ae8888dbfb587c275b371fecd54acc0cefa3c26514176a9cbd1b931aa64bfce3bcba60e2e82c42c921baad3a3900a8bfaa335d96c39118a3676b6ba297fbc460ea3af504fda45f741a41d025402a138fc44ccc4e7630a26aae37dbc440dbb6009dae0fa3738e937f005f2567dc0357a979e9e08160795d6b3f641cb05f22cd8038890f2af3552f3e38a9b6d3cc83c903afac301ea88b5c9b8c000f6e0c04632a53678b2c25b463eac65903dc1a8ca34ee406e0797844208fc012419f42c8af0b18f55755e96048e68dc639d52d3f1934c565318b1fc18ed72841c5a95422946bbd91937b8f7b4f6bdbdb0afb06ad782aac00f93a19b849ffcf7a2dca57b997a265c48099d1d6a0e5573b634081b789bf5fceec60b94b70621ecd8b57e14e28268f6a21b757bfb8e957feb8f3db1d1b59f6d77677e4a0ee994a5001a4ffffc8022590d78e85aa097b3bc3765e593ec3e017bb936c7e84b3c37af193f08a066e229aebc79bb50911707d12d1409e5b8047b0a4a938e5171dff61b6cf5af6bc0bd8bc63cd3e839f37ab44581e9664d07927c6df62f2a5ac898214b6fac5fb1f86b0313d205dd4e1fd041a5508b8b6d604d451cacec0844053cb056d6e78c22549d9619670e12e9dcb31480d9e2d62bf1e4f0f94566640bf5112b18141e0b6f632d8e0b46dea27c59997627a881c3023eaaa018ede3874c9ef8821f7d00331d8355a2f4529a0b8756271ec8689e02c010bbdb75a2e83bc063a82d82a081a4e5c5cbc29b22eeb95530e91d7068cd6bc5bc92580b4d9485763a1e022f29bcde265a0f059100fe76db106e7b90aa419da9b68c3322ac1a253714fb930b5e20a5b5a1a6b474c95ae95bb280543a89a7d148070cf9b1b6022abdc68a2225190519a5413891164412d1a38ba73a2909e4383566013259caeadeecb89ecf89a3dd680d575830a8689507db51f9ae1fb26aae96072be6ce8737e635aaaba0390c2ff61a32374fe3ca2ff6bcc25e68f5d46e5db90fb51219264764e9492bdafb15a00d740cfdf641356fcee9a8ee4cf6124fecfb0c010484441903acc3a9da25b02594998f0b492320e1844b02268f754e7898d3fbf1f6147766b703d5b23f682e02ca4bec6d9d4fde18bb8f540ba49b8dcec1085aac8b9be15ca8551983ed6a95c2fff906c34c95a8863388d915db59a88ba6622c8cfb11355571e8db81203171cb88b1e1388b40e805ed2f011854d2d5ce3788cb2e343a81ab69a84091c86a76050307f45686a803371d493214311ad17a1f5686a0a62c6ea9bdb524c5315a2269c7645d4f66e29d8f704c699e8c79e3ad19fe1e46c501e11b47473acf7a80de2220e4bfa52890382bfb36a18e93366ddf92de1415a191743dfed99428ee56b35de1c0e2865ef71a04f1dc140acec00314f6a1df2bd91877481db43f418ff4899631f7960515b263402defbb27989c690a7861a6f5d9570ff64d9f293491a70914c294fb76652080c9e7d1a8b63a7db6d7285ea66711d1ec56b0643a1967da079181aaa7b5fd32d7c9e741d348de8d7d0546e8d5bbb34d02b228a4ab30e16f556a310690654e6824094c4250dd87f0f2e96a064a5e9976a225b99d259858c1a7d7e0fa9855b4d1ddad8b1a4522655064c4f44792e33988452a290a5d9155775d08f3ae26a4191495058a020d8fb2d11e5cb4d2880d679db00162ac7011b35f231689a36f810c3d91a42fc4202a6258e50bd851b2ddb358936ce51aab68aefb26ccc45d918efee6a8fdbdaca575ec2c13121aaa1a00420d1be995af5f221d51029f0d32f11438531512be20aa0577ab6716299754635f2b2798b92e4410e457f843844381cd9bc784ac21d0c572bd0f02904100245d719e87a08fc9b771fb838d50379ebc3e658579dd64af9b7e5c4963fec16e3ba298974aad28e9f278e147228da26224cbe9c147ff68c1e02be83d26bc187e4a98836c55b3d85cccc50e674180547a03cd8932e261b5bf0c8b5754b4c30c11fe0afc24f41ac76cc8f2d36afbb98dcfd13875b19fde0cca865a9c9c42e08eded88fa05eaabc31a74364f68c941d3382df0aaed1b4e14c0ecb08bc078d397e159eced493a934ae366f4d1b4b69a4e8f29c1847d7f209f822f8c21ffd6f81d9387dcec3d4e9be5099f29fc5857660033aedb92127b3272a455172cc1df79c149669dcefe050bdc4f1f1423bb490a0e766ed98822a88676dd6f65d9cc355e414de0e462a66f4e2c06e9aa1da4812631fd9d9a9c069e9ac20e777572a3c7badf29b3b5a73ae2c4d923218ff82299d4565566f62029b20c36265edf4447d1ea93314de0f5bda6f43a997a7401c3538c05182506fdacc8b686bcb03562f7ab093ba39c6d90984c8a4921dd3b61a434043de266386b78499106081472bc0456012833f19561f05b15ab87c87faa5458d8f8a58e11f4bc58548e4a494b22327c66bc22356e4663a393c17d81558949a84a446f960e4b18c3e84f9be524302cc04a36c68220eb10caf90c6546ee08f6c68d8fb5aa006b77b41f3f464c9500cca861891530cc73409e515a6885507d945c6ec18b47fd27c61a05baccb1efde44c262e3da16036d74ada158515ab9c415ad8bd8599003b342aa2f0ba11828ebb1c4b5228518d0b30e5263006b9718a2778fc9da90053377e58a98b64e2f1eaeae318f044787558089958b8f77e1bd6bcc98a9f65701193fb63877554faab1adef47045fa5bcd662d3d85638c97d0d815ac553bdd84a23840d90563c5554e0a3ca0438bc2c68823a6b5feea04ca612196d8665d32793d90644f64e6acdde89fc7c07a4a9f96147758a06dc8c33764fd9a2e57c420bb94dd7c844c9601ff993a70839208281a582b4f39df0545c1037aa475535825eae205e3f909348e87ebc1118e3f06d033b2a88ecb13ca538fa6402aefe922e779ec6392317c536310e65790f1183e23ecf43585b583964cb7e1341a519f0f05a7706d224d4f2cc4de47435ec2c8e38f11505e1da37f15985f8d8ea379d344d89046c843028fe0b0e787e9679989e87d380e7278d17d70bac441639965f094677024b039ea1c997197f34b7712c673a2ce0f0ee784178870266b42adb4cd233fb7c56203027d4856fe24edb2af928dc7dbeced1fec178502e7bfad0349e7902f0cdbe189c9a8c955bcb8590d0fe11e377099e0d2fb1a4c82d59b0b3e0415c2f97a6dc95becbd7aa48bee1ca43ee7326cdb0f5f844fa85881e3113647aad68f7a80b28a3d527596e148739cfcbf95a432582a312bd5c500c2882423db1848faabd0b0689367a9e532fef99887b9cf24e494737b2bd8e6c0308050264120205736791e90710eb4fd39f688b6aece7498fab895226a55c5afd438d39e9838f8365ad75461b568774a24127a7479366feff71103ab7a557a2890affd4e3b0d812426499048df4313c5541e2924988d574486be43443351a7c04de75b85108a086a297df205cf157f4a70b63eaad1b6c1412ecd0140d8f21eb537e1dd2608c6f4e3480e25a0fc13b4c8273efc7a797cf3e44cdc9cf09e2bb3e7ae85f8dd7345218f3d895829edee3249ac85094c674e5fc7d686b8d9b54869f521aa76fa4e05b9bc7698ea058a1a709775a74f785825077546bcf4f5cea57ad91cf22473e1531a666160f4e2eab35ea00e07595096359533dd321c3b4c80f718e6010d6649c613c04104c33d8903c00117de8f6e0cd545b78c2aae2c3a7cff5a29421a0a2564ab2c76f6ad2c8909afea71ede3908a28d85b9c3b818131af1e5705c275ca6a9985e247fa70e1b3c6021205c1f64cc1ab62ef951c3dd0791b7cc1f8a974725bcc8c6324db9200db3804fd2329f05dba31e20ab08121094e1280321fcf8d47498944e0cd347fc4e6bca6c798c040a9a83e39b408101a9802ca00b6e4f5fa2af36838a837c18b8df966e6a4b81a81fe36b9bc5d6fb748c87da01515c832185880bb50f59f2da8014a67ddaae23d5ce6e8a98cbb41c7a72d56014074d338976934d7abd7a7b8d8960b352835deb2272c6d1225fd75124669147940b55862037d20085d22c5fbf2349663f4f3417d56c48a1a658b1a6b9beba2d0d494b0d8d4ab643a4f7c46641dab96ae2e2649fdf2800bf75e9214c6d365007b4c8d6f13877d9c812e9122f42c8ac38400734c886f3c81d43cc3fa1a4822b5ea3fed283c588850b4e83f669339b8b882c7e61ff91c6a83859af76704bc754cbe94afbc1205401fc76a40c3db5dbc01dd0cc066a3f5e852a7371200ed0904de7115db29005a40bbdc610fbff204c03d9edbb0a4deeaa010ba5653e7ec749cd569e38d7a81b526eb5810ba5c92b1176bc99b5abc064cf1c5eeac878298293bf9fc7bb8f5640039f5561d85d956d32be69f9cdd21a9b75a20324fb54e2b79dcd714854c23bfaf6f19994d4c3c601e21395c8d2bbbf6748420c2bc999ac9a22ead091a80b81f7a905410a4a9d723d243d56bee6733eb2cb0001d2e32f9fac2d3ca4d420e9916b1f26b80ca9f781c365bd32634e00403a84403d2f4e6978943f31343df8a4c60fc975a9b5e16c01e8e3719b99141cc4327db9618c3033be2ce1c1bf66ab5b2d617c6252baced20df395c9a603b6accec0fb72d497853bbb84a01be8abf359307aa442ce389fdca8ec0486c18c8c6ed7c5917bba400ce519789f81b3ee95d85dc511938f8db1ef4fbd27fca0988cc67aefaee1985bc93b8aabff40e268501fbfd151df029e5dfdaba15f6ff0dee08b2cc298a23361f4c381fc26780c32f23c4143c35d0da4a66e4740c84e51aa8b197cc4b8d8593313bf286ddcf21d63a6cc81ec7022e65817bd5b603d7c70a2a19468903e42a87d8f895d44cbbb2227de214bfedbdc06df1d72cda27e74143a35a676e6381b35107b77a6912678f531ca9402771fb58ac5cca3414992a7f2200f83ca78a02c618802f55282241309e44803aa49d6745b305816a503f221088c33b0394d939269be361ddb14977857ca7fd43f14d11266a8d3856c9fd811e4fbf087879d5e7705a0e1fae0e04330fd27c9c202dbf80c1adf6334531060f15e04fdb6df8d904d36a5257befbda59452ca946446070d07eb067fc37314b80ebec4c5734ea6ae34e49f8bf45c9f52a5965e4aaf97d368c499885f807b361552186774c10db18cb69e5d5f16b9d7f3e84bf7f9b4da7b8177fa8361e764f9d9c524d841f189aa0b6fd33dab9d73ce224830a4155917a7c499486904ba41423fae9c33c688a2555a7925a5945aafd2998387493f4feb783ab84b3dc850d182ac5dee30c1615b0d47bbefc89517ae458eef438834bdf22a8030458eef50441a17806290db793273357b47d274134ff93bf5ef26dd644557a622f99af2fdccc6f691eca7f3a3efc2d0143630e5fa59056b4ec834852cbf3fc804aaf9f111455f6e403a994c5b70954aa522f2f708b684cd8dda2b5bf247024996e4915d741867e4788788584275258b24911caaab566b15bb48a23a47d254bc63451721be0b3fa8d7ab10e509e1a008445138f312f6716ed45ecaa23c24ea13694e76f72591a60ac9943f0a58585858e62a9bb13dd68b62159bd26e2adcc8a36f228d286c22a22f67dfbf6559b5528b6a151f8aaa154779ad52696c8f3196a2ad14b35aad56abd6ca62b1585693d1ae0270c9ef6e3db44c6aeeee54fa28088f84036b71eb815fdefb71db7a6c59dd7a4cfc72c3f823fe62ee4f7e8c79ab3d7d148427ad8f7d62a1441bd347aa13b58f594f69a1eda30b5115faf375287196eb60d141721df8230c951cba132739bee7701fba0e07869e133398cfddbdd4524ad760be78135a293dd9ffe5bb823ce5d6f37ae625a505b8bde5432be587dc5d91395fe5d3db9ed27b1ec625db931d0cc1dc7dffb440e6bedff4759ce97e6e40c0cc81a1e78e2b7d46bbe7e15d8903a73751f23595af81bea029ed4234dd03a9e04be8e4a51fb2eb66d7bd5786d918d4a6b5d65a6bad92bea41694925ef5b3fa58adb6dafa924a9961d70aaaadd57e9d178c585f4c64dd7ddfb7143cdb77818a1c8eb8c8f16232d126361180a1239dc31fc8bb4506b8df8925f27c27da5df380aca951a950a82ff28a701195b1893c3f9b159411451ffb6e4445148ea88e8aa988e99b50ba2535229206c723f59dc6a1faa1e73056f9a4378d7464c1be6ed0d56a336b6df4e2fc8ed01c2367ad53ca0e0cecc6f898054ffc0296b3e2e0725ad13be8cbded119ec1dbd03e35e727cffce3143b0887ccfb4be2655a05e411815dabd5f4e1a7320e58b5c63eca8f5d322f6a5be058bd0ff7cab7dad3e05613e5b10468522f39f3aaa416d72c19272ce5a050c4cce2f9c8933191a1a1a1a42ddd65f164f514fa451c994337126f4deebc2aadc7ad4faf47b0eb55ab96f9a755dac8b75b1b2f0e1dbb61e72d2c72813bdda292aa243bc97f4013fbc01feaa58a99cd4f3585a112c4f704f3beb7430f42248a59c0e46e7517b02b9cb39bb8aa851ef202dd274154f7995fb2314230f0fcfbdb8599e4e4e8c2d25c7ef1d0925faa8d283fbc3aee2d9da0be323579f3f38c0fdcdc3c373615f36db655fdf4de764e1c306e4cb97d6761ff18833f2b32fde481c2672fd7e17ae158f5ceff3a8a9b98898f03870c8ef95b683bbbbbba041b778820b9fb88115555839c861a7036428f9820c2b4fa478a245317690fda727801ca388d1448c1d116431479930be9884c032c71c248105d9bf4d42e0e9289f33c09d630e47d9c31b399cef4898128cf9c5a44798d58b69bb9877685e46b01817362b8246c56e5bd8911696250b8b852c090bee8a9215dd1413114e4368c9f20b63155e965f75c9f28bc10e8957ae5c79a9f14a6b05431920b48a9937885635244b11b591e517835b2bab183ad21b398cdfd7d0576ee8b415cb54a420e8d1891c7338caaec880c82b69649c209ee42867c847fc3bc74d850d7491fda3143d885110651fed0513325410c5e822fb73f1840a1158f890fdc5188a572c21fb3b8955441e1c11a7e841acc20a2c7ae8ad070cfed39b0aa72cc11007892b4ec0c2c70936644f21070f6cadb5566b472110179cb0040a17c429783003049418a01629bc842093780066d10386d8c46a867c447e67df54e8b204430e48214d917d4ed5287c8189ec9f42f645a5151b851d00a21db0e20096161622c714d97f4be10621449244f6b75b6ca3f003665c2064ff14280bb2bfdc7c489f29e79453ca29e59c524a399d8b51986b4e76076035ecc80ec6fb02dadd7fa594524a29654b29a5ecee6e9a84beaa8c17f3fdf7db350d77d75f99bf75bb56bb94522ab71ed2da9b699d5deb946297ad944eb765bc97658ef5c95092bd3c6bfdea67eab45a59e7a43b645166461a638c33d2964e29a5540b29a59476a5b4d2396b0d90d8210661e490cd80658e51c2d0c994c034c7286190e008ec39460963c90378fc20aa92fda73b111ad95fc6bd85bdf7728c423485082807a96a4ed8428b3b8223fcff077f822f01897804221eb6488247045bd8c8210b2792a8b2032120415a3981ff3d80ff2f21469dff91d2df1d8a2847d8810d38ec100417b85061060e4490c11625f04209d9a9b8808825414f9cc10417372f402c19c30c2b68f0e2e68cecaec5f70f86104521c61843b07aacf8c0165ed06005c40ea638293a813ff6f7fc7f06d5112a6c7125881810a1831247b8894ef8bc404a1758d0800822dc44337432fa30320fb2a081e7c7d002398c6f0444b24520b63b0027cefabe81997aa65f08e6e8d985070ce69873c411471c81031ce00007ad56abc5fd4b225313a5d7be92f61cf799acf6dce9b913b62493e9e3869f879b5e7b8e23350bc98d7c7aedb90f069f34ee35eded17ca20c49db437812e2cace187d13008a38140b83f3df727cddaae89d34bae098e3b715aa9d42c179726b8277ddc93482f8350b39ad5ac6635ab593208ad5c5c2451c9b19c25b8b7b6e3dee2efb2a669d65acb19e93824372ce9ad919612f72e1c68a4e3381048e9f19796e872698952a92b792ddd129d118c8de4d048d775b7bbddedbace08368444a9542a995efb4c5ff270a9c4913e52095f0023b991498f71a944b28fbff002195f20974e2417ab7d090c8d7c997b0d08472a794818f990287db98857f2c0905432995abeb0f4f14f5f58028d7c26244a2c69e0d2933a6cc26f02c32f63dc85dff75de0e54a4309cf4509253c971a9fc486124032555fdec56b8921c1b8782d1f63c010e540302f6078c10d0c3d13183ea852a9542a952a488d6f55a3865cb5f836838989eeb5af6bc127d3e3d7c0f008257de163ec7926d37494f625703aea743a3d2682f173187b9ec93eb68fdfdac720c644b813e8c2c218063fe92d096bd6b630c10489d4a2b5802157d2baee08c56f620267ee31078638f80b89c4c464acc3eb70d7f2278c4fa66f31e1efb0c9d4fdcb87b9c79f618e748ac15ff8f86b79b9e1eff0778f5bc0f0337efc189fc01f31c398be48f7a537812e3c601820dd97be03a7a3485f02651c45fa3f42b30cccc64a424646266b56b39ad5be0519996fa10519992464929091494226939e6b21874664646464646464645ad07e3019c1f2da67edb67da7b799fd2de3beecedd79281dd67db5bd27fe6388e23810ec0c9dcf390d66e44bacf7efb42183e2379c9a4dfbe542a91c090484824672e1f3709949ef4dbb7802e2cfb30db739f811b08a4f4a42f3dc9669911a497efb4b7cc6404c77de111aa656f4960c98eb677f942bb8db2d7b41f22d4583e6331c2b2b070376ed8b051a3464c0c0ccccb8b8b8be7b5b49c4e2653d7954a1c472261ccc2321a6d9ba66519865d97c90486b723d98ef39e85644ddfc2c2fde8bd91fdceb6d8efded4714fe23e461da4e7b8b74ffa62445922393c428b1ca1f90422e95c22914860f8a44efb9004aaa07d771e6d5fccda1773f6445e48563c697151a954ee2d2d2d41542a4bb2a42041bc1695ea89ea89cac553c17c929727aa4c7a0e070e144a46e633f79914139339d34713e828cec471dd9b3a8eeb3a2e480e8da8542a954aa5520581d9784c3ea7d7be9389fbd273a4e73e97f79e04764f2a3d879f7bed0bc1ac59cd6a56b39a056170477ad273afb97ce61af7b9a4e0f2a5b75f6881eeb92f21b991f197eec599e465d267d2870dc274a003703206b92fd92f7da1057289d4f2719300f7a52f2cbd0be8c2c225d00898edc3945e7b12c83d7eee31c964f2c1f8432360e65e33f970ffda939e876b2612e648a793d702be7c1218ee4d3edc090c71f2e9495f0866d2731f0b1a987b526881d3779f755f6804cc454ea0c93707e0707ffa3a9f3efc723b3d0643309f4e26f047cc219841d0022fd80fb22fc668f3b4c1f06fdcb061a3468d9818189897171717cf6b69399d4ca6ae2b95388e44c298856534da364dcb320cbbfa8234b4b9d2dc97068635d7b0da0b0ce705a90efa150c25fdf002d9c8973d677d79c8be2fda7cdfff8d1bd1e6c60d1b36a28d0d1b356a449b1a356262626060a20d0ccccb4bb47979717189362e2e9e176d3cafa525dab4b49c4ed1e6743299a28dc9d475d1a6eb4aa568532a715cb4e1381229da904818471b8c595846a368331a6d5bb4d9364d8b369a66e336598661d106c3ae2bda5c579c897fa38ddbdc6b6db4b1b6d668532ba5d186d239a3cd9c52461b29dda38d7b9cf1efef68d371a6bb16b14515ca0036f5202bfd06af94f4bbefeef1e3ccbdf29529fa2f265aa29c2ce2afcb5ed7fd0bbcae7ad997de7741bbb6ed8e55e6b0569f536a4d29a5ddb6bb7e83b7f3bf716d9593ce39afec284714840122a795ce17148b2f75b067cf68bf4e5250f3af739411978ecace249e7ac0fecdda719f32c0fd47f8ce7550ada59cd22da5d456a774564993e41a33b541765d478c2af80ecfbe174feffd5a50abe0eda2ccc1d7e95472cf690447ae4d1c7546ee67416252c9fd9ddb3b3d28f75f0bd44defdcde50cb45e47e02c59dc4541bc1e59c36875896a0111cb982ce131ac1916dab483ece7c2ab2e5947d837e7c867c7cbcd9ff7da7e77961741886612fa5348203634102f7bd2086cd96aac3be3f9c18f66088611836e3bd20582595536a52e22920d07122309c88565ae9272193143b7d6fad737405432233ca29e79c1fc3291fd119c9fdf163f10247235dee4a2badb58c158e5cbfe507f757efa9f157575039facabb6fa557bd75d6fa72eb51ebd3b7f442c277df8d5144be1f23d84041423f2f3d3e2d1e17e7c195382a7e51334bcff44484fb69129e3cbfb715fc46e6c8944fa0ded4ef8d85eca6267194b797d151a56af720402e29cb04a337784946c8b2cf6823cd9c60e729ff0f59bcb3a11de9943146bf680ef6a59492ca8fd9eb6bf5c3de590c0aed038c42b409020e6330eeb0d6691d0efd52bea31c94a1609150824524a8612f0adc14c0a147d3373e24a8698e729734d0f1d99a42b5b66aabc6185942aceebe711ed7e1c4698a883655c995e329f73c2ca4448912ea73d659678d3360961f339561ca1b9dab05574f69c99d5d8c96655fbcf9e1a40f6bb26ac4c2793524108328963b02373046ede3c682cc8df63cfce7e471412d635d4e9de02bad56af6dc462f19556abd73662e9ee9eb37b90418b5ed236c85046bdf7de5e62068bc5b2934a2bf311fb9656ca6601436f0486586ee0cf4ccb66262f4fbdd2a041035ea8a0d56ab5ba58018bc562491b6dadb55efad2ce97f49a3fe0e8a815b45aad7bbfd65a6b9df4e59d2fafa595bebcf365adb5d65aab0f757557ab9564224f2a24a950fd32b55306e08cd5ec228b9214df949968f8194c45a641d365f0647f1c18e81df4fd3390d5a22f32f69eb3196d2efaf16bd3689f7dd8a71c6b64109581d743544b9639f7e6832508f87e36c47e1d735c4f3f19735c3175bdc730c094af0f6b2e30bcbe8bd0b78f812d380a029db18a05a6600c291420c310afa4916f0a21982f18fa4a8e0149cdd81ff17cffc8cd30302063e0f579cee6952091168654f711a1ac6ac8185042258c41d9697010d7e1df1185c306dc1fa22c10998c31ca2ecbf9336a99874b1dfc68c1caf1270b2a04c8f1278b2ab9fa80e3d6c3244486fa70a81cf5d90c384631a32787358fa47368028aa2545ef7218e3f4133589b0a5db1c01194a0d7e1263a6f2e418edcbddd4aef76974ee97df7efe68c7e2bb0b0fc063ac63fbf6d9b4b29af97eff4af97527ef83586e66c62efd5ddedfbadd6ddbf70bef6f4938e5df4bab0ebda6d8459c0e691ef524ad93bb419b6212f53bec94dc8e83716b609745e61c4c208ec1c1d140ba3df7e823b2a99f2154660b3c01a99f2d79cd8ed6e5f6fbd7f819ed47efbb2ebc3eacfedb1cb7e38371bcecdb5d5c7c024f6fa4dc8bd1b76fd059360598661af8149ea635756edbdae6f88ad74d25cf122d1ab024c73d0b3a34dc7cf5c1b7d6f13b8c0d15bccc235810bf4b61f7ddadbecb3dee6679fb56092d1679fb9d663e2dcdc0fe766848d3230c97d8bfd081b61d8dbaf85346deb9f0eca5e031b48a6825817647f9d3bdad09f1f87107141a6ec17c40787b75b2f441b3ab1cbe5f05639bf2bcec8c72bc0d3e9155994711dd1dd7d7b47f90c3643628c7283218551be1e08ce97bcb2eb5b617bfc18f4d1e887e5f1afc0f218742099ea0b8461013fe957c04f023d48a684c82170a8cafeeeafeafc43d2d4d057ae5c49e32667de24b97133447dff5ce36f020afe3139a47f84662cfbeec561f1c849f2b492e9fc609052fe9581e1bc3ee9618f8c87ac1506e9ab38d35f344c10251854c202b60fd83d1bd83ca0cc71940b711f994af5f88ea332c7aaa823e81da31144c96a228c8fcefd2c68da5730d6dab576f69246fb6bdfbf26fe873556a2bca71fce8dfd706eee8773f3920607070747fb706eb2b9f5e8a7dff5fd09a17f8149b0deb0eb2998847ed9635f9221fa8710622df60dd1fd09c1b0bf3e2fcaeecdaecf402221d85f30c97d0cf421b9f9e86f85ebb1ef8d85eb31f0dec7c08bfd0af63110c3b040bffe0a14ec95c4c92ec854fffd5ef0806ff28638d39ff91644092d0a6b4215ea26486b85bea91f374c3f229e807eff8ac496f41ba54a957e0197639432bc0c25323b637ed1646011850ca0dcd9ad477c8d0c9e2864f8f8e5e1228349eeae51ec1cf19de8fec76b3370fe48edce49e79c7766f2afebbaaef8438e8a7fb3bfaeff2656694e787572fc1a57d80f1115095d3f4041adcbd3e3c3b2e1f517bc2e17169632472747b9e3c915fd21a222cf85e6df1fa0a096ecf2f5b62bcda01ca7109e40de5df66a9e1e1f565fe0ad74aee229056fc2b8d301b70e384619a34a0ebdef47830a152952a28c01e55a4a25f61756ffa29556303412c2f8b8de5ed75bfb3013d032fb422e303462c1d0487c6b2fb545fae74bb3727d2a9b50d9fa7dff376ed8b051a3464c0c0ccccb8b8b8be7b5b49c4e2653d7954a1c472261ccc2321a6d9ba66519865dd7bdd6d64a67b69f33ce6c2fa34df6f43dda604fbfa3cdf594669f8c331bf6799cd968c7998dfeb681f4e3f6486ed48fdbc74dc6d0b982473ad3af08fdd1c7c6b1b98fbdfd95342796af1f9ba6f4f763d3748f7d6c1ad36b5bec54a7b64e6d5ffa62a7b667f962e71881e1e76d7ed44030bc1878d5ad0792cefdd8af2ba51a1c27a41fa50c42cd42d259fbb059303eeea50f0ab9f62ffb85b28a0ac2f8a03fdf475fc9143c42871c1f6602d9632f2403a34c09b9c02853cd9aab2c2bd180fdfb03d5d60b23e5702f2987ecde0bc3b24cd3b66d3462b9b04cdb462c98442291300c6be9218b328e5d322a6a9dd8c1a373d8bbf5a0f97abfd47ed786721da48832e170e955bc683a114ad290deeb8735f54355ce616c8197cd317aa6edcafa12c8c9a39b91fd9d28a6c688340d88b20157cecfa8f49e918e2ed871c6b19c5d0d3f81e59563f6f1f3a2cd894c4d70ff8c402d2f1b444a2d7e464714a43aa3d54f144d484ce4a391c39e33056d4e931338beccf167c913728a8df292361c817b090d3c5e14ec782ade283096e3cf12180801d31c7f96b0e25db213e3dd19e3c563e4d003a3a4b1849a0c1eca40acf5d021d29c26b6842e9ae34f4e132368324a1a4b67b2622af9936304863507bb1e2728f2d4f564806d0fc604db1c7f726290434d0a6ccaf12787491684678e3f393a39d4b4ee474e8e4cc5cc4b39feacaae499e3cf0898a8385812131c76390e5d508638d466f4ecf7e18c1c1f4fec5e0e7c5022cf1a6ee4cf0f32a4052253e62f7b0fd9dd83585181fdb3c654602a898ce2b7fc06e2214b5260076160e87c6336c18d415a9cf1831d9851468f0d116807218acaa8a1063330e2bedc81f1213dcb1f2858b77efd9ded8f50804f5404fd20043e0043882b2f36c0010b92d8c186247208e26d567007b5501411081c6f100f3284880b05e894bf8ebb802846d15bba1ccda06612905d01d9a7d041bb9cb45a2035352b40e1fa3c64eafed8410d909aaee9c17e2fc69e8783c499feec924260340699ed41128933284091a2a768170cb6cc09df2142b512a7698188959ab0e60b26d9a9dc906b642caa193d00f0873db5f160544d7dafa909e24143b226d768b1d6340f50f74c6a058735446a6a6a6aeeb535d6c4997e292af0e3c70c70f89abded9355ab219e4cc9944cb54e8d94402d64636e6835b4d65280c35e85ef0305a5a2699d9ef833c56372187f5ca6933872ff953b5cb4e524cef44572f930ab24bba0e0b057cdd33a9eeadfb92cccd3a36535e0b05754c79da76815440685bdf2569fd33d35353a61af3aec95089ae4b057394f6e5829811192433fb560b6cb49abbd179669db4863c1a496122e2acea448deb683c32ef20a90a38822fa54721420dad837210171a69f7e3a38494489f2803bbbd9c074bd20bc9eea24b32430e918e860d845611775112a6bd9688043150a3fc5c32a161f1cc621cffb2177244bf2b8a0bc49f2b61970d845debddf6051aba855d42a6a1575ab28dac8bf52a6f8172d295b2fb3c484176de4ff68e2ee4edc8bf00cc6a42d21a62550ab7fd05efba0a505056675d14539aa86cb113874a0a2558e8e0d182570287776767676644bfe48201974a38608702885a490149242393a3bafa95c224d17c54873bde75c601739093cd506883b7c49cc71a388061c4e9ec923ff3d0f63ff097483a6d01ccafe212a131d808c2cca84dddeb54cd31c6d39e0d0cbeea150233b081cc616502bba4c1401bc94e70d816570e4b073503001c76c75d710f4e8e4b042c12aae8cc0aba18b9229475517da0429286494a4a969758eaeb50c2e86bee09132033c646ab55aad84f80fe1ed2299f2a73fabed1df28b9a100da164aa6fd194da6ab5aabd5a6d3ed47755514f17f508dd304454342b78bb4849abbeac2517ccef49031039c6464dc10222229eb0c1128238410935d08003104d8640c54d33f1450e451091021a7282808930e50a263058828c1f6efa3d21fc19a70653f8c0073744094287333cb0021d8ac08213087104eb669482125a9e8ab995506ae110df9e1743f1830f78a4c8200536407133a74c029fa05d525b829c6b3d18977bd1c0613b711d614c8f4729a4b88db843be7f4c2440cca1f2d40f4ff5a370a50970d84257138dd1616c3e46b9859814e1a489632089d30c79e1897f2185c83b8c4427b414ccde8048115176b1405321c0009ffd131cb690e708cd776f6f95dfe040be8337e14ca0a3d35ad1102254e0c70f2074fa0d7002c50187cd72d252407952048b5575c06107bd2bf1ac54f922fb7750d0e682d843f80afe117f20d06964178686868630146a6a505393b937d1381cd52a945625d6a69cddc4f3743cd7711d1d9d6c4e4f73940c70e83a187bdebf0938fed81f7148c7822efc90342fc894bf37e43a9b131cc6211d1d9d8c435533ecba366aa31027b7c028b434f09c5570d83d56fe3d0fe37b1f90e33b9208916d091cfaeadff330769e95fbb4e481e344754f07b54f4ff76c3a388c4244e4df8b71e398141567fa4742645126e6f8f8456b82c3d6116f620b45690cad09016b5a74ef5616030c476ebe8fe4e608f6a4d3e75fee317e357a7806387efc965d54ebee5ab5d47f46f0c40072fcb1a1e887861d7905bef7e2276251bcd87b2852a054ad9f1d164f4febbc50e401491324a6fa83867c5a4041428e441151e8490b0a119f16fe2833d405a23c2069545fb43109afcfce139f1614d711b6d08fe357d5783db5877a4fe83d34eda488ecef399d931d5fa195ce3544a6fa85ee10266a168f1431d53fc527a6ba25d43faa6853b3030106883b4e88399c06e529ff5146c519ff0d0578c77584de2377701d4ed44f445444b4cac1ae4fd278a89e1f1a724229855b8962e586ecef55ae9f3126c8e667df3045240833c1978fc47311aa1591dfd7758447bc1d44e2b908ceec36a273fccedd3bbc73c88f9a10d8676706515a70032aaadcf813c140762a79f2702b7018a05ea854ad19543575664800000808f315002028100a854362915096059aa6ea031480106b843c7a4e34964984518ee250c818850c018410000020001843688cc8008a73f96b561b046e3adf5cf3b1fd75e55f505b24d7a1ed17e32e6b70d87253cbcf5b6295c63f6446c97ce2d8ec17a5eb9369a3b80b2155329ed509a2aa7c948c3f494c3b3595437f2211bbed1021775db0ba8041364d61925f54ea90405fd24b906a67f75d7a1427d936cec8a559a3a759f5569c477608f714c86be53a5e947e66201022d93988dd256374145a979226543c544c77da92b529489b93cdea41eff96c2d3550a5d237a35423b45b169ca7729551ad180ce6249ed0b3089c030a42cba9259bacf9c528a243030800a7427ca05af4510e7d1935c75c4f836d0c205b0278ffe8ada5d62a808bfd3a3ecce3d2c266e0b6247f14cb2d2d6a14c1511bd4a4213f7d7994cd22437161c57a07bf1445dc34a747f49a56250afe9897b01daae407c52950a08dd29985a79529efc9c0ee4c635acbe85a46eb9f0918623883616c33fce3e3a8b8ca83b29c482b989e0ee44ca86419d17878cd4a29eaf86db700be65abced7efbc3f5d988d60c600dd06eda170c5f0287c2754a139ad6ae67fb47c8e8308821819acef9b95c047950ab27408b64ced66c9570bdc7035c2ed02c2a2c5c862d316c58d6a90952a9e0df436e17d07a6d960136ad5436c264d53f0c309a03910895dde5822524eee20d5a4b0124142a95fe8ce8a632139f14082b13de8ad8d4d0f55859c257fe1208364431f23db879bde3fc795c6ab34df1fcefa2a6da2f477664be6875a86b4f3cc156e81bedbd118b957d36a229f8e4623198f7d4f576f4ada8f387e84935fb452ff9467b2c56d2d2775d7c54b3f6ca4f6e5cc490f8a9b6509b42060675bff4d214fdaa63e5b2afd07e26a83b754889528b8ed3c77fede0ae9670129a518c421939c9aec5586c4af41168adb89489dfbaf466a732f92c715bf9879150b0e3c534d419472bc83002c2cff27d075ca27ab27460b5cfada9dc91d353884141588b4c4832545060acd228041cf7f9b07b04b0f2efb9a24112b8109d6f015ee678346a883050615ab0728d14f4e4f817efbb9bc03d35854116aa10d04f6862cc8e7662d02d2dd698b497fb6a430037e364f7953ff37eacd1c2e2068a4f9a38bde6f5e8319a89b75dc5f9db5b62dfdab27c14a591b907e4ab059171efbb674df2776f46534c396b4b403909eedbdb156f4370ef49b9c3e0500f76236f0c5e7bfabfb2eb60d6a5527ff936041bd60a8922449a1a54eafe6d05cad6695d5b2b94cacfaa3545af9c73b7b0a1c9acb3566c952fd6f29a508109a0c723ef4b67d1f99f36160cc6e53a95b4aee5f6e292d514c05a74909991c829a83295272b32d25a464a39c0c994046fab7e8640684e6ede64dc39e964e5d82e1ed5b3b7f229b09e18e7018802080a785bb6477f9e9cd8aa8d35da76614e81f33b911d1831b206713dacf8800c1dc492a85a2761b3c4366035944a0602782a5272698799340cb8dba2f97756682a28d58b9a3ee8f375c3a78cb24863004f6304f1de7172a9f536f6d728c66515ce0a151bd428b0c4e20521bd559307059dec2bee527dc22d16a610cb8c2d9a8716914b3e79248659b6460e55e05ea852d31ec67b4e655b1bccbeb7e075a055c05ebbb27cb362879f2f5e1c10232dd5a1f5fd4f77b4a14f8dde0b37ee85e0d25374af2f3a4fd2c84e84d2700a2ac89dc89b15ea9b56ef9c68a0041349c5d45a761e0b73c81619361b553b2601a7015df65b9610187338e65c39bc6b2335b2c7b95dac3ae4fe40beb5a28fcafa9b76051c1643823dcf273e6d319fae2d8753462cdba516aa78e22cf657da8ba45833a4a598f5cfcad1c2ec7950338b9722cae2b0733b85c2cba57acc38ae78c591d1386a4d36c4b24aed60abdfcc2fd3ae9190bda530dd8e2aa43d273da85f2db60b162289a402781261a4d4583427c8d5e65766a3203794b53112940cacb9d33c9a7f6a733f7cc69f0b5e9bfa1c96001e684062d119f17200d2ae649c53a88b2057c4428ce31471c38ca111cfae1c7d785c4529a8f5b664ff9bd37a11d1be9b77118e661e364c0c9de09545d597d7e94b8926dc95d72219174f4be39046be3d8155d881730232bd127899defde9cece8686b2ac3812adb80f0a3425f200417e0a06fc51a9b7e3ef8ce310df0abb4b666653eb8255758cbf11f10223d3b780d97497430099c030894a830080404c8da04ff225fcf4f57b3261f7ce0276ccb7f3f33e8c1203f0907fcaad2cf95bba11ac7da7fb891cbad7cd93ffb3bb7a079a2afec80a4e6f493767b38037757672e4a0caa4ed5e4bccf2a9aa1a6b1c72c1aad6e22ad34dab4ea1f9f5577ca17bf4b958de86ae39ce1ea612dc2eab00731a86143c918fda15e0ce53ed5704ecd3f4d24ac395c252991928aee2065fc9ea9e18630eb662abc11e7b3453602fe69451ccf8260a6bab01ca9a53917430883c2fac1188e270354f78bf3f66fc5466a3368153536ae00248ecb00e98fc8c2f668e68f26455bf40dd18587d47c3e3940a71a12f73c6a3fbe482de97120b37f205cda3fe45c51e63d2294135b58e4486a9079e171866415dd46745d3fa2ee2ca5a83b7a71de432890ad5ed0cfbd575e040e01a5881e693afd62715a2f882466d6599af540af53379b14b703ca259474d414977038e5071c5e490007c5785308a6355a1a891dbcf7b08b51eea36275a95640fad6c776c1529363f2efa1a8476fff0368a588d42fcf393ba9c76b7b05318675842d9018ff784a3e65355b14b95b4e9bc06b54a2bed6e9d8d2597c64359eda5949ec29197e46a69a325bf966232b23e9a75ee28bc44e2d375b03ac0226ff82ddd0c0ed14fcf4731df12d2545e6d39fc0b48d09fb12129b328af4be0e551ef84c374c94f190a5edfd985075d20f62d411d509aca1e8982abad89f6f789abce8bb95bc519ededc3585d7940d7b01970ffaf1df37792f698200c5164e872ff42c6be23e90b43518a2f22efb9fe960ff4d86fe342f109eed17d82fe8dcb870437e6a94f110b75613fbf54e76fa7659ec9c4050107e0c9c84a0603d439c2b926567049715d1551b0b57582ba77ca4cbfb4844ceb0bee53e0c113ec23f4dda4359999233241e27bd07934ea3a1a88e80ef718062799da2d687e0dc17b36160ff96a40e70ea0a783e1b133353e82609790c76dbfd0a5d26d9ea3599573e519262eb3d33ff60bbd107701277562a303aae5a0afde1efe26d2387c6baa7b45815744648a6231bf48ea14fefbd2c353ef288f1bb417d007963c3c0ac61f051f5398aad6ac4d11ec53ae8a003871c77e868c78e38e0e83864c9c1e2c04105a7c3210f5c0fd6e21a4c809d5c27171d8e7ab6e0c39d2faf4e1afa198b90b24f4c8936f428a76fd5c9e770b5db59977958a5557aa101a1bfc26d7d7d24e9ec2c750380ca8482c2c264b07a610c53c80f0a895a9f287409a01501f3af719af86aa612bf11091de0c03738a24a09fd7ef293af4d68de6bcf095f873ae54f2b7b88d49282e450fbb2fd8294e19637097b7e0ed375092c60bcf6415bc9fcc8a09497386a69c7327cd22bbb76bdd25c76d14c8546c5c2382af17070546ea79bbf4887cd0ad11f543551586c1c280c9c114d84611faa07c31afa148d152a5808941d46592a686ee558191c2c36cbbaa4ef63be02f3b5d8cb072e88965ac1b84b7737969f9277a5b02671843075bf11ec551c9aa20322897317cb0d7db7364737833967b07606a74c7108cf606d1e8633c5d6f272594b801b529347eaa65cb7f09461dfebf5818da111d001fe8c899c88e6983068340b173b8f82c0db4ebf37f1a839cd465f66121160f9db40f2e97ed4bf16bf9ad12ceaac1f4d86bb6c483943a7bbdda2ff1286b0141f6be4880689e05f4a8bea84e9f3f7f2170074321aed97729daf6407b6b79bf48168054064ac7767794771ab63d7880ef9d206bcd5fc9da22ec264b92af003f2a2f68406ea95c9c1b7d11a0bf318fc2d4f968124781b646f2fe420a6e8604969420723d05056c4a9a09aeea0896e4805a3e0b5b00e8bee1c766447cde99daa178a6cfcfa504106cb7d1eac3647e65733d9b76df939bdfc48151d6a541f050a581727087567cc3e93fb0bdcbf9dfa6861d28b17c67f3869f44c28f4e088accb9700041ca2caec25fa9bb9adc1b1fad6f0e67c77fe092a8b602e73cbefab3e6364a048a7aa1140f88febc4b79949ce9dec3867a801647e6a7c75a6dfd9b8232a7163c7f26b5438a7afecaf326051276d6343cd598cf2df2d820e583d5f395aa5c039bc228f18518be2f5c23776217cc7e84e33936f86ca75cbec9e991640d80bb5e9fee47b055048f036ab6ebe1825b5a29d363b9c15aa078ad88198a1e2973374bc4466c114e6fd10a88a03780647fa04bdc9d83de9b0b925e3584252a00f8c0cf8a02e33f134604f6f490b13285b63295a3d5438f41d2636e332ac8f3b9fd6f4576169f35edcafc7672fa5e086ffc5925519dc97dc1f81607a21c01130bd9f9e62e51979cca3fe4e02072486b3b687b715447ce59a89ffbf63e6a495b41e30053d3c49e675f9932a62aa960285530e931b9d0088124af977a91d2c0cc981d6d7f87f3190d00410310ef3f09e248985f6a371b45e14bf2931ab526d5f112db4a02b07962b6a87aa346e0d34b3c6d26a5bb957432dd7c14a045c1fdbac990dd9c0d9a8748e68c08457a1a0ef703b13586274ba79838b012813af8c4d0045c3ae42624c3239d13524ef8d70b5cc8cf316e787c199625b0d24a00d9cb205948515ef63c399c6d32266b9658333238a658e567e10c2d334c01289264346b6efc31888bffced2a48524b76d19e63824e8dadb36230b44fa71fdb889ef2486f9a39337e637b42ab994fead6615599294b2c912db00954a2af060d101044170549a378de4ce2a9634986ce031207724cf8812b853a536d1fa0795d03fbed8e76d849fd9c81bdbd3f9dc17c363142ad23414bcfb053ce8436005460c7051665818cff07d8bdf4755db84e19f791bcb458681c81462281f157dd00188aeb72ee48791be8d25c8dc1a0227a869bb815e06b3f0e4468ae45990932ddf92d4086e6c6c820b49f689695225fca100076406d805ed9212c2413bb55b6352374b3e2b88608f7c3a56d935e4ede1325fa5f2e8a41bba6fbda48e4f432786421e52f008e37dd2a01bd72ab5cb3150054634a9d9d8b5668363ca0c64d222799d1fe69968af3d9e3d012e0144fe3687ae5d1a496369fb326af60c46e8a2fec726ab0b59640d0d30329896053f1a2acb63da0e122e5e4ea3fb52404bf4468db52382fe698e7cefc145ce45d300bda509668691054b0f4368c266b4e092592b9d8c005b80caa23be18c20197e1cb1a106203463d485cf29e53fb8fe2b91e3093d410904ffbc2d4fe6cbf76ca07022daab3282e26d1a99169b29a401acaeb32f93adb9e4f7c6dcc0cecf761d6b551cca0dee67fcb576766a7d143f13d279acbb97c77b9489bb132ecfd0608a1aabd99c730edce6749032247625ee849d566e61e36aec149c1ab9c5dcfd1ef5f2aca6c0f00d974c5389fd6a3e63fd0ae6286387e10cd7f797652163d62482a608805c4b57462533bc8cf68aa17011351b31a1846f0b9f02d15d422af7e208cb43d774e3ecc3588ac60c80680b28bb8912d2e5194f89d960bea7f7c670257ed368c3b0e341aa4168274ac5b6ba6628c14588405fe2196d0f493b4d825900f3cb7e0c7c2891b73f831671c60e4495eabddb7440e5fc4d9971f03644094a8c215f3449a13147acb1cee70028be0903de00a71a36ad000842b85cd1d49d706f4095c313b42a2409ed16df9610d08f41dbce05925d00fdf543acc0cb7beae539f15f8472138e997f010609f7748532acc79296c6e6aeb166ef82b0888609010ef8306cca221d3ab2638f167a4be6a1ee88a8ba1fa790d0c0b43ca816222e6d8234efec090db8befa5b9d994bfc9da03670f2175e97844303e7ebd0f2e1d103a9ef9c5c78f394eec84cbfabdf787189745bdecc976cf59c357e6bfff86f06fb2713abaead09190533e99d5556988b76534b57bd5a9bed515efaf246f1d889906f095a13bfac7a48ef410356dbc0b393c6ece830bd7cda24e8a9c377b8b3ffc8b10da033358006c0c34b8206da1ae2ec312422b4c059e98c7c2e19b8a1f32375bc06086aa06840126d3d422042a4e56611b053848b6d54821865a929a9f227fbc13786700ffdbdc1f26f0a5edb142a44d6dea2303be3aa22787e1ee0c2f7632575492d4c7340a70d01231a7b6df30c274f2e0d932e541b6353494c6e83e8dca8c189b5c301382a1d168b9d35a5a90577edf3306e8916e9e5e4590fe0ba0cae9b53d142c9842623b6fb0b4a7093dd17be4f5dc456330c0de33f5fc8fa2259ea4a6446ac327b75a1686354fa0cdc71b8458cc2cc705dc38b41009bd5b14bea75aa19c2f8ad329a4d7e67d657a49f743d1e003289988a33bdc2ab516638f6050285be863711234a6354922c62507648a977c97ca6731b03f537aadeaa472435dd170f1b4cf23076c6b18de32e9606df367bbbada2e608e51ecb399bda3356c691dfb3ad5d5cb2692acc8c6fe60111dc42d582874fe9c217579f1365ab803786ab88a2b4028e7019444ae1e1206e8d886a25b307c0a27214b315eebe5fc205c798b77e6e4c7ccfecded476cbb9920f2092625fa725a7f0ee67bf480b5f723755e3f346dc422d990770d37d9e8b40f8c8c34244d9544429d9a39470143248472fa79189786eb5ae5fca2060ae57afcc7b0712442508292d97d0c678d3351b471a23b1335a7b60d5a2426f07931ae22517c004d9c4b4c1004554ec0ac98b58977860a0b966333792a10303263eba7354a153fc292a8038ab24232b0347e645a30fb444b01a5680efdfa1da8748975fa790a7c011ed842040c53dc80b8e38f4cf60dd1c489ce9190dd3892cd27eee3311c3ddc6ab55b9b5cadf67ed4de591842d2640ae0f074b5ab6522251ae8d11ce2b0e26ef0434599d70da493eadfd77e938803075dcd8d830fb42b7402ba3b06d2c00472129d0bfd6350b0ea607a0447a7981f4f1483ff9b32a60fa8f3c340404bf7ad8ef105c5f01fa7a45fc97c1f15a582f9c1580a49b068b0cc7c77fdaf7d29aae796de749846803759de5b3273647588a4154d90aa817ed1bc004d8f16ebd2a8c30d9d6841d64ab27a6bc372c24b950222691d7f3adecf79f9507f9d878ef000966e74f6009d857d68b71619fa65b84ba90c0028abc31dea7ebc98603755467d79838ba759da589c9615bd38f419c89b0eb1146606879798d7dca2f1d0fdbaab9e648d12b553cad263824c4a6ac39cd545f0a42f814f960f3204eee2709345a0ede4ebecc6a3ef17d36b8a581f786fd7b850255cdc42d72b56acbdebe44f6cdd09f3ac6515dad6b27ddeeb08090bc2b309ced69970a1733152d1e8e9b1e0098eb0819b8b1f6939014d9458c62acbb0f1346ce04f22a7249c2315a3d945451df1e715a15550d31753506b07966c654e4728d873fb1dd6721e20dd3910ae8ee72dd9fd9a013053412257d90a179888aebf3b948263d492323f0d54f91dbba3487a70bb095078594922fa37f8a814522d3881c46aa2bb373a72f5092e38e922f6ef55833717f7a37c05b6a245cc1df935f3371f3891a0970630148ffe11079a4ff11156a1e2986240d685fa1a033f26afd5dfa4aae5363fca90f8c5dd17645c1d6a25ee0dae104ad2b936e01e8fcaa6a2c09d1ead762dcf6d376b0192c335a7babaf3ac7470e42570e13def647019374c9f81bfc5ecb1b75621c02cc4fc8c4cf16ad26e3a6af9c7dac9d5be888c4bdc0eb13ba25b1bacb13b2941e1d2f48f82da3eb18af42762f0e513bf9dfcc13d1952cca35bde4889b3a871c1fb9dae9d46f85e8f2032bd17dd89f12ee74e443b5fffb79f3bd02b739c9804c6f59d1736909c1d05d77f9fb6a5872595b07d091febdfa8d19e3243b402a00041ad1f25737d8a5e2e337df40aff288c30b7552f29ea6550d3bc952af570064eb9e802044137889994140287f9a1e69819c4381d451c41ec65715cd81e4da4d3def6c263f5494fb0e2e63aa582f3d647c9f6ea3fabcfc7b27d63c1d2732ca481d4441f2ab99434a344d7a8a42d5608c17a2b740d86c30a89a0b2372ec61639dafd6df2ba18c35741d0056b1004b60fadd210fc1773b905feb8b2516383e84d6378c4588e0c2a19a3e78962a011cacdef2b2fca61fafb97f2ceb7a8ebdd8f9ce7454ca338d33f174343842567c02b465358403032c98ef3e648058b6501fd41a95dcaaddd8bf865186266dc3b26e149b718aeb3616320ffacfe7bfa76c01a76e4f8c6c21aca3fae561bd83707659b26266831ad91cbc175d4015a03e6bbe9cc29c4b11f5439cd362083963a372fbe27357eaa3e073cb5a2fdec028f152a72dc9fa9215aef270945ce86acd8db1dae49041cb30a29bd0dc81e510b3fc632cd67bcd65bac63f1341509a613a770f7e5cedb4ca3281ea22a99a8963edf1e76795c98d81264720ebd04efef1ed4cddfe318340949847b763d84bbd8fbd883ff31d27e9d611a362b5b82df75dd062f6a742d306a70e3ed7a8af9d102d309a83fe07f48fe611a897efff7fe720697c01aa3428444cdde7cfcc7cc2e16456d8a0a9597a35e3431babe4172b29d881f9a9a5cbd8ef5b8f302ef70a7e2bcd60b8e2fbbd42ef6a0c793779e164bb2a80f90e1ac1506fd44af28c34c2b1aafcb7fa1896f892992dc190262404d7c61edf09f4d0520bb5fba109318b409b9de408c660b54e522e5e8220812fc60dd4218071033350e8fb4986389200602a745c17e7e6e3ba514d3de493227727c55bc847c5208176cd4d82665c12ce2222ed13baba4030ceab772175b906f73b80e5ed3923ac04a4e403d516a36de5fa72da0a5f614b6df575cc95111591bff9604d23fb2b6f7a8202ff771035e5232f62321a9458fff3b40e7dbc469818b17501bdba3cb159f3a7a293307ba521c6d8e1a1b016d7df2b831d7abfb715db09276634ebb85df757363b6635a6ba8b72a9f2f092760871c0bcf009f973e93de7075830897f80ec8da728ba491b78db0617bba1a2812eed9a2d0e666ba9d6e4e917b084bc8e092dec15c149382b6017d002755ac9e00f39397749d37d8d738e43c84ac12e50f2cb2804aa9c2cdace39899f5221d141509800b5c6f92f9bb6f733ee090dc58500de962955a4e80dca430cd91ffb67d632b51b05b6259c30c822e1cc5a497af58d8437eada407b028f4064416825ded166a262f463840534a8fa07d7d05983a12f22f18991b118f2fefa240220ec84b979e201ffa0d5491397aef9a4b07df63026de4eef9767fbaa577bf788cc2f4ec4cdf952c546a7f0b33b89f730a3283e30e21ecaa50dd1881ea192b741d23cfd9194ad49326f9f0e08bc146eed17e517650605676b9d7c6ed676bea9588b1075cc76725f06da2f342cc81851f54f9d1aa94364e415ea023500953597b7c2bf902b912148e0a8877b3ea68724dcdc170519c1b1fab86df438908444f23439ca06d1da6441713d1cbd8068c44a48af0f29bc41e0e7828ba1b4f90073d6e62711cc1bde467b8efeace4e6dcdaf283870b5d04f4aae977f70a318c2cdc250705fd4675881807c79d495c8d992f0f15c31e7ed91f92d710b5d8a025f6915ab2b5ed63efbd55f9c4bc31b04701d740952bd2748ac7086ae94ff9dddec842fd9ae47c04549663a6f60e28fc2f544665538e3e189551d0cf344a5c29c9caf97ab4ee06ffaa7253eb4d333df42efe7c9578db0756bcd584eecd8c595f8c0ab8ed7e2d4598356db777c755beef9694b43f50a9db025459d58da46ec499dd4ea12c880ab7fc283e823038cdea98935f8d6459e647db726a6ebad47802d95400451dfeb8409a32f522f30264611efe1b7db2196fd7a16ec91234f2a0024f73b3856c0088b4aa1b7cf3ef41fa45aacefbf5d69dca4e6aa8be2843aa9cb8bb469349444c26b38d5d983a5f335ba1e58bd8731372d2f2158a83d093acf0e157052cd5a9e19ca7dd30504330f830ac0a57f69106fb76e397c1b44436b50ba7474098c48585dab7c848b556e0fd0d6948855d8a8808368c702b4dad8b75c06dc6f1dc4a92e3b0502f7ac1fd990b77fad0c0d1b75b34bfde01c03179299938bf5f76f80903002f6411a5d8b540fd2227c0086d9eef1d369e076d10236c0101c495ea046dd1e757db7ed56ddefe09793bbd7bef808638e11aec34d6f3c3ebe3f618db0a5564763cf5df1d4fa47d00632f89df7f9a7c56b29eb5d474054873399c984806c4ff5dfb6c5a21f2462756be3c0f419def4725f14a7f80450ceb1100dc3cc2fddca248226fab3f9d05a948735a71f40175d706d52cbbf2aa0e624532d4231511a31e63b431dfd8585eac369f8ee5b5c9067de6581ffa8ab0f78ef04ad583cb2b22879631865414eea28fe678c5b65ced543bf9bee50175c198eb16a891ed9232948f0fbef6691986a3a1b9b1e797832d93981b9127bde12cde4b423118cfa9aeaae1caaa94350e8878040c4aa98a22d74a19caef89bbc72d0ce8f992a4fea3b0ba9f88a039734152dfc7d91762df25d1b14609dd9a2b213c960860d401ce86b8d9e09c741c4031b59ce6c03e9a13210ff8b3d644580419e83c80ece3acf86aaf95f781322e5e86e92c5e109e90d8f565392b802f7b99908bd9110e233309bffb01c2abb3e92f8b3af84b06165e4e1940aa3c49bff9ed978c40c18e2d4a8c38f3c4f468e2f0fad6b515294bb34beb8ed02fb8a559683c5d6f51ddbd8ba61b42910856ac5e2f427b2e295c3ee8f695cdc4ed7d452510e00002bbcb95dd53a37c20075bc25ba340b942de7a0f1d8ddb4b117406e68d9daec253d08c62d6bf46b0941c1abc9b2741f6b6ac00c7fb068d87012753fdbf2af95022c45146a3f99196842051a4a35e7690a807d9c8655501e138f5768817eed2294220fa20d2c6656734bae107a533090bb93d2b0aae596e8ad606246e739c9db72715621dddf6bd9c146836c765addd8a153734f2902b6ca7d4d5a5fb1bccc4dbbc7cced12881b7df01889f2b847884afd47bed2878e7752d0bfa27dadb39f7a898f8e80c92e57f812e880ca1b6b6402c26d2f27f990f31c7c615fc324635331a15552e0026bb8a40058bdb6ecff6bb7483219094d6338737a9d93f8f40bf21e8781bc807c18dccdec803821f9423114c3b7fe4db8779b56b387ae40ce120ac0386f92af4594564d8cca681189cbc18423e7e1c877750f100e224b378d81268f7c2401b93f9fa0a232558edc7918b133e5cea8cb76994b252f0d06405b0a67c77738d01c29b74aaa193f3e8779aa5ee96b14c1628145bea57bc7d60a480ba03187a803d366f1d3ae750fa047beb0c158b475042d086ddf500bf29d91016cd18a03489e2d582f8c6c4b53c0869299dfdad0266d002f4d6b0c682cdb0abb4d166f04cba0a3ca101ac4f0fccf830dd1cf8e6423f8c616b64fc26af00e628f867d2f7bacb28f6d89566426cc78e12b22191c7186aa35ca08e22c82609864a690468d628ae0dd6188035e4167912ed8c2d041c6b9ff754b818023e56c3bd9c9739523ceea25892176f33c0c187d04953307284a8e67bf9a3f7704189c10329df14912fcf4ce4476350eaca90b9495a29ac9c8c1412ee5aee060501aefa84f0bb732e0e762390ee93a0fb957ef281a2d36ef671ef1f9f81b1df35d335122edaf5dc7629d8b2f3ae16a4f6f47e695af1278a7b93c9af406dfa88178f0863ea727e1916011b2e95bb034a2c81f3722c11fa52a5eb6a750345448e4316f26a3076efa175e8b917a40552dac803f9f34ca375d58a255f0668373cfac6cf4185ad8a3c04bb254127c98cdd69aa0407ba685d2b08d7b3243df69b8e23f5b7415d871e6dbb1d97c9838d1f882ba5669ce96388e6e9fe6f31602b197d0625a73b3a8237292d706612fb7577812f78a8fbb57c4fc21d668ef1523d71525118842435bbfd83989a35f5990aa6096ddf58c5843ffebee45208d01740d569295fa3a6cad79d22224bcf4e5c749303ec4e093195d1463b5b8ead0e8da96303dce4d3040ca0becc052cafcaa09ef60e0a908286a72c4bbce55bd2995406fac355fd723d06cf1ea0181d95143c1f847d94644188bac0974c7b79a92b520297256a8dae9c731b313cec730924d3225ce1e1a8de9efc13c9798cfcdaf87eacca970656120a46eedaedca7b4c0e0a096ad8972dadf97ae83da77534e5269fb1bcffef45c826df2c67c35f77b2683b7a85efe09caf03a91a19e7c8ba5342e6e867e95814601837b869797d083b4b79a396b4155a9c1144fc796aa226f3dfb05f5d6e8b595eb28422fe9e316c618839367ab0a683ff37acac6fbe88b2c131525dc5292a20e4b0855ffa9bba0b784580942b3e7846977d3fcc3b340961bf9c802db75687561549692f4ccba71009597324474c25873c156d041529ad9d4db04c6fae38c1addcb9d89514db0f612dda9ca54021c80bf83a946fe37429ae342db3e08988a6f0ca849f5781c8a42ced6f6c73d930646d7944947f906bd9106d64e198c7cdd0fab75aa3bea079c209a221e2b7aefc005d853bcd429694535c953e43bcdfe5269417437f57175239b6a7f1c106b4e42d61864acd48f89787157a52e7ee79e0e7bc0cf2e1e4de33f9f8b1f2b8234ec16b0827bf1d1deb8c16a5467d94fbedacb96f05fb77bbd8c6156fa625e67b7bbced7a7ab58c94283e9bec002329613d49db9afd3eff4396848ac5e82cc4e3059c2939a7b17b8ffc9e5a1d616490d4c92e928cd1765635f395b528ece411256c34b4918f12e187a0c936ee81b142e430ccb43c2b3661ae9fe1bd0a11dec9b6b309f03ce362d70cad8ac1e20dce0d479a945f81ec8eaf1f3915c67cd41461b33d0a8edd03470159bb9bb4f340f8460e5f3fbebaf398af5f8a3c7198a032317e4645b19f29ad566576827482d56e3d38bb20f62fccfe91dfd9d140ed25e50cf7682def96d55e32dcdb315cdee8288bc2afd1beca5d2aa9ca0ae818c714541194382a47d32919d0000a520d0f7ab890e0e4121f4c0d52f6108b1909d6a39d65eeb527cc19361f05f04b1e060e0c933591953f034fbb64dc9246ae07859fafa1cc07df3c6ecdec0b2d95712221dac126247131c6ff5af35612fe6c3b722469c49e0ade12b36971db444436040c0b73b0ebe4bf965e390fe095cdfbdf7ad3f7c0e933716003ed93bbb65e6f67e649d6a1953e44b00967a096ad9035061f7ddea44ab9d11645624fa33caf8d838c224ab8a757b64e0b5b4dd681a15f985571fe1e34091c0de39f0107e52d5c9600cc31fa3246f783a186be07f244941fa756821969253b1bb0c5c821b1834159a17985d7d73c724ae44cd4e9174bb81790bd8b84a88b3d13592352d7c797dc067665e1143c1136d439ee8ac6b0632d10d1994b08f3d8b500ab38a4f8b6c573bfd6f0f79c89f9479a87a0d73e87e77baf6bd09088ff4f05d62afbdf4fbf4ba71b07ae890b18cec236e6186783682a92141e4c41a33589208d64b6bcfa039b053e788a28282436108fa8f0dc4461ace4f8f4643c2ec81f088d5c214b3e6c820fe2b2968dc131084281e9c1ebc6626bbb309cafeccb93d6868468a8a2ad1deab4b8fd0da556fdc3bcd04a868ae643e122169cac14937d9a194f9b6fdfb8a5bdf06a6b5a5419fb6a431a11952d3af50f063a40635bc48120f7536c279385c91d93b47ba289f34c091172bd306a6cd62272246e87668d2d3f62bda555e9445677d662e0eb815c45565239389cee098d5c6f2710668402d6b939883065a329f24c27bc1dc1055039fd279e4379952008ab09bbfbca903056dd04c48bc92608883ee5bcd6d6a292ac1b50d03b41bd677a7cab48f0551c6e00b04945afdca57a9857d3adb4faf5e7da8e5b22b2833ed1ce791923cb6cbf8d73c03a5f97d368456f3cd710cc7edc16c2997603172044a41bb6c44cac54f55307c326780449d7b19e0ed9d3f4ad07864020cc593303c8ec58b6c59eccce24e58834ecac48e687d1fa9874f9dd4e36a8d983f220c446ab84e5d3d52a652826849a59c6276b9754e00dd221a3841b733e87224020114156bc07c1fc02ab70c9688e2420a09a5b4d33f0fdd29a416c65bc1992e3c6330dd7d49b4ea26000da0b4620d56b0309ff4022914d5bd0cb019650087005105ccb0424980c12b1199f208d2d5dcadad5d1a2baf4184ae5f794cb89df4c02b7486345aa2241de59b732315462223b797b9d3826b071a0ad1c71ed8433bff57f325624ff86fe00f72242f2b89d134a22cc8f2b9871adddd56e3029fd9f2de81d35f86355ea843534a54eb9ffe7de5685e9f75e1241dd40fd89a9a28dc5a323e69493a1af156cb82572c58c3f9139c89a093b1415d2a3eeb13b8715329e119b6b70ca36cc3c1cc08772adf7d0511d90f346a1ddf48fd5d03b189b5af8f30ad37572d675f466ac9ba0819c0e07ad45639f5f8570f83892ed8f957b5c4c7660419192a2f04110040ef7944d3f770eb8a17fde4924a50866e413942cd1f900b716fa058f229ab6850d6f32c4556d2c1c135df76a8a695e7e22ed7250078f3da054da07e2fd6c09f443ee1c51db3ca4755ece367cd86d1320e5d0e0495bbc1fde56d767a78dd568c3b37dcb779cda2270290ffd6dd30dd77fea69461b96b0764909cfc7a08dabae222944992d2e077d69dbb1f179630da658e7387cf24223ad9527175e026fe12a3a2d48e338411393051161a63b966f67969fba6c246e1ece23b73d5326dd86c932896fd69c57bf43adc40769fd6f4657752ae66e2ff94c62041775777ddb43a6ba3d35a19418a6878d60c035ecec116e53f925459734e7413ec49cae2e9e1012b8615544febad096a76d75807439c1280a7eb8e1c4dd93708e60099f2424b9852e32ae0d283f816adb875db5ee34f15fd0b77e8dd1816afc4b6e3f000feb4892d1bbf1aa8d4077a1241fd10e4c46babb2fe6a8d5a76a70f9989c464acf445c1e599d9ebaf813825ae018124acb430e3084ff1756eba3c7cdb122e1302bf0a5005b71495efc4e4dc102ac7489f44329f27d33a7e1012f6ec07600dd25ecea645af85725f28d43970f0bd8dcf2534225a375ed77384745c7d5c6fe3f73082d56729c305e9f18b222f09f3505e0e0453da0669d8108031a71d2a9897c825b0e3ea53425eec433c08ae75f4cbc5104d6576f3745bb5a8053151e8a83eafb5062ef384f8b00bdbb4697b9baf4ee96406b320fab561c67b212b4ae1ce6ae1b3fa5c2d5e86f011adc0d7661e7881781eb3cac1afea24c839875384eefcfd5614a42738b0d22604fa621ac154b7c2794fbd604b6ae91b8d198ecb8f056d67e87d353287611a39401c3bb1997b9c58c9cf5bcd302486405c809a15fef7d351b2ad8d0d0700e9c1f1510c028f2baeb952e9732b12d788807aead523a0aec109129824e354ca1fe8a631b9294439c31dc276554dc75be8864721242d72539d6d877c47b774947c5af41a93cdf7b20b6dffefd1ed4d727a6d1bd431f32ec5c841c654269820b8f181ab6d11b0b65e5ac9f46a7d50a0c4bc20d2c3cc879229d3a5aa6c6d6f8604318b4be64f78c4badc242866201de3ec300bbb0610a6c77798879be8ae229f5356927ce71f3facf439cca2a0586d625be205f45572423318447cac37fb1c662b7f241a09c1c23e32177e7b2523403f155525345594eba6d41f31822856ea004151384202d840d9f58fb1aaab7b9f45cbfe8eeb59b9ce41612d9368009c65781ac40e20a330ff0774272697396fe571a58c1f9f7535738f60c0a2681ac1d775873731e1e9a5fa1f1983416999c2b0eebc39a9612dbcbc6ce7bf4b0fb1e7c23cf08b618ea4b3d2f633a205034fdee97b20b86c018db15097d05515fe262db2302dda3ba4b840c830e3fcd7a43ceb93edddd8f594495650db18497d066a709850b0d115e32449ac0ed6f2c5a5c5f7c54eca0d25755ebd19d703f4ccbabea21b06f4a4c98f11d34ab2e9994e3209e6d63d1cd88247e6313e4fa13852652ed2bf39bacfbd856cee132cf9ec5c9635e92be6054d2f537808ceed6a1d77c2c1f87d8b182fe98038cf191fc0aac41fac8e604c05c331c4971ae57422cbd1199991b665391c6155202cc8384f5a5fd0116378308bf1ad3793f141d9643d9696eab11b5d963f006e51c181a33366bd805e184ef2230ff0c92cad62d90d12b31e1756f5d1c686ea0d3068f34e956799aa725902a2acba86529cf512a6cd3032afc47a5ffaf533e52bc533f0ee60601fb427a071594fafe9578b802f9d62dccf6fe062777ef5e24957e8f27dceaad579d7e0cb1d7995c5e7ae4117db79eb9707ba42d76f73d6ac8e3b86a32f895f697cda902542148b250a8f1d19c8076564f8e90e7bf045a5f1d1cda9e97ed5c7ff2aa90305a9df79c01e88558d1e5140bb002958f95cf0ecae66354ad99e9f5b4e8b7fc701e036b38c4bb44d2ef35eb21565174f5987fd0d5a1d3dad757a324aab850aad5ed5c0ab2e5dc8fac8d54720db9c4498439b05cb64e87450ff1f8d1267016982eb41ef31438a49813d5a67a00edc6bf6f5d5c309762a005646d445d92803244b508cfbf8055ff8fae2b28be59d29979c271c1055fdd514c44652b7f62225d7da6ae839e45c00da92553966ea8270c156751f064a1895cbfd61c58adc4c71adbf9a4536091e494e6422a2950ef131023d31630a1c6dbd16fce6f53449a1e87144a25ab0cc9589fa3011c75c05769a30e13664be31d4a2eda0ee37aa8550667dbf65362c16ddada6c41b14c061005077bb4a9431ddd84a3afd5a70abb40a397e332cf435191a9fd58ff7c731be7f56b5c8575719c0f73f1141d432e04bc5f3afb8e4966392ab51010a32cce25cdc4db5c8797d9859597aa12c53d8899fd04e1859b657e51ff219675f709e2132f2752b98fa524933f20d6c47819e5c1f6f5b62d030472333ea67819fb6998fb7a0dde28e079bc19aaa697dfd5e8fbf6b276fedeaa073f8e27d8ebac579e7d08b9ddcd5c5c72e4117db792b5767ddc3d7b7f35496cebb435e6cf2ae2fa343c9bb57bbafa7ab563df481eb16cc91913b1b93868de7d36eece3cc92c879acb8810a8a74d7470eca25dbbf48e9e5a63d14e73e49d01c1249e58ef7d87f283b9eb8d201a249265d71c151f6924207af5ac3cba296cb5ea2440acc19fe5f6be946e394cf76e0cc13766b942c58d12c3f6b27fe24bbc62c42de97b3af0df47f61f2338d7b6f483ee3f0efd8f96711f2be9c7d2d981861602c75dc9c5cfbc21e5e5b2070dbca179942835e9d3e8f654c5bc50f67f0e601f728607b12a2afeab3a7fef1ae3fe0076baa5be6aaae1ff12947a11d9ab4d0e95bc2f2c28e4eb12980ad778d97ee2a56f10b33cd37599ff90f6831902ef891f651f0b8a63d7675ff75d4ef7508a8a9b76865343499a6d1c569f81ccccd8d4fb7b77e34cd1286a2cc1ff6f3f8a0f505eac5590c7f37abff1ff0395cceb21997f246179d988eadeaebeae7505a620267170e2f1d5baa9e66df91eb5dc5ce4dea0c2f13857ce32e9c7af582edda0bc87c75c582ae848426917b20f04b30f29976e0043d435bbcb0bd4d2b16007220464b022a7f5b11dd32b61b4bdba2e6f7030d4721ae8e016b0a960a09900ca6733aed19fcf87d6c6ae540e345232772e829d804e4f43e37c94635ad1f92d0e40320bf4c84f019792c76fbca8792018e811fa99d9b6f399e89b44fe4fa70469e19ea00d3f9a599ed94b92fe5d1abf44ec7cf32fe76210294d7e22d4816610e72d0e486980bd1898d5447796b67780dbbc16e1755636e4eedf1d5016236d893b1ce26d34eebe6c58440edbd244332392388f631961383a2b634d8cf827f4b25846c4d3e9df7892f3c1a38b38064173c1f279814fdea3ee91eca2392bb740718dbd9342be45867ec1403c8ead9e942c12306a49c5afcee10f7aa50dba1b23d9117c576e11c459c1a92649f4ef0ba252a61071c34a0f6cdd4feee300c30b837602857ba93a114735c2671353b8de002144e78c678ecf4173549050f454aacd6221099c0a108e9a34a7fcb35b071b39deadc85ad865a24b2d0b3f703a93ef29ae507d4f307dddfa78381783882c7e2364008eb700e044225338fde82a5b454e152bd174e0142e62ab0a9fa8be65119ae72612fde7f23d61f8e14b8f5ede1e829539b48da3bc9d5ea090e001b4b5c9b4da3f0c5a9883e71220bf6d85eda553d5440bb4015675f0962e6c0986b18632ea9e39a4518a516bc1a8791d9a31f0ac731e41278f7b7214d2ecfb11a7f5a1ba4d0f0f624b827966f4b550da5513de6019b75640dc0ae4caddb4017e4f282d59be08966cf423a537382a65c11e6e973b1e5a5aedbf1491349cca27ac8036990a149c3faffaf7a109af1cb0f1268a45c90e8df6b057123d67d325b904811a06bee5c11bf0fe90a4834e9b8eb9836db9228e303f63e5348cb5747689f07905349870a74d673d8b5bee4b6ca79ab65fda1e32d41f3d82a7aff92fa2ac59c29084a5042e1dd459a961c892c41404c8ee77060d87c50449715742878c854b02c4ed0f75e26a8ad3a663a3dd91c0d09f638cf07d24bf6260d4bec7d29b2d793600e6f9bd7d20c0a8e7a113354c46718a9ee081f16d4f51beec4dd700c59786a744f5a4c150dd09f3632559580084b055cfd255642940f4b2792df304b911cefd5988d41d98fd8ba4cb49ebf63889adb801cca6ad1377b4d083b54e7decde49c630376b5d3f06f63ecf32f7be4892105600e1684843968911cbaf46ebb4c419a9a89e307ab75c158af7347f3579cc932695321d6bca147a18785d0c2cd02f2d6370cab9c9d84ed454fc5bb3b5360d94a643027fe53590a267a98ded877aea1165e0d6b57eb9c6f65875d8b35a64adc9ea8c5b2ce02a48ae629d6baaafa9445d7500b03c589b0a17daf32db72d61c96afc74a51099b12f07534d1b3ebc0e64b23c729b1b135e982a0068892fcbc0f01b78e488bb4871cb9ac60c03e435fdcaf0b1523f272efa9827afdb7285907bb202f9ee8a1a258564af1e2fd0aa80f576cf522a55cfee9a381530148eb2ec172a5ab35d8ffb445bcaf4a8b067a69151c0529245d4f345606a79272435a0d8872a58f9f4610949f81d9127a61c903d7cc8c4a75da8e013901d1717dee67c3cca256289ad33af6cd7352b707f464d926bf5f9d9e580246a3220aef0a94e6e2e73439074596996b3d5ed4b6b4eb1a4f245bfebfe724123645fd37e19c74d08592cdab1fa220af90a2bc1e12efbc92b12956ba464cf33a1acb3c25f267b7e9787a840f5cd31d00788a5d8cfd8ba77f2fece7171917b1e18f54e58b9d5f28097ebd00e73717ed5dd42c140870908e961709324543af5edf568c1fa1ae9b0e908d7667a414f9bb1b0e90e7ee9a558b50ab8735b1fdb94ce5d6812ccbb6b22108e2771c68803306250cf33f4bf44576a2bf116de3691d9a94ed597652bbd6f4e9fc9aa1f5fa5aff735fcfcfc4406f1d54b2c633c30f00d365019cdbe287057962f5c6274f64a72292176d0b70192b0b03ef9286a9125fbea028a931ebedb999b20f62397ea0fd979a3c1a198edbfe1e954ca01b26d7b592bb1dd67fb826ab54e1d27f6e98269f86b547a83c0015a525277a2b446f4cc534166baf10bdd520afbbb02511abfe3a1147346097c06f0b590f7dc7d3995f3fe29bbfad06feb653aa1f21b702bb93a7627cc5364f236a182eac6fb4eb9095aaa30b5aed20168240797f6d81717845dbcfd59d2c9a8f7842c6c44c02b39396424125c93785a1fb7874c61294dd5df531075be94ec3c06a948909e1a1af00a0ab6f76bc776f2f35a485ff8e9fae5ea3f823f6c868c7a39a3d6d81e938dcbb7910cb3e3b80cf7942d703c506e3813c71eb88c050db812413da5be0d59e2b610f83a9e3ba263031438da2bc74055b41f17819dd90321cd74aa4b882f495e3eb076bfda70bd389c66ce029160fd1219d7d9e10539bb8735be85e432656fae8bf86b6d463254dd5ce060434d6f62ebb15eb197e76dac56f52fbeb27cb1d807589e60914ac406cf4d0370c7aa444333a270b35521c39367f191ce90ff9f9591187bfe441d8210a3be8788c1b84f8f6bdd2327045a261005f48905856dc39dfb57103fb42c984b69be236e0f3a26724d59a2c698f974f8d4333bbccba43a14de714f953659329eb4867b3ec0dde06b259611063f698afa1ce48b2a1493326f361c8400be1885232cd3a3226912a57f1ef491c5bcabf9cfa75d41b54d43f6f17608fce9e56fdae6112f5db20762779e2baa3f705668f8c5d00a7b73d2cef32b04d664fbda1e8f2a38f806228feec1c1136c68a11ff61568122c228dc289e6b8a94de4268444426a08565fe5be7b22ed4577dcbd3d0cc35490efe0345fc3040f0023cebb20749013af9acff76cfd418a8a5fade0218914f3ecd41e83fc98cdd8005184804f953b380f096420d671f34bc6c728effbec7accce8b8cbc84cfcee73debbaf1371b017015a08a67947d5ae44803120c8ec3e01b72a10e56a40a1ad506630a4babc456f4235170fffa5ef87352521511c6281298132539f857e953d8f70ac053535b4bb9a2fef4daef72b0a9b900391367a78b06d2a9ad6e6010d12bcf596387cfeb1af06a8e53f29191effd98986d91a44da022b4fe2a8203c4673f42d121a611c5486f328d307cb03786aa4c2f116c4f553967a47e0edd0936e729ac4dee4edfb3fd70b92f5603190fbba42de1eb822e6cdb78c27b85efcc74756857751e0c854b50e0f23e2255318bea22ffb07f4052eadf085db96e6099e96faa37d4029388cc2b052f2f317ce7f239643977211f9cc3e62637cf466a1d21573aa09e44154403204d7d0ac38ba63fdf1b7aae0554832d17ab215712d3f053c58abefe79f5df60b083e39375fc1c1f6e105f6799e0d106de8006153138cb2ca17e16c123aac3a7f7b41427d969c7f4b27bfa72f52a288b01c27b0f6594773fa68f2632dbc4d2625aed5895a9974fe2843ed2f5c490244f4c7324df40b431a5643099f8b2c4b4249e09138fe5699efb672cf64ef3939e01754cb0b6086c94c7278a31996a529852d5ae361401162f1f29ef7646c2635ff62c3c2230435ec7b213040c3ba574c9515520d18aa8435680bdef37dd6f4ea1926dfc221185c4f3377683fd68c3475f248b7dc820deb6a1748225ed4fe0beb5cec1eef45aa2619fa5a19fe00befcbf1e5aafca40180700857a7840cc9daa30faf142c4ddbeac4b9bbae9ccc614756993e60244c24ba34657cc1f493e59e42f7ac5c528b173648dc78929c209cfe317f3c1f1153a744350fdeba51ff857d0b82ca0553e09b14c489ba3fb5ea9306d44fe441460ea3f31bb3422487b306a9e874358cf00303051fa4cf41c8bc9929e49a1bed09dd2749c62c458c5861e9171647ae890a6f884be18cd7535e236cb6d76544568bca8c1a473731238a3efdbf38ca9671568b8c61db8c689e5c9a01aa3f9dc8e40864b363a8ea6e21a2f3627cd272b303cc4dd812e07349544199d4a301c2aca0456d9a4a4a365fa2136ba515971f1292c0ba241e235144dbb24f3c561a1614d8b424542d13011fc7f2145af08a2a8848fac9d2bac3fcf6036a876fcae9edf4065e55e444bf0b0e87110a23a511efb26b89a01cc088456fd8bf0410f48c6aa3e257a63f374af1201578a6134bf9e613a8365d617240bd2be7afb24d3229ca9f74f21e247bcfea2863acbb9e8584656da83126c6789b31aab53b72235fb57e5260e700b0be360c6da4c1fa86ef57fc0bee0bb3784cb1f7a78af996f5ada3c86cedd094acac98b812096d0e8abce60787089a10d83c63da145fbb51087629dbcbd9233c54158116d044bcd4d096d0d50c66e1f2af2e557b0635a426c0b706b45826fd897ef53194b3dac6722dac4fe712641fb48c36cb2dee4ba0fafa0651609ac7c654fa3947f14d4032bc96ec41d9cf8468fd750afd3b80714f1ef8d169a3709d3371a7a491d75a7f1bd20218f0f77573fbdf9c80c3838a169a2c1c317e2de3b234781a30b249a2d78668d79ed7e48c4e4517c0bb246c2891b9dabe7f64b07188d69de750300ad9662a192982ebac106d9c646d5b315cfb4213695adfc5ffdd254cdfb6f7cf9530f234b0c6fba05e0e68106eacd279dec4f3d7e8f4d167940fc07431db8266b99c18f0cc3c6f6a983fe3b4c4877d35a8c206463a162cb93d28b572c18ec0427b5de5bc4215319a5b6976c606dd210becf673336d820a775fbd01b5c5fe3b80d49218d6d624815138ed96da63e1ccab280a286264675645bb2dafd72c8572c140351633d9ab81a9873bd17588923321160ad9c857491c4c6196c76d4ad6485b9e830884c2916eb116af38a87a739d4dca0092c91cca8615ccb0edb8a579e6dbaa9066aa08be470594462019ec1ad1bd40aa9d07f2a94ac79871f95606e62f925656d35ac4bb266f41d2820aff6257f32cfa32bdaccf348ab68896680a91a809e0431bec711807851296ce78b2425db1a2224527e274b04f656df639e55bed1c494d99c84c70f035b7996976331c4adea3a354c938bbc997bd785c24fb922122cd5c92221278511084944aba5d458bb9ce495c73b5915deee8b6a144f983d10dae77706310521832ae94d305c283b8e9ba52da8d7a75ff74007d3034fc8d066eb2d5320cda62e7cf19c044dfbc6009ae4ca9bcdfe8f65fe5fac3c15c3d2bb4919e0e3fbcc1029dd18a92379e5c9906dedde2a11c0b7fa2231a9bd9cc57b766546265dd5b3643b5bb838c47a4d26e9c3b8a9c5509bb0c4247f85c15545d11cb6307fb84aa341fe90c3b4dfd57e01f09798801a920689292fd171fc85ee2d8a96a91782dc0d438af5da48425d74d5e5485b4502a8bc740c0eb294f5a20dc8760d9c5a1563bc98c847f7d2993f8dfe04f7c9ae8ba60bbf223ad1ade8d0c9d40952eb87db395fba1c2edcf6b598927145c68ab0be9efe9e1007a32b7177c1500a45166c1a50e30177f449b6eb7c5c1b883f3b77aae2923a8210e01500ddad45f623d187f5fd3e7fda90828083bc5e201619c399116b8095736aa3a4eb0d576c0f6313ff9da4ba36f92de7ec96395dfa3b14023ff0277c1ac052744443e47c7b477e3fe18adfcf94d6a4e5106c60d166ab79c4a27ea4a52274c9468e121ab1c7c40725d22e17c9998f87cbaa119778206601605426617bd4b674393138479331cb5944764bffecd806d7689ff31b895b2e22f1c51c66f26b049db277f789a094883fed60c251f116e4754c75d0a1740728bf9297ffbcd7c2bbfa238e356110b1b83952a46ba053cc306ba938be4ec10cf2bcda26271ab50913527db16cb33c440f9a0897e4b095389517f5d4f1ca23164dc131e6d394db318f0b0cd8bc38cabf41aceef30b2cb6b9070c5d93849184e348bd747b765d47d29b39df5d59a67f381a932b229bf9c146ab93d9e0c1e2a93bccbe84636051726ef88286589aeec63e16c81e7120a116b7f7143075d7ac34eb10d1b367ddbe8553e1aa921bbe9119f4eafa7c8daea6774976fa844d97b7238ae9c12d28c575c3b11917ffa4da79b6dcafb986c5bf596958c5e452a3aeadb8b58cc0f31cde2397b4a649f5bcbfe946aebc558160e39ae8a6a0368718702b1e20be412a98a61122ad2f2a425b12f6868835bfbab702aefdaeecf989116d21cb899ced9a4fbd04ef4cd6fc996e70ced6979fa22bcf589d58ace6fbb641d7640d8a94a5960d3bd8314c7d255fda9ae73195a6385045ab46954df8ec1fd18d494291c6e8667a120b1fc2072a1ae4236e571397305ff2258b0c23c9d32f1ca2774128d8b178fc9d46073b98a0bb6e1b3fe5e228b8dd83450fb832656aa311ae04380df7847a0f8d77edb779cb53b696710ca2b225297aad565c75752c8377c8f07dc491d04e3946f5555d2308daaedc80982b17b7264da7c19f2942ae8755b92d6e9a5d2afda5fadd7a93d0cb895028d2d8dda8b388968185d129eb5869361b1fd39ea323f1869d57dcce3026c07f339d2501d4c3f865b42bc675cc22f5472f02258e7ca09b9ce83327c6b1446f53fb288178ec2a59ab987355a09d01178c88883e3a8db316ccf051da19f4a06533d3dd2bc01e1d101067d42e8853c1e736b229be58a02a2b7791514f209e242b13a4b09c90ab1ea4ac810f190216c0b0031df69a29d5a1f4906b44b23897653c1cf8ca04e718cf1652a0a74c222bb74098d3f930800ee2f3c8239899aa99cc9ed707656e9d3661675326203be82bddc5b00fd19a8647edac3c3ee00c0db30b1c14e29f3ec46e9f832646d6371238d704f690fc753084f730168b269dfa4818bb908dc615238654f9a32e8267d27d3a1517931379bb33ba95e5a1520c0609eafe48f9c9768e69149b57c98c949b9435d9fe3fcf6f0fc3122b180aee6a27536b2d72503f0fd7b840c2da05825871eee17d305300272eae03061acfc3e2cb0c14c661a74bdcfbdb27a2da8960a3c21e5ba5d5eaf7b734a2211a539235626fc6f5374f1b91fb9d7ade39c049444b98f4844961b1a4a836595b413cbee665c1b9fabe03b91058dc87c8eebd59eaa1be4731342c0417bc090a7245a7b987804d942ea27be29d6a51a8e35b6b4fea374046f61b343f5572edd9b16be4d5bc81034ee9614ac22bde420f92cc03ad06e7bbe1fcec2d582576a802cea13326448f987d1706de3996dbd57e996bad991de0f03b4de5bc84ee100f3ffac2393cdf6f41662a6310dfa8928f9820681b62f0654f2839faaf6bf2645e0e7b5a28acb35f06b43028b2349cc48415799e234c64f735573ea2e4b4c7f4403bfffb506df50a022b2df21382e80072f6739d71258f4846ede7b87f9c4778984c3a4aa5c89cf95a95e5d619aab3c1f8ad65a690eafc7d8932b5e19006ecc59b442dc621c74f54a4f70329978fdd5e33865a05a9f8a5cf8930df2dae8c3a3ca9a3fa2aac8292b038bfef36a9d95186740754fb4f3d99b5167445495913a85ebf3d014adab9db475a8c56bd4c17295a18ba0ec8e98a70e3d3b6d3943d6069fc4719363110a9dccad1e917f45d29a2e8614106f7772760ec9659ad1ac851627472766a972c6d9dec99d70ebb6b9d097ef9e53c7196fd7324e529c0fbb83a61ea85a5213b2000de833ded2d0f7193281791358875486f5dd38075c2f418bbd5c938f94fadf6db4ab632f45b78154243a6838cd9c07643a1084f64baff1b1aa0a574649e921e904581aa9073deafcd1b5979edb06b26308b1cc9a25a80d33790f04b25f5f246556e00a13b26343d2a785b5c46c51e86380cbf823d3b2d32be6ed96be35109ba6de6e99b9a0be7b15ad8f2f1d1670d4571eb48998a3be9e286659b8ea438547fd6f099a71e9386670da2b4d28c3e2e266f2b10edef8ef700a838b7207ea6f21207d98273a34907fc26f83c50c963ce6ee24e8e5d8eea7ebcd867031a07c2009cd537da9c628f41375c9eb665323e62cfeabefd58c72380eaa66515aad76db30a43d2ecb91372e97d30eef13c00012ecccb0e24e4401ecba094b3f1d48408aec44b0c6db90eaf3fb44825481e0728f21b4510045aa26d59f385939e616abb538d25d2a2cfcbdb797dbf7098e3d38bbb5c8fd1840d820890ec83f1789c685a1057456d601139bf72924dde72e04d75c2eb378db5910d5f3b5800c48a374d1ac97462b4079d73ce34ae1990568021e2db8d095d1f866f94318a40792a24a994b02b6ac9d437fa89d23d3751dbdf89b9e874f90fa03e0a806c4f635e81b75d3c7751ebb087e4bc89f86c6e08de0947f6b0c5aa28fb24466c641023e7878928aa62c5995b677df849ce9948031b9015967543e8ab2d64ed05265e4f8216a8d43472499a4fda24c7e259187059d1317e8464f059e2ef5927fb54e40635fa4bc181101578369b3326e58f00dc2667a3e1bfebd55e13f140411968bd85c0468eaccc49a0c5b0bba4e54674b93741c34b49d61e054a18fbd6f43e4cc2bb2f575f9de423687600fbef6bf4179c08a28cffd73b8090aea1d530c0b54c10ac7a777684f819d27706f8074fdeeb2d710316fa2322c1f3fdde204473683e8e38f410011ceb8b0016165e645aea46154ad79f2d3e6877b6c2eb4bcea6480816f03a0bb89bb3cb807962649f601cc7ad4dc1833efd9414ec677cf67de0ede2a99ae7a3a9e0c9216355d77fc634020ac13a45ac41488fc52092900e101372dc3ccd55b6f29d8288855b8fc6d3a76b0b9a83494cac1217730550b78a6363a39ae88cd76313c8c92bbc5bd4ebeeb42c006ebd6c9e009a4e0f4460630d6aac90f68ea3ea8b390629ddfadc05c51f23a4143617bb610ba46cf68771d7a3510e66cc18287ba8388e66ca288c56a0c8440625fb79b19261f309d5c8505a0260cf2599810bd28e5a05b740ed076a4f5fe91fb58e22f6b4518655074f7143e6591707245f1ef42a6190635403f4e5eb086a3ac170d38850d8393aecc0d96b5f9a3e9b6ca6298da35123a37b63836e09c4ed41333285cd8b6f90061ba0b8d2c9e19750e088bf6de5db488a31e65ffbf0be61ea5009b4e5c04729e6662bed0fdd81253dd31013d8264e72a053399cf61882889951a43bc701001db49958a4c94aa839efcda96489a1ffb1ac6f3b2ed307e1af8f4d82a63d7091c905743c213ddd9d80c4e9c4a8269ccf283f9f58343a0be1cc2d06a4f3208e40c3c043f45e821e80e18170c39a2b56832f77e021c1d6096fff91066b2dcd7282069758fd911fadb5d844bebbbdd6fd2cd0673b58b8d9d536e3000a091ae60e0abf0c2301ec69f64e61d7b6eab3791c183c5312ec5b347ad66380930bd798169aa42b9c25ee7754567d79d1c9b0c76e16f52b33a788e413dfca8dddf11a3cac9dda5d186cadb77d27db7a5579656c11f2954989a864d2df6472064a693cdd74b8d76687e541a04344d81306e6629aa03c9fd361e387bf23d6e9978abb2a96463a16fa0ab11420d0f365e633f7d20bb96fe3c296c2af35a1041cbfce4f4f13f471f76752f7d67f1cd8fd52761103f02d5051fbbf84d0696547cc44bf30dae54984380be61aed3a42a47847c6256ad317d846ea913a4a76723312010fbc7b119cb2868c901e0b2a99cdcdde163a554ae6e3dbe7273dae6c929f8abedc1c4cc78ccc9a75b6d7908daea343afade2621c76525850a49ff3dec5d826d9f26dcc9c2efd5909fc2c748a093d95f5d5ef2a2a9c1e4355ab4d2ab156d9a92c62a6062d98f6cc9f1c003257ab7a7b9c2cffa36e422ca1649a17bf03c7a284cd7d1b02c448261fea723ed2e42154ff43ad315cbc038afbf29c5d304ec29a0ebf1657173816b7bfe6b174edd4922b8253ed781492cd1fddaffe0fac1b7ee46a57303677bf29675f484833bb394e4e883af219f2192ee1d3cc9d4e5f809165048d3e4c36cebdc699169b368d4c5adbbbdb967b4b999294018509ff09df0913a805fc31b2bf0d1c1ff8e7c061ceb69fe16c1b61ccecd85fbec226582c888653871d81eb18c49b3e61193ce7fcfe3979d000050a4e9c60050f2de47cd89cdd28ad0102358510a71dc8f9de38e70401d844bce91396e931fdb0fe1ed3b2d938376e191d5fb761ddbf1282afe01a3deb31f387298b31fd660c807f7a8c12d3899c5b057dc49cb75b907b090f570d6cf59c06aa6b4154c88d86486ea77e1968727f5006669a7c79922bf98f11d20f2fca7d426e1c3eaca865e1049a6f3367cc4cff2790cd9c4133dd6c2610bd359e88b4f144a4af3016a7ffd0d78deec7cbfd1def88a7d7ee5cf0bc305350a8d5b056f6e945de73526b2bad75f57280d3b1de6cc11a63dd9a6edbb64d6e557e2017312fa538367f666cc6e858e2589e5f63ce3973e0c2e409a92c66a091f36bcc1905ca90e96254c30f2059c8f9d3a9cba4dec4a901d39f9404d53760663aeec4308566464dd1683472351560f4ac99817f3717b07aff5b3d556f2bd1e892ab57890e6065efbd9eef5df581633994c17770fc8675568da5ea3b22189678b4e0051fa214b10439e70ff82a11144bd5774fc10d54b010be0cc3e748f7ae43ac13d6350476dcfea19e6eecb9e34f28ab5f89b0fe719f9e90e64005c7be4c2f2de8e04398258c3082ca0b6298184285102a48304582c0c4c20f2652ae185384c8c814262c8889228515f040facf7b7bba0f1191f6719a307d5614d8bfc6d7c0c9b3a6c20e99b5025cc6664d0526d9636119fcb98cc58268d468272e2a1d1d96cbc57a7d3a3a2b1c9b9e9b10efe088aebf1175587f23aefe73bdcef78893f45e3a2cab7af977e3ab9b5987a5fabeef559eeaf3542214178bf53a2c97ed461b2e9af17b96e61c11fc1db1f53c379c38b3e5d911da26592b26ea7a25c312b802c7f7bb047b8b17412e7a7e15b692969a9c564e60fa410e10a03e08f2598fab9cae135ebffa13781e6cf1a0d8e3722146e15e1c0970001fb886606ac794cb851885b3e112ff39ae3504fb4f9a3f002147082dd3c9fe227ca148b4f33ee85439409850ffcf715c75d1e3c286cffec5e8957b9f3ebde97220f8f42c87140c32d866126a9eedf0eedc2ddec57bd0f32f5e458350a417226d7251a3441ac6f9f77dd9584df075471b2d3e02936c31d268122a6881d7ea2d50b7ed8324bad4e4940304281751d73628ac7e35861e7a384cb007c162df428722b1985e4fe2fb6a89e7bde7295212454291cce088cd5e808bf75c88515e7c8b1759e28b5f892d5e043b08df853849cfb3db0cfbfe3c742440578a5465652f55590720e95545d317a75e6ac7e1335a54f45454448b4620a1b7510417f75f8c627f8223dcf175c339a37b3fd279485e9213a5252a599abed49cbe5779aace6714a991285257bbaeba085b76819e9eb97fe9933309422f5c884545afdff9229e0fdf460def853814e5860ed292cf5c3a33bc3c83cbfe42647d0b71f52e71923af55d8c43ae677d1d6facbec538a4c34df215be6cb8746aeb5f22cef38837bf23da7c28e2d711b9229cb7f9a29bc7bf4dd0e21b913689d4c9c62952c3bce610a9faa6c8cd3ef358102c76010b42b521e4b8cec56baf5620e551b568413fc70e23241c3e7bbdff0722f8ac8776e4ee6e83bb57f777f1a0d8e25f3d22ab45cfbf784295ebe6b5d18dbabbbbbbbbbb7bcff6650f7779eaf8baaa0ae4b0807bf5eaeeeeeeeeeeee9d7b5037caa80f85f554cce138ea13579f82dc57ee55bf92f0baa30d172d5e3d6f001a079851c7d804f2c72183eb08af0e5cfceb3d68f13c5f7b785e3eff64a3855802cf83bf230e45b9c1f33dffe25d882544b95fc2eb5722ddf9167f63e75b8c4351b89de7c61bacef1987789ef5ab6f2182df23b2be8adec1eb577fe3758367ac79db621f88403b72ffea8ed778d5b3b1c12ede458b17aa7f3de5a83c5f73be3e0e9ffdd7ffc067abaf2f82cf74beee7c0dbfe268586d1b5ca961f5dd63892e7e25f6fc8b94f4e8e7126d5e47c4af127bfeed7b2fc4285ba872e57a93ebf5fad53b0049f56bd888e55a633eeba995f6f4e4da4da03b816aedfe851865ebc657e725bc1ebf4b2c21ca8dd7e32fa1c5db546002d56f31876801fa531fcf2672f546d5ab74a4b0a94f8de851fd54f5bf7e28ac6f3147c32aeb317e1b3c4eff31c2246bc4816302d5cbddb7fddd68c3858b9ef70051e6f99db7e2cbbe07aeb7790f741ebfd723beeebf7822d285f8bae3ab03d6f7fc0dd6f7fcfd9e7128ca1d6facfec538f4fad5bb7822d27b75b7beaabb387af69202a17e8efa22d4d7517fa8dee4fab48829d75875210e45b9f1fa9e77f1ea80f52ffe06eb5f8c4351ba77310eb5185ff75d6ff3acefc61babef19875ee3eb8e2f3b76e07a9bbfa1f3f8751eff0ae777c49bcf11c10fc5d67b36e224399cbf799bc7ffb2c162ad9e479ce48e38494e9c3914273941a16db451547402f8ad2f2ac2f9229b67bd38c51c31d6302c8ae03ff56fc496488f6cc4e915ac3f491047c36a900c9fda22eada8688377d8aba2ffa71c9d54fa318b9fa1f987cb5b83c3fdf5b1581cb39958d76de9f2af92c7c6fbdff0e9ff5bc83ef4994d2c6a1864d85a92d8ed0809961e2eb4191e77b447a459e67bd8f6b7491fdbd1512b87f82429b8dfd724e551b6c957500926a78295501849a233740a4415aca31814813248b508bb23fb5e1b30c6806fd65063913a83581bee0fe6eb510a3783fc111b8f1c5fdcc37aa0d97188209e42b5104f4c71f148b7e3c392902ca552ee754024ada2377a3f7f228cd8946a3f1287a22fb53a39ee9903e6b3fa84841fa5324636436d96b5cb2282d4d7084064cd50ed585c2f32d52a386195d92e741d10893e0af8c30c933eef01fdf3181fc575cb0d00a097c9f82db5fd14660923deff1ac96c0db6f2f6eb4f17af1bc077ac4a2a2f077be48e759efc156cf23828f43067b8bef791c3de36bfb9e9f248ee93fdc6beb790f56df339610e506cf835fc26bf400fcd7bfc6127826892330c9a29b497af4db11f187e2cdeb8836df12bfcf11717e62fbb2b17a0fe89421a49c6006ca9a3524b8135a71e6a2a2138870bea8e8e68bf0af1e6c79a08b38225df21fff9538fd078beeff89d37fc449b23e11dcc071dc68d8aa0a75ea1ad3e079cfd9dddd84e97b7777cf399bda225ed7ee5aab3b805231e76ba7d3edaa73b25769f6b6dee8dcac983deffa5ec74bc30f055cb7ee16783e0d6399a06b6824c66edcc7f9b48cd68db3bfd9e7acb56eadf58d53d524d65aefb3dbdd36aed65aba9cd224b5d64a9d762a95e73d513de9408af515d92435dea4a0d097dc30b28323d4d841a3d18a6aad95564a29ebcb9b67f6399b7205855c94912b2854dfdbac4fde4021d8e56ebdf75e6f3a2bb7942d2844a9306569d8fc39ab486b7903852cc7711c75a263be34356cda0f2b50085f16eb4150888557abff40a115f81e2804e68f7ade77a09087557f41215553becf6d656ced6e95517ed197d195d1985e8c71dfc6e1556204adb52ee181ba6094e688f4f70185fc4e3992bbb154992767a400c225cd18b2beb6b870c40d4752841c216b25922b932fb96e4dc57fcee61a2a444669341f999602e6f182080ab58c17d9b1c8fe2328e4442dc4d0058a1f49e8900485211f784801151c6ae8e1a5ba304608a69796fd5f748ca52072ff67e1c40992ef5e0ccbfe2d686d294aee2772bf0bdce409165ef88b9425b9bf07146a272448610713e0062b723fcf0c2c255cde16932b90be55d95f27831b94e8b94149ee0f71d10b39515290fb5db7360575f42de628fbe3741419329725727f0b146aacc310990d33e4fe1b213afbb382aac8fd18146a274d2b7cf6076735ec90fb5745280d6a72adff81429526f9d0030355fbd09044eef762f841c85d000d61563408c9fd9d921886b8f0c389f4bf788630b99fbb9509d4911efdf9d70e9a8185ac802372bfc575a4443491a169341aade8a8d6ef5e7c2718a5a3dc2d6be791d404911e9e2b8d4643e9213340a928b70c68725b3a80a2093cb5321a3647981787f43f36e98730aeac94e9a40a58f1c309116692aa9c21da61ca852d449079e206a4f9785e3c3fa49180127c11a2892952a28842c38832418004f981f604397f2ec09b8fe78ce8ca942b669c70a18813a4565072c0c14a922c8688d9b80faadc866569290d8eaf613efd7afe0fa2807bca9b9a989896969494f256b3383c2909a7ff964ecda92d9d9a536b9d40fee009b8c6873018b07fa7db44952a4c52a4d8c821073554a870a0830eb87fd61c696aa8a18fca588e71b1cc89930ce78cd93381bcddfd27797d36c9f9df04f2ffaec065acfc0bf8fbc77c16133f5feed2e0c2a0582764ca94da933136442aa555877b673bbe1e309b5228bce913840c47d9a31fb6f2e4cb132ad99b9486674d0632394cf6b8cf7f82d68256f017d66fe1277089715829ed2d1852ca03cf9a0c6672d9d9be6d61afbee75a026fad9028d377b0366c42805bb3c6ab1aaf1e55799db3d63a7dfaf459bb1430bd95737777f75a2bfe363b963ab2f5eaeea21543f8b2bfbddf04e758e6b089627abddeb93bf5e69cd327b6b172afbb118f528ee3a6bdd7dd48add5c8bdee49f7bac770afbb917bdd8d6c3fabbbdfeb6e2488fedabd576ddb267af69b2ddbb89ba4b6fdb65a6fb7ddd0a96c149557bd6ffef519ed9cfbe6c08f8b8fc13679d69c78a901abae94c00612602fcf9a93251e0df8e6597372640b06f3ac39098284931e4dacf06c30f294302bcf5a93282818e7596bf2d4c46923e28698753d9cdbfa2e06efd7ba18d3264f3ed577ef93a9af09119b6e8628af490aaa3b434db5c6e38eba32af4d89e93e7dd689138729931f58f56ba126501ba64caae078d0938d3993232dfa8bdd8ba1d0a0184139c2e1f792353c54463fc9f2e40b9e5db27b89144bf6cd50344390fe99b9bcb8c69228efe2904b2e1fa709377debda0a1ce609460d093c2cf8b1f088c036516cc15c9e60d234c1846d8668f2e1097f3b60c19e143158274f3069905431e09b2798344751a4e9e1b580b73cc1a041d3cd8b6b3c50084fe09574f372be3bf5f736fb517136ec73cd1e52b19c351fc654eea3a27bd77577e7368813a86b75afb552dadd5f0a98decc7d29603ae79c620685fac3f05ef7d2dbdd6bb777b70b069c18307d9f3374c1d05dd5ea73c1b3322650ecabb3b76aedd7b15e71fb2a86f1a5f56cb5f6bb561f6edbfc5b0dc33f39e77ee6b27263076609fb73dcf492256fb6acd99639d98e217cb98e7f7d509a11cd2aca25b7aa959cc7f736370c9a84874794e5081348e4d004868922480200d1a2e5c80f5d9a1882ec16f297bd3f47082230215bf9ec66274a533a904a93822a4a474c1591cd838829426a80a2a807b2eb107c93e0889628f951c404543c31a942a6204d0ab41f61a6948082ec7a946f0c417cd3cc152f2848390110226420fb0923a933654eb0258b1e2cc83c254ce48f06f2fb0fab903f31f94b42227fdff32d7992bff769594ffefee2db4ef9c272cd2af02340f6fe82425e373529b99255affa0e1452298127182c9a721926a12277df3d070a75f7fe9cb38bb92441ee0d14790990ed11f9ca2c8d46f30145a3915fc76044c619ec94dbc9eb71310da249356c5fcd82f48216849842658d0cd3072d557e384113134e2421a48b0d6e560a8d248aecef3f8ad01045480e5ac0780015830f164831ea61c50a493d84603a79462460b2ffab090d48df3404852a3d223b121df20d0ab2ff0e6e32a408751101830ad95f0714f29617286650a394c51013e4786245102b54d0a4a952832851a185162d820455b27f0e28e4aadc9ffd3f7077772b5da050a0421148ba0041fa0b8800a208205e70f22508d2ab0ad9ddcb8e6d8d1c254c1f870d28e4b5fe0d28547900f184ec17a8c8636a46bce421723f0c8948ee877165d6908430a2896c1291bb76e405b99f839639253193fb3548a188ca58b50811d91fe3a0e1381764c8ad44f6acb92026379122b9bf870a39738dc80fb91f46cb6610b98b10c90cc8fd2b50a8834215726032c28389122b60216a01cc144ee050050f2145293459620b3b2070d8821419647f10474d0b627a72ff070a752b09821a51d5edd24290ecef81428e444b070af590214604d04bd41c51a72330d99fa3795281a4082c988c9489620955549212345c64f881051508932bb95f835a5d4670088b05cda6a32779ccfe96014b801c51ff4193fd6babfb88908afd3fc0dfd8aab500d9c5646782cb2fec791688c8667c2d710b0b4579d68038e5d2a322d38791670d08942795690885555173fb995f797e8e96bd7adcc063f762159367e43f54c5e41979e91921358c16e5f21edda3862111c1828738a084543541aa1e49c366a67f6305cf9a9033594526d3f7ec92b541b44a48f455a2ea3d1593cfee90f943ff48d3925aa6333865cae4b349aa9a543595d304f2c1811b7028938312214e48818312bc2088a9175c608485a4dfa25512ed92ffd03fa2ef79ee91f1f6965aa6d4330a75e45161f29ae87b5f7a369bbc30f43d276f4ccb666d85202d03337d0faa671f95ca943e454aa25489c7528f4c5fc5e4a3a98b6abdc5a99ac9943e41c9f4a1b831997e6794e9d3281650c8f42f0bf78637ecba7bc4c43d7150dc13f7c43d714f1c1417c549714f97468fe81145b2506041b0a00d694bb24a4ad54ccb4a4bab5275aa4a5529299f4db24ed18c3295b2485ba0a86e348d548d35fc87fe0e14ec3f38fc67962127d9811ea8be1b5ffd3654e3ab9fc8866af122f9cf51c3e81bf9ec22dda3101fd17b449bb291cf2679849494692fdda3558f7b44df36f9c81142548f39a30396f600fb12418754f39833fc3b10c22c932bd46bc7d02c935b9c65321a5a116d074a123f6810a288124a938a2f4d8e544113a4054548faa2462b212fab44da7b649532fd7b74916ed2557240f5a43e8859c7800926fb2cc674771b4e5e9e34972b2a45ac39c31fcf9901e68fffce4e8c558c55769c1ab02a97b58e310248a4478b5c61f269d88704870d0bc5d78dcda6884c14b98dd78aaf1bdb903705b98df843826bc3a877adf49b6078e189b4a23705397ddabba77c734e1a4da332a57529536a83d018d40ac9d4bb572565c75e7069a136a0ff7a40dd009986f9a5ddef8785caee6f83500c2c191ac3df6d90ec4fa58eb27f27de28fff11b24fb9716ea1adda28639198ac1e53163f8fbf53181dc92c9feac2670e9642e6d823566534a9b7e534a9b7e53da4d29fd26e3505ee66be28e745447b9e0dea3a9a35aa5d048355333f9933f5961c5bdb02958ad30d0c0e0eedda074dd68428b8cc2d129ee8d4dc5aa54f7a866b421e261586b0b4d8bab71b56d43c3d5981c8df2685777017b69e559f312c6c7d78d219a450d52a43f11699f88a4d85f37ea6f95bac41420f77f012806fdd8d3424415354540a9818183216b52d0c3cc932b4fc8fe7009a61f0e81e9873e60fa210f98fe665b3faa4b885e52f3814acd872f3ba1ab758359a0d7bd1d5f372cf7f65f4f44b67822d2c513913a393836ab4ff5dbf8bab1fddd9e88e47922b2e789482272be0b1116a6d0a2270cf2e2710dd9f1dc9dd3e58430b356e4948dd80975be285c393e5a38384e6e6c3e32f806078a8ae987f4592b9d13c00f87064fb5a6bbae13748a7009cbf4611403117c069b3f25761f4b0ccb2b1a833e6c4ac560328268cc621cb872cd47964c1fc70722fc8e557d21d37fcf2b1c830183f110d5be916276e36b8359fbb2b4892370ef3fb5135f37ba21181139755e1e78f7fe937c79d0af7ad558c2fdfe49d2c79e8f2d4c03e6bebc1b70e3fd7e7b4edcc21eeeebd370569ea08ddb0bb8630f1649bffefdea6fe2ac7939935b2d9bb52f4bb3f66529c79c059c140dca284b5d0aa247113c40ac3902034410345a17cf8fd65c09b368ea4188ae1ef18021470d0e5d8cd82c6d4a909d19c2f8a0848c6ae59466c80d1a274740e19bc56101e3241c7468900289142255dc1bda199c3553505c2100291cd28c3818b940499a9b30c90c119d5a993352d4a2c6d4cc0461e1567139698ac208d749fda00608ce0f699a4091c50f689024a937b430211032a82009082524265d585e9f7d538d070ab316493f26a3464381cc9529983552995efa98d2b08a37b72c5e97ee84f0cd88aa22e350cc28e8ada25e3195a4a19705cb19a949a6fd24263fffaf8f6598ffc1240f474c2dcf2f61d0e4b259c8fd3e797e11224a7eca38f762566ed66cc0436072c93e426002f56f5398fb723ab1e68ccf540d95358fdc4979a6a976bbdc587172ff9c173fce859a3fd34bd4ace1858a099bb96465c7e9a30ac59b3e5bffedfabe81feda309b1fb8625cefe73edef4498aa0c8c1ca961724914d254a92235159c6202922bb16c9dd56a272fff0b57a049067adcb0d4ebce953f2d8e820029d921279ae9a9c58f590253067ab25ffa19d9454a69d52a6e34e12ee28fade9c4e3a09f4ededcc61ca8cc1fa92fdcb579e59585466072b5aee584b13880a4c9f62706979be51df6eceb0db4f27c18ecafe55641db186b05a58cac9e56ac9f36a2963da5176d6521527a67d4070c93aca5eb296f2d24dd49cc134677cefcfba326778efcfdae1268a39c339baa922fbcd15d971707864c731cafe3a2f34c9fe3749374b6e98cc19db13aca5ecaab7a2f755fcc0a7d1a5974131e7c973a072989840fe2a31a78909e48fc354ea2891fd718e7ce6aa62fef8bbaec88e73c4032729bb0e90ec3847d98f70a464ff1e32099e4b9d17b27bc1a34b6a02f92b4d207f2bba669840fe9be8a26102f9ebd880cb9ca7ec5fba94b27fce130c4714835e3263d0f767b9305946a6acfe95b049f62699b28e32f682abed92cb5e89c9fe9bd84913c8094df227ff119b7c72caee8147823c5f9217b6acf4a72dbf740c670fe562946b536af49469f6e8c78202f7dfa2ecf4c99f328dee1278d3c7e336eab9179cd44e949c8ef38626797e2f9918501bfef5807103b561994653bad4348a0145f3f6a82bab0d4a4e1a9684866250973499409d4b8a26f7b398c07473a3261be4a0e6112a9d40cd35e87528bbdb11647fe79cabdd1b34154469e5d7ddfd1756b74cd18f1b0914b6f4c7da862d1ad4e8b7d135e4da9634b91f841cfd22380db41f1896676d4b0ff926cfda961c72e9b32de921b64039c196178a6c410109fef2acf1904517accab3c64315393038812fbef7628cef15000f6472002023168b053df5a03362291ea8d8884f3c40019fe99b8721ae17326e2c16f4e5e90b14e6a10874816b2b70b548d2b2440f36ba5a4a805f4c522db434b178986a3d5a96f08e0f482f2d4a421a8f1616b0ce8e161e2b9715a4b005ab1c2d503a28c8697db17bf1df77018123e3c66241df28b4c3544e962aad9b1d9c5a5990f0d87499c2c91204e32f762fde02b525ea06a761b1b234d96079225c5981c2588408411e9a5858b2d87c595658a4801e1727f0628ae5e8850a8b12161fa096a41dceb0be18edf004ab07a71d84087998dac18aab87a4bb430b01a85fec5e7ce5cb95309bd4e8326e2c16b443d20e4a167f5f4142e7c35ec2781953f1152e216d52ea9f7929bdb26423c425e98ad2c5e12760892a78878b8f18fce99005e3275d8ca8b00688a7444d1a25d49cc981e104af3ac7d9e6ac9d75b7bbb5d65a27a5ededde51336e9bd627d0acf6ed04da66adb5b2b060fa1bcc67eb091b366bad754ed78046900c777718b08685e1bd4e6badd6d65aedb66ddb58da206b6d5b3ae7ec564e9cfe63ed9c9c8d14b5ba152b53922449922489b5d67aadf5a9ddb66d23c218bbd75a376badd72fe355af3fcf5aaea3df8c1168a6ab07afa7f2ca75948eac1b3a7083cedf7827d00d589471c71895988c4e0c8ac56404c56220f881a090fd69a74d6730b9cbd9301663619f3fe489a504cd590c6f9452a22d189762b61cb6699b9b8fc512c5f963bf9b369cb3980370a61f8b8974bcb95c14de6c998e4e9e522f1edd2a10817388d024d3d7b183d6cdb4c4d4d42d441b1de1c044a6ada4ee1a0e2e081baa7b059d23a4a46e272f9c47b7175735a244608c448ba929462d87297862508ac28a1281b17db2645ab6caf42d948d929a6a199a96b1683ec346474d88b4cc8594a4b444a56598a969ab51b992e96f6136a7ed6983daa236332db379fa9b94cf2e497f9ba25151a2a86501303a424aba515a62a265fa5c96968df4b91a7dcea965ce8323d3329ca7cf41f9ac49fa5c1427e543a6cf9d69590fcde88848cb5a483e8b25b52cc749cb5c498a0d2d7b2d3135ddda0dd332d7d3bf4f2dd379fa974ccb1a884cff96b95157ea4eb58c6aa1b5ac16b52c34f2593d4292a26500c8f4bbaeeb5ab6f3f4bbaed6397563baa70eaa8beaa4ba332de379fadd94cfb08ad6b2d7d35715b58c32ad905f4be4d7df6a946fedbe17634a71370ff8e2f91014e2b93baf030aedd0f05da050587bc83a56a0641d9d2a4d649ddf018574b0eb5ba090abe6e8f044cec9a9c224e77cab653e3947072639e77340a19cb0f537a050abe2bc0d2884d39e6f1e8342376df32c50c8067f2eb6dcfb5d47cdde547cd6daba9deac5d6b6a9baeb6ddbad3d0db1bb0eeba1ad75f4aec2f3589352ff59ddb75a6be56af57befa5d75abb55f77ae9e544ffea2aaa52a954bd596e7e17dc8063ba59a8e4f99dbb5ba74e633c8fd23578be4a8d1a7045a99aef5363a386f57de06ac562616c63737383d362d9ad56fbddc2b5569b1b9c564e4e4ece6ab5c2f1c14e0b656bb5b7a5e2bc53f98ce1be39b7bd6f2a15d78df8bb622ed7ddd54af166980bb48920fbd79671245cfbf6eeb01366ef7bf6deb14e20fbdc26ce09b35f59e89975d6b2df51b7d66edb661d8480ad5db785b9f6493d6a58adb59ac931abe8219ce60c9beb370be88cd5513081c46d2c708f14728dd142aeb5a956bf34cce7ffca09d7a6711c69101bfe53a1e0b23695fddfabbed4da9c41c7863281ead7240850240dab6f230573dfd5b293b21253adb5a5a632d6a62f2db363fd9265e504970d25b7d36c2873867f7d6ffbefee531d3673f568a9935ab68d35163467d8af6567eb5c8ded54cdd4a886d55f49c1b5ce62ce9a33e88730ecc5ead70a45ae3f67adb57e3bd55abb88af3f673f91eb14b9da7641ae550a14e2ccd48e331c75145828f0fbbeb19bd303c572cce0e77c3925f8ab76fd277a80669b4e6aee48d529f387efcbca25e77c59af64efeb90e955cc708625476e876dbad1a5566870af9cb0d7fc5e8cc7a79cf7b8ef1367ae5764ef4b304f5af6be6c7915f3c75b657074a909e43d0e1398721f28ce0ce62c814b18d9fb468f6a98f7ad24f0242749c9d2a532fdde0bc1f26670fe7842df685306975ecb5e4944c341b1bc39a2d75ad6bdf71ec61bd3b29cf7de9f5ad68d0d98998c439569594efd6cde9b1c49cf663375b51b85d4b2b9f98c7b2f4b48c56d7027d9ebbcf77aeac97b3ae51965af3dea7554f6723c2f289661d9b505f77b4fa9cc19347bbfc367af0f1f1c4bbc1acb9035960ffb6f2c6339732a7b1fe4b3d75806f18c30fac7fb32b6334ef7593862570dfb8341d9fb29a361debb48806164ef7dea4ccb56ef6129cfb338dc67e3042ee953f6545ef8de53a839037c8f3ef9d404f2c2d1a5563de0f266efaadef33cd5979fbdbff120fc50c4b182bd6dcb65cd2f1b37aeff581b5e9d4d6bc5b9ac1974e5b2f66c5f41b136385078e7c3a7368a76c670bcfd859f38b32d739ef5166cc03796ac714ea0ef47a06b72ceb84a834b1d96be4becb2b77d2eb1ce09f48d6547651aed723d08ea7c20f82ed7e77a1aadf3b9be6f893383accff99c6f8925fd729ef5a098f32c1014ca019f86b73e4704c16f89337f1fcef7b57272fefb72c611b8dc6ab51e0704bd25e288a078337e0d739b71368c85c59235aede82a037cda0485d0af46ff4330df37e65057b3f7dbc7103160aec1d2c5eab0873ae2f98e62ec2ffd383bcbc67fdcbfecd1391587c7923149cc7ffb2e3ab03fc367f03bfcddbb7b9c1fa9b71e8e6593f64f3f889488b23de8836e22a05dc6a1d81ab0e5b7fde1d197c177de5629f01c1a7d12bb0a772a9c3fb3cef3fb1cb88a090373654f79ee8efdfcd6ced7b93fac0b33604924cc11168be3bfa4ce77967dcbda742a4c372edc46f8058fa34ac95a74e061368fb81c330fb0c1a520cda8569823abbdc11af82c065b8e3fe137e2d3ce5ebd0becd73e9c95d3dc1fc46c3fa028d7df028b801cd2e6e506b86eae2b16e39e6daf5adfdcec0584dc81bb0b6a43446690251965cbfcc40ae631d6f5ba14df9668fd5dabcdb3e8ee59b69de7e1369b6622c5331a4340c6badd5bf067d4e60fa6590fdd11e4e16d8c131d3b7d5d6b1a4f4290638d99fc44098207b12d97f85025cc3bed0c4c07eef6d8302dcefdd5081cbd9a4fa4e055ccea69cac7a95aca44b64ff10c6ace2f2f4fe7b0b78df5be045c798fff87bb805d863df8710cb56fc44ca0d0d45b9f1bd370e79ff8d439f6a2c4d90224ab291e97fe22447182ae952deb831d6301827286713073dab4eb2ff05e60c1aa2cd02578c414b6bcc55922c70e76985460d0d98684c20af14c614bc01fdf117838dc8ee5fbe0b4d20d7c0bd29bb159a1acc1935bb9d42649f4564f7ea140a1ca26d77376338edb19b30fb5edbd771bb09e494b6bd13c8a9fbcdfef76b231fb03aec7fc00605057520c8c7c727d79a7da668332acaf5b66d9d2b14def471a500579f402af0dcd4e70cdf3677ceb76df3aedbe6a308aef64352fec9b356a361eeaf0d4728657cb9d4c16d70bf035f9ee306eefb5790675bad562b50ece9a9df18b6fff7d676ff89f6726fff37c05341a18eebb88efb9ee6eef344cce1fea15fc35cc6dd0bc5996cef683fee290b0a8bf5b57fe8d8d3628d79d5175cb97bffa7ac24cab4bbb5e37c64f4ef77dfcbf9536e136d346cfb2b0a9180a361db4f9ab7e7c61c0ddbb69f3edbb8812955028f04fa3a6edefef580f9dc77f6dc7933eaba500a5cc6441a44a4470d13a165f6766f7fa865aab71fb331e79e4693a0fa2e53220db3571ca2b4a6450db3ef8939fcc7fe27da9fd6c66c37f367adb5d6be176b984542911a4684265918680fddeeee4e64d9deeab06db6beed6aa64af5d1a0109d40b5b5e0fa0055f6f77cab5ba7408bbb306b18ecff80eb2393b06d602561abb5820eb010a83e69fb741fd76a50a3d626b956a35b6dad618ae45a10525995670d08a7180cf7d256c39a72c5a11a6ffa78f5b1305a0362c9a705b8c4a18718e32a702c8dd794f6a454d59d5fe79ef6b659ae5eef5a4555deeac2009b40f3723eef518ee3b81ace2f62a682143431524843a2cc78e1c70a667a588ac10c130c783aacc0470cb4a31454517a41152d44640144c9cc120ccc8901c7e2003cd020a48628a05cf1448c209ec890c2124ba8609224c402255a20c492126c69420341105901122e372089a2643e0e321d2a031309248c2083c40b5810d981b682204cb850b4420a4d49329041104e289500aa891bc45460062c5620a932049322315c20044e665a682ac263054a4445905c710216147ed8a0068906695ac81285982350589952b490644a143260210609060c44a04a9a1bce449929810c1230c1123844c1b003164954125c40c60b62b841cd9324432c2175f8d0430e361c613962857a643e9e575ce0e909fa04f65d2bc0cec104f26fc0fc29eec480ff83dc8dfd34fc5be45e04979adbeab70fe6b3d5d88ddf58e2b10c67181d968309e40282dd7d1a36bffc23ffe24da31a98a6c7140303605b2709868a23576438013245567192defc9e60243850419aa0a26288aa19028a34210324198620ed577188fe204d983e90768ce2c30924d2841858307122bf4e401da2273c41234d8815a9c0043d058b2b844c9155ac2a28417af7b3e2d0ec81c98934c17d905f2780aae6378592248cc82a7a42900de637cb002cb004a18aa8742c58654529112a1a0800000001a315000028100c0704029150200d245d770f14800b71a248644c998b84b128c851100431c618820c310000638c2106a13a620d8b4ef0bb1d69586ddb84ce5c7d8f48255fe3595f36b6887669282ca659674c7c9dcd9f941613205521a6249d3b9576886298b6fdfa024e8182f1863d2a033961ccfb72f52b22567d2924613b45197030f35d37f20e1815ac687bb0df966c88c965993cdfb5030027ca40da187df9e3d9a96b7d719bf471f91637162340da3e64f303ec624a4e7100ca988cd7d448d40cf54adf1f8cda565fc91b69a59325acaade1bf6a14da0816e56d950d2529b3137236d169f28b6be540c2adb9b8506be0f9e5f67633bd0d18f59b5540fa68b7968e0c898f8e1e3ff436959f6f900bd6d7e3bcb814aaab86d9578d80e02a61d4b5b0e4aebe2baa1c3a172fccfaec9f58c3ded15b304cc5ad0dee6745d3b970a1b333ac7a0213085d9481f148f6d21b92086021a9fb14f972d0961291e899f71c291663f4088f802dbd6a139d96408c5f2e060ab1be04c8ef4a8bb7a4c9ec07edd360b7b07d88f1f6a7dd71bdda80cd7a09205d90ce8f210d9069a36bfae93a76cfc45a42fd9b5f8c9e205ff7e43e4c3fecbd1e2378608721a543945bb64ae4be20cf8e18787108568f651818aad7446a5b12b05dd89109a8988e80ce0d45524f2792e3f88783c2fa48a8df44892d9d108eec759eff858646e8604109041a0dd9633b5309f82e113b968c0bd63899057f9d2ffbe9496901891005ee1fb05c069381a5eb76a95e8aa5e18b978a23e9ec5bdb81ead09514fcb25dc7ee8023fcef5c65ee392ef65ae0fd40bed33d6d833ba7ae9232f315b80c067d91a5784c22782656e4ea60b9100331a9fe9223eb6de8fa142fc4f0de2495409fcb655446b57fc4b829c8d4cb8876e9b9711011cca26d4fab4a5bf39562854845b7a8741c364279457bb25f11f9e40c20b19082db2f57a208141b173de7ce476f9bab3fbcc87804c12262d034c688edf455cbb0b7e7211c379d962e7849d4e64bd4882a3d49d9b05a8d731e1522e3d9136f3313aac7ae962c515765077ed14541fff0b255ec60329c59454d5ce21d64cbb3ecdae2715e57c226f4ccd0df815d73eee5d6a16b1dd45a8bf3a8b0e66626f1ff82f969c495a04b0af6b05bab49cac58be7aa1b9991caba1502a1735f9e49b669d41997c98de184dc4e571e431dadb932c22481dc07cd2ed3cd8020a0cb29c63403d75f8b7c3fa8d92df9977ffbda5b4b088935cafdaf6efed2218d53c32e4c34e45ee1821ce5c9e387bbcb81fcf78e72e8b31b47264a10973872dbdd18865738f1e00a857f60427ccf85e2be223666313ca0819ec95a74099a1fd2a6b09dd59f86d97976db21d073334af60084606c6210ebf1875224f4e7acea72c3bdbd8e65590700147becd1dc709fb317680a10921017d96008523472f9dd2716330cfb348c7997490c00917701ca97c91803965b979b12ade95db8127f39fac91435a819d6fddc2056ba1f20ca8abf7f07069dd534850aa90c631fa5450def1c91b6eaa067e2b82c66ee6ff038cb0e9226602c9b1a21ccef2e27ef7349d1a38fb56188d5d500bc08b92538bbb163474557ae8bba58c466445e2744b581c4fff2aaae3bb51841f78ad20b8ed197bcd9ec24ecbabb3fc57e8b6f8ec3349d2a2dd66a8739e75c7dc9fe830e8647c70652f0c51b19245a0f00012ecce213621761420c28f1b70a9fc2b803218ad903d0fba51f242ce96b4f0f6a6423fca3bdcd04fdc11951e96da39c871ea364815bfd6f53c6388fb6eb95b781db70d868dcbd324b8c4a5c40c119982d702d94b634a4dd174288e4f5ef4fec9711419e93030e929a55b22a473ea547336728536760c0e65236466c4d65fdfaba1e3498430e02b4197e3a30cad8c84ee9557671b04d3cc2005e85d8307839a1d8ebd6d4118e0b864baee27f51b6a331aa755880a72cb0b46ad8b47357390380283b99c0e176d640d4a9d832658da67cb7b45aad95fcc1a6b79a25be1b631794c48a8a9e67eb30003799e9bb9385fbed00c6a3b61468fcb81a89a095c2bee9bbe0845e652aa77aa35447f604640402aa416f6ccec107880b729289ea1240ab8834f7c7fbf4d01475066aeda944491d2c22a9a17d12e77e097db14f850c40aaca8cb4eb2805c99117f8837b878f8e162029c1dd0ee1369d3f6cf5fbe79ca80cdb94a1ec5f890646196e179f6b49572eda6aeb238d78fd0bd6efce4b20a127d861cf2b10360209dbd94f01bdb2a80541c465fadff4c668eeb18ea7b31e3994ee5e883b1f6175e65d46367236d9779428dc439164b7f13da255510b204c54a673477bc385bc565cf15b7af9095f53a7c74e477cf4863a84616122672e7abd6dced75f9daa63a69fd4de58a799c29c62a796925ec489d50598e72ec17b85f99203e02a2db934720b5621495dc8125a4f0ab1c4b22cd16dce2332b116dde19b73d3f8edf62fd34a36c0c12ade2627f82087acd2a2496b7019a67edae0eade81ae6c78b39399378c56dd3c7d9f982a8311163c97e5d59afaa03be491809b97f79e3c0459ed4c3cd49073ecf09a324fd812bcccae0ab82c3ca5d85099f9d0143d40c24895ba53738c553ceb52c6442a65452f949af0244b116b9729a804f682103753e612f9531e4c17ba21c94e138b30bb13e4301e68274b8c1fec54ebfe94b8a2c0661548d8abdb81a2a4311564c19156edb9e987c279806b38fd297222b1755b9fefbd3a908174dabf09b320238d42a7829e8e24a9a6de245b3252886a22e1240243271d1422564a6e662f88c58f263790b01a37cbfa285d5132c41b378ff7e2571b4c7d70fa747315d1e02c650118040283b589c8d0b29b64cc21a32d4225ae286573d1c4fc09d54be9c2848826274a5767a25330a77a4f8079fc266cef860956d0117bc16d4e01dfec69dc51fb2a3732a724c50712a6b4da98a033364d2972291ad3b90e02eefa54161a1cca9715291f5d9a73af821544b5253cc52813c90ed63b876fe63ce000b06ce431ebb3eb86dbc6e904e4940fd3ded91e977598afb4153f8085fe8ce02de023de28afe96ee343c9278ec94debefe07a88d59b4fceeffec73da9817b8d254781fc94f8d051e71720960875c07df86dca192631e461fe35e01b15a65d520e3dc04a5fc2cf09f62e81b1a547ce2e0ce043af62cd0288c12fe32f700733c340d88fdfbdfb523d80c32daced981f57bade1c5cdbf1733af211a5dd8334e26858fdbbe861fefa8dd8469b457d0c15ed418e53b5a7ea1a781ae3df852ba96ad0cdcb4309d182875ea0d5488b0b800224e391f5d3f97d986d11cf859d67603345b3449ae903f9eb44cfd662bcf74a425ccce5068baae15bcf797c03d731cbf948b78b7511f01f3b2b135a71f8ae219788519558a7a83334454d412226509a7839a21eb3b13953df5a189c2410e4c230e2c9423ed8cd26ea0f5211d88e97f37d167ff9ce438d8cd37424e3bdac4f09af03d13b5de24a64a4c3f03a9a9cff581259cd3e792793336b23c8f50940fcc1757d6e10938fa3803eec2900822edb56ea0160ed073582112b4cd08c01a6106ddee83c23c564317b9ff14572bdfb9d82e7b857e669be5dcbc5c0511b094f4c80cd831f2e456c903f5f2ea1bef6417096d3e8e7af8eb916c1008f077fcbaf94836909fab0562887da107d52866041c2db998876b25efc8a74748827c6fb749df2d60c820118b9de006dd545615010455247011a73c0445167dfb6d1d1d34e0db4217214a40d8bee0eb7bb22b444b4b8b59408a21360b55e0c7145d539ff9074d41c97b727d81fa78bcc6b79b730f354e8198ac64f094efe63b0805bf8e162d7b1ac10c9c01a74fde7127f278c4d43b1e5c6060d01fc0acd477a5dc08705dd1ad53aae4cf97d40500d9f34c3dbf8c9e2631275a9220933851552fb4f31b1f841493bd25841e40812d3a43affda13451a8319bc02d13ff6cb5f39f20d273daa793244a23b08574093cd809437aac3d6e6dd422f652c1daf197ac62de89ac5a3a5fc882a5de78396f4f885513f5a292cb04de504b5b2daaea7b043008c3eecd0cfb55a9dfec2987c3ffafa32176d095c68fca9f3338708fb128344027b76abeb01bc4a480a506e31576bdcf4321554b12f62eaa14e7d32eecf9a371ddd0844c7dff5339c3c4be0de90671e30aaf892740f06bfcd5a3db8759ae333c2218e63a7ec19a564d2ac42a10ab24ac606eddf593eedb4d19b5ac634998713d4ad41fca95ea817207072b4918a469b507e11dd9ba5f01270f448b18865910e7ed96d435332743513e71cbe747606da53b2eb401497ad1ae85da1c686ff013d50930443c19ab5ed61dee18f8f6aeaff4c639186481953f6f3800629cbe33eee7c939bbaaf5c30d651e6c78359de8650c0e6e83db8fa4bf4f63e5599d5617df1a2c38ea478db09ae9d67aa662f4b772767232a6bc10b88daaf6f9d4723030c0c4dca95a5700f6be58683139696ae8d63ec623073cf9109dfeb7b10335827ebb61125f56a52f0dfa677b23ee3dee506d738ae46e9c6dd03952dfcca40a30864a272e5caca728853e5d67f67ca161d98aa2b30720b708bee1427762588a4cce9cc764540a5d64e8db56e9f7d4974ddbe8452b7298c743f7cf2327fa16a55a3a9087d3b0d2948ba657ff56cb3b452f292ae18257187e6de02a13c79e5bd00a4c4932e94a1c6823625b8292da7fe096c0de5b7006f9258c9d9810b4bb9345e1c9855c848d59afc9f33b78c585174406634094b832665feadc211068d23ad34bf2d145fc43cc99ace8489f5e462acc5a1dcf734e015ad6a188a00f12e5c55c9530b626fca67f3b7d4487aaef2645b37f043a757832a3ac46972b728a16daa70ee34cc52a030d0c5b0e4c0cecec32cba3eb79a9aca536a1e163e2841da9dd801a092c459e1bf41e8907bad5dd067b90cbbb9aabceb7cb14c8a606f1d138380dad0faeb40c37f4f427d165fed6d1930605949e102b6d996164da9ef7e56aab18022039d8887f3ea21d14a43f5568292dfa09d4010fee4048b55a8a329305259cd1de97497cd7c860921d0f50f4038cf64112cfdbd94448a65b5dc365ea85e011d46785d3711f1106b13591d1f9996d1fa4fbc3799747129008d2d1d3c63552fb0219b9a72634ec262e475368b3912cf54132161e95ab920b87656d69cec80489d228ed380fc90167307de82d2720f1b20878503936ff3a3dc9dbf24094d30992c5c9b9d1696f88e5be35d4bf3d7c86235bf1e8546612f4f5db15244c0060bbd5834bc0747029a7368b735c323bcb3fa5245ef501644800a37144eb54791fca906929079f852516dd196277b9457a3d2b8949b0eb7c6d25d87f81a7e9a6a6b12381a3807ee3fb0830e0c909fe7a160b95c6221a6b9d5ab42689efc46c565a4c5601d05622331da6576dfe80917cf42059d9ff69afcb867cd8f9834813e7739985055211e594be2800b45686ac6947a6af9050648bd964ccd0511bb26b3c5b6ee2509d0babbffea48615cd5dc54a2d8952517483195f7b98d0ee38c66b8e1c90a9a9b4788a54d29303515feaa644feaaae6e2c53d58805cd3b68599f03947829c26687813d770659d5c70a11860bc8cd30623f849161a541c87b3fe10095a08040dbfd60ecbd58cc3d366cedd5f073c406a72a0fd2bcf75fa17f44037a08c62af27dc0bbe3812061e0b0f6ad3f826c8c3cff933a4ddb58e8061845f892501a6291351a33d528051d07b03ec6deba1dd323e2db1d7788dfc20dbf75b559fa721d1b8d268630c5b06e8913f04605fbacc215b4842ad0e7bb2cba175350b4c118011aecd56e230c7ef7ea771e0e20708558d2a28c4393baa82fb7726e44a8de7bbfd1b004a5a0994eef2eacd846ddb72027d2acac0b0c3f7a2da69653ee772ba39b3c06ea084c1b4a8b851b4b16c29e06421445f929b6bedf3fdc65c2974ee60160d79485969abfb5e8402e33f93a068810fd704c9d2d42c632f546a754b2c94c02682e0f4eee191beb333ec1454e07a8a21ab374c5f4245036305160244b938000ae439434f1e436b44b54100238c8094b14acdf9341438052e669bb867a99989611584dc700acc667005e46ba4db9b2b7f433b856b40bb698c81efd036e4d5dc18a86fefcb83f5ba60da6729578d060c039733185897cc194422c61788c35f043602bbd084ad7747a2361bc4aa7ba85757a501cb9aec85075cbbc0f2aec70726be05af3b60e06e9517a427989df8b2d7a6d030714d90140a2d49e0609ee46d8c715d599595a88f78c3f7121860f334698963cb2a7765e5732dad93e86a75f4817d66a38b02ff25c42b036452a7802a9e622e6441d3488dac8dcd3466715088f54b1f86541f40439028f6c3e2cac8e77ff82cab202f9eea467110a0c8b0cce06973a4e375360b15b55116c96e1f976905b8c79fe2a546824fe4ed1d6fd9c3c8e578947944485287324220a20edf222b3e8b8e6a1fd6461be058612c5f02716eda54c301fcf030e625c1bf13b02568da57cbcd3eb2a6c398acd3d8c7980841753a5c5077eed190533fafb1a43b0dedd35ce5e925ddc4e5c9be0caa7bdd7cd76e284add5b73c074eb4a6e03ce9407e1eb34e2bba881623ec3c38515fe16c6a683044430e36e3331cbb71f32b82fed9a1e47823b132fd5078c2638336c0027ba1aee12bec29b3b7661c3e786808cb103a058d17d93bdd8e98e20278355795bfca1e0cca735d80c81722a178ae90e6511b05bca5216f99908fbdec790fd0ccb68fcb5e5e5634932ba19695d0b7982b222298ab9bb73d77b6ccd616c50f8215974ccbf051b2c07c9a42575da4d92a58ca4a9707f1b26784545b18c5510bdbb8cf2d5b8fae22c9341e8c515e6c3448b6a25c46de6006b12671150bdf042582cd8d8f43db26a4b6d9103a48a01d205ee3d968877cc8705ecc448761159f673587ae5bcb4971fb216e6e1c8f22b794c78d83f82ab96703a2e7ac224d4f04806c33a2e274f103fa4c803b15f7417d1566f95a751c564545b6cb5b690f4c4b8f9f95a31f8c51a1dc64c913ec8a8eba7cc6887194ca344dfa1d9cb26eb9766986fd1a2f533c6946809d044948492c950fb38348b35b6b11df98ebae2103c2761435fc310850500d21be098d39ecb3bd7a0c3513423cabce63479d91985595c44742c397073defea190e5eded59509051dc614ff437b057e2d89e7190cc126383afdf5614b62dd5dd17c5f0fa7d767a88de7dfa84b24e180c0d064e8c12a51f5a69a8eed645335c1f3f24c7140d31c2cc17f66565452513790f22f42265c0802adff16a69c97ce7170b69829e523f2936613b28b031cf574263d4891ffe94012e04f0227415b5e341ccc10c1f5ff59454de4c9ff80988dd41a9dd124a3bc6d10c025edf756d4e3f71c974ca41bd05e737b5aaa710bc268db863c54b43c5d369dd743e80ec584d5c8e71866fec3296fd4c26486c57673574b5b3844067852c84d03204e787e7335aaa1aa854bf23414a97a6eadf1c4dd6dab28b0a940cbc41de089f0d01cc4d12830e5dd4a40c10dba6805646d6f9f4098ff1731e1e1a11af0c2c3ab3ae040b8b4679db546455a4486c2855a290e15d1daca8164c843c344c7c00f8a3efb87b955f2a1219b2189f268c7eea1914a65662f461c9eccfe0dad338ca62160fa0b4e76732284679b2dc90a055e0ce1fb4ee25670d4fc50b8253d6b5ddd3ed1c2aa7de82e9f6e266ad9a5e548a8bba8bfa6fcb57e54f133b29d18b69e347251cf324c2142f52acf797da921b1618be4f6a171c6dda41da4bd11b54094a3f4e1c12e37fb693f940a43eaa119301065d217d20986537804aec707c425c3eac01b35120a34be775c3a072c5c699ef0e4a5bb6fd8aaf3b88d3f2210a02610d78a9bf796c73b3569eaefc2fb25117670bbf6f76ae6957cee3214277d25b0bfa99658989c5e32545302639f9760229fef6e8ce042f0fb94d1d027f62947b6d11b150f435d9d2dc585c9636f7890e18246f6deb1d50711021762e2c204296c40ab478956d24a2204f24ae03a3dd73e2a3210626b2f0e3404fde64d4f61f28b7a727d9ee4413a27745a60786174d1ee4c6e76eca33aa20e0c884f8a86b7c17eccaa045bc9c50247a79ccfae09d40a7f949f027da0ba57be6180c2c438e70858c008e75a6584405e99ba2817dc5bac52b2d3a17118afb16aeebaf13c042ddc29aa100ca924f356429d34c9bd8d95aebd0ddfe896c0bc256651397d1872bfd6ba81abc851a083db3e1756e44c5233868f97d5e39c3bad5912a3d8ba8059a640ab502fece765d2a47a6396470d6c9e07801c65547ce7832825545641aacaa3c6ecd1b6a1978271224d10bb5fa63e2017f18b9c6de684892044ddcbae4f2076dda120b93e4636f9c8576a853955c598f8623fb1f4032593fa0e75e5849933d20351ecace83604db22d664db1ed5ec2f064eca4f9d89576879c2f1db80f500123623f25e553d86d4bbc746059db0d8dabf76808590471e90854364af650bb88030865be923190e2ae8451f57d5155c00210ed1f5bcdefae12fee9920e2178d7ff89f02b251430f60120f85d2a80f5a8f47721f1c5d9ab0c9143ee53c737be3b6b13c9a2bbd570da9147818b3e6cf56b3d7015cb7fcc39fca50babd83a229d2d0889052812f4bde8cab6fab77781c0faca838c51bcae1f32c0c72bfd1c405c02f230e70c5df40f50ea16492804b92180ff3084a42c8ce1d92cfbc0700697c92ebebc16a0427ddbd077d61351cf100c6f020d98760f764b312110e9201e124a48c2d95601ecf27c08363b124b6ba87095e3c0de1feebfd8737ba9ec2d802bab889fbe164567ffbefe2cda9d9feee3fe3de76f78ecb7a71be3e365c87466f4c8089632c67b9535ae2f3575eb65e68c76a06b97290c54e0fe5adf67d9b4f16b5761c745b73df7fb401d3094e7399aaff571d2cba4b492195c1f863eea89401ee4fd308e4f896cd5907f57a255bdf3c39008fdec8fadb801ddab2fef1731c64857fb90c433d3f6f323a9d5980dc5a91ba3701e2767eaff5a02e8bece5e7a0162d748576d4bdff6ec32d0a8ddbf2697fda5781a6b97e52973eaace8193c962d5f57985226d489988ae4b1c9a505d69431513371106261e868cfff1884ca43934792f037ff4509f5457067781393a83da67820227d53d4d9603698ecd718e33cf4c2a95f9be4ee8d5891915d57cae4eb360b33fbd1a76d5879958f40498c0c9e8643bef2092ae55c95353084c63489eab80c3cf6344a94afc4c761d641e83182d6b617602f83ce3546dae77ee36a4f0466b8b1440ef127366390fd57359408a3e471a42a6bfb4d6588f680d6ec1089e270d6ae5ef8ab623628518e6d2cd1e5682921e089f9b213d5fd2b6cf0609a3135425bb0cf526f54c10803538cbddfde58cebb1272435946c167bf633674b8468835521cd16e8250065252fd89d7b8cf88dfa5d314809d3fa67d257dfdd36d188a939d56966c335ac7ed88a26737b50904c85f3b1284d22385548654d2019a1d474d35280c0ab1eb13d4b372b5ccc15a1eaf96707578c4c3fc58bdc591a52e5711176fae779711fb5ea40463e1dc20207e1cbc98adc6df17312aee768dc49ab0b9b76ce8681d644f56c976650c75b4aebd323da16109bd260e45347f0d3c3690b088079ef1530d76dee592c1c717fbef5e67d4f36861936ac1dd11bf25fa28811c71e5e6f8e07d3354ed7957d03bf0682feb3f39ac5bfe26607fea8e14abf7606845ce0b2994b2879180951763e0b34c7706a2c60305d2cdadef80e99551ae7457900991d47ad4c4191b87c8b17b58958ce7d8cf6740908ab0df86f92e2d159056eaca5217404d5256110b37b49c107e9e850c64e58a855522ecc096ffb418a6079a0b7b955a4b9f6aa068f1b674d80c1cd013c3423a8b6fba116113c81bfd1abed673022e65bc8fe610fa683688b5f4813b82d9a363e473ad56f3115c5027d7962db37477d6459a1cc789212306e31c6c2a270d0deef5e7760743bf0e4f537a5a9ec3cf97670f999f04d2d1ff2e022cf76f6ee36a57e2fe1a543306ddbbd1b85d16fbd26de5de9967401e74ff4793e44c2238708d7d107b73be9dfd3cb9b6f21e37435c51e0bb6a2e7d5ab4f268ccf41d25eb5f58e797bf4a021819459d295f35e692a39d3e533e91c4f58f82bf9162c09e31401197112af07ede90808fadc722ac79b47160f10bd818216f6119379eea0f754c6456d539bb0d2549e99c7eb7e364e451bdf251531ca6ebc611b5771b2a948c080c0b8cb245652637ffe0c4f8e5478e3d67ae3ac742e6eab845a1674713dc0c589642791f0705d301cd23a56e4cef52d8befbff9d57acf849fe43e91877735fd2acdad08ee5c162a84ed9d051f209c950b20b9f244a7c24d67c10740583e81c3723e6d0fcd5e94d0b670a83c00e4927a1a36d5d1ef7bb7164f6df06e2bba19ef0f1856ebc2f3144594c3853a97275b882e41a88533607162bb4285d31281952f4695da983106a0af430cc89eabdee57024a6db0cf89dcbf75a10c49d0ef1fb6f67459dce5b404fca3aa7516ef5c2f83a79799ef7f6002b61e5cfb279b421a9767335eb31d61d3968db7308222d9c03a5122c3f2f54ec3b8b293fc49f750caf98cc1d8f15e72ec63e594265cb913c9ef5be8c7dac3bcd7af246ab71b6808011756c9e3029003a25818b9fda17c0b8a51868ec006b24ee64168293a4aa8a474cde4b605b8343ddbdc4bb46e215e320e534c07c91359531c1f7fb28ff5b459f50041360725faa6904063224c6f975f8fc5f290feeaa395363ffa0367631c014f6b313043297248c0165f751c2804d02fba0b4103583d19c825700e2f7522d734d3037543f1628054962890abe97f24002c98d67bed6c4f5effaea91ba168950694b6c98c65c558e5eaf0f3ecf0a353cb6b49e6c50961b011ae063a140b300402272a453f4d50c35f8d05e48a16b30bfae280f6031f63a8602e8dea8edea44b14cd7a892502d234052fc02689c10b86e8edbc41ba47efb8d645b545b09bb8df8ad6769f112d5ade48486696072952ad2864a2f039d67cf00d14ef185ee07642f5772433a5d32c9f373dbfdec67c0f8ec0ec12fba95a85494e88663dda1c60449f72354f55d7a9780225bbdfc5db4c681901e732926a783d7923626ea0e3d5b5de00d424475c1ad621c9a67ae0adf6e0304b644d30d4e520daae3fe33d02d669beedd1c5160f321cd0e2bcc170d17166d6b573c2f6744ab0627122a302328eaa7c2b4934ec6882b714adf631e34890b7db461c37d28f4d5ad6c05c218b4608597537b85b32b6248d0c66570cd3979e954981018a7b96aa5ce95338c8805e222ac62393e5cf7e5990fbe22888a167e0dc5453f6363700d9f08d5b85f181ede02dc942df991ec7b8829d8ae1d4db61a635ebd58a506b962cbf18fec2a265228c15d7d2c86c953bdee8ab99fb9ea375dbc97390587b1bbfd51097080141b52cd7a4dcd3261c83935b6d4873325b39dff93cd45db311855d4df2d6e7c1e00a28f02a71c95fe1b3445721cb30035c3d00b95871a03418916b4e3b5759945e5396825b3c83037e60427092de00e06ad559a9930d63d857c051d2c7465c1822440fbf5dbc40218904f3653d2cc4aeec4211590907d02e3c55b0600f91191f0ced5183290491fe936e0bce9035435975b4f6930507581777c0551a4a47e9c128d4a49ac464e80a8eb54b7241e8e37be9c49c9d93132c28e338d7a4646884cb75d873b82b79d64e78f3df83689f07e2492ba74ac3fe22c83760898c05986dfeda38ec2759003fce6083926e2967d249c4e143090b810448da94dee1969cdb3b71b157b785de1b7ee89b810d38370d2afff354ad4a6c78373f6558b54625832768fe8575a346ad82686f45d7a178478a120512091ca3141ec694e344296441518a53be61a496a62b0c09a5efc89f8f9c8af53c356443822f03d4b4c026ad9f28a8df0dbf838e06df7399515458af0c0b946e41467885b378747cebbc4655ea8e5490644e3d2c80d537c1912afb56e95f8fec707fdc9722046146b0d7895ebaec6abb64fdfdbb5207dc87b3c161597013dd7cd29168e08f652c9f9d89bf34afe1d69965a9f6a92a7128764f8046f52ac1dde3801a1b279177e7345ad77bb229fabd0b3d9934a3f3ac39732f31a5da2b6e74d3614bb91af4a5ede25851eec52932311c2f75ed8c63cf97720ee70f41d8cdfbfe88e28045d6c602a30a5c52141e07d5d74c4fa28138b6d4459d406c47d68d65d5552fc9441f95b253e741aefe47d25b66cd5764a549bb575752c229d15bd25a36beedea89dc864692b0552206ca980ab3154a1d7a721f1e50424dabb46d81a19eadf513e017e14f0df3f0ac4efdbd4e611010dc9b930e3330aac8546814e323e864d4e69fcbe113088ea4f6bb8edf7aa15d9f0289813beaacde107ff29f536fcb4f12805b6cd5db20ad8734ed7d84d093cd0bc492d7db69209a4fd18ac3c75c2040a8875508c2a5913aeefb09ca01963a1afd707a6b96a6fdad54c86b9453475921748634b876e48051bd07bd43c3daaa25821706ca51e36fd98352ed446b469c2747e474f5d30d40ea8be40aa2595436fcdd4431da8a52cfe98c5995d5273073d111896c40dae823ae4e4e84fbfac27db3bc5e32c30c0343970223024f868744d96f93a494adfcdb948724edd23eddf35fdffbf3da1949edbf8f5e90fca7652336f9234f19b319248c77491b42f8288ef590d89a41d9007d59f71840c643802da5ce93699ca3417eb9248dcd8d429425a7bc54ef58f90f21f331cf3b71e9164edd9b7c56d4d38e577632e929a43f78876779a7e58c39b91e4159e67a7cf4736120aee39288e888abad21c96359799015b6f2a77203c42f96928d65b3313ec9e94e3dc8c593d6acbc689f404e3371d280e40db43d28de37fa32ce6e18ccdb82fa2328ebed3720b47915c6348c859d3e5d59c2e6934a739584b05bc69fe78a5264283c6cb08940115a4dcffa4b819141591bdc25072f129b3ce38a1ab867e02004b91e3fade9768c01b87ad26d0540a1d872128584c41b39d39a0dc414e54ff58441aa1d9d8ccb04d6430c210210a3334c3f0880644dbeeb842efcf23ee3787a28e67d30bf543790c1d3a1a82ea2c7e76e4fd383910dc08630a1082166d2492c5ca05b4d06a457f764fdaf9c1d66742982b2e48fdd1cb43213712010e1e4ff5487e2c577bc101b3567157fbf42dd29e6e77ebd5278c78d664a6c0774cb6e54fdf0a0daddac8e4e0a7f0491f4a4e6d80e3799e0b6ab655895600b81349f42f0bcb33c72f01e3adaa2bf925698f064d79e4e18da13ad5d6ec772656493c5e546d51c0c891857fa6ce02ca038b8fbc7117817df00b7ec1df5d1f4b0cdfc6f7eaf179a85707de02f6edf52cae025ca97d10e8bd4e3c0fa08ab4e09ad4f6de24f5ad047969d976a6aebce0296c3d34e6e3e83b0150e9408011d7276550cf71b1b0aaf52f9e195f644dee23e0ca6e82f2a7ec92ced2ffdbcf2facf636179c761a06b4b21a130a969d668bad95109a5107aa01258bf0c46fd61183038eac456c39258f5478092a5104baced210913ad023fa3211fdc1c8c1720c4955b92ccf7684defb3008d310f46f6a68e790634c1e58170a3a0da801ab89f4418514f02f12810570f0be821210f5bae4065683b6ee03fb80ac118d68bdd4d888a7006670a447e85b6951d8887d430e8ca3099832d30f131ae85701342452a217cb40ab468ceefaccaebbc9d90a6d010680b415660dd5dda68bb1b48f08aea5d53d2328622a99f12c6c335a58c5ee49d690de3b8be67f70875e0e04ec701400f012059957dad5c6ab09610e2eedf0d1f3e1de4fdc5e5a59f9ff826145c57787e687b0d2da2521115075ba5b64e4942e8b1b17db9943b0481cfdaf4261ff3748a4b9d572dcd822d8d259b60e622578d4c7f3ce84cc5b00f4b370746553e27bd21bced946c4440959687bc6fa563b6dedf9e9b88d5ba3235e624590d4d20279d9e218e0543aa2a07684566d84467517ba52f4cf46d86203728fab046ccecc44a8d4bc8ae7a429432197ac110f8345a74bc4ab84538d83484586812836762a080a43570bbe17e45dcd0ef9d3bdde6f24f0b4e2914713b440e504b9890283b7b4a4ddd22ce95a388c068612f2a47b7b0d9b8258f750576b5375fe9ac7b08823caf34f8ca4182fa8eb15885d2947a9f715e647c51afb0e50b316fbed4a4c049ed8b11cb144e73aa53fe195604214513304d8bdad0c8eb38d212d529097fd046829c910db47a5ddc3fb35e492287ac88d03e11b1763f26c7d781e0c8b9b8b5d9c0422d740765c46ac7d60d1923d0fcd14b32310be82bea5ee3cb35163ebfb7c9b12a92afeb69fcd40c9271453dc9eb024418c06f716071cfba3ae581f54c7875127c64626a7e3ed699905547371474c0ef6863d38e2584508df2b6d7d90bfbfa34a3e60ac70b29bc97b08ac3cbe6fe8b4ac2b7333a88663deed02e6b8d185de472f72dca099dcb8517dfcb32e20402fb98f32d1bc83b3c1bf0747193702025e23930b2d731bb4d1e2463e7a682bd354c68d9a8ce6f79b1bddaab9224613eb9d0ce59a5eb40c4db22a4806b2d0b8d12d79e550d8a92f5a509460dca87e69dc680c899ea2e438aa030ed78c1bd5c56418a4ac79c8232b3cf08fc5e24677c955e19b65cf29eec5be8d1b75bd8e6d1bc78d9846715a748d1b7d5c95dd06dd9830d374bc86a681e3b89179e16fdca895174f5fe0b4243a516b943661253fdf044bfc12b0c5c7089621b53eed9a43363c7fd974ff7b8a51df14640b884721a8ea19c44293bc0a0e7a38d81a513af5f9d0faae07f45f579cda7aeb9e282f7313795a87d6667988ca4f974ad219c16045998c4bded570773d09236754c0d5a1e31abe34e8aaa11a4451311d3b29624ee27c77404f08c406328c043adf7c76f497b3c273a159ad68d422457da822e06aaa281c1c1214ff215814d9eb248fee1d6db84fcb4664b9a37cce50e3568f4c7a110227c49279511ba09360877e2065b9c2ab919fe522f55f2716a107e71c46d697a09a35489e311240990d93d027eef1c78a62a50c8d4e9ed344c1ab1153b9fd6485bec75ce4f120b77716d8964e4ca290eb0359e49c69e1f35501a2e0ddd266a1d8f85952eac6afbae860549f8c2b7a8f69c0d25889b657eb6691d5a60bd5bc354dd06d9be1366b0e92042981d5d68dab687f9d6ac29c3cd3a87fa4b2a481f6aee9777480273f26e4ac2ee56522a101a78ab31152b5d6a741d7036242996321fbdbe9e4648a5ccb74c13ce807ffae244b3627aac85829c3172653a180ec0acd66a9392eaa0a9c885000ce930d28b271cf6dc64b7c3cb67434494979a651ecc3e805a03fd55afc510272ff4d559b018e880120069c014fda15f86ec0b56da53fcbbf49bc85611efa540a20b7ba8ae0f189c2bf03427c15498b67e81b44a4a4e0af0214574dac2d119cfe74b4290c445eef13f0afb69bdd93fc79f257e52c8c140efa5f4dad814ea727b97d4e2cd4a64f903b079d29cda15d124e290049e00df8f1a93e62c1a7aad6ffabce0037d00abaa73baed609974f7b17430cc2b9a1c41a1b3cd7ac3afadc5a961367ec547b5591e546b36bf7eda65e3a39613817621005b1fd3a21ef10a446aff2b42667d0bf5479e9001eee84ef2e714b9338d2c56e3f0b526cca650b7f68524301d8be39943a303694876c277f9ce6ca85034b73ce2f1f3807661e1972ec980550f2e4ccc20d0ed74d7d5b4f5f11eb7cd912d85ef37ee25951278896e273b9f0c20432590dfda1de17210bd3b0397b73871793f1530fff6617009b52ea73efe1e20532d03058b4af050a3b7653def76b40bd8e29569ae847a0651c28daec4067c6031410b33bf22019759eddd848bd5d4f6df9c21e70fd9a6e7876763b4fa1fe8ca54d24588b1b4df1283b05debbf6df5cead7f7f0173d7f299c05b7f14ad6df0be306274221f571c4420a710a6d47d627c98114012e880aa84a28eb1ef6d0f49c02d0b32e2656a7bd4e1b2a3ee70315921b9eda41703bb55bbdd6fca4f709b890f6d372bd50d9bae41d3afa8ae78edc6015be1f075109d28c4f3e6b85104179b855f421dea9138402fad98a49167361b0d74063d50c023118922544ae0c970ceffa907772fbb6a52440b3f4c10eecc8fbe048de2d3f04fbd087b76173ce0c424b744b5e902b242d8f9db17a65f654b356a3ee7c4509680c7fb242309f2119f46f15bd4afcd761cce5dea5054f395037534c0580640cb9353b76e4b63381a5d801d093e036d9a470dc41ffb22c2c202d4e611e737af04da191e8ee6d67833b58776332de294a0c474db12dcd385649ebc7acf7354d8d9772b3856c653ef5a6f17d795280509567a2d99a468db987c351684c7e00156278cca335b5c66630f7fb853c9f250abab31145f8b981d194ed4015951d7208208a31518c3e9f49f82f6dc7d64ec381d1aa464898d448407cec9c7447b331cfe932eb047c3b4b7f3d820eae238d00c94f5a01510b50436d2e801af1b971770db49f8d21866d5ed9ca5f136f3f5d0ddec8d656ccf1e6a1fe8e26c92e4f9c112ba9d19c6807d5a837ba28feeded22ed91aa6be3904f36de822af39cce4e92ed0d560218deb71142ba8302b7e2c02b4fbb5a9324b36896779ee91f2e6af502c2215b9b11848f3aa1c3e3eca64a032d3242db7db202a520f4829c45a75dcf250d1737b62b8bedb9a887fe6efe08742f6ab8bc5b9e1faed4676f687871a3c9ca3f82eccdd6f82ffa748359ec841de27c06d14b8d2edda6d3ca7f26be0d0240731a802a32ae4edfc63664500d52015cb31b2a803152f9c14d1176dc294a154d8680f6ba620f3cc30fd29f1db14e195774c52093301fc56e24c31b87540202b6ad13379fe5dac6b207745f33d8cbcec0cc19a419ff0ca44e1ca8a2aeb83d100de8b71232c2a3b3b8bacf221421a526c6c2c762321b635c513e42c0ca3aed6f948619278349d6f194823e1aeb5b2aaefe6511b8cdc0da2a0b1577682f7ee84e12516f887422ea31483c485ebf941b7cd7eedd512ad9cd3e51b2fc87711ca97a3089fff577944e1d43847b899eb3ff01b3ef14e9c519299d33ee16978d1bc27335be31c6cd4dfc5abeafa15194fe7dff7a4bfdc97cad6656b1165c8b681912e48e0d5d8c0586e9e9a6f8b7298d5296c47644cf2fc395e833a2dc42e22756c2722645b0b7903465d0115482adb70b0d51767ec7de7ccf1e4a3b64ff49545df6e5d32b1b40385ed6597ac81701aff7e62a023a05820393ae03d132cfd92deb7ec80c153774553ea5ac20f21394419d10d6e2964344b3d79605ffa10c983f3e5b0c63a225cfc9ab15f2bfcac57b6fed6fd260deab93cbe2fa44390eb902b2b63c74e71270bb9014746ceadfa603f464785c51fd72957d1767f49d5937b8659f84dea8ba53b244d3254f75480ef9535a362a0403039aadb8e2413d1dbe4087d0df89056d6c651e106f2c1ea112cbaea879a800ebe8041a9ed8ad17518d0c073f1f324f77efb8d8a6ab34b7c8c4109ed5c9b0be9aa2ec7fe92b741b66ea9bd877ef8811bf16600bebd92af4f1577a051be549fb4fca37f6fb4c87704bbabba97d43f74abb26930522e6ae4319b0bd128681c50d678a34f3be8b112937328dee282cf34896dbea4cf2a06fae5a4ac64fd7795786ad097721a4fd43e33a251ed088013f9d95d54aa7e1fb530d8ba7a6c1fe2e0a1077dbfa04c74669f89612c6436dc055091f17927c59004a783f2cd9cbab6d9ed43c29a0215709361b34ad2f71c802a0112feb1576b70d7fc8ee6527d05a8223e852bf0ba0eb988b311acd9676a550fd43b8f6ba62188e1ae5358a2eb741650add96f4a902b29d361dfb35ca2ebb7fd975d8e5d397bb8edd76feb2eb72dd5aae738e72258b9f10b5aa6f093ee49abcdc08782dba47966b5fa7719d2366dcf82b2c078a606d5386aa03b417ceee86d7729dbf398aae11288073f1bfd5734617be09cbf5a48fb46f5603beb7750e68419eef017eea0980f521cc4c37b527bcc671bc4ac9548ad8679962932b0d942f81adc635d1e7b4188b9e995f43f61704946da0cf022eb7f5c1a3a1a648092e3524830e3e88271850cf14a006145d894707003c7c69ef55bf6d3043ac4b593d3eb50211d0272770c3bab22c095fb1be7746f989468e4200c50275a81a6819cc550d8f36d4a6aae65a9fca004cedfc8c89b1bae16155738470e42b3ed41e628e34c4f1005f590b89aab7cb8ed10ff33e31b95db4b6b3047d2895c23aa25b8eca5679238bdf37d088402ff3e8e29eff756e29a146544d809a2c54273b26971a4dceff445153a9deaf46aaceccb9d53705798393bba95633797fcd82eb88b6769a5ea8812bc91af9364e22579175a45bbbdaa56ab752133e55dc26c70072884ee07e0ae37fb86dc50fc12878201870682b50d449ca6f14936f546453571072d24395a0ff1cce8ee03a41ad00d456647482214658f6f41ba1036f57e2286d45a63b8d556cf29ace1399c0668008fa30451b2666f1199999a8388c7e82cd92ca6827abcf662d786ca2c9bbe27f3ffd4864a2eff05972dbe11902388ab3053f90085ee2a4343f5053a1ea24684022787dae80fda6b71da1097964a7275b21ca640ac21d4916309877694229ea00a5331c607941b1c40b44f0972a1712dbe5143b3bed8331a4de4f25c0336c7816ceaab419d24b5d14101cbce6a79c31d8506304e5a91e52f81e872cbd9e3ae451bcb60e30476c433047f191c56c2af7f8896d68fa3c58ef385c7be704a3519a6e75ec22fb1ef70868cc76d13bc5c610ccf3c2231ec07a34b98bfaa605bf9da1502a1f2c667b594432999dd61b3efc059aca64fd8986b9cbb7efeeba298766d7b071b8b0dd4d4b6fa0adecbf65031f3f5b09d5f04ba84078d04336ccb33452a56a07897b1d852ecb4911b9a7840a58486f6490ad7b2a98f57d8d4488d74744cd76c4d9b0e1eb8d674d05c986c83d7f0429076624286461744a870e6ff691756c6d1644e7a4f70b7db4011c6afdd998b20a772319fa344752204f996525454fabb6f66b0d9e19fb4541ed151feb2873c8d07b194e1376673fb8fab3e099d9c1551a71c0932a6142b81756a2776a6942659dd35da839add99eb129f8ed6253036305d2e010351f75378f27cac4d0e0774ae71c31279695e3c1b69b23aff6197b439447b074e5ae5c563ba46c90809b681c9b520cd51d976713aac1becdc6a7f74202c9a162e68978ce0dde79f41a65d5d10e59491112f53673c3aedc811c87cf8df6f42fc35b62a667f4c26b9bb460387d7f86e28f34b49703a7dba2d2d724dd6462c72c069a5e974307ce993c86f5ffb40a2793f72a8a00a350f235ad41409da95391c4ebbd1b935a0d414d61192f5f3b2a78331a9906e220170a3a381aee90265919b1b4d5d977ef4e6c70c04a3f7a7cbfd8ccc29fc6aa98bf635b67fd79e4892258379216aff172066278ba1beb383d380a05d6dd3e2c4acbc9f450a23c7068d7098d7526f279b3fcecf2a5a78b6b690d2e6bd6bfc416975e9a3a8bfad83bd35b6b28dd908de7c228e5980aa0ca2b9db258a3d13116979474154007b421597f6c5072de9f3314b9c949a804f2071d9a0e3a8297873b5a1f5aa6bd41a2d34bbb498f78d2fa0cbece27c5129f2695101f2b949d30257b28f92350923fde2c35bd3be780fcc4302dc4db8de28faa4d2c3b2b51a5ea9b1c6423e838e622280f195d6ea867e25f689709c74751f4136af1976a8c881a20658d0ddd0d5102fa0f1f295df3bac3476d3c595cc7761624e39facdb2c8995ade3a9665553a03d8750d67a37dc3a7b68c2c3752a10ac72d305ed25046e72bb50d2b81cd2cdeaac571481fb87446e66b2ab9fdc60105b5549b27613ba7c79665fe0cf098d059176e86c6c641d26f5109ea55cc178b6f2e3f1dc54c4ad15a9e885a5e825ef3643172992e8a1977464d8e6462081a864434cbd150d7d3a18298d9f5cd63d7c12287c5b198cb3908acac9314e678b68ddbcb4e0c1e79246884d851533973c52a19b7a23990b6e01d29cd5cab9be80d89aedbd4a831de44249b0a7f5921f47df0bd5a5ef02549f880643ac9b363d7efc6cdb586aca480a12127f51913a843663f91f360c145af7b316b363413822b876e7de69cdc7e7bb413f240410d8d7e17cffb44b0fe065eefd6c18c143d70c7bdcf989e917cf1b0a779bb4a99f1d4c386a3877f5372b51321972f37230f929e494c6f6990d2647a4c6b4c341c9e7e7c85b2ca0c257e8c09ed26fd9f63cd2083e1e0f235eafdcedeb45f1eae90a24d04920286e71712e72b702eb59c096871f6eb41058373f509dc19b30220f542812682d3d77af82fa9b23316c3d95dd64cec3cdac936e0872824674329cdd6ca74a4b2aa17158b7ec53eb622baf4456533ecd5f56927dc9e19948bcae437ce6417331d71c9ca8554b77cb414df58d04b79bee4d8ab1f30df020943c8a98d64d2c1ccd8d21abcdfdbdba26620a5d29656d81c23a1c31899b58451e647580a1e485618585db814ced49966137612e2e6d0dbc311e6d3b215ed05fe3cb34017af904b989990f46c48d81219b9d3173f3a1600eb38ec068c59d0c594f8b597c42613ba1215bc53db8356e8f2bde7e12f052c8841df57c6f17abb1a8622950649ad2974be5392a3ca93a9db8359644590729ed071090146309534f0a114530b978cb7ce61e0e56de93f75535a9e08fd1d23e01ba4034b45b9b142380c801ca46a5a0b9e429038eff3d78a69e688b1c186c8fb7d21ba82c4e2a078e3894e476d43dc9f4fee5661aaa1d62d45c0b8fae91957f880f4228f6b37413bc434116680be99cf2668fc0f89eabd39a72276292d6bc4c3f04920f3417be28afb30122c6ffd2197a123f925ee56a0bd9474a31c20f50f75d6469b2dbb95829a6eaf94f6976bccb31a70a14cbe428a5e847aadf936addfd202759b7c2e281b4c613600673ab5651b15eddd4be6fab4e6bd1b92bd07ce6c82fd50cecd79c24fdf49e24f43e3f61a9efbd6a7feafea684aebb80cd98ff9329bf1f9ec9844d030264194241cf08043b53b01c2fcae20f605858040d2fea60cc081eb5d6aff14efb4bd89208ef55f78c92caf64c594f0cf61e941668bd9004d0395603f258bbd17ca4ec14e79f72d636534401a40d8820a56b34161d65ebd06979122093ca21b3f368802a47dd76940cf7db1bf8cb5d40cfa03e0cd0c2860c62ca06396a54bd6ae0dfcb50351fea3dda6e664c590d70f1d16e9ecaf4aa3e5b16fe2b6530ae1a326b87b992663b51db6db949b5b644b6e1b7cab399b72ec25690d00808bfafa00b3192b162cc3f08253a57a60f5fbda1e66058ee6a73cb5087c708625b53f811dafbb5e0ae170d47a9595ccc2949e8104296e489a8f9c5f4470498295a95ee0ba16d5caf8d3adc86f6bfad54571992795eca64debc756db8f937b2b9a6e3c38d176e492467dc84ba45e7c704f52e8d3f6e526f8bc56a3e985765b006ce71229c118d8eeac1458d694f3d6e2b5d181f26a16719aca4782ac60026cb956b4a1abe71ee5c7013db2b61c76402685a25055eb889724f89da4ab829e016d9a7c635814d6697c44b469075e9d08cee6b84edead667052710a5da499376dfb8e7d2d166073b44e5b43fa0b32523c88a128cb0b8686800ef6446e4f569a5ecec7811808d1c44c9d49d1b3562f5d79c47a89b4edfe9159d3de44ddeeb97fe6a53bf20387b3449aa140ae552410ea490f31b88dccf8e19bc4a277fcc81c61bc785508d026443764c90e6105fc3767a90f6d4fbf5ce2fb1df1b5cefc7999c451253ec17e798ea967713dca391091b0187e12ec1b6208e8c33116fba585839f061aa1eeb7935d34b8af1a11cd12a3d46d3b547866b7c4daad937632e7c933bd699df9438572ef7cd2642eeff05143d0fccd75cb14c9763e4ec44e92d940056da121718cdfec86e9798c5a853ec66ca94307bd8368c38f61012c62bd59bfdac2df14ede64d4842f824e8118434cab664aa23f0744c30fbd7b36544407e4b93d833082416293c34057f8442402179442e524b0b828f8652247a9e302286c325a9affc2190f6c8a8db7e1986a7b6d258a7d860925566446fc6025c909b1aa0763d4e4952bef670ba8835aa1643a99c8516086d123e25a05f8432284b7008228dfa71599622408bae71a940617799c4e80233bf6a3eeb4f7d6fc7431e19171f80e67adcf85cd79c20d6b36886949c1d84d633dc475925ac66a551282ba7d5ce707713905a626b164a7cdac1d80988a4d096948b5de978ea2791731b7690fa68b1bccd524ae3d0024d441302db8c1755d8803e007b015c6fdf9e5ac7a1790762df2150d53cb60458bce98160bc9365ad777a0dfef1ae585ccc7157961aa591756d4b2260d07e738a83ad8b4215aaa1b9b75884e5d0359c41024c7268009cbf0e7657f776e5393cac2becedc860dadb2823878de8f75e12ee0b047dbb62630b72df692bd6b9b021292fccb5009bbf5d7fb9d5c2daa56cba2168bc8f770f75f5ff8481ca1e241648d45b1bc53854e8b18497bb4e9d10d39da4bc39441a21f7c19678b95a3a6e310648cba653a974df9c3852c3cf99d8bc52de7d0f840e6b9da92499462575f2c2ee5d93d820e39c3033fb019dc401e43ff6ade00da306d1cddac9ffbb7f86cd49795bcab3a92c6459c5d7838509a82e295a975fe18870c690bf511928cf73e6230e24d966a0d845b6c6e294da84fe6acb01d1df049d92586ac1ff9f52887ad3f09ac86c664b53fb89ca5da64125235c681599c8a249b92436ca8c1dc6421e500edbd3e499a8708850e618c399956c77c617953341319639633f3edac5e98be6d4efcc506a12e311ae50cd5c446a5fd3b9f510a1444c6e414671cf8e10a4031e48b414e045e8b2e49158c7c7c89980459c541960a06d8437e3d20f000863d0031f2998bda019ed2acb2b03cbe090d149d72788d3548fb29c722907befbcb39cd101a65ba61b0cc09b728a68b2397be0726d38e390a53094d53cfe54242e8f71bf71514f1c768a31c9b06dd203131b50a96610a7126172d8d8a5f21695b512469844f37585a350aff68e71e81ec050f0c123ee1e894e64d7ce6d9a891a8960c269100c7b7f0f26cbbc9f76fa1603eb804c3b3494b87b9eba126082f73cc17ebe28a1f6d234b910a086272988e788a11bee5e9afecc5504f3105c7d0494f3df9a0c16085437dcf04b9168abf0df65c56fbc0668ebba97525880113c6df07d0580c27c2efd44d42699623504d30ac3239a248003ba0fa2cc5a2a8d7530b78847528d83ae59e96aaf9a91e0e4d21ea38ebd5607eb6d2223983a54d585851ece1611115ac18f033477dd595e00eb22d72a8232bacfd2c14f602766f1e6e84c7e1f238ee71c54f33d332671e2d6d135b034f0f289765483465e38c00533a18ed5e65a3744e8d95b2c5613b9c5d990db6f0112a91fbb6fdb5c401ee1ac60e9e580b50a77b8a4db18a4599912863c1df7826cc05ad2e09f044c19c92ec33dd3c16d5c1c12203b064a4c9e51d8dc36da3a6addf57b8c002563d70f65eee62010c2692af411881b53fbf58ac9b31a37b2dcc782a0bf6cacfbd58bd179c3283f4497e58f2414ffd77fb6be0ef0c52cf067d572ed8d815bc8377bc4745c467d85c31d568ce5598767c13715be8f15e8d9f846e7312cdb64142171bdc00c03d062a35617a17bc3ba5b390abc15127c984a2f314e4f53cb036a969c8c839934eecc4e60907e4082bdcc9edb55dafc73d4d77bedd3b1977c5bf285a0bbfa04ac5ccd76b31861fa1dc124a8af158a427262a9afac2f3dd91af273f90960b4f899fd4a318b63fb59b43fe6518b8dc6453234194d2db92320204d0ba9a27129a5fc6e17d677b038dd17f268813e83710e9b55c0a9e784946a064ddbcb16a7b1f885e7e10e70f90f9e429a24b6d0b8faa672a6913d92266ec43471d0559a51d2654dc15e724892325af025ece51ee3b17b34708ec96fdd1a3e02035449419d492fe46a218a8463c890e41bb5f6480d8203cee8af9c7153d222184e8b64f217c0402afde1172406ee6b31ca8a5d80035d91ff37d1414bd4459a3e0cfbf9abe4c6c66962fd6fdf6dc7b721bbf0e6931eae00fe1d06573e07ea0d154d95a3ff0fa74c94a4010bad1523f32a9d3954cf9b17d9c898d62108219b2e2aa350ab10d94162c4d4510fd7adaab4e40b3819a5b0be32252bc9fbd7efedfe2513b90c04f53cb21056db23a21497fd1958032799073767601f490b6a8489c823b41849c20bfcd8e230fa8c18670ddc361b4043d943f8239a0e9998681c96d235f58bdb3621f555fea8b8e952285590b15b7f216a577292a84c91b05541b0dc75be5c0b456b375c983a00dc2e199f625d1096f0ec2a4dc8778113456be2605a2251d1817d2d92b0ba0054b5482ec0cc949d5f43e647d103fc257bffd2055801b51b99fa5271893ae0e29a487dd9a7bb7a6f0ea7c1f5130823d24be9b4cf31586788fb1ef917498291749d3e5e517b40f75a582d7c098f09e4c8f90721e79797b62e203b09d114e5a1e46534b08118ef450b45093de841e2923d1fa1122f2614dec32d1f038863c76727352e96724733cc7992bc3edc6544820906ae3266349f2512a05a42294bd25e47b92665cb2bd30c25d6226e414640b89558687b870b2a91fce4d05d6d9f7b93591386ee808714f5d8b485089c9f4dc30cf0b7f3f792f5cff309f30ddb5736fb59e6a213e36f1517ae449b056aabec8a4acb7293c0e6a302273eef398b4c200d31b3d6de2073f2df64dca694d0eea36993ab7eb826f0f2843857427847e7c2ff43f68de743c827cbc42ab2f0faec116064087a60938663733492c26b0683a1cd97d1556165614f9667a4067ecc12974c94b9c7e745cc6c25db1060d836507a36ccfc4b2f9f88bd3e9bc585a0a0dbd108ff38aca46a3d42feac440de134a58cb288f77af89850577bf1fd7a97dee01108496b56c9ae98cd7d312f8aecb66fb12e90b182ee78458c8042ef3d8f11f578b82c6a6415c380db3762c1fa89ee76e1018bd7d9f86c25ac05c2d906d1ab396d68f753eb5a6756a9f87120c8d86651e4af773fd42e8c9e7bed8218c5c30ba5f4d46dbe5f34277de526d6a2e9182b6bfa4e2259edb5e0d99e00301112771ccf927c8563920e61df55b9562d1dc91c052f32bff29568537bd12ced9622bebb6eac4328fe98b9e3090e8f771105e2370182accf90a496649873d1dfc4617737b266633db0c2ae1404202aecd28fc045951b90fae8b52f36b9c2d7d8b66985ecb76cbfc2f398cb97f48f3b8c8a1cfebde8d0edc23c74b50513973fc12ec12b4ed19d0ca7b4aa1d5cd425941abe588b08ec3a2c392f82660d9a6e187dc71a563a98b96f18161f7aa25251767900706b051001448795143266e46b28d6f22309650d17e55c30e32090924896d1695f1ff8d8523b292756ae474c07e96cd72560ac5c4290d791a74c57c1340b9d4c53345646dc52eb24248949b7b2e3ed1076cb2f4d5c557f9e33c0a5fc73763998b9f4369843b093321acd9aa07fd81ea40434d7c033884817a225f41b0b66adac1bcf8cc6ce8da8aed8057fb95d19468b9cae3419b4e56084c5d4e64c97acaa90300a32b036c345130735f6a4c7c73c35c566457420db5f1722731c120748f816dfe71416abb73841bbe544b7285fe331b332f7f426c00c8e87afb774c60bdc40b9a0c91e9e1322bc45b74d0391c241a607973c8c96f8aa1ae14887fa7539f178a0d9a02983dd243f294b062307e196aa6d30b0826b327a82be41717d4170094cc422ccd13aaf29da474988a5d371bac275c83d8c17e73cad9a600476170166aefd47d5890abb439e6022cf8c922b02db210e41082af5a25614a749c20003bc1805f1eb501d8527230518162629446d8820904a2223c29658853236ef2b94fb3a9290dff4a3cd56d5a041bec8cab62412cb044229bff1a7b34ebcd8542b55af9b54f62c2232538b962a48baf4099f22219e7123889f8c44947f11c08c00ea8dcbca257f2371dc2a78d0890d0c324c3be407a11a181b694ee3760e466cffb4064663fd2f651f18bac440fac7cac62e2316f4773fe9edebdb36f59ce04092caa14bb071db176badc158aa6098ed294ee5a87c09078d2fdfc97c1563a6bf55d91c631317cdd5c4d991ca805b6661fc2b5903c4bfdf2969ca6e709e3a682bfe4bf42d155434d458f0254ae184548547f4528ee3c2aa36510d4e890a23b52cda134ee0e2e5455fd7a04eb383e5e810a73859017b5decf7ffcac7f1df08d97b4ef93491003f9129f3a5046272345e65e78117e8da3bb6178660c3e0e861850780671029d20562785d468837ea4f990a1b66426840ef530365f47e9928fcd36648c988043a69363fa3174caa23d4451da9658b89aed7df9d4f385b2554faf91a50313c1b5541909d54176c592cb48559666cc7cc2ef2173a40ea83c4b3a94dcb8b71a98c80970170b517a78a5c25c3dac8a469ff8e33bbcd652d20b12774e05ee92e696962df21e7d6378ba162b86c3cd2c2cd03b22ef3e337bb709be073b4a84718deb70799fe159af6009a4b9d405b9cd3239550f6c1a88c022e61d0e477c51a88052f3ec6f9ec299a479d7e0868599f3be0f928109e9a75d96fc7faf4bdaadb1d2f39ae66e2489641a69acef5ba512a64d62f1b88f0879c107ee577b0b9e191c5c9c823a788d184f7a3b62693d503504d8fdca8250eee89863fe26bd11855e03b935f4f6c91810a3e104f0badbea13d2499b3d55a1715f1468e573b26aa60f7c1e995b69810fe58ff5b299051e6206f1364659aff3575c608c683c94568ea4ab50b78a55cbd9a9ea447fc523cf69b7eb6afa1028eafb85e87d7c50abeaae905f66d79708c599131cffaf65b0725520a4e9590b84bcf470b4b7df8f79faeb0f31860021268da959b0e00331eeb6b0240fb21b84f08cd1faf835fdf1b833569ad0b338da74511c0df02987e0ca82a48dd15e51091872e0238049adf0b1e1dc35ee11cab892fda3dac37efeaa558d3e3351f2b57c17b634dcb2bc205d6415761d34ca54d4024560dcc8fd2f3f4098a950e4169fbf2f47039847a58075c1bc843c6f3669bb9eacb0793ba79f2fc97d3e7f8ff8e22c08461f84779bec5e8fd635aa90173cb74be89c64f00a0f3f84517e643b0975eebab554f4725718fc3daec51ae19df5e973d26a532c297aede8169f7aa0aed7b264b09f23033f9910736b1c4c7f21373db4405b4be5096e41859a398fb5cca45d5c759ceb62976f3ca46fb948eb936d3999aeaa65f1dd6205fdc834a6859a9b08bc03fd8525e7db5410d4b78314a9c36a413de573fd72e0a03d06f9c3fc57eefc7faf97d737583aae0fc66147fb3f22ab70c46cc76e57c03668b556b3cf45a5779bc2aa6cfc5dfd3aa6cd010d6ac5f69e069b820999c4d075a36ca1de54f10583b282bce4335b385689a215b01c8d2b461bbc69b9f3e929c82855a3e3c3f4ef8d051eb8f7c1d2aad272157cf88fa57c4a8529d637f72b378f8d0d78ce88085ab8c26bf558c81c3d6bcd9227781abfec6e97d6051f1b70a4253223fce174b1c86f73e32270b6ba53341845f226170f34b35f8430a123ee2d5b00ff553234b916cd4a78b8e8f194f26bec20d25362711311c6609aa8ecd40dacea97ba5a7234d5c62b5b7ee1b040052611ffedfd38b103750663d489d2fdd836419dc5c05ba46b333c9d202278f12f98b919b5c30c7b1418ce4e9c6d607dcd106b92a753aaafc5f171a76c7cf415a13b23901a68e566face89a9c498a0a9d361c43663f291fde630c0d91fab05cc52b85806f1889b0a11f5c61ed61e28c3af9661e01712dfa4690e07d2079d244bb7ca4a69ee93c8b56e6109760a1d7c94fc15071580de4cfd65a03434392c4913a3b0a9961a525a9a3703910951cbb4c714bee8b3723344f1b5642ba1d98e228df0b4bda2d8c4ea09947b0f32a36d58223b0146c21ed4fe9e1cbb2f4e7773c7798ec040b526923896b5aedc5a322aca3475883f58d718e61a1c1e1899101067a54249aa35ef7628f9b13bb54544bdc42d9d60e6e1580312418150ea83dcade0a56b0df588376f6efa8360364dc02782b2e4d11e484eb3ddd464a2c2ea1a48aa562c85a6e681043f739961a4c532709e956ae8f1d250801a3447482757f4e1dc040cd7be97f409ae17857f30ca8891bcf0bd057d18c815e1bf02fc09da1b8caa331528c85960b6fcbfa42c2c0cd0b377a1c8c85f557bcc4b59196c4440931494ca6f7bc68116dbf35b86f88b9e677929edf60572946645fbe9f4964c72a1625d37e436221819aafaa94dcd7c6b990974d595f411cf60405460e91adced9441c2352039babefbe68d635178f94eb4ae93da4c0909576e70032da804c115a117f2b000442182ba5ef1325d665a82292cdf44d494acc89d214b44cc39b8bd75c27cab67bc03b69c09e82e688ba531e20e194acf6c88cf38d0ed0201041780fd0b03e507d27ee4edfad4ba9d0c4c9652593ab0714073db1cd80f3f9d3fa9d1031fb7875366d762ac4994e4c88fea24243cf9e3107cdde18ca5f25859240d84a7b016de245ab0fb6cee86637b3222a8acda70e337d6ae6b44f4b58a9ec674b51681c436a80256464ed33d602dac8a15d35bf8caaed60b031149ad9f8fc983ae5dde4a4c2c6c4a35e66d04d0b366e6d489e086c9cf241d60f139fb031d99c34e2fce1947af0be80ee0e0f97330b1f07203e523fa137c8868ed1f598c85d63bdd043e049bec60be8823bf4fecf35018aca7736ad79dc78a472d61832770be9ca1af710bfd34f3b45c77072e9404f3b5949d94e45d3c30b1a4da354a7f3fc9c5d1e0b1f98d978bc49d7b0b27f7f2bfa644fcc355d03d6cdd337918c813e5b3c8682f76a93e93dda0e847404ea6f67a955205e15271df95c627d710495350cdc03635a127d2397fc6bd04b7c22fa462e67164e0765b1f47c83e10f80a90276eee12347b8de91b4035b17bb157141c7666f4261f33d2cb3ff686ddb124bc826641342b6947b07be0ac50a2a0a3c3af0fa75b1e946e5ba2ebe6603be17f9ebb2ac0754ee8f789672096738c3a4457680ce5d48673fff0801d912fd7c47674b1474bbe373ee1f5ba2b685086c9614c8062962795c3d33f002073858c1c0a47cd816ee5a85fe2045767c0e7a900729d2156483dcc2fe703608ec8e8d5911c87be5449e177293853decb21acb351081e1d8b22cccbbf14669036a10499d6769e9dde87df17234fb4e840978eab3e1761c6e5fb3f00eb7fb70bf04acd1ef90d4699b46eb06355e5c36c658568c734efb59ff9c7ee65fee9c979c31fe833c2b57c4829391e76fcf3e299d2256c1a68e313e4e29e51531d9432652e1655e54452b22e976de0795c4c4cccfe7f391b5ce79ebd3968e909f725e5e48aa11b15df49c2744116cb22c9ef3b37258d6e79cd5fbe6e59c9f54cb3c1b44b078462041c97043838692fad990b2db2ceb9b57bd4e53a141a3b9af38e784a94fc58b31a6d6bede3de79cdc9cf7f2207675a0bb84fd8ae154f7ea11898201a9ee319caac7bc96eedd2d8f47a7eaa92704741a3a67831089a201a9cf63628a7bc8068989a9cf4b9627a4c80e902d59071da6e88584be7d07e8f4210bb2413edb599ad4a7861184fa01c887ebc4cbbda2340198da1e04dea448404f82ed3015539bb5f144498d8f3127514cd6ae983777ca1a2cac6053ab262073f9866524cb5c9d3ef55915eb9d2a7ddab8a85209967ddeb7bdb94f8fe4c1517bdc92bad9cad1a17ed759faf2e0e51f1c3fb339e796828c862fe8d8f8d008c2edd32062e58525976f6373b22a724868cfec47caced95117f52351efa3e72eb923e837c9498f7bc679f1ca1b16f0c01b19d595f4d9658eec07bd6413d5e40d0c8e5cc87d205e696bfd41b5fec9e95d8f1e76591e60551fde50477c9aa42b315b3a621e9b56891e9685a38948f3411e5ee1e291bab18d38313bec0e363529c6dcc93a3b4994dcc66153c71c367544d243091a3ef5e724dde8e128f9e6ac9544fa4d2615159e735a2c3fb74348a922d2968e90b7e2fd71591aa69337d4781324d48f08f99c4fe5469d4fa5ffc988587c91e68b345fa4b112544da66e66b6f8e3471a36b1fd2102ebd6b0a96316264b23d2cca992022e0a19e9c13b8af77329b74ddacf45e57ebcfa79135b67e5c659f1e54eee4e29648f77a4fc86dc8bb5cbb2ae4bde7a225efc4be3cf743f12cbd76ecc846197d2eaa9d50e514915b19a90424d6153138d12bd2f6b5929b25d2d2ac284a1ca686d80a15a54c954301556e10dfe6ade8fed74ab8d82d466f37ae41ef0c3f436085856b6ec825e503b1601d395dfcb9d94316e667989793054957a7d3ea669fc7896ce2c2b02eb5af242ee920c3908fc882f33b6cc491c6a3c895165d9f5977b65990b9b4e76502d98fea6967136aaf8d49f7cba2c5b38312a8cfb0b74421dd4788e3d284f94350a35aaeebc25ec2fbf221036f54fbe50bf4873e79c342c6d71e1768c5c80359a0b59c8421694a0042544210a51b0b1b14102129060052b5861094b588216b4a005263081095398c214a840052a60010b58b8c215ae707373f384273cc1881123478e1cc9228b2ca420052934a1094d7082139cb05a6d2b28406183c2162e8bcf17b365f5b9235bdeb65045c092d942cec156851aacc060133a8365021a1da02f60585d206c21ac01374055bf91c32163248354bbed86434a29754869b7da6d37cb5450de61237c73e16b2216a3ba8a545c18652233770eec363d3943e558c585575a4b055386e7933c3734fa2775ee75499ceb9fdc01e29f5432807ff2c6f44faeaebcb91f49c2c8982965e6cc8d3d194fb693e9744ee3f4aa6f547d8aa799353637522b00ffa6fd57af370300ee07ee9c85c3953e323e33ac1a181f59932757f044ba5dd7c9ee10d63a6fa599b2260588a75c000278caa9003c209e2200200400c45978009e4cf1e40e10562a49f1e0bd646edfe2e9f800d86f5afbd5991beff1dc661d788adf993c16ceed215dbee1d58d9f5123a3a664671a2571e26358331c0fc39ab97dd9d32856c1533ccd8d27d96fc6a3f49cf4dcbecc6914c34c999a131279f2210f5e90f7491b86b91f896d38877b7aa66d3aa77be44c1cc000ec10c933655278c3c2376e9264f4e4622b81443a0acae81fcf9c5fc05298e0463cc821b621890a12ef5f5cc5f817716efc17b788f6d8294cf5a90f807ff3877ff597ea525daa4b2526b9b10d375e8433a754756fdbd6b71fe9070b00fbcdd269dc0000e3d68b29ece4385be4f41e32988c8b3c5cac0317f7b0525d3397cc15dfc938e5cd7a9cf2bc185ec3f07a0b36f501e0750e9bfa7d95ee03b8261f99fcbb898949775117d33c30deef1e5e89f1bec401bc0180f75559a6cae0d6ac724ca35ad368a5b41b0038b8f1bdd328efad03ca01e1804037a4cf0a6a7ce8303c18aa1ae3303ee33366cc98b173e397f4c89021c3f34a87715af2621c46294629069b62d81c18289f47b9258fe2c17be27dd835b15f6cc3c8fb0670fb7e2a5f5c02faf89331b7df795fdc6293aac39bece38f633ccf0e611500f8240ef5f2bed1bde48df58a44fffac6474b47de36d9d4dc21aff04a17ebe79c27fb1b0880d4bb9d3bedede37d1e3a77bbb7f82dc60d04620e04aa5572d5daeac5759d26aff68f07d914aff6cdd3b6492d8435b41c97945f9898d821a31a62ac0b19a07fa36febb610a86e9fd3eef3f96c2319f1c32d75fa9ffd3a8f6387c50d4951fbdb33980f6771af730d8954ebe7ed719bf731cdbdec1723e35c8933e7ece93a3b846d36b66634efa371b57fa6d1bf7fa45bbf7dbed1bdecd728134bea91e87ae8d1fb68dc18fae734e46dff84b6d056373b027535de8f07ef7671a44691b2e9c96bd38ba3911d4203c4120d14a6609dfd5e6e775dd7b1731ae00d9355afce47e08d9387de9a26a2333d7dea6f907437ee21295664b8265c5c93951baec96a0c5ebc5d43857bf2662ddc93d73018ee89fdaecfd7b091130ff64ca35446f69b2cb25fed8736788a20eee96abffa79e4725cb7e4a337fff1fad7078d6c54b8df24c3cec5240a8abc8e10e740840b3e6efc15e4b0048875fb1cc3406376ca1b5b7a8b7adae95fa8b75967e9e6705c41e0ac24eb671444cd9435dff3432e3004010c41c85c48b76f4d0bf3a0bc42da215baa08ff650e892cb3a030faa0c2d51647eea49257e6d79f76834660506025a0caffe8cfeb587fce39b553cdfbe67ca669b346a1fb16a65840c882cea541c3064b90ec13b2b8cf4681ce55ef63bfa94283069b388be31e04642d375f52d6dca406716ef4f8102406d1c76c08418357e4edab58d0bb5f97b4ea777c5e6d9022d683802cec1d9fd7571ba4b324fb12731011d03d1a35a41b0689419cd8a17ea1c26ae865845c12acc3849a1333f18052a690e347e37637d778dc91df007243bc5ce475992e6767e1183db0dd0c8330fb777932e6f5119b3ac618398e998b1c7339a48ceb31fb17ad0c4b62538f32be285f326270dc3166ee125a1add17eab78d64f00a060727e23dc9a9cdcc505aad69da5f6ee67dbf2ee60191f2e54ede02067d304315aec84391245600410d540919c4a00b52f0c0880ea4b0852fdceec2d5168c00413bcbb2a2bb61922bedc4036dfb590cbbd518c430f8cbca5bf673b117bea16a871662e0420cbce8c1c20b49c3e3060945c0c314fa700731306fd17a90cc6060c10f94a0053b9cc00a4c10c215f00a466ed23005136c7c70846b10062999c360430f76d059c11560a0a002f9832cba90620a3049f450071a66307071318b81f9e5047a28830bc6500339e001890fb8b8be87325041051650b8c00b9655682109979ff20b575a988116a608c34876775b5ae8573631edcafd0d7a01d4fba66d1acd5e6172885d7172c8b5808e79b1558caa34bc4225c8e42cdca37733c783327772168e5c574fe7c632e3c5a48affb5eac4721cc7711cf7286ca4b833f3dba6517c12bf32080402814020d068341a8d46a39128e435a889a0527d3caeaf68225c94437590164ddc628c39f2f32606733a3023d48fb380b991ad98d965954806f58b37de1c7d4537f967f1f479e42d344054e489030f1baebcb56a14c7f4493e7479cbb2ac9b4681ac335cf91c79ab0552de72810e2c1a5c99a2d306379e6762107c03c83142e05145248c0a852ccf745412c323a5653f9ea16914cfc49b2b3bda5c09a3451638391df9633de4c1545cc521e6e523129636a0cbc72c4014ecc9fd8b58f862921bb50c577e01c686f263156921a25de4310dabd80aae8955442b2c1a159fe4ad29ac29f82467a6d16deb14d42b48bf62f4f92f567101d229a527366ab4d1354dcbac2654a6b92687c346738d258ff5a82c558f895d97354514f5b354d614579e558db261a91a459a555aaa18f344849942802b149a26aae169ce2077e2b8de44a9542a954aa5920c193264c8902143468c183162c4881123c68c193366cc98316386ad32bc9217c323c193752944b6c0800103060c183060188182828282828282c24242414141414141413919d226262626262626269655a646894422914824128dac25853c6b825495693e9e25c19375cbb22c4b0877db117cb1ebd7bfdad764559fe4a9c7345ac6831eb08aaf60225837cd2bbe642c1e0019e829c49129b8324316577e47263b9264a571e7a3110b05154aa10c3df726ae9a68140de6193ec5e3e8dc8f10f2c6c72bdc3f20777e4f0c81440c42beb3df07eebcae72062b449e8d46754860f3cc233671bcbcee5a1f1a42685e0b9be4b77ff3d9312ec73cb56e049be2f5c3fa6591f8b68cb3500271b4d91e3bd824317b05e970c238e45a466f610f5ec9f1a072443a0b37cafbe4cd309ad8010a3d72138029d1e98481837ad9049be461d81e2010080402811e858d14e8f23e3a207f7912c956141414141414149413af8789d73262620214a840cb1091d7d2a3c2d37cf548f034274081960a30016f7440accb6e0c5a03d500f76da20936714b51fb6ce46a151469cb2b22f318d79f5ef6f676cc673648d63b3e9f36c8fca79be34e352f48917e91963ee4b06fef34c026bee1894d74f768d4b456b324fe58ce6e965ad29c73ce3967966559966599f744132478bafe729d0f820b853571d991ec96b1b8ab2141cbd23c23fad4266fa8dfe86434801f4623130dd3a900440801a78081a81e266fe86e1cd0c8ed1c45441d500cb721178c14c1a72ec2480f0bc021b0f731006f649a752bb3df0fb0b11e0a53bec8a7be6c29eaa5136316a5f888c5e595a2ade196d4a805278713c421620c56a0052a66c12888f046bcd10470883863161d45c5ec619e68c2470782f468613142485fa5ff46c5781186044fd8a30be08d0ed638010a520051183c6118098327cceae009fbe15a38f0d304a41b8b4153a0905748b392ec3742f2c5d5f1d507c8b02436c5c8020a533e28737cee1330303053dc276060608c60534793855e15c2086864847ab3490787c2144ab9c4e32af1c88460cf0e53d931dba34fd64dde50fbf3da817dda20992df1b88460bf2c29853587a359a54fd6a584960d1b54c5469f62491e1e494520a42e6b03eab41398231543bc885b8c1332c46f518f18b9342e7959c1071a07c25e810541871c8f97185c902164861188cf97c4d58e8a2a3e7567fd9844e7763a36ee84b650e39dd6a316f046bc96f50127a2159f023d723c98b0b01780584020eb83d3d17dc0bbf5cc7d60cee0560b247bbc17f780ee66f61b2273b52eca34aa48965937b5fd4cb22c5ed3b424cee7e5f3e97553cdd301afd66976d334ad5fbdd9bd7ce8dbe3d9604e54c2a6e8c228931e35221120be90569693799a97bdbdcfe5c6242ea31b772c4bfe8357639cfca2ca77ed82ee30dbcf654441aa0a5765a082f62a0c5a946175fb34fac266a3341eb54f36486987768e27a5fd2585a3653b339dd42bf1a0251e9c760ea62e8e0777cde40d300762f1d7c571b6b4839e2bf1d88468df0e5336b8168ec7767a8cdba19d665c0bf759d50fe6f480393087c77624a5dde278bc1c21a5b57020c0a1035ec8035e291d71a5dde68c5528e1430ef5339968ca47a3b44d5ec1d9cd63d9a0e4a04c7d2e391e4ca43eb0c77c9ff87433030fb6edb3414ee688495c4677dab8531b5444eadc78fad97a342a6a3c586c10a824a5bd391e2f314869d6479f3e9c8ec83749cf468843614ae470d4e4d030e7cc09872f9a71741d84b50b79910aef0635a767b55f05d9494343c320d0bf18eace5380429d27611c706060604c90240657c24849b80ac3912b1f97e8a4245c8d41e6ca330c13e115b82283912b519d92f1128b2bf9a2cbbe48085d8e9452625674ef2c0d2e6a4e8eec64271fb2f20b5e091d9e619a44925498a67813217d5197dcd021b3921b0a1de3411c22de10bca1470e4768ce5a3f952bbb93638027f934dc96974d340aa6a48c899d8d47e20daa7ca4c9a2ccbfeac22b2094e8f23478e58b5f5c888a393a36eef4495e421d1a2932ee47e3ca1c91b431574ecc0ad0b56fdb163aedbc4f88db814e439e0e7843e7500d8542d57eddb5833c0ee45517212e67311ec4203486f946f10b362961128d69bf8ac9b039aa8e472da0f13005da26d8248dcc89c4cd384f079c118097b3cd71d7012f675f2e0b6fdecb7511e24e7b21c12648221d8eee379b0615f6e0000e2185c02782c01bf2badd5106b7230b6e47286ec721808041300fe09a71e620ec1ba02a2087bcd2068135fa320e11710083682130eae092c1590045647e2208a3aab83754d4deacc02161e0a08e6e3c08e215da5b1aa559139bb20cf63461a6cb24df97876714638c31722579514f6336b16bd3faa3b1b0a98948d9c826766d52eb68dc8f144924128964596d518b5a9617f58b30f154d688c32bf4ade520893abc8225d999b35612e937a974ece12e00fb545352cc4158c3639b3e19e1159b8e300e6fc1396c42c226be61d31a7a783828c84b3b295b902882659b33429dcb461f534ac90cb91c51d61a373654192c622edb1863b497638cd10c482cdf0f228931c69825e2a9df051c201fae440ca2df9901894e03c4d080c7f8063400d610430356138705c23420fe6bc01228ccb4d91525921779210ff2e9739007f99422b1a05a82851d10c10e210a14bae891c25c79eea2982b1f92b9f2206fe66659658fb3aa45b98b5ebf2e39cbe2b8cbe2762817a347378b6e98176fe77da4cb711bd5be32e595525e5f8030901d92922a72459007e1494ed24d266ca8f11f9e53a8d9b6cfc8b22ccbe24e39af6e9b11dddda6fbc1151a7a2e375bfbe5b84a7a7768a8b32d3a409dcad9eff3f9d86f7e5e79fb95464d8b1e873a24a7e8737e366af4e9bd4fd93f9ec8cb9e79f2e56a160804ba0e78417fb9d5fb7e6bf7f13e1ff77390977187dce7d5a3efbc97fbf1805897b30d831804d5b9d8356f5e7a9fcacdd8a47225062b5f43e81b9652660a22303a208f0af2409e0b61d8d4ff220c0c0ce4e926d89484657a2c18996d8bab68448b68338a3b176f81d3389fb3561209e2340e6c1cd8aaee68d336366f0b4687176a4ca3621be0a92f079988871913a8a478414d0d6cee0e6e76608dd69132180a20ce9597420ab79a6599fd5c46771bf1fb31c62bc68be31e10efdc2aeaf36dfbc6a8eedbe6514819056f7874a4d2638f945efa0c06b1018949c80c9a283de6c4cd8e691c7720f3d2d363d931ca7176c21a946ef61bc1876a58f66bca37654c0f18fffa8058ec7d2e2a1086a647152798080b619809362b69ce392766b1c39b1c0b3d8b1363ca7573ce89751ce5234c7e791f34925d043fdc50c47e7218b1a390b0920c92fd2ec383f13ab1316078a387264b63a3671f34120136f1ecf7626d3cc15b04b8f0f50017fe73e3c26ba250360f0f230ac6b9c3888af1ee30a24a071dbee4c17812d91895046310d36ed46a3389c839e0853d60ef0f48afec1896d92ea64b8cc1e070afca822a1fef8dd8448642154ae79c53a3d386e087ebb1f7717797ba6e6a5083a412c731fba0f4a3aa23f4cefb7cdcee14328ab43da3b4ffab89be9d85e724917c6ccfb47a12bd7514fbcd136b6559f7e7e7634e4aba94644d4467e98fc87efd6be27d0d6d897ef35aa303616af98ebc1f1810eb46f15411ecd6479444aa95da8f52b80379bacf6b0c579545fb764df41fa0d78bded4963e5f08f47a90956ce2209b385bfabcd475dd3d4b9f3ed7df9a6ada9b3ed36c69fb0fedd9b7e97da5d9739eda22ee834d9bf6cca67c21f839fdccb26c2b65a0ffa8db35ee59f7dab169b325eea5cf67e9f3f94c7ac8a6f912c79ddba4ccb2c3435bd2fe2383a7a7de57a2d46e96be4f6d1156036c82f7c1260df22d1187e0c0ccccccccccccccccccccccdcd96fce5a39cb2a2a2a2a2a2a2d2a2a2adbb9bb1b42085bae465d54402a2d77eb3e2827262d2a21534b45f98949ed3e73140ad94fa47247de2702893c1715954b3fb53bd4b5fb2d2a59679df55b34adb92df46a3f538bb59fc9a4a26232659d75d65967ed23ebacb3cebab3ce3aebacb33675aba85cecd0146d6a48343e60620cb3494525ca5ca8a31365746e945139b1434a4a4a4a8a12292929294ab8a4a428c1cc6ca3444aad4a289192929292c2cc6ca344caac550966562225e5dddddddd198908216ef3bb53522e7618a75882826cc4c4c9d1d92142884be3f2535252945cb85a29595da824e5402c087f1f402c2016108b527aea0388554d46221fefb28ce4c3c48e44f623f90875dd2ff542158845b7eefad37d1f99e6a3833ee6046201b12ac947d659376ddab4b3ee3ea9fb402c1f7387a7070742d2077e451043e7c21ba8f383b060adb576096bad5dc22e11638c5a2c616b5d62096badb531c6a8c51276ceba448c312e61ed49a4eeeeeeeeacb3ce3aebecddd63233333337373737f7ed23a7234b02c212cd346c3447dcb55176deceddda849566cfb4e9725d46ddc8e56ea25036bd6f7427cd325168d6d1a59ecb6834e2af3267dd7d3e65ce7eb5d6d1687431228c1c51f99762a25d69df748998a31111462c3c629a5ce79ca31111d7f41171e14d978839fae70badb5242084b0cfd7da63c2c5a39f990dc10fdbb9bb9b9ba7ef5b07bcdc4b9bf60b7dd933fb31715d3c9077b9cf89c9885ef3eeac54db3e2726a3ee3345f5d57e21ef8abc2f040a792e9e77e92984739b7db258f33e26ae76fb69e7d34ffb4dfbd557fb91de59fdb6b566377e0f442265d6c5cb3aebacb37e06b66ba9acb3cee8b97f3a2329c000d783b6447b4e08335bbabe9fe9a474d2a61e8c28d0031dae17979f818b9f9a900b92020c704f97efc1d2849e07d570a114a470213c94c2856af054465a749c8e2feb24a63d2263c861d8d49c78c9a80dc10f77a3e7731ef4ac035e2eb599fd405fdf25aa2ecb71df363a4fb3cfd4de1cad1ffb81cedfbca8ba9ae712551fe872892a8c528db36b6fce9ed9afcfa7d7bcceeca49e4b5475de8fe66fadd37dbe7adb29674b1bbdf6d2d557767addfb4a5a6b7c732feb02af67d7feb5ceb773b3d4dcb769e9e7fb9c2dd197ae7fb3a5ab4467bfafd9cf25aae6e1b367de57cade3a976f4a19dff0cd6d9d0b3fa30a02d815418c57c5456d0a6666666666e6941466661b255294606625525246a3af728feb3262769972d6cf65346224c0092b24c128e7ac9552a891483ecaa04299993915e77d2d975369b65fcbe50e39ef925ad62d2a2acd04cf8310c22730e1310121844c78de7f3ab7ad88cbd7747cce5a3fd2663f1f314ea6a51835c826201610eb33882b934d25b8ff4870e3cbd49af6d65c4bd04143c670e34516f66947e843606eb441346197310717fbbcc2fd208e8f6a3f1bd83bfba97c2c863595a51cd939fb4830bae83b463b42f6c65a51682ff6cbfbecbd4e99e7bfcf3e49bef72d71370f6e67e168bf252e1f5e9f4dad94d25a1b50a88aaa8bd118f4137273e3e799a3ea7a11fefaf4b0cb213a17bbf87389aaf8efe57244c2c9405169e4727c16723ab05fdee7626712d8afcf23b05f583bf1ccb221f8616a9fbfe82f0cc33007bcdccdf6b14308a975c00b4b5fd674b13776f62e71b56d240a5d4bd83b3ff319fdf4b46d342f0a71db3ce8f3b15ffd37ed05795f4da27bbb58efb3dcb6d327a6d8bf6d67897b7df3dafa252eb6d34cafd91deddcb61327fdec679e8bbddd3f4eaaf6b30ead8b858710c28b61d839604bdaaf222cec305a1892ecf41b560f40808bdd7e7e18b1ec9b9b2df54b5a766a4b5a6799656118f6ccfbecc5ac0762147c8076e85f9fff201ce611865b3044f2c12404882818277629c4ef46fc0e60d952668dd0fe1160da5276ebd8e6515bca5eea4fcd96da1a016f29b3b0639f4ebc5cebb0741d767131ef2b5df683462eec420447f08de744d164860d22b0249b6eb1d01a6afff00382ddbe1541df18b318c7e00637b861ced98636b4610a88b3b3b3c338376c60031bbae8a20b38c4c8cc42f9beb4720d6b5843e4c289520e79eb395e4a12c83ebf033bfdf5f8528ebec52f4940fbfc0eed3be6a9ed8e3588df3193244932c47a69e61ea8410d6a983a160c175c70c106226908a52194862fa20c9f42af6404bc4ef4d909f8904e4827a453fb9f655da2ce95160816a708a1e164e7640d273bac022bb258a5c1c82a0d5bac746ceeac131e4eecb2e49cf0525ae132d52b34ac6ed3ae88f6662541ee48d80f128cf4595a0867ed139396dc588f97274114766925e641abce2ad478616a0912a8e8024caa240f53d6c4a6fe4489a9dfbc692f5098f261aa2b4fe58a63cb9b22d42f1e8959c89a18654d9c41cd0e5352d5a822980844b558545c79590738840662105f4014bdbcec812b7c872b2fc100511d78435dc39566b8f2320a10a5c11bd8ad7fb20b57fecb78465e726a96675835edc734314614c126f9b875a051512577be9aca3b6ce251edcce8c8f4491e0545e3304ccfaa87e78667c76647a746278726074785b39a5941d132377d9287827954dd778035e463fa241ba64f927bec375b760fac214339d5fafc25e50d124678588b06641258041272256ff804fa15a14f798ac518a3153d68e440b037e6a8a2a9b1b9f23164b32ccbb22ccb5440a65a6badb5d6eec3d16c1e89638c3192e4abfcdcb66ddbb66d8b31c6185598cae2182630992c151153a334004ffd2f606a6600d6e8ef7383ca33f01421456128707e3fdc6f7e28b3af943c58a1810a9e9f8ce21a5e811c76ec2466be2e29af78af33cb9a2a77d824553caa999d19191d1414564e9f4e8c23617a563d3c373c3b363b3a353a393439382a9cd5cc0a0a4be6c6ba03bc01820873ad3bc01a7c8eb92c1828644f5b3df0060c1dd41ff331c65a3db006bf553a379453e739e68337ab1b1cad621367d78e79198661b7b04fec34bb11f647764aa9f74d6bb397b2709795eafeee988ad41da3c16a301bec6675bdfbea5572bb9fac6ef7939b9cc88edb3aec08837836a6e2d911531de195ee34eda369da8768369bcfe699bbe7ccbac639639cafd70e9bbacb23b7ab9e0e78fb52c2a6ee4ac2a6ae4794822ae3314efa277b6cc89cc975b6f64984573e6b86665a0eafc0ee1892ee984e776ca73ba6a43bb6a43bd6d31dfba2fb84e93e63ba5b33dd2d55d7dda2813890e776964dce4dcdedbe75b75636448ae4c8ee964e1f6ed7f5f06c1bcb46e6b09d16c399d2a651d29678942e5fbab4251ef2dbe5b777d3e6769b1552e26c09c6c26ce7cef14e9fba0761e6d9ac8d3e49183675251e5d1432256d29a74f1d0b97bcd20460aa9e3a86e953ec9991318dc270fad47de666c1a60eabc1701a85a9f8d4bd6b3b9aa27e32e77697ffa44dcf87a96e77992391f00af6ee528757e63b7e57dfc1394729a8d6aa01446def366bcdc01b7025fb6701e176d60e6e57bbee9208af7c330eb73baf7cba7b57c12b56704d16f0860d3cc239dd5b47c992fe42c2f0ca072646f20a54a1bc3bd75cb1bd3bdff0caa4939d136e07e31f43e176e7254006c0b03133b5bdcb3e8f3a7d1379fae686927ae00d7abbf34ca3ac1978eadec57827e3b39b3164bca44a2f65b685488cc3f8ac191bb1a79be27687dc7525cb307d2a758fe1f14c9fbac3e8662c553743f2600ac36954849935c2a81a055bd5286b66d699aea751242b09d5826914a94fdde7ac5dd7c174ddcced2ccbb2ac50f61105018ed0b38b3a2c874ddd471e967939301c36752a36751759ab0a36753d3d5d4c4d5bfb441f53261e4ca1504ec9777f8137b2776fb1113fbb931a65f2ee6fd4c9bb77a726dd4fbc13ef2565d2c3a62e3413b2d68ca58a3db1c79a99de649387cdcad9cc344dcb5a9bd9ecba439114f5732eebee710b9cdb3dde80de3d7607793054557b3da89e569006929a9dddab07356f6a93478833d00e5248a16406c43c65c200135bda611284d681e72665f297d4083be4236cea2863947a8cc3a6eebc059bbab370d759f70858a3bb1136b83009c01a5d8feb96b5b39ddbce59e6e1c1fde4909300f713cb3d7dbab81622a14731532208374f729e54112112c55392051001dda3504949174003749752c004740f7928887da0e95377cc9331b046f73a83da026b74f506b57b776f994671efce3c3db43b1fe9ce5def58efbaaeeb786e77d8b1e7768f32cf21e1d4d59ca92a12cdd59d6fba7b771f1d48026f68efa21531a9eeadc32b9f55277af756356aa65132b6d002985487d3345d73bbf74e77cee9ee2990fd48d39660ed9ddb1dc28ebb4ee67637e93ef2a2aa4fdd67a37af4a9fb9cb59248379954e6b5316f17f27c7427f25e52a11e6cea6aa95a19c3a64ecaf4a9fb27636e779498ee30a5b33f24ce8501e852a073aba56ab162dc50bf6b891236edb4a17e18915baf73b253e36573eb4f76ea7761712b0d9beab5c5ad171136d50b86bb665a1a651d86aa421c28656215d7ca8a0bfb5433611a25756e746ec56e70766efdd5b156241ba4180369be2660eab3b32c7bcc405b5455788524acae8eb61f0dcb0b422365bd2ea1624678a55bf18a7604c389afc7727845ae6037f046456134ca58ad96c94d6a9ed4325bcf326632120007670c399795aac7ea31190c53358a06abd92a665359babd0f4372eb516c6e3dca4f50ecb53c22452e7b1d61537dcdfd789c87792e346ebcc5e188f6c2615335f1a2625a30a83389c974264f3764a82262328db2ae05afc8513542edf7c4a58fd8059d4a90f70dc1416d969dbd2fde2c7b7b51270611716499c785946ad862932cbd98e40318e472d8546f79448a7c981644b89ba7035e692f246caad71631f78b3ca2282aecd3a91ebb49419df1d23f955be56a76cde48a1e5bc22b9f15a331c556d80da30250538f1da9c770eab11c24f558927a6c8757fad6634a7805ae726c6e3dc6c32bf4d6633d8cd252f5560ccc106ebd2553ebad1915dcb9f51ccd4aaa6e3d67bdb8f5960dcd4dad448a58b6c8adb770ee706b74c3ad72a7a5a4e9537d5b367235db7e33b3d25a07d96f46bb598bbb25e3dc659cbb66bfc99686da8f542f558de2ac901267614ad1360c9b4ef5419877ba874d32bc128f28648ab3258629c6e1993ed597ea5f527048c1544ac234ca8a91328db266f8545f616e9532b77e14533f4ce6d65bf5f2980caf50c12bf3f5d80caf64affd7a592f79b09bcaf59b68b81526a6eb9b8a2ab080376aba42238c53df399d44492fe960180e298b57e00cab1a457a3dd3d4c01b5770afa97abee115e334eaf30a6f3debc0d402628e845b0f63fc6325dc7a2e0264400c5b796ed5bcb80558a37bcc699bb8d336361486175375099507dea0b75a3190611a557a3dc7346ac6e7ccadb3aa20d3dcfad20c51112abc7ce12d6925cdb610293dc667c52c61944ae4a9afffe217b7e26829c5986159d863983ed5973c8ee1714c9f6ae4b19650ad184bc6baa99f9332665d0b0915f6cc689a36d3282ba64ff5b31e3221f2346a5af589fa396bed5a312ab7276accad32385a4ebace571d78b6b37049bbc9e3851b087088ae1d7238b0159bea4d3ccc089bea350fbb61533db7a45a326caa1f596b0a36d5c8c353bd9842f162e4767cced9daa7ed317532fbb4fd0a0e2547b45e3f0278437bbd1175d65a6b7d3da95128afaff4c48b3d7daa47f150bc97d449e46153159544d68a6153b564fa54ff51010f4a4ccdbce941cf9371830c29a58fd4fb40bc74b2d7b5f2f4a91ebe5e2445edfed1ea3f2be6d6c7fa500b2a5c253172b37fd8cdad8f36a1d7c79bd0410f81283dc893d44e0f5e4b0a586fc5c01b315e08ad17dc6ad5e0d6d3b8813cc9268e56fb63ea20e005d8696d9425c222939e90ebf29627a4c88ecb965a5e48664b3dbfc3bafcf509bd3ef54bcaf25e52543484fad91052648775ed42ae6717625d3b864565ae457a42b45b9f5ef64b02d9aff3d06e41713d3b14d6b54f0f661e4c69362e462f76167803bb18764c07c32076cd63e913869d854ba912db9204aecbf3b82ead90223be4ad0b99bfcec37af6cc0ab1e1c19794f45e5244300a421b18cbb3b03c8661872998fd1171225b5588b0a87d2a1a429536589ade685485a74671b7782b23d894458d97ab0a3442854d76eaa772f9f157c07b8146968d85a5458c91a55c25a1e2ba7095c48a6e69595f2499c2b2aeeb5aa921c94a0d4b3015502e6a22fd7ceabf9883952fdae06ed676ee9048853be4726cefbec3e42fdc37d0e7d6e7f5f3dad6e7d37e363ea6cf45f67bc87ea4b65f656bd16ff4f3edf3f9c967fb54ef7389aa0f48c668e6107717b8c0761df417b840882bc87e511503c41d6e28d84ecf7994abaf5536619dbb0baf84ce59255c0ed1b91d54a8e4720f792e6ce25eb95bdc35ee19f7c91de37e7d3af8f1a0f7c19b73a0c8e128e5a01be581f2131e2667694e541ff2a8576fe2d5a3d483bccfa5c2d8418daabbe12411bf9d527a7294ef3841b1dba107a28ad2cf41cff1727f7c0e7a49022737f98ed149afe774800eda4cbe03e526db77989cb4bdda528eee9feec3bd2401949f7c07ca09f71d2623f850924abf9dfb5c2c984b0fa7cea5b50599f5914037be63511ae2167a434dc2c3eec48be80455be21e53a10a8e3e8b5f705312f7af34414bab233e5ba135128bb66f7fad9aedde292889ff6cb42a2139439e744c166aa66a884adb674450d15d188000000002315002038140c088522b168380ee440b03d14800d819448825a9d09b4288929658c21860002600000000000c0606a02ea2e0a46dd99b9aec32251b4eeae61ef54ffb01237da0647556fb4d4b91ec71744c20df73a30ac8536fc98431790be486121f6d721a573e2781a30896aedbd0ee91db78ec3d968bc0ef1ad4544a45754e4d189cc40378981705d07b1244e7b02425e9d2aa48289797806cfad3ef05c079d54883c249a82b37fde1ad8c03a8fecc39cbe213c35bba0d3aec3666a9adc9c36270cc9940e1c11640a938804d701a49ddd455427467d6dad830215bc40b88fb3a22c75f896ccb505ded7c1068542ae82ec8acceb904899deae8369f3c5e2220c188a0603a92f3654122ae22f05f47137a351d8ae81061e4432aca88b1b6aca3b01bf0e5d1bc69102238298820b52440288a61099eee4dad7c148d1e32a741d4a97192e721f74028c06aa048c82ebe0e12cd016f1e5cea6beba194f59ab73af617cb90e8062b2f056fb2e5225db18937aa628c3c3953356e5b91e92b98b4db08fa38faaa8b825bbc6e759379eaea2bcd28dda4718cfd5bfd6a13b3c810a7be22ff47e3ea699cdad5fdc8870ab73ec03a479ec60b83e5cb62101d0bdae994dc085bb91c9944352d180da3aa00b7c54a00cbdbca406ac037d0029a500c3e68ccc98470aadc3e023254f235ec4f385ac2a1d58580c789659dfa09309563372789761163335df4eeb98f624828729e1f41e0c440bfe5ace8561b86b3a87e360f5afd8d8ce7a244b19edbac7002072e14b43404733e1b8f0448c3757f839271c6630c06a79e91f8e7e705b33ac9455f5c00a09111a50f3bd22671322345a4cebbbc3d33f3e3f86dd2ac3303fd57e773d276fe475c11f30c382b9f84f5ce983c190ef638cab1b7d80a6de135f169bd06fb1c7877f10257d7009b4964ca766c0a4d652574f11ded979864f43ff7a7bb6620542efee35412b428665bb40e861b5809671f0a1ac0f123cc42aa9c2df417ca17237d3070610d36c8fa7051931b601d70c3c90552e2e25360f42a6b9011df481b905021fe6000e2b705f04cd83a7b08c6578b093aced321a35ed3f322ca7e5c67d27c69de3f581718ff9addb0155bccaeb83cbe02810304762ab0f95a00f9cbdaba1865d300760e9832e60a08abe36fc54d089d8aa50214cca03cacd4290f501783b66237571628e5069ab3e484798214394e0f709567453ff7b7a6c7e40f39b9c231ff4e8908b410c415d59dae7d511f63a985647d076bd55479ee2e9eeda7df3c1c0f3f045e682c9da211f8c4274444f1261f17ec0f201ab8840a8a4ca2f7d942ff7becfa88dfe593985d3499a0e58de68f749ad6c01e1cd0a755e0a86607ca065fe6b396f3169f9e1c036cd1a94ad6c87cede27d8b7ffb2070ee0d018c7069236faae6c798da0076c8ad4c51e7494b9c01e509b1388fef744c01e1822a27de7d715138bc8f2c004326302a3fb9ceee15f1ff6c0bbce041ddf572cc4fc46dbd1bf22023d68225b806628cdad7f84da5bc4e6dd3f530d863a015467ebdc01a2386445367ed54fdb65075cd0ee26103bc5b3bff4f7e7a506635e765d630ff271dcf7e83c319726bca9c0a67702b24e01e1cb8a4467d6fdcb8ad88a5d0b8069497c2a46f5cc1fa4f17b6402b4072d2c920936ef98937d8e5e241c6920b2073ce8d030e4b0cb47b8babc9b63b4f041275a4abd116c3f4031ec41b0c33062cad8a4fc15827ddacbdcc1f4a8d4934ff8e4b79e64edf48617d86e79861174056481932b9caaf1529b40a786619e71907e04c04bcb02a22cfd7be699c3a59d5333b928bfd28746c6383f08f1d92bee21f435d7d6f072520cc0bffb2c626c953da199a4a861abf0858192096fa7be1c705b8b5d026d03dffd6cb02d0b2f4d0522e958f099434e070740b577438626d0cbd7205b90163b725a822fbcb46ce60bb618f1f811b2536653e62643c3233658ed2298a3192966e1d0a60dcaab590cf7faf61dfe96c5e118259569ef2c004e2a82446a623167caf615d0b790d1420deac208acfd8fbeca6550398047bc5d20fb2ecaa6475899abad40f99b05d2655c2a57c1394ae6677132fc51de91b3c56c91dacba92fb518db0099379240c328efb5a91dbbcc9b1c2c572286821a8400730ade186b1cab0401f9a8487c6f0db72b07fb7c9e5b5f30c1b6b71d39800a109e665b4b52adce16a76724a61cf5226616f098440d7f39c34119ff9584c4345b94caaa07f8865d27e75fb2bddcb262830a681290489b3057122699f45e905a6232087066554b9065e261a0000a3b6eb3b7fe3bb1c186d8c926394fb7c4294731fd33fa3a9189f9129601c6f00de20017eb67cae0fcaa9c1ecf55a9767eb3a9b364aaeee0f42b521d3cfda23a9597e4d08b4fe46dd482b426d3f3a1d71f6b687133e490b571faff584e12e77587c968b806b7d07d013fcc7cddefab80ff321bfef7894a4eb8c9a590157ed0fc173f380a46df1f7dd5667b4a73f6140e59bb5433bd20a39de242fabc9a37352aee992d0723aadf40d1b2185f05c06a95a0425e63be91c89f81ade8f780c005871b84680bf06ac73c189efefa3cfab3206a8b989531ab1fd0f2157d9600b12dfae9dc9baf1221d349a346ac3046af8a47b94b4e5b4c02dba5bf8945d76b6cba2c871b9709356278ae428cd8f1d8b6d7dab0337472b558fefc0479992e8e7a91ccf99fb62c58fe96f1d71405f44fec78393c831b140ce18543a8c77470782d90daf47ee123a9e98bbac124fb369b945247fc3bd9e5b230abc0491eaa4f9c528a8aaa6a473f1a6f5e570ddffebf9807c3ec98bb01f1ab0e16765bb8e945b5406accac28173375b8d324e17f5c0191831a34f5afd7baf75c5c3e37a4fea119da9f103ac96817b9e94f5a1f46003272a45d01093877ae8e4b517823f261f4173ddb6cd5cd6f68cc8a6a4f67f16985a0953499e4b08abd482213fbf759851dc57983b359836c0d44b67edae9b1ea5a17412d467cbd25ac8471e279487c2ec9438f7dd13f675f1337bf16df8e0d7613e1fabf2ef64dee10ffa41c1a8a445cd578fa28aa527022d7d1c1598f9da0320d667df1414cde00ba0e1b9ec2128520882038bf0aaca78bc21a80020f7805325f72fab0c1a5aa9279072c096659f38d7b9c5486f0cffbd132d3b537ea4171cf33d9205234d2d12251a165dba6a703bb6077132d5a431b8141bfc3e285b50894194e3d52ba9cc260c34ba31601d762e9d1e4295d8cd178218846125100c7d0c9d41bb22e9b6a6682e7213f98d5933bd09a23ccefacb2f3027e21667458b64ef5e3daa69032cd408afe658cc81cc8759cd492605366e6a91452137c1a2e006f984b7924a8a47799d10f0ce53c883d811822d8c28b17040c12de9422d783182fd3fb5c9228b8b96818c47e3fca76787a3a1f64f4b0ff6d16e7285ca48b382dbf5cf3d5524692fee7e40f9a58351178af949d3924a7ea4fe425d4862494341d03131753da3cdf2aab95cdaa06a7a301a3d8956cef86705024a176e7a6af475bdfbfb79e10057b8dadbfe10ef046a7143b5efa48a09b2b3141ad975d12a06303b2e03493916ae9547d750e88095d3883827240fc31190815c483c8f50828358f6ea7c2d782c585ca53b9d1b0def0ebd3f761b5077e2cdee204f1ec9477df0cf49701e5d470e07e0603a8411324fe3af4c3474cebf10f6b0a7875d4eca4cedebab8d5aeb0cc3651078ff1c0be43b7aef27a2be442614ba94b38ea7644bc0ce63bf2f43da376aff2ecffdfcd4d88bf922455f1471018d1ff8be86caa7c15808dc6873089a6df7ffc61ff0a60069b3aff62916362f510847430e81449ce1670340d1321325db74e03ba91e5ff1417716cc8626af1f5fb7e8ea59e43999ec59498175c9d01c4a852c0d6a208e173a14b2adec16307c53c591fc38fbc18c347103dd1cc07c192be5c327c3380a78083207250a9603448b675805281988e39c12aa121c29543a8e26c4f1ddcc7013e4630e464f504cd34655ca60c7919fbe94dcb82fb5065554f9804266e43f487fda1b26bac68f9c41e3d77498a9f0230130ed5907ee4f44644072bb5d966e50cf4f62d787cbae20faee920c6412b980fca246cbada42a8082750b47d05f41783b460236e44224456a0b6e4db9e02f3d69ec103872d95bffc761b0c55103d49bfa519f0bf34c29552dfe855b80d8df05d55a2317645a73e97404ea83883d4675e6af5243ecaa085b40e92f3f810fb8f6c58190d647ec3c630ffeef4d080ce3f8b239e59dd465b5c046fe05ea5684e516adafc8bb09fe7ea47da67cacdbcd0a770af94a8962c420e01073f0614aa8e91a9743fb6b40d55747efe42d4763a71d07b7064a15fd5a214c8ec74240e254eb7d6c19d5dda4b6013d1877619551918632d403ce931066b99c91f603b53324dbefc539cf357ad793609aede6031bd88caab0b2c50d614888d424cbf5d8679160aafc979ab7c6f5b4726407a9abd706eeb6fd3a69dfee6b670b892c38cb8068ce84076b3b11ff92f65c67b1960bd23bb99414036ec7e49cecef4895039153e6c29812b560dea8fd3d4a0c50e33de521a149f2e4a9eca833a68a912f58db041078e65f2ed02e2636d8971cd796c4e5e4898c59325d3d5489862844d22117c10456b04f11e816c8708173dc4c2fdd76a264a06ba60fecdce4937b2523df25e54c62594fbe885acb4ad39d0bc0ab653b93776b6b4d69d62902b788d48439e321996c62b6cb01b5fbb40ddee4d1cd565a154bbd7191bf7a96fcb228c01c06a7a4ecf466075874260631e4bcf7df99e38fa059cf13897a09faa652ac5eaf7c05e7986117d453081db4f559e72ff021623666ff4e4da48671b512b19a0c57254bf35a833b9f9432da644032f06bbc015a7a0b5e742c2f9715047f6df826a2eddbab593f52ffb84fca6d3ab20183d0ccc865299e8dc2301975945579d0af4a49701304ca5de1f9b7e101ffe868bb384a5516502fd0e78a5bce91bdcf9803d7fd538c8f85e7af65d3b0bea536944ffe5a07e647d8bc428e66507c0fecfa3a2f0b7fd57a8128d9728411337b90802e1ea7ac58f3fc4fa1cfb1fae7dad8b5e7c58ab1aee45dbd4d7da7360428eb6865cbe26d102c42da30b539eaa5063eef1f9f0406f7322fd0f3ef87e5c5a8cab895547345a4c33cfedfa4d458ca69d912a3f54ddac3c4854d44e8caa82d828b65a82ad93a4aaa84b903fb0ee08dea83ba66c4307f39e2d48b5d2ff680e09ed8397f6e60d70d311ddeedf18d4a640e675fba891157f911eff3f00a5f8c34410e796c98ac4103895b3eac6956cacb21cdaa48215e23f2e361c0d4e8b43c7aad05e0705033a95e0fde03c0f386339b79a3bbd19385a8880db8399ff5bb7e979069421e5e4ac2284f743dd0a76f0bfbb94689fa9150702aba72a333b1c61d61070cbab8e081f1ac9eafc77a8c78b43903a5475457383c0b3d1aa54efd454f40b17c827a20b7d34d7a46a3ee5a553cda30a6a0029215ea3722ec72e129904c58a267a0f3ffe129e0af9461e6bee0ff4073b31230fd528f4e3a9f84c0a7ee025372a27160cb1effb5a5975a9c23be7db3ec2cf06c942d24b8b1197e15da7f0c58eba2e55f1a30eab167e19c204ae6ca06ceaabae36b8283d21df79d5a1d1bcaf9a8ced8642fb896a2049c4a9523ffe1d43023ea447e3dc434a6395b787643ac132683ad4f1b2da0f706d49cd8f6269bbb21a664773974c93ce49363be551c70d27965922b55699311003384a5a377e7aacc717966266ac4a251ecf157b23ccfe80d512d776bb679ba31a043c9fa5077e045f4b74deda080e4e6789d97a6cb649a6d6bffd7670f1b508c8122ff69349ebe1d8e1c7bb37bcb8315d103fd31f89e648676e0804753fdb31eb61968e26be8d0bdec89a28b0defa568798902bc4c0628d9f2b0285276c5c2383f082ec1033d1672c3e80aa10b0eb99b612c94368800600132049cbda17fa01c84f9e1732eb83eff812940094a1c7f7868464882fa56446fa6246ed5a1c400325fc3518111da2b5dded47c18247f8c6646974575be3469c83a05a3ff2c210dcfa0c0dc92e717a782f02923d1e2b38d8fa3761c932b4710f2edc1b52c41d50d0c087c155d1f3c3f4ad644afca04b753232bda2240331c500f9866d6861508aecf90483fce00927dd5c94564999edf2679786a64913d0ee1fd3bb8e2f0dda21a9554c86eac1da2c2c16af91a40974e373af97bac378150a4fb995484a8853111fcada6adc58c35bc557d778f7e88ae2940c291b1fa2c4ced482c10b0c80ec2052bfa2fcd31e0b0bab55d048798d85dd38a5c46347c9a13db3591f1fbcfa0ddb1f800a74d41be8af4041d1214298d764e692d09f692318d657d0df721dca4d66b72068f09f0129155cab73d7f01dd1e26233b892db0cac0149078670912bc78f9768a095cf02f846a672e10a94022c61132c0255c0a58139ceac719b9987ba3d4d2bbe695077164d6695ec771b7c01374c6376ffc40270a1b1890e31672081a7e2acfc99fb56baa5e4757b32e56dea88ade868a09657b647b2aab869713a2cc81448cc521186bb4656d1444a45a9aa6c9229ea0c67e3290ab453e8588801920554af5261fdc42d1ec013fb83ad0704fc57bda8d205bbbdba944a6b3650d580ad327d1a992d600161ecfd0b0ec190a80f31ebb4e8819c607b0b73163c554b3751c05b7190595734966de1b20caf26c4a041c044cd806db89a3447fe9ee1106e7679e275838e8e0cf6f97abfe244ca7881018f6bc8afa65f2a8f44d5a6e04d95fe50c1750d77f7fe79cd724331bb9061aef5b30974faf29cab8375fe4c800e6ddc84e9d20095240698ccf1bb4f1dd8b5b83be9061b62224b184f928c69dd352ed7ced4c4edc2fddef591b17a60f8ca7c0e61b3508ae7f330bf4d1fad5cd8821125547e381103ff50b93bce23e65b3f2119c800605099da0044b44f85143baf248ae612b125fe189ac371f3fec8b620f0f8a9482a4f5336aec538de7300117403fb54b6238ae93700263340f9c25759dd4b16f4ddafb96eadc9f650802f904ceb88076eb5aa7c7e29116b378e7ff5f834db5257798446e4eebb8e86d13149fee5ea6e2b0e2f28eaa01554da30f333964ae3e8927fbeb5ebd2769d66eff6bca52f65f2cbb87cd0c16ffd0c4e7fac3ecebb50a06f14acdcc3f26182436fc8d5b1f06ada94ab9ba9cf1189f2e7172cb579bb5621fbf9356186337d4538eaab9077445e9b3829aaeb304a3dc1d7977c49332239cee3a9c300c5f05e6a0ca3d753b7a7521dda2cf670a42347bd5ea633f1d28de0e16c6b31e90569641622676154c967b7a39c9f54c81bfad6b8536effad268754c2be8022be5142a64be15f33ad360f923e804aa8405affda6222aea0da4807269e340849ff9879f07dcb63d30673c7671a37abffacf908c2aaf8de455ecd06b8c73f4bd2fb7a1f4392480faae04c2fc7582e3cd4a92703864f0da0c5639ad7b526d39b50246b53aa8b8ceba66cd9dc8e0761ba00214c0f02a795baa014632d7a22c669038b8e78c0239bc3677123bc2d118312538a4c57f2e7dce72c1198073b5d2fe1e8390d0c3ab6a447ce1af0b6087f57edd7d2222187c6bdaa043cf2e315649777cc7350472a16a96879f68b54fd14abb17ded01aabeca518d01e97a792719327ae3ced154b3931af4e479bf17442d87b08052ba34a56d8783f0f38ec9e846f217e095a5a46a367840f610a279fbcc4c5fbbdebbe39296a8b194a323c8a3582506732d24c475efd02424ad14dddd9b9a8be4ab87a85138dbc93aa330abc9228a9e33dd25b2572216150d99e5a5daf2bebba2e92038f7834bf5bb4e7d8c4a283779d6cd2b6959d7570f23d9e42d913b763504cb9b496c8c51807a51d1d12db2e5fc04aec6a4dbacaf5c9869915bc7bae60ca3c8fc92dd759b909ca111ea79324fb4853773ad12988d00b10b1ae84017897a53acd7212ed796b79069e55d73389eb927aafc2b0277fc59b5e26ba3110f8d3757b33655d37dcdf66d65073b2d6d4bd694def666ec49ce167b8296032bd1ecb4d99164a05222b31bb89039a7a32817b868603f52bd8e718b139b3014473d4df6dccb04b818242ecbefa2614ff010f7de3c3dadde1935228c11a9c262fb3a3f564292d135f9cfde98e383cd6a6a613d6a2fe8a1bc8b78514dae6347b830d13720a5a33a57fcf7c66a7a6341992d70472d960d1fbb5218ba94fca0eeefad1f1b3a6f1ec9355fe885b5d18aaca19218547cafabcdbdf1e1916125f817cb3a4a453130f1b007f47308143e02f095aead1b0299487dc9c55cdce862c7474e1c01e380b074d1e01882455925ee3e69a54067f453798606188dcd058d49c60954cb1d26152e666871fb6dab66ec0000803d52c9dfb47b40083241f360d96252d0b7c7a3dc445c1908405013e226f8e3d729fe783ad2db42e5888123aa5f1c0cc150b611240605529b0744ec9e0dfda7de089707192a1f6c30c766cc3aba8db8d8a174e6113773f29da24f6b67bb9f585debf9700023c826928ce80877565ccacb825a8ff1646decb412fe548db9c530f4497d6bbb540ddcb0412c47cfb6eb8c6db7aa762a869ef770f526f7d1677682f062314e9faddeac1f711e76d64dd9c2701efc0e7ce6a78a382489480eb458a84a119c576105b8a62649c70361d2054f2d3a9fea54a5fa367f30317ce7c2d12f860101b0c19cdee18dedcedea11c4c8f81655780e822753349a3ee7d43bdcceb8495d3e96307949711afe8145506dd637a46eaf94c92c91780fc21fa39170cdcd690b175d1edf2dfb3bbb70c17889b60f718b62916a535e47c6c3eda3b47864f47968f51735c6103490e66d283b7ff19742ae3067e720b251ca1626d9b5fa952a72051437bbed36063d8d0eecaadb594b9cb4e260e975a05619d4fdb3e9434e33562c11a05b630c4533e77ff918eb4d730771e0ea8b722671badf13e8cc722824e113bf6027796a64b4c54057b07197947d9ea0e4038c5e1a7349b0b2f7af36f4c451e59aa61fa1b0311153b093aff4aa2424b33d5d2ba6ea2747624f0280478c056b15539d91d0cd1d5b1e634debb6148fc01100cf2899110fc5159882df9d70148952325f8fce9b01f7e9c547bcf3b73eba818de2c22796abdee41ae6db1881ca4f8fdda30d0f26ddfff79364e60eaa90c1c43bfef80bc86b1b940c1b8fe6925c14dcece37be5d15f8ce19083601ea137f62324160502b832b66a341b4b94219b0b22d32a4bcaba4b69ab8613271cbeb45d0d34b2f0cd149cd2254af882713e353ccf1f45ff099f345af99cf328e5437c7ea8cc27b2a72d73852b93a97ea50f6691896941488e6296b44b5616a6e4f45bf4549bb60be95fe6f488cc3a5d8f58b1713333c27a9f7d52ec2bb65c2a67c8c31335e2779b7ec6cb2e4d6dc558876f934b646c57708fd613eb216a99d4204c22172df52fc5a8281f82bff5f90a493c41677cdf6f1dac390844c659fd1095bd6164101638facb2a1636b5446155d0cbad8c6cba16325ec1647577e01fc80d94dd1fb6c168de0291f84460bfff4afbd31f2945fc5daf2e7ffc98e7270ab2e7f3ccba29fcd76e593c98ad37731eb8083b5aeb628661da3f1b13722e70c917bd94c82490a51344cd25fbe1a46f438e4a881f56a5e808a5ef55e77632af306d2ab944608495f749d923145c73f33137763e359d27c48c5abba028fa5ed3cb2472fff3cc2fe482f25201d3a9292ae6c17e0fa47c66803d3cfe0e5d4f2861f7623991dbb866d70b12b657ecb65e8e3342a288515184826b15828582b55d4b2769181b6cdbc0ee3aa436593400089515a9a7b789e6ce28c708a51b21afc7027f1a7088823b749ff926aec59c95280b8b41babcf507d156c20a9c61df8e7d6947084c5da7ebeaaaa86527205f57c4d8bedf0a1b92bb768297b2f6db0c76a2d0cda46ecb97f90b464e7748b1d81ba3080a63cffcacf6f6427876e74ba025aa8c38153c3adf90e06c711c04e88baf7023feba62352d4e2bf33497927a1ea2e009c45e1a734db052ff2f967a0122fb9f51bdead0d99ba7388d94a2b93b116fdaba975ad0956e25fc8644022ce55589e1c6664c3097694796df2fe0d9e7f80e0c4ed2069308f3e0def426a1a975ab8c6187546bbe754c3620cbd40d95fa8992218519c3c8b15b93b22f050fb52fe1b9701ee632b5c98d8c9fee0d36047e5501372d568d576a1f6eb80e049358ab3f1b306e4fa0ef1db63bf46814c03972dab025e84f132db1f07292a93dc7e23b348ea80a208023a4388ee7cfa4cff0f2393d698dea547cd9673d0041678e78c2956c2b8cc2cf1587fe3c703ef021ca51e7ac0adc5145f6010b12732d017848a7ed5d98cdd5f1bbaf7e6b53a1ad590d141f21c74c0ba1eee1aa710ee8fd72888a171220d46b69026ff2f00fa050f30e148cefd168a85076d2077b4487a20fc72d36ad728fcf181312fdf9c6477b8f0238bc58ced3fc84034242822b9b68631f83907664af9fbffd485f03f4b97ca1dc62ae0e1245c1e2a15860c417c5ef1ee8ba4c66f8d1f1ee09f422250695deb7f78f130bef7bf09d4e4955ad746d91ff32bdd9cb011783fd043290eb510527025c16eb66170e7fa7cb410263e930e8318653a9da362bd032e8cf6830461001c90ca9424e490e69fdc88286b4d658439bc9304ed0c31490a9597de6b9a92e1c81047c88a8984ae50c9392e3324c4be010cf3e822eab68fcc25a57e5a23744cd271ba8af2bad7a1e842c92d7d68839c88f7f81a8c6bae55c18607324ae0f52e62355cb409d3196092be3bafb9d723f4e93f5cbf79fadff7c6645648e096bd8a9fc405f3e61b89ac5ba7222c9b2be3868c07df9d9e3d7a7e1b2752dea24b887c5a5d49d9518d82a363d423f15a73b665bd95f3410283b4aaeeb189410437459f48482cba21d61bd20e3c697b98a804e795874f72ed793f3c81b8b544cdbf702448c2df1b41c95128aecacb7c4c8bdb3e48d62c8f246fc6d9b97ec022b5e6600c2ec923d36322eefd4d9310fa797534d6e283808b493643497c9f7ea3f583fa02c031bc5a6efe803a610dab8fd6d1af28b1822bdc18814e9a2223040b724d723177362f8fdb3867c4184908c5c71d6f10417736b83a363f903ec2ac5deb7d13099371268978c189640ff6ca2aa71a04b9ab8a9bc55a50a12558f77584536fa9b73bf542753831ca5e4e9cd9432a82b98ea0f6f57c3c6f0eb77f1e9e558f6b17b3beefbd63de2a1ca12ce189d513ed64ab0e397ab4802c5d12b5b35610702c15ae4cb9ba8658d49541f809deb3104892bf52995cf7e8ea7712f53da11233a2af2888fc1476af8456c65e9873c95a9bdb584ef39d45dc28803453ee0ff73c2a7203c774d82bb3eac5fe715f695a1b635bfe57ac104ab46f36845f278a9bcbcb9bbe416620734915aa6257d0e5b1138c69abf85a5194f077147170591b5074be46e5f634cf81db05c98902f21964b65504c60d36c0e21d316c0a321c1ed2e09883aa017decdcaa4d55cd5a8418e3ed4b724b2f16aabc44717a5fd99e9718ba6a9ad211432f318255b78ddd9f3256190600e7c370ba05f6443d05027d4b8dbcc3291f98bf2588a516ce76856eb472fda9a81dc6ef1744b7ca787d614354cc21284f360f5d46b970f3820687ec215d8110e9d5f94e3a4bdbe9e08b4da1b049540373fc120f11ba1a00e279bf922d23888470f007c307b3b1440b435eb7b846b970794040e32c5085db36ad8a2a3494ffb961ec72c9588936a5c9b29106d7732d3a81755ed8e5e13888b5cee914552e1e48364cfcec4949e43fc900bd9ddbe52e0bb60e7bb31498ec7b72a5a9fdadd438d7cbb3c0285b1957b0901aae0e020a19df3905251154cc8ce81fed4ab5709f1831d77dda447b4040403430e800c6c146acb4116a701ff5f8da1c7b8ea2b829f7215ff994d699d9730c742cb85bbfbbb2846ea8dbfbbbbce90c004f5405b7fb91023c74bdf0338b9ab3d2bdbd6e3f6f62e994f15e793413a31f5555db947ae4e675fb6f9809160f963adc416c5e8f82d4b4ccff1c7cefdd7cd872cad17b7cf54abea1a8cb0e6dbf04267fa958c40ec10c96752794e59715971c101228944f9244c31ac50d2555a2e006b0a4fc8922f90a0144714230f38d665ce77a57dfe964296e8e9b71cb94aa27d0afc991dbe24ab0036f9939a10d0bd681071826a9f8dc28a75615ffb195aedba6a626f6f67513b3d7aa2e4d35c584d66905b9284dff299578e5e473e967f86f1ca9feb07fda10d9eba9fa2bf8f81c0febcc4116a8c9ca3073f8189a6380c84f66b619a0f1abbcf37ab2fa1ad4a18508550d22d16f43b51c7fc23234818844e58c929965eb0ad18bd47ab8231d61ea19528c98a1833c210025944628ef7172ca98447ed2cf721bee84a1f37d4b26426a3729f9bd68298fe06537a3d815ed269059517049786477c077d15d0027ef936caa9c073c0cbf8d1611f868ad433141a11e463c030d79c219ecc05cc2f7435e712bfcb0b3ac8bae7bb8aaf65e0ec204f9bd316a3ccb07687f9c92c1537cbdf93b0ab8868bb34779b5027f20d2630f3088184d8990506da337e46149da3980c2bfdb50bf9d4cf776fd419f5d8259feb80ef294896bd88f54ff28acb9588e58a89f0c67aeb88acfbdbe838976b48cf36403a4de5492238596d1e8041ec8f55d424b3f1640be6774f79f76d0c3a88135589407962857c3c627ad79da89f38bf25c49937022349422ead863e15c51d4010a0ea7d3569fa3dacfe2a451873660c3dc56380c0bd03b41565b3de8a9c426566dec34c0c5c35d3156006927fd71b727ea25cba4584da16f554bca52e4a17b600d4334a25398e43165588b96dc847f84bb45d5b0f00da348352a580856aee155b246e93ca7f015523a999140eba6c160b6593663a7063d219683c29425ad268b5c7d38486f7a05b74c3a8d5096756b24c0cad866a1269f54640f58bef55270ffda7222999b93ad2a2792be5b1f1a6427743159e960b9a3d32a17082e54f880ff0a8404e463b72046f51d5d1f433ed90dd56c2b54954769201dd238e450ad59fefc917ca2d6d607d45b75dade49a09b0ceb4f1731ecbfaf9640de143a188b6b6e48658d7572f46007ad23012b7ff01e0c4cdd0c3abaaa9f0b5ad5d7c59fe97196723d590a37cf871b230579423ee7824d55c4f149176cd6aa08f64c483c2f7f2f0da91f5e837fd921b064ebce7c8c25c361a28493f200c05739e91dda521ea5a3333bb43e3c33c2814684cf1db6b2dc5b4e3ff526abce9db236d311eacf04e5a13a34691d137ee8df9d27ad2c38dee883ee9765a14fa972435d95fa242fc8ff4b41f08218949503d6da36b9ebff258cc708a8123edecf343d2ade686e329844a2330e19a23e58c41ca122d221939e7329f1dcefc0b1b3ef14b9d97c0d14e6cd9c3f3383d7625558bb50d44c82f708461c0056014f90dca4c9bfc86c8c9b9f0dea688189d71143684417797890e534489bb40707d0e054e312b07b0aa1f203fae4adc3c37ab1011a775e5b39527ee29efd60b5babf63a7a83646f9e2affa0f666c6d93e4d1c9d4fb407b50eee9373ed1087216ddfde13fc7d3522d3f22312ce073b1fc4ea4f6730f6328c27d7d5566f38a8688c1ff6e4d4e1ce4a4e021b58a8f9f16e6155f0dbbee0ef7bd250499e7d585beed2fddf16be399176fbe27a4b5f412cc4727729d7dface26fd30cdb9f28720f9a0591b71c65b06c33308c2495000ad76fbe28fd2e506758cb0894165d230043dc3243cbd87557af5db6e6c88276b12b87b30e9db11bf87189f01aea7511c428aa54f418765c8d70b35192bce1ccd5950061d10d01731478b850427b222618ebcaed5db2bdddd37ac1cb545d5000942c814272cee43b403f743f639d764de950a3459e04684e0338162b2b18cad0b765e4a94080a7320eda167b84570ce6787984b1d7c2a5e65773fe509976a3ae2e100a10cde4181db82bd89d8e056a8fb114b4a56ad729068080b3210db53d65bd6971fe09ac95b3ac4976e9923e8abaec4085dfd49dc03fc6f1793addf061d1e66f560e712e5f4cbb06cdcbbfcb4d1606f8b0c33a27c54308201cbb5d86f707e79c516971ece01502c002ec424036e6e1d2dfac6a0e2d9c52a2be30f444ba66f448bb1f728902eac04a278bc15e0092590007c0b81e5eb95b0ce3dcb950d451500100fbc449d078807f149b4a272522a78e8801c8fd0de20c87eb3131eca666fb102f41134b1af657eaf1dd1c9d993d11ad30b798b48cf3b9fdcd2dd8a720b11b73f0165c4200a36003c7f4e002f237b9f3eac0658e55da2c5cd1c8cc5d60ca5b47b3eaacf7543361f24adbe3e356c8e0c221043a1c056ffe7f5953a44ea646f569855ed9cefc494ad802563b991352466cb7a6caef9f868cbca3f7e61681edc98c9362207baa27c2869da9631769c8defad0dcb572badc71f4a027391e1726b63c5a10500b9196f02c2288612ec05813b11d835b8acc4e8638c8629cecd4bb5ae8e78c289c5d17e457a32ec93e8df8624610d5951864f42d603f7d97aeb2d258eab9149009d41488cd9a005fd2cd85a22c7483610cf72bd6aa510c04244a07a9e69d592d3e5a7126481ec2c838cb5dc559639a83d783ebd3c632dd4b02c8350efb2d0bd2cf5ae4d43747b15adf2756c4f6d85b88d9ce15f48bd41b2c08ee06a969491622a969230e8aa3e3741ac1876ad0dcccac712fc01693576db383002894ffd696150cecdfd0ebeeb4dc83014e8682895d1f86e747ead07ebe2663687e05ab3ccc1af9cc2c384edd587e858199757c35a07f6573fc1c54ad050fdb0877b52f12d6c27f7d85939179b2a21e7126bdce1050afcfe6c728e330fa05361fce27ae77708029b3c102774e393e8ea10650eb5ba70cca6a3c40dc892d2ff1356caed97e3fdc57a4dc9ce1141601092fd03e2718ccc21e3ff76c76bafdca329d4cb52dbc680a914bd653c00cc4b251ceb9d3a60da3cfa30752d02612f18ef5e8112fefac0a5e3b479de9770faff1bb4b16d645018a5010c10e532cf36ca0e0b3d019b4095f7422a5cf80c177af54e582163010602a0a9a7a69081a5c64d66632759ae8a8d01a08709b389ed6b15063688170c9f45394d9802d23aad7b1b8649e4f88c41582051f0acd9f5d8067f26d01827f84b4bab0793d7d3ba192e3cec576817ee141798542f6cf380fe6b857881748d363c9cb8d7021df9c1c74b6f99f54497231a07958890b4190a7dc234b2292809d4205e7ab24eaa69f6060389bff216e8132850b0777cf3e1f9d8184dc3a51bd698778edf366e7d5440bb7f7bb692f26afb8ab4f3b1af4eac085744cd5b576337255f9b631fcc7eb5f7b00fcc13240f339d72c87232f0b36bbc238ea2821713766d5845b526339fa315ee58735ac2ece941277c21a72cf21022d10c76715c058eaf3b71862e41fa18b6e260bbbd3b1017122e943f0f956e500fe2e3485e907b88ec816864a50a8abc1c41f412f30207c276102868fcfd7274f75ecc036d484b6f3794a6eb91e27c486bc0611341a30117f938dafa233564cfb7d673af33e630650ab7d3102a4e9aa2e1aa98d087d0c2fc68f1d077f06849388b6778eeda00a8ee9fde17ed9216bc12251c027b05359122aca0070c166581a115853b453374a3432054219119415c7ab2e59cf36d00b8519dc68539558ea1986bc7763d1bfa56c3b6fbba13b3d25db6eb9b09aa36036a0771db5dec913191470d4ff78e45d6841287612f2c8132ce46cb3d7c2f0e2462482eeb2c279d5caa0c2f0cdf1e9d65778005e6e3771f29904916f71ba0115f8a5386f2ee85aa477ff42bd89983b04578506417dcb1157cf4637ba821cd7f885c111d0086390a7280f458e59f4c3f7486aa534d5503000ac37fc5e9ff272252a724fb130cd5fc662345d1afc4325fd045f1ea4411255a9def7aa3006302850978bca492a0ba24ec83a765e93e6a0e8d69f2aec1ca80624d268b91635ead75605f5d9745fe6f40a9fa8b4e2782cd4bc9f4bee42e05d6400c8e43a1886ccc59a9ae3a8f85a28589ec7108f767c4b2d40d38da009a0aca6c551771a4cbc06a13d56ef25a0c2e74eab88a29b7698388b692754e52bd33ebf94d28e85829e3b84ed69ce6acaf76497d85fdd51ea8ec0b461ee4aaf0a622f36dc95961f2f2232a81dba5c1c045faba273fb131ec560de3bfff13497416087f0cf6d73e736b46c2109ecd68ec21bc7297f283b79cff450d111b2b072dfa80b2edf08c9bbf5fc57be4a416ef1ba5c5ab2667f1ba28c5dce429c2e9cb29a24a4f1e77f437c5edb976625df03a5d1fc11bcf8a725e98dd51de944cb6f72dc8e6e7b4c21d6b96a7182c6b55ae33f99b64c6075eb43531966c832d6f94e2dd9b31533fbb161371dc63f6da818929b42f0b95dc0129b381a3353c85a5c9953b924eaebe82d14b0e26a6df1f65304fa95893fa719bce823842da8bcc5d0c1fc8e38d15388b447e8209c57a4a1dac6facd29c67cd0539c8bc28d65672d8e6aca99d358c636c9fac3943d41cfc6eced374c770b0e2a916314b40c9b909e98f963cc375a1a48ff2a7d65deaab38b79c76d8692ef175b04fc9221a23eda9ac0008b02ded6dd66880c62c10060ce9c2337214673e3b4230eb699cf1b8ceb1123fe233c86260a6b31cc31f385cf5a85406c844a94453e8abd96669e37c50e0460f316660fc220853c79c83bd404c7fc1602c11df0e0b700df8d128d221306fba94402f245c8cda6421047129d601b0019bc38dc5bc802f204f921eb83f090812be47dec9e068bd47b68eb609266e4c9655303976c6d7756ee9088790a03230ecd4aacd1384605d5729f370f2c8e0078647000e6366eb400ce2b7c547108404c3ab31f133d9d9740812be42c909583d17c746013288022604e08356d9536b46452fbe209c6aad432a2ad993874873db798cc2a629006ef336c7e4dfba7db67cd451b701ce0a3115a567cec312b81c7966176caa47c5502cbe1ba7800ec9158ed83f7e95dc31929e88fca7944ddfd8a64877127e73bb0f09848535eee35aed11acc51a20f860f059c334b23244609f6a1d4dcbbc9647dc82fa32fd9ac35a7c0f8dd9ed52067f6eadecaf49d13e47c3602993083f4b0b38e24242a50c301d032d98af428cd7c85c43915c7247b260e773e7cbf6007827288f29acd995d3a67148e90afc3d2d6176e95d6274b20f4312abe73c5866b5e66230dcee02a623100e2b70d0bb215e920ca23389a2f05122f19ac4cdd651126d069a5ea885b7514ae34d479ad8e8a3f1ecf0b1d197ea7ab6d29ce2c3fa4a424611fa7783b276ccc2c0e7383c503e6541fd2124acfa81935c1c537dd0b788613516c3b84366000546c8486649a56a1137254b373b90632e40dd351ae8842cfc456d2a8effa58341e84db0bb0ad36d065a00cd0709d975db245b40a6301a6894b751d110955ce49fa6502aebfa9e13d1e46d09eab02600b72c993125bf4084d39036f498314aa2d87b1cc4745144fc81dfb6b9b34a4ec7a3676e71facf7ff9affeb7b31520b216d384f5f55c6262c034581f13be18440249a02f1bf272f2b2046698e0b01f94c281eceb1091c3d1f4d9c1efdb8a4cd44da2d8735a9c0723b403fbc4525b7475d0f4a28a281985516f990980442362264fe00d08ebf2d731eb8e34fb0b820eb2604203362afb0d2c6e8f8a7efad1d8ac5303085a3ee8b87a7d3ef95466c054f1804cd34d0b320b9cea8ccd6196f64e2eb504f0d0d3a304c26684acd31d47080a2536fb5301333958e2840d02a5893af7a4dc42d3ddeabb217d1e06ba700c328a8c81a1a801d5926ef954d9f9062ae1d31c2c63a095b84d5924e5c54c5316808d5a1cb76c920a7e87a5e6f576032ac90a8715db3a2b1f5ac210ef666ea164a84b85eff8673c720049ec206430020be193c127c5a8f2003aba029a9ece911c6b3fb8128c17bb5dfb2bd00461a4b7f78e35b0263b4a7abf9af9f9e71221a62dd6fd6ef473a536435f1537fb375206bc16e59f1faf9963cf9ad7f5e3cc78d92a7b300c0a7a3bf9b55f30bf827bda1c1e8187de70d135ca3f4b808f1e9f8baa7f1d8929be4566fc48d3e42fbb42180f6a70e085cb8783c29c3204e503ccb87d23cfb2b96f5932e5cbc461c1f11c62581349782fa40d77d46112c7d950829e1a8e481e47396bc4b39c9170764fe83b744c7361605fa30682d7c8af9f2878ae315226b84a1018c3581d8c0fe38c0a1a709396ead8a3b0b7d3b5ddf625c2e017a2ddde34547b73da0476b47dc4197b0ac35b61136314a18a22aa3cd9ee1d2bbed53323d41bb53220e9c30636085b887b67a145477e17228b320cd94080222d7ad671dcf70f937e2aac412474cdcb7c4800783459127c43a9716d2bcf07046205d518cc4615b48d75e8f868a561e2a15c0d8cd45cc165e654a67421d460431353dac124e4a5f8044cfdc9b8eb7bac3a1df3292943434764b52f22b2b6f5ad4fc6cc6b1b2f49629c65eedc6326ad277611597db9afe3b6e4626e84f493d973ef1e0e62a166ac8082996443048faf369be4a918c7581876d9b13619f44608bc5bc4488cc18f925f10f0f0193400acd3bf826af96218ddf1f466d0650ecf7ff6d1be29d49956199be5b52b87cce29a60aa7739ee096855db5805dee3471eda8e5e2e72f2403045aa9f05fa205478a02b992565c0b86afabcf90ac3a44617d7c251ed38ed6ceaf3130b4e1c5646b499d77ed469b5bf32b960068258c7022d206161a0d8e0f83011d1fecb7f12167253bc68424f2e4ff2c20a85c6759de81edcf01762bad47eafb5fbe3c549aef092a3aaf0b3d15ab1d621f6dc58f7a3bfbfe899a9896ba5b928aa29d01d6b684cbc82c81cf267672555f52cd608e54163ac743195ad164d2c489193508cec34a9aa32a647657695cc211f561652052e607bb84e862ca2f41f149b28c60a99786a95fb2191330307450aa7e722f90720766f7a4e9bf830a965ef5b43d11412c0c6c71564423f7f32b4fa0386b3c3248bcf8f3f1ad2f32654702f46fd12f58559190be678b898f5b9a726d3484edd0ccf70e357b2ad31b5abb1a59ff61661d4f5f19040d9b68b8489390cf83807a3a6a382ab9340b58e4593de6beb92302c08b8a783827916c3f48dcba07973aefe4b910b8ca9be77ee2aa66f34301efd71544a987286c9322b822ef15f9e82b9ffd81d82a1def9705955a5523e1e5c5579eac9c7117597cf1277953f7ae34683f76644061a05ddb3a08233a37b70cf5aa84d990d130254231c143d0532e1e58ce44f634d03a38886e85018e02c35ffac3d17b1144553f36e695fbd9861325c57a5de0aca889e17da6eba0821a4621c99af1014cf21205a868e70d1734c977920c7bc0d617cce709f738641a76cd40170d319da78e617f7a59f757ee8f5bdbe7f918b7822ac45465a5a5a0b9a76d3a30c3df284b60ad22d6a4679fb116f229f77684351eb86fee0ee825c2d9ccde2f0a7ef2c6f94d436c29cc39d8e5900e508286eb98eb5db6127ac77a6157ae266900f7df27a441f9e172a8883f046ff96d05a76256597231dbcfc3386a19b16c3acae029ac5020d9bbe9ecc4474696568b1dc66264d59f4a42acb569f9990ac9d857c68e4c081f6d78135c0440ef1ed2ea416f2ce4749fcc7347bb8fa962e80cb339d52c4091168adac470583b043b3940eb60914eeb66fcd9f276a41166cb2e447c8a2d732cedb075e0af0597d88a2742384b599b1d408fdd0eb73abac7d12dcaccbc1cfd2cf951a263718732833380aea6145bbf29e886988ac4922f7b350090b328c27f680e3a977b103691fc3d3ec46a1112cbc46f7e8c511c4629cbaf5eff88e9fbb1815c20084ecd3f244670b4d5c7a1ae2c7dd4652620f0808924a92635c09b7923b4fd8507f853381da44021a84dc66228feb8acfe79195b8a49be1049f01c3b5482b3e72a9a9018549725da7a50c4b429c62401615f6722ba47afcf06ad10663a5d645029dc3999d49b1ff058289a4ab9491bc51b096334d08af1c55ee14a440bcf7ec66e3db2abfa13a91103eb609827121dd264222f0122081a5c68526eacc76c2b6a3b3dd8c13228e0de4a162d15892b1a5ae637fb7d7317d684557ece998248670ecb076abef7265b64e88d6342f5d0a5a085d3a0006428ed9b0341c6cd911656b0d2d7925fba5c845c6814accf8f205c9103d7dd4085bba32a849c1df2c53b2f5724a6219852b26a5f22fbec81b9ac0095476dd970b6efdff184273cb9d5af5f9944ca88be649bde2a747756890dd73ed745704d438cd2073beba1762dffb8947b3455b780f20345e555a274d6934f5c82ea0da128f555540ea08264a67bb497649458ec99fed4c06be21733b67bddd8ce302ae605023ea8ef0124540c8d3fd89df3ca1a75457b971edd6845f17318890279c45dd7188f59e4894b8af361a0d12d3eba936638bad79cfb5a9f5ec075f8ac2db67bf19d163ffa00933bad71b82f0bff50fcc8013a9c00b9bc9c6b457cddf56e21045e541ef4126b539424c70cfc4ff2c0557d51ebaa4ac95415872a8a61559db727e1a24c4417adc8bb47dc24356ebbf22a30c966a4e36a842b1ac04ed4b02bba3400e32f6e223e2e3c9dd4198782b75bf7a56d7e74b7848c02e46579053d6d8415694594f325843451a58bbe8fe00c9c75fdc491f07cbd114a42c14284ae62397a53598f27f2d9dd460dabb06e6ab14bf77f5a4cb0c5eca65de0f86a92eb926ac2b12dba04f3dd5f800cc0e0fa36037332f57363db00a28c8592c8117dd220790197f0ccb6646b1d27a05dd25a04bb252973eff138b8942e98d9d41b3ab7ad80d1eab4c1c72ff81159bdf7181fc1c8c5f6ac57ffa1a72a31ee39f8a8c5425c46b3c3454930fb1429ac7305d5530f5d2d6d17ea22abe434532058817a7691ee1525fa784f04ad5bfa4f5ae9f4d35bf827d0a0c49466dc2d3e1ec263d88d04b1395a160218dd4be170f835f66351e37135dcda17f94128de7d2576ce51adb85cabed6ad14126d3e7cf83a2acd2df237508998a0791687006f968976828c1400041875291f5908c1f88ab9eef34f0dbb9480af9772ceea2f05cb1d2187fd29e665a21a4602b3a8dda22892e9dce104ffa1db675214ba8c4e57f12f762cef922ca0ca90e6e1f641c4847aaa1710c022d4c30c6b3ba8f61929821708ba23895bd4bb2bc713f71d51a8e2c8f435be236a864c4a47883b41580905c323dc6c029958b712a737a25acda28c70008cd42b42367c1f8b6c28c0f980fe13a3a26e73fe9729465b2846f006f25b5fab957952afb48dfe22be7f8717da456382d6a45073fda72a719a87411263497caf112840aaaec03cb2fb34d8b4d45fba9b8bda1a64bfe22cee416f3e2a143aa3b992745624e1e9309bb0377aa4907b01d7cb7d624291905ee2b628d80fc684a784582870e4545dad18a237ce0cea941982bc296132e61bb33b5302f60469f9ce221911497f063521689bd56c22c9e1b8ab40ccc0cbfc72568bb11ece9a72651f2d5a1aedbc421ce7e6148273b5ad15ee06e70ceada766b19e52839bb124162050708ca6eb66242f160ba2b57fe08c6fd5e21a1e9f2f71a832d04b641007f87ec376c27b49abc55d686f0bd1f9851c2749ec896650b21cc319b3059a34f3ddf8bc6ff6709e1cebb7e76a2905cdb523e3795b6e39a7cec62ecc9f9b9b55873547168d2a876dae9d31cd0210779d4424017795b3cc7320d7211de203571125e3410518f344a23f868e614f4241a46a9564785ca3d08ba13132e6e158e3daf2815cb05d73f5574cce7ad96d8624c7397abb9c9fc3bca60c7b6c5bf2241f6c751ae37b693838ce62cd2869f42809225aa439d0493045533c5d08466afeae2226ba8c722c79b5ae6593b173fb6f183f59beeb8c789996b0ad310500700b54a8d2ba4b30dbe971066746b81a3c08720b59ae730dccb6bbc6f3d498d6fe00a47ea5b8d07c9900d0ebc8e203cc8873bb3d90eebadc2bfc9e24581b21f101fcf644ec5e642712c0a14f3c6b0ad7ade624f94dec7468eebe424a6e059cc832aa1bfc8caed37f668b9a83430884d2fde3bc7d500e46ff276430a085893ec2425c8962b2894e13f5e222c58d6e63dc01d8d2dabfdffdac8f33c107d5eca8fd885b697556cf25713c427debc24e4f599cd8a511cdc931a539ab60bd99c52815e604a4c9297987229ce57e88a0c511f8e5b56338acb4b5fa49ea1dbf47f7ac38b9dda892e309ccb506f8ba918bbf1ca0fd95d5d83a3c47b8ad28fe406ea42e1767b652417cd6d293f2b4905d2b7b2003884f38ae3b09e43aeba6d95f5d10d0ea5db107bcdd15989f234b572231db95da8ca3b32d3dd62ecf918d843c8b4cad0f079a9ce09d104219b315f8f798c8d90d113f327a33cc318f708f81cdadbc2b7cbc466d57ec9fec0901029e30b3fa26a51b951d3897ca105a910bdb4486d302a5c59b3a610271f6bc63cd87de58599b5fcf51fbcb9053573c0cb814551d73f25684783f0b032d4a64ade1cae20e4313cd2ef344335648f4a67443fe86e80fbac11c6a1e6849d92b160a830017a0d4c18d6b455a6525766cf04c34e4823657cf4b51a41c5c5e8d9541583a9fadab785a57d4ae551453333e74b0de564f87f4afb8ce3b7f51c675920a7734a284745712788c2cf8ac22043eba751e9d3699a134d2cc76b91a089a682d77ae4c97d5a8997d97280cb2968a6a62de43455980674055efe931a0bf8a0688ada2061bda9a3853c3e6ab2c4b8fd09260fe6b118fe33752a332390072974c116150b7cdd04cef4ac757cd840c9f6abe4714402c4243193f06fe50b9854de0acb7d8514af47a70baec4a57ae5f987f0dd9349f152a5282b051f224540257dc11f923351e6249a60839cc7c7bc89f4e378bd83a07c0068ec464d80f01eaa4c8e09708d07ea195c3a91f41906625a5514bb81ac82945f5af4b3f5d663835d2fc72fa3c74dd0dd38c1e5590632d21a27ceb29fc9ced0a9b94f56eb535fdd8bc51fc8a18662834f4c5a6d1c25795a9a6555816935e5bcc1644043f844ea3042afe589eca16572fdb030602bf95207c790bbf7a6cb35d9bda370078efa6a808583c73ba9cd6e8d86073765a04385cbd81068c1c8696d69e6957c63ff020b492cea839616c9ed904a0a8a2a62ba450da4cf727d4833d775ac73987bb29996ec08baae227039c3b7d57af84939207f296571de3270c05daad70b4bac6dea0bc3c0d5b2c578f83018bbf45bb99c18b627e740b1662262c15b37b2ee57c9a368e524e4dd61d61a6a89c6a30d91dc6b034102e77bff2c18593d8a4cab8786854fce0594b34c3e707999baee2238adcc0b83c00c3a1eac5c55d2bd9a9ede573c6597b88b0690b917a4b281e9f2946385b283db0a360a2cc70a21eb81643bcbb667ba7d24ae7267767e71c03ab8b46a93a2e732fac7d921a9e387a6e00c6c6efa2019ac146dce268413de4729124884021dee85b4564f887bdbc3e6e5156907d95eef9e1e9bff250700f429d639df48bc9fbf4bae13ec8911855627be36fd4692b2a94452fc5066e5c03b12cb6139c4d16ebb272a13c156feb4c82d20a6a3989fbe6becb257f592f3ad227e97a802d9efa87c206315a27b9e41ac47ec18c6b3e336cbb6651c7f478c03e340c23eaede931615633d70c7565bb1645be170118ffc497eee312391791c9d5ba7d08f29191e180cd9c6358b2ba7250865923c6095e8be0e3cfebc512aba4d644f6c27d5c0383a23dbed9b99cec7d56eb0568484ba3bba9912bfbc1dca8afa17dd62941fd50f52b277f07d5d49fbff59e6d0bcd51da1a7d275b17a5333a429b245c8fd1a95eb896497e93241eed25db05db7020ea2afe9d58e5c46d809e1f91f503789e5c1d5fc17fd7bc10464164f398204e7f9b16cc5f36539421a13841cccc0dcf2329cb0f943888c9a4796290c2c659069a5872ae113f85954c5f5156d67bbb462c6c52b053537c7f2c59743437076a0e93aec8b94e7499ce2fa02190695d968e5d92979bd33e30e9a3e09bec7cca1c0276873899279860bc630f79f10dd69f22ac43cfcaf6399eb3c212db79bfd963781086bb3e2b0644e26f85112f207c246ad4237baeb881fcede27c351aff133e7a57372f2918f6a5701d5770ac40d68d0df92ac6d964701ecd3b5c8b0bc19ceada53f143d48fbe5e61330995336209550374b6a10d19caf9beef16b621567432f91af9b46b249026ee9ee05d0fbb506ae70b8f25eaf814c7a298a737c750638d06d1968a1d201d1bbd316b4e10b86d14d370dcee556e2f759ec4b84dc4f0c1bf3e11d227e36ad1a31c4d708cb1aafbc6cc1ce9bb8856b810b74893102d15846c2893aff80463ec50040b909370d00d0f05cfd4f563894a6de166dd1f4091db7e71e09317efd113227c9447624eb8295f8a7f62c807524d393138670b3a338ef647d8ccf8f938aae64c7db7c89f1f7c1b9926f3e6da72c75af3e8401e2743bf9a7051a7c206df2dde7ff98ed5cbde9f1873014f15babc07a74a6f0c8c8e9cc11c620537374c19dd525353908e4091e55df4c8573e590ea0bd3eee79a9a9c54a0211c7dc547365efec5eeacd4fe04e9d0cddeedff4a458290fed47f70a9312ae6fe0172e97ce3991a88facb1b33414b517b226da21683c6e98ca6df0000a8c877ad8b9f3334fa779719a1324fc7b5365ac82f1b58755acda4dc8a153ea96baff6b956cdebf6af8afd9054c0726d7d49d73a9a5313fbe0781d0c2bb4e74af773ad5d219cb0409b5ceb7872ae6c7ad81703b0d6bbff81280c279c692f629e37df206ce222909798b51a6468d6d6d00ce69e42fc887a77393abf6d44090f8bb2fb6e646366711d531815920230044279b423181f6bfdaf1744d6cb9f71000d9205b501f0d8dc8538e3e045e98343dc716b82fc6be36699eedc224b845b398b28f73a0682ac8decd8fbb6bdd656cc8223b090697475437f6048bf06b92a985f4b5ebf668d963b5f7bb75fe3094cbbef35d761bba4f780d7e889bb400757cacc806dfe81ab188175a78cfd41aefc7050ff8e8e76c3d2470df906c4519372fd9b1bc35fc3aac70e162348030984853ec9bdaf603417db156c8de5279a198cc6aeadd78271191fadbcab6a63ba9d7564d1a672d8085441363d8bcf77eb0599e5ec680ae795a8f81592856f0968fb3eadeea4bf352d384de8b717da4caf0b717f1944a40b4aeaba2ea2cbe483efdc8bcbfbdc529f7dfb312d3605af281c2645ee478e009ad391ff82460b40b59defb7cdc013eeddd783658b427afd9261e1fb3041f0d6f99682aea75d28b285412f4796d105e3ffc8eae24213e2c157d4cc2cce8dbc564dfcbc3127032648a48d0b61889a4718cc5dc1a75ee758f39e4a6f376fb3b32506c6ad0d9e53e3e337c4db684e4f9b9e8885473f565a79a2eb044a5287f26bd40ef72d16169e6f3e0bb523363e78c479666093191371033fb845355c03517d6838a3d52e27a89857f1d0bf21771fe550bb9d88552a58c63ec6e559af7568c92bdf9ef3b282b424874e4af144d53d5834b556b46716a11b9677bc359e69db20ecbe4de55f78331e8fc348c947ced40aad663cb326bc376a930f1750e62826bbf9dc3c4963a981a84ff9bcf558ecb7e8c4e11f0d47f74d602bed2763f8b8e10a9c018e90f78d4ffe8151778e487d9b13d4023444593d43c62ae260b77f86e6bd22e66cdef815d34bd3561c8ee3d881027a507849440d6df8382f18756d631f6f7374320efe1f2d5ce834f35a5235b76822e20177cb2e01dd394a1fb8303e8138aae5888fb8fdcdc50cb14119067f9e570907bbe79ab23171cc98a2c5135a0c548d1b6c1ae58598b70d8b31b744dd9551f7e8f2d4e3b39e6e15e45aa930343cd934af2f1872d8ca888357687bb4cca6a98deb1e9b2806491e65ae0996c9667e55b57d5656e34d6e91ade91a3939e96c82c3cbcc4966a71f740f014ae6a75e59a62736262ef4d23f09278becbd6bae495a3754c0cdfdcc30d90fcb282942c132409c1734dac55b7884e467e1496252b2653391e21e5eddaf2c2f297c31825629e0e93576f321c122780f298e8cd6757d6a109d406b96ab336caa04bbc7ec06406f222f8e56d7e9a0a0f78a5468ee5bb117064871cceac5d644ec3a8d63fea0a0786ef096aad313918cae241d8858d2ad63f04cf29dc8b9e78b9d179375ed64bfaf419de12199f0f337fa50996411055d158e707e9398ca97038f127e97892211225daedf12b727852ed2572bcb07d7c82590d0fa85b59ea06bb106301fb4661ae31e23013a9e53926397f746a209f87ea1de09e591e86092fe6a82ba6ca547838200eb2ad239f7fae2130756378db0c30a72a880e8ac792a0bbdb24d0ac5d428dd12a60bb0d2be1df8ea038309871faea3ce5fd95c7049ca182dbb6557f21c53b23c3ba65b5635c33c6668fbc5b39eadff7b6b182f05fc473abc3cc8212c836a35f036f1c2c4f3b2e1974b1c4beeeda55cc5d4bb9bf93c50ffb1b08e2ede9de52709432797a04f9e2c10c79da558f52ce7f23031ea80a65141e71dd15c0032fd2a6cc3592078be68051602ed763b1ca2aed1460b42d7c7cdd0980ae86fcbcc10e322102c3e202e81957b677f81ba30f189968130a58ac6d553fd54f6be6e5d706a3b460cd7a1944cb6f9c99d103eb887a9164ef6d848e38c59bad85ddc075a312f0b831b755d2981860427c38fb21fdeb038da36bf9b6f5ebcbe91e4b0ba39896ca23d8135a6740ca565d112c0e6b556c9dbe1743db802894f196c24c062f543d154f99373eb4909b86e4f96a6752724e2588fea3e781cec8998cf239728e30ed757cc6773dd680d7e3ab2ecbf1a53d220a71cd4dd348410fae2941e1c85c05b4cb8ddf35f749a7b32164693a2fa8a99a55369c1fecee49bc825248d21b26e622e7abedd6adc2c9f6ed24ccdbc99673555c29165827cb86243591cc0bc91263ee980ab3cc05943b62c8c421a071bfa466b2081f2d5d5e19dd0501554bbb360ad4620fb381c4ec6d07411629c609db294d7290bf2e4d954b765503773a8c5d5549f828a6084da7df190e5a053a344ec07680af7356459a038361c26ed3727c7613823d489c0661cdd9ca6ea01b5d27b52677a1e546dc4648d808489184e0d8a484f4abdec80d8caf01ed0ec180725bb66f64fae5f12766766bd9ecc186bbbffdc177c422a1fa258e02c94c434f96987c055ce04334425c44dc2577ab6554620b334630e1932793558bd713782f0b2fd4482273cb6a1dc14467dcb479cc5c5c9112ef90bcc0ef2ece904385ebd69566874cbce676fc296cc67dbe960614f3143952580143db740565059e50ed1e323eafff16f116c903747a54b1830ba1fd3f001ab5c7bd0bcfc32e2b4b5175091618ed5efe893377f92e276962ced8a2eae213d4d79938e3f57aae9e2cb3393b41b1bdcac827c6589bf2f65f2b8d2bc20facd35a78366a8af136f6a7f8a5fd0aff37c57c8b0b9ef8773eed77257f3f5b03deb0257308f687769ec765ea32b5f7bd26d1613772fea009c609a208129d3bee18e36c458c4d431bde442f46286b3818024886e03f1adba75bed66df1f5202e7227479340fa15a117a65d5df7aa4bfe64629bad9bd8f62d6906d3bdb22546e7c7890715a3550f0a7c117cc94e1364218b50daa5a673fed438d3fee8c63dbc2f761534a5f00829e5495f30554071dbffe97c1cf18b383a2b5820b75a042556cd8fe37da0ffbc4ffccd4ef62be75a5b78e540f134455845250a080f932b43873ddb450b920d36bfb4e6c6b2c516448c23fc4acf33219000c46425ced6c2d0ebacb9754b9a79c69b7ee6ddcc018527540c3e0bcab85f9ef10c5e73cee6631195ad55fb2c7142d6855409db2d37d46ee026a859e657296879fd016dd7143ae793481f0d47ed7df7f5a69585f214de7cb82d4577337e262b641c2b3b26a81cae290bd14634ecf810df1595fd0338cedff506f5fba3782f24875b871ce72574e59f8ed2c9613b9dfbbef984b1f7fd904dcf7c62970c25f393ee9b20af16e24da92f0d821344a5ee02de0a813c894fc248584349e9a98f965aa4f955a72caf357d3511d6e5fbc55b09148551e289ecddbf96692e949e8032ac929323a1a4d9875d54b237dbf9f2dd6b630f359e5d3c7dac8d38231d944c061de28037aac5526c5020b133599bf11d5d6768f4701ac7240550084fdd02f88851691c59f39dd38887ff1a18789b3a8253da8ee4aff20524cc643b0e5392bb49655bf34caf95d8e3029e36b0cd02fea620e6b4c21e0befc1c52e3969adcef21d025d49f44c45df0faaf5cebd74e62855cf254c6da2428b34dea3a76a515eb544c8a63dd227930ba8131cc110724d4618f497affd0cd42bf658f361054dacf22ebf3d9d2914dd3759d2302bf3cbffab83f3419c8e23a8afd81023052ffc258753b3744ef01d31c1ed19cfab0ad570aab32b2c6677a5d52eafd8c25ee8b93e3c139b30af2be9fa079d7c2e94a580018535557414101565351ad1a0458a5e8760b2743fbce3922a3d54bf9e4de1e6a6cffc578d3fd16ca3562fe9351abb4828e97fd6ec83adc0091c9c990fde1a01708366ac80af40c1e16b06770af40ced537b6401142e7bc23473875466448589cc7c6f8609e4266b77a0784ca0d06b48316d8448b306b56d98c2d32bc1ced6921f4a177f055292f1d724196d4efbbb3d7ab644af7c5abae48f62809fbbe2a1a034ad0ee89051a9cf414267da332cb5425b217d42cc7ceee4a21ca679285e6c57184cfba011461761de0b468a8c8a8c168c16d386faecc852615250f1a8c382926787af1278aa17556bd0da07557f4872ff77d6f95f8eb1a49682412a3f037b170f73135801ace36e70da33ead5614671b53704fbd75be52eb6520a488d1cc0b219aaf8cd9bc132e9f2fe1f12cee2b93ac923827c9fd365bb49ed8b092209c6391308a876b8fb0b9c8001cec36c0effd171e6575cc080a91909d1e347c29665fcb06402468e25866e8e8f5ea999177b2435f2e7a4116ba039af96fefa74bc8a02c7717eba7d1817c250c537a22c97205d141a4a073eea6edcb2bca60d6fb53839155e7c0cb93193b6e99ded1c8a4471a52b0ae8b17ecf1de3aa8c71cd3f3b9b06a8b29e8d6a0bcca816fb55027ac4ce29e996a6032f85205b87ac89af5c8c74eacaa370bddda9b325a6c1eabb6dbe0e502076a14e972f60cd0e06bdc0ac27a65e8a4b0e0240fc735215d4ff4ca5777576d44566ff9137d8f6c244a52c5acc68ad030116f2afe83235f1941c196014ebe3caefff21187491e8ba9f3dc2ceb2ba1f7be44516724c9e9407fd5f303c13579af45b222255d61629a816bdec058a088022721cb6e7c1502b4ca1f8e3bf6fae7fac0b4e80be3709c0ab7c78d57a805e0959973193fe9663074f627f1aa123faafdc42184ec9411890757e0190dfba0e1d51f27914e0eb44e998a2df06c171fcf5a4592225a297892294a2485a56b2287093c9e3c68079f566af38ee87e890a73b229126a254013e469ebb1f5c6a91014450f119e323eba23f0be23ae34aa35e1082626ea404a946545f033356262aaf8a696ad6299151a38de7f6d4fe1195033f7b6e688ec3c2cfc1f550a5838de0921c26f2b27add1ae0848945024875e44242be39f173e14ada24268ed57401943740aa21ae7d94e8d989e4da8e4fcdc9a716158d49850e359448efc25ed89215087ff33991c535f8f92f3c87dc1c6c74390dcd1cdf6f89194d225fb20ea87bb37c89e3652bc960acc2cb829403826668c3865e7e42acccf7d9380a071484d840bd14f3382292fe97bf8e2f1a82dd7a8671f3c7c9ed7699996d8e199a8a93a1dc79842c342911174cea4909ecaed1a918376ef01005ab6885686678adc5abf6e54a1cfcc7f16139093d7af691a3a0f69a13ff9d021b049de41942f83ac42884f0082c083d4ac70d411dfcd1b995fd10055eccb3cae782025d974e119ae68683aa6b4bdf2366ccce62ad4c7fe7ed4988523040cf0a643b81b631d421be65bec61dd509d567536e1de4b37e0b4fae37432948d40a29ee848efc5606f2481b80ef007ed90ad0c9ded24ee2af5e15c0c04aab38aa67e2d580db864d8f2073ff5938fe3915554ea0035dfd9105439b712d851d7ffb82733ab15a5d26fe20ca6b50b467d778d97c5a2bc5ced7d39eefe489cd83daa862674df5ba96e22db85c3d2f98ae707aeb324dab81d6c7cc905ba04d95b69104f1bee77ec9511410aff156aa02514f829493bc7f8b2c999cab8d5b9ebbd8ff3db9540c05f726796dcfc1b0040c2ae60b6f190bec1ee6f1a2776b82054f098c10e7c29a927b02a31e732c56c12992af9bdca073173bc2144febf493d47f901b654e70b0c8d74bc39c3259db235e4fe8962233b7db9469ed0186174130146029661b18cb50e47c0126f865189087873a4e6576c53152eda462e3d2602c8c5d299abe70a13a378c229f1115ce4907c436497b6ab78a0d5c8ca71704864af88a630c62d7fbcbda4db3c4975c4042c824fdd630bb9f46e68bbfdf7c4b02a318339759a705966251eb838f1bef4129b3f6032f6fbcaf9798b53ef2dd1c6f5c1fbd370e37e787fecdc18deba3e71b1ad93d3ef391ef37048e5cf2dd1ffa76e3dfa874b6f1d1bfe5b85d1f79b79e5bf3a377cb75bb1f797cf33756d9d9f343cf8d736b7ff4dd746ec7877ede52d66ef8181ffc1bbe9bf9c073e3b9311f7cbf41aaea92cffde0bfe5dc8e0f7db7cecdf5d17bd3cded3cf8f0ce8d5f2667cd071fdbdffc5d3ef2f14afaa120369a6d66b50a33388d0c4aae50804e207c01e687b4ce9a89986ef810be18806b6e16569ac3716114a190de0f644c8bb388c79c0c43d1665ad1cd50973bab362b96a46bf3db05c8b52b3d4f361412c17311c9f3691b8d61c773a284d78ddbff9c0b93d5a27022ebd0904f60e186d1d2561da3152516cef476faddf05559ef556db6b54daa889b9ec1ae12ec791f2a6f12060efefac8f274ff2a449ecf9c75ffe4c216157f7c449e0b5e6b978391db598f1bef4106a8f2af780f4034c37f454f3aa929fcb1d5eb4125e47732691bdb6327acbccdd4175134eb7a40cccbfc9e256cf1ac9af1f7d322b1211e88d31d9ca447a8787cf9d4bd62e482ecc3553e57240ad0af4cea3fc215b5cad969864df1d33b9142093de16d7d37906b8024732c22f4e2cc9df59f597057e4271bfc1753925940ae484c9a3ecae93d5e84c01896dadcb246265ad338f52da71e2281e416d4e7506ca7547e179320b5826d14e264426de15a58aefccf556a2386fa5b0486e5e3923949f21323d6088d8a6987806cf6e87366bc9712cd83ffb05c2c51ba3edb4cd2698c27a7294e41429776f3ad97c924ee61a7826ee4cb5d35a6041ee6dd868db1de74f4fee9a7db842e7dc30db93a5cb0653aa00f73938c373c436e6f965989dde135806d781a2a991f2b2919f6b442dc9e598f38b1877893a2fe961cc4d5ea424b5c763dbdbd7feab01bcb870c0d781b7aa2641a236b74585a01abb1767eda746811c48500478587f528f0643e06d757d4784386accb44508eb5627ec0070a565979882db0031673247d732496948bbcee078929eaaa8013d6d1dc475457522a35cf032812575c2a175cfe585aad98c28d5c8c9ba12f304b19397d5fca356db30f7e2549eca5662db5c4d3c0bbfed2d3236d10e7e971df8085524e583bbe14d0256bae6206535de702240eea67eb419bbcfb04d955438b9b65845eba5148dc9c8cd765ffd871597033a911a041a3efd754df8056921404dcbb46cf8469a6ef5aae1c524c0a29e81eb94ffe5421410dcefa5fa278f550894d94cd177d5ebe93d2a3eb0c69c52e8bcdf097862fff6e22d8c3c2fdd02d653cd179e752ccde4c9ce668e067bc6403428152bacb04443b768b30793577b75c797a9b88fe6c1cf61de6f8627485417b7216d9762bc727d77bc377be5adc01c13a5f61cefcb9e8c4d1725584731b174ffc72e7d654889dffed7ef176b3f1202d5aa0e1b0543b93cb13450f368166368c6779ac0c478d53e40ee0b0fd71713b4bbeeca791084e6265e006c0fdff886139e0bf36caa6a25b6ff80da7269752cc89759f332a61bd421cb6b04e35ae2700393e13fc41317258c669813a92f4d76e6f32a7ae397eb39810bcbe6d52e88dc584af8cdd61ede04bb6d7a27b49d15e35ba340660436d5d994c5d61f0652a9c8bfc88164054c40daa66285c5fc9c3561801946b6cc9b39975ff50c774153b43df71d420027801923a46e3b144a5a1aeac7cbfb9d7ee621f983673b7a3c38cd7b437738c99b1978b61329afb6b38f75101f7d1bac9d426a05672f69de9410627752ef083a48edaf4c14e72574af483f47b9f07becc0ceb8d3bfcb402e585dc09273c48870f5fb318fa85f5198c57a879e6f5bd24336f95045ee113348361a119b2a6445f8d06aaaaabbda211aa28ad8c483728aab91bed7d99b417a1844e9cac8a9b9b8aa436140757f92b57d08a4c1512238a576fcafa28951a6c466dbc9e8a4c97e99cb913475b784aa233b8433d3b341673eea9ffa59a149b4ccc81030d937027e20e72dab28c36080cab49a8283a8331823a62a58639bf4fd9371862638a4240bffe156a89ef1b9732e164ecedea74aaf7cd4194b0651e2e5b8f0616aced15f490902359751c3d7867487a87580f54b0f6122b827d796cd9dad5fb59d8c24cb000a9acb908e95f41cfc88e5ad93e0edfad56a8e646eed34a9fdacb07cbe38c8d48fa6e60fae0ec301699238914ab2a964f5ca836c6d1c521ed41a1c115f33928163eb8d6015cb831e9e2aeac0171032d1fb45cf52c568637c732e3740448b0aba8beaa699e9817743f20f04b82e284e5a4a58371bb6b3364244bc5c4e8875f8f194641dede7a2d847c0558f47f761ae0b638f0d4f172d91ca277861eabc3202678d7fb5e4d9ff4f4ffb4b5af27481a32cf5036842b739f4b46c0837f137856b8e0d736294a5c069f68fcd9b11ab3c251577a768ae1f0ac1e87b69deca6009b09036e74dd764ef06793ee81433d610d5affac7cddbec14eb65708c97eda31496b9528de65bff18d7696a7c7a7c5d334c4a62ddc6db5876bf9d04e7d1f3169f26000d3c35207ace582c749f8212aeebc8cebc7781362479737c173a7c43e5cc73a845e29fc80894f2c43b94447193fd67725f70206d85fa830a1450ed6fcbf9eeefee8078f50cce72435d3ebcd37fc00c12315e26333470a051aaae601626bf7fdaf4bd176c276667e86fc3de570d68efcc3ee13c2bc3e6756cfbc94762afc6f881635ec8efb02a6a996692e70494108094b38aebb1444087e464550a80f152367005d4f3d123f0b26f2cbdf60ff30c33d658c59e3ef187e9fe0a24c4d0e90bfb2d3fb983a2d8cec63116b4258d8b18d28045ee1ce57f69d980e5181c4e96bae3fc43c9bbf42dfec9bf8eded52f6440b02e71f5bfe41e4c6d978099aff9adedff563a589a985f945333eee46ccd917076adb3fa3b51b6bcb6f83a33e414c1e0d34208d04a971ecf0a09ed6d5be65b9ec4e04b668226e540a7630d093954a397ecd46932b5f7d0f9b197e733d27af1f3f98cd7a690d3aa82e32600c53ff07f7c140b4bc9637096dead41944568a51d490930d454a46f6ce88f2bcdd3ff79720a87665960343e5f84b40fd161810063f3fda101dd024498d27644421d398553c8ae8ca46b7bcc520ed1c68da2238401d28ca327422bb7465caacc56761c2e6a3d8d3695d7b370b4e359a005117abfa2644c72de1cf9b3c5d433a128430b024f957dd06d14db857f37cc52e40388fe85ad2d7e8978aedc82ac78f7e97551b43d4e48097b0d1a23f0c70c05333f4afc52c24fa6db2a7aa89eba0d7941e3ca841a06361a058c547cb6a7ed71238b3762d40fdf6c726d5cf94b835edcf40d2951f2a87d1123a29df64f8444fef87a2d6c8c4e5d3374abd50a97ed0526a0d98db63d1437e348608cf3bcc98dcd64db045c02f269fda583d82ece26685f4a8b1d5dbe47eea25830def97e749829869a1099cbeea5cac99b6ecee230707961a10c538707d82d31ceca706b9735dba64dec29d60361bc9959bebc6cdee4086a66fd59c7785d8440475d46c2070c07107d2b1fda34baabc38c9a35df3e5778c75aa1ddf34da4686c51107c684bb57040e8a5f931bd5d5c552efcf35757537a7ed4e289d85f83dfe53bab00d453810840ddbdca0e00bf9ee9897c3c520d90ea1667ae0f67984425c0c20f76be011a390e431721a33c857196f9149e32be2d2a5b94223999eab9a25b99408004e38e0ff68a44c8123d24f151fc2fd4f0f846411dd6d88fe9fa50121d93090bdbfa368aaef516a004918d59408b00977a8d7e4bed11e0489ec17b0eb478e1e419845b19535c0542c3f8904f1a63cea1d4ae3e683995f76b115192874d0d6cee0b4d986fda0f1963d6caa021e7368dd868004269f0f85a68a4951bf01c396a0656d94bf2bd0ac0c72b04eb1114e0481551e60093d75b21b44ad4c4a07e3697fee7c4d5f1e486d512b98fd4ef790b5abd0ebd03784bc4cd53d6f151d3c1f25dd6be2ce945eb8749de8d5feb7c5de5e7da4cb077c8ec8567a4ba85a0567ca7a1a645d5e89656859437b4f15d5e275c232c408eda06016a4ca7b056525ba50dcb53157a4f4f14d83d97916b5b2cb40cde6d34cef041be6be2fd450bc305aa64b368b2a8c6405c180a7e64f9aeb831ecf9259b999d19f358a2cc1d000a91f23ee919907d7e405ef6db29ab5b6f8c185ed66eb0840e47d00b032fc1af09f4ce7a0fde3159f79294ff911b09171ee7c855e0bacf223f3b94708d0a2f2608557c3292034c2f4ea87596713c8f01112f422f6a4e9ecc240b0226231e95ddd160084b21b416a9a69586742685371ba91e42a70fb04cdbd018ed586afdd2ac710e02f43f5c1c981e3d2ebeaaa7ea07b32c029ed5d0c9a26dc804adaad569d579de5f079020b4f55d31a42b724a19d5b2f890657623478c31dfa422914463f6a26b1a583944d5107bff64b9ca857294fba1c1d78cdf4f0db691170131d264d9e95b37a33aeec553ed9b87d0eed885ea1418192689a4a26bf53da35a89a5732e3055c705892ce403217cff18734a7974e58222ba3d747cd620f3e932bf1ecba3d4978b53fa4f6b80eb45007d426d101a3a62042124193e3b8b7925c69088a2b939d66753cc4522ae76d05556d0d3f2756f4a8eaf8cf824cc2ad051c4aabcd7859ee01d1d60326e183a366aba7399707811a35bd800590e8c843164aa2b9e16193379e6abdd2eba3882706b8c33385a55a72b88e2fbe19d4406708b5d0b2cc9e799137e89191da3c28bae6b645c7e26f4d95c35c19548d3b51ec0ae7e6abfc75488a98f45ad32058872f9b39256072ed9cd3a1c3120355579904380892250b1b3f631c29fe1f4443a1665b56f33d56aef82b8e79afeae2f0108480808b62f169cf4b7f2905ba4ea24970954d4be98bbd3acf46860253d5fd22ad44c1eb755f5e5a94a04255633ffc99db2d3b364a65180034a62c84ea5f73e01666bdc94148a8de8c16c0c2e3cf0086c31e1f81331a450993d189b7192970d5a20a0898baf10b89782f83be4f5ef5a3c0831eff452fc8fdc64f310733c3ca1f7276b57395bcde20f213cd24d7a5d888a73b4ab58de099cc5e3cf09da03d060c17e93a6bf3d9f4c165a17c73b433f44ef703e72088b36279e636f0328e34a1becd706463fb44765d42a82ef91fcb3746521fe1805a8280edbb0b1b00385662e9e64c2d80f915c81eeec8f2d76f741bc23d07b2ed8607a7da0f8bac7a3f94b175e8f9a47d52d7c375f5532524373cf6de8e139e7d217bdf14ef060142d20fedd24707459a1baac9ecbbcc047bfbc8f63ae15b5ce28fa4b9f183fb7a93463853e05ce9f8e77b65b8ae34422d89fbc5d25099042bb7418f267ca079149ef07074bc6d88ac4bbe6245c76034d7efa0b0905c6bcf2b906b110ae6f3c8f87d68d1e9bcb4711243ea6e0827c17981f9f97d5e6e7f9f8d330b16fd7808ee88b0047825b97a266b1b835c15272c9c7c5202dc78f7600ca47cd30203e7fe9818d99633a92ac4090ab756dceaf6431f2957807a35f5105c3e5df9d51dc58707fa118a5f3de544c8819ca7a7535c9804dae1fbc55b30542a5207121edbc9981769672897e3605b881bca27e1cb535a89920174c3d046df28539c71716c02708e90f55916a2bf7e4fa73508395defb1e1b7784577c26874c2a044ddfbcf3ea59e3a16fcd2562cd9bbc9967b4b99929401070ca50c2e0cae22d16aabd6eaa2b98a2493b98aa4f27215e9e7a756a3d17c7c7a7a64b2d76b6707569a5a2c9596ab46b4562bc773dc4573d5e8e7a756a3995a32578d5e37765c55f2f1e9294dad10cdd42addd8c9a51b2f578d5aa796ab300cb6b3f37ab94c2d952e7009c2c9fde5ca8b54049e3c4a14c965cd202ce64d424e423057a1ea4fd0e52e5aad259abe1f57815c3305735588e6a9d007f7805cb210ad5d215ae7d05a3f351a18c555fd027dfac1d007f7b4cb766ac03e9ffb9a2b479aec1204cbfd2b21d98d1d9aab56a698a9fe2a6a58fce4ce22f7afbce64bdf80dd48d2647fa805f8c60e48c35ce11a1b53cb5536ab11f8dd72558dcd2af4fda61c93cb55a2ef37e9b80abfcd4a24824f411ea207c51a9b95685463b3025d3557b5d08f88953bf46088c59be2030c72e5fe95231d53eab0f25ad9691cd010152e7019a23de918efb7f7be8ade97cc38bd5c4e474e3b4d9ab0e935044ae6be04b176b2fd395b3a09d7f32970924b16969626bbe905fb4943e0c9138be5ee3910aa491862bcd23c4398d496e506dfc7511478f20c5992cb9a1b964b9bf3ca5d93d1e02b5096ebafbcca959e8ceac9fdcafd5c696ae50ed19e846a21281d634753ce68c209d1fa4335532b0404fe5caebc5a2b3b2bb0a9ca8018670881e4c585174d58f5afc4a66ae6e008558ca1451859eca006abfe7e75b3f2cc2c2d377a66c2106d6f639fc68e3548e648637f1b6b6a6c68770fbcd9e251da4f1fc6e7733fe788a2a1fef63d2a3706e9b7df6fed07f1af236afeaa8a94524a7dec3147d31dda0d460a52305b07efce2c6616793660c6720ef3bdce5a6ba5b763ca19cbf5e9bd1887e17f7f092333bd1a53801deb386d8e37e70c38e7e781e6ec6ef7536eb33597f3e78cf9babb1fcf17ef6eda3d5187f06c21cb3efad0b90361f6e1bdcb530c9f3c654a2092270ef29429e188d7497aae9d278e71fc32cd149736b96badb5ba0be92d148bba4393dbbb48b3d79f47bfcbfdd5d1bd473d6b7f86e96269d281da64d0e8399adcfe05994d9c7e59c4d0dddddd86eeeeee2e72df38775bbd077fbe546fbcf6bfaf0147cafa6f34e2fde68d403c55bf08ec7dbf7381eb57cf8e34a7712ad71b19de7c714a01d3c7a1c979c39c14f0668b47bfee9933337feb60aabe39fb07f3fd0a7c1202566156d33a66e6ee5b3c0901dbf7ac2977dd9776491326453061d23d321c21269dddedb407f3c54939c0b24ed2aa6fa674ba66cd25fd42b3604e9f509f30acdd5df2250cd97d4807773f73d9df33cf057297ed711537ba42183cbb4f1103975fee7e7c80b03cd57d17e2f913a62c01efd89daefbfbe900da7dcfe60ccddd3711e615237765e4ee2d117866ee71f7eeeeee20b19d3871777777f7dbeddc979c1b5134dce3e7b647f993464f3232fa3b72a739f85bdbca7a83d81ff4a0b15b1f9a619ba4edce92dcfd6c25b9eb5ae8d9ec59931dfd39435bf0d1334f753fdddf6b5a0df7188dc6c663e8a92a06ee9fa1f3beacd321c074d6756f1202fb773f5bba31075bab718667ea98fad4564a4d4d6f9b4c26932934994c2693c964c29fe96b7fcf6e382737097059db082fa2e2dc7e8ffbbe397387b8ad4e88fe7b3b2688dbf543b9369dcec5c09b2d5ec98569a6d7e4527fd25ae9ad4ce09befd72b86a2a9ebbaaeebbaeefb445393f73bd39c01fdedbaaeebba4ee47d287b5d07f26afd1c7cd1078ea86fa4395f231a29eb43e30e9e32023e08ac1308cdf99aecbaf1dae65ee079dc3706c122a8c054853cdf060b4e29cf1f4d1c7312e07b9b714fb001a22e02d5b91f86ec7d13e1079952da03fab26199e52d2e7bd3c77bdd6a563765d11b8a439b748cbff7d4fb1f9e2c7bb1ec799ee7cd9abb306ef2fed7e4f59e8a748948634dd25bdfef873b06e52ffa99ef35cdf75c3e64043ee4fb1661c416c417e68be7d2a457c2c1200f57d54ed5f7fe87ef70157eef6de818d07befc39cf9de7b1f1d43df735ae334a964bed0f728f938f373803f1c7cdf594cd47bef73cc9999bd6f0a3680ca9ad461a2fcbba799135159874b939e13715793debbe8434028b88511a649cf7bb00c5cce987763eddd4b6d11f8de26bd589e39e6e4c99e8f25d641f6de1281b9c77fdfc3228a06d7b43e87e775e038afe851eadd7befe542dced40de078a402ca2e07d06e07cc19fe0fd4a4f9fd2d4e0114583df3efeed6b4a23e947a311d2874823908cc13bd29c2156f34d335f6ffb6af08f9e823aaeb8a349efef9803930097f327d37befbdf7bba0eff3febed0fa157eef3dd077efbdf75ed1238121f04319348247cf3f2015a8c1636b5b05213d7ed2580384b2b018a4b5ad70901a96a7e8cfd56cbe7c9fa32f0fe6cb37b6ebd84822a7ce3a7568b2fe0db46660a6ea8b81cba8b5d63ad25693fe5ddffb81066ed6bfd04fce39975428781b87c517599adcfceb6f3ee375f6df1ec655f5b752120c86f675d439d3cd80bcaf219dde1b69c0af1981449ab90c129b0769042291c61a24a0afa90f3e68acf1277d8ee6544e22eafe5c3dea8e616321ba9f9966dad0838fba3f7a9b15cdf7e08f9e06fcd15883e47e0d1e6b442dc4055d9a41e0d73057e01804c9fd20f541d218c47f84a2a13ee969ea934654f7a49f2b1a7f5437a2685079d2f75079d21804090de94f1fa4f42adfe3f4a6378d41487ffab9e2449010d943f1283daa86b92a3daa07e949dff5d0009a7168727b1d37344973a7f22714f7a69fab9288e246140da54ff91ea4378d414c4190d0989ef44152bef47375329154524aab9338b9fc77a4f11f7d8e7e11c653dbf41416a787c4e9614808be75d2501f7c9afae088e29ec61fc58d73b5da3edcfeb727b787d9eafb7f365b7f2af032802bfd89799638e1d13152ca93678b1010c0075ab05c7e9c6a326364fa2fb44a65453f869f4c7f47ab60582c5693157d1ea7294b824fcdf46f68953f0b2fc8f4431764fa2c501ca013b08b8b8b8b8b18f9ba47f1562ea2c8f942bfabe1f8ac42454022b6f22462d0b36a71aee616451081b6aae1a060315bfd30b54041144158f9b758c30d61f58349052eb8386b2086095e2bcf7e2ece1d34b1056de56d9f8bd30b24bcc067e5719f8bf48810e4c4562dc2245979b7c3f385fe0e7ae0046cd522cb102b1bfa433715c39b2d3314e7c7c9ec7981a499ba5c556f70e890bec1ee7055e5e12db4ca5fe87755939fa99ff854e1d10bc4ce1c814a0596f2046e530df79bcac0fd2945e0aedfd66bf2936b639068f5837b5f0edebeab3eab1fe6cfec98cffd793e9e3d7bfef72cb1006fdf813db69a17563f7cab965dd5a8b042525533cc54b5f3c373a67f4e1c4cd50266ca7f7acb7cf19fa17c5701c01e815560abfaf89658805560619317a45181adee3485b88d0661abf5da4e5bc7bfe73afe4cf5bb7b8351600cf3142e923147a449ccb99ac44932e6729ac4b48c9b649ca4495ceb4e9358d624b6304fe11f578fcace765c555fb0da9653835d17ece6fcd4603558cdc7c7e755f3f1bcf6bc1a948ed93e06f4ddbdb9ad513f578bb5a8b72d268a8db62731598fcf8ce689338fc4f2e2d09ef8b845e1584fbc5b24e6d1d813af5bd42dea9137f23c6f341a8d46a311d77ac2e17037ed82fdd4acabfe783f3fa8d12d021bf54f2dca65ddd6c5b943aeeb12b93af7057bc56a3d3e3fb31e9a4f4de687ea6c2cfa8495f164646aaeaa3ea251d71f0fa60383d544b55af57195b5cff23e239ff6e9719d97b7dce53955a7c91e2211d4951d515d6b12c73cc5827185b98ac31873355771315311b8ac3f19fbb8ea4f8d62593e1dd34d3c180c36da25e0b7584c15f8181cad175315ce147e6c9d90f1dc6213c293b1cd2263100e8f808510f620e3af39b35aa463caee88d70e4cc9921e263eb3273f9555718610e998d931a2d679edccacf2e169ce18019faeba1662d97685f103d771179de578b7646632339959bbda65612f1b137febc064b09ed669178c48ab7cb80b1fc9f8677791d679c170bb9ac4b00c8bc16035fcf762ac538bc9509d582c168bb9cac26031580c166b17ac5d322e8331c698d379edc0603f506a3125b576b972e8133be0f771f1cbe4d821d33aed82c19ac4314fb50bd6ae6e9c51cf099aa0e96ad7ab3683b5cb496de68446f2481ecceb726288a865d14e16b9c610456952f4d3a4684816d59a14c9b2484916c19a1439c9a2214d8adc739a14bd9a14554a64aaaacb278b763c65639eca71556df5d46044b52cf2096546cff5bd97bb7d2feed2a556fb22ef45cf35e166a2e7681de8b91e11e8e70461c78edd7bfc9e15ef7b1e76ecefdd9fd9af8e283476d7af2709dc73a08eb0c290ad115664fb8295b5d6fe74820efb06c8f5bb078f2089ec6f1a012dbb4fe6c189914b647f972856fe2df0148145f67fa1635ec8ae8577cf3a7a8bf0aea8043a63aeffb15cf105eb123c4408c9b53e774de0deaa4d314413f949aebf8545d42a8411b9561e2194549e96905c9590ebdb24c24c75a0c2f53f6c62f916d205068c5c4590ebcbbc90230607f03042ae4fd32a5cdf861f4ae4fa37b40aebb0c309727d1f3a06cc3c4150e1c27ae56aa3d524d7a7383c210823d79a796eb6984c5e4de43a83c023044aae5ce4ca23821940c9d1820788235070a4085a3b2600b97f8a91bb29cb6b41106e0c727f7a6a07c7c1660fe40e7abaea3e4783bcab1ed779832ec783cb5bc35cdddc80befbcd47933b78aad24242f0b3d827de6cf16afde175fc267b87f5b7efffc3078f9a0c871d3c7cfc983facaf96a4cd052ea7cc011d53774c70a684284328dffeed7bd0e77ec2c8d41e8320b11f84868e41e873b37f7b9afeeded484331aa8ed7fdadfbf4966ddfa4d8226ebfddeeb7ff413bd0b6dddfb6adfb6ddb36d0b66d9bf71bf7dbb6711b07d32e6cdf89323b7c0bb117b89c3e3674cc8f8e295570e898f2e4e3866dd5fe777b95d39ca9bffd6cd9ea17de6ca9612b8151f63bcf4c84375be84f77daef7f5dd5d9ac5a1462b3ba4f452136abed39d10645c3bdf66bfaef68479aedb71155dddddd57b499c0c3e2d9a979f254e193d13832019b55fdd952d2cf343555733e396742997e01324540a6f4310e70f794e670957deafdf73d00d04195c1051a4d90327d07d0f7417ba80fec4647039230b91d43e917a201ee44140fd0a3503dbad9235a5298f724a912622e30322f8cb1a21f83cf888725cb74459fc26e1099fa0e4dd2f79b8dc7cd7deec6460273259232e20e4ff9f82669ac47aae4cebcaf0d6e50b3c1ec730214f772e4c8c1ca314139de55220fdc07cc190f6008cc99d04f77777bbb9f1fc38ef0093c5320e87d171ae77c011f74f1c64a7a77b9defa2928430b17b8e78f07bb9a41db013b9a6c89a149ba24d7a7bfc3e79c53757dac716a8269485b5c5aa0ff82e3eef7b1c6bfa6df06c93beed1effdb6fb62fa24cc544d2e882c218514428c20220736384b08830c264090828b3056f4bd573093700330a4784294181c61c1bc8110c02002164466459c8009343536343536b38b1d1ce4582fcfe7494153714eb2d23a96ee5ed6b7e5b5630efe35e7e07f7d864b8e9b33f49ddc67b99d77a30fef9a6de898e931dd77776977f7e4012ee5922577d7753fc3ccdddbdc9fa0671f6dee072393a37fc78cb6533a6b7477f74f71ce97f9d24dc5ec3952573e3181cbeb430dbda13832392ec6e1ed516f0f1ba4be1da7a7c83214cbdbddddf7e2b0fffbe2f9a2e3f2500cf034d2c83cf89c7444f140f35f502874ba313f006378b365aa54588051147b6a7e88889f73ce9f2d934e612260aaec83fefe7c983c55ddcf0f0b3055dc4fff597f4e9e9ca371f81e48ccb143e421fa8011eb173dab4e049988ad387113ad385751f88143e90768085183255ad0441156f4814c950d134496f8820b3274d073c6aadbb9f83009ec5f7d7c7d56e0d9e4bc38a4ff52989327074a6a4beebac01de3b5e7ad856efffa892d748c9d5fcad4cfc4d24df8001351f800e10a2100a10312701106142463a8a00c1588545e509004236e4045134682b0791de1c40d9a6071c618309842143ed862c633051e16cc3290403383091151d881107a505181be007838020c1a04818a34b21842821faab8792245123430c211762809408039339fbe88be0a7d15e80ba0071acaf4e9874e37a6cae68924a0a0885719413c01ca8a7e00a6cae60538610c210743a04104093cf4537a271062f03302308e90c2b563038516507c922cc14819413471e7d3bff431fd90feefe032924dd64c0202972db9856cf7f1d2ffe89ba6eae381143d4fa0b8c119c28a3ecb54d91041117e70022763440962456bdf7f71d8d2f4fb29a55df8e33c553643142176440a8690042c8c55dba0240559107981901a28b16a9825903c51424708189cb1ea19e440054988024608ccb859e924818b232340011a4da8f940260920806842102708638895069c8c6102258af0840a116c60074ba6e0c514686c21860f1e2a964194009400f3434ce0cff3c30c38010d25c440082e9078c16a3e39551470d2831f686144139e44b102e2cd160fcf79024c45f385c264fa303239e8ef90a1fc67f6c0cdfd281f79a0b97b04d3c07f710882fe1ec92629b561e140510221af21440102005500210430405206ce142bfa467894826884485a309d991940e0e959d9c2090e94988192205ab0228187a2df52c250f19b9c0f46e90076951d6b90d06ccf716fbf7b1afbdd1d6bea48639f1b6bb6718e281f2f2661fa0b6fb6d0ec7973dc93301cc7fde73c5d85da509be77d8feebfeebd6e446d417aae36f17a15d9bfeb567f057c44dd7794fdb9aa4037a2ee88ba4fe30f7a9afeeefbbb47598e0b43ee9f7b927b184b833fe82be00f1a2bd075672b423b86fb6f7ace7dc7dddb8d41baefbfddbddedbb7a031f494b5a52bb090fbfe42ba47f1f01155dfdf6635a2ea58eb48d37d6f34578aa30ae13f334ddff7a7b9ef630d12ee6bfcef73234dc75d11c5fd5c5d8bc51b128275c0e1ce165b9de8124c42ae3e9c3a98a729cf7103f281560e80c8f5cb29cba1abee77efc35539446f47512e491a44aa335f2a14758a5cff76335acd7d686ccecc0c6a5a0d8858bbb3d6a30c532534d631654861a8edefbb77f7d7dfa1c91e1a4073b7faa6c9da8973b5da401d7345639eaa14d6640d09c1407c68b2d6efb93dd57bee7b807e1b836c0f7a6e0c8284667bd007e1defbb942f1e0b847f5107b68800e9a26690675f0b8f11ea4c3ff061e64a099d6493df4971351ce7df73db6bf6337064142737ffb20ddaf6e0089f88acfad6aaddd75c79b2dde3bc7a1288a8e281abef7ef017e8f41400f3e68beabbc7eeec61ba7f7487a8a0b4b57601f832009e2ff3d680cd20f7615e807475487da1e446d238a86effd69c0efffde290e2e4fffef69fac14f2c5941b9cbbda7b8efc4b049ee41a2108c9be4b80fb9007b8f375b4a47503cb647d1d02a74c002214f8c541e375b0d74757fa399fb3a311618c8dbaf64d859b15a9876a13e27ca883b3c557f13433b865dd8500a02fefe5af334bc988d52f16e62fd4880cb9b69fd36fb6ddbb76d77ced4f7f7eeb76ddbb66da16fc338840a65bb55bb6dd855355f031ab1a7e8fd2a5e4f7913eadbb8f7d7d4f791c6bebf8f35fed6a63aeda638f066cba41f22027f3fd90fd32fc3e3cd96d22b21c1a8f9fd7365bfbf87fdae1fc47bd4203d923038fc18ed228a0d5eb30933ef188c51c64fa64fd3aa36e91c713f325a64b06a4f7209536b4e62e8cc9487f735cc95e755d1137f72004f59ed26cf31f29491e13a2501975fa63cb2ff141b9c2194c3f9421f9781270b46a646280c3c7ffee789256e70867e1313b0fdf9387c18991c3bac58fa4f986f9bdc6fdb76b7ed6e1bb7cdeed60126776dcbc29b8f019cc37c9bcbf93d677a80892d4145f6618e9eddbd3af5ea69a82801e653504710acfb36f436abf714fdb8df7e7e480c8bc0a06f6080dfc7fa3e30b650088c0dfc3a1451349ef736e12f8141202fbaeff3a2f340e2a461c6e18515b1cee16c16ceba4e0baf162583405a789de839a116a39e16dd77b75e8e0c8eebd078e5ee72e274148d7deeb9b106871756c456f66d5621c5e179131f08ec917660d06855b776c4c23f748069258a2cd36fa176066c2547d1b1993e8f56556c831da620cbdc5861993e9090ffe6218aa347d009f87318ce66e12c0c6baff004ca042679f6c68425947a3bad23a65f3775a2ce9692b25c85c30b2bfa59663e6399390b4b265102d0afde2ca44b0b32396258c21227891173495dbb9b3e8875a3e7de0f7fa2690c59de7b5a82e225282696e9a614c5c42a412941294bb45c72d2647f89567a52f2293569b24bb32e9a6ccf5b193229a5357463a7eba263aabf4775ec7fe20a9126753c53b134e1344ec7705fc79521f3a5df94937b48eee7c41e682e5786dc78dd5839b2f2aa2b436e145921c1ca6b6548eebf5184fb8f7e3cace034d92bad26c39f1556adc97ed2647fa209c7d4ba747608ca9ca1b99f13576e9aec2f3961c66c4d90811324e47ed11370696a95a0e4fe959b8e711ae072e515a2edd47b5b3792acbce6ca8b7e81cb10ed9b8166af36696fd7b827a69c6f34e1bc482d3c798624c925ce6d6a915856448629c784d3a44d145120020924582c08a30ad9193678814f107894c862d54f22024f9e214572c9f22ae271d68a3cfcd0f964cfed7be28d57937de30891266fb89aec1b446ee8dcc8b981a3a202fca69629c7e432e9dc70b9eac692b6f1e3aa1b3b3837726e0cb141b3517355e8fbc6129d1bb15666e5fe1a47d4285172b9f21a322497259f25a5f0e5aa527dd557dda93b301811b4a9039e3c3578a9ea6af2d4c06705566be9e5a99e26bbc4a4c9565c2b4587f5b1be16d2f0cc53747cca8f558425cbae45925cd29ccf2fc661f8ef637949d218ca5262ae5a81a5e8b86ac5e529ff960ccc0fe973673845a7883d52bfc404f6bcfa792b4e9af49572ca6c2cfb6a44b7c0ad935224e50504fe8fe5ffb5fcbf1cffcfe5ef957e62a12cec91397d09439642d997d844735538da98ca38fd344e4f19df3486a5118fb44cfe647f1b2bcd5c952a49183293647eb7b192b4b13c43406946435d8dde35a449b7f65a6badb5dbf6f66e2a2e15224dba0a8e0e9596e8c353ee824cc23067a84c04d93f0154b5e2a453be0225fb4fbaf2c4063ba12cfb53227eb88aae46a4f7075222823fd77c21895f8ef8b53c959aaa1a349a61f095ff9c357efce7ac51cbfeb13e96e8ab520596fdc322d9bfe4547eb2ff4a94ec5fd6a071cfe3c6f4362bd2732d577d2c4f1d095f61118ee52abae2581c8b6365ff90e5aa1ab21f151f57d57879cadf5fa5c7557425fb091f872a3db48910967004ba930446692f2ac60f1f3c7678aa71186164ac5089186e62b8a45b3457f510f363c95c453641eb1ab47bc72bab21cbfe2791b24ce20e3878aabfc6abe52adaf295285d8355e3a663eccf421ffcd2095db86bb4b27fadb59ba5a49d64059e3c4b14693a0b77b2575bbb5f05e6aad1fbabc45c657a7f1599ab52dedf2ba5e864ff11a95557a43789a81ea54fe629ffd27bca3f5676d288e27173ba39f9d8ac4e32f702f797293a28934da879ccc0b92f731c075c720edc5beea7c885e80a708cab63caf903c455a46f1fae228da2b1c11f5b08892e302bc0d494fb5d3aa67bbae4f973fef7d355733ee8338609fd5d721daf6581d7c3ec81fefc9bc1a7220f348d7cdf7ef6b33f509a6c70524a299df4ce0c8a3cd0fad3649427b4f6ba0c33e64bd79ac013f46132d1497ad2d8354fd11e241a48af32f6cfe96f52e63489db48dc60db6905f400fd1b15d485fe94fb25f0a76c7b6d533081e97714e64b3f28b6143a0a73868a9daf83347847e181b27cd4568f8334a327354883d7307ad253b0c768acadfe1c1f141d7dac61345657cf46e3d8344ff5bb5c45fa2e7dbf7db96af4fd76c7c2de0231555b4ee7d82172e7f43bcb55a7ef94efb7ac3923fafe8d85b3bd2c2d77db1eeb03a5cb1aa5cb3aeb9fdcac1c7f9f92259bd7622f04d5576df5575a8d55d8838fc7b2eae4061b2c6b4da479cb71553701c59d22f7e7b46bbe34cdf15477a84b32fcc4b271fe491818991431f0fcede52a67ddf262fccafd2a3ac0adba1a7d4944511389d483f4a531889346540d737559239f1e9b95175b4dd4a51a580fe0f0d1c8897a4fb65fba78cb657198a73aa6fee6c54c6d32eeb7b7b46fdff62aac982ff63daf62ce78b61c68fb4db8bb4dd864afb5b7e6c554cd79a174cafe35c24cd90ea7bbc9f66b946c67f38508f3a508f3c5fe48762fc661f84f9230305df8309deb05b87458e7a22bfb1e0367a0bdb291d373a291d65d9df0eaf47736bac19df5cb53968ed6dadf6a738676cccc7365b3b2bff9f836db68ee9d44148fd9dfa0fcb7f051fe6fb342f92803cd9bec5db430f01591b280ec8083a7ac0a8ac78dbb2ce630176050078f1b953f81345051a65db0af22fe6817ec8332cdb5071df47d9351f1d29a740242c15b4f93f6ed83656cb29d234d5adfdcdd9d871f327da77667b4498a346975daa7702ae68b7dfa6a02974df3577daffb4ee28d08f0ca63300b60dfb19807b01ce8230c692a7f1abbd6e3f4367e82349cde86833c6e4480572c7f835a09554ebea9889b8fb8b16c5fd003d8dfb8a02ed847ad8821a069ac906c7f411a7ab5d136d97cb1bf891b0f13d8bfdc643538cb53fed753a327d9992ff6b10b970edb017bd498a7ec7bcb5396caea697497a7ac8aca781a5dc753f67b7c5cb5f2f6edcc5535debea5b9eaf416f5f62d16d366616137debe85cd9994b7bfc1ec6fb18e995a80c1caf6b72573c6e5aabe3af8556e3bd9ce552bdb2d27dbb73ff6ed9124d9726fbfba7ab0c3680eb3f6bd2673d526ab39610f96d9afb31ab33a6e63b01d8739ccf4a57d65fb5e8a4873177355233153f6ad7d0c45b657967273b27d9358de9d6c7fdb64b387d371d59d713157a9bc7dcee5aaf02ff7ca33daacb6fdb8aa73f5b8aa8bb1bcfd4de62a1b1fca70e7caf64b8e952de66a3df6afcceedc247d6131980e767539ad2272898be0c922098592cb4da42d4fd9bf21d29c9c9e1e1f1f9c6db9c9b2fd1a62abae547e454471bff273e585225ddd99ab70a0655bcbf6fefc0861d93e27f608e9aa73d94ec7eec8ac88416a7cf89e0d91aeba98ab7027cb16975d2cdb10e78a459cab2d0c29a5519ab4cd6ad2368d46fb274918181919fb7e2f96f95886d9be8a0eb08712bd0b7c12e94a655543ac2c4fd95f11272c5b9511c5e386f678cafe0d9579cac23cf5d2b92fec051643c0a591461a2b245f1099072e8d34d2c83e9e8ec00e9b2ff68dc0f5f17cf12f1dd68d9a852478b385ceae9de42e678da7cb96b188d01223a70c574721b703f16a59eba685437f6470d3aa4aa453b5268d93939b36f371bdfa044c72499b10c919e2a25da4c9b6ef9bb5b6da57937da4c9a634c0e5ac55259deaef6f57e744c965cb6a3bb48776ab5994f52383be3eb370b60395d1d858ced88bea7cad9534023c79962cc9258da224771298ff461bca8fcb5ce6aad67175ed41eebff4a7f7095e339f9e1d584cb6b9bfe8b78cf5237bb98ad25a4dab2dc84debceac653d3119187a860efb1406b86c99c3dc09926ed1558d0556f7db7ec7d8ef914d5acc9fe46e5246ee7757ffb4bf5c27c7c7d06b736eed6f22656277cc19548f96d57d144daf6a34b0ba5fb37d3bf240ef4865deb2d6e6dccb23d7194b122670294f1e2590c8254c0a46b0841242bc2bf03dc373020a2edc312108bcd14039f8ce8e80af8fb705ee728006de784680b71a8094509204be49bc1a600e090809986482339240c22b2289214033c0a0348a40a107f8e6c98304192018e6f2e441823683714644d703dd10199df79346939e2f422c2d3e1d4db842a4e3e7e5ed20a11293a57103ea8042cd0c921358251d4f687191a2030a4c49488713663b3017873c48b472f9a618163839060412c68002a372007a8247336001c679ca90b0024f07094f30c15f9e32242881025cca53860416143894a7ec0866785360539eb2230c810148b066ac7360b9b1c8fd2d321d237b32842727c90dbc147753779748a36eec2e72f77f15dcddc1afbbbd10d4dddde5dcddbd7bdce1a939d65ab7b6b5bbab6feeeece6d7e6b95a9b536e5367777e7b6b03bc554228df029e40204afeb36cad7ce4ac51c3ce0d908aa86195b7da0fe07ec93b29db3035110e855b7df47a98862c058e2d04745d47c9b3cdf04ea3cf00b5d7ffa36d973cfe12db0b828660f7f53ec2c0275a066a573e461c79969666c555b107377f76482423a67d777d65ae74fffeace3da523a639fc664999f932ab69f3909bb676d942c65f16ed004f3c5fe683763a10177a4aa5b0a19014f63b6badb5f5d6ad5ed0160a49716d4e916ec8c9f30baa4e14e9745c5d48b475b504a0cb894217d491d35abbcd28a70fd45d2736daa2ac4d846bed409e07ea363abbed870f9c13b79cb59c771bc809cb59cb89b0c755d0e52ea8b301d4edb0a18badc9e9aba0ee3a61376b3711aed5c190c8eb06823a2f54ed6fd67ef6b3b76eee84fdacfda808640006c7f981409d17bab09caa070a5dc877b963055dee82ba50488a0beaec56532aa8bb4e9836bc5d20e44d6d8d050006de6c991e6daf76bb9df7e13913fac0ec98d20ea4df077ede8132749e2fb603431fcd71d11cdb795214e13ab103694e11d010509193f7751e68694e11908e0b548403893e3c674099be3a45a242240275742fbaf8fb016204c521c54977c81603e166146bad07ea80501cdaa22c8a833f0ceaf01e7fa35a0b7d5df2133e0ff4322d294e41dc0f1fae93d30772de0f1f6e0d8a087f17341a8df09ce17a760cc1060fb4c3862e4e1fb8137abd76b86a6483e8b3d2d3448441a311a8a3fe2854fa98f4ed02e6e658a2caf35d98386268216c3287a6d08512a02fdda9968389016ca14b01410688960b559818c05006fc251b0644dd7b38344e700479a02f746139813e2f7421df258fdd582a95b0cdb36532ede2817e9e727f39803c3f357198c839737fceff97e865c49b5c3d95291f3db203bee86b9a387c4d21fb9e88ce97ed73343776a60f8340d40bd9801d001ee000cfbf79f2e440417134cb7353a73ab5e3fa7dbaf97077ff1feea0ea82ff75ffcdd6f1e22f707b19b5a2610689b264c4b83c7cd8b043924cdf072094529e1c26404d6aa647d020775f3b26ac5f6374966f776bb0e238ae8c1ce27b1659fe76cc009ee5bf8e7111dfa354fc066510c72a8a9fa3a788126dbc8b68c3c6ff0fe06d0cc0068e1f8048718cef22daf80188ffa8fe5028140a851ac0001e8542a150285408143f9445d48b46703c8ef7708837485668796f145b5adec6aff0ddab53fedd2b7bf7ea5e1d837affee48c7d878ff6ea755aa77f043204d055aef500acad0a00cfe350b6ad2d7f742bd773fd1fb7ba61cec1d7e910d1b28940d1b28140a65e33ddb405914f81e2a6d32ea27a8033576293b98be8d67f9b283d1d9a1f2031925de8cf28fe567ab3a58a7fc59deabe37bdc6743ec617c8ecbb56350cff23a5878affb506207eb9474b14eb1340b0000000bef2cd4cf59600100ef19002c340ba3f83d992ffe286bbf6de3becddefb751de8ebbc493d0f344114744b4ce0f2a3a1441ba24afc6ade07027578def7b1c0c2f81f2803f87da3179a3414aaa1119c20055978cf2c8c654d1e4119b83c8e532c51ff3d69d26b1e9fe6712c3f903f5a933eca428826d987cee3a37e64f1f08743fc9474ca86c8c30fac6c23b33c4aacb9ce9999599e820c68920aef91dea35f8dbec16507eb60de75f8eb10600bd6caaf27003dd9dd432c90bcc06507433ded60738685f7d49721391200d813802f31006adfe3f8c15480cb500b567e305a2e3f5aa8e52a18deff7bd22a1cefffd13a667c7f164490ce7cf1077b1caca9bca77c29934d295fc26453ca976476939bdce4a6d3a7c632247b4e2f8011ec51f9008c2556790080b5ece1976018413e9ef20ed6a43f0eb1531204a63fbef8a8ff60ff7e1f96fd47d2e78d8ee36178fa5e7f39b9e551efa1449a4fe00a2d2d9fa35b66f654be15441b3fff73f428b688466078af7ee3388ee3b882d8030f3fb0f20acf034d23db18c7711cc715461ba86700b6311a79e12788fa1cedb5e016d48732ea47232ffc68e3851781281ce3f5d4f828d448717c0d0c2fe018c7726601c52bfb50330af55f93236e726479d4589b64c9b3499617c51267967fb16c5766791558de63116b93377e8233dc3c9bbc71632c83b8724961583a86652c6966f97e926dfcec18d4db184b1d9a9659be4e81278f0b6033b07419f5399a45bc4d763b7952432cbd15b1ec72797bb2fb8762f9a98825088a12d482ec9f2296f465125b5f2e3f5af62775b0b2f322fb63b1bc22b1879ac10e06a3b9bc46e8a1965d17d97f46bc41527639d95ff508106f9094a156f6d722cbfc647fd598458eb93db1ec827883a4fc5ed9bf05f1060927eed022a19e027404a8f0660bdd6472f5a6376b9c7a80df878b42e0064392ffa391f41e1a4d0fce54499c33451239bf9fdd5a6bada51eb0d9c71cb8ef64e0be7befe95f6b124ba211d218b6a9495bbe0cddd39ca3293803a5b343dbcf6cc5faf34d19d489f5478d930ff0668bd8b1e67445bcfb5e0b6eb2a7936ff628f51f1c5650c76c92fbd168247d63d9a3d168341a8d48a20eff922649393a617579ad53f74d44604af3a58d6abe5fefc8d3c19712e9d47d8a73e7a42b7be9ead6588532eb5aaba8c6ca17463039eefbf003bca01b2a67eccb1744638961ee9ce1baa46bec1b4bcc642c6f9da62130f7b4d698ab6cebf3dc2e3375ffba94f87aad35123b7b3cd0ecbdd7bc766bde74daa1f2871ed12ca29f42c3a54bbe354e3ec0a5d772cd5535763b7fa2bbcf5c63f7e6689a3f1d1dcc97d1e3fb1494e13ea90b4cef7b6dcee0917e315f46b526ef23c1e5cde17bf0efbd6fba23b1fc3cfad9e4882597a4f7c1e69028349675347acf1b8dfe470eef7e2496334a26fdcc9e88141a4b9b1cfad1682496a20789c6b266d1e3ff44ef52470eafc9e07b147c1edc8ab7e58e39581d5314ac6dce4e75c384e2a37db8e9d32d63cae5a57386a6e1c24cf5c370b7604d2f526c0040e625b70ced7cce5a713ae54332254277b0953569593d96f523fba9c56a34186db633f379f9f4e8f4c85cb2584e0cd68209d9583baf9f974a88ed616d3e98333d5056de7c305ffc699ef2bfa39d551f6bc7cd67be38d5318d00dbf71baaa8c30e3f9ab4012ea70f9039e3836906325f825059ee43936e7d803b97955559f5a655b4e2748ccdfe0eea6856aeb0d0b1d3dcfebfe12b52fef4a7b16642a1044760ad52dee6f4f39b44fabeefc369b26d8eb5244c22fdf7d65a6b2d499cf9b3dfabc0007ffffdf6f6fbedbde9f5f7bd45d1a47cf8f324a2684eaff22a630dca8e3c565ee5e7eaf4362b6b6d69bc4d9a6a93a6b1b42f22792692087e8cf4393a492b4f9e2b92f05cb12483ca98383c7041b539639fc78a25796a91278f15405c51244f1e2b98c090278f154e32a8e6aaeea5f313e20fc9ef74c8ce07dcb8cfc48132dc8f4b421243df4dda753564fa3b2fbda4f74c1acb9a6c1aef4e939d933d5bb709ea30992649047f238d57c99df4de1a2a79dce428574328067836bd67d358d6e4d2786124117c2bd22299ab79aab99e76a13f14391fb1d3e17a3a1d50ad4beba263a90cccc1bc2f2c778d0c5c5a57bbf2e86dab8cb3fe482c6fc662092aa3e46ae54dd2b572d7af4e2aadd62ccbded8b1fe54284dc2a02184b69a2d57816aaddc390daa35d9a05aee9f1787a51615c121fda75636da252dc0bf9a63cd069e58cda78fe91cd224cdb1a2bbbb1d625d4dd2ad5a6bad757fbb51db6ab2fe585693b446a93d91210afa3ed03c03cace2ccd537687c272ccce62b21eebd3a2bd89e1d2e6e4d01c9be3d6456dac494affe2f06b1c195f2cf1a227742436ffcec7d54e9b17146902084d80c28b0c1f380e105670461429208219347822e6d51a7e38777d25d65a6bbfc8f66348e2b3f5fb27c014e6bb8a00289a80bace396e5efba656619622f78931c24ab62c09c24eaeaad93be6cf134e8ab8a0c91747d46caef802490c6c00850447aa9841761e279e907dcb5e4948601697dc24c952591cc6878b9e1a68821f9e19172e8ec7b5c43f3725e94ab3dbafd65a3be79ca624b3d6ba116172770f4d51c0f4efc6bd0a5d30994dc218fab77a6badd66e17865e5ce736b2ccb90901fa42fc99ea87c3cfe4c5475bf68d1106c69f0c37b4cf047a1a7e2696964d0b2730b1450b6d8c2299da9d4cff9b5060f2c6e083242948e346062290d95821821c4c71850b9418c21032280284126c6314b97f9614061e28610925a050811476561e842410a10812395318410225d99f584176f75beb479b899bdc5f299d4e83253f308289919d3076561e048d0b33b208810b62b21844c1839c7d2c75b85534042edf12e9982568fdd1b8e3cb822580881d79456162e51506d9c1e0b24d134330e10466a4073d45563e5e8c8f64faf648c794f695e9d3b7af8e9931b52e91a485fad91d19a0a0e0c6799a605446592c2cd918a5edcd91c4c2b5767777575bebfc5bfa11be35f44a851f3d4a069a8dacfc68bcf1f3c3af61a2d1a6893669b19456f669a2cd2f895f0fd29f9ef437a5943f8d281e3735fe06f52c6fb3b2f125695549f6dd74cc90cfd531a1f7ff8874ccb7a4654ab2ffa7d32f997f2cff58302599abecb52f5976592997259f929212aca4a4142bd26448a749b73654640cbdc026a01370d6a4ff04993409f634e9609426bdbb137577b7edbe8a3cfc903b74d3a487584d3a08a549076b4dfac76ad2ff45355c7eac9457ca4e0aac047355575b3267ba520c348265ff518eab5678ff91cb55a7f71fe9b84ae5fd47afd18eabfebd7572f9b16aaeea669ef2aee6bf82e8bdd8f2a1b8c2ab88e29fc4f13d0ada6f1155de8a342daf32d684dff25e7f3aaccdcaebef459b5528daac54be65ac21bdca7b2b88a70f57f8d35813fe0a96e6f42b8c35a53fbd8a687742b10689e891f010c71aba124524a29f208dca8f634dcaab8cd6be449ad38b638de94fa3d50102cbe57d1d3859de5e247d28965e4534fd494cf94e94a166efbb99ab3e56b3ba190d58b96c5875959f24a86aa379ea8c6991983351e64cf7f895310ab29720e322660d212aeda463b611959ddba941fe871886aae3cd4e45a2aa43935e45ef59349635b9fe8fab4ea7b134c3638d570fb7e32a8e55e348a7fcc9ff1d6e87dba991e47b9a3dfa95738947411da14facff89de7b148c403997e46f44f1b86999a9fa372e3355bf8599aa7f23a368f08dca8d8c62c08dfcfd8dfc8d4654c6d3e9741a5f98a9fade16d91b298579f40343326cd98e38a820921c4e112243e8924ef9933725497b913224cc93e1e3f0621beb94e7804340d7f793a233694588843e321949e6564f6cc50766462b7119ca3e9a419a5510491b22104ff9b38814e55fc34d24ff15d147bbe0bfd168f94b9c557a4a334f296955b7a62c64c275d15a92bd6406a630af241892c91d1c9adc9874ca6d944ef97fa58dd9b1dc9a6c37d9495fc7afe51887e13f49c27c3dae4ad10189b4cac6be98ab02a8a5a8242cb785494e32443403000000026315002030140c098442a15096a699aaa90714800c84a046724e1ecbd3340952082144882122000000000020329a64036e702d35f272b3f7986ed2411c564416a7b4e3378159a8126545304c77e974fa7768134e6ecb4cc84734f7a11e8d4d81f0b663dbf1022546714bcc83d24ff3efcde31eef0cd75d201afd1c020bfdf864ae55a9fe97390a6529475369a1b12a8ef95b8d3229643e452f2060fdc6eba8ae12e7da94c16fe2c183e914471c794bbf14db2b689be55f979be3b8c14aaa4969ce3307152b88a4e1350455b8753af6cd083817830d0bc532176ab117585ac146cca3ffacd36cb784b4f125f3d7442de3840477631162177bf0310fc7931cb4be209abe1343587a5c2d1b5f051c17f0c1f53610e89c56d193a4cf9478ef15174dca15ce283d713e9723af0452fc334001dd685578fe7f29ac6265549af4f05051f3468d860c32d33229336e608162484554db4549fd0c05cd4b4d46b003cc6536f98b7165178ff19aef2086c811e953ac1b84c93290002572124bc7056d0092ca7b4acde18544ca7a5b2bdf5bc321a3a4f07116490c02d418667683c36cac3c6873d6f4d7931ef391168568c24d384525404586310d21aa178979e0bf701a4e597b78e7a70d69263c486e9d28ab5876dc8fd88a7b501b8f07a39794654770bab80b5f9ea06f4b431cd42e853369b65275013712bb52bf8503e52fb0102c321515c23219ea4f8cb6d22e58239e574903e388ffcc95abf7e7c891654f576442e0b3f05fcb765d8b8f6414092d020a360e095386498b49c1ca7895109f74867f81f6006af3201d6e75078e96f8417b81c56ca99d6dc9f51ad70e70ab9990c39df571d69066699e8b77e6344d280d6d6c37b5515f242a4d641e0a9f04da414ac9c3c2c6d17d4f92b7e9765adc0ffc512a25723dff6362f0db85f7264c21af6ccb423330521678dcebab51e9acbcb1155db15a24ab21cc6a028d6807baf855c1ea96c908aeb94adeb74c3bfa41a97460c5ec8c231c39f2b41ef2a245667672d2f5962b75b9246b09e8ee1d9758ca0ebaecda716ee9de671fe990505c11fa72607611ce922137118157dc5e480142ee1e7c66e55bcf1309377d703e7b91240e4b5258539216374f2c26c73d64c60a64b84c51f7efa8991ec10c7d1029b6fab1aec56d529f4b4425f4506fb128d7cc48efc6bf03712fd99c34394bba28079d30ff1e25d62248976fd2ac23c08418422fafb93a3bdb0e43b8b01d0819485f41a59a073c7495cb1739da0548b673aa013d1e407d2f78d4649764f5847e94efaf7ddb564a33905fa23e2db9234e95e9939a240ea913f255003e3286d71ed8b162afc4fc368bd6c7972bd91a116c97b024d2f521e0b4cd101c878d42142da4f864e21280be177f678005964cd3c05505f0d898835921131d0edaa4b17dee0dbe6f1b38af9743a3c1302297173ee467f9afb6ae5c8fd31ac1b9c34e38dd2417841b3d04d03333b5bcefbb5654082984ce6b101e3ab31c5e89d2b8f11b9e2e770f3f3ed319ed4fbb2ec96581d01e2aa84017a841921ab7930a2b9b14838c74c8e9051d4772d2b8bd8cf021ef66421312f0b40e708e295f754c3096a8668c6b01f45d9a19fa71aa26dff389d4eb47a667071524337d9dba75ac07559c1630209cdc8bb9a20d4013a45dec7790a2a78b3a57c921f1502eb4b46e524fc0329169cf83639159fd4ab6b649772ea4181f2124bb21053feb8820a7fac8e932b37800554159f0a4f0b3222eb73f08acf35d881072a7cf8aae818cceb09dea14b3b6f71588ba5e9aa5a523baef5be04130601f5c4ab838d7ccf28a88eb24645115aa052637fe9e47210cf5814db17c693c8e3df50dd306999c99a224ee2987e4464d651764f58f2effa0a8df1458c3ccb5f5edf06f6490210a0798a972a30bad09d392a364e39f34e90a2a7c10c84bdf293cc03c745c095324f4820aebe93eae9c5fc7bf0f9eca94632aa3b1077ca3a5d23ffb2661211c9bd9dd37bb410c84b60d0023d3132aacc4070ff2fe8cc7ad2ee130023c2be5af74f57fa6636a7798e48fa4bc53987749ee6c67ddfdad31dc7e77b9eb1f2963a2ed00be577f909370b0be5bc6ba7c914c94ec36797cb21df929eab4bbbe567b4d7ccd75de428f88a604e17049721834417c6aa19db004e897d426bc1bba8a7152ca004d3d033023872935148395ce8446955296bb7c1f2e0b3bb7b4599a3edba460aa94b3ac5f86be87594d6608aa7a537b488632114ccba83f8b872be89493cc9d44fbe7de7b9d8dab5deedd04135c2efcb6a52f3dc55524b8f4e1d4c517eae6538b9d59f8e0cd1be4cd96fa4d5cf6283cb41a3be73170bcc62af163867f5612ce6132c60cb0beb924db04d734a8a918e4e47d60baa2b735ea344a030ac92381c3638d7323ad1635c5020f3687929d60e6b54caf7e872c0664ce284e61bcc541c74201124e2ff08a853a191a23cc990628634a2825c2cce2c7041a95fab270d40a7bb1b5854000b90328765ddc456f06e0c381ea060966a21f92815b14343b5e4ed095790b6e081a3bfec80350ce6132683c9245ab3c034e9c58dd72778afcae2cce67ed256e9d0f61334fabed227868aa0a40b956889656bb9642e26006d017afbb29105f2809ea6445e7a3d3af502954af013662c8a04535f45814a0a1903344c7584d791e8d01c070eb5dbd46db55485f61426862ade24ae87cb0ca7d8d76be3a0c62256da5ab9df5ae2f2606565639b0b6b114f1bf7b1a2ff114c238224b69718d39f9adef404f8a3930fa5d8363efeac5517f0d1b2c871f3dfb2e00acd3771588f0af23601a6a4536feb2d501b7b8e74f800db41a49f39d4b32122307299194a25db661f0827da08c52c48aa67013b6463c46dfa5cb63e7dd2c046c9eaeb3bcde04bc5eb0439861acb57a7afd328d0a95e40158a9c9aeaf7788fbb56f48dc5dc28f8b19e725b42584e73b53226115075c270932fd1ad4ebebf89051cb6dcae9c9c9830b22555c2182982154e2ce0a66dbf14c33332a739891ad86062678fc252dd2ac2b2488f0a25a43bf2433e9c19a2fdc8455546b837227ec544ee1c6a74ad521ee8ccb2e4b92637776d3fe29be6a64f631c497380088170a50c23319e253a37e4cf89372f62bfec9a4d631cf3040d0f478fda341e8d20b3e1b4ea872e2890a74440cdbe9291c0afc938cf9be216cfcaa0e5e4facf97deca164227e2bfc460aeab0b92181c28ff541457cbab485d7834129baf244926820d4c0427026d89a2f6c092328c6356cf25802daf8a75b4e7bb668a07a0a2cb930bbbbd9fd6837c41a0ecbe57979d81c6052aa74d3dca903de0ea8980166f30d52e399d6fe3204e2c56d2de3bebc1d68333841fc077f21097157c2b3a56fba29576d05f601205ddaac4beef8848973b879d8ed90cf2704b62f9fa9a742fb7c0507f9218f6d81c6682df8cca8295630e659618475a8a7b9588542d3030985cbb0af5b304feb7f29a4c83e55867f322bc024e091000f1b8034d75ca08da54836ff81e057ffc73321c72bb6820c465bf3fff04a90d14a6c483028d8641736e11ba2950b61d52eed141e257f722d1a9dd32c804e9f388767706cc0949684f2046049061d405197a7ea4900a576092f63fa29846c5cdd2f00b2ae341cd20668fed278240b927c2d21b33f53411a2c7142690ba2d390ef85cad8476c002ae6b7f9604197f7014294017953316da8ab22d55a66955172568fc0f0fbc2392abbd785bfd279bc24e5dd88badd83c205cb4ce248d9d2d82045aaa0b31c2317628c397b4b387313ef1ae1de83449c8c57c2c22588f7a3605027936f4c6ce27060c8ca9543f31fa3ef3ec59599f553970f1aa63528159c8e7dc5ffd5f642440e6d56ffb9f16e2f734823beb352b27c3c2a5b3508125e847c69580c83f0f619a61560a971a9ffcb6571031eef6a24209a36b1881eeeb34245f057f42fd6fa0d71080a989ed3c9bd2d15ef3e9968e7d8949aee5e8679e11705b31425c881ccf0dbb8f87d413367b3d971934e7e38b0b4805455457e0c50b4a0d4b5fb15055660d2ebc80c59055ca890647dcc35487b084699703ec074b1aca333f4d2e0f3b7df6156c5b402455fa40b0412d7ac9c30d6fc6cc8b7257611b53c29ac89f988f093132d0058737082fdc129f83e12b9ca077f606927c5b323ae9e3753bd21f1063b653e8b4eed5a01cc8f32a8c40a247483ac80d0fecce2baf6bbd5dfbfb6c1dff76033450610ae5d569f87a8570b301cba004aa43c2060776636a86b3ed7410197742b8568780fb9c97144940f6eb41c464730bedd9b2dad6ab89f4b269267ea3655d7647e9ea9ec5d4ab4d64de56affe5e4f2226fdc455170f797bb15da8d59741467e7c3b26cb76502bddf7a7c228a921155f404184c0da45308ade8dc715e3638199ac1b0e23a47feedf0aec1154ec99f774b1e87dfbe711115a233b33889927c8076a0cfb1c0f3301f956a1f5a5d50c9e75d3697d2905638cf4e0526c5a2ea16bcbb6017800bd355b8ae6022337d49d36164dcabed173c59d2183cbd4721eacd88d348b208731a997b5c3c4c9a79b18544a7321217dfa112aa8c1cc2c6b365a20628b9095a712685e8f69359b8005f7d44fdc0d7d4d7801421dc8b1d80cb5e122f332c137795622247158b5a466ce06d23823667dd512d82304363fb611aae6910ab2a2b6a75cddadd000e141ea674fc34fca955ba72f022913eff4be1b976898803998ee4ae5601432ba4ec72910d91630f7c651f3ed081db6d2cc74a5ce73c10a8a8bcb9145cdb23946b37cdcdf671f3f5394757538c3191c7e203183883f882be58b8fb00b8e6af9aa9b285097de3b98e182a4db0a7fe5b7ed38e6b26a1db0db92b09336a1894f57b9eb9e70753ea34c59c9d3fb99e423ff9d468146bb651bf1a7559f129fe0d77fb3501afd746b3bc04a487fa7b3950f5218d140755f8c3285d9978e77302f68924f8d8158f04ff36e7444443ee98329cdf57bd37de28a3a1360bd3fb27b9f680a4ebd31b6fe8efbf2a32b74fc900501c0101f9e17b1e3a6af2423d84e4baabbf537fc25418484f6b5585f485ae879538ec0c68296307129b7f9910ad768ddccf302f18f719b31c0c3607f4e53416de0769b166ec33fe3c137e4dcd4316920c9d22009b72e1d8de1b537e1a8d12900efd2330fa61db3c4d6c97b9f2e8e3a3a1275745653d587059c14d5e948bd85eeed3b62d20974e54ab1c6f984abf18b0509bb95ef52350e53a51048b88055661fe50a454809685acf36f45aeda92d7fa60cb4db577e2a2eabb317b55f455ee9b5c1275f11f41addc0aacf86559059c67c9b3c13e7bcbd13db34f26f73bc81b3a7690cd10191b3a57d229d86e045863d12a10db660639064561593f32895b0a9964cb6e3156e9b31e2202c12cb25cf1a0ed96819ca9ca08e2230e6ed354757fd7be3e7d8bc7c3f042fe22069f0518c7d8517eb7c5b6ca07f642ea8e9eec816026767f15edf855987cde121de0a511f41140a3f58e4557e3056ae27b0e8b8e373db72dd63ee7b0e2ed1324bcf1631b511f1383ace80d5a430993c7e4c846f23f4fcbe8248462548a78ee8e5b28cde51cdbc04175231fa7881c8782fce498580778996c42e8967cd9a4450a9e88302656bc9c9800c5c37a25ac2a2c6cf3dc3d5fff53463f5f7b46ff5102ee5b303bf6311c46ec16ec9fd73d15db75debec3249e4531539ce865cdf2bcb28bd2fc89f53d76bee762bd429b76fde480fee4040e9ba5629082a88aa5f75295914b3f671bb0e6b1cf99dc810f7ee26f4dc4f0f1b918a794c97573c88990c0f74ba1e09209a59021d94f6bfe897330ca4b7ea0c6ac57739ce2505f90dc88aa6c5888c7e4b32dc87cb72da0baf948dd037325239c87169ca6b21c570f63efdf6878206a5cf18afb5cf5acec9aaf2148817a0c5e541600e9ded4fbe03f05822c03d7bc17bf4ed6494ac6c868f6eee85b348618e0e90ded5bae7002e21ca3a6d5a02e685b37e8ae056e19f0c449512d1559119c5fc3de5cb73c617da3aa5184e49aae8a5961fad67d78514f9faa2c425a4f73d72e19e720341d90efdee6599d82c8c248ae8459dc080613acc0636b52a864b6957e5a9e2999305724c659439257717e49fb599e75a70d577e76361f7ab41795aeb4bd4c25f02a3eb363b4990de98419344e87998818fa5e3bd9646099eb7df2d31b07e6ceee17bda2520a80af24224b80b31ee8315b79f540b1a4fe4c16847aa1901e2da97c8faa629f5fe3d0750eabcab74fa04af89272d2a335a602a5ed186a9dcb0b93465a42694a83439100a13a8f1dd576494a7822d179c2075ddbdae41ccb2f87e7b1bcf95a1aeda9d7784f386cd6f1dabc046f6d5fce2c6b6ea86d881f5d483c64fb15e0ed12c507d5087b1c10b8d8ce3ae1ed24c0b49da3118df74d13c29b3b0a35bd1af3f2667378d2fcc8fcf4e27739d9a44102c964c0f564cb76e12d9d81335e6321e68c7a4c0b1e4482cc81008b8e85c68368562a92f59e65ff6d2ea2b77639f70f284e4fd9ce2a31b09e039d010a832c5180df8a97524f8c58c285f09cf36da3b7fe3c69d01a9b9b109f14447ce5196989068cfe2538a3b1c1dbc88566b0ca49e9f95e659967b562141ef02920abf13446f85bd07f0e27582241ab84a3e82dec246d9afdb2a9d46e30b85408189a17ac5cc72cb88faeedfda4b87a772fb1d1ea016a589b08abe2476c07a80186f4a99c51d1ebefb84b48dee7394f096d8fe8d328add24a51d8ed008b9f4df08cb0e9ff35e6595a4191bf958bb84cb60b5e1aad269a268ae3ba66c1b116fd9f6d46634da530c1b4b2273769ffbf75f73fd22c22b2d5f37f8ce5edb23d9dffaf64d0735090e5aeb934f22138a28447b50d9a32c21605e7c0516d1204f6ad155122a6710a6c5ba280c043b65c411ebb2ded51b6104e5a546284e784c50a6730195d5d0e5751ab84f473b5f7dbb40b973adb3c0cea84562c23e69a1d21e75f2b94c3bf1e674398dfb5b53677d0d064c4feb963dd89c5a1880c94357293a0cb471388c934832b0066e517e4c5e6563b026ac528d512d5b8e9e24776402bc7d73ffd3185215da436fca8fcf0c26a70c3e43325fcf8964bb6abefc1f7bdfccb3c8a15a5e6c97d6acebaaae5fb6df10e74d6f098bbef8ff1d0c1dbc218e5631eb745ffee80bcdf83202adf08a096410d53d9ec02dfcb5394e586ddb5862cf35e9e8c8ff18be7f7e97e6418ca371b5388ec235ea169c6f54403dcb6ae01cd99df4d26c57593050d573d13668dec1cee844ceaf7bb5c2485e5c554e67d087a9628d57538a70479ea1119881882388245f9f1ffe199f389df82539b7a75f56692f4cf7382160d557506db2c09f5defab7dc64f585c0474e284a421012a4244b519395572294d9952325804cd6124251265e428cf75653692c68e99e778dcd362f42ebf4421ecf04a61670c9ae4431cc1ab971d954bb74262fbe2c0b47235fd84adf5ab03c88d0a0d133697f05fb97c83bb928949254850b238f64d0cc88f51732b281c64a4469fa899e8ff2557a2d9e8f354800d75193c6437748f159bdec800408a8981a9ed558b09676e73d32aea42d6862732fb68e31792b360b3246b687c8cb82e7f81d82ad76d277af9dbb3702de4219cfbe33906add401e8021f126db0dc344000b6f5219dd877f8537b00d485af57e11f79be80ec03e2c0c72dede0cf1b641ac83ffda7eac85c1296256300c95344eb6bcf6abc99115222ee0cc858e7ece409e6eaccfed6510736c03aeb0f0000980beca817f8908310acbba75572d013af5f411154e29506293c85c56965aae780a661669a81d9d9c09b9f8d9d25e0a82e2950c61163bf1d49a002d1d103ed6e38156fd9837c382340a767123e628000f82c27657db3dc822d7eeae10960f79d8e62c44787aad8acd82b5b8dfa7ed206a393d0112c7236264f660853251e2f9bb1219e8b3fcdf2d0b41fc8a8a7a39ef622eeb3c8cfa22a6b6812a777bc7e8ba604038e6888ba204c50cb99c107d61413ea4b7d73511c1e8f450bd243c698d3338b37ce276d4f6a3a23d021d6bae6184965283bfa02da20e4a079015b7aeaf98c991a945dbd764ff25447c56cd63166569a847082f2d069d5b7b1ee7cc70c203ec6e5383bc707b640cf90a8c2cdd2710d106a0e7e6fe030acd55a426d2a4f542bb6762f479055fdd20ac8da3135457cb3656054aefab11d5cf58ebe62a797f83b4b14c0a673df0a0e9cc31efa24a8fcc5c1d9009ddb8a821075d710b213bd358b803981d1fe0b4d3c66e1e56cc6fcfadb6cfec31ee9a1b0d3a8d99b068b5f766aec588c304426784e22b42ef1497417708824bcbdf2ac1fc104bd69266d3893eab48b3e9027209f64bee536a80fad29bb9ef292b2022eac0c8ea449c86942eef6d9ac1647e3682974d54930898fe5563237434be63426b9118e2d6bf7a62a609a5af3bd967d327764f690f1d77034fd90cab09da4a14d852b7a85ad9efa2b245269ce962901c93981e8daa63d1c2336d4131a2611b50adf13827d137e686ace415c72d17dc05f7a3710a9261e19b58791bd0ce9acf9606dc8720ad1f8710c4aa9ba93439521bc83910eabb2f3a50e7b786c9fa0341df285e98a8c82cf274eb42f4ab1fc32c66673817ca9409ced36c80043fb5be020ccee598b6b616c4a3656ffdab296b9da5bc2d47bdf0ee0afd31f513bf0198154b4f36be5666dbfbf8133915307fca6950b4a2e6e0d019936cfc2ed95a31d5badb8e2b3c80fd153888b0c0ca5d6be339cb12246ea8ae7006bf3ac82b08a28ef7b813ebc90a7736aab8d215d621028555760aed8584da01cfb2e76334ea1b8a715fe5ca06357d6c54c8c2462e4c4c6ea8d891788a841fa3cb9b20c3e15f04d9aa984c5c263ed36c66db1fc71dfdf2598862b7937424c26a051134b6d832fdfb7a6fc18dd11e8d9c1d81bfc1939b56f8086d1395d09172efa98fd49590c1e82275e824fc815b65a30e03ec598f8e7c2d5ba9b7283a126f2916cbd0f0a2c081f35739c7f0932883f6e314076184b8cfa1f9e24fb1e5e199ca5a22200e4f96d20832f909741447704bc86487a14b154b712fdf6ab4a06f8dda88567218ded5aad592d49f745dbfcf268148d095b71d70ebd28e0acf28c06f661528b8b4ef5232f161e87b3c48ac46e26d6a8d844d538f1f9280570057a01718fbb3ea0e2083d3d820cf466ed9f8971e53a0e255e3c4a74567ad426201000dbe9d8a1c23b4908a10afcf7c4d5874e25359389ee7d97dd900b6d64a1fa55e285ca22dced768f5882550b8990d2e0aa7b76f0bfc1bd64109f7ccdd18c0f6acbe7850c6a9e8aa6a86be1a4a667b8148fc848f3712368029b8bf63d967c1848441e2f41d889a00d8e53dcaaf1a637acb1fdce23d8db8192a728590f36c2626e625e19dd55e49d44504d099a609c0802a40e9666ee859556ba1c12b32bcec4c668f119478c9bdb6ffce60ac72a297151e0eb02e30f520a015e922a228abce291b100643225a68951dcdeb3f874531e3d25ccf02870b0e075b8c46143d44ae60ffdddf18073e993a1929043be45316c1f4dd81c71172b86b1f7c71cdc7cc1fb50e12997c0760e42dfcd209e70c292cab9f6b1a3aa233c691f5727f5731b0bcc628216b032eda703291aff9bace59733d96701d1c2d46728997070e23ef051768b2bd50f26b11a2c197bdfe017c752c629c6374a7e4866ebc404838b4080fa4dce93d2f59790dbe0c685688cc732c46603f5d94ea2434c817d233f0ef71a30bbf474096520171ebb2ebb546f2866894284c5d4f6b3fa20c41cd693ce4ea01ded0828a92afdd903085349ab72e11686cfe5c9cfb359dbf46a2955a21f4430fffa041d80a3585221fad79be36baa7b29c43baa1ef2aad322e09b3f084e5da7cac9992c80ad0bf62419593104b340bfdb6c05514b5c3fc17a11d2f2865051525eb2e16f1956181f6a266bb84eea3a4f367c26641b544630f88db8252b609266381fbbb7c0126336604de172378f2c58814bcfc5b3b8ae1c2acb3067a3437d3f228c6ccb020c63876f7afcc0ee4541012f95d8f839670ca9b3b179fb4593a79ea927afe2be357c3cf180b8a81ebf8315a2721dc8e3cd44defb25c322e43aae0930ed9bc19f3e5f0455051e9e5335ceddcf4bb04507ae7102112aba12664303a80253a9f0daa8c481185ce57f947e13b07903a72c8d5b538c4eca365bab04b234061ac405a23f460f8ec34d020241bd572ba23a20d7af8694c0daf4822c9b4d014d3a9b58d992c01d862845ffbe4fe67eb23bb23ddb75b21827cc343d20374cad381b310437eb6ec17699b29886279c94c5f938d4d5ad30e87d4abe055eda1d0a058e107eebfdd7c9bb766cdb0be7c15be2bbd47cbbdce413d5f716f2c2e91a4c26274eecbd8a27e4866d62151c176c8a7a2598793729fe0931444a559bd2c26172573e6f7f1e826615514bcafde018ebc01b6fba0f6015ff9c185ec9f029a1da56fb63dedabaf34630b54b3b24d733932f4976ed236417963ec48c0e23c48a104b4109da175820fb480674b0a75b485152c3280782d8d1f772ac7ef265b1c1279f17965042e253b5448ad05af59df9424b6697ab7105b3653fcb381d4f2683ed7211302582313335afec2330e83b84c3c7cc975f4490ba54dc486b1812e8e574c2c1477299a0df8f7c3cb8a691b7aa077c97179a9da5a395a02ff260b6d53c4af2770e78145b34131d6a46fd8299e8f2ba4839a69159b1b9c6e2fb2c82391e30bc7c6440325fed07b0e6ee5645d10d93ac44a883bff08723239a422414a4a02d4828aaecd3426c891d528c3c820625108ef52f068aeb57009299b483e22cfb4786167b613e81d2a5455446edf54c528ee4bf868f744e694810eaea440bb37ddf9f6954ea340ded3779cf8ff47c4def1cd51c3f1c048c59dceb8b08b7df70c3f721d870bb1c5199b266f3cb368bc5e6391842d6f7d9cd93161da2fe742e0660118f389afb6e0782b3eb01e6e04b95e41d1915a358448f0317afd83505bf37e3ac882fd40c7fab748b4d03b3b95c4b87ec89bfe13eb90d782cfe441786132ca65ea7fe88712cd41201444ba68b88ec10bade906ecc1fd9dda0704f0332968765a90c4cdeac71dca2228b65d2db3e46721a6d92d75578caf697e9169f00b261b94665c5cd0186e83397aeadd89dda60316c13d74e744dfc9303e4b4f5caefc2251fc82da5051db837fc252ab121f072e686b5c93031111e7bf22c27a231cd7172977b2aebc30efc2220bdc5fd13cc68eefa03e8b28fbfac2530d8a62eae7591095ea2bcbafe1c8678c444032aa4d349fb4b12003625da18c342f7c006da2484b73ba4f1db522b453193fc626e33b8e1803aec8fd18089a4533044c33dce8db3cc19bed76bc71652abe2af3df9ca19f5f1b27eaea383480ffc6270f0c995fb0cebdaaab47760b879f9bc6d7e2f449fedee32300553ce955d0d543893830c4894de1e5a29fc8b6d7fa9d5df3a226f38fad0d1d02aff183f7605f4f9386c541266533817791ff14873a3e485fc18d40eb58c541e41101467c0e065e6c0dfd6d5937ab7360ff0ab544eef340117b611e48819b4189c3a074a16470140bdd5efa27b761c1959097d2fc87befb11194cb6496b250f741716c6f4797e15f6bf946160f8ed753db41253e418faeba2f2d62169d68792ece6855fff4947e3912a08ca75a26b592aaab574f7d9650ac1bff4c818d697f35d57bfcb715bbdb91dcbf56b354d89cacf495922521ff58a773dff73c0c3cb8245fee7a270b8289a9c77e924ba8f13d1937f681b27461c30830d0491234cb7521416d4b0604ad777fb1fb621f3c31ce98ed4715e85bdc20c3b19b348c7fa0624c41575c3b2934a9d0fec60c7efdcc2e9944ce3ebf4b1bb9ab13f890c46695d7a067ea7dcdbb33e06384c7fb4b6f4be59e59b2c7c022b45758d1d0e7c6c9a4b34c9ebc0e03627d5305c7a6deced12cee6a22b8a60dcd749c7922f070adaf0d1dad20c6a5a4dabc71d06c16b81ecbd30b1051fc967b405a08afc98a04ecaa48bed2adc4af57255945361417680d35706cb4571f23e3dd4149fe1122d36066e8ed56362eb844aa66d1ceba4adf0c1ac519cb5d4738a74a5056ecc10611f6ca22627a21e224fb85a76bb807f17039e78a0267c1459b9b5a2e54efb53b75e006cbabbfb7a8464cae95e2c32894dad46ce56076b1be61f3a0e895342be9877aa49d215ec5dc630c78e15c40e287232d2e9ab76128da213a14087618edf35d4d57d204ef38814f0978130d7bb6b0c9ee84bc9c26af89ccee5fde29b355dee2f2bd01bdf71f0f2b85da2beaaf05f4392e249fa32765d29842615d92113f36fc13182a75c098ecc16fd0f4c9db17f88a25fde238775625423602029cda0470b2f583bf53237af930f1db085f260849e6c68ffa58c2005e6f216c6525b1e7498a81dd11cbce55f488a20ac4ca15f8862235d2701ac91acaa74c934100102c5171b5d5eca032b87e33214d6295161ed989d06c89459876f73d4a1af80e02047218aa24d79569dca02cedab20b3e459920147ec8652aa7e755a38aeccf7f7e4bf8b5fc14201d214edb2adc4279f9c2922c5536a09530bc9defd39700b898264318709beca807cedf4e9327c7bce5f65bc54be99b0f1ba796dec4eacbed4b1dbb00062174ef8cead9fe5f59d9b6f4748eab6bf28db769276e84d044da9176ca739e110971582202360bbfc1587f5542c21552a08e5ec0406015590005fd947c883b42cb3fa164685fcb8e847d789ac0d1302ccc506e3584aa6ec46464a31a83810cff6f3bb97e84e6d9e028252f3e9baf0592fb57eb8586dd9ca36eea6bc1e3d883459f82f69a29f5866dabd02d54784bba55d0da07329d99f3dbbb1fca430c88e3e0abc4a4bd1b49c866f76e153076f0591811e8bdeb9a34e4551e50bc0758bd0c8a0b402200e819e446c808d7f1c2791c086bce8718d10e5d847389de158b505bf25d5962e8056f0b4a8ef1c8833e82f57beebe8b1db23d31c86d1316f6adee058c83a493f2ccfff1582fa82cf1b36b6bf09efee58a3ea721fe9bdb5d87bd798f3732772d3d7ec8fce13166cf77ac4a750b609564c4dca4c485599c0783d8a3b516d0b6c9a87462770354a57c1eba1c005071902bb5145d4fae3baa5beb31e84d9fdbbf49860421b2424d2be86ac686cec85564c94e83690ab229647251672643518893294ed43ac7e62a1cfdcdbd47e5ee22aaa84fd74d3663564ec45997422e6cd8d6e250dc2db540e332242e51158277c39fe60355830552b0c4689aff8139fd1e0295be7f25ffcdbf828df23e6f7ba95a395573f614f698c94e72929d8c0625907c1873223f2497b6eb8b9d622561dc0ddaa288e17cc17514824051474ce5885b1d70ab635c4c558150a6dd22c00522a118b3b0100358944f0dd13cab8f512f321e7991889061a54f1dcd66a7720d973b04764481e830c2a439fe417207fe161e1701d28ea7549b6154f0837b375d2f99e4819051c720bcfb49c47cffc72f584f45919382913d1d23657f5c90e9ebbadd776d61e95d6e2151a05c5cd07e29deb04875c20e3d7e457a2da2f601cb363acad37e4c08cbc807a6581057a566b9d99564a26ea22448c68b074fb61e3613a6b8a7307b261ff74a792a128215dff4c7d3a59eca441997a22ce5a999a8cda5b74b794a46950bbffe91b3a53e258bf2854b3162bcb8bfd15213a53c9588f2ca96e261542ca7e6a86e2ec5dbed430294ac34218139d3651c625fed9c88c071c0f84ca3bef5e918107e1fb38e0f62cf1b8df1875cc478a164b2bb093f89066648ac9853ba62635ea78f0a70f8e1b32d097a7de300c48cae74f98d03a20d203c944be19be75ce1c0cdac3f9c7b14da7e3cdfc0ae84acc070cf33eeae6e874467f61eaadfe233172390950941f00079bb19340730c050487319b4823920a4c0fe1d8cad146fa5d4ddcaff10d9897787b8b6de4abdd56956495ff0dff3277a8684b6ef5446e90881fad7120f4b6b67fa4a39a8885381598b340f83d56c61f63a9a2a617e4bf80c55d8043e8005474befbfdc9426a0bb50255a4c93cb5e6971eb25302329fff4fae31d08b5883930a0235fb22a7ad8f0bf49099e3df46e4a5253089bb8bec76e9593df0d425e2c546996a6c9b10791803b8af14e81d4163da174aa9e47ad7050dfb1f31f0d184cba79866e90ea4f7aea278d238de6998d4f4b77750986d591bf2d05f075e9ff0bfc54d86c384b6dab4b106e5c5d840d1ad4d5b7b2cb022f75d5af427fd10b0cf0e33c0e8b6761d3ebf233d83825125cdccdfb5129b55c3e0de446e7bf91c43f854d62a6cbd2b1cd00db507d05b48ac87d3ca1134684a5d9c6f34aaa57fa923e03817e9e214f831ae26c02e73bf4f8f4f89835ef4006640c1365384d454c8da84847025a31ccdf7510a6f1a508e31c0d3fb6e40d088296961a346fd31bb8bc28ee4334133c84922902f390f9dd341603a77209b6c9d82698ee82b53918899e1685e4b853053f1d695823040e4b8dd256d56cd54d011fe808bfd13cd7881129eee118bb70d1cf6974cb2d5eb933fc08b627dbd161a791a14c46b2144fe02c94ce97ffcf963c7be551f9268c353a2c4cf024219134f6cb1cbd5320bac9532f51d69c7dccb6f85e915f23c884e2df83f42c91fb44c446dcff1d12c2c580ca44421739fd2a7cfa7c1ffb00570a6699bf70451e147a8184e30c8b9a9290769632903be9f737a631095d4ad1640d3a7965b1a6329420987b73a2ab2680185e92716881122e4969a0ceb4fa74004f2c289afdf9df5586759b020bd936798f90637c09b4b14b6365c214e18659698916cc91fffe70824fe8ffec54604929b34f996d17a5dd5eb5d263e9b55624118458e52d4907ea38273c10dd1adf01510d80d34ebc2c59d4fe3083a4ce6938bc091ef19faa98f461c42fd231e36b69278c441ef23392f99426437e0ec8e5e8216fc614b1a0c0af39fe6fda6e1b78d09035de4d8d5a7ca70168328d685e4de443c1446b2a344faf07e98835397c103ad32041348e0b766f8bf64c6abd284a3e85d8b86821da02f89f0cbcb04e5b353467a68d2cd5084534a7f5ff8e6a8b403948eaed41e5b6c34af1993c2dc3d34a6edd1064205f20e53bd19ce7b8cf8509a12a3960724e902d015236c1490152bf261a057e411143ace4e9c81f88af5b2a7a168db4210e5ca8f4f169034bea9689270d64f9bc2481f0557391cb388b23cab2452866996c38a78992e7ca0bda53d0685bff027c20bb86830b63020a216924affb5f26e5bcde398bec83beddfd96dcda0f7c6c4ad182fdf172e8e9cee082a6505966e63b69387417f7b7395b67d2027a64c4d34d436324f0ba31cd725738069b72749aec1159944b4f638cbee9c1d0bdda55c4cda72fe8e871bdbc9a524f540a8faac12b5081918f571263bae5dbf6e266ab4087c7a906df08c11c1240c22513f94ec3d108d8e8aa9e82d9b224022aa126188be0f0a5b2779aae787d039a39e9c34b1aa80c3e06119c0788acc0db6980dcd7d5d36c9d863d61a0d95e4fd4cbf7a8feb350df229768b8e1fe4fde5213c3a62c9b403ba6e671b9cde11d25c928460315113512c7a0b8a7191826de50887e99f71798c8665113444ccd572db9a0b6cb49e93a40059ccd99e38af020eb0353f3c33e00c7845361f157e6c283389135198cc48ba41f2add273535a20bd3f106f9994027fb12597e2d1114e07d61fc201123603030a19afd7d2fd31724840b35b69e9a99570ac6cf8e26a78b5164dbf4fe6c7b8d9d8214601a9764b14ccf06e66bc2b057f2ea7d142616058f8135702c8c2d82922e103eb95bb69e313a4eb1fee120e1d59c6a99211c36105ec48cec667baf6f96327de7dee6e10e66cc410f9da385c44d1651c41aa6c368024620b4e6b8d04b5215b380f410e0f15c1b302f0bf641bafc70e9252a4b439d4149b51936ac4d1b3ea3264a50021beb5b15d6364239ac22f9d2ebbcbc6fb92f1ac8117673c543839a765da7c139e24f6749dda92236180262d9bfdd4f231c2b981348d69e692183a650cddec43e3ae3e52aaea402c31463bd8f22c76bbc7e26c08f0094c463ae12739b00b00d837586c6dcb3a69d130d7224d40ea7494c859f0bdd7c5b8f155ee25e19f4b76255184a6106aab6230569163f2f07a8058bd3d0858b1c2e425d2da51bca52b2ba52489ca2ea1b1ca7aa768fcef83739b96eb39e7e21f8cccf0310ac7564c79f2842f7cd199c14bf6ad8ce63896a3d92756634448565dbc3a356d239ad9ccf875731869f18a9f089485b6b2013f44d0eb255da8cd2bb19c37f814c14d6a45d68610051b35028ee0c1f018846a879abc20bd04d98db8f93e772c38ff21de27d27f198035143010fc13bdcd8040a9e8d9bf7732e6677d92389b616ccba33db484cdb05a1eeed4399b370c2e42ce0bdaa87a9519add0c14e5229b5bad5f5fa0a2219485dd56a3821807ef2dd17342a8dea46d61082fbec7be2a0486284d8bc767a35e274091a8dcd2714fefa5c90a29a2dea652a1959aa777cc37a87d5491d591565e6a8a0b00cba09c7bc2931679a925200f60160b08c96cc0f281cb7c068638a1da2bcf2ed0bf74d32a8da318e08a051d3b002c759c6423d00a1dfd01b8e400944a1aa607f88a0de29c9b09e1b571fac908e4cdaac43b97c5505d48b779a66e226512b49e25886824c06670d061abca0723002c126901490578375cc794b188e650cc01f80cdea88915a72c4ba51dfbe6f9bacb75aeb8f9940dea1ec8d31ec336f1a12baf8737cc7fbdb4f20b8024d777abfbf484fbf5c8ee0e85a0e10c9769ad57a2680f1171cb2a2b6250105348237cfe18e063ec121a2488d75ff6b7125f349da047213445730ac0e5f2a64b9ad42049cbf6b6a3a1e711aaf98b5abd4f439c544b259638170f718f590a52568035a2160cdcfc3735c84efdaefefc607bd6a9417d77a6d503acda6812abe00074b83c3fba2b1b10773c8274cbd656f8bb2a90d73ed1d5b36f6613dde40d57d8eff74d440569cf265fe4a48885127c5ecf2b159e6fd33ee9d7955aa4dfeeaae3f211b1d0e0b99ae47a057a96b79b48a09378a4cba990090646e7440508220f451aee8c9fcd7ff69dce1c8ca68b643b88174b78e8bae3b949533cb09b32a460671b82c1821051f2071f6c52c78b9e5dbacb5a1c1e69fc4b2a4a40b4d7d5923703d2d0999635cf1888971c7011950d8de35bd5332fee8c1fd7e1782cc13de81a5ad0a6d007b04251ea393990ce7d20840683ad695c9d660ad6da5450f40fda7c243428abf8b70d50e11c3c73091a11f2252b4c96887212edf8e525ddbca1ac5232f289d0479155317e752f0f36ab289b1820abb83f0464bf0da1f96f6bf43c9e799affa0530236208ccb9ef880df952cac04245b92067b7a18407175f8338556ce0181143f0844600534b8c6327d191a5f342e024b1cebcfe391c3d5648b9cc56267d3a6be55054246c52f39f5f19ecc1f793ab682fb0b71cc487c984faac27107b2d6e272b63ffed1033e538104d391897c3335c49b6b39850b87550f3fbf98a0553efad3134952755528503096e858623d572f02ae00816c762a3583e7920037e63de56465279378f1b3750aeec1b502c8c9a63d80b834b0a1b40c20b83fd015053247ba343f4ed5e4444835ffc4ec2fb365091e5754a59f28bf47302749ea7323b0541ef1a94b3460b06a6436749329fce6b7fa2d8e4cbaefb222ece613d1616a0e323e09c5a9a1fd01204d3b2760bcb1bc9a7cf360f9e007845f08a77d89c523d750861d68bfd8ea014a5044d311ab995a67d3177ea4ad4ba2b6273217d80599964c3673385b37600fd1c15925fdcfc5da89385f7e73f8609d6fa5a375689582e3a110e63b41d4318e766fa101201bd12ed61171b2052b387f7afba22a059b3a221fd046a880c2b5ddedc08656727482a1e83b0b805f08ba0e2cd301eadfc5d667470f529eb004e9f761eed8f57cfa1c4aa1505a67955dbc315a586f057880f0bf722e95188234831837c10ba021281eee02a3e42bd6dd07c6462907a3084c54fea855981b6dced2795401335707855e96b268440dc9b65984e5c7230212abb0cb2a4803ea5d9ad099cd6069a5812d30b1dd14872ec41962bb846c9d1c41056d7f87f2ae3cebeacd904e8482285cc373ef8f9d607d4fb529c5849bff5c1edcbf1b275523c287d41e335b46d5d3c58535e6e8385ed8d6bd0acf7121eb137d0e88acfcaaedf73dbc362890e7721031afd111ebe57d39eb35214c9c776bf1f70f18ca475911d53324d19e3b7e0b58ac43952d5f8b23e1b3481a276443dc8c08beec64280d3e084a309607f011760ee95d5309daae6a1f236843c0a3adaf8046989660754aa042857529ef4cf0e5fa23daeb4240ed653a6ad7047030c87d944f558ac7fa134c5f09c4023445b7f55508defbdd07c852c8037425200b11407cbf154ccff825c0ab36456c84474a15a6b2e7412f0e59182902a9516e505750b4bfa10ca22268b49c288bbe3a8f8bda048c100919208671a2d50adafb285b1bd82ead3d0178ec3517881430d3f221e05c2bbce3132cad4d45e2b1f248f5845427e76412f87cb353439c8fbb472efdef16f7885d13cf3270c9a73f086aa7c27128905d12071fc88c954c962cbbfb989e20b61a4820baaf561fb1a077bdccd310a2c1c2ee9e604c58a3bf01206eda415af15a72af337d74ecdab6c6c3c897eebc8c927ff8c0e5a9ecad15657caf34e1f4c57d5caf37964c4ec2b4c97f92bec2195c726f15b553384674767168e2eda724775362e45cc3450315bd43de3dd7ac36ea9436c50ed417c3fb4578120802c3118a27964f487d20ac8e0343304598027f80fdf70af60b453df32e9719ec568bc388519af7cdcc9bee6fd13f130b4317f4032e02050d9ca1980b7548d2b51de81038519c92f7715f3509e45cd24158f690c5f79ad46fbef52270e7c4c7cca95cb1d61a61e72796c007fcbcab0e1a46b2916127eb712e800a27a89bb2beeefa06be8119e9745769dc4c868960c59881f65342c34a322e89674e61d289d11dcc89fd8a2be3c85c46e70192e31a008607b022bacc0de477a47399ce178a7b0b71723c46c40cd38c6dd5a4b5b53935b4ccddba5085a5665f3bf2863f8166245cc188012746610cefbdec0582ff6f1038148082d783fd3b4ca46f0309f7454106bda6b3a4cbedcf5af6b079488bc44b7d72b2887ed4746bf92291d4bf84404d77b2c2882f9cb7ec07221146c56da02d15d32137dc2056c89e5bd7ed5aae2e72994adad1412c0e9e3f10170d94a55c93c60fd9fe20838bf40288139ce913d9199fb869d283dbbe03571dd26e744f5b0c02c4b9cd7175dec9381d7185d9435f59be15d804ba3b97051666b43fb99b822dc25f3d642e576b4e85f48999925104bf09a455c008d6c0a94e31dfb7dde46979e89a7530eb80b01a6513b31083f19465d7ac5aeb2ee9c6f6ebbe03d350bb9a5347f06287a46ba1c184251379d0925a5763c2dd7474f69b85e1fcff04a319eef4c4944a81486d21fdeaf381ea0583791ba84e6eda337dea8ab10020e46858c6d99292a5fc76f3a0916fd5d2d99c800b38b8259cac93c693b3a7b951bf4475dc40b58e48920f545329b2f35bd3e28df8eeb3fadb3150ef7e9e599f1b37406323ba16e8a288a985007c51f68b838e11c3d676c3d9f90a349811078b72b014116029a120a401b34040fef4614bcbc5f7b010c208084752631442f4e759ff62dccd422d46aedda7848101cdf1a456812ad3f961c876ea4d425f3592f635cd57838724f14e1cc9e84994e25df55e6912b123f0956cf0caee40c624081423d3e629f190f3426f3504c87146fb23fcfc232f54b1b45896946c4fda75e21df6eb11bac0dba4e1557023d9ec58eb84cc1ec9f5d23e07a825fc7523f5c81034c1ff2936167dddffee489ba3561041aadb2bc91be8b746dd43ece9b0c974450522d7322ac55887367d10f095ce2684ca65fbe0536a80c54191ee640429500116324f41086dd5c99d7accf26a7b182b7d65dd7becdb28a2984a07e4a5b22e08c6b870bb00bad2291d8901f78b461af29f48f5bf989a67ba6799fd4582ce22fcec09e9c762080321a94ecd725bea08af29f81c0498b19edea942c6b789c97c27f8d9dffa7dc39f4104bcab47f8597dfcd9d120a7f84b8c2308097bb6b046fca63836299435a180608120d87bb3594a9ba4312104a03b9fff969a3dbfe89bb5d42973527f7f8f45536a25218da015a3b859441c222fba0fc345c19cef61257f678eb4b7bf07ce02e5f52cbf68754d5a9b5a72073bafef4592930fc96815e4211d70059e1e81a44d4c505e03329661d30495362035051d2a7da089490bb3ae355fdf9d0aeada213a3e164c1d24467e25e7bfcd45bfbde18ee27f6485d8e4c98fd4c41c87fd1d21209a2b48cc80cdb3a79a5df5862fcd3205ddcd06e01b9cf8183809c4e11a046ef34ccdff9589e1ca763a53b3d29ef9cfc81302b847d4f9e6a1887fbffedef8620656942bf24c18cdca881513a50ab1a932ef01e06b9fdb2de6c46cb9562ef323e8a48dc57b225bd237169bf6494409d2866c8564257785fa774a7c5a94cf9df2d1490876acab30e4bf575e3d47f1466db20a408b5e7b7d0cce26d2835e30a1c7d7208180df0e27966bb24940e3997944ba1f8bb099a72ffc11ea4ca51a152a1158ef6a06e542d50a7cd3e7bb672e6c6826e3e3b83953eebba4e05b0f38684bba93f1d0e33aa082f01aaa9f6f431ede791251facbe899303b0bda827fd5547fad157d2e2a1b191e95aceedd30a1ddfa56b8884c3e2225f6c0676e3558d7cab28e1def0be690eeab44fae40e9096f315eb065c3918ad3bd8df787fe0a2e604898be2af136773889c08eb141c98de04a1aa02a7bf7915c125f93d4285d3b312457006ece0b6bcef870609aca65dbefc5b482d4e9ae609ff06e508afcab4e0b08e3aae0025d2c329dea2908d33fa502dbe742c7fe69a428520751ef515c6b99a0813322155050fa816f8526bdd25df4a7658df3cd0226c0c85447c3bc61551bc2dba63417a1d7ccc71999a836f1a737d225abe2eae88145f2c5d8e102cf4790b77a7ef1efec7e37ad4ad278bdebf78a9a9ca667a0e21c5cedc69c4b0c20b0a6d3a281ac36850bd90de7f82f8841d73e61283aa8546ffa55f11042542dc3b5704ee1350714db87961032a94741dfcfd230ac83c617fb69bc7e3f158b732ab7e19e13a5744a807c364f93bcda96e362bc2eb238c4fe46a4e87086bb71974fef642569b8ef3b0807746b68f450c49832f9bc1496f431194f2851963a0867c3bb64034810aa959b62b5852139362750e91f43f4f980c465034779000957cf1f37a470078910242c4c77a2d116137c6a84ab9b9d82b3414ca9576d663d9b3bbc26af362765202b204cdeb92ed1f99a5b92d1a24cdbc7bb1068a34663546143b1ff355f7744cf688d8e697cd022a8aa7122837a9070ec256ba9e294e6da13b7a6003b38e7f273fd81ccd82e1f647e35ef77751af69dc9cac5d37ee6cb4dccd186024e840ebf338d69001ef593f42a3059292e62f8ade445f026b73821a18b5e4daad8ef844548815128a02b1efa4ee879fade65e9e5cc5ed81382e64f303f95bbca8860f7377059e22cda60f9607fd110e999f946ef7499c3878eeb6d6a81d8bc7ddb1081965ad39624a7ee2ef980feaa374bb3c3dd07c16e8f744d4b22492ab53922de64b72717889dd1468aad10bf4cd34f881291ed5a7c9c62e9c539371d47b0131632e66582aebcfe9d5375acee529d37687555bba729cfca1b9a5c53210eba70402c4eb7ea09499df1d41905b2d9fe8f7047608e4e0a20c4c135c68971b48639d33d683f3c109ac3943744a426548982c043cd9dd101a74fd68e6dedac19c61e23074c59afc733632ffe42debc3a64fb5188d53953735c075c1ac7987a0bfc9f456631373d305fcb87ea7d82616317fe2a586e08928863aa0610a45a45053a3066b7fb962f371bdd1633dffb131c184640a86fe950683582678b98ae0e9b2917df67730c2bf6457f73c0c190930dbf57adb753dab39c9e8c4d2302a6d4284e893e7bd54bd39839492f6e71fccda01c8d3858c068f78fa4bd178a54546a45b190a971d1dac349cbc0e61856349a3530e38d24d39c5e2669a0df4df15bd43aa1e20c889ad4688e3d3c316e6f124fab9f39942dab3e9e0b883963348c2175393cb341d76a78cf903a6090181694af3203089e66544ce5315fa0394984dc4b874aa141b6f6c81fac29c8ca1c0ff02a717fa9c03f9461dba4739328650e6c768aaf171e2b34197b28d39068d00f66cfb0ee1306485a79ae1dbe318f7053e724ffea91d80de68736e078a39ecb151742b49fba6d2ea73fce375c84d7267c2a6c3b9de55eef45e65274c0c437b7710b568201912a7c7ddb18ddc1e9b3b915775ffcb1bec2c4d923e7816c35cc4f9427a38b7c42c7a5719dcb5dcc85021ed2f627221831524b860a6f54c00167dd2f70f54f7d17c3b3d6de8c2282aca90aaa280f6c04c12020c43a51a3682f037297454faf12805511b9af87fa8b4856ede7a82a017ad65ad413c58ec4a1f9c919df2151dc9c3b0cf17ec896a1bc9a16981a14ebbbfe73abfeced36a865d05557013a2f4dfa954877aa6e69ec0c4f4488aa88d2a8d5d55f1e214208d46310a23314e40524a1be1292707600f10b210bd471562a2686d7f7bcfddf67bb41a09a9e288eab3b7a2dc88008aed7aabbf53d9e3dd8bb05d4f672960ce6b147eb3a56385ddd5bcef6d72c63a9f3c09d1f85140d8c798449ac03534869fa4f4821f9cf79fe402ca5d4563b84b055614c5fb4cb01ecc01cffa09f5623d0684d002ed31af095d089dabd1bf27bd75646205876ddd39554c96e523b7540df8451e8e6247e8f9c969c34f865b93081a88bbbfb6b0dcebfa45e4aeb86aa494b490f81250209d44db6082e1ac24e87aaa826ea8848c9ebf7708812cd529f5978a7e8e29f3125956cbeb0f5cbf748781f181b640e45cf9f8658b716732f34c479c9886f74f8c6f8115a425a495315ed9564243328385adf372b197046cc230ea75cc150aa76ada7e66ab84eba5dc34cba62f8347a270afd7b69611b7a7d45606a440754a9795a0493e9cdae440bee66c6ff0ff669e08db9d2de7094a6c2d7108a340dde73a1817184319621fc22dec5e2dd88e25fa90542f807fefa41a7ccb21178e2df20913ee906e07366b404b9d9c6aac2345a967fa17856c46b7c2eec185aa1e15f0b5acd1dd35ba24c972ab27134263f81cabba10b812463a8d91019c2572a5aee3a0144875dd3e207df22a1a30df17b5dc526f537ca629ff3023b3e4ba0988b45859c346b3ec8b2aa030d9008ee47944b40c215869c177c0697a3641492a12039f5d71899231dc214b88c1e06bbb75f3233688bceb603dc7322fc25773c24a18b572cca38832a9f62313ad1e62001f936972d6aaf1fdc5a5066a380bd4df709cc39b76409bc84a292dc58435d6ff82502aab74db919d13b641984bee3d373145ab618c51a9e12a14d3ce800a0d74d4ea660762f9d3d9a3867a1080f9659e6f927607184da035dea6d4f634542d64b603b9a8833fde55978b1054ef40205f72406db1d7bd784085dbae1fd5e15a8afa1aec677216a58a08d8c351005dee6ce9ed1d407066e607a82b5800fd5c2f06ce781056b6ca9a0f356c0e92d5fa079cc9295c348788a521a1dc1645c5e4e446a0602c0c7a1c9fdceca045f998008acb9910786be242eb164d2f7432bc2ba6ecbcac9596286941e81dfd42685ab08d59040539599227800e73ab9e1ea824268758bd485a1d1202d92e6ffb06333e3631081caabca75abae27db091a330c989b1748eef17791f57e2ace0728390177f5f12524ea68d88be34066366cf48c7d13a0261693cc2369d18700c9a687459092c0d001ed1b89a75e62a179c0efb64458a482eafaa3471efac69886e18ab8cf2a8bd6c9c565108da1a1f866a63089086204c74a7f2bfa57b38b26b08c44d544275ab7a3a51ab6a986bafb021191a7208ac9d01a7710869b38f32d775a571118794135bc02ea094ff7ec360addf6f88d498a4a47002da344ed6e6447dc949b1a65cac5c6af646c82cb866fed1cc9a1fca24bbedf85358ef03842cac79716ded33d93b51ebd1651d414c443ae56295177464fb1ead5dc19a8bca2f433b93ea5692dd3b02399cac38ab81dbb158e3a322d646d11717182a7ae8a3419c3e1a1f5191cf502f342c767fc3e43b7e15b5d52fdaa0a3601cf2678451d210ad2d2ea7da534775c8be184a904af2cda1062cfc653387b09ffa935fd7d4431e0ec62e1e01e33496499e9d17c8809a4fd371cee394698f43e694ee42b0d1c691f06e8f4e169af784df511348b6126259001c4891de326e916b3a928bc86394bb93418715f560424a2179386a381f33b598d215d90945a232c8938f77ff11bca562952a7397cd507fb12d559805aa5087a4b4c9bec22944e2f815a0dd8bec7601dcd066c8426f3db1815410d4dc05628fbb513edaeab8fedf0239f403a624070638127074881119efa808b683a5cfe08f9bfaf3aea351c9fcb79752a129e635fde8128100f5964a0bf74e53e4e007b3d6e4ef9defe037fce709576dbaa296e1d74760f9a7bc2196ee0158533283fd011f0a7598bd5cf41735960130fec077aeee85d96b55c2e8fd30b881223760051e000e0b09776d15e2c02eb52b616e336a4b936ee62cc9f9b242c709052f54a77fdc4cc8f90d2ceeb0d9d47de049444380a54e8bb5ed9a1b61f8d91596a645328ba021570973feb2ceeef83b942b3f220c89d3700af51746820404a82d60d555d5052dd74f92732be5491b2daad36d4a03102d3554804e51434ac00913545ddebb1f317631e89d3ce8b72f34b5849cb9b12a9445fa26db565fe7ae6af9e5a0ca5f42af7fd8b82810e693fea517dbf44e0884aa6ef772d6f2495393f1bdf36f99947920c29769a2bc33a433a2dd0978b6c9cb1afae230035cd4dbc1f1cc6127a87bf22888851ac8644e764539c6f77ad87fc7cc2e0b232667911e83b1e056ab61b13e87111bbbae8ee480ae82c8fc9ca821498ad09e6201868c9c76be37a1840d02e28b390a95b3697e8e7e4a67047204a1974da5854f0880c095b02b2552f9b22c07504abe0b202de45e37c998704dab0bb9eabbc2831c37aa9a7571fd199418e0e121c790b52873bfe592071a8e4d54a0f526ef4aea769bd4adc2e40dc700d9c5aafe0e0d75540a764edd1f048517457c392ec55fabe47b393b82b45b221c32d087bfbbf427384224fbe63928cefe219acbb01b2d2ff4ac96ca094d93973c82c4706094c36ba9c8b259245371440530c24b7654a97fb99fe57d9ef185b039648910a44b9729821f80440969b5e489c73cb2d07e733a15c66feab757d95faafb27980612560c1b3440605514b28b223c82e65b4f7a2b24b4f899797157e554bcb6a422f68fdb44780723c0584ddb58041243b341b06e9ac5e3a1503ceaea7b3bed2bf4c14d928445050b9e142e99c563d5167cfa1732e2af52882fd76c0c0fe59709b74aaf41167e4f433f30ef01c42add16cf9954871cd134d71056047a14cbbfb63d46fd72013810fc52433838cd5d695ac4b4a619f8067de5897920dbc7c9b5ee007e05381897d62d690b75f9f107781d7b7510466fd7400e4ee2659bd27855db44f1ad806906b69025239626a8433803b55aeb2ea243d6f561b0a36448be27220547bc3eac188aab127c535cd60150a28fd90b625aadb4779c036ef0b6f14e5d55328de92ed56e40bf1f79d430ccf10a6d2d8a8a7467c4b1503d8be4ea468d46995646ea83e6830621321a550ba977a3de3ae0915ce23d163542911215a46847574d6414d85ac7b249414db4b4ad072eef7b59bedfa5520af7b103abb9d72477317639e98951e81185ffcf7c36c2d4843f5a1fb616ff49e054e749d1e07673cc00f4d9240e4b5206581e300544dea1ec23f2ba5fbb84d2de836b988d28419841ece3b92a705b200a0067cdff77ac464752d094296236eff529571257f320f00dd0d824fccf237a2eb72c50e4666863ffd04b6d92b92fbf857c7fd50ac4e4164e6d7cd96c3ab7d662f7eabd38a6d09461b1d7c48478d016bacba04ff83e7f13bbc4c4b474c12f0dc1809e1709172cf6e188621148649bf08db7bd016c2c63d9d91837ca970dc6189b41cd93188607178a30bd0de73ee9d67e7c5578d82cf632679a0a6517286f02741f30c7d9ad6db7edf3ace7a331b115e7042ad8a6a716ad127006a74f4cdcd4187358c64176adfa8d4f597208aec624b9f213e83708c2116e6ceaf07fc4be264001a2dc53e3ba886e71d0550dbd8fe5d5f03db43ddde8790cf7f909783b633b9c110e8acc0bc6c2f6912e81bb28a78916ad77391b4fc03464186773d7430852dc415b3632143927d913a0f47117fff7632c34151a277d57d61476c689d36ccb41eb3dffcc80b5a292c60c6b906050ebbffad7f148a5da05d526f6d0242c6aa8b83bc7602036ffa3042bca725e22fa9eab0095b8097cc6e83668ba6abe9337983f4191bdcf36823c8ec6d2c119ee7f9c2706b846374d738bf30648341340dae6eea954b272f6ed6149a372425def600ad6694f87db8665445954c3a2a5e5430f84e200ac83ccd9f3dbd42d650500808a7045897d309ee69321c896d80669da022455ded100de297b446aa4ff2c3f8e6bd6e1a3b375130905b6ac6332676a6079245b29826480db25a0fd933ca3d4f153b4f9fe4edbdd6534618c5b4ba15877d3e9ed323d5c0eec9ec870612b39f79d4b67e3266003bdcf9e18425a73969f84d015ed80f26cf5ca4589bcbbd68e00ef49151226ccea23e0ca937e5111e99141170041394711e9e1d3a03786aa54d70ed6e8c7f203aa700c2cbdb7b4423f17c002c74f76a524116a241f74ef10d7b2174617b483d29abe792c647e5f6d795a0364a98bbdcb238713b3219fb3a4423c575d1c14138cab9ca855e5dc408fcff45cc1c79a9f231fcaf98bea4288d9799124b3ad16f27136c002fb7506eb89318f3fd5c14ef7ffcb4298092ca5c80d0c2f22fdbbb7f54f21dc2790a08ba0807855786567982bc8ea139f1880ee91405b6d10d0f2c0dbde0384e6fef2940fa99848287ce81165fe38511b0ad401657f82a1fe6dea6303f957b6af3e9e1eeee6c9e42ab28bba00fd4e90354e006a2e99e5f818a2e3e8c460e34e74fbd07d67dd15c8019176bba27edc73499997009941981936903f635180972b5497a958e99c520ca80345e3f781cb5013b6f60da183c0249d035684e1f4ee057db670b8ffc5bc1f0cbcc0949576ac164751c12ed201b4464c2b2f396d64c70e931af3db8db47598428b5e6c80a2b43ebeba34dd10416a34bb4f3bb4d59f55c48791fa8f70efb6e31ced767dd1b1eb1ab1be8fcd018bc02864d353534d4a98ec183bf8765720b249f42a9ef1170183de050d6fb7bb18dd55bceb3eafa5e8b090b4d4b81bf0f2b4ae602863ff31be070b0eff11d2d188422310672e20836ab962176afaa86ed7066ef0ac315919c1d736abe03514f9650cc11babf803893f9c53d702c98cd41cd4564369207627f64786a8dcbfb59b6926da1bc2d3d98aa8d89a59c0090a874e965ba49dd09fba926f2bc54001d0311a33626204280565c8c04b3e02ce8632e9f82698a0c5da1fd4cf6b5a372d36015e414695f99a4dbbb6392696eb9c3249f9863427929967b06ef1656c5a88f056dce745712f4093438bd43bda707f10df85de869da02de9209dd66e9282d6a3bc241ba2ea5c124bdb04affe6b1e090b06b64f1747012025fef9bb30375e485680981bc5a3734f59e2c95921920030b90f702bd47360758c8a7f796e4f4a46d44c1b307e0e12953942cdcd2f8444a9c6ca6bcc43abf33fb9ede661be32e7ae4424d7880f93b645a89bcd39d890a03e45164cae9c14a13a84edac39389dfc3d0a0f19871a5f9c53cc5e080cfc7d5f6d8c29e6e7bc0b91723c68ab3fcc87499ce3794c51b2bfae1a4943fda541b32cc96c6da30a8c0cd43406d0922789c0eb3bf9df5039705e2879276eb900d072975f537d76369cf8ab50fae2199605c14d483aee9583aed3bc942d933bfef01d8459351e32772bc176762609cf481de5d31f4cab91f18f4dec72825b2a0f323ae2c646257b7755682d1f7518b4a657bf947ee64ac807a562f0c82dad3194d4f7fded8fdd5748fdd9aed6a83f62d6d8c1b4caf212c6b28543b1c6308b6bdcdc2918083c3d5a7b866bb21a2556915a29c433be51d1ff4e1fcf26cbf4c78192bb97c7a7809555d82cb8ad05bd1125754d72b821817c4231c70012defa3d5b5b39a7101dc3007e183b4b3f6d5f33508ad7357a5d45b0bb5dbdaa7b501aad3ac852863d0455781130d2f52cc94376ed5455dea5dd18c023a7fd14ac4a41c5c4fcf33c590160ef077097da1cd2d35f4b50fdc328ef8e27760bf4d6e882a4f7d0304875709fda574589935ec32e6008c9fb649b029e188d14ba1422af08a6b539fd16bfa070afbd91e446053075259e0af36c56f2297378e8264272fc578e66a14f25f3e6c756353a5ce455c3ed91ca8a3d90075964cf7ec897cbcb48a2a6f351aa626ae1217efa0c1a26002661a250590a5d085671b0b21575b5ee3b576860384bfb7eaf69c213767f8a05c4d9a73c89ecf2f5562ba442b50b3652288ebea4bbc4c1ef3925fb0b8b6fdf22fdf262a97d2ca3c29672f8bfc3073fde809d9454a39dc4a4a4c7a8382d273121d07676c3434fe7cfd1f24cdfcc3800c6d329b63a6015fd8d1e619896c6015dc33294823975880ccb89f0c7e2ca148dc218de82e248cafd8910c04aa58a2fb2b1edd2cda4f2c429516ccbe761e87b7bf98565942dd0683b81334ed25c35cf87ac4ab4773062a5e4c3f8c56b971f64c8f08edd44cb41e2ae4bc8f6c654ce09c220ce67fd97b7ac2993c35f4ba49634bf915af7e10723285e467bd41aa1253636b4fa83ead835350650bce5597629f1b49a43fa5343984b6d35b203c92b797b6117ace8f67395b096e6bdccba264da61b45d0ee207501fe31d1576f7010495accfb3b7f169f468b2759b0a864bfae6dcacc2e7a4be2b403ae80310d8ece79b7d0d22e08f1d1e9edc9de025e8fce2ba1401cebab628223859752fdfd68580a9527ef6e71ad6b50a5c4b45efab604d562195d3109b0adc4efe2df261f10b16107aa6a75b96ced59fd811f01c70462d265b4c00f362c8127e6a2a9622ea67307f06f8a6b484dd2d64bfce4e74afa631228825f62d739fb14cc850d13b0b7cb72984cd2fde2939d1003473fe3c1dd756620ba933af7dbaa4565ad93ac9b6f634ba91f4e2af4942aea9dc43fe754f16b33ae100024c7bd27436031114467f1ec62adb157cb0156780465a1ef7ad3680ba7669d65ac7a14e37666b4e88d4ba2aa86e6afe36cbfda82221b9ecc5b5a50c0a97da91aba8c3b79d8535359d88cc94f80e45b81b6e82a0dfaff14e85a12ea089ac78936b5b49843895ebb0a6097faa23fdc358120b60430c8e0225e95f80040d6e06385e3128e261aaed402c7d24fcf18690fad313481e977dc59a1b068914fd8d8f804fcb5703a8882c008582cbe40a81b274add7afe479ea23362ee4876566ec18b747fc42e5b9b9353c8c88298a52e8fbe1faad6ac15e9e89d8e7c726d0816cef278ff203b63337978183eab75bb92166daeb4638944f2193a9f4993c8aeb241dd728c6b3393ae2a8086515c412662c44e5bb5860f40a01a84493acbeb660fa102556000d0c80ee78747b93195785d0b4beb0f2005eee252e272a08867b24ad68ea84095eebd41b809eb43aa44e2e21839a024667cb2688091b9224c7295d655f39a6140f02fca8aa8b983a292c1e5417e97a19a9b817895d1fa902ba1cbb0b9b3d707291ba8b919c45911678915be491f4b723bd2e22915a6665d08a5548243b65226a77be4723c0729794a81af3b111246aa24521c889827d6bea84e6698145b1474202ec83fb3b60c52892fd72938a414ea1d8d761e5c820883644caf12510b9a9ed33cd105f9f85627d6d755c812083501810ba525fe12bb7f0ebe61e477c9ac0c91435a9a71759d4c88e763ca6fedd571ec48854a58e48190e65ffd7a20a608d589761c901aa8d5a77e1b202cabe5aea68bdf4d23c85a347b7756fbcf80fe85eb63d3e6ec8326a17658b85a3107a11d4a9b88721f8419d2d583ec2b9fc60a1b9a16e8c90dc2783b05b9d22808981e63b47249329282524b88fb4955bd715a32a7cc13d8fe7efea5ef4c945a008c1344a240167455d408159367c7068094a5905ad718c2b24f8ebb2febf7d64fd76a350bbdb79a91da74914a9fe88b22ef8cef59d2ca29ed2201b8e72854e1cd69b46e697892b1fb9d670cc711c319fb229210b0b59c021b97c5b630bb03cb9ba55393003c386bdd43edf038e7f6633a7e61076851fe12e7ef1b43aa19a71895af802a5a81425db0d4a9044739fc77358b918b44b714352367bae89cd95b00446cc47a08082ab3865760c02bef634dc800bb18252602b7da6514d4508539a5efb32699db77cb4f2303e3f694b91ed3fbbbe5589773be5f3b16954a8a6668af4c144c174b38371d9ea3882958f764108623f49cc0575f853b0b131c783ce7f226f11b0bc15811d724d8246c24871a1c4fb611cbaa15494539a093e21638e5762569cfda20943eb9bd746e8c20db4c3c1156232aba46381409a10f3e9ed5e4c08ea53ca9fc4ec4e5d2080443304cad248aa763ab539923adfc18c337e7bcad34342e13b0bb195d98b4cac036392acc0d43ba2e86d446e5192adaa9596af8d5043e4d20f8c7f3a53e995741b4b20517110583d1f183ef559b9ada62155a6f335945010bc30f5b764904849077cfa7e415fa0c0a0ab8f6e1654f8cebf53c85f4884e631545c266baf971cccb0acd80a333fcc6084405ca13932602815c18c96d6e7179ca455a038a3e2e60f1a4c34720ec3b52adce505a289c7077c7325a4fa59a0a295a34634a84891951856f7ba3d374d69a15ab2672fcd30f5181975a571643f3619e5e70086d973d9d13066845ccb3276a5cb5515e606e9c4012a8185abd80b4a7bb05247fc451abf3f3b4ea151f925c74ed9d68237a6424922539dfa5a2086eb2839de04c02b250bbaea115baa85f242d9d297dbf2003c48e59402f3afdb8d166e892eedb9836bdc878267eb1d5e78a24e410d646ebda940c094497371e701efc51008312b4ab5e9ef125491057dd6f32f9f422fb8b709292653cf2fc46ee9fe1fce2969adc891a0689f95f4604def2bc4ff7e8542bc89e0bd7310661b40a1828b2560298d795c88dfc095c34349a4f4680bb3a61332fb7fb57ead6842907a70a5a86d9e15a6b0d408952f25e99b4a56015e4413498820333ee840e5e0b34086c418691878e01737532d626c9289264c69342c1cdf2e4f73268098432a949fa47654288f3cfa23a611fe6ec8075aa7a5e831daf3b006ba55a25aa826cc06c0e13ed97bc4b47a6532d10d4be8ebe40b203799820258c7341e1e9fd3377d3ba096c4be22b30557fde7eaa94368a676a38b1db81343f838a6dec707e843a1d87e968da99991175b44ca6011190246fb2ae6a10b3688f40b8ce05d07c091ff48bdc9018b04daef17718457cc4f8b17bbaf4caa411db6f76a0e50ecade629217f6d81da7bf08bb53e2e38e8fc3c4669b49418bda2055b3da1afce22ccb90cca1bf3a7452105551e861d2002cc924f5876e4c4f1a8ab3387744efa2c92b4d0c206d808cecea61be276039ae69a38ad58ff678833df847531b7a01f37c4e235dc031625f95a1ef9a8670ec92d10ebb779129d8d29e1caf6e97bb87e0c3f06813afe1841886f0f934889894485809d4bb79ac3f67e70fa40116006e0199f840bfd559d4808f93aea64eeccc48288e88b4759cff953fa600d45180a7303e820633062628211c909ea5a222da76bd387c0a0d74cc52073314c33cf38e6bf3e9a10685aaa9b554f2aac8d4f227f51649a4cf09e36b1c239928502aa5a673ccc6d3199277e2082f767873bb8b7122f4d1fb17b03fe431feb1e9eebe07039542cd0b241a4d166d11fe017b4e5aba82b3c2cbec80b69cade55a83651982e17cae1bc0fa651d0d5c0d830ec4b162e2f2e3de041abae4deebbe697723ab7b49958ce3a7957fc2b872538d5c4f1d1b93425b884be99486663831ee27ef8b4f84bed398b4dc13bbb97d0eb03d0e31ea436a2f498601dc2debfb96b9fe5e63df6f2a5f7d76f211664a4106f5dbe10be6d0dddefd91f1f7a69c12195e08e914c6d8515a048098aa91f3bc204a19b28167a0aa331ae20aa83c107e5ab2931e6d5f39bebafcd023b9cdfcffe875bca13ce94a072af8428ad9b2779f97f040c1079ba3140bd21d0b0204438e8ffb136519378d92d81c79f4704004268c51b31eac2bd820667fc29cbc2168d0109044573c65af84fd23fa41f41d3c1fc5aac0b7ad1e186cc577ed14b96ca3a4abe34bbc732748ad05b2e8e2267816cbc3db026496aadfeca7456be804599778987a797a4e5245adc17b0c5a6378485c5677b7be624b579b64a9dbb168a066b2cc61d8518dd6311683f725f85afc5b5b3677f456c248bc2109f264553ed92532cd2c634909a7a02adf74ec3f71b9d74d9e2db3aecbce083ab3b885fbf4765b5982251c0cb2b1a7aeb491042a0b00a06f88c46a28cf75ff2b86eaa465018f338c45896b54be6c47382215f41092352026f3c3d5e564a08f5052e1a59fcdbc10b15b08e37e6ba7e5ef1e98c030099e6290bfde1036bfa6ff44756f7e3e57dfd0f579503cc86c8ab07519d064f95c55bd05101d85de7d6ff51a1474ebcf816345b46d997188f1008682ea1d64acf6a96cf2c822234e6a5236e75f00195df5474bc2195e0ff9968055d4505067e2d37008b4d47b28c3a42b2ead06f730a28844b8eaa6e736d03a4918400fc203202da1c37caa8de4c1f42c5d95a5c0a88d102398321dcb93a3eb3dcab24746f81c241c7fe12ffe32cf1df747d86ccdc8714d156bb9cf5dc117a472281ca0e8a7fec60674122ba196bdb73c3cf340f1d3a0863c9ba91bdf82166b1c001e9d52fedde2afde5bcb8d560704e4610e629a361936c4726ae35b73d380e1c0b87096c74a7f7468091e92a7028e872de2b5936167aff2644a5643a118ec797eccdfec6c25fcccb8fd6c963a3ea419bf5dd42a64417da58381a09602db934ae446e95deeb781178e98b22382b69ba0bdaa3810a1d7526fe90f8d478dced5fd49b5dfc87aeb4f7e286804fc5372dd53e26a22908de314e1225eb7e6b4d7b98449e60f71600cabe76c167be0aa4953b9d064384303aa9cd97cb724c6facc35c56d8214cb338681549a55e9cb752b75986d2c368788bd3a0c84622955be07d57bea241aaceb8ae58a3e74131ad83bd74f3f4b0613dec5c98fd382fad66f0a5e1937866a5b9f2c80f6bbca0ef1f459be266bd653bfb4bac24d1437fee0a66578df3eaa60224a6a61fd33dc921e3ab22b60ab69ad09b1f4637d24f792af041bfc4c6e1abb15aec1bf24029b69e44a4709f602c7611f158d8f09265c8de55805383abd447de38c7e25c502022fd35ad46fc90c9c9d5d3de663ff124dc623db2d17bd55803b3f3c7739604dd9b9851b5880dd6d41f6427494b01223fa349bbbcc18df312a5700a65648d623a365f2b6ee89729499cdf9543fd3a7ff9451606cd4792da11258bb9888b0d249313e27c298f781dc33948475da380de9a8170d20d138e38222b9338c616fa271779942b9c1fbff7617aa30f5138a7db9d1e6db70bf9ddc8479b82d8c13905d0fbc899784d0b03e7117ca0c1469d375bf3353e945ef48881b16be6f4d0cfc0f92552745d617feb2515e4bd52c3f6207a97532180869d23579e0df2c4ceba74d359de318d388d460954bfa22248da54e0f21bd617e510635b0571cc2220f3faece3173da1c67ba4499ebf0a1515444f9b0ed09d07429982fada4b142cb4477e7b5e21de50d84ef5a63d84c88121d4c73269c1cf543317a12eb0b32eec47ab7e416874c86004e4e0962854c4a25b10e5bdc070a953407b593db15d134dfc8fa9146841073b88f6a0257477beaff239d2662f216b9b80b7f3d422aaf65b53106902337ba1163777d222660f2614949c05a71ccddb083493ec06f7d4544633641c53e2bc4dd5ae28fae19179c880e8e602b3d01d653280b0dcc56c53473c1fba41edd2bc1db8b6325f3f61bd2170759bca36399aececf863787c5be60d099b80974513c3cddb13531a8198db5d8f98881e0684efe899c466e7bc383da3a31fbccced8e7cd8c8a78d6a193a64f5bb309f7e4361b5d424df247ff525e2b84d7d6706997f5a4f45361c655499d822a29fb8edeafab148d3a9c85cf7b41ca9ce7a09b7249509b0b279c5d4d49f9255262df3980a1e97e4e3a62c9c9fc16d9a02d8d59a1fd768a9486dca567232cdab3985eab092591d02f1b5525dcce8dead9e9e583a2f817114bac1d745b86d5370d91a54bbb3f03fc2becadadaf6c6b5a1ef5b4f0123e7eb8231c4f478716b6dfb2e4bffb01d1e383ce46b61517c3382e31b377644c5fc4fdbab55763ac74fe5d0e64f6a21a46d65956b11b436f3df7de7604ae10b77a0f4ae5104715e1852a8ecb31b852127422110d554ca9cac7663f76748542adbe863ca318717938b4a28d2017f1b99631a203120f6b04679d30841367802be6e9dea1031d66009b78921f3b626cd1ea2acf82f49a64c7435a1d17db227349e55a302a1c1849af6c92166d7413773abe8f06d1c20cd6a4a00038078d9389eaec3ad22c444b96ebd0e4502206f9c17515e8765a111f359064d80b7578c5e3d761da8577d40143195e4851cab66e155a00ae948c1c30a648fb1dd5da4bc0e1e36973089add1e0cbb402b460f552ba0721a5b07b1d768ee1550fe9b63af48478701d4e550cf781bebddad7852d4bf9d81f401f85adbe0e48b897a739504e990fa44c1f536b9c66477aae8331a79267fcaa9b7b64615fb1d558a30858a60093005c7f1d1035d9d55e87e6420097707af6bc803f53165a67e8eb80d2246fbb0ed42a2498e2c81ed24af668f65601c41a04ca42eba4562056324a1b65dafe48fd65ccdd737b479fb92f657152e56acb36d862693a34d99e68fe6968cf34faae8dd981a83075c40f2088f5f79ae852696d26430e4b7b9962240e0d5138560f76c392f64b6c919b88d0cadeb453380a2d0a340a3c513e29a791ea298df93d13203c6707d71e11cf3bd8326b94eb3fe441a1db5e6c8f9c10ef89a92e8d18c3e2f64b1a5c7f1e7a8714648620665cf15e1715aceb76b964c494b41f9a19a42a90a62083c5b796274a6c3ab9f6a2f5f0219656978959225356017ac922915f7d9c975547db042275eae8a3108f36273490d1c97416ca7b313471807b77774dcef9b33c0eabbd41bae710ba46c57f4820ca37bbecd9e6a44915279d5b2432464803a85ce53d7de4b22055b5ef2fc4858a966579787c7080fc9805115ffe031a15b32aee1a308203a064a65df0428de000a8f8f14523328e65b26337dd7ca3ed013790c7a98f3c9b21c38470b71866f01c77e33178cecd10ba57587a1a73103e3c1daed1df23a916c98b59a058bbbbd7f0feb56bf8dcbdc05d2c6244b8f2312397fc88ab4c22812f6511173a6b4761748b243636b9e64c354ce91f5fd63f01c5a8983f1f93af37f9b5c21814f4b93fbdb0069f4c11c5e5340be2fa460d712a79aaf0eb79da0c223d04222e64ebeda8b60cda1b0086e55e4f443611e2425d2e36e006986d49b225e908497cf917de92e4f9d1f2486cbbd6944fa656f12c46c5eddc28bf504af9d2f248d3a954e993ffe4bb25e242960fad91cb16c1c9b3fa082b9f4950ac0a2ce842ccbd8c20c08a70e52709ba150ddbb40daf7aabefef3aa345e3030df0ab5740fbd0811eb9ca944cf9f477b8f27c5ad92355a65fd9227d460f96c8b2803ea3074b6491e70f71cc3dad2a24579ed9954d24d6cfc73c67ca76f746db03e6fd5949ec72d744e8032a038d7f0b2a9769430b38f1b24495c9607e251f8e3274e92a3c83f9d53bab002703d8fa0a367c32939765b63914197e8567e0848c2c5428e20942521250bd5b0538a94002aa771f64992991ef83cc3ad023c38fe2357127ee8f09db90521e1ae9cfafaec5af688cd09f4f312bae128a055d25f337f8d546b3cd3ddc44880bf58ed8062c817adf16871c59cee8c11259cee84114d4c3aab8140bbaf4df13a93fc42956426b256db625c9952ac15bf5b3cab0ab04757f72b71ea9742f3e796422c9efa9ac0e63525cf746ae9835665a02761d749fd5bbde895f651b84102e7141d951919dcbba7f6cf02be61c74cd48cc2ef688e8742e7f8b116bf92a5c2d1298b96ce2cef4f9cff92eab6f1e36c5f5efdfa6738f4107fb8db607e418bfb6dba4cc660ba99ec97c97f53024ff20b37bb9e400d93de845ccc3ae5cf7b3cdc83dbc6d18df3da7ff599ee7f0741a23fdf13ba3b14657f97bd022890f7fcedfac1fe298e71cb1b6247966f2e14fab72216f958c0b6ea7c490521571610844da0c6805857fab8b0de57b08fdbd8f5f5deff0e6e65fb8fb0662f0e55358a17f755deb7602ee40269cfb0cb24eb99d420217e96ef01e94cce6b3714ce4ad870c71be017c18b4d620860626256e7f5741d9ab9f55fb4054857578365e6534499e54ff645e48b8e6cebde89c73ceb9175d097fd2736117e4849ecd50d08bc1e83df89ed747e1152d39f17befbd5959f28a14d6677d54db75c7bc1fe56745f1ef2769703b15051279eb313150c9a804329468b7c4bddee2a8bb15509c2a384ca811ee028a458d2d43480861892331b9ffbd7eefdf01d796b8ec9c3be7dc3d35c59397ba4206bca204a8c4144e084da144ee29a698020a48d35f7395693aeb54155872a7aa18ca2e04ad204a0ef37ed381ffc407a2a40f44c56f9c24fec3375c2833a0a2fced4887c95b87e98823f0ac4c2338e7ef5d01ba22f4e80d6213a92b2b485d29c11522e69c9665a5a4e0f2e52a2981c610a14a9131d79c143718d5dc29296010939222053725059428be642cf712f47dd76cb731d73a83b392113eaf0e5d958c35762d335164a9d2b892b7d9256f3347f144de6aee28d04845a1c58dc892fb8972674c3c77df603064b66f80a8e822bb28b7535450c9541c810aa139735f6105a02bae6085d40eb85cb9532d00da411b32b9532d98f2725f71852f292024524070a2db3de1a8603701fdd3cedd3927e5861877734c401c54264809e1494a084a74494dd146ea8a1aa929b8484db1650ee5f974c690e70d3fbebcf77ea48cf1fdc417e5e7296169ae4d19bdcc8ff3250d5a677e4ca388d6992639459ed207797eb7ac92a71cc2f482ab823c65127956968ccd36b72ccbb22cbb4488205926e687b88dc1329565ad65cdf9e3da943e5f3c47898d6a788e9d2f7b2ccb92792631df9b6dd0b22cebadef776bcc5b3299c6c4c85878731b8fdd465fafcc5bcbe2197d7d2b63af9dae452f3fa1955b01b916e405888b95222a445286a208fd04f90059793a45cc1e2b5fa87891c225cab399af534455f46ce6cb9f22aaa067333f7a79b308b3087d339f6834642b21cbb2b229d437f3fd78c9f3b123eef53583449e63caf3fde4795933e609da35db1bcad5d3aaaa5e894c9f906ba49f172557efc76d2ae7e236d5cb523d2c9e037335bf1ae2516ee7f80e05bf09dd3b9dabefb6f21572f5981157beb33c77ce3be79c73ce7b5dd7c4d087e8e9e9e92902356b9d334bae1e162cae55ffaa5c2cb9f2d2c573ea572e57ef6af8976ace37affd39e79cf35ed79573ce69e79cd35a23385d3b52b3395d9b6fe87217114253e0321acaeddac8c76d463e3cb89b1d8a458ee8f4974b3e7d3d019dfebdd3e94fbf999e47f552d5a8699c4e6f07778bb38cd36fa3a2b8c573de7378fc7b0bc8bae2392dfc7b2ba8777abc00febd8eb7aa682134ff9e9ef0fc1d34bfd1ec5bd8e9f10278fc3cbedf6a2134df4f9d3d3ddd81b19f6b0171c9db0e27f9f49ecd5946ef9cfed56b013d1b20b8c70b00df3c0d7ee15bc03d2c7161b20bcf64669c4a7b60204f1fbbcc03f73b61e70216c0c3dc035b35ec175b8506f2de0977b343b1e87e7b4ee5b18366e4c36307cd148a7214fd086941a252f19c1d5f807f3ffa793a31c4a2a753b9647fcab63be439f8df5b2e2c91e7ec78eb85077f0f5cb9a844aebd7f0157253490f75d8786829e8e4ead4f5fed81098071e71b0cc3d321ce03f70bf8879909f03b76b890594030608b00d8ba021d75e1c128ab695de99da776145309802d1746366674fa910b2efc378fd38907cf49082784d2c9aaec789a930e0f3c45e75f2703e2d9f0601c0cb1cb2ee0b963c78e1d35ec78677964a518572e5dbc74695cb93c76997677d3d020e1eeee494008e11177fe660175a65675015b19087652d8b163c78e698b3829e4ee1b9aa7b5f2c09d9dad2ebf904fdf0de4f438f887995d78da0303798c6badb29ef056b9c47cc5b5f77dca9a7cd3d09cbe4f2edce0a9854b8e7f392a1738d437a7b796674756835ce3a26fde635c815c3be199f5c8b699b17ac29d333c5bc0b3079e447df35e00786a71ed3dc616d063eb8a15e4da7b9a2f1ac8fb77c4e5c1835ed61cf9c8eca0d941e388f0e2032c3b32d07c1c1aa2e162fd583fd68f47f8fcf42f9fb239e4dacb7a9cdeeae2395b2cca7a9cac208b8be7b8eb34989e9e9e9e21b07891df5b42aec303f5525044c9ef2d2e5ca7832c2d9ed3291f7091df5b459ef3f27b6b8be774ea0754f27bcb4b907f39ffe03be2f2f8adf2985f9e8e901dd9179a6cbb5908eeb639bd0e3e0120f3a1bee1f19b6f91797c1c7a7368f47128bf6c344b2cb83da8b8273c27fbd33b2b9ef37fdaf1278c31ceb62a3c12c0b95e05157c302cbb9c3c052ead75de6e51db74ce5320ca3697558f823e2c9db81b0c12814f7ef041b7418a095ce44e911194226388a402a0ea4dd55dcf74b139e79c7f619aea678665b9fd55856b5cc3ae703bc3acb916bf8a5515abaf7e66a66832794eefb81c7b886346b8fd98c92b6cea1dab91c81b901cbf2debafafaaaaaa7efec7efebca360fcc4a4a274fe0bc279be97142acd943bb66eba14c2986c5a5ad532debb2655996657d5b4aad0c33c2b32e4b5b555fa3b94e7d996159ae7b99a985ade1f28d32eed6414b502237b59e528be29a8fc135f910f78dac4980ebd44c731bb964260597fef633c3b2b8f4dd4eec0ad7e5c682082ad9ad0d0a20e2056dd3b9dbc6aa32ed2d5c437fab99fef63fb318f0f78dfc11dc2d86188238cd6de412827267fa35aecda4e0cee05adfc89f21cb1986c4592713796b2da6c315bb9cf510cd32e3660d635672de18e3c30da5c42cec9bced50ff118a32962f9f4cd996d1ec85516c1a00d61762c0bdd1816ae9bc1185bfcb12fef837491dfd79882fcbe10f43d7c8a039590e10799c173defb184a400821fc9221845b605fae498ca0ec17a068086577e7ce390eefbdf7f27bef3d23ddddedb6eada3574eeae87e79c7f41c588d2f3de7d2ebf87b29a509b0f81f9b21e2fa2705a118614b9737f6c219dabdcb88382320c03c8cf7da1c9afd43a8ecbeb9ceadf579d33733ae77a67c201713f3d28bb0e5ac341fb14ec3368cd7bd0364c38212ea58138224f2209d9f96461bae24ae164c08437d137eedd01fa26e8e9e830c4f57c21728fc834749d33b9765913d7f5e4beed5a636eb90a09da9ee3cf7d9b1d434a4b145f020b145f3270ddd35008b7c408b370af3f94bc9f797bd90f2f6f9f35f07ec309629ae1099469421151b5f1048a0625082a66559ebb3b7c33c8cf70d966caef6221f8815eb2fbe1b4b8f0dd0ed04bf6f8c53d45d4fb1fbdd3f9e60887f81517d818821329261461882cb868304afca00c1dfc60881dfcc8d05a60090216459431c410b67030456b5ce10221245cd006152f92e0a409295ee00511ac28a2882a70de1047286a80108eb062882b6071440b201288f04509a303806104196c8c11e4c415502f2b7a5a8848829627ee5a128043510a8c30724cee141847c8421d3699e6bc8eb1ea0e6374ff2a5262f8e487f38eb800cc0d8490822faab0818a6f7a3a39b0e0448a0d317c80ca805b4497e3129e64ef1d992b94ec79885f41bbe6061ab70798371c3724a37a27e6fb11d03b4ec8fcfe083821d6f7e7e0845cdf3f012784eed4efaf80057a67847dcf7cbf13a221c9069e4e8eef7e4745c793f9fe13be6d530a12040747d3fe4dfe038ddccf9536d0ef029da3b9d6d334b8dba6f43ab05b233393be4ba46ce34106030199f030e7bd26d3bfa6e1e06c418c70fd551cd8862f727ccd7378d8d9c868a26219fa26bec53b7d137f8485f44dfc1c38f3e03933b416df8332dc42077f33186258404c4680be89475e2000035cd61c7801edc43bd237310b14f929200b1f60237d83c50f706019ba8aa8736528925f01748ce40743018ee4f742038930d490df3bcfb26a38aa329cbe892fb59864cef9607c47f25112b407efc9f4afa738a0dccd547d10f3a1cecc68dafaeaaf8ca6e357d79b709e8e435d4f21b63a9772f04fc77e10d68ffe7ad3d309627e10f6e7431c44951beccf0f62f4d68fde7a0858eb475fc47cfb57ff75fdf74e95afab83aefeebfa5a331a1bac870f01eba1f510986fdf6641bc27313ffa27327fdfd924f632e17f36d75f8cf36cae8fc1fd6c46f8fa51111773edfa9a5dd7aed10f686c806f3d0e0fe5ac403068d7bca3daa1e6d381334f6dce373d1df8f3ffe9c49f73de39edf4199fc487ef9c4383361102fe7b070117051fa4c2e026551ad028117cf7c44c089855711f84102feb11e239f70367c4f5bacc111e6081df18d1ed2970ca8410f35702bf3e082174eff963ef79c94e3a970173fddf7b58b878ece193bf3ffdffc98461d975f0a2e8498825e1ba8782894e11a951b3bd9f2cb198a69e95be5a937bb204e2d9485b7b38e73d7ceab43132d92d91b094283f6f046ae1fa15dbb758c66217a3d58d32ee746d64f9d9b7e5a928a59487e2eae56f35597a0f303b4bdf4af5327bf96e0227e54b9a97efe43b353ce7be3cbd7cd746cf739fde9179f96e440be1f1f2fd88ced9f1f23f680a50132c3000964f3196e56e8eea68cb33efa8330977a6253057ed5cab65d5ea998eaa8da9f6651a437946b58aa9d7ad231930253013772e8199a915c6d6d0f1d414435333fca48a8e1c1ed41d44a583a874d0cb9dea1226f71a5dd6c8dd858c4c7d8d24d9afd1b69415598394616b7419ca5ee4392e4bdfe239f5e53b17d7e9f1f2e98d322ed683e2faa59a851967ad6ac22ebf9e074d55063b95c13c7678d07bd36f37fbe6413eb21918f410a739a85069ad1976280b4fc91e639f47e17f9cf93c2a933fd30253656d70a80cd33f59a317583433774a0b94184c9f865e2ea0a76a093a30fd1cd80d514b77548a313017e64e75e9229770e7c6815db62cb52ccdb02ceea4b14b5cc6f1b4479e46dfc8af14bb1aae492fd5ca75433f6389b8dcc19daecdcc812a136e8c1bf59d6fe0ac52ecb26019ecf9796646703707f22d597676a02b313238aa85e9f7c04faa580fe5513ddc8bccb01b729b2ad3c68464b036646e9bea9b300e0b07443e09bb2ca52a8331366ea788b0e44e7511ca3153678b78bed990dbc897bf392e2697ef33304835c5d871e136f21fb71760735a845ad0d609c59046f605fea626bf745517c0d803bb212f807c4cc835f91676595c933fc384ac306b65334bdcf9d3835c933f2d8f4bf58d7ccb3aa1be918f61e16e1e94a57c0f722c98c9f22c71614cbd63ea1b9a6a612c753bf58427f2f64c90259106932f30f2f525ea2ccf34bdf5d5d389ada798a334db3c90afe95e0ef7f185fea4d9bb920aa38ad875b9b94ee4399b13ca4ee8ca9016d771a92eb45c197226b2bf2be13f1742b839f837cab831e074bdc185f34dad06acdcb9c89b6b430dc7c5b52ece8b6b5fb454efb2db233872956d1e8099d3e243ed455d5cffcd090db99eec449e03ffcd21ba00ca9de2a28d0c24774a0948641e3cc7a592c025df28e3f6fb3643f63f3d1043f0c084896b3c64550777eb36b237f19cadbdf0e039aec77dbb6c7aee8ff3e6bbef612ba47bee91c10408a53c27a59c33ceaaaa6055c1d947905114e3be04ffe2c17718f37b3efe7ed454f733635c1f7de33f23868fecefa3773af7cc0cee76ddf59c97c5e09a374e0c415e8de76c353b8d11efc9ef9dacf9a192524a5945281442976528698c38295e64f93de06499fd00b33b177f8b5d6d35c36ebf82a8abf0cbb628ff50f3fc0ac36ceba8f64e0fce4bfe8194fd614f4ff6db931dd27f8f49cd9487bce400d9fbc63d13593d13798402d9dfbf720b70f2a3f6e079ab3dbc2cf1e6dfb2923da57771ab9042ee6233cf740a23cb25b0a7270599497c979f3d8223c76cf34094375ec330a6c359e773177f664c275386371a6221c7a710be88dd276b469b0772ccde16d21b7a8ef77bf82fdb1c7cf8d8830d613701469b07f2f5263cbc2ee2e9f1a3bbd8f5af891d836b0f3399499c1573b4019af66f3245ad89db291748c95b4dce7ebc200d70d49c19ceb339e26e27fce3f4cf0b180c8bbb00e9e3fb87b88eb3f26ce4d73fed781e3dfef1f70771faf4aaaaef819d9767235d5055b9a06b449dd08d2d577e0d8ecd7f66a5d8be0fec52ac0859b1a40b3d1b29c59df09c1b2fdfa9b8a1fa744e2f77bce4f1b2c7cb7f895f6696dd72639c7520d7704497e48621dfc00e5c1e104d60743e485c36a67aa6f7654a2b8da96d4dd86552ffd066c65e901982e0909931481f920047f39c8605084dd8ef553b8be4a89ec82f8aabdca92d84b2963bb5c50b32c5516fcf7717c6c173a8344c663767e6998ef0e87560976972bce9a7939ce3e9088c2dd260d04ca9e369ac235c55f40ae359ceb29cab79a31ff268f0f539f034e12bbb9d29cdd30bc30bd37c5b1e1dd8655aedccb0215cfa14f31c1d57a50306b2cd495564e4b246ac4c09b43c33933db8d8639eb3e347899fed116933fce9a0828e2e3ac8d0c1c3f53c713d669caa709ac2e9ceafd3f24c1e98b826bf7a8bced1e778ea6a8e6c733c2c916b3ac9231eb5faab07dd6696e3b129ab5739ac2a793d6d4b4e379d6b6124441e65db7ceb730c7926dc79649154d9cde8cf0b064cec29c2147c324d9d78e65d28e665cc6f533e35550b9726c6d670b6c81aa5495444b61ad0a89a1fe2d026f1d1995e15079e7f8305ed409ee3b25ff19cf93a2d6cb9313fc45bc0d62ea196d25a831d2aebf1ffffff4f65d4619d1427a4e898d60687aa795aab0fec507526ab3269a20f69ac8bc24414d2f7a3b9ac0d0ee5832805d922526d11236984d15a676aab8bb953696091e7531e751221912d9e91ed22cf17a4a1459e4f633ac6391c6d4db225e258e686dc4a0977b68df2811b45c23278bb79732222eb568636bf92a5152878e6a4f4469d78ca85e78fb023724d3a1191f5e1c3878fa7788a0f1f3e7c7c966559966559f618638c31c60f25c8ffffffff430982faaf3cf0efc07fc225165c071ada628888a834e4b838c175a0a12d7c64f89dbcd8051ae28177e093132999ef86a423cad21565496788aee4ce57f4086500e4bea287283b4b7f5a1e9a19c1a6130aee74a22c5f3e4aa28ab2945bf48d7443f271e8704296bc79186c014f382ad6ecb9e10648a3be78a36bc91ba4820756515ce7bebf53a96a34b7c14c9c6e6cb937c0b85bcd9541116de3df4e8853c201f1dfa0eb79f075e0382131efef50e072465e2e762e45b48e27d136ee1ec535dfa2c4f52831067b1407c47f84bd05ce619044eb4015b4fb3c1d15b4478c5d08e49a139ea115282015e8047cc273308f42af87be44dfb847a152f94b1c98b717e554f3e3f4104638f2eb0b8c57b2ff349d4cf4b908a58bf6ce24e1c99ff88725e2596635b1c25c86cf1ec951737c60f4c0eabf2b0821bcb1e56eee098c3dd5eb60efd09f33c5986f6cb95b0cd9bf0959fec98d2eee16c31027a4f4fe2847a47764debf2fd0399524420727c4f564dd37b76d46df36d545d037de45a719145cf89b490d2f5f9ead322c8b0bbf845d8f03e24fc24e04ce41e99b9b6da6cc6659369384ebbeb8e65bbcb8a606fc2daecb7c887f603888dbcc6b8ab2a8ca3fb2ffc0c1200493258cd19de43489975f8502e1eb20060665579d1be2fd4e4a864145a4cae0a271c0e3897c20983ce98942df1a72cd31295cac0a97f456e684acdc4ea141943b2b213d7dc7ac706950ee4c7a4a7a4ab2d7e52ef7975b5241525402b31f5c26fd467a8b94b92cae095d87258b45c22e8e287d67bfbe43a3870b519ec99d3a23289f6125dfc89d32c30a8f93e2c5dd1c162a512c917f82ca1520212c5cb88db37ce4866666702cc15de232f6f64b7fe3679e62d807a12af52d8a65be9fcfa20f6f42e4773dbc621ee2f7d62551921252f683cbf4376a83c3b0cb16d591434a7cfa315312ffd510b30d7bfb2f4713977ee78886954c7fca8db740d6dadfacb55ffaf8d1020559fb9912ece197be6d0d587dfb9d4b52b22dd992b557a512e3c758b8e32ff15c27de84c8d391e2c7ec90de8a24dc7d43b36dc698aa24e6b7fa571d392ab6d68f5f3f6664e457bff3e827d7511d559dbef00752bf2ef7c4af6bca8d773602f7468c3f33f33770931b0f6526fe9077633699c14d5c0f6ae687bc9925d5fa8997bc5cb3252f62205c7b61c284c9429ed9e6a4896bfe8e0617ecaf56faf32c0fa534734a382428adb5d65a6badb5d65abb87923c1bef97e26244961d3d323f7e9149afb732f72442cb735d57e67c707070709c2562fd7524fefc22316bd7ae6c6b92372619104eb2b3b34911eecc9f634c8f647a67246349bd6349b5d43bb544b16ba677ae99be896fdde81dab6fe28dbeb91e078ebe893f9fca1cbd2373441dbd1375409ade81347d13fff50e7d27dfd13bbea36fe2f3a071e663fc79ad6cbb335974b3273b2e5a703bd504288c0c41e1366d64880ec9efabc8efe37f8e49fcc8e7f734461e561c1c1c9cfc58d10f1f27d337ae7fb8e696e706e16e9a2502b356fdb34560365d71bb3a40f67f73beb4dc72ceb2a6abb41e60ae6c340daa20c600a3ef2f3d3e3c6821fa58619c189c290a1d8d9cd498ec9f8d8fdee748f3f66b4afd11f67994fd18fc04caa3ecfb3caa3e0f4d04465fff8698b7378cbe664daac81f65343c1b9fd2f610e4d9f88f1ad028698f5859665b926aff0d718b1b55b71e6aab6544ab3df259bec3d74f2c7fbe659164595e231f4989a9ff26df69d9e4bb235666bd12f74e9048d32966994532a7fbbcdead118b3eb5d5ad11f9d7bb229cecb4b8e64fb3ee1bab06f792e88e36b00395893a60a0e8c116469b07b2733f445f80d19aff186b382b5240c34921723faeb92f88dccf8f12978bbcb9303217bb5a66fd82c84961d0ae71d53b5855d9c935c7dc0e2a38eba3113a273c91372cbb2592a3ed911c6f0bda355b9bbc775a485bef9d75704604d08b5413b068dad44c6d8904e1aaca11c18b0c63d8252e547dca0c29f97acf5519d93d95b50a2b984213b2fbca12e933ae64f75b783046136280c9eecf90e2892fc4e82304a18da04567d122bb230089c146aee146ae64200190235c966559d62583189de508eea7fbe95e47113247c8c8c80eda1ab05c651b07b890b1a6352dcb3d6d7a39e78acc2eb2fb698d78de7e90c29ad65442b645620bb27bcb127940f4a2f4bae875517a5d17a5f4baa89f31dab202a44f76ff84645745ec1a88f513bfd6acb6b1de7b04e188a9e65f590ef12b97afcacda7d5b9cab96a56a932b6a4cad88253f51563c6a41136cfe572aab7dc8ddcdf8e476e00e4fe91d331458c19e13edaee896b11636cb84ce3b4e69b9ece90208a9d154bba86d251cb3df172ad910a0fdc13d7a118708dbebb273c474ef1e91d7f801314750d231cb92b6ee7f9988b13095ff2e6a8b8c9d7dfea3126df39293d5e96cbb0c933440321a2351f816b82880526703d30b8436c4182ccd03b0e8bfb9e684bde1c15b932f9acdb74ae7adf6064f9ee8973cfddc78fd17d7c0cc24abae886e81bff9ebe191d813323e31dabcc6b98e5eaa77fcd4f78b1fb92d2cb16c931c42d7b2407169ef6431b428a8c275264309122e30429329eac912ae252a58a8252454350b8221c3c2a143da9c1186ae42e8a419112d509573a71db39e7dee45abee44e69b1927572a7b404e5b601ef56096ff64b4f63330538c9b6bea517bdac92f62388b595565a69a5386e505c6b8996688996288e3aed25629558998c49b4a5af8f95be7ea9d27ba9d56f71674bdfd2afd7d36b5e2fdb485daef4290de1a57afb3378fb3cf394e4df9e73bfd6a71bfdc6b0fab3fead35dbe8f7cffcb4fefd48197d25f3abfd3933f3f699ce192aaefccef05fe9494664f27c872712ccbe8cfdabadfd997befb52f73bdb57e062f11c25d3db189956098fb8b371df225914824bf1e7b9a9929c0499ed5567bc9645b0c76673579cdb61b325eab29c8c5d172bd1f536badd77a3b734b4f7a19bcc4e599774ae6bb52c624666b2da992482452e96b36f136ff871e199bf35e2ca3f4315aca3626b15e6d31cdac3febd3ac66a4275c227490a9ee09c0d019215cf9d4b26aad57e967eca856128984e5ab5eb7526a599675ad8955cc329d34fa8ed65a351c6a4e3ebc3061c26461c32c8b564ab14caf1db07c599645e70e184667856177ced9841e724840d981040687028114668af7de7b8fcb135298a152cf956bc68e46a552a9542ad18b5ef4a29736228d709268383817bde8452faae124c1c1191264061a341c9c2229996a444341417c687ad18b5ef4d27070f2a5e124c1d1349c243838a339f2918f7c347a0d07c709413ed493a4d43314834616a428d5e450535393434d4d4d8d101016d30c37861ff9fa761f5ecd5593434d4d0e3535eeee353564fcb421821cb2d0441445b0118452a9542a610a608c298031c65608a10a195eb0c9970f42e04baf8fd901e37c610a604c018cbbbb3166c20eee091a24a0001b231600c584c102106eccbd32f5676cada552a9545fe62be9d6987baf0ed9ba6e2fde4a7f6f7dcb62126f0c93183424531cedfa708098df7ec4243e9378b34d877c99c48b63b26d943189f5879895f4d79f5d2dab564c2a6252150da103166a1428a98d2bad991f5cf9d54399a78d045b8fb7eb68703b45852bd921b966eca8542a954a32334fc27efe082f1102779ec1dbfd7e8b9d92faee66ee2d5cdd56bc95bed6a729650a70327acbb232d98655dc2e458527aa8a0a4ee4ea7f04f19c469295fe969ef4d775656b2b4c3b97009b00f255dddfb27cd18b5ed75f14c797b6989f4f92296dd8cffc0dbcc4651925560e2917cbdc5519ecfebab22dcb57e9db4df7948686cea56c9b40ae32df7fbdfd8aef85fbad236ff471f4d5f71bbd91ab46d9b643966d667dfff6d4aa3474f6a1bf66fd9665fdf5945e56f68311573e521b5776d0a809dace06b0bbdb35efeeacbad6efaf6436b2e45843cca6919775f6ae798a8d2796b0dd6e0d20d7850d2d6c70710da390fd6b156ae03093bb8a2150a1ce1f8cb29ad645ab94feda3b4e02e3be8fb1c188d405a98bfba42e4a95d40569093395b484989d13deaf230e71e16f2e4b7e242dee6b077f012e88c949113299669a701b498f51b58d43d3cbe13a5ca6a924259c7404d104081e9ecd9bee87ee206571dfebe0eea43829951421687a04a0070ec98347257dd1439edc1554509896fb32fd4a1ac2578d8c084763720df6545c50ff6ce0e6a4e018c1dd9c8f1d335ce0d39aee36b54d0b242d7733e164b76d7c0336fe1ce89d98b740ef5ca0735e03ad53e9105b882d5412171700ed1ea39017c07d8f17804ada8284049b4a4ac27d2f80f89e895ef3d9bc97b92faebd3800ff7936ce7d9e8dfbf26c1cfd913d01c5959bec4ae6be40e102b52610b5726599e95120b53da76f033d1b28a586d34c13ee66d2d13b3f5c931312b3293e1a4deb58bf0d20431f19daf8ebf074ac2cbb338314a7f63f8a539f3f7f4e8afbb0474caee97894b67150f4950c5fa8242f6e0d4d4d4d4d0daea9a9a9d9f1353d789c74e430e1b8315353535383957cbcccaaf49a558d8cd05d4dbba2d1a6435e02a1c32082297270499040ffd5c98176efc8dc3ffb6ffb3091372779ebb7d278020a22c8b45d0a6ea7d24022bfb73cc786417993390e518513b4e47e18337924e6fa03ccf52946222f8911caf41121538825d36845a6b25ec9972d9245481fa5d42995958ed1e6c4894c3f958610f285b71efd66bd8f464a62ff66bde4d9aab73ffa214ec3906721b1d9d634c3328509fab908859912ebdf66d90538a12277ffd8acf787b68637ffeaec6f6dcf07274e7296b7fe4921a44eaa816382db2929f8e4cdf4256fd374aaf11ed4f5f7e9609f89b2bec24fa0044159ef3351d7c503cdabfe03f361c839103eff7f4fd35992f92fcba018f704b75351e092b719852851f0c75ca751f3fb399f899a322586df96c8068412269e61f6c3cb533e507d29e740f8fc850923e4fdd6df3db8dc61c2a0aaf74c3c4fa9be2d040e80aa5ceb4f0209daa8fb742a6e94b338d44c26022e462bbf2ace3d4b6383fdfa10a80f81fe1c54ee92fe32bfb9642728272887b8aaf849fd9299a0ba5f90bf5df79c58106ff0080cd08e66266d151e97b9beb1aae750d3e308caa03d33d736105ad9abb406bf610822047caa2c09929568d9096a3e5de2c2e427f3a15459122433792f4427e224a31c6f42b83d52ca55dc73ce791c55d90f5ec57db410c2ec3e8e7a321fca44592f6d122b73fd027c28ddf5f32af271c142c5f943f72efa4b08dd735725477a34026bfcad1a819992f830bfb7d523d5c78c0656e89abcec61896b23c76732795c16b3964660e6c3cbf2ed11cfefabfbb8c1ef23d5cb8ce6c8832f0661e4e5ee013af983e725ae8de810cb8fb86bf78dfc1865cc6e17561c7420bfe241cfc6ddcab3711866a7f26cea0ceee65baa94bb3d13647f26e89d9fd631f2042cb44d171125092946baa8a06d3a88e60427c993f8f29da0aaf79741a262f6f72db2fbe0491265d5cfc6bdc4373bb9769d8a04736572a79ed0c5a9ab65989acea64e48cc745ab48d7c89469031b2f422cbdfb4cb749a7373542c6bd2f0749c8fc9a51a88fc117659b466adcd726170ad996151dc97bb085118225b4f3b0ab98e2a4c6968a1166aa1eab9bbf5b4aa138c2cb2ac848c107ab9858cb82257357343424256368462cf166f4e8b2cbf8386246056ef5db85a56b60127d45c36b0c3755dc99b93c2888b0a523f4f18f989c1544196151c417444162b788216fa176c4adf6d11e7764e292dcfb3300bb6067dd52dcfabb9b046b17d678b7c4d943b7fab2a6cbdac22cd9d0223283b4bc456d48a2cb97e457363614515b97a4a73ad4caefde9cdbf6855dd4c946b32994e95b6913720ce519ce9ae30bc78adae119e54a10fe5513e8f8a79eb29ee3ac5defb3e8f6a9485679edc01e4c682032e79368ad298b76f6537c4c464b487ac018dd2ee0d620d49c09c73cef915c6b250dcd9ad8181b957ee949612641c562a1b92b4d035f3e4dee09ac4e1d9c81f612b93515c1ce6acdc565f69d1c6951b0b2dbc64fad595ad0c872437d0e09a0d497a88cf49eb146b296d52c5fa51769f8dbc7e4e6b655b926891e06c3dad8c50abb2321c5c4b7203092e0d6d43df48f95b0b656935ac7c540427683941d1acd3094ce4adc7a8f99396ab7f199c4e357fc2d17cee8669aee715717102127903f22793e662742793e64e2e28627a00f0b4d0375e83c4ddaee92fe6627438d2076de4adb58030c29a77cda7c97f589e9a7e1554d0e641dc83e74dd38cb8b7063355d773a2e9ba16bf4bde5a0ad93fc6687962fc67e16346c03f34f8c373b6a4c4a8f40c77a44d2d99a211000000000315402028140e8884629158348f2449710f14800d849e4872461b49b320c96118841032c618600c2004c000ccc80cd10600208453608d1b7f26d9eb3647958b3dcdad6afa03aac655a72e3952e7ade6814c1d3c8b0213bd5f606b066a728e12b145e07320d144fbf7df3a3033c0c85c2bacf2b9149925606323de90bdefe81af357d1e28b7844aca363446553e09db68f0aad2b3d0e73453b22c7827c3a29bd8d767c1a62e9dced2fbc435ebdd95d47bd9bf74c1be71a928d6fb7b75b1d63ba024ea93b81599e8d3d7e0e8f1f86044843f23324430e49774d54f4054ea5d6bf4305a37d363c0981a456ad83cef0a3267cee28d0eeb310183e52b53b14225d186e8f958c99c802d36feeab3b4722fc94c6bf02e0f557acf789b3c2baeb6780ddeebda4f07e18818a40499159fcf8a01574b1090316b46f1b8a6e3f40359b9fe89816758f4a0bdb92cb505f2a34bb6c4d584cb61477f0fcc4297cedbdd51e653f68f3b8b5e0e8a0fe5407e3978ab5004b00137f65bea94131e09afe7a5d4a668ac667f58987adbd700f6a880085ec5b3946489e648a0e3dc01409029f227723f40c2809f0bbb1bfe05cb7a280a0f812336b87bad55f46457545ae5ab7586414d4f51dc3b6513d9ff6b2c13241f1d5605a85995bdee0d9c81b88c6de5af72f949f3e7c325e6803bbd3a6dea8df62706274882bbdb5e6af05812759ad8ce08188e2096b759bdda86614d88b5031b5090b22ae689c11d9ff0ec7e8e6896a7ec20e3b9ba860d11168fd8429e193f1f59df953ebf5dc5b32b222e21f82b0c2b0e092cba7b13598cdaafc2e258be19113625dfaaaf12b451c5621c62f7f8bd5d0f767327aa66f63b73d19d0b198e4f4582028bfa6702620190627646206c90431bedb24a7c1c76ceee10e4be6fefbf510faa28e3300541e15dfafc57209984b3a79a274121b98130a72aa062519c1dc0454bd7bd143143c4c036df0f1e9080cb161f147b0a61d8fe860ad541ac301e412dfa100e8b3a070c6cd6141f953cc1a04da9db883486d3077c0a07d642ed7f187367fdcbee5f49583a2031f9aa2c834275403ffa24a10b01fedc67184fd9335ae524fbb594997a0cbe6852c86357608354829c4689930e6213739a96b0d4a36be39bd052e80ca61f70895a93e4663bb54744b9fd393e82ea0d9c4228bddea8986cec2cc05b6248a02b1a7c1f7ec142aa92ac5e6d4e985dd2bf598104af04dea345170e8fd5636350a21f612f400b3cedbf9a5a7cd2a6d493521bfbe6dce24fc997965e58ca75a0bfe05a78cc0df9054e5d3a367a0ecaf9e34c9d9d5761cebc0e4b89b78eb9690656467aed218d57d3c6f2be094fb943dea7be98b78c72accf2ed2d835fc2c3c2489df5477b2f2eeb84880cb301dbfba8222117576c19646f227801e5a7cecd634c41e738c728f5c37dbffc97f5533ac777ee4a27b465d8c006f39cd2d239c0f628a99cb314eb2a3724e95b9808d7cf46e426007e64c926ceb79a7c9fe65ffff89e49184e94646cd9c7ed82200b0c8fd332a2b613e562697db70f1fc953bddb64c5665fd877e8f1341118a9414ebf73334ddb1b2e936cf5884b034c76c609624e1c23cddf87f8ba38a6adda949ff7085de1f35cf1d4f1e041db11359901dae01a0f941460fa3ca05b9e06ad53139e859dbfded22fce1eb2a381e0a74551cbf56c0ee09f867f6c38729260781c9558f210a91bba386e201475eaebe2e284893577fb4a4f2eab18539da270c55324ab1a1b91b145028ccc26724c4daa3d08dc963a706746ecf7f762c1453d516a1cfb2886668b95f7a40ea966e03188f9e4a7ad3289f2bff74fd4175498134417c82fc5aa72b05fd4f6ecfaa4fe37d328362fda02d7d8e5fbf3c6525d193fdcc7e7e22e30358400e843ae77e778e869eae3cc14ced5c6c919b3f0a14544b2b76ca981db26d119a70bf4cbf1f03f78ccf1f7c8e7057bf299393649b5f138883feca4402ba802c6a6ec4830eee7a2d65310342b772dc20bbca3d84e5147366b2d43d0a4e42391c7021a7d8872ace14e8d040c1311eba23e0ae7a5c1ea670920ab0516fba7daee0fc715e7c1742836976712d04a359076c69597f47693b0906760ca1202a087dc7fc59257cfac0f33af9b5b4f4fe60bf187168ad8dea652e36a692660792ff8134bc7efec2996d40fc70ec0a84b7e23b6900cbedd3813cf65d8bb961446bae538d7883910f01692981632ee142ed6927bdbf245e650ac3bad090f129621989e6f2f948c60ad6d51a8a81aedd468e040120bbe625e305c4b4d6c2b0b486251f6494cc4763fc23aee0f652f58decf394f867461f69d8c70aeb3ec890190567f853ef96faef743b3a3afb0be41d4da297f48511f6b4cc6210e3347bd4fe40730405f358fddd514829627c45282d00f8675661544f61f58a263585ddadeeb925ee3c9fc4824c9b407e30dceedb19b9af8eacb121bed5ee00bbcbba8b9d621e72c99accd05ab85206448fad8eb533d8290a4aef7f4b9cffb7b3b8e6fa66d7084c18aa3580a2316b122c1e3e59bc5c52d8d1e8e395638b6e957dc003b6124143724579abc3820b3629e44005ab012b318646475560518eb2c44a0056b36bb4022246b6a747b9056f8294b91cb23a85ac2a51a14c1abe4b869cf088d27dee4e480996902a89db51c2e37e24d4f7f90bb9548ee8eb03e7c0ba01e2671aabd42ba09a76440f3106a00edefc3e85c1579ed9e039c106597919398850bceadfff96505869469a2349faff52ed8041694c768f9c68b391281b665324e31f27f4b237ab1f42901d71c6051302c9cd0a69177e900faee3bc7e65c027fa5261c348a8d20026d9bd308d6b14ce01990f7be92bedd92bc20a9f33e1e8333f68ed4ebb472a867c0a100746b7351c3dedf2f15689b8bedc5d01540976d4292a05066ff9f86e6f4f9d0f8d872b01390eae12124e88d3d9030293c04f66df523bfd4fb458ae781ef6c4e8314fdb74eb10c6cdc97bbf77c67f2b92f7794739983346f2a8044a49e0f084cf567738e5479ed086ad8f14290a1773b872259b79642ba86b04f30f9fb42e1d33c92fd38c98dccf5ad301c05fb1a28d1c800cc730b2b55f38de0c78021fcca094d6c6121a036a107c02cfe91648eec1d5c43f463402242c1bf339b12ed979174b87f0f7f0600f008a63bc59d181fde7f84e5a6877dcc010ce18ce0b1f709acb16ab1e921e332bfb96586688ca6368f365fc8580206fcfa4d4fcf88b32bfcf2ae11a179d1da08c1364c954a68e13bda63b0526c56011c8ec94a13b0655a875009a1c78f67ae17adcdaeafa3d3fc2a7a9284daa994ef3cdf05427be2062296afd6e7ebdb9f0183afd7814703efb950399c82716b016d75bb32b8e650a23add5a32578b70ef47ce01b3e06c3b42598adc957066f6040c1c77d9644c30898999643226329109d684ce84c5bb882b3e8978e2d219b79e256f1626bfc7f4b1a7cf9632a208fb144143e3eb9d2801c87ca5f2b058a2d39f9268e0de8eda1fc22e685fb06e6b36da14f695cc7de61a80cf7df30e6578c5062f315dcb800920c2b826953ae270e4639c8f0fb5abc99ca4a3d234517c5304cb143f716160115a3ca9918b4c3b1e9d887754cb7043c67246636378a9d620729377040ba5b049531389bb04da608117c12804dad7f593caf21a77538ccef8776415c990578e1551daef2e8989262108bbc4699e860853a54d61d392143f7187d727ca7ebaea93d1e46adefcb07ab78ffcd19bad9dfa02fc27ae72701d42ae167a15c5d7a67addf0afa163bd2362adfc29dd8cbc9e332c52c501328957139b047a0d50330f69899a93a72e5a22800e3b6a4f5709b81da3bec4885ccaa52c1d90086acf6850ec06869ae5f04a0ee9cc3016d026ebf093de22eecf0e7b1d9bd7dbddec75444e1b6873b8d5145dcc0a7bcb0fcfdb818c9601dae29f639bd7c18b746b738780676e1c9fd0b95fed13845d1911f751f1b770e821371d673406d74462bb30fd9e0b9bc847e20de9e2582042a5410519c4ac95be9b7869bac248d91198352c953e10f8d43ce95f231d95fd22e7ede373543545173e7c64d5cc921e9b4e0569b7d6e2d21a79875e59cad0fe002351f1c33777249a4d7c4736e984614f27d745ca7150c18ad25edcd2a238b16d85992a129a6148475569ae9ef1a1de91d4e9584388f6b96ebcd47c9b7203bdc02e0704f69cedfbb5636af5cda5d7e17a15f4b0603292ab17c345248b8ee40a17e27ed8802bc257ab298f8e76feba1c4eb2d7c758e24a8626e22159771bbe4c7bb3ae2858cc78d75c80d28cbeab35c56f47bd3a41e317150be8226dad7e82c7eeb541da055a2d10218efaf20f2b6b01f5c657542ab8da85b8420a4f8f1816d2ef586bfcaf87e67cf0b1b5e9ef1400d54db461b7f947521b8b32a5bd49fd68ad60b32c632f13b556702588e081126d903be2eef057e02de6a68e9e47318eba3177bf646e6dc78019f1320f23d3ab7d7b0e46464d2fb0ee304950728638e05bc78bbac59586f3712a99b9416e38614ff05b53c5dc014c5de55fac1a83f8d10512ad5f7f95e7711fcfebc5ed517b09b4aff0dec41c49581891750e6b1bc9f0f895aa8217ac50457c7233277b2bc6e0f83fc5b7e348fe4b446fd2bee31025c691f7ffe9f971a029ae779e91df3b2f8f1bee5cef116610560edb2e00819dd0b46aee41c8a8d889654820730b5eb1e4297c03bca8baa1e1590f955ea5ef71c215778da01de3ddbf36f5657c602aa1a1d3e141babaa5e4540c7b0701db5d2d0415080319612b6085c4eafc9efcce54a45a9c9e04e2eeebe5efcaef7b083024eb9a2c9b21b69693bb7ea7f08a8c561eaa65d858c515fb01f370e3439ed9258aec5c84f1ad70dae1ed0734333b4d4cc425a94dd42670d705720f9614b15bb2ef42c0e3800abcb82254963f9390c1e127e3fb75bc40a256729613751a91503eb849f605127310f41ca1244dd7cb8cfd5415fedb474c3636fa9cef4cec9ad043b60de92e410c27ee77a6d16bd645c25426247f0536158160d245622513122b999be603ea923294a2294baaa8ab8e10595c07db629d8d3650b29c5d69bf88ea6f29eca9e6e00bd276c4ef00650e4d73d347be68bf7aa2c063da27194a8e9b9c29d031432fcd060c94f5547242109b3cc6968f2972354e5aaa5d6523e62066e3fbb5051dd21432329b9349bfce66e24a3372bdbb11cb2e2c44af8b660af50736da4e40a9f3a08cb40bf5c23228050809e216dded0d1fa1acff714c7c1d3168a704a0b569dcb0c2442ac4fb27f58f9e350b618ca340009b61c6a0f43e5104767dc5d2ec815a94fab419d91062e45f0baa1bcd92022a64bd56fda7a9ca5549ceab1ac13eb1cfc2215d8b451473e59f2ab43023ea99fee2c5be92e8557712e9b33d894283745020908a382fc5af824b0af31900b012ca9e58287f3b3dff6c220905cd6adaca482b74cb506d4b08210f0cc41a1e9ea248b0baefb388f25aed055ab150f9c9acf6f09d8765c0bb6ddd8f9a20c1335cb30558dc1627282502ee26996de0170172209986281681b57ad2ea38b911e0e7024eb56a7128d6b63cdf8600ada40098d9ee37196878b8620086882576fc0372d4d250df0ef9fe5add7609ae6e2b6d4dcbb6aea533cd451b7836ab2631e7291a8476313de79a1c596353ca92610585a372fe560e1779568999cd7559f40cec677ddc4a81ef9b9757676d2017fc9cc2a362ccc74980999654d9504d780effe6eeac458ffc2fd5d4fcd18e5899b867d0943125d1a230d8745e44e02bb7b907e264e64571bd6e572985ce8fdfd5669c87634398faf32e587e3fdd9773663758dda1ede1d44d0f4c0fa350cd3723d60140dee369c8238410c3f5322f3b35a124e0fdeb016d8141cf31c6c56f638cf80ac75752606b15eb9a6a1cdc2a4bcc1d212dbc5b070fa46c1f6368956149139cb29acda4d6b3c0bde58d49231f343bcfab22da55fe01054ba37f22096350bbbdfc6af195efc408c1b512bb101bd053da22f41a2d274fc647682cee85d8b93aef32c60952f7cae5307a38125622c509edb1446c938000d6c64ae40d5f828a2829d3fc10accea60fc53002483251c5b214428e4ff9b3057cb67470071b4cd98089cdd12d0aba694ac5e8a5a0d85891af5634477b31224b5c21b792e704c7b49d410bee7ff1a4c21612620d0d18f927703d8a98a708210004eaeb5addd1c7365c998710e23e68e35f647f22f139eb900cd54dc4b3f8ba7c21cdd58d21873d68213f2b1b823386bf0d56b76c03e89d69050969402afa441cf60818ecc49f72c9e54ee09ba6358ddea3065bb78e76ab33b25d21a6f1ae34dd85732f9a65b1e1838fdcde9ccac783a317c9382040368839cf4c006c2ce55a3cd9e80d7bd6e926075146cba8eceaf25a5b72eb53dd9b33795bfccef17307cf48a6a776e27c7b5b34d6b94f3870a4a9aaf09cbf84dfb4397873639eba8faae3cec9ce237347a621bc0050acf8142a81b47270640f85e8c9e83d5e3869ae793a8b945d29dbae9eb12bda4cac4bfe85146eb1e956237e56c57a793a6d79653304b2c956e9936dcb85ed6176dea7ea03c70f527b43ff88f163ca022eae40fa9938e381520261733fa9dded8252b368ea108006a566300a758450bb7d130b9434a6cf710a3d03f6f2399249fe9c89cf71c0a1dacb255fb1aa8a8c89f35a762b7e5f5ca35bf5277cf2c032dde80c0a37decdfd06fa0acf01f943e4cdbda48581af99606a4724f00de4937ead24f68f6fd85379b58cea6a8157453b88b08b44f9a749b1cbe61c5966499cca1a70f0a23dfc49b0f56adf71f22043164315a552bf2c852e0bcfb9e414d31c7da559ce2dd0485f40807a8a9eb1c16ee8bdffd4d2f98e768cbc9bc7a2132f0fa3e43c0d491d2f8d0204ac1a07c8a15a3229bbfd69954efd6601101c2c28105f95491c8dae02e833fd6bba5549c9be206c3c4dc0f5464ac09f2e78a8c75a0a580513f977eb0b2d08c63622a4ebb077cc930a56b7208d64d82ed4587babac44b0df2062b61660ae5deca2049ab72b3d1c752d6b619a3f43eea53e54e9a5766708b4dcf8bee5ebe201f52d8c8025c9b7dc5fae35f7fbbb99cf42382ffb5f698804da1a30fbd862ddcc69e7d57142376a9cab68aacc4f898c9662152d607ba0dc66b3af0784fb2161cb0a73268e9e00c5aece817eb3c75b9f482a993360f6f22c04143d5774791aa8a9fd31b0090af780986a918c50c2ea44d6ad5eb540639901c34307357777ff31066cc0bc2eaf9a206bc5972525b6ca29b8b9783298da81e1311723a8a169492139ca4389b6cba1375cc931f88955ad9c804d76b8dbe5bee82b01de685d9084078928c313b16f081ccf6caa7687ee64fad3a438d2a3cbcc569753f91c0dd831863f0c9cff410fdaf0e1756b421dcc6f13e895104b03a2689f88c40d256ba3f4f93ba3d56211e6a8f53f332d0feadd533f683db3d58260ee7eee5081bf80d79d1ec8d3ef20650a7078c0132269651c4730b1d0f3c477f6a3c408ccc36d07999e33150114194e56c40a46830e80d3dfea3f0fba91e3a1d03be94361101253b9caa94c0298a9d4ad432febf8cf08a7b6788b3a6b69c9ee27f30d05ae2ae56f17f4b75f8c55113b70bc31c911617d3a8d374a522c6a408b7a5abada31fb88f24ca7f9eb18276047d47d022734ce6192f1af18005f182fe89ccf7bcf7ea627ca710115bde0411c0e0e22e49bd6770a0eb53d11bda3e462a8eb3e54bb22527368bff6a3580968814cebc9435c74d9a793c6c32a0e8350f2624c2784e0662712b8cee5b59ac36e0671171fdb50413bf3f05c0ce9161985fd006e34cc384eda4d7ea4ec8372dd69069f67646503834bac2b4a66761774ab93a0d2c0ddfa2098134e047d52cc9061e060c14e97b45bc6135861c2cf6d6e207d5dbaa4b1ec5caf0c0a5d689542ca448f144909b3248ab9bda0d6d1a7db84d16c0d198677de3dc61709ce5e9feac59c5503efbc1f02fc32ecf56581991be35390d7dc1c8ed603bc838f34b717ec73049b7d3deaa940fada7d458284605b24769f49d4cfd90d700d7399ab53906ea179f8c4884be5c3fa71988ccec1927ff98dd22af202932368c6a5b0f01b0f0021bae6aa5e9447ae1a2e0d2bbec8835f455735c44159cd517980ce6a89547d210c88b6ca0af03992b33bf4a9a187fc25082a560bbb871dbac8b5b35d55c82d5de9dcad408b2eb06f532e7247f08bac476d35caf84881118a704def351f93a228b1195102035db4b23700100e5dc83af983620b7bbbadffed9b883b071bb7c521d6edc15a1001e79a397823eeac85b75b7be805f7b1f2873276f306005cdb2572d9650de265fea3743d1d28d41a92daca549351c4e21b96ead5c25936392cf7ff22f7422d3ccba1a7e065c6ebf2c78fa724439123717b0f16bd58abe8b481d55230c5567a8978bd683c8644f2f43be7be6061585230c6be9e8326f569f154caa32f9ddce1c9fd9cf99b84d45042f79f37908cd290d1331aa208c7469e03d5acd42b2dc5795bb789e395da3f06eea8f73b48f52ccda8b9d4d5582fda850d3d0ef43f0e0293c767dcd68f96521c3a3c321942aa37b819d4d128121711cc8b1efea8cf8593eece1ff0939ad6184621e7141ea0ea70e0a5d76efaa59885df68b3577a21d0193e119dbb9fbe51271c141cc920299fa0ebdff705e8ab7fb6ea5beb52c9c1c785fd83a1f3e9987f6725efe7156e2a4339b64d435eea979b1725adecbcf0346c2b10a1db5b7511826ec40099a4e9458a4b045cdaae6ccb4cd547bc117f0e9f7c602cea45605fe0ae4cafaff0a9504e3231d44ddb267a4757b30b392bf1e281ecf39aff7812763bedac687bf94f38b7c412f37ebcc488a90752c696e9034de29a4a83ed3b1edb592c8228ae673d95416f7c2d83ef6cbef2f88e2e6293c5ddeb9970d61ffdab6be7e9d7b7cdb1ee313e78c6ecd1d7b7ec6cf7c9dba77c60aaea1585b12a8ca2fa2d6388c46b9eda9c57a7c576a5c2933d87aa2e96dc110d5686d0e59080df452306f63a0d5396c48ecc4dd94b9ebd6ed17e7e808f882d072e5c4ef1f7dcbe9f627e517cba765edc725194576816b75a2c51f617e873af56514313652e13ec55a1f54adef15adf48c7d886ca653141af4e0074a529af72a78b6eb84479b6645f4a7ff78ab5f7eeae25bca8b572f9707bace48f6b258dfbba74649f507029c526c63285755c549b6a3298224fe8b6b3c646d9807203e05133fa30cf67ac79902eb18f31b337e73f30993d0f350b229f9d1885b85b00b6d753d7f358b27b85056bee1aac3141d32b2464095fd2eae9683fcb902d88d58b4e447bef226407e7e85c9d3cefa0ffd40ff4fa65e544a7617f39523e5a23a106a19a83c47c8d3dba5a585b9818a97623acedb4e8fa9c140f7362fc95c2fda1f24cfd53ce1a51d5a88fa00963e78a6162ef36c2c2468d8a3f1c4c05e519274f665da5aa59309539c5cd1364105e0107015e7f987f7312d704cc1c961d2cd1cc017f5c5042db0defe851bbded384b7fe2919518c3d8731c3197721110c59e3016374ab43c4f0664c18302650fe166ceab7998d84aba4f8e1231963c63e4684111a13d0270bfcdbf34012bddf4e12e6cd893f8cc994c06e5bbd322c4ce64a388a44bb7871d6f53592cc21bcd0906db61d3b1abac6278e3cdd658c3458ced8e8f3aa69431106aee2ea668007d099139fab7da176152160763b8a96dd3d69b920eec2a7cbb8a1c2ffe896713d891811ac2ce5045b5be951b8525cf3d07df2219665d2d355338c02d06dbb902e980d98432b86b611490cf6496953f7e4eaba47f9d122887ea7c02641d8d73b6d2193d11d3a42fa64345aaa8aafe864ae4a373df3be821339f0c1b14a4cd671e9472825edb7a356ed0c51f842c4d061b47f81511841ca89c842a8ccd2a73b35621206980a0dead8fab2fba7e0cb400b1d2cd43fdb0926cde51904592f28c81017e35177a11bd3064015e46f57de4636a4f50e13f85ee77b95fc799bf52f60ce9700f0c909eb7fd0a962018037c5cc386c94a37c0584bfe56466c9c9688861e98571fb94fd06517ad532e5eac6af23bcb6d5f4837a02dd3126edba5ac1cf5ef4ad864a38280796f93528485767e11c539530980980a5dbcd97e2034f09b320208740c253431e643390dba2987d3670a019724f80b609948ee309a1b6bc72a75d59bcc92443cdc6e51355f7f3196a4832d4930c0c377f3c3ea6eaa6e8e0abf30390d923af7b2b8c3f69469e7246ec654fe8e60416e2869382f01dd278af6f350a10cfc51dc5fdbd57655a2d0abe43b5e6d0d50bc6f25844daf16d92a3124f418dcf18a7d4fb4c6abead069ab40c1a2248dd6242c381fd8dcf43f77b48c154e20083e3510e0086f90b86d3e71c7f58f8483f592f389d922fc3c6740f79203aade4c84f87f2b50ff2936d197a4546996256186fc3f8f88201fa1c485c41f13144aceb5a2397e06a27f371492c5715376866856c3f254cbfea9c728c3ceadcc1b9cc37415d4cab95514523aaaff8a6ad037cea8a21f3f18627d21a3f870843804b101c9f1a83d39b08463b019e73277775de77c50f676c942f5fc53ce1cf4a8e4f56671e6766fa2c721d6ae1a80a8ab5c9992b932b0dc7e4c8669a1670d001d5c52865c8efe09f0474faa377a0509519407e36f65fd23671fee05e9cbd3e87e831a4e813e1130f0c066ce0cee6c65a3a109a83d4a7ca35f01b2925c7e6da54ea686fd3cf4ab04a6ec880e64682d06598a6858a4029a2e5b2bb0005e1d9dbe0c68fc0fce860c9110876bd60a9da315f788dc4b7041b33b6bb1b24c711c4d5cc95e6dba5d94af3662b303a10a6427b3d4d74f346986af032826731b373145c85742acbaf04d9c42311b2de0cd04b75bd0c34ca1d0e918d2566d7988d1b4a5f5a5b31b7c46846cc2cc1dc11abfcbe4adb63653e089e15f037c8864eca22b707ce5443363309be96576be4e21aadb01c7b5994611ee03a62bcea6d5ed0d883bb663ab436281a6c9f7e5b370c67b84aaee172735da6eaf50987a2c41c82ad2c078e39c86e9047ca3d8a705b65e9b528f200d71b98f93292878bbf7a6e559cbc16311f1dda8e30305e2b171aa6480b8c65187882ddd71a3bd92e6ac73c028b930e1355076277d84d40c40f2cf1af56a97a57360de98e316b840ff94aefd02c4b7bfe70db534698e448726493661a80e65357aae526cadcfd737b73eab4be1b3a294135cadc2870074485b292032504c99d1467b27166d115897dfe12dc8d946179992381fd8b6b3645e832fabe88b1ff2cccc8ecd46466da173183dc384332773a75a73f1b0286dd00f252bc1f5517eb8ef5f9e9a77550440b11ed070c8fc4b581e4c8ed7591248d0e85a3f66e3c2ca1625adda235b2950d9c8b5d5991cce8ed98706f8fd363f0925071c1d17001f9196ec3008895d72f371c48f7fce433fc18042318e9a8607b0043db69333454bb417125487d8f90b677cb7de712addb3f0060d77927dcf62d80aa1efe0282eab52d15aeb675c593a71655ad5184dbbfc3df5d2223368bc9b69f08bb6996b93ab638f1a34cfa7b489fc4b717024a7de15c8e0c7170767730ef624610532aff9a725e70a5aa87586ee3b66da36851a1a3725ec0caa371bbdfe92935ef9d7c1ba0c77f231213efe16769678119b1e18cd696f5edc1ff57a71bcb8c7741e708cede90dbcbe39a6bd1bc7394ddd130d0cf55f273275ed96788f650173df84dd1fc29b21dff0493c368a7f754ebe4694167fac1b9215b62f5151679db7aae46d48667accd1789dd97478b447a31919a8fd5bee4236c4a2cc36fd47fcdd2709ccdcde522dd8cc45c92c26423e9cf0ead2fd7a6724988fbfadfbfd55407816a58467e64f423b188e32f459081f6119f090a242e889a8335ebc585e69daf82c910cf3517ec21105e6459a039fb2ce4755513952e4c4368808f7894c31a5cd3e79ed4e5d49c1a1df7a0b3bfb37a82e5963bd3e9089ccc89c49fb98878240d9a03e80e7b3785843faf909dc0bc3f8bdc3a4078a434b84ceb6ea21bcb142301e640689b9c3b786da9a753d2e4c360f772c374b4438af7e5da74640182a6aadaf88ce4d46f5af15a448ce0c73b08eff70d6145b8b84b2614a9aa533f713a09571c365b3d0aa51b7cf44ca29e9c5530b85601dac661c030e19882ea4f915cba5056a22aee00c5f74dd24819cb61f873527fe62767fd71d8444f99983789313472cc618b66f1ad04c6d273a0ecab881cab12829b31d79c96d96f150ad8d997c890c31eaf9b8558afc5359d36355affffc077e66a2c3358503464293654377574cad0075086ce342bcbe07e1a73f35ed3f69971069902f108af8cebb7a9a0556e484c6ecc56b5a99a360e4a0adb9f05d3b45965a5aeaf54a7332d149beba5ff6ddf48df355138157238fdf1e79541ada72512d259d47074d87049b526f1ca243b7022c9c69caf9002ac2c1518107ab6386d475ea48462886a05c314af6baa38ae4b684b77b078334eaedbad93a1154bb5d2380dacb1129d7637bc98b22b376c47d2a7f878d63453de56b1cf2c29df4a551112ebc520d2ab484af926031d8c687a09622039ab2018bde3b4dc9129d2be757a6cbb6254f31639776cbe713e1175678b0a70d569ce147bed0e20321237b8b5ea0f5a24d5e2572e0de25a7627a5b823f99ae44780af86e6961d87e27940de6ec0e2554d458b92b2d911c59487210e907aca30730662d0a850ace5004a7e68edb265822536d7610e4ecdfda7bf11660bb07e124dd49e9b06d5a865828e32a07e4b1a219e8ff7b73b2bdd48f062a76b2a7df8e53ed7e6477561845b59acd5a8a397a96e0115a92a00b8acaaaee83eb14746a45dd924c5e984e2ae378a20dcb0d55e76c688c36d12f426c190cdbd76c55700d3d9593bb736c806c8ea0c93d2d9d40924de49f8cebff3fec8ade5420989572929712f6c4008065ea23925cc27eb24648746afc40ae24a19d4b0928f914adb4aef8bc9477ddc0164981577d59076810901a59b1bc866c28a9f67aee461b506fbe8b4a93b73d43dbf64d502f8f56853728c9abf1fe3573260b89b9caf5932a8be118f62132686f5826e4ada540565a38e23ffdeff8f1ef0fd904610b62594c3b6b4d31118b56475a637c7ddd218788b7c6a5d9dbd0c668ee14f1e50d909337a1c852cf793b5f57c476d082afd88afe5d5f5e257b187ce71438ba7ef64494629267dc8f3ca18a395a280223097f74c201cd6bac7e6e0e9c8413550581463fb098cd6932d0ba2e3b6d8c9333007bf448147689e25a30f7d8638a3402648852193f636cb1d5e8bda10ccfe16f58ff8d3e118dd2bfce4f0a1c15100ecaae44d77ec9d24a2e97acd61f512e0da36d754b124a112da302e811c9f87848f2a498baed6776cedd9e9efbe7c001ff614daa451f59bb91aff4fcc76dcdf40eecb8a03cbef8271c123bd6aafdb91246c20a99d11fb1d66dafb425c71ec4d138ac9f9e759599d1066cee5aa3a33b2645d835b12428c15b4034ae628f9ae5e94ce96748e3fd770445f5f3ccad7c651aaf824b6b7347b217a7e5653497875c1412a16d7bf560a0c8a0825605d2b68272a6a97ca5e0bae27a2d5bf67da7de52308faa3dcf61df3dcd54b801b6d422443f1d5e6e41181255e82bd9c09a7dfe272ca912adc1c5675d6434ec623668cd5d9a7f40d7ead284cd62a625cd6b7c22ad81db5ad278341f2e57b553aab5478e40272fc7adcbb4c9fceca7c94875cc6cf2a56726862ad4043e83f2e583b4650779ab64ba6615a00f73fae400f105719c350acc59164b927225fc3c14e60ba4bdb8b51b44365f5ff20b6732100008e695003e8d97688246ff33346471f03313f9c745a427dcd5972268eaefaedd7875f9651f47f31d3fa736e68e5a969e83b8ec06221e728c186000725a98b52679d8d37d09594ce467d8ada7cac0a7518a4abee6c5af1d66d2a7321984721482d5077fdc6307dd5d6b309dd16252ab7d5f17cf5aa0ff0846059db06061362654f045a14131930b3047a0553658ba4362c721afe6be1a8c9c54458af8104e603fb5c41b374d9df3e0626868a1fed6e528b53f23f349bd5d2cdaf0b36683c9c01032566bb115782c1a6c58293d85a91eb423574fd867323a1f66676dbfc7d3b5bb34789148cf8855c8d84179a6ba876022a7b8e63a479b8aebabcbc66fd9566a715d1f6ac1a3ad26c16c168ac35b40ae0baf33cdfb239d3d85daa9e8fc6b732a148deb01f3ab0b0768c290b1de80315ed5914855a039516cb802aeadd26aaaa52fc4898ab96c1b51e25700c7c17ea721c3e6ba8386f69800c538c3d7798e689695eb2164361490c4c6ed178db66a3f6741582b6cd46e58764ceb0ec5b82df8c9541ab6b72ad36a56d56b1e6765063091c20d4441f5e5635f2e400830e7a4a4b0ef41467ea9738c26236e3355875761baf26bd986998b2590e2a5ad87f1ad9a6ea2cd8059ffffe8496ca98b297a1ff69dc68dd1d4f3d8c1a4a2675a8e1282a5b23ed99db5dc17f1aceee5e475378c767b834feaa9bb6a5f48ab40e9c8301c3eaeb3d734c8c226f015b2972cf1f8cc6c20ad68ca8124e0b68cda185127b908a214ebb0269bd40a75e08cca6c13e40955a0c0fc76f29fc3786889cd40a223ed78502412ce1407f2000119729ae6d86b15d60ee5680d068614d5d3ed27dafe58b703da1b456f466acd829ba6434a711d1755b623ade8b57d4b93eecf74a20de8e04dcbb1c931d007d2b0f4c486b7d0898aed854e7781505103f0529025a245be4c928b40dcea4dc4723157c069829ee742eb765b9cac8a0f4bab2d11ff474a25cc76cdff3952be5c4152da0ad13aaeb14fd25d059ad1340a12eb05a59001eb559b2a074c7885d0f88ad73779f5b78f31701021c210a632f6f03e7405a9b50434c1d964b6fccff81349098cb244bb9da396c862e4a226a58d6e640568b08fed8257839d8cbbb69671213510ec14bf5bf7610f73a399c8162167e615dc996810fbf78986afe08871d25c53762cba8409aa12dfa8819e22e843258b017e9ed1dca9162dae21de19d3f614e2b026350f4c6e9195b54baed3945c78e59e514ddec792cb4ecca4a766a8842133a81403f013246f64d9fc27a4087b1f3d038233542aa4abe2c3478a314c95b26ab4fdc6cfd81714244b1cf36e34a1be971b25044ee371ca206d20c12a9275b9b1fc7c99e20f8fa8b13018674c95551e79e624a2e21b72851759c547518fd04bcb06f93bf6dfa0d7226a4a62644718753f2c29d11fd7be4d75cfa53f00e1ad251996e13aced589f56824cbfc4d48509b46977ba5bbe6d360396bca73b21a14422225bb866f34c63db390d85b83d47813751c626885c537e1a445ef048de750f22047c9c727305f2de04927b864d7b8ca03a2ea04e36ca27349eaa9ce0a51202340c9bf4f808af99703161f387d722603a8ee3269a4698de912c7d84d223b7f38c1cfa73c890eff0497a86c2299a69aac23cd5333a02156d0fd9443c05873d434c3aeba6ad59510a21effa7a1efa31e1ed2fdfab6de92636cfdfc4f8f60c2e39874606fbecb3df9e91f57c0a73acfaa8694e13b168e57b86a9a834c00a4148b25f230251b873cb25ee9d6e331339d46dbc98aa6766c9a32da887ca6a6770846ac66d82c3fb3d2e6490c07f7ee0e642a77cb267f05d2461346dd6c872db71ffee46acb052e55727858f34019adc76b6f3edd464f2f9c2001b026d517166097469db4359e26cd4d7607324bb8ff4385d4cdc88553ddb5e436313c2c5a4f03563d2adbe6de71c54f2b307b5d3ad25efa9ad8ef75ee2f9dcfe36c16603b4bfa2aed193c4261d4b0b5541068c902d5f0c0b296428700b06e25d1e8c0691706d126059428a850d45a0d83b74e591ce680f25b0d951390776308e9a43c8a1b877c41f3111c6e0b5f09619e28747da9a405368b33e877d44ec165d6352f37ce64bb61c2b8e73f43072afed406b4c1c55dfed2a9854241002d7697f74934801e9888c97df8ef42454cd7cc3015c38ce35192ff0a19fe9233f7408eaac56e5958a821532a2da3bb434644b587a1025c71f3377e61b8cec2c30c5c8b0657263cea903e1fd1b72b8d033f6d5fb5d4157b248e84e66e98e95452c65fe3ec1888183e395351a891d68c194f59abe99036a7102d92d1a7957ad2b2704757f0bb8a8c0644080dee76d5ada1179c069512db3cd5a95584c426ee578eecb22f1143a16ff5e8142fc39e62ac0e8018d8a396e05edf66fe2a4b8710c089cd891da92059e0698a39801e20669b94d420e8d099465d176a87b9e571e7876427186d28f424bdd9555e6af673989e3e63678bf38490bd558df64d50c76863edcea2a228abaf342f78a354eb1ae6bb4d570dd960419c7ff1949d2e9c6a902c73d17b2820ed27171af811abd98e6a48931c97520b6b992875ff1ba48cda67d5fee004e10bda715bbcb422e8ab167738c9d7d10c8aefd66fcbf7f875d9bee36aa2e93d5b13a6306cadb2b46590f72ed6cec340b46fe4056b65ec7c21d20f91923b41aba8ae0cf49ac65523f6563fcf69460a70176b9f8ee125b13766f191e9c604afdc644d8178abdd76c3fb86215b45678372e21044dff058cabc67b3f93eadde5d1bf457a4ff190c2bdd3a60c8fc574041c667fccb5c0c2ac96b9c90afd73c26910d3b3cc58b3346e06efb9e95fc810c7ea37e14d24633e325041693208936fa6256985c11ecf3d1a03937f7eff1cb32b3a2effc497d4f7ddcdab892242811654e862cc2a551ec0bbe93a2e160cca268155ccbba9cf7bb1b985a4a8c91c216521eb10a86666755e6870a326b6086c5ccb9fd459de0e26902572554765d3e2224b8003e0d4f423ceb650949542722599e7601e29b1bd6629cb03b25491d0c371d7019eef99a110b8ad07c8cf4e7f478be612f8c9b760ececbd72d81ffe5db1a9168055c1c908ee6077598d57f23e58a4cf45655c6612bbb9af7b19833df675713ead3a6bef27b6a9ec675fd4c32981e6226065532579c4fe582986fbf9df490e03d52de504f97ad56d2f96787daca24967360b5ef98344a637f82ae65660f6ba0d8abe1ab6e16c163c1024117308a2968664853132c16f7a1a3f7067e5e7deca2fbc4adace3678cfc5b601b4380200cfdc0b324bdd765adf1681ddf25238f69d96a1062bb5120194eeda974e8d3fd6e1b0288e651413f619cbf891b02e723e9ba2db2f39556b562f5e918a23531a098e58855e9692dd583e2a82c215c34acf0b553711e672c89fff58de99748c3cf614a823d23722959624e7086335b304d3b7067b272ad463235148cece844d8afd6c6e47dfbf0e0806ad0417d2062a20f3ed2716326f522cf6d55ffae9fa30b1f3418c50e78877202d084710dc8d14913a857aeff8196e4d3d60956727999d682a0256094122cdee586395d601f8c1a1b9978da393d50f2df0ffcb0d669de8c45282463900d28650cf1c415368f44f0f89d3ae69a132044883c1934e55a8f8aef27c7954fc539857f6553f6c47ad3df25eb601a7949448e5f05d6c2e82de71bdbc380976745b6bcc83b39115b19c7b63e98fe7aa5a007e274aa1b43c14888d16912edd081c2cce6401f6e03d32ce06ca5c9f753f5def363ab5f28def351d1830f28b83072ddb5b4e9ce50795bf23f0279d90278a8257baa18d026bb237b6d5b69e18a830cc4bfd4418f4afeffcda40d0dda9e8be84c0140d8929e506ce9368363f724d563efe2952d3a3e9bc9c1729dd15b4b95e7e9a70f7a295a4e73864c55327b5ae0a780c70bdc6f4ca986578157c454e524dddbdbc83ddcd31b68264c4da809bb460df34e31ea73d256ab133cf3d1e57140f9ecc65560b066593234453c415fcaf51f7eb63a60d1894c28eff0878c72a27407df46d27c527158c6b0ba2c525a2ea38a02ef1dd7f09906b55a5858b02c56b3fdf549372d79f9439ebc4f996b645df2905af31b8c4e53e7cdf7d6646bc82b8b80a22d8a502e55689ffc2dd278223e7f8efdeeeb0b75241722631e2be9e25be193ec8d706cebdcbf46eab5e52e916f5065de25feedb5b7a601226703a9d9cdeeda549bdbc7e13af9fda23414453b904a6d6f106fdd6fbf04c41241e02cc37645f2354a2e1c72647b391554b473ac26533088c6ca59107f692b6f096272dc579ee56e6a2400dcf5b9ef0dc1dec31141ad80518838e4a7337e41eb51f984212ffde74dc28267eda898541847bf9f39ce129e7865c3c4a2e17e10afd21b1901e7ca1f5fb2879b0838df45bed79a3617f7b4a5277aa5fda4af1a398a7db726d1d77cfbe2d3110f2d6624f81459d5f221c647c32820714cdf8fbbc21ed14ab18ee2016824221ccf3a917eff9cf4bd95c4ffc0918a4007a140656bf2d5ad38f9fc659ae90bb964e22bd7da81985ceaea6442f14c8fe3f0337134967ef09c717c825cb11fb880474eaf086961ca929c3ca3b27acca1a7d95f37064f2785125e55974f83594895bb019a7c534e5deef2033c2760ca55d8c3687a3f56ad25743b28bc059614c02d1a2659d851c88f9b1e66834c5acd83c081dc38788abd8398b867ddd5a546305eb999f8629504fe4e455c0b7b13602928238c2de01f8c980ca094aeea13ba67ef0c15d0afe52ca559a14a1139fec8e905e80dd9a6f4e0cb0fd098e946b62c79712bc6201b07e4068b8ed94129b31e14ff55ddd25b72f014114f104ab4db1596fbb072af4f47dde6708e28101b69e9b443ff549f7fb2c844d4a356845bc9fa6908aa5ec7ff27b77a352322dddef51a66df0a12867448d95e770b578fdf25a72dcb8c91885724580c890e113c280be257727f6f047b84494d501831fe94ae4f114e22aff4793f77c3fe9a441a0cb4bc3ea72b9ed3f66e1bf0913d73b2cca5b094c0554ec44fdb5802ea6f6743980a40f6500d409ca75e9fc0d55b87300fc331c04a128dfeeb8ea4b62d2d15d41cede3966eb90954c959d5da87d0852dd0494a40fb5b25391d1381fbbe724bc70c312362d087f34f21a5058ad19d14bce757f2c45e2b3ca487a7ee312d350990bd98918620cdbea2a2b079f059b38b71da959780e5589e1cdd850da42fb7f1646bfeb127d28c5d4ed5a1723b00614d0b13439feea5c6694242f633a5a40d3c39ca69fff16d29f44f1068e398b2a787e8da3455155ac7eae9ef4ca2f46c1ad71d35a2a5789be74e7d4e5eaa37ca2d1024620746ab09244818920c36d5ba53c876ff22c8b7bab26ac7f9fb0f55f07806c8d383d14462a8853fe6505dbd0b09c21a26925624293098da0ebb1d4c8a1fa36428a1a5d007481a38c27ee839d8d87b7c72522ea36f17c8806f95c3c3f3e929f1f3ead81e7da24bcb595edcb55021b88aaba47f9ea4dc0f57c8d78af9bbdf15bbb5d51f865b503a119edbbbcc52750a71a86379ce4d1567a89450f6c7135137c8eec407d61ce8448cf019c3d1d4dfc9ae0cbf20c683ec6e7d12763b012e8752319d181c47ccacafee7f8bc2ea832eead8df406774ae7836162902998181fe3854efa66bdb1095b07d3e0b0d95e209f42795960c0408836947f6c8d889e8b70a270f3573b3507d9860b38f6306c3cd11107a2a176fcabb11a1fd72b1866384fd791f42511a64c4393a0d98c7c7409bd213e06a649666909d4ec7e9168518f78a1ec55f70efdcb23784e4d6d04bfe012ef21f7b46f02257468373e2de90aa13da78bb4bc6f399aea9075ac52b56f3238441dcd1b29b9d8ea039bcc33afde47fac9f47d61b18ec0719d6a019cf43297f5cf9303f17d055a8850aeaee5610e625a703549baf9b86b444d09de5b93493911d5d486349110f8428a519fc44e9e6f781efc507c15136cf4abcf249e330818033b783f1c049e56d3110acbe480d945ca4732a30e02222fbf6d58d0f7d105126c0f872e57df7215e60a027f2181da074eb4d45aa44288ec34976f4351ca927f1f6f4934d4cbb71fa1e48c8e7c6f40b7ed11f18eb8d90fded93e3970db5b960163e256a5c14d4c5ff1e23872a4f617e188465c5f36a119629a84a3aeb0bbc7add05f4e8919216eb584a6100a06e249d2ceb0d5de606e1a756be01ca08b35bcb82b089cb365ecd0fe239b5203d388da6dc23a378580334dc85929c94605c4bb0738207c0ba28024bc029ea565b0306046e3cc737e419d8d64c3a25838d001ba29e1c47ab16d2aafb29fa89c955bd654134a74f5c7f1abe2519deeea686d66bef2745dae7080db439c929a88bbe7cd278bbc704465e9cff3bf3b61f4020b70d82ff969b8aab15e9adfccf38d0aa5711d9831dc4c92382d64ac36533c1dc517dd114a1266b6ff1d2268449fbb28d8aada0da951985ed8309f728ef702dd10110a096ac73dfb89094b20da2af0a7bef196df2dc7a6221882e0fef45e4b702944c11a37756ab3cb3bb576ad58003ea28180ed8a558c3b7aebfa49b10f3b7077abdedaefbcb1a2b5803e391ed283db800f88be73773221b63242ae063447d26544e1f96121811ffb3c225045267d8c79252adfb3353cdd4600ee81241645d22594fcb10e368d73a79cf9c19a0a4e0f1ac2719408c4531220740d8251805575b6381e6b88aaf6944eff768f189d6b017a220d675255a64436a64086a4602a9a420a5e06bafa5aeaacc20aa61f1d28fe77b885c2ae0b192984aebb58d0e35b8fac7d022ed2f64166129692d74b343eaa67c85dfc0e62780018331d13e95af1489bf1ca453ecc0fc5398ed59a4de0407e653f1c81343e2c83f4ebf8b701bc314d38e51b10049a7144c3cf92a9454b15491f4023739c28a4c733762186df66224e25a23093c77879001cb509a8587d60a0cb78102f2f20e4791860583d52514c1139eeefd2049e493e8e79fe35aaf7850158a56bccb8c19bd89af0c4c0a3a6d316bc5a7873c181cbbe064f64cec943eea802dea1c6365942a723a41aed85337bf75d91f35def904d54c781b59d7d315703c6628d16dfabcf802b6880a5cb12861f2f5a069eb8599e804fc6d053e1c6cc1d752eeaaba5ead1f86718dbdd373e66163874487c336c63cb24cedbd4c9b4450eea328d1f1833d27cd357c8a2b479b97cdf02c5fc421edbc96f1c2360fec60b77f1db78701b5798c96b423589512cab6ed11131cbb30317ab4983561e767322994c1898d4390c4f6bb2a923033c26a402d7d892b9cbe18768b44604a2c44ce6664c0cc62238898d76236ad25c5f2cd5ce034000aa352bea66c7308d8016fc1f489465310f1fa609a86ff0071da399f5a64baa5a1471cc988c7f7093e7c621f4a53100718c0c35265a96d78d0192270258aac6dd7ba6927835424a49c94820d68c13bc35e44c899d10d2d89f21be18b86e396b7b07deea79215f3a8e3e09f952926308c1784ddd9e95771c6e45cc55033f7b77564456f6714a6633621e89f978debecf4dab1a090f236efc7ac3f5ecb6c3b45d48f183866b43022af1d237bdb19c81a58e3c6c5e35a9180055860b3b5b65c6f2652fccd2af503c06c80ce0aba35ca4a97c22a1b4ab79ae50ebb588065721b5d11067ec1489903ae9d5b7954da7a3395d7b211116e2d2874af35e9bcf221e674a9b46ca3530c0bd8eb2a79132ee12480145aebf1b98475e7bd662e2af38e030b37216bff7bf187e2cd9a33a08c134b7b2912a661848569837c2cdf4d38c3624e534c10d0d90ce63e2320f98052ac4be3234f1d3430e60afb1c13ab64532e70e438f5777b8e6b732107908045ee308e0ac3978d9d7a739e5a47ebc47dfe378eef18b39b544ad8988b2d5ffec7c71834cdddd67db5dfa508025b6bbcf9d7de5018ba6e734cd5d0b95b6a417c16bb4aa8e72a75956c458f4ae254ce422f21f7bd32bff72e2bb991c8bd9e87fa82e3a22edc041a07203d210c78d9259a353892011eb74860e0ea81f00d5b7f8378325023384d75f20dd554fd83c65897c8682836d86f932bb3b4e23e5979b94130a9bce440d3e73e546f32a31d8397d9bb81065c75c611c7e1dd480740ac953842a70b42a64c56262bb8a1af715b5712b746938b0c81d6fbeed6cf36642da8aefd7bbde091881a45f4162d87ecb712a0b90b3a398d4cb591d70d219d6cc4a59e9804d6011468a79685e077aa8ca021bfe12f409a2904d13acc44b8064700066969ae762f031e229723dcd1de632de07fc874aa4e185d7cbd7c681fa866fba0d6acad7e8de2d471d12d369f5804765fceffc4c7884be78f8914e241ede2016c89bc6367c497750d453daa2a8e84a5a7394be2cc6f905aa1e31f33b5df0e304db9c405a4909a53a6c19dcb63844656c97df9abc17335fa94a82b031798d166fb8b2cc2cc8013ac0f94c2d9178507040b01d52d07a3a16616bc2469d5e0001c34eaf0c48a142fc10d472955b81e1683e67812ea9221df43a83e2c2ed9cf47ffb5917fd406898e6b24ee86e89b86faf12d80db079ba65cab29b7102a6950f881589ada7b39a2c0f04a77d0304deb426aad7f268be1b22568e1c7777039632173d64a252c814abb16a3759aeee01409900cd3c249eaa84d9633bdc1b2af9073eef15290a51f221a0b9809bba0fff2c8f9bb67ec3f485488fac4cec9084a8d68c2068396628a0176ff3ab042f7978a581cfbf44df5e562827f95a899ec0c5c98351da8920dc806495d0e774e5e6686b25ce2d11d9ab626f379f2d08fe5f62423df919e2b57c216ad6642e88d3373cca0a3cceff4f322d7cad0c5fe7c8da47806d8ad1eca3e28654e74acb58a91867d07a4708bf6b4ef775b59c15a699825b6fe2450ca27eda524d1a5a15ecedd7738ae6b66a32863bd2b969896411c9ec3074dd63933cee5547fd852ac0e4622f03e261afa8504490dea2deb616a3d2650828e98dd94dfe4772045fce3803b218966e8c4dee623742c051fcbf98ca26d999b5742761b944400ceef1669fbc2bb79f550f1ea49a9e9e203f08c7e7e8ae923cabb151071e634f6dc136af167fc95729d1d80249f7db9cc2f2afcef3ea4c35652c89a8b370fa42d09dd6e0e92ca323733daec339c0982a395ae6a7b0e9d47ea566234c641c0a0907bf8f9886790439aa55805a14edf2c9a934e484cd5ca3908a78f0665bbf531cad26c40d546bc4cfb5e21faa2cda0c363a5ed7a9a284859e80ba44757d0c89d0d3ccb697ff2cad157be850b9dfee53bb3ad0eda9c8c10fc86012b211cadab29472b910d1228c4344c823d68f9b931ac5dc6ca17280df220acce7ddb448fa4808fb2be2492ab8b6b85728ab4822a9eb731c22651627f118d18627f5ecf27e8f981c0cee6d3028ff4a698aede743f6c58c11b3e4c374a114d3db8e53ff4b04cc62acaf098d010a56eec0482c0bb3866f95e4582d6b75d632a38e74272b3815285de94242fd01c0d20b281a480061e4d62b1ca78646736616d70fb841a6f32055184726443ebd480b77bb3ae1d690d8f4f4e2c92401aa82b2f904c1538102aecdd9575a1ced876216f5d0bd9965a4be1b71b6ba05059ced5821ad6d49e5e47f138c72132a1594178226830818c758339294ad42f1a18016c9efe5fdc3aea1497f18caeb11e6b17bea4d16b43492eb8137f2d56551faaf12e61af79bde4be3a31f0d86444bd5a54c5a2a0261692806f4a4ba0de7a128ede3586af42b5e1eafaa9e423bc8b18186a5b19e52ff7ad3ea334236440740b2cbcb80cdb8035068fd3013e3a3c6bfe8c1af5d267b452a2ce26765312c92d9eda8c9b2a54437ff0ea9c9777810bd4bd67d5fb5e17fa8c456e96d55c72a81b7251e506aa27646624a78cad5bdb042a0228a3cb544e8ef3d4bb9eea7139d599004cd3013a3f61837c2e80a4796418220176dd2962541a2b8d446c9dc70e4b8c5e8b3d24a80f6ad09441d26c3221c45dd404c08978a5cfa645a0128b327061f5476d281eac04a0a4e34a9b745dd2bca9d8aae8f431b1dfe3f809e5045b9fae98e1c8c73d47badd7d58f612d1f6dca05dab240a13400a81e474a66fa1b081d99a4808e45a2fcf85352138fc90ad839c87f591732ea8ffed6da24b29e0f88266b04b0f84cc61f674c78980131a3f895998469e23d806dd1c15ad3392e3f74d34e7569e3bf0c0e8ee7087886cc2fb60898562b0ba46ffeeaf1b60dc554b6ca994825298d351c6ebb2f4973143fa6eb4ee1922b8eaf01ceb19952a29c41f67f04b5ed2de7040402a9c88c2151bf9fe8164e272b0d2735d5e33d393f396f0ddd9b05112a20c94d3a003d9fb7e4ff3bbe83993a198cb39b0489ff0aca6204e003f78864ace2ca51b035dbe1ed1cde96a94f8b0215e4cc3b63ca790da2e29638dc2db6842d1496fb3ba3941d6904ddddf2cf9a69d3a2db7ea4461d3275e61a5c1ecba238918f9aa66b4e5f2e1285e9017d0a396acb11fda915728e629b33f6271b3e374ac119262c0b2b27c3b753596ce41314c672fab4069b6a5bc7345ac180fa44cfcd2d8604aca63b2dd68416270c1386d5f58370587aae09fc6db6526dbe07c2af8608fd4bb61897852151cf2ae01460e4cdb7a29671cc32ea996aace719bb18aa1708112544a3f1da3e419be20a2632f54db09a453de75910386256b85dc9d9d28866bb4bed4ae8f61e7a5a2d1192ddc9772dbaa31f19ea439f19d63edad0c855a2496497c255af5b1cf8f7e0ad035c1973a95afd276037ebd5ed9b7481cd403986b6f00a3399a477f433c25940acfb30372e0536ee2d7edf35ea993580121ca4ce52780cfa4e0e0cd1baab91d83810e338e3cf76e75a102ccb5f4604a802379ef3a8c1e767085ecac712d0b6926d98d693459b5d20e890fa4d78ed55932d34eb5617f2caefe4f9498daf1a8a0ad73afcf8bdede51f0236690616ddef3c5dcd1c7b6d19751cc453acfac5db9c37ea09a07d241b9ffd212df25ef25e22cac6c715904f74b248638bfc2070294bed59b7a8c6124433485e53c93e57c3b44683d97df36419a72259dcd132f7417c966cd5cb16462786c89f396add6a2704c91238348bd470b482b478fe0d2115eaef3fa216545943a34bde3829ceaafd1ff6029ff11047b85831fbc08187696dec220d1eccdbd5089a4b1acc45403065c598583b6c4d1343e854642bdbcdb15c14c4b42cbb0aad1383503c9512ac976ef79c8e4504954cd84592e6ca705cdfad173b918547cf6029d261bf47b6ebc85ba9382c12eb47b9f69756e79732f48625961f6ea33b04ef2fd41a0045451570770a8b68142a416b5609300ea01a5d5d4081003af36fd56d49a729d9cf640e2370944d1b7ad1d4502b4a1b4b5d6b1626260cd42d8598ab71a41a4edf6ab3dd480d67fce49b0b9d57b9de70c772028df1df06ae9639f4106314c6a29f4b69627c3f12c85944f7580f42f597dd6b7e69474d00251a81e46036a43f9240233dd0f888ce2f6860848296a05b7cccf23bd708cf79b4215efb6b11bb459b8408097b6d9a28e88e9dc9a802738c18629a2d2bb4abbb422f6a145a64f95bae271276fe1a036d3f449f0cc7d415d4b516601dc6642c581ae195d2bc6eed1565310223074fb3157acf7059e0497155e07045a668a86c17d17c7c7c6665c1a68bff8e89d43538b304353d3768550a7fa6f729baf0753fcf4784b0418ffc97e3626d3d3ce117f95ed33850474d8b75607619a9cfd2a5166cf4d2b11cc8868f288846bc30a7cdc705e47a12b35c1bbe0d2de84fee4795716cac67f9674292bba5836b5462e7f54bc002f991e6175a90b9fe63600b815a4810f028d430dad3724a73a2d607a0bab5dbf0866a85784b33947fce445c72b81761b74af5bc883a8f5a2d5e11e5bebfc5d495f4861ab128c48002c6e463ae0b14c3182b7a9b7bd3b59e656557f1b36a9f1d0216d607210ed6fc15257de8fdee215b3207f902e1191a113579a809c345df275c53e4ab09824084f9270b59cd94b12670a985414cccf0ad1479403ccc8aff7252a4b43b1ae0b72dcc913c3a326738d4142fe02dffa5b1a4e364c9026b69df2d0c39ffb20c1510a4bcbfc853cc3236934b5f8480106a72a79b5107aa4d51c39f35f35e48e9a842687a934bdc78a8b1e53d840d6b76c5edb44d077ad7c569ac0f265f6a607e183564a527f18b72f275e25050b853f844830cf3e0bbdb78ab20ae0f3eef6d01465092b83088c9d1a338836e08f09bef06fac5e097df538841e7abd721c3c91c1713e41e66455c7974941629bf28cf63e6f1697ff2f0bf541dfcf56d13ed330aa6db27f8a0750abb00ef02c8fa678ee310a2eb0bb6d8908477beed864fbb1176b92ba9a1e6d1c801e4768087fa31ca3607661e82c70648e572a5cc7f8b4c8b6a1fc053caac5d56805492c7e021d204b632322599680fd42f1cee44c4d5337b4778a2e9088224e9a7825d3409af0ed977ca7d7e2be4c47bdc931327f3c77cda3ca003e40c8989797e0f905f0d83f95296bf014d6fa0efda053bf860279a2e5ba5372c3f6d2e7b2353cd90e84177598797c72b21fb69897fe4e66700f6f2f935187f63d1da327cbd2c038ec1f5820123ec12b48bbbe73e329ae7f1d11f906b9f63e1876fcc9c37ea7a83a31d9299b9404405f3f48276403348ddbc3129bed9c1b08a1c4b908dc8fc7e32ca1ec0566933d06311b4f3003113807041c957b8eb0bd8edd27dad600ea4e3a06dd398b00ca16cb63363132705090360a133d4f0ff5b720ce00bd6fa8a2beaf8e337f7037382941a76b552f9f5cffab6defac6eda27a68c949641aea2cf3f07907230bb80ccac39eca6482632438c9edd911fd5628c12122f348ba130ecb37daa8903286cfb7b863681078a90334d73151db96081c0b002c816c35de458c79f6853efe28b2278528949a9c73d9fd8173061ce9d9efa78b48b374425d9895c9c5bbc74ca4d47d8c6144829d7ee63ae4e380af639323060b6d70c28d07ea7ed59278d4e45b5b14beeff9be230a47c5bf7b018874b97d8374b8b97ec950f2658551b555c955089a7c74115de62f09eff0c8f88dc5157172c722f08ff83e7f0d3b2e39919edcce9a25ec35c55e34e0e3dc6860031054c4ceaab1e4d246d04c5450c28021be0a2ab341ca5250a861ac72b44e8960779f914825cbd6715e67112753a46410f1c4b7ed1e79583a20a65e71e5dc0e69039033c784f92d206b85d3105cd52aa247bb0077dbb74a9595e08a52861463f64a7033ea748a5daf0df1fd6694a72cec7c05ebeaf224aaa7a7df0a8db001ea0d6a5427c1dd80c475dd4701de95587d26399ba22907fbda4f51d8de795c59e81ec4afbe83354de06c3f087f0169fbef46fbc1e4d7f3c7533d4310c541c54fde7c37e6b1ac3ced9cdd7ea1459bebb25d409214570217104efde14cf2e610b19926760a02245296abb8a6f99c672c378d211125a984dc61ef0f4047b696a944a153b206c039eb533bfb12e5a8c5e495a555e42e2a9c88b1bd4357a4d75b1f921cb191f7414f3716be3d67eaf454d8d538d8136f3e62e9550e73d0d064307b2a8561c395649ca17a0854d57fd4a2d174ab7e61f1ea0b1ba4467ce6f5b2cae41023d47f3c83b98091785079522208ec98ffe7768fb3052b9ac4991ba31963c67a75753c1466c47488e41f7b29d49fd20f2fa48a63b03220bcfce949c5248cc4b386785fe844aea1364e94f5904783175b2ca2716c14bff4ae2b9458fa53e9fa080c0a695fc4455a22f25e689b8aa6c018fa9854c74621812f35d664124c3bed838a9e1efc4cd486702d648d69e99a8783611d5491c7ed88bc4e3663f17780ec40d1e4158a45f514553f7588c3ff9898416c59968e22f4e83704d1e51a05c800d61454f27e307b204838cbad0d808e472fb4d114f3d30d52b1c8d9a75851abd60ce11cd8264f2e4a59267fd984845e7e86331647f9b57fc54b4b0d3c74cd26a24629e8973ea259c3166898e9f6f53f3c23b47f568230b8bad17cd1d540ea80e5c7bf59bdf18988590f69ab6f5b2e9e63257d686b56526b384a6c4102477c1c5134a6438401d039f85057e95011beb9636d5e7aa8af6256d7fcad75dcbf2c989f81c05c84e2ee30780c72a5dda28b957a86f7b3b8c3064b0b84956f701c456a9a73b7a9c5323329a4bd5a918276ae03c14d3d05252804e8a44192daa411cbec5952868492c03b190b39610b272e7d6a771dc862ad6efa8f5b5bd20c6b8cf40c903510cf8937e2df1b2b6a25d335348e78e85004aa5d2d2d2a32273b967771bbc59c4d03a6229f3ca2fbc7d13389dc13bd3e83990745474a3f664f099f959aecaf46bf587ee7f716b09ea893d8803bc8bc4ff3cbab2a0dbc77962bb302c89a8bc6b7e8f90364bb08e4d5f76d725ec0b127ca01613155c8ede747ca35c3076c716f70b85d60ca2c45d9324910d1e39c04f7d160b12fb84ccc3e461f1dd8f980323d90c63f92eea82a22f813bdd311495cd90872c4639368d9c5bad776d69f9d9f596532d5c3f0c32c60ecb1bb3ed2606c8096aa92a812259f6b3b0381b78e1607e4b704f5ba0f9c334e62490c1c77fc9c7432ab726ac9df6189a9df7cbfec0051c74f10cc63eb9c0c9bd81480be70564fe5b31e39a38171428eae6a1c0331727a96d96ffb5ab49362ae9f3b3dd464844da478386e525b45944a2f544718a1b9dd824d55e411efeb0a56062a7db95e31fc6cbfb165584e162ae050e2e96aac715e1c376a9403a84993671e04367e4412d764c931bfa00a07b4c28152a8605a98670cf4cd32825701107620096c1b97313bc42f9886abd369178b53015568600a1544e180572810b6d47ec39e819f831661c773b585f4182c48c7b044210a336b81715a3ac58a09747841bc8c167a8d535b836587b1f906f606a9585e029bbdc42f8eb2c40c732c93376593881305ee3f2eab516b1e387aad2776fd77c3bbd22283bea37590f9f5e4aa099c82e0c420441a3d8e52086efe275ac787cb1530ff5a003eacb7935c41171834ad9343fc3595dc01dddcb1761ad052d3c1f46627dc906a7aa7eda7e965699af0354d556fda10f4ff6dde3937eabb284974707d82ca29b83ead06dad714e8ab033c7512fd2ba74c972a66ec0c445ec025a746c7236df205997d270cd8c5d9a22894204e091f80167abe39d0821e16717b1f734b126239e7dcd2633b94d4e70722864c224a4dd2900dcebe38d17c5792f450004ef2ccc89fe17eaf0059f3e430b3b80a6f9773b3911d2bd3a5f9e1dcce8b092664f0f0799cc00a3dcf2a55785885fa8fe8260e5ece16a7e352acf50875103b8295fc378976786075d6421d21277e370e094c54f53ffd907e81487d407fe5428e29f3773e472e21b325f1e5ad698a73177ee11f483c9c75193e32911b3cf954fa1a58269bb4f87c6e24c6ccd0b4bb6900e600b0e59a941d83c81dc6cd6d8545147f4d29f43d2060e24ccef6f391cd86be958a73d890176c3fb5c9763158f267bc036971ab2849e46ef158647811cc3082f6b5aeaa02ba4538ebe216b6ce909c68d6bfe27d52c1cd5afc7de648fb79ab8f5f1977c509242d4ee87395082d3a26d5eff4f05fab7fc1f75b354d84659ee5faacb66e5d870d5189c704f217ebfc99d72f83454458bdea7fd1c27fbf3a87ff48923239389d6d8ae0b76c93300d1ab9cec51174178a4285c4378cb249844c1b0fdf7e8456e42204f38da75fff598dfbcd8e510fc82f61763ac451ab510e37266dca11841da1f7059690995dd7ae45d8d1f0f7bceb1dfb3e9029d04d0f5300555ac57e20df2a6d992052a07d85574231eb50919ba9c885476703d41154927c9507d69a4b51a61a4b5c60d3e3794236216f2cf434d3a132f0b1307931614c50c975d4284a888de1d53bd58803b9337fc013ab582e5e12fad8fd77945666438e3026b29d4b446fae83deb72cfbe38ecc13eed30c942a9e6fe9b6335899497d76e1419dcfb97a4c2d60e83e5ebcab0301511b69f36b923bc09aebd5bbbec234cbea8864adc810e7a4c823046320db97c341e8cf5e032cf886182cb38233457fe851c91144ce10c97ed2cf853030fea9d22cb8857e069aa3b32eb06a7e71f17bbb5773f6c4e70741e8a4b91117a34c9fe01c1136372d34813b6382a168d00f5895f80e2fe5d3ddc51b3f290bfe233304c6dc3eb92942cff056160209f475517abd1d6802a507ce3e6ce3f3dd80aad35b6304eae5afd16cc5000372cf631dd736f852c1ee36832f34f8cc81fdeec5c19fbf0f544bab040d6f2ec79cc06c17744bda24156284683bf7f64034074045d3ba76ddae2dc6e512882d166e6b02298a5d6af800a024748197fe70d0d26826b6055ca3b009b2270672337d02de5a2b7c0f0f250fd72ca4e500cf82a4ccfbc96c93fce0eb53d0b643e567249df0dbe4c36ff533de7b88bcb9412fcbc0af152340d57ce7dd76abfe5bb987c8f1a1d9cf8446b92da6124cfa899d217d135432fddf702a39aa70561ba7aedb002a2d562506e976f5a467b381c79b3068bdb1ff8b4f281b90395c21dc9466e75e9f0d445fdbfaa469e4d50f8c9f640343aafd33e607ea03889c6dc289a9ef4117c046892b1b70ece9bfe1f838095fe1c0ab67660b990b8a392c7ef0fd8cc564135f893af52c169d1605a06270f5cbd2472181323d7400778598a12852450d286c4340ec684c2c0413b9c8c1448815f2958b9c4c1ccb05303b45b24fdb9b4d268674e434af52ecbd93ad594e0a5437cdbff58966a7b5319970ae6d3d291838f9bd622e3684e966ef15dab86d2f902361c6384d8af43a0786031965420c0da0d825b5aa40f3330c2f1947ff7b0e4220372daaf002d72983bb40d30bde28250d062e4914011e84efe5a41bf5ef6e69a6201f96a0c29a0eb670f06537e0394d5c480656059c021f2cf9837ad97a8e82753bdf702a6377089721b25ab3c9cb95ed4bd064a3453040d815d2ecea394ef9a4ed840eaa357c4fd80a1b2374c9abe7c12abf924c1d3629b3c9d9ef42524ba20435d35afb0ba8ec436e1f3192015c4f0e2008bcdb328c916a6f8d0b6f23da21a5df77f40634cca8668db5e6556bfdfa50f72f534b67242167ace1ab3d6dd8dd4c753d3b6d4250c2d2d0183159480eb9d4afb21ee43481305635dd6d569a8b71441da7dea663b75984e692fc3a94276463b8676ef6ce0d7a9bc7e750e4ab030f9e322345539b91ad4f2ba54c7b7aa1a46453d4e441ae6fb61c50b31e1c148a8283bcf018814f9537dd842ca4e926377a46530b98de5890ce9bdcccc6957a9473a74e0fef01e6061e2acf97c98bc9df552d00a52484bb8f32404ff5b05cabc1fc0ddd8152eb8bf9caf57d0512e40e0afe9308ce4e9bc5dcac1640cc4f9300578d7e67f3328629453c326abe1e4c1f8880c3e6434952554fab93a8a0b6e72978f1fb6a9aa680171becb39d1a9ae03250532c11c55c4c30341a38c5869fe265bb337cb54794a110fda23cbadd84d65c7dc22bfc50c93ef81ee1758b853377482fec4bc5cad2b979095818e26358a629441ba04670440383ff04d0942fe325f33fe24c21a05ccc207d3ec29dd03d9ae08629ab686636459b2a292196fd8bcd13b9f0493b9c5bb591d4f233599517299dc8252c1a6e0be706048fbf88820cb01b1b9c855a4a51c5f8d6ca2a87b075bd919bbb1ea46da85f1c03198bdf2f51f1f3de72672d16b16c795a811cef7ca1389436a801656c318da0d929809f9dbc89b621fd54697c3c084d413dfdb52a0240eb9a352288725e8c05742506136e1df916d7170a702fd7804e270e37e2dcf019954c7d95999f337e37b2b4f35567cb41dd40f1d080f307d36b3d4f641ae27441a32358166fa821b380b5908d10c5b2e65f2f59351b5f5a9d56e717542c497631c5bb1cfab7f79d42ffb27e66d0bf63bbb5850558c8c780c0783c9f13ff803a499be88c89fd726e673d3697dce3490563637c3a4cfb747fab95ea4a2f14bffb81a44dda812490f16ac8c4d5adbd6a9bb1a9eea95b518d015daabee1f12a12aa15d97dbe9c41a980e355bbee5a8edc02bba060b47da9dbb4207a29284ff321fd31fad0935822f80adaaee65b45f98ec652396c104d195ed907ac71365330949e082146e7f9e48e6b5e8c7214435034c9b09a6f6b9391f3d147e84f3bb908e58cd95f55ab821cd7da5f0f0652be2832c87b3edadd42e2ad1cea82042483b4fd588371ee3a576424f7bf7f87a38bd913b5c2877a5577e744b52ba76cb0f2e1afea55117c549b600e7f1cc2b8370387e4a12af6a9065f110c7ea1592a2ad5e36d5cf3b91bb2680712e20e1c56086a7fda75b012a7d57fb89c69c1ee8855a9247a71b0229fbd6044b1c7568677710d2597bf092938ad73131e7c7ceed9de10640645ba319ef41f8eb21fc8cdd094b7dd9908a275e4e9631f4b11fb269d242b9138a061d12aa500e6ae8da525a82cf09af4702f288b40182923aeaaa884e630db87a445810667b871da8f030d8552bbf2d90ff807ddd1779e7e98bbba57afc286d8ff43ffb93ed0bf20162a2844e8b7d50fc07469e3d30bc8b70ca74a6a5c96ee4cd02674f140bc5689c96a16f25a4285f3609f64896dfbc3cea475dfe51fb56dc9dcd3dcb25bfc106c6f6ccead5d0c32fece4e76abafbad423047a25ff9f5b30161aa703fa5eae25c6cebd9d6a70c8efeb15fe726696e24e31d6adf6de4dfb8fd411ec3a619467a041f37af264651a30381c983769e238db6eb353a55ec9547bc0d05ca9327e14b9c49151c2be9b9090b677b72da59432252903c309050af20947392c7164b2dd6dede120cbb0129d128c1d4286f6012b28202dd119ca4187fb815817498498a0040b95254544db07809250d223a5f481a215989600fda025b13284c30e4949d10270d0c9f6ae668643b02af2f72d520ca580a8895b331c820d6106976638049b82882b331c821139e1da0c8760420b800565e10295e11360f490250b2bdc361317f00841050ccec4214466b071c647d625acaa802d21fcc8e2837ff9547e7d98a7c447daebc7c9b4b3e1ca2532437b6dad7f5f6ff5c392d0fda0d190e88d030d1ad1c08efe1dfe31be5c71567c54202c19b4a71f84447a8a5940e8b358417a58fd1609c5acd65e7efc1a84d8109f4099af913a20dd901aa06b4f7c786ba75d881fa5a7bdf8a51adc2f3ec931c618bd270f4a552ef492915723be176b72c491e33bccd14b36e82c6ed010116e52dcf95c1617a28a704b47d8b88c8f7fcb12116e3f035ac607a432453f3dc520032a0cc8e27225256e432940fa2c19483f3f48f6144f8cc4e78662169039312b7e9d981583d0b7f5e75b8cc4e7a6fefc170b8a7cf8f27f79362ef3d2842a602ff83e2e8ccf8ed4d12e7adeeaf7ae8676a1bff4811b99e058aac1fdac122535386c4e6c4984066940f739879efccc096d774f3606e6efde17a28b59fe1bcb3196259ebb7a0fa6ab307d1a2c731cc7711ce75ec8b7f85e93d67d47a4e4914d244f105cf5b3afd87e95594682f48bb2beb5b08d2c7c4aa194f4fb0aac94fe943d60969408d811c61bd9db68adb55f1fe5ef487498c39080d94a2bad94f63d56d1dece1d100b8955a6942370d057fa4a1645babed257b46022076d241de64aba4a1b39cc61445cf4d7d8e8f081db0a87396cf5d2c4fd56ab2688842044f32d7e45b63c61ac4229a5f168ce39bb6824243e9c7376b470ee0449e16bc0e0500989488855b28c556014eeb74ae27eabe89e0029a1dd4137115a8ad042853ae7724e8f691de48e133fc4248f6c2277e409248fe4c1e2422830640618b9234f2079505bbce8000ab1dbae12170eedf4501952c1d1d013183c402a7524c74f754a01e1145337e049810935670d9cead87d30ef7d3572fcd45b2337e4c8452a6e7c8263ece310ee177bf2ec993f7b7afa73cb1417e6887160182538a639b9899aa769238a06473a66be908e61650fb3f6f3676a6c74f8e818d2cf6700901b0a740cf7f36728d232f0a5f516bda97d91bfcff3bd6ee69393941153e6a2e9bff8ab2930c99f2aab38203387a147fc1d91369db2d664a3299efe466bdbde3f75d65e95b5d7da7befab54daab3ad2675ec79cbac0226b343ae6f454723cc58f59b4b73f7f064fee624a8e7f7aed648fc46c7afb99fe3b924aa95ed320d7f5514ad57d3764cba1fed49d9eeb3e7b3a3daaeb2af1463ce136f253171f66fb4f48a127479bb9b7278ee3be54227dddb0911e306bf8e21e3067386e30bbf870e37f96e824a5fb336b6bcada2cd5167f59d727121052d989d4a96ffc659f4a599b6a7b2ad92ce371fa2691647b24120908a46d6341c58245ce5e089786feecbf7ed89f39e9c2494ebdfd58a42a7de5bebea6d138a5adde7de6bacf5a664a6559175172fcdbc5113002b787ccd96bb64bfdd6c3bde956fd22ab211d63fafa423a06b5dd90a6384d71e11419e5dc0e131743fcd473dc8ffe14fe6ccbeed9b31bcfceb90c0b8458ae0db055bff4dadc541df7a47f4ec614c23d65ff7c7a7b22925359f7ad7a981ea2e0a73a1a32acfd7d9bb631c4bf7feab2b771168f53e9d65a6bc5f2453e3d2a0a4af2bcf155bb60924f8f7aadc670a25ab66d3ddcef5e97b1a15bf5537f5ba6b8a8a804a763fa2bfeae0d1d73f1b74a612cb94e6e878d53dc367dcac80d39fbdab9d65701baecd7d720b491c246623672f31199334c433fea53ddd76f7ac9c5707ad457ae01fda8bf18d5b17ea03e7bd467af4168c3f4369eb59762fdb07f7a9bc25f9155be4ffad3671b4775270cdbbbdcd66160953f2259c345567995a1ad35abd9b7bab055332a6ef656cb36d931b67e6624c2a21bdddded973d6ccfaadaf32d568a2d356849723ff99ad66d486cc193e9d77ead3e807e851a382233e9b9d7a026b78837aab9d4b2adb906fce89efd314f2e86979c16b8e618c6cf8dc45cb1c072fc188ec4188e446faec7919829b6dfb91b0a3c1992e2d4f9624e7e528586593f607c98938bd4c891276bb1fb5830ffb16e96599d4953fa37734b230d46967c44621dedc16f1b2754ee5e43bb9cd67dba744aa7747224a58c4fda831fd3c18d0f69b558222cead4005b315a8b8d8e80c0169c73ce197962131a3d49f0420397131859a10f697c9076fd506b08352061d9080e0e59f27dcddd29a5f484bf9c7cd29ad20d78f6a7a1ddfff3fa4ba58e9e28a51bf0dc4f83a3feeb160a63005639bd3cfde921f70052c70093904f9108dd0da4bdd3c7eea6bd531645c8f0670d7f09e3666d8d1829a5b4693744f5c74a43463de48cd48cc234f4c3eab0a3ee5decf7ae5a6e07eabf1cd5edeb72f719abcf300998840d39a620fc18e39c42e9578773897803e219d41eac4f3bd844bc01bfa662577ed85ca7507ba987b0565417b37730a7504fb91efedd51fa30e6d3973a1fed9d5014dbb4770a42c39f35da29e528365171e79fdedd69e9fdb5ee8e2fdb2b754560518c34da93ffedc987c17d02785c26954aa552a9f4d529f92ba2cafd7e4d2693e9298d346652fadd35f7ef2eeb893768156a8f5217c41bd486ecc761f6d31e8dd0f45917dfc64d5ba7795dc372773de0d64ebd70778a21b4c202150d7ec41f4c8ef425adf42bfc01641a68ad44eedfe4dc80537a7bb1092b5962e3657a9dd4ab049349a62f71ff418de3388ddb3a6e3b71db6fff99e0d1b6611cee57de925c3831220546fc18c160afed4ba5ed75522f4ec9927e955e0786d7f6a64e07865709c7e7667b1c21258ce303c7c7c32d18051d9e80e28421b8a00a29bc2c734c30250742088144910cb6987918ecb57d4c9164b45d02e36609375b81a0171865099395d239c34859f1d29f3e949fcd5ac59452fad1879106faaa8fd217c987d2a7180a09724260125e24fa59477ada05b9410512595ed9c3eec3c9b0297c628b29f948cc8d3100ab64230e05c90d308a9d1709c3b2ff7032c51f54652d6e2409c028765ed9ab72a494d28710424829a5947eb6fdd5ddbd524a299db3525a9f564ae7cc96bc98e0066529a594167a91a5ec276011f2e7eebe03b68ce0f677f710885b4670e54722e4e85268d1221249c1c8045f83105f27573e4d420c98f084fc4928b37c28fd5d1042382194d1f282dbffb146fee8d4e8b418da00d2208d2f06758144ea5527158742fdb63d0aa3544f4aa962ec06a3e6b6cf589ba69df097c59ed813a344a09c222e2da8a0223176331249f52daa2231468ab1edb72c8bb1acbb1a0662cc2661c2ac910e37187511832c96201cb896a0130753a94ddbb44ddb664622dd7b2fe94ff3491dcc9baa337203ea79a43e7e0a85fb6196eabe985301a82568d12d75ccc5f00853e6debf2ed1315c27ad94baf964c6acdc4f5a894deb445a99b1c9d1e7ac882fc04c8ff213ea0eee576332cec8d51d94ce4eb32e93e3695e3e04a2047a2c47cde7f820359f23c80b5f83bce5efc2f5c7693ae82dd25321d7c3f03e37399e862503cdbbfe86e65d18c7a73e8e1b4197b01b9a8701e3b891b772e017cd7f6e44534396f19fc8f287f6f3fd6b3a9df88244455ee8942c49c02bbe0ecb48cc7227def08fb02c49106f38156a0f53223aa53dff120afcaf14acd8cf2e13fb598cc5ec8bc458a61326b518314e7ce8f8c389c91b8c606e2338d9c672f6afd919713a05d31804e58fc69688fd0439e98902d4e4089e275250455c38d4c34ffe28ad45472cf930d31d235aa563a6958e9198ea5ce998892993f6a860810a12caee1f6d92611df3d92bee378b9ab4cc2cea963f8db5b7c5fd68ac48be8ce2b468a776b408854506d19735d669914a7b5ed4a4639c740ca4981a39516ac265c2fd6a0ca8639c08d9bfc69e74cc6c1909f3af523ae6b37f3de267fa9535262f17d716b90c4b52236f19b90c4b625a5454dae16e7153435c49f348e2bbfa6988b8f5c76590f8d047e2fa1e974142f3fddeacf9425c1f5f08cd4f2c83ebe3dfb83ee2da7343f38d6bcc5ba99feb7a9ad76891cbd42160cbbf05d969510c8eb20db2ff47ad649f45d97f16d55829092daa5bdc8f1665243e485c9825df8584c6f5fd372e8ce373e37a9ae7b9a1f9f83418c7a70814242e2c793ebebb9ee63fc993dd8569b004923db00a4b0a411bfeaa2c9f2881e07efe6a4c28fb6f5adcafc672fcb756623a26916294e14f5b813d197ec75886df3036b8f16143e1359fc2543a6584110a4659546209da1162544208d4e708d1d280413a1860e3c3a8074fc8220a4138b113821d94000416fc808707a21fa212abf7864610cb1f4cae3b38411bf0ad7c2965b42db035b0554a29a15091a82b5be56b32620c81330df27dd5de67f6ebc3f75fb5cc3f8003315b5c310670a6586e5dd4d8e8f0717494050e6a7094659679c6477b57ee078570d497f51b75e57e92fe4b0e2efdd1020f0ff97dfcae9c5159713f28e403ca95ffcd641db5b9f200ca13d390e5bd5fb57fb2d6ea596bdf5bb1cea9514aafb762d4dc5d665266591633cf12177e087690ef4a475aa3ecef6f5590bd072f7fd50e5a648722fbcf646b656ece61087acd649bee9e98573042c82d0449c822022947476c01039819a480088a1ca67cc089977be183ecaf23042f8719025df115c3410e000880c81d9f080992f8f1610935d8a187295cc00b2d946082088a2020e1e5f89e9e703f1a432080e5dee412a726483ba463257f5746be86748e720fe948c9704887a34c93e1900e5872c421c70d36b99ffb57fddfeff533210e71e1900e455072f0894f7ad91e11acf55ff9bf5f18a117bfe76b9f6db9d66818a3cf52b6ddcdb5fb6a78aa1cfb63ffa0f38c193366cc701a0ce8985e31a183d0d09229990b28b28dc68536e87ffd42066f50177c8166f8b75f2ff89e0b0f57cebfd0460c340d6cb0ec1fe57fb6a663be0eca901aa9e2afe27f7c1af16bc487898f2328c7b7099a3f5de4f8333921f32d178466adbb086313e5a0411add2f6cb00ce3b364948d8302355a26b3e23fe35fe3afc3df47cbc0207f20a6ec2f0496fd6750bd27bb9bf466c72ce9356ae0a8f1d7e16f1b068365a903218410421831076d34c968f0dd21225c304484920c9f663844c493a111ec649512ad33a4e1c9e0d8922558306fde4b21cf2f8de00a1942647e0dac8e4c3a0e11d2325dd00cf389b48c005ef36b908144f371a629cf8f4ab0e4b9d33fa390e76b9ecb0cf1d6fcd5fdd5cf39a7371f66fecc7c9b9922bab17e563112fbf5274642faec339861582b10f15b67c799b4e78282fb7591cef743885d78b8f0bba8a8c83b40878078a35ff39618932bddc3ed8759ba0e938e31ed2c0941938e1140ee779e274f9c38e998c809b1f1560d32e32dcd39214de4ad2ce482f4b36e30cec5d05b1dc4f3560d023bebad8ee6c88a4e5a26d531fd1ea565042005a8bf78f5d007bec86dca0d87443045eef729d33b769d3d29e7653f66b8b99bec2dc6f9febbd54e8b5937f6499ff3ca796946fdf3459da20f26c33e88a5bbdb6b23d8dd1e8c3b71e24f3c8a4b8136fae37f30b44b4698608c138451ba4b6f23e92ea5ece883f67d04bb57574629250eb4363201dd9670abd5d66aeb9c4f5dcaaed2462efb8807ad4a7e41cf08664acbe3e404b2c94e7f634d835b8c3c1e1bcbef0e7f7b47c484c8ac84018214182ab0828b981092c484a121a60c0d4165096e05ea09154f7ce1c59092295c58e10d8226186183270c05f18a4f8232b009a22c6c90831e2fa0b8223ecc2516c087f83b324b9af6dd3953483b71b7fb36eebb83cff56fdb0ceafbb0ebfe7b3b981b766b5ab7d69c8ff6386cd31ee73169adb52e02698fbb491171533f97d59ff3f2bcc53dab3110253330afb7b966c302c7a3f6e28a0997fe17abe418511f2da5415bf7c5f71173aacb81c17cd8bb82459e8e8675d8b4c7fa01abf4ca5bdc2bb9dee2de7a8bfb1cd4e764281cfe8ae8441d18b3a1ea7b2e93c2754aee8fd0fb2a15149e2237fe8aa83ebb6d4f22916cdc48cddbdf901b7eb1e16ba46f5c85da23bd8d6b1176a497ddb6bbec07da7f49224521d95e6462e3cf4e763da095539b7c869684206b190e25b981cabe0c0cecb7329f031823e49555143ac0a2073e5270900288c41549727082670728b2c82b3e43ed350de923d0a17b680420a84322a8926d864322a062846a058b1bc060063c34a1095b745124c41226b2f080c50bdcdd9d0a2ddc8330b35de1220726805a8003d1cbb378cffd61280f704062082e48026bc2cbf146c36b4f15d3406f83ecee1e5f51092d8c728c6f73ff643894e427c7ac92deadca90dbd1ddfd2274e3c36ec9f2f1d9a157bd4aa582538420b5966ef0a7a4524aebeed04ad69e4e52d0114546449977cc6c901050757777cd876493d18def4766862fe5a73d38dfb4831b9fbe84cf42661d26c3afa4b7d5066ffdca5aa73e1d1665fa52c69eaa4a4d4165caa413c8dddda18c46ba268d242795524a3a572a1209e3dcf082de827f67fc60a6fe14655f44112e2d423fa4a7a7a7a781522890566727c28484844ed754e250402995b6bec01651c4b4999d731ecd2a314441ad75464045ad9cf35dbecf48299d517634d0200df7d82e6746ca48dac6dd132aa56a7959c590c18aa1c2162376e34eee2e6a98dcd6defb31167be05d0169a7191194893b3b453bd1a88be294255aa67f7efaa74e5cb46a1d6b757e8ee2d1d1118f0d6cc97781422ddc0fa12854a58d8afbd12381522d05d53ffdb3b37362ad20573c424242a76b2a719b9090a6020b36b80cc93f2844d4f6de95d5b93bad137956568ce291b79a42a13805ca44216f014199d8132494c1a2222845b88bba8bba08fa937eb5aa1228cf8cfbf131f2a3907804a53c92432cf7e3f39450a81581197b2a0b10c67c9e7c188009646fe99bfdd290a5f653c25e8a29177e104db8a50c8792f0e043121daeb85c8643394c214a0e5b6c713dc3a11cace410585ef17db84c0e0bc0a0f2b344043d215822c1883b110cee0737d68fbd438e3f404151a863a610c5a2219e28397eacd2312e397e3c62d24d3a06b64eac6fb5c85aae3fb9d6dbb2c48a275472108417bd13054c729f00288b12749a275722c478a1c87a88221ab6d39bb5d7c27a99e822012690e2427cc1c33702b27ce9840980883145f69fdc0ebf44f400c4ab9f01405ce6f626a33f1422bb8d9560891225782277134d78c8fdaab832a5a007a2dc2ffbed09720248008403e46e7bed11e6df740c0660320d6f857800ba32ca00201df8f9d97c0dc728edf56c5d437bd3e2f8dcf8cbd3cb0f72c23af1757a89a1b74a1f44c99204bc4eaf135ff7a35004f296a9832f2a744ffeeeaffa1b7f15c6f1c9dcbbf14f611c8b51fe92277cb1a92b755d11986c2d1025306fcd2336248156f2fce01779fefc222cc2a293fe263b3c381d13bfb316b9c6fe1290ef12f0f7e1ad9af6226c48cb44988b16971271a2c88ca1422a8e4d361c77a29496893bdd9a3fe5933c3f2e015d3046893f3b47e4f919cd9a501c794a42f800d203ba5831c02a34c02a39d366a4d2c56cc628401bf37bec9478b89107978cb811a649a1411aeeeeb58a6b637c93de9973e28eb5e7f55baab8f659f45d3ee7e5aa96a7df82717c28be6979178ce3f22d8fb36a3279a8b8df94328fe818f8fefea921eee7b17cc2487c6e5cfe3e92d59f569835ffe54f1f032371f9fbac895932bc9cfe66f5f7577fdf318ecfcdcbaf56a49fff32f1f6a9476d7d657baeeb52f721e1c9f223a5f47bc04ce3e764d9cdc963f615d9d41d99b984db8a78636b26d086c7a3f6dc0547a22e31b9f38809d49e7fa988eb3f77603b56c69df945284852a8d3dfffbcda7d0d4bc2fd66b2ff0c74418f75cba594d29f784f7bae12c2e7b1d3c5709272b8d674ac95ecdf71b5444b9393524a49297734b759ea60a625ed6727b58eab126f4c39bbd2fc52a98379ced29ca552694e48dbc86ba524b9496dd3ea77a4abac9defc41bb48d48106fd0dfead67993f6b6979256da49129658d44d629157664cdb8cdc90e536f1772f893c000278c8edf066b062c48811e3693ce478c4781a0fb91d2cbc4da786b8290ec84c43ea010080b769fb36676f3302f0979311f017a6fb3ac3fc01baaff301a850acb1188b5648b8f5a9922530af04bc9225ffaa791666c9d71e661266495c9fd49e76c1bfb4e4568c699107a08dfab4c85fdea5d6f8ad00f3e5e9912591ecc4d6169d76b84536a80ab94c7cafa1f9e640b5a73e9172eb731e8036845ca631cbe6e3dfd87cce8f43f3369ff3f2afe99278962c2f1f1cafb9f054a88927991ab5e7cdbcc45c0daeebe3d31ab7004f8b5ee87787a4e6fb693a242f3c0ca6a7393e3e129a77e5a0a6a72d8fc445e3e7787faabd10d7d3bc90f8391e722c0dcbe07a9a6fc137f173bc4d6b341d7ce5f0c1c3c7f3f8c84120be7e3c90cbf878ffc8e3fd478d4197d6b380f7af402ed343c6cbb03264fc023adaa383d2e36dfa4747adb40bfe3c3a8aa5ab3adef2f7d1ddf81e98164db9f4b3ae2297892e212ae42da158cc6568116c99622f743e3735df0f4357e9538a2bc5725bc8dadb29d015e46fa3f0b752f85b218722056558abff0090b587f02b40d6303d35b92de428d33fdaab56af693b342a4489261697a9711766d1fe885914b36470d5602435487c6e6a3e3e121c9f9b1c4662962cf35090ac7260eb7af8a279e1b7b7b8e849f85bc57c8fe7f19fed817960cf8571667c78af807ffd37e32d214211ebf81dff4120977901c3606d0e5c835df81d1d92ee23bd0b2fd3198959720cd6d121f1b9899808129a8f114501187aeb856df016cdbb287dcdd5b12070bf723b6acc899acff1303c7cc5cff141e2e7c0416a1e065c836ddad5d938ed5c780d7aee0286f11483142940361917cbad31a6583183ac7d112f6bf8a63d9a0ebe9a0637ae40b9ab3d09e8606c01a6009f1ae2d678c8f5683dccdb74158a2fe0c030de3840cc00ff7db66180ff56d98601febbd98601feb3d98601dec610d7e55343dc97875c0f02fc01dea66374dfcd319e6289f1defe34c6e8687c6a88bb7d8cefe6541bb94cea6baa03c043ae0700b28c94759c94b2850ee68c7e0bdec2b7d0420b2db4d0829c2d74a54740c71da013c0c37401f81bdd5777b2bf8ceea3b197cea53340a70169a3d380acd11580003bdfeabe23315327dfdc0ed3a7ba153e4637e3bd8e0ea0a34ddaf317404799509e275c15be7b1add97fd8c0740f7d95fa19bd1cd50410515ba4c853f22b30a2f9f70fff1d7b772d364ad30333330ef7951e28fddaff036bec1fc6fc4f37fe476e00e66dcd9dc1d91f95d708df9e535ae061fe3a1bfd35b3f5a1483e6a3eb3b8646e3aa2f243ecd0be9773de45815cb109fe66fe2d3b8302d8a18d3ec5d62a71d6ed6d5f511db9b8843f311e7bc28a52b6fb2fdea55aa6f6e87eab528bf2199bed6c508e2a61e7274f55b979353d849106fac9eb47a1b5775f2a83dc7b24a7b3197a181f45ddf90ea188959327d2848228f0b479d4aa34eec893cb78b9bcd78c83d40857f813628fe8ed4ac3d7d9bdeb66dabdba6d1b79ac619b5276b4badb44afbb545ba74dcb774f75f4adf5529354a7bfe2b74f5a7f654565749299787dc8e186fd31ad8917d9496a1b11e29d91f75c4276b1e75442c4ba2ecbfd25c8646cb79b96a308eab06be68e2d37c90fe1c1889ebfb6930129f1bd7f723a9c1383e3734ef0a2317818224f61b8961e4ed69703c3a4a12c378f96c988623316f0fabe47844835b27628192a3636d9fe3735e345d0e8c43f3fd38396a3ad6f6350f5fae2ebeeb83f4d76017ee4792637b178e40de027af96cf885bce57508e882555c1b661d8979c39f03f2f6fe31a008b120fe0f04e40db39a0701b97d681efffae35f818864d1ea35d9913eeb52b4e3f1da6669160b8a05fdc45cfd43bf0ecafe15a80a6d350fc3bbbe6a30c0f041681e861c352e5bf32fbccf0d0cef7a97eb6bfec6f53544d9df65c5f52f609c266a18b091ebbf2672b5515bb1343922b743a5fa22bbb8b8bc26a994523e69f5392f8a3f898fc8acbd4a8686bfafdddf6d5bad581b6bdbb698f392aba71de965a77acd888b8cce48cc2eafc9cd3b9b21a7ea6ce65c6694f6bc012eef82593f5afee55bfec5c262b0d80e6c27467adb4222b5b4b4e029a53d9f3f4eb82fbffad9f3a43df7974db8dc7fb3c96d3275daf31aaaa6fd683f4e14f413e444d95740b43b22f34bce776bad75b57d173b9899f71ab3b4a7f99c170e4bc32c19e2f7df68f8a69f06e3e0e4bc5eb25bfdd619c1c92fafc5fa7a79c173a73d9f4c9870b9e7fef4a957f9bfe02f27bf3ca9a35d94a9b16e39a95149c82fa6928ef9649509935f748cc43ada933eda93f6adfd8879b4bcfdc9f17079d26fab6dd3569ab6518dd2af1aad9a46355ab7d73af9b5cb9e9e9ed4a9fea5f4b29bbfdd77e9be225bfe8e48c9ed30bdaa93a94ecaee04f32973a88e1be281274b2b51364b962c59b8477de0c2211e743227ad4059456211852a34a563b4f7af5374cc578406751234d1a45095a8b5ca2a128b1af0c5ca3010253adeb29ff36a1e6f59191df496693e1562e18978cbfeabf0383e37329ef5383e37335ec6af80717c6e567816308e106fd95fe155c0383e372afc0a18c7870a2c8c635f86fd19f86b1dd67f33d9b640215691eae14b064e52030cf6b2c15bd6c6164eaf695a96f9fb97b2d36b9d6b9f65ae95de3bedb36ccb62c9619a974a5a8caee5da18d7d97fe974e28bfed6f5803973a1af135f130688921615f6d8d6a62b3d682e65cb0b1dcad709b4ee76d952ba94dea20428a395db32ca75b9411608b143901049b20c878298c20de20a25a5321c0aa20a1810dd9a69f9bbb0ab65381444106e10440fa6bc77f541e46007d61350c5065b132ea416460cc109132c09e209265e7d0515b118d0910f464078b5cc92bb26c10b181a8c2a4c6c4d54f1814b77b7b497e1501026c85c864341e8d8285aa908f783b116e6196fd5f0f24f1de1c2dc79f52f5f917057f8b62787b8aa215c22af0f26bffff610f5a794cb94dbdff22e2f9f3e3c7a793ffa2298e2cbafbe39203188780d2f33e021edb9c3402a47a63f4c8653f883308359bddb76b7aa694fe238128944229148d5a6b3a5a863c67acb7d483b60bcf1f551d69ec4e15a4bb53ec7716fd325aed6da69bf55ad6ef5b3ac4a29bfd66a49373da09088eaad1ae538bbe734a56ac85f119752620a64ff7c64ff7464ff72a2e42f36f1973b9906ed4d3b19f5da0e74c91cdf25897bff2867aa8f452ba23b81563ff784e5a7c2f843bde9d46920c620bb0f7234e1191cedc59d2c6b2812630c09f7834635b3c809ca85434eb0e40f47c651331d7625ba952861ed45d243ce85fc87bb81ef3cde5ae2c2fcb90454ef3d1e93007c1566c9d0f2aad75e3a27922cf9313ee7a5ea58134391f1aa67c995fcd5cbcb11edc52a5489bc157fd59576b875891a5485727c55d1fdea11397e6d72aa3b1d93d97b2d0a9542a1506fd329d43dddd3e9747f76eed76432ddce89da8bffd2c197c9a7682fbe4a25b14f692f42ce855cba160938501008bdf5b13c76945f9a841da52c4151a9b0ff782b6afff90ed77d5e94a307e53825cb9dee73a31c9f4e588eef413008c74ccd9093a3ecd2fd65671d8aaaf10552e52ceea7b2437aec94723faf3b39925ef1dd7d27c7af3b95c765e0abeed49d6a946a17216d86f6e010e80b4802b514126ef6d75bb0a58afbd5e4964466a0e2ba6fee1b742cf3ad9c4fe7b4d635f739dda76b9a8d8e1af7d5eadff3f0f7a5145c7f9873b2b5ee3fb7bd226a298cfb41a38a575a935ca0c5f6600e8636c76391a023e86a018c31c832da20cb8844961f9f803275004b58552184ea832c3f8200caf8b00094f1bc257f35c4f521cb8730f660b3805db82461efc5b1bb5ba5a48a9bbd3f4e7bf159fd3959b3d6c6bb9b763e159b2691eaac94d64abb8d3a36955a3b73ed55388b1b4b7bf2b94eebbe3a64feec3687597b7a5b3a613961250c21ecc84a22d086fcbaa88b3a865231aa42710f8845c7b4152c1dc36adc45edc9875d53694f969cb85f17599b0d791b27e123d535979c0452465c9be1c377d8d16589d5b96b961fb37c5bdf87cb582b1461b03626622dfea62671476f2fcdd75c90b8dd134b68a3df8348ad92c26a72ce564b19126641d1fa1b6646fe4afe4319d803229f2d5e3082254339bce47b924a29e5bbcce07ef7aa5693b26c7b4e22e11bf06ba65df0f73c31eb07e9e7d4347c43f7a2d12ef8cb4cc230a6b16cdbf8cbf0863f7ffe64a5db9c73ce2a2463742270e8c6c1a390f2878843370e1edb7d07b27ec08fcb10b37e60160f2250a2fb0791c8fe3936b4071bc6ccf232e75022be01bf84b40bf03d4389ef9f93595074fe05a5f10ddd4b47bb005f66c8cd9c72f41bbabb0a0dd2b0d6d67804b404fdcfdd3d48a7889494524aa9a494c80ced4148832fba7577779719dcf8dfd3fab2d209a72d81c95f1e7b88b51ce14628a78765f9ba6fc4876b5156996d5764f85109f005cea46a918945710a9274283aff4a3dfc22fdd6bb30ab990ff2842011d1a4286e050461eebd1c076560bc75b91fd8ea871e63118fcef107dae837cda0d6da922b9632f44b85bd83927a130da0e792947ac83d404ae9567f84d22390b73a4a9938feb8c4e076f065b2569b11daf8823f04c84ecc85c4e44b2b75f165ea78c0d6fc28649065fada06639776401b13be206c22cf1b7419ba309fc4eda0cf040e726c98b73a02cdaea58aab0199b996235cf786b94c3721ba9d475307b3521733e0afc99ff9a5ef52f782adf9a66e284f29726000bd935dea9aa75bfd1cd73b52dc9c840eb42dc22ed920b103189b7b3bb635ea8acf9fda2a9fba9453ca39e79c73a374b5b2f61bc042a6614ae91edddd3d3b189a37a5fe8566d28989aefe0f4208614d951bdf45ca853253767777b1450930ce58757b963965145944d972dba6ec29b7715032afa836cb483fb85b86434e988cc0086931e9debb7a5586434060c99f47a4c4be6cabbba9e27657755301f10452ac2b00a20a8e1a98192924161b1d550841b259755bd14361a08a39606262828824b83b3142098b189c4f145c5c1145962054e130204d89179b557777a366ac5636dd405815b4d8acac94e0e70728bc8802b6f33a40d0153021a808e3490f5e2dc3a8020956a0ec07b6fe41134818422d016cb32b5486434004994af06332a932fdce5a3ecb5a7e7b185f483dca9eecb5b605cb2a6bcd6a4d0a75baa6f8a56ee394e4e8b02ca59430297f7cbafe7724e654ac401a51d6e2468225ae3cc932f770056e95e2d4cfceaabe5bf5db279fabb5662a9cfde41ea06599bde47a48a39ec191ea6a1ed51d5d3ff987b7aeb1642ebb92b3afdc8eb622ded08cba4a7ca1ade82b1dd33bb22759e3763496512e09f795f63a46c23cfbe96a956556c417e4bb7d2a3ba816a102a31b8b108190a1c8f0231350069662c878eee1cfd032abfa10fe918e21bd7d48811881608c318f0f23cc510fff676a3c18b7d15c2632015bf1a1b040c8b108392e016dc497d1c5e856de0ae2ba22edc55f754a7cb46ad26ad54cdd0c5a25d25e1cd29eed4edda953e2637fc9bf70da8528bb1257e24a1ce632fb3623c5ec6d3acb6cb0b22394f23b4bbc8117976e06c6c5e7deb417bf81b4179f02d046fc17d2797bde8aaf8a504edab4f1567c544475f0a57907a35c9b9af674cc9cf07beba5e5949ae4c54d456a8bba7ba676354b809001a9073795e1101029a8dd22c8dd3d04440eb75a4ffa16f9f388e8091ec78cc6831fb0c81f0cd296fc5065056730c0c6c75dfd0a190efdd044366538f48311f9f3888e38e2ba6438f48308f207e3e492321cfa210990b55acaaa367b497653d98bc54b15f2410a19463ee84065e443109dcf0f4f182cf02822c673c50b8f2858787ea0e201831e9e244e3c7c8e70d4c0ccf451d69ffdbe2b1de0cfe222343cd210ee4b864f8401850483ab65f844184ef2b76daa6c53cd78228b0d84d02c84f059e8326d2cdd29a514c2193d49bbd71a6bb50ea33c8af7f2643b4f00468e2fad04e3de192839cbf16d5c064e51a4032884c881135610a4b5a8646d1695390c99aa1908000100b314002020100c074442a1582c9aa8d2a83b14800c859c426e541689a44912a3280819638c31c410428001034066686858021684d07ffbf69ff339d0b0f82662a62b7659188f35a0fa185883212395e180831c51078504cc5288995f5a5fba19cee73b14d2ae8300e882142cd4fbf8dd1a5c90a0f654e9621f0b47411f0d1aeaf7057643f7a05bfd4e164062ff21f1a591ba7ebfafa22696169b8163d8ea37e551661192dbcdc3d197fc1e43a9df642962ad275fc187051409dc70babfe1431331382e20fe87b9eb3b4807c0fd33cc4c31b656da5ac07728d6419aa402e78b88494c217eb91dc9125fec7b595a0d3bc6dcd8638f546573725b95a6ccc45917b08ce8394f96ce50858d10af591885d419a63f17d6ad169a9eca77e8e7c6b3a87bc5ed6962d1c56ee1fab6b1c386ee6f6b0e430c3358052d573b97a2cee69e8f85480fd5758b279541d181ed7858f8ecf73e475b11528d5398d991a1447e29a4c837740e44f1030c1b6ac41ca5afbfa19c702f47e72a42a043211eb684c418a16d00e8271f8c4c39a49d90a794c58959f98e4c822d947255f4923cc50cf34de3eeb3c317dec8ff24a1a897160713acd8267cb9cf4222ad20938b36a973aebdf61b32c1466b126ad775c9c46231fed373222811547a2367f648708b6198b597756b279d8c7b9809b6d4586b79b0cb9969919439db7e66c2c466bf42c684ae499e4d9500f11243ba295476e6cc5404c3bbbbc2639873680050726943c9f4fb0713ee867e178c609d31625a70c1fff46dd3f555277ffd3c3b4166245c9566d5d5613b9a9a172bad4e22a1faefedfd473caff62e32990906a9d861dcc8ae0b306a5536619cbb6e0dea7ffa89d93fd045aba9e8b1258f8ab6ac7b97c5ee8455095c14f43ca761ab6ed8dcd41331371b47cb204cec828e081b01e413d6a1ee1e92d580b733730a5f08c093af953c18719958a923df586c480278772786d383cae7418d40934adafc1c3ec72ac6d2b2da480c0c5450a72e5d600637ff19e7d20ea3341d2a55a2c0e14dfdecd5200edd2de3cf775f4dacca009dc1b1130e1645aafb2d09c0632505c4c91cf5a58b0839f220a4970c274d50d1d99d015f60c3af26d3e1dbee73b4ce5ed46e007d828bfd4e1ad8a807685bd4ea26d9bd0c5b0f90593ae4c3db0c211fa84ca101755d809f90071b7897a52d94237364a110587940b67d53e5c9568860b04d5efd115c74a8d15615eaaa227794710197d764b8f7d3a721f40a55b5fb2def403c6725982313c719f2f732ecf4dfb2260f7016060652c92caaac43b59513f6562f00eb58397720d3a648204d398dfe0eee005d4d3c529656e547ba6ea9ed4d047d509eb3df98c103ab17380ee302291740ab18c0dd9a946b4e89ea80ce4fa694bc0babd79cd5729499ccb2baffd9d0a75ba15cc9f090290f8902a16a91bbf781a169911781ad094c75204df24f70dbd64290e2602158af485f0c8cd583ecb852041e3b2cbc7f16498c8aa444defe8e78d35eca733aff49fb6209242b31e943709b913c820af571bd0dfa0160b8878391fc5782f12220d2a956256e85dd1f14c96f1348cb887c1e2d5e428c3f0a84c01c9f603d5dd5423f57def3ad27b6072d207152b4646c27bed33ecb0ffe8e46f9644a77adf5cf3567461493af5145b0613be13a06265800b042cbe6a43dfbdd916f2161ed62985bb623433c295efbcd047e55c6f85fea0a16cba1d2730b37b035b9189f38b7a5c96a8f492136515fcf62b80f4433a9370015cf2cdc3ec10615b1cdba8668b54fc4d4e28ec2c830a341661c3b34f8f0ec4030dce81c1a16367a2bc8830a8571010b2bfa05cc950a1b95a392a9a2fe3fd59eb033002e8a86566c1c8eb09ad6aee98b58e9520d1542e820434e1e7648d2f6a5a0637a24d2783cd66c8fd08a109163c4ee7690273c7c5b79c084f433371a66f8532645aea7e9e4d5fab490877db3e34fd7f50254ecd85fc06dbce8084fd736706c0574ad4838c27a66baf80529d96d0bea056cdf1bf344fd4ffcce18eac3bd52fec4981777ae3c413dd1737f4fff3c2e19fad011c8804a353a595e6e54bb74beb5b7ce123cd599f9f2e5a1e4ed585080341aa5238a617284dce2cedbfc61f7594b6c39c30e3852385608edd1db58e5a15280651bee99d0b091aa7b1ffc651fdcd2cb4e79018b4dde6d85bc0c1ae792740802498ac432d25e5a7f441b3d6458c173307a417bb60421743e51f7f079e1d31fd931be531294d6ad13b51afab466d75854549263f198993f10e390d3df1910c8acff1c68307504f5d2a46f1cdb60e3144449daa179b93cb2dae1ab489f94cb7303cb2a2a33aa7a4e999d86b83d7a88912ed4731e796bed09178131880de195785880b015ea62f6801a66b322648800a58c0ab0f64a28193d501fe85587e3e959075161a5b82ebb56031f0325b4e3167a0ffc0262001763cad343eb390a9cb057d85df0434bfba48c8b57a8ed07e0b2991322d45dce9d708140937c865041cc4a34385eef970000b85c775d7245f199aadc08d0aaddceac0228afbb456e960a958d21ac986ca896633e0cc962b59eb31ac678bba78947ff9d17d977f0dba6ce9c50b2cb229ab2c997c143060e26aae6c74ef7404f6f1167e80bab028d7b6b3ebe0494f387200ec982502689503269e295aec26e52adb8dbaf0b0d9fec42f4f94a2c405a3b14aa3aa7191937d8a680463f43a1b10165f832036d48b0f26a8923ca5102238f678f410b8ab4c317fbf3e8bd0232e8e1ecdfdfa580e8070b8f3393f1507a944a925afb6983619207a757ced723f88fa49c8f9545d786c00e192584d6885b36ff1093efa9e9dd6bb8bbb04c2807f1048e4f514023fcbfc6d2846789703a648c3d485e38a7a26ee5474a88a8a997f4a1d84775885a88d7cf9ea4b43344e99fbb9dc3e7ba33acd49c72d9fc9953e96e1be518299b1818271aab6679f56a44ac143fc09a2174b8c1c3cb341b429e457d5d4e8f06ea1f8306f85e071b7c2e09c9557346824da176705c7e6afc3c4ceae39481d1fb6ab57d3b2b715b93a3aece246494c0d1f0ce0506229d5c71e24198760f76ad84d82a26113cf89424e2102a40dc14a05e61acc2d5d71b1b93b627f8d15c0e0337facf1f8e873a9c1fe8b7f95a3cb97697c9a141809edfee12f5de0331f11be0ac43fd1be00b36aa9c2f3525b8e60894654836be4f7793abbb35102fdd6b567dc48dfdb979bfcd0e2933e58c4917c5d307adf787eb2f38971d90b4813f18d9cf2803a7b33582f5cf1f161e736489865aabf4604e765194095383a444ab97ef904459741a42d1ff4b4cf1bda91fef6cb2a881feef5919cd5626e14edf267159e5a59301b690dce12a57080204de68f0f6cd44daf2f4ac124b55b614c1180f1417b66b2d715a5fcf58ba04a381b066603e4c64941111d47121f16bc194270c07a80fe5104e790f475a7c49104b75149a4387b26724614939a4d9ec08a9c3f417471f23891385fcd3623a1a90a384e3adaa3b71138440ec7f4138e0a970837b805ec13239a19fd45b384e7a56daa4e48483a01e85f355eb59cba0b9db1494b04b7b749cc43df2cc08eecbacf8d85c4c219a8edee56ef4ca1eecf484c26ff6b33c021fec6df18dc6cfe58d6820f9bb89d0eabae106e38304de1f93490698d380cedb3390b60e792fdc54708087dd56bb1b27f0c7cc22ad28bbe414f855e64ccc0896a6dd306123484f8fbc9047e961b129c0c843815777cbd7c7d95cc8c1c34578394e4c30d9d911c7ac1bd9975471735c63b98a74fde8dfc869934c9d3083a669a4e56ded6c09680abcfd08a776bec430ee5a410ee3f6fffe6add331ce6e9c77df770b67b8b8733e23879d410d8a33132338203225dd131b7f20b359fc6d1c804fafe0d615ec9a09d554cdd254712c388236d3869dd6801925ae4711066c656c0807a09bc9091b623df1376538a6b2f3e6dd791e458471f3974cfdc92e57de3e3c8abf50269120ff8f34a814780a0c1576188e04a54add1cafdfe24918c524e8930b4a4062db1c02d85e1d51c5f9492209084cf02350a20be9a31bbd899f78bb959890343ee178e0ddb5bfec93c066ada2680ad5d6914c867039c1d38f8f25d01d955616f32b3e1976e03e7647ca458197179110a1046df2987e9e7546e0566cbd4edb0362dffef3027866d806f74f6c81199dcbfc18efb20891135558262dd855626638823a185f4547c63a9848e389af3190020fa149abce8a3769d7f048506aa12a30d4ef7f9a536ae5fbd59cae774298e62154de566090a4db1dbd3b3b786198ef38d6bc4a298d374158cc11ed2089560e685537c7e9e572e74a822f6f0fe9f341cc5a437a5279d71b5083352fa13ec0441143f8d48d773e3a6791ec3fc8aa6262898a55232bc3197b8999ee8ea9cfe4e5f1a749e392f1738938c380fe96edbab8cae62c122bb1f77b5926412c8c08ad30f09ab69ecd7fce0ea946957f4143d86993b2dc8a710c5c3cd071cca5f11fe5d0493b30e4a60f5516fa8642c0a4c3e4625aecab4e77e9a0856b1089dc97c030a4e2717c9da6c9725ea4880fc2c04d7154432a368643e30f8a3ec98ed2c18897e65307258a5fa4014f6332784911e4eb8968927ab2cc2706d83b05e813d4dbe48dad8ea588b29f345e1da9a3b1859dcda7ef48ffdf86b14b587793be14f189a7c5dc0739299c6dc6192d227c78942b91364049e8c777ebe24db29076f1f852269c2eb95472cc9ca49e5f6ef48aa63043f4479b1cdeb0ca701a5e3fe2cbca07b94ecff4f5060e5a4e691aa70571d6201105b5854f16e132d3287af43b8044777bc6c57dc87ccda8756036ab6eef9f63c626456be600670b3c2083430907c326d345a052770e023338c5954612e5ffd10a28bd4a9c90543241bba2151e9785d8cdb3abf5ca93ed7dc35d2542b008475147eb7844f94c0c8652e6e4daebb23a05fba9f51642ccfcf6126778175fc156666e648db16cdce81fb2145a2ab11b40862d739b2609129bc68e2d124b973e812d6bc8906262098184d30cb70778a60859858a5c75b1eba7db4cd342b971de3cf40de5f2bf3e4259bccb5cae256f653affd45936045dca29b7b55d37ac48c429e5b2095a298bbc47de22873fe7613cf84a0a69b09b1710216fc88c2eee0ad4a8c7fab7e9a0e309e62bbac9a19ffb04c5ceec057724c8d92235569cda6604d569de45e97cbb28e7a88abb104f54a88c188d269752c5c8bc3a1c31c692923c21474b03ec35e91bf01ab9bbe774bb8abdca0ef6861963bc587af04e256f6c14a3d9a58d663bda3fb91373ac0b25b1e6254423c8a868bfe9610c1b770238d113acf5585bd8f7309455ae4a0b8a1c298b6ecd9734eac7db8ec3441aacfe2d2ebd8cc37479cada160905f0f104898777380f2c9fbedc84905b67e09a80491a985073e4649a17f61b19a73ccf769372d1e639a3f238d1d115cec693c1d7424c087547efb68931092bcf06ba64a9b76a92e364e345959c09c4e0021a4b88ba7983c3f2ce22d1f741455e08b7c784d8c412678523c291c7fef4d203f62d2b7fac4d522a6319ab1cb01d3f0fdacf08361d805be89ae34d5c6d07e4384cef9f8991b04feac540dadd497d00a29b24db4131f6c628c087a3dfccd33fbe34da0c42607042344f7c3e1739b6becbcfa07a717467f0cda120f1297249587454dc4c9cc0d5ef0cafb748817dd0569feedb79a601697fca14ecdad3437f2094364fe7a18fa806f19e751a9f3b591712492bc902987e23d68ad7fd04bac9267e30f1f4d75c3b523caa6582540e12fb7ea7a3064ab4190ded0c43123a338bdac8e3dd84c0d49e3cc1cc7c2f667e0498567844c65e1dd5b5c55f39e35ef85625fbc0f4d199112e9e0013d84f7c5aa93a52cc21f5588ad25487fd1c445806e4b1e1727ab95cf6a8782e2a55c055d8b8af0a018a6410918d5860cd226afec150e5c3c9fd37e332d394b56967191320f533b3197eca64138b3a72028f2052117ba6084626103032d242d9b25f837a14ffead69e9410c290883612c3e5d53c07996fce7c8e447324f0caeba3734d771bea7e10bde25d1f4910d91d24f7d906846c2f0a71f3a493e5a4edea766ab2318086c69073f58eda07080564daa1e067f235a9333d7b9fff0ac82ca3df085bc7fdc3c0aa09a914402292e2971850d17efc6a793bdf0099e2d32808ebb2bc8ea35c464f54221240e048a97aeefac10d1e55d6ef1e510a3b09633f62a20518765f3e56242d4810954efe9422cc64057131b03b463b1fbd07e91a673952914e2a35a009884a0e814e7236d600a0ca3c36d3f0f736b9d3a75836b0e962efe22cb3921beb86f755118d48d49819d70b317d2e7ffc446bc541adbc4be1f1861f57c79c222469735e57e413686d6006b8b8a826c477db634a78d08525df0360558fa38eeae53712175d13345ed900e7abaf1f45950b04710d18e0c07cd621cc707579127430753a0bed13b4c0e4f20caae5c35bcc0fcc2afd6419568d2713e76dd172fd99e49eb0efc543e46610bc816f136e616ef9eb91ac2432de8488b5668b02d9c57004318ed2aa3dd2c02127e04b02aee509c8054ac13c0eb601b85e082c86c8b91ae983b18f41369b9e211db7ae6d1b317a5460a22d02b27400a1e129ed5c417820df1f71c7897ba1ad9c8916f945e6b5405e9121be2a607d51fc1a5e54924cd9909ea982371ffc711080d760904e7ef53090f15929b423400f3ffc2cdd96714f9f0577ef0ae0571882b276cbd44f9850595e13b07c0741e0a52e5a98971851cf4565d856a00212bba3bc5baacc2df94fb7824d52cba0cc8ab242192f026bb219a24d06637a6a46f6f1835017487fbb1dd200096ab40ac46068f52bb5c1b74680dfe5d9ef9ed6fd392841d98c57930004a9d9d997713804359b0dbfb940f8465c43caf13e5e90fbf9ac5e84cab551c2eff2379aa7edb4fa06f26a9a225ccecf45cdd24aeecc40141512f5ef9fe355cf80d4f48accc77e3c0d18808a0980b9e5bf3e25fe7eae7219992e5d2c69622c8ceb48890048d2493d652ae15062689d5c49f52d69031015276dc9ae2385dc5e22b197d1b222359361581f551e1d8128c9f32888edbbd6ec509a4fbc0715dc350444da1fb105621c2abcb0856d29776918e18fb59360c2d900ea90ffc372f3a66f324f5dcb353203969e31868204878d66a3d7c813313bc812d9becd7c904f6f6bb2ed3bfd273c590f4ee1f27cdab641b9f4c2faa2ccb092c043666bf1542a9311a4d5e49ffecdf8c7c3933dbeb47f860b6ab25b3309549a9ac722fe8c1dd005aeb2f87b6dd0cd2030116a8772612961d46ea1408f7adbcd2e2b613bef127c1a13f7d2c99310d9153ce37176293c7609cfb6058b37d7bc1492d973e32fa357bfef2d32e0167266d5e9d261ef57a63232884a2826599695f55ad6129895e49aa778b48512a8d2b139ae88e8957e63c335ebe9008fb504a7800f1fd54418a25dfa2d9319dc0cd47f66bb4af40ecb7efef9b1067635bd339e85ab1d4411cf74811ac527e77ce712ca2f1761235660c64d0403e1080eebdae6d111c743a181f7fe91478871ddae9b5f1096b32481e53a2bc974dcc140e92d1bd56b02c26ad92c00dbd7739b678fcdb526315d3778803bc0b1913c595974a6cd076066b1d1088fec6d4b530406e1e664d7210b2c502bb96125f8b8fcd8bd41450df3357b97296c293df9c10446a326ac340863ffad012fdcebedbc8fafc6e35af4fa5b24b4d644d8ef2c8389d6569b42e44b077ac1dd8bcbe90ab8ca574661c9010fecca5703b9636021223aeb914f1493f11df7c374fd8312aedbdf2e73c76bf51cfe43d33b3e64df239ca8dba710a9c7e8c35de2d2518cc0868f778e3d1701ad2f838ccf7137cddc69f3a88c06948cc055ae93df9b9d2ebaecd1e18d71b426f5884d0b093d56f498dcdb0e0c6eea8708c663f3e24823f7d8d1be27c105a0ac1d02854dd24a9342cdcf624b9f7f2a3fd2eb98c71ec63e2b4929aeda57c808c3d6eab507f4bc0c23a377c070dbbb2607d86a572aa884a2531da8efd069ae2d4ab74feef588696ee58c98d865f245298655fb00fbb63169470bdc091fa20b2bfcbd02e7e12111ebe2191cdcd991355c7a7b0e8656ea129adbb4e1838ea0b8a917f147761ca9c9329428ad5da1fd5f40002b7a79d1dc6968de16e2a0d4157eb987a7d1aba2899219602dc06e1da744daa933c0a2667a52ba765508279f8902b1c76bea25a475046e5462d8e22eede409ec5bde4f55b12925c7ae20c56a472f34aa8ef667f9826fc32f53392fa70dbb8baa41c51e79abbb76f2b7bb375e07f5e994ffcd4be9b2ba2b41da6046ed0162851b1d747654511c38aaeb72c85c61a5e6356175db0bfec23c68a25e09258ac36d0fa9690290b6126d801ec52665e857c431ac7d06f3d8de94dc021cc761b91ccd8c2802867fb572464bed2c6c331849d18af7586a3b277a1509de09a882ec4527709a3acf2ed32773e659a11ef9d8c2fcf0c8067d6d9b47022feebe862ad8abeddca3e48f82b6a52ebfa8a47836792715ab2529675765a6643c4f77e0af513e6c529197d1e515ed0d90fb577077e772332c6c10072083fd2bfb704a9ee27c5aeb4f2e30aa63aa75b6f1fdffdd8dd33ae2e2921aee980a6e59bd7a0f4c60998ea549ddfd3b2f0598575f9b0e75b8474637924c3356fe16ea1e1640fc6f1e0702697bd91c9a3cc323ab5016e97724e6f810f0e740e864b5dcb2d72529f5bb94e603506f25b6c65070f584337081c3ae2abab7224382b8b8ebda04b1698409b9041811128aa06c69f5622d010e84c962ac6c0214808740086e0b309020d019009331ebe9a3656bf6e68b28c87be990e0578c0095f982d36893a81948c609783512909ec9fb7fd03c490254727133f8cee5a277a1fe5b4344d74762a633ed648c7de943b142908afde963115f1cd4b0e2c94ada0815fcb251fc30023250474644eb0da4d4f2a1fdaf570bdff5c66b472ee3b6f2a2f4ae3e91b95f1373fc4cd3870dd94f5b135d8cac30d76cd82749ab0b162128a407a7af17d8bcce16ad8c55169fa65f37af807dcf4f3d1df010ae1e3e1e56b132524895381e4cd0fb04c2e91d25a86b73dc7bcc780b328c2b1dfd2435fd82b798701d2535c53d9e7399260cb148d749119477de9316609a08b8ebc840448f27041a7a5b8cd35a9fe6bf3feb72e6e7733d7e8844cef570dc769c9706ba0b7ddb212812003649ead10cce5feb57ae705588cb6493376560ea5b4cd0e73b0b12b83ae1ea0ed7033fbc5171207d31ac30a181f86d0359dbcf9d71359ae6e1b580ed2ff4d842ec5215a5c7f731ad3aa9490ce1059224e5b6f79efbd3d1a4bbe32c659efa504994d3ffa97d120464f3b3320661dcaf9716fc8ba372da304c1ff49b04293921bcca004311953e62b53981957e18b585538cfb65718e9831606e19b3a4f343a4db1a455160d40596ed0c82c208a3539bb0a45822b76c25934f0011a85a27ca6734afbb3959d14d02ea07f7672cef58948dc50b06d412d2b375f204c0eee296602da7ee876e601f34952d06172c4678caf9dd5184ef7ac5140bbfab8179bf0c02cc8b955728ee8d0f17fd85bd2c8599029b5e913cf19a6a77a2128ee2232043355e5479727d570493951a0a2ff83600218023a1290322c5eb3df20bb4b582c8060f371c3d63b3823e1990ddfbf00050022e90e9f72cf13567fbec48d90648611262a4c24bb91743b3b4f79f75583ad87ce45f4e2b7aa9faa54e79ddcdcc5939f5fe442284c8df883257ad142a84a4f9db78f25b140ace7ac0eaaf00c851ea2349ba1c472029a6f443f261f6a9732e5d995bdf3e73a6fefea082af1932cf6549eb3606ea93cf14c2cce196512ec4762296a5070dea132f82421687d098e57b2f9667fddae7be42f989ab86c3ade6390749f5b69094102b5d6d1122e7fa6d3e34c0b4eec730aaf51f6632ddde01fc27f290ca6c76a5c78f06034396cd48d02452588ca54111a6b384dae8c28c9350ded36a80a9878aab627ab3a413faf3d0985a2fbc524e1308b3ca96d7d229e2654eadd1592e061ee1996b341ed9f92b36b6c125adeb9cb9c26c8df28b8ca3c94a82e818041e19db2f1a669b6b6c7ff0af402d3fbff0daa36af2257d8e5928c3ba893b78d104cbfb2d19d0245e01595f73766ead30a95012437b5f1702bf23e9215f216fa58acc00e7b560854ae566befc7ac4ea335e605f33e807984c7b8cdf7a5e79f47a2112302312dbebca35ce816e26e68f2c226ebcf45e2e488c689fa27fc2723125f6c43c603d28a4e37ad365f0ae9b4ed7f3b994e15624db774fc384ed244f9e169c757ed0c43d90dbce32b615cb40b2d5345666dc789cb76a84a3b1839acbeb4045853ee06e7d82070e84ff3834f47efa3899029297e2594994c6710ee588674f26e35ef94e7aa4a8579c1bb6ce8b63a0b1159a84025f30a5ac71339562cbadb6375b68bc1b1f4fca5856649d076fa9ffe16676f5d7b2f22630eff1354231c6ad38824ed167e3d1a6496ecc1516e3e5144fe1df193b2f0d3112301b1cc995ebae00c7019443914be3b0473d0e2aba3d4f384ffc6a6e5c9cf986bd57358e3caffac5a830f3a40db95546c01b8200952146bb312ac3b424fbad7181f2501bd331fdf7df198742da5482c53be7d9b0991f612ece0725d8ca218da1ccb87ab84b573ea056e847c45c8f8e60714cf97ede5df506d8de73ab8d873867cf744b44c979887166b96b93acc50b9fe453e85f15d49a7442aca99f2fcdd8dea3a8bbfc97c56fd8104fe678b69cdf3fcaeb9784d6a5a5d1392b033f1fd97c2513e1b73237dbf8d32fd92dcc160403b83c7347ee0a97d4ca993846f9ad1945dd883df72b47f1dbc7e31d54ac8ca41f9841c4fc0426e59622628a6609b46b019f09179d5ff654135e4fbcff2538f3dc220b91022a6faf397c8295dd0109ce0ec6455a47a36e8892e8b145ed9774dbe15cfd468dbbf1e490d4da7732cc6dd99f8f135a63fc2208cd2eab37b6300588c9ee5640ef48c34ced1644887a4eca2f2d5815e01dd84b84c082c590a718c16d0be74d488272c6f357a13e8f6a6145dc5d6a3b61464d350814bdaefed19f8384b85129d95fff08c1e81dc5e1a4162ff8347151850058962e30343c55ceceefb7b5e2a0c67d0de5e92b4c19e587ae22e92832d7d71a901d7dd9abf59890036eb086cc5a879d0a9910b08f9d55a58587999dca1864032134434c55240c0576fed54a250a9d9363615e79fe3c9299ef0399279dfe81cafd1fea581dca5c9a04b25c56dc301ee48b98b245842ba5dacf830a490adac1818d0ad649a61e3a867983808e0b8b87ee27cfd4161c09310435b50cfae5fcd49e7055bad075f4b49dbc8b70ac08253b77740e21068bfee727fd192c5a630d460e13fc8bb4d1017563289ac6ac3f53d5e06d1c2ff8f02ee7f2a9e71a492dae3c1392fb8ebdc09c114d9982d41afb3258e9cddead04f8fb42fc9d64b054a5d4164264d6325865cbda8fffe63270f4e1ed5524860bec457aebec36682518541d9e80d8f44fbdf9f562a3d59b1f5e0439a599fd3360e214d0d04f7867dd25f2ba80176e07f96b56ae01310622f751d96b1fcb7b75965a2beb10706ca10be0869e73b8adc490fde2a69d8514e1ca1ba349686aa5f2365bc1736de0f0c185c4bdeaa37b8e00158472bec35e344b2258e98e2615afa2e3aab6da819a2d48e39e19314dbb0a51cdcf295b20b283e41c492284c1f8c047dce7682b5c597446164708d0c3b035072f080442c238880e2df90aec3e5628a4ee932de6f28baadc81f00485c6c5500230d5110fee9987c27dd4e663fd8b50041ed4f1e5e0fad0c4c5144ee87101df5d188ed3fe86714097dc157b68cbc4e5d17afb14f20101e6bf50a63b142720b05ee24fabae9a4f49cfe1d0b207a6f60644a900b5b960f7d421eb111130631a21cdc0dc41c87328489d9fe5d70d999d3ccf3228aeb3ab6e08966a63e922a2450a9e740b58f0d6ec19178180e2e905620cc134ceba665d47439b46b5ef5f2fc04817f49bea8462d8108d96a06d1c0b2206d963a1f08ae8f6a7317165d085502e2f2703b20ad1cd05ec5c262f683fe410eb090935e6f5522bbe3609f58718f377f8c7e650892590dcdde690a246e6f47d9a417832b20843a16b3eeb32809b0af8a4c64bdb436d3d9282fedd4cbda08be69fa43019c3a2c7acf5483f8a66e80faf785ed0b936a10c3bb2ffae976b91eb7e6c7583e710fc9dc3b2c78e67522fe6a0bfcf9a0e6cf7eaf503d3d8926ebb09e274184f56ca77779c76841387cdc14c67748d4a8364aa8683681ddca2f0a2cdbcc060286cc5103c0a258a29457bb53ed0b4371722635c6c8307b435f473be51853183e07b581f3cf55343bbd5f1ec76a08b3b9589f7a8e6a969db01c1f71329767a2ea6264f627b200ceb560b34e43aded5eb629d7d55e853dc09105207698b0dd6dfb1ba1e5a1b17b051d2ed69a0a61c7cd710a6db6f868f76f68d12dd3588ceb5b80412826e507457f1cf90dd64572d26037015da078c7161ce1050cd742c171e3fd1d37c65e8a51c6035fc46c333f446464014b425b3749a038fce1a0682441db7aa17ef0e00073d1ed980128f03d5609709ff23f26798a1b05d21ca7b4fce6b6e95cd950fdd24817151f985bfc28ff11cb727561ffeab69be56ea757e67ef3107d3b0ca61e17081542950b2070434586cbeec0e2d534c45b3ad4052f99c0c2ad33e2aaa98800671dd84eca9c1335307c567e3951ee23274e5905a137e747d4cee4eef170151df534fc4dc50a5b8d5e798df4bfd6bc0b45bc40c96fcd4bb8f01180139fe39fdcb10132ab20482cfe6340b5f000f986a586638c4f8b7e625cf24a6b98ea3d8a76ecead605b954b9d624a386b0f14a4e7d15c90eb90e85f489635bd32d33d0685b8225f9dbf8214675fce63d1775e7c366956de54b84e682e999ea061f2ba7528391e1e7e4db5e6e28aee1c635d7e70c75c4d94ec14e63b89e3703776e951f12593fdf746ca95fda80786bf0b31804acf0ca2cc61bd8fb2e1e06ffb86018c2ab088a2913d02f90bafd9fad0d2e424bfae313318b0883756a340418a1a2aa0986258fb7da1f81064eda44f247baeaf2624075171620433a572c73860545996826ca6217fbc0a7c648c9273414cfaafed464d94ebfa8ec84d57c656af453d832f0912ed64efec67a21fb4e570479cbb1db412864ed90eabf330d541ec168b096eaceb4ca1fb6a43f666a1d55258b5b75a4b97e2595be4b713c22cf54b512bcb02e984f12217644850d7527302b42d3de13a11075b0c3614ac29781e259b6a7642bddaafb86e571315c1e1e6863fb8e34ad4f6d1bc861251fb559b2191f3fca762bfcb33dd5f1e7dc92d2f100dca65f65fa6b9904040fa1e8313a5cc5e4d2581caf8f6267107b099933f970f732dd79193ff3db54557298c93cbb5606a64ae5166a433ceeebcfd7f68d08cf81441743b8860a50cd76ea9ca4e30fa64dbbd6d3066fc9e668306640a16618247c306af3c99a8121049edd805435924466b48019006d55e749bed0f41d13191cc517fe9624b56d2625d339c853587b6447b93e4447566de559437c69e84a4bff20f907ddb7bbed54915a03aa769a8582db3d256093e7ebb98840617683427963fb4dad3814ac1c04cf1f60783a45ef80ea3aa82f998e698e33b1d91acfc5f309e8e462989096c8779f2011454a6a7a2730de557fbc6cc298fcfd903cb1f9de8e46f328821862613f933c3bc38fbebec48ff3463fdc364c6fe7833196767681f4f730188db5058d2507b18534dab753e80ab7aad1316613dbb7c0c78e03f093f6a59ed0467e4122c670ebad82c9a6de06e2f85a962a420d2532d27cabef1947593d516d046f9481458fbad6473ee068199c42e228823ea3263021224789562e7b5aa26e4c47dd21f529969aaa03a1bd2416de87e4bf6a7d0aa6112827ab887e7697c15db0930e3972fc78374bb855bbab55d4de574f36d421554e9e9a2c8d1c3edaac9ff67d1e143d809791cac7746b7ab234af7b834d042e08d5896737e5d44535c51b969ebc5a11d5bd2ce180bffb923f077c859657439bb759dd34feee5c773deb117c6eaa0deb7076bb387b9ba7cf15bea24da17b26432970ccc3af99a4a5859a9f577dd8d522bb011fb48a808bd62b425e47e273fb91fdec8d08216d0710c4b3f939366fd44af93d420ca3a395a8797c1ea6dfd44c1d7933397aaa466bbb1b0a63e504e9e209c022be74c9d20884818c403ebbee54506c0cb00f0ad36a88add71bd79be186c2596e811d1ad4bed608fc17a44c4409a74c35abceba812dd6f299bfb6b043f24f40060a794472c474641be18455bc51cd74bc152544680c07d952d0cb7502f7268ef4a8e24ef85817635f4dcdf86768e1ef7e86e0bb1132f74e907d414c1713696e351767cf46e9a532e43d07b15717fcc3969b2352ac7311dfd3b018129f27596819214093a293429886c17806c6f7868856d3194777863075df9d1cd7b9fb72856cbdd4416ee7995eb1f3c79224645a4cc9ae57242b04cafeac4ca7341602997199918901763e6d3c3205e3c0e059a0eff38f88f490c63becb3d26b688b43f98a12752d63d8f8c4ba133c5b2e626f90320925538455fe0f82d20b4ae126063bcacf7f57971b7483fc9f7a9c5d3722221c0798c5034450a1be1535d9cb89e9a85236b00da4704f705a4d2ff84635902d668d180f36d81b73e2df1a26aa9422a17a800e566d113bb9ee721be701ce17ad341710dcf9f79ee43ffef6e1d2448b2b3b42c314da19978934c9f6db03556ca2a88ffb5facd047c07a2b0495fb030d4942ed008d948790d97c358b36e83aa1f5cd453319714e988a986044cdcae3733881180c1c4b56da9912c71cad790bd0f55e38c994c52b8a57cc1945252122e4180a5af83a05f40946474057fa1e254f2cd95fc22397ed86c57100416dc3c34f5f116f2341f1022a6e5765d182ac30a56e35210628c2bf9e26e419579925faef090563ea468ddcefcb7bdc3dc431ae3c5441e49508257701cc2614adf2b42f9671a29fa41912163951cc5324ef76138a12485de2db0945d3abb5ba971a7695138a02a5534d5ffbe0c5188c1462747e9b7118622b15c8c5601831dc9f7c22e5b1d7c0d30271a2ef466b522773365e7d7c368d39c6f59d2d1b405687262588efecbc7d98dbae6b6189462aefbd9049d5e5ad4045931fdedf1ffdffeaeed64fa8c3fb57ab4db3ba850a4f871fbbbd5a83d042ff306cc2af1a0526f23cb2cff52f993376549e2ff314e51d29ccb49da33a8fe7761b9300cc0baa122156f9a98a05a3d1d99071a161f3ede40ab26b64a09ed75bede89033b13caa0bd06aa17c6897658126e6839002a0553db49ff6228a7a31a27ef33457b98a3039251f4f6e18a9130a66216c20158a6553c061169f421c2a189c513246cab79ea9b3d856207eaf1a1047e37853ff80c60d06687e48674710969a18917c127b21314f1490db87ee8e8586d6f8e8ed9bed5e398d8d0a7f1ff2247e3e297adf0142af0c1def2e1301db8e7e737da84897b0e6bae910025ada1b9ffe7042d2f1732193aa526ef6ef024a6ae5f3ec1464d3431254834c03a2baf63222232099328f79e336a4a9299604de5e272461f45d4c3bb4c4c4e6701fa23110e8196adbec07099ecaeb435a0243496907cbc68eb6cfe468193e4dba7f97b5f62baf009f82bcfbee1e0394547f2c7e6da73a7db4e6d96416cb452365c5f717de91a234f036b57131435b5a4b3dc80a5afdb1a71678ed05d217871eb386766b33b4f99917125c6287a710f916e3d274d45c7a65d92695d50d4422d9d0a4186e8c63185a48e201f9d11d683755444190901055274860a9f113a0d4451056698e75688d758227eab2dd38231737760738c090464c9689ad71364c836c20d03d886b1d5c07266ffc5e58d60f2fee0b9d0b9eba554325ef7695ed14a0b0fec3bc771543468cf81b9be9136574bcccfe35e3da06f5e09f8efa420285d01626901ab4948b5acad0d9101ba899a268a896a9477c0737e18089097505de104c79b88d9ac8697b0b6798229b48567f6c6a0778fd2710a89143483062dff302cedb599a2ae2ce2ad3a484338e71f2cae157f15e0297c540dd1cb5b39e29afaf66e069b8f1e4d00d8165be2dd3700f46d3ee068221edf4a31e6db3fe997afdfbf58d0f2bc4ebb8f766e360f02535c3b79b47a078b74f1d3465559a75be656cf0ecd844fdff40a87a7dbaaae9478187154c85533c69fbb5e55065552cfc6c2e24e672a1d939fa43c578fedf8451ae0efc1b14f1187f2f6c1c5f31eb2b931b17653f058f2dd3eabee27ab754f29820b2e2b2a1b10b2aa162d5609c3dd80a9a07266a48c872e8f7424edfa608a8bf5a34cf1e1dcef5782daa9fa4f630ce3d4fbdd0be424c3a3ef27ac455ee53cc1a5a27c3caf71f9946545bfd2a9beacf58541eea794da8a1f987f26d2044fbc8c6a99ee3f4557b716fe9f2b68af04717c6b4ef30607cd83cdce838177212f0678643969c79b8f6876df68b9995ed3a212249dea28509befeacaa13766020d2027876d54acf779c7e8e0f77a9d592a39ba614002ea483887d51b90e2ce97c592d282efc7582c956a38c1a364d276a19543ff07d8107f5d7233b2b06462d99157e2b6032d0b1d4abe4c30a4300773b99845fa7937cb088febae9763b670d70da7325e6d84b1864740caadea75c414cf1c6d608177f3d866447d5d49f691e9d15a488421d7e01ee4efd0c02dbbddb28fad06b9c4ff6078cb29d7ec55f42eebe0cbbd0a4f088945b557a0f90a6e3840155a38ebbe95748e613909669d2e7bf161a55d82e0ae34fc1eb94335c558b3de3674151158c6aafaf1e509d90445304f74ca9dd216f2c835745da5d5c0a21ac13088f20d8cf0503c6a64071863d0b3d290b36cea7d37d88c895f505e7c2957607d6907b1dbdd4eeb3813c751f21e7e936bfbf3b30fe1be0d87ed5ef553bb210385b2db2e78c291be48b5628efb90ca00881622f7cf135eff90fc7c65a4964c52dfcec4a1ed10dd87b666512acc44f94e41ae764eedd34676b8c79a1f99fa289090afe073eb9f69b8a8f13d7e1629b5060f3549af44f2956a49234a72d5cf42b6ed2f9b01f0bc93dceffcfb0da82e479aa0f76f0612ce7947485f9926f625d691ee504014a58f3f9d7bc7b99d6aad378bc992d470ee19f2c5172170169d84ac93d6a40262aff5fc03c708dc1d26518470bbff9f5ccd16cf0f9f3e76aa227a67713ba23a29aa46ea4fb67a64f272162278228979b7e0f21e753bcd27119c94ba7a68975309ad3a7d7836a77088737b4507c5773fb85fcf33e16c6f019cfa0f04ead496aab237d5201ebd924d6123b1f0be80151a61f11a1d98380e28f6ba2b785879c4d8ee526615c076bd3990e45470fa91f36eb3230601e91872c6a4d606a77915334a3b8c3f82a52bc305b688e689990b505c6fe0d8d2dee012683001be8c6183d0a39292b271732819c9575a4c95c42ee33a960a12e9d643e1ec1682887d08e38a898037b1d40ee3fdbd2a237601444a5d59ac3df541c8df4952d370419a81b02db0b11f0f338d0f6e341a74d46d705e255bde94c805efff1d446c05409eaef74a0775e0d994b3fdacf94cf917a567d10801024ccf90fa5081734553b0fa143cd6df05854e2074ec60fc272af1f1d8b9205f148ad34ced3add829e399899b4051f7fb8c812fbb0a2bc3a89ea056ceba329b279a157f23339dd6f94451986f205b536b3f708979976fd59e49e12222484feb550d775a04bf8f075202f0e48486bb665cf13d5af3c6b2faca999f0d00e8cea6085795a532e858563ef4cb50806487c4da8cce70e0904cf576051084cf2d96acc17207055915c90cdf6225c9394c7e578078dd5e414597522e6e0d30be9a7914752ed86b68f4c91cd83cd0d76d4e0a750d2b6d62965b4849ed7f4293aa5cdcaffa6762903ab8edd3e64d687a34c55414dfa0e5c1d354be5d8fb7627a96a1223a82503d1da41336c81b86991a15d808d65eee1433ff676c2eed18167e81207a5d28b114993258e1bd45b8a630f18c9c60393e12e7bdf8784e41557ef67bab45783131ed6b5603854f5429353c271ec7924b9f1cbe9729cff5be03e10254ce4bd7142263bae13d4ddb1ff585dbb360c9d526223fe929018d037f88db701f7cf10741913b46c536f9c9b0668557b4736c23c7beb2196c03a2c4cd03fb635b4450840d2c83be7e3026f03fcd1b524bab188ac8d07a2f1b1f570ff19ca81cf72b83fc3440696d4646271826079f0b35ee474bd19975b77e596d310298e87943b6eb01a0abb97c4215ed69bbbbc2453a558e1587afa952696c98af1824e518848f49a17ca7b105e8f2101bf7eb134222514358525e1f26703557d7afb6264422b08a8a204c2458820e1bcb2f31525abb2ac037da4ee576c9e4904278fdf0a5a9f8d5880ee2af60e6bfb24d2a3085e2cd5516adf2f6c299860cf270a3099e2f6d67f1dc8e9c4430ebf9541dc97ce1817e13118b93da74052cc2d8152468da02b6bed0db0487e2b81bda9e06bd2cd02bebc9e53b1f755e4b3e064946c92bc4bcf0639d3cada82f4d75c1b3177d769808d7c782a68af63994408be23a2008662b90f1a7f2ec5b7820145bb0e2b350cdfbae443bbe4ed3ee97eebf759d1744d35a015b0f6fcc3a3f8b62c3dbe78c76633f83c4b4fc97d0d17a442a96560f7d902ae6b65b5cc00cb0cc700533c82f2381368fed0b470dc906dc410d87661a84b6ab67433a0c9fb119be1b9b762e656c93e8d27f218156a64947d681d81c70135dde3153c64254660961dd65ca3796b9121093ec9fd471b1711223d74200ef2cf026bc1c728cb0a94fc35c8ad0853d54bfc8230a2808d5205409d488193aed18ab25ad2978db266d140bc28c8b88e130f65ba5fda23af4f5d4502ae558f19d5cbf135afd4ef89190ee272789f77ce31aee7f9e2cff0814b76df87bae2d70d904197e5707a7964ad69aa51f8a0cffb304dde21a29f9e3b0356124a271fca40c32bf592b227090211e4af97f0de5cdf9a67b377d7a5afc8145e625a213151a640016e6e4c8c5110c4dd1bb0aa6ef18390c7c0ba36800baba403170cd9133145e243862ec53dafaa9ac14546909d3a0135cfe038cf118af139857176b822aedee9f0489390c5ab6bfae2b840b6cd1b283741ced0babb1e84dac53056c3d9ce65140215d928c2e48cc6ede17e6cb5dc2302b14b28072c2cf0b037b9259a0160b77563ed525b3497448ec80df54e332bc66fd42aca8cc8eaccdf05c8b9d8538b4584f5e23b11ff0ed39ea0a866e4fc7a1624134ba1d3e57a981ed38c8cb2b04436cb17943269fd3055408fa3ea08a60b05bbba12ec58aaf1969fb8fc5d9ddcd55cb5c3467ba0fc0da7ff31880d7386cd2f3ad5c96b7e1e919c8fb3bc650ef2689e7827c633145ac0332f43be311901c1e9ee53058c74524fc95db861f49582f84a5b7cf6ff80e80f220379559a8459e0688c5e9c2e1d9b68ff1ebc4c6c61fe7889b93aa89b43228e73a9510c97d3051341d21ecc28c0e8e84242f9ddb8d74a7ce123f25c54b50c3d5a661b56a61a1b0cea64434163fe2ceb3c14189e319e3b506c3400a6f8053e80fdf5d067d3070bc37e9193e24beff605d9abd2f04dfb2cffa893f82f3d8c3ca77ccc0389c4603218980c0f13b4fdbf241969515aa2ecc5b0dcaea98a0ce61cb17f69601fdbeb29d38db17bc78ba8c099e97e634196adf9b98dab360627956ee5d10865af92ee18da4126646dd2cf97fede744bf2fe31c79e50d1ac46f5be1b417075cd25e45d71171e22d8c4f376f308d338fa015395b9a8e8fe979fa7800b48731129e2e3474a7280c3490d21123d811f65c64cdbb1bc071b95956a3e7b4013e182499aee91d76b88be8d4ee0843ffd05e6975afb6a7497e754a1802d0479c61cdd76430219ea0b079dfe750b8aab4c272a1823cbcd58781f44d760474760f554e60f2333845aa45952bf12027617f229482c9b66f8222538b5771eca288a547424e42915fd327c9c9eee0b51f1b9f7125f039e1af8fc80b307cd57fa8cdeb512c49e51f6605620da8b9f8874d55378fa38d977facac014dbe24d5d63ae23e791c2d36ffe8d85e866f6bce0b64b1f3f8371df714c545fb8717435185cfd9e9e342d14210941af235c4cef7e1e7b3b8b9dc2ef1ebea611f27ded2bbc2796c48e07867d123610fa8a037bd89c5a1e434da5cd6d2ec2503efa0a58d7309f7db99764aca45cdab12ab5ea423ad35dd6f7f623203946a04b1fff9d76b493c7d923c69fae4fda7cf82e89675f8f8180f196372116da13be561468a1c6515ed6e8b70704fa62fe4d21e16ace482941e257d6d00dad0ce768811d54cb8e23a71c18843d0ca1b58dc8f6672d7fbd54739db4db93a94772e22307f0e4ce54a965345b0d5595f21bc72760e2fdf65d97e49bd9db4904cdc522df12bb6cb9b201de1f05a010db566068e9cd3a00fadbc0b0633ab9b7ab117fdbfb2abcb413d255578305693847c0991533c43de210e456205180cd36854d4c729a1be3b33e000b863c53e8b06b1831a7f70c332464f0c7d93517a182925ce162290e4e1cf7862b289ada976b661b3f6e28f84ba327a07dea8f839daddaca078b63164922e0c502cd1d8dcad2375b64ce46f63c8d1e417661c1520013c350b8f215b8f51c181ffa26f950603c3c7c4c4f2da314a78d255690c0df6fd8d809c13d8d9c8971aaf4b166666c2a92ea76d8a2ebcbcb3325b94934d49f2e5d58036a3e238f09365ea2f0cf1218e32605588220a293daf48e0c938b96aab6e24371c2a6e8ecaa60b93bfea4a8f1ec3c1fc1c2f89484f4d2fd37e480f5ab95203426ca2d83a3c5545884ef167c059fa0ca104e46203ec6936be083bc8015f9ed18735ef8c86d32721976af2d0b91fc32de75e73ad09e24b410362255d77ee28918b5dc7ff2df22b2a34a6c582985fe3f7dfc4d8b5db7ded5682411d0de4b4990801e09d5cc4e02fa87d2f1f27415e9f082a4a7d193633ba0698c8072fa06e13c8193fe7d78c66315d266716b359809f7184c21bce045b941ac7cb3a9b9ce55370a90633b3c0b8d2eb4187f24e6adf3ae081f4215ed1bf1f1ed17917492523c2e3492cc35705c0dc66721bfc5f5230b6abd2a96e254c47f4c44e19b33affc3019a0624ea71db63de3eab857ffc55c919663281f1838e205790c082722298928f26fc42f479e682592322d72547cf936944a546bcfa0b7e08b925e2794ad65d41333f6b0432e847ed921bd9be5fe8492376783f0269c7336e3702e9fb5d7282e646713fcc08b78f35559b68f559c88d69c18a3dd8dd128f2e51d09117a41fc77a747d24c9396ea21c7733d826461cf793a0e95457a925518f2e32ba28d0ce4dee858015fe6b0efeac7ca3c113ad0a0917ed455ae75a9304b61f8ec100e56d10ee574c954fd7f13abc821cd04b8b4b1a8ab2ebcd1be8fde3817bd8261061943e88e6f106698bf1baf5b6361e0ab0a5a312d5a2760f3bd40ee91c1220ec9b20fc7f79c539c87ea2fc8c4c2fbc5ba239a70dafcd8cc25bfd685fce531958eae237f31513d86133363d537d2753ef631c364c70a36913e37f1d0b1311e2d96c2602ca48c687825710f53f16447e754f3e0332807eddb30a3ef7d92574dedd04110b220ef43aa0447ea2cb7ab071cb7d9c09465fda5000806e9b20de5689eb6ac5b274b66eb05b801543b5a9a367bb8ded45394ad2b1640f5f167634747e034931c09a546dde3b529a38d4cbcf01a0207763d530cc8d29d1b302510984106915b7f8d8e95e1a2c6a0ac7cff13e1483de9b30500e78dfae112bb9e8e003a3e543119370f0f2eff1620351a4e30c1adc38dc0d759a2d48d7c6bf77400b6c62c01eedab98c78b2b16f4bc33eede0f0e607f59567054f8c0cd08083a0e920e3cea4bb5ece95ebf8e15ba57efd58390e56b08d1b725a2b1009e2b84e7914077f4a27bfae85befbff2b89663d0e9fc82f55d2ea016dff0599ec9b0d64c2b8fb807419d529dc915958e47068649dd0b655440ea5b8aca582b365fb18ab1810a253ac7e77ba2708bd91f99f54384b82f20d9fac582b3c382799095190de04519b0eac76122510c9c7fbbe8d357f413e6e9a38b8bf95f06848f237121c02d574720928278ebdf8b073973c280d3844e176b3cce69a020b4fe97fbdddc7ec3de79f901e19e271b061108d15702bff2612e963d83eddf16ab3a69d80bfe263032f9e87d48fbffd2d2cd595169cc225f9e5d35a19d4a32fc600fa9e9e3c191fea37282713b3e32d93ec36c3fc54390f0cc84709d98afc6ef96470e77d076f94d3eadf7f3572f68cdbd129e04c9842138e96a9232f3fb94d32cee7f7b8dd6b0de49c85ac44864f09d396b352c74fff01d9680448bcb97375d0c85f00f130da9ca7041be540babf2395cc42cb96930448c3112043a9a38843769545670cf209c64a2990fbd491d6e302ac799198289e2fc9545fbecc6a11ba25dbce591a048e294656aed48b80082f327781c5691f38685719a792da0b712ff8df590873f058f471095638644a04f64c3c0968d021c446f978d0d465614b3e1c5736b8c2a3937bd2485244c58a166a4b08db1c3301a421991fa3a2a5ae942dacd3bf291d95af4596066bd29c3882e09245598e0ad13b4ffd48533366da0fec0e05978c73fa668db22386720b823bd2f249ef9f69978b44a98a4082220fe5ab88a7e50a89c856eee759aab0549ae1729a5393fc23eb48f9554b1fa134615e75a439a88c59ac6e386c14e801022afdf32d55d17f0473662a7c7c204caa840bd409c064b04f848c2e811e6ee73c5b84033dc29c014be10180722445315cbe548ff894d71137c285bda113ca696bcd364ed8b751b32816e15384d7b31ea4d3fcc8783cb1df881d61e80fd4a9c3fa54538837f852398a5754f10ede0543ccf373796f49b3a7a9a06a9b24f2b2017d017ec282c52c34c52ad85f56acfb20e83c63796321fd472413cf4e2c19bf8064de0708e36c39184e9f27ed18d35613174a893c29332f1a35d72ef291724c49307d724aeef729ef0a811818cd215305e6426c30d86ddec09040797895f5aca2731b51da939163d04f392f49ca48b363a10e69769c47e5da012da6fac934d338b497bcbd6938897c765062708102633e72e47ab7967f3200f828f779af464d86535777113533fa84e17024897b4fcef66a95cdda46106f6038a8bd58d86a89f80c44fb23f951f3624dc89aec504b353aa63c460ee294828450134be42ba482edf1245e08ecb9d53356dd65467dbd01a101169d8bdb1cf7aae9d3d422909120374fd5816c0947759213fbe5937b780ac133a141637c9f546b3d5818842cbaab465ecc11e11ed43ac0f73530c8e7f70291edf82042abca31d82ed55dfbaebecc635493b0413eb2f1479e93c2b062200c049288e84a11dabaa855e7658016a1bad1c0c08a59b2a28a7155e3e9572731607fe2d3b37676db51db11382e055b1dc925345f63dd20106e1ae250511080b45925dfc79a8ebb6c012e04a3ba904dacfb014431070809acc676d2f01e4662bc8e540e7117bc40d2c58b1c4db164719afa5a24d2cb2531f9cecb4921febd0f483ca8bb84ee03c3898557c6359b49451b6fade96d9e72b9e0055871cb8a8797047674f52a82b6f7d87d22a18dff37681e8e1ee851a8e846186b5483ecc862284103238d54b999427734dd41226a6b1935519bf16a78d85ec97767c114d4d692b18f8d2eb9492e5fa8f663a3fd1e0e6acc81d9b1cc30b860059c2d2205cdcbc14bb7f18f0303558da4e6ea21161296e2551ed55c96d4000218e1ef868a3ecd5bc399e160325a1b248d3bde491b5717aaa0fe203e53453be3eef9a2612361b4f927bf392e4927c366de0d9b624ff1595a06d5b872849a98074feba253902cbc00e4c6e9a55c3c371336209e61728a7ce9a55f36f30480db19e9fa457a20e93dec45700117f7a205c87f721a3a871afbbb270d9bf7cf725c9d6a72d9f0253e30229b80b684402288e573121a50a1edb86c6d98498b5376952a48b7d3dac17bcce9f799c8937ea7b0e99fd6539afa84edc7784ef5df9701f0c3ea937f80d47560658488bb01f8f5f3d3ccf987c91b9278c10371ee8d090d9fe82eb642c76a6cf0079d00d186c4c06cd0bf439599fe51e4c9b9a96a118ea8e586499a4e8035c67e6250e3ecdac7ae14054fc14315fd15677afff8ac67cf126db862714370bcba67e14d97632634a5f6f651be1d3d2225809cfb36ce51d173ccfb82b53ed64525d965c6d88facbac9579a49d51681c1ae613676f38a2a7d7fa51cc348204df1c2c37bca9eeaaed25aa31f95d39c0a9640cd152a31047fa8c3b248ced58d4696c80f07c85153ab3253b42973442aad179ac915392d1aa13f9203e543a9254598c0512d5f509f4a479cf359ebb4b3392f4a9baac6ac26834245014744b1b9f928baa4d34b2f129fca8da446c3e3ee44254274a397c441a2942fb6e46ebc7f230995f6daa101d517aa5c9edeee61d527abfe0719edd3c4e675105a17a543cc5401cfa60ae55e2de1db0cf35190e2e97fc4fe797ed4d8987d7c824fdded0f7c78e9e37c93269d11a73c9b23e594a5010e8c16ab81dbd4c30fc553a9c813344272c818371af475d881d96366a49c600db709e5ec004d6f7f2119bb577161c62ed759a211a10d52c49230a79b76b36b5c0cddcee425172ff125ab808f039787782042b5daba006d58a2d166adf5d44cf4bed0584d305198b42fc52555feb35d60d46767bdc68a38bb889abe5260d6e67a10d4319c616b2add2d19bd495fbd7e323f8226ea2d77d875cfacf060ba5ddca36d0f7bec458d45e5306935a67aa8e0931c0431236a694d9f9b59d2a1c86d14256220022d70f5673261385fe89e90324ba5955021cea51f297e9ca4045b4015dbfbddeb96a03784ced14c1d40aa5b1531b06d8291238bc7833c86255d8da8368977238be1b46c1252e0f48878b0bf4600b723cc9d590362b3c504897673987df5aefac71dc60218ee0b9a50eee50fb8c32bcc83c1f988fec27a808eccdbcdd9c7dc082e558c285e1972ee2a459339c778bbf51f302c75ac0bfebba5e4e1d0dd0cc9e8fbf82f23df1f5b129528f529d968c6375121ff6df4fa57194a54f06e86171f93b616387d7f9ef044716298dbcc6bf111b28cb7bd8728426be25c9000fd364b26691434d3941dfa295439cbe1d3d4dba1273a9f702eeafda99d6219735e5439279d865339c7d0b869a619baaed6eb0d9efb124f299ded5bca4aac0feaddf4f4ed987a3a4968ecd95084b6b783893651987d922f2fab93c7a839a43da8846e8bcd4800ee9308963715db7980510c68111846382ff28c4e5fc2615ad4ca91fa53863c939586fd279effacb0fda83d9fff12c8b0deb795a5070053b307161c999569aa3ce881166a26e30513b96450a463deef6354d5cc57a20504a6b58af580851634302761124afdd428dd26207086c2619da0e106817c2b8f5e2e28c0d5ffa047d4be12d1dece7c9a917062ef170bd3408a5a793a78bd5d4989c1f5883e8665d016a2a98421d8787b7aca77d722ce31e00743554ece074c1b4853bf28ae67b24807d746362e8f1718f8483d6b749a101f41b6513db0a2c56bc41e07c8ba35c88f7a9d24ea10e1a969de3be0c531584b9f2a19597a79e51d9f15a2a77edab0c398735dd82aeabea6caed9ec2b05dea4a71cd4566dcd1a988031a4042623dafc30423051d284c6589043c091db9a99141ebeaf005604babb41966d89da7859d61647443ac7e1e30aeeaea005cfd466401c30b08cebdf7df075de2c944bafee7158be315a8209930f11580574d5087b50b4898d49b143a28315088a28129b9bde8d73ff8f344486a4b6a412d2dc41c90eedc01906b5fb722df22481399746151f7bd25144dfab46a006cd9f568d33a32c2e869a8e2dcc729c757ed2bc6759faf32e5203a510bbd711ef0d27318d5362ff8186b8931bdc027ec4be5274793cbe890fe2a83853c5edc414dbd577f4f5865df50ce1a061ad145c99b9fc9c63bc28ecd828e239a034f3944486f9d5a6bd1e490d8d98821f92fa5ae413066954d9694a6cd8c0d7c38260f7986a1fc33b97f4b2d44baef409bfa694d44f761488de29ee5cde488dc1749e850f0ac327a2284f0e14adcfc016f5d0f64b7763e0cd6e90811a25a0b0036a321219658010354e1848003a0ea925003800152cde9893f5110602e185f991a45cd86c2696164ad75eaad16b2fd5d98df186139e952a7c09239b79c017a5f90711f4f641d4f5b3fd1e6295f851f9c4ce7c3345c5ec6d15b9f7a41146eb499e0e90afffa409a406041339c3f7ad9a895c4ee520f62e6e0987ac05dcdbc721f8e94bec6bb3917eb10812d3485b259a353abf2421039eb25f810b8b6ff4b5abb1efdf0775f917b406be76b53b893caa82df0b8d18d53a799ab8eb1134321fa2fb3c1e3bb6ce5c42aba015f8331d6f04b72dca18c42ec31ddeed6810c55d1b7d8c6d9f12186c661760b36790fbdc37422b2f7a08b3b35583cad87c3734207db7284f7a74a35051de93c6821bbc57ec37ccf98546e2dfc03e0902736fe46f4240716b49a1705a35788df871767c6419bb858bdb3576192742317c47463de326d5e33978f9c78f2f752b40f92f88aff0e3e9a99e0d06a338faee8cf4661871739669b07818db7c9feca022295a31426540f63eab1a577ee20134a517bdac2a8f1d53eaf28fe24bf045a2483a038b39cca90394f05aefa932b089fa023d9710e1b7104e029211efaf3eb81d83bf18aa566a6d1ac9fadbd0a7cf5464ed0bace3dd90e3a6f7c933a54513e412d60403e1dcfa63deb5ef2c5bb609626c9ca781e5aa94987c1334adaba8d8f6a867850b04f0aef9134e16956da1bb7bb63a5a62f3ad355b0529ffddb5831f783d7576a1a13a9dd7837db5e69e0ce8c6ed773bbd455809a8a6c105b23fa73b533c749d22474b1cc16a045b5481509cdc69e7b45af5b9cc1225bdeb5851b603b826daede6568eea92000e4231fbaa3b95979cd7aff7e03dc1e47186c98a8ee4cd44de3d789f783e11d9bc8265afaf57c967db3de0e69d2955c003ef799fac450e55aaf77a2ac5b0ff16bb4e26d89f2cbf160cf3ce2b83d7ad38fb58efddd59028740a10972b0292e22f7c8009487fff71a5ddcc404cf5d69dc897ec52249da4faec12c3ad28fa49d3da8bef9f3a20f00044a68aefb3038c1b20b01da6696d0075c81e95d559a3d6bbc951d4ea56386d2c0faab1414bb1a7c0367231c2b4b8b829d8baff880b198c8273855821cc99824d2c7ada0021793093494147d628b78d9339283e840d2155352a864efc63a8c134ccc889ff816be9f4bf0969b4742d8eb29cb31dc8ba3cf7959b8566f49cb4ddb74088f133b25ede8992a0584742fd73b102a1e70ac4c058484a49aea7e81e8accacdf6368ac0058c5cc5a1b8a40955c1a020d3ee7505dcc332acce0c5569b30d6ec13c2312dac83b7dde8d66464f4241fef02edba4f99c246d3bc63fb007fcfbbdd0f20ae2683da9cd930d2eb364ef2d0c59dc0fb368a58b6a95f5b12958c92e2d0e0e855dd2cd3aa6fd5ff6aa12dd5784576ed9cfcdce07dc1695f07dc78bb6e0b160d1004eb580438046925194a58e6e69a5352f9e3609ed5a41a8f7646e7cf14cfb6508eb579de1f48cb3d9d53c15a9cb22cfa54ab85d249f7a7641b2d9cde9e236360797cac757527f1d63f71b6a212e9a1d28e82fcf4f68d1ec96812667304d8c867f698372579525cbf3888c79ec8d3726f522bde0e0d2cbc49eb5e4c5dfa77b160b0e63e1668284e8e51190c8885c8b0a42611c8ee57bc79773bc7aeeec1108c281f30cef9d943a47c1208cee08145b97baea8a814c01e5fe7180093d449b383c13d7d4eb973f20751a71a6ec69072724065686c3956005c186bed429e322059f7a422d02d1caa425b5c70a801593cd84c9da8a6978ab6c3b2ba034afc0732c31451022670a2a536d3820e44277e538e182ed6878e1180c84a2bf9f9ac093ed157cef746f6ac93cef0350bea74b2ba89e05a6f417b16c6ebf764ce75f810007198a829e40ffd06e9df45c8ccc306b9c957223131ba19d6b4b461b7b3aef41f55f4d070958d598a7d0773115b3b8d8d98208cf41bd1960ed2095de787da40deb3730c84786c79278a388eaefd68d52ff5ec6955699f97aeee40159dff6891a69e63bb49e01b85c84703caf25fffb84b39b07c3af465fdbf6563157371ce114ac3a7e12fb5710c8ba68290546ca9b57c11cbac687147d0860023d070ae4e1506efaa61d461cc8c8fadfc85e9859f3aa5981249033db78447f7e7c0fda524a6ed4dc4c51aab0ae7984baa58eb46980eaaa009dd408548f691227a1b99f81d4159820d2d8887026455cc90592a3aa8620e99185625b2f479c5013ff8e36c15a6fae9151f5462f26a453bdfe0f49a09711522640525ce29bb629aabd7821705e4fa958a94ed21161a3b7fdfc0171086a1cd320349699f6373e929ecdc7f305a8a555479673fc348c5339333d7251f41540d0164fdf9e067a987aee10694601ad0bf418c2c30e29a62c22453564c7288b2d9c1116bbb19adea93438f613453776dc784716200b2235d1540bed0b881ec00248ef07e08a4a3c602b1f094275a01d8e4ccb11b671478203b31528b74aa26a816db4d4c0949b62d84296566d280c385abe2abca1fa13df1b80829be94ab9ff9c3874a2056335830b90ed4c5e48b149cc1e04b8270d9591ec8e7c8c74b1e5917e627b4ceefd2647f2747407cad4d0bc4eba00e21af40db782d3f0a6e936ccbca43ecb4b78c931c202e1874552290f9394c6d1c6d200eb293468c29a72bd8a3392596b67501ee9f919042b88253b2763277754a40944d2a45af1d99b6a2c295f77e059ea89b127457974d637acb7f8eb22c7ebf436b692098a02ddf08f8eb96fe901d4b9f26b244997e7193bb2550f5fa5901991b228c96dce0c90f27794d7b705b0cd73e61e1c1f38d968647372ef6b6764134a5e35cc090b396df4659ba7b0f77e679a251fe1a3f7880ca3c5a9c18915b542b2d2c120909fca7b2c62aad251c22cede4b39d8bd5181ed065e2bf6c609743267c0482c42e23643fdfd6065d15cd97c7b32990968b2252baba364ef949f3a4a3f2908722a2ee52f6983a85d14afea82d0809e4ec26604e6960b05d5cd0c8c1e225f459214e4ca33f8d47d4651d4a79f62cb2373e5e59c5f404c57c44d99651d7bda79c87a94329d7fcc70df2ea1420474548945cfa716ac01ac493fc90256a9010a30c926457486ee2178931a05fdbfe72b6d0029e5d88180c8682aadb468f75660867d92e3c451adfc7bc59e05d4c141dfdaa31497b7858762555b311ab306eb2a4e47d2ec1f70b04cc750d9c7db9369879d7135808055e7d65c4486b9ee444a8e11849ad365aa232cfcd27307b3a2fb8556f5ba8c671aade0e37614559d32c6779144790f516478e7e3a3aabc7585e8db0096e61fede5b28ed8746a2bd7bd6db742a2046a414eab7fddf897d9bc0b354b918faba3cd9e1d8e5a651c81100665f91d84b70856fc69831613f8f94a7c3e07648390744afc01e8fa543b9cdc5d0d858c1b01b1ffd48003a46177a5d20ace6536be172f911a9aa1823e757b0d0b355f7200b1c3feb625e6c061a651a315f59b5deb317478a29e4e91dd13ae024345bd5d43508e62a2948a2ffb16d9571574051f2957c744afda0f7a1994c4809ac401586a04beec8b587d2b09941a9c7d701eafa0d9fc1f38321890846ae0363afe356ba6d2c8dfe55b671b5a3b9053a2c1554f565fe852da6c1865093a244850a222d559cdd5d00076a3653249046acc6063ff120e45aa2b59f2ff8912f0b5cf39d6c3a0b8e127073719dd59f051c97d6b42e4fc83419bbba52fb4582e886d908a5c7cb599b46ce22dc6dc21f7ad17403be9c0202460e21f6707839d8760875669b65ab6ed4e5240189249e3a4f028267ea15fcfb8cfc458110e3397cb190fb0df69be12646269b680e8d9c1254872d668522e296cdd880cff3a1802ee9d4e009b5df474b309ec604b457b1f6061667d7b05c0c4e2c650e6aff3b9683e0a5ecaa1ee6370a8cf14a95474f2a1396632a3e7e4d091316e23deb6f034e6f46024fe594688c3338cdf32777e74d884729c37c75035b449044e9d45a730220e37856313a43b902fd778ae35ff759c1c15756d4e5e6fd34552d6e525a76075c22dc9d93acc91ee81d84f1b1240e635814f7ace53ecc70330c96640f4872018780c2f943723c819bc8d8933c5dc968356f5ecc339f9aeda8d826c279bfd3ca15a7787fe97c2577875ccdae8b45d93a89d50f3f4a2333a9e5e64948de1e06f0c89615b55b8449406d0a0204953e8cd90895c9792e5213b7ea0890a08c78f7bf90009622935b615909ee249d4a86903722b00192018abca2e746d6f3ce882401009a796397a5fbc0141bca4870a3a678e0049966d40556cdb8a511fbccfe53e0e9f4af0cc9ae085aba8efaa39ca73cb2e7bd46b0ed87c31ea247ffc5c4921844805a1c380a5b545b3cfa5f8dbe74a94ca7ccd143211a90e97b8e710f9e8cd60411b722838c94709e3f14ea0c9e271f3bf443af89271117eec8eed3c42739ea9d1b7501c805325561404239834498c1043702a47c5a698ea37641b59f14f82fdb9a40b33a8c1d48ab6ed25f29d227844030d120c540f5780189edf39ca1c917068486764832a820565fdf2a51ac4e54ecdece1f2b760e515bf8947effae25c0b3f0ed79d574f53c775241d2488775674fbec43921950cc52e26e3809eb2f69aefbfb7454457fb0eea3d5e256013e0da3df480fcddeb604e7bf9dbb809695835cf25186f4d5367698fadfe169300690024b01dc5d858aeaa048842c360f4396b299200635b385ac453f7ee9e201c8459162c801480e2d009172b56a2ddcd99798996e181d07e86c8268286030820744172fab62eca55273f5f0a65017e94ff94c364d54a0943329985594753ec8cb742bd547ed26337746137c73a09243cd6f0b292d58616488646adeb22e73cc736147ce5763c7c33ce6bfffecaee72cfca530563e1f5d2d5038d49854512028cb9f92e765ed6966792077a6763bb13fd2fcff7c630dfad7fbb6f80fde60a4a29e06d81514b00dcfb2a20f1f170aa7a21c43483efe669d9ce00b810f42822add30a81276ecbe22b6ae0310080c15faf93316e0497c141ee1aa38d1f640c33d95091ff5f6e793f1c0e8fe3ef43b9149ddd19edebb316eb2d8f1fb986af55222ea40105adea1b3d6ae736f502f68504769c427f5820f14ac7281828891cf2e02782f43e208285f215ea863c7063a8c0289cf7544b33f590fb7a3a9ad0e8000cfdd8a03c0992158c329f472a8f1c27057aa382215c27b7e047f85d000a6d5db2ae4f19de46bf501294450f16186784f7c1532eb3a6fa3cc5d4d4e9e7a2e2d51fca6860aa086ba4e85380f0597f4b46218df9f6f4a6778148684becd7e44decab9501d13732b9bad1e17a13768cc9bc7d0571098ae1dbae4d3c8bfc2f4bece744f22ab1b11d6184f201c777bc6ba3093d0464b830914f09744d9b9bbf2ed9e4b779bb4451adfa105b8de29e761c50563cca9b4e938286b641303298a175b467f190b131500300e8527f7d341557cb704dd4d6dd76b0bd46c0f051e6a4ae0989615b06f6dfea3f3dd6e6342bfdd44f4d11c08bd4ff02e4f21345e421e39cc16c2be856ee8d7f5ff79dcce0721c03c0102a182084ade8f9015b40501678d98d2fea499b061c0176d289a9417ec3e0147f1b2b3db8d9b14a6f6a5d6345753a7ef8dd4fcaa2a2b3475358900358520742c8cc23476b24e768c686e3db349ccd32e7fc8c635c1bda2bc7afa63582e2c64546354df22c783e9172df66ec3404570ac4c639dc8ad8ba4483e3bc179ef5409ee4202340abf991a0d4f66af3a7da79b63e9330dfef5a48388f483e7adbd287997e3e775f51ac34ea3f299c1590a2e9ad84b01a20f19b25558f5b3c12369fbf7d8d522e2519a5b861645aa4b9d3a488bbef6c168c46248482e807c6409aacf5d750ec854e15f162eb2c0a75945c4e4cc4bb25e5770f99c25e1c4dacc2dbd633f9e70b125ed474a1ac447c40cb75be899905d855e0f2df87b5dd94771ad22f0835b21aefd152cc4d0786c9210bfe20a6aec41bad363688486cabd2580f53be51ae4cb9dbea8d8e0ab5fdc8d5e99fd33c63c1be450020886d531e0174cd794be176e973fb98d4a2fb8944257542b964cfa53d594ee34e249a8f127b06222863aeace1016804dd5c7a017842b8be04e8a14122003574888dc6a02f445c2e9097d2f09a4cd2a8c60c26281b765ec6a829c12600820c88ea25a7114b134897401d24bfb9e307e280a7e545f4273a21a2790c424e864c3f841343e73388e402046aac8a3524d78a7ef9b800240464338426cb9cbd54b9a55fce23a4f77eba80f7fe2cc2014a60c6ce00887729a22db5201feccaf886e3d8f8975ec1e3968e7a6b39fc5d9bd4d7590cce7403a4d206f23f6eb8c302fddcc22c69955173b6d798c9da54a5d655906e3bc5514b4a416e6db89cbc41c3e5001b4cdfcb2b4d967896f4a20202e48726e83b54bd1304675c87fc61cac4c31fc0bee30ab8f95d8bbb75dfaaad1cfa73c305acf743d748c2defc59aaea689f7d47a8d6015cbb880b86ef2fc952b11e335fb88836b3e34ffbdf2467b563915f71d4c7d6683e73e4834cb571fe36a05138cc0d115384a58af085d36092ef0d822012d5763eac0c89048806c4645883c11dc74fc84a3b4757a6577c0f4d3876dbc01f88b8686b65f9e7f7c4c578dcf46bd6e8036f9505b89c811c345ce65845ea5335dd768cf35ddd1c60a6c4760d08fb31f4119f32eaa91454a492965cad18895e1bc5c7a9c2a935f59646fe15c3b2a23886406547c0ab3469a45ffc15230723ab5c073f1bd56170106919b171e6441ae01022a4455a2e2574d8113435c72d1d589751c6bd189971a7eae6c3b82ae9e58b4dfc7a00a46da9aae72c66869a06e8b8192749c3204b194b4a478c3302f85e88437fb2778f3a1121580b8f2bbf9a63e6a0771b1e1943032a2b616596cb957e7d998e1f41d23863309891622a2171737b06ca5960a0b5152894008fd47fd29ff667e47143e8fabef90418d6542f421755666351562c3005037027ec24f3a606d29050a5f41e563a438e4b0b8c949d2b915162d044b03b024a632e2899959cc023e16e58bddd1ca8787044e042a5ccfad5b3090ba51075a3bbaa834c1754680f4d6151ab6fe23cf45ed0236e1a27d1dc9d8f4e7cf9a4fcf9839a98205166e091fa2b6e0f3e319168200306652ea9ccc9d605d704015a2a0415045b34937ea58fc3088257b37d972ef2d539229b70acf0ad80afd636b269079bb4fe99840fc766feafe9b8c1256cc5864f71544893f429dbed1084fbf887219ca9b49d22b7155fddff9d119bdf83b3f3afda3efaf3ae0932a38ee207155fdd1b8b32324ac7990d03359637234b2a0849c2cb2c75337ce5a9f24c5ba6e7d0f12aaefb2fa3eab5d7698914c9e7446df3f1ab999d75ab76704d83d4e93cc3ff832f3ea9bcf93ecbcff2cffa89d7b285b1d04233cdf78a29e1057751e0ae7447ff44d481fde7fafe37ddf685343703cb19677d0a7e11df49b9b2fba022bc6586186f32e7379d9f0b186b831e4f3c510ec15b3f9008683c10b8530737948889e5bf2b8f3f9cbe52121607788a05b333444ecceb736a4272c5f266d2061cb70c5f3c37d9427eb7472bd8cfd5b7e58637333b97cef9efb0ff521744ffd3b6feebfc7f28d2ba4c83afef8e821177571841761623e564821e7dff06aa70659986104d1172b7420391640ae8de956c94365806ef7fc2673a6c0e3f21090ebc74b4311e6b83c34e3b9a6cb433f5c5c4172512209328e68011a4e702628f3459930a8143490828708258ae0a28a1a1b9a86808e18f2e1884b7379e827893034fbb1e64c4816048bf574f5f492c932d177ee1d090a28eefb9b72231157352d0d2fb21a910e3190dd441057184145972d2ef8826ce2820f5cc8500410371370214f2803d4030f0b8a288206b2c5b010c40d5b804173826440952b2c50d982063e5ec89e725fb82de552c0043dd0c0658628c4204136cf1534cec8c289178848ce855b5a99dde0064008c1c38d24c10f3b4c11864c28083224d7bafd4b7cc58de1e20519616c81c68bec265084785850a404133514c1b570d90b1968084303267010ca826c1a2baa58c2068319ca8c417694db1d90a1010c2751ba90ddc86ed203171b7ce152c4500d3d901c94db4d607093e225062c3871850c8901a2288a80028a216ef085e4e949b3de19af83817cc30f5a6606fdc1b05dae0aa19da7535d6b1d9dd5a9ee1e64b1659d6aca7255d78e4aa7baabd2f574aab98ecaad567b6b1dbdbb94ddae26591cf2a24f80748e6a5cd9e59e2b9c7e908816a9a743bdf108e3e0f80afc5a71befc391a79ce3af29c40bc91d27108476bfe050e17e0280247114eddbb0608822bcc2ec100e49bf29bddae43f72f951e9ce11730b42e32af4ba73c329dea42d28320088220e899e954e71575aaf3c674aaf36c9deab0d0fc8d326cc91591d091f64b282727cd48832a7d08a567b1047fd0a2769890af2a9dea6a0fefe83ed6f7a5d7c4123ad2da718709591ab92257755cd1ed9ecef7ba6ff6b55703e883f425ce4d59f04b53f816f5ae228dd555de871ffbc7011cda530cc8373835dedd74dddf9ff44d48f149ff437fc7c68b231d75c49d307cfaa491bf6f427e5f034583b228f69f5147fa7755e7bd100fa18e5dbb13d004f0470f8ea3e7efdaad7eb5facc029e4cd8996262e4e8bf5761de099ce60be045ee08e04582fffdbc8f4ab9aa5a1316d60e632e96d9e5212caedbbfe3f21096d79d9c03811dc24c8f8170ed76fb19080476b04d1e7c4bae88e75e6bfd217ceb37b91cde251de030b443980b76e8a118e5efa9e0b71ba71693873f37dd635ed7799de775edd6fad5fa55cff3dcbfc99de9da98b6cdf994d249e9a4b30383bababbebdcddfddfe33aaeebeefadd69cf470182fc94ced82d673f9d73ce8ee3e69c736ccaeddeccef1931fb426774e6f97830efd5354f07cfc7f399b5b68d695bb75c4cb907baa898b7aba9c0d053bad530b4ab5d417012548893a05be8962e3821a69ccc93f10837c2d8b24cc2b42ff6c13c197fb11ed066eb09c7127cfbfdf4bf1247e2448ea3e1c6a6e210ea23c8973dae974862088eb9f3bfae765d67ebba9e5bb5b09e8debeeb67969765d78eaa7eba7c9b628e94f51a72595717c5ce22a1d846e89731b4c901894099a1ce745122cd2514cba0e3e435692b865bd54ae15170055058c23f49c3512a04f6ba5cf9477b40d1bfc836ffde91d7dafc9a52866eadc64808c63bf580e8f43307634a23797fe1c8d50a005e37db9e07b5dbe1e3c59e7882080b16b57cca9be49f54a7cca7d31ceeb72c36fa65def6bbe1e260f0e766b9488cebe0fc7922a71cb51ada38e2eec6cd56aadc9d452e2fe7dd9e386291d37fc9b1bdadcf00bc31b3eed2dfca33f9cd11350e895f8eea3575587ed15c971ece8ef245004e9cc7b84a82144e81d8df39b5c21ed7d1d7d921ed71b69121d47bb1b70a407df51159ca630b6345d241cc8811cc885cf851cc7a4c9546be8faf05d0421ec7470d557a4d17210d2735c892b81a4b0eb5c144551aca87282df8121aac988d63079745fbbd94dd610f56b35d56c69aa7df13ccf23d2753499acf5a80e4e4dcaaaf9218f46bb1afd835ff600c751f5b6d5f7a7947edff77d7741bf00b1a032808c6339d9a5f499b99f63d94277f4dcb23bfaf2bbdcb33b1ac7b283ce29473f1a4db65a9fc8f7742c835cfae0cfa7cc5d04768d41e6643a7a15b2aa3f34adc42f7b5c1ae5c99f8f937dcf815efd26b77657c02a3ad5a3eec2807c1bc59d2a956dbbfdee799ef74d6ed721b9fc1e8abf99a268ac7643155cfe9902cea99d72ffea84bbe7d1b3fb70af95c8114772020a4994a8b0847f54d25c01eff01fa1660fbc63b28053fe3e5d983e5c175170fd432bd7678b77f078a8c9da412d5141091294111a1cf71b56ecfc129b5f26ad57a4fba1d827aa5e6b9fba680f47ed441921a1745a656dcc0ba2cf71200882e00835e76836b9d3c1fe9c9861765197b9cc90c58a2d77c61ac1e8fd97984cd5c974e1ba3fbfdfc03fbaf71782c499aca4ff44c15fe7a7cd6e58b1ec63e7d4773a8ef7fbf24153f8f43fd44f1ee17bf5438feedc8fa2dac3228e2b8ce44f1de7cb9d7e48deebb3386a7247f43f94178eb8a753e07b2208a087fac00cf5680d429ad2ae8d6debd4888a208c2a88862de77ccd9747df410fbbf0c1703c0de11b36b920588e9efb9110f738671f31f45829c33c64450c7b19bae10a331fa1f97872af00372fe79c73eefeb3c8c7960f88cca220424648a24405f76e6e01c507c3701685fea23fe82037491fade2d907e56c1949094d1891113aa7875c606e3f0a493ac7fbbeda546e2c122beac613c7f900aaf10e1e728db9e3e52157509158913bc779aca8537c63453fb058b6641a58a3cd5cc5e49401f99933d77fb658f033673c306f9d3c469307db48368c616d0c61cb547f0a058e3b3f1de03037096b91c30c168821db8164f2c7c713df5391910328ded12417ecffc988f825b0092d9c21a7cb5524d89ab0099bb1193485be2669013bcf63b1887f0eb39b83d02d75ac28d9433904dd7e1c71c8bc28e6a2c415164963458f201fd8486202e1db788115c1cac02aee94bda0e75fefc8b35788ff58e9b53a6ebf8e1e413ee0b0a8df62e66ab65c35345713e6de93e399ac1c7c8e378183cf3132f9d1317dcd33a961622afdc919b77e8f31aa5d454371ebb794b99ab2a9aa5febb70bfc83cb4ee2d6b25df07dd940dc5a760f261dec0db74e196efdd99aafa9ea5265b1b67ac27a9ae52a67d1adcfb3356f77b2a6aabf92d0c173f02698bee6411647a309dab0a20380cff14c02f027007c8eafdf2694cddbd0c18a4c7efc999c3e005f99e478007c7db2fe144fdf1f397d00fe488e070009a70fc0eb9c7cd4c9514f9f4376eb8339501376e3559ffe97e3eba98391c90f93d377f01d3c8f4c728c271f4f249cbe83d7c9f1a6cff1a637712deefc18c931ee4c32c79fde45129a902c9c3e078e0fc01fc1f1013872a39e4e0f801c9f23c79f5e27c79fc69d9fef77727ca34e8e07c0b8535d553fc798aa39c6d3f74dc81c1d640997bb3521492f233d305f915cbeb2f1f4492dd2cb574bdc1349e89a2b6c8ca759437c98abe814513da7f934f675c4b73fdf8e3b3f73d4b14f33eecc961d97889365bd1114428277d02f8da4b1063d1823059164a42052171da420525077c3d585666bd9686368341a6dd24021136162900813b5f46af274d8f295382ad1a1a3bcb9b1b1b9a5086b5d1a83e5ba5711a95524b2c496e8127bc4974c36a3d56cb7b0e716f684af1016c6c22021fee1852d411ac906d2c01a68036f6051c8e21ff3d6b02ebf8f65bd916ca49baf9a90f449455e6279a9e52b4ad22fb94471dc5981ac2f57d11b65d81aaccb0f0af10eda8de5e78a5dfa1536819464f535c43be89723f08a6369e84bb20964c9e4419ffe994b9fca2690eee97b335f894ff916e5a6d029f42da94cc9e441c5d18b5c45bfb26e7d758e8f287063129a28b629c7755dd7a9d029bac43a614bbe9525d99292cc57a7fa2277265961aea2cfb7d7a5af64c964cd96fd9a7cdd43165677f790d4846deec133fa78b10696bfecd1638d2996876230e6966c4b4185eac388f7ddbc421a070bd67df8aa49ee054baf90f6461c57f1cfe612dcdd8fa38aedc75183edf1f44ca64c2c563bdf34b3704297f08f516d927f871b27013eae9325f07f3d1bcbe87de0904cc05faa5cd9618aa2248420a34a0e68f0a4000a0f53c4809c0fda22ec08787502ab7e8cee643034c05f6b70e7db40c2d271e77b6ee64ca42536886cc961eefc13f8c7bcf333c039b48a227c98b8f34b2cf098395bbe1a8dedc3551687d2af7544bd9f8a319ceb746ad63b1a8d2ba4c89f264202b3b526d3bf88865d620129630c8102295e8cf1a109501a2c78c1568317d718310a1aed4eda6c4e9e5fe7dbf92618f39c3f1b7684fb399e74e67ca12cca51fc1c0a87999999ab353dffdf58e5b7fc26fee7aec96c27130333770e4db9f3e94d599addfe1b65d809f3e9d4f462b8ed7d1eeb07c7722f85e02208c48a43fa8e6cbca39fa6e081790645bad68b2d3dd688e623da88d6a04fe79c8057200c051724c235ba8dcc602029a850476578050a8d8af887f76013604b8805940846948931f10731066210224d7c4214128d9862cdd40103e15eacf10f52cc9a4418257521057523c90af3e82715c1a42b4c92118144ac09120b4090c63f48b7a0dbefdd68d7e750df83e0280461be2abd1c14f25529c86f597a9520ec05bb2d8a424370a8c096e097241b8d7f7ca852152a78557a3598c5156b883106ffa8648c40d225d9f887f7fda42f4862f847fdfe9213ce29bd3ac52281c1ab5210898cdb9c53bac2a9feb2c473bbd4e21dfd1e8a742389c13bfa2b8a34c6cb5725174a41be2291d153f2e104a5d7ed12abb404a91474fb9d64abc196a41948f31529882474fb4932520fa987d443eae9483da49e1b7037e01fdc7198c57263e9dd6e8b355f8922ac8a62ed86329a3ff12aa495c407c3a2db249baf4498ab483617619f08bb624b924d84ddfe50075b8a2ddcfe9264bbddb720b67805d264be3212d27c756255bfe9657b6e833417cd686503b8ed08b8bd001a90db21edb62944c3abdea472853bda10c37aff7d21d4f18614ef56a3c6b8c384f46ef49266be22cd6e086a08ecf5318410d4cbbd8b2534696324e2aa0e98473f0e27a1cb557d438a47f34409d24c26b0fee5887669a3db854fd812a4dd405abfac36b3dd7ebedd7e9d266b3cd7187756203dd72dfde6b1bc96c773e24b3d18acbd2c7bc283ac767948e673117079480674c119e248812d01f1e7cba38f1ecbebf7fa3d12286923ac624b3a2a9a40c0a2c9a3e6fb0cde51fa0dca2d413f837fdcd2543481bc89a6055b969cb8fda5c7f258a396af6a7ce939eb969575fbbbc6e82f9a1e6ce9b7dbdfacebb7cea1a375329de3630d4d94d24c0068807c9d523785f95407d9f862cb0efad1f7f48d279d11f8a36fd2af93cef7cd17e7db6b4f609db0f30347a1a9d65b3aa885acabb0d8d25a530cb6b4b79ffa0f112f7de65264e6b23844bc2d2402e9f6964ecdd612420715d9b74f58ee36759ce33d5793d4dceec3c2f2962ba874b5e33ada510ee9bb175eeec1769eb3b9f076287b3954776954929a150b39f38743d18d7595781ec7715c2fe9d49c6d86e7aae08d2cdba2650bd0733e344582b8bc858cd7e526cbba2c0f2961868209a3446bc594cc1241b7a4b61e5a2276e7d33145de83fc74c8f7971cca5e908a4342108730a7ba9ecc91462fa41d15de290e198dec84e5b1f4bebf13e2efa9809a633a551f4ce7f4386f613aa78e4b2ccdde50c2825f03c5826f430616070e167c1c552cf8386ab0e068a3b0208e1458909b867b6ae3bcbe2b8662c662b19c4c017367899c3ca484ebce9f55c020798889a13b7fc23aa706953b7f06511b1342f4c665ca9dcf1d1a97d4b2d3357bb8c856948b108e1b28985eb1df40c3a6a082bd140cde319f7ec13c260d776021942eb5f18efe244e2bda815dae65546e592bb5ad2639876453eefcc9e3796b922008fa77499c36593bbe9a4e5835df853be79cf446c7748a6484dd6942825f521b387e0e1c3d963916c906a08d2fb6effc6a6960b027139a899f4ca847bc7fefb161e211da7d8f279dae63bf50a647a51c07e5a3929ed88e75509f9159fe2a0ee910402eb5aad54bd14a4f441c4cfd5870a36b2b60358919385a908753c644a9a075958ce73d70707c5851e370ecf442ec8f0a16fd46c28a707e5574a9e28bad8dc40ca4b58a4198a2d62abe65b548c8aa357197879078ddf285c41915603cf66f86946bd3906f523ac2ec408bc2da5c1eda418bcf0e2b8000121f574b2f0f0975b9a589898ee3da554cdb4ba97b8ac0dbbde4c45211846e7d777b01f20dd8baf582de5c687df5d1cfb96eb1ecfc6e5dcf290dc3fd05b04bba734ecaf3023044ca33c49dafc212568b6b2c16ab558baef732800113d7fb1aef0819ae3774bd23c05caf893b24b402b1d64a71bceac10b86905dfa4d71bce004d72beb52ae0927ba5c5a76efeeb6861daad2c939cd9d94c4b91736789459736ab9a1ae7f751b463eba4145521421831b8ab05d7fc205455cff9bd494ebafa373f8893b64c4153e7eae7f10ff0fb42471fd47a822089e436d8a7ba534ac53dca1202e09b035473c01428c0d372b3734010a72e1090cb4a01551c509ac74d102bde972fbb9d07dc848691e4344e070fb9da598e1c5051722b6d860046b41450b222fa0a0c16004e752c115620b3d664ac08a162d2491860cb2a00117830a54f8414a943246a4e0861be9230e13d8f265b76f3f8734e828f50e09215a43423ce92a58476300d9c0028de1e948996aecb42b6b7a202fba5868fa9bcee99c0e35c9d0f338eec166ef85b477f2b837e27123d8a4fa75f48a00647f8fdb18647311a3c56def36972f6ab75fa7e68a17badbcda208d349bfcd0e767e6953ad12d41445a8b7bda64910b9d011c5f01d8185a5c1a976e12614434f4ca1cea21b488bcb5d265d1e02f2726d5c1e0212f2026466e66721cf3d8b264c9e4ec2d23d8b2634d9994a6092a7bec771277ffb4dc88aaacfbd4e7deedd471defedb8537f879decc069bff4a4b724a93f54936009c5fd14fd536293a6b0f424d4080bf7596c73a9fa244782a66ffef43ace7f5f7963751569c2a1cdfd14e006041a2310ad32d0a8f1c5a7438d2e261ea880f1c34d872f856689c02b14abf84778bfa7f4276bb67ce53d2dd966cae2d212857ae2d24ff18a79d5d560d1bdf7f5775a3c4e96abfae7537084fa504a4efce237218b4e3c7a9d6f347a91fe6834e2aa6fa44446f33d306f0a26ded14fc33be67b3e50fc9d7446ff55e6ea75234edf5a37d703c83816a7be105f713414712a93be9f047628d0435288b2281155a72bfc70dca9381fb3eb6311a019df740b8194ff534690a03a19f73f3ab47b1d777f6edca963aa832cb65333234790cc4781d2f8fce6203da8082162e488cb60fb5d09b0042e3b03bd713c9496bc48d22f5ab44453333467ecac344ce7f8739f433f870c2d1ae9ad55fdf3d6a92ea999cb5fc34a455132459dea467aaba1c347fbc0748a86b9df177abb8d46931794f072832b569c580110086670c615689c41831137b2391b585140051411ab22861f7e98410b2ec002871978ca6819a2863470d0a2a338a471822e0d1bbafe5a6f4c4774972e0f8189018c1417803cb1581e0262ddd9baddc87529c763c6bfd6a7b7fa54c857a3afe0570ba2682b660bba091585e915f5c93286b25c355dd6337bd1688fbf60b6d82da8c8595deb96cc35f31e9a0d768b1505c95a3397cf7cd5af205a6c0693d52e3375f5f4b8eee4400a4b9f2f5ffa1ed0eb765fbda0cef9be8fabb5c67ce5c53ae852da315b8b3ab5823262c56045b0d7edd563eb71d55c2d5aabb2669555242bba09dd6c41b65aac4683d15c45a17c2f6f06e56379b1510ba316be1ed9a59ed0d7f282eea8356a7dac4be97b305102d385db3d3896b3d54199ac19942532215f41512214e42b282804c57c0505490cca11d8cb57508cbca010e971f90a8a1017141f2d1c8e55e42b28a9a2bf996cb6566974e62b2874e62afa754c325bb703b375bbe75ab7ebe91c53f79a5dfa1dfd1a2e6c1db94a3d506ab2b9edfd1d0432387a5abc204f8b27e4f39a73cee9d329ae71b8c0726399c4511df06497033dd2b0b5f8aeebba1adb29fa948ebeb173ef38ead6cb9c3d64396148e673b98a1cee7cdadded4e8599a12aa6dc9aa1d299d2192952b6387182c4932762506ae6660c5106c39d2fca608812a50ba5666a661326215877be4908960b2e1475a7319a416a410e773ea90539b058949ab12d50a7dd77e30af345fe70e3a908cef5c7b93e9e8ad01721caeccef7156613efd902cb6379a2b8de62c7551cf287a518d520e5ce1fd520858a566b093603c5f68bc048741ce73d166f5c0145fe301a242e8aee7c12174573cb4f160bb65f04d49d3228b45cae7352b2e2baf34b565cd34ca7f8e69ba759646e0ec68d0bd8be3c44b339018632bb77ccedc590e5075bb6c6e5219a8bd61a2f0f0181c614583071e7d36a79dcc9c19ccda478828717c8277ef802059406409184172f345cff1e42b8b8252f64aebdfe46bef05c7f9d0a740e63e160e88b1625acebaf42e724e0fa2ff9e1faefb4ffe4198a4288eb5f5c2e5cff4965488a1a0f4d117449d77fc2eea44c6cf941766d1e8d1a97bf64cac50c0f4027708118625647bc0041c6096c98028d1648fa34bcb0d09f409de39394f18f09ce2a80b0f98441440d5a60212947e5522b615c4a7f45c92841948144112cd8008a8da46358fd2bafd8b4c54e7b97e0da3d73280e75eaff8cec3421c18ae250424ebd73eaf14402f7f575b8af3b3f3deae08ccf391d69788773ef8decb57a146579877fa3f872dcb8c3643e3b17b01fecc9df73ce9c2d5962b58e46bb36a7dfa34e6f51b4021f805807f821fbbdd7696fa789926a04c9e735f1474f479d9df0c1db896cd4898e2712babdff4626df7bdfe83d93131d3bd9e3b8ca475ffdefddfa833b753c95dfa5f59e4913465f4726cf44fcd19b007efd3a32094b9c097c5fff4445d48982a8d28f50a4396334ac1ae3ce7cb9622fd674d91269da78d57010fb7973958be0e8edb8336baef2399b3bb59d293467a290380be7bc4d0f7532d27d32e16b5664216383178b4592defe8f4ee9bdf7bc27bd8ef7247faf59fd72795f36cb7339ab4453b34f1a6b8c3b35c6be8d34639449da8ee6aace66e3bb2692beec5bf84c86a5a7299d55f33d7395879e8df77ea7f500b2c68763cdb853f36138eed48c2d8e3b1d8b32c91a60d9b1ee9b90ec2aae1b8df074b49efde8843ffad1e8c1d7193db8331a3b1f8d1e8e1dada39550a471f4a5bb98fce890a5bf4013767e4e46be2f81c96f64f2c34464321a5dc855fedfefac10825f7a2c0b69f4990b89a3d77c46c30013e68b115398ac108e2cefbdf14447114e27237e3b1971e9d88be51ba9ebbdf76c24932b2486a0e28b31426547f37e921e8be537703c79cf6467639d4c9864fd49d67fb9981c8d279dfafea4272ecfe5f5782ffffa6527bb4e63ecaa131d69d9cdaed39847dbe4e51bbfeffbbeef0341104c82e7cab0c41563386145910d0d796106d61632901101859be1f657f0870b1314af9f561ba5930d556bfa144e3f6704a9456370fbe9a71870fb5df6a4e7767fb552da5128a2272cb0b7bfda4ff5e3f44f1f53a0c9034763e883ebd88dcc8d74fcf152e3460f34db90155f6e0d0d1be050080c243f11112050847f4c25aeea948f6bbb2f60f847e8717ee13096609de6f4a6d2537a55a3d60020fbdb2776cd2079c88715dcfe061a6a01ecf6b796de52c492e1f683cd223265e01fded727903932f3f0ef90c6aa7e5b87b1c4ed07bfd0b0c6095bcecb433f68dcb259330ade21c59c8277f49728f8fb68683ab8654fe9a64f6cb9e3eae01df3c536d91269749960b0f34ba78c380d341c6eff0e53784783a14db9fd24232c937cd36087270039e6dbe53826b5b25f97bfe48545513233d88fd24771ac6f3c89c0fdf71fbddd3a723c653726e9d7f5465a548697e3771a46f5f3e81c4d9f734e1ee6a4ce515408faa6e0af42bdf429a55df77352f79129fddefb3e8ffbfa79df24addec89c008edee047291dfcc39f7f07ffe0cb6ff255cf5939ca5daed09452113809509e4e29c9037ee9c8dee8ebb8c2c904019c21473fc956488ebe452727a0fb0f35c929ea5072344661a144d66f923bc7f33a3227a0f33aa7fe9c936942790960c0ed375d31994c948b1c97dff436a69816ddc1650e9a862dcd2deba5615589ba4d82c296b5d66a2ac2f2900cc2dc493d08db3c8036bc58d49d03e055378ed02acaf11704e4cc11cca55f2ea0124961d25cfa4648e01ff3e99730572629677015973e4fd6e25231975e22bc43c896cce5d22f32847f4cfa22b808aca29f85890a2275b68b91d221934116a62e32f822d6ba2e3dd79f7a1723ae7b690206289aa8d16410648383238017119d6f75f828a594be5c97ba4029bd940e41760f8d713b8adb445c6e6bd10106fa23583a2f7d24eea9212a34a45e409b1beea63fdd443937758a6b3ae5625dfa37cab0309f394f982fcb4333a10bced0724d6f9461bb07f9c77ce6504a260fe60ff06854ebf74dfe9e27ca037372a59e0964966ee01fdc984265d9b859ee4b3006bbf4bb123e97ab284803abe01df4c3748afe9812cdabd3fb596b9da2253034900a06e24fbfe01df41d45123379803257d149fd29f8944ae7d4a7e297689d334b606c495692956425d9755538f65cfa34fcb1dd8366c05bc8028b4032e01899af409aab6808a0ad537c53b2c4574da66bf63019441222c94833128d54bb11832dc158775924d978077d210d0af18e16a94572917a482f122cc63f264dac8936f126169158fc638a303126068942a24c9c1595643af8f319977ed920c755e942594936a3d56c37fe314b3da51e5f9d8c88f44baf12ac142b05958448fed63e69dc39f9bffd1dd297be04264d3b967e13d2c7144a60b28e3b5cda1a5fe2702493369efefb1b7115f53185129824429b9027d278d221bd7dd2f8d3013f61992493276e34c2635f34228e3b93247de99b90250b81e05f42c20ae0f2d02c872b3e07a4883ad9a779d0a25827f16dcd4fb2e6c507a7c83ae970309e4c9824073f490e4690e6c1d14804a1c4539a526a15955866c0500481e4d329fa59483dd3638ff4ea14a94aa768d89a40b851c9e421857ff89802efa0ef220846c4a74135217bf496bb506090abe83beac4fdbc6399a2dd1de9eebaaeabd598c2d86cb88ebaa3524efab2262c7d28da17c3d4e65bb11486a466a16651abe6d7f408d263769134953902bd39c68bcc8c29726f01d68df9aeeb8ac4c6907971c8bcd3c79b87a7c753f39cbad5e3f46f6f59e794d3e716010ad329be64ff148265d9c2f9979ba6b11d14d42b9a9f5ac64c21bba5c6db3f19b1f1f3f68a27ca93356fe3e7cf59faf935281fed417bd05f0385d31ef45b948ef6a0bf69bdb23fbf6b4cd48390edd6ab49b62a083563ad9a5d36cf9d5f4ed99de5acddf9a49fdf33fcf9734caf9ce542a54d4fe91c266aa1e7ce9fb2d9a573b807473fd9a63b75dfad6a5a35639328ca1622285fee14bdc722b19a7f9158ad53dcee8d62a29896cb62087d8b0085a9c56c3bd38c6b87a666cb0e3253abb522082e82307277efc067b19bdc06b91a1e9995e70755da10c5f3e3e29079c3296c597327a9c8daeeefba1663cb0eead977f3bf655db51dd462d8b2831c6c1b23988a1e3691faa0e1090a1960c647c3138fa9873536a6cb4450b4dcae55bd0c988e4ad7edb12edc13939a800a14535072879a98cf0c7ca46021c3f237291c06fc60866fe103a5120438035885986050a9f0f0e550b97050acdc7eda4d048587db7fd35b40a1e1829789a08c7a1e64ff9899b930083be72d398ee34a8e3a771cd3279c4cef51757618222c632e5862664ee1c43fef4984d2e52f5d2c24e857815e2c2c7feb2a1fbb2ff30add73d6d5f776be67f2c404efbffa5f253d54d7bd68c63e775fbbb7dd9b70cc004b3f5004600f00c0aaaecc36a5cd2d19c88875efb471faa5cd0ef74c9e98d031e1be1b4f24375ad1089d93b4b1b9d1d1dfa35f0809b02fdf6cc182cc15cd70b5dc9b26abc1247270e19992044884c50c116c0a90268010223fc804c23708ab6690204182047125de1f24094264845e7140ced769ddf947909c40c482993b5f05d333d193dbe554f041a7e60b09220258172da87032938206727ee515cd19b7294564a648030a39595e1a65c3d00030dc3006598462be5cd92287222ac47039b89c270b32889881963267d2f06ac7853536aacb443c425cd22d6faad0719988078b6b2f133d6181004c275ee1cc7677ceebdef3a058bf4cf4044603db97899ef0704b93dbdc98dec7df7a6b077f9c2f37261bcee14e20c4b8ac08918eea4144721257c410caa2d58525469920a60e5dd2106a302f4451449ea19d69ddfeea71259d743a92fb79cbee27ba8c11851872a641b4c315a21d7a8876808168072836229fa22e443e60887c80887cb610f9e840e46303914f941b910f8be80a174457a820bab285e8ca17ca3a9074dceca1a3df477f905e9dc8fe0ffa898841f61b490305b75fe788a9792e53cbbc633eed9de8912ac3bafd3a7074a4985338526cd76a324d291dab637531847c86d0eda737cab0ee3e7a2d8c2d9d76c1b880ce68d9b823a619b2fe292d8e632e3d6e0ae76a711d33730c14044505b6391f1fae8acfede7aa740e0b7953c049f28da56650b9fd55681655b9fd758e0172a1aaff0640b7dfc626ca93df1ef0bb9b92f4ebb95f778ea6302ccba0c872dda7d3ee1528bad4541b98b9fde1f77c5372b3dbfff2beeb388ee3baafddcb1b399f2a9d6a14e7e2a8f4b4389ed61433456638d66d0cc713fb501cd00b9655c509a906cec565c992652603797e3ada511b50a9c1b25476bb20dbec68c7751d57030bb4a7b92cb7cbe8e758663ad5eee3fccedddd7d7a373916c74373c6fa5332b4c816c60ce7e2a8b830e5f68b674c79624b6e0a171b022b93111a8de5bc233a26e9db1d55944d298cef27aaa6478fcff39ebba73549df2e375a12cbfe7562cb9a4b43959e2a2f588cc56a1a104c96254b8c0b5b56cfc13a8bd6339b637c5683b16030188cc562d1828282264b68de7a7a7a5a3daddbbc51e1b56f0a90e787a90bd6a9ee77a7b099a5f4d8f556181a1955c0cc39a7fb1c89549483f1da1736c4c1d262deb2c9825aac498677f4119a8d76a315d17c54a198b77c556dff2693b7603566d9d4dfb259f3d9a555fdad1a74b32d2bd835f24148c818b7db7f42e7b92633330a27d4dc741d090a7e0156f57f71bbcd68244e4a812d5988e7480dabf859c5ffa16e58c55f513a58c59f4a25b915889a3a86d0ed0fbb9aeb71de98baa9b97ccbe7eadb5a00797e389ee1879db23cda5afdbbf9383735550c30b73f6466c6e1c69b4ea15264ac0f1e7bdce0402133a3d362c06eff081e478d8c23f81c8df0840f9aec256204450475c4551feac1fff93e7c9defc371e7c77fe7d3f91e64d9379efc99b43e5cd53222fd46fa8ff423e1aa40419604c96dcbed3f61c64e68557fe906fdb55a6b32fda7523838b52f6cc93222b56ddcf9b12b6eaee9d32aa306596ebf55f53375aa021e34d872fb4d4ed964f3c4725ef325b434e80134a072fb6d887861cbb0260a5b9aba2b97e96e0dd4a98e712dced5411deb58500735109dd9db428d44c7ac9dd95ac3192d16b3606661bec4c2596c56c3eec6a98045bb34ec7acff18f205f9dfc6b0bf98a633d0776288aba9dbc887ef73a5df775dca1b5fe1d1b95cdb12beacc183b5b77ab62cb6abbfdb5baf7d3190c56bf8401bb138a2d1b5622e94865210f95b138266c15628467f0810f32b73f48ad3ae5beebb8d1449fc9b6eeeeeeee5febf632de646a2774fc182db7ffa6595d9d7bfab6835cd59ffad2da9a762a20e3582fedf566b739ff397a984e7128216ef3d21896afdb3a67f2bc5eeb1c9f4f7319895b7aad6b753c1deb89f564bca3df8b0119e4aa7e16e2355775e9b5a0313ceccd3a2dc052118e1f2c3ff5ca2906a34b8d6581517ad9bd56bd56e938060e9fe99102a3caedd7c1427c5160c2d63a595b541e626cb7dfa4aab55c72a713974b8ccf0cc155e9ab8b2035f58bd9ed0f4f5838ff99c27155d77edb6feafffea6d9c294caa86299f9fc0ff082cc8f57bfc67a3574c27b0e60b634f973dcf72905ae264c81ad61ca44803c3ff4fd277f733f73b4a909dda686757c8d96db6f623ac549af8f956f78c39b6acaf07668434bb578c13df5a0bf260b7b9a3fc719de1a9b9b30ae8da55df4dcfe3a590e1022c3058e971720cf8ff723f834a2f381fb7c6ecec9f1fca0533d121142a7b8da837e5317b6c4c161c596767a8f63915cce5217a5425b666e3f9d4223c6963897f6a553dd33ded1de0be9294ae02f37869df2be9fca2e8fb455d296e7826269ab4833ad551960b158ac8f008265e19e6fca16b2374babfa39d8c2da4c1efd3ecbee62e1c6156a48537bd0cf5d14d8b26376f6f87c05c14216284ac8b530e1e054539829b7df8673f7f6b9fefcfaf6a09fc605cb3f39b8c296f5f60001a753edadb1878f652e65806e67ba21862d2b4ebd315d0eacb0fda589511406734a4ddde2cbed0fe947b9e99e93e3386e49a73ab106b6ac3872b0657585e136ef081fe3b530f45bd56fb259ef6c34502c534fc888f0ce30a7d461d202e8f6db284ffe94f5de78d0cf3c53fd1dde79ab38565a76fb27cf9c3cadf6a0bf14c596e164f910936784f52f27cb3459cc11f0eb3574d9666e2fc9c275fb777ee84f567bd0df6961ad9be169b12517853db6e4a216808c3385662dcbed0f797efcf96636f39c7362e99e512cea58164b855e75dfaf243585846cadeac731f93099c254b1fde50c23d442ee7c93c95a17e1bdbdadab9a9b9b9b9bd279ab37f4ab5f3e4c9f1954e99cd224f906870db6754bdb731b3c63cb7aea18960f5ad56fadb010b8a2d62ab6d99be98aa267a55aad6208943e66c05d86b020738b007de99c8fa64810643a550468d6394debb97c8bc4c0740e6f218375f986306f11a099386416010aa582a804edb496414d1d2212080000009314002028140a074402915030201736553e14000b8da842704a1849d42888510821631031861800022200000322332c00f411119decc9c2be6301e854ca784c242daa4d7e42a808ebe683a4454b88b762856c1f38b0003538b84c8ef3b8febaca8d95938de76a421e8fad1bb46a7e14a30b71f1d600698b1e8560620a491bc49dc06e328a9187446c4a9cd82c79b0f149fb4186fbaa300f791125c06a09dd98e4f8be73061ebf0dbb32d80e3d41d8821c35f147d4d56c30083170e0940c41bc92aa1c01f090bd5f92f12290a1bf7a08dc125e62f1042e8e834b74b0a32328ca74146cb1c2358042955904929c7670f64f428d529d0bc7dba3bc24b752654cf920edaa79c730a0cb0dffe754230ecf07331021e932f59f237bda6ab3cc38bb29385a9ab274ac1f8cb3effbc2f65d8692ca92a8f529869625f8984528ce6be780a5c6a94940920fc2b0fcf49363b05c61e8347bf69c9eba62a2fd8be64f6bacbb671b3e62e6d07ecdbf3cb4705dc0847f8f74d063a276ceac9d72435fbade986282002804d0a02bdd33cedf3e8b7d4e91ffb9b40017acf19e8d689d4ef849f05280d807a823ec9371e23c0e01d8434eda2425adeaf970b3e3ed8214cf54cdea49df08728073a8de25b94780c16e7cdb146f568976b89310eb240d54ed5d73a66d007e4c7de168eb3b4dc50c50ad242ef5d62b12bec582d93abfe01847671893fd8e65f6e0799f39aca9db6a9f41358cd9014dd78cc94178663ff91b12cee9a59711dec5b34529b90062391aa3cfb71393ebb2bb239969ce2b6eeb8b294f3afe10dc4daf8f3e37b029ef1e27c0e29ab17dd79a6d14fe73e8f93d2a1668a59268ec42f918e677f6460cb97b0f96df455a52e4c7c799aff55d9927fca1ce046d6b1c3bfef6b5ac1622e10f4602fc68fee34437be3ed37ea9c068526e238993e0ada779a3b22509937a64809ac29f5f724304bf84b4947dc911c9c293618a38a06b6ca0e3b55bd8e779c65bc6685f2693d9fbc4cee6a32b0925ed254f62647412deaf72519aec170af617915b19ce5c08d23f8b1cb7f6597e4669eca5dce323d1024dbe1fba3261e31ae95e3944096c294023da637e910b6ac74b0111cb5e0387ecdee4241b2dbe0a44c001383ebe85c313d1ad30fe1dd872bbf7a7465bf4676321ab5048e33c252a2cf856dd95e0c1fb0e900a5714ba4186b374481e754a2a8a6c7b317f578da97108bc875748c00dbab3201665830e06243cf0a1370d53d98cfc98f6d4832c2ee76b2d9640f4455cd8f9adae8e426c11e2612322ca08e7d6ad468118fc7f97ab80f39ec9907df51e0959fc0839b6c730906ac60f14ca05d38b4cbf7ec94911f65138f014c3ef20e70bbd0d04f09f5b0658f288b47abc9b1ce628a0c5d2d8683a6a091007efb603a79ecb5beafd5d619bb7a3fb9083b9298ba94faff351d282a40be7811c3b25b103827be4731f204647e5324b8b91f47635a442347ba2fc2bf58916ab86c4655128658885e4e71805e93cd9766c3f542fa4912c2045157ecd6a2285b2b33539c8253f6d854a8552f9a3f67878a5e2467933f2f94505c402fd4868437d450c8c7aa5c48f462c3eec6c025d9a2e917f4c34908b1d784deae1e070da3e98a2dc69eb2ea42b2012154b890b98c3d7f453e6506db3e2fa8ff87ce5ceb4df478c3458adab9a9a2f776a6b69dc242e036c30d254094908b9a68bf741d668988fca2511783ac8522912f289057bee4826b10ac3d842096845e0d11cd5ec2f74d72939a6b37a31cc09b61553f6038c4ab4e3867a129b7636b95d0662ba14c160598894156656b6ca397463ba90bf73eadd7b2318765ca82ff95e8896a853e0bf4e5767fd8c660e4fbd5730f8a1f98cce58785c20a1de7ee8fc6b15aa61ace5ca3b0afffff7008ffeebb5f8b55d8812d71e7075d089c1dd527d36068e91f38a7dfe6b0901c14c4cebdac009d6ab0e17e5a28da6c05545139f0d2f4df8cf573ed3daba0921ed8c1ee275b0ac4c57fdef59e5c30860011c502e8688d7c5156c445868ea13c108d68df351bac5383b0948f99242cbb0306e0299268da2f531f29aeb130db8e9308b5d9183c249922900ba8dfc3c1f78acdcda185561740ddf5a8fc909ac42bd538ece83edea093762a441a242f79c84e4adcf8b1da57068786564b2d650d80871015015ba556951755c3eee4927a4aa065b8059d8627a2584089cfd9e274bd835af6486893f96d10733281c126945ef603136f87ff59cd5c66cc37ed00e7bd378405eea1db0dcc96cf1918c2156482234b6e453d89ee6dc949f820c7dba57838693c6a04bead0afef428ff789bfb1eef3ea2fdbd3642758a7f0f993cf545fd050e1e22729177d424b8fe2f59784904db59142f534d51e65e4ebdee424be2e296414aabefbaf5a9933eb09fe312d259c5e8d0c99e274e4a51828b087a75c11b765f72643aef2b4a9c7e8cce849a377037eaed307a537466ee679e1f034ef26d7a0d0c524e457019718289e704948d06ca0269b80b3f079194f2681c2a9c4f3abf4932aeed98979dd35f91fd345bab6cb3ea205ff1c6862bbc9fca07119811fafbfe80269c04f45713b23deb9dfb7f862f4ccf95f4e862284331e51f30746ba1cd973b7f2b47d3512277f26b893787c0b07c1e03dbd671d9c1feebd5bbe6f5344872638921d8b1cdd1db2b59e99026e6481e6132515c491427e828479bca55a35f8bb69b994d2932dab788929a433b9d6ec4400bcd01a9f873c7cb079f138974c6f0538f5e1148fb6b3f0c4a6bbac948f53df1737ca8a754ab88a5df5d4b787ba90e788afc6739b06a4a685358e9500f63e89074470210f6d052e1e9195577a60c760d03f782007408855dba21c304db38e8b62a4de434925ce9eb8c0acc9c2073065690a36d0be3f7d6fca65c51bd03122408be0d7f35010dceb15e7877fed0c594a7001eaf5c78158ddbbcded111003e8b340c8709b8781e1596f9b90ed895e56a7d4bdeaa22fe56e25d989e4b861b752efe406a6e75909ed177057dcf1a0375f89ed44f6bec27d35b719b5ca5ebad195266d847ff345b9f252389dc32aff80177943b9689068476076358ed0517e756e5a50e8354b802b77e78e2a87ce5b297d91b5baa1c1957b9c4672dcec6f71e5de957d790e04a66480593e8568db5f1b08b27b514e3dcb832eba38f6f820e72b4a9ca964d7021e6aa6904432a9b4dfad8c71d5004221f8398aa0c91e2abc1d010a48309b39d4e824bfa28d519f9a636de5315e451e4c6378efaf15e6b814100adf28fa8e6adab26768b34d9197a1e0ed67c51096f5555d9bf18c14c276f8d1cf3d564d3b7d6115f757c3e589a93c8433745a0bfb063a682f18b8c49038209abd572f1f00b3d14541a22ed1793aca3d735a07c60c1c22f672e1acf36d7fe5a0a6dd9865e1abd4665866aa55d0b4281b054ed5501176bdc27305494e962f6596d6357563a103c4267ed7e2e967a2b43f3324ee4506a3b8f898b22d8fa513f9309e9cc649063c0524915ccf10db245805e37ed3f4a552bec402d87a977d1d6f3d247036d066449e38ff5142021e9d117fd46840f4a6387b8878546586c898568f20b2018f79ffbd7b924358e4a3b606b6c885c5a2c5c97be5b7639dc8f328ac640bc59eae22e2222d1e9ca76c6d5b54898bffe06265a1e5a3682f2cfb2eb47331bf22b75c9dbf218814d1155374da001efa04229070ecc9f4c4994534667aae1a6ab1ff6f76288c1b58af9acf5d6480b16e2ac6c8de2c189c8e98a6eb38c816db48339e543d101ee40c86a6519b37180ff1492797efbc13d4a4d1332b6933305f207299fc20e7615cf2dea7825c3c14c779dd87d4f71f06b78922cc1a3c4d344859b0e1a9462e4ea83776bbe357cfc09e1257f5c7dac839f79abf631ce57778ea78b86f414b42115e70b3a7e6a8425e01348a122fc9afaedf62567b778b846323043359e6c99f463833c98719cfbb3049147ea75b2c99d208ed0de77947a4c5137f7ea599f4ad39c4c26b3e80846f1541d8738c17b70fb77e68a61a71344a5b83e88a39c10a34c1ca49243e49383f9ab85d32b54c0d7a24cacada72c91c814696cf7f8665154cc8f24d777a4b20638774fb63e3031d4cbbc106458fdbeb4a4e0768328c337dadf06d817b225b3bfc84fdda35456df10333b3d68717053e9ef8dbe69a5a03020bd42f24e58dae313103d4e555dcd54a6d50aa39628bb100a484c6b26159c1a946e770a8113ced5dd8bd88d6ea56fc1a99fd2137516243ec8c712bd7c4d60317b375bb9e371b1e24b4734c57cb6a120878e0f1cd1e171a3a7d14c513e8626173ec515a0c4a67c7b3d018a8ab512b41d35a113201ca1f9a0e807e415cbc1867f2d591e77c4f1afe9579da4c57485a9e0d8b75f685609c3b260d379a55e5489030c2b77c916d4366c7f98a6cf66fc1066cc7599f1a67928e2cbc66a80f7fbdf4699070d2203c5e31c89328699d452e0faa6668b3a95872c3eade6c838a17d8c4ae2dd2bdaee01385e8fd9de743497bda239cffb83e415ed60196ea8c789c2820281d01946ccff6bb0e85aed7310d51c2755a0106c4441c2077238aa68830f832b54d218d2922bdae52fcf119e04b814b5bd48cbd312ca66570465f5201ae10fee3f4307e2f5fa62994ff9626520b9b13cca25eefe4199946f96f7d282d3760be799a0685c858dbed8114fe69ca45240675757b75a95cf6fa3c8ff8e686d2c431169d3b2ba730ada1a32a3fe6fec44384f2b5d2c266dcab6c62c4c8dc24ff0975bfa6887905d28a7b91de6fda35b6d1cc5b5b3f3447280da36a71c91ac3bba9cae2c88b4d9c3e7230f8d49271e99fbbfd3b162dd56f62ec3cf322c21c4a6f68f05b6b4c7f653b3d49723b25ef60292a1fb468d9e4115fb206ffc467b26ddfbdbcd730e8f9544972b2db319dc9aa399d8c0a2b521657e3e80289c8f995675f6a0dd09509ead4de5898b8e8b168e93b28038aa9a94a2c139a561031e047c7cab4f5073ee3b7a6a2d50132c244be4ba28bb6731eaf939a437b016a2a414421fa6f45296a7beb4061f6c48cbabb4e28711a8c973f24e90283db142289c3d9cc7e2ab880e7b5043aa2306ab0424fb2ee9911a3832e49600a08bdb215005d5e5355206e586ba281be79042808ce01881b3e41e8d3d99812059224f02da22443ba30aa63c98c50e6b7d2adff81737944a261ddb3a9f1fc6230478cb7cd5950b5ba43c622fbbfb55e4d19a55d07a360730eb22f626e9392c16a4ca4279317bbe5b11eedfc51270383942f5a2dd87ca8533337066869260afc9389fb954b2f05df72c1889b6ce14802b1475da14fad594805ee73ef656cdd22ee0acd4fd928a30d81b8c027f4539a75f63d553aeac149993903df88d5faf6c34f03d520241671040f17457f363225b24e9044a697c8a2c6cfb074012aac6ad8ec018ff32889a37d7cf8092069d8baa95ffe7fbb26e427fb41e556d3d78e930cc14da69af643afd41daf409860d02b542ab66d40d47414ca0ef8365e4ec7b0f711a282dd541f6cbecd41fb391c32c99ca2a3297e84daf16037dd7c8c2232c4894bdda650ad18140fa2018cb537c49151a4bb457df7e8de5b33025fce141d6cc5b40de2c594d020140ee7a7087ebd7d31449a109057f8a3190accf1bf84bbdb61899360355b32205a57e1dc041f1d8da92428bc81df8e15250367ddceeba32a6c7379ef9ebb1a0a5b10da54379951f9a4f5a53c9e8f83df8a255d7c1b30a9ead9fed4b3a483e9a697f93fcc4aa82d9e411ab0cdf6526476db14bc47d2b223b4c1338b7da18448759a2cc8f4e7e52965a527de2e7d0d52284cff5510a7a6aa54dbd44c3f2950704937b7deeb022c0237f4ce9cd4b08472538f21c52d6a5ef6c4199c8d87d2f2449ac1971c3f5391f03a5f5f1aa88653701ba2ed7ae47475c99d5b52e9694545d4a6b423511caa76f3113d2ea838151fd470406786a356fa2790869027a88d83631c2bbc57c73b3fafb4e093a4e38bebe22068fc849093bf076b3e53b6945e1debbce11138de4298e13e846663d0c7d5cdeae05d8fd33ae22b170c9fb01d092f034ca6ef71ed554b63cfcea8b78488d72611fac8ae40cd4646342cfd931e688db0bc2fe8ca4908b6dc35e6e20a86bd1016294b58010134e4f792271907d9c502f942860249d40f538155f3ed6d00ab14fd0bbd1dd675e5d21b394d906662397cb79ff261192c293b5a3ee6447bb5041fb3f222bd8e160db2062703dbb43e66f21eb9711d64d803f14a669c4ac09e7e392f16e86cf335be01900bc022231353810a307e923124d6c67966743b63e384cd34b2c742a8e9e76d276ffe1dd8aa716f5710cfc33dfa67c25fdb8da9666a3369bbdd24d2b356b216ff2c3001aa0057279d1abe4678aa650866f1fbb790de5abc4349434211a610e99a1ee918f739288a94d087420aba55d0172df6e8a657f726d13ec9d450917e1c81f2d025cb780c2998d72d3c7333a42b25f285cdb01e34a052a2780272c75ddce504c65ee4045d42105afb30118c1825b1f4d735508dfa8bc636b7d0c286d0ab9f89a7b600b2a8637962071f741118857a3c226d5fbe4980aef8fe19c9f074a5021636bd28328d8d403b6a4248c046900e4e70165bd239a83c210ef0063239c79cbf320a0e32827a8a80ba22e84f017669269f3e12177963aa8449968f05548a22d0a0887d7a99d9126503cd4f2420ef818e97b928d42a2eb4c2c95e45103b0e084bf9f48a9da0478ecb2f41fca24448f8c91dec4ce2cd270ea5a82b0b0dbadc8e21bc63599c9630ce9c4d0ec7d4a421173c0db0173f74cdb16d13bff2ead7ba72150a6a928904d778b72351124dd9f0efa38ebe0dc03e8cd080a14506443b916f160e9d0ee15bc8bcf0f22e526100613c414006c093d872caac590f22be89504ae74a8da1ac41d1d532595b2f34fc8de26d9365ff3218fd60178834ecbd548bf0da176c25f5df517f788cebefd84caf6d13185774f62af73173dd151d2dc9a53a8045aca80d462187c8b89719050a3acfd30dd48352920c5fbe3dc540b23a97dc5c1abe084aab53aa14b5e0c29a49dfbb6c74b96cd0c68ec23f8b5ab1c528a5b900405adbe6fc30dea41a339c2d44afb9561d734fd814f3550080fca32be37a0a6e4279096e6172e70960959efdfd4021d6f86c8e1061254a0b627df285748ee9ed30f3094378e2a27e04be9f774510fb085830deadd373b3d78ee0d33206f621545c849029bafaf624020cc677da796b07f4acb33e6f16494411b83106e077f045f65ed20f07806c7fc7e3478eec5d0ac585246c3ab6c66c35e342c960cc254546290ba83d5f4b6bfbad27bd00a0f63a4a8fe9d9ebc5db68bd5338ba549824ae2023e236b5532653d6b583716c1b9322c0f2bd591ae04e809858133595e927ea17f92edcda215efc1090120dd1be44e1957c2788d6b6e1327ede1f9d5fa858443a012d43223c9e21cdb9539aa41e9036f9a97fa94c33414d26dc84cbdc59bedbe8dab91c3619a478b11847f9f955801784b2f561d076c7d651bc789618a14e213a242b1b11b708ab8895968bbcb685576aacbcce7652452c2eabac181fee89cccf5cedd243c2c5f98454612a8733f51f3710c69795df851a3c877d7d71a04988e9a72b7e8b51a40a21e58692cec74c10cc80ac6406a201625d383f5c0ce3355e69c16dc771dc011d4e48545036de16cc9d431c393c9f1ce43e66a006c5c458cc41d756eead03c8a54ef598ab2b2e67708f26c13e5750eb805e638d77de0362dcc85e119dec01c1ff2b459dde8d90508ffdc56ee4970a68dbfbee7772a4e9c63476c00cafd6a148fac58b6dc8f604ee5208aec117b88df811214cc72fa679680268e43207c924e04dc0c445445137109d4b915ce74fa5106a446aac68261cbc62194351f597b9c991975d69f1156ea008b402713b51a16df027c8d7ed422c8c63c28815e6491b3e1316b788b201c4ea7ea3ae9a6c4ffb127ad267ce2ba5993eb1535eb9726144dbe4643c23de40435f7f739ea143aafea1895ac03097701d0d4be3981bac0de8f50ddb44bb10b79906040086cfa308e588433096ccaedf2a5197dfa7a3ec2ba217c7b4f0e19b9aced6bef9e5ca549c0e58301ba48b9e52611a6b0d53c33765ad90ca4b8630125cf09459e573bd17fa74702f8c728c1bdefd8e4ac7d791f71106e268e55ad205a0d1d3e7dc18a835158a8cae3f45b90fa858614df6f1bdd11bc46a4f401d65aff9559390d8c220b6abf7f63a94b701ffb15b4d78725cf1d82f96ef46c199e1e28af23d156c9904de3f34f25eeecd1e22420a99a6f7b64f58ad176f4c0a82b24de148f8ef446d9b08f14b911192b6df783298954c4b2c214ae895dc3fad17893245310719ed353ef0be7b064ad74028f6c17eb5db740bfb55af528b421439be9c389fcbfa8f55606eb37812c0bbcb981aef15c0916d9ecae3e8c4421726370b75549eb0fcc2cbe94a59ea1f35434c202cd4ef5d3f3226d92f2e3590c6319492a16c45e85bc318a9aa747e29cd8a545d784426b3e03d5540ca6d1c14a8bd75d0388604fb0f60171de2d414b13b0ccc6387fb7e6336f494fb1d7ef9a3234b10af5c5715ed6aebe02e03ca573f06faa29d9850fe7868859d7dc845c6ffdf0f28e721f0046aa9ac26f2f5e0d5a334aa73aad7b7a18f9c81a6a622a3b8aea50ba4f70af791eb558fca3e1935c8ac9c53a48a456a39b5e7337baf188b6914b3c2b955fd8b1846b12b7dcaf5d17c5da8db5236be89a01582a02f0e102aaff61a50094eb08a1c4f094d8427fe66438e9ae236f5a0d0c9353b1ec0658723609c7895180d6269914bda07738171a4a39e61833e49839ea4601159a3a8dabc8269b971fca256d6f83ed4c9486d090451a7669cfc79becb4f85e45ef2949be0bb3f344df102c3a0e94785299c2e0cd2b70e828ffac3e4a992e5d40f06f77297c8089838182213b181d5bbb02560ece006fe616bb53e5ad43db5f3c9c38868aeb242409b5f0f2b65e01370c1d212dcaa4bc54a5110e577181111081f9e86734c5fc1a8116f04adde5cc37bcd4cbb92f62fcbd31b6afaefabaa0475b3b7556c7b87215431e516ec06009b0eab8d8a7d9152684fff8107dca34a57369801fa298ca07092f12dce5a4248a7c014f9129bc0f529b1b4bc55088e960b5802e5434434d5f9b28d7235da7c14e0c995f5a9e5064e862a4a67e11bb350284a9a2165c2b813d8cf7d4ed24d639601ea70c5d694030218ec072dc403d9a1aa3e6c9089089f33bf38b5389b8c197f2e130fb0f632a6dde01f8337430ac1eb85d3538d71d3dbe1c46f9b2745b9e901e7281209bf4c63a243ead046d84fcc1c51c7efd25cc6777a2b18e672bee4eb78bd6b860ff9b7b904767a4c60590d020e6634e3ffa8b36feb7697a53b584951d0202178d58ddacda14797486186896d70a4ee3fd4399fb8c8bb034f7f8715a05af7042e15fed38c53079c2de6a89fb91475171391213eb625c45947aebbd9184bfd5ee6703a4bce652677cb39c120d40541821eb7201fb1337e26545c41a9bb01a38b76ba8f2ed8a952740174275b1ad978334d41768b4e9625ef229a72d141b73193cfa5edc91560a296769f52cec16249eda9d0eeb7e943a72c09b09fe6b38a1e24a8248ff18583957d262dab76ae2c00f971d845471f02de2b2e2139af331c44dabdaecb73b73e43bd4f1b660bafb81061b42883128a156c31a84cbd2864a8c86535b129173d5574c3fd7b410e8fdac4a77619bb7514be80f60604129fc4482dc599306f86910c6e06367b255d479ad21069841c26caa002347245e4736f0eac5abd15b665f44100de984e8c88943007205c15799ad1a5aaba28d99cb1b64231da7c86183ac0fecd972e32e535b7b6de3d9956c6dad064474a0c7ef21b47ad7c1fea1765e8eea029624dd8c9d43e0163c3380f98f2f4050eaaf9f4996a8b9401c18dee63fcddb5e0bd619897a5f4ad4c6994a6aaf59aea457560d38b2bd7f9139389621cd0b6ac087605fd69c61fdb751fdc1bd0d878649dfb84b2a4e754ebf60b03afee2c4a3ff717da50f6471cc4154937bdb8384d085fac0a2306908f66b2c7584697ad3bef1c73b88bfcb200299c35f068fb4f0def84b90c8c6b0fb46aee28ed326b78a7dd2be5e3e599f503a3fb8b7022c349318c6c701184f691e10b89729e9ed545110445e90e6dbdd203adf7502712fbd11d3fc326da7386283e2759a5677e8189d764fa4f669e89f1f86a15ba3326a9d625a45b1628717d67aa045c4351f3c7c0ea91be16eb97c8cd95c132537f23d619aa936c52c4c77182f090caa792882af482b0b64b7fe2e569af183f9a70f1fef2a2144b3fa27ace4cddebf0cd34ceaa2f40f2697bbc324f1a794cc8f895a1f0fde14849938c2af2c34d046700da5a4e196c0db0d241ad84a0a67621850e045518b388662fa4f7c8e84864d8550235ab30786ee74aa2821cf5babbb11b4a2cfe542fbfea27e1c8b73102493f7c386b835d6120b62181ae0d81e5cd507aa94e9cddbd125306a740322bff8572b031f80a03da8702162d6afb217f988c3664bad1e703c4381bbe13daa785212188ea60ebf6854c074e588b272d21f5b61bddda914d8800ab47654030d1e5c36c305f02bb3957605f951e17801535b1370eafee04a5e7e28c0da653fef4afda9dd231ceb722470b6932aea12939b0b12f7cfe8eb3f60e65e09e6eda111ffb2b841bb76d0dfb2fecf7d1000b24f7d6a0c9f9266e4e86b65dce6d69254f6d2cb9414cb60d0747b42ec21b4a7e30262013ff15dc9bfd3c19ee53e071514aa84b4a1a91e913ee0de62858beba406b557a15a76ae698c5f708d8ba2161bc4f3c0ec31e409e1b7d9a5c9847e086354e02ca5b904a665bd39c493bd09b92d1c40a65e025ce2dcb10e435ed708f473b1e53eeeded20f13e550e36596298b97a8d34b1fa2952fe3c9e0c4f56eb4c60e2e240078793dc45be044911ec9960dd0bdea0ad2568020165af3b752fc9e5704b60db8c5e7969fddc0ced69d59cdd591cc38699980012592fd992140ccc9ea8368ea91053af3eb7036c2b91237872a912aa151140645207be3208a919259156165903e44246810a580dc8751f3f815c2e1215c83581af815c4f75aaf032f31f1d666d9628b1829ee2a1b5535ab577c749f4025ebca5137a7912f01868e64496e382d5177a1205612484400a794f8455fd22113cd74dc6f440bee1e27a8fa7ceed3cb6b30aa7a294fb8d3ed3bdb6e579e4a1d61ac88cc4796a71acb0942bd32eedf014e9d3f164bf5a08c587401d202602174d48e4b945b505844ff54e283a65d3f9e3c341c37cd1067111d3a90c7a775a900b3f1a584aeae4add412486fb5501f0e6541d848c1244fdd9a297ac2ac8d09f9f7692630e441fdf193d9085b7edc59ef9ebc2ca05e3e0be86970487487260b0516ec6cf0656dd128320e9b8da409925362283a1a0da9a3e9e7774ebba209c7238c482a4ae506ba690c9963da684128499995dd2f3fd9e522f6929e8de489e1308b9622dae7ce88126fab8f27575278904a4e5761e27cc245ed1822882b6cfb09ac280fd6ac1ca750a7b55a11d27fd89530eabf2f6ff30e9dd4c5fbafdb550f9d1502902da0ec353dadc30e90b8686b340727efcca1e3f257890e8ede676cae2581ae2a1ddc6e549576f5bd51a5d222a18adb08ae12de0906a3ef050928a48de939904b03789fa801f417f3f78302442c5567ae55a600c3f0bd4101096b1b7a0ebd37f2bd4107bda01150738cc86876a3c527eb103d3fbd8bde97cb22c83582770afbb1b6c7f823a9f25a7f52824d38ebc23b1e832b45bf98cc064738cdf28373bd24108ce01ad547437106d0f020bb0ec98714c1e7595e30486eb4cc63c7a314f2f441381c6f4b9603a615f2902beb23bf07059b0a0232fa10b5316ec830308140e9200aea4d18634a2fcb41f6854c18be21229accb7a679315caec3776af03c638661391152d03630fad8d07944ca074fe1222bce5bf56ace5bfb9d1b5321eda3b1a09caee3e102f7a0a12c10a01950a9c0f131b4a95768ff6d4bf7075ee270642f34b8816b59156670980778e1683c9554ee26219468c44cf5c5ecad7078eaa6eb13503739eef06cbb71660dd76fa55e82028de2ef0df92de2753b35340ccfb5a7088ac6821da5df8816f50c5cce904529201f2165939ddf441132dbbfc38c00fd1a683ee31076fedce00def4fe53828681da0008eea2392b6b71831350fb7b644007260783c82d43c1ef5a65f80055f3c13b6b23ec4703e73c7de908f3e36ceb8e1d64795b45aef1281e4f088b25a32712462cb9748620172183a110e55f456a23e441ecdf7c2ec075e6181f6ffd050e08af004a3bd65dad99b265a7617dc8b40e989782f917eb8d391db42f708f9a21a9e9cf3a23d3faa45e46d69bf411ffab431f1919cb8d09167a6e5d7964d0e4cd24213a93bd2d7d135c2282740efe4e0454160c9f2eb2325b6c8545cea000e5aa01575b4b1ee01546baba24157c9a31d1f048a88fc510cf1b48f9bf0b762867330de16d3161749588e260d2f92bfaa81f1036f543433a5b095d601990bd9f2f88dbb08c78b9bbb4f366792cc0fe66e41299339c3fee6ec3b204fe01a5199ec6ab99172c9bb371692449310dad24dec40ca6dbb424c3d58d42531b0675f92a5916189a8cd63205193d5faab9e1b4e85eaf37e6aef2307c41ce3d13ba988701efb7653311103cb97063ac8dfc30bf0ebcd698dc660e91cda651f7ade6164ca1c15721dd5a929b97109841e59f24da6e8151c3df8508f1e141c9dec5b6a37b9b62b39314e0400ccc9352e0c3547440726cea8b13d7f8f99272f25b7fece9c3574836a18ec945a3e070ae0dc66530d56b002253c2c1eaf560fb41f354d8b4d5d525dfd93024471307e40916d681c4ad3b44eef4f7b63b54b41df2ca5c85abf34bb284d89af18388c457a5a78e8730618e58eeb57580c13e70c03c3e62f502e6289ef432b822df6feaa16c0803a9f8d1bd7373efa11f813aff7c6a57a7b476a2e1114e81b6c8491c3212424cf92f4d45102722c94c6509be8dc387f10425f150d77a81b5c872353c951653a4923ab7b3a62478c537a2a3efe0bb815a2408d7e77a054046b343eebcca8b450f700e06acad084485a70b3ed3f2bdcd57f93a0c8119b384449fc91680a850ec439eb0da703ae7869602c946cf538c2640dbb4d77d30fcd001e09fe57c2cb043926a40844c743d1cbb9e010dc5ec49a59f424ff9df3b422591876209bfb8f2920e694d53c2aea43d1fd4d5b8075480c51544bab990c80d9bfcd339b4432a43c03d4434de9db63390a82457d24e9961137f536f6e0fa126b619ec3ab952d72ffb58193f1ba62f058632d3032c93b406f71f8f5e650bfaf99ed3d294380ec519f90d2869a04e8e9b5d6fd437fec0e592e5f71628b21d008a2257f8084e9f8db572321bb0ac92373605d948e7c373f08e8e24e5d2869cb20eec106a1b0e15e78fbdfc78ac98ca4aa73b887b3f48765a4159720df0f57b1fe3ce7fb04749c08bffa336282e63a481cdbe48ab47bd34f9975923799a7a57862f0a73dff9927dca743d006bdea81c7d3b57cb59616810659892de209c59d402f6f3a7df47d6d0679bf5434ec84201e505b3517eb716156b770b5249e9863e62ed4d8dc0dc8c07f7053a6442c8efef342328e8b0495a497b1eac99b0458234dfdbb3a5dd4e688a13ac7376d20d1827263f75fd97d06f9c20c765b21d415aaaff428bc18d73c1be87c28f45e4ece23247405d837aed2c1fa335f70952939596ce7d89a69e4d4ee09a6c9cda9934216f53d4a5bb71cb00f3972de438f1363076a40e9cf5f3d1ff94a8d67c89c4c24df1aab053beb373e3103ebe9785cbaf9ad96e24b7f86d6111fd750e386f8516b0745fc79fa2c48723e0beb15ca6e6fadac083774d5472b219e90cf77e1792642acfd02dcba4523d08ec7b8d079e890a727b0b92df83bc30311710cd269cb4b80cf8c0781bcbe07441b5b847c74d5ded064f8a90f602e9b1216a19e7435ce53bae68f789451538bba9278ba5ce5ea718241711ce469f92b06d9d3325f953e7f13861cc91d27a81b052f5fa9c47c750c920e73f39488d16281a05a7f2c3ae8a8ea8447d53fa48aff8d0f125940e2780ccd1e765e7f7652e885445f627e42b7481593605cd93cd24f43306a4b9de5884e17f4441259e65ab00be54b1d241a2f562796e94f8e0967a4d9f979f91681c50d999204c8134d467cff0418b95673ad03c32c4cd9b07aca5d0e06a1d228faeb4e0daabceb6ca612805a4a4a8b956ebb3047aaa996c00dbcca95d364d0155b70b77d5b80aff78de4048deb696c33e11e48f5f2c9dd8a22df3e9f7ddd9c8dce1256226ba60b3b91706483c8c1a2f676e087e79b688c74d014ae911789b9b9d07ab248da2c6ec8cc3ece34e82c2b24f0dcfbc2beb00f670189a62951cc0bacc0719cff6fd07d5d0fd0e1a6a0e09ad30d044a81957d9052879652ea0c3abf07f6fbfbbe99e460109babeefd8a99d9cec0754aa8c29fc2f39a11ac5e1d79bcaa69ce1ec43528830c7721bf7e4f14786c67ca21c21203659a401a35483fcbc3254cff4478ded4187d2647d1a31eb65fca6a9087b827d95c4da0d611f7148d150b2836efcf4002af3be6fe7ee84fcbc4b168fb466afc0824b028436e8b88f6eeb9534ce69c87ab2c00505823404a33c63f29c712481740421389863ffc4b42a692bf3d3c2a8c55832105fa4600f4228225b246b455ccaa50cebaa6da7ca8b06fd53d5d503d10724f4d642089f14505d50196300791291e36a368f63918275c30b89db6573d2250f5650972d39676c8443f5c3e7c3d4cc781f90a01b0c37d8631de70aef57fc7ce1b711be548819bcd5294a9548a126e050e6f914fc0b3a8a885f9b5ab0f3b0faef780e498f65bf9a63b66955ea917694e20a651aa84ea7dc741b1bb719d11f4525403980247de4378d228a4ae5b88730e3e6f94e8e588d1de8df58d12bc12cad588d32be564df64b47a9b15612f4963e413f383c5ab26a4e54986fd807d2fd2c323e81a90007962d9e653a5321f8fdce3db9730cf0cdd7f6b53cf4903d9524f6d889e12896c288b31c6ab972197220ec17f62c5f45e963db1e21af6a391648d33cef843abcd8530a09386d5c7fde396be0eaaa0223a3f8d42ab4b73dfe3602249a721868875f4a7d589fe1177d9f14430ab7029264aec27847fd7550df8069928e71f219dc9f9eba63d37d70785e9139562219a15d89dd802c2b05ffc7161544514e55361128bce29d25a87f49e00fc3d3b885a493c21062dfa5f66824f567c0abdecbb9f20868fddab372a273414aac1e90d549295312fdc271b1f98accd992950cd6be88270f9d6cc27dfa976a8d31b4a8d5312029db92863c51ea61d88b88819046bb546a6d540774e72209258e7c7b4b1819e60c8688f5c7a19c48471d9026511f0b8242441a4a30b0a0849a0b490ddc681c46ce53d529b3275205c0d01a7dd441b478ffe4faaa2b620e4d0108b9e9e9e3640aa75de334557e3cb6b07f810cacfe29295e1057d818ae00193b6f5aa8a8744d515fcfdffc53a71e83c4842fca7fb29e60902cd03d3beb29b6824cf8083ae822650e376ed26f6cf022d07e354917fb6cce6a191a28f15a7a65ad42a2b161045601ee964e33241762cd47eb44df9606a47755a011d223a6f79c93b9848e9c7a970739929b4e9a7edf9077deed39dfad0527d3fa318aea77341c7e00ac28effc21e9209977e65526022462a4a9b92149aee314d9654552e32705c04b8680d70f9241ad94e6d561f57b156c0e9c9651baa89ebe1a2b00cc70a0cc41588ba02a9af44a86123385f8b34850ce5c224a7c0742d7c5e29144ca5b66e750b076d43cbf593ac37dac769dc9f4e75c9aa8d8e7e05c2bcc127fcc49ff506e96cfc934b3dcfd916043eb886b17c90d845e15a6ca4624ec50b2d404614b70d61509270e8e233fb1ca9d02ad75576cb43fb1b2730a1689706cb06b5c647f7ceb807f14e534e84ae6c6ff7939940a815f98419c12a547d41864295544f61279f20b4e8e8d4c5f6aaf3b94551dc6dc0363902f7b7c0e4b43313d79da471a9c2dc0014c3170aca22cdb5fcc4bff777af9fc053c7a5e996bf551075c7182a42af7335ebd619c98d44bee7843cc8059f406711a5a7c8e8997f5f9f55ff807a1a04ecf6000a304f535586b3d489a942cd7337ac968c55657d40a74eeb05b5d96af3cdd38fb2b1b6855f41f6c0c775c698aaa753bb9d2f94defdf7ce399c3e787e57faf5b411908dbb9b0e849fa18a9944f9ecb4285e0c01954d20611abfcbcff6ba195bc2a0ea6a0526f12d6031bb94f77879ec0eea593715ea364c806e94f3948362ff2d21e89ab94019fb978b96ddb95468bbd4a74ef15a27a16269186ab73b11cae325e584da2bb35e40119cbcf48885a2b1b8b3d1552bd2b92492e143a494117f8310703f55c0a9993c752f4c3ddb704dabc8f67f956e1ebfb4f15bb03a10e706b8fb701a34f372a5561bdbb72cfc5df73374723fa29f0284c937dc073b3a62f7ceeb2dff56defb9dbce2a1b6a189f4bb63a432dcc9dafc586c2a3d29412e146eb7c1aa8b2585b366d0f1c7811a9c731cd7713976e7374f6b37ec80031dc71e4c355ad320df69e843093605ff1bda51ad43cf11cffcd2eccd70db7469ceeddfba3c94c5440dc59cba3e3c7b9526647f2d685326ab1018b689a6bec1c5f20ead26273351d73a3a6c376f2a45c5b7c181bab07599e20f098a7f6da0d4f1d35c26227ba43e8c324364595a7edbcaad120bdc830ef385da2e1928c42211b1d1867970e55396216d8fb22c3ecff40f863e30e9efd105a0220b910321c67f7ddd49afbe72310764d0b87c2d2945a2c94dd8da7e6deeaab70184123444387de0c70403d9fc233546e5dbed7d1b0a798f80624e99a3b2e436d5e52231cc90f4047f3055132812ecb6ecae82860874288e604038baac01fd2e12cc65ae013293c1947f647b2a33a8cd1d4318874ec461a28dc9378cbcb81510be3b49ee01610ac8ff603e2a815c1ee7f33739acdb58f57b5f1a3e6ff1f72c1c12a5e0f77ca909a02c3e64768de06ef257db0ed065358040e59899e672b534ac4a853f3533f6d4ea48086daaa9032a77d1242cc49d16f2ffcfe59829e3faeb047b8b1a424e6c3d29cd948a9ac3ba46fcc6d7f4f15f1b509a24f4df4c5abf4311c4e155f0f547ad03e6d4c35acf135cc504079a5c6c4837dba96c141280b5a3d6176ec4326360062d0599bb058bf8b9f5caa6508bf2bfb437359e5aa6a9e1b6e6224fdfe887cc8e7326283c651ed60b60eaf075368a0b8b5d7f64975b5ad040fea92e63fee2c6b338c6a71797df1f042123bc73dfaac298b362e0a8a4f326d1d0bb9f30619dc1db118f272abf2f82aa662090502cbf6279f8edca43d3cfd3cc627150e49106454f349c0a9e2de510b88033b22817878525cca53a2ce90077ce5509e59a25776c3cbdc7804e5fabbabe1fa9fc632fba15847d035c344e54491d9407ed29f04892503e26767057290220a1c20e04037623ca7bd7fd15e36370f588e002b2ccb78188f519081fa7259c70fd8cc6a74f303b5695c627f00c2bc8335d0713fcaeef5a9be6fece622079350fcf137a8e5d04bac26a0e1021d0717a9159ecc73f6d9653ce1f86bd9f7fd822a125f2175e13dd1772cb108753ee4a5dcb888ef4125798c3e69bf9669a20e2ece779faa989513d31453fc349ab93393e7479c9d4b95175f9b0e3da39b8e9ed5ea42f6416b15ce5e4716b2c28ece3e19d0b0627ab14ac4f5d08bdc2591fcfce2b59db5dca3d9e839110afb1eded430357076eae0266320e420a2d6bfdbb7ea0fd13bf374cd700b4015c9df180124053fcf1a421e121902b3634f64db60ef90d6a134533316d2cd3263f1efa25a83a3c6d0dc34c97b62eee3e2e5e57401e30ca583c9bc5205c808a60ef831f96c007280771850015da05c75c6ccb241b928a2c9eb054710c56bf729300a9ab3a6cc2d59dacaea3a0bfe93fbe3c872acbbad899b9a6b16b26d7bf2b137be11a6c660d989fa2f8eb1a2855efca2bd1740d3f762a597637dad2e9795829765b8872ad4de97a5832e23d670986f0a0794fcfd11e206334cca4e22b6a8768a497c170942dd1a6eed8ea50ca18dfcf96056b59077c3e4bcd55c46a3e22d2f03b8a320b7e8a8187483c6691fac52c10166631e6a375297b4b6fdb872309eb206e5a0fcfc67b8e37e1c6f890a0edbad8d0bf0d4f71776bfabe9c87af6613ea8f221a6553f4c0ef6b239a9fb7ac482334474a0ab20baf106956d7504d24f6da89250fdf05256b4eb96a28bbc30ad94863b7f8614f80cf7a02803b4def7f4aed064ad0eb2689c6874aacd9c09fb425944e0ecd1c1d2021f4a82f9233c114d53735d4e314d657fe017a81fee2d5f0ca4aebd4164fb72081926058881d85a14392a9a69b24f252a6805e2fc3939cdfcae9509193184850aa3ec84d16dc6b462df62f48817d40f95c76c253fafc8c2e3b74d4cce9a68dbfb60008049c93d272470c13eaa334c98867574b52aea035d718caefa7d5b1c14c078f32183099c0c76f3198876c834650749abc1bdb4944f31d6faa783fd196e0d3c6fe9ee81442dfd63d6031d643ab2147397b667d2e6127312379cdbf421083d170ac3ae2310cc30a32f3bb5b22b32d694414fddc3a1e4dc9c7664a0a69d963345ee251be30050c93b02bf11660214a71cb66f6773f83407d1f68eaef61857f9f7ccb6d4daad6362b9920d63050942b19ed880232277394d4fc9ccd5e6da99d54b3b1d9e687c2be6a4579303ea57e58cfdbb8869fcb0dec7874435c692beeab2913b8c8d0a54429a1f844849c93c17d024f9c3666afe81be0995814712c1c004ca8eeca1747939a0cc5f689345be9b726e6c2a3876cb8e85798ecd8690d905e1812b3b8d3f7716c3cd2f20a6d141041f762200901f9889e435492134b2899f018da51f5572b012383a73cdce855a1a40a61d5b79852d89614c4a257e765b3377e8bc121f09cfcf26739e0120324d25a337c1b70948a2e05142f3fd53a058d326623501b1290e931df013e3e7e60ba0c5858c6d1fac90a9f81e9a00116aba3c97444904e1994dd97d28192537512abaaea0d6d83748a417abf9a7064926502fd0e1f76c8d7b77d49a6f775702d72f43885c26398d086289ecd156f30addcd7e903085ed55447761b4b5a083478e3dcc6ccc571a0c55920b2362d9e7541df81fe03c65548730a2646bcd2475218848a601710e622191d9ceccf4ed1285cde88e60bc84b0150b602e1d7afe17360358afa1f913a6662138fb1aaa822bd368c64bff5402101f528efba23c5ea9dea4a9eb4c890d6484cbc26e87c747795ae9da9f76b45e03522a5aae9094953000aeb144e477b35653b2bef4a9264b1117050ce0cb12b0bd9ba645fc12fd2f117a846147d267801fc13f6e8239cf8ac7f82081ccba8d6d1232507d1c8193d0e65d97e751ff37c79517ac4916d27742d7d56f31e7a5c91ff6240f9b09e0abb931bf96ee2a27c14d9b9be5cd5a062709501bb9aa652775a440f15c3df04a4ae673c22b9211f3d60ab62e195196d31a5c67ab8185b0b8c27efebf44bfad0d92bba4ef102954cd82fd52e9c3229f37478515098a3a419d1546abdd015188cb6e37cf6769d02d2bb5d0323e0d1156c623df246da437303b1337eae0e20d84257ac7dccc20954fe367cb4661eae2af1a3bfb0b09e0f6d7366120f8604ff858165987c036d20b890f9af7a6139e4e3a6c102e16b9ca3984a9ec7b4ce82887f097af0c45b54c6fff66c9442f72796fb1ea7b775650e53f3b0d92df7fb027d4dd4679265133f5344ce0f59bf2a4b00b7d70780061c8ce83b41eb44195064eec82a89a5c66ab6bf02e873fcaaf05017ce1be746079f602af9db60f8f1241fa9269e025b56799f1517c27b3df42140a13dc02845c7d92a48893b6ef98a140a2cb5fcd389d5c75b750e05b098ca609ba02b2d4eb19670d8199ed50df437ccf97f535d786d3583be1dca6b1912c64c03c41411d32a6c455892d8a18905f0b07e1b44198f186e32b929afa3999c617bc2aad53c098727e2b31edc5d74377bfefc355513f315a3dd5a8636d8dd6219976325efe5260e78c74d2105ba68e2b703dcdbdd00a32b39fa806adf7c56f07e43e2a1b93daa85cac2f33eb4b517fa73edd6fdfc968a017f7c640184eefda7c9e040af6a89d6602ad08037b0cd28ee55fad3f4023a3720be97db11e0c1ca77381d8f52797a7bd5f3745bc38b2df130bc086f9122e8ccf014ce8d4686fab2f9e9f9bd17f21478ff40019c1551801a2ef70b797fba1c0db36856616ab4bed8e682214c548d16d6eaa4151dd7260722a4fe9c7932ebd116af7cb35c6b0755c4cb38650c8a7cb206f0f79c8aba3d300ec00c03af0c230e01ce4aa15f911ddc73a0f98a78b3cc08ade2e40a778db9b92318e06d0b4849f84b1db5ebdd466ecb019ab4a6c7dc6404da71065b37296f25efb5a02a8eaf486e4605025d218a65291a19baa1c7785ecd1e97a6cfa6fc6715a1b280205ba39f456153c4bef1eeed90fe0cc99d0b9bdad3b08d748ee419c7e95ba1ac2bd571c4d30d7c9c29228ab92f801ae67b49e1a82163347c761d68e8df4925be9e1ece7dbd79e4483e4e515f5356f3342effbf22b70d0426079fdc11cd0132d9bbe90d83c3905c88097b7b9b8f4190fd4115804500186e754648559afbadfd4a04b21962790d8f88252dd11045988c41459816fd75adeecfb6c031805ca908ea01ba73d4a930087ef8ab53aa10e99d708e3fe09f44d95e9b27c28d20271e237b414e3fec07c6db9e0138a5917421eecab2d36b67e7d78b585a8f845b2711432a5b3c699e4e78c28d7184f8eebc6c647d6791a7b92d86967f8eb322ebb68391848322a7d0d5b2b1b94b0e0d334cde32b88426ade7c7f2bdba529afa53e94bd4f92af35f0abe4257fdc95ec2f24964e44a8c91d58f4851020e9bc0293527da78f66eda3aa819e9fefedec109059331512a6d03877ece0a8d0c8ebe18c52b41035b5e950a77c525fa582c858a0e9ac2b94573f55a8e4c8e8b8895e00ed2d14a3f0a420fb9f14133bccc7dbcd5329610eb5f0c0ff3942199f1211365539c5027303feac1dfea4312a5c951df1c3243661282283c24d9506d4592021c027acd7ea97dd11821afd7e747d66b58ecba0767b2d16d8051fe51e5c1f87c188ee7f2c38b1ce7acbb3a77cef81f360c1232344837a7b37ef7e595566e6ca517feba854a2eb8ea9e4dd23737baea5c761c2e786c1b4f7bec0ccaa68dfdb19142e93ed4d3023309ae28e9b578d468e58dbbeb0a73f74fb55290c363f0d6d109163dacd7e2e2ebb1f6f2739b573195cea50ef9088176ad2b6e718ceea878ba375e4a2277403fcd210831954e5acd69aad8dfcf4a486141e28e0df1d75bbf77abcc03738371e4bae661a468aaab0caf8065d644e5c06def8b735a3ffe4711484cbb109ba804970b9b34a601229fa81bbe80db6250dffbd619c696eb88739241cd1572fc2b21d70d15fe593b0d4fccba65fa955758565169d5978c19333c70d55052d9a8c1abcbf4d5bb61195ea3266e19025f29994e065188237886ec95f39d71e30597fec2b3e362b1fa35411cfca4865e47f1d26d6d729da969e25af9c209d7f60d8cc818903108f8341e9155db74de26628fe85ae04ce526c4bf0f066f59a442f8b7f3f986f0d96aac96e455ebf473ba4f7e3e5422390b5b99c81daf903fb9b97bc3a906dbb0612551e89e614dbeaf75fcd4b6bcb0adcb5681608b1700aab9020fc8c1a2b166b19e9ceefa3eec6fadb1696cc3edea53225ea706f30ab4604fcb5c02c57990a6240855f0209c1de874821277377718f6ec8448cf46cfe8bc1da9258116451a5ccc2941b3a07a66533588f0d21e97e9d4ac8a4f0688aae61a219a525d8763c787ecec4b529cae1bee064504b137f59cb114888d09187c154bd983a38784c0b5bd0786d60291d1e349e3de36e1cda004a7570198f60424175e88063ca2a1f38ca2865087b372551a053586c8f191ef9216b42cb6ae6138f54eec7d653b4a92b1119aaa60e964c773bdab644e565866b55c4bdf9852d2e2e7fa4ed59f5dbc9b86cccf91047e3e5b2c7e0aa30d67eb975e142c5f68d9ef3a0fbc39f744884e92fde475d19be8ab755d34c2c155dcc99e5b9711224016df5029b272e815c89ae5acd7dba8981d6c00c8e3f6b2ab0537ea7d98d2ca6d9d565c75bd86c143fec0d5b21caee5c7b0121f0b81f1a129448c2a9c834f1001b15dc7ae03aa0400720273f8a00277195b146a8a968eefbd5e8800118bf030e33d35f99e0d2aeeb819d59718dd064eeacb49d8679ee54e565f42cb47f71e10ad06844ac177f8d2f86c396228060e6f261988c85ae311442e4b47c825ce98be48d6ffb7579c5897c54cdcb18d88a7242c99703a87cb1c9d125b120c8e82528ec60fe895e24b99f9a3609e008f731033a8209975121ad5f3ff1f121d45211e6c2097fa11c17051ab526d8e247effaf44f6d5d684479290db3e4de0cdfac0bb4e2db2e734ed0b4d00968f3b50e6f6181fbd1415451444d58b3ddf8f523376f45205d544c192beffd02a7578d98dfb9a05d0916f968139c9f614ead347ffd80ff4da639fcbdedac613de4cbc5e3b25e6d9c1d90bbd6d7e821fe2c7ef7f1b4f85521fca44ff3e3f598a46f9b36523f19ec7f956c35e79c36a6ad5b3f2a68330c372c79c422fa9ab1e8341e2531701f0fa1e113674fddaa850afde31469477cda4e49c9a9628b92ca852f1f575c37c26caf99be129ca5faa33880c00f69cbfbe61e056b62ce8aceca3491ad38f0f05bd0153cf2770099d2a6981279e7e2962eed30183812c41520003c4cf7178511f05a13a1129c5b7dc758f5d1c4e3eda50fbe0f5e7c3da3b8907b1bc085e39f9f397f672377f8c45df9e02f09487e85ba71c19af30328715aebd1fe61cc82bb7bb5b7264a98590d8903d46798c05758a29f60ab6c4812e27d6954bdfbbb3fbe0b5155b9059e74d5160e5cc51c503d1290d2a4497398e561004f74d9c8d93711758310afdf9e2e86ef75fc5a5b11892ddb9fed3d57c1dc82521a9955bcadc981ba4cef97012dc69c28cea9e0f34c97932bc94a84465bd5ec4caa16c25f6bbf3ffb98691cb990e0682c41ac3476afea0e6a71922a853af7f97584255130b82dabc4fb10200a377fac00c7125d8a4ac28717831fcad0cad82276065b754af08a408a54739acdfa51167dff04d8d957ca9f2eccd3641d0879e95257ab74e5fda2793dfc1ef1fbe1d4af15784c33f0a0c46708ccf498b4590ab0b4fb6b46516467282ffd84a1bf8fc5c47d11a481348674fd01bf3c5042872e4665d44d1dc5801cc0678b7774efb5ac59cc12ea07d49c51492e3aa089e367ce444da064416a15c2bc4d67910b4eece77f35bba7a453654520d4a8914fd5c8a9685eb456d4776d1bf6f9ecfcb45ad196dcd151b3d20adcea454a5f8d90a54b07ab8c911b610b57644173056a923d0001b457290734fe1c1be9bdda5a52211d6aed1a993b8149635790b282fe99a62d7f8039825a5162cff1a2363edfc450f94df76e2a8a0f4edd4646f24c4edf0cf9aaad9991af073c27048751a13336fb361b44ed2fa9aaf63acfde1eaaba838acce09ccbf03a804427b4efbeaacb7e226a09d71d3ccb0f1543a4db282581584cb3549cf85dbc0fcc0dcb2a2de4954cd4f4d2ab25d5201b387498a2b2d207697bcc0c248cd59e20fe5851660d58e7d4090a716a236f3c7927ef1585ef0553f8c33f126196025e885e3efa2585f03e1e7f1a5839cf53eb0755d32f6510febb9e836fda0f0de6ddc3271166054aad88ea907afb5d2f30d13cf1e0b75ebbec38e17d8f3083f8a8137d227796fd8afd6e0f619ab05541a068c4fab11c99e0f8079369511613a5d14c04cf5072053ae44f497ad203f99273d142c1c2a5641c005192424c596763197d4b421c3bfc4e11db7161652652a800b63305f00770286de65ffa583a2d876dd83395efb16a0290a893ca02c28718103274787093702de8282a53696fad24bd45cdbc356028848097c9757c359ef12e54f5d117414b6b442a4046c8743c79ba11c22491af9359a359e215262cff3a9f81c47144c3a6d4eacff10ae5284a6eec533e8513ec603c67999a4ee742f33b9dd4a3127a02277d323b99b06c337d10aa4c64115bc2525d5d925d040bb49d17793c7419897d6e5156fda64dd39e6a4fb3d0eef45356f9884daaa0526d1d61c8e37a6848c6c8c49bc3b3192d3c6d50c780c1fe8ba1f23373db80488668e5abf87bad72075906fd6340cb61c84f6b48ae985e9f5832350db6528505a8944552d24741f564e2c5ca95273075aa2f4a28b45a875503e056a199a33831670adc481d62b6af4f7e4fb8314e6a92e1b5f952c37594009d50ffbe4acd0fd9725b78a6e2c0d9e0d03b22df6ef0aa44cf291ea55f495b28a9e395dda6f66153022c6d26acfe2d974731f20cae6567295649f5e4e315bd03a007aa6c3130ca34b26effb5177089eb7d025927e705783d03894dde87e5271a6e8a2f9a4a8afe8b04d51d0b21defbe72af8ddc6c0f325c9929d880dadf98db340da6a24bfafac420921f9e787c5debfbc7394651012ddce4b860ad9bbf451d8ad8be3a723d517bde314a77c60ff66767c183a746d17435c4ac19deb0b7e76e409caf78a02145afd960a83db3d366329726dce59e8d4d2fa7d34b91c56e52d04b51e1c9c21dd7472b7bcef33675b05e0f50d49c28ea9c3392733727a92a8e6277f1ad5ea29589545dfd9277475aac4856be66cad0ca444081eb32ca13605820a55f4823bf81995230072be3cd99ceeded849a4863650ecb58075aebad126af850857f56b1f7d218bf047dbeac1ee5af966454bcaa08385f1e329eca9413a2907b215db2639d69f87deaf10f47e3b784690d68ab0b954f212808844c2ca55ce3a3328052f7e9866fa7f9e6172296c22e0fc905c3d5035a284c761da6bdfeb3530e9743d15f7e260c47b88a4cfcd12b7ad7aaf1caa3538ca1b3c28ff73ce97eec85ea8135501e617d401907c45a3c2974fb491e0a014057cc4018b10663b9e785ae187f13d127a50a2c918441df4d53359e88aa7bcbecf052da6e342541733fa8729f2802fa1cd110a167eb82f288cf28a070704bd4ff196afe70c37d2b1ed6307e35a4e6f221e29709b79f8ac7bd8d53710b2fea67fb5d588d7c0b0ad607d160cc21d98f9d5ef6fc4d2cc21deacfe44e612a80131f8ba1ff33242249141e1d5c837c86995c180a3c0c360ddd97fd0abbcd4824970cf0ddcd077442afa183ad10b71111a01327d5ea86c9ced8b2e3576bf51aa7054448916337bab6a02989a688c2a06befcffa9219513129b20258c3edc4c44be841f9306b3d7c769f6d077bac8985da0052fdbc596893718ad9e73c8373db19622468d0630dcbb0102710c36d33215487357423917eba45b494d7920eb22f74964dc408ce39cb2663f6757712d708a1b1d1ee3b16e6f499053e263e800e67d6e72edc61f09e4943854f87e28ae790f610aeb9da5bac18a1220368224c9a4004516f1daf83e44de140347481258d070930200c5640eb038b34d62d5f70a6b22c2fd43827939a77968fe14641fc3226fd3fe63237363684767292be782f37b0aafc91da0c4a5e4c33e80eaf462e2ebe81ecff8f8f9db7c76e2011355e625db250b328311f764e9c1fc139fba3944af99a908f65c5b3db95b28a5e8476c2ee0a84bf5139a2481108a1bc4f815a03be4118b3b270fc5c037888c6545ca26f3f7ee1aff24d9584072a818d528d8dc8e4e73014d4ec271178c758ccc8dc6626516cfb72d863f30e0a0515d2e613d21e3dd268a750de46cfbfc6f647c89391a465156933f51cc577ca05b57ed04e48c30721fd711f86228016cde223f53667e1556f94a58f1e6de540ebc5d0c457ce267228170836576035325fc5815e7f53c2877a099c41c2c2dea66ea3f15304e3fef8a21b9f0f6c1e87c943fb12ab3fedfbb509e301623e3b3494d1f3c908a373b387d8a4572d9d7a0f972868cd9eddc7f734b5acb97c2612b633ee3b7bb6023f6bcc15456a1231ee13ef35ba0c7d17c57c2c01b9f8c9348cd090ac67cd5277e2e3e3cba28bbbefe319ee3d05681325c277d3de2de4e8c6130e53041433f0d0e19dfeb5aef1ce72ba589272fab18df772b4ca3ea61d3b1634f044d07151f64d567c38203be21aa345bdc0fb2030b553d40ca07af45536b3d37c939921deddaca3d375d106b9a78542090895b64ea10b3d744ff94b6c1557ef1825ab17c201bab16884329de986c5e944ec0823ddc0c1553daeade13f258b928c4dbf29a79cdee573ec9b2f6eded9596723ce11fe67f4a8d5ec20c7e4891cf45e606b9aec59e6743b62a51724156a9a99208e8ca81b7bda509375dc402c3e55387bdcafdbabb2bc86dbea598e256352a3951a6e67291ef599a4556956ceeb5266c3df454785d9edf421624d0902364c93beba27a809fd14c4ac63cf2544f01a09379db80a2ba70572185680bfaeb82de4c06491026382939e743f0cb4fd7a7ef33f2817bc6e3960d6bcc87521c1246da5edd1fdc1885a400cf96e6c5b1534030c9920b24497c03d314b617142c49c284c11ca53a23665fb0e2d02ad357a8860a6a873399f381377fa6258d7443a5fb96e4abf713196fb7bbac7861cfed376a09aee873ef16744cfcf9f5fcb3ea397afef09646cbcc3427d0d962a88ddfaf291d8558bba0d2f2b0d2708a96ac4108b5d4ed18929cf1422f452ec6156495e13e420f43681e300cc4ef4b7a8b7a4647f10e36e2811dc20dddc87019d15c2a05af07fad008514100fa70668ba711d248095524dbcf3b7607ddcdd12b64f259a9c27d433e9c1daf081cb0e04f68bb314f4d01515b638071c347e92564fcdc29b3c730b18a852a3ceadd03eb63d76b29578951962fd5235b6651f81d341a804d96a0215db7810c2da848608612076e56b823dcd81b9a9d640391e4d2808b10ace0b191ed711c773f648aa58a1b14a63488d65c8bc04c4dd4841258397c87365248fd144c01d3237f3de9764418f50c508ea37e1858479fc7f489b9886aab91cfb82c39728b90810faffa9b864520aaf66d78bb3c4a9d673b6e50bd373e008ef5ba7e289c3173d01eaaa9c5a872282ad2da7afb6be9e8196c7db69e9a2e4f7e5f679f59face28470860c048fabd28174422db58e390155adc66a39bd0f4f93566e13fb1fc9708eb67ff12356ef4123ad8465ec503f52f3c2e0d4bf482dce5c3935c1e7086ed0ddc3585fa738dd0d026f48fab810db7b486d399cfe7551250b8ed7a5b68acb73737873faad4b0fc721c815fbe99308bc5c16e8574989e1f44b2ce1e000e99928783038611ae89e9abdcaaf224e8a9447399f78d00fae292de636b029faf3988e9b2cc3c50d05517054fbe5d5bc094445aab36d057d29d004ac0492a41bb6f12aadb02c5cd63b0a4a50e4e64db65d0417a1dd01fa7f0741f029c822301689a11d12c59ef42ecbfca75348a51225ead065bfe25e9495c82aa79844fdcc5a014d998291f534349b156baffb292f1d4898fb875263df8fb1df81a7484fc7bba5018285752559fe2c0ff049cbea1d4d3587b1453396777b8a2200eeae3040fdc9a3f1f1a9ae19b4ecd1a69a4b65c8fb3361d3dbeb91e4ecea5af87a8a25be5ee3c7d7c301f97a41df07c6e5a721552956a214012b784810fe96a4e6b65f858ffd0b95c8bab94ac4073000fcc94beaf5122da39b6b2ab86cd83dc50b22e50b135d97238a7ce151c389d8d84bd230d8d620dec292a802ec4fcbdaedc25d9ece4a9247e530248f4a608194a0b58e5471d3ed5f30a3024a9e344c5bcaca7a3fc93342be9f6978d7289158054f4b79e3e387d951118d87447b64a67116304b0a7b0bebb6dd1d1cd317dbee3a869b36bf12a218ef2980b9bd8f748f56e7bdd5e1d81f74a6923e0c91950af6217664dc1b00436d8700a012ec6e34ece5b8944aaea48d84922f25d3e422ce1f6aa1e14368239e875fca5d4e614be23e946b0389541b1eee18315d7bd745e2f565819555ebdc3313ae2d1457436c46237233a87281154d82daa13777a51d57b4bf604267c8afe10a5b5cb7564c16f27421c4c9f88fd69e072b6f075b79a1cf3ad45a5d515eacce2a4a99ee0fb524263aa41930a2101b090b05ce88d54ae502785489ba32e9fe194970c20e7f19b8044e6885599bf82dd9c0e78e167d9e9426c3c3d243cd1a7de986956a211fe84110d3d604e703a1445dd6446f05e8f6a7c85d9b0f103db8179f0744ef43e4ce511dc80bb7f83c117b63e5917a46094f2d54ec1dffe9ed6fa8f4be5cc35ba8085a703de919bd10274be33ba07ed6c26bab3b103f9f7e2ccb51f720d9fd4932e6b5cda2049bc985365a2092efa787356f63d2ee0ecf52339f60731dc172af400b2d2e0bc98bc3c9328453a6f90fecd4c9ba0ceb39d3cae39b8b996b718e78abd20ab131d76e30e0efdbc0e964622e821e0d349e78ba6fa9865616f026af0516bab34270119bc4edb3755c9ff18198397ac1a3b13e6b6901187a4f7cdda770b195ec87b388bfaa15bd720dacca706ef07bd1651e7e378229f9a99e3e4768145d5aa5cbe269d2f8a2782b69845666b702574d6eac57dafb42195accbe61b2434f8d242652e9757faf38b1ba3a723732609ac00bc5deaa28ec6952217bb7f20aa7fcb50bc9007c006341b28b39efa7d4f725320b2f2f092aab8c555c67077d4f9cee1bbc4d2b23a801bd8385ee56e0f2d1d1fce1ede3c02db440db850770b41d0696a0c2a6ac4275338b00f49ed8ba0f69c34ac67b83ddeeacc241bb41237f6534ed6260e452a361fa829a25aeb8f8fa8311548209aaf214d40ff00aca8ab6d1e40b2b81f60b79b36343302d0ed4a1d1ff7a656b627f9e535e271c6f71b1ff5c328ed2d292b7f9b16054e2f725843ed88fa600b7e8fba5cd3abfb4a6602ab1e98c96b98552b0cdce867d201f805fda9559ba83284d651739d6c60c0701cff14b16bfafdb390bc9a8bd1c83c70eda9807b033d38278ad8c3936cb31885a5983d074b613c7a792638a41009b32e679ec19832f22cf2aef04067e64f8a78ff59988f6d03aaa915ec4b23a3c98402314f59f1d03edbe9a1d95935db2eca911a814edf7efc71185d9f6b01c4c17358deeb8f42a65eb6535acaf89392e9dd371fc096a8e49aed53e1b1b2a48b6df96e094fd6fc19cf24fb62f5e5ec213bca6dd7c03cc9d3b4ac061b477ccd9d0313491d947de6f72fc2579ba66dde3404c53894aa44cd471974be57745d787fdaf5d51d1ef92b33bdd824ed3269e56eb5ee21848b1146a7e3b28a2004fc63cc4f9ba341045868e0fc7e6934a96ad9b353b64ec7b98cd1cd0c70b9a684ac3cdac48c172b3cf6126aa5bdfa7d01953ef89eff221b709055100e5bf8b469d1a57d565e72714723f3d1cae0d2faffd321944c6510cdc00ae461e615e8830c9a09e2e818420795913b50a9c6250cbf9fc0b42f0c24e2e8879e098ca63a067aa2b2be6673806e5a656e17b041387d345236cceb825bbf506c4061caad6db1b55266cfd692fd1dba35924a1cce27b8765655dfb285fcb494469aa80d92aa6646b50ca6aec8af1ceed255b22c9332d712c81069744cec832be872b401c20f5bc7a0072f8c15af9f32d5d1101252228b3bf3d79ce4cdbc245d3ea132c60a8d1fea291191719711f83731a62d1eea64a0fae3d4ab2eb0fc24e4ac6b56177311ec756251072a9148aff22868beebbd276525c854dc8dcce2ad8fd1e2421d9c06fa68d69a4cfea68a9822315bbe7eb07f2f05bcc1fe9525e5107b31a8f1584db29c9155629c0c1fd7b85cb5fd230511bab2db34dc2e2c5d64bce035aa2a31e21cea7093165c8a40ff220364b22d409744baffbed63f34134b63f31483353f90cd4adc758eafab31a0f342e298118152c7cc9ca997106a074153a2ffe5b7097b8469106a6b51a9ee730bb2056714154b22cf7227bbabd362cec5d96490fd07b4e32c4624def258714ae11ea0e69b2b575f068545477350abd326869aba96860aa932ffa9eb3653f5c9476d4b04f8cea69a7e14c46807280d9f05ac39be4162f366fad7ecf2c41385926c07228488702bc574273839a885bb8a36ca6a921f674f423c422c5c5d0ff13c3a223767302afe1384bc7cacf75f69595b7f7eff8bb8fc4d6f1e69142ead7d2ee7e0a38d0a43dcd8dca55dc07f7525a175fd3f7fca8b78632ebf2bcf13e4a321686a510462f80214ec4f1d07e2f0e09036fe3e00cbe1c6904d208a580d01033ff2c780400b5d578a8f148ca8d975fe28fa17a796df2ecc5312065bbc2e123a88f341edbec4af901c8fe955daa6dd9deeeca21f55e5cd565bdba59dc73a293ce362fc155cb2049cfbca4684fac18bcb8134bb39c6a9dd2954d2d502e99e400247fbbeae0e63a2440785cdfb05b5c538309858e55e647272f4147c2739330c765a9d6fbd4aab7725f8e284933f1e3e1b042e8729cc8bb3e305122170e4c18db07d54edf48be2391dcc83bfe7d4c8e60774140ae56a788a2bbc8ed9cb94700a4d1986e9bf23557df198bdc50cb72c0523440dbfc108a0bd7c0ba0a0cc300ab9e50e4e470379ae068c56b3340b3b4e82976de5bdf9701ab8da77efa813776f881f8d8cc62e3e3bfb0dfb81f4fb13f406649f14dd8d33cd40f77d43f4c56304ec73d24b42057d96a3d667de68aa4cc5ff6e92ad73de0ed894ed08ce30040108918a1147c9cac9555a6a5176d60407cd7e17a19891d9aeff476b561cb7e90733641a023240ea23aa09a997184c7b5f58d93b6f0ff6d08de130688b2f21d4a50d7b2a526b066173b7a4d55aac2e47321f7309ca8195a09247fa3429ee697480805045940bc865879dc13cc228a2945a790c3e91d9d520b0cc17450929bbc222f644a9a1bc0dbdcb7b878be64ccf63d55422fb5398e6aaf1f88f9e53022c0671712b2936e4c1ad0a954eeee17ed6e4ffa5bf27f4d99e1adc21c9878743fe593070339e19043fee0920f555c3e0a6c2c746e0f615b9ae0c3e1612471cc0aec793a4b30b7d22f1779a65aae430f12d711668e2fcb83ef50ae90240a6f485e65dc59d124f8e1eb5bec3eef206e1be39754825afd62269063e4b6a667a5e855481a1e79a5edaf991fc1a5a9245795852ac80d5a784aad30fc52a2c513dc2cbe35ae8409777cbf36ac6448df3a557f2e87808f70cf2be688dc38edb261a997a8891ba3ea9e8f4813662a4721367b31ac8723f08bc5547cdd5baa7a86e11183f0aa4c1c651ba08f1ab74ad4f2ea10405210808de21e760627eb3680d4075867f0c5bf53c79605ce0ac404e27f369a372a21bf40c31428b04db4da04989fc8094fb2592aa38c522997ba10e35ba88290b0f6fa1bc896513d15ca8b8803e585ad0a15f4248e30dda72b1d23da0cad6d992d7e17f6cfc1841f4796d91240f4b66ada34d8743e5e9db2c1dd1bfd74e91c15b6a0822075a18e8b182cb168c23aeb240694aa570221676b251c7bf453f7743c5fdbde147451f37c17756f1ac81903d54ae4a099705075055c49d9029aabefd58f2e4fe98ccb40e05db268e78742a158321bd1c928ca405110025846fccd5551d0122fe8b8197d3c8af992b02c030fd034113609eac5b1d58c107a226a842c09f0e18f38df2896cd975d2bef5b80da6bb66daf39b54f91e9ac2bb11e6068b1463c60a78dd31e7c25aa592b7766acb8b81039d5e9f174008ce149d3196f615ff1794e28007347a41135abd0538b9ab08840dd21119a5d0b2dd4183b62db190f53d14085b44cc9582df14d81a8f4d040343117cfb5a1ca4e2d55e797688aaa5dfb089cba65a709f55486e079da00cb9e097262e203f188d227dafc85595980c6bffe04330b00fef44148e31649785e52e9b5cf8584c4716ad6beb118af368ee5fa7517aa8f6d503af28819ae5ba1f8580f497028e0ce7a08cd13475bf473ec4ba9c914b9ae4767247f42bf42311da5c206755a829b07059208e23c4efece9f6bac41abf9631513645924a0937d9a1d5495b7589e25ce6decc382f43cf044896c34a5418ca38acf51aa4c7c838225db90485ac00a1bbed76254eb37ba1fa2c14ddd6cd4d5e24f414b101af843c811266a763ca97950322ae29827349baab04b1b16b58a2e422cfa9cf450fd7e400781bf7c2cd74a149bf0a50374b3a6cccdb7ef7cdeb1b6779a909d4c0516759de0a28c1c44048b0663915b8775d2c7e9ec6fdc5deadeffb63612f061a0dc16d8dca7f23c17cbe8ed6d94cd6bac06d426ff7535fda042c71550abb3ccaff835a581fa1f0a187aa213146e345fff6f4103c981d96883c5f1c9fc107d7ff8a4071ac84825fe6923a205f2c944c272bc074bbde3dab31f6bf171c439d6ab09dc4862daf5aa09b64e2214675f839e7aeffb775d764b01ca96eaf558996e49f99654867d46a0903341d48286fc275f18f07940b1c686431d3c919def9eecbc798594518b9d52221101cf075efa081b2ba48d807e1105cc3cc33e3d8c063ecf5d920e27529b9071896384ec35c59eae2aafeb29c4ff4ff13700858478dfde5741c3fe72c3dedf3aed017ea959d3ca0124b96c5f618b64c3a510addd1eaadd1bc4834c3bb5b78610835a99c9718ac264c0324e687d62f6e963402fc5c17f655c3d8c6ea65c807c0b441b921729b76439b753f79bd2affb6d802441f2360082756f0faed82d69d980e92c39d0dbc39ed53a67b44086c854c02ecee8047c0e46569160f5d65beac33710774c5cded9de49a910865f6bf94f4e4058ae5301ea103eecc389723b4475ce14a1353d67a75e84f795ccd892f9658f8bf89d8dce396d2239ee222799cead300821c5516142cc81d4e9dcca9d8d3c43b20e3d652ae1dd982ba2b184a7c86d92fda4d3cd71ab504123f96bbfd2043c7cfa9a8998844a809553ff85def2a868a13beee847f18a0746bd718d023c5db67a3f7d548ed6cf71645432e2cb5f9866f1e214f3958b527bb5f282637801006b7c4b8a575e8d0f0fe306e6d2ceaa05578ad16e487086e0f531d2eb0cb4c06a545324788dddee61a9a4f6b068087b580c878384dc99fed037237da9e4cc9064bf14c215dd0c2dd0fae02f1900878770e44fb0fb04b7118303e1e897e36f3aae985ef4230be2f2108817c6b10c20a4f84de4a880f054d9aaaa3143b3dec87cfa2f714bb865faf61b107a5c3fc6141795ce64d44fcc3020b29198fa1ef46298f039906db97bdf193638758b0056269fb7d933c26e28ff6099ca141abf76a524154346d5661bc86d61f6084764978bb46a2c643ed3eea09c009023d9b1cb29cb610f9e9c0c94a4a2184912f704bf3bb4b48853628d8a5931b1142b8366899337a85dd6c23f9613850268f4c904da4a534179cc01ac377d21c661303a6b10f2a011856b16dc4b829b86581c7bcf52a7b814d7619e47f603f7e585a68bbb94301f296c19baeaf000f79adc8d1c6b883bb1cc571cfc3e6ee42c060a58bc52199884f2504cf6a3dbc8a57b81a8050d93fa64266975df30ac9c09b32098e784e4e79258666641dc6cf4498baa121fb0b6eccfcf4c144e7228c21f6dc450772758265c29001a1b351e8be3acb9e2ebddc43b4a3e1e3c2aff91082505d9adfad3c30611091bc6b27e3671af5f7e80d696ce1f4d3f016b80ef807a6d51b436b9a10dd0b145c2608ff055a07e228363b40eaf7de88b9291c6a78f6ee0338a315426e9ec0a4815e1777dc51c3bfe3cdca889884a563b56fb7ef85153bacae05aa14c81b582dd7d583e54b412d86a38da9bed81d545f6498f619b3eecaa3da4203cd4dd1293ff632ebec5c94216799fff800dc3177c00661743b37bae4b195aece97e6ca2f6ed81c26aadd008ab01547d58eda7e2fa634efde5699d0594b7011074b6030afe569a5820542a9b0e19aeb71fc27db9dd00e3f4a8f09d68b60f478afa7022c9090392dfc576908405368abb9d2378628017b6c7b97c29133c3ddb8aebcac52f9ab262ffa02cce35b1cb13136580a329925023bbdb965b4a29934c018e09a0099209662ca92da92da915354d97fbbb4d653777722d38aee33c98d20d9d888889a949d191a68e536d2a1772a638254ea92fa5844ee4444553e8e5ebcf175c8792eacbfab20450727d59df87bce647dca893de94b58a2a4ea11277a84a6014ab54a9b264a8693a472989139d3c4a712b1eac1c5d52379c42422fd64ba9fa5212c7b56859dd41d3f8e086b1b682e23b58e170e83fb038f431727523e4fa355e5edc1a2f1d5c960eae3c121160638d94fa1205ad23832b6b54ca21bf89f9a83e5c28dbf7e40bfbcbf7a2e24aa1306ecc2f0ffb971517f6bd7caf2a6ee84e2fb0b20abb53d3d48729b99b6fd89d3615a650ee55035e4d6e4cee15c7bdbeb8dc77dc572347a7135cfb1c2cf7aa01319f986faca9ff39e64279c32bb73e4cee550c319f9861b1a6bee71ab0faf6b373fad0b2fafd3cad773deb73bdaf62683dcbe2290463e22239c10071bdef6a91c3312ed638a25a8e1dd7791407869123718a51a2143f5a751ef82bef9371905bbdf7eee4383055fc06ea054a8d070356dfa5620f8bf5635f8eebe01ef6e5701ddcd7f86c5c07f72f1f0ed7c1bd74f59d8a1482f9dae3cb477359fd596372f9fab39f888092ebcf21247e148b585e2b5f5f9a21a7be984fe67ee08e57877996a67c85635d7d0fc73aa1299a3b114a1d877996a6bae7599aea38aeebb8a9dc71deeb8bebca2d7d4a16cf1295550c9e7998349138526ac32a8b3b21292571ac94ea623c62debaed8bf5c0fee51f00c32f1894b2d586633ebadffe850e77acd9f0c71abb2371b0c9abd57771e57d677fc3338021f8b186c3e1109bdcfdc6a292cadc03e18a64ee63afb71f0621c55e78861f1d6bc21e39661c5a2aab5e2c9f4fcc38d8e41716b27df7de17bbdfde7edb731f6bec6fdfea555ff823af3cf785b116aee02136f9feea5d5fe8a3f5ac1d2b4eb79f8886a690193ee553fc2606e6af6984f80ace02100d50bf3e0b09304889258aa468a084a526620045d3154d9094708449d1acc6622d16c9559558ab92f5756e7deef20d25b57cb5834971c38834bdd717b77a3040dcca11918a48a13b193951ae25a8e54a54149558ddcaab528563b65a200ef32c4521e23733572819c5c11fae7d9ea5284b5172d731ba6459ccb36446d3747622bf89f1581f1cb6e1a22817c0becd2c9a4455c8c1f72a279138782491a412076be7c6b2287b645c16126e388532b5ff99fb9c5853bfb34eaca939f287583385666d16d59f46f5bb3a7dece459aca94ded83a933c2f0e28c1d0c81e1e309261cc1a406552c0dcdea735f8f5853df7e0c8835f55948dc6fa7fa0e55dfa3eabb54a5e2733b39e850fec4c1faac29ae7f4355288e1367f5dda9be3fa975fbb0a1b8edb90ad0e060b5188883b5092957891367dcc7c3248aabb6faaaad73ef87b5b7d63a8564949a921829a5fe149a43b336896691dfd8f7d50e97f21ba8dac42d45719db596e3ecf6f12c452d452d49cda32c45d7321d1428116819f75c90863571c31b9bc4197dfe86d659c9dc13699d9939cbbd0ff986a6f9e2c69fb8a769381bdcb0a570212b73f3b907e23e12711c47044ae6b8efa9cf3d90dfc0fd10d041cec6bc835cc5b0fa34bf0973dcc07d11bfa9cf6d96fbed8be1de5a0ec6713932f7618ea61d282e70cffd0fee73b86fa107f73d0fc46fe8735f01bfd99e7b1afcc63ef71be05eb5d928e437443822a52547b6d66a3f9e25474748acd6d99ee3de6b1dfadcaf5aa73ef72dc361212eb492e2bee664c9ed434b0d3a3370affa62f3a3148a66aae73eae070c40a4ec059ba9ba300ba4008a2540210a1fce9082861b2eec99a6307209c11505274228810a27283152d0c208b63082861044529802654113261462533cb1e25a7282966dc90bec92250698c20a39c50c06d04e4b0859d1022d9c7c6042500c468083a3215431b2822933a7474bc8984b8c508386542262c1b0d303f6e013510a888e784ca83fa4ac9f4e189aa69f7e0d689afad4014dd33d5c68c1c1ce71b0e9fc90524a6d1cec87c1a4a45320088220f6d9de01adc3ea961d7da206ac638dfc77f9204c033ccb0759d0bdbeb82ae4befeb1dc1ff3e14213ab628dfc1d97524a2963b24d165ed10dbdecb8b1cd4c30c9fd0f329124c7f76277351ae6da998ead8d14ba96b18dd334388ebdc171aecbe437c759eb3868f09bf0de993c1f36e311f27c1c9e23c771ba9fbfe3020c3f7a90f29c2ea3aa37f23315cee1207d1bd7413dfbca621c0e52c7e175c6eab4426ceed50e3aabe8604d5cffae3b0a88cbfc6393e8eecad133d600a4755664b71194101dc82a0b209302993454c041ef60496e4bee27173cc9fe34782e9befbf81271744b1a1372a294de1f61393a63c84fe8ef330897213ab7cf0abf4e18632326143c9fe38663f0d3125fbefb8e0375966f2309172227e43c3105126e6597264523a971c59726409129ee89540690836a4953e2c25f9967c90d662a1826b89e8fe000439e4c52e969058cfc2b0d3e395fb6908a2eccafd24441472d0794440c7e46ffff13daa5ff55de39877dedfc33d4bb25c4f8bc9d7f7ac59ace7b0f7adef990bd3929ac5be582b37a987f5b6c7dafe5aee7aee9bc331fadc534c4bb2ef7dcf38cc83fd10d6df6aee57302d6785693da42c621a87692068b9958540cf826637d8777dacd6b364cb95fc48caa6eb6bad7c528febbd1eef57548a489991abe67dd854bc99f761ac75914bba128e2efa8e9423bd19e86697925d2bef637492b218995c51b496f1e28e483826bff56164fa9ead30959eb562cc879469c47c62f65aac89dfd9878835f1c338fb81fb7ed6d7b35efde07ec75948d4e2cbcf579f4749154115191d39923379933b6d9f2315c9cc7d918899fd3a8dedabdf10b3a223eee7d0a13ccaa51a47004c68c08424541831840c66f15d4ae3745395241c04a18c30a098d20aa2ee12238b95a86e4a21cec8a1cc8fff0fd0cd3c1d2577c7ef067414fade1e3b0ed13fc85172d9b0504aa235a5e7b1c43c091184fc92fb49882c722813848ac9adb99f8468e21182e9490822fa24840f9d478134e5da2185d2534d6a47145351d4daa71ad2c68427268ab2cdf3474fa4db7c77eab1783cb5a35a373add5bf2ccfd34022424a1b37ed37dc4552a29258d1bc279dcaf58dfdc5f4e85b9af43fc46f577a5fa86c4232955472abcc2e17b38043bfaaa4fce21d48c4c9d7e7c5a69f17b8a3681e82ecbd75aebd7fa5badb5befdadda2aabacb2beb4b5da80bdfd4bf7ef66deb64dfe566b9cd95faabefff5fd2cdfcfe2372dd6f7c778efde7b1ecb4bafebba4e8585ec905fbff2ab577ddb5fb11c67b9b71127cebcaf1d74dd6fb1befb5edfcad7b554dfa9be9e997bef5b7dacaff5852cb098cc3db8e261e37f3ff9ad6f3eeba3bffaea7bdff6dd675fc57d6843efe6088b097a457aa49b39cab0b82705c403b99f8a98d2824d8ec712c322420e659a8eec9cb26e1bd27de57e2aa28b2daecdfd54c4d3ce53113490b95720f530ba534ce9020c3b3d2eec63b99f8a302a8228872014d5a2ebe2f714e973ca943965529953620ca511a512c96fc29e228da412bf71272320264c988c9ec4a622b426917eac449b8c7b3040dccd48c69f92630ca551148a3599e4a9684a8e2f91f88d646a32ab746f5fc5c9800eba571c73254b4c90dc8b9a2c31e1596242295d62b2d484068903c3932726b8616c7ae237e19547fc26b43b35a68cf25026c9f1656c1a4a6aa91cb13cf2c2b89fa3dfc4a6f8d2481e4924a9d45166fd3b1e3d285dcbb47c71fd5bbeb8f75d33b40ee3c1754dd615b7234e0b2e9b73cea6d28211cefd64c4941f34f468a79d165ce821dba95b70c1df7e8e5d7e7057fe75c3bc4f4738c9fd64845386c9fd740452be41e2f4cff9447ebe5abeb7f9605e2bcad617c6dc7aff421aeec77aef5b5f50f68902cfc1c9f252667fe5834dd846a312cb3927f8943c7d8acbe6f777f1f3292e459835f7da94d661d1b86defee2e3f5f1e4924a92471602fa30786831ee5e07c569e559a66b67c38a3aa4049d99c51536a464dbd9c6efc170eaefc1716576ad1345b34cd53d3cc1cdcd70e6e38a3aae4f92f2d6efc571657fe6b8bbbfdcbc9a52d33aa75aa8eec41fda40f9a667ecb473f09257920a1c49aa8a699fff24ddb93259d9a8629cbe6fcf92f2baeacc99a2c9246f1c88da4ec5d5e5a7ebe3cec6770f996df71ce9b4d0ece5717d7a37c7934657ef9f92c28f7054f21299b32e2501a495c9bc17f224959cdc1f9302c6ed866ccef56acef9c195740fc631ee67b6270ccdbd8d61313f3f1631bccf7bc3c0cec5f7ec33d2e0ff33098d6f22e4911fbe8e41d80245214a41c7b980fad120c8341299b3138b6e178d4b3882465435c599b2f8be64ba3f9f2687eaf66f08781f9623d301ff331981691a466303868d6450f66a76369716386ee0f19b93320641adffd90119b99919c59526d9dd6cf975ab4ceebe7cb2d5a67e5e7cba7d671fd1ca26fc4ce54f8f972c67edaf8f95349e2ac309d587efe6c9a481207e667cccfff2f3aad60e38bb468d672726c6c40f06bb55a519e731acd67d99ee559224b6ce2a08c4d3232c1ec9532e945a7f9522665e72284bbad9498602e42b8f17f66aeab1dac245efc1defeee744ccc73e204ed4ee2ce6bb98a79f133115be9a9dc55ef5393164e4ce625fb399c57cfd9c18326267b15ace2c06f79032398df2fc72d3c85ff966df029aa647ac91cf7d0c8835f2bb0f8658235ff539a069e4d72f861f4d233ff6cd9eac16de691af91d28715e5e7e8ec481bd6c8940fc61703c0a6796bf8279b00f066ba15e0ba5441c9c36f16d72fcc2972f56d5cb0ba6bd74aafae2e243cb55295b1f99ab4bc53b45227ea173f49b587c1923be1b66a11145242b4cda890b38b6fd56373c1dbca9b80710bfb9c10b72f90a47e86614a91528a1248725b88a923850324ef5007b36f394b2c921389bb11e168b7503929cab9ff46d8cc022e97346d6e7425226a124948c925252ca9cab2f89cb4e913838a99183b3be4b11eef6bd9252122a2adbdf91338a14f2c2b8a1cd9345c6add23493ca11b7679deabbf7be59935173720135eb54122a433938a3a432dfe7fb7c9f6fe996a952754b4617b3cfb2f2afef59f9d7db7f615a92c53dae773d8de5577e64d5db2fb461f996b2ceda8e1a6293272d6f6f2d0b0bfe2165b2468da7d1927a5cfe457b79982cda2325a61a3053545cbe1f2d65f62917d5f2fd8838ccc9144b30bbf73eadf23e865894ad0a87d6b29e3ecb474ba2b1bccb772d9fcbd7452fc6383f7e2d2a25f59e257ccd2ff4ae7505c1e6b4d03a32a0cabecabeea3b95caaafcbbe8d9e07050ca17e386efc234d7bff05df91db922672e560bae534aad55bddbfab459bed282a9bee2542d4eb58e2bd78f545a67e6faf109ad236b656d71bf461129fb995ddc9557175ddcd6ab8bfbda11a7a0702354ac114a7e27573f8658bf7229c20de3940b9417d31d62fdfda1d5b768493df7dedb6ac18db54a9c5a3d0bc728d6ef48d60aca13e386712a5671c9835cdf895aa733ed68fdcefbaefbaeebbc18d5c528591cac97f3369742e9f6aa2f28d31d596718a7e2d48c51384271703e4b06d7e773de5dcfc2b8b893ce89633e268d4db25a79149006cd4139883e2145c9409e779a262a46a65717b7cbddc555b914e18677beafdac1cb74d43aaed6a15936180eca2897225c97225c28b0a61bc18851504745a44cba8071a30b18f27f6696df3dc93f3387f208cacc14cb23074770679549450653a810105dcbc4183b19e3c7a39884e5833b632c6a9a19fa8b4859ac3948841bdadcc4cde72bd33a9da3bb34928e8d9468ed5a2b8f1a3be643e68fb9f10d1fa4696aadb671ec535cebce676ba542baca4ae9fcade794401cac35e82ae03715f80a00b9a175a24efd96564e49a56c1b9983b3f2a472a4c0dce44dcd7de768c58ddfb5614d03d3815cffd21b56d95e223912e1196b3c866868a9499be49d26b7b841fa71668a5be59b514773d78a54e6ce3b4acfed37ed4170362805408882b2c514496e104404c210a6e0e40663fc1083245e00218c1d189104082a780083294133d0020750a041134e7041c6cc9958aa54b8cc50b99ca637999a20801d98b5360ba6271ccb5a9be4e412067bf0c9043cb0011a5dbf3f8cc5eb2fe6ae8a104de355bcd6343e7f6a7e44de1817a489b6c8a8755c59c766fa31098b8b3b9f48eb78a6ff43e2704fe9fb009138dd531cefe90ff13e50526a03ab3948e9e68d7185785419e3b2ceb86153a175efe1581107e9f76c55251ac5a388149562e21472d88374c95de488dbdcabbefb629494d1577d5149cae8732b249a662aeeebd9cb8a1b46a327dc2f423f0ad18f35fab1885671c32dd3d6a9dfc9ad6edfabf9d5683bc2ac29aed2f44d0a5e6b1d57e6b20371f075c4eda10def58c112c28ddf15d13a5b2e8a44b78aa2d6a945b4f427c0221b1ce61c05894e54f9514ac540c83f31ffc4dc34448a003948a1749325b7bbb22af7e0c6a751a8698a380803f286ee122f8c19b0241452b47c903830da02289e6c5074a11a230d141c815414054a68a68c318220b5822abe28c3044b4cc0840a82c8824a9ca7ba83ce76385cee2713247164372448414a88288411c60c942e809403164461ea0724b09879138228820b220916606eafe0863083dbb8dfb86dcb228821b6241e6cdbb6b91386a6661643535cdc718c9d44a0d1113185207e3c10131091fd3750e489882722c0c8a10d2786f7921a1755aa3ce95ae66e5255c6e2e06cfe8621add352549cad39bee3c2c6e2791787940e93200ebfa12ee751aeb0266ed8504d72580e038135015b726b3c42146bb02524242552481da7da229212573294e44847b393de945e175d8912bf51f2e139064b4c30989da4b4d689274d82524a3919e3fcce52524a5bd2da6489e989d624747e9de99cf363fd2ef260ce4a29a5557e941b129d4b3b2db5d56ed6dacd5acb59bbb22cdbb2d76eb37e7b3b2fa7292747e62cd95975382767c7cb59f235482930f3f65b5df172f84db7141c31b96939fe9cb1c416542b2fe056e8cb63f1ba71b8af69e877fe30f0c9160ff6d7f6d7b38ec5e785ed7b3ccb6ac7f62f9e9ddfd4da642b69682ba5ef54c3a8bc0f2e57781b7e9725dfad64f01987a9c891383959b59261ce5cb6b8b1851d6e4589ea3d9fb865f45501c8b4000ec8d3872b6f3f93dcb7e3327fd52aa78b1b3fcc89edac8f6eff4362e0cbf3bb17af258edd58bdc2823a8574626b64bc1829ddbce4f84566441a428e3025a678450a9e8852a6e21553d51d313223c71c212935ad98fca6490a9ce4d5affece39a3b75a79deab563bbc3b80dc452177dfd99b1993b927231c64eeb9d50e4e95236f55ace8282e593e122bc8f2a5b55079153922d8a0f33ca92738142878929d26fbdbd50e6702054ddcd8e14520a2501040965f61de0511c860915059be749768e06009174e9e8842054bb830400e8c2065092c98f0248a99d327b24b09427698ecb43534e3099428403e72434f06c47144ca4d7703252f6ef85ccc9def90b128268713c8f6b11e6b718eaf76d8bca8b8f5fbf142cc3dde27629f56f6efa8a7d3479c52eef7a39e49eb4db27426594e1d971adca3eab58871c1c80e4a96a1eb99ae6498b322a39738354a0165f059c5dee4841b7ad1911088caf852463a09ae233998248a2ba50ba24c7e14360659fa0ca46479134d2393348d7c3f3af2233ff2236fc2931c067e8563117f2a714e5dcb344efdb61fb2541ce31be63aefde1e9432ce3be9b1d2b83ead2cdfda7bb987719673cb3d1757625c5bbfffc0551877fb18678dd21622dc70d25ae98c711d3f5ebeaea3bfbb54ba9609eb772d5f5c3a2571265474414d284d13aae56ab95a2ed9e4924d514ac928724a3a914e47acd6df5f1db1ee6a1ab56638a1a02694293ad5f3684649c928664cb95e7e320eba7ee5031d745d1c733989b9a653d37472a4a8e5c23c4b4dad5fb5dee56ab55c3c4b4d4b4d4b4eab77e1d026bb9e45a54899110029bf0a559d58d5a93e61b55855c86fc259a5455b5fcb11093daa090d2591ac95d6c797ad5f69c995a7538e7323a448720ca9142a4fabc8fe633f663e66b7f1331f638e00f8f836be1cd7d1fa992f87eb68bdecb3711dadff0f87eb687d2d729c47526f7cacef3f5ae4b21852a9b03a39f94dfcfac46fc26994a5240e0b1f7f26719c233524318c81924d7ee3443ac927d263fdc6fa17960b0bf32c3d61ade0188b161d0185d5c23c4b4f58cfb3f4a46bb1bed562b15a4fa07815f7299fe238948a947dff333ff43ff35df4fea325fd98c1b4389bf97f5fc9103403e27fe67b15fb51856ca42cfecb7ee6ff57c0b4bf81699746b381e3ccab703fe67bf63ff33df8ff338033c87c2daa425236ab4e37dec627f5c87ee66766fec6f7ccfc0d4c4b6a3dada5ac857b66de06a6edcc60196e9af9b0a156f8b0a566be9efd8edb78d987f686d487b0bc82eb675c3664d6dec0ae7f6cff7e93059f02c0379414ce2a39fe7f00bea1a4904ac9f11f835f2dcefa65be21230a98f5d7e22cf6b6d56ad76a884d769979f5aeefcf7569b4a4d8cad37a05873d4cb17018747471f823bbbea56c47768e7d3d932eef8ab5f0a4127fa50abf71f98dcb6f62aeef3c9b1c8c2dbf71e1c9e4a013bf69e1d9c4c1a8a4c9cb8a0bf32afc0c353ec69d38914255a6623e5ea6914676e130c65cffc55c311954f8fe1e15bebf57e15db827e66398863fe629154ca75c7157f82ef6f8bf8ffd88615a9cc5befffb2e7adfd78fbfd8ccff0399c1b53893f907326444013399afc5190b5f855632cfc2c77ee6bf312de969f15db8a77f06d388c4a2a73d25543424f32cfc8e962f6efd962fee66441423a232459238331f9f36499c1b1f651fff63ece35328d937a3be29654249e5f89dcb0f2e45cad5697ebbb0be306807eb3bbf2b2e7f575c7e47b25cbe572f04657f12fb0f9a757fec5d2edc13fbc7b4998f3dedbf3f6836a15a3eb42c50212c7eecebcf8563f7fbc908a6dc7965e55fbe3028bf7c5ced78f90fcaad2ffcf0e6bb6afd07fb5eb95adfcab3bea0ec82adfcfd4287ca2b2efff2617732f3cdda375ba6d10b7bdf0e31bb625fcc15fbff62ae168e615a52ac16e12a24fbf8df3505cc663e26c334d9c7fe639826c3f1312ddec046e26c46297614fb302a7dc7c21773fd8d67e165be980bff189af91b3f8369493f6e605a9cddf89997f9669e85efc6f76a47ec47e71e1f66b5e8c65767be293a25650178bff1e0ccdf00c0cfc8641f80f8b207312da9077c19a6c529f006a6cdc407009e92f938158b52ff3d6361366b99af67ffb1487152031f44450909cd58f8625fcfe66ac7f51e7f31d7d7f8feef8bb9704c06987e989effe6de091efce81f7b9194f9fff73f7625298bd115c3311776e2a5fea3531fa5225d58467110897e77524a29a5e8fb9129bf71336e48a7e894138d299291eba253740aa542abb8f00b9d5b43f12b91dfac3ec65a71c508c95112bf59c12f7446f29b56a2e437f7e357267e137361094582e1e027a31c8cdffaa493944f1cb4f1b249e2348edb0ab398af67219dba5f84528fd86ce38bcdd01ffb18e621f6fd2ac8222937f4298772f7295866a171438772d239f6fd315f656a9af835be0a538f720cd726298b9e633560a61c8c94225125ca149f36d5952098e748b19b183b60b9dc3d6edbacd40854682f8ec082228030838b1cc4a0880d8830036aa8044f8640aa6288e1dab86da345c9c1162a8801d3138890bec8c20a14fcf002a7133831a9b436a924d7c56d9b185376db36953542c9a3d2d1a7d46e9452f973cead6974f0a4b569da7af5e8b10601fe3e65149ca44cca884465747ff0da28a594f3b63c2fae17373eed29e79c534a297b01b31ca584e9e0c69f3b4dd3f4ed765be0df4597b36e1ea7f28d825f9eb23c2500d3b279e79c1d8854e5b914e156fbfd392db37fa5ccb73a895cdafe8e431cabf762dad41a7ccbe75a46bf22c08b0860b55a47f5dd61db34f4b7a6a94db38520cbd935550459fed75d43e7f7e059e21967415c0fd1bd07ab1d9f73cab7b30514894711c965edbd30d87f377553bf6053b7a56046451388c4f995cf35bde9c55a1ca242d6de0b83fd8360d3cc810c54e8c75842280a45a149abaa56ae561b6bbf3db9f1376cd33493258164698bd8a6cebb2304c18b1518504d80c112281c3801628ca7206a50040a92288308d405527062902067c14485e032420925aa60c1caf32736b6245aaeb2d6d6b838f9813f61455e21c328a32561d8e9017bd0082284f064c4083699c4dd723f19219443cf068a8a12ee0c8f430e41806a00c2c1060fd830848807823c50901a7e80be0338040102aac1033f3970e06be86eaebb63c7323cc676f756bbfb27879f9f1ded02e86e9fbeb14877ebf033000dd8b003064050c38fab6fac4077832087211cf8b161871c3e044041345003911a34d0ddb16f8475f74bdf48d3dd2c7d230c0e360cf904b4f03664e03730e40339dca0c3cb5e8720e017b161033804791c720802f463830e38049175374c772fd1dd39f46da3d6e16700366820c89058372d417713e9db301d7e06d0011c82fc00e9a0811c860ca9a126043f35fc6420c8901a0dfce850938120438074f8c04f4d06820ca921c00072e40c800034436af040101c8278800648870ffcd0ec9003e7003ad410a488077e821840031e20407880b0003a0e5003912038d8e46c20888d909b1a1b7e7200d2a1a648101c6a64f7ec6eafbb63a7d4a4eb2621a1dcb283c150f744ad36549bd88891241f05189943b5241f0564216f64e2241f0564f9ee13a3043a2b7168b41efce5f7107f3e2da9677bd5d3866a3fa33d609a919f514ceb81c3b59fc51eea5b5cfb99fc0df75031c53dd488030c14574705d736922b84fedc81b1e4e9fadd3f1fb923fdfbf107bad9f18f3f90cd8e431f5aaef4775c7a501894a56321fe73ce18c29796dba13e7dcb5155a51687339c6f43e976ce971fb538a4d3fef6f2bddb81fbf940aaafb57e3e341f588e38bed3322d87f1e9f62ee777f64fc8c43eb44cb110fa3f711814fa867d6879ae7c5c21f1fb779cdea06bf71863af62905f7f7bff7ce40f90ea27dec1fe547d3eb02c04fbf8c0f2c440326fd4877c9ae97f5cc510ce0f2bf6a165c742e6d7c63e320be9ef186e761bfda98361a2053049a8ff303f3ee75ffb19f7de3724343fe2a1e7b0d07c89876a3ffb6162205a320ac98f5fd2363f4e1cdbe2f310db704c86f9fe13901fbf67727e3ca8bae73e5ad20f0fd3e24c5221f9f107f9f1bdaffb38a77cc73c781f3f048e7948eaf1300d3cb49439a671ff44a48cbef7302fb81bf6e93454ef7d678366b4ee57733e0fde4fda7c7f0fd356df3df7dbf3e0bd7befdfe3e19632ace4ce97423f1a2a06fb5b2c92321e54b4a099f7fef190c443f711d3e2cfefbaf7efe9de7fc33daa8f54e5512cf45246df46ca287deeeb190cd2ddfef386856cdf4d941667f1c875d08741ba160ba92f64fbbae26931781490378f1f02ff8a9d883da067537e085a864eb72ce8609ab8fe1dec7e304af8cb506fae6bef7aeb62eed9d5dcb36bef6cebc462c7740d63e4f693145072cc523cc9f1bdaee51f93df39c6c3b3c4b669743cefe013a964a01f8472af78a4e3aeaeeb3e65273f7f1e26517e139b9887fcce73c5437edc91f2e36112255b87fb6f991953ebe6e3e6fe5ab76dabef9d63fce6271efdd84c67a638a61d148a5f74f28aa459d7aefdc6478618511248400189134f3ccde4cbd03560a28c285a2c4941061433fffe00749d7b4a915d5df53b08794a97b261fff671a330b48e84024a76d06bca3eb78aaf8314c3809027668928e85a2676c738fb588227289ea060e26003d1419124b77d81528eede093ae65da5df4ebd367d960dbd37ffa32f407a50fa402aa2fc775f4735f0ed7d16f3f1bd7d13a5a9643bf0517c2e8bcbadc63f4ce413186a06b21dbd3fceeb5ecefd9d44ae9a4f4a7dda6eb1da4b3394ae7b74ac5d58dbea54fe9a43487dfa870bcc7593d7d18287dc151a6acaf5d56bfe36a8773a82ac755950ae3d8364a69ad74d534fefd752d5d9e83f6e9054e39b4b97b8897638ca2ebae25a5944257887d6ad33a9de7ef40cdf9399e9ea0921dc7f36efb5838495743bc5c9f72df2a6f5f3f3d1125dbb71286a0bce1aa72c538f872d2cf084fd44a2ba595d2dfbed64a2ba5350241b3fab1fefa3cd0921ef03d8b358640cf2a7d1ee2eac9911d6e7c13dc1aeeccdd94022f72fcae55c3a5b99b52b0eaa661014a0ead019cd84c2679be4d921cb68e3c318423df9f948091fde5d3f92ca005a28cf2055572fc259e16b8e1cd4f5080394979be8d923c3f42419465763c6596dfab185aa72712d819b79f90a6e4d0facbc7d1755f03e6a8d6fad9dc2b1e5f4215a30b136eadb5d6ff70905159487dfb2a0e0f9151796e2e53aee7e08765e020742dc37d4440cc070ebb0f87f8abdeb190211d25abb0041d7450769fcd5700991c466e0b3894c9dcb7011a80f44829a5164e7d03c34d8fbe71c1c1b803d5504974c08315c4ecf9cd0b2c1ead3c652c4a9779669b3b97d3dd3dc6e8eeedee9735717b6e198fc2da1bdfe3cbe8f4a3d329e3c4f27d892b8be8b9b0a0df4d1ed4cbb16e9af8311e5b9e311f9e278e397279e2215e860df13aca243a7fade086d39b50379cdefcac900c724667cb0e6e944a329067db34f129be516c3bde37fbed98e1ccd29b5d6fbfc5ee285915d3dc3272891ca7abde7ea7fa6cccaa89bb695a85552a956ace193fe62881a8b5252bd6f47bb47e48df5297147b5eace9773981523c046719d8b6db56dfe2eb204bf5a8a42ed897f657b81c87dfcbd2beca5e2fdbecb36dbfe3f6b3367b77abdb862bfe29e8f4ecfc6e41ba2c7e23259d5fccc7a479c6d04d794a2125ee4bee27161851c67da541c45541085d1457052c54525c1713a523249dd3d110494fe8942c2165092925f6ce155c0013e34828b2b184112cb12330a9a0441aaf1a68508951828c1a3049308a29d1c50a6c094a35949841cb8b128a60946802c6a58c269812435f8b12a4bcac00092f2c53503ca6a25c2e1498d719452d4d602b4960496ab992d0f44ae2758f206565052558b5d06072adc0078f7546d45d426b8504a5561496b70427560f581d1a422b1bb0a89020e545c1c24d41ea9020f1629750a442f243cb76841a6773c6ab5e26312e8f2548b1c9c1cae47186526de2926618d124cea30c29d38895c8038d2397b58d4f2a105ac19ee5618654372541c55a018cc1c485e57efac14847c58541c2d0b5a1831f5c1b4b4f7725f7930f4bd808e1ba723ff940844a8c0b93fb4988093c4940b5bd4f3f78418768fd949f9552ca392bf56cb79c4da7e36c6193d239ed56e736bbbb6babe96b1abfd23b662967d3aedd334a8ca3e23ee2db5d93b26e31d5b94d3b6719b9df2e21f76f50c8fd3503d4068efd9b6efc2aa594fed52fec3162776b61fb69ff94d961163b75a14d0c009926c7600ef68fcd4034df98633e767a388eef1f23901ffecde772cc48329067c7311fe1e31c6b4e690ed095bb297dc6397b76fc629655a83aef27fd4258ee1a7338d83464d5f7aa01aa0f88661923838385fa94d105f37172524aa99c5345fba9a49456cf6506377e7d1718dcf8dbbb5871e3531ce24c3f9cdfc9cefb28ed70abb0a4b57e172d6efc098349b97d756ebdad3a7f519934a008a8f40cf5a5514d3244330000000000a314002028140c89444281482822d295c93d14000c87b44a6c4e9789b324c8610819638c210010400000c0080c8dd03600fdb024857147ebd50f1c567228b7f7e38c4be6bf7ae7f9d00019bfbeff033cf9fd4198b2e8b24ff83565dc1b57488cb79f796ff0b2d0ecdcc3879050f2c6f7b5702d4332d360d61370dac1181cdb31adc2100c7b694a7961212c4158e4a733539409c2af17e3881cb088ff72ce432c66962b75c3fb8174b7036f037f08100bb0e8185e59eca107fc830d538df00162195ed953f3e246b53d6df6af47d61ffefdaacbcd058456385ce1a70bbc5365782b250c67119a76e411dc9f3db3663ba6fd5c64ce7f236eeb7c22caa7574a58e80b5c586901cb1ef0c0253adf923ba6820a6caed020a20b1971b0c81d3e452b9d35a0ac394b5d10f211969142d3200cd8d313cf54df1a25d48b30d03b097b74123a5b7b148ed87c43767cc772ce491e12b427506acca3a264f0014c6222ea2eec3ce0509d68aede66351cf36a84ab519c156ba128735a6592a64e1426a77a1551cebbb5357fb7974262cb83de504890fb8daf1dd18558588c8a604b75cdd5ab1c5b4f50cf57d76a77fdfd1fd189329e19d6a36111928c88fcf82cb98b946a4f0eee820388693c428d5da6296480bb943f127fc8a6fd435bee4acb211c65f934d81ceda7142bf750236033f88bcdfba6b1b28d1e8b098fe914dd2f7e769e151e67463d7495ded37149b5ca0c1055079714e68269f78ea121ffbbda2b5defce8637132dd8c9d920079bb5c8065e46b6bce34c9c83270de374d260e76f365dd7924031c81958682735bd2320884f61a0b48169f05f23fd56198010d13a7487cae1e3088a8b1d70df08fa440b572b8101a9d5244b6df562507afa0298874f7f5764bdaa5480cdac21a0a8705ae7bd8bbf7016c3ae7f6a96f9a0665cf8b1b784bf2a214c42d61582bc7c75a7b08a48e04a1abb31a153cc3b180b44a31d27184e496d50103b76e955593db19ded6650412ec98c156173cc70ef9fd48b86a5dde42f8cb76891100ec2515a84845d05ade074aea66480a66f5d4a1fa7c005936744206effe210db67fed7b4481251c1b1a03495b5e661ae8ea3b4897d2ec1297ae9d18ba7f34691c024013a82aa467a0369c33109326ec56a5d897bb020afa2b0ac40ac275723d8bd70d7d30db8d677178b328d1071121c3463a815f5a957ee4933f436467b6a601fb66ad421ee8c2790d7f978a2137522fce22ed83d4047b731a9d7f06d8c70e4044bb5e71900ece7602fd67b306779824aec00e5f8140218707c052fa5445838e49bbb5bf407209b6d3367ec481022234a8180a20bf74ee88f4bfff822073e789fb0d2f7c67bc2b2e0e19633478730766ab946492312878e18379f4ba5f774dece84f77a21a2ec8b879d2234f69b4ddbafa6bf2747bdc9e07c1bc4e234ab40501e846fdcc653a22ef27802d7977aef3246b685b06d95743b10717248a0ec104d77bafc6cd0183cc2efd5f03222679cf466d9bdcc6e881e9de8f169531928d57b6234df0a57778bf5b80aef13247cd904b52526b599456d7aaae7d56a648f25d159d8a89420b26da204778bb1664601135a597780b338e8a2cf42b482cf17bc1f44df9af2949bb1e45ce88ad4efe41c8f756cd25a0be145e865871ace7a314fb5bedd0baed6774fc064c3fa9dc497701766f616a11c9a0a3b9a01a60c123aa126bd31f61f02982a8575be7942cc9445d54579940d29ba803ca04a3a26ac70a5eb464b7674d8264c5927de2682a94d0e1793e2cd9d17dfc34d449b7ad0f20715877384030a7c34b3d472b94ac48110682444df1dcac8f2d17b5d039196e12445f2f8584de5cda0a37804415e27034b9d79ede16d08448eb4677229ecdf6e61745a580f33a0fd05104b1a22502e8c53d4301a29acb32503bbe0b8032f39e567c5b06b162b768e42261ef5bb9eb94bbbf4445c0993ac7aee4bb01d21420dff6589b65a21747d2dc03e2d3110cc8b32c9970a0d04dc5fafe246e11804657ac31aed7ec40fe05fedec2028937126b825946e0f52df573290bc66174fc0a521607975121631fac4bac2cde477b9242e86ea3c8aad44bb725e66ba6d757d274485fe6e1c350ed528450975a8c6055fb9a610f8fa282979c6f31e52cae02d960ab87edc7a118cbd47346ed349588bebdbc8447ce2952bad1d0735f663ac784044ea219a797fa326407d2d5faf38d90d35d8e7b3c32b5a40f001ef6282b1d097f27c8a35f0c41a023c23ba93247b1c8c251849a9bd85bb86da31d36c9764a65163b33f310ec67a77adccd408cb449aa8c158e5a0ddfd3cb12ab56c8eb73b18ab763f44a7a9be8e8d89a4e58b61d08f26fe738c196b056395fb4f987e9ef43df31c9a388330095af78b8a67964ea079e36385bbd8d1c46410eff4a0b0caf1c03baa43820f1160cb518a0004ad4f7f8479e08945061dd5d1e00b38701cc6a6e09fac56141dc1de9f82f0d475969851755a0006cc084546907806c541de3ef2f973a7c895eefb4731916db8b359e542e4e0d2feab423556e24df48afb5a82adab0a601e6dee2811805c4b50446516358ba449b08b432db3aa23a06adddad5ec275ec5847aebd7e630f3ce3b6faa0dadabb3e16e5ba897ca99d0f52efc671b40c36ee3c4ea181999502616fe85b66640d5f06b8039aa07af59382f284efc9b6abf0f79e66b9b79d2c4547e7c7e4e1b7da33b133c1843aa41e3b8d1b698097305da915befab69cb951da4a57eb90698c85db027538b45f9f37d1eb06c79e903e96e79ce049af50e05349a92a21492cae9bc543c086b5251ea9486cb973642a5f0387a188f3988c02de67a64e68352d7596e2dea201c215bb72026a92530581dfebaf9c9e7883964658bdd2170a2daa51ac9580dfec082cc2e3f271b2f0496e543216ab5f556b5e570a28d1af5a7ed9ed55e673a9f22d258dd8099b16500afae95cb4a0a2a15295b8d9377945b9cbbcf61274a056d271aaad59ecf0d478f28742932d12364b38e41568794b02dd3192fe78eb06ad2c1af4096c8c42f718b93c12af6708282f06b9a08cac0516168576c388b7bbb1e16148b3f7be9e555905e9c5dd7fa4906efa97d8928ea2726bdf4ce9378f57a19127cfb04843d87772eb01847a173805b87ac8ca745d2f5386a650179ccf7fedc740d7bdca1482c7b904bc3e6b1da9be54eca5e19cd98d8e3f985715584da989a81209333ada8383d18d67d3667eaa904d442fea768b0d9d590cc6e70693161c8f62e47e77f0208f7891fa0737257d414d8c07c9b6a0d165ac8f1a285b699ba2065611849369906415a131f3397b0222b35dd331d148632dd14ab198e260d845a637359b103042eb4cc4d4bfb971ab17785d192eae75781cb813f8d04d1a4434a38330c44407d8d9fb38421d47efb972dda1fdae32e96ada00f75626c9844b84f11bdf3b90d24314121f2782ba0a83603783ef40de39183219582e55870fb9ed03136e9a39b84c9903e28e54f6ced1654adc891769d5a320313cc9e3a665738147df85c0710421cb8a86109aa5bab79aed6b2116c18612f183feebe8ce34ee9fd62b76de3d4725c1a99f1a3e51a000c041c5a2bace81c3d68a65ccc4099e9d3eab2541af4703b4187a9fddb0335334ce8430fbd880a11e598ce1ccf3b2a249e3d7b8709412dc122627cb8cd0684d9c8a0b51a3d408019d726f0adcdba26320026329b86e4fb716f16b13141a8fc0cb124545391221852e45b9f961dbe71cb9fefd4afaba91f13cc3541ce2ca5ad94b1331d6d157358984da83c7da978bf1209dbb3a1627af5c0ee5c58508627741ecbc169f95b69dda35c2d4bd53e120db55c9f80da6eae2982360f1f653f3fb0596a7a88c4635f3e5c603c26c178d1682e7fe49f5b5ea67e7aca1d7655286d93f3fb8f8704d5efb1b1410d2a4967f8e594b9b7dbcbaccca1159b651f9eed467a076cfcebb822665aa00c5fd043bca5355ea411c49ba2549ffbdd24b6983eda0dc3a67372ee22330ddd15417579591759865c28926cd8d191dd95df30995ffb394d65978e5a7b1fb12913b4040730c5f739de237049dcf06ce3d3cec784e4910752869b1d3bc026e3d9ee9d1a06d4d862f2e7065729aa3688cdd26cb6a750ceb7853055ec3b35c0e10bfe474d4587058c4a40c81d32b8512cf40a114dd5f5739ef0c2148b2293bf0101b8286ddc8c5bc5da050d72665980fa91e2662055c53b7b621a9c3fafd9cb14b483889934b4f791c584f095a2448c2bbb384ac1e01872508c0034144c302348a27dbdea805a51256b09c7953885c1d674f90cdbc76daadbacf8a905bcd8022f2f4551e97a1114189e9f04f0c51af0a4e3fabdc9238f1d294d0ffe9e523071e194e37ad6a25b6a54a736e9d2a4a1bed44a79e413dc210d4619c3ca5376388c2e330c1fb7a6ee1434e21b1014cca8c7cf91bcac80e82c36ef86f354d0cb3306dca2fa437ba1df3aa3fdcb9c3aebb7cc2d043bcde7c289ab0c1163b62a8c296b154590c796c0f91d36845101806d474bf98f4e8151dbc81752a984426916c00c116e693b8d93a53930d109e38a0ef5d1a154e0ac4f5631093ec6dcc0b7cb6edb986b5c1ab3982658db27dd0a64f75bf28e1e1f264d50094a2a4bdb785325ba1528af8c5026f02663027b2af15615c348350804986d9a467388884a6a356d53f4b0163751f15f07a04326b53bd889d3da8a6ab149e53c36f4cadeea8a4f8b48bcacfdf7b20c31e2c41e3df469f74c0db84dfd8c6faa873ef08ad678fe177212c6d1694b5fabcec9c5bd97f9e9e40690de02069d9ed96796d16dec86cd8c365455bc5d7da0fb4333242265143603a881c454cd0a11f54e4fc82e16d7c286dadc0379e07a341a7bb8a8fa26a3844c4650460f4a830878972b0e93533c960454b3f4ab37f39be059d2d252b52358b600e9a7383fe3da80e2bbb36b77b415042b1dec083a6091e58e619028ae19510d73a5624b97d1b1859d1b2a2a97c304cca285ac8447663812f5e982b0258ec5c371dfba867d5b54f2834f5694c3ec3465364dde76419685219783df3274b1a914510e978627ea16b46404f0b1b5cbcf643e7fb221153dc34a7755114de0ab1efedec99bcfd93598ae4d216767f0ba4e699aeec1623eb569ba07cbea54d2f0173cbb534cf31f9c6aa72acf7ef0549cca56f928d2f0932679e28e7b2ab3335bc6bf63aaa7d0e21a8cda19d2527b7f9f64d25679a7af324b5df99d36cb2075e5fb7a9451b5a5bb799549f5e5dd75945157eabdba955157edfdba965973e59dba976156d57bf824d3d914efe89b65f8d4d765274a724aa276d7ab2403fac4ca1d1e371a3b896f8797ca694ae9415fc718134e4112eef12a29fb609695a76ac2c935ca565ee9617878b7204e54942008dfa2b2dbce2367a7652c1c0819e6e37c0aab01df77f1f93c8547b683afff17d520b68cfb3f800e815842efa405fbca098ac043894745ed821a73b7f9a8a0b276747f55e7b2908bc43532b7227a0e64752d9d67e5a3bbce17e83b9d486ae9c598711449d1cdbea122419aae3610dd605e0718afe36fb653c7f39c5eb83418e59e4418314033fa351fbce2629ccdc49f62716010c16629cc27c311c58a7e8b4caa761a85ebc79360d2a37aa67a147afa711bc9fb4a7538e14c7a5494d24e1acd4a07f2c3b643558097cda6f2970bd242016536f93ffdd5413b0ad535a5d0925399290262a0377ebea3185496479dcc318e1530546f0ece793504a57341eedb1d88b45d9c18d507aed35bf995b0460b40af21eff879b08276a3f02d5ad13c7323445660ba76c1ba8e503b8a9fc1bd0fad86c4df61f6c8b311c15f851a63739b7598f7787f036b5f9cf4b273c199233e4260fbb270414d2522f1649308943fa991d0a05b7c226447cc46b83d0d6cc08ed59ea1391199dd19f5da4b68566fc5ea77acfed283167823c6da8d4fbfb616b854ef2d305881212f681a50bbc4ae228a35be81208a1d4ca8711605a25efa8080848347a3bc0c667501a837cf03fdad7808a8b6e8eb3ff49f1b0cc039694db9b199af550f44fdf9ea3a187f9c02969caa81ebf9aa21b9161cd818c62d108ba79ff0d8b321601fc86d3fbf4cd40bb01b34d9130ad166ce53aae362b380b838f7606b43a0380d90c9bf1180849f664e30425b24741c1b0d9999e0f98b3ca163db14b18b67882f4248c3c47f28a9681ca730d8c19f221240602dd021c900fc82f4d6cd86747f8f15c372bdaaac0fef7fb4ba0d774f3e889a217caba34513bf84d37361983f91e6d6ca2ad44ff10227148db031ead95b90928c809202153bb3bad4dcc3dda4eba460bfb91cbea5706af0cbf12c164367208d1284bb2736dea3cadef01e97a98c22327d41191782e827a301ce52a7c0b90686c5a2ad392a1a5d2e0571b1c0e77804f5a7c6a69db42dc212f3458b5a7b106f663b57814665b5a23c7a8af152373252491b4371ceb953ec930c0a966d63151109426fec1734bb5f822a5f59e6af61b7b866d062657207934535c34f502b6d975ea9860b21bc58a37541095577741159a531203f80b2fdedccb51326953a6b696a82a620b50961fa683cec89624a0619a3b1496ffd0e4205aefd8ddb4855f5f264c3ded3789422695cc4054b6b58a793dafd08c84ca03f7d7e077141d77ea3c5c6d104542aa6e51993c4c3c83d9834f0010bf896c6ce0e0c3c80e30fbdc1d2d4016868598423c87d6f5fb18d7026c7e926a9e2a4cde9335ba8d18df1e572205275432539419527a032fc0b13ba522a64c5853dac67339aad653ab2cb1668574ee04cb617e80a53afdeebfb1fda662204a9817a7e98a44e83b9d298ab1d387128678279423026805017f3d487568125c6952b8ff7c469c77abde32ec29c0a0fb42df16208d971880ffc3d532e8e8f2831c5c5a34e6a569880ca36091570feccbd793b24737a8df089af2c82e79bb0bfebf512a581043ff6ef83b3c722799009afee08b71ddd687f1faa7e8eec6bbd23be2aad9d0991d156c6df498ea094fa6df1081e907b1379241c013521798109a981648014fb857581aed82da7c77ed5030f09c1f0279cb2f57bdad3c90b4c8f9361bc6d3b0a6e3e57228424d887b5c532729b6e34916ea11d114abdadf47cedf4187b193a824370d3d4ccd6c94921d1d11e4170e8ab500ea19500e6b8dafd44e9f5aca29a1319fd7c3124581a46064e0410d84e2e2cdcc62451cdc9beebdaba37da7e57153a986a103b7dff4b109809db0a581d3615f496f7ee7cd2bf657ff7bf08810c85d9c2c351450fee69636261c298a1bfca10bc30394ea462c5a1be2fd0a2f206398bbcc965c8fe75b37ce612012a26b25ef87166b3ccdfaae117143844095f5eb643c68375b0887ee508cc0a223ed219491c05203c25651a350ea2014734754b90a2cd44354ffe3ce5726ce59c3c26887c117fd828b074a34d570e9b83ed375fa3bf2551eb2a828f25ebad52008dafb41075cbf85d3731ff64670d910dcacb0a15ba2500d91e56c4fa29b9f81e0e188b10f685807a15a72086e50f99f5410e612822a45787a22fc7b3b9df82066d69f26261b4152e196fc79384cc92ec2b3d66bb19ce2bd32e78886430816f36a23bff52201489297bfde8ec4fd4888fa4f1dd9a1f260867f782f632172543948f26414c88934409e885872488075507aa4d32629744134a53adf7dd214946e2ac1e913cef771871953c49756825f885b94d70982bade1172c274dc61b6b64d15b9209abdb67dd07218c6a8c072c252d8e2034002665c458d712a304857ed32ab20ae68df00dd38c42248c814292090e578efbf0a1fb1942e42ff979e0edec5d18290715a008279a0e9681718988b716544e3ba2242a05f1a61682839e524344bdabd021ebd8397e4fd6ceb86e4fc35cc4c42129f9aa42cd83e10121d9f328ef6b8585ee4025f7f168764a01554966e98302cc00fd8e73d942ef6e8bb6c5b578896512cd10163919c00f02552cb54d22c27d9335f5627660ec4e15bac61d15ffb1cf3ae15c3f1991f2d6b9183bab1cc868610df4ac28c37f2fc9bfe9e6e53c2bc414710e880153f2268bead594fdd6efb70d8252c42b08ecb00b615a6ca4d7822762c9fb07567dc4599a368043dafe3c53dd8883a74442f3e0b2b4b28d6b28064eed857a9d3828e71cad97648f7f446065ad8e98828a8a20b0a2b1300301bef6e0121dcb7b539bc48490b9c2e18650a734a065760e32413180a6b9632fe927b44faf01ad939e385483c840a2af76621dfc54a50f3092526b938be4a8c7c99f50e168228820d6809a2cb72f3cc28e91ce4b1cb14d16bebe930df2a792bd8e869c9a79dbf193731aea21a2060fc1948c1c72ad09c378cbfdc9713d4ecb8ef66838fb43506d5a7952c152d1e02e08d113c56eae81a6f7470a3dde1c80cca9f5940aa657202b34a4189e1a33574b33694eac7914934637f8fb1835b06725717d9dd07c6a010ec6ae2af7b330e00b7fe5c824d76e315a43aa3af9e8229cc78782bc7f7b49869bbc5e3a9e023f576cc07e1d2031f01695325c19dc4440c53810e8ef31e8d506097c0e44dbe97382a9fd197406a396dc7ec924666480e5697650c59527ab05ea5f935e073a0d18501d6066b0c16ce6be3fc89368ab1b860643c900eb8dc199b815d2c781cfa6788ceb9bb9ff3687264c810ec8fadfff3bd49307476fa446f3fbad2e17ae3bedc2bc52a033ad3ecbc84caf8a8986e1fdbd57cef627b45a7d4c073d999fad65e08b2322e0c47f294afd528f85065d397d8678234c920668698130673be2512868c31a20585067807432692afb5ade06ef4f110fd7933fe1573fc660046770155676ba38aeacac4b7f9959504440ee465d220dc4cbc5abfa2b28c8a516e76fac02e2cccb95b2ecc1f8807b4b62095995d0875c058cc03763e5416647e550039b441691ad2751c2f44baa036f13a7eba5eae575cd77e073b1299b0ae591aa5b29cca08dda9b305813f2a389f991e8285555428734ebe8efe028edb0b16c20692ea0b6c98ebcaadc93a52169d62fe249b90bfa6afebda44ea8bd3278b31c83bb07e92688c05c11ec1da77b5bf4a8093cffc23672614135a09f645bd1a61eb0df3846cdd1da5ab73659852408b420a1fcc698258b7cf90db395299efa254105a7ab0a292eb76409eb378310940ca01a55a20d633957fbbe68d63310103e9cf539bf63ca621c6d4e609ddf7f18cad60f1457cd489f00afc8e28bfbadaac11dd83818b1bd1214f271f787902644c3ccc63ad10657f4a2f0259e135a1b700157ad928017066be2502259bfb3d370f782098dfc49a030487567802798d704c01e6736d506bb74d6687fd6047bec9d7feeb5a9f238ad2a4349d09775672d3abb2cb876f4e870fde2564b5cce45000a7b886b7d3388b4061f8e8e441a93ec3ca70c461bede9906751d0f9ae5024b89b0671583d22adbbafc74f91adcc9b4c57a9e456d514d2b2b8c7c4764bf39612d37c8e498d2108239b0d170013bf0d260e973bfc75877a5c0930e14b071b5dd635dc9436f60462ffea9eee9ca22fc98aff4ba816339a1244f86845b8332b5976b2325cda497180567d886a73403d782573b7c1bb8a10514861adedc4b7281b0c4508db65687855b409ac216471d4b93b1f7d2c73fbc34ca457e3975a8ea087a3f8af8c6ec84d05be4ae99d22f4fc54d48c22795185403a15b0baea74541567526708fe0a599bd0d287746ab669f7c6fc3d1f98593d709aac4160f752105c10491d16659ac09a81909a09e6638b1ae2a56e821c332301881882f0f612d07b490c0ac1b08712e4eb954a67c4a4be7e7dfcf00acf347dbcd49bf044fdef29b81884619bb5f109714fdcb529499592114598ba2e0727280bdeda7e78f2bc593905e1a3cf2e282696007a46ace0099c998393100f287ccb42cb86efcb97254d1f318e06bd5dbd00ee6cf3abb6c09ff39045600ee87838a681f79ca081b005224708d82a5be0d7744a8ed9186ad97b399eda0b37b43dcd81a23daa41812ee5c2f68b4d52bdc0bad316dbf4b0f526cdac469eab17747b82e853a71cdc8ad99a015e3eb80da137ca4c1894b908007afac4edb477b62eb70a8148e021be0354d2e9c2dcbb0bf83888dca6a9d2a7405c35207f4d68386df120d6242a7f101d8e1b7851837205b12d30cf51098fe2e80ffb1579a89589a27193d35fd458467f3d78db18b038616e0d60fa161d6ae26ad9c2450522d4588d9d76fcac634afca238eb206b20c5a1378adef23f53af68983991387ffc728962f46b97abc181f6c28c63f30e6de70287ae414eeb3bd0b5646f7563ce5eaec1e004b4cf02c9aa5b66e2ab6a1aef6acfb5b36571e6c80c95e4b8db894d47f2989ad093c38b88ec3e8ca5cb72ffe094744f76ff9c04d4732801bbaa74cc8545fde70c8b0bc9ac0f00826b7f03bb02ea5c0cc3a2c446af58beb7923f0453bccfe49e0a46b075105de7c4285b10e7c4be835426372a2447739f411a7f448a7092789d8bb3ebb7a32c7a6dbb587118986af10b0931a30b5d5a4487713b0a8d8a11ec48822da8f4622a8570a5a6d1447b03b912b6463f46ae39dcd59c231546b84ee60633c4fdbe3524090c44d03416f648dd23a75b373b85ab13e0a0512b7b36de53120f7818074f2c657b2086d4101f6d64608b9eabcf6af25380117e1fb5e5ac4001d5995514c1087b023f763db1ff49324b229fc260a6352f94d6028498c0dab65289b71128755371ee74caf299d18416021841428785e1507236821fd801e5097c767c4e351cb14fef7e98a5d4877678c47bd5a34997b843b5ea64cca57a3c14655d364ad68e38c4cca702e0385548e1e6f3e4261d15adc5948d69d08f6a87fa420e785d1db80195875fa178c0c366887435799173f4a637df3840e328de6fe4afcefc070bff350da6f040dbe421a35b81a56378d13f0e718e52d4fa7cc2594a312bad85b4d5324456c4289bd45010421e0182c20d78044378f3c7b858b24a4dbaa60e2309afa1a157a9e120869efe16b32d774cc80a1fe15851713553c3e51bf41aaac8e3c6b0d337afd258ccee057f65deebbe51f6d5d615b0859906504588f166e9367da8a145fd5ad37306e1d780317d87d514f79fd51f0f3b6ac0bfa1498c09c7a51c19fe3ea7861e06d8d43840a7e37972633c0b2b91606fd6332c53a667eaac0cd54c571040b022ea06c9f4601db88c6cb8b5b5180a041460258e5a27f9b814294b1f89f74e61369d3001e301c8534f7a0a5a05986a9dfa976f3efec69bc68954d23e230002beff0424937a08708c7c6b0bc193545c7120bfff7ce1af5a4b84edfc83a54ba43142eeaf609aaeca676200d0963c0c1064d6f107ed9d7e5a99082a9e2eef406e6acc77f2b453d27724d9d04807845605ca79bbb755f341f52ba3ba52a129f2cea7692539780e728397fe92d922cd0769b5a79c6d337f4f8a7a2c3339f8a9cd39000776b255e5482d4dd685c0017140ffb9df894797f08af099b646694f8e33567bc8d60e05e2a41d7108f1d440c3a88b25d9713f08b0c1dfb42ef3dbed0387c883687142474e899726c2eccd578df4c42163c878402517ab7175c4fff2ac18d2bfdea04baa9aa754f0ba9edc5becb5628bbdb9c2ebf637619ad7b4a4462a1d627f90b61e07b71b006c65c067c46ed9e9511561af6d850b016c1e76a1a9327091b8e8ef87df576fd839947d4d3108c97c51c5ea7f1cba4c33d8e736ac22266b9018ed3d4310315d57f2d42166660768abc0c34eb9863131d3cf649e7dc6872158a81eeac4220bb513f3aeb3c1889d40a7176d9c8d42796c1a221842747a3b020bd9bbfee62a9bb4de1e64b624e08f1ad3d1032c09fc085334e89286baa0a07adae25205e0b76ca6c30218e2febe06689be1d78cda5c9ca9e17ca8ab6a1a61e231aec1898d89073c73e166996ceb9e0593933e8d0990e174950a21ab9cdca871c3ab31ff08020c8ed150807945c65fee81b2659cd03445f98013aca4bebc7298c8539a9397df310bd3a10ef00ce90ddf7f754da95c8bdc734dce388f258450350a0161cbf64c99d8d43d37b7ddef9214370709d761adbc2c0d28c3912ececd1936ca12a2d5882444a14605016addb0ad845c1c353a115c2f43ae03a7120a31736ebedbfd64428134a1fcfea657656f12b4dc684611d1729c71d62216afae717114e7d4eeb0c0584bc03924e8a18784572988aed662ad3695e52fc33dd8431712a817a944bc5569aeb814b7a1b16f55a5e51d8724fefe08f03b1c28c7b0370b878347d9c33cd9967640db3570a2398e53a1b2ddf53fbd5815c07bc8c7d21720dfeaffb5622a6702b6e7610defe6c0827e52f12482b369e4c9aecc4810d5e1c97b4b52aceb948203cd6283c191fdf3d45aa83b90b4151ce8eef548e8ba300344924e9e728927031f6ba07a9cc27f6b464c5263f3259977c785e519ba5cdbc51257e6571042716e3a02c1a31095576d8be721e2385aab263a6e8a04ee265ee667d4fbf6abcf48f71abf2d637d1fdde662ca5f6320205fda500fdde48c67d5f4aa84f1c08b7f72ea9303fe84ba7612b09c08895f9a94377fb8e917a757bf2cce799ea93ae0bbaa06056842864383d30965631a244a3c80c413b1d7c817828321d950d39e3cb1ba75141b7a64793b2eeda6488a0c8efe61886a83018c277598ec4be87ac18b0081185d93030290fb230e2e728de556ad939f58096576ea367a40a181c20ea98bcdd87b6cbdf822516187c0dd74c2260a63baf7ac9b4fecb54b4ec760dd5331505358e21b607e0ab35d7ff51026a13fe581c62a933693196ae97112cd05c1d53d0af6b7dd7878f03a174a6f79ccf97d080fddb823a6e1f8ae473e915c3ebed0b07c9344055c703161a1b448c0eb0e0bf571eb9c0a2c1fe95aa172261b4cf285aa11d011c33d85177f2fd52904c94049ac2192c00ebebe49ef5dc439058a5d1449fcdfe985423855648f7e346cb5f994fa03f5c008ef301922878a74b198aa04f4feb0709d89495bbaae29a9ebb2653f98a38b8d908261b8c79e1b2d589f94221690258b476331207d4a15bb8e339a515b13a21c03802f355f9301724065bd20dd210c30301cc9235178a7365bbc6750de736590a01c7413881884fdccd57b8372f494e700acb6818c93587551da37a85d3063238f3bd46d4cbef88a702225089b764135467804e1ca7984768a80c5092bae223457cd828c89579934bbf680bd7c331c6272bf3d11308bfe5657bc5593a5dfe4d0907de10cd72e172676d1919ff17ec6c2214a1e434e6298664c7124917fbece2c26a8eb48cfa99bc7b6f5bb9f49882d443aa42b0cdcf706bda278cc790a7ad96a1a3a28770c5388ec82e72837a18185c8e7103fa7618c7b0d99611ed892f9fc4c20c65f710c8827881f8d7f628a389b0f7017159076834be53053cbef54176a2de5104e72b21a3fb9a5788e08f8809d2fa2d6f6e3fc35656fd405e24770c468c71906b14aaaa28c532fa8f1a68a9e75ecd3c9d9f1c2522c8941af06af7b90f9d3ff24200a82957bc72d85c4618ed732faa73da95e3671e54304e9c15020add3b10e8e24502ccf29a56b3f2576ee7ab1c2a497f9cb0b64892a1f28ea288ff8d397c5982f68bb248c78e086e410abf41877e440bfd483fe6090256aa0d79fa62ded7d545068e0b105e4b3d92399ad8746792826ca04ce2b7b1e883824176534afcaa958306b4f7b343187f41b4fbd83312fe646b514e282a0b3328b6a857f80f3c433be81afccabd2a4244823a797c18c948c364031782b627f27b9e8d59c822433a56a2adc4336484f826ea46825144c135b069f6478810b475ed11c3bdc57a2b357feed161a7fda2c82869af9ca23851d2d840e9302a237395f5d4d8346642685e2f77509437282e0ebb7a11d11cbe2a8f48ffa05c1e0fd50f5a1e862a13764953aef1a2d7827bd2eab196144254a73ecc814547794d3112bf4ca85661dfb0773b658f02fb38e396f9d1523fccd749c70277ef5dacdff9dc9405fee5ea67fecd709e144e613c6b1eadfaf0a9c68f8a86b11d2a7f32e4c66a232a4677ca751cb0e01012c1382e7227546a691956c1f18b1cfa9d1eb9626b2da168258d09784aff0b18ee0a9f6ec08ff8f069eb664042443295fd8f02aab94140a057fc13c2e8a99bf8114eb3a6fe7748ba7d1783cd4e7c66d3a6d2a964399144909d7f97d2c182582808fcc67e41561d63ad14ce8cf2ad8f14a184770629ace8df6adae05839feac24e5d8fe344ccf768f43ece8ad676e86b3b8c26a65fbccc1e1737205bd20ee35fd1d05450feeb9fd4506c2dc9353d732f7bb82e8a9a90460a3be57877d11002c0db05e06a3db3102d19364d3de31b090bda848d9f0e6cc43c6c77db18075ac06900b4003ca4c63ae59d1415af0e8a11009bc105985efe238071c13527910a6c6c4603138a978829584cd222205c76b9eae0163ad3ab2eacab6ca4b031740d8740aa5bc90ee20b42f8ead5e4d0baf9c24867251a3818079ac4a7bc9d68b4defc2e6444174e652c43adc2ad8c9f23d968eab5e0d95de75c3c69134728dff29c871d533fefd90d816b8f2b9fb68dcf8191604810b8cdd684b1afaa14e696312c642331cee92ab0ab9553547b81a9441dc06f0a7b21b53f2d9f00f06d1ca1f62c115e83130061261b7cd8820d3ec82ed6077fff42e4f92ad08606602bb842c4f73e3a96497d7cf5ae14842adc2ea5dd32e2d378da809e4a190f0f3b40d9e6028be5ee13054e2586b8fa2b5d356354e4632dece6538f681481a8e8481b38f1266de7f38eef98c8444b046ed125b9c20601974f02833e22c623b80ccd0424dda82f6d733885dcfe9ef360910779df0f1fed7b344db234e60c38213b2407891a9b70a27c93cd65ce554aa3bdfb6e725c947b8c689875a5d9703326739c8c001d716628183355739ada3626734f8462f79b3d3d6a931897a55a255d9809190ef85c73445c8773395ccf171ef320cf953eec8c2e4b6164758ef3b2344cc3fc9122b971d9fb3dd66d1683d692b5721d4c18c596e7f4c58ba7c44890892c88132c2e3cc41af76ea1a8c59b2eb3a2c8519206411b82c264f78b0105c18b0f3c807f3d952b3cac8ea5a261ea5f5b02c92b52802fef23b11f47c6040433ddb54079b815246cf605aae69ebe910aa0e43ed83d9639c067d8a916fb93af3c86fd32a08d58eb71380c8841469426585d878a31da7073b91c2d15601545986bf517f01d6d75380079eb0e6e6281e27bb2f0ccb06af556a05d0eb9b26129c6aa5e978395627beec2f482fc50384a8c5363738725dd40c56787cd4ed8282f4e773b8781daee04c17354626134c0f0c39c7ddcec60b526068292917ba1468bb1b89c36d6940efbbd644ca2751f8ca3530d87d4cc6616343c12502609032ec45cc2b35fcce2b39c74381674615457762c11d66c664f33189104a132e536fff2bacd016f25aa798fd1111111519d02077121fcc50fd45d06499514486305d58e3d567cb1002d3bafe53eb796a135ecd0014e5a20bdbdde9b312dfca342c09b02c079c1c70be3c098c2e67e0c5cc23aebd73b59da6dc283c1a7576d4f7d85c26f9f79a2aae360e7052e51e5be5468165c1b24d41b82da0390fe68d0ade7e79bff64f86389803d67501348a40ca948328265e997d482a719200d6618d1136209e09440efce0cebbfb46b91fc7dcbbe158c8034d425d6e82f79bf4c1b89db70b4dde0214d522093013ff056a054a8f99d6f0ac5c084b9bdb9976f2bcb44b656f51a1c7b9375ebfb73085acf129b6ce2f6d0b4551602c9b6a7f2272a7b5653096bd79bae755547c92c1b37d917f0a2b1a04e96eb7bdc3ae0072aafd258d7217d5cbd483cc416ac60312d1018b964ee3b79202b03b516726f2234edf95b717d6a95e6a2ad9ac863feb82013f912ac41394a95bb15049a46b70e8740179570436f10c4ba034dabff8429b5121da0f4830cb7091da44a2f97ab3026e7b728711774a470eb894605dd2249888ff9ea1943d1e44e8e264addb876161fbdf4710519571c8d9005b78d3ad0964e0835e7e91b8d99b102f510f35ca51ee1fb72211a9a86ca3eb737796d061696a83910aaaa0af8fc23b6f3285a18132617f9b85e982358c04424013ba16d24a9f561218a37dab7c207ec1a6a1caa2d955909f65685658a45de5a0010b6e7ffbea8f04e8ce00020954c65b79461d21d648ec9a892681438d4da4f17c6e110cc462fb6845ef4fb93f811580c26b259cb6ecfdd94b4bca66d1f2f80788d2799011949e7690dd62b7bd7282f66605ddbdab3e50de2d3c7f87756ff5faeb273006f660918d1f3f1ccbafda247a142ed86e8501af5ccb73176860d51b382c3da2f96d405720b9171fe273ef1a4a714519697a65a07627a0b5f68fc162c739636bbd2b43d623e94df1fc2f094efd4b30eebccc4d3f4dd517aad1e2edfb59c6aff0450812cae781112140028f8555acd399839be34ea222ad071b55b45b74d7823f042c12213570b58352f84d07c785fddd94eb12edf6b57c7e4aeb1b184f74c5935fb08a7ed7bfba95bd023678b8fb0c45958412194e05d45ab8e170fc8ccbf2fa31c876c773cd0640a1a1c3e2df34dbd8e97a06fee1579ac703dd0c5699f65a8518d37973b817e6050de063fb12344f65163f857494aaaa4c38ed09c5ff1fe71dce6a660d697f10359d0a505867e2eb20957d32b703a4c98b150edfd293fb8f0f156312b0da840d6fe75e3f9eaf74ddafeef3cd9fc69a424aa50d4cdb12542fd5be7b8fb74453f3db3d91a56bcdcdb5c889c60da4497e2af0172a8f066bddd4a596ca061dfb64703f09eb96cc82da220c08079dcd3093674799a6f6b728e604a29e16cf6aec9e4502dd108260152f965a4970b61d0c2fd7a230e4b33a7a2a3c74d334817f865604d84ee6defc679d5f497b8f282b711e8cbde3c2a1ce6de821c12aed20f3822150e5eae3e0f700566baa2939d26880ee7ca6048cd944cc84526b9a10873b2afe85f24f2203627074d80a95441e201ac1212e00d2dc881b6dc94bd4a4e27c23c9a2eba74725e3c9949cd42445f7d3df4b3a093201c1d5471a9a8c7966f3fad219432890ed656aa80562b6847d094bbcb9ede6cea75d0e8ed61f4ea130b6494629c6456e5e5530c3e84869c44ff35f1bfb9ff83058050e3af6ea16e36691d6160723a41b3a42fa8cb1232b6a9ca98b78088b6df5d8301682c53cbacc9ac53817d9a14e1341fa83760992a56a1a4203470dd26cf85d565d85b8c73984d4cf88ddc6392c586a3025b34f6f2e3c18842c44d32d0d9a0a81ec77b3ddbae30e0eb6b93cdc712f5c507c3565c886e68c6676a72a3444c7cb9f2b714beeda0ae1cefa4c570a1760c5b54205c04ddaca828708fa0ae24f44fbcaacc0e2024004ee985cd1d8460b43a6b341d3d2d4289babb899df6f2110c07e1730c18d54a2e3dd3496118b9e7725ab1179da99535d08dbc62f71a325e6c3acb0596bc6cec34822d4c6965287f85670f75355605b588742d4f5ae9995494ed68e0c53c444d29c8dc7360873a026b45efe103ab08adccefa73df8843ff55a0bf5e593c6bfa99036dea889d804747ac8d314467de8c051362f52188242056d01231907337375c5e2a83e8debbfe0eb192e0a89710a89372efe9841f8e04a14d261851b02d767731d5f72b6449f8165220326bac5491110e3f61787b912e41b6c0fe047c6f1e1b89a762afd8ef0196e21b4be557b14079bff944aa53d78c6954f49755e93b74cb4b487e7e410051d4be5c5c5b09f63c62086edf5cc25f522349384c3d1d6b7ff492448464e3a9a64df9b03d6d5f2450d7bd180ca339f12e4af4cb541aa70ffed656e316e2fb4913c1a99e9a6a27418734add0085e28d1f2bd28b16af7f8ba4242e675ec8b6c3a7647096ea5d5b3398a1df7c5f83bd924e9cc935eba458bf136e4582cdd2fc922c72aabf85c603d4cf0ce4eadf9ed16652cf397685d9b35a99d6638466136a634fdd3fdfd77c76fa0274df46f50504075f16fa0b570a2f59a3e297a6f1a4694d616fb470544e30ea3125b42015b21defe51b4fb8075655c0ba8000cfe187b5d41b8d5f69ff5edbbed651fa49b1b9a425047d8170ae65f7de2065e65295b164cbe9a344cd3d69c166a9bae287517d927262f49ed81e6c5e4a4d11a2bef90397a998c7139345ff4b1054018db39a95e1b732136451900832d890d919f28ecb8c1babf0a65a904bc1a56b86af802507d9f78278523fd7b22f3ddde19710b1436333572de256aa8a8d9a95d2902bc90935c74112391e9b7bb86c5141fb06c3c4277dd370f178fd1cd4cafc3724a257cc9223fb774bc2925db19e0c79526f5ee88d5225f5db3de918480ae7da41f52ec368df6701d37e21c966281cfebc8be86925de36d232b2056a6f7e7c912930d1e168075bbdc8c8c3784930efb80512e295a1539e710cca9ebe2c29d9b8bc91af66a2aa7c99cd101531c6ecc95554965a4dba3196e103c81f7797bae2cf71700b556e63f295db378d55530b5e8fdd376e86706f4d421ced12e4d1684fed761e80de59d6394743024d98e04dee77d51261aa90d9b6ab4ec7eb5716cd5f07bb3915f64e12231835cc1380828f5bfdce982420e3897396933d182d43631806cd0304a980c40551027b0c7b890e32bfcbea31f29f81f8c72496f43e8a8d563b6c5e5b55883c44212f698eef3519004c20162987a7d46347ef988a9089ee02f85134e06fb6f07cc5e4b0e396b7c7b96c13f964dde41fc7f25dfd4387d92a2a00a0f65892c9a58c6f49f0a80449045b793bdbbadfeca39eb82205733ebf1d066f43fd47f04adf196ef4e97a929975ef74efd0aef2f9c0a19cecc8de74f6e0698421720b32eb0fd8c56d4a82cfb6e2ed6c1fae7c5181082532320b168ac81f6464a0ecb3c7709b04d4f630c310238b2b8002ff104679c377b2df08b5e31822bcea75b75e62c5475846652c7262819396a7e75922103ef4d3686c3718eeb4b649d7adeb2434c86b563990fa8b410462a62fc7b4fadbc665f83c8eedc2c1bb6d4da54472103a70b7383c3de1d956a61e99cf3caf15ac32da2a9eab72201eb78f23236c0163ab02d397a0a2ea2ad17d15280ba51a6dc150ea73586f8f3886f7ac62dc9c3a13b81817be653519581b7e1f5616bf880549a5dd7c1dc8b8f102e1f9edf8f9476b95b7dcd0dc634294aacfcbc3da404b5ba5d08839853183556f77f040b498e12f938d7c7a9f8b4b66be0ac096199399b5f082d00846c4f0034344002d64ddbafcb9ddc771f5813ec6059df05f3b07b50e26d836ce8213e3c46802eedcb3a042601bccab5ce53db4b3d1497bd1e226a629a836bba8405416fbe945f66da9c4021c646c42b59be0c0aa1d9949f42abeab1d4f817895edda618bc7c823f96cc1cb84e179368f58301f724fc247140752ffae59df86b5413e4e5e01510cbea272f4b108a9045a76e3b4cb71673da0e2080d1558ea0a84556567291b130683c85242be73bca80dac659652e0e078b6110560f330b7671ab8422779ab571323bfa3eceb40d09e9124d551e3af12a9ba9cd1fb4ae4958f23337c66789fff4c7c23cef5b04206212d589a6adbedaa7e863743884bb7fdf767d8a58a78da69a8e5a50d40c999e602487d811d2bfdec03638181390af7e6822900a6e099b4e971c15dcf622b3d40fd5945328685353c54e2ce2d98ac71d5e4bef3d038b5f738c802cd557056eb3bab686a9da5db5a80f0b59fa68fbd427a57ac840ff44a15a3a65b3ac3b5c28144e9cacc7a5e3e7d2735c2b848ab31ee4574126991cbb04c0a182451965ae2b37f168b621f26b65c654f974ddec516968a800591958f256430302dba52352a440506ebc29f8352fe074d928e5baf7d15eb3c63c822227717bbd05a9fffa0bf434a83cdb15650fbe66bd867b37879a35d86ef27fbf540b3a533979e4e466254e2559661865e6847d86c499324f71063c928d11e2cc472987ff08430fed5048942e9853141339c845a9cb944cf6f11a81e2d9ebf0105f4d4e62b176788d0673040243f9018b2752f768b75ad5a68d826dcc4b553dd9f67a53e0ae42cc72097cdda9a33b9e266769dbade89292a86407a0827e07fc59839d9df96ae97933be0c2622028eb0ac371e9e17e495838ed54dc40bb922d8d274a8b42d91f451c4131c0f2f2c2d31148a68843322ab71899da2dc563f35ca1d1da95fa5cc9eeaf536c46ae7712897d1880efc37ab62802de4ea64435a51f033021766a2202509956a125191658e3810c7c56781f8a3a4115c23b9b8a9e868dceaaab32148472d0141bdabe7bcf8181f6b12fd0a8f99a923e0c583b0ed87a2dd9901dac2188eb3dc5f516157a15364f799040247872d166b7a772f429725c98c1efc3d7ff64a9d22ab210599339daf9b513fbcdb076bb7321f1a630a16ff120f831fc28198df6e1fb8cf6911f675f19b64e5602ea9ceb270a627f1a8675731e61632b5127b94f9bc857d72c530852afe96747c8178c5f10e7041ceb6cc10d7574950b67de2b32e3fd743b22e86ecb459d7ff50fa2c465d1d6770cbea38ca7cca4cc45054e4c833feab3b6b9468d414ca25543fcb72544ad14f81f4da67d085177317a1873b08c30b010e90070fc7c9418173065b2c36608b0316754d43f4d37ae61b0800ffc8d0026275a37e571c8153a3c93eb96ab363df74987df90b2472144106621cc6ef49ccd6a164643464ebb27998adf48025c827b3a3187d6f78a3d17bf850cbd5a417ad3a502dd7960309451349d6cbd2611a77df843169b07008a2043026dfa8e6f39682dd20a20bc9d1fabe89b68aaa819191c90332899579425931cb34b48e46673e71f76608bc81a9c4fab7df34610d12cfd41e0f15a8d2681de9e70d2d09fb6d0a63a6e1779670e1e5729c7964f37d952e7b6626afd5246cb004c82b845f2ed6e253f7175b1dae0164d09d6e77a4d301102bdb4995078699f525782a53108c2196e2b2f81f297c3aa21841a1e2a299ed8099467a236871855f77fe201a7909501f63620dcf78cc1d0b03618814630367bb3c6a0ff52892e6f740c02bd3000edb7c50e2b74603f14cfe0f6c9812e151d657dc8666476b15743af24cdfef4d8914aa933dd7f74845d0860c5bc0fb6416b9c2d675371b4d6d85bfe24cc8162997248cac4a6bcef84b2b54aa84cec6f0934fbb1cc339feebfa33129c4ed23c75f9a16bda3f4974264246b67d8c845772f1e245656d683e77024b6b43da4f20b21d196a4490f6db88ba7eb757da8dd912bd7cbdfca38a3193f308c63edbb54f709103f001e5c759231e893b1e2f2be258e6a5c1eaf72690cd030a9e0058aeddb463b868bff4e59cacd7847b0f42d795e8a7b5b91f7a3df7ac72c4925b1f1103a1830de6ce6448f73253ac65952482f496b46745a986a3c2ddb6ea42536805e3e6d2c19edc5f31d84131d789dd4e8f6720e27da2614b2f3e201f6e50520c6a4791062508375810ac704ebd5a932f7637291e767f54faeda350480002556c4b6ece472b383b0df58a44612e513cf3143a8e53c09213ad472e9c7013cfa10e30924472985943cb9ea0c41add7fa7b368ac48b7369d11280422d1a04afe83d3086a6f95285215b9742bf3449faf71830b15f9db036f0ff51b9fe27c56ec84fe5eda0383af0984f5ec99d18ce2f1d4a19736dc1adde4ea8a95998c599d3622a137e816540a1f83428e178057eaab5e9d8d4a3d1237ed42ee74644683decd7d4e96d3cd63eafc44199ebffe72015f05b323ef363e71e06d16f4e15b33e30ee2e88d8dc1b5d77bb6664af373e801e33e5501286e1cbed86712015a4a0fbb1abb015b520644e9ad1e88aa8aeb8bdff38e161899f8cd184678acd1002b2423aa6a3315e385d82c772460ed06d5631f58d69911b8a0bea761461eefa3518eb609d72c5921253ef42b62fa137d8454aace38fd6e55e7449b4041764a80f3a3ddb669a1503e3434476f5544eff3ef61dfe1496af7996881944144e4097930a30da8ef7c13f30e0116c621cd96864c68c9da5bae349051baa2a87a8307cc0429391547e3a5aed529392fd28034b2a98a35a322815e7315f3216962b9c51fb9f4f5c83ed55a1070db844cdb160751ef1e8728463fdeb0155efa2bfc02ab29682240d8f6e77cf7b89062a1fad2e01cd2948632f2b612b90f4b0d8640ad9420abdfebaa35d2b48663e71b9e22b9c420aa1f232453eacd9344fb7e29d9d125325a2e43e1837fde4b6eaf985e7a3154816cbdb5f6d45286eb84da66b54159ae0ee1fda6d717627ae59379fb88c3a377bc6c81898f73a229c2fc7f6a815c461d7b5a5f28bca6bd843ea290dcb66866b5272c80bc110aa8eb975d5437af91969c7d5ba87bc7aa8527107f30651c9f286c5d6c7ca836a4045e90efd413a47f54bd2a725b207a5c2caa280e7d47d6372b090d2c255e083e9902a9e5fd14775e2fb01dcbe7f4a9b2802f0be4c6ab055300062437e7785a0f2c917603d45efbb4889598139c1712f7014ac6b139f934e6a4efaa27b1d3fe7221734a629e25951a70bcd9e8ac226e942c039eadaa8dfb5b0337ef038a194057a25915032a0400a905d62f1ff501f3a84258e8c3f3559c40abd09700913b3de7dfe5b2fb4720d0854a9df129045f96263607904811b83a90fbf59619377e852eece4e180f78021e9143dc9d304965e470a3594955eea6ab0ce830f3643fcde4b4e0b273483d974512c9459967d0260748173a3e72f5842ad2e4cc3c4aef901ab55079b57788c9a15329c4bf3627d26186396386cbbdca77421ffb31e480b0927ab3ee29e07fed952b91e48217ec4a388411bb293d5953d0f3bc981e48226e319e1199b2da68535f794b38409f04812aad47c9f933ce4ff3acedcd87288dad951cf21f477a372f314ae89fe65199ebee190748af5e0ced7039b03cf0f06a7e175c6cc8fab6f7e4dfb3b7895bc9b320ec0cd49ffb781d30a5cae096877bfe4df4628f2203eb83e78db5c2410ed03d4d23505b1c903a7aea24f9ad47fe3909edca1f43cffa6feb24be2dd56ba63f5e3570e5ad8c33d3178353cd4a756e4fcaaa93c59719911bc51ee1d98830f454236103467b35146992d8c786ab4f8068b5ba05024816c151aed72695f3a404a87b6f219fa5f1f145d89fce8b9d55f23dcaef4a046a296a11894d118b0185588b45817f1310a9c60b99a832fd240cb0e53481a21c4f330e281ced499c38ac82dc5522512765c500d23c32f5b4b742f5e1d8d54698a9b315d9312f44b71811dd85f1a5ecfbbb6fbbd0e256da9abc8adeba54204acb50848b1418f69fa1097bfca14a6fde90fa9a09bb2adc023523813fa84d714025a432f14dc4d681d4347cceb432887c323418eb5a893b885055715e857d851b0777ba7370e3801cbb3d06b974655b639e752c93a2f0f7e857d63c99e8aac21942b6cf750c8533004061a751cc9bcb7f8b6a59a1f9e5fbf823e7bd4188b75be6db199e23b7109f4930d185ee219bacc053bc770e68ff2658335b082a18a5a5d8e6262a1b82f24f4f55986616311785c4b8dc470fe7e0b277e46d8441b11a734ab8036f9fd00b6ace7384f0518b4ddd67be495d6572d5b12a841421e366ea9e0d93fee248ad64dd435100826fa1639b8c268b0f27ea104b7d063e94e5d375a82793bb54312d85493939ade634d250ce50021d40131164ea4f177f1f7d8723212d9da254985ebca628eef85e24c494f60057bc5a2ff26fc50d044f0b2e5d0d9534b1333ef62272cd0b72872c9779ff2f4d58d4209531bdca231150f2da44d1a97e991bb1a06bf1aa54665c074d6b4c289da2133e7ba9817ca13e9d1d1edf95d2d639aa9d346b8f5b4a29474a9f546b4442fa0ba0db086f12cf1f9c1f6137049d1ee80878339944e6259d91d4800e2926c4885f2989927caac81a23e3d71b8a22a2231eb88da633f99372a560e41662d57e9b26467d238ffa05f5d29b03d6705fee6b6634ec0acc975cba2b03eaffbb1b7061ff19ff03289b89594843842d1b0758c7b628a933f6914e98489e23960c60d5aaedf572c3fe2f342271161596b9cefbbd0105a93be6a2b09c0331bc7a2d655639cace031d60b1b499b3c44737cabc1d438211c4d8b2f6e3ab8a8bad1cc0e06355767ac064e7d4e815036951d61f582f272249b3dcbcad0910d3821315d0ae48e3a805d1b155ab2f5fdc12d8c777658eba893c5ce0a8e9598e307392ab5080f6551542043150adb444cd6e3759d4e66288da246c541cb85e81266c6dc5657e431e0ad75d49146181f21c4d3321272cc4bb06401c95373bb0f55624b8f5928699760246433485c66212fdef66e9b9e31fec7c334fe5a435848d1ae0010551097c261d77f4655c33717ccc3e12b1a2eed60377896bfca5796cf6898d6b0e5f271db370b7f3b32690f33cad8257b5de2874825cc8d427c75541476f5d74b22b6d545d266aaecc16e17e29eedbc8a8c892611ad1128c7f61ba03ba94b70b8e13972463b2b31fa0d9209670920ccf72f97073be86fbfadb38898d1048ee4e3833fdf945ff1d99100b33c175e937660226e338434840c04c106608e2ca1c0afc8eae020d618bc7efa6a355b80397a446a299190216c05795392e33db2d99b27f7460bbc3fbe7fbc063ca67ca6e734cf9b88e66cca3b7da9954dd4cb1009a8cad7839570a1ed0a5073ea304fb53c8638faa01c16ded42a422e128005998adc17b9e1ecc1bf3ceced2f8068ae67795119c3b61ca3934020e80a37ff244c922ea3852b4490790f36aea423808ab3898dd0fa3a8aa4143fff1341c867a309397128b5cc1247caccce970876ba7e433deea9887d3f80a7054b5fbed4505a0538cbb7bec0b8509656e7ba4edd2dcba62f5385b398fe2fb00d013c8d9431ceb7e4dcf85a02108ab42e31bb758e8314130cf163ef546e9bfe71479b8a5510cb8671f96d2a6b1df85b967382e381dade3f5aed1333c758d0bf22e8cf441d982e4078a167d5d52946a6e64e3219fd55fdd218aef799ac33588084bd7ed0590b265ecda0b8564d08dedd7b008ca6b699e1a99ae1c642e85953a919433a32185341354a1d843ef657d28a0289c5488ec8a8f1842be3b6b0489599b04bd58e6ff23905a72bf2de2d410647a08e76ac297d447c388edc76c60135a9ead6ffa633aab73f5f8b4878f18073473602a9ae35c916a6f7ca2c2b9e326c301030a2c6574a903854be41fe0483e66ac3b9dec0b3dfc5e069a9802d918caf5e9838c57a3c8948d44467cfab833b38b59dfd9f7bdafe6aa3b4049fefa0d57861895f17462ed34265b3c8d50a44e60461e6f981ba5352eb00056dd2496c9bf1125035653590f4e5ec909083659bade9cbb85be60eee86f59553579f3f1badf0e8ab5178d25514aaa3abb29f78a670261519f982dcaf5ebc91ddbba6e486085ec95b3edb2262eb36e37df0154defd701ef3f92d62dfd003af658145fd5d1d2878b3f2fb8e981361d5410bb7115fc285c85847bdea96cc2d355083ed0a42ed7b7eb6d64ced4260d91a0f9ad262ba08416019634afb9f739f4c0c0bce12094eec93d95d47b2437d246c98c68975ca7cfd1e05f53d9b2003be78b666fced52671f8d97c96fb5d16aad784073e7a26128a8cc47f8a40a66ad06a24ac33b28582f10a57b97101cae67df4bea6a83c19627d3710198fb086ec241a3a0e2a55870494136310de6dc495a89d73912518413d16b68c978b79b0c34286f0cc24744701765ef2bea3b1a1cf57e1333f58d57f6e20c475e46385bc5faa4cb082241431f505db08c93109cd76445847f95d55c4f15638f1553cb1c8ce8ad08a5146bd5810fb97aa9dda952a559d6f027e68578e685531f0215a684c6ba2f28eb1e06885059e3c2cb626d2192a01d7604071775d55678e5b8fc3f2e793fd05377cf00b3b2185e10aacf427c316e1fbe041fb9b6c838baba321d17610e836e0b84e590d0aede15c6b75e35bf123e17aacff8c9c1d180530617c56a9569736e41d7b540c4bec4227ee5c2e29a9d716fd9f2dee9af385576dd14ba91ad2ba8b55bf57b7d1518954f843e5e6a8e6c0ed82410090272ac030703cada1115010b4a4407844430796a43b3f00ef16a36ce9180854c97152651927f2ab2b65f50cce7f7942ca337a0eacbc11f97dfd193eab1b02784341ede2ca8430ddbb53b9f4ed9685b81f9b010f8526c098396fb5220d2d2818bcf425ff5bc0a25c5fc01382d982834e4786920b80395fdd3d08d30c105cae1bf0a34122fa2e8ca0e2a1fdc4cb45235d118c012188b9371818f4f0d53398fea09aa37de6012fe8495e1536b55a33a8dca1c09c319daf0db4e90c4633701c10d0082d2a3fbcaaff34277b439283ce7bc0cc41c8ccc35aa56e97d6e4cc7cc9215fc59734e6fb4c67ae65df9c135ace58a8ef4ea2a8a9581d274d1b112d571d45a876ca95822e76ec72affa33fd7aa532ab9cce1b6a61d842b459128b73c7b1f07e25cfb5292f24955a9408898b956f09f58c59d6a8e9ac70acad5fd4a53891134650b1bd0fd9d73a4b13cf03766f9371ab4097b242145c8f64fcb271ccbd25f7098e008c95fd8ec50c717a8bc49b81de5fea867ea5ba06526a77430737ea1f5e5eebd88984c6765795cfe399a869b3ae540ffbe92064518fcc1b83567e321347b71c3c3e4dc6bda4f922d1636397ba2dbfd14f917341aac544ece9b3c6297bcb075e1fab380537e1fdf8c83ee2f0f19231f70cd7ee6564152721059e6bccbb88e770d5d04f4ca397164864be70c908a93ba0bfb243400fd3c1108a23d8417bf5def7762017c2e433651533d6a4b76f277bf544216a2cdf81d40ca9ed9479a118d6d749b2848a5dec1d1a46b6b247cf0a1d689c58e373d8cd2784fdf507cc92e707bf833ed0cc983af7b38c468b132fb53fce24a0f022fc1b06cf6b3cb9c89a44add9fd8b461beeacc7bfc67fc01a456528af9dfaae652610bf181e4eee837cf145a84867728ae25693c005243e58198cd66a9d440b6ce56941ded4b286abd90c3f032e3aae4d1462184d1710715942e5d0ed6e0159ebcb1b1cc9862f385bb0f3e7745ca15ff2d553b7cba8bc95a0f9c5bd2577b4dd88e260991d077dd608a924bb3d0a5738cd3f60b688276489ec3d6efcb60dc4464720649492801d4af76dddb4d282fe183adfdffc1d0f814d6bbbd028731879ec103c5df3045b0df301ca995a0cec090c97cc12518976d985541352543741f8fe71ad4f81311e0f966295004c8d156a52a03f26b9cffd73b76fa96bbc1d5a407c646b55d66e2858ff344b9abdb98573f4e8c6a86e0c85f5aa7e88b9a4c2474e8d8203a2474bdae38dc890368f626db97be2af30e332adf2277c9ebdd94bc267539dabc602af8aa9edec6fbd879d729ec644734b404f68f54a8766e7dba7a5a938cfbc250814718138132f8ddf90f351b77b741cc863a81a1fa306c0fd599c8f1fee7046f7d604c084f4d66f211ba3347678f45662afec0a4617eef6332364e75e9d53e89e5a3fff476530d32dd992073044819347863432d4c41f704f33bc1f3c9b3838a73f25e78a31e27a26949e8fd0f80021f3675cc5689e644f48a6f14ff38d6fcc095e83fd0a66659c15385e2d994f33c64c0a94d82f4c59798c5195f52cd15aaa844b865ba99761e0b361e400c4131e187660533ac4e751529140e42b7935eaf4560de52faec94462aa5bf3befc9606b993159ccadad38a1982cfedcf5af50b9d07c7d43f938e7b80002a7ac759bf29925fa0fd613433e51571a2976adf9a60e1e45509b0c371d3299fdc7fc4b792b994faea4c178cec01556ae87f1e1372718394ad24866593f926a6d766135d9cd980ee937cbfb8a743cca52e51865970020a26f450331ef56b144a487f7a43c785589e8a30d0d8775a6e256559cb7ff54dbce97b39fc7a22f88de00213c5de84dbaa92a8b48d863506ab56711ebd4a6cb5a1502372a3f979de56500b609c016ecee90b523c121d21ec84cbdb7b6965305877e2ac24932235e4490af5b47dd0a2672cf6fe625a57295dd35671a9376013f85b3d93ab4b5292e87c6e134f400bc186a670477a53d815741554c8e8411c116457c417acc5645ecd64eb05778cf7ec1d9edb337fd14be3c0f4f81d414183e88aa9c049da69cdea55d7c970e8b5df60dcc74a97d09018b33721569499bf51f3078dd69684ec26ead76df4c0ef7be1af1e5dc8626d95a053ca9953ec226d31b7f56d64b1a4b9001b454eb32ca18c066d0051520d9287283dcb1ed34a9bc5cb75b97f224ce17ae651e4441a2351623e3629fd83d86681010f1e35842a79050aebb0847b16a318b2db083bef9a665bbeab60bab3e2760cbc788a31eb00b5a7572122588edcd879133e2cc709712038d45f65054fd1b0b21d3cd45a16b6eca3191b672693271f9b45e8368fac4df402b0858f899943659c894ae4f4d40c482a7d89fe953082e94723666a7a49dce81143074c80928c3cbffa2f42ea29665a94f9b68161e88083b32f8d94faa5d6c941a3d4e70cfa6be4fa221720ae6a7eb742c4d2f4f6d0a299d7a39c793eb2e8d504a53e59c86160a9519730d2475317558c23240724416bb08bf261e79d379364c234cae90cdc72dd3b78f310c7683f8b189e7900f2c64d734b1764f9dac198def2384f95cb0cfbdc31009921afa89ccf63e0fc59ae491659d5d99241e7f0a0aed48a4be4d504b4a08d6f527064cdc79884e16902b2bc4f8cd9e5de94e920392425020552606ec9d9a8808a5fb07fb00e277df1bce46dc91f705530bc25a9a42b4d597f9ce7df0523eda7b24c55198c0d3736c3a398c78afecf48c6dae577bd380edb32e3a072226af963427713a09ed28b3711dfae07772e68701d809ffba7cf68e3a296bca10bc6e33d5835bcab3c2d4923c6c3f11eb015d50cae0823f3b8732a52c2244fe00aaa4595e5110106a59752ad7d6af83c2e19caff32ab4bec0ef80594af35a5c9c63c4cbf9ac9f61238ebf2b47b4f2cdbf7df6e137cd7e2cce3589862e0228ed15baaeeb19cb83e71cae46301a2e6ea668dbd6f69632055a0530066506b69c6f3f9dcb51b63c4b42a1724debb487e2b4ce3782829949daf3f99162e99f49a5af43c829aa94ce74467f96412622bf7e55553f7f4eb3ce4c649bc691b39e698de6dc9499b22de7b4d69ad6232765ad75aa330f5dcad9e785ad46fe5951a4b1e4997e91d38ce6d742f4c6e5f4754bfbdd952d405f8600f2ef60a3d14ccb692dff64348bd6b6e12c0f693add3a77ab81a6385eda43e2658da3d974ce39d7722e66ad814069f9a653142ccfd0ce9c515dbef9e86cab65bd43c7d047a851fae8e7a04cd33affa42a9aea175aeb4ccb6932df92b2cf4ce7590612c2d055359f9bce475baea63302d99633aa739aa9f291266a233467ad7d742dcde80ccd5998d1ac946f39977376ca31340ead655b9a75cec59c692d348b9cea3c4b3331464651ad539d66a2d6b948e3f22ddb529d732ee6238daba139b5a53967e1ce2e70dc9cd01cb38ce65b4e5de4dbade88304468c5c409ab5a6e91acfea10cf872a679d75ce59f7b56f7e1208f21d2e267e73ad47c04142a78e124764103182110f86f822327e78221ee0c089ac6f7e6b4db381169d174b6b55e04e169d35c6100f7e3baee8c47822081d231e918e0b26e20a344648e727492803978374b29e60571907c1bde77543e489b1340418bdd4f5e5cdd1858723c75eb283d4b573489b68c5772120c977cda8fc4e9dfca37f44e9ffaffedf8157d5356b5f5923675f64eb3a55b5cb2f8f6b77325528bf8b2c3f6e3176e5f0723d60c90bc32f0ffd80cb97612b531fe14df1789c87420fea69f376462467cf9cc04bbaedd57a954397db2cad2a20553e8c40aab28c46a40e483a8f5eba291d9fe23917f4c9b81d6fd7c26f4345ed1b4a2e5feee20eafcd343678368e3b6a27e121493a8f2cfc7fd8ab3f77feff8692586f32b9316e7749e7510692b3bebe4c32319d6e92b3c8e34a1c0a83c05f93afc73be3e57f17d59f263f5fea0f92df45dc2ef6245fee8debea5eca16debb27f9b22be65ec8be32a16440417dfa3f466a8eec7fc72df7ea373335fe6f5f725dffcf9d70e7f1724dc6f08e7d993cedf44feceda80dc34e248e5d8c572271481412834420f1476c22fa883d228f481c0e87c26170081cfe864d43dfb037e40d89c2a150280c0a81c29fb049e813f6843c2131380c0a83c12030f80b36057dc15e90172402874021300804027fc026a00fd803f280c4dff027fc057fc0dfefd7f4f3fd7a3fde8fd8346c1236059b804dbfa6a6265f53af89d744f40d7d425fd007f4fd7c4d3e9fafe7e3f988bd614fd80bf680bd5fafa9e7ebf57abc1e9137e40979411e90f7e335f17cbc1e8fc70be351e1c0c4f08ee974993a33c9e11739fb7f322a0e4cc5696db1e356baedeecee3de71cbbd3a47ba2b18ebfebf91576f487c87dfe37aeb2ae0653cd2ff0fff751c1bffe86b31b63331bceb4ea6d1f68bf1ff47ff6ff445ff5ff53f23e2fb9f5171e77205db5d303cd5b5dd75bbefeebaa1d45ce125aeb358ec4b67cc87746d962f972f5c10fdd013f0ff2b5ed5bbff3ff26a2d556b4afedfc5abb5e3ff2ec6aceb7c8f3bf9eeee7cf7db8dbd5d36e30df5b46378c7ebed7aba9877b1a0fff1e9ce576cb5a2b1fb3f93f1f9cf2ffc7f02afce8ef8675f24677b3be08ea71b02e3d7572dfe73116eb298ff57f2ea8ceaffcaff235f4de32c8f6b87df266fd7d3b1cc36361e7dfc6b5d1eb166fca74aff9fe4d554ebd82e9b76be5d50a7135b6178654af6783c606f3d1e7d3e56d84b06756fbb8b795f61e44e0cee71abe430d3ab8457e48e8981d6b9648a611e6f31a9f03900e805fffff36acae2ff875e45cbfe9fe5cb764dee9877b1e3dec977dd62f0cbe4cc18defd3fd0bf9ee0ff99afa2fa6378d799c9feba9b6dd9cd5c39dce3ad745bb125cc59d7b9b957df2ef75ab2e11786f976d7cd721776760e071944e577818522a1830a3c3f8880650977b804ab4601a4fc9f32a1634a218142c6ced8ff171081132f0c55a8d0904a3f6bfe7f7f7586998fe19d0bf3ded72613dce32448704b37704a4a0e6c07704b38267b17f7d266b2f7defbff77ffaffbffa5bffabffd83bd2aa388f55d268d622dcbc474ba50517bed4bcef24f51fdf91f0f5252dd13c4eda6bdba13503702eacea1eefd5d3bf9ee1b5b696fceb6b1dbeeb8ddbddd4e62f00aaf5ec8bdb6bb8b1d91f4202d8184848a04c47f5757bb8c6f6ca8a7adb459976fa8a7edb64a7e4cb2dbed90c03dde511be65efde5fdf6d38e7bab6c5f37c7afc690f2ffcaf6882beebe6e967f215b776dc6481677bb3641feb51d5d00bdd441dde4a4c5869f4141e73fcb95e707f1d8f139822eff36d47ff488ff67ff1ff7ff598820b21c324a2cbb96b9a1c4996f6c8cdbdd0da5a33336b2fc0bc9bd90bb1df90767e6462fb89f9e764f693fe51861ccb229e69fb7a376ec745be68e0dc3db51bbbb2b73c70efd3b791586ed6378e78c5b58c924a6e47d857b6c95062571458d8b66ce121f7ca05070f002882a670a0023cc13fa439c26a20db8445941ea87be2045c98549898fb2294b68086a64d4d981920942978456f0f461801206447803c5086d9251da3e1c9df0dc60816e19a16ec9e30197dc0639d4698beaa50824a8f46ee414dd7090eca85f8a3c59224369158c916227851d5c8af0e8245800b3b212c18b0f55090d27cf96067cf022828fa73a3a05303ee090c5558013aec8d15b88e882821c2c48bc621c3d96a5c5912798c8c89ad34627db6c375b72e00a0b618db69a80ec0922276648119146f75490a3264b0b0917dc9cd12da260a30506214b075c643259085b62f801418c42c34ba623c48f0e5ad0a08bb1005cf20c19e038c35505962e2758c964680066c940c39524505172950890445005c91619627892979cd1aae38158102e963490b99cb8853139e3c017949e797cc00441032d76960459661b3f6426d8a2a6050760f34f9503daa52f308c30c2f54eac497244058f058eb4687d0f4e66b049291ac381f86f810421f8300a0d65c0f8f80f96407ed08bb3268f8da79fa0032c1b3588b4cc98fa3d5307020cbd8c41e2e9b5f459531ef0b9617200ae66d20f5fc0e286490db5a113fe638ce920864d61e5f6e41f2d1396840c648e9f2b3be2883821a89f96b9e1b283acec041c54203242c40bbe84a74c832869dadc5e2113b451a2ec813445d8d82a424549d42943ea910005279cbc0d4072caaac4242569d0c655728853b6abc3a5aec191c389d6a68c85063a88600387090464d6eca1e20612686cf15e2f85347be65060bb33859aa0a1af337bd604c04713832960b6bc21b327cc14618c6f26e80e58f1b267ca97392d74b042112b4ce1b2a7cfa1624952f3c6032d58d973e4ca15942854d0d4d88ab247470d69caba7e30f0b29eeca121c1d1385b3610a48206f6e05040a10c183165cf15ba1e3b4f103105064208a0891a4b3d3a80302669e4c7f84314ac1e344090592639700ce109979e2e187c75e086051a355cd1d2034586207cd828cae10634567abe9ed010670e01d8e870f2a147880943651e1c4013a43ce901daf9e1b210e12053c44f0f8c2e11bcb9018b1a2c7896f43c0f1dca00683429ce904466800bae1ce01d5265c132221b400caa95e001798808599095d0e46985589214dc14c9915d19a14d15951d6159ccb2948cc901b8cc58520013150c808c6cdd60013253ca7ca901053c643f7240804ba9b7a5c58912644b16c0412a730104644f75c8845c2042c58ed4d70e393979a2285b5202990b69e460c5c923674c730fd10c5ad8d8f0ffbfa74d1e180c50f406852a9a9a83aeffffe4d5213686771d7ee3e57265c64c2c8757af98a9c36fcc64f5ea50d0c39c85dfbd5cfbdbf7bac5961dc961f845eefeba3be62f8b749dc9edbe710baf4de68bdc2c675bb0176eea601e3bb9fb5e756df76d7b13ebef3cbbbec6acbdde937e0a95bfd625b333a15cfba03c6b9181b2cd970a1fb592c6a8699b8d86ce9e48ef5ebff6c908a43af2d79c668fa2b90fa2e5cf44e86cf6d33efa73cea8a6cab99675ce288d019d75aee9164372a6e5daebfcb343358da684db39d53abd20a7292e43a1f3ed67992ba073d6b62d0d43674d4b754e42678d4026ca19d5b62d0d94339aa239eb9c693af798a135a0211b9a37c83ad3528d1ab34e039b2bdd15fe094261a02e3c530b9ea9150dc7ce3528c6d42fcfd92c57abf1c358ea412f25ca791943a3e0995add5ae08c5c3879de12488fa0317c3a2d67fb611bd270a8d350104fdb0a4f165c633721ca8113373acf993a56b4c333d767b8f0bcb900d235a719d3ccca04433e2db43449a33c836404c94075424c361742654d66396cc359141a843ed9f03c7b4c341c8dcc13f5a115a54b3e3d34a7b97409f76396a39600ad8886a329906391637173716b514b00d5d384568492d06446c393860229731b691ca5c55c104d28cda80eed910ac911d174ad480d46ed6a360494693ee82ccda128aad11a6a436f38a314ad6dd5560409c109d568b58cd6d25fca9466db0bd468cc86341bf304223326444b61d87c3449e7349961dc5fb6c7081f7ac0014e0d34389559542e98e2a1034af8ba769860b2a106d96a488e605d95b9894380376e90a6f0b260d9f15ae6f0f06606352a9811816957e38ab34f8961289ab82347873832a000c1034ab88e18c1ba02f2032906518b342c1c606684071c301e19bd2e12d01c2116603ecbf64811051712a216423cccc00606352aa450c2142900302a49a008d655d51b376c6e68210b15103fbc994106352e7cf1520114274ddce14107352ea431e1c993b35553423f778aa833a70619584073260c150b386b54c285a448d59453f186d0cf1b37356cb085ca13ce2a0952f563cae98ba8f3c68d0d6c584073a6843055a43c4912a40acaa9284cbfac883a42d850031b1958405342982a54a458f0840863122e1d4c3bb23c5606040105617441940a8c14e17d6041056261656e65e81ead67964757611b938ad1615211b24ff7525edef9e8d01ce86e81a48d328c5a11fa22bb4889728b1b012b56a06a1a9403527f8a722f7c8c7042b79a8d56d334da6c86e6a73da9e259bbd18c6ac3190e3dca698d45e974c9a644c3d986692e28a7399a315d82fea042690f4eb43c6940ba764b977e8e86233c7144726cba0434a67f30665b69a63dc5f084b2f221e444a7b8d4ea8614cf21c6729a6387270e386379561442da31a6d32254d7cc32a266397478d26848429e0c05f18082021993e0f9e25624c722c782811f434d5b8c8be2f9d46f40acce8cd1aa78764d516b37f467f6950220ca982d05a21de5a0a631233ec0ddd8e1896d0a2c40da67b643a8464c0de048d83c8b248c113053c2fdc0d5a071a5386ac4266c222806400b9026b32d53702d54de931fa415056b9e3ecee416273fbea0bc75843ad55e04c77035220d670342855540d023dc0f1a0e68460a4f5cadea27cb460563ea07ee4695cb629f02f0244a978c58d070b422013f349ccfd40c255f9e381b558ce391b625e03343d559a62140c3cd9c6838a278f8386f366c54345cedc58f8f5b527a7523626154a3a8050edb92105587c0796adb115a8386b3ed6a4d3f4dc22a21b55c5a2b9a15d1e02d97dad83b6ab71a2e659a19900e77e4190c54c6ac05ef6643a2c4292717365c8b9b702cf743af7c7e36a534294da28979e2004a7dcc72cc62dc9252a3a01e7ad4e4b963ca6812d5a5e88cc90c25180811c4eb9a1901ce0b249811e38502081c088bbf921cd9a584eb8811225b5942ac825015874d4a356814b053363294d951c2081d51346614bda875b9a18d085f1098d2513c1acaf9d0d6a44153068c085e40f0a0cb065b4a3698765bb468659591e1391eb1c3841ae32b54654a9b8c72c2d5c050b94078f3a18730608ac420110b1f9cad6604438514b87618009b3502802185291644a180b3585741aa7e4c157fbd1b2b84807e520ea40040821543005b30338218088a1011065db0487180f3049128a8e0ad462b210234267c7005830a9874c0010753b0aea29c6ce4729eb40a3d457a6733a18f488dd0746643e41f340f7a879b0eb9381a07fd46a7d125a066f457aa404eca48b6a399d1cf0b4da487320b2302662bb450565320ed33c3e99bcda66bb5994e339a738effc77d916aa3ebdd166eaa36ac76f1ff89afdab025df0dbff1babd7abb64c39c75db95c9e1cdbdfae67d5d3a91cb15a9d6a8f3ff2fcc19d862c7cdd916ac65f7db776f3279ef2b5050b6cac92745fef392cff04f4e8c81ac3f4f0c4cc2963c58d2d07d952bccceb2a430cab1e3068fbb849ca79c19a4d84aa3e404a7c20e519badf805649916d0138f1c8e1c0d0593cab0499250c384055c1d32e821e84d10b7f9258410362b869824e8c1870e601772900049965d03f95f5f21815403fdd204c18b343790f0c39a548e2d873750285140afc3143434d483ced1e0b60bb01667be59dc7dafb49052711b739703d91de9847b7c547a2948483d48dd34037575f1c09d70d7a44372f645ea7ebac0a019cd596b5cb6659d75d619d5596734a37966b3cd1efd5448d32fdbeeec9cf9c6ab52c704e337945e983300256363d5c162afeebcb1d472b9f6e84d270cf3ee56b17cc9baab97bbc5f20ebfcda633abbf571ce9be5761eb0130f7ea5862bdc99cea2184759d3fe21548e771328995c4ea4e2ccebebd65b6561db9c2dd75df366e97cbb74793731fefabb55cae3d58ce7d70a5bb0e69329d41dc2ad6ddfa42ae3d8b6d91ad336b08cb9bcdb767c12f0c178b1c7e9146261877df785df134fedfc78a2c66dbe50a96c3caea67c00b063c692d797b84a941da04e1620602079afc27a952a26a4d9590a1330aeef15e42b67dedb18da7256f0fcebec826d672edeb8fde864d759883f121bd0d9b6ac3a658ce914867566fc3a6a89e40e49cf9ff134c28e1ff49f87f3365c68411e1ffbffc7f08ffefe5ff41f8ff0ffedf83ffefc2c1ff6ff0ff5cfe7fcbff6bf97f0dfe3fcbff63c9e0ffadfc3f06ff5fe5ffa9fcff05ff3fe5ffa5fcbf05ff1fe5ff2bf87f0afe1f00ff3fc1ff4bf0ff11fc3ff96ff2ff63ffff7ca081ff67f22fb6c4f9fffd1ffeff059affaff5effe2fbffe5f81ff6fffdfeb3ff9ff1c79fceffa7fe37f927f24ff7fe4dfc813f9ffadffacff1ff2ff08fcbf90ffc73ac080ff0ff25462fec1fcfffa6a0f23ff71cb74e271c41772ed318f15fe39036decdc6feff18a54f2ee56fd78e5ab3c781fc33ba6e50ac67bbf1d4fc7e117a9638271962fb09d6298837177f776c74eafbe978c481d502c0681bead38e6cb1db7bba9f9fe3f90ffcfaad40b0ff3e6bb916de74cafdec22bd6ffe73fbe2ae5c3d7dbf1743a0ed6f696d9c2cd1d6bd8ece0f1feb5111d5c6278c7fbaa6cc156771644779d2f7243197b922f8decf245efa476523335a61eb31b0a0a09c7276833bdad4b2e79bca1a076f752b6dc6bc7952c4f40abaa879410a91efb6987b1ed02ff0fe555a8342f06779733355726ffffe7ab504b2e13e7703f32c57cb97c912e5f26193e35e0748493d22b5ebd8ac59837c5baf117a42ac6290a51becb6251f95a11d33c716908e68751921e0275a8c6f06ed976e7ac89a0123308ad089faad0b8a19ef62e7629ddb66bf7786dba2b32867741ae5ca5b7ddd5ab6f987b295baf1db7f903e09a18def99a4b18b8d544c40be6eccaa97e547c4498bc57f5b8b592ea2b877b2c976b8f62511f69a3376e965f3908f43511c33bde0ed8dbf1744c2787b957e7f9a5a48270a22821801aa72e54660c206704347b46f0e9f8ed78bd1d4f07f364d279d47d21dfe5510cb92ab955d8ca8c57a511e64d23e749a3586fe1b7859bc6b095b97cdfa3586fe1b5691433b2ecdbe3d64aaac7edd218c71c895cb338ececabab6c63b635baedea85eccea6db4a71640b378df1aa8cc5f897912b57f8edb1540cb3556230077b917c8816181108ecf19a883e2155536b5f7d0c19028342aaa6864ecebe4863ecec6b8fa394af95f25dc6abd2c8f2d8b9f6958d0a027d544f484e2446b6cdb7c731875976fd05a938d27dddb09619f32ec663857b18ff059d4de6da63ce6c3bcb63a7315e95bd65b64b63bc2a617e643add20d0b725d6974e649b4cb6ac3156becbde6c3992c3f11abb2bdcfbfbc246ded71ef3823d2a31786d916d92bbfc18c39cc97c83401f9557bc7a19bbcbe1b5593b81c90afcf6356682796f9bd04c4d30df7779f4ea9cf9be4b1e49a68e5465190fc0c2b2e2b19d864e2426b8ca368ebdfa2a2427fdbff1d5dd8e8fe11dbb6c9dc7e0aed7dbf9746fd26d757cb922e3dd8c5dee5997f775c71d5e7bac538275b94e055d08ffbfbdbad2e5cb9d7c3787dfe40ee3acdbee0eaf3d0e839ca8c2a29e334c19620c2623229224491a03a20a1086e430904425a576a10312c0a0899e8610330421420821841042444444444402894448a374d40d09503326aed86381a6de17a28be39cc806a05e08eaea70d1f1a9113556dfac525e6689c0a0f7354a8ec1d792286c12c37d16f71ca9040f141adec6d06c03e89c2180c857da8a846e278b39f0b411cc46ed916d958040f70eb6e996f61a480d6e661238630e00b78ecbd80e82a7456226b069ce40d869e1a9c53c9b33029c35014f4b99ed3421b09ed394810730dd62757bf2c88018c68784d8db906d975d4b3b609bdeb364d6eb77f009a5059789dff0998d303bc4b6921e94e741717f464672f5a8c1ffe689918431537a3e68a96d84d88564a69132d560e08017dd48307801ec8b873ba25d6c2c27f028ad322efeb8dfe938e3c8471c0eb53e702270c86c9bc82932d972d235af10ef132f1e87938fdb083963e52a14b7707ea0b6dff98869df98a87160a96c4303bf8e08ed5efaba0f6d203667bf0cc2de019e42f664f3f371f7be10c21c227ac5f385a8334f45b417240b99f3e0fac8dfdc481043788b454610fdbe407f3a34de01c0d0f3c421ee01dc23e9bb9b611c216fd414949edb0c4e88774c43cffb7dcc87f882c02c2b70cbdcc11751c1c466a733781d21be460b690edf5d0305adbb7e05481adbbd09e5e7a333779f44f1d921ee803a1fc19bdf323bce5f71019de338883a08bf28b5fac8fb84d4a7cd9e58778187a60db7f0b0dea5dfe18340fabc9be4b2fbbf6f00fb15f155693f8b41fae3cd49c70195318a9455c312da95852db3cacd6dc0a517ae838a25bb2f734fbcfe53b790cf428e61c760545403d836add97c8a42370bfd362f15e8861ebc1f6f0def6652c6d8003eeec2262b20f296e936daad04c8491f1b51f5571362744cc32068dc4d232c2f69e94ee3a2a79145bed26f3b8eabfd44cdecf5d9457c3062d6e2039831e8b55e31e8cd954dec91f25ad167fe1b08c9964a88e9d54390d3bacd2324da3d13bca4e64d56bd3d8abe6125c99f34be0e5d877d2000dd2e032228a46f27992777572a762777ecdfd64ebdec3a6014430ced03e8575dedc77c21afde73a19cd320eb01aa18c65487e058b76a963c747244340fe5d9d11c393dfb58f535efc54a2fe1a68d2486f07e1fb2fd2bef2731027460e64a669abc8dcb44fdba454ae23427a165b9c23fca8f3d8319c0af887157469e26fef06674e310d00a6054b4d9874532939514a88fad77865acb46f29f121b5871ec89596106a3534cacc1e1421799bbc0bcdf8f6d73f24019475b216c95653f6eb06f17b20c6d9b24c8a68cd82aece95161c1f48b97d7f8ff29d1e0fa5e8e62d83d611d455d3e8135932d2b4bdba3681681c2f96d1436b8f7e721c0b1fdd90afee19e95a74e6316e4f06bce4bc4b35c906daf07569e1f99e50fdfeaeda81374c82b03ff0f3d0d8b7ab908dba5075af50a31d35c982d716ee3075a58348fb8d876cfa2aa80d9e8f27838429a46f81d9e5e8bf4f1a09e06896b16de1592567b4ff5a79d28b74f523375dca0bdd93a7c18e28e19a367991063da77a366f0b0e5a81ad689ce2d379bfdce3824602d42ee8332d762cb0183ee75ecbccd22543e187baf71a8015358c1d798c81ef5c2d89dd87acc0228b3408bc8bea298e0dbf03f310aee50ccf7e0535331ebd3663256823075e40e7712cf1c2a5583960fa6f8e6633966d072a0b8d63b6da294611e7a5ac0a2abeec18decccf518a179198ee36ce77d21c1a2f4e310b24f83a3ba2a98114eea76ea6663e5e8499033509817f85e548da19e4f60c73e6f3346f25179653a6726397f36e4dae2f06620d58c1057d409b6ccc1f71349467f34e7ee81151dddd85d59a0a7775fec8b20d80d487d9081e56acb1e2473d65d803fbf47d7e4ead30d7e082868661b87b0579718f3980e4785bbdc63c2ae2796f14c7e99dbc084382acba1e87088db5fe4bed6ab230989e6281089240c851bf07a2b58b967596eef07f2959dc63ed73a27f13017fc471f1e1f63ebd48559f49e8d4cbd4da56e6c6585cdc2601a4e5f94baacdd8cfab0f727ff5d4ff95b8e5f89b845106f797215fbed12891e3bb093a92be57ba8fb6f512762757f7189fb5fca65fe41e9de524ee6e7f1f31f1292e39f52d29faff0d2bffd969eb5d5043da93736fa9c7124012071b159986c0c3438d71ae0c7e1b092519cd80464123f19cb8ecd62678c4f3b967e70a59e6b75d4f501bc8c15a6ef4616fcdf4375abbe129e4b9cb5f7f54bf1b3f6ba7c28bf17deab2ff5d7ca733957d78ce1c7b0c33d54f4be2b1038fc2933ca6d2144d9df8d44dbbc5cea2ce4448bc2323b1cfcc63518f74ee2852df5c55001fcc2b42aa2ddc33627b688a69a34a0da64746867fcac57af61decf744cb231b2388e6b623e8a764b46be27e258e849d091994cedb2c548b841616d94968fff30812a7fb699b31ceeeed34106212effefa4cdf009b47217b7db9228fb4fcf077c44d862fb0215f38849e7ed87c9e91465fdc244ffcb5afffe843c9c8190c3a6249c3129f337eda2f93ce0561f5ed6fc55538db04499dd87093699e91537b6625d903653f6acd20bd7d6b50282602ae34548b80d3230e987e75cdca5a78625534d36de8b8deebb92bfbe31b965d261766f735fbfdb86d44ba45d8acdfb0ecfc58cea6d364964a7f714ac1eec49e4c8e3142a88d6a7e7f382d326a469de3ad10ec0e7cf9c0502835d49cefaec9fc9055583d31270130779008338779c3dafac740b4aa7ddbde3c4b6bcdcfbd29fe730f2ee637434430805f95865b051ef20453cb330fa5c61f9bce3fe98536aa09f87153e82cb4f4212b4f872feb481df0df179a26e2d1f143bc3951e01128c8109c24c6699126a69abc414d5371d3f8657cfd83b7dd919ef8f25b330606c9f58f79d7485481b079c1624a600eab408284c201e1675afb8440a68386ca7ed8c0b7880ada94e46368fa9747634348e38ccd90cf336da2d95796fb923db129b765380899f07e5b76e244d14e2577cdfc8d6d644bb37fcd8f69e42dda9bfa52f0286029702a7aae25edfde3832f9c8f4246254beaa9a79eb11d537aaa875448cdab1afb3e9b65bef73bdbb2fed9f3a53e3ef406797467feba013eede4af25beae029a7ea472fdee455d1f4681c716aeafc3fd96c35caefa473f955e045f37977ba73c08b1a15012f4a9a1a9b79033ff7faea8c64b3b528bf13f0a23b4e8ad1ed434be99da5fde7799dd21d5e0ae674df125f23e73d725e34a74d65f03aa54dfa9b6402a044712fff975fffd37f5622b5898ea3c6ef4bf7383e89ef79893c6a6ebce69ebe3dbc8aea143575b7231494ddd7daf2d32320ecbce3982b22a6685c67d7795faf976ed5afb2661b9211d15eb5a1f2856c44ba21a118516db723837ca50eda69797d67aabef45ed3d73679a9072e972bc8fe1368dfcf3cbbd326ebd2f6bc3c6c46a5e72e5ffb4cc6f37f7fe63096e344eca4b3cb546feef7fd9959cde586642e9a0b16c44b4f348edf59a89f0fca7e4faff6edebecd62b6a4b7ced69e657816fb5697550f07d28ea4407afd3ff2ea78357d5fa9e473d725f559b485adf9364127556f9d870c749e59fbaab4d249c9a1aff067eeeee5bdefd68eed19b775fa646623298d09509bd6c46d395b25a6d469225aca4e94a211929f4303256dbc16a351aa99311913b5a59236d978cd1663298add4d56c361b10f664ce1328252613cc13206b644b13f591e60ae565fa0090a5670587d8f3917bf29e6a0e9b2ff27f349ef0b77e9ccbbfcd1c9ae65d8e7c55bfc8ffbddc7512d8c1d9317d9bbf95628e342ac2a169dec966abce0b27d59c537701473d447670ad0c5a463b437a8a440c7e8c3e4431db6d0849ad140ad286b330b2ac383187017921b9cca021d0193917ecb0e0f6034588d59b2062054b1448a9f1f109701248b10122da261158a501c1ed8129390e1035301c8301242f3f7c819ba5c04f0243371028a5f07123d3c3878a876865c78e28c5dd5dca013b560c10a90af02143c04d8a014a37863a7eb26e8f7be1411a632800919c00a6def03086a8c20325b23073fb320255152c77e74c602e4909169317486086f4d4fc45e5678b4f500437069848608df78829a1468b984e2171a25810110cdc1733371fd2034698392d347ee850b143678b0274c2d0f9a2021d1f7650210b093b54a7d4d1e98820b567a2d42d08a7f8a398dafaf0da2361e29435ffc329c9640ad3cf2ca70841c10a05209ad699d60f5ed5b39ab3464b471961bcd0ca228b05b5809c8a1089c232dc1dc85ada9c81843dd7d9659eaab9cf157db560e584264eb86ab9039d6033a18c09554ce001802c618bce2e2a62090ee856fd24c5402441e8eee636cbf2be3636579eb9b1c9337541e88a4938cd8c20868b23a0b1f979f99ef6da745b1f36734f9b3989bb47e1ee50b8fb13664469c3dd81e8244d4a8e1ce5909a941c79ca29e538c01d1d2571902bf19a668b8bb96041be4b92ef13f2b4844229421d4277a1d075840e80d0ad087d8515dc75788fbbfb15a1f708855284c21584ee42e115210a37178365581e36b179374e496b736a7f768a6d4e6df9414098eded5427c45e31c844904d10cb89c54088c5ff51fb7541302988c129c1d3ee6b81ec987f9317f83d6bf2b0a9b5895a6d5aa0b9fbac5a208cc8e646b105dcfdf5034ce2ee326bc10536667f9f5f97f975d0a9a266bac34b5fdecc53956c7d99cc6de2a528e679b1a994140c51d6621cac162ba203520e5df64a3e3049cce1b4daec6dbb4b2dbae2b75050f67b4936fe5f1216ab313b49265a01f5f6455f55701033c4c1c790584dea063637ec21bd6afc1aa7a490d0e8e50ba0e8858d97ddaacdc65567e6adcdf2ec022708514bece22476b1390f37505d605d7a441bcab8fb8eb7aa70772adcbd4d979fe75dad1f95fdc6711c73b3d9a8b34bf34c14a7ffd2417acde97e69dd3df1e7d797296937fedfdb40b3c9626b0d581ee9f5fd4ce2a56c226dfce8d6eb9312a779f754ba790393ce13476ad3c8bfd2386a5d4ed5ad295cd6a469a6995c98b8d8763ea90a4aac6ac27575f6f57ac9d7d96bd134efacce1ed100878610bc45a4a5d46a02e22d8b84810410980189aa8dceae29a88aa816d852b5a5ca961d19dc509101eaa352559401e640f47aae658ada347f94d772a505a6850018541f316cbf12b34386d898adc03a818170f72d5da8f3e03ba8f901cc171d74765d512282849b65a992c50cabb32bb8718a6611d517aabc504e713155668a26c45d100cab8488439fbd337bfab5b1f9ebcfdc97f7d885ed429116d6a430668e561c3b6ff4b421b2f1638e8f1a31346e662029a3242328c6108c3072b2ba8813c7b70092051216e69ba11567a890d366c714b728a03c61d5c41b2644364b4b4829a126cb91c06149a5616384584493335643a461e656660a083964887e18f6308618a41dbc84f12f37872cab9f1b865ddcb0a1e42245d56d0632543e3250691161b09265674acad05b90c2c2ce0a56ae8855a8a8f8a44046ea86821452ca13dc306158c2cf0859516ed0a3bcfc90f6187a98895439e914be9d69f8ac9e3431451e9b9dd4e34ad7a9b952504b39d1c99b10ac4080f2c1adc90e2672969c51324c627680f40404c991384d5946c2300d39086e502e2129a2414cc927e9079218e7fb90e009434d4f3683c99cd02c06b4da0a02169a9a90ac4811ac162ba283b08b0bbc26245332c4c8daac059676040c9ec3ea0103c28e6043c8c523989464107c496bb112f2cbf4e8ca11489395c68334b834d6dd4923b8c8966cfc268971b1251b3f1abceaebfbe73fa181d342b3e40d101a2245ccf10dc162efbb5bdb22c4f8f0fb96eafac6875804540c787dc3130516182d168748c48d8ad02c86c6182733a2969c33bd333edcbde5de3a73856ca38e783514af80cec38d9b2bf5cae9aa886d0b77d7c2dddb8857a5bb07dfe7daf879771c61f9cf34d5e1d43c577425495c12ba96f8f3effe89cce90e27c9662b398ee30853f33bad4743f4f02727fd66d4379961c2af5ae29b796660a2197757f9e8aa3f0b31854bddf8735e8fb6369970fb754e14028bbbcab7f85f67f5edd9fddaf6f67a6dd43709c1530618441041341144d11a4342584058e95021241b1a4520162843460e3260bce54667976c8836ea544db30a868ce83cc48662a33846288ee9390f375563a0c60c893f7011e60a777f33c603a711d562679aeacacfa60a4c2aff77a6fa9ff0ab47cadfea2f45ffa92cef383e892fceff4b792ace8736d906df6749f3d4ad4e494c11070d5196e4b7850838739ce1040f56784913b47ce0a99a12a5cc97d466a9837b50ca8ff19a7f2fab91311d91ee25b3c966e5104c6828b69bd16a345d507e73e334efaedd699a2d4eed36513425c558b99802dc9d565b3f8aa9d19f912fd3236ff98eef781c3a840870f640894f3c0e058fcb2e981e557868250fac019234592c28dfa117a6cd97395faebb1bd9d622f297e4dc36819f6e34cd3b518735ee7a1b3ccf75b76aab6f8517a85395823ec614333322224992a431f31560505828100bc6d23851d61d13804087d2677418863134871063083184080841841042044324101112f401133d8a33759968a7bf6e701ccabc2a1d3114394d2eb3845dbe71c2ebd1794eaf80ca929fc9b7194779ae13cc8df721e88e91b1b89bcf8da4059e1f831eb3ba5512c227522c8dfaf2889815537e4d55062ef020d1c91932c7271e064f61ccf2c52ef6bcd7ca53acb62068a114016b156884427ad31e4fb709a2a8196a425d741297d63b344e1e8dfdb1a16d67e5b42536dcd3f6a1de148889a0a1b3813ab617e7d8fb9fe4e7e4b190e53c72e7e57cd7e3cacf0f908d537c4eea9293af51a0bdee569f4a7900e368162f482851802c0821df687927c84de9521faefc6fdedbf7eaf8ce17d7a46ebbe1833cf6a21134bcda977ce511ccd8e84ca46d201645b55b4ae62379e0a63dfc723aab113b89c61acdefefa098ed003915ecee9ccd1832670e13d378ed3b087abd4d45aeed26b5275756fc2cb8730f571078cd9d4231fc1019a22c862c8fa682e81e407257d1ea12d6a03ab59e56491a6c78f972cc92659ff1690fe5a6335391b9eebb78bd165a18deb330469763f1b1503c9558e8e65888d2ecc8b75a2d16616ecccb8f50b8d4374db4c50276c9e4ab4daf7030e9bf75802fa9cf90e3633b5127c117c8f2b744af9f2595e46c9f81e4441a7c5df82f6ea218be1aafa3646c8cb36f8b2b8fd35daeedd69db0f6922ec70f57c3e4417075a4fffa2ce851d087bdf76b47ff160b0b92c9717130cb29f726789b4a17dfda33df1f3740ea46ebebb1c537508ee5f73fd270d5ce0a5d1db5d8440866403515c9008d6c4cb260c0652a06a22e0fde04fa920c863daeefc95771e460c69eeef5c8bae3d4698d7be8ee9b6f7dbc81e6bde37a2b52e52f505893d75b96aa2fc9af7fe3ec60abd9420d9d4dda5d4dee5328094c469d2ca883d75993322d1a1bfee4afafd9d831aa47e98b6c30f16835f8058e34d2eff0b2c5211a907953bcbe34450184b989d1bd3f296ae53f80797703e2fe6051bac88959ad89d884cddf170175caae32cfda92e17f05f444ce33bacdc278d91b78f52e9c07f8bb7096e7f7d6bc0b8e885cc2b77d4f055f7e2dcc4c99f7ddfe78e186e7bbf7b9f9d7931d555d11a806ecea0bb273a1dd0ddaac5ccb638cc4e13c106b453e7f3c910b0e5cbcff51cf49ebbae9de7a34661363be5ef28b4ff72c86fa635cafbf353bbcbf317ad57854c08a4496b6e0586dcce3902660fd684025fccd125d63e3eb01b1c394f73d069dfbdf628487201a7e22f65a2214df31d4e391b0dbf6a82b9419dda4b2a30c322a38c8178978140ba645f7cd2863194623e2cdd3eb55ddf62752fa81998ae8afc603665c9b2ee85991f60e6387d4d0f86ef3360cec4f7af75de3b442cba34531dbf72e37189c5cc02457be594a3693e76e1e0bfced1d8f278309451020b5483c5a5acc964d9ea29138c5926cf61b88c6b046606f1099ebd674cf794dd5f913c83dc5cd7d0478cfa1230ea68f98432e3471a365ec420e8b02f79b5dbc06b229ecc11630ac0d242187b59a0f166691de5a8a732d040c8ea184067f39edd3b9ad492409debaf65a19240a57963d7aecea404210dd8c54b776d7d38179f46d4583e7b8f2c684a60994cf873f82f1ec8b18cad1ddc1d189b5781ad71de2cd9df0136046869e7dd8496f96b3cef4a74fd5177db210edfdfd56bce17374e66bc1d63f751e2ca791dfe02eda49d8fb8cdb7734b8e733eafbf2fa69ade53e92e613f727f3b74ff959c1eadf1fddfba69ef962759369b5403d507582be86a2630d07cd55861d8836392586fcc4da8d6c70c91bf2acea67bfd1c5843997a49a91c3f5deb236a24dcf8e2cd21c1da2f25bff6c39f3f15eeefe73c25eb23413f28cb2c9bb7b997526ff2c3d68d2c6c6dec97fc035f6e03dddcff5bdaf221edef686626309fdfd5c7627a01708df9defe5cbdfbbeed68b9cdb6f6690df5ed8c3353969dbccc43c2f4d84608278f1c1a1c9f4612e1639cd25f41700540862417aa5c04fd1c78b914db709de390e66b54613f8d73a11f09b5ca4a3cf23a18d6e19bc337c64720da3f1cb7510ec2bba20774f4b82d96d5178637e44e50a5ed19b6be0686774c06f1b9700ffbde3758b2ed2b1fb1793fc3a9052d1d85734ab35de801d3385027e7bd60106375243f979b60731e73b1240eb355fac14afa705d8cb4c170ed0cbb46126d003eb7948b8eb1c7e0bc94b4ecf050017bfc16f9c4cc2d33bd71eb5e5705709aed39d4500eec2b56ba2ab2e1bef2ffd1f641e27584d7baf52178331939705bf420a61d57f4b593a70edd7324f98c26270052266918751d97958ef3b38bc0277c5b89ab95e2db42528ebbf0941f136b3c2c054783a7de273da737216e31ff60173743cf3d531dbfa3b6e1ec6b3be5963d25c7ba173a5518675e4e32cf6d8bbbe142318d98182d7a513c8deedd885ead7677f79ab707dcfb5da1f710033c279fb372e385fdc1c0fa6e538d9ff0c70c07f7efe3eb0eff4a5ab1b12f7f9328ca181061fbc2bea3510196ff84e1ac65c9c08fd8966ad70e4f2f9ea3feeec7c3630be6f6481a3cc3abc463f43f20a01f27717d8de1fdd97a7fc293fe6d9d41982546f06cf759e011f2a7b6aea3989c0e16efcdfa3f0d81ba27cf61dd81abf35b74be76dfdcb7a819b6f61bf221dc62630ef876a78d6f77b15eaf37f4e92e1d3576181c172841ca8818eefdb8bac4f8704ee6ef7e468cf42d1d8b40988aaf433809ec3b8b7bcb192f178a9487c9b4967aeb6ee9122a1bc486a148759a0987c9d17cee762c66c172700d06181c88014f22fdaf0e1b3c1954b7f83f599864990161bdd02048836c767cb81f4ab9d4a5413eb0264ce2ec8495f80d01fc5b6efe9a184fb7920ed990d65add817be56d907d484d1690f834fdcafaedf28ab71d796d7e64126cabc1bdef08b388a4ce3c8ea3bd45499421fd791c4b4c2510adeee9f4cc0b00282564f8a75e91e288980cfd486cd87d51db7f664c92b37a2b30be505346a881e262e8a5ed77eeb3a06edf714f93de9c25b9db04ef2c3f119655360df6c0cbdd29832f1cd1ad3a2b13a3401f89ff675da735d0051eaa8345259d7661fd753316143a0549790a1895a2d94c47d103b62422d64254107aa2a381cddfe40f003254d14153b90de433377f80ceae0c1595b42c0afb939988517aac0337c90fd431f7958bd1ef9fd80034d1330fff09bb6ff950e737bfbd406db7fa3e34f691aa9e853c3c4a9630712bf2358317a81ed4497c602b271a5e2cf5d342769ec1553590c2b693968aa8623f20a8e6ca01d719ec4fed7d971da616fe89063a16fcfaf53103a7ab97c0158fe3538753abee83604e5335c3c247ed57e39b2ffd79724a80884aa8d50397ea40e7abac4e9c991ff8eaebe445cf03dc0ad4a899279c3e84f485d6108b54448e49fc7c29fd60ed601a315d76de4c3b4579f7583df5411edc1744dff50fe8ec949a19c1ec1b560ebc31359ad14b4fe42cb1bd15d3cc07211014b36b0093a630655ba0e64f755d9e281cc8b7035dfcba6ef3a730252022d5248f8b1a13d2791278fd329edc2d3f747387dff1ef206fcd939871b520361c1b4d018e7fdefacce1e5194250190230a89bf8a6a0e5e9454d6fb71b5b6fa6987f22a64d99a6bb0ff87e1ede2a73a52e078efedf0d691a693cc146759363a532792418ae1d5b0dd6c8a8cdc42cdb56de817c9283961f4a0134a7a4e0b88bb0ffb82f460b8cdfe3d19026639e54dc2b9f96ef7e9a9dddc315dc621980b074bdfa936c033c725c87080cc6717db643ce743a71e57ae0c7fba9f045461d19cda06387654adad83f01c088402054ec7c5c31539101073e7ccec1d75dc70f4b3ce7a66b69b71c4185a966d49dc4e89e1429ba490cd78da345eab3219408eaf55437ca5300000001902cac64f010f18d61770134a1210a04479348c3422e40e8942138d9bcb6948a127da9803737ebc4e8d84ec6d854805115d861e1c3a44011c0003706fe5a131856b18f75a50728c1350c7edcdf544d21156a4229f3128381eafecbdad1a2986c9f31895b225ac0294c843496c5a597f1e9d794ac8f0b8f7ee9a8625029341089724561af52b112718edd0eba22e98241665a9e68d98d50f275e22a4281cafaad011c25b6f0036731ab19691d66cf99e2930bd674fcdf5994c9f8808275e04da5e6c740c9af4104071f24f1c16113e0beecaec882a29b1a7aa48913240b682b245c0fe6a7108c553930681651e77165ca184471682e8c069a432cb23e94f1c051e906c290880c8be9621ca50ec2c391cfa5822c104288e4a09232a6701d2ac6ca915624cb026c7195b4b916e2b874714beabc69ac8e8d173d42885688d531f0031f696561fc93d87007715932e45292ce29417fa4461bced2d2fd7aa5fe4b64a232c31f9b89560b66c791ab9101b3d48db5659c27839ee65d90e3f715d5a3380ec2bbcc4407bf908e55d69fcbe8a43624f2dd96c2f128d7b6ff88adb599b6aefbdf7de7b99c48a059818924b810b91f6d248dcf8712558878c51853886ce3061ebc134648b99ae08ce09890ad30cfaa063400911095c0fcb0954031227f993179c0fcd218f11815519394e705c80e13913c405d8a7a38e052e0f7f78299c40b1ba1464faf6a6375e99c6498bc104090c41c7787965f911e6cb4aae0b5192186f043da2328408a21935085b6d7c2ca945d1273be4859453962f1c94523caf9301292eca9cd86e10a016e94415161b6f045a481575104418a6049d36d0961863541e160b132d3e4aa4109921b8474a920b084afe64fbb06af860a0e092b2a44a8299131cd1e5631a263c520631e093a575e243d7a52a57797b8e30c80b49078fd48c256eb8bc41d0e2312c718c57a102885456e69cf864dc983da1c1d112290235262b9085b03d2b63b4e8c595a1e108a8a68a94d99995354fae353f2b63a5c5b31068546f20ac74610ce8f634f1f030c9454163161f9e39e7a2986ace88ba3a080c09c2f3f578b50c84a88296b281d5d4128910c2a9300810dbd46062f5a6b438430809112a5852964e6226516171f89ac1fda101f87aed1944a15d1cf26b2d6f2e1e9b4218a7fa12abf4208b78238eeeb60d1a105183c5dfe4e041d886c214dae4d5758c8d08afb0a710754ac4b898dc6abaf0b67540967286009a29a4635b6137bae9db33f3e7ca1181904a45be10dee8f2c3294f0f2d3ebaeaa5df9bf249001f1095c1bb31e6eab4b4aec0fe899000ce1f644c03f520a0c155d392be2f296fcaac6076c551311c30c605a6304f35081e96001e3570f46336465129098b1937e640b6be9238e705052e282bc51e6c808f1cddb4114405030d011f045c5662c43850cb1230312d9402c28d8e364a171374b0c9c10da058c2527e3e3fa65589cc8818a00473cd53a947d5993a29b26cc96f0b4c0ca6e515be0dd001f7063282b2c11f35198df228893386410802757b3aaae4af2f90165d90d34705b2e7556908a155a608142a6564097e38b0b1d58161ca02a92d4f6c023f74c161a87c8064c272020055002b0454bb848451f3a3819049c31d3d2db000c434fa39d0884e8394425ea6d0b02355384307f6059815bd2d332891965d48a87ea42f7c4f1401daf1c3127f3438a42a6b05a4333c7898fc186186f1881ad30fc3972147146cc4d191a28f96ae2911da8e68aa5121a02d7fbcacb98ece98662a78ac61296ad2973c72187105ca162a6f01d48df822cbb0a885d7a2cf91e8127fc04a43c814230e3480d70b4b04d5892f81f5c31358879bc28b62c91c214e14708ab6510279d5717f6f48e6c0e8b36ef06382b560c1d4931133132a2273b0e9731cc67ed5e09519376f81c616bd90d8ca38a068664e922e2d26d248dbe470f063e3111bc94a30069735eab8c3e90940641f24ed31a16151f2ca4d09586781f34cd26045070447592bbaa0aa84c02044a2b0b966654ab4c887a1e583004cd0413ba31246cac4c4d646d7c8aa899140302e5df2521643c895707a2ae2caf066c1141097282c90a300c69f0a835ce595008d9e24b874224b26ca24b2428a0eadc0482cf2927109764a002261522097d1d61322647fda2ed119793210b9b8a7e944f957c4ce213e3e54e40d70d2c297e665521504060088754ec474eef0e2c7ad65ce5654a2de983747f09657734e44ee002c48012a63284b5d5e1a28bf4033ecec19ce2a055936200a6688f35b00e40a559c95aad68608259cc4a000f6247b561c8080bc488930446330a7c9f20d2a8102a81b47395440125d2ad42683159a3e3782a890514b90756609884003a07081e8158438b0d21428f5d5972051801789d6ec4033c6868c1f351504ee0ca08e364437e212a437c5146db2ca025903d1701404e7bde4884f12d2ee8b71c18805571a35c8fb4061519e28c2c1a9256a301a4591b3a6c410204831812935b0707c71442f4840a270c30f47270a0899e0d5052d4a824132fc17a35783a139a037d5c6015328daf1e5e9f8a1c00102851f9613d80bf9e92050085c20c605cf06a91781278c71564c254af00089941fa74ed232cc1a1744a6144a3ca228e6c4ff59c175951860067c8bcc704aaa1d72898ef1e97292f0ebc3d8666b3df3450a599b840ccbe799133f354008e90151e8e46d0483395682281c0211b147440e9eb22e167c0ab1e10af2420d6ac11d47c7414a0d10710512a0fc2321c4834667b430ac1ddab05a2a035841c9e8c14279cb83080c234a746ad0a0db7a64450e9a3c070a998c14b92d3d34672817e180f1a827c22c59577e450b213caae4a438034b60e09ae4eb10ce10870361b6fe087d78b24c53a00a509a0b24072ca429958bc8c8f6ba3850d2a4518e185ea097aac12f69925713b22cae1f09ea39550e5a905091acfcc9d0c4332de30c5432f5492539e1818a2c9290333d0ee14ce93db2a192840db326403a60a944a33cacae3c015a51019ce051e148f901c2ac4343031d76521544fc459822c78ca1c9223fb424f54451154af73812e2f886c4459b149d050ebfac8f454794be287d556725085939c405c8d71924227e7405510c2020508d2032513185470f86903a51eab4bd507c0ca3eb9b8215a76b0dc1d49ea93b28839168331434f88aea3302c68d3937b0a2ccc5b86dd875ca8ac04df3120a1f09dcb6d058f7acf4c19a5b9a28c365c39837500bb888d060e4d02bd0069807323bc51369087da9a3c07ab9a8c7b68fc70ac4671e280e78c85994e2aa8989ab1f020cdd8961e1393400108bd8b5a3088f14776171a2f8b81a3446080b13cb1081be64cfcc79c0868fac28cb833870ae1648174dc1b16952824b8f0962598b48ae4193984c22205187c8f4d0d08e9293e67269a70f5081a902802c691542693124c6cac68c1fd13384687aa5c7437e4a362472bd6dcb54b134c66591b140840517c44c2989c45e533dead88074e1e04a236d07a695140107374cc8d062c30993b02700143eda9af164c8929136c84a3db4187da9689255ba95a0010d63107b8960332963ca92bcaa1544244d59145778c0a004822a420ae9681972b4f236a970e1102435909a061b280580167dc710d3068d335c1635c651d1aa0c7429c92354b474806382280a08a28b165f24c1a8a703c839080c0b29be3e9a4861b7008010c5068b27bc48f419383e6aa8582c30c3e187966fc0908dcd16043bbe643189c088c000d30c1a4503c20410834e91d4810e2ed818434b5daee8745075d8a0a5929213e9c9234596b05d5421e4e4b0abcaaa9252fc9272684b54834220805b12c31786670d08411095bc18c31ae8c3049568ea466d67720c03bead07aa939ac6225aac0f31aafc1e417ed9a003028508dee6e9d5632d071029362030ba816e007264c091a9057bf810271f149704e90064c891202aae08e530b2a6eb8ed51c3e0c2bfea8a2e2ae3f219c4d7e047738e2e1e02e9093e0c4b289d41b3d6b0443cc5941240b00648e48b9ca50f534874e6c8f05d7318692306341179ad69ed49b4639fc2ca69d40402092d89202227910896de39a380ac71a66d215ab3585540c7160434f800adb02221c358f708d00a4c44fae24a72e8b708f0f94324ea51b2c1a0b03341431f342f2850c7808c7aa42d4257f37c58216343468797db2795b936c28c0dd98fe61367289e33a8ca143591501e1c417dca7c3468b4279a5c38f2a2f5227564008a0dc84a1b1c12a4c2bc59619964330bc8d0b32d92b617440e911a42e5569e160242292db911957f4007261a9829bd3e33804a1b2e24d244138843018a4e5c23192a38ba8217224a4771f60f691c2a1a543d2053280fc9b0eb8c627b704545cfa1c244391f4c0b56842c00dec4d651d9220838a589542176573308c44d98923a5368252e02214364877c27414783250846aaecfa46a5674c0a3aa284c67f40e0066397b34e3f0542150d351d004c7e528e4cb4889c83657440a042a05cda5091225cd5419270f114bc88879b36756a68b090b1b0b8b11127c306ca9e07559722b2be227ce6b500c225c66580eb41c309e716b73c7712a504791363d985c9511ca3e9c0244d0c2823007638c13863a94ae7a77644634d2e36536b5c67622d18c0928764c6edf4585cb3b904c7ba238a234444d4a600f0f16d6550dc22643691a163522aea4f092bcd3d5d5a1d017454d2f83be3080235059d018b2bcd291e2bc56ceac0c2ac0c2afec9cb87a6203a9ef0d10886a12246181bae008e23a33602ddaa243e56acc882275a0c74069898f1ca50b19e8a0b0c485480ba1dfa0d5871dcb0e72bd447c13c22ca44401212e2fba2b2d3de595d381036d1026375095310419c2ca7a4ba69160745880e61aab1e09d91095c24e21a52b674e3c0aa6f856b605891790cf261d026d092429883090324c719673268aa13e0e5a0b262c4826aaa2255f38c20109cb9306000780fef029d1628306adf6d38b52c8a4f73b1e3c93525f403c823531d484caa39a123c22100244b5e80bc5991db10c7e5234411090f8478f1619a00d1466d48cbc08cd351133e31187d4212220d52c65b064380b2ce9e0a14f942a1b9f614a324943150868b4b432742966c52053e98b95a435aa1917feb8a881e4d7a36da5b31d55c05cdae2062a4366086a4a12241c851f8b164148dab1c0a8851119ac48847d6b54600bbfd0cc1862678c43a42f36250ae8ae51bfcac5ca9aa7a21aed94083469661a4010f318078e8219674218c09a8290a3a4c48c4a810365c22259ea7d5e1ea0cb0e931f1a9cb130a156648cf43875000b628baa9fe4a5a518b0337e59045cb511bbc37a59c0624b9cc4d9d202c4015d62eac9a8448864865a3c1368493260cc52074ce0c96a4fa54658cf14922af8ecb89aa3c333c3a543cbac0186e41bdb31a26b09478b52902f906a1c09b8824a08106419218ca39d3f85904c855f5ce81801e4ce6a8a1429555044574c4dd0cee65e15935cef7401062a85b8be7051b0e4a6921217ca2d5a1a293e59042392852297e8eeb0d85ab9d759124f93442d11e5252a49321b5b579ed6b0b0b16346d58b1a1fe64061f1a07cda85a072c74b9d16db2d09f02a08ba554706f738909c9d4d26c76468158a6db7a6207330e14310880782b647790e65afa40aede551f222850529189f1c85681c21ab82a061727211e2902b50b84214c132b5a8c561ed4582b2bb1761503e409447260ba54c7cc9823f30b3b6740cd9ed1980d0466564f601c60e95afc94041923cd03871ca72f3a24214001a00525315c26747c14e0529063858b419c026a5678f6192a4c2203e2a26084403ee4800901507c9b046561f3c596c3e0a39dd7860000a636deef0a8e1eaabc409404f70642c1e654924d04291e53105a546e41fd8a9a275644e81a5912702eb3190f9014be38102e79a0868aee8e0e31549a5d223eaca3f62e48b232e82e6e84cbdc59d7d21c3a8849902db396c89ca94c18a72a4406f1315715b310928c690db04af0451fe002fc84aa8256ade47f019bd6519364e62b0d59929d21777490bc817822b0f75761c89a9aa6481c380d3a347c44d97e160559d68e86188558a0b1c3c004d2c0babd258cb441a03d4396c7953e0d3ea9061dc174ada6d9790268eb5e98f20ae2467528bb0d020b48242ae6f2ec06310e5a04b7a3704df06df34026393375747b5f25cbae036b08044a1881660180380c6ad4b6e1f1703c8e224214b2066d6aac0a304c1e83709e6ed8f994a309daa8a2968aaf06400e282d181286396308172d717c41621da9933275255784468446d13a9a587d2aa51c3a5254868e9846d94ae2b714455069ec82587a054d30c6115671f380db4a080cdf88d839e791e022062bd538029c5245206314d62d44a0c51a1605221260b159d47501e715151ca817120610a401b416bd9e891119f3e927f613695082b9c46527b7248e040f007249ad318d52644092d2a0d6bfc7009344046b6c0a506e8f913cd4a1c8187ec418b6d9e1f2b15010c50485f701a484a4254166787862f5905ca1e399aea63c32983a497092f5824fc0dd9924312969d2c64184111019bc5080479e1ca55f9aa8a10291182174f5c4449c1628ee4e6c1d4758287b523596b709401f0884c1d0617b0f05418d639a3742018a1b256de305d2f0c908aaaac6d4f68063f2758854712969020affa3a83342c389a2c8ac49444e26a4a9c2e6e25661ad4d855f6485182832e212cfa58019169f2bc01a3da6005796962128117c73a1d449a951a39c14243aec05c2c39349adae261e20ad12649550d9722273610cc172e0c7a9902b9b392f3b2bc5a620926a0655b6bbb638798465096158f1c5b02e4090e0840a64a728c972994cb8ee94a620bc95d5d153a7c8a1cb2b02993f03e330c3dc4418b52243853a10a885595a0ae176a3c9cfc3441746ec1a203b5a563fa2e0a2000cf07970930253e946994725e5f577af62899727823271e81c8ab60782276e6185ec8e287b7868c10bb405a8db848d10054e412ea74025869412895926363c361a08d436717d81e27a4c11e55092ad5312af29656a40fad15c8516ca7e5a454c3ac4d548836765ee80992466050aa66b483674191360cc4b601386d1235a860f0101c2464410c62232c6b85c62158b2a608400249e4c1da18451a441446d7884929bf0c4a0228ce1e37c20e4a6d9d101da8acd0860cea4933e7ccb5100000defc9093b5d5c505640e390b1ff09aecede1a9f8fb92367942d8a5cd103b73ea68f0d282e433c563c94f9c1c410089913257dcb081448055420beae92248191a8194c24e9088a3f422127511f6840f8ba42258d00451a324a72050ba3027c16fe4c108009b039e48a7ab4493be948c3d4574de1888734178854097a1453d3855bc0ec52083868d93008ca4584a8992c32c9a12c492254fd34f4b317825fd5391483619410c122b00145392245d4d3ed7292c6ad41a117a0548f3c58ac6b24e4d03a660548f95c1f94b14879f9795249312b60d56b4204026982171f931846b8508ac1276d5a8131b537f530ea940a08c63f6e7dc8bee902dc54a378253f2acf82a0501f36a03a3620b01ab3b420ce86ce5798352e4600ca3eb15059dc92185dc28e30710b4843b2e8479b329aad52801aac89039111c1b2137628c41c88bdc0f015b6d93782051eca3f7a4ce23224e6214b05306e031a762858b254ccc6845ba93ecce54d5919031e6ce180cb3fc586c5eb982d3a231840aa44504881425293359c6cae380148f133126f1e50dda48a20102a31e2918551841da2b5f86906f35d49c1c165e7992e5880100468a9cd9e09b04a62b4a9330a89404499fc20aa2876357a12247435974a8f0f62c11fae2c3445a83265f2dec31300b83064b44a054a87a19abb3a2a97eaa7e3571b405309a25e764eb54024669a0714a4d8e35456e09ca202004870fc720228e585fe2c22c3933852590481968170f98e6a5884da3398c9348200076a0d2e48310b929c22f388cb828b2e1428cbe40357f0f8e608d41895b3eb15067684a9e2221f620727a49e052571afcd4107b6fb4911a425a977ca21840a0e38f71ce073c22ec6cf7bc5cedf81115638ec1a1052f1bd319717a38e91a51e66f8a1bc8b421d437b7c503260e97f3611b3774491e0141ffd8a1c1a3255d2168747707a7460a056c78e250c0e01889cbcd131b9329b244804bc44993c04c8d6d1980490f4083553a142c229227ec83173a2b123a4cfc88a0836910d6f106da1d0e32b81c7cb1e62586f8e2a3a26c89933c004969034788b141ca2c101010390a5422124b5525107ab62f0de89d4401a40129d21cb4e5018f9c385aae50915c620d71c64201214a172ad003c9194ffe8c3159f85a122150b575b1a78c85043c3eaac80da1c6f943a11547518e2c4cf0084f100944d0a505830d52631e3d4a09a0c55a14328bf2da2eac2da0822405051f2b22123d12a22d13325d12adb53d84b8e898431615e305d602706a4849fbdc243a320950bc828e4608a70677a816f5545852958503470e0ea456dc4c88d63030d9d7353c6ba1f4c732a96d05f534fbb7575fc3dccfffca5fd963b13cfb0b1dc05338c62afa2e6d601e698029dbfb8011a92f4af61c8969e826bf16b40728d49c46af0321496649661b7299143318a598a55c08fca07304671eb334ebf091c8c9e191a52f56592dea700073967667310e1f0e2ea65ca904a31091c3851864667254831c181871e065db51620fd15f47da0c41582b610faac0207962497042753b50d06101b15960b234466600f1fbeca891e66a85e63761b4e3d060f9f617a54f529c46ccf8765b4d31c41d895f6acf0c43591899321d010a1825753cf2901d806c4c0a0142e6a01788875215873c018917dad8fc427652e0e48b8a2f51d736d8eb8ea71596187cfe5ca947929499fb23743d5330d8d44133882b3531708454852d2633268ee17825471b9936f1619443302ea244c410c07c58837a53435cd47446c37fc510b720a210046176868805d1a9bdc1086cb00c714320424c6d255a18d800e550da189b90a70d20fc70bc42277a43de062a78c95ce460149ce7b9c2fa58270923e1780ea46926826b405871e24831c07155f24042fa31810d78a92e2ad1736205a05a6292160030587f7cf5905aaac3b3225ad5083d31cdcc88636542f186f0493b554583c02b51910684aa35383cc150a82b45b53372c184811e9c2af30aa39f017526a88e26d918b481471bf58b148f212c4d22515b6cb8d4071ae2059510059a294fd4445117bc9184f402eacd1bfada82e18362f755b27c9559a4407e440512528cc814f27e936ffc9e3495c752929da47b41f7f2d1f228cf5ad4dacba44621354b9ec1776b4715580645f1ad7ba5986a8fc2ac3ea672f20c5e988bb334150245f14e47f56c8a7d21039149092fd32688403b3f40d64c079c19611b146888948d54c702af4b7e361ca98fe20707897d446ad62745be7904252daa8f69d2315f6490ec3022d5b4506054ec1918f5075fe038f894c04415a9259228b4d114d5123de107e99e80e0241a386470858f4046d12e0008edce5009000ac80e1ec402d0445028577e0e35a140807e601104eb90d00cc5c38ad8f6c96208d580074fd00a1021080d479c90285a59a2d1500f101c8bd291d410a7a1c0e3d5694f5f1ec269246c93a2953d7ca4428e1d2e0973b8e12d0f1e8d3ed7c334c2c37d06eb668fde663083476bd032d030030d107858e4e878c8d0cf1e69a8c92bcb10a1cfd051800c81a6f037432f3bf49c61fed83064314667658201168683860b30149a231d6038d6030395aa2d360f0d3e60107186a10fc315904261a81e2914ee295c52a85848e7a51081da85c90b412efc0b12102f083844c88605218e3c846f2361d9a0a441317a6515c6ccb0340863d07039e8008da537b549048289b067de08531404b1089a083c54278a0544d0029d455650ee02093effd4c1922331caf07c92a7c4c10c308c4fc66705eb0a2912f81c3c97570a1c92c17a39ed38ca4a27a14c9d45fe9c7494136e098b258aba12e75383c0375d813e02e1c0b4c06da1cca285199116a2570b62864c53060876006c04d805500514501050018e3f427f53acfe42fcf1fdf9edf1838cf2d3bef9cdbd7e07fae2f401e993fbda1af50598e113d40e836f4d57760876c716df0dbe291fd95ea4bd30537b8e47f630c8ed3550a38748ef8a5e093d0b5b08c47c7873e8e5f9a1f39c64c8f3907797c78757678b47a4e3cd80f0de86e011a8e0a6428f0a563e15d0ee2cdd45dec9b8ba83de850db26364d7c52e4593dd53cd8ec3a81b5427a5aeb16eaf8e4e0f5d12ba443a39baa839c9392073d739b6b9a647284f93c6db884362ba6423e7926884b4010c8a177171850d360544696bd9b66c99cb99f2a7d425cae7cfa34f8428d1bd12cccefc3bfb189badaf59d963fbd54f659fe5e069eeb1db5aebe51a96b393b26c3ee97147f9a4c628af65f863795586dfbd77749273925e34cae5de68d19e9424487a766bb9c3734f24dbd6627b6f0a92d2ae7f1aa9489eb3cf31525c9f3140da8225dbd6f4ec612a5ccbfe85794d6703395dcbfe5af534b7d61dcbe3586eef2d68ef2da0d9840249803cfb5a86033d7a1d8501606f2a475f5bf0cf1e83fcfd1a09f9d16833fac060f68bea2ce20340c1003d8a8c28a24ad488881f5ae196614531e05788ce43a0a21e33392a6484d4149809f3e08e6976ac91d1853e40eb9caf1e624668213300059e1a67970e50e638cada6bb366160bb812804a44ab11d60112955b110d2d100550111788904151019924a9b2127ee00a77c859e02c6812d562119905c8ed47a50c638c920210d04775d4134755a592df9ba7c59294704d48e081105b4a46a549c0a625bfa50869441d270755cb8474111418369e2230eae2e6c942ecadaaed2f2c43adf866f0b08a0049012caf54a4c900f838468f28fb04ce0a7e48a76c85195ab501624230c26910a0da1a0184555798d4490aacc2ad69c3426ba0b006a9943a60132957e88c429446a33e973420da62e316220ede0abab40f1d8273e68c96555c59957a858c219fa390051237201d946816952014e923d1203d7ade9e95fcca7075f87283acd1b89204609a84c5ed535b45fa31c3c0118c4f96a62a251a5cbac4964d0bb2083957fecae830314572490f4597d8561f012f1c4118811467c01d5f77e0eac9878bcd2ce7d29528a400278376c45922f9d38b33d483a3ff4114c00b0ac66d979d3d245b46d38b0050593e761ca0e1e2aa8f1b8a9dd53164c7931e3e0f71904c4e71559280e311132a4d086805b1b13c34e535233243180bbec22c218fe20684b0beb0b44e4d14bc15c8a307500ca22e1479b2a6622076d1b23141ab6f0edb22bd377f16bf0021a98e89208959852df2baf315472cebc060159ad118144a2c607e3e80c0f3a43290640c18b1b6780e254ee506958f4eea2905e29a6724444ccab4985b42d8b5ac22737758271cf5f9c902b39821c91f2d5425d4f45874d220844a853534ac0e1132238508e56452dbde94484e14902872390480561d9e11115ad8257281f5765a5cfab3a02ac09fa6146f6d5c40b5f0d28b7389909fd41a426a4d1b73260bbc3901608b230594d61f3b058f0a353cc892893804d6c8c8b2aa84802d66850f25c45858b9381f5931a2645bf3c020f66c826f1c478248ddb9b54245b44d89bcc550641a58d68ba62fab02131ac708579c5124018cb3c2101d7cca474a5415905fd2b0c30962121edeb8d2c818d02ef2a988b00601082a0263ae95a38f093122df260c528043233540cb96e5013e32238f6594ea2e796c549bf706d79e2910355a08193f6e00e1d3f34700c3d5d61c9a0c8e98e60029f10b02688ef1961ed4b07a1aaa562b84339715b0c1c72e1928a020291b521b72e192e4654e03b4ab23cdb0e7222a8e79be49a40e2a41609601442a90fa1229ae49a5cba307292c4d5e797169807a18e278c4a25a650282c103ab89034ca10f4c9640839428c4a050fd614a4ab543cbd90307597f3d064730707cbf023cc7268dc04e307c5203511b378d3fb0d624ae20db5158c60a4cb14b113a39b4a6e44400c28291eaf18e0932db441e5ed597173c1b16fb951c958470c881cdc62dc8aafa3114e9e7ee7947b8a87a1006cd8fcae975e1116e452040184e1bb8f68283d4dc07257c96249df409cf941343c18556804a7ba8cc202a516288ac64edc937a15a63c94ffbd465431b0b0e08355cbd1e4811f15031ae542c738a58583a41d4879056103878009918182336c48fc41f203890557f7640d05c26b4c142650e407fd91954463939fb72698a804c0ca3352ff89c2cb72a8418d4e6460fc62cb72b7e9e50f98da872a346b05ec47aa9ca6890709138644d99e560c751e4d4083a0ccab5490d83606c1de2aa4148a4440f3761521ab4789188b0bac027c9365000080427c274bd0d5ad0a4cc336501999a8d1f22016e62e91988892b871601f3b311c88f465940959e4460ab3d656c0c13d3f8017a04c3c44b57e5b9f46b417b801a1862025aa4c7941d3212bbf43a1092648604081647945983b12a5aaee4322966304211629192201846108eb1b4e442e0079da3373ac208a5ec6982f461d66569d6e12351200c3a5c52c03cf2589a7265e98b55560b3a45f65cfaa1604fcb6b983a4bbbb318674f212938faa2b85575f9f19a72a5128c42442ac12f5501300dd598801583cc4c8e4af0c89db43b84840eea284d1971e065db513e9d80f1b384ec6253e68bfe3ad266043a21e2cd53571eb2288959610faac02071fad051c7e9039f224761a838a1ba1d28e6fe58e5f53883fd020d20a525c88651c21a2fc5a69fdfc2ca17200b4c96c6c80c1f6c3c080384af8a866c43b5a3469aabd519c8af00520a20f982a88814a31d87064bb7144fe0c31f82d62e26b4a44f529c46cc4830824e99a605726906aab69a62883b12e7357c08a4054a0bfb21b56786a12c8c115e4449f17168c25181df9600058c923a9ebd0a282c5132d0a89657b503908d492140fcf87aa30c902df643a91788875215870344844ae42d34c1be2d245e6863b38b205a0ef6e489f132c4c74a81932f2abe40495942420a01367e5604524671a13641cd0fb382c7a18f3916dcae703dadb0c4e0f387805d240d348e212481b13a92a4ccdc1f2109021eb592739868c04b05834d1df4821901a0c858e231d53dbb9a183842aac2e694f065618a1c1d8f26aed204c58d8924a6ced893226216f7fc71b374bc92a38d4c1b0f890cad6c88945222db15e5108c8b28115d04d3f0ce8143130c5d81f9b006f5a6a6a526051f2c280765564c359dd1f05fb10e93f2dfddb72017f0da70a712082724d02e4d3ec4c1129167044b1084d919221610690a2f2d1799e09898d2de60043648868303151a04914c896ebe1c78314104111f581443537a72742402c422c4d456a245812b6217127c2a0f5e0e4c1d4a1b6313422052419ea80b76ca7260bffc70bc42a759ce1a34795cb851c4fcb24864bd59447c4145e4ad91c3164728e0a8e0257391835152242c6d0c97223c9e493d57581feb24691e37361e9a057f5c68713c07d2341155a1f4803a270f5b1c3d2a405871e248318cd528f155d5c8849c2055250f24a4df121577d8f8418206518a325a5eaa8b4af49adc31f373abeba09588a0aa5a6292160030ec61105229008d256126955f3da496eaf0dcf04654daa1e51220cf9637c356a979602cee0d5994cb0d27b42a424f4c3333e2105613146a9de511e04889e20de193760919382b59f2228b070c2e045e898a3418a404908a07bd0f2fa422ac383cc150a80b850a2291ca26dc98a5a82919b960c240ef0d90afb12e644ac01c1f715d61f433a0ae041bb33d69b2aa0e44e16235c9c6a00d3cd8e47811f1a604098743bf94e23184a549a40e4c69961aa0c0e0c4ab6bc3a53ed0102f22a829a8f138472c4aa52b1468a63c5113b5c0115012287ab080a9b47c2309e905945b20ba508a0c516aacbd5e5f5b307c50ec74212546663c19a8686265f92ab348805e205211005da2083893a62a90906244a610fd0000153b34ac912ae335f9c6ef494f11e220884486993e808c6029c94ed2bda05be0452948f744e5ebca94964779d6a2d4a454e5944d5728df8caf1a85d42c79040f41e9f0db807763f144961d55601914ada2cf8483a1c7ed241f546c74f5a22f630c59b03074d0e74aff4831d51e85597b300912c443579c0b7f5e5979062fccc555f2e3c60793d28a2e1f6c504151bcd351352361040461d94f73b6947a21039149092f6b019c413ee012c7704e0b44a09d1f206ab6e05998e270a628028faa33236c83020df14e45e6ba347291424faa91137a88930074f365cda101eac7d3d602af4b7ef69b28237c2d56b6d4115715c50f0e12fbc8a1da2030cf4573556994872416d9ec138c61b0acd186312531b015f9e6119434284ad7487b89e8a8ddd15a35e9982f32484e578c491a568571124919a9a68502a3e21f9015ca3d5a362ea25c740af7cca4454f7824f963c325ca1593d517380e3ea52f8df40ed107a861904c4bb5441285369a0e016091c140150583d5ae05844db0443ca487ee2221e9a2460875e507e99e80e0644b910f7701da211eb7e590c1153e021959193e59e1f7e2035f591700847667a8144214838a9d1e88b22da02b3b78100b401175c94237fcb85438e96beacacfa1261408fbd08f2140973a90f179b10882754888430e32c9bda83390f6946061456cfb64c1a087cb1d20d820630508a75aa8b9803598685df2e3d745848a2b9e2f3c412b40841f60e090fb54d9e8f65cca7242a2686579a68812458081317648b9413540702c4a47f26b8b219d9db37aa4444a405d833e0f49f86ee48589e9b08b9128ebf1eab4a72fa91ed0c94a41fa1642503512b649d1aaeb10da13e6800c1672695254c8b1c32560f81c0ab423ce91b7fd48eb2d0f1e8d3eb18f3f71921419e93a1a5059ea73ba0338f8c7421a1a2e02d0da3342ea0cd6cd1ead58458e43dd4c8827654d0b8fd6a06520862e56294dc01545500c5681c0c32247a7431aee38890652e8ba549e3dd250934716a72fae4cd81f0315d92d12690bf818e15bb1440d02231f7cd019b20a9021d014fee6b66212ca8a253f6b122977e839c3fcb1310d32e536e30ca1282f5c637456261858e1a64789b12b78ee2caeb152b16306d9842008fcb0114642c19252583e31d25da02462068c34e5d448c996e79a231d6038c66344142f55a0162c89e17655b5c5e6a1c187a6474cd1a7402b8c942db57891cabacc74404af3e76a42923fe85a51a45156e41f949187207b380ce2887305a45018aa470a201c99e1920241b1c3d43290161849161a2af4c9ea51e098c83a5e726409125f28c1de884ab4828a905a06569a832190e6440ff218c020c91ce1989dca3088d0185817427f64264a2d6b0722784d522ae2c9a54106e9b3f74783015e1d56e49c318f69620ca600ba514022e2916deacd9eb6c6302c7f62a2285dc2a2030af4cb0acc68cf89e1933bb81e52242f4b595d81e356db1064058d2d542445fddca0ea8b42a31d1a12e4a63d33a603f29a92820b6bf4c5c98a00ca44fa6d0015c24a905529c1211e81f0eca9f3856f4414e4223e2a33f483ab0040046aa2036b9544f42588d48f4655a61a509d5d3c1406a0d845c714ad1d590aab34df02d3c80053e562476250a5575661cc8c4a74e21cb1de8142932442f9f4c0871ba93356770ab813202f26e9d88a7b4333c24fa9e58d298d200159316254a1b1f4a63689a0ac920e28ce862a3ba7c49e79234cc1b5b0c1c44d2b4eea50cd16a0246f14bdcc7870e087e908cd1f4a8c568187ea44b17e5022d4a525c65b891a669474165941b9035409451f1b46ccd89200c025c34b45150e3499dc950b1d4211240aab3a58722446191ca449e41d31b940745de6297130038c0742501048845103b54845d7dc1220277cb8757786fc68f2b90bd45e59574891c0e720801f0b7d9152dad089b1bc52e0900cb66b07951aae190141de5c97a3ac74128a74c6052b95c2ee30ce05b88274184849063f3b53642a61c17ad3d64c8d5d0540c808d527c11b33e9561018395e4b582c51d4211fb32c04e2f1a24efc026b45102e607e0ca054a8af5c11c943344f0111e4ad4c72bd880f3b6409028b5c7c212628105648662f0f0d98ea29aa4a9fac05f3f5ca1209051ab527e8240421d345b5e5628b9b884c330d33562333a5ad8f9415d4990b5e623203291045708a109d9295054f122f6adb3e768e34d64926498388ca46d6609a1899417a8636db9201140429453d4a30823196df000d243a7f6e5f5a864c5306082e8af9f0a302a31858d1b3aaaa1c9004d449d96e84703a945392e545ea4e958c351e5b50256903aeaa5a96a469513a6401d1240d973a989057c82163e455361cd0814006e2ac4cdb859f47919946a51d953d25b8dc68741da3e441df8b27ea16102e6c00b864b820ef4d8fe49e0f741cab2d34459438aaa41078a32409e4c3b64a2692851050290f7d8c0093c5caa01333b8f8564ce5599122bde1c60d991776865cb10a02240b67068c2d25d96c4c5f51895c7285786487ae481e210c312d6078c648e09204b3a02101ca088b2d2d0d0467925faedc2b9276c8b89990f40045c2e18b9d75b92232491f1f531fca4a598210d4f008a00bb2be6bdef0f10a9ad148308ab14c872b2d616d2217b3ba4e2039b413c4061ce9b2121604122655d07363c8c907ae6da2142f69183e2f20cd4a0b8c81ca9001d372686a864f50bbe392425b155b6424eaf25f5dd921d81d5a4e163328cb0a45992489d54743d7a226551822f38a60187c4476674a509f3e5f16d5e13d360be1d9c560f1e4abce0f594095abdcd67037e769d0e2942cc6be443ca28455b40f3ea8de188a8c41f5c261e8d3b7acd2c8921f24740eae725280667b00df8cc87874c94bc11a0b0dd2b4b2046dc8a21457888ba51a3b3e04921000959e1328a8caa4518176b6b43a53685203a928716c47867b026344c7ee238a1ca475a502150dc6b203089e319ea068d191aaea6e12ed54ea6280831db9c717784ce2945b08c47c7871fc60e484a98fc2b5706f69f8f064a6f9023e1142c792337bc076951fb3c71f91f315376aac1cfc407c075ace64ced69aa63b967bf98f8fb9f3d8af3956908fb9d13027d85f948f6d6b58918e336060a5bb358efb34cac7dc3045ff82f16d8dbd7aeea5dbdec75dffad5a1e06c669dac3f3afa1b3b7d652fec6df4afbd95a47f9982bffad2cc75d9886eb387b1d933f675665b8f3d84fe54e377f39c5dec7996e533f18f7c43f63b11dcecd5fe1a7ecad5a11802210ecbdeb69ff543fd7b2a7615efdf1989f01e50f8730e3fd4c855eff4cfdb532046008a9bddd30dafbd737e6a965f8da9865d75eae916ee4d86dfdbed76c75eedc95ffd4d3f40c5341040211e982c0ee2df52f08c0d77f8004bf7e9e726634cab752ae7d7e88dcee07c5f9f5f3af693fd73018c7d259fa43d8af799611911b06c6d9b8afd7766bcd78636f5791b1cc0de3f3a782314a79c0e3c171efedd2f48f799dfd5caeca30b3ceaece4ae96fd57ab810cd8b7bfd9f510f655b76768074ed7287482d5907147422975376b8b0b71bbd53ec7d7ed1fb99da41ca7d7ddd135f3f95619a2f06da8b55b6ebb3feffda0f2ea218f333766e312efbfec5b8d3f05cd37ee6db1ade4efed92f6e63b851b837fe787f8351fe7afa8dffebfd4c856abdec5fc5494a4536db8dd6ffcf514ec3738fb3553f2b42ba4cba77453bada4168996aacdda7befad4cecb3ddf947a3343cfb44588efaf92e4abb10b63271ae501647962ebb55b69535a19acededbc256d62a6a349a0e5d82aef3d9b906e358ef11b9afe53ef76cb5c65665d85a8781f52967d2ddca634f73ef65f83afbdabffcd75c8e37c75cd9c35878eae79af66f948fb9ae3bad3d67d24c7af6d28ef533967bf9cab37f0b23f2fe9f7cf652ce0c8bfaec5c47c1383d7fcee44cbe957bdd3b0df5b1b4433977e719ae653f1b9a7bcc79b383f9894321374c9eb3d629a7c6b014a6e98fd5fe3896e1c46ee5f59763ee09c1789919afb3d29aee9e0afb44b86b9bd16fd546f998dbc79b63821c1a39dc7170b1932e83f85a5b5db759cb5dcbb37feb408204c47e18b5d6ddbf5068d4903b95d8416cd3efa2fcdadf269d665f3f47e5392b8d327d2c8565f8ea3913cabb9ca5d2dc23c2b12cc8e434cca33e118e3b14eb3d6294bf72afe3cee9cefdcbe30ed7b2d7fed84b3936cbe957f6b59fa9fc85b31ce098cb7376ee0f90c7c837f6b6e30cdc68af13fb2bf76dd7f2aa5c779a772ec3599a86e564a9bcb6f7769f7f7f817c2bdd4abb2c188838fd7cb4f73395aef6984abd36d96e4df758fe9fe69fbe66d83b2be572d706711e37cc27c2f11ba3908be3acb51231d0de7dee584e77feca72884c106537cc83f94438e635049986e32e57e1d9cbdabfaddf6b369fd0ad478483e34c37eaff33a09d9be29f836e00b1a1a9841bc14fe01ff0147e60ede3ce5e0a731ae656ce0c8bfa289761fe82f11adec6f27fe59ef553a69f3ba7e671974afdfcf5b40cf76ac7c2567af6b2f6f3ad479c7de2fbadb5bfce1f4eec562fa5e12bd94f84b31c3c9ffdc7fa40eb752bad6e5541d519d538aa20aa0d2a050fc8dfd8ee56cae53f579e7fdde3b8a67ddd63da5b6b97e65a2f435fbf08ad692fc5fefa27f2add6cbafa7bbf427fe6f9dca5e5a95e16ab5c7d42f6bff4b732fb54e61ab168cfbbacf3cfbfe19ebd265656566dcadba9ebfbe3aff316fadfd354bd39d6fe35f5babb0b5a6764e47a3fcf5f5b4cb9e7be9af39d3d3bc56f4327ffd94cfbe5a85e7baa6ab6faff26d4de57280757e7281156a383f3837dac335b456f472dda1afdfb6c7fef55a6f9dbd51ecbd952f87b76c6ffff6d76a0a67ef8d387f6ded656faddfb7735a863984698f6974efad4794ffd623bef19fce53feb695d2c9bdb7db3676f714acf3b8d4c87edf2eb57a1a96022aa552bb6bb997be9e59d370ec6bd84ac86598d7b2a7fd8cddfabdbd37d856f63a7b2b3b98def8c67fca7d07dc9bda6139cbd55cfe46278decbddfb7471577b4cc7b6aadfd31a7614fe55044590e5e0b0d036d7469c57ee5b5a7e5f0f6769bcd67db9959d6dd4aa8d497a75c43a0bdb70c4fd060641b7b4438e64c0d8d34df7b8b6da5063cafd4f0b4b7fbfe6b1cc3f5b6866bd9736f7d1ee6396c32f5337f0f1b0f2f6cb72a1f961d5eedbde9b632039cbd7786291914dd6706c03d7f2bfdcc0016cf59c340dbcbd22c5dd3b0a2a761c32edbe5bfe6729ee1230d7bebd310bbe7ac945fb35758b15fb9b73ea15a2fc3c9daffc6ff4fa15a2f6f3d22140e03a4bdf7fbca61a8b2e5ce7f2df7d95331a0e03406c0bdf7fe35e73406b0bd5d1a8260612177eb11f976ee730d4be7cee5cea99f53e36ef552d9573ba7671f18cf82f19c85426bbac7fedafdfcb5cb70b50cf7b9a6e54f57cbbe2aa7d8fb9acd2767fa57cefeb9f9d7d34e856eebb8cb1e0bf774f3fe0e8efb60b3e93db5d9a4bda76e3d22dcd36dfe777e88d31fcfc973560a95e16bb762e30eedf29c5d33cbc63d113a7b2c94862af6abf75468fca1327cf59e0aadca3062af69a80c5f09071156d9879c6958fb69b6535f3f7b2da795848adb23ce5f3b46fd63d4ff9f84653bcccfd93a4b9dffff35181f64b4e93e776c9895ee56301e771ff7672d67ffb5bf792f3cff79b69be94f95f33e5586a18317f6b672f96fb00ddbfd2c372885686fba6b9b51c12e3ec65eff5429e828689513c4e3b29c2056557ebd95a6bb55ee8968d35d2bf764f3fd94cf19fb19679dd6fd7aedce3cd31e63fdfc56e53139a5f3c6e69cee56a57382d219e55519f6f3a78bc67d0adbd553fe6b7ea70c44f3fab7aee1ab34ab0c34a20cbce0726520d69e7d1dc3defab410e8308a48f767d490bf1ea6c24f0b31b6fbfaea9cf5d25af67e3af33e7beb73ebf7e0b61e1191eecf2722ddeb33b42c9ccfc67d70ebf7dca67ed0bf7fbaf70edb4a0b517b6fb7967da2ffdb4ac01c4a403ec0a7bdb7bb8dfdb4f39ff8af7ed67245984a6f3da2344bd359be8dfdcc3d2117136bda3dfffcc4c4dc1ec75df997278ee1bd3f227f2cdc68946f679fe8f9564ae722cefdeae731f97bc4dea7fc3be047c52f1a8546b9a705b9ebe92c7ffd2bfbebf54ffdece96b97b1d7aee8e74fe5ccda533bcdb772f788bdaebb95f6cd0a7e797e8172847e6b7d7b947d3bf65630f5d8b1facbbcc3fccb74ddbf9f1ba5b772e75519fe2fafb3bf0f43df53c94769d7ff0772fae9cebeee7196e65ecae5cedd28ff727c3af6de5bc9a7e4636a6ee51e19e55e76efbd957b7cbb3d8ee5dc38fb7aeb94e6bfe6f3e7dc5f3bbdddc62fdff6eb9c9dd2d5de29ff45390de1cb1eebebdc17e674b7be55b95ba77296d3feda653ef5587aced2b2e7710c6b999ccf7096439efbfac56ead7996cb3deadf3f8df2b0eddc65580ac67db55f613f63f52071add76bb2b78beddeca69089e6f63e9d5d3b49cd413c29cf6d58ee5d4da3b957a2936a7feeba779ed9d56bae3359b4ffffe69fcbf14eee9e96ec5da617bddeb7add5f7a5acbd94f47f581742d7b780a53a959bacf766bc2623afbe1443f63dff8bff157e6b1d8db0dab3dede5cfa93098f6d96c3ef3f2f676674f67fb95c759fa392bf110ed1dd66c821dd21dfadf2c6dc8e59478911cf1ff7a839c12ef716ff755745f2ca7bbd65b9f78799b7b6bed9d5a2f7fab162e8e3b1d5c15a6ca9f8ed39d3fdddc14ff5c1c77658534ca0a906262ae97ff3b2667b9978a89b989ffea67be8d6bd9cbfd3a7b40e656562054568872b75478eab1b4a7b3fcbf59a7f6edbea665988938f556e51d95bb22cabbe7de2e143a7f6f7dbafdf5721576de51b00bb4ddad47d4761e16d57a390ac6dfdad3b5d20ec6deeee7d1faffc0287fe5fedfec14ae656fadb3728afe95ebc6ec5dfd7cd51fd75df0544ef72adfc6f29fb99f9ddca59575529ba60bb45d9ae64aba1bde5a73ba6b9574d1bdb7cb659f085779dde5e8e2e8a4f6de7b0ed2dedba9dce75af67ee67d83767379f6662b5b431b03ccb353ce75d9db7bea9c11e55c23f7d65a3917dddbb556612bdd2b2837bfce9f3a7b2cffb5b59afdb2e7f5f753ce49edbd5ded8ff9ff35a761cee95e410e92fb7a19a6fa571654cab179bdf7543aa5dc91fdc29c7beb13eee946fdab6119860be3ccb235333c30b7a91f5c533bc3abe34efbe99cfd74da5a166e4ded4cd0ad6ccd0caff6d5b9d76b6a6782cab8472ec33c8e7b9ce23e53c6b5b964dbe994ff5a8679dfa01dd7f6f9b5d630a1328e6beffddc4a0a917b6fd74e86e50fcf3d86af30cd6998d3b0f5c9ddbe413b2e77eeb3349dc7d42532489240a63eab36255c53997b36b695e11a9eb56ff7b3b42e6d2d7b96086d366928967eb3f19642f9a618c69b7e11a6a1d4ff672c677228d5cf606e7da67e9086b172348ced5539c65ee10993587af0a9fd7413da10a73f9ef3b1b4bfb2c72adad5dfef8d3f9e2c28fbc53fdfd59ea6e564ed971165415f773fd35db3575886fbb43ff673db58fea35f397bf77aed8f63b9fafbd5ff07fa58da63b827765950fef0eb6b3adbad8af456ee7dff3fe919f0fb05cefe9aa5e54f27c35578fe7bfb1c368bf83fdfecb79deffbbdde3aed3eb0d3efd4ce6907d771b6cf4a773ca6bdbd99f4f2f666c2db9ba9c25d5b9f36c1a7ed3420ee590ebecfbecf766a6a6a6a6a6a6a6969696969696969696968686868686868686868676767676767676767676666666666666666666665676567656765676567656765676567656765671224489020418204091224b4b5b5b5b5b5b5b5b5b5b1b1b1b1b1b1b1b1b1b1adadadadadadadadadada9a9a9a9a9a9a9a9a9a9a5a5a5a5a5a5a5a5a5a5a1a1a1a1a1a1a1a1a1a19d9d9d9d9d9d9d9d9d9d999999999999999995959595959595959595994990204182040912244890d0d6d6d6d6d6d6d6d6d6c6c6c6c6c6c6c6c6c6c6b6b6b6b6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a6a6969696969696969696968686868686868686868676767676767676767676666666666666666666566626a18d6d4d2d0dedccac2feef5fcafd7bc5da8742dd1b3db672f58cbfe2aff194e94ede2ee9d7e066c36d55cacfd924de1d9cbbe3af63806d6ebeceafee8fceca0817f818176503b3ec1babf3ee805b9be4ebf532f7bc4ff8cb3efef6b83f355b8eecdf3325c95ede822c08950a6147b1483b0c35ceccdb4f77ecff6de4c4c654c6446c076d0b3bb954269ba633b75ac96bb0c5fe1794ac32fcdaf74d7d21f6f6f2677efcd04210f840b0c940fdaec5d95612bddad64dbb9d3b49f7a99de766ddc390d733f8563e7f5cf77dbf9b93713d594f2c1d39673b063efedba6e1cf7abf3ffe7dcdb72efcd64050d531b360d1af7def01f947d0cfd35149b85eecd2495408692c11ad93321a06aa3d682d73fdfedcd14c5046560011ae582a7822c0ac0980a349b7e3e437bf394fc8e92d709735d178c3759d87681806d6a4ee7e256519b98ade99903f6cb57c40db0b58aa1f002e1a0e0d3196801d0af8f6f4f0fafc29d5d1ddd9c1c993bc6bc14412c0c0cc203070d182c5070897f7975716d5daaa29a5a2a2f3165507ea1f835763b4f955f4f5e25d2d6b274fd63bafeb1b34bceebbbd2b8847025d8586cdfd28a029560a6a67636d3cd669fb31d0ac5d2598cfe9459567a766b58da766606a5678f8dbd156b5289256d3b33cb5e4d2aaff0945642aa326cada1b5eca7b307fcb3c7b09dab936b3b33137cbd227cb79fae28abe2f6decd26144b733e7f2aafb35819e6ca2a2bf4ec425faf085369a6a6bd999898361591edd7fda8323c4695e10cd9999a956b697623da79369bdd6537d98fdb71376eec8e6ec01db7cb36df527bef041bc13eb0a336d436b00beca74d603bed015bc00eb09b36d3de01e06c15b589d93a001d606e9233342580dbbba940d380cd048529091391bd37742b1144753f2f95076e7c389676ebb4fb59cef2d7cfbe963d6fc65d195568efa6044d504d4d931e29a3dce8d92d4b33933fbd011ac75939aa81328a6aef1d554231da4a28492554e4de1bbbad95504294503962ecbd9db6128ac5de3b8c3799bcc9045342c14aa8a87ccdc67fcab997e1f8f57eaae839cf4efd4cfd74afca700cf7b956f456deab7f9eb36ff731f7f28fc3a8323c461681cf9ffb753f5eff2a18f7352cc3544efbfa67397019e67deb117973eb115f39fba93cecceacac2c9b61acacacac2c9b018cc7dfbf7fcaab729f3db64f691f5dc078c88c36a37cea37483f976b1a8e799f3b96fb18b66af9dd9f9d952e61b28fa15a2f8341e76e9d426958f954c7746a53127034d0a82490601bbf5ecef6184bc37597f6de4c96f6de95f6de94268180ecf0e50659a381488cf4638681631888b9a60559849c2b200e886df511f0c2f1439c271f2e36f39c0f4090fce9c519eef970b5b38764cb08f081ad8f1b8a9dddf12100572509381e35615433233243180b3ec61b5aa7260ade0c304e632076d1b23181910c1092ea98089287480706abd08cc878086320c91830626d1e1c9f5220ae794af2505864ee0eeb84230f0d4aa8e9b1e804ed800811cac9a436be0e57eaf08c88d0e2ae4389007f9a52bcb9e900b886905ad3069d0e5a7fec143c2ad4b0e8a784802d6605108b4ed8d63c3088fd6287152aa26d4afee25d81098d63842c16958f94a82a20b1db3a69640c6817fbb6441c7d4c8811f9b69d0ff091197934dbbaed990251a389d812d89a4393c11193a21b0f6a583d0d55451e32504041523644b17aa419f65c5445f12c804805525f22692de5c5a501ea91411bd9c401a6d087265a1952aa1d5ace1e68a1019e63934660b5606b125790edc090b8484e04202c18ab12b978c1b361b163494c51f56328d28f2cf1e9f4baf008c72291cf7d50c26749323b2840a53d54661265a3acb1e4a77dea926d24e2a1625cab59bd2070f0003281ca56fdd901417371abf5443939fb72695a27a91062509b1b3deaac1b3582f522562d97e560c75124550d7588ab06211113b4e4053e49b68102e81f79a62c2053b3a1e31c5a04cccf10f4da9e32368601dbc05eaac9d84bb5ed5eaafdbd5483eea59a85bd549bdb4bb5b4bd5403db4b35adbd548bdacbb44a7b99a6682fd302ed5d7be7f7633ac344a549c0b22f7b95bd77ef755fa27136d8320a5805cdb3e9d96d62fadb7b3f39802a98626732bac9af6fef26b426bea6bdf9cfb36fd2db7b0bc8db7b33e1edbd999a2adc2d33702d0d219786173c141a3eed26af66f39ae8af891e83972506219b37e998faec262c06ac6f764df49b69691780c96aefa6babdf7d34650c770563ac1cffdc2df7975d4bfa7c76e9f7e2aff3dfd5ca7a3fe7d6bedfbe6ef7dfdfdecfef3f58bdfcf7f3f27fdfda8b177ee3a828f769165e007da7b39cfc758787eca7376ee0c4df03f03b5df4ff67cf4ece118ebfd5dade8fdea1fd3b4f77780b487b77e8ffe70dd03f36826064bbf38f4ecbe3e96f6ffa4c6def99f1eb6125263ef9cff1ded9d745e75eede1962d9d764ef320137f6de1af6b26f8e9e5d3ac65e61decf38f5f3ce654fceae7e3e3f03bab4a7b3748da5690888d31ff39aeb0981e1bf7061daa285a90f1f037951f666ca8306e97d0abe1e71faf95effcaf094f681efeb039d73afaf65b82f76bebeeef05c77ac0f7cdfdad7f4e7abe96cddebb5ff95edf0b4ecbd97782d9678cdbdf3f014ecbdebcee39e95e1a962ef73e19af6fc5363055efe9d53634fffbaebafeb3fc75d98cfd9da57b7fd4ac7d8ecdfe671d7f9ebf8fc37f42bef1c9b6d22d2f0cc65ed96d79d7f9aff77f6895efbf1b8fb7ae89ffd22d4cfd9a9a76538cab9dca7cc3ffb452eb68de3ee67316a1e57f017688781fbc9e13d79a0dd53ce2eb002b79be34fa7601f77658ffd4feefaf12899999a843333b238ce62a3dc7b2777b33fb153b90c4ffd8cf52ff5cb9de9bc7e9a8e46e96c743bf717a6abf28f7b34ca69264da57efff69986e7b81b8df26834ca19398783e3cc97339d6e57d8eac4f6be37ce39efc039f7318cbdfee997a3d128ef355d673fa77eba86e56c1cddde7b6f2f2940da7bbb1020f0e60b4399f4ec31f43af67575ddd739ab321c581d64144041c012ae0dff355fbe397a63f426f9666602dcd8eb39e73972f840b403eca61d62d974b203142e25284a786afbc01460d946b5f776b7b2b5c60a0343fc8c3c0cacd97439b303ef75afe39c7fab16acd9549ed56cd0bdb75bbd5babb3f75a97b5bdb5097bef7ef5d6290d6daa3df28b305dd302e4feecae7fbef3d74f57d3d9bec03c19eed62a8c075f613eba57d04ee11990ee15bcbfd336d1a5854083b3449bb244cba2c9893c1afde36e989818cd5f5439f498638f3c67a5501a1ac7bd89d948ccde4d6a7b37a535a1eddd746606b7779359191e199b25999033b42559da9672b32c5d164b976be9ee31449bd71d6c16102fc784a4ad055846e09b3f35704cc25883bd79d390f3f953c79e78dd7deceb986e964c33cc48e69625137273260f03e3f414c6ce9f5a95e53cc469afe966f39ae8996b4be602e60126d33202a265843ecb089211ca44e832651901721ff266dca134cc99bce9a954cf99bc49f72a94c99b9cc99b4cde34e47c2936b9e5c432202ec3102dc3482cc3aecb30be2518e412ec6909615b7b1a5a7b27e3f201157a769d539ff8c06a6ae900c3dedb12cb064d360c655c3608a36777eb11c9688fdd6efd1eff35afce727b5d7ff6383128d245ea89475c012a6e1731aa2869222cc52db8f32e8891b59b960b9a2c1794ed26ac5dff3f379b4b05cfbda9b1a7a158eadba5020604485bf21bdba5fa99f76b56cab7719d85bdb789bde44df4ec665f3f7bf96febf7e878168c67417fed7ef3b73aabf2ebe318ae9d7e6eee56e7f7fb7eff59d330ed7fdd92cb04ff705d17cf5997bfb187a93ceaaf5d966b363f97bf0c58fbeadcbb151bcb297679cecec970dfebb5f0ec01b7d73c19a6dd68945ba73d8c8ebb875197f69e5a9561eec671d6014c7561f7708e86adcfc0a82193fa3d9df5d73fa5e5eeaf34f7f2a7f90205fdb5cb32ec6abfbcc75d3a3b63e5ecf50a731a8669e961b4d994e7ec5cd490bb745586b71e91f32ec7ddd7d330f633a9bf8f8331582efb6c8f088dfbf44fc570b15c3ecde810e9fe74fac03dadf77bfdfbe99c4ba593bdb72b0bbe5519b6d6df0f91ee88747fca7f741f9d5f3dfdcfffa45feffda61eebf4d7ee37f558e752ea4c9b9ad3e9ca88fd5a67bfb473ed97113b77e71e4ffdcbb7f5ec17b4a9d1f4823635a793bf6e05eed2d25ef7d74a77bc9a9ee1ec8ce535eddff88371acf78857dec75d977ec0ddd7e5f287ad51fa53e5facb9c0af33030eee9b8df71377a86968d4679ddb3f393d33d8e46bd5bd33fe65e5a7f997fc55afed36854cba93033ca3d764bfbd9d7b1755a7bea9586e56e9d7ada57fbec137d0cc7d3b1da5a85634e4f61ac9c9ba7fe1ee66730ce3b16dbfbb81b857bbad1d61ad65ebb973fdda7d43f56673fff555e7f59f1cf71774c86791ffc80315586f997bf94bbdce54c3cee46a34eeebe9ea6fd340c02b65fc138cd5d9a59f33a8be561320c465b09b94b73b72e2f4bada0b444b574629462e94453dfa59385a553ddd2e96de994b674fa5a3a7539716dece7610ec078938c8739e00e7813fb39d30107e3bcc9a4f9a1e1004003d2eccd9b616075c7feb9963d74ae65b8a958439b4d9ad072409495ee564f67fdf66ebada7b332d0580f1f2afa3e5fe9b756efd1eddd6efbdf09b752e0528fe37eb0c5c0ab873b71e91ee9ece42ff9ba5ff9ba59701c2b86f9469c1b2a9ceb22970ef1d60c90467c98465c974b7645a7369cefcb2e253c17237d989ffcd5e9ab36b4f43fdfbf6d72f6e632cb623d2bd86fe171ac73022145a7b1a8aedde0aad3d5d29cc76afbecebbfe5aee56c00d9514999828b1a0e4a1910b9db7119016ac69eebd9b90b00920eeb30dffecbd07a4d87362e848b9e0c2de9b49f250853856b46226edbd031462039300407569d1de5b8011204700a7b044528861f8e798824796bd77804601687802290647007b6fa61584bec2e6016e49f6de4c70a4676232b4e06067efddc46747c1cf0a082b1eedbd0354bd6063c8c68d2c6ef6de4e3968406282d3b414b7f76eead30886074a36f8b0edbd07e88812c0613db301cf181a824965effcb534dd01ad7507bc66efdad468e7de4d01de3ed7a6e6e93ef7f63949029a9a982e45e2dbfbd9210d293b3b43d3f6c0374fd1bf72b3c934a5e1abf211894702689fa569d83af5f5f54f5d69d65ac35532b2268dad6b2baf3b964f98b389302d7baa7f798fe32c93a3318e0c37bd9d7bffb3c950231b7bef33b76c6c8c511a4647b64bfb997319f689bc4f7d2214b17b6db30945ec9e90ae65c0aa0c234efb4ccf5e7af57db47f3f5daf7b1d2d67bf77d26ffcf1ac74c7f35e169cff768ea611a79f8f925291e4de2f4d4f61ec7fd6b24fb4a315add13907df3c3fbc3a6522bc0db8f7be12b1958888d0b38bed57a88fa5d9ff92cdbfeeca43830e49ee4333ba7f0f39f7de86606c19e653b8faf99806a03980e20a0e569ad6de8123049a48e39eb6ce1044ba9b114a23178b465dbc06adc4016e072d0a34c209a1d4058cc88707932834de09e322a4710feecd74c6ccde4c659822f76622b337d318428e84a406356e0096ef2bf77a5fffc1c0b7d7bdce29c37d77324c2b7619ee9b7fdda772ff59d7dfaffe7eb4e0d6ef79ec5ffdfd66affd74deeceb3f587fbfd7d77f907ee5ec9dfc619aaed7bd8efe315daf9d8abd6ffe7775be3a77be5ef73aff9f76f5f7a33f5d5586eb3f087847e7c53d51b1f705d6f4a7f3777580808abdcf4e86fbdcc3e8ef7551c317f6775ce6afa7b77e8fbbaf67d2572ec75deefe9aff6a0c5339f7cced1c7767f8f9e7c7fddc613eeec6d3d7677dd60277ebf27855866798ee7ddc690fd693524f9d1e267b6f1ace6d2ac3647aa25cfa2dcf9e3c937b6fb63c1ee8d9f574ca3c584eede7fbffa9d8fbaaf29f09bf5ffdfd5e39fbefeaef27e7cdfe9dffb4feeeffa7dff77bbd1c9eaabdb77b87cbdebb5bf9ecb17471dce95c7e86f6f2d963dd33b4ad478c868571261818f547e069514ec3575fc3717f636fe5f3a772f953bf973df6379b7474699686b7d8f8fd57b9bd7786ada43349cfae344ba7c89e40577fccfd8ced75af0b449c7e3e3a6e7438ff35479c8366cee3de743bc96612b3f7e11cbebd79b38cbffe881c4361d5ac9477b0da3bdfd8c377b4af762cb67b6b730bd80208e578d87b876d3d22981cbcbd37affb9795935d269bf0a6b7fe7acab5de8f0f71f48168333db700c8388ce2e8895366f326affbd62342c7e280e0f3a796d8b1877edfeeeb9f08fdfd85d250e8fb76bf086f65ff427f0d7ddf3efff7ed6650e82525008a9b0c4ee3dedb4bf3a0d037910a2c0c5020f6b1bffe4d02023c0550a0546066f6a47413e546009b3a651b456d06b5e1b386d9c6cebe26fa3637769dc54605dbbc6dffa79cc926121b36f397ab30a7e15a665a65789e3d88ad6483b7ebec2c70379123d2fd09d772977bf3bf597ac3de7dcecafd37ebec1bb48bc204656fa6276bcafa9c259048a90612fb7705356d69baa4316354a2d931a06bbd3c6009a30126f30dee8d8729be30584df57ccdc0f9afa67a3ece3937d0812bbe30d4575f0f459cf6b9e6e372dada4e517b409d37b708d037fed20111ca3cf7defefd72134a930d65a4dbde5b4906b2967d62e27fb3b45bb379574667e7ffacd037f8dfac93ae00c7994eb7f9dfc571a7a36b360d349bb47fa1b27f5fd80a85b11d8aa59b4d6aec691a6ef66ff75b1ab524f2efeff3efbf62e15a0b142d877bbb70c732e96c3c95612c5c47a99f33a33d5b4f7b54cecd00671a70f3f54ff43320f3cd83f3e34c3cb737aff6ce1786d69e867bc20d72e6de560add4aa12f1c0cdd4aa1d7ec8ba5cb1efb75560e8be3fca958a27bef170bdf6160fc4a1eef7f5de58ae31ebc62dd7957caae6cefad74d94c9f7dad184181a5ad5869b3825505d1de0ecacaccaa204e7fbc8d997e5aa5ae12814a1e29d3cb7faeb2f7a6c2bf1f960adede7b0352e17bef2981369f5265efef37e539c5ea673e256e0adf7b7f3f2988c0b8942ef3a74a7194f2ce6bb86b39934bc17ac49fe827056fef316aec9d521460b7355c18d80b43abec28b5dce70a519a51a4682ef7e9afbd134a934e4f39affdd58552efbde39e95fb154ad9dedb9adb3dc9f364880f7bc9c038affe2767be79cebaaadc9f6b6659b8a79b1cddec638ffd537afe4f370ff774ab93ff0bad3edde8ebec9f817e867bf33c203d7bc49fe803a1704f378ffd53271cdc9adad9d3cd00b6f7bd5eabd8af327cfd3014eaaf5d9e3f75fe54281c1c233f43cbf20e6e676882b5777a3f3fe768e89bb7c471efbda34bcae83e5d22b55d25724a9aecbd5d258d724a2e282993fdabe4097252968384bcb0f786044bc2c85d53937a49d2e8d2334cd7b0af7f62920b499ef696fd15c9e4deaeaf7f22922a48146b4f2fc23df6b3f49d7e2e87448a84bbb4af7f22b52b913ced235da6cde6336d2dcbaff33f8262ef7d24da8ff023038c446ed7c88d1a826c04706fe993ff5e6744caddfabd2293dbddceb59febb85be4864b6f3de2fca9fef588bd2e7261bb3404b9c8d3debf2632e9ca3f71ebf79444aa6c1a26d2e83d558689e0111912e9d6e50d791c62950ec1da35fda75c081b19167263efbd6921d12dc4cd953ba210ae2079f676f9fcfd82340962dd7b07697b018140f2532064f6f67eae76e80b43b71eb12ac3f1743bf533dcd3add7bd8ebef6b903567861685b160a84ea079bbdfb8fc7ebafe9ec946bbdfc836fef4dff287b44c41fabec1d77e98fab8f8dbedab1fc31f0518ae6dee9a3ceeb7db0e035d64fa7723e681f65aedc953d02397b54d9db63bfaf7f4d77ba1e8ebb8775bbf2e7740faebdddf9bf2f0f453c9af03b1e337808ce7ffe7ceb11b9cb61d9d741b77396ee7eaedfb96bfd0c8542e93f85c2d5d51d4afbad4784ce7edbb135fda7700638933399af9705afbfafd97c6abfac232a07a51c457218e668fec1110347c751e1c6a31b5f6e5c6f5cd87bbb6eb4f63474e6f28f728ed8eb66f385c1b2d757ee667c2c8c8e7bb4f6cebf28188f869981fdfdee67cfe7aeeddccf71d757790d43fba09c8639d4cbdfef30fa7e78f680cd66d4702bedddcaa4ce1e8bf81365d85fe1fa06980d5f4dec55391b4664b857fd6cc3bab76ba3acf634ff3510756b8d2a7b6ff70c8d6be0675ceed6bae6351a7fddab3ef66f0dc05dc39eae2140fbf90c7b6bcda74c39b8b035b32c67369b539fd86cbe350dc5d2704f37fa95fd0b27c22fed13e15af653190e7372e620d8b686ab325c95612bddf1e2b8d3d1c0ca56b55e9e116886912d7f7ffdf40cc52d37a36dbbb2971168ebad359ff09471e3fbc900fc32affd9633e56470b7d7fd0d14e3c6de525e4390b97fc688db5d0bcf3ec615c6e476e9303fff2b1804398e3b1d8c461efb69cd6918c685edce9f9fc1c0da5debe827d67a2affbf7e2af62b1c9cf2058f72175b177b2ea05a646961dd2e1d7fe58e81fb19eccfa5693ffd33160b4fe17aeed8ff7a6bede73efb38ee3eaeca30cdfb58e7f0ebafd7bc158056cc58b15d316185938a2d2a90a8a05578a5884c2122c584145928faa07044d1443176e2ce091927aa27c24cc0d97b73311e817bbacf51bfa7c231a76b98cf9fda99d1a7afcdb261d130278fc09dd51f83fd45c1783d7beb74ee9ee6b28fc7143160f0f25f1c773a1e8163e011b813ec2f1aed8b32e94e853973fe308f22fe4539cdf434ace56ed42cea615ec7591ff74438cbc1ed4c28dda13e5a6fe3b8f3388665417ffdce28fce53cde8c42bd74dbaf513ee6be3e9e727a2a7f1a8ecebf9ef63b9acec658ce7ca39eee7351de0474e5d98c8f712a159ec2350df76e22410943ca127b4a4029212d319587441c250933246c90d892584082c0082a23a423cc44d4d9aefc9b4e3ee6beddcfdc8c37ffc8f2f898ebe5bf6d0d2b52ff031ef78ffd3333ea54ec7d586c9fbadc190d9cdca884f06847ca1e754ca1991110000002000a6311003040281a8dc82352b990b2ee0114000260ba6eae4c9dcaa32c47414a21438c21061002004000000484862a0061c295fc1fb938dd8fda0973c2636c76f077e05b0dc54e0f27fc4177babfe085a9c7eb8df4ee9da6dacaf466eb49ccde9fc90998102e6f37f762a613c5cfd0f355ad499d6fcf56cff46f1a803c0319fad83ece465e218b27b1c88bc98427e04e082f3020623210e9301c5e968b1016c92c7c7147f0e2add4ee65f15b0c9213fd27a34a214d20090c3d015104c7bacdb66f9ec5dd874ffb4ba7fadf2af21529d2de077efe4dd7647de06fb50f5c3c905f7f1133b738d107b62d9005d72b76a7493ef0a7a21cef0526352843eff03d6c1ca9a53192c3c6c05a3e87db80f7d6934576235a87b8ae505c2c7708ff836b34c72832767eb5577c348ee6a2271b4127ee89ae2569529a6acc8cb7a9a6f0fcdc9b10420e61df90fe944cefa2d0a3bb55a4c9005eda44d2297083f9b6c11972970ea613afad59e3c966cbf9ab052c663dbd7bef3de1b42a2d64811d0cd7b5f1738ef33e7170e1d1019e266e9f0929ac1372533c5e698ea269ab41508be5c006179db5150daf47e64375a848a41d46d14e38a959032968384eeaff7193ea97d426a268f013ccd4de538aa8a00384c1193aa6fe0ad87288797e2d34ddf967062f046ba6474a3b3c0539d3fd8fa2f16fdf8a6087f8345e1c8de0f8c7a76ca632f7500d12067a4af94a75e2281d35a9c93ebbb1eba988b53c6ef0e1491ece9fba3587f761a366ebec8c2fe41cbb2da323fc4e03397c84c684041f9313a1c087de14577a5ac28adb9982c8e063198863d3c452d8ed9b8757bb5989d9ae20884fd16c3303412b7f4c59e8311deef215fbed63ac7aaa7a47aea3a2c11e4becf1659c3e4f1f1278496dffac8ac6f2aa09e3b53345204411c975c6ab68402ac58af29a061b6b1ad81547e661e074fa886c2245113cb0e60ed188400aa496c0bd8feafff2e5fa8e02561a38b0a6506f6d113d9e33aa7a8b01e8a699b51c294e7896e7bee175b651d70ee2812f102928952de7538c57581b0133b87f9999a16bc762438df8ddbd55a9cce9815badfe17f33a8830204eb1bf796fa716b42ed859720d9a341b85ab9c4877373aacbd4882b6a4f1982a35e5db027216e9d48132580cfc59545efa3004b6d4025f735c83b724f1e634788904ed681121c1ae19bf9cd3b20a00fcd61ae6b6ea82f80752d646727418cdc6aa051edf4e4902720c33a612cc6a40b4fa54df108bc04133cfe10ff68c0713373751dedfb9173af7e6ec9c452975106e0404af24f0ba2abc0176b7b151fceb885acd65d5d038686a73ff55481198c94333a1c85104a2e83d455e8b52d6d614d5eee8ac9688badcd08bf6f5984da5ed49e376acc7d69c55641162114117d21f41aa333e5e22096b36f8fd93ef093d9f40f0b8dffe97401e05d4c551bea1ff00ad0a4e31271ebf6c98343b40bfa6a59976586f888b745b7dbd9611f8d1bfe3fbfc01fcadddd4b3c0abc8d741ea9f45c4dfdc29af47c320f58f3b70338f7ea757a075d669eb7f0872f469989ba674eb52add0219df1a779ee32c20c72b37b27bab29296744aa576b0892bd4d3a25b9d507d786b0192ca87f85a0fcbac887f8988ee9088cff2aa712fc5449147b4e0113af959d038c6a332c9c86b0ce396a8d15afd5d8d6df6eacf2844553c97c55e0847435943109cb8a410bf231fa808cac612baa65b7b8dc68125f80c8849f370f4fa30ff6583456d6d58379cec81dc9485b80a42b01071e86bf56283b1912cad1783f933cc8e6c10134677900bb323e033bb0448537fd4c4dcdfca4c2f9d9040117e00dc14db1b3e554e8f8a794a25ac37d494c491d13cea9846ba255ed2f5cdf11e60fc02c66bd69b01c4748541d8a767dc8b1d051cd810753659da87b5517a0dd466c03a39d9133938d6fcd4754b150ed41ba8eb104cc6b274d868f839913b2e5f0098478a1c9258f5e319a267a463f52656b19c0538950ee004a7639aeb247fa7d4660354a2c6960c1c18509c9e9c559712124420bb701351cefc0494f19505c764322030d80cfebd986e4d661606cb2c3c1152cb2e03334fc323bca1a5d9b90cdb7b4b8c8e36a3ccb4c0d5778ea202a07712573ac2e6e7e39f6b3a7ae94334dcfe397decc2690f5e197dc2b074091bac2ff017d049eae5dd2522f2c6930b1b3a86f1d468a93ccec37541cb24a37555cd3348507e57a7c4c96b5f2a80181d29a41ecadc892a997a363027d4858ae633e81ec45c09566fd724b5094c8630250cfaad7b753de3dabf0a40967e009bc224a478cb68c8a73e4533175d6f96fd252327fc7e4219beb7a8e092db4c61ceadd87aa508453ab39138bc1a01606fa61503d7a35266170ed89c7004dc1230e07b026d22e07a5fa8922576dca8a18af3b8f48aa5311d25def40dc7e6cbc17efe5f1a948078a9918a719d6ded8e3918834bc1b5c9dc8111103c55a876a53cbd6a415434141577bcd4c8abafd90220dab075e36e9f15ff0e77916b025bd95fd6b738d66c7ffc9e92ac4c702653a85bfcc6df366886fb6d29e85f357a36fe61c93d17cbfaf1f81de8f753fdca3a3313aa6387afd9abc7301599af2b376dfa4eb974a6a3e0a608d817f33ce7c03690b27e55c0a7215fb2c9cf3615b183df4a7db07b12bacef7a777c59a176bba61c5f18b858a67dde0433915e80855f900420723a24c682b465826a14cbccc9ea7e327bccaaf44a9d5606a44ed1adf85c2974bb59796d875bdc5ffd354af489f02499eb1da9924bc3b364cb139cf646ab74ae45d6ddc92fdcd77b923b5115ceedc768bdaba5041b30b2c8c0e10ead6bec350a6189651b420b60f77b8c257f57f531737ee43d0eab54c29485aaa7425be2ce1f35b72f69ca3ff5766b6934fd495e7ed39d79950e731f2c24fd5d37d9cfb2ac01b4d3519241fac23d181b1b98a1e4ad7b27092d3731df51ce561d47d10bc88630a27aa267f620c0e0ededd50ea15ba4f27d20013663909bb97369f3d01cfc854960c463f68ea905b629977889fd52473a52bbbb37f9ac98b06b2281c1b692fcfac554a440dbf0085126c01d596fc9fd3b2815a1a6a6f0e91927af4835739d5fd2010d6a4eb02f6f1c1813713b9bdb219bda0f7ad9e0354f6daeab803ba40e8863f9fc8390ac4ff0317f78b3cb46301369e352afca0363b119339e9465289a007e489323c1359412a5cc2042c2fb40777ef25d12f9c81a5f167e1374768a28dccf6dd10485f12f46e537df4e70d1c1f6ed02a2ee1f02fd2ab48b2773218101b1ce67abd445f232470f75d73fddfce9a357bddd61f5a46aba54862793e12e0d9dcc1f98c1809fcbc309ed0b7b8ad835c4e46df066690e06499bccb4dfba81e4c1f18aaa7d09c48efcc768457c0c94f1655c2f0caacddc8c111e545ec8551ca1585b374e36eb85652539926e5102dc5bdf06ae18fcc744b95ffb2b8f9017d177a8cf115cac6d4a273ef6a7e168fd3f29027a5ae13385a124727439fd826a964593eb653d4c8a625414fc2fd3597dd4ad63f7ceaa533e397c64851bab9fa31c16f321932757ffa8939e142d6b7cba48df4b8e1353009ffd8b29a3aca31ec49727e5b82764570e1e8b240c22be70a0ee73b62e030e4cf2f6bc61365a52bc093230a10941efc1d406c9a6466dce3a9bcb06833fc5697f422c118e4b99a2f34524c71b8890808eaf4930fcc27d004389d23d5641f62719f0fe7ebb673e528fe6dd698b84808117185c4f723d2afb9c430c426cdacb2477ed61e901305064ba9a5990a3569661a48ab21625bd921889e1f931b7c84d6a834882239c6773365aa54b18cba29887b0f2fbdc654f45ce068fbdf54f80f6cbc9fa061afa7602ee412331e97679b2d71f1d6091ce01905e03230868248d84cb30d2b3358e975bbffbfe47675de7ab1e28475f288dea0b7bd33462103ea45fc82e847ed7ad09f6570a3f42feb680314bda34afce49703bf9cba869097fc3f633a5925a0d5f4920e0ff64772f1d167c8e5cfaeb3e082f9a5443469aaa05bd598b79561c09c1cfaf0f9ea4af928e54a2bb732712efffc54b2e9b7c73b010ba06a82f28b71e58aadf46d46ec41f5a823d5a04ee003b56c875fe60ec0e24c8cadae8b059c44cfd50e0a28617addd9c7ae90b1f28cb9fed0ba202b41277b5b5b40019e797773806a4422227b2af4e457f631e1883273490e9c999527a14255244725f086d5d86b753aa796276c5044399f08b65669b8c76c3db6af5f311ae820a2754c58c0b0768b147c09e5227fd416dc59c88fed60d15aad95062ded807dde2627230c6e86330c1137c5d71a48a45f430c13fdbb640b0d813a558a2dd7252518fffa67cfa0d046f2c1444ad58619260770fdc27389ae2f388f03aa912c3dfb17228fe927e04e1ebd3106bab6730b087beb07f4906f6dc1c623c82ce6d75625f5341fe2aeef5420ac78b1d9ba0bd9734d92f41173550c52bc04cdfd9dec5cbb3a7f8bc329d00461afe42a37371bee06a8ae74a8f89d58d08bce7fd3dbf09a947fa6cc758491662316347d7005458e28602d30427a807131bb7dd341b022379d7ed611704ba1c5940c6af871b090fd7ffdc5ba86d4a864379d05d32e567a592d9a0f10bcfbaf2fa603d5cde14549de65bdd3ff87e87d027b4bbdf63d025bc961b31691b11ad2661090fc2ddf071b7de2a6933b02184d7d06f786404ee17608ac49c1b5e87a9f0e1f866baf13db5f5f31c79da071883310c5a8c7909fc3c943b757b32e0660a8a869c88312c4fe4961fdff574a5d3dbb59bb0a96e4591f06ed61a51dcb567763050a5856fc0d24f15a5fab95a17fb1134fee5a2cacb8d25079cbbae99fc5a4822087b14185bf22559eb931ab37e4b87d8b6dd9a35119c7f000d00ffc506ae2879a2cf4d69037497d56548e9bdcecb69d9eb46848e89a25ca107a7768c164727dcb587d7dbbaf8bf5d4c70cb20e279efa430534ecca0a0571e1d36728062689717cbc4b02c95e516c6b187efab509073698bcbf3d745402e5c5215ba73600ed342e23ccaee48b792ad9758e20e86cddbca57c1fdfa96912053f6423258c09dfc132eefcfbf681318cd55ee9365642009128847eebb387154662b65f0fb7b28ea20209689b35c3432f03e946185396839a9648aff553e70315b50d49e58023e54f5d28032c641caef855c3355a65f03e43fb9620baf2879be0d9bc0161306337ac02c9e2d04e28f60264f3b23e43f061425d915a73d574c100a77b9504df7b8f4c45451df6de9d92f1b440d46d1836e3554ae0ade7d10b3acd001a65075108d82a716faa8a8d4b80b5941d79ed31616ce97539d1b232773c1affa2c485a04b2c6dc4a123653d731670f3c38ee707f98e265d76e06cac7251a479b29857dc3b549f0ec8b2138b2997c665d11f83d924afb51e2ba25f445e5abc38f5d0161ac9bf90e341975fec79803eb69d52ca651df2b468031def503d023ab08cd1a2a862ba0429d66844036c301129ec41077dd70c452cbf80fedab55bbfa39c8391d4faf95ac8b6c26aae576a4154ab188d641bcd517ad9fe7e2fda59f3e56605c946f50090f80396792bda1d8b77f941eac9c0b94394824629c15c6ecbe6706ac4932eab2615bd5dca47a74783b65a6e49c3c6b41b8ba7869521fb7a2864ee48476f54bbf2906e3799c8255d3ae10107a7b670acc36c47fb973534c78468c3b6bfd6cdc6f7a59e026fa0ed1e5f022f5f56f5004e5276075698c38547153a580384d061e8aca043e3b6b5d588925a870b0e15786a63ab1deadc181095cf650d5a9f454803f69d985daf9c119687e3ab0a56502c589c14b7af7850614ea5b94fdb068a817fde841a1f8280823219c183ae2936b72f4d6bcc7f3f6266ccdc6dc2c1f0b06cb40e2fdcbed195bd9446b0fb36227c525e0446ff2619143f6510a63824b8148055b469b5a9c501f27fb89dd77ded70e7a5b4994fb2a5fe2cfc8ac952f190649090ab58e2e5421a42be24402026171ca0d7ec330c591316ffac6393b302d4fe44b01c243676816229a9ae4d90a8710def60d92a94f79a34e0faa62634367ec96fe0b2c94bd6c8328e04f9a2ba83f9d33de7e6746754a52823c09d8a8ef4762e60fa53cce9c70fddeea0cc060084df49f1e2586548f9576f63f9b177f5619b17330b45574b5c30dbb31d3c6bb2185aedb191082c37998b54766c44c8bd817957be624a31add2284a746b867f37862bdffcc31bd9ad0e4dbe83438c250e24eb9b78f516f01493c3e519e01b4fab4d313354e8990314989c2764d584cf14ac9cff938e59b878ae771d67cb4b0ad1be3a0a9f44dd51e7383fe01cd5cff9b3d7df81426b0f893e2f4de7955cdba59dacbf15695b9a912fe9ce1790b8be1e5d2feebc4a36beb9834e99bf2f1511aea3907b17c8fc71d8443ef5365b434d6bf6947fe4f91e9d67f4969ec1c9263814bb319b9bcf87e51e36a46dd2d0c72cee6828465daa394c9a893cd515ae02af47fc16dd786e46a06c84fe356c82bdcc7baf65130ca6526041756c5bf6a5e7e5113c02858e7114537a17372a3e71cdeb80a0b65d9c643dd98dbd9ac90d7a7edcfa9b016437c9a3f645eec739aef28dd8a43ea798a15e24c8ee9f913e34928be99452c520308867ee188d91c707b72c77735af804fb3bae90f806a4540aa07ad9f8f4d6510bb6b91df94055ad9b742f108a07cbda7af19ca6330612955d08a171228db0b183973eaa950f29fc1fead56e44466bcfbd207e990c9b20e9b532e11acbfb62fb6fa7d687ed1349fe69affd0789451aaa6ad4362684280a50219ad5593d2303d50d146d229a475c7e8f93888b018b595c9a88b82b26f8391f3d914e578f274d00bf6c4da2a86da2efdf95111c7011cdbf8a876293625bcfd614a34bcb945013793e45f2e50bc99d17d2a7514431a6e148815c73ec10431c38021fa47bb5dee7a0012542606b453a749d923245308df08f4a37d9eb4dc8c5774fc099a3e0aa56b2f8be70205e12057a3cd2c99851d43aa3f18361f023765b455c0ace3793d0b1d9521c1308dc357d47d7729c66517e5abca8707f312593d151f2b493fd96dcbbf8e76f96c0877e71d82d3c9a541fd7eb4e422b1a2eccefa3235ad20fb455308cb78f9ca727555c473d78bcba5de9698ac759659ecb3d2f0bbf02bc80fb8a9cc99207975485ff801013ad30b3e980b6885d051bc43fabbe31be091e74d940e0acb2d5ef58f7d2e6ce4abf418f0d3ece1a9786609df9b8f137d90e5e7d5df5d7158434f308baef1a79ee0769f4618d6193dd62c01a6f838ddb7953c041d84c82a146b3c6efd3d6713e39f4555c4dbe18e998f4b4d26c37939e36dc65ee0f7c28a746d114ad21a961753c018660b503dd9a1ff74eb11dda996c07cbc94ef727fb945155df1c37cd2724d109e532a2c9f97eb6760c4ae5403df0fbce72dae11267c902383c4b231fd25f4568b5b993cbf0962d605fe93c78c8fa12c30a7baf6c52c6d33142c3d54e45b1d2aeab2bc239cfb9495de19b8d80f1c1f7ea890e047785c3498e93f60a4ade4f50daf045655500282fdf3099cb9d12e3e93f2736230a22c2c8fc19bcbf98e0001247b1ed5bf54d552c5d16f9e554f3f4bf36f0fb0d88d31baad9607c52407687f2b05b1964f5a10071b2df7026762949690a0306197a7d1f9b0e431edad9f2bc95da48017da42c571917613d258fa4e57c6ca97ee3b6097c2f90774efaf2fb864693f1e085b38594a97ac0d6578b780055cfe452691ed53c81aafb3197328f81a83ccb2d4bf8c2670e8c1f6715815403df0e581a2bbbdc286aedaffdb0f5e0d5fe7afc1f6d8c39040b01478e195192d6df202cefc8312aad91173fe3a4fd4df5f3263076dfd4624b8fd534a56d2d5ad675ac1d921fbae9af7aafb51612966ecdbb1de719cf8b06cb4b02de9f1d344b73a93060f2bfb09ce8130131c59d88d63798c1e519c023079b209f1b161bc6d9a3abf350088910591a9353732bd4794de6c1f8827106bc42ca92d1ce4ab34090ff7f8a768fdab4d3c86afb362e4188c844ce1a0361e73f690f86ecde8decd560a52ae674989b645b967c91bd5e522d68d1f82fe32ac7da1c9fe9106756d5331d36ba041debc4e0fe21c28d0230c32d93ab477ed8faf5142fb4fc6049ea2a5ed6dc4b14dd494400e9bcff17325da09a478270a16b52e34770e9247797182abfb5601c7868a8e72a1c636f6f031f2bf6d01def20662d133d2088868b7d11e1e382376c0516ad60ab79115f0c3d6dc0b9eeed837eb2c531ec12aa9478e0535e754cbfc09943d1817054b125787ac875d8cd5babbae4f2294ec6622b05cfde93fb1dd2ff25c5c5397a496a99d3cde4559663179931eebe29c425e35cdb0faf57db611cce33ceda95730e33888703c991fd653064002ee61aad896f98c786172c1019e5b71884cdad8c0dc98c2c421190e442cbcbd3157b0ccd6073e1843a4c142f9291ab62f85ac0517e35f671da6d919debc80a0dc0acc8ec636c35f661ba902f592c42dc7a244202347f47fe37e327ea72444ec91709ab845c1150e0de5079bd3ff2859069cd7373e5e0eb4e07328604ec3539e6f62cb678801b124aff6e63ee076372c71fa09c4ac26bb3e117f031b43665739e380a64e17213577998b117686a60ad936753eede160918944f0cce48df9392a492ad00d10e034b72242645180cdd08399b8f5893b1da9718a21d30ad84867dbe42d7f914391fdf1bb828ade2f895274610db2e77aea907edae3306f946e58ee9c58b92c03657dfa2db2fb4a749c045ca78a306a3024ff41ed990dc6f6f99d16f87cf023cda1c86fdaaefc6eabfc49618ebe7f51cb748949a701d31e51a41347b9b233bf4bae3ef7dfd83c8e2914c4db2f15ffe74a380d60e914bf14accd43200da9fbd9d40867ce8a9ca6778cd0411f67d4cfb6ff96b697cb892bb5e68fbf029ef767be04164838dddca57feda0bbcbe225f1cdb3e4c6e9000aeaab30f85299f508a6b52970282483d774ab911b6ea33577a4ea81eb93daac04a4b2987d1ab4e9160b5c342af923b8f42548be17db23a1f381c3cc530209d3e8209c42e4d2a915c6ce11472a484ffcd67e16fd5602c573ee5f2206d21df14c817015eb8fb66cdb15cd5591c7791cf1ebf824014695d8e230632331087d2ec5ff87788c11b80f03698136cc968d0f8ec3d379e8527600d2efa6c52f36a7677d611ebfba155258b68db54e4ddeb0ea2e8764fdc22f7a026d6a428b446fd6eba872d0216e5e229f0dd2814b39a0d0bb47e50179a444a684198db1895dccd38dc2cc28d9d5834b25619d16926183c119094c00a7079ff2b4eb4b98f38c361de83f5ca262c7e3d92d740101292d6ceb493b1d45b43a21e97c5091108f1874447a3ec0fb543426c5ff5431165bc866365aaee1fea9c2448f0a231ed3aa5e232d9e4ac720c952ebdbf69d4d7c3c00d60c62d63bb1e68c630805ecb9597ae5d25f7f45e89b7ed3ae9d154cdd2ad7ca244d056374f2422979bef8f72f30b7ca219189ee302aff6c8d719667f70f4ed5d6088d086c51dc39647765fadcbf52aa0d253d1420062eb19e492847188108eae92513f5232a989ec21832e2dc9710f5636a9dfc926044f4b1300b1c120fd19026efa6a0e0bb1c6affea46e26bd054ba3af16ddf7fdf71f938a1d55b6edb35e2f1cef9c7f4c4a8bd50103bb2de02e2bcf244e351e149983c349c123ecd1ea05b3c980bffdbeaade28307733532c629f2f656d99298f802f9ccf618e4f0599315cf64bde4ec10edaa4a13fd303b7eaf025b01049a0277eaf11dc04842069c70e8c6751c8bf51cfa9a65f61b739b07c8308f1e1c3d84dd4d9649c6efabe3ad80897304181bc08e85ff85ecc0095e5ece7e8694b29c05a2ac876961fea96d956e5cadb0c23ef2541e3ace643b91b7bc799058b2841bf9d5bee81eea3daef73a639d52ac9b59f8cd732a01248e6a12b3c2aaf390def3fcfff5f23b5e18594e40eba8fe2fa4c892b258d3559fe0a86763b01156729e05b112c8761a4cf7c6e1c9946bf56220eef5ca3ef6077d3bb2dd3eb6f568e056631d439569161c482c47f7c648b1ce3761fe3dd8707a87f60ede7f6fc4c72ccf30afb337b31edc93c707475220e03ef2e1c9291ae3d6dfc820abea42f1ff72fd0581b3fb26b231cba8648c4e135b267c7a8fadb71fbb9f34e88f639da5929d404273e325ad9370e89870a23f3c9452676d561f50c11c6f4a072bffde97901c2e821d59906be4dc655478747a3220a2d1298c0da3dad187bb824f3fa9f132e469b00467947bb0da12d09b407fbe3d413f6dbcd00899d8d8c31c88d376b8255880d515dfe1fd33fe2f45dd67344534ed37845f5c4c0fa6951ad9c46d3d251c6a951eab56c736e9fb9e072c54b4a048241929faa18113818be1c18ba96c3c052f7a78ea9b8e5a20a6f630373bd1f26bd699950ea6f18aa8c2d7875fcc99bc8f715cce71c95c98c7db677ec433fffde3e5283055d03f330b0de38c04fec1d684e8fa73429e7bdac659b2282c1d80de4c8a93aa78fa36a69478114fd0294ba334ab50922fef623e43bd41d7a415ff1217f6c09d8fdbc02d5183a2af5dd65fae4386d3bff34de0db2f5516cb7aabbfd1d70b212e1deaca14672a4879caf9edc9d10f6d03185dfe0bf1506a3a57d0e07ea5b5adb5cdab3bab708b49df05d2d48dd5f33b6980eacb9d5970724851895abc7734016793d6dfaea93b408a3fa52bc412a6d1f3f908532f3a57987ebad8e615964c2d5cb2f60449bca5cfe33865f8d2beae47c1707b7176c3244bea1609e61cb6f72ae5cbaf3a0e26d129de26eb15d69b112fd992ab9304b3775d2a1f339b677139c40d263903814601b22968d19d3c8a88e0233c8a2ce244ce5dac5d735aa9a665d141a246d8f6df4ae8d613bc2094f03e13be398e97810d70e13d9d4a9b0db70a1a52247d6097898301a9f00bda486429ea8b605f76cc387f29ec73d1184ef9708378f75c4d248689ec36e00c76509fd7e8102371259a6994c04b8ece01cb3c6cc50d511c7be83839470434fc8a696f6e15bac45374c277eab15f0aed62a788285fa08982a2442a278e951b645115fb715c21fbac44e172874f788b7824b538148276918f10aab6cf3a735e8427653288f2d069a9640d13cecffa11df7344fc1aba75c83b27a7d16026d575e01f496b75e3f8177a8065dd4c2d7a23b78be1c1fc20563e1701823813cae9a7bb92943cf86e72a3a14f9a47380f0a197c8a54153a40cf39cf370e6590d5c1b084fbae705b33f5b3a0b46f7c8180f37ed2b52f5483de3a749dc7c411025e1bb8dd6ccef685dbb69e048c600029d57aeaf1ce02c50b5a655a70d50d4eed27810e3416a0c2350849231ae20ed437ff7d82ed57fe8f2ec9b42182f75ff619a9a07902392eba4702db2431cd03e1758b26088881390f8d3d847966be11322bac654875f7c9525436f53426b0122edfd358a261d1d95ea1eecb79479539ad5034b077469a524960c62bd6ea031dbdb3662835eba656e519e70ce6dbaf9503ca0b6ffc7cd923678623376d7372fc4b7e834fee65fa7a40e33440c3a180115f00f7abdd50d585b18493607b3b595dcf68ef296044d17b14085f189ec9ba560d6c204e17876e90422dc1229193fbbcfa0ff6d805670e8c8d63c249795864b5c543c623ab604b194d3b405cc024dc4e7b473e066415b7f628393fbdcc1eb366175a7646055fd0c18e77d20555be379e9db054099fac90296a7be5762ef51993197284b8d7d7348ec07262e6996ab8e8c38fd4e4bec15cfca77ad6a185f178e33c824a0e13ed63b341ed70bb3904842226173079046c3e57c02b693bf428406958523619901350ce4d5dedaa4ee0342abb0247d6db77390341fe2f5097174a3f2e5d0bb0e9301b9800bd10c51067625a473f73d962640b50eb77467b5c6671795448a92770dbcc26febc0b381314f6ab09a1a0cb5061b7afd31187889e053cdfe86c8d99735a782c021a271782feeebb88df5d5c464c57bb1de055266db9c78fcb0cd94528f4c01c40e4ad02becd24b6dfcb2a0b4f4d53263d22b74c42d3fb7514b038d5e68304b554104e52b8db9ed8df010118c502d9f7adac3540e7d28ad1d036ec509f318058f4f8de1d584a3446b8efc71cc74bc9806b4bfae3dfea3c914d43af16bf346eba212251df9eb51ff20ed15a7f56f33140dbee4dbdbd7a62b28c3d7c96f83633e7c41299e563b77baa6419f60cf1945bc93850d6916cfa9dc8daac773b2a9d6f5eb31c5dd410f2c67cd01c835add3a150185cb7fd2950b686f2f83674c45cb997b052794538ca2baf2875c2bd4ce8d6569d9540ebdd08582e714b02278e905c93aed4bafa491ff85e1f1758790e01979b96109ad67d8d370310258b6bb60460f7fe30735d6cbc049dfba6f9d21a8c76f8f0264825ca098eacf001aa56e291d494138e726431810c9edf98b343a38e2bc2855da2b0627ae67908c5c29b481c50d8cc85b64c2862cc62442085dc72ce1d4aa8ddf30f167e6583b675b5d26d901a2a14237d930a4f61b7a3fc5b945a439ccdc31cc263a1e7211c26249de96484573a6ee6dbbab4596a4dcc54e51951866ca3dfd669d9ed385ebaa7aef3ca5f2bec32dee1a23cd2d44696579d023ad9b16dee1c0835684a679fd1df692549582321f02279cc177820e7a255533c37964e2a0adeb7aa42b054314df82b1bd88a11db5b72223c3be2fcec7257acee4e3e4574011afc1b57110c1e0ae1ccd290492d15b0fff7998b0abb1962dc031b862e923eb260a707dffeb1d883723eb5686158fee4fa9a9edbe6257a480d08e30b081057457506c91170607a9dfdb079fb237e02c8ecd65024b952a3cd2ab6f9baf55e0173df32e87d01f573621341fa91aba9fbb7f4b6012069f0b9f528766599f88f63fe18512be5fef78936d59390164f9ff10c9fc9ced06af9220a1d3a70d40c834bcdcbb740e11a450c8931f316bdaa65315b15b2d0d9c65f77d9375707ca2320db72c49cd7b706b89ff3808f8097caeb2b6fae8574e608ac7be4342ec38f715dbe382ba0f3cb3a7721c356a5040e91a3e5d7da368906b0e26e48a34abcdea86974b7bce12ee47bcc276a105acfc7fc619b2ddfc217c2306c6bc11d46bc9fe1cf1856509821d9f0c7be196b67a60b90b75ab20d5303ec870c3235a7e6eea4304bee7ab153ce6350ef57d364e361290dbcd01dadfe0aa2303bc65f03e5f315289098cfa7b8e8793aed192d48570f374a822015fd9b51589be410fcf43aa5b99b529c8f7a82f6aef9e375233fb752f2e1e5082b5891043a2a8329993d5aebbdd54e97b8308dc9e5ba8a965876c1d9a6854d2d35cd356faa08d6f07f4414c1fde7962df2b1e99ea6319ad29c585a49e1a3a92ef9b582e0915de954ae21362486c2873d060af942553c62d01c16725e9ad81d74473efd3e7aed744daa8a0572e7ad8f6f754e66c446f5d1a2b347b03b6cf7dad7ac537fd4ac896ac3008b11d259b6c50301bc7a560fe7db6e319d86b03f23586ced88b22451767f1d51484f52fe11e9b3635acfde0a0b751fdb1336d7a98fed3a42e216578ef55057b1ee56ff562c357ca4a6a648f56cba6b51847511f13ca8be41e96fc5d2743590169801dc759e41030ed11dbe96cd3c7cc1805b952dc3ffd27342504ac419fcf94b40f3555881bd5d560766c708209c5612994157dab1362606e64db09fc4d2928797f582b67fa0240a1f8e0b172eb003ddbeaffdac61933b341b9fb69e9c2c650c506b3152205a03f3dc3f1b79acec9d639103ff018523fc5270556c595b36b0200716d4ef74d300ade775319b60f3d6b5ca48539358283e60a44d876489b807757afd0cd3d4365aa651a693c70220064ab06e109faeaabf113e4acf74a7dc619e6c749dbe325eec3b8705dfd9c99a6f6067fa507bfdfdef6977edc2494454a15810796bf0db1ce738e1d2058fed3824a1ab87130a23d75c2ef5b8c1443d7fbd48d3f4b2b965807b539e4336853fc8775693a432a69968235875de3550beb7190865eefe42169f4e3185953c04669ce94200f820c657cd7c63a886492d4ec6dc2f87731c756712f78602bb17c732d03ed83598dd8cbb4f789daa1156f4513ff08162243277c676ac6ff44ac50bbfc5401c32a76d21dae8d523e0f5ea4017aefb900cff7b8d6ea33d74135943378da8a4219939f36880cc771aafc9666215fe07c06eaab4305baa205b523a95d171c5a74497cb82fc84c379ff11f6568d464f7b73b7843c811502dc57cf147f73b487ef9e9200fd9dae6bba5ff39aa68a585e17fb13b5c843e3f6cd8d874cbe6fac3e954a4842a7c2e9a1f61753479ed042775834adc2bb589e0184e886f6fb37f81dbf245d864fe4b895fdd206ed6269404d772168026f64a6c0938b9c0772e2b2425304bf89b138386440e6bedca183d9e2473b19262eeec96fe2ca725f8f39285aac10cf86bc732d53a5e6c22038899c7a1c6bce4a25b14650999354138f4c30619e519c6995601e5920521e398104eb53261213c6e4a9084d61e49b875a2112096dc738ef3456a1c96b60cd4666861a499bcfb8d87df1a2713d22b63987fd9682984d991f20e5fdb9d728ecd88d5642b871408dcb8458c3408ac562fd44a48b8fe01813bcab62a8f7b14cc1120723ef31d9052cf9ea29048b2f1345ef78f56b858798bc2b14285115c2c182b76af20a60a21c48e7c634b7c08afca667954dff6048ee6db5d6ed723a8f16ce864338cae2aac1b9a6ff5dd0144a1b9318a2ebed8d668a7015982db3b203b3fded8fa48cc0c6ae2d568e6dd4c988971ab6ec6a129e06850bf05d4b7e340968d3afa3432234d8987787a6f92fb1a3e6f93b0ad22a585c3934783f2055a509b59817cefe7b478380411a7bbd5dbafacae1b4cc851f7ea742847d4f6afa53c31f751266795e36258c019cab4a8b04b81f5dfd9ae31ce5c1fe4e0fd4c01e6060702255c05317217e64f613b31581764e9c1a735372cb44982743032be8fa51eb2722c9103c5cf70292af45cc6c4ce80ae430b1a3725c338003c99e0b9828d4f189dda309971e3948d101e0803395eb8636f9ee587fe1845a20a5e4498fd60f2a27203283d85d23eca3fe29ca059577cb4868009c8841a2f666525c6bc369558e0c3e38c46e77eaa1db11f06f33914c321ac807e47082eaae678b7c71119d27757943174de4b60f24856f13d3d04ffb6452c56196c86deae46cee2a2e97d25a888af6fef9b62097705bd463be397f16a9f8005d150a8b552d14927a3827ebfa8d49f6dccdcf24665aade3a8af56ad4d19c29991a5d9f8b21cfffcf255b4552cc303841889d8da82cca94495bd13b3f031782bb2319b1b40c843b4785ff11d483ef217b00d0ffdde2bbf6f51fe9e692b0f2da54e67453beb4c9ee1d2d6829eedbbf309747bfe697087f75efc77104e6eb19df6f286569e2cfc6c8eba26c91e7cf2c93250c42cdd8c58de2eb50dc1d144fc8ceee30c728fd0ccd1629a47a5fc10b9de08c20f51eb1b264cdcc7b746fc048bdb86924cb6045a8e75a2c22b73bf7bf2e8ad051717b93f1bdbe2b2a85ebd9c771a72862a58762b0c269ff46bcf0c3a151e77e22f89e8f8defd2e39ec8d0fa68adf01f25bc644d9c5034dde77b7263ffc9dbe8341b5418d962dd0de5a752395346b064587a48458c04477c0dd0613466eb62d62dd7bdb6a0962bb2d298cfa20869956af5d399fc248a8905f7cb05fff512045f7d0dd1a187ca2085b987d7855ffa55c50f636733a6a81ef1fb609201fe598876f9c7903f0b38dd18b06e168a6f388f2a6d6bf7a655d9a7f16b90d6d5b4c225e64f50280f71c188ceac41044c06580c87889bf23ec627106bed204aaf41126c844001a04fb67ab392390ae4d0ed55f802c91d9d1519f5bbe45876640548568fe458fb6445537d4e2129d09eacd0cef4b14bd45ac1be128cfe197cc21477831e01c91fc33e1a93aa7904bfa5d043dbaaa676bbeddd885136505dd6504bc2ba244d535725afaa88f2af69adf49c553126dde04a3b6748fe06431b7a0acb76abec3acba020c158e653b4200c3d7d9c808f083df91abc739d976dcd5f81ad8424d1355e32733dab39739ed9b06d820f3ec4d7b9de12f0fa06be679d5c85e23203680e634f431cc9fddbce7c3d3dc29de2278fc6daf6ff7ca9cb7feb72f8e7a635febcf1c9835086b7599bf0c1432cb505e231e2451f583b25b20d70016fa28bd61c0e2101d7d8e9b078e9ed9682504fa835a79a2fa7c3032726a299bdac52be9dcb9b55acadd110f42aa4b0b3f4669175a911695ada46ea9a8ad58a510e93ef07e2c540665383a4ab8db91e8dd9fafe5ce34d8c0ff207023c2881a29f2d07acd259ef6801d4a072c38e5500497e65048553d90781f478f65703d1a4162b0b96c9c04b4c43967ff55c29933f413dc0574c70330b7014f86cc5c943b74afe387defe54bc4767f54a260bd8462c757122e2f8dd7ae21140ad320449711debddcacf72004e051cbc74f2b6c9073b2e55664d670d9169acd0649edd012e65c5840440b9b617ab2962eaff0dd7f198b1076cbb09e9b0c52008b9a6e327e018891f857616caa09a71f5ea8f4b464121028e5c3fcfc63b5806177e5cef4fc20fa90390d88a26c41b2850e76b7c838d8bfcd20a4de9594a14ee3b91c978d06d567abf3f2b085942f9c3ebf3177349620839937d573c4b86b12b0288ceba9be8d9a5c8dadbd41d328b47420e24fb399dc49b76a5e963326c7232711d7979c88c051a78d8952639aae37ccc83b9d8e4f7621ee68954c97ececbc9929fac9d0be462b6322ce0768214876245969b09de3babb4e859a3c5268bab5daede862380ef79d492e193e51e816714ba0ba1b8ee008b71976cb7b7055a22a8809090d9efd0b54b52918615dc465dabf9a46ccd2a711bdd7f8b58ae044966b76480113e4123a30b4d425013c739d2d7945db7b901e1cf0615a89519081c40a0f823124d7c6357c7c3d629424bc1b40d8d2075f8b1eac90e4e7a74d9320f8cb5e3e356086aac4eb5ee84fc0bbc15e202b092a8394312c93865be7c677978f5a1df43a86e24785290371c09b98690e98a5647a3ec96c5ed43e85cc30f63b26dc210a7ed00d3944c1e322a5745b46db509b6b22ea34b0e5efb282b3a894ab7b1c81567f52cc487b31b95badb025529b6f0eddd74075c7c868dd731951576af53b4df58665b13ca67a1243f5193d2d80387d538453bf53a413f9bdc9f1ed2eae46ee93cba6af31411864974ec8629fc913995917e1f64ce6bae0d2289ee4a09b0920a446fe746d61d28cb94919a35f974fcd7ab844b1de66257d0f88c6dde33d8622afa66d3eff80cb8eacea6488dfbd321bda2a5c12379960a0a2f24d7cd3ab962ea1fd72b7f5a60a1d2b85d42872e172ce071b3076ca72313c4f39674d3e299b631d6cda9d6f937ddd6154d4fa6a6578a419adbf1022acf892251ee5f3f3106e064fb649dbbd3e5f7cd32bb08f6cceaa1d6f0907e5a60ca8d7664758e34490ab3a4ea6d8c094d8dfeec205eb0264bf0b548f8f13255afbe49e33ded7ac50c133ad5cda5f4826322896eed8222e9b110ecc2de4040d988a7c4e57cd7804c0499d15b29fcc60b4c17b3d1d926a516e5b97fc60307898b8815381581688df42b4b21e9740a44f4d89945073d8de11550689c225a7ce8836a9cdc69c8d5b3edc32bec8deb8fc9126372b08ee1f09b0f7f7629cf33db91f70178c045069a2c5dadb6ef13798b8f414a699f48d11f6ac3dc3e5e5ec045146c042140df92aed20ad1da13242c5607285120d69d1e820154b40ac005a6ffae6d12a22093a533a236f97a21138cc0485d8ec93e7e37ba8ff8694cbff780dd39ad5b845317bc18a22104d5c70c68cc38226d6f4f9975855de57ff2425a91788bea14b40a697df493f5c27ef7081f13bc093f89d30174ed05fc8243f6cb7887cd9401f87685e0f844c1b88214f2cb4ee241a986b0a6e7687d73627b0b851c3f4de09812a8d5cf0185042ab261b636393e49478427a52f28084891eb5de9405441cb3206e9244099774f02358019b598c377020f49f1ac2b0cc91a4e9346df395d60b369ce7ab96da2f9a9c1fe36b9f0e1766245ed7c366c133efecfbe6398844971f7ac0d91b9005794de2ff295c88732eb80f71c78432e81b4dde6ad66343da5883013635b271aabb7a39cc71743ea9a87df44711e9cfc254201790821754f3d7162450511096138865bc367ca9fbdfd1cc74e7f19a780aa9740dfa602ee32860cc2360d526b7e029a4761f6d10d5799556738f060bf36fbd2e3dd1843e5744ee85f872dc47ddf98e7695867e4e575f386a525963521d26b6c3f27951b6540f8bc7ef944a24b716e23d984dff760f812a4720efde7ba949430f2d94987209c0fde56524841790189a761f601050d04879d083c012849d14eee6df3613d7e18e1e73d619da0f97800c37a802c7643ab9aaae5ae2d4b4f77cb3480d59eb2bd54e34a3a0df47e89d88531c77ed3dee45f3c859baa6f5280e1a18930235dfd34cd5abe75c0274f7ffc7239b2e5415f4e1c9cf3fc4f48a63213581b184c541a6a00cac15262fb24f78e3de21a9c03ef03e14f21f4ab50f68ee39a7159fda1983fe41bed0aebcda685ae1e5dd27c67b89daaa1f0b44a50e5884e5f65ab8f4a60b11a49bf632577f0f69333e9864f35433148baa0df1b519c3bf36b8cba2d0a078918064c936a26cd37ab7a8b07cd164bb574bbdcd220671621152ae7ea607583cfb844ddb0d87c8af128d4ba4f89b5221f8f1224195d2b726e87e78774fc884a5dcad1f17d4dfbb1b19607a5ebe0918ab413a4db7bd9fb1969593d4ed4e48c8cca71bb7f6b576acfa2545ea8cc739dcd547fc736ab113d40e0852918ff1990a343a02ef230c8f0aaa6b1605f6e37b284b5af07dc90f87dc9b3b2837c235edfcc8a8bfced60d617306edc51e2b64bfa0e590fe3b1148779efc0a1d86d1d918c4fbe58ed25aa4d2c2177a5b12bb68f31fa5d7f22f51695650b185e92557eb5e4ab68d412f0fd83ab7dcda0ffb5a991d10b5987125232e682e750639a20a541e2f12111a340b0b0aedbc6c51f4de23de8807cf68e9a7b6fd7bbb26ca5a05bccec0bd1e702bbd93d68ef8fad67bc7c71dced4de2105c0af9936cd31c33f6dc65e1cf42ee15e0316b6747bf49544d3a9bee4f39949b806f9bd8792c95dc61370f7346e1bff2615b26199c04f8c5c0dd73b17b526155d5af2e5f1ac8bdf891d21e98107810923adb12b46aa94446b083e506be1243a082b86736ccb24aac0122979d4cc210fa1570421a9794664612c4d8d3470eb03f1fbdfdb0920756002430de3eb13a55208d96204ad9c4dd2559585f0ae12d78129f07d35ed0539b2a7539e9441f9669f3750324da8ff3e749b60aac3a53be6133610ef6ca426a4c5401e6915a4a56cef8d02ef5a78e99c998ce58a23d233063fae0c744d6a43bac9a62a54f46b095c73b00f9ed1b677ab8223c7244de4512d192d73e4b2b4b65ca02d293d9013ac687eb52e82191182a88b4949749abaa99d319b1c91f6d7b7c9ebc6826fb122cb7c8868e5db259f01025da0f5024a29ff50c99cf316fc9dcd7caf85ffbc53e94e0acdb9dedf04d59f0c7c06b747688389a7bfbbfbb6ab8cad01fbdfee74b77fa00446c937aa7d8ed8765557b84cdae77f983d068f3330d7c2ebc367c984027f47e247770d61d76f69879cd7ce4e50ebc83f5d91649f0d393fb30184e9f010fe192d4da5f1a3cdd7f907a89495a768f126979f8442aced3e2b729dd79dfa9b9bff310d7a9370f4ba050e92bcdc63f5c81c9bb8b7f4f9d89e1c1bd39a05a1e69b5b230badff79a7e8cd37ba78f8735f50ed7eefa1dfff07d9c05d721f916a540f23245d42a62bf1c8b55de437c73d43bb6398ec0f668b612ac2bade5550d7bb8f0a77fa871b19de94c87ba0c3c2948c59618c174d1bb660379db17be3bd0bb0004b2a16232ab9efe39bb045667bbb925962a8c21751ba79fccbf986f34cd06472e34326252bc18e57cd6189450becabbbc22d8c1c51d6b5724da8dbdda3b80f465bc4c213ec70004502ec7bc4b8d4fa52a2d5bff546a35539ddc39535526b418e9c356865e6820d1654f54a9e9ab3eb38c5642b344602eaf2972ecac562dc2f81c40d44188d72644d75abc0cf3d6632d913e662dabae769a2ead1a43e41efa2015a7bb8566e4944486d523ae86f238da44a7c95ab160f85e3d882baa52c1f6942aca29f9cceca71ff6a8c17c7d778c8ef0a615bcb6a515c1ba4ac49eb1d266c9089a3309f40bbe6925939cfc2ae8df39e325ce1c116e1172737e4efea162932eeb64182167119cc5cae704aa01d5e052145fea4952b2a8dc1544754c610e31ccef7c384e8d4c72f6f5f7c2bf785cf9782d03de7491aa9a15e2a2939d4b8e2c12201f59bdd782f524734ef6f868c35d532f309f51fb8b5fb131a9c354c6faf62c2d0aaad630b37ddb9b2b9ee7dac8de80d2e787bae910bdbc6f5fb115cf2cf85be15a7b997f5c8b015d8a014e0a6929126579a7b024812b1b9273c207bee10473e179eb9904901e44dd6922ce1ebd5a7739edcdc0e87fbf1e2ad8fcd29865d1aee956de1fce7547a95d81d027a77e2cca1c80133da4b9dccc067f866adee3e3523eef64ff3685d6da93c597b8d38a60ba132a432d71ccb3ba40c4d30fd26e9c49abf01b740646de6eeac14e9a706293009643901cc48ff8cc7a1054e434b885c2834b59af9cda80981b547c7c79763f3bce4d5c32bfbbce3c218f1d7035fb7ee4e86705166561686cf5006d87b9c22eba5fdb33b643cc28b533d4a99a81c1484ada6c1eba5a9cd052e09eccd62a6d1b232760998231072568a6062827651981ef9c2507c671bcf9065a24945533a0230c56bedd4e1ca5610360ae96555324a44a8b2e470f3ee3a9762134d2ebfb60f55794d5ce02ff484760a7e9b4c55c1dd3987d77c2da0f15d6a9cb0772c2c6ae73a31f2689f11efbcc34acb8b45bd7a96841b16b884c5309b66e752501c5029a57f05a33066db2ab7cc52ce96cf56b45d4456f47428c4fc2cdb80f4466d7f746f0a0e77c810976d951f3a46e2351ada64dfd3f8d2373fea10ea57d393c4fa0f72dd946a088ad087fdfb0b774f84c7b226539f878c6bb844e3a7b0cb7bd3f28bd9d43bd7efd5aa5d782d3158bfc34fb3e36b39390a0e18ecc984b0c6cee0824ea2c3ab89412b2e9c96ed16c629330bf3e1aed169bed33c653201f63f959e1ef40c0c3c400e03942b73f20f7fb0ab9e091eb7cb4420cde663f651b9c67c3755ef9082f3b790171ba61042be3e2cb31c21e3f9ac4f2c734a51aa5de350a51b1b0e75ee3c92cc626948fa38c13afb2fe5f766b854b3f2c48bc584600637a35beee8c30b94600e07e2db9acd13285c0fe0b928a132b8a79a2e2676c16e0845ed9984b112781ad7c4a847b71e74ad277f2988e0a53d55fafceef202620b587e6ce8ce4c0c939c066513147c58895df233dfdc8330b3cf63473317ca9a23dccbac11919a8fe6c346c5915488d1366945e9954eda5af2f72fae7f86c6b56f26bccceef428a8d9102a37c7863505270d3824b3c9c697e6d972813a9cc212d5a966a1859cf8839c9e44454ce11f1bd88cc9a2509bc295c41ba0fe8bf9d1f81807c04f606ac584c1530fc11bfc05c47c21ffb74edc3826e6880a8847929e8609945deb2e45a1b8362f5cbdaf41192f5928212120aaac6c10f980beb46d4a3f5bdd6eeba1840f7a4ab8de4370731323a484b128fa3483222bcee310c3905579e31c9dabe96c4a59486cac2ac9379eb86f6dcb240a3b9ec312e57bd28639fc2efb376f88161581788391a97f122a248a910f9a5a90e4714312d295ce53324e9a031ff566992a74cc4f57ade1b6411385546ebb9450c37cd5c3563b95ed466e85c59d9ef3062c28402f5c47f6962ea9a27926ccc906908cee18c98793447cc13e79fca32b0fcc4a177edf2e30dfbabf211055391280e6d4f2bc3777e9cfd3cb1a47cace78b3a62daaee59cfb4c9dcca683cb8cd71dd373579a8b64570540a0fbc979de820d138ed548aacd39965017185814a6c7e35b541b2c5a0859d5f71703820b74c3acd29e259f490761ccf8d141b3d0fc433d606b81fd305f94a232393fd458b53efe8b7c9f216ca00df44f6f73486fabb33984471e207c82bfe296bac9c4d97f782c4d44a3f72b1fdc0b4a9e14e2c978cd5a46ba6017e364c0927c6459889834d9ad0998b2a6ee6a04c88528da0b083431e8969e21b8ec76f5db482112d08f7d40d6f742bce78a87e0f4b05e4b9328221fd885f0c0eb0724c457f90501088ee90e5d5a564b4332baae861510a1add60cdb3b7e7fae192ba183880aca34401cfa87c2892f3bf9614d22ebc9044cec0cf7faeb42fc096127919e0116426e9aa8de9eaf66eaab1708eaab0c4f9e17d9ec3ca9672d38f7df8f439716fe0bf7b6dafc234efd84396d21ab8f11249397af3412c3a0fc12dbc4f60b89ef71796ebee660f9b4a37c020955d9c9f72284df88ae3cc60fbf8e893716a1fd473083a07b48bf5fcecb13e9171369c81d35fa2bf81a6695a61186478eb561172fa3d43c464024e379ed91c89b60d28f5c05efe7597f1d172df416edec4d4092fa28d87593094e8a1813ab7bf8a3ed135151c0702c86655818d5ab286fd4d64bc915ef5caed7bceca824e7700b205869d43a06ca3ad284e0755c3b43bd4c42feaee630fd692d2c389833a053e9685b89589d9c4f85b5d15eb2db12b11e6804a07d790f269a31f63f0463870817a3511bb22a5b5e9677738b8b0947898cd391b7c40bca3f103578421d8664109c122ca18e41670e42018e40c7203207a6024f9843d09807538121c441680c8329c311e6182466c1a9072cacb39171360e512008ec2620e314324004740d907132396082b904c6789a1c00415c0463304d368860ae0131964e1e44005700194b240f2c886b600ca5910f16c4051006d3c8040bec0a186349e4810b7605809144f20005bb0cc2581a596082bb066120854c30015d033392edd070b9b6250cb97dded6bf36e66ceb6083c3b527d65aacc68edaa6508aea0f05efa310084f4c1f42f3938236100573139ec751e843272bd780b38f430328727a8725ebc0e4c093994bf8b8cf4e0a0071dcc48cc57caab111cd3158ec654e1a8f14be81c8584cf2188be21f3a5e45231c5e1c1f40e1331d2da1057667aa9e34b3e848d07e0ff64edb1b55180f2c6b060c81284214d40d07ff8c2201e4486e0ac8f3a05e734d2bfa40456fa7d91b53b7095c20a7c99d36647c92ae59208ec80886371aa3cf90e8696aeac0d3d000a6ff8a5276b87e982c19b2b74c0583992ef17bdf0fcb5b06202f1350e3d755958669ae363c9d1feeb36fa4aa1923f16436fe4eb660b23a92352bbc368a1472370574cfc4c55f150a588719a83aa5479a3f7efec1f43703ffcbb5639b6105480e5d4f6e8b12fc15bb58f8149eeca2881365696e3099c94def23dc6bcf8d700e6b288448515eca14643a2f6d9f8e4facde11a1f9a846f29b5bbd8ecb9e5c04b2ecd39a33941ebd99a988c16a39efeec826d87c840174ed23dba03cd6e812f461061d32a29a2f3a08f075aaff5c44d5f3b07699bf0a83c8478cad5182436df8f168e6e81f1bf430042771ee11ab4fac35fd0549b985271ebd3834783104d71d567b3858066d4f0b1be28d7cd0cf33562eaff141fc7700f622f6f6ab5d8f6f4c53e03c20a33239400e2750f656cd69f2c9a7c44f8a9bad87593d4fd4ed7ef922b46f11d80fbfd20078516252efb8160f0fdc98de60fd610706fba67ea54feb37f8061863d0b40b5fc1f38d1b249808dc671a0ca5c951f17f70bec967b3de415d8cf10558670ccaf04e5fa2c139496e353181269724dfd43be4387e7aea0e8672763292fd95b81f6189b6aa124400ebf02ceec563dd2fc9fd01ef186ecc30f26034083db4b6da7c0f6b55f01fb664950638a2fceb52f4f077dd3531e8dd66f42386b066accc1be4ce5fcef242976612a4d88e677c30fde5c682afa30cfe2b80d65e752c3f134125098ce975e5dec90f3c66907d9e81015cc19f00e22d8097e92af6845309625553e5fb7e5ef9fc5944a2f17ec0dd6053aaae0fa9724605bbb7028b4bd8d93c564a0ab749d4e7b3b67a7c664760ad0dfa392a9e20d6b7efdaba7cbbd50951f2ce2120b27bbdd65235e1d3781b19f7f419f7f4191a1063a5f7e6d763e2c2befe2c8175c883e6c7ad23606581c9c1be68a1c12fb4d4d72530b00aca766e249585cc17f7b93c550b2fc1f7704a3eea46b390f2215a51708ca4a8629aca5529cb0e4bb4d77fde3b947b2ece2ca74a9ed84bb3ef8e21bd37bd427a4cb315ab522d819387a979d0a50d6749b957bedffca0a06c8862a34d65503f79bfc33e2846dad8d819e3d4fb6c2ee949e59a720291426852bb896ac79c1e080953c03fb286ebb0907da660fb4c9f515d63d429a8313a408c21df587b87bc1d4fb13c2d7432ad638eedba8e1421c62f2b9f042ba2be646ab04d5bc5c16094177daea08c43bf20aba874c26e079c91bd31e6b80fc71106cc685cdd41c3f8e03790670280527ff84fdb2cf99f60c55f02c718fe488c00c7e0493efa18ff2b9eb628f30f880c7f4fd6411117f2127d553d59963dbd5723fe003ef117fdbadb6ca3c08979812a3b0e8091ba7eb2400c4d5df174e89db2297e1fb77ad5b80104261215a13effccf2a2c664c747a59b3364e5d9e3c580d117467b601e3132646233a95ad5cb606211214ac334f11128f48a0faa83900288704565474c329db50076ced5fd1bd2c46c212a56f3b8f8891ed3fb1eac099bc86769bd0f33987425863d438c1e9c8c1ef941e5b425fdb4b16c20316243954d380ca637440f40696c3c44920cb3ce3ae53a15824a4e86f50c83a3844fe78ff317e95ccc8a7479ebf6eb5adba80aa36d4250c475186e68dc38460721571ccd6ec871662685e3080c7d4d6b35f7a7bb2cffc45798bf02efbd14e167bf20c4c37d8d221ff645a505fcc4baf6af5eabf6d76cee3f655b885ff95ef74bc2fffcd3f135ff627eaea04b2a287ae1a2aeb15475765d1720ecbb95fd2d691f53dbcf89bb76752f2def9ad677a6022f89c22f93f8b7347eb4c81f932a2f5ce76b28855eefbfd6f3bdc8bde05fc51f56f51f4bd99f51f8cf527e7de9af50fb95117f46ea2fa5fc8fd3ff532b006a9400131a803b11d0a8023cc880491d704008c85402195240782d302f06a6ab0152e4409f1ef04b102c14c10349a0ae0912539fb6c675012a6110a30ce4a5c16cda60ab38a0451dd4c903b7f4c140203c3885205b23041709b2a8843d99304227d00b85524ac174a9b0a815ce140b426a21815cd0d60b1b09860dc5c05632d46a06aba2e15935dc950df27543a470104839ac930e036a0716f1d0af1eecca87ab7eb84e40e829887425848e86982222265404b58ca8ab23bc85c4194ae2186f738c044fecf27a9949105617a0c9281c436195b331397ac15ac078cac04e04f05053f23efe9f1ed7c4ef0c9583d9a1e6c1c7dafdd9bd043e102c824780f301b62170d93b604f6fabfe45996dae6837d7b35d09f74b682bd0ff039eb6412b02c8ffa52d6e264c16a4e527073cfefa47be73218e5b8e5a02ef988081a7c0a039ad6822af2ab9dcd00f67cfbe74d565486c6c4bd7a2c18651af6071f6f260c5318106b59146ecc0e642ceaaafba580f80bd6f2c39c0b727c8cf95ff83a553e21edd334d61b698910f5ed514564a3581f1d4119b1190904aee2edb3951acbff6f5f0458151f0361f339934946bef3ed502e0bfc26e3d748c753d236405d6af5a14a5d77a4c5b9677f21083286b9954efe2badbdd9ae3bc5ba7ece703b9736d2239f90bc71a24d3b4c6c32b284941b4c7ad79deef0e4829d1b19a6f08667c90e585049289c72761ed9ca38feaae435265c8f3076ac5c6a039e680d69f12f33f05fc1ff38a12fba5a20dec3ca614c0a9a2d1ef584f62d97c898104934adbe7f44306996b6c8bdc1f8a82b1913a8cc9e47c996bc5a076182a55bb5687cbc31ee9d871040ef1861ae16c6a732b1b42413173acdefc2e585dccea8fa17d01c47a63a7bcd009100b43ac0cdd4707e83cf4f4a197a0587ee29a0013fe246d9007a094f21d3b02c75bc70cf58b058a3a37058858dc28a2002064f24f8169189cf5dabba2df60af0c257c126c35714adc95680edd624c7d1f506de31b37ff0a8a94cd05c08684814379e2811d7716d97f7a3d527dec91e2a80ca886b1501638854a10fb1f923aec94328c333c6ad3e06c67edf3a6ff77a3eb7ccef4a384eb26bffde97eeae7c232a7af845acbbdc63492501b3b8e49197cb0731e7420016af514344e2098aa4d07fffadffe30e8ff7fc880bf74b64bd03d7c92e056bc05080e3fb4fd32f9db87b8a728d0d251a9a1df6eb6e7b48541c51ab570c639ce843f1fffffbf0bce55f596255a15e1ab84a53652fc02400327034848812734e188420a94a42b451778a18308164b310f34b17c2616162c65ef8a87c9ff40bd46fd5f4f7c66540b9f59dd428b3c41f8a003997d39fca816fe5f54be533da816364b1455efae2f201b5d031cc11d78e1643eff75d94d9adfe62fbacea204ffd57cfe725376e97457679f5f0eeac41fb4e007af58f9705411a0d7875e295b18ab7d517c427f516092f083155460e57f8e3685a826b6324ce6b1aa87459e8d15e5d6b6cbe6ce4a4dc141206b2c74aea6a198623124f105586c5e7f9002b0caafa5cb3482cc945f54d081ee71a1a6610e31657a0cfc57d3109339de5668bcadb6785bfd79477df0b6e2f3b6c2f3b692f3b6cae16d45e6bf8e1e01f01065788b2cbc4514747415aa779506de5514785709f2ae82e35d05c6bbcacfbbeacdbb0a867755977795f9aebaf26e12ab26785735f0ae92bdab98bcabfa4de5c69b6a8b3715136f2a3b6f2a356f2a18de5424bca9d637d5ee4d25c17f22458224196280901e3df5e73db5e73db5c37b4acc7b6acb7b0aeb3d55f59e6a7a4fc1de534cde5307bca782de392f7252bc7347bc7373de3935efdc98776ecb3be77be774efdcd33b177be79ebc7348de391c6f5c166f1c136f1c9e37eecd1bc7c21be7c11b97df38aa378ee98d2b7ae376bca968f1a6d2e73f0242050c4084001f3c7e182182a48b24b910a9366fa9316fa92e6fa9f12df5f4963a7a4b11794b05edf0d1528abca5ec78dfd278dfba78dfa678df9e78df9478dfeabc6f34bc6f61deb72eef9bfabe91efdb0f1e423a485318efa63fefa624de4d42bc9bdcbc9b6a7837a5f06eeaf26e4adf4de2bb098277d3d29b69cd9ba98537d39737939637137e3355793335f0668abd99127833017933e5782f91f15ebae2bde4e7bd34c47ba9cd7b2986f79208ef25f4bda47b2f4df05eaabd9792bc977abc9770bc95b0782b3df156daf3569af35632f3561ae1adc47b2b3dbd958ede4a41de4a39fe07f17180013e0a00d203890143be44880f007cece0f1e32fd2b619de36306f9b086fdb96b78d7cdbaabc6d516f1bd2db46e45d7be35d13e3bf00031450800101bedf29f6993d381e68f23ef3e54f53cedcc2325da59ce19171389acca090a56c3339334e53d0b2a7e68ccb39576686321240e5146340543a596fdea93a1dce86eb89c3d2974facfe4a33eb744755a654e56c88b1d2bcde1be2b0b4462a89cbf566d98bb38e6ca8a699874d9cb59645ebb9aad957f414a55a5eb64a568ccb338fa52f9f79c4e479555f8a577b965b667a437c75deac90c8c874626d36ecf1020fb0556020898a4b6bbb2809baf01f08abbf9ba5bc4991b9149327565b90e1e2d1982fc668b100060b52fc001cf5d4db3b6a316fdc2ec064496cb369b9aed2db8392536ce52c79e80f2b67f3bc2ad55029b4eac5bb6b5af56639f5d6b4dcd9f3da93bcbb1e515636b7ee19d5607e264d96fe1f6c0188a9570072177a57d557ae2436cd359fa248001117ac21c18a0321f9d54841826f30f4ffa0072097ff411dfc0f3a818a1374258070c2d08fd5bb6613b705f73b8de57a7d79fd3949b1bd01469b3064ab01720baf659459aee7d478579e939ae2b5dca54e54b0b94ba3545f8a498c53715a57ca5694509d22e52495c5bc3d9cb3e19514a322beb2d974159cd99278cb24f1d6cc862589f18ad58bb5ee7ae632c5a455f38ab3e0de98518ccd5d79559ad86e9dd667c79870a3f7970cacedea2c8d48ac0e815003901120211094f099a5a2a2bcbc0949f25a129b4e5c38f092c1432f783c6f5636cd7b94622f45bcf4f86fb5aeef83363ea0c22e60aded03237e15976b3671a1bda2cb593915fbca9cae028bd51f5e2f4aa6370b6bbc3b9b66076cf84badbae6b334cdd267cfd2a6a816b646e72fbde9cfc9eac433ebb0aa966b36d53f5d9e9290527000346e80c60329d083974d012ee4a7b840d0819f0ef25045d0010cffc9ab7ceb208a031ecc34efb8e50c34cd07577240a18616a5265c8ac0c5791640e018e24f1b0d365061290134bc0039c0449e15ab597a0300fed6607d6b51e2ad6588b7961f829030f9cd8c61c105302ba8b0d36d29317020a20c7a8449afd075b4e69c1ee1325dafce801a4c6901820198de02d25b6380ce40f36a955a9d563cab9d95959512ab0008086a7ad04dcb280b062d9796eb8d972c377496fd9f538c415eadba963b6b49eccb8233f9536ffabb9dc5889a74055d61278a40a6661574e78750183811b0116ba63a73a9849d23510589a03faf3fa7b394726d9a796488d1a728975553dcbb1ab776aa559fa22c91519a9d3c451d59d5c97611f6aaab1f22b0b0361e68c612943367a9706cee4ad3bcbcb3fc411c5c77bd4f50f69043de7b6effc3b0c452ad912d5720288610e36a1a92433060afe861e37925414f127a6af8ed99ad4d33087ab6e8d111a94eecd5591a99e62f69873f4f97df10a6f320f999fe7618f3a8f0a4f0dfbc182bcd558de7e8378ef9ce18a22835250a47058a4a847ac089ca941c4e146d7d47ced57c36b9a3e54eee429cf19fb95c6f9a474cc50706c12588f4df5acb140a6b0a544e14cf5c8aab68870b3b28dc8e033f80f9014899ff659cc4a0798bd9bdc52441c2a426668077183cef3021bcc360798761e01da6c81bcc1a6f3058bcc1f8f006d3e50d86fc4f7bfb10e5d696669e28ae39a73ef4b0b6aec3e775c8fc758652914e9d6fade558aeea35319d2e221da1f7b0a6872873f88873d2dcdae66899e61de744b9b5ad570e16ffe5acb1b6f5cab9c9193296eaddf1f08687db7910bab5ad58c5292aaef82a8e17d626c659132783a7383cf22a866f387dccf2ae981431e6c149736bcbbcb314b752fcbb000efa5b9bd8708cd0b2a742f07e03c56f6d6fcc93a51b36dce071f3650b6389227663ff3672c4359b6a176b4b31569ab3441e2fb789d20688b5b1f9636d2a1bf4bfc866c9dac8f71a3e6aaf19636deb152b78af91b51a365acd9edfda80b49a0cd434544bf4aa19f2875b2beacb675ec9db40ef60d43b1cb1d94018f099a566adc3026472c0f29fc889163928f94f9657028c1dc0e18a872a5a96d6447d1767e950df6f67af51c6d910ab568796abaa2a113db14ab6c812a125e6894e2c9345cb555cb1a9448496ab93d1bca3c864ed8a4d0514b046abfa4b753a9d0dedd6ce1a11a1e5eac41e6d99bff448a7b3d7aa672e4bb45cedbdeb2e63cc13753a9d4d4bdccb4ad072b5e6fdad69994589c5eb0ff5e551a773b23874b41054d220c64f030fe82b5643f5cc46aabd1663a5f9c46aee8d36fd650a6ca8fed69b5e14bd45456a8962e5dcb351d69a3f1efacb6b491eec8149a741833c0169d068a0f86fb5f0b5e08a264d88260a1aac5ff5fd4ecbc46455312114399bcd6864ecc65cb3714622d56257bf1d7e8a9946b2998c56a3c95e493524d9ec558bcd5c32de13a8d9384b72b96a3bda785f640d8f3dda8b3caf2866f205a3e56e43293ecf2817cc4a918bc4b3d94d1a5d774c1a5f78d7a3bdb2727a25be6e4450af248c347bc5604934de6e079bd57ab4172ce6046a4caa91ae712461b41bc3309eac477be1338b5939bd4acaba546a509abc6834245a2d29564baad1622e1a52ad167b85be2ca61942c96849482fa471bcb5a4976cc7bb3dda4ba4bd685498405d24da0e27913ba41a9ef16833578ff612632fa4a1dc03434e4350867243b9dbd088a9905e23ce129b495911a396409130de8e86b1cc85c71d8d068bf568aff4f646d74b1c828af14612865fb22babd548de0bf768af745587720f0c85e1eae385214ef3a8de2117ec2726cda4ac88571280225fb01de91aef4ee6e2bd6463ac477b0de51e180ac37028771b12d19c923059baa237255049b4da9824abc978b217266931598ff65a7d3cb186d732ad9aad3e5e0ca779944959115d4944f5978a6211ab757d4890bcc46c8ad92472c477c48890900cc908025a396b3d52e4f6d423448620cd605608ec650fb8abda24884a0448911f58e3dd99662e6af2e2b4888f233d5e22be2262c04ba880d2e7cb4e088029e1915e6c8e08ec78090da0448024defa3312f4d2c23d511cd5d227a443449ac14418c6bae64ec465ba16050003205d92c397471a0e9828beb090663074c4aa11f81213007a89a29857742b1dc5550b2f39111d8254d107c8a7deacb07f1cfbee9923881532ecb8116f8eb0d59268483359cce849119193264c960c25a024894572c488100245880c11724090ff4575c8bc31e958147af81c544e1f3760d86843b2e9ade183c6ec73c68cac0c99f7d092e63f90103950d8f17e028b37144b4afc60123f88c40f1ef1834614f18344fce09e1f1ce207f5fc609e1fc4f383777e5088ff40759c30db093e0f753a9b4d4dd21bef68d19c4d9b44d5e9ecb5a56a9a775ce2278d582c7cfdf96f83b0b3e547eb67b23ff8c30ffaf083757e900e38e707e5fc200f3f1807f433a44f197dc6f8af649f3c01dfb869d383cd1a353bc820d0e1eb26d6ffda058e6cb626926e8f96ba09cb745e54b523136cce8baa36dbd5598e375d9740b34419257b74b484e563c3715bab7aa1e0889ca80412aac6590d151a1200840001200073114030382c188c4542c18864422cdb011480024c9c0055893a194ba23006411c430c3280304308008c184340c4888806906f0815301de19a9fde8c4877d40c1af6314d1196d4d4f53c15e81b3c63c06b395b4a623148c552ea3127a1cd8413a034744883f419b14c4eadab3ab88c1ef45a49f7c81eb80b0e50da69388e1274e3a294f46a5f4908f3c889629e86d5d4b1f4a08590ec031f074c9a6b1cf68ff5047590ed18dbdaeb9f12ea8d7ea837aa815805c4fa1391f24dcfc839b211f5e578d75bff33466346f64328679499133ca9fced4857e3d5919f43bc649e05d805de017f42eb3b22a1008460603ab5831ed116b583c1584e37b0179e1411257d98deaa7a73bd4fb2e3000ec90cfb4722c2bb69072ef3139b26ec32665c60f35665f051f479639141233865c0e5c63399c18c140c26d0f717089f05b9f460b4f0e393377a8eb100d0801a8c7e045a8a2a98dd57d62a490cc923bf7383120ac9413a9be647e6aedc58d09c4046360fb1400f20aefe22fa7d4f0be0387344158f375eb995a609eead5ff5332c80d9cb03fcebc7a17d60abfea98935c5ad6868a4895f8d3e34f4adde98da066ab9d667476b5f75dca937a3a59d9a59695357d7d721f815243c2099cea0ad4b09e52eea7c4e5187919aefd027f0d04b25f44e3ecabcf0c5fcf8e5f60dfcf1ef0296689b2f1b35b5fecd1b648cbe11f90126932caf7fa4de6d2fc66277826759312cf6bfa178c5b9a79d3d48766cf84fb3a3cb5ba8519340f68e750f8fdaaca400fbe375957c11215e5760b698d9f3cea7ee0409d323e2eef105e0170415182fb5f1ff1822307a6691edf8092c222ff74af7fd8788b41de4179d7fe63d4a58fe20b33771dc8be2814fe95044bd26bd6350fb75c5bb5e7e72ff4482d27e7aa31887c21cedd70c9d79be43856dcf0a63ca1eef2416122936c22da16c6f7c80d40924ad77012e3c9c1701c93bd476be0c2b7f612afc1f24931386fac0e5da3dd27e1ee96c3c78ee7fe751ac4684ed828216086fbb09ddfa80b04ed2da4d02f8b395206040a8e105b4f24e96d3f38e63af0f8786fcb958ee2dc1ce25ee4aca87683c4a28975162ddd0704194d5dba14553138e938fdf93d9120dc307c5a606a597cdf669968ec00c111d58880d540bffcf8103ba84f0e159c6adeca1eabbfd3f4cddd9fb3cb0e283588c98b9d9bcfc92367273fd2e23c94413fa4cf63eb1c2d3037944b8c2dd77d6b6b7868dd651efb0f9ad2608427f5709df48b284f782420cbed93463c83a961516f7f957029b1e67c4fe05e267439141654d68d5cc1f922815ca2063bab98cd331d4277c7b384c9428361aab7b03fc78e98d1001c24f33c95ddbbec111cc767ec387886e20602b87b110847bac20f50f780f451f8b0cce92ed834054738f6634d01fbf48de383c7d12a51c871831e72c147b740ad6470e436c6c066ae2db405cbe3311174300bdfe7f36cf5774e6513284bee3c471c2b15bfef418f41ff2b246abc3a104382c12df35a146c9647cd7e81e6f4cc6fecd0dea6b45e6a5818c092e8aace9c7a1561ff76859efb9e88b1c7b9574c910d98942deacefbf8ed03d344e9e7c2b94c9dd69a24b64b077f9cdbbf5a42f135af89d7f65498f48f88b7600aa3e6dfbfda1922343a9abd514522341260cec94e4a5604b2ca32a3afff14d705afd7a7e2f9ca8d09f47bc91c5505b57fb36a3a31c77342e539a298d79c37540b2ad0623766bdef31c500b1d85f923f02281affead11cc69e5eaee516f6019ec9d29a541c57299a3258fce385a49caaed746fbfb4509c7f88bf20d25bbcfc8507e2170dd17585a6f22877a13163db8048e514b08d6affb9c629364d015a7805ca52c2e9016ed897bdd59726450a57f849bf3f3a30dd3107650c7f3f36203d73066a3deca2e4729bc114a8542351beb3bfb129989e678994180d0fe556d39db0294ffaaff76eba166456133f357d8645d4818984f3720413c011f81e3be70282993f0113cbe3f1b52ce2d7ef6e53c35e608b139216e3d828c742b93c16ce99c0e9f70131eeab2fc1911087cf5a2c673e0fba9cf00c2de1a98b45a1b2eeaacad6bb88fbf8fa94fc2d7808c4f0d0a63bdc66000a9b5e022a1005411532e93abb7189d95c27ec7e71b14a004fde7ddf550883c8ec41f154b0383153695ceba51f6fb968ff314d266530d6c84699ce22fe51c830a00363f8e5bb4bf31fd42cb49a848c04723ae2f10032cc807633b9e84a483a403bde5fee2abd9409fe011ce35d6bfc7acaff9bee591ba0debd722f7e474e0c6570766c2c4b1f6435ad2b8c6f85fdef6d88315c186ead39a4e96ac01897816dc61316e06d82f885d8f03d99e54c247d8224f8d7654df16f72185ca69052cf57816f5d033ef45cdbeb330355670e1e835ef44be8cb546c426802b07da750491c024088cc37607699c0b558ea642072f428d58dcf506afc4340eac8707f53f76a966742d0f7d86b1fce32bcbf3163e12d19d5c98481b3e61b7f7abba1f17388cdce61597c3f43de681667056d1721c735b995b77035af35f9c194074f22662df0f2d580c7f5cbe726f84d633bfe1837fe417ce3ee568ba6f88688da9aa5c450e1adc765cd4638ea10b6fc2ffda166d3ddb0308324f22ecf6de78be6a9c0a314ac4c917186f107c7d138cec741fdecd7b8d5cf07ebe644d59b7c7324d6d6cc012666414410aa6ddb13ea6c64b424e3c3f49e23e4605f76aa2cc9c9b0e6016eb210b06ef6c1851627c288d7c6aa496cd3f4ae3f70609a3cabbc9f50f76b81b700a04b1629847d9e4f9def916a8994b1ea468ddc6dd104d00803fd38d286188d5edff28f8fa30613de1732d824deff647bb7d683d5c8d56a56f948ce43e9ec368ef2f02a039779842bf8ec7a274c2775b26d9fd5fcce83c4ac944a1e1117e653f12117a41de5dd7a4183c6a791889076fc07eddb9f71b341655c5869b0f2f3f74203e591542fa0c358334806284efba2f66aeab81bf9e38192d2dba4cd30af44f4dd06c56cd0b2be31198c9dca27f88105f19e8732e0b37bbcebacd47f703f5ce2c3f07cd1bc730d9c77f0381105132ef704663c2fff8d87a6d34165d690c0093b39b5745029067a42d7ed636ba33e997ca3e28f140b9f282b2d9b748339904b943ff19d9dd39af2f45626e3b0a8aa8b4fd3d8b5f02f122c19fe1eaac39dbce3b9d9e00a3938e75b07e2a6b38d7166c5508ca2db6ae2bd9d62bc4261ce7f03f8cb7776aee54fc3eb194cdcd7313f4d9eb0fbf373d8b94626d42764da24697457164299e3e62be63168f55986cd4b80f00b77f7c86672ac017a766967b87ba5971f29630bc9d459f3d73cc64f4cb1f7ae369956f692a08c7aad1a73173043f4d84590fa46d8ff2f8895cd99258adc73c3ab295258d42c80cb2342d1f957e63a38d02f4d641121a461813d4a90678eab14450675952b8f1dc654c2b8d58675759ae83729f789305471b8ef16a46da6f6bef2f0d61b5903de844b19f12cc82356f5df397ec408b2e8f118d2350fb5b4adeb7a1c543cd66eda6d03096d84efe0da01f34bc98ffc9784924fc6db346ac9f015549ebea648fd422960e1887d0ebad286578ed0cd02615cd47bf41a23cc35e5ead50bb68c15820aeb372bbefe6a3c4dd50701b616d15babde84e3d5361eb869967becc9c8940aeb23223a62b19a0768fed4ee406beb85d9b0306dcee858798ad8e7be9f278fbda867e13f89df2a7b9b9f1b0c0ced8af076fe418e604c564eb080b63989d7ca650ef25688699281b94545818636c964ecb9d47b28338e6aa797608828b1f5824b0fe791f96da0c7f98724970168ff0b6ce73fe53f436f8164e98238328a097bb740a6e465a284ba3bbbbf7584136c8f10e752c15b7e15232fad92588eb6c50f878f0dc3726ba65e78571049087697a7c5cb857071e4641d39ee652d1d6b897b1bc5f45b7a116ae8f1393584f419d1f90ea232a9770e4cfb02144f31e9f063b3d4477c0a7c6130dcc4728a2129cfe21828ff817dbdf1bd24fbb7a37cf63d3e7a0cbf9e03ab05f8a0c226972a8a4d7e3d538ab41cc18f4966f292dd381bf990bde7a5b85becb8c2eddf826831d1ee61e6297e78598ece08967a75b7fcec6a4943e776ca5beed7b813d83fe2dc6b062af8693ba2110cf4636e426bd1930c4b0a7dcf9a650feddeef42bd3c2f9d87903fa8fdc8e76d58461793857ec6f8d6aa0223007e31b4403bcf849d6a0f71ca5eb22f31bd87d4919bc448e71b516489261238edf10fbd70b752aca9d3974fc50be136409a9df6d17dc99cf29bd58c7f31dcddf721e6bac5dee30c9e3b35a37116d761edda03e73a52dbf2e2a461ed9102c7f6f0aa2ed881d5c39351e1d0e20513a1d3a83b45b443fceb89bbd58086c5505c744604382361418f00c08c150aa43c8c496c197fa56b2357efe991399368caa3b00f662e62429c5d8498a6e600918483ec2248fddbac3271cb52aac2fd4b269d30119c2bf87dc5966357111889f4958419b200e4aec7610a81485801a4989de77de3ba12ac79389cc02cd40c036cda8bccc3ed2dfbeec7d9316cd8d8c09ea2adc12fc1944b0505b2af4227a4faa1383169118cb55021591ff69e6d4f900c454b7145685819f003833ed11b58836360634312c7c9d2fa2e3cb289f6c27580fbb417ba70ce2247ff2ca5be7d53c3545c49c68182c3907759c52d40bd929cde7c9240e7c72ab384424e28ff840221832d8cc8d05e1468e398e3d69e8aa108c4bcd82a1098618430e43aa756c72d390203cfd1b14b4511312516c31bd10f261f9a37f548bb215b56398fe95ef55cb46bea44e17594a72720ccfdb46f3d3fe9e1cec2deaa7394a880604352d3ad902b2365fdee131e886e3dde244451b4715eca72253e185e63e20cef558954da928dd98bf4519ca08ed19eff2fa37d57e6b82f6efac027c1a964fc99e877e39c6b0eb829d1de4dc694575dff1fe4fadca050db3e6c252522cba447694c8c010f36b7ae3afa0172773619934d048f64736944eb80d12db58b8b54b834d080d9f832b01a046c0cca42e6699ceed318c276c873bbeee58a8cc78de9796dc37893a20159f9c265c7cc7a44e1f85ce49870938fa47029ad9eb50d1f6e85826dc9987bf7659ac04e557bae7116afd2e86763ce5cbd2e3e0a95997cc520e56ff315ce6dcd7250ff4e27a44e0df8f7179b8a7bf86eaeb96c60f56eeb89b9ae14d9c7d6197316f12cc7c344f63e9ad1318eddf55589550ad27bf60be1a9d53aab3bc1e679742bf0038c2999307ccbb7bb293097cfe93ab0a284b3733f44f91dac9adfa6910777e0381f92ed954a39d8441af5e3787bc67f5af9879475fab717c7b4cb3f4ae980afd3881dc90cfbbe12f03955ff9b13329184cc73084ae2ef9f34bbea33e908557d449b986cde79a8c0fa4f43beb55c74accdb6003323010d3874b922dacb098774afa78a63e6ccfb8c5946ba7dabcc5ab5a05fbe3d1b3f0011f872759ac7c0934fb63b872073202561478bbe2b036ef6bf3bd727846c25b170b076db6d1261ad277885cf5963e9f22cf8166fd146c34b34fee65103df0f64c219dc6073cbc5c7428f530ffb4d4d43524d95c4b067816f625b6962efd8cc57a43c63deb0a965cd89458e0be28b0c2d26c93937a7a22b9a921cb47cdb616bdc62a5f1df1277c24f8d260c16d7cbdf6108e70b317515e18c25cef18078214d806526b052bb7d72d8dd2554ed130872c78d72c7325432451775657a58472a5de2ae2d3f057004e7ee6a5e2d463893cefebf17feb2da6910c334e0636b118ffdf5cd4fecff7bb35760910c6e0f673ee69b2867f3878527d3cfa57fae1608bd86e271f2030f6044e1aa1a587c0f8839442144e29e51e58bdba0c666ae2389c12fecd4fb10776f86226be740edef818c59a60aa1a5ffc0ef1a0a65476b39b00a7d7f3a89cdadb33cdcd496edb0750bf254ec6d8b5e44928d39503a3eada96ea0749eb8d865f54146e3e6c04878db34d60c81c17801c13d1da8cad90a731c092e97d62bcd80e1f41e38ccb9016f9e53d139ab2381baaa4def29fb21eafa0339d0d5da13c60d4f632a1541b1e50d310dd508ea24db8808215838911c45e23bbb82ed40eca46c4d683c5c5f13de6ee5989b899f051d44c9bb894a525b7ce9ca976ecdc3e18346d3c02b83b67e5ab630cb2722ea1af773fe674bdf2772b09bdb9c09677191cf45573bbdd9afb7c65d51c75aa484a7e21028029175f5f50770421d34ffa27678514b323ca0ba286f27cf6c9916640a1682b547901feeb77f671ab757253fbf3f5ccdf46e7c085f9fe063a55f3f7bb8898bdffae83cf315bc85718cb666d79f357a2ad40455cea578a89cc8fac1060cdcda0f709d54dd3ee7ecb09f30bea5e269559af4a0d8c51395a79c4ee4aa65598125c5acd70f5a60f9b6e8756eeb696431fb0315e8531985952bd7232db6046d1ba046a09bec352b31fc047add2d32120fc0855ddf3fe0a0b68f4f175729ec02981fb78a44772a1cdaa1b99891b527cc38d5290afbeca95e2c21fa28687ffb19e6f551a7d99d1fff5a54bc1f47086e497fcd003e6d9ab8885133e58ad9890679bffa777f0b4a2e32777a2af0645fed1967d1f6b8238d0fbe86c40c426e413477cf58c0b09ff743fee53c12fcf92f35edb04648b4b176f2a0342e3e2d60fa06d1cd3ab289ff3196524cce980352721001c335582a39b7972c8a8e1470c99d4eac2430564debe0f1b558833e98e2107ca71c81dbe3b8a583260357c134e1cac744a998c7c3cf8e7ac60fe56995bb89b3c5ff96f3218700606d81fc33d8f0cfbdc1b23cae8d7f16c7dd0e84b14f357517c4c3c86899011286cf5d15ffcd51181d0e909b8d0cd8def5143c9dc7a731f3bf6fe90b97e44f8087e1693eff152a4164ea277c63cbdf3878febc4f13a560ff50da8f18979497ea96f7bba8c6f7bc08f665f4c726799ded273aa3a1625fcf27611867ac518b43e9a1557d96f6ca462347011ca68aa9ed4b84e8a6f76e2d7c9e05d02f181434a07077ab1d40d3dd81c81c95724bf3d20ff973947bb272cfd640a139ae5709a39ebebd81c78e92f8698c3ac89c7a94fe9fd03ae0b6761151e01ac307b3dfa5bb6029185b481c74cbca7207773ebec63960387a9318ab181ff4d29b1d832c9576d33e54b4485b7cc095eda050f8098f371efcf6488158dde5ce62e7766e2f842eeb70688126b16336310520b792b65d0a3262ead12ec7e1efe4a610c0ac0563ac8b5ac47acca93bd72cec463de52fe867862ee2aafda58c2cfbcd6b5a0ed89a03debdcdf8392097edf10a826eb2da9f3974bfa21335ae85eb91f836b50b792f131b3182e9c3c971965927ddac3a004fbb9814a46c1ecd9361201c1973dabd2000b602325711ac51cda7f948a68172725003758acf55007b294190346ca65b9e173fa199764cc8d1bbbda0ce0d30d88930fa44a1e71a0c64b931bc4cd3ab8e35656b30e1f6c32e5ff467ef2efe1a972be53a3440da5c3b36e03b75832de647054fb9b55f712baf12ada8eb1ef740c7103bccef6cf27fd2c7a34e7a2f1740592dc06794650e933457465a6bb721ffafc90f61ebf147d64c6f6689824f6cdcc460a0bbd767688b067e1fe617e3a5a5125f089a0921b0d653004ad1866fecf851b07640148da3c64221c10bfd5dbfa120f023a3ceb8c17961c50ac931a09b7f3ab6c01d633d9abcabed89685583ab86f5e69fa24705d95d29d820d863127402ec15d3527e7039a2f88c439371c68d6d5af783cc13a0d92c170b3fc91e9deda8cc64add6194e82a4acc5e5120d8bf9f750a61e82ea151048df3c0ae36508c09053409cf498bb505d92e8fa7e606c838f8d8fd70b656f1abbc60898906e38ae6ac6d5ae2c0c1b8a6c45bc2d20da579a2d324f47cbb2f7c7f2dec1aac3ad8212e1aca2fc884945ba744965bc5de82c6d9f7bf367fcef4a4d82cea7c680b67367d2ffe5876ba1374d5d14ce563bd7ce2be5e7ea1efaae31cb17f8c7cbf7720e952f519536c873f8da12f0e2cb15e643f8bf552277932e8dc3499e30bfd4a36f3b72f21c22512bc69bfa15b93e4fe880a7622eb77a95302d175d080c40f8b5bcfa6d3e3be3f95db76fc96a5a3ed532e64f765367bad735a73f7e96217dd90ed89ebe7fa98bafccb7acdf410145ab885b97ec8a6513c3370e86c6fdd74c9075cfad99b8db7994cc3709ebedcd1fa36cabe654ef6e4bcce7bc9dadbcb470a3e7e3138cfcbdf3018ef9bfe43b5918b8faaf52d9427cdcf5c397e37142a2d05840103bea885c50e3e50ee34c301cfcff033fc0c3fc3cff0337c66f8d1280d11a9ee8da4945212c68108b5bd4e123516292599524ae5980b8e740b00000000845150b26e2290121a0f910eda0ee932db3149513c0157040129d3f2d832ba68f69f5df8c2085940406bb5f3fd8877bca7cf852fd940f9015a64e7199f95f2c2276263c407c8f5923776d46ea7d3bbf0adf55db9a2076d0c26af1fe3513e6f73f89875999513ee750a8a45e4c3602ef26130a5c0153c40aa99694ca8dac96779c50e90d26ddd96f314dba60384b9da95b3bfb13162a0e8251b1a383481fa1494ed913058d2a861a971450e90afc96ed59b7e556fc30142c5cc681a6c6b93c2330623d92d4e58ca160c8c1376814406c6091b3107822b6e805ee1b1d9fd3ec6ab980d10bed9f5b4d878bd92d700a94fe95fe5fdab4a996880d21eea9b83499b59ef26252712a8544c4a4e96bfe08a19a0e4a7f93287bc94bdc90099bda3ccb7a9d519c52e1c03c4c77cea50b56e755461801c311733d72cf5d7e6b268f223c9812b5e802e254cbb889acaf1d3152e40aceab371e26375c64cb2452502263f72ee5a819a79e5dc4bdb2a1e6fac402dbdb362ce875babef0bdf05c58689c504223692cff862022718588c440c0c7090826315a819f3367d7eccb0f7aa02f932d3f2946afdb65653817a6f1d73b2a14a69f85cf876c6171398c1010b20103850817a21b37b35970ddde0850f0c12cb3130166acfb8e0c08c2c665860461633526c5ca05239612638f991c6bc60ab8446a552a95428600ed92a21d1bdbb42091ca740eb34b7f60d717d9e3fa6580dcfed1ac5cee22d053a799832bdd8eba9e58a1407f1cca25e6f3772a62e32668ed1f5ed1a7b478158a64b9c976d216bac4581ba755a4da132778799c4028e5020669b7e9f7c5d326a290a542a1794bf542a6cb1280d384081bc3b5d6386e16a7fee6b707c02f952db671f6f9d52c93c81145baefdc6ac3ed74a717402fd12f9e861dff1bcbef3c46cf9919d9fc5be3838817c53972976d59c028e4da05fc6b451971ff66d962690abccc698a70c5b5375e12fb898b14858ca18a852a9542a346a5854c09109e7fda6abebec60947051a9805122722c074689486202ad69d7daadb0532e6f9740d9d870d379d6b275ba25d0b3d69ca935e7b67ddb4aa0d6305b3d314aa05fbfa9a976d2a5fa9e0432ebce61fc546c969e9404c257f549dd79737dcc5cf806c01109f4eeaa7c9b3135adf56de19040ddaa8e5aa6ad2d35658f40af2b8df995a69d3a293902b1d396a6d5ec4d3adf2529245b94a490849c9c68a19889062a95139612c2b9058e46a0c64d31bc959e1881b699943e0f9a7449192f0239af639ae135afacf928027ddfe2d7b5c673bfe98c2f2650a92816c62602356eb398d9d6a617725ef8526c94a409381081dcfb337791a54d5fbcf0b56722291c874067fe72ad63defb7f8ae44f926591b04a25a5a4e484859c7c6122e2c559bca03c059a69d4b0a0701802a9e67bdf775ef5f3aa195f4ca05249cb7241f9cb05e5296081caa151c332028e4288c141087478966eb7b36c2d773c83e8f33ec8c9d87769d8ea6f664ebfb9f79410cb9d8988177e4c444e92460d8b171c82404aad349afc742d3cb63c038e402067ce16d52a3d2d31e61d70000219762799d43bfc9a8ca9785b2ec5847fc0f107c4f674f6b1e264f92cd70f8819a6f2643b6c5bb276a552a9b0e564c0d10784ab14aa237fc36346cfe1036a6699b5186b647aa71a39c00d048e3da03bac2d6b4b93d02c95f4800c5b79dca8c62cf169c53ca074d432b3627886e5321e10b394d05753ed9f92ab06f4081c7740479ded4a7e9277b7c3eb964302871d504adb97ffcea9bcb0391138ea809cddda6faff0247776252237dec4a2a85259cca444848541c22a9573030e3a20c67754de78256f8f8b1cc839a0349c779f89c99b5c0ee812aaf5c753dcc99771408adb6f37d5318c99b5dee08003c285ecb3955ae4e4eafade80d2f15baa2ce13ad89fb269d4b08cc1e106e4a99ad17cdbc3e68db60129c3ab92a641ffce563620d5dcba5b6aea7276db3520eeb62d177bc59aefd7398d1a160e1770a801adb6763d9e5d6cbdd2751a352c2de048034a3d8a07175beb8d17506c34a04345366dd3f43593d285cf44e4c49c48fa55a24850a5829212622272d2346a586c709c01fdfcae8fab9a646446938fabcf39e6d370cb0d74809d946451a99c3013933f11a37252a22a3ae03003dac3b89d55ade4a9982a954aa5db72772336d809e308024719d019a3eacbd9ebb1e66440abb48d324cb7529d69634026b5fb626cb573cc3031a05bcc2cd616fb1c3ccf6140ea584bb5ce97fb995c3020c66bf774f234a838bf8054af7e57dd8a9bdae5854f8b195f70310385cf0b285ff51a66de28643eae54ceb19c094717d073bb3f74744eb38c3a51eacf368d1a1604707001b1b2bd73cbebbbd4625b5899da6176d6b3d298dc4899b1d6c60c1a296dccf862465a1b3398c98d2f2a155e8b391a352c1c45e0d0029bf63e6dcc7a9ba398bdcafc9d6fab1977356b8580230ba84f39b665ce62cefa1f33c08105b48d4f3a99d66c5be608018e2b20d5146bd5f6d6f17e36aa010e2ba04d77cc20b6f7b16c5f244cab804eb33e889dde903df7858f2d25ab37c0410574cc8ff1dc93ba9d4d122662c19500c714906a73fefe4ba96ccacf852f044f0acecdbac786fb72197bb3b5ba464677465dbf004714504a9e1ab3f6f56b3dff8102627854a19fda360d9547d8c91310c3db748aaa56b5d67ee1bb912c61842c4b62ca3901adc4a9ab573aad755fe26802fab5cecaeea3de9cb173e1db63024ae7d7b0d5928f9bb3d485cf9c1f2c389680b41d66929f3e57e5c948f28469e0244503777c9282a2845bc3c66cf6e2a2c9f3633ec8a9a9d59beab1021c4940b7da7c531743c5c6da856f535042b87024a0634de123dbc4afb431266262e30bc37104949ccfd9f69af6b0ebbff0ad06ee3a65a41901b5a6e93539af352b2513c25104a474691ac6369df60cb314935f1158df45a58272c2fad0a8610183830808579b2a4ba7141ff774e11b2939698ed2c93104b4bb969d42936e3db6c53984805433ddbe8c6a9af6df2e7ce74e52503208c817339b541d6f8cf9ab0b1f4ac9d2db931494c30104c4349974a77cffb0ad451270fc00f9c26da735b37ad26437b323e0f001629e38375d22372a8b888d11731c3d40de16a6ab774aea19c52831b188d81869a36360821182459f111b24c90374f498e4ae3ce9a73a0d393b40ad9da3c93815d34f99173e4c0a70e80029edd5969975f6c24752323252a22c223f12e2b81c3940cce7ce8c3a2713eba64a1ac9162a84e4bba85498460d4be3c001fa6378f293a5552b3b677c31811963ac2dc020792f2a954a05c5a4e498460dcbe2b80132b8bd669d74ccb5ae173ecb0d11fd00870dd0a6754c6bb8e93bf3fb6cc15103d4f0ccba1ae5ac373573e14b3129697edb1c3440ff8c9dde6ad7d84e9b0b5f494818967552622129f194931214dd19a094bab6d952cc0ea32e19a0e7d4cfcd4f3b6c7a68f2276290d8c83bc81103a49899ce3ba3d8ca631114cbddb2b0117631f91330f6f0b80b0e1820e3861b338b75a55d8522e9536c8c98e478015ad9d8594ea9fb99b25810454498520e1720e3bbd4ee62eacb5f310f8d1a9610b400256fefb6d29c3427fd562a22224c9943a386e5032c40d8b20db3bc3ccc89cf6229496906ac00613693cc30f674f828f506a800799fbe4abd7c95b5af0b1f0ab394a4aca700bd9be3eb24c3f49db9311983a100a5b6db3c53b54f6892526c594a522c7c3c6283640137107b4fc6abcd617a6edcc618ed87ab89b54f35ec9518089dfbf3ac36c6f2b4d3131286316914cd323b1be7368afaa61d47d5163ae3a58722b0814e3b9312fbc2cb5dc731530a5ae65351591fcc4ba79dc384820eeeaa35461d3e66f96e4d4642f24f10c366d2f5322665aee5be80132075c9a8cce36f9edbb73541e64cd354f8ac5dbfd3850fa5045dd3eca3f0d7399f5e17be3d0009e2d3c6cc3cb375cf9d8b24440c121b2524963e058ca05c35c9b4b4cb344d6c3048424ce0eca4441911e49cacabfd8dfbfa51ddc20468711dcf5ba9d4ce3a8b13280132c7b4db518a2693a27e31430b2f66e00442d0ea95d2e161d80c43bca4c005b5f55f979eaced4f5a0706526badf27d3a7f3bda4e52504c43a9a93b2a9bf388949424a551c3420186b631638e2e3b375ffa0b9f052d8b165acd98aafdb2fda55d87115048e9b247c5d75efd51edc287b2584aca8fbc89df03126af8afde2cefbcf3f0856fbd49561ea5a53a5533894f536fbcf0a11624409ebd0d3db5e4fdcaf0854fe44fc07813bc1396e26d41c95ab14ac9e9b8def2d2a861f1c008d035ffd5ede4c175c9d9856f0b2002849dad992fa6f4b9924189002f8d1a160e8400a567edd0b4b5b852ea18cc02868dc496e59cfc0551f8e42f4a35000254a5f69855a5a7f90b5fe3d9b0a48cb49e400dd416e7696c559f3afdde78960f201f83ec7736efceeff4f7ed69dd545bd38ee9b1616128276fa237628324697800dd3ad7e4c6dc98f0f0c267c93b40075037f584d914db4665ebc2977252929e001c40e6d8b4e3ee7475eae4068ef6eab5e749d453bc74648691db34954bd1b005be407fceb03aa87bcc0e76ba0690d96ebec4929963e31c867b81162bb3a98faa54cb98e69d01b4b6a5a31e95ca96795def027d328a3ff154a5b32e85a1ce184047a9a2266bd92c9d9abc141b17e8141b23167f008d5ca757f59ebbc6abc00556a67fdd86ed4c6b07035cb4676d795aade7d351ce8505bead946f98797596d2c345051855f6c9938e5147e96f81941fab3aa912a761fb1440ffaaedfdb0a9a5c9bcf704d032c7ac14b2efea5349015aa0734c3bbcc6d422ee71890210e2d7939252adfda436ba568904d0c95d86a9322a356da8063d0bf4665f793aab0715afbaf089988c8458526c8c3463819eb14a2af76832e928b58008206dbbc6e0699bef4f89b80008a095f03ecd5eea4c3de782c2e701c824638c0dbbb54dd94cc2c260292523252726870a70c0328dfd27e7eb66329dacab4003da3c7777bb75c6d5f7c2c76c9c2084c4860525e460800188fd2e37276eeadecf5ff8526c8c2c00b5a42db57e3c5e26bd2f7c8a85612949c95380b7f32cf11a678ea74a4459f02ce0882f197ed3fab93bd35ef81a0b149672232d8d1a166c9458a65b7f2e9d85faa75249b15172e3452a153f346a58121fbfb36bceb9d5d9192f2d65dae8dabb7b6da9cd306843c464240477c40649a68cb4310e6a7b96a72b5b6bfef32e7c2529242196bbd38b9216b533e6fcee7afa7ffe85ef2c2a5a3da7a5373eb5385b5ff84c4a4a442c7a4c24351e8d1a160724c23c698f2b3dbe4ef55ef89a9d946471f21c4858e81d1a352c8c23252516917562b104e050a2dac65edff36dcf0b5f1f9bbe9100312ae8543377ad9d6ee5e9f6c277c24848422c782765a41d04047e8967d7d9ec5de71955ace9313449a9344df04002624aad43c6f6faf4c2e37104a48929ced74df7864ad9726904d40e9a653ccf5a0d3bbb87e05104b45ae7f9c312b32ff34579912c9c081e44404919ba2e578adb1ae71bdf45a552a958ae77e03104b4f64e37755ffbf5c73d8480f2da3a98987a54f53917be31d8056ffcc9c9573c82805a42c7ff5489e75752954ac5720a25644451ce010252d6eacc3af6a63e590e1711c002035c4ce0a48cc1ce69e1f18363d38a9b7e72cf317cde8eab9399e3a574b917be4391cfe3110f1f203f26ad7595e98ce6338f1e2064bcf3c552bf070f50aa669fbcd839e7acdaa451c3921e3b40689a9f83acd92cd3e61e3a40095b9bf44c5bfbde6c394098c71f9761afd8522d1c205478cdfd12d50df4289a3cae68cee49eb7fec6c793b1d778d8007d2e73b3146e0d10a6a74d95ee573aa69406c8cf98545e4dbda566ea3103d4362d569d98ff4245dc82870c50d2ee5387f91ee38577814aa52d1e3140eada67cb95f7c6a8e90bca5300cf91460dcb161e3040eaa4cfbf86261dd37679bc00a95996eb8cb7eeeab41e2e703dd7168dd2b5173e6f057a5ebdfda6b53aafde9888c5b21ae86005326c693307b7f9321a8362d194931214bc8e55a0a3b079bf39ff3ac556c5d9d6e3bba746cfb9e36b8c3796684e62eeae7952811ab7bc5545bd676a5181b28d59caffef992f77b1bb42c729506bca938bcc8daf5ad5610ad446df9bb2c68ed5b61b958aef498a494729103b65a510d334cc53de410ad488ee97ab67575361181da340b816d76363f66958e785cfd237810e5120fec4ec2a758fb264e9c216861da1606d7e14956a868d62279624b94b290923c46441d0010a66fc3525d5f4dca6fe114bca49094a4a0b39597a1ee8f804e2d57e86c9ceb91ebd195d78d10517334a523e3d619cd373f7a89b93ee86f7b235bd3f784eba058324e4c632b768f22369a3a313e8a0e2cf3ee6daad5f58a9546ea498b3dc48414e2065975a33fe8e07db32dc838e4d2045e34aa955df701d1b4da0f4d98fe7af193d7d74f3091d99408d17fe9ef6655456e7ce8209d48a31376da56aeb24ee4b206c9f095bd9496774d5ae25105b6fcbcc9a2fec5e3d0e742590b3367ee957bd19b36f9ca490a8163a28814c4a3e8fa6fb5c77efa7a090946471940b1d934046adb38e7f3309991a5f2597f3428724106a5aad943dfbda48206530d7e55afcc9d764884904f0b0d00109e48f26f9a7e6a55bbdbb8f40ea99b76d8e9c6d16ab39cbe9859154e87004f266de38f6aba49a3a92908bcff86202958a0aa1a311e89cf4abd8792d53b7751ed0c108f44ddfecb2cf7f859f950aca8142c722d0614d316cbd5bbb47fd071d8a40bf8a06d334c637522a153467b91b2998848e44a03f5ddec86d79afc65f44a066db121ad34ded519917ce2ebaa854f4c2a8540e8152dbc3f8bbfbac52270d81547be46f6a29b58bd314021d930c99494addff59d34108d46e3f0ddf629bac572a2119c4ed37bbf5fe8bb529ec1084ab7569731b9abcb32a10e8b0d23b66696b5f7a1820f898d3468d5edfe165e3b14b6cdc20b3d42c4dc71fd0fa94ffba585962bed3c0f103529af6541f7bc6b40cab54484a42527a061d7d406db55d67357f9547bf830fc8a8bf93f987153b954e0b2f6604a1630f68bff99964b67db299593ee525b067d22cd0a107f48aedacc6fbf40a7b2daee674d0910784cc524f953b43d672e1a0030f28f7b8492bdb1dcfff66bf033accacbf5c4ca94bcb92b92574d8019965f0b4d6ebe6e832ab0e68f194fa7bd63b6dd7d201b97a6ecc3ef8aa1dd4392095a99d64ca5a26662a493ae48056935289fd9cb6ca245e1d7140a97e98946ade985fcf354a071cdadd0d9a44738bce6adaf8b2efe1ddf35fe57ee14a45b19545a5527142c71bd0a63dc34ee22f750e182522167662625924210d2f3bdc809655bb62bdecccfdf4c2670ee5346c035a7cbb46b31733e6293620d3be156b7e6edb61ee35205caa66253a27326c35a0d5181f95572f6a624ec3ad9e5537e71cc369b4372ff39d55e3536f97161a905285e746e1275fed2552d2d2749c01f936f5cc45e3b95e99019dba6c267553df9f9c9501ad7378fb8ba96ed25e644009bb8fa9a6a91373d5c6809efd5263f68fd93d632216c5c2f05b8ba58f460d8b161d6240c9f91bb23d66869d2b361d6140df6a585bad53e4efc080d65a7babad4ddfa32c792361b0eef80252de36adefdf32b5d8bd808e9ffbbe3d9f4cc9644717103b67e56aa50e9d2586173e92909212680a4a4916e6b8830b2825e3f4e455e7cf3abc70df16d03a57297fa99494db519407a3570be8fdb04fb5a3f2fc9e5221234f7263594efc50471690f9967e099bb9755c5527e058407afe9be61fb5bff2d9a151c342828e2ba0676e98c7995accb2a8542aed272926d96105a4984f2775b6afb56c7dde5105f498d6e839ac7dc2eccebfa03815d0ba4c8dacac369fe58351223205d4f0344c75769973cd7cca184c0a68d72caaf4871da3ee11a344e4c6090be39c033aa2808e595be5b7da3eb6672663b0de0e28a0f52d9983895d3d5335173e54f804e4ad6736b5546fbe586327169687928252a2d63212065b408713d0f6517f9c0effb6b3d29294886451a9607168d4b07c4713d09de26f333fefb6652a159392e3820e26a0e48e279d498935ba6a4b40472964eb8f32aab6aaf8051d4a40dd8e0ffbe55c868daf94131646121036f5cb97e2b1b7733b12d0266dbecc6a45838d65a562590e18741c011d5be6ab58b2726f26510e8a1110b7c6635acf3a3676bb5604f016b908e893c175b2ed3acbe7569e5c3450a9a48424a651c3a23a8880da69b68ee3316d354e99618448a052b9a4849c7cc71010c37635dc88bdb0474a4e9a9ec50d8c949c685119a34308683167be7acc5fa7a32c227fb74e3020f2212927df45a56232a2cee216950a0aeb0802fa63da7ebb518867d6aad10104d40c3b7d5252c94c53eb3f408d3d632ddbbc4165cd3e40b7b96af7dbfaa39ff6a0b54d1f5dc3663dcd9ac3c776379dba658e61da5c74f0009de4cf2e255b4a0f3bdcb103b4cc39c5cd72f5aa352f464916954ac7a04307c8ec61b792f9dd58f03a728074d7cf69b24998cc3d2309b9a8bf001fa00307c818e5a6bd8ddaddd45ff82c374c4a94390574dc001df69eea11913d590d8a0dd07e4aed63f8abb5a73030b2a306e8244dc6af35f57d9dd485afc4c25010728173e3a464848d9c0674d0005de376678f5d3786de6680b6d9b99414ff9ac616cb0039d3de57e9904febd58e1820d7ed4f7ecf1adf6f83017ac52a25761a99ab69f502d4f7d9671263e768a277b800e1f2b963c76eb1b358b7021935d7e9935a86253e2b507b36e7a6551fd5d8d155a044f5aa1273f3cd0a5315e8be7dd3d4d36e91df5c910ae6ced66b5b37abd6180c15afcdd92f633b8a3904b9b8e214a8ed31d99a5298dcbbce14c8dfd7f24da655626bffc2570ac47956df5a3cd7b031240542c5ceb0caf5ab7aa551a0d4cb7879eea7c84d14a8cdb1d5e5ff1c0ad4a7949deddfc4f4db8302f16ae2fbb4f2df24b69f40987c4f1eb6df6f4eaf27d0e1e2aee3b9ba7cb57602fd29366627a5d5969fc40974c968b74b2d97696fda26d0ae736cfed82f6ee79326d0e993da75affaf4953c13089951b5a5d8cef176c204e27f6534b1f6aeaa669740861922534f36b9e62d81d259f9e77355bdcac45e0c944a2093d8ba9755f64ac92981747d9ba59a627cdaac2e7c3b0994742dd69f2aeff0bc24d0faf3e95557528d979140cd9ad8613cbd9e8d4102ddfa4aeca0a633479d2f7cf7089496d2dfc5665b53be9ad8588e409cd89af35babddb5fbc2e78d40bfd033e94abc9858330231a3b0719b9f86fae9173e5e04628b7d4a6c35d3a82645a073d43f97518e69d6ca0bdf260269625309df6863a9d95ff81411a8e9ad6ec8cccda88e5ef8f2108829e69d142ea6aef1b50b1f1a02ed9a3bf96ed85373de0bdf99d8588540daf4db645285eaeb9310e828bcb4ceb0743459b11c044aeea48c36bced648ca72010fb5b5cba879de4d309038116a77397da4adfed342090c1cb66bdba556b37fc0764761ddeaeb30ca63b77e13b7e40cd965ba232f5dccc78e1db3ea03bc76be9a7c963eeb40b9ff201fd39e89fd4ac276f5417bedc0372d35c31eb570c9b62bdf0a11e50a6fba4b8a55be8cefac2777940a735fbeaf1ccc39ae385cf201e902fa3ec50d3b77f56e6c2e77740bb4ceda66eb94a73d9011d333ddd65faa82eae035aabe6cfb06ceafda05ff80e1d109a46d5c7546635ee1c509ec68bfd6126f71895036ac30df7b5219b731907b4da69fbffaec76f85173e8403f23e9ad8fb213296f706a44b4d2f54fea8189f1bd0b1eaddf4ad361973ebc2e76d4086f1a7fa75aeefdc6c40ded76a363d316d7ad6858fd78054f5db0d725373fd7fe13b6a40da58be273c4fb9bdd8856fd38018aea412f76a6de55134a0c796c9985b7ffab6eec2976740979e8dff1ff34911cd80f63655be39788a0daf0bdf9501b5f6b36795baa49f542f7ce68262c3840cc796dff296985acb50d83219b15182bcc01563408b936172b3b78b95189039d37889eda6b64e99840131b6c4126262e7a8a6e9c217623262a30460404a9ff1fff57b6bad8dd828c117902afb76f8d9d585aff1f20a2fa053eef6e7b3f118d5235d406df93abe97aa8bd7db88b9bb820b88af653bc6aefcac3a33d902e2d3cedea7b66dd89ed402c2ef64ffce29d930b3b2809a2523afafb2ed6df329bf44449efb0a2c2067cbf3a894cc4d534b2f7c374c4ad4155062a9316eec5c2f950d0521797a851550faf377ca7ba5346af6ab803899ec5ccd110d373da102daedc5d87cab757eed05650a687bff9b9319f30a97a5dc4852407b479b5ac69c129228a0f5c78f9f2bbfed6d6c0c28a0764ca6d6a7536f6a9e943c0125338671faf6ca2c73fcc2b748de09689936ad35b5cc413db928214d40fc8d8691adf5faa87ee13b0163023a665cad5d27256e330cc612d0ea8397949d7a3e538aa204d4aadb99b5ee1af726042309c893ed39c32d15339e228c802b9080d2a964b6a5c5d269b66cef5c7104b48b31952d54eba8e2bbf0998cc18c807a9b59877f293ef629456c8c1401a9b5bb8d8d3a95d2fa5bebeff00a22203797e65e39ab4c99700828cf4a6da990353bc9f2c2b74a468480ce212fd602a7b13e9f2c0e82049429bdfafd6a646dea204740ef4d2f95ff113d2ff14e18cac97781c7161a01fd9eeb6b766cebf00e15408a80d6e23d49e1bab352e2498916262829e1a2510a2044407e6ea96ae53c18602418a051c3f205c8109061ab7c9ba65ba75aaa85173340848038b9c1669a6ad7ae252ce942e447421493c02525a403169020a04dde7c8f1f1ae7a45ea9b055a9800001711a95adbef1255b8a19901fa0d30e9b5bcdb95c532b1fa0a352625aa994ee6963dd02a40728bbd1d7db318a491b798014a66adc54dfb359792c374e521a07203b40e9779bce69b874809642f534cb68a773a872808e2ba664c89ffabb34417080f8fb4ed7af36d66c455262111179e52936466668e1c50ca6483040a245a5d22826253900b9c123b737e7d65e5252dea452b9919202101b2073961b86be7c3c5b0c46720e0b901a20757e6927d7a3f9ec2f29df855e52de446fa4a082d000996696525e9dfcd3b7b19c9458484e185fd30099c12eea3199a7bd4fb6fbd1ecf4df32a19a948f0f220374f837b73b933376da81c4002d558768b2779571adc6241006080cd062e6a02a466e7e76c2f2ba2500f202a4d8ae4927539ad3ce48c8494adf490a8a05405c80b8254ba7da91bd3fb292135683a48446a55272c25040524252a98cd820f11e7cb4029d665aac142f6dffc46674c1c50c37f96005f254a5ca8999b60a944ba1fac49a497a584b55a036ef09539d251aa698a940fdc92c2664a95181d61cd5465de1df699a25f83805627da6a9cb5f7da89756e4c3148879ae5fee848ccd1a4d41d135c14729506ab6f2d6f26d9ce62852a0b55a9ad6eb0d55df9b51a0949efad259afb8b1d6a2683ecd6c8e27faf29de134ca6ddbd9ffb667d9498916232725cd19071fa140ced4a2ca56b9ccd9371fa040fcfbbc52597f53b6da27509edfb48e1f64b8beca13c8f8a7a3a869b713ca7af6b08d77b6732af6a6f4cacd61d52ddd2c4ea0f4e43787533bdf69be099454ae4273f0d53a47ad0b5f084a481f8a48488a0d4d20d3dd7e371bcb5b669c09946aa53ef5aadd39ed6202adf23a644efcdd79f97109d49be74c5a4ddd124897195ccaf3f87c33fea804da848a2a757dc3c48eb9f069e18312a86fe1e9653ba3127927813e2d5da7dc8f37be0325627ca11f9240f86f0c32a3adb30d86fc258b4aa55241f963ee2312bac7d5685af4f50109b4a7f2d2625254dcdd3e1e813259b17de5c9f6dcd58723d05e6e5adf49996327fb68044ad6e7a872b5b6d4ea31c0072350af6a0abdd94a6467b11211cb3d0a4a480ac98ff48d94147662726cdc80c0c722d0a976149d31b72250a7a5e6b06326d9a657e8808f44a05fd97cc67f9179ba3b5121288f051e22da0fc3a6b099fe380462aa5baa67bc58550949de023e0c8158aba5d86175e9d51b73e14b410911b188c1480c62f15108c4c7891dd35ee68310a83536abeb3a716bd57010084d9ec4583727d3d61f4120664c6c39a765f7c9e9c296931413732ce5534a4e4e20507357b7cebd9fd4526a7bf90004cabec4ee090fa6cd752edce69cd29343a386e5001f7f406c196586afa7b4316b3f205e5f935a52750c7b4a7d486fb37c8e393fce533d87f3da25b35dcb5cf101656bba0e9bc3d255337eec01255577766e9954810f3da0f69670f9b81def337de401e9c1a618e7ff39dc1a0f46a1c13e094fea37e53b68c35e6d74292b75beedd0e7d6b06227e6b937325f3b75a59dbba8c9f5eb804c732a960c364eb70b4d444ef2830e48d7a1332aa3c87c0fe78074f7683233cc710d9303326efed526545764acc501b1ddd6d651d3c9dca6c2016d6aea684a6bdaa7c6f80694cd304b78ac58ea7743810e7cb8015d1aa5adfa69d7ea3d1b17f868037aefedd76b8b9caf0e6fd980389b1311b7b9dacc63cbb1e0630d48e561699af1c426a1fb871ad0a6d4566c1a5335fa7ea401256d098d27f757095bcbb36840adcd572986bad6fd396740acb1c630b5fd2d96bacc808c7b9ab5be9a89e532a7808f32a0741a2b5d07d9286b666440ee6ad99aec6654b3995e033ec680f099ab4ab67d6b3f5918218bcfe206743fc470790c77fdbd191a6561e035a7ddcdea61c3e7a439872f15679a768be9198351e0848951c2c52a1850f36f47b1c6e63cb7e38f2f20d39e59e39e0f7c7801ddaf31af6da94d4af1d9897e7401654bea76dd29b66c945ff82c8c364c48b64039b191050a4bb981c50f3eb8a0e9e755399ec6ba9af2b1853ea6cfcfe6e19388a9bccf926da272e5d8cc7a2d8ce0230b68effa59afc40c32abae5490460d0b87113eb080b631754731839bdcf45f0161f2f1a6162e644f4c2b6015d09dc1c49a36b6ec4d990a48b1b66d1de6676dad4d96e3c2c71410b72b4b6fb6dba8f8542a954ac5dc598ecd9953c387149037ee6bb34dd9b36f2b0a485b7f3e1bfe74d4e10405b4161a73da39fe766ecd13d0b97fa3cb7829ffaafc70023a74a3722576db14977e34012996f63cde62cf909d511d7c30a1fd4ea7c17394394f77f7facdc39396a172c4624616332230a30b2e661c1e7c2c01759b67e7979ac173ea9580ed8eabef4e777bfe9104e4b74eeb947693e1ba8304d4b4a5f1d48a4d9aa6fce308dd98aeac89c6f9183e6b981ea70f23a0fc5c69d6e6b67b5fa608c82f3547ffc588ada94aa552f920c2553e8680bcb3ff39a127fc968480f8937176a9f4d92d661f4140adf8fa32b95eafc3f4030848a9a3add7b2a96452e6c70fd07acd5ff6e79cd44c9739b746984988173e402dcf3ae96c79d54a5da4a0946471f28c24848b4aa552190983594c5a16a852612226232128e6a30728d3aed27bd4bff4a8fa2c96fee00162acb76d7f9159af73f20a2564e1ed009db30c3e3655b7ccacd70162e7a392e94b5cb9dabadbc0470ed0ad57a3b62fb165bd90842d228d0f1ce0dd39e720ae9ebb414c2a9f29838d4d6ba052a9540cc3e0e306888db26b3d9a8c0dd026de56bbcf87b5a5ae06c895def15c67eb1dd57cd000e9d2ffb6f83e31779e1a1f33408fe79cb9eed38a69940c507a95aedf9af18f189c336bce7a3af75d1ecfbe5f6b5a525ecad3958b0f18a04d5ca8d7af4ccbb4e90548ff2c537a52fe870b50d26ddcbfa3fc9ef83c5a81b4a9e6de4cabf5a80b3d5881f2f95c9f6ec964f762a5a2028f55a0d6d48cafcda4d2a63978c2f0f68c84614e15e8dbf558aae2758cd3d9a252f14805bac3fcc51836637f183b49b1dc31931b5fe80dc20315c84d62d327955f3ab5ee710a74d63d13e36b6a7dbb7b9802ede184b806539d34e91ea540cd1c6cfc4dfd5c6b99072950da4cb74e63eddd9bd263144839630b8de37256d5985de0210a94309fa9b4aca73fdd438170dbf3ca6fdeed2873a5d2960305d2b6d236e6dc669957fe043a8aad32c58fe9e6a8e309e793e9aa68d6f52c76a2fab5f095da7ffcb53a81cefd68ebc3c3c3d4a60d4b498a890dc5c240e404629bff46f1a7b2fb1e9412130d786c029d746b4f5f61ae931ff9f5178b1825277e18f0d0043a76f63fea2cb5b1e50c052116911265b00b8f4c20738cd37827dfb9e376e143b188d81849f991bc4bca8fa8394ca06ebc4ca54c31fb4d7a09b4b9d9ce8e7d7e9a4c17be9ef1c5042a154ba0f50b31a5a4123b9f782f8b6e0a7854021d66799cd131691f3fa7043aa7da60a7aabb6e4ded24d0eafddd36e3ed55b3ac542a95b6dcae24d0aeb47a1e711b2b6f1609c458fd4a8e2b7936c50b1277e7e997cd7e32f574b79533350a133e02b5e6868fda35aca5846bbd3a0279fb947a962a4c6e9a4723d0b964dcb135abb249ebc287c9068a3202a541f7e3c9d249a71db308a4b04f9d674c8d0f755911c8d91fe3d618be9f7579a2008f44a07e93fa0ef3eb638993422c3c1081b6714276bbe798d6c64eee10c898c647fd9a624b77c6621b33d8890d9412113523b18d19964692901731c113818721507f6aeff1d39e0d3b4f7b14e22a67f02004426c8f8a06d79bac9211cb0d1c046266572e65be32edfd5df86e9cb091123052484a46cc35c043106839a351eaeb2cb546d8c908f32210e830a36b4f1a4fea1cc51340a07ea6d4995ea68b872217140bde033cfe800e0d53edf9f8643af37e40c82d73a5abce35ae7ce1b39cbb80471fd09b6f3fcee7e0ab6ce6036a897399996fafb173f680ae6fb3a944f7dbe6a9077347cf178db69e3973d633e9b36b6a5bcacb3ca0f794b4f5b56fb7d5e001796af58b35b9496a951a2364fd89a524e5ee0ea8db2ac6d51a9ff7982b493176408d984efa6cd80cd3885850184a881829210991eb80d835e73157ba987218212b6f351dd04a6a93351d4fc6dcaa909d03726dab4bd3b661d9ca7fe02107f4d97a32fb95888d118580471c50ea4c7eafcad5f9c93b7938a04bf866edfa6ed2a59c22362e806cf0780362472976765ff7cd3176e14b3650da0dcdbc996b500fd37b8fe14356f7a88e99bba3fac297ea47b40d889f37cd71d64a3d77bbf0f1e9d1f060036a66b19f64430339f0580362d92669ab6f7d2ebd39352086b7b6f754cf3a2b0d193cd28070f31633bdfeb06ba6d78a400d3cd0807699c7e434e8ac99da028c102c0e183cce80da514b3d7526ae36f43465f03003527a68b2332d53a67e2e7c6f493650cc91801182821281644303787773f0280362aaf914cbd5aefca8cfd0c28b1978cd260c1e6440abbc31a654fb5cccd8a690846c008c102c2a954a258524048c906419b141c21e63402c9d955a5bb6fa1aafe32186e673d8d35a9bccb41169ab3cc2d0d2fe519f54325cd70bbf0718586f714d36eb6166dee657c616323b93de190c304ab83029a1c13cbe707d786bf07ad7b03aea194e9e104faa1f95ce85cfc4d211f0f002daa4e797598c2daf3125615c2c96a298c918a852a9543cba8058256eba269f2953b5173e31fea424c51c73e31e5c408d995beb545eaf598ce1c0630bc8d9b1f13d7356ab370de52f5db0e56e78680135ee739821bf327bb6a5071e59409b0e1f4cc7abacdece95e08105948ee2de47c6996ded7180460dcbc5e30aa8d7f3a766525ac5d6326de1e081871510e346f36ba5fd3f4cec82854fc0a30ac88f593333dcfb56c40b9fc57249091103d10b0f2aa06eac8cb6b5c7a4c4e70b5fa3e014d0aaebd4ac4e522b192b29a0de76898f333c61954aa58292123212227210081e51402dd51f3e7defc7c61f050f28a0d59a22fa6af6872cd71350f6f9d3f0d39e36a7c9096b9b193d6badc6d4e1c2a309a81d4c8bf5b937975acc0464b3ec6d3435b70f2f95cf5aa6783935330d4d8ac71250a79f3fb3923175562b2135dbb2a3999779c9bbe091843e7d0129a9ff01b5c3ba8c2975ad66e97e40bfd49c6cd53bee2bbd0f2839f3dcacd4d4ca44e703524bad7ec3dbaead657c0fa8e5b36316de6e6237ae07d4ccf0b5d4d81a638be50131ed3fddbcb7cd8ee101b594af9e1233e69beb0ea80d7f625db64e95253ba063e6d29866d465ffd701f94946b53232a35e9f0e0815bf6faaaee7e6cf01b5d454ce667deda9cb01e5b24cadf790ad351d07a4548fdab5146be38ae180f0fdf4274be7dc3fbf0169c2f38ced4fcbf6d36e40cc99dc579f42d573ba0de87cdd3d9e4a2b0d66b301a594bcd73664d5f6d86b409f3a0d53cf700f0db61a907ac39cacf53a0d48fd25afd63e6d4d5ea30125854a13fe79e3ebd8195052cafccedb9e949519105b77d96b7ab5b4f0cb80969a66e7f63c7ecc9301a563b37a657310978f01b1c4e9be7513037ac5eca0e6be72df0e03d2e4693c3167fed5c080d6d9c5a9f57d01b576be3aa587bd906ee9b376c4d305d432d7f67f3b85ccca05b4ca4ca732a77929df0262778b7d626d83aab580be93d2c44b7b7b6116d0ee52e5b8d86fbb412c20cc3e7fab6edababe2ba0748d914fdbd54f67d80a08f1ace6c60d33b5aa0a48f1f819cb36788ba980f43b799e5dd36b944d0135b5fe98624dfd8fbe14d026d7b5f45bc3b41d05e4785a4b3e77ffcf0d05b4f0a4aab6e2c236fa04a4dcaf7df7f33801716b3247a5934d40cbecaeb5d834966c31016d6b9f3897c2f4687009e814a6275cc93c76324709c8953d696e43a658b524204f4d2cf139faf15e4840a90dafa35ef7dd993a02e2fe6bac186f9db711905aaad961d6ecaa9d54047427efa8e37abc8e6922a0c4ce2ba5b472ff9187803cf5bc627adfaf4a087b169fd5ce521090e7e1a3bc0f10106baff2b4a547b5757f80545abdaa47777d8014b39fd5323a37d6ed013adf1626f569b177d6e501627acbd4fd74074853c2a36629f3c73c7580d82e4cb98e5a6add5d0ed0af3eeca43e5fa6130e50cac496783d5bec6cf60628f5c947856635b16403b4d63495d2a7c4c6d96a80bea19fb6d4c9a3146980129e3796dabaf48d9a01522d4f66c3c3d786c90035bf3dba974edb743e0688db31e9fd4f030006a8a5d6d589d362626c00bc00e16b534a75b24e7cab0070017264fd88eb985b55d55620d7fcce9394b76796ca0ac48c596e94d993f6b5ad022536f64a65e3cab6982a50f266fafca664b01d960ac487efcfde8e5974850aa44c42f38e2da9642a9d02ad672d5752a94a357b53a0b68a6d2beec3c3b84b811a0f55bf557a52d7a4408dd9d9984767d9d48e021d3d8eab994ff3ac1405e266d807194bb327652810c3d6c9679b9e5b97090ae49bde861d54797a5d7e02254bbdf4310f9bd44c7a0225b6a7debbca8fde09e446793aa61ae3d16c9c40262535997cf35961db047ad65a6132a66902ada6fc66d6c876359609e4bc14d73f3f5e4b0c13e8e0529878b575097450fb1b43a3eabd2d4b205c959ef193df352eac04d266ec1eb5f10e312125d09956a377bd9d9e8e9340ae6b74a11ee6ffd728099427bb596bca96af8c914049998fb9d620817e15d3a795d6f7e94720a6747d42a6dc91e5710452677ed929554d95da46a095bebe35cf59eba68c4047d328374bd5d9a6b9087492b5d3ab164bd8c7a022103bdf5b89eb143b6c250231bbc3fce0eabeb41422901a63741727cbd5f587408b8a26f1b5a58e5a3704da6fea165b9aa79917029d5fbc983ac78440fcacf76fb1738340e98eb1afee394120a31e0ff3f9bd59f502815a153255c94919dd3b402054e693e1e3c76998b93fa0b3387dca6eaba5b6cc0f88999b73d37c4ffb5c7d404b973aa6130faea3e20362fde99bec2ab541b50774b98ed77432ebda497ab8a58ebddae59f07941af7b0c63e4f4b8f07a4ceb9ca94bacd7cfc0e089b52e7acfd5e2c7ddb019994fcd89235d7b23a20768c36ab5bdb941e1d5037d3d4fb9e69cb86e7805eb5ab678bbc2b550e48f7565a97aabd19738c8c38a0ed5deb78f6c9d5698d0c38a0d4fcfc4a197ba54e1a196f40992d996d57cb99516864b801ad4d676fd0cfe3fd19196d408a2db5c75cdb3f6c6364b001fdb63ac67eeabea1311290b10674ba7cd551ded7e9306c23430d68694a8dcb7b4a25eebbf0e1ad8c34a0c4148dc25749a5759a77d18094fafe7136ed283da699bc1d838c33a0fbe627dbe3298d830c33206d67d4d955cabc6d372fb6c8d30b234f422c161314955106744a7151b5931217a6964106842db166ccb92b3789710c48f9b43d25f3c91003e2a6f6d46ae8aed6aa6d1a352c2932c2800ee751ab1966cc32ededc267296998870e0694ed156fb55b32ef26bf806e772d2a1ec5b8980d0e6478013de39530a9f276f653ebcdf862025b68a1c508ca8b814590d10574a9b9eb5bb3fb35d92e7cce05b48eb24aecabede1d5be05a48d39ab53ba100d8f1c2da0f6ec2cfdc74dc99c7d53cf02ca5d26155b33c493562f7c7a780b195840ba921afd84ab74db1590e3f659edeb75d39f17beb6c252dad851ecc9b50ac8134da6c166a56c135ff8ce221590e1d7b54a4d33f7a973e13377011953b0908480c1922505c5c689006448410532a270a0801690f10427b075f6b6ed60629517c6424613d0e9f299b3fecce1f795c104d4cc73ba860fa2317cb898583ae34e29fdce29194b40bacad4192353eaac7925a0e7933e61af579f8ec990d62c2226235bdcc00205e5bba85498fac604194940e70c4d4ac6d5eaf67c5fc84002f2548bdc9aa6ebbd322847402b9d1e65f42c74f5921223a0f34d33b562e98f325804a4583a3eb84ef5fa1ad3420611d09d398c98cdd4d7f41050ab4a7b4bef1c96ec28922104648e41759039b6a66c0e25640c1604b4d264aefd3b6f8ee90dc800026affcd8cefb23aa9b9c2fb01d2a309d339cd13f37702327c8014aff253bc3a7b801a53e94db2ddb59c57f3002d64ad9f9edcf4361914198e2d430708515b6b6f121e6f5c4b460e906a622621339770b32d0d64e000651ff32a651bd6462d0664dc60a5c36e1275a563ae02326c80d2bd7a67a9ad5576cd2f7cae5042462820a30688a9735232d6d49b69fe17be44167292a21d90410394ae5dbf215b9f187a9a01bac43b9f6a9532a768461633be681a352c62c89001e24f677d2edc5eea3ccb88017a854a6532cec7f01c97010374ebed0d2ee739c753bbf02d66d15c325e80923f5b2771ad59d56f2e7c891f90e102b42bf96352790cabdd74e1d356a03bcd5afeeac40cafb617be7328961494928b85e4044b422c2628ac70be55dfce3e6fbe5f676af5b03db6568198f5d23ebd6c53bf13882a901ed453a654adb4dedc014985e1735836e387379955a9dc004105628bbe18ffef553e9ec2d9209eee1a745cc6e3f89b58534a3d39d71de59802a14176e9b0ebf56db99602312e3d46536b270542d52d71a33aecd27a8e02fd71961636864dad4c270ae4abe15adfad6a213b2614481db7b372e3dbf88e8102b559c698761e2f9f3903f9044aeec7ffbd2d3306a340a5b2c66017104f18cceb5e576fdc7573cca635cd28c5f4ecb87a5302d20974cacf5156edacbf6c0bc209a478ed73a76a8ab9b601d904ea4c88fc7db053352d4da054ac35cfb59462e7b365023953eced8fd1d5b4b31552c201cb61e22a209740df10d9a6f263e82db525d0a686e9e427a3b4f7164825d828d6bdfc0c9eb537060825905e3bb669d437377f490911a352e94549096412ad798e1f2e9a839d4731ddb496942aec74b67c044412689dd394a77576b1bd031209b4664f2d53faaea9da8140027976b37d374afd25c5208f4029719d6cbcdab23296b91c8118d718d496d8fcbda91705a50f3ba151c392009046a0de86c77df48cb7741a2310df9975ee6473d69e6f116b52b151d34f669ee39e76743bbd2d9f74165f11c85553dfca3025f6e7a84a832402b9c1f46a9937b89e0e4110811676dac372f75c6a9e20874066a9f265295f0db18e33c3d4a8fda3aaab10ed468d9ab3be9bdd5aafc3189dddd5130231679f76cc5e37655a8340bcdea841c694fd3bb5209061dcda612b3db274d39808208140df98a72d934ccb65c94d4c3e0d820002f5b1e7ab5ded52364b7f40deaefa9ab1415fcbe907c4e6f21263c3cc71b35616332c33bee06246498ac98d932c2a954ac5a4fb8096e92b5c29db25b2aa542a150ba330081f90f2f6bac6bbf615f7da0352fe697a33db51a57ae9c1dc229adee36dae977bcb7512b6a6b5f280ce5f4b4eeba073c2f67840ecdb2bd67e9da4b6dbde01b92e6485d94c2d3be612f0c6733ba0b5f49cb54b69f3f5ecc50d11934aa5522101a903d24d8a69994b6cd4da28b1dc48961ba97440ce94726d6f3c656b6ce6800cdba434dbe46af8186261297b20724866d7a7edf626f12ac7e1a4ffa3cb8d499efe150e67b4dd9b518f2ff3c1537c447f958bed7fad05f20684ec5cdbab33aa7f58b901993ed7b598ef4f3af66d40bceacd34b5fa5eee0dc206c4fe96592df9b7769a4aea847551a9982180ac011d73bc0b9bb9c757666600a206c4da2eae5a46f95d1e481ad025f5e6ccc2d5abdb4e032325275a9ca4a0542a1534e019d00c57012903e2b34bd94aa356afe34d0664d6d266f3eb875bf54e184a32c81852f3592b64e7a7d6cf18ecc21c3a0011036a2a0fe7b6a6391380840131637ba3a6973a93120d3a00040c4825b5149ab356e23da6fecc8b4aa51202f205c4ba1d3f98962bb68dddbd705cdbb5d6cdab99b794a4584c424c80a25dc035c6d5185e764dec6d66ac4efb655c3e5e78e16b25162f9c0be8f8d6598cac651aa5cc6424a45229091901c81650663654bbec7c6bbd02d102ba6767ddf0a5ae64bc41b260ee38f226b3bb49b54db9da658bdbf249102c20c595ec55b2be6cc6d41550dee1e96aa673f5ac5640cb1ed739aa63c5f3cbab02baa589ad61f38db5d14352825201102aa0d398e1f96cdba7c870814c01713aede954f3cfa95d26f811730b22856654e37ee7eb9ec78ddedd39d807db783beb88011205944e5b9a0637a5ab01020574c7a9a54bd5daaa74813c01792e66f81c33ebb0d45d255980380119bf6547c62a75aa92105c0469c25540987095075902329dde1453f8cd4935419400920464126a33ad12068db2a8040d4724d2481c0e8642813018140c9e5fc77800731348204050208d87e401491ae61c14000660543c4c2e2a2220180887a2a1481c0a07430171300cc22886a1308642388c94203a0f844947e9195112510ac183777cdf424e94b3e34e38d68eed0bf73db23b024914111cc1e745cf0498e6d4c8b862e8587161dc02f77c0edba3121ac5128761c0a87c2cc385912995c8ad4e8562019cc3e478d6e5b26320a3c86286708b6d1ef1841491308e06233f5f3f2d7dcac0c9a785aaabee9c2b0be54c7f12370e56ad1bc72d6a10930f87d8c136e8a5e2e41220091323f48ebc06ef8b19367f3f5941749b667e0551e18923e28487ac83627d9022142f6fb3b393ddc66a12d15374d3b3b5d1baa2992f24cd72ea361f318f1357e1c6bfc50fd2f1c521711046874e9156c95a8e7d383b6c67fb7302e9641c3a307a5115137e72e7d87444496009190d99baca0f394149e38e24e03876b40f9c21bd669c1e4ef99b6ed844a50157fb0e6353e8df56ed9404bda357320ab24de088c355e346b8c50ef6d1dfed9072610d2a3b2a37e3a81a8888404e33fda2b274c80edd213b6ccde528ecd41842f49363c784645ae160a05d3ddfd4d569e9341b80490f41b6fda75ff9c821a5438c121455078a152eb17c3e85b77b7d00772fb4a62a4b70042d299f58120f115578dcc8ba5f2eae2f0095804f02c81701c2b4c63d44185aaf444739290ff4c2b97406453def83188f74bbc41cb339d6f0909dea749bbefa4f5ccf1f07746fa54c8658d143feb2abfa49ff4b041c5a356a67f2fb03da249f6df03b01559ecd06b02947c031f8196940a91ffec72b929e014a7302c700052c476d897230310cc9552651c7095ceb1516398f7187c3cc7b4eb9ce126225bac35e4055f4c9c4574dd165cc0e29eb88ab2962c7499cc107d241755b82ef4bd166017059d709cdafb006bd52129f41138294ca07e6b971a8219039a84f84bf06b06f77e205075229ab09d974dc8ba95de4ce6cdf942d4891ca13b8be19009d79ca2cb3544914acce64ed51211442ed4469e47be444e08a03a9716945a69ed21dc2d1938dba6900e978f98ac8524d26665dc97230246ba7117965f204c34a53bf3e2c9718507948c874596a1c8d52cf8ce4b27db99689c437ffb6ad661efa2a71683f32a4d97c3d5ee0b2048f9645c260afe4f97baf6a04dde174e930765f13e1e080f534faa5c986b7457d53d974de6750e1bef2c95c704ee8d42dc757a709c204c24abcc8c76bf19facecfaaa3b608f84e22877e6f72c1338e04afe311c2f9c241c233092a9c92c29f68a29c2bace3e4238199dcc6fa9e4b7d321325333130bb9d1e718e3f516af98c7735cf3994bc3db2e850ff09a7a4f1473f1c447f9381742d726458980060afdc2f26a895059855850df09965949819e57b36bb7b224f12745f8ba94c4844a9f9f5385fccb5696167340123759dc4a160d3004ac24e13ad645e16b05b71f2d11f61d19b24f650df0c8199f15b2d451e6972ed6b62a6355921ce93171ea06c107cf0e806b79a104c68308c5ae9437498d3c046a5ad4e50a5707a0b1202e44ba6428724ad2408fb95a9344d26eb697e051cc39df6227a6d457b12de8c62bfe0b5b3784678e3e9801c744abb2132a8d2e927cd0ed4070029cd84eade17da49ca3260ac792e90c0899fda44030c63d775cc38e8a4181a4306f9c3256c769ee71ec4b710d04c1492bd8ea94a3a91f7379eca75f908b81fd8996d08fff760ee4c3ed8e641288df7d004ac133ce2245bc2f255a2665afa9f8d78179fd7ea34e416250c946ad0c849a4715e53cd503edfaaf0d12d8a8218dca904de7fa83ec672c4631bb3d56dd86e3af98433ce8f12fa922f282eeeb595d5d73015f8aca9b48d0991ad4c5245ce59453c2856862d502f22f3588ed9c1eacb30bffb1e9591d880c421cf046785e1dad49cbe1d787e134e5ef8328c0e9dfdec5e985f1786810263a60886139e2152e4857d0774c81890afb14598ff0b204dea760771958f106e169ebd0af988edd2220f0b8053bd6eb496a5f3bd0e7873d38a6241e3bbe8e1e8192c4a87ebcdbf698eb7534d9f176c790f2986b2105347789a2a25b52c2c31aeaa5fda7c1113d7241a0e2f414f2fc3f554a3bd143d0aa8b25381f0b0e62a753e67b945c6bfdcb089edc6c509a0aa6de7a86f829d120007ef3d7d1fead52c93beb823297744020e4d27ba2c101302e77af77eea08f5caef048469cada365adb45035425013688e87c203a4ced54da638e93f70308d0aa7e8c2e1c10ef96da8fa0a44409661a2f9b1be01d5386216d0c2520a5c9d6b73744341950d6ded35ba98d64b09d8884d6a21a3139b0c54a4a9937096517ed6e81c086f1b19830de4a363a836f4c6ea4360d9e0cd555f68039e44c084297cc154b5607911fd89cec0fc8425cebbc4a1518c6f647f69a2c0d2e4c92f463000b6a47cf5cec5c73016f2a3ca14e17163d8c0844466ab627d80407902f9297cca7d31c1907c34d4299b5071a7baf2f83fdbf8241859aa2c790a7d0f4e50c053598eb8bb7856dddd5cde76ef53b26baa348fb65bd793c54ec04aa476a362325d54e1630c9be831afc38d3348e9dd8ef8738daa238352a6b46f8f3d0a0dd6c09ab821ac550a99d50e082447ecc92d9489e0d031399da4b2441d2228c3aec07e60790e636e42df73e15003e1bb839e80d026523f156018fbab0665453063d92af47033598d8a53e95dd2e16a6d264f5c97cd934b9e83f7d8181bc8928c26b702cae5e9183548ccbb1efc4ed00e8390a24e42817fb4e4fd19d387818045987e697e2021c2564b06e0d401fb40d1524fe4f11be7355130de46d325d1adb57656450fbd65930311912c17496510628ee5a6d301cb8b1e2b02ce2df944a2a585e96b951178de81b98758047f9bb5ef2a987f828e83baa3c1268f60edd214330a52ea1a1916d4cb88eba246c09f6858ddeee24a9db46ee39468420b02be0258760b3e177de49d3abff913316344ae510c9e5f5567547cf19ba92333ba9bda0706949f1c776568a9aec4d404d0044c53a47c173709ab5e65bcd387a6c997f2052c3802a9366e087f416a1e10a69048ee16845f97f6864f7a859b1203c8b02a2c2b4ed244467662a78e6c7b8df1097b8e7ec5abd2f3ba5765cf42ef219fb39f0ee8650647ad4f0066a505e403933fed8e01c96e1a9bd45b3083d0caca99d7458d252a7f551d2db5d1d2fd9f7088a489ccc9ed0e6593a6ee37bc62a91cabaef42082636e7e47483e9cae19878b33ea4a43d6e9ef8b241546b5f98caa2550918b1879463d4a9d3999b858001ccf5638110b58b57a1dc371ccd91a2870a71f5ab80f8c812c506264fe50397c5e902880998db2424e37d8070742562e9ef27f17accc3065e8736981169f433c2fa6ca506a121777864e12eb6455fe1b36af04433e860e4581eef0d660b31a42f1fc5a343e6fe22fee78042fc0ddb48150e002b140ccbac0f4dd6160a3f88ed04a19359f00695fe3fc0b0e9522cdba249a6631897c60d9b6b73843a49cd959b9ddf06e353d117e5c71671ca739992d5e569d0f8888c55b3ca5a0295c165cb831ff53041883e76a37b9cca0678392d0d603756e92ff443bf4409c6c107d9bb6ec077fb3ca9e441e4673c331ec8897769205a42e65684b9ddd5def95265789bb586148e32363922d75e8c9bcb897298602a9557fdf3597e8eaa7a941a6cad9ce52f1a0af6b1f506f0b1549a0f46873441984a64e2230d9a428ac2440d982fc1f77c7469bc5915ca5004139c42762261a6e440cb56478d31c2635d4b3d26f6675703a264d79a5b69e36f7a6830d36076b5d93da26bfa95668e783ad4b82c44e25a215314f3d1a0c762366cd1e85d608754944807b59815e05a0deadc0c734a0fe43b7b5228471fcb25a9c3e853ee986e4507cb5016a14a110432d0486311a3cf9bade94c129b742feb5573014467e4a4b53492cd8423ec329675d254100cdc88edf1b402394d92cdaa55f05b66d0810698864a1af2b7d2b1eb30e676cf0504dbf900e076774074f140b1805874dbb6a7c63878cf1495244eda365de3c0bec22600c55b058a14e44995a379e45a8df862af59b8257a771cc5bea859c3438c403167f4eb9b2b83a6c102c68843b1321fa42a8b638fcf9db2794e848413e795a0e6d89985cacb32ec705cb495a963a4b7d212dab03cbcfcadd94fb2e81cd1a9b9c63773814807d8b96183a0963391fe9824e4b372a8adedf4838e11d95944297d32204b0fe1e64402dbddf7b46663fe31fd923ff7c76c348fc55e569dd1c8660c6c80ec41611ed8b1097b8c4651d5c018601ddfb19316697c94faf7ce697c6c27bbf638f7e3aa6effef49bddbafaa43d493fc06c0ee0a9324286020080c758fc4a02ab307a969ca943c1e1e6e5160813c563b3c7519a8b0eb8cf40b7850f0b3ba823d31f3111b281768878cb58265546a6482afe20be03b9b220a499a79ba5241ac2a5e64822e2c0a3bd1dea3dafc1ad302a93ea37b569017d1a9582c3d5fbed887d88bc05eb3a636a7921a30ef1bd0a457fbf590403a7bbfff3923931af0c2bccc6ed22670aaaf3d70d3df01c8d762a0d1bca65702aaf985d5231ab196acc523adb9e6fa8ef7b8cc9c8844397823420b4dcfa627c7724c2a28cb89af80014f43dfe133e8321d28cda9ffd1a3cf4c6a364478afb07ee48f320e627a3730ebfc3a8037024fd2d5cfbca1217a1a12ea4d173136f471db47886526bfcf8fd03a7232d27e57921696abbf92b8a26b758009d74d92cc09824d3f572b1920937d2d641741871d12b9f8b630b401a69eaf5cb5df42ee58d01c0aab0cf3b68e2275f8055e59964273039138a7023b74cd4ed39cd261e2253db9f2988e1b62f2691d2b04184a45237852d21f85d92a9b659098ab50c3d82f10587f907ede798a93c9287d728c124d45583e0a45524ec52b0e3d4901cbd9b3969389cdf46f6a699a20706911f2549a0b764c40a87381e64f5e2d76e93c659b16003ca3a4caecc6503dc2f0c7c623f330b22e0ff672fa44af04bade3a62d4bda8231912e5a4f287883603ad04f9649d9b9dda1b57c5944837420626f623116b5ae822f59632633df6c30bc91829ad3e7cb3f0f03cefc0e44c0c76ffa9f4b37fbe915d484a19c446b37e9713c68dab058725224719633a675c45d9e743de24851b21437725a6851d691026426e4822df56aeb1129744270ecb7197ae9f84655781b88544aeddc82e7601af4e89ccf7410974398eb2e52e115e1e78120fdb7432105fbbddf9bb568f27c441ce215ec197dd4332ba281a7fe7554857e66ed1c77108b4b53c28784079f57a68f99c5f77ed68b0a4e5d81126d69722b0bb05e2aaca700a0a70a3a8ad51b2887ab2413a0e9ba87c668b790010c2871d7153375bf48ae7ee8e2e7aec15a86c09d91f0652452e41fc50b4e169381b42184eae0ffd3bfa7faeb7c7ca5558054d01545838a9dbcc5124155a012c95b77cd2f47d1cd3fe7f3fb95f92ca70b7583078ddb7415974ec7cfd68b1aec45fb84944b89279d1fa9b8a65d870b82ab08d01d662a0cdb006d503828d03595792abeceb499b93c5e867855d79056da485c134f94d60a6364cf0a178aec81550fd1a0df578a0a6a092a0ab57ea6791c33334b5b24b71aa5141f2e1bb00a933473fa43db927c3b29b6a7297915c8350a95a883fb67ac350bc07fb113bfd0917a3459474c7cd783294ce4f2e01259faa063234b6a4d7a820b3f1350e58f1b0f1ce2746309e988690480b79b55810976e016a194162be3b8f4f4c2e5c22be6f45f0dc0310ee1cb9eedf83c7dee4fe9fa0a9b0a241aaa01395a0bf232d5dde3ee8031100284fb2ca2773040f9457febed9bc917f529fc023259d5ecd114824b3746a2f9d83b3fabe96225c5d0504a388227dc7a127db4459c735a79a4936e88fe0024b01d81889cf7a0b852b84bd81b3e2663184f128d263c0ffcf2c6a9049bf92b971a3e68c2e34f89a5fea87db05a91411a76749797a2ce77be9b74c4f321b79941f2cf8341d3782b4c854215e961ca32c33580b4dd5cc7e03fb394607450b837e44ad2bd3609455523952493572afc8dba2f2e5a4b014dc797552a2d04bc19de26fe8040b5dfd3ab2084ed447e420bc2f38b55e820cb9db77bdae35afd932dc07d1e69544bd1a39262a6739bbaba448f790e10807a5b6759a51c91f4d5e814098087a602c69919ba351422024e01699f13565e43c45203dfaec784f09726aa33183262006a9453a623ae053ba3f03bb64588db21a095406737b45065c02017a3dd7acc2149b4f8eed0ee72a687114855393ebd64952a216d0d0e66df158e23fd3aa683230f4570203dd577bc281ce64a79eb2ba4fccc9cd4f7ada4e908171191375c503baddeaaee3326f40f7fc244f3c36cbbe405ee0d304c6165890e20444d99d86c6d34ab49ab1176a5079db5d8405a3505fc25a8cd3c552d8681e654cc34144f4bf49f6935ffd89237a787dc85ddfcfa19cba09e77d99e138c2312da379ae35472b3378a8981c2a7e02f43b300fee0bc989fe8121ac63c28556e122755c259392c9186e5706c08b6969054944540c680002423413f09359df95f88116416cce8566a5385d42cb528dcc61eac881a1ac94e5ad8361d80d42bc89862e78d7f4ab1c2c744a71dc086fd18e5f42824267a27aeb3843f9779f466f7f537d90c1a56223159baaa36c79438117d7008a46cd6b163a4cf787bdaa931e79f9043eb7d3cd13f7deea7903985444b8060d130b491570daf271837ab10d49a3f7eb09f6e536a91b79a031cc56641865af4972158a929b758fe92c9d4525190e3a746fb1b984e0022b372e71689e5cf0667255c88af2136f5a9446cf74889cb56f62b8b19390d6ad0ae0a9baba8c3d7d3aa5d1d4d4f687bc64e7c0d0f55b7f72bf09079ec666c9a624b2b63e79df48b37a56ee15471ba4cc1dc619fa520b136671fd6e070bf6720329df5e23294d58a93f2bcbb77a05d80ce6da463ad4a02bf7b657db30a92145cde237df41a89ec3d4e270f0a4eedd138e96361eda16fb360cdcc4c3a2498e1e6cd68ccf6aac73c74ee7f156146b007250d8c8604371889c0546c190038c4132a7305da3259c89ecab9783360db77f2c010527c94b2f45ba522d17da138da5abd8ebcfcc3cc2150e1d8e64d2548ccde7fc891e63286ab399e52d80461b6a810f5c90175ea8f58442d491ce597046c127fe1d4e29d8545e6c559d956c3db81e1d0ca3d4ec4c6f03ea01e5b12c956612c6135d663856cd3e4f902231082b9feb4b4a1c79d5ed069753a75f890bd493142d280d945fc807b2053e5fa04a9586f5624af28a26ec5998a20892f04297f7457577ed7618ed0f7ac3884ddad2a8415ad5dabc69f9f1099a1e1bd839987b534b4e2bff0def09def4dea33243d70248e7eb550984bebd6763eb9dbb2274b1568b3a4aab4c1ae4018cd07670e511f6683c77cf09a2dd5198057259a94ff7feb3bf52e1ceb14dfb9655824fb28f472cb53946b19b86c697cc43513e565ab5fffb6f8e02ee04f49d46f38ac6b60782958fccaa877c2ee90261f80c783c7f3cd563d6dfe987959025c43b55b827fdf17cf030eae5d9c4186d6b91754a264f64fddf9d1502c737292cd37069eec1b34e7fa1134963cdc7283994446f800bd9245f3c17949612fee5f1c67f20c480220448f9a9da0c9e1ca7e741fbd48ce85d49fe11d0723fe07ac76b610460ffe245fcd62fcd0d23f4cef364c3a30bb2af4c3dd207e100eef7fd639478bac23fc7a23869aa1bc075fb66c45011640cfd4b8ddb36b18562db242d2909f75b8a574669a4c2157a6cc0a1ad5884d58d164c7b996894672cc22f9193690e267e440496166334396d41179c700576b1b56520edaaab4805c9abde124e5e6a5ef31de31a8fbe5c784252fa370bcb03ddc5f592ca9eb05bbeeb9fcf9b0041fdd32faf937ce876a6f0f16e66739782b5a662494d67079a81100cb81a876ca5756df64b64e573860181edc090f322646e0f84088c3bcfed96441d51633046154973c0b50ff4b098f8f35a7dd8deee357c165ae6382f9f08720a7fa8413b5e6831bf9a483b68a77e474c64f3bec657f8d9988363b92c39b0827a9d4e04b4fe516c4585522341862bb270b9e4a349b1092bbbe37b605c1c5e0245dace74c7026426da553116b833b43e27c9bda7874d4787249c91f1f6f37ba9e58eb10008f429a38ba0b0cfc267a2c0bfb4a4aeadaec9f5b4b808b4ff9bea1935d8fcd101397073741e49f0551745d3e0b23b04a21ce07725e764802841c491d7a5f5830f17d2e0bc8272a84b707daa436a06698a936f01075d998b519a894c741f7218f61b05ce0f209d8face6e0474097aa460acba1f6ccedf1199604d708c3c4d816a030ecfba5c4993ff2177f66966e1c7d642c3c253dc87088afc21fb74c6ed4f0daa65a5c41b7918cd555ad5544ba5aca0229ae39244d21ef7f5d6f38746d99c7d3c01656c69ff252dc8254027c071541ce8615983693cc11a2eb9a5ebaabd43497e9d0f8d54dbf792450da755a92ebacc566120cf1fd948fd9330bbc1d5eed781516c8bcf3e987d06d14a9ba719dc7254d63e0090340f358856a8f99c1d874b1584878009e36ad94fcf02325d755a30ea76380c044608078138e972564dc9cc8fcd32fcadee005233f857405389961b063dc8bf12f90b020e9b5e0fc0f6f87e32f0d924069ec92bce6d7049c940f182ec9218fcc382befe6ecc63e0b817a394615e696778b3ea32a9594ba2cd4a643f61d5c2a2700299874e8bceeb122f6dd8ffa75aea4cdb400a08434aba1ad8dbed1e4ed4cfb2f77d3a58a1c1bd4595a17318e6145b0a4c1571755388c2dafc3a34a4a737f6615bb82bf45db83a58a005c1eb9aab26565b9efcc9058631308087e565d187964c3159eaa73a16c7b47b96188e87652a9154b0d843e9c637b6b718f4d866cf916f8252458c88bac0db86477bef26704971b7af55dff907fbdd073036c24d547c4d5e4097076f2b6f8420c6dd7e6ddfc5a43a3eb4abbb59667854c61f60fddd0a6894a88b046141a71edf247450849caae6f42c0839d462ea032518463f630c41b6424fb791221b7f12f5b604d364140978f81d575b9915300dfda94ab26bd0dcd7982fcb8c29e31ea36ac13be0f4b8fe73ebebc6c852a34b293659ac4630b10d37eade44f73f258cb81612256805dd03e6622e41d8e8079dcdac5393671a563dec2b72244bc2f5e1b97865c17a28e0c601083cd6b18c2657335821422a73bcca6c60cc159029564b766f4e257792547330c731a1f6323611749815d40dc89e0f2fb1163e88ac129bfdf152290178e513a6f9aeb9af54ba3d532b25dba4a075c8e16ddf65e7dda1b0774710b818ee139751152e8058e945201b12023cd1499ca60b8746f76ed85c1b3a856a668c7a6ad4446852442cc84098ff1466926503853c1b9389c9dfb5d95f1357aa1ab57a1fc267710c535a1186145a1820e56ac64fe44c02c4c12014c3d47fb42a2f4b9123a00d57184121e915ab35a6eeb11b434223a8e46538cbaa129031a434a2cadf8782c44a000247bab155470e09e26ac7cc1ef93a2f20b35221fba5c7a181e6ea826b00ce9556a8c05a5bee9edba1a637bc3e469de306c86dcd55decf76d452c83961db318c03d5a37aad47df82b27bfd2ab18c556109aaa9c2fdd905dae24c22419d40fda072a61ea272a49e53391879319602db492bef5c16a534b50dcbab10a4cb619e02bba3281199f12cd7f705e21a94885d01f860c710204b754c4d0ac83c04050e8583906c95db5cc0922f6da50f8250f70de7e75dc1077fa2bffd0ea8087157eaad968be1bc492d7df4f238c354e0e3d41681744f5d2143e7ec6e15ca125f46c5e4cdda12093ca4380705d1157adf9ff2fca0b890bc29112649fbe0f3cbc2dcf17c48ac8eea7c590f39af17d0cdb642b324eb7e531e18ea65d4eaa7948d64c4e5c5a10acf98678dc093808e39f74c8a6a66c90c0e3b991b65a4e94467c49c1c09553412b0a3c8c9218c26805d12a7f3fd86e2166b6bec278af453b41e926ca8035d419218bad805516780edf5b816539eba2c52f5962b7975837b37c5d5cf9120506a860967f650339aabb22a02e5ee6c2096d52182577b2891bf699e3a38d7543bd9ee527207276f02e39c1500188b69309c16ca77afe5aafd584b871cf26b90956123878207fc96c14153fd4ff6cbe0001b2c637ae2596e8cec20e268b7e1860d72f3a053ad001c0228dd49e79248905beeb35acbc4c3662db8270edf43f5756247353c68317c209f390734461af54854eab1afc81bf723842b41b1afc820c248d0160471772887294853e4e0402495fbebbe2b63d53b6c491d5fc43b0fa641c999f91e6e4301a717177240b97aa1813b41af0f648b13e9ee3b82eb7f39f8007968dedfce75e8a4dda7096eda4b3c15259da7e031c07a9d879aedfa57a8cd3505ff38dcf2c5534929d7f983228036d181060b8e0abff80d2b9743697ffcdeec4709e0a43c377ada3d39ee4b8c724819658572c2cccd1ac10af3aea60c5dd4cdcc839187a1ca17742e4425519dc00dec35b52aa58a197f9b436ee4e823542bd7480df15fd9b3a5a504fcf94d2bcf86edf48bc499b89673571c06b0904fa9fa86a79c4a7d1b28c99e121a91bdc1d7be81fb76d80d65a46bcf163aa75fed9022a54a00fddab256a21164d52a64c5745ac83bd15eb2f7cbc6c27127f4153ead15b8c567eb13dc6f8dd36e9343631568b2298c461ecb925a3c71f19d47d5e5aac6908fe69bee0a6a5de44f216f7c02dbacd8749bfd486ede438c540fb13cf8e41d8e13fddea9e2027ac59c9a53de0911d8428b3bea9e4aba073d8d064e70e4b24b072a6af9880a428def286261157f9fc9e3606bab89248cc0d1abd10ef2a5b33bdd9f82bb3b3512f7cdee2a8c26cec07177744e8313aa45987349f3ee3e867e44a6ceb0a1fe542db5547ae9ea40c6a42a3d7801c5b50d256a44bc3e535ed1e2423a868e1c987b85238e61542f5cc4315bb608411c349ce74b8bb0ea002cd4072f5145ecb1ec6e2ee8620af4b5a456045cf7c7f2c0a673336daa628b4fa28f3e3169024ae87f558ec12d1875f6855269f8342544ad27a7e3a135834e66c214ba2712c758b3e17017c4dc5bc078ee5206767ea09376f5df721b60f143a816dceda6e91df0db9b94ae2e46f44a454f278654548970aab78a786b4df0b718c6e247a7a20ab1447e64f9959de368e803892d435e0490dc485910334c4d69da0901fee42c02a190d0191fc2b688ee782c2c4bae7a904a34a816a0a6a54a2818c00d41a7c995c4365a8f6beb2c89168037b02cd248621d96714557fdb5f8833661dba86767ba3a63beea29210b1f7ffac5630c7b0ec3bae67568bdd75d9e84cd8ee4995e90e2f010c1d80fce51f6b9a8baa35cbe6d929def52c952fcc44a1d3c497559eb47599d138a64ef4def9ba5f7d9e5956683453c1410d6d2905ff4a15e8757bfd4d4323416ac7e8163cb48e4d2c729581ea5b4e432e6f2aa1ca727a7ba6e3fa6d591fef462e74abfb15f344cc7f601eb386d2d2a070c5bcc4e8bba3a3376bde02cb90c1e3dbfe26723309e631d1c31b29e281d85f3ebfd4c39e21604e5eb8e53eb84885532d42647bc4e4a06bd83749be62c031c4a7b51cefc3dcd7293745c95414fd7912c3dc5ec14a4a28a4dd3ed8dc3b648a199515bc54e6094219d5adf642364813a4481cadd32e317fa5f71bb8feee26893ff08cd56a51a01c72ec6e46fdbcb9943939022cddc6e41880d095d5b459a9771947967a8076c28f7cb4db5ac345f89ab5a58c1cf5a0a131a8b28fa920322fcffab5d2a1ff489ae9b87413ab0bf5a5d030dd36c970f0ef6a69a30f2c9160e53e044c8cc4fcfad0c33fc81dd0f71f354811c5e82f16c23c5737d8c669030c6f08c6884806b99cb7cae580b446dbe4d18bb03a2dcfa1f81ba007ddd402ff5df63f89dc27e85a3ea8e67df849751fadab9222485b32f1f4248acc4f33b4f700b6592cd8bb6f49b7394058a0e0922f5cef803db48f1442af66d42ca870be855124e4ffa89c170690646f5ffba3732e2211bc98d6b00101343927606fe5d2a9df4973b2cd3078633473b3db1ec591f4a0a9250edf0f95d71164f28f4b2d4af8101744ad4732305a83a5f8927ffe8dc2447e4553043d4d1fdcc2c179148cd00787ab5c35405a5116089b56e0d8208a064be90bf35a0ec475b5f5d996d216bbb4aa08c724789f3f9e44a280de81a6eda5bd270984882cae16cc5421ba4496924c90859e7a08073483fba5b1f808706c0fa081f66ffca2c8b1e837a628574879e1590412f565e67b842afbad11de5050ddb0fb3f1426453dd88ee464b62780077262aae6b5bb7ef367b8f45f294e30e3a1c1c94eba5eda46951130a9d08b849ffef590eb15d7b92a5fb5d73d409fa2fe48100907ef43d2b8c1e326aaa8294cf48e0a9c1d929cef970c970610fb6d03435df4eedc271aa2623bfd000c4df7193bb4ebd200ad59e2a40943523727d66622c87b7acfaf0a43cf589038c563f4f4b4a9a4c54eaab13f1c6c190ddd44c1ea3a0836ad878b1bd9e2fb799a8a979725196e4469195ebdceddef5641e24b507a03cef302f65860b257cefe6bcf738e025d0dec448322929d3fd6dccc3b5809a9827b941c93339b93438af115b049690746ca65a52a7bbc7a6940d0197fb05a83f358791221de8c3b9a27e9cafd4e66d319f5155be5b82f556a757436da031fa50f93cee1ec2ad8ef51879c32956b4da25b39dd34907f924dc8312edd7f3c46412bbe047104c2fc19344003164e0c4dfb2f524162f54c5b5368abfd0cb0a0e75f927859a3a9d80738201e8f847200ea3b477812c564e6da0308a8aef5d2e87f35840ed367e976ef0341d74942816249c7dda3528ce67b027e251a4ceac529e2fd125fc949e606270fd8b879019f947086524d791089ea3efa309c0ddd1dd259cbd8e2b8a225e65d434bbeff39ef71ce2855f4d5fab1ca884d9374daeade68d6182c4a0eb2cecc9cc327894fea5b1fc7512ddf82a89522c147ba972c73f00de114c213b78cf7a0448015e251c864469e403db6bec2a4244efbb0894cf053c368b521c770f063c89728526a0fb252bc8a2115e8f067ae3cc69a6469da3935395ab9fcdde98befbb3443a526a5509dedb12665a239d1e245166f0b2addbe56d415d1234d086753360d728ffbe265e66a2a5e617522e3e584fe9213c34e9f6c86a43fcf885dfeee93be1de5375659a0bcdd72480e2fe64e4b81ca2b17f555c4bdfc0809cd484116db3180f117b4ed9162cb066b1f484a3392a1f4e9b69c0f81676ae0ca002be0bc5cd0c3660b26639ff0000000000000000808142612dda26dc444a5226c98f5e2883cd3ca594a44c29424f67e6ec0edec13b785746daa27d5d83430c100d910c76998a43168d9de3a2b5441c1587984b8c65f71427093a2d623499e29421c62c7977290e4a6ad0d10c2329ce1fa244490a1ae55d1cc571cbfcd4ad595c6d5114c714646dc61171fd560cc5c9de329b8d6d5a691014e74b1a52fc89b1428ac14f9c47dd3b67332dfc434f1c440c57ed7a5282e8b0138778295f88d5914d73c8896326151aa396b1bec34d1ca39f8a5557368d31d4c429834e519d51a6dec24c1ce49e69991295342bc4c4b97c66c4c8095ee26c22beb29524c4c85be224836bec568a9132aac429b897cc79e699b4881207b53b757b95af4e3d899365e6aaf85db7c59238886cf34a4224d19d46e21456a94f8eee9a1c217116f9d8bb8bbcf9c6479c3d9448a9b56293691c71b4a4eac644e6b7651a7116e57b71f26c74ef0c234e95b67f25cc87259559c4612ea8603aa2236319451cc3b4c3c29734bb78228e9a22978df5ffa51c11e7d21726f526751ef1439c84c89fa9429acb7232c4215dbcb28916e298116752b0a4c4e54c886394242b69638aa7e5419c949e855e890ae2102d4bcad4a3361a88a34a368fb33bef141087ad12df56b16dcefcc34165bf20db94a9fb7e3866fc2bd1c82602f4e160335a4b276e95690a01f8701491ef551fa9fc620a01f6709e18d3688a97c4ed5708a08793dd6bee5809a3b52b04c8c329d725ac88e649511502e0e1107d563646babc992a04b8c3c14acf5eb8db94bc2a04b0c3415348ba96c4d95a5508508793059b70df76eaf2a410800e672fbba4b2f46a9d4821c01c1ef50d52ef26450e87d93925a79642c2a4c4e1acb271d45a98a02f82c3c16c4bb3551a15e2fc869314194b25855c95d90d878b3613424a99f3b70d073d5d99440ef1f1d970de14b1a7ff46fa9e6b389ffbe98994b1eb520dc7dcced07d11b6734cc359dc2eac66e7f98968386de8665bac28d7cd190e2a41dae8bb94a2af33c331a405edf57aa9457565389d1ad991a627c3d942d4e4d998127a1fc3418c4c418bef623875bfaaee69ff1d79180e3168afdd5ed2f625301cfc6252b41a993e445f38fa668c74aec924a6bd7030e97b21652511b3eec2618387984d916462980b27916d5a1add2d9ccfc4c3d44d5a58aa8563c435f9772331d3998583f696cfe8d3665b62e1ac612ec9d2e87579b42b1cd4c48d19f38b6c49312b1c2e534a2a250b91cdb32a9c926c3e2d9deb15cfa87052d999c2cfc910beb3291c82e5d7aad90aadcea470aecc10369bce6bc959144ef93f37dd4b86bd6650385b30bd2b22664f38fa5712221bbc362b73c2c14724c973fe23e5d48453cf46fe8d39d355c484f3abac4f2c99971bb48443382dfdd27daf5595700aface549d90da7526e198646befe22abd45241c4ec49be8a6e4e56aea0807d3a659965cc7eb5246389eccbe2ab15245387de59e092a6ed2bd22c2b162c610f3aa9dfaac8670caa764247513bb9a2484f366cb667a31ef2a05e1b821f79a5603e19c7e429b55904906f10f4ee91b49c98fffe8ea8353f21415553f574bda8373b689ad1ad7ac16e5c121aaa664dd1bc3ebdcc1d136ca05f9a20e8ef9f59af299c54b31076749c9c34c48ccbf210ece59694c3dc31b9cbdccb3421e0d12b7c1b9ff446551322357abc149c510b641c64b443438995b6e18211b54b408016670ca96da2eb3a971647d1602c8e00d6e11d316b8a700053d52043062b1266bcdea2e2144b1ec8aa3a4052545b68758ed021f5b4ce083d8173b7278110218b0388cd660ef27921c952d18af384511715294521bc54f18ae38462de15a97a51ead38789ba4104e89a8b96f7bf400062b8ef5bb7379eddf92b21a35b86018ab38898f301d01862ab20c21ee58add5292b156a6becb260999a258589d55bce9887921cb2ef0860a0e290bd66848b8837275c0e9ce268326e4e9698592b8b6098e29432ee9dcc174bc1e950b92ba6524871d093d9fbc8959b94c846714a3791644ccc6d885b71008628dc2ffd8cf5591b4c2f608402cb96412488bbc56c754ddb63b93c7e56655d509c3668fc11f9ddba69732d80f189b37688bce31a844abda2270e42e6b8eb9e4c7a92d5c13480d189e3b7578813d3624993d7a8c189c3c68a7fb24d09cd61d9c45154851f91294594cd5f78910386268ee96ee25d5f101df776e4e813f0405645ec03303271ee2cb5615bab8426254c9c3c548a19d7ed2ee60b8c4b9c9488ff4be3c1b0c429a9149594ac93065200a3127ffac9f078b57b63008312a74a21263bd9f688a3c39844bac272a3dc3a1286240e328ee9ba689ec9b40904302271da952072bb892ca3319038c9d6d896ee828799ca234e93762c34842b21d583e10853359966585688b9a27765c84df28de75f13188d384daa7c2ed75b2efa36d785175cc060c441a96e3ab7d31b3445602ce25c19312c5fad30147194a025538a7ae395390c6024e25c4a2696a8ac24c36e1fc040c4b9c56742ac18f237e50f711e19e4ec439e1236ae214eaa4725a9e12b442ae9176014e27079f29c85d708355a429c4d9ff7e6aa741e3a843188c309a5c486e44b1f2906b36008e2b46eed9a5d336cae0947d68d14a0e09800390e1b2410e78b612268a9184e2bc25d9c1a35b80b870188e35d8a09796bef435f1500c18d17c0f8c3a97245089b41a5ecb3332003187e385ac8fdb27f1daa82d22e00461f8e963169cc58595743e7c37147e686fa88a031ad3d1cadc72e85b845522baa5103e5a851a3070c3d1cbb420915e44accff770260e4e124840a762a4f6b44c7c32955102e31f6062df13b1c378d8c5775a7ad263b9c2d499079ba11538dea7092f154d2933458bf880ee713997d136e294f348783bddd6931a55c2f2d87c369997677137fafe37036cd74c23275af88e1708c4d5242b0a053b67dc3216deaa755f4dd70ae206206f39a7079fc361cef4e4ece78c87bcdb3e13017535e1b13b96cf9351c638a84942da5d590f26a38be98cf971a910b299f86c369f83a3f7d299bf76838eca61c4ae5bacde2fd19ce6f42ff6f43de0c27b3379f282256d35e8643bea092249577214f64388bb20ebfead31992c670b608fe25aed9ee23319cdaef444a8d1234ce613865b2982626e664cc6038dd9ecc5ce991f3f1178e174309a1366688de7ae1e09222e6965a95547a17ce992349a911caba47e7c2297647ca63c1b494c5b770764d1942ff732d9c33f5ee2afb9ba4ceb370d40d4a4dd096f2fee65838c9d430ed9754d668f9158e56a154964d23b442dc0ae70b29563ab9ec4d7e150e62cee4ad4e5c0ea54485735cb0701164b2bf284de17c49e74c88a47048a6a6949f76851414858366bee42582c4cc180ac793a6aa6ab4043de1279c268b9e8c942187c909a7bbacb7d9f8b3a5269c27cebbcbc5b42566c2d9bb626dc83ccbe92ee11c39754496bc2025ab84e3291dbd27539d6d3409678b6a9b2145f77e0f0907ad4c9adc3a63fcee08c7f649229345f8d02c19e118ee7f2c63358bb252114e936da348d2a44e7d221c92cacf900bbd24fb211c247e48905917c2e14ee7c9bf67dacc83704e4922669a0484a3aac8d90d9b4d823f389cd6156f8d16373e389e2893d974cd584af7e068424e4490a494982c0fcee7225a2bb2c411ede018da4b47aebc31c8540747bd9c1bbf746ac53307c710a2e9164d22531e078793296d839818827883d3851d4b3fe6293ab4c1292999b725acc8996b700cf145c304dbf896a1c1c984a9cdc8bd8c7f06a7d63d9997820c0c199c34cce2cffb258b0bc5e224e26cde101682c5498f4c1beeac7457825e7190d925e3dbaeab7e579c54b89098729f8cfcad38e5d08b964ecc8a832ca52459fce54bfa2a4e595f47d4af8c1625551c2497d02745444836a5e22cdfb26983fad1bd5171106db2152165d6529fe22c62b97af285a54a9be2982f824b48e15a7dee529cd654446613b5f07293e2a452d77b63c4a035dba3384f0a314cdda5901a6d519c623cdf43f298cc6587e29844ca9f73f9d5be69509c33a9cea4d44f509ee94f1c3447cc1ad222a5cbb5270e6a82f8f2bd3d75ad3b71caf2e6a64e37c68c3527cea74ae51d194b9ac57a13e7cdf1a24579c78590d6c4a92ec652243967e2a8412e8dcc11fab13326ce22635c8d99fb91135fe27096a17bb95162ba6c89e3e958ca68b33531ca9538e8ad509994dc1813654a9ccc73777db277f5c99338850ce2eec645de4596c4a9c4c9ec191b2c280d47e2f4155f6a948a91548621714c5a19ceb354d53f7ec44989dfb017b42a6e8e1d71ccee71c254dc88d34b50535b92c5c367c4e9ca628a584a95a87c11c7583f1384b864fd92220e693d94cc78322bda89384fce982b4c57369d1171d078a2fddc269ac58738c85329e1ef4bfeb88638a7c42464f9b8681016e270a75daf9a9a3b834b885308d38da43e8402fc9c8a589d5db2526670dc9357adb04105e9990c191c3fe332879d29e1a5581c342eae82f6ed93112cce13d66244912dafc1579c5ab3a568a8a02642ca158734428bcaddb4134bad38f885c8d6a6e44c875871ea4ed31449c9d2afaee29862c5b4381b559c5ab45ac9ba24445409173cf2630b07181d315271ee51a5212a3a633d54c438c5295afb6871b318771c5ee45801960e3e0bc430c539d335922c3bcb3df1521c94d5a65909b1581191e23c1755a27586983675558e20600a35106314872422d26a8210fab7540110dc08410c511c63639e302f91c95b544a280e42d896a904adac51509c7af4b8883012572ffe897309a1652b9ed03495e48953df49b3cd6377e2ac3d41c8f30b494e0e9d108313278d623a33542ba54c5931c4d8c4414c55bbbba6658bae89536e9df9ac9810794f9938a551b135745f4c21274c9c54255131850f6f0fd3254ea5a7f2e955bf6c4a6d8983bb9f4c147956e22c29ef4c5869a74c0a25ce3b3f72ce7543cc7b9338669b89965c2489f3bd05d3dc164d5cb5489ce4966e9894a247a2021e27f00cecb0c0878d18903046ee4cde65263135db43eeddc80bd2439cf41187982f2bd68a4cd2ded0a1836fac7d6ce1800f1d3a14e05df07827418e1e0586188e3869a4b91242059529c508156234e2185bbc648a12e41f363e3eb698c047a12106230e7a629cda6eb9caa367428c45548aa188e308fb495b73329dbcbe7009d4d8188938871057a92cc44f0d1b1187d3111a544c1644ccea165eb806bcf01e8738a40aa53e33ab9f9850870e26420c439c574546f9bb5888b38a8f58c6d6946013e2dc7e7669292983384dead75821d825159d200e4a6912522c5f8138c4526f2a7206abdd1f10c720df4aa98e496162fe0f272d4aa698595476dfe48753573611356812ef3feac34992d8cdb527ff3583f870aa103505c937ba3305ede1183231494d922d8a50ebe1a89b74a6a4bace23d87938c9f096d3cb529d968c87a3e411e22d9ef8578cef7052a72688dec994c45d3b1cd30435a733bb7538c6d89b1b62299341a37438a65027328a087944cc399c4e86f47bfa8448d4510e278d16c14d36885b11c6e1d4fbb71365accba2050ea735133fa2497358e50da73e53fd50f245588a71c339e2082d1125c6b790d286c38bf6cf905c361c53ded49a61cdfc526e0d8770ea724e28af5e93c550c3216c5a5da90b3bf2b3186938af2569717162d4ac2c061a4e97194c59b54732b5629ce1b4da27965749657c663846d38cdb2a7e19ce19f2b53e6b0e420c321cdd37f754c3537dc7311c6652d54a76adbd608e1e3954b01f5b38c08b1c3d7270e0c68d1a35528d1ace801a356e0c2286184e5d21c95b37193f698323c370f80a9ff7896ba7bd39cd410c309ce289784155b210315d10e30b27d792f2916a43c8aa716479175c58f90e12e4e8a182185e38092da59537db38b2ce7a200b0e046ad4e0a2478c2e9c349ffcbad36aad99e3f8d8c2013a88c18593688fa98e06a133c22d1cb2c808899adfb42bab3488a18563e89df0a2fb0b6264e194fc4c8252b9ca4e7f0631b070dad82fa2265699c22b9c82924196c5e59ed1ff468f1c26e8c15bd4a8d1c3043db86258e194472513d7247f6f4238322b00821b288851858396e0e12be9db3b4c461511830a5efe6592e1b529f33a74b00d38c498c2497dc4976f1377a78238b2ca0a3803356a602286140e4aeee990f924eae66a1331a2704ca999fe34baa7ef860685d3ec5dcb8c7a889d5f0c077270a1001b17c8c0a981b8e8e2864522c6134e21658d55f1fdcc27bde1859320cb0b77408d1a1ac309277d93b6a1d25788d1c491d5e30b37c10d944347a7808b1b2be02eec02319a70d2a8d79fd9f2fde8056b8f2f5c02550788c184e39d5efbf510179b23473b78eca0408d1a356ad4b0f1f1b185036c7c7c6ce1800f05d8e0b1822ddc04ac630136b698007260015df0f81b3a90a71b5cf4a8ab1e39b8e0428049c458022aa4898c4a7fa9da400c251c47aea98d255c76fda26f98fd8e0d282146124ea144588b33577f96c791f5850e2eb86062356ae0f0c2af070972fc0e1e28b3100309276991542593be9b333fc2496db47f25a9a5648a4638ca06f55096d63764a508e72c9119245f508f95dc301ab0f1d1811d29e0a131887012f67f696c36de3f017b1737be883184e359b80f5d5e216d3c1d3dba500016daf1458f8280184238884bcca153e4eedc8c2359c06301356a2467018fb62c418c20a82199c9ca96c8619d20078e1e355c47b3172a2005bd880104f25eaba4dc305b1f477a91020aec68400662fce0a8ad7e3b7bbef9fa8ce183765dc4db941f88d1032b6ce9b893bb730c1e1c2fa49f20afb61ef20d12ecc8d1230557e880183b38e75a12d31444f8d7ae83738973cb9a42a4d70c0121460e4e29cf354f3439172ec20131755ace0ead10c9964234e6b6fb532b374a1c5959baf0820b13c4b8c1c1f32ea894ec3786f0e9d0c136f6465d0f62d8e020630a93d2447d09b52119f8b0f14130f07181097ce8e0e20439b000d08418353857d8537af12b56efb81583062791b7652be811b9a255378618333804e9a592964897134bdc0509b848c18d1d3c7487053650a3460f13f0e081e338c0630ba7408d1aa7821a357ad4a891f6851832388ff5481f99d5e25c1f363eb698c087d50da38602c4e23c964cd64e051da200b0386798ab6c5e5d9794f01587b4a5ef55bea102132836a200ae384591bf92e5d47caddc8af3455113b57619512d38b25460821b850312b000fca100ac388a9a704ac431c999ff2a8ea6af95fe4d5f734eaa389b6a39d592649fc5522a8e252eb344f37aabac5171b8184285e0172c55c4a73809cf0c413cd67dbb35c541a85c976773eefe494b71ec13fd8bf10c290ef935a88c14e3971fc529d6253922a9fc74780510c5f1bcf292ded0b129a94371ac18b289e45e41be9c38b26ef0483a820280e2a03a237292549477f913e7380bb159dbc2950a0e12e4e802bf009e388cc59aad89685ff277e294355cfc2a6d3ad8bde861ea630b07d820c18e1ceb05e0c4514b3c64834c2ad6be9b38fec7ce28ed357152b623d3c4778d2c5b260edb999523e6c8da8789c3c9203efb37092f0b5de218522f5688b4545a214b9c278553567994126f62258e36bae4648da2fb54a6c4414eca5f39152d2895491c476eda481f5ee27794c4d97493e79bc6fe8d5f244ea2e75737b6e6825e2071ca154f79652bd51f2a0578c4f1b466b2ec890abbad008e38998ccda34cc65026b40234e2583649acfea9df18210560c4c14b08511d2287f07c11876c262c65ddc42e9322ce73b6f9b74a261945893866cca62aa910228e4166cd1692d4f7d78738860c3198d4144a4686386cac0957316f86ad85389d8cbc56a5fc02104291d8f7e639fe208ebe6d7e224732a99b17c431a620d3a80baa69970f44d274bae9d60788b3bbede9d9cddb16fbc361a4089927b65e7df57e388efc1891f276f349be0fe73871b5c1e2e9b29d0fe750b70a53ef3ee1dec329e9da9b98a33559ac87e3a4bdcc7c12af77ccc3b1e4daa25aedde8b8e87b39f9cb02225decce6773895ca26b9628a9cf2dbe17c428eaac6e492d75487a30495d72ac9b74b233a9c239ccc757ed59bed1c4ea564ddc6dff2b4560e07592a8b0e91bc4450c5e1ecbbf12f49bbd2934a703845cf375ded233243d21bce22927d935976ddb81b0ed2f52658dcd00dda369c46253b2563cfa67ad970583f3b8dba77bbc9359c35dc8205bf641347351c5e93ae4821de6fdca4e1246ebfebc44bdf5ed070b4b65a15597bd596339c44892821cb5d4cf0cc7090f2be69a5922c9395e12c73a6126b57a2c4c8701e255264aaebbc3f86d3a7df6f29990b496238ca77cc55d46fcb160ac33167550a65a945ab426038a8ee1611d4087de1143b628a1be32b2dd45e38e7cba511c2eec2e95b478b08d63e1be5c229c59ca8de379bb4b885938ca85db9f6a6086ae1b43e6a530c2779e4a6b3708c7f5d22ddc32c7c8d85436e951f99f2c5d7eb2b1c8308e982564813f4d65638e6718b2edadd7c245d85630c4288d44ba99621a6c2c13396887c6b29ee86a770ec4f9d9fb0deea1696c221d90649eaa2644b328ec259344e8410fdf2c51f0aa7b52bbb8bad11fbf484a3ea841896f2fc8c92138e17d16c65e6920c77134ec154a29dfbc6ec31130e56794da41dada2db259c5a2fe858c8bba3a7128e16248e121927ceca249c4b974c9376bf31099170d4d21d3a5463338647385890d922fab7a98b31c2496cb4a92f5d118ebaa1749d7f6588468453ceb4ff97bff49a4338c86b8cde55fe6f4a08e70c3b269b5d7357b2413889d31e08078fa44ae4cc7f70eed0106d4fc9dcc53e38bff7bac448165ae9c1698469ca7dbdc54e7970b44a4145970a1519b383c3874cf89057a3221d1c53a99ca916612e557270c859aa828dfcfdfc70704ac16277c9e073ed0d4e35c9e5e2c5864e6d704c296ed259f57fa6d5e0143cd268044b0b4083631caf519955e5b4d202cce0a465b1a6fba4989e680164704c6a9db975416888682c8e95f54e5ce75cf80916a7284284b459e46535bde2a45d29e4ce78ab69e48a43748d9a1bf32d16d48a93ce4c2555b5f34b99ac382815d5db3c5cc521d755aa2bf1d06351c56974d5dd6aa4d701478cb1a5c30c2b9c6f26d56c7e0de51bafc2b192f211ed17e3ed2851e19823bcf455dd229e690aa78fb10c93d362a94d92c2c947376fa48b3b16425138e78ca626212ccc97080ac74a9bfadd1af4845370572da941f3326e271c6b3b7434f44ea8186ec2c9433c63ecbaffd9cb844394cb1b7b0b2b42ad4b389990c142f9f9878ea8120e79b6469e503309875395b9528fd8bd1d09c7ea8a2363a25becf208e7adb71ed316764d658c708e98d75cc36cc4e98b70963457a5420a7bb613e1a04f424a61af36f31ec231cdf8c8289752094d11c2294befb7e25d4cd4581052a5192a63f04bd1d5a851a3c68dc26ac40c209c26978c272ec8dc89a91f1c3c3c4cfc85091197941e2c600a7cd8f8f8c20b2e4e70d28e1c12f8a20b4f01063e6c7cd8f8f8c225f061e3c3c6c70c1f9cab467d929820a285520f4e49ebd6ebb7474bb67970acdc3e797576be36bd8363dc60d99647f4b6cf193a38a98611312bab39388ceed2dab14d65318883d37a98490e8d31f1373730cf995908d9aa7ee381193638db6a48a54ec3c4fc961a1ce45668889882ef6f368306a9ddbc2703ce8c196c95a3da4d3ccc90c1f1635c82e90c6f19366b565eb0c04590452c0e293f369bd4d6de15c1e2b0eaa1b1a517fa358f232bb9174cb278c541b9b9b6f7bc298d25ca9176e4b8612c0b579c2ae9e41fcbbf4fcb6cd4a8d18a93d4202fcff2b748fe5971fa3fa52b42b85115321af8b09120f0b1c5043e7615e7f1f1af96afde246755582b624b85b0a75b2ace5d4a0959dd74a390052a1e2132c8ebaacd183c45e2275757b24d713e0b57e52bdf2b32548aab52898d395b773b438a43cc6427321a7d4fb7a34057be2c126bdd623489e2dcd5bf9b2bb2a1b0f4d744956b12f247509c924827fd4febb98df2139990b982e889270ee93b5bb48520e63cec44a6238ee90599e3b4cd89e325faefe8d3b7d904c1fa5624b886d2716be21454481b277226c81b9208dba7dd61e2a09a5fb6326f8530214cc8e2122735cda452504a8418f49638652599e466e96f36b512474db5a3f17ad395fd9438a535a54bb47fd5743f89a35fb264b3135d6c4b92389ef8d806af0c174f1d8993ec4a49852b31134943e2a094b6f8f79caa8df91167773f911976471c83dc98436d879d97da88431021e777a88cdc2464c4415de6fd0b29e84f7a1167efb970a71552854b51c4f157e36faeb3532b27e220b4d62419f3efe91171329fd73caf93c564873877c94e1165224370ed957945a85b88d36daadfa81b25c4b94a7fe84ba22983389c8998097512c4496ca6d8c58a23a9bb401cf3e44fd8b8eae3bb01e21445e6b11f9154d26ffde124c17d4448fc189bac1f0e9b5b54ad6d699c50e9d18743be705ad7633742167c3808110ba55d4d788c4a8f3d1cf3955cef513186d1bd1ece5b42fee65436e8bbf37092351153e474866b190f872d69e14aa237842cee70ca482265bbbd53eaa238b2520a59d8e120430a29c9c4f40c616b4216753865320b525288a1c37147af8c5222650ee79349099976b25fcb2787939bf9c4f1bbd1bbc88d2fbaf08270c127b82564118793556aa6bed03231fd1b59c0418b9b5eb69be44699deb0c9332f99ebaaa7213734e9c5f4e67847b80d462c17d521c664cd86de75c366650dfc8698cb356ee4580d9e885efaa77589b869e84627a4287a7ed2b26858dc4db453479b7a8643f39d5a10ad5cb31936cb97526e6adbba5986f4eb23dcfbc59d5892013f53b931337f08c7603095aa725910da220663448bcdc2503839a9f2ad978aeab200c3bd624a34e369fb85b39ac8a654c4ae79b98aebe80543165ec0b246d8d394c354ba70f24b15e7c2f142d7a87ad5d950a62d1cd2da5d55bc85234b0b27319682b4cf545a9285430cd56ed71e7a833661e110457e44e5eb4d5319b590c5154eea4da679cba40a416e85635affbb77d37967f115b2a8c26943543d1582b618e38423ab87a74007eb19b2a0c215218e7cf989ba594ce1944b97d4fa9c35b996134316523856fa5e92b4210e30097cd8f8a830641185345c451608594021539324e225df24539ff0bf262bb91d4d3a21a57247657799f9139b908d1eabc92d5fa2c4842aa660277e344e4c971a174c012c52592ce16029e5258da7440d29e1a04ceb4eaa1c8922fc241c4f778586a43766b19170fd99de73bbe017a2239ce4a9cc8a5162cf336484b3c4bfd9b1b87b33ea229cbb248da63735114e196c72862caf9a631e021bd1f6ac5488f48e85e0e613731f6e1642ac4138e6881b2bbfafab6c40385d956db45319b258fa8364a6e5c8dce951a5f4c12be1da45cee50c33f6e0d81afe2eeb7e6549220f8c29c89f90ac363b38e87b69566d8971aad18131c68f13e95f77cf1c20ab410597d9d41de2a0d8ac5142f7aeafc5dce009164dcc658b2c6c7074bdca0d7a3d3437a506c7f189125257d2b59506a78a95ffc3af191cb2feaae54c224f4a2e0b199c646fc6c2733f8ec5e1dc7fc485284bfd617158bfa8ab97e762685e718c6f16ed448ac91562ae389cd2a4a9acac569c4bc9ab647a2e561cf5c45492ba3d5b4aab38850a4dbd9c667a3c620019aae842462a5c200315c7ec22a34bc90ce976c1c301324e813e31db3a5a35054264eb9097ea249a482912bfefd6105d445b4851accce41625b6a9866c26fac5b27977edf5e506175cc6059fe09605324671aa3022e688991491218a536caaa5a8ba85e2e4eb234e28494953048a830865296b587851ca4f9cf36b35c549594bbff7c4b1d49df7c81022319e3a71b4aebc194d53ec75cc89a3a588646223e3acd74d1ce32459eb73bfc1848a264e4186c81c256a2aeb750319993867a51856b2bd23bd24820c4c9c43a8d6ce182a9738ce0619f443a647b64b053e6c7c3cc00b1e2a4021c8b0c451475e55bfd596d2898c4a1cf62d7225b12c6d4916041994a81a3a644ce278c2de56c64a9b6537013224719294cadddbd3bebb812601199138289bd8a6395396d1bd601d5a5eb0c0cf860c489c56255ba50a2f2b157bc4b9f2ac8fc52cfadbe266136438e270a2436605d5bdea59324146234ea694b2edcb79398238b720831147cf9418e7ee63412e5a90b188d3f6c7f89dec90f1e48a3858aaf21271ae34d22413711aa15af742746c336804321071b624d625e524fde81b4716561ee2e01ac36a4f5232b35e1c593dbae0517270a1000754824286210e16236e7db8451279538883b00d1317536a9251254106218ea5bffc6a2468482647828c419c468dd8089671b4dfe5ae204310e7de28415a493e10c79076bbdfe1b7e59a156400e2d85f3a7d75c25dd2e71f8eae7e2189d81bf1aea620c30fa7ca2e526735f49f3dbcd8c166fa700a91da1d32f870ce52237486fba8d1f68d1b5f74c13b72b46940c61e4e292865c1fa3ad47e5d6190a187b34a189537236c2ac8c8c3b175a4dac6edadef0b37011ece63a7d3922c7d49fcbfc3218ef4cb6f6221c5f2ed702e11ffea8f7c1d8e1b4f7b4d8b8a8cdee9707c37bd316449e2d4c8e770cc5b42b4c97b4d53bb1c8ea5765b84983d0ea710aafbec2bc431cfe170b23dada649b3d2dff486632cdd9932f5c8979bdc70ba207629993097a8a5369c4b97ce9ff9b8ca8ed870bcf8324184ee984ba3359c4bbd64a5d508173aa486938ee589a3ebae94084ac3c93484d6d0982f468ee0c85a94818683c68839b1a4ecf9dd67389bd76eaa4c79f1c336c3293cc4a88d9bf869ca701027ad4afa871ee591e178a131fa9e9a5f92f118ce15ff6f4a98d07b8bc5703c7773135641adf96138e8c6cf10bcc4db0881e1683361f74e8a0c537fe13c5bd66b295e4c95f4c2416acc3def15346cd9855384a472ba8d107a625c38678bbd4557f5d1d56ee198b73684a49e75915a2d1cc3fbe9d2e33e52f72c1c46d7c4235d890922160e49a90d0fbd32972b7a85e3481c4b4286d85d12b5c2e16deef4863ecb94afc251b29f5a88318fe834a97032a163b7b4c97e573985e3cf9b89e4f5719f1bdf485e0c0632a470f83f719ad15323c5a370d6b9bb0ce61daf21281cd2a489314f149f70485f112dfbfc26b9a013dcf70dbb2a5a5a2b37017bd1c3901e29e882c716329a708e3cb21234c72c2b64c25173d5e6badaebe597704c197715b9a02ed84a38678855254d6c927008494cbc06b9653a525d78c1850e6420e1142ee9899142cc11ce226e63d4f8e63951231c3d2d336a789d0ab314e17cd9265468ad10e11c7984889ba5ffa4a40ce15849b3d9deb7b785847090f357162abe209cc5ace64a5f33fd7a4038f799d6c9b42f6ed1fbc1f18298b1d838d50cef9940860f4ea2ee542ecda949dcc838c0e377402093878c1e9cac4323dd690f1562100d0864f0e0b8e1397a9b4182a99080c704d28e1c0da851a3460d193b386f6b5cf9aa998ba50c1d1cd29e5e53ebef1bcc1c1c4574d8c746fed2e2e0202ef75e69b7fef306e7d7b47be9362f54ea6c7072db14e2568f180fd5e0ece5161392d09659d3e0045a90e17ca934a59cbc2dd1445a8ce1187f26a60b1ed2420ca78b91c164b26eadda8a8d8f06d4a8a14518ce3be12b69a8b3481dff400b309ce27c978eeedc075a7ce194662269acdab94e8bd1c20b5a74e19429e2677b267164e9e01c27c831012f729c20878e1b38bce0c2130bb4e0c2c92405bf5849e966ddb7703461966d112ce5905d0be70afee6a1ede297495938fec5ca699f419ab0202c9cbf7b3d2e8efaf4b0af708c23d6fc22c86c166b2b9c949e8d14339d8b7f5c859314d57abf31ce365d2a1ce6646e4b59d2291c52a4acabafeeb45aa570ccf0af7ff269140e621ea76b9325357a289c62588c4bd2d72694f884837ce5ba77aafa57c609e711a3d249bedbcc4c69c251448ec913ec3c7e64c2b1b3e2a533f11bffb2251cadf7fd94c6cae5a5128e49c5bcd2d85512cebf769a7545241c2e62aa6c31a77d6cc8113071114f73995c6b6104d3a208c731cf8aa57e1a475b5a10e128de2529e4cb3f994938b2aeee145a0c01055a08e1a4d96af5545313800cb408c2f994ba98ea4d89aa8b6a420b209c3655bc8dfb11c917929dd0e207c732bb8b97cc1d3c4a55d56aa22967751500c18d0038420b1f1c54fa6e59260d7ae74e396eece09110d861813268d1838389f13f95fd4b7b37ce7270c137ac0220b8f1002d7870b2b090e26e8486c4b4d8c1c9f67f3df52ef9afa46ed4565e420b1d9ccb66256c658cfe5572910213f0e031818f2d26a0450e8e2f7b992b85541a4f8383e36a0871aa3cb3c8a9bc418b1b9c42b88bb3145b9a6a2d6c7050d597513484b4d1ffc3c6878d52062d6a704ef7536ae452760f2d0dce9b75368f7a5998b88aa0c50c4e1e9eaaa63926821632387c8898d452df66f7502c0e1635a512b25b52962e051ab03889bdac571924c9efe515c7ddacfc5317e48991b9e218594f448344dbb1dc0768b4e2943c64ae62ca2831285d80062bceea9e0281c62a0e1a7c2c6d54d91729e2c8ea1340e00bf461638b01e480862a0e7127bd5a06792a8e2293b464ad8a8a6365cf20f154a428a93cc5e95a6b54d6921076421aa63898bef067eb93dda246a3146737d115943cd5b412a2011aa438a9a41b47aeebec442e98024b22406314a720e2fce5a8ec57fa17c5e9cbb4239e301349e84371ccb515bc427b501c35069959f34b52effd1367970b0b7226954a49f7c4c9b5ceaf5f557462a913a7b5d08bf8a14eec6a4e9cad2ca891a9328c05e526ce122d066d1a494d1c4cbde50e65314da53013c7925c3b17512e538f8943b61034ace9ae6bfb97384b509143099182a849952f5c023a18f19840d63e8086254e719d21a9083927269127d0a8c4d972ce4bd69b52193f254e2a9a296e86be723d994063126789b12446bfb91aaf2571daf313a1196b24ce751adc8218f19a720b8106244eb65bbaf2c5d3230e692789adbfcb47b0a340c311a78c27f2886c159bb56934e2e497cd3d67650fd060c4b1fcc5d27c8ff492fa224e7731545d8bfa8fdd716429096828c2a8a96b63badf1da523d048c4498834665f5293eecb79246c010d441cb2c9cc790f25bfef510e7158b1ec1dba9448f18e888086214ea6b662cad22caf2fe1c8caa1c34c05340a915c9d115a66a23138b4d020c4392da98d9ef93b5c05dec5204e93d732c650c9b2bec1913b18990e1a8238da770625b4a88a35a912d008c4c14de6b6d62ded977c401ce38b9e8765ce0621fac3495faad6ab8d21a688fd70ccae1825fb25959c993e1cd5d2abdb57ca09b1f0e11044d896a4173183f6f670b69399fbf7254ae6087bc10c487e23150b801868e8e1986d5d97629c9b66d03a81461e0e6e132d2d2515255588878367b82ab92e675db126d0b8c3e9ab2b6d979460f9aa1d4c53939431b357c5544bd2a8c329c8d81ba2b299bbc4940ee78a621737464f630e671713425eaf480934e4700e312a5206edeff95f1c0e172e575e30a57bf304e170ae98d3344e8dbab5f41bce96a12fbef548c30d67abe83aaaad9d5d3a8d361ceddc52858ece492a57011a6c38d569dedb1469f24a72c353d9c7160e48018d359c3ad3e2084b0d22671047168f948282000d359c3749cb743d150f34d2700eafa4b4881725259e77a08186c36688f4a7f62df45b68071a6738e78b90a7bfa144b4988619da206c448c85940e34ca7052fbfb2743dced1fdd0d8106194ed133fddf3bdd34a44c0e34c6709011c27bcf08eda1b25571a02186735dd2e613ebb4bb9578a414f4b85170a01186e3844f93f8a66d6be30b86d3ef8810e2c810dfdbc208d0f8c2d97229a1ee6b82454a0f34bc7034b97cb11bda37d0e8c24934cd57d07c52416252ae037d61a3460dd781bef0010d2e9cffb2fd89cecc9b7cc691c5021a5b386851dfdd6ae17c163ce3feacf66a9f85531261225e34516b0f0d2c9ccf2acfa60ba652b318041a5738bc564a769da012948686154e329249322fa939fdac29d0a8c2416f3763b09352e17cbdc1349c89c6148e77691a0d299cf244b50ae2ba6492208eac8f2d1c9074788ea711857396fa2853f149567d6ce18013d080c2e1823e25628f4df2d08e1474e1c58d4e418f3408bc80c6130e4959ba549ad46d1a4e38e8fbde6c5d6b5a36ba2347d90d1a4d38f7297d51e48be54b6a261c24a75b1e95527c95fc0d10d058826182aec823c1fa2b38b24cf5a0a1842e098dadb089a66f9484c226adbaba6e6de162470edb62021f2750c151dbc183d40954e05fd040c241d9ab5b6b57feaf128d231c46ed4ce6dc7c27734ac308a7db165de925aafead348a703eb514f294dd9cfcbec5878d8f0d7c5c60021f1500c10d0bd020c23125ff469f7c0fe164495b85d25109e12c23d2e7e4dd434c88a11184635c91d1dfc4d906f58170dede103c356329a5175df0e8c1053b0e5d008d1f1cfff4e892a32d9bee900f0eef1353f3c986f3757770912377a44095460fce262c949c8bf2a2fef3e05497ab654c88df9cfd0e0e97aa7dc446986826e9e0a4135cb25b8e72700a977448f2fc5917110e4e3255125b42958bcb7d83f37da57dc87e6c5edb0627a57bb1279cc821a45c83934cc8e12132f7c65cd2e07017593383838d2a25b72dac5e3f1a3238a9a6b7c55adaab8bcc88c569c5f48d1e6dbe97d22367c0e298bbf45ed4feba792407175cb08e2e5c053c76f0d871830b5e418f2d33e315e7534f8b135d99929dae38c94bfe8aa03ede24d88ae35a56ec11a625c690c28ac3a8cfaaee5023c37bab3884ef4c1d5d79551cbb74afc41b9521857c2a4e2184288999d224eb081527ed21920c41a738caa8d212845222bbc5a6387d5584972429bddf5b8ae309097f29ead59ac5dd1b0001521cf3a4d86bef79a65b4671d80dbdeebba0e4a6268a83fcca8db8ed4371962ce2fe52cefca931a0386b96247f54059314e4199f388e47fcbf0e793293c513e76abb535de262c5a875e2203f5bab9252323ef1199c38c8e8750bfa346e33326313a74bd36aff7f3184909ba18937758d48657b268e29ea59eb27b1f3b29838fce7b7a888a32e968506332e7148495a556989a9309a199638ed99fb2555229990b91227adfba57a7e9b72492941be9dd150129418b88014664ce2e85ef9e45a4c5f881328cc90c471276dd021a4a52036291227bf1b31af6b9fd937240e9a4c58d0d39f2429f988538910e4dae813cae438c311273d93cb3b2b74010b5480021390400420b07698d188d3c8b4f1e45650b26f67c4318493b12d84a6743167e3835ce0c3c607b1c0878d0f52810f1b1f84021f363ec8043e6c7c10097cd8f82011f8b8c0043e1671349b94224dacf9312d0fa4818bc30c459c849c18a2c8e8a27c836e981acc48c4b1675d9490d7382353377ae4a851e306d7a8f1859a1e3d6620e2202b9d9ad4a6439ced6646958cafba6c5a176618e264423f45c5df7978612090786c51a3c6176e82b2f141bcd8e127701de7e30213f8985188f36913a7b49aca15218e61eb4dc3955a945ca61d65b586198338e65b2d559135e7c810fd6286208ec9447e4d415d1cd39a401c4747ca89ad21851715409c5e4684f4626232d8f787b3c5fac65397f26e4ffc7098effa79d3661f4e2aa67c96a486d8d7241f789720934890eba3d68c3d9cc2d2543ed4a9dd10eae17c6232262f65e98418e50137cd596229b9c23467aa18ea719691b4f161038b30030f07edbdaaaa31424c327287a36e4d8a64ea72232c3b1c62907b298732b117ed8c3a9c2e8d4a319252c93586cca0c37173fbc4ef52feed118eac1ba65c05397aecf0ef916367cce1e825d3c6fada253d4972385a6de53abb188390c6e1d82b3e3f32b6291183e0708e24f25a9efaf5f9bee12439d4b9e8fcdb85dc703813b1841e6d4a6a18db7050166450f25a4fa80a1b8ee763b7beb7732a66d670cea8d92fe966932136351c92daf910b12c2593f9341ca2998ad0a55f4350d170d099197429198fe4a5331ca4c810a4c886b788b4198ee94e86985448298952194e564978c88a2d190edf6b31eec51cc351b49c9ccc0a135152c470fa5953bb1246dd2655180ecaf2bb52a810be33990186534493a5a49ffd85e3a94d29deec8bdf89ccf0c2693dfe6e75fc2e9c2ecef955fa888949ce8593c498761bac54489ab4855348951332762bbba916ce21b30699d5176e0100c28c2c9c42a64d6e516621fa7dc20c2c9c7266b48d725b15665ce1f0aa2131bc268be1a8848dc542a2481c0c8843a15018140830722600a31408001834200a8542d1609cabe40714800341302a40322a16221c121218120e160e0443613040180a83c26030180c0603c322518514f2b001e1106e595bacfe2ae8a2d8983b649e0d1cad2e9a6000247a8f0ba61857663eb5239015e5b692f84b17277fc5b363a550b884aabab64bbca2eee06971030ca99322e4ee3b0a3cf12d667b8f34a1f04b105be11dd9f811c6c9e7fe935e7b2798f4e2341ef917304d6544d1211a188b8a8c0928df24b7550615264f09a691c8b61ee053dae488a478c82595f28873e431ce2692f4023d66066fc70b6b1e41c89fdca696bef16c2bf98d9e61773cc923cad70aa2047699ef3b0e9e2229bf69362986d9bd73c8d9c469ce2d738421acedf22c13186e365716930696ee106de5c0f4c91d3d99042c16534a0f7e56f234e0d88acc33415783b82e24238e51787b2e44403de0203a9d78eb769bc107945f3d420f70f83c92d42c4436c8fdeca48a5c512a258e8931268dc8c64c51c6a29d5811399a2224d82a80aff6191ff394f44c895aca35a48c3b89a99cc234a77792931d4dc7cbecbd0bde78ec310859c8ffbcae5c7025767365f1b7fb99f7c60069de331fa5a89ff11bf868962292e62633a2b0eb498ad11e982776bb4e06ca58712750af06b025ec9eb7e5b9a153be651877bc95a863d9ec63a699a30121d250496a183573221a204259c355703e72a6ddc798248daf40ef43b3d687e6eea64508f4b08a41e25544728cabe492161e007073abb29f0eb0d311f7bc5534005468cf4276470d7e53f649c4cc8f39c31081fb6ca373dd56a4029c0a697dc99762ffd1636c8f2189a6c66d2586f7a060002ace713e1119d49f97c9853a03b41a2920d474b2ae21915a08254234e760efe043466b742152709f4f4c8ec9dc54423208e8d31eb0ddb753ec8b23eba80ba66a562cf313fe5f6f54420f6d1be9d6a9fa55fc2a3aa0cbf800eeb9c3a16a0a8394833fd834950ced26773999012e833f609195b521c6a825f69dad6256dab34b0f0c3111ee72a1905f06f411e8a32c5596234c1725201e959d0bc7ba8ca3f95fa4ce9d87021d1c859fbf20a14379db6e9e30b57e4e5a3a526bd4e63a5323ba883dc6f7ff017bd31700d203a8ed377cf22bd74e36e5421e0b1a335220d812cd72240172e1b89bd2a16585262eac9c2962fa37acd3d6c2541bc5d907ba7745893a75fbdae355bc4ecc6961db44a67d0023bc2a163c6af57048c5183bed431b8d68ef6c2684b9a878b600c6ecb58b09ac085199cedd9cb196f5b433bd3357a3ce18d28ea153dc1680fcea1cb575fa74a23a6b4dd0e59e4eb8ae0305c7172822745e8150c518492294591da9f29c71b69420f595299238d88ddcc7fd1b8992adec100406e166bf2e16200178969dc0ffcc7943a6ba49f5bc95c3609262182e5695ffb4d3b178af6fda36ad503f678fe82786c064023b7ad976048f239f57dffa98e754b9b8f2889c428b90db68f12411d85493f781dad934a9a33faea64c985f26988cb9cd3b337c7954959f9f82d103baa0b0ccf35d91bf631edaaad9f78967b8d06cb8e820d097f6d71d25dc67d729a2f876902f0ad327a13002a20996cdbc737350ccfc2caf95fbe94951955559205fb8e48c72844c061c1e7d9154ddbc287606c24a72e4e17f7a5e2de992890350fe7d5b95b7722083d94f84a5ae7f107e17ec9394e3726b2d97ffd4f3d19d8ff4f4612f3edef3a1f4f8b8a1deb08565d7842528c7b432c8f9ad407d1b1df050e38d6247aef468c25fb98d6bdc24f3b143ed09f1e4bb13204c49ba6d0258c7f5ca3911e21d8c1fd4f3a247e4e951b6f6c1349fe493963b346c9f5c24c5dba4da8e0e7cdfc13614c16fb0efc315eb811fa99ec57cecb02b334af3dec6414d8f01f31213b2e27099977c92d996c5a5c3724b49999a018bb2a28cfb3d9e642f127e81b2e58e5bd74c1e2643cb87ef4efce0ebdfd52032364cdfc9fc0e9fc9c96a6a2242476a273cee602c45a613bc5ddd0fb4927bdc2ba19707ca4b68cc4dc48645856f4a72268e16080e4633c2c20b2621304d04b3e281fbdac370541da48296141bdede15b3c84299ef8bca93b7468722f6285fb7dcd11e2295127c4d038d7e70a40c53e3ce293f3cf971da5d758a3eba657583caca63b9acd2e0a6fe891b5e195b6961b66c114a3e6e2cc53c14c5947671e2d1830044d714c651a2aaac480068361ed9d8e2630104aa0f7ec421e111bf74aeced70c47750d8c21f2dfc3289a5b05b8df7eada8def26617228015af1e9791e77ae19706c397530d1d1439e035075944b14f8f144f65de3172aae642a5bb8b415261b8fe59863bebdc068514953c0be312e2ff057d3c02428997d0dcf1689d98451c2e5126010d9603788af478f3e48dd10a2036fef7a145d2403a645740092662df6541bbf45c03eda7ae8dc13465506c46325da768d28b0da87d28770bcb01d88542b40b9bda3b5551f6654c08e839c693a48f4de9e01638bfe5222b8d94b922ac2d92100716e32aef6dda47b78a4036d44b6a84d54e37ac715cab46162079690811a5ebb5d3c1b09bf88b16a0d55640c11471d6fe334d58589309679c2f1d3178003cd355112f0a96a2949e62d7fb0cc9eea2c13d7efefefdd87b6322818b9d0dcd282b87d53c526e33a0787f8dc1ffd23d430d9c0cbdde1fd5a45980c0bfead1ad3ee11c00349f13bd726704fc06cbfebe4493fef75cfd65ce8cdb2a6909bb3ee4337ab0386d02c00db51183155e40bc82dc3393569c64047b8468ca17f956eea78dc1b287f581a1de1c3c82b812cf6506330cfd4bff0f0706b47c5cf4c87490102c59359f2b39efffd063113bbeca7cfe75a2972d91ac78dbd147686d1b7e11eb66fd2c0f5c8f9d780afa68797a64ad54cdd49f17354de8ed9fc76ad75149b18730c45e10c35cdaf1db3aff1d2ab6bbad660dc690160424fedebf19740e6b78f7f1cbf35f459dbd93086f29847fa804f535b22c1fcd4fff1781cd97ff6a04bffba9ca9c3cd41afa63f8a76f41803fa4e49c059b498e903f1ba2f40629a4240d8a0ab80037c7501d754d1b1155b8b04e19679f681612967408a3d089ad5165ae4299d6833722e3b4e29f3c623a11177c447092c7f15b46f8d2f44bfec8c5c48df5da0d0f4385d57b79c1b40a1866a7367c6aeddf2268c49dacac342ee02ac21c6dc455a2d6efd7ab2d41962d6af1e050e730869f7339425747625f6f1bc27e7ca73e07ab04a96b859d604af9f4f53c7f2175c7998884a117f3b45b04c2eb4dca88c06d7158fcce424c528674d5660bf9b78075b97310197dd1704183cfdba470a7d85d46095648f222ff92fc1efbf2387dabb4dbb8b6ee2d6e4379083db07297ec64cd980c754522fca4c7c98719002f61358a4414d6a4101d86128af8713726fbb67e8f184302c4c61cfe401ae6100600a375a090c9bb76a223aa0b8ab382cf58cbfc76906850e024bade06b1bbeca6e5896b4f19d01673ec48672f05421ae060a4e61620bf0f188abeaca27cc5e558b2e2a72ba79684747810138257d24a3d6ca98d235a2388942e501c1ed0c1e07e13a555c99c5866025748323ed2c03cf9e4ba4ea595075819c969526c5178aa4e38346c03ee2e1564195894ea4e9d3f3c4cbf082666ebcab93745a29581a634234c7d98c2b8dedbd0a6fcb386a828441f7f7e008f95d49f481cb8ca5f3df696bc6be0d8cdab399de80d2ecc4cb8141e00c916bd766378e54f9f50200d2058088bf52f29963d245d86e0613f3114bfc1c5867c1648c37244b634e71fd021f3f9d69ca1c1504a6387030e398dfcd52246e3bd0c09bf09212bdaac3421978880f8213d5c8ffaa9161e3d03802c1acccc0f675db70da541b6c605a204048c6d4d2488d46a7da2012042bc6ba1be04dca588fa18689f152a63d4de690cbb350449c57523907307119903c43182688298f13f344249b44a23c8b4c4f78a66c9b44a8e213c4f2077c49b4326226ac181019252e4ea36d8f1ab2594cd5f613a9110bd3083429e348295dbba6bea64576d84112ef936818733ae4f44bf565fc3d3af005316007882a6fc2bc219f34333362e66548c872463170986a3f8cfc1cf2851f65c317d77ea0938e345ca0bfc6a52fdfe1aa572f1f655784fc731f2b5b2a24feb5707a6867982193de2dadf2cbcc4f831223f53755de8f6eb9aa96b59779cb9fb5ad61b00c1461793ae215d4a751f74fd9c762787910fa2ccdd437a95f37ede75be779bde0278a7a85bcfcb2ef59e208884afbd09d96aa9a115c8f9d0309733ec42f932534a08cbfcccc7c9a21a6430d0ad2f458f7b8724d7b44b6c07f8662dc0c4444220c66c0ca94d888360313491da468075ec5407f23277558287e1b1f9d701060a8f4922c103b227455c675d111d4e294a15c0a6c7b138a43e951b8a8ae057f1780402b806e368f52c5461f5a39999aac76afea202c17b5fb0d1a57e130920cae19d31ffdf01264cc43dba1a91fc8a37ce66291a5d7bbde2501f240d09773812af09d60871b974c49b989be4346708c73e0aa65e4cf2354ff6c3f589e9defc04cd8146894a38b2515f9041fb1e604fb760f2513b2c8cec3c748287be492d8355514fb4eb1888ecc7067e570dc06e4a3441b750420cd93fbecc8e0ef9141833e45f2e0c0e9272452294e8e7daf0e25722e2651811f6649b8d6aaf7b618ef65ba91d1f2fd2f00f2f31453a29a587c4ac1fc48e3b33dfa508c2a38313a0087d9f24f83221005a42d348ac634971969a1ca38f8972e23464c5b91277066525cfca55c720897c9a182520ed3355faface4011932d04283d44015f7afa9c52dc0524fb4ab7fe452bd70fb760ad43ba6f230bd81ed43f9e6f68995e010dd800389dd52009037d03b20d1619f8d38315b07ae22d5b846d03c10e2e217870f00c42182f6c5c30d2292fbdb9509e03cb60b31a46021a44073305af3b679507ef97d37fb08cb37fc3ac1f043e06b330d8a4c75c2aa637be73cf610f0dc3b08c58bf637e195c9807743b57162afd2dc03c00f13200e32522413d074e58e3bc278f0fc0dec462678c4534f971d6b1eecfeb85414782d0c2e740f4f8091d6a82f0690810359582327e09ef568f4e52ab591a76a2cf54d4980f6259aa70a90705fd5c664afb99efb51f7fe9be82bf8d84c4dcefaa16cd4bfb6def64b7adabafe366976db7a73896fa3d4e7a46ed7603d307dde7c52cadda4e41e7df8cf8ba74f6e41bdf8aa0d6d3fe93a9a1260c9e780af7b3c35ace57d8296914c91f78b5c04ec5d946550c905a34e6eeeabbd1856c2086e1019baa644db6b7c20ee72effb3cbebe3c741857b233de1d852c969fde692002d1c20eaf2f2860e8b140b6aa1b018acf2043559f0ec3eb73af34d221d364683389882de0f8daf0232feded25e8a69e596a7a5bcb6fbbf642c71fb8dd122bf7c2abcdbc2e91ed3efe78a91476c2017bdda8dedab14ed052926804c3de0d38f891c0995dc8bde8556dc32649f31adf7a4f4c8999b8fac4ccd2214d14828f63071da51466f0764dec8b7bc71d39cbcd6e1c9fe4edbb4c1bf1346c70504568c4b48884ad5420a0828b6865d587d63e96c20b2596bc658afc5293180f77bd388b6830a9f51c2e1ac7f18a390aea24041db5cd15c3932b4956b266da771ca6d68cee1539645454980f0340781bf36ac88d4883b0348274e5f4ce3f005c70c7c44a95dff914a5e2b9b5b064abf34bd43278042405a3f29e757c85e01c1ffd7c01e8de570d631f42fdb7a7ab01e90206278dc96a84977edfc31aabd3a345535310dfbfc39cea65750200840421762ca64145d55525f2ac5a5a949caa8e50c6c99f38617fd5a7f43603b42ab05801b1186ba6ee7a5accb3483c5314d12b20fd31c9bdd05b416ed676b0337ead8a192b166a474239ff81baf2b546d5e2f4bbd91d55b1543742afa385a1a3a6f28234d5799c849d21a576903c269730cadf3381ae1c14f89cd4be34cba3ef1a0e3df5181190f3852c26a0300a46bbc0ce24b5660e4479370edac362b254f238b04ee14c4793b6167a8528d48f6aecd30d9e1dcbd334be404551936b5b3b5f47b827f396af178f2ceb5c423a15a1a0139b37ad59b55a15444710a6a6704434c44595f4483408837baec1a9caab38a23102b57444b50d0898ae864bf1fbb39068145984602803c4f446c00780c9f4139eac7ce95a425565f86b5ac1aaa56b24d430e8fc262b8870582db595c86047b9b9ad0174451ddeec22177256c9d5f3ba0b8663d24a288c346448fa6de2ca4ef56f2e4105033fd119b42d9baa6078135e25d4d475e8edfd0901d9f9c587ffc772a56674e69459d48972dcbf8cfeb74cf76c95a6d1af7208f999eea7cc689e25ef3efacbd5afacf0f3d520283623b505ce1fcc240fa2db896961462e828346e144abe312972542fb475a16b53af78024594abb4c9dbdcadbce00eabe3cec346bb5cfd5d8e0e3820a8c46b961e618528c4d30cc9f91488f2a4ca7d7289c7617b796ab791775c4c977bdbdb258936df80d5f5748836701e578c1677c70a921fa740f4bbd43dbb4267c2d162568e5d1f4415f5c22794f0566fae15bfaa01b6248811235a52d8c516dea3cdc2cf4d04052f7c88be40fea3d9267543e558c3cbd341c0d3ae3486abec849a2afb7fa66fecdfdef8bbd4b53fe2087870fb5f93a3eda1904b5a60dda5fd0fbdbfd2de954a3d6c6c396f6063b74f93d602f4956aac56e86c7aa74ac695d2435dbbb677371cd0a3195bab36ec7ca3ca5c43fafbdd485bdfb2ed779cbc0eb15eb586f9aa66bf6a834f242a4314a55705e74b8a894287b58e7f34de991c05a7bade552cd57b65b09554f984a0b95e125597850a23361a0a095d828a33d168c84c352073634d11368df6c45c09aa77eab6ad8575a6e1f046d4fce1006bb8896d7925c86b5e12296d7fe149a5151867199bc3b019e6a86df3e6a0772a94be6d4542e79342f473827ea1d198da8235cef9d92b4a30cfa7cba531d4d148bf296c38cec97dfda1cf3b42aa241b0866adaff2f66e6257e5f0642ca9007871bccd24c875edcec9103ea845e066af76d7fd3c8f9ace2f57657e139f0e60139e28c9fd303bd6d06a0996c63e3fe064dda0f5726fa0d7b24ce86e2fdd05f1fbaba1b6ba8fe95d6539ceb5bd98a8853ecd5404ed912a3ce797eed533968ef5e6ef3a67762a87f67498b8581008c61a33806a662b92b57cfdb49a4401ed8bec90208c949698869c05e9133b4099a20dfdb2800b5bee8e7b19b6402b6e63d4fcd21344f55fd54d9af5f04f38ae302a58046617a3e54651ff238b917ff6aec87fc8ef332087c806514240d3829abc1740143d0f366df6712c1f575fb72fc235421808c910fc570467af4ddfc785b01f41f32070508dd3c7080a7b88c0791321740e0ac807fe0c20daa06b0ecb9f24a377bceb859272e8c83b5492b520377fafdc9e382d3c81847b581d00d7905ab32c65dd216613eb7ed0d35b4b6d2b7d538eab1997714746bc3b477082fd6fed3e2a256c050a7d53dc2abca6468223e19852d469f082215ce3590b8f7a4f42ca3f164b7e115547bd681cfa03cad19d20ce3a72e580197093216394c8a75c510c617e63a4248f1e46f49d1d5d124ad912dceada746f3a173d611b503d88e59357f788bf43b0434aa3391e32cf0920cb0c144557908fe0476607848ea625c9a1c26fac172bdba9bc433f0b6fd4cf49980ed4a5f760ee06b6ba7f72f82674d82c530269966b11d3c447b17bc9551930af7dff2b7420e9c16f92e50837673efe5eb172c6f8cafc68fb762bd388d9a18bdce831a186eff841077df187751ca008358a94b033aa85151fe8451ffaf13137354523c10ae1448c5671234377c48b9c90e5f870d65a36a14852e2093c93f180b4f085c4ee4b972e9423bd68c0c429e4947025e8ac0c1613102e2e4eecda7d3704a1eec4b0dce00595d1c17cd187e8806e28450425a313a00d2eac31da6f2311bc267f4fc9a248ae3a4e0a46a9fcf06e6530381fac9fe9b97881d5056768ffac7ad9e049aed941e0ac42fd6b5a511e4cc9363a4ba25b159ec5ed7cbe2bd2c0a1c09ef957d1d147dcaac2c3b126496bde02b8cebab719a79a7cca8498055713589e90c87d8318a6f64f6b16ea1791233fe8fe39dc7a9436705953dec6167bff6a295b1011ad431282e49a0a29ac9a2ecf845740a9834e71820597228f2546a61166fef74df92579600009f2ae5f8625dc33e388fb8668b1946329c380379808a93934788732e207f974ed8545c9365f601e071bdbbc413ff625a8c4401de785153eadcd32e366a8653e33ed42b934e80dd328a8efaabe4098448d3ed479efce1a316d860412c61357966b76f6b24b03318b3da7eeb4e39ee8311e16ed4da1295001834a1895edddfec8ec6135d36380dc497659a122bdd8c2610c1f338ed14bb62b7a8ae5311f3030617d5f1590a72f97a0678762824942145af05ad79b6ad1c82cfc99c4918fd7ae6f07670ccda2d4af2260d87e091aa19cbb919272bdd53b21c94d23bfb22e500d3c0438299be92b3d24b6b748ff1a63dbd559a2b7b64935f250c8e8042ecfa98aff0f038a0441996977f1aa289fd3192f488da35570c0aa6b8de4bfc54f0312b7750d78bb26f01234cf27473ac5cc813b0530c9b9dca15cec87cac5023c887616d420744a11b4878b6abeb2ecd64300732de84aecf9b8c2ee0e18c7f3ad3e8792573ab3946d25f24ca9f5606f42b40af981f3a018e4d6e2841229e14b4e3d8e84d59d232f2d99b730edd0f155df7270d7fa6638f9e87f60d839cc47fb0053849e46de6645cb25d0d54f90e9d63b75821c23e2e4b3ce60e9b8933dccee259e8ef78a96af3fa9b611fd47b9194d19364963b4a9d0c599e108640905d5b66bafcb40141b12f63d3dfaa0de5c50630f512e159b1f0679529cc9ab432ccbd8e84d4f7cbf13698e71e8ce51f2e47124dcc24d1a0e02fcf3273dc95d40244121910c7f733f1eb7a39bf6b56de2294c87d5797b83b7f19e6bb8b61c460bd4f80d637560d65fb0918167ec3e6258cdf2bbfa32d7caa85c918532d761a6c80c6e06b41e83bdfbbd61f40ed60113b8ba1f38f3339462091050050e2b41cf54ff9db0c5d02fa13752dbb938a459fcb7c3a282e66cda06d839b063f327fc8a5f5d2ebb6d5b47cda4ea14602a6efef075efae8d16ae2c0b36c322afcb0589212c9033d4feaa7951f569f7198151f77ee73ab0ce0554a48832778bb89488bd76fb208316e606e8cad6500428e7ae6dce181ef01a806fb67e677c21e0c70ccc48d8c16941f68cc29ef944a6151b4e5978cd57bc4a3bfb4c9182f313a242133ba915b152248548a26bf4b789452a79bdd100b1a8454f36ef87357c2ec838cdb99a28cf2e8bca9ba0a17cd802581e0fff9804c5f26e047ef686d0abe504a9c0e8fd8a1a705b2f21ffd95dfa7b35468b0235ca49cd4c89057050bad7f8e6524d832c689b4395936cbea51715f26adb6711166db7fc71532a08ba068f87a6fc3b1e4ef38bcbf636baa06819c4e56b042109b11d9cba73ce3b1ecd88d7c6b1a65444d50802aa2d5b76cb7240a2d7c4dd9c53605da70a16f735582002a999a8ae961ca60451490c7c4a053b827d39976fb7b4b7bf9204e7d1eb72090579f4c1502d6ef050f16774377844a11603ceb2f31c74b2e10cafede7de463d596182707b7d3cf0bc8eb218ca93957b2b5f52d655d6f957bec73258e7e894f3e0dcff34d93730ad7447b534cd2db5be4124f60f4594ecde7c8e21d6ac6f428bd7a067d5420ebcd7204d069983196b2c9fd86d1db24142ab80a3920a03d4942cacdf807ac7e0bd00f4b6b02701debaa0de04eec5c25b014a7f0b39ea2d407715d027c07aa140a8ef5dfc45e7fbd0bc8a9bf2e91b34178f2915507e2458be0cbc984ca4448754e20f91031a6e6d2ceaabc1c9bad5355b4bf22571db7739ed27b969cbe8ba344ee826ae764ea77fa3177fed7339ed36c1346a64eb5484de46624b98a955c3e50adbe96dcefc7426a049eae44c7a34520c55e45ada377a89d33d97db7ca1cb3ed5b9dfb17266212d1c1ab87bf3ceccd481948e206f0960db2b0e67106783af9a788641ce9fbbb69afc9f8cf9e36d66f353f8ffb4a8c67d3027abf9d3b987cbb341e963939474d8af36b63a26a69cf8fdd3b95079ad208b903a85c7be36ca99e72f94ab43a02d82344f0a7a502605242325bd508f140405e4f875e36ba5afed691cf0654efb5c6eff25276f2abd5056854fe2b4ef961cf61d7f0874824ec1339375a01cd51a100572b7e94954e0d4ad3c82914c73dc719fb189a6339e719303cc87c62241f1dce3dcde880567ebbccfe9c62f321db26545d8e2f3a25e0277f4e1311c9bdefb62cfe1065f72cabd5dedfac9d68abb385e176d833cf4a050ca484f0e3a93942cb12a742c9214a67beef109ddf465ed263f51660ed544d323897297e3e088b50a981c67c70d2edbb98efd06cab0e11703253cafa71cfb9053e378a10d64ccbc45e577f9c7586a610bd7d97ff05b0f0be8450203b2f1a306db0c8a0213de68789757de0ef220c936c0188227b0466f621b11c32372399043d980882030601abc8a16fbf523000996459c095a44ab7173e39101606b2aba2a072822a430919f068121eb9853e593d67e245440af7c06d3248c236f6bca49683086789ea8e1d1fc2ff0cc4ea6ce40d1810a612ce501aab2fc1df21be5c8a59a2265cee18d8fbbf010e0619a5198dccaa5161250f1dc68dfab335ca73d72d55522c93ec7a095d0be50fa2c9e9c746acd7a009253ade2010513095a8c860923d391c2a326605e43231ecf37a2dc8004c17952538561e8aae220c08fcdf90db31424250b9027c3f05f59dfc7f74f490340168501233c079b435f14765c23a593ea2d08a02d3613e33f89052a2d9c1a27031d302064f96f03d4ad6073d930092b85758735e4030b50b58b7cad16b835740552fa3132c371a43bdf8f0f17851c495efe8060cc06a7659fca89e042490f5a9ea3e36b5ca6bfc8c36644322705aa93d1620088804d9f1f5393b9fed61c0058367f453031720efe5a1f8bf0122a64fd2338fe6913c01b2a154fcdefa7720ca35cdc9d0e1733bf7975957ded560217080d48281e9c06f23bd90b0460d5f7cfc46cc3c8dee4675e3eaa9ee781e6b7146624e90b41f866bf9d61e513f8c7ed5d054d9769752cd6fb39f64cc0ee1eb2367844f02d62514d53dc4e798ac0fec74aa748242395438d450e000c4c2cba4802444b38548443cba9901c9c380bef10083a92a03baf5ac9c0af253d07380ca410e61c8e598ec7942969efb5d9e250908db341b88977620f02ec8f6ea81b55d53587d3e3218dcd3f31a233413730c03b0c81900217c3aedc78c421cfbd048b29b6aa4020439a9b271d0f298fac9032ea491510473bc4c94aedad2635e7e252e32c90c752993369d650d5c9c45319f5c493a59844b0fde9f7f84c6efb3e677f2e777ed1b51d727c33834534b2e98054f4a395d4405d2d91b0009f455def33ddfb8d9efe7cdf650d3423ef543becd844c9a1418d6440dbfa9a85cc46cd01d93866b0d7bfda73b1c538a1ed14ddfd15bdfc44cd45b7353e855e04783951b5ef5e57be3505c2e24dce045980e3b64d1e3f890d636f2ecc704aecd043257be3569db7591f7f036d88479df2bd3f7448814e17fece5c7ea2cf73d76f320109d24fd534239144e8451b99938406a8ae62c7573a931ec9433ef2d087966424398d5147d348e370621786356ae0c0ae75ff737ae3177d9d3948abf5d207eddb022e79c4d10b3620f0a6d001ffffffffffff7fc4cc83027dc6d63d6dcd7832534ab2548539e78bafb5924c29c994922440d1833742a41135e081e3f702770b8e0b940bbab9e6ded407190e848c1d62ec00f223480948b0c38c159c9ca01b922d4b9a510b7264cb9ce43688b421f92fbcb45ab8749d724507113624638e5335179d5cbe87825b436a4369d6a6482d4bae14514342ea5ed7a2c76fef4f1d1a44d290903a48a9e5d0cfa13d6d226848cd7eeaa0d33733eab4c819d29bfe59f37ddad25ce0206206475fad4835fa62eb568694b65c19ffadae5c885d4086a45ab1ee32c40a99b187ca891644c690d069b4e6cced65248684fa2c3ff49a68a5ba898421351e3706292f2f051130a445ce6890211a3b5d13059136129b8597cb2e4b2e996811f942ca7ce4b62e79d97594a5ac17d2af5a7859945fdab62d36d262c6f8e7fc5c88f3f0de2a88ac9194223dcc5bc7e3cd7f6aa4a30c57a3f3b99bf112e9425247291fd5c94c05112e1cc47710ba4386ceaa452d8bbd9c6f53d3212269246370992e339b4aed95b2a6d4829c9c94a186c816922a75cbb5cf5958a0eb63c8238d818816129ab4d5a68c75a2a217c9826121b9b251880fa364912b24b3b4beade5aab5bb740d112ba445a8c7b7d65b10a942ca3d65960539cab398e494b5151534fb82081592b9f12d5633b34a2d0bf132564c7072b202240d9129a4578bb2354a91b9a3be4a10914272456cfa68cdf0cce12488442131525e8c130d552ff34b108142b225d5a15f1f651c8d19436070049127a464c4cbab8e9b9435f7c713828813926af58ba9c5f89b323414103516c820390f82a814317c90b122d284846f4aa983f0111ec39f031126f8105942d2e57e74b523dc83cc9590cc331f2fbb144b209284a49f6ac9e7d7f4d37c1124246c7d53e816934d9f1739425a4ea1c647658c781d0f465a7a615fcab5d119b30b18c9f1b0cdfdd4ffa1b37e91d0e4ad5b5fa37c915e57ab39abca4dfd582f92af6c5584b7f62c6e5e24ef36a56b5897101564ada018d600c72e52bbaed9e26b165d50ba2e127f2fc7e80faf93ea702e121e1aaf63ebe222259f757db3d82863b3b74808399ad25fb745d24675fa98478e0c9e5aa476e39d66e9e57d39535a245c969141567dd62fe72c1232e7ef205d8e2cd275fb3db2454f2cd2a1a3d035cdeeb2f862386091ceb2d64488eaffb4390f1eaac70ab215e07845328da8cff45abed4c2cb15e9ac5b96259705190970b44299597641afe7973d2bced1ed5ddca856be8a46a7c8522d691652052fb4e6cf5ca97075956ab12e5e46c5e2df4a2d3c3e45f265d63aaa9757cbb2d08681c3147f306fb1dc756d2dc5a3950b2e45498a83ad78adafa12e86380a83aab03dd9a0e5708822ad95c7502f682d77d44d0a8e5024d43fc4ec83ad867ae100456236366468742974678d81e31329fbb0399ee79c52a96a487072d23edc074b2d4dc0e18984ed66d7396a31d86b36650d318e4e343ac546acccacc5c189647d0ba2fb85bb92383691543252762e51193d6783e0d04442ac9dc6d02a852a652513095ff7f58c1dfb73c7240e4c24d35bd8e4afc5a857d607c72552aa7ad7b39ceeedea754680c312c9e02dd8a69dc617b3b0ca4a25d2f175e4e5dc32bf68372592bb42c5cb4db595b652d60c04382691d0eceea8426a495e89296b3f54fb5041cef020408c290e49a45f6d7cade56c0e2e680d1c9148ed8b9e5a859f7acc6225704022ad1a7e5b6614f9af17ef80e31169f1c37a8ebe9fe35f3a650d25af0d381c9156e1ad0521b6a3e6d153d6ca30a30d1c8d38870f1ebd4453e48306e9bb328ecbe8a6262e941515143f6385e060444a7489bfb6e7dbf3c2486c64e05844320ad7f0194573fc9757445ad228dae51671aee39e8864f420524695cbddc28e8894feeb701ff463bfdd87e86588b0d15fb721123268a173faddbeec752192595c6bfb8ba739f54588e4690acf7de72deb5c0d22ada36d760ccf3165520922752bd54a992e7eec4e0522a93db698e52c980aaf191069a1bab765514621848bff90d0a2d63ab32b737a49f643428b3a796bdffed862b80facac4b79a1fff2212144df7ea996f2fcde435ae899979a5f4e1e2eaa8764d6f8ecab2de8d03c0fe97659abbbf2ed0ddac4433a67ca951bdd45b9cfb94342f86831abd4ef63be1d123a5ce7c6142eb80e5d1d529b3ba954715976216570d021a1b3349ad5c79c435a5e5bdd2a7ee48711ca212d875dade3456dd0e14b5973028e38a465fdb97c39ebe1904cdbfdcf7f9b9ba97f4332be2711af7aa46ed8dd90b6d3d7b2dceca165a16e437a64f4bc6cb955f3d66c4868f9e9e72fb89856bfd69016eae5682db63edd5ba92129aac5184306a125db390d09f7ce33f1bfd7de82d0901cd5e6ab2db56748cc795c797f39be285b33a4759fba86f2ecaf575a86d4a66dd52c62322e5432a47f5fd4729642dfe54fc790163c5ba3abab153fa718d2f157dfcae06a7772862125aedbc5a8364d6e1f30a445f57a5546511be96f2d75964dd96fd1f9425267d134684ea19959bc905af3d898cfa57f144236d272b768ea7b5b1a5a23a983d610362e65d73e35d2b51af4dc8e67fb6a5d48c85c97e57729c47b94c1c18574cf0a2d5ad610471a697ba9b15a4cff16d2e2fe73698e2c196f6921e5d278dc7f3967bcdb2c24a39d06a95e94673a1e2ca4c39c78d88d2d8b396d3832dbee15cdf45b21a15f349aa8165585b4eec7f8ff96a9704a57dd2f9b8d5348a97a7f1cdd2c8a9f278564ab505519c3cbf79545219db5ddb950af7fe6e5714021b5e283d682d0d9ae4586e309491933e9ea462127a4eee3c516c4dba9546f18389a904e0d193be6d66f79c53cbc87f3483d9c879fc2c184e4dbda4be6c2e8b969389690ded539975afa702821a93fe6fcfc28bbbda57acd04389290f8ac5d4354f4c59832d3c0063890f08b19bce5d52febe038c28d602030ee17e9907fd9d9a34dcdc51002e3862f92e283bb8e2fdcddb78bf12048182a585127b83333afb8d18b74ad561d3a951bbc48d8bd6b8dc95f14db43dcd845d2ced3fdca997559c7e0b12ed2fb51b3a42fbf5c561fc48d5ca4c4bb44cbcdce727e1a178939fffc31c577ea6bdd22ad9b75de9659cb1669293a6cb620db5b0ee25a2467434b1eb4ac395b90d222b1a1a58aff6c866bc15924b5bde492ca6eb248bad83a8eca08a159b9fc0cb3c38d58245f6c1d3dadd9b0489d7d8ae7fed62b925277badc2d68f5b0ae2bd27b5eba593f938b17bbd10adb7310e9c9d5b37bd01abcc18af4bb87def4a71a3bda8d55246346d5114deeb3e9524542faadbabba750d5a7222d89f7887d67963ee66ea02229225bfe450a216512e5ba718a64872bfb58a1d80e33c6e8d10305af7c05680841ad201771e18629ece446291232dc8aae97f9662e6a50073748916c571d527f8b9df12d3c9cc18d51245fdc8b1db468951d3a298b8277431429dbeccfcf3423d4ff94353b17dc0845b235a6cfcf927f4e1f0632a4bdd1076e8022a1359a835017dff844fadf34c68f9a68103565cdec987922b97aeff2b50e215bb4f08d4e2474eede99ef9a13499d151bd466cb26923fdb2d4ad9826fb8a18984702de6c9e9bd8a88329190293eb76b26bbe1c54442547fdef0f4d5a3f5c28d4ba45748e92b5c839648cb69be73bdae9746be31d07015dc8d4a24576a417e9ba75315a5718312e9943966e982daa0af3d1fbe2244e5b071631249bd758ffb10919d4512c9d822c5836acc9bdf8f4432fa68e8f4907a64141249a55167b95fbe7bc3e51129d76e31fde64fcfa27444dae6c5ebba342f6636221d438828590f9dc50e9e9c5ce1062392aa9df9194bb450cc1691ecda389bdaae5bad88a4ade767a9795b5f589d0571bc1ddc48447a4b9588993bd5df9284b8818894afd4a1b3d05e7b331f6e1c2235f2f1e7d4959ff98648aa5fd55ff7adb2642f44da5d8cb9530a9d1089cdcd1b320b2e6849358874c6f7e0a29f1644d2fb75d471eb25100917ebbb22b5e68f1b10099985ed6cfc1ae9f21fd2f262a496bae57994417e487d1e9199f3cbdcd9db3e2475eeb0d9f3cc28573ea46fc4e39dce9b6a53f7909661a4bffc2472b725f590142fef5efa7c11ad75f290f89773eba82aa43015f19018352ab5e882bb7eed1d922da65917e45fbd6d87b48bf7fed0d3ea90145fed236c5fd0b2c50c097a1cf9728b0da29f5f6748a84c9ea3e21945f3c80c495bf718beb65f16445e86b4f2558db23f6bad658b0c09f959556879973124bde38816e25e90fbaae5104332c3682d06d53ac7ee973cb5154bc911867477963eeb5b3024f6d5a9befd98f8bdda48a7b9b0d31cebe5d5fe0b691965c88a1ddd163af64232b3670bd5d9ec293c6c24a366962e8de611e7dd1a698d596bcf95b91a699759d9a26ed485745469a37e5e5dbd3b5c48ba9cb5ccfa53070d724c23f5b26af86cf75a3342d6902df8b942eaa85f590bc9346a3ccbe5628a4e7d16927a5e7494a1e598e5f2129d90030be96c2e7d0bdb1da285f90aa999d77957afd0b7fb980341c30ccb6185b4a6783debf24f841c5548b8e0b2fd3c4bdbc1572041001204ef1f3d50165121b561f5689d2d8fcb826a0ac9a429646ffde7a0542c85c4bace62f8ef1d29b5982824b568d37c1f5cfacf291492f3d28ac6d4995c8d98b20b841c4f48c8864ee7ea56cf9ae6d0701f2010c5821c4eb093ccd1841c4c48c69c438b2e76d01212e2d9c1a5bdd02bd6a384b4d867f93a52e57433cb418e24243c433787972ff24628071292596b8cbdd27d37485514721c21f5e985d36e31e84df983914c572a9f5e4c662eac80915eddad7fa5d4ed3a282b2a45addd57504e4ebc170a23bf48fdf867a93a6859662141701f672b2bbe56183ff032188df822ed2feadea35ddf88923bd28b8479cb1eb5bc9e8cd0e1810fe7a123bc48aae7a4a2d5cbaa2174bbf0c5a8d25e98d608a92e52da52de9d7f963db5100f7ca0e5482e92ae5dceadae2fa9f8e022e9aeb3945a9d8bfabca6aca1a49560e4164018b1054263a416b448fe6a502d4267d366398ba4947af7b364448b1b934552aaccc155c6ed9ca52e032127273e584b85c74ac642d121f3c6e51874921916697b59cb9be7e4f2e7798529c5a5277fc4157cd7986dbb465a6156ad265eaa99c435c28af4a8aecf341bf641ab5791720d2fa2615ec9ea4a1509dd762a7c57b44c234b45b23d75f6dea451600415e9d6342ede8b71151e19183945ba347f48e54a93bcac29d2d999efb4bea514e91191c2db6d63e7d02e6284144971a1e5ce3ab779963623a3e0636bbd4a5b6f3e5231228ae4f9ee79d40ca9edf6931343691e3fcc2a316250556a1f52d5468c8022ed29b283cc6841bbc82e0664ec10c30439f289b416337fba48174f758d82cc78c2286cf6c37cd4f72e3263a413e950f9e2eb4a215574ab85114eb85db62fbeac9b88d308239be8c5d383eb1cb454137cd767eb0c314ae3038862410bcc80a81e3ece482692af7bf7651746bf0b2e296b28239848a84f71e771556621ff9435bb4432c7c36bed6d761abb1bb1445a669ccd6296ffb298aa4432aae8c7542f6d4bcf5322651e3ad777f64924d4e6fe174385fea8e7c98824d25e36f244e6ab987323919637d56d74e9e9e587272390487908312f7a169f5da7296b3ff09547a4b5c3c8186af50b9f9794351fbe69c411c94c7fb6527a472dc72b65cdc70f1e3f164a23ced6db1925082a7f368311462865be9665f8877de00e6417918cb2396b44b57bd4130d1f4ac91851445ac96697b9fa9f4b372883914424d4cbca5691e1937c50b6600411e911dd96a5cf50e510698f32cab97879d7c2e7818f1f3cd00b460c910e3aaee975840a919059edb518b3ad4e447731182144b2e535d73bca5be8f01a445ace512e87e83655631ffdc3821141a444671521e2b369374c59eb40a444ccfcd7b73387064f05238048b97cf93c665ca133ffc35182fcf84332f9f7da664197b2862b18f14362a3f6a76a9137a2313ed45ae94352739cc65225e25ae9296bbe0203bb148cf021a165add1b54679f1ecc0c81e123f32766e7c293d24c4b53023e4d4913cf0b1f22a9e4184780de2353d6b68760faf34db2f8ce0212dd969bd98c943f999237778db3c8fb972fbb7d53062877478142a3e69cc0e33562064e5870b5284a8cc6065a40ea92f195da9378ba103a27aacf78dd021ad65f76d65eb2d5b5ecd21f59f9e85562f2647e480479d2fa83a338d9e38e0081cecc48cbc212d35d568396f6bbe427a3c9e1e437ce00d46dc90ce82c717754b239487af0dc9511ff9cc1cfe37db41c1081bd233eaa267b1db5fd07e0de9d0792ba46cfd6c4cab2161ebb2f878552ec76ea5219d5e16a16d4d4643eab33e9fd3562a1b83ce90f6d2d6c95f6bcd9096425f78d12cbe7e5ecb90d42efd69b9a8d9e52c4a86b42c94ab8787acd71e1d433a775ddc3c2331245f0b77c9bc5397ca320c49152dfc8568533b1f0ce91ab1973527712dd3a78d649806d5295b509efb2f24ce5f54d9fcb83179e885b4382e3567e17dd565c746d24663ec2cca9451d5ac910e32ad16d4abc6152eaf464adff38b9f651257a77721e941c9999db9ac6559940b89dfd7e54a3b9da757d3482a11f279339e5b48acd41eaecf651b173a5a488668c97558d3d42fc7912ca45f4ea17543d3fc631bc142e2537b4b5d79b9cdb566b4f380074ac8c81552db2afe75c44f73088d58c14eaa90740f9785ce488fb3e90815d27210b19ff50ae566a3b41d8c4cc14e848c48215d1fed05f5bb57fae242565246a290fed01e6db4949a53d9e3310285e4c78aa9d669b454e9421d8c3c213952cf3b48a9f2720765c40949152f5f6390f2a965313ec84087186942d2c3bb765bf55ed82665cd6cc5073f7e9c60fd30c284b4ebd0d8b2f153d66a320f234b50f6db5ddf4a388536ef1763e61125615185bfac166fa407e1a1112424e345bfdbcbe246df6ae408c9e8d9e935dd8b1c190723d99d29babe4e836e171809cffa35eada94bbdff945522755a241630b2f333684873a633321e28bb4e85019fbd29c43b4a0482f92ea5ba4fcd4e98287710e22bc48c8adb8eed192c80a22bb48c678be672b426bad952ed259ea112142c5bf4eba482e9273f39b73d02fb5fcbf082e922e9ef3be3d47e65a6120720b3b59115b24bdd59a6841bfbd8704915aa495ba78ad63d62a32838088d0e28eeffacdea9435be36446691ceb1e521328852164f8720228b4d6e5d4be9e13eb1482b111a5b0b2dc716440a16c930faa5e7609fb58b3a5e1079c5828ad0c9a38e1636445c9172b92fa8f32c67f3e03186d28ab48b75198467d96ca3cf8ae4af8798cb213588ac22215b3b9fa88befd247a9222de7943fdadd3a543f9a8af49fcbe3ead6fe7d3d22a8489fc8dbbf8b517511b232a451d022728abca37639bfa8a551444c910ca9ce4591b1225d8c4a91d02837d2bda352d6980d1152a446eb675978d6b86dceaa21328ae44aadd578ec11a6f2a196398f459d11c4573cc8b521228a8476c973b7ac6fa148efbd78b166574a100145326748d92dbadc592e057004914fa43c6bfcd12cd25fe989f5460d99c5f13a65add3b81369ad569cc6707df12af306114e245584ea7874290fc2c033ce5820443691d069bf1fd4c7975aeb9a482813119a65df33910eb331a8da13adab6a4ca4673ea450a154e9e7f066ab6763bbfcc8120925d2a50b175eee205289a4f7c6dcd62e8812c9ec2f8ccb4d2daf2d3b89a4daf5f828c5a55a714a22611fe3f1b4b368bd39914888268db3955a989143221d957ed4907a54776d8f48ffabb49bdd24ef62e888b46de89799bdcce5db1a91780d32dd3fb335cc6744528be7ecf2c3fcb3a42f22b92fa9a77e8bd946c58a48f6abc81645cad98b4a44e26596739cbbd829c48b086eb76dd5e7cd1d226d3af2727814b5623543a4455b5d8cbd63aab55f88840c9e426b39efd8f84e88b4af3a5f3ff91a95e941a47da3fecbe3518248a8dfa6082d2b10c997d137fdba2cdbe20222a15789ac7da7bf64ff1f121eb4888ca97d3fa4576a311ba305cfb2973e24d5bee5f5d5679a738a0f09b1d14ee653af7f98f7904c4f1edeb2203d24ccc3ccf38e8905913ca45764142a1bbfc245778c14416d6af9b81dfa083264611988dc0117e4ae7e96e5576807b3382f3c65962fe60d110e227548bdcb9c69fc308f45650d690fb23e5060049086081dd665e27ad3662957335604913924d35c68a9bde2d2ab584d00531091832ec63997b96ee5b61988c421d9197a4537cb6df1b5c021f1e52fbcd4faa3a366296b2bc876983146fb88c1c9c9a109600d913724a36e99193ec84042947c615b7d322b6f959515448917d2a374f57f4ef58796e2d13cd08a66a2848da467963a6cea338fde49594b3394ac91d6f32e888ee7aa1ac9d4993fbaacae0b6db972d338b273ea296b3ef8f12305e5c44811a23283151e3cc2d821c68e1d62ec106387183bd231967d28e1425a77de9c653c9e4652a34cdb5acc798d922da483cc66e7ed184ea3440b699197e5d9e631956a3d5b28c9425acb4ad387d7319a2811194ab090163a84ceeddd8216dcbd42ca3e6a1e99e1396128b1425ac3a716b2a32ed3f8b2414915d2f22ebdbc5494067d45504285a4caf6fca79fbadae00b4aa690f2f2acdfbb1eeec5ac169c299448212d86fd38cfa2de0775a5a1240a695134a89c7cd8cfd4b2438c1d2d4811e34021a9449ecbe7ca743f784a9e904ca9b374af3e372ad7ca2871423ad74a192bdaa6acad1cf341c6d910f641491352df1edc3be3d5bd65747b28614272a46cf55899ad9d3a254b48c694c26e74bba0cc3c30942861a15a20a820693bcc18e30c254948eaa0a9659dfece3cee6d9420a1e4086929fa2aa3c80e2ee40b46b263d6dce137dcd63e098c64cbc26c70bd31a897797e20f9455a142ffdc5ab51fa627c8662769820f145b2d4fd338c101f424507925ea4c550efdda65a7fb4971729f9f42eb68e9d252e8d0231768c21c68eb4438c1d25d821c60e317688c1bb48ff9e7654f3b02b5faf8ba4c7acd7e5f3bd65e1cd454afe44cbcc8b51debab8b05493cb69505a9ee1a221b9455a0b29edec83d495ebd922f9f3daef52b46cd0a945426b0b2b74d44868917ed7ea293a4b594b2c90cc22f5994189ec1fcf9f563943e50a24b248bdce1b6eb310adbf7d2cd27256a9a1ea576a7e295824d5c7ec11a7a2d3b6fc8a74b93c97938b2fbcf8a62b52beff3a8bc9859e8aac15499733bf306f39a56b59ac48e81734eb7eff6639b8ac22edf973fd85cfd5ab05a922ade7ebb45d90f362db542433ca6a77d16155e65191cc9fe7d373b69c33464f91d4ff2ab54c6f214b5b4c913a8f32b4bc985ad8acc3482029c5393e6b9763f926b1175224737b8c315a94ba9f571c059251245dbd5fd8d4e1b4dd43211145f26793087f55ee4194a6173ee6602e3450a45d2bd7e1dbc595e8d50e33c6305b41ce483e91dc74f672324f7a22fd621675fc7d55a36927d2f2b5722da66a41fd9c488ca6bf2cffa85f2d6713c91c7d75fbef7916b135910c2b848bdd9b59ddba6422adc6c4c5c8725916b1926022f132a796e246f6f50b492e914c9bdacde4c63c68dbcc12e9ef7a597c10d59ecfac444253d386eb55233ae89050e25207249348e7a01ffbb16d85e7d48d412289d4aee6e0f57264363e249148e7ad2d17737f37f99a88208144e247cdc80c82e4118955f961d3680941f921e49c0d481c9178e935a3d367e1055f1b916ee92e2a63165a0cf23c94206144527ca91635e38716338768099245a436e7347a56758a48e9cb7a9bb31e422acf14419288a4fc131d4ebe5386bf61a04490202299a52c5b215cf8cdc145728894ca7c1ab743f9d177248648ff6a7751bf87d029bf94b51f428628941f8d62405288640b7a7456a8ec5e0119e243398fb5248448dc865299deb2f3aa0783b415e43c403288a414bf49f3ae7f8ed2bd1b900822a15786a617b33ebb9c20649004221ddc5ecf35660a410288a412f17aa59de6deceff219d3ea897428dd4e7ea4a4190f82169eb318b31c857bdcaee433a6dfc3d47f1d7ef8f0f49791decd58d768ef11c04c91e52abeae31f3e3d2475f9cbacd533ef2d9987b4f87fcfaf85e767ac110f49fd701da3f69ccf760704c91d127233b5142fee77d0ad4b90d8e197ef2fccce85ac8b2648ea908e32e8b788d1ee42b7e8905a6db105f5f2af2e175e1f48e69090953abab35829c4b30e0f247248ab6fa1dc3c5fd45abfc4211dc5ca96ff1d766568071238a4d36cef9dea67e94faf02c91bd6cf9131d8f97d0c519049dc9096751aff1834b78ebe41080e246d48cdacccbaa8577c6f6643eafc36bdd0223f468fe640b286a496a5cffaedd56a488614a9d3ab75f5b3b1ad41928664140f32bfcc3a45434a365febd7d5affff434909c21e1f165d7e2e63eeda42b1a48cc90165d0ff25c549fefe332a457b7abaf96be3248c8a0d4c185959aa30c224e5943e9f123c81be31302c91892dfe79266863a9119a7acadf88fc6432462480bd9fadc6754663d42e1712c918421e5a3e3c5c5114a458f722001435abde8234ee5bbdf48df40d246328ed65a7690351b3dfd8584082d565f583552ba9832907821a9aaaed3bcdc5ead7d36d2bac3ca18a2b3e3bab746d2d3368debecfdc2c7b881448da46ad0b561c4c7522d4dd285648eba3327ff4c0d122e2445b6cca8c591dfaac5dc0c48d24807e51eea834a8f613415648822d942c2cf65715cb5fce695a6acdd69213552cb0c2ab328936a338c2c245e89a98a0b2fb3d31907122cac9b8595d517b77581e40a4a5d2fd938cadd3981c40ab868ccdb8eb2713b0b2981a40a69f1936ad141dfeb4cfba1c1010915d2318ccba29897109229a456865cbda7a37e5ef90104db2091425a6daccd1feaeaf61f9d66ee49a29050b11795abec7ee71b0a69599f1532e4e809a95599736b5926a7ee71c2e96a2ec68d67489a70ac08d79e9b21236102c91292b95c6f6e11f6ad81440949595f293cbb8a9785d6ac409284b4ae54fd51456ffadb28767f204142d2fc4706e55e2adc85e408e99c75fa515f2fba477d3012ff1d4257df98031869d5259f59f432c72f8c11323233780819aba1456f2d4b8f2fd2b2ea9885cb72e6710df522213eaf89cc7268995bee871cbc488976515bbcb852d5d9bb486cccff379765d1454ad3b61e9dc6f3cb3208861cb948cbd4e91f2e668aa90ab191031749f9d7ea73b51cb9d15b23c72d921a47786bddb8b648e72cb7ba974be9c2eab61669d1a5196d7a63ba312ee4a045ea650baa5d7f9b453253c7b7f52cc707a94c59247570b1b66e83cb21b36291cc2e46268f1719f62e0b72c0221dc34897334b469b763fc8f18aa4dcdff96e2db8d0a3aca8288f1cae4846f7186516ca6f45dac50e33151ba47b8c4959eb410e56a45b160f7a4654c9b18ac40a99b58be17596630aa50819a250da87ca1b0f72a822a9722ab58286ab20472ad2a12e37b6e8f2a3965ba848bc9ecdfa3c4a4f91cec2e6f17b7df931648ae406cf92bd76cd8f35739422993c8b0d9d2f49911a2da52e1bd1acc7c75124ebc536bb4eb9ad5b2f8ab4d44206aff7964fd98522f1e341899436e723058a55fba68fe7ad4f24e39fa7d2eccc0ff6f2443af35d5c4b7539b618dc4ea4355e85d908fdf1e0c9c189647e7fcd59a95d89be6ec8b189f4ebacca8cd039c8ee58c8a189a496b316e2659f0dadc34c24b49c7b880c2dce35262f0726d2aadf42c8cdff124957ae59eb3c5aca9aab0411628c5b6003140ee4b04462dcf3d36e96bf9c8d0fe771392a917ec15c163ffb4f8964b79659eafcd29348e718f537ad8ec6d45d12bde0b2784c732e8a6924d28250fd631a372412af9f1a3e4b6dbee1f588b41873e72bf5581a83962392baa7dd215bd02e47aa118939ff90d7a2365d9d6244daf5340b19757906155a4452e6e8e49b49bfe5381591b0d3d0723c891291ee0fe2db8577b0754144246b533cbdf0aa75b73b445a6eb795416d18f7df10a96d1127ee9d4224c36c47d3abcc2fc71810c5821b410e422463d4d0149af3cd651f445afccff56631b744ab05913afb1cf665d78148eba052ea51fd94cdb20022a5295bd6339a5b5dff87e4b87ece37758f572a3f2c28d11f5bb4df87b4d01b95a676111f9272a4aedcbba03d245475def3cf4d9da2ea21a55f3befe134cc939887946f67c9e5b32e071e123a9be73ce526c71dd21a94c7f2acd5da896f87b458cdf83faba553ed6e8c1c75489787979aebb4a1f34f87e46a31aa56bd570b79e598435aa4adc6915943d4a753f624871c9262fae9433db7dc6bc52125f727224293a8cc150e09294296e79cb518cde51bd2339eb5d50757fbbba591c30d49cf2ec66caa93e71bb59105f115f4408e36243753f8a6669954c8c18684729957e1b2d8e8f9ad21255aac683165d499420e3524936bc9cee34bb332f4342494c6944208119eb37c676848011ad8e380190ee49993002b56fcb69e0109d8c94127f68025646548900204008d85030a08c04a105f43fa4710200900c18a0a10a580000ce22c2004005859594e0820002544f5490102a084a8fe11e4e40000184049027e0041415900000280e30008d0e186f4edb8b716f44d59e336a08a101e292b0a0525013ad890ba7b115ad6af48990505f118d20385f850f1808e35a08a9020292b3c505012a0430d6948800e342435c9cb9dd9b4d5ac7386a416c683dcd7b419522eba5b5e76f5faaeea28433a738cae3eed4791d21ede830c7ec68f1e3dbcc701748c010d204b0c427c250cc90c312e9a37cf488d4a597436e40ca5d95ea0030c407aac1edec3003ada48ff7daae673bb7ff4f842723fc7e72cd4bbd65145c8192a3d040585cf50e92147880f155cf1a122647578e14ccfd8d4fd5ab8a804c14f1a3ad850be8b19f3460d1d6b9ce58fe93bad8b25af00e1070f1e3f5e0da4d082a613b90b3abab0ecb22cefe66c84144fcada5a197470a17bf131337b96864278d097f47536dbb885e3b9e9e88cb1fb6246e9d0c2ba6379d4245ace528dd83ab2b07a6ae11be371e463ae030ba8076d1ada73f0ec591aee2b83cbc2b398a52b650d05c5c70f733ed07185846be152af5ec88a0711e22b674ad06185b458b9dba0a5872abbd37454219d77b3fa328bb3dba2830ae9b03daf3c53efbf200564050508ee03ed30638c1f2d3839393941828e29a474e5aefc702ebdbc52212b6af900c28f3e53810e292493fdaa1171414769f983c742412388102ec358105f5482ac9565c88ab128a4a3d87d96d5dc4bf36ae980423a0b9d73ffe7f4d99d11820609743c21217c3e78684c1e8467299b427cf819de011d4e487ff0ded78e99da59a9a309e978fbd0f95699274d0a74302121f58b49b479765f9fcd19742c21e1a1bfedcf5e74a141414111e850423ab394af115f2d66b1415951414139fb1164a91e28286921d09184a4aab47d75a963f6aad4818431741c619169eff3e7190826c148b9d6fc0c8c747b6799de7bf5892787fc22f55afbf4d5ac2a66e20b34e94552bee82f44fe56c181092fd8dc2eb234446a773add75c14734935da493e69035f5a42e92bef1b9f965b3fc694c72911a5d79feae5ba71ab1092e1262658d3897e5a277f64460728b748fd042950aa15bfb32c416e9a05e852cad97c5089da9d4221d6c64ccde474f91c78f1f8bd122ad85962d844e3ab7e39059245d4c9be9594cf7a4b28a2cd29dbbe69bc3a7bb74c8e27db6a2c283213c940c361649598fb7ebd28aa8cdde5826084c60917011f33755796eaf317945e265de9859965f589d55141357a4fec51a3d2eebf8a0639356a465518870a141e3e7af599110771f36687d1db5b85a4552cf6edaedfb1b75ae2ad272b4add2778d51a83515c9766ac6f0e34145625ff3adeefca5db4211989c22f5a16726f7af3b5f6d8a74d455e53a7476f6bf4a911a8db349930bf9ed49917069b5fc7ab4cc1e5e1d45b24fe6c58fcfe0b29da248c658eae2ee566e971f8ab4945108b7559af3e985a04868d0a2f89861e35673d027125a1f5f6a0e2be48974b69acd95c2ee4432856b39a38b6b542fc806134e243feaa03e556c8e91fa26d2826b34cdff9f449a486b96ac03934ca4bd6cb58b979e9b46cb0413677289b4bdbab8dae819e55ca0606289b49ad77eb9285a3e1353d6ceed30630c310e019e60528974f20fd971db7b3dcb502219b52cf56b41cbf63bb59b4442c61d4fd725a7528b2591ec17db466857eb5a7ca4079348a4d4e5bcdabf63cc878b8144322bd74245cb59ef6b5beb60f288d4c7868dafa67aeacec41169edda553c75d48864e66cbcd09ebc8316df60c288b42cf96f4c371bd3b72cd9069345a4e54b9b857eeffa202aaec14411c9909da63fba2e9c6b39394944e245a1716bf4bceeff2c22d2dee572f788eb1d4401e1c830394432acdc98591023a4acde074b450892c0c4100929af76ca5ab7ba2d84c14f37c7d1692a8352d6560d4c08910c3aa6189539d97969ca5a2bd4019341245bbdf5a67cc97e7fc6301144328b2dcb164f39426ef2c719a62130094462b385de996b08efdbfd0c1e3f563c08ba1898002229afd43f5b94e2834e6f204cfe90f228f33acbae63b4acf783891fd22f4fb38e4a5c37aa173b98f4219d4e575697f7dcac870e267c486d89dc245acaf5cddc1ed21de22e6a773946adca94353d24bbf5f99d6f942d8a4cf2908c2e86fb1c6346566853d614052678480b2ee6991ed4e4f5bdf47016e81d124a3ec3a65df9b45936c3c40e298dd133b34b77e3f2bed22840b13e98d421a1ada5b8d771f74b6529415c888f84267448b68ffa74be9a839f22a2ca21a5fa546c08d59bb157295b86491c929e5c376a5196ab8c8bd2040e49e17da7deb742f6cba1c91bd2523fb46a6e49de83c9c40d0999956d6a9d3368f1a182b2a2622786491bd2a13979d4fa835830614362bd55c8f842bf8684f07f418476f1476bdd174cd490befdbcd162bf8ad37b281f1c86491ad2eea2dad62b47c38b5eca1a8f2023304143526f92d1639e0f05a48c93131f0ac8cac9c909220488c919d251645c52d6870252c6f1a180ac9c6d810d5038606286a4cbf017db6f23a73126c487f3406519925baa5c8bd66e76b63939f11164c8428684ce3a0b2a848cb3efe9944511b232a407adcc7c0419b21c64328684bc7aaed02ae3164cc4906e173d3488779cce27c3601286b4cbd71bf5658ceae2eeeffe680286b4b84ae3cb7a599336d2b1255b1da5be9c87cfe40b2999ef2035c7bc891792c95c5e79cef9d5abb13198b091582dd8cb68eb41d9de6b24c65635dc55ac463a75534399650019d25e82931321417eaca8c1a40bc9f297fb953abc281e7467c285a4ff88955977388d946839a78deb9f5f3f3405932da4a3522dbeb0ff62745e7688b103bd60a285940b7244b3985e96bf396c986421f53a8c96d1b5ac59c6df040be9d8391ee75b8f625909932b245f94b93248dbd66dad364cac90dc175f96424ba3b1fda6c1a40a89571f32f76e1eef9c3d3298502129de3db30b5da137670e2653b893151329a4e528ccc5074f19512d21be86a87783491412aa6cf7f3776cf3cc515010265048cbba3acb2cf6271161f284c4887897e2319a6a5e41c2c409c97079f66b5bafea976b423a57ddfc7ef80a21935a3061c21a84b8b7e828a33b746e88c91212ab65d4f94dd73c67289828c1189324a0181324981c2118c0f8852f78f0501328e9c5054a78b18b2bd1452e78f0508b0125b810a22450720b0794d84288b240492d2250428ba5b2a2960a94cca25550502050228b0694c44247092c508238034a5e614a5cc1838712a315acd040c92a3050a20a141520122849850a90301e50820a0c949c029598a25584e82829850a90302050428a08948c02650225a2102909058a0a903054902161e42801058a0a903082b80f82fc9801191328f9840ff1212fd8408927563a2181124e34a06413280e28d104034a32e180124ca0dc28b9448e124be028a984024a289112bd7759947ecca8b3296b283e547aa0bb0980ac84e1029e44428b8e2d689ea6ff73f91812c48c14217e72b2b224912ef1b842cbd283a87a9544222964c6cc4c995da1041269f551ef72d6d94724fcefcb5f7459ff4e9e0e943822b531ef8ac73042fd061b91cef2da476d39dd65cb082961c4e92212bab3cc2dfb6d0f1f5d4289225213ad452d2a5beffb258948b8a715191be3a6551f11c916730b2f8b2a750ce13a44daf50bcde4a6a95e6b31444296abcb59b314a97e2192993cb5ffc9bff4341322b1e363ba9ff765a1050d229935d79dbf9966df2b88748e338dc9cc3d764c0391d67269c8deea7a1705443273d60d3edad16c737f488950a1dc33be2c9a8b1fd2f2b6af76b74af7332128e9c390123e9c93e351b2872ed143f2656eb70a2da8240fe9b8f27f64b57cf09096c7d5e63d9f87923b24f4cbe23b9b3bed67787028b1436ac398eed9c98bf23b5f5287a4c847f56afaff72cbe4a0840ee934fe2f6a5eef509a2694cc21b9239599b6678d96b95f94c8613988cd41eeee98b2b634d821c60e1694e16e82f69d45491cd299e5cf5ad539e6ea4bca1a9245091c9276aaf7b3858b066f95bc21194aa4c88d6bfb8c3cd4f2a2c40de98c426d54dd7a3b6450491b12baf23b9daed61db36c48bfdf6f96292ee73466c91ad2591e21da5e6c77713b1594a821194478947bcfc26ace296b6a6c829234a4c346b527b3526796632bcee347901c41091ad282cbcd7272b9d1c1656a949c21ad45b5ac4267598e39be256648b6f4d95c56e38216d2a5a40c2977b9c5d82c4f4e368810202a25644866728db1fc5b43c918d25966a193f96ed431da296b62489669146f31cb7fa23768350f9e9934571286e4cbefffe82be7d99f3294802169325a7bcb39c70451d2465af5eccd5d659babdc04018f3fa8c4b0863269240e0683a1288ca120949a2e00031308202834240cc582e1784016f67e14000454362c5634342428221a0b0762b138180c8682e160280c0a04410044511c48f21c4db20f85435aba64634f9e831045e6ae5ed39ce41aa353293b0bf8513a7ae680e7c45b63701843c49c8fdfaa7339159be8f2724e695aa9f89e8689142750df9429e2f7f9ab93cc07f957d25755039fce1abe138961508369bd4293a16597016a14f0afc286721c7c8de304f27df57e2c39f85f401a81469b4b264a648ebd7e9c5f28090c59843014bb420b06419e0853e757c6d2127f260787dec5f104f91733964780b60a24c73a78e0ce9ee3087b2c1b2c24d09ded24e291d73acace12b143bd7d2a1e3b5a1c04dd7f0d20f60bf47ea815353cf73b827d5425dfcd44d829d5d98b06a2b1fc6c14a15c478e78bd54fb480f8527bc94a680e1cb75614d2427a4144dd970afcddb9aa332a968819646aaa0de64dd5960e8b1e2b05ad1898a39f24e8393ef2288a12a2e981023b67a8556f081298b4b1e8d657c63fe9682efc4146b71ff8d878a3bcba414b1046bc51e480c54e706a714d340f609d55718dbbebf9159dd09513223f19649f20c3e8d86f1cd761045d5bf3bbb3fed7ce1844126b785b1054dfb8a4aec38a40060cda229a6d76cdbed0f93a09b0b094da7d29ae8d217eb4ed59ac09dcc55635136e5c1c62000e278d4c982fb4287f0fe88f5ea871356fd228ad86842bcc8475ce59aa1024a48606e13051e5f92e6a338d635dd3437dbd29ba21072b39d9a71dc9b4c12ceb3f526e9a99616af6ac8bedad3a4f5163f6f34c0d023105195979af660d64f228d2343c4f2765564119efd5718002e56c015b7323c2ed7eb60ff8edd3784fe1b820f89e8caa8d64fd91ef7f2069fe42382976d6d1c9584b2cf32e13052fd1482915c69036ceaa1f107d74b7009264677f425e45b6308b40f8ac30a3d8e3e7330797079772fad521010563f63d02eab0c85c35abb0337d92504d165ae198c62bbd0fde8963d9168724484d2727024a9376e8a6d80cd3a22a43ed4ec567f02d0a0cb8d19cf4501c6557d46aa0ca1e669860d80289551cba4cdac42a9bf31c8ec2a1c67879ea21455526d13e1075e9b2aabf0fab58001018e94b8ee459510d58d4ad6d5d2481c1fcc6a5f8f0b0bfe8a22f3f0709fb499c61910392ef089af67cd7ae9e8a2390a903e320f7998e08227ef2af85923b62352ecf99dcab2c8292a9fc555413ecdea779105cd07e00508bb5012044b09e30f93cbc2cce61fe9b45d6e8a0c1cffd41a5042636eb1ddea37256658bb29f73a837781288f2084c57708984234be9366f603f3a94b40df8d01a1cf15f6c72694e8de935152146a624d70ea2ca37725cb4b12ab1637d8e83342dbafde6b201116a3489ad27d50eed10a4ea1674d9b524ff8db0e75288d8451fe049c6542ccf4d0cca24709c4c0ee2465de568fdb0dd1bb2214511011ff08cc1357b289d2dea46881e04944be5a1c0c41b0df6ad2ca4407b5c31cf9328b247f5e581682aa485bd2e1d66bd9f5d4c998b2f1996cc5ecc7b7ca214b353f5e75da35674894e6747eadae4281e27f5330c9f22e1a47719f561068f6f959130b6166bfd51231c7ea7a1fdd8ef69891473fa3f419039e086340f2b1daf1ca3eeec65e0c3036d628b257b7c193b01efd84786c4363d8e09e933a527fb6425d644bd103314be9088afee3712494644e1f03f1750cd9003ffbffe673df355b2e88740229f2e17dc6407209455ddf54c39106a89e6bef6ac70ba5c31c0e627c884859b78ee8d87312cb9bb99e92c72c8924b2711e684c08455000847fbd7f1d897ee852901e64868630358628cd0fc91d2c092162c755ee5de10eaa3701714849a98c1d00c5eca0b48dc63e71b248ce3ae2199db6718eea594cc9342c66a8f1f31c09776259bd6fa01658e40259ea98e427f66138e40d5e96c6d027b23710d1bb36dc1fe226529f0f470c562d9ffa11e9a2582cbae3beec309bf40ddfc9e1cb1959062c5ba7f1893da97f0c29541abc8e6906b9eeb85668abb7164d0ffa18172bf5f7c49a873740bc26e63ca024c768e362395dc7f1e3676061071f4a8f8a3a0543502e9054022cbe0cfbc080dc0f0134f79a561ca7e8144d3139b30459b2da5da24db8ccd5e62b320d31c16115d8d06ebb7978724e7e0c4db41627b90eb16ef181e9ec833ad068f27cea34d942f2162627b9647bbe7aca35521eceb39f88d5800f2530f54351bf38b0bb606a29b47c469b8efb1fcbeba88ee993039e2b5b246ee18ee436e4136b9a64a0e4a4504c52a6bef36150391b7c866f402fe972f6a80c5bbd4715d5fa3bb2a02795a6b10e05506dfd0678055c0563cab1b8d3258b1c2e18935336bc1ae1429eb7d272da3f91d59d3288a5c4d01aac8992b5de252ce1a482b9e9d896cacab6a61ea4b09365340c4eed4c1bb8ba2d3380df30038cd7a93ef3903a4123e77733a6e6c7ad03a18e01a602e78f842f72b27c4400e6ac4d69fe2dd93a475174e6e9b76b8c436bf75865b826a1634489f2bbc6d9590ae668d550017256f852585a10b96707995d5e272407d511e9f2c272b0be002365a004aed5ed95e70eb9209c808467756b2b3eabf4f56bf0c114e917ec1a223156cc4f639279e25a7a63c79a46ab4663c2596861652bf887591617ab01ddaa48f5bde5c75234900b1f43c8d270b99a261e9834f652fc31c8d8f127f4cfcf9e612ddbc7fbdc4ad1533c668eb95b8c1cdf728a1c8a1a2f08563ac323fba393f5eb6b6f54fb582d271e292c39fb91e3a05218d44387d17b46aded721755109224ade64e436e8d45efc902b36f130ae1b70e0363083a9e24a58c318c37b1aabc7f069eca3538ff0ca43610bb171a2d2d53587ed1fe1504fa7b69675df6921fa8c8cd3e8f5a5e9735deca81e3c352811c88a577ad871d8c2554305feee7fa69ed91c7bbde636e6b6ea57ae58345378ec84e91dd0ae6f84ae5b0408d9f39e1d0b1da4698c36ebae0699102f23d63cf75b32cffd9e09cc7a234f02271d1f6383b52ec464ef35fccfe280bc5d933dfe4f6022e7c81789155efd7ee5f33d301673d6772d5d6629fa6e0c4a07cee8a2ec4effa28810dc3cb7e682443b934e2c7256572221b60a82e339ea454f185181b5f88cf2058407a7b8d1f96f289af4e0c0008b5722eac74fbc6e6a18ab41984e2f934112e470237b5950a340db7d31077e4ddaaaf6f13ae7b35ca8472cbe07c737abf5955288b7a6680bd5ee063a302034443159b041aca4d9934ab80729dd2634c1e5a3cd4a53f621c8bd66b225e93cf58653eef4308abb4282cba6077992d97998b95dd3831534a815038a93e997459d8b7985d9915455d0cff0d3320db7840c22b7abcc3451c467290abc388de3317ab2888c302fe79a6831505fdf7cc632b0aca87666f265150068dfd887f48fb013785dbf34585233dd0638793e6131e9455b528e63991a0ad87bac3452d56e0bb3053068606202126f6575bf5eff1410baf5c9b35aa5a81a5dc7b0cbf320af99c40bc8ee429766d7f5b5d5f8e8ab0f01087601da6d7a5bbec0a7ca7bd739c9e2ba3d85ad046ee11c735039ac912c65e9900f302268f9c8e117f37178ad7cb7b31f810522e8d73cd970015cd079504f4d7546c37e2751ed26b5caad478b4055010d46f9c38abd6ae57d002140938cc70ed46d7cc3e1b41c53b915e8d3abe170f5102498ba83a0c3f607477558bd39f49c8833cf84ee707788c95c1a9fb44b6dbfe00dcc56b60d21b227105e4a1823ebec065e0103c0b6f761cc0f51769c899a05141826435dd63473aa0299c76576cec18bb15e199bf88e3b14b2de08ea470fe07fa51be986bc4352e562d35f01ab8e25b91906f7b72a1ca94842e7bbc38a7426573ad2157989444047876a1ceeb4fd39c1950dc7adc183d0a9650c85cff9845b4ab9402ad30956936892d7179e096489204a4d5735d9dc2871dd92c1fbd614767c6d8e8d787006706b229661433e22c78f62063624631e37319456016711dd2bcc798aa0f3589dbb80c5b97b55ab04e10b82cd546ebd575c9d580428f06008d736dc62468712cc1119cc6cb0f99907e3a5e2d58d5b4da27fc944a526974b8b546141189d18c6f2829a93ef104190c22f3419e404c33b5f9f82c3ff71474804161b49605e4ebf75c6dac287b024b4c6f8ac78ec45a29d3b476f7ecd273427c4c0dcdc131e2d8a8303bf3738c8333cee3246bea2324b68fcfb34cc13831ff3baf24606bd5f4c40735c1d4c7122df2bd28e8f05ee89635d638d66c4b31ad48dc9bec5fcac3f33d4c0aebcf690a4a7c102b2660e9d00f568180555f5030409c4d4a3d90830a9dcfdb46a73cbec2a794a05acd0cc0b5347cd9e83ac10c9cfba3c0c340825c36dafb2f7d6f00639ec40764863457ef89ec2d01e865748c42fffebec38ec1b7f046c92712dcc8c10c19fe3d3e0cd306078dfc78e357d929aea2e9dc45f2fbafc1a7d01e9cbf6daba846fbb2885d492122618401f15a5866db873d3e7a8f8a4dcdc22903d0bb49b8e80ab5a8d9ee5358215e82e195e9d71bac2b697fa285e74625b3c87557df21f715058a5deab20275aa184702a8e038d5be478bf5a04a247e95e37307d61e137e640c0d54d15dab53a7733dd57ad5709d8f6a7f8e35ba831e451da57137739fa9bf0179cdea5e46517317c50ac78f802f1bfc9947c69db025ff62a5d236391d857e55717892a60e5742aa7deff5cdff0e37304cad256363455f3da1a2626dbf328efc94982c3aa4f3ac54cc4c52641d4223538d4e1d3dd0f8ab87141a450704997eec64e1be603f898cd531994fa2c88fc82bdc0308e00164598cf1b33b910149636dfca1bb190612321034f070055410a32666c35013d72f71f37bebdccf6a591c9d07e91afc924ca7dbbf18e74c507023602052d2e774dd6668056d6423fec701cea35644a60ff48294d3908a7e52d4fc4dca97d27ced7ff8ffbccaf6a1f14aef29706b8f326321b0659aca8b814d7498bc4deac612e8cd9ce9f3723b5871389241445514fab6ae1c90d212e9902bca33c8dcb7fd3ef75f63ed9549767bf8827e459328848ffd676c6f1e0d94645f1485aa58386f610840043b8c791f95006544972a8cbddf25ca9008e2fc8b88a57ab92d0f568d9a869bd2570ceb587c76f26f1fd9c1aa9208280f3105c00956b419b479a414af0300d30a0d482287efbf1ad1670a6f15bda83fb9282ada36f98418c81c43dd039369ec46658fc51c53d68d96c8d80c15ee95a470a636d1064d347cab3d314f2e59f1db3bb80e666a730bd65c924a6ac91492589b2b750ad4b06518488070b22e3814b4e94b06f1fdbb52ce3525aca07d2a347b5c817708643aea3139d71d797e2e1ff7dfce2f62b10f473a6e3e793a8f844465f0dce513b0560e41eb94c010e12dbecd843a54c9f82bdb5c9e21054aaadf047e5c6216abe7fed916eab25d22c2b39fa0189ee4f3ed4b41512dc94cc1e3f13916e06b30e518c4e8a504b8a99abff1f04136557a9fe81299bcc1e6c713210296aaa43c103a9df8a8f770b789daa84c5d79bb13a2d73e827a0fd23cc3d52b24d0885af7f11c61b6f41b55f5227834aa4f655c853d4066e47e528c7c23e65ee5595a545af963937c95ca8d68be35849ac8398fd0912ff3abe9c0c8599087cf712252874e16c89dd7a62f8c5c3bd0e5162534902aad2861856f7ae4cafa214ab0c709722a7e5f04b6a29823ffff2b53a047168ce0fac141418740fa6e08d41c626c1134151c13f8e5a13a22fbc10305111d833807a0853aca8430ddf475055f6ba4121bcaaaee0c088c86adbd053e4702f202cc91b190b5739a8966068ec8ad532868356d9126024aba052a210fc7573c939521a7c722c63730c183e4ca6465489acdd594d1da439c1b87b09f57fe47cfa5fd09f59056358fb0a470f5382727047250252d8198e605cae3ca8f91d016f50a1505b2048011fd34bf1750d6eba1966b0d4df0284a9b5873a32e82e4206cc195e7c90e8b6a9f39b411cbacc5024044827ea66cc3b8c1c052c8ad6c10e10f81a43b5d709b82d9f65ee00ef3100c8f2abc7f4831b74fe9cf17aec3a0bee83f80fa94dd1c3208f0a2a13fb3e1242627bc5c35ae8180de8bedb3551ba04dba253ef18a01b1c52a1417769aa4b3bfc8146780901ce56a372f2176425e318c6f0f620d1869426cf556e3e850a7cc3b4d40ca5b03fdfa7cedf9b5783cef06cb2d178c7ccd4919e4189ae839dd907d3371926ab77e5210adde134a4a715bb92653769f9a13d2bd337129ff77c426a0fb33dda88a6afbdccd45cd2404383aab370db04050a53b4b991aba67c9d08361b1b614cee00cedc7ecc7aed7511eece68a2acb0326a5613052efc69c8f48803890ebfc6f60434226cb61e727791c39167601fe439c7a1a23d4aab2ee1cdd98a338c8fe5b7e51763d8c0dfca501a02c9eb9fd30816ba9f377a2ec50b7c960aff744627a2a3882fe66d0ee6e585f3629ae778e409cef188387819c4de293e33e35c41b13024f39a98432db9f447fb3136507faa08031f5dba25c3c706a72edf2dade95a637e305175ad97118ff50c1ebc0ae7eab52ab9ec3aeffdc8a3a393da880baaff7e70348f04ab46b5919231478f9fde1b633c4e2549b1f05b5da6d8bdc1d63ba4d7ded69b6cea8b37da9219a9cbd604024a874ed1577d2c64983b4b9ec9510079f7ddbe437967f849d4c81040bd832cf904ba067fa8b8bfb0145e92fc611ccfcd081407869f8506629cef522fa5fe58060a0007f65d4d30605c2fb453f69433eecb386fc3b3acc221da624e4753a1bf81d37acb76ec93316939c86da1677deacd81d7792f860d09865eef0379aba93ae2323f8f3bd32dfea46ee7abb0d40d9d35b40b30dd3f075a2746df8e1518535497ed6f1219f4f46bdd11951ddcc24cbe3901aae6684608793e4df09c1e93e4d8d8e0d3a25e6a6baedbbe33b52c3b7e46a42cbf054907a6c68f3300053c34f1fd4de2fd4e730a16962061a06a81b52cebd425a0168b080103531fff0086ba0ba71e99078e75c262ae8f887b4a38ae1ecba94a9e2b9aa407a0222da85ea9df4d7e30d8c55891f146db0de66f6324ac4608eff06f514f845ed74566269a86269236189af377d987f49afd496d3292e27d7d013cb1ebe2bb66989d8894ab4ded6dea3366aebf5fc3fbc1db5f7df13ed7f0d1bd813867bd4a6446fa15e17b2857652e47c058aae9d6fbe8fc29901b1ac068ba849104435fc36d4006cf7eca7a504025ee95a96d2e0abc0837688b6314afd9ecbdcc11844ddbf95e5201aefe0aac4f1b5853bd0d4faccc32d191bd537857dd51b9fcf09c73cb5a7cb09013154ac2c1097496dd6d1ea48ce7d53df114a5c59e62a20c621438a2d55520ecfb9b212edc23ca0473ff5f6f8aec9009b9c24f79637143d118455104a951be7bbe6cb209764935c03d50a0b00ed1eafb19fb0fa28145e199c49e90a62da82f6ea36c15a09346970f56251b5d0c8b570132095dcc8e5031b37c4e0a1e3d79c055a7fda26029661aacd7ae5347c584728f445595204c523a088a6aa4b3f206b6d54bee5c93399c9e76817eda83faf25a574648212ccf2743d819261a19b0424e17a0a273b9a8d2714f8bbff474ef5e5834a9b9d6600eb85be31130ac15f8aa22b236832c2ef7164875a9796bd4802ca6898a2e7236f5eb5e50d54a58ca567772c50f895c2b76f351c37381f4ce599e2a33dbbd86b1f3e9933d9a4f0ef94ef4365a6c8801e364ad7ec5887fb6b94300fcd89bbfcbeb1e1db6f38c47e06167a3e2a126c0845910347ef1df1aeed02097d41e11c2004077e101d0a9de1a101eda04c527023761500e35cd848096f19406e4e32182e5f1815fe9ebf03e0521c70db5a5051f822cbf0fe1be830244ad4eb1808ff46d8b2c1e0942bd19fe26ed6d441d189f44f0d0871cc5b1ca3442978c4f4c7c6bf9fdd863a6c08a86c1b718bc12382336e2ae008c6f40a27c4117c5cf435f2ee9209d07e0cb1cd8e67117c89ba32be1a22bbc8e3c13fd8dc3d75f66f7a35bd56e7e8bbc06e57f7d29ea056814a9f8536216b4ef0eb560fa9a06f487350f3e8f19ac3dadf96d9d2243b5ea7af68de71cfc6c0369d78eafa144c4e1bafe73d9bbee580efa6fa7d28608b9a6cf282e2b3d9c3e14a7070262f508e87c56268836cae410d922d83df23d35549e014ea521a42f09d0ace4ee9969fd8f2e0dee05404af4f125e2d50283865797315ae2ece6710df8d15619b581d838b0b76b64c2bf8a200ce16c49fc1beaba2672d676fa72080f1f607fed5453ed5a1ffaaa791f385bd301f5871dfc989e78df0805ba6255a19614f9ff7c42390650a08809111fb81b9330098ad8d220160572ed2cfb9b60ab211c813c75cb2ac7f6019c8cc59563e1bcd9e9ab5f8904c55c9d98c038e2bba1c6d08819827f96fc361e9183148eccb99695ffa83777954b8afe16316177bc6940074180c6139614b4018303b7842ff20a8b14be82620fd1f3f7f43414ba05103c12b1a03806a20fe9f5f1bc9f43ca1c7303fbced0cda10d05f558bf5c8ae21b807884c8d7f2641619f01da4d1b28f522b082f0992170f819343191374f78498d48f5e36a8dbece69213696c20ac345f6574a0bcc835d82131a2a2030d8c027d7aaf524d5bcabff1c3599e8ace3c9004a4897ec44d2ca7f000b8d0da2c4fda6c286e246344dd840d5ebad8dee46055d1bb59100bc99b8b5879846eab3d46ab0b35c4f081905c5c3112e3f3bab46376d1dc93f27379eadc80592d6e2a6c612ff2e54ba6c1f023a0579edf2b7b2edc991e18fdceb99c143298c3623c7dfda77b3d8cd3a0af4038a34c881a9f1602d274cb2f9e8e2b48cb1031d5bee4dd51474d0bcf4bb4980eda86a1d5b53736142ef5738809dd19e6bc8f24a1b1d227278683457894c08ea7a6bc320c348649eaa7dccec20f94ec7b091dacf887f75c42433d02eb26ef133ba5af15f1e79a2e0c1cd0ed137716fa8d2bb2465a1784b3ba0cd36b08dd2c7bdd893a83e1c8081adf16e29381307e3909e022a91119cb7389001444f8412d5f405d002383e69fa73488c13a253821285981f283159df11f6c73672d9f176d6f43f805f3c66bc55300fca355b9944a7c8000498d4576e6ab57f62c234db576e0fce22817fe21959fc3c992fdcf71be56ca4edce29419211b3a7e030315cf313736a3ce939a29d567ef93b1e96c0fe55ff623f3e108c980aace65693a11d27f881d762a1b649a819ab6d1e1a64353e44edf0b887deae87891089e28da4464d165393257d481376f21b27a944c5e8db3d134f4a6358e4e7a7e1811ee4fac36283b5667c4545f434920c0224d70f64247b5a2491f23470355968a47e667a482975b9b5add84aebac8ed989ad339ce788759192620e8520b355a8f82e02f9ee1d77f341cb8f8b4614981000675a430d846c9623b2eae8638e9d6e8e2d8e60d55a33bdf67a1e23545583698d494679441a7c84a90afd2b8f5ed55ae5d49e685b76588542a8ab4c60441a136ac5509ed5bc06b5e1c93c871d845c6633b9d19334535bc407def65ef5d1f333015a44e5a55e2febb3df1b46315ba6f3633513d6e19bce40ec730a8a91329f14560b300765633d6005260edafb9c2c77c625cc1123cfdc7e6058407d0c42408faa9cac16f5565d9ce8f9c70bdb8525173e4d4454bcb89edd6c6ed06accabdf13c13a11451c15c8700c3d701533c2ca30a466f62c5ed37d29d63bcfe5ab877b42e1098ad1ab18f904284ab68139420f30158c57d6c0d31e9051ece91a1ac8f52252990654fdd4e49f0403201b1cc0fd8cdd837c50cd76bea0636eb18df0508073769af547c5744c647bc6645e2ecb91d729b571aec398295c21611b0ef55c50dcb43348d65c49a14637f470f1c2cb865e2b8a808504340ed5e7febe52bf52562466718b1282812906a344e2e6e5a0134ec7c87b3c7cc4a11351d3850c6b6dc39f9514680176ab9198884a4e98986861243f7581d890e58940a05c944c0e9dd9fa9bd061718f2533291278671fac805efc5bfcd9b70190ebc0b400e923402c2419c05668479887fe87c3148ffad8e294c314df73ee2ca1068e10eaa977da316d27f03af4a2563c4fde49ca67258446c5975a5c4d25f95bd67698d0da1fb99a8939f1f6408d8e778d0bf1b223ff212683d30b0480c9cfa4e6940f16f239137fb7b6be258a32be930aeacbfb42aaba03071bc1c401720e500bbbbfad76f864fa31ede9970f149813bec5598933e864d25cd14e842a2d0da1e62a99381a94786d666218925f181468742caaab9ca29ade6179fd9438c22d313f649390beca69ce76bd9928b9ef503215102ae899f7acbb3f4749be9a5e800bbbd22221e71744e93b2fc41a6e8892a6f4c13a4d9276161b32878064ecf2b294fe194226930e494a29beaf08fc6362a922d789cd68b8d2128e59d9c0e1dd42a94ec197d070b664d9fb1eeb907ed1546a631694c0d9765d7fbd76a822bca0aa40dc2ea40e227d6dc68d83a131a0bd39cf564d184348da5060079648c7f207c6ebc0f4421002a2900b3618a0c305436acfedd44205c9fa4374677cc065cffeb311b85ff4b31005319b6d7ce7876267819c348da71f4007d2f523da98b016c89c0b02e5c1c34b16083c3777ceca7687cf9914ff090301e2ef1a3d256552b8f12f24149a631264427f72ad3dcb0aca527d576e059db277db04a38a1c26291bf42ed12161e1cf5c6f516b84fcd781aac3aa68d04b9d41c860aee70e5d713f12c678d2bb52a8d48aa6098e437e5b84f848598cb14b5fc6f1577a7ad48657f59da2d02b7cdfa83565e523e9a710a2d245866037564cf9f777b9cb60518046506da7c53c753ce57806bf23423cea463fc89b02f44eb9f2e7def65272cb6c9330c32ff4df818af90b6b7dfca05c9c9ef3c8c0484202ae16722f77b82c1ec50423b728aa64bd07dd16fc5743020a85d48024dbf2a69cd073b25216cc5af0b943732a7d242fc9674ed0889b37f20531b342044bbd897f391f5a4df5e290712f8f2fa357ab817db389a9e94b59e0f26993c7ca6c34a62d3b726ab131f07ea65622fd553859e17ae458011973b4155634f3075507930aab80997b716fd283cf519d386da0632ddfbcda5c605470f197a3190c12942071c16fd28b286384865105327a8b7ebda95a1503c88e3b5106b8d7a682e3fb262503a72be9d9753fcb81415b9c4f81d9bad6c92e2204be2d3862ed2ae46480696263c1a188623e1a873b0dd2faa6d30408527d18767e76f1210de070d0fdaf719681abb3e47fd80b20761b1b49eb4ce5c5c16ea4dbc6c9e9688913fcf8c5af4c5bf23851cccaed539309c03277bd1185e52f33cac0f27c93548e13cdab88a272e780c23853138eb711b401d4ac7b034dbc391c0f357ef471d0fe960a237544a6c501668813ca27c4372d342ab631b91f5fe30433089a853411726132b526043d0eff460d212830f0090700a68dcaa80eb7624dc8faea10796c39100d4586def07530e0c1d2bf0efc08672c30556a117f3574916324d6989c04bd0e824405f72dd9539ea87e92e3d1b44a429dd28228e00e8108c7441f39f1f7b2e0e3f7d5772e6bb94acdcedbbeb6deaf95debb4ae8d6f00690ea333894f3e05cbc406f4b5586268914ae7d225648879c28ac6aa42abc42c05b0d5dc44159b0a27c8e42acf8d57aad944458b382a0a3e05abda7185980481b3cd30fd6a059c108239f68bc4c10e05e96d4f03121124b8bc50e3d385d03613240ecb246e0bea31cefcd4d7500dfcf436a0492cd4c6ce84f8c0f4ba52751613aacd5ed0de2fec578458a37b7db53e2e8a2983703760479d4a2820820b6412e3eb8d2ce0ac1d0e61eb46e5865e483fde3952d3638b40f745fe6b61b2fe19ee0c902f3e477369f192d8cf6bc03aa89be6a10e26df3a840e7830360ebf692dcaf4e06028c032c753410debc154d772d2b6e0eb1d62f078f293bdfe36a7cbc514d7fcd69e690060ab07b773a17ab24859ddf80cc68485f5fea2955ebfce1a1c4bb7de86e05861c58b92b0ced157769e129887e8365ead668c4d5c04f03edc1163dd75b7519d066b14201e58650266fda0afd52c633043c9d2de48ee279e404869022ab1bf8c1406b0396ede0e8a696e819d9b456e9d33662b091886d2c5962721a0446807202b0c200b308f07f00265a4aef8bc304167d85141fa59ae86a02a805a0e80dc0743c7bbe8a078009da513b2c30a94eb718d4d986469bc00eb8829f0e867e03383b00be01cc6e00ccd4877919980030ccf0acbfe02e465116900ec70b5212d1c7f4d9d75d732a9dea66d4497f89bb171c6df1b6566185061d90d835f4bf23d119b69e455a421455e20013ad2d584782db792b848a76d6ab625bea082c6b37e41cae52fcff51263433f799901cf1c9a96888de66c69fb69dd0d5a9e3ce7a9b9e4e1ebcfb9cbcc8a20eb688f52a5744f2abbb31509fc5e298ea794e40788a820760c4c158aee94071cfb613396cf96eec13d174a260fbcfe1ca39b5f7cd261effec421e188264f0ad6fc534af7d5211152e0951c065b98eb3fc660fa381c5b1610073e368a4828316a086335a94ef9262c32dcb64f7e710ff81a310c3d258df83e1f29de39a3cd193c738bfc06a9a49844e35a9915d37322ae1f3887b9776349b3033c400013d463763a261078748be9bbd88390c2d7084eba81948c0ea98e3577ec367827a57743c84eef83226309ad3a32cc3770deade6d1b577c411f30db5a1c8697f12834c74df8e8979d410e4fb1589d282360b5fc102215056e9ee3a45de7b60da980bc0ae0d0cf6de03425cbdf28751307e6fbcf74760914c54ba26baf6c6475e3117431aba12255d3ffe2f60d27d636cf429ebd94bc160384e335d0b77f2a7a0a86248166d81db95c95cc3ef106c293f6503ff14c4442ccd1db107362e0d07bdae0543bc780558e951f1b58c4c19c6c42b9390792400e8c4659c76baf53707c5502670b194b847bf65446b850db7edb1313931a423823650825679655cd0328e5217fd426aa43c64b3ebc88134fa1b244e07b171057283ac36337447a087f2710d7c838427f94bf034b3f8d59d9f17d9bf159d1197edb3436831973102b32b94202cda00db79ebc244cee6e5a55641a48e9ce20a921d7a84c7a08a34423bce8c12068818eefc0633cf13a332ab306454c8c5c8536337ce5995e34a4139bd8d4e7aee56ae8f4594ddc874ec5629466f104f71b81ead584c913874b6c8b0cdabf4da43fe58c8f9a51d5832988604914e3b236d758964ee96193414a829fec13d444f142da47743af4084c633b851d8d4ffd5600137727c9e545908b19e4f8e84daa8abc266e0ee5d954cc56d900169e75876cc0a86e7eb80fd51702f1a29d8191925672f79c852d170e765a41a68b5a0a8d429f90f6602b2e91abd38b523f60ac25021a37a198ccc261b9a309b5e7887963a8d68a1eb0c1725ec17089c861d6f532cb5c45985a627cb0ca7ac291276036a7d9580e541466f5545a71d91e33e9237a6af9b7f4d710e35bc875ccc81011e0b64e2f20ce45568f7509a1795dd69810bf4ce9654d97055d35d6585ecb70512b56b0d5938b53cbaa4ca7379283da465c57affd950aad8d64120803d954210492520e7e2b2f2b2b8ad7c283ce6adbccd56ceda6e6d6cedec54c2a5c31e298d47be78e5fc9e83f2e86c44a3ca4789021e050b34222c2325e4eac7dd5ed82083cb638c0cfc6ff8af9884d82296c64645bb9d74d1ed9a5d4dc7d8bec39cb3e9f975a2d0cade71c241a6dae6365658de5330176e12f4d43389066250476d44828a651bc6befccde7a65b8bde3709416e1a9d60604a20789452c2aa3f8522af7bcdc0944d0f101564f7a7827cf0e9254df6aedd564eb9ceca32a298675ea39d748c1c977330038cb4dd4d520ca70213f1d1fe4b5af4f60553a539dc69a9006c189c8b0a5f7f0dd240065d55f1b771a0c9eed650e8470a6a5db4ca4370576277136f82fb59e93c95d32f577113d0f3acc9f481c42d7a97675fae7cddb32a19cef4ac284ae735a2be727d6232d342291e509c32c466606c336c90dbda64dc7403da1aa9ed154bf9712266657990d72796850ae32b49b7bfb5537fc3e08d703cd6602a5db1ad15660ed65094d6d03e3161fab1fbe6a7d79c7b3cef3f1e0aa0c2897132f6d65a6dd6bd9076d06272086f6b26df43533247c6d6f19a8049da99359a895f676c263760db539a1e7d9ed77da3f8a9e90514ecc82e7a5cf1b47147d924b061cb9b7c352ac7148b51e89c4eef98fe75cc6d7d3aa48bd5cc22d1f718cebfd6a8aecacfc98ee564fcfe716296fadf1ae02a5891e089571b4ab4ac667c8741466d41b4a0df436f4602823a88e2853d1c34497d041ac53f528ada712e8e963ea5d28094b6550f90e65045dccd6d448bc15ab6533aa75bc7eb3834cd8c122401c071ee82e3cf0d35cd4833e968db916731307a1c8f0170f06c6097ca758475847784ee39d619d60e6205e4c07a877701e2f1c5628a630bc00f88231c2b01550acf18a8303e9fa859029a22d3ecc02fce2f0298a6916cb1ecf64d6abafeb55cb7d47f96e228864d4c814c8a18ca8a4165e5f48da5a228a2f805255f4749738401baed8927a83cce26cb11008000a805106a8e9fe61d4afb65230b056d084c9f2960da50590aab967c0b51f995da8ab801dbc2f9e1b6d741badd861c6d9844b2eabe83ebbbc4bc1f1783b0b48199bab1e1c4fcf48926f5c03c2ea717bc833e80c5861488ba4471524912b5cb89a6046e9b5c19436f93f4f4cf45e1822b113be78071076b5b0906b664640eaff0d84854b45528442ae6cc2091d1128d74a0b78970b0d7f7552e361ee477e2783796eef16f26410ce86ee0f33a5be9e9cc69f43aa20684cf0d042744f2055598127eb27c2214a91be525075774534fc730e9fb3f0b41343c92d1e83eab692e6b44252c0bc2eec8da998a481f6382f87b13c2796857c82b6e87bd385f350bdef3bb4b177cf846949662be39cd494f0ce48383fa4bda7acccf8c243b5c8dc893d724560dfa741e7558157cca0876e37a86517071a1d478ec675377ac4b6186569c422a3a0d66867416f30d89347bbe322d3d5810c48262960c4917e53da56e8b9794afe1b48cc8216c723b0ad689b16dc0f4a153d8e7a4a158b71b2556d824af6075c44518e67eef28de70c42437fa8503b0b51144d18158c44c6b163bd276cc338cebfbf34e9b93163cae88ed7747754ac3ae3ab1a4765d5c3a2de5a73c7cf2084fc0405decf3a150d9ec703a9ca682a68cf3b490f795eb5e0fd32b32b6400ca6eabdd2ef33f8b37072280e422693fe051c01520bfc69a33ef8e029a31e846fc756c5044dc9d4abf396bae7f5ebb7a8ea200e8cd354ac1fa6a3fd404af56a2e2b9a9f5aa1e4dc11e60c0ee242ff43b8307d7413c7f7f3096063f3bcf0087d6fcc8ef40120e8d8551e7aa56fede15881bc5fdb34254d62a95132216c6d935cc3e8b427a7dd8892e0d7b5c08c2be4eedb704578d907d8446a9af0c9e9d6d373809ff657830e3fbc37a6aa3abeb3f76425808f499984ac8d00e004f22ae8c9eb8ddf5d7ece1550ca809fc5408140a3dfa9fdf5b80c5f17f0840219fccfdef1ce0529623a296cadc9df00af55976bbf8c254839057c7e68d621ab94ad6788cf2127e1a2af31ce40122a3b2e1af4b396265bc583159fe468d338d882144c6faebcec6964ca0499efdb7903e39f7e6638a1ef721ab2eb3670d0128261d71c9730ca4e3e48ba7b8b1fd85da7536f277247250dd369902aaedb71159feab997046e5f6d8e85e44a681d8d1b7b063872c03bf0f7dc383536f4742417d33f2aa106b3bf7d978782090214f773fa68333f77ef5d0f3ece72378c11bc178a8997118cd7b87d8f4f4a8c8" + }, "genesis": { "runtimeGenesis": { "code": "0x52bc537646db8e0528b52ffd0058fcda04ce5486bd135110686894746ac8b20bd196756828830e842def84b01b23306e0c8235ecd01cc99453f017f20ae2046218198064c287b053e29e0b751cc4b40cad3c100e129b0683471b75c44f5a23843442c8de7b4b29033b152e120c1324ce462b52fd9addf6f511d76d8f8e49aedb96d70e3524f0cbc5a6a927b034bc3ca61867aa15d18ecd0e36f6188ad5a493e66a4660cb63986aa4d91135e91907c5eaec18d76d63571592cd2e3b1321ad0a043bf69e877118f7ae1a6902bd5e6d88bcc675f2efaa1d8197598a9868eca3eb572bb2613a9baa403aecf1d854fd71fd8df6450a24bee23a49746d8c03fbe39952fa1428f6bf5ee7f14ca93e85e6f2fa208f670a7f0a8f93ae373d9e29ef53a0d8d75caf8f670a8f89caf1d7e3536e3876bdf578a6e84cd9711ed7d73c9e29341345f352e93c625ee24e7314cd44c5e09cc75134cf5efa94375196f56da2b657efa83751d684628fb26ec363ae5dbf3d9e29a3891a9df9188f899aaf70b80ee7ea3c8ee2f398a818bf4dd4e8db513c8e7d0a7c8f899a99798e897abf26ea3a871dc51d9ba8f78ec26e73996d7b3651317e34516fa27c7cf4ed7d3b2afb365151e6a8f89ce770d4f61c266a66e63a264ac7abea364cd48c0dd751e9780e4755cf61a26cb89e0d475d38130a93cc44c95c878edbc8e8d0318fc368741b7c8c46d8e8e274f0a089795bc5d788e659988e58e262c6168f98125b5cb5bd6d54e9c06246c383c6e24a3171745d0fdb2a1d31d94673653c622ab67854e2a28e1775f078960e01d8302e71d87788c961a4830e323cb077e5e41cc5cfc9b96868e64d9b75531680001c357a0002c05555e9f339d9e839d1643a8abb49079355d2b17d3e003c621e80ef7014cd77c8c9390a7b4e0e39dfe1a82beaa003c67dde1475dcc43ae8a043008eaa1e8089d2418798f71d72c8c1c751d97d5c9fcfb1e13e70a0d9e13947f1788ec90480e73051a6e390c3738e1a1d87a3b689731919e6f1791d7cf8380e36d8709bfbc0e13e8e8ab90feb3afcc751a5ff589d9bef7054e93b2cce71d8e13f8ea2390e4759cf31dddcccdfe4fce628ee377b14f69be76063731c6c98281f13e5e338dcc686db1c95dd668f8acfe1a6a3b69b16003a1c555d878902800e9f130580db60c34d47bdcfa3aeff98a80004e03813653351369791f9cd44f5e8719b89bab98ccc6d8ed2719b89ea61f31e4765b34773f638df01872cc77d4c548f89ea711fcfb2cfa3469f13950387cfa3b0e94473f639bec351a3a984e6ec7798a8004c2836077b0e13351a7d66a2668ee570eca86b5a009ba811f69b891a3dbb9e1dc54d2134677f73948ef983e6ec4d13a5838e0360a2e644cde7c01d67a270f8e7446917a4a0c18c3058902105544e9c139ea0a2096908830ba638e134857b0f8f697113f5799aa99ab3bf61eacbd1dbe083c76f26caa6e63d268a08083af082962d33a8c1194038f1207a01136a4c41c614d0b00506271e47c5cc1a1e1355334da5b969ce7ec7b45e8e9ee6a8378fd09c3dcd44e99850ec694acc6726aa74990985ce69ca7b8e898a21bd3451445c74b1862eb800f3c617c4707a4a852f3a90c1142f0043061a4e53de4b476d3388e6ec4b13459a41aaa9a3397b6dd6f0244273f6d94461130ad3698afc68a210d08331c0708337a0f0e58bd335a1f869ca0d4430c30e86a0861369f0c2690abf3aca9a26cdd9571325a7cecbd1a3e2bce6ece1dc5e8e5e3f94b340c0a02b65d3d494305a534d70e9aed47c95426baa892f8d95d8d459cdef2c1ee51cbe1e5bad8932aacb73f5f84e72169bf81607d9c4d5b5591aa9a65c2d1edbc86db31633de91e743dea9386d4c733679eb98c56daf664dc999e4b42d6e1b5b4d9eb51fb4e52d4e1b939cd00241d4f2ab0119d95a5eb521199b36ce8ea8a3252dae83ddbd0bbdaeaeda90f81ec630d58a54b3835dfdbac5756feb92ebbaae934738e99468ebca26eb3defe280500d6f71dd4dbf639b559cb6e460c3c801bd86576d089c904d8f5336edad8529c034c6646caa61d33eb6a69a48f50c0ffda6dfeb1561753d8cd6e531c9656c8ab7b88d4df11b1f6f75848fc720f71e7fc33b4ce0f711ee8ffcbc2b51545454d43cbbb8867441e5a76b0e5da9aaf3b439c2b7ceb7a6d0f6ce6ada10d986b731622dd1f0dbb0adbe02f4f3aedd117507ffdec392d3e609e3fc39648601a6bcb35b52c83bca3bdaf0ca3bfc788cb521efd846f8f8772c6690eb60eb23a7da9b915336bd639c3d4e37c6c8126bb0499bdfc308137028106dec658fdbabc6705aaa0d816c7ad77ed026e2651560fa63dbeb31d561534d06539ceebd87bcc3d72befbceb99c33467dbd8b4cfd8b457adc8b6c5a67d0f0760eb667affbedd59bdaf616e7b8677f637bcc3df639b31a7ad1abf871fa056bf5bfda6cd11f87738bb29b4cdef614c73366d6dd58a10354f9c85bb599ac0d29dd5fa8d79e0499908a3f519ef6ceb6b78475baf383a7fde8a03d1ae104d315105d39d62d3141345ad5dc33b9da9f97cd3e379e7df30cf9ef81bef686a89a2e6cff00e33b10605a2ddc38f937225e31d3d5f7178b5c074ab6cfcceeaf78d77baf7fbfb1f8f942beff0efa6c723e54a07fb1d4e277eba12fb7d8679f8f46ef18ea68ab2f47bc63bafdf9577f4ef9077f6ef8af3e68f4e2b0e434bb4bc04d3569c6e6b3eb67ffb2e6bdec596e34e3514a97166f14eb7ad424c9b5eb522d3c2385b0e7e6928394ad8cb967bad419119978692915448d01635d0027acf570d092c5acdc856d4fb8c77b4f9aa19d9a2def7b0e2f0fcd95a7120e2652dd8db77efbdeb5543c2ff799368f7070c538d31b2041a6cd2566d88b249dfc37a836560dbebb192b6c53b5d8f1d4b6cfcf76e0fd9a4c796db61dbdee6eff5aa21e109d9c4ffd969b149af6cd23f4ed9c453d9b45f8d8f6df6b86de6b497b3d8a4678d8fbd55264136ed7bb8877bb88799cbd8b427e25d2b3005c0b6d7eb4573062870c031a201038d1868d240f385060d346068c2d09c81660d3470d08c81c60c3471d0a881a60c345ec0004d1468a840d3059a2d346ad04c81260d1a29d0a041c3c68e221a2cd0b441b306cd1568b82c143456a0a9420c1b3159a05142f603ad0af005313e9849424c1262cea09982860a89093996d0d1860e2cd098408711b63574ec40260d1a0b747c11f345490b335fccd0800466c3c13363b5ccc420a68d192b333798e1c13241eb22b306991ac8cc20070d64b820c591a30633432815c96c410a93c38df883191c5c51c8a102d883982e90cca031424c1562901073041a2fb22c718b28830c0a5a14313288e10282216606315bc82ac02f90d2107345364589089b0bb6179096a08d1113870604ed071b1a362dcc601173850d8b8dcbb6850d0b1b17b62e6c5db420c82ca40eb62c6c6998918284c10c18315acc8421d398094236068d13336364409039d8aed8ac6c5a6c30a00143071b97176896d8dad858109530b383991ecc6c310384992e5b165b15d108120b5b1566ae94b230938598846846298d921462b0507a424c97ed0aa52094a05081528ae68b182a6017571c171808860c161806dcc18c18571aa517c478d9284a2bd0b1c605470c174a5094a894a4402a315a88e1423a23ea401e61460731319054b418cc60a12901090d1a0c342d62b6a07581e609cd8bb6051d57d061051d5c745421c60a9a10b421d08481e609345194b6104b4022c2c6c6b645c6063157362a6c6a68562071a1bd40068e6d0a3459905cd0aa6852c4ac4033810685f68436456b223323cb010d14190db214642ac8b06437c86c305325bb72b9212383121034307189983248706c4e90744093050d0c4834208521c7b0e560460a89048d0d121268b098c9816c424343490b1da9981a685898f9817c22e606ab846c073ac888e9629ba2a5116da04561c6073aa4a0230a3ad0a0a101490d342780579072a0a308d005252b3a8e104383d2181a17ed0a315ec030ccd8805483120c4a3fb8c2302304ad8d991a6867d87420bb10834593c2a586eb0cd71b9719ae325c5cb8bc5c5bb8b070b57191e1ea72a9712de1d2727de19a82cc72997181e1d2c29585eb4b25832a06950eaa1c5438a8b05437a86c504da9a4544d544c544b5445d509aa282a1354605434a8bea86a5075514d51695159a94a50c1a0caa2c2a2baa27a41e582aa059515150baa2aaa1554544834c833482fc837a4186418a419e41a24182418b905e986fc82a48254434a4182216d206f206b2063207b20c99057240ea40ce40ca417920bf902a985b4225d205bb0259056784062b12858298a9052c82a728a0885e88438466c420442d412d18861c41b442c728dc845fc2266116300d7f05800cd00cf40f305e9040c0284020402fc01f4c1c5055a8135805ec02b1006f006100b68056cc1b506b8025805a4e229e12d414a792e7856bc2bde0b5e0b180db288cfc066e032f01b4c061e038b81bf7018180cfc057683bdc05d602eb017de026b81b3c05d180bdc065f81b9b015980dae02afc1546035780abc85d360297014180d86023f819dc05ab8097c063381cde025b01238095c0623818fc046e02c5c04268389c0291e020b8183c0633010f807ec0316837bc03ce01d7018ac03ce01e380b1f00dd8067c85c1e02fb80b9e01d78069c05e3017bc05cb8063c05ab015860167c158f015fc027601b780ad6030cc02ae8257c054b00a38053c0557612918057c028e824db062d830760a0b85edb25f160cb9c46a618fb059d82cf10891096b043965b7b0652c12e2123609db84a5816462add8167cc06761a081238848308225101002c9038238e200233f1431c0900630e0d44416a00004f820e40041787a10c0007480ec09381c1c66dc02dbd61d6971f1f379a2a403499c28f1392249126c9f114d7c92241901012263a508a1201f284d9060808e0c0c04209385114d7c9c60a1424148387192c49324413e4b98385922c424091024115a0282254c923c51f2812b5404424b8a5822f44409139f1768908f1093251e48e20265c2440927d3027d22e464894f113e410090b18205fac4e749120490a9427d8494f80415b10265c24449113d64a8502125975181dec8a4408594e4203385fa14b124c84992274a3e70834c152d62c913251dc041460a35624992254e9a01424420022048c227c8e708a12136c8a0409ff8804049932436322750219f273e414e9208f97c80874c14ea23a444e8491223982c49a2034f963cf169e253a4878c0974644ac084899222983051c200288e10fa40131f2654d4c7c7034990104a2274c40796f8842047e6097dc2648912211f2392f8f8784007192714090f3459924404413e49002559e2a4859af88040044a84b8cc14f529a209124d922849b2c449fb14d10489070835490289228a681f3252d403482011e424899325473c09f2691202249288c0e747079926d4089f261f58f2a44912498a4002ca9224807c92080521e1c4272889d01210742089274164985023962411f279129444113c6496f88013239a28092a62834c91114814e163c40d39c2e81311f8fc2479f244043e479a20b1e4c9131f097039e2d0273e4b84960421718450124a6472ac419b20b144484950124624114282c993244b9cb492a0245a470e383404499048b2c44907f9fc04215181264b941c5184073c8084cba106f5115262c412264aa024f149c22709080c6184cf073ea064881d72a4419ffc14e173441168d027424d7c827c8e68b2e439c03459e2019b1c67d022963c69b2244848099f242260e2c4899224413e46305992c4e9a70824989c6e7298419ff4c851065592e426c71b0a82244a849418a144c82788981c6418c112264a96082d69b244478e31e84f114830e940121fa1248af051c227470e316810120cc8747d987440895093243c9044a8089fa0254634599224090f0390d2505949421356b412619a2a2aea257a3c64e42272b14eb68233313126266626c6ccc499981863a944433313254b0825972eb9ccd6b5f57892573e4b4a4bbeb76d90078f07043f3ee200960ca5f5608c901f6436b23a98a5f26065a92964661d18ae4a650b5a98cc0ec8ac4f42c92a318d4f06830c2154561a52c5bc4a62d555d5ec874b9531c9bacad07a3a54557590545503a0ca8a410c63cbd2b4072164c8167c1093126292f93d7e104292928ae43c980379909857a5c56c432242a38a61182683415e29e54a0b63196619b39551c648d507f9418cf959ccccbb2ba3b5bb03dedcdcdcc8c832b26908ef32b384102a73a944626e8009b2b498875465b654f27b9201acc3093eeb412995a5cca4d40a00aacabb6d38362cabe6d0396ccf868d2bc90a2b085975a194325225c355d50ccaf8a48d7c52927aa054666695ac2a7559595557f22a4386baccca6aa36a590b80ca0ca1da48eb31b4545559d6704d4d0d335c86cca51273892de6c71664555de6552815b264560524802143a81242d5c8cb6fa1c5163f7e6c035b102a5495113e85ca52a53264c88c612af74196a5526964ad568f2b0c4259590c99256710c20c424b32b354292d5529a54a282d7daad07aca8c001faca70a55ca51e49550f9451977a594a328a5d4f445956a498931f3c6524aa859505a5263b61847480d2b841046c950d9d26749c9aaca2a554a28a58491e193aa7059ada78f77ec3800330751d58cdf0cf332b42c88cd307c901f7c187c96a5aacf92103ec8d062686190a19496b26489a95afa56572ac7f0d39194ca162b2bd4d87a18f36af0416686cc315bc6989fea53553e3f85106298a510c21d8f5979788755551fb3c58f2dc852d3ded327219412f2e3a78f1fab5aaa4f5559193e86524a55566665a84f19aa42080d60bd28e57252554acbd22c08214b29650f525a05c001076bad27658c3232c2072b66d5498039004d4295524a1925176594d19151421ea400b8b25e5cf8de83ef3decc17def4129b14d4696cad663ad18caa89269ce40838627a32c82202440e00302d9c38e0f25900881900d4a8e7862c38f92228af0f9d93100019e83000338e28992233e62e203c5874912259480e0069a0f20c124c9079a2cf9c0079060c263416083faf8047920491012424a8a4082091325414a849ee8a0e3098ff7f8294249079830412228004094f804f5f0e1f3934448099f2636f87c80478e27424f9628e1530915a1e4491325414249849680000448987e28019678c027c8c954e2c3a4081b1d4634f171e24449129f0f28094242e8890f1d000896083549226806f18050123e483a00257c8e4822d46449909324453c5902829b1d849040222889113e413e4604219164c700044842009f1f254c3a90c4674990500008109483113e4f9ef8043901011245f05c4a80201f284814e1139444c913238af04932809f1d0310c049113e4f7edc20020f2c09f281820394263eaf870e20491324963c09f28192c4474849904f139f0f2439c0000c60000218e1930409212722082a228990123e394069e2f3b89114561411d1d3a1a121592a614344444496128d30229468a862228676483ea2a18b08a2255a22d488082522b2888886868886861e11433b34c44cc4d02ad1d066554343444428228822b28820daa1255a2288966888e80d0d0d111111113d2274688889d0a1a1a121a21d5a229468686868888889d0a125aa88205a4904d12a11434b44c4449108552288f611a1444444449008252262228896688950a2252288d8c4aaea82e089120dbbc69078a85109985eafb754487cfbac3ff9f71fbcf31ec492efefc9bf77c95b54caafbc0dfc36b70d4c433e722b27b41488364c02a68f872a445e1f55c8760f6c8a7f42ebb0295eb5eea6e35f978d60e3ef7578a7cb3af28c1e8f00157205623dfe07efc407e19debf1234e39c73a0ef35833bcd3d9f4c03b9ac2028c8ecf98678673acc7dba890ed78c96d631777f35a535834a12b2c98d09675eb36d55f73db54d7141665b4a6b05842cf5cf3864d56542092db569c387f34f55c80a98cd94e64d4cb4f2707799160d5b14a1b92599c7679e5348e08114bfbb1aead292cb27454209208dfba727c8cb3f8d7758cbbae5a11edb67576daaf63acb3dbd667c738d3b8511fc3de83205d6767355090a64d2da8f49f27aac50b2a4ad0a5a96cd266a7c76e4961a2a87b1ea69c3689c33663253abbeae10f865d2710aa3bd666b7ad3d3b6b44469ac6695fb522d7b9ea6cfe5cd735d2beb4adc829e42091b6508ca7bd3d9e4a9e15d3ec6943787644d5d497f3ae2f2756c7d80603d7e587b05e59877388eb72a2aec05ff32fe7c1214143c85b13b5bd9c7739f5e5c447404f352fe7bd875943326a28dfbddfe8a4a7eaf0994e92d313120e9e39c81999cdab15d9a19f7c929599c487448f5f1030c5e974d87a3cd78b31469e1787ba125f7c184a02f1bc2a842180e4c5b89a9151f51eb6f4e5c0470e9eb5215c7146b02dc533178fc95521af873ce15fc7ae8bab7939f0236e7b39706bf84a1b126f8d6c8c74443068ee8868d03c83def244b3136215bbb28b8b72853f34fa353a321a59d91593d83485c515fd884860f46b46b93efa04f474cd2b7c2d024f2ce0349aa697038f6948de797642587f6201a7ebd747ef3a32baf28eb16624a633e6e2a56624a6dfb12b636e6b3ed15a0ab46122a70a64b347ea26d07162a46c5588b6f27b38080d7497817e7f44902d2c16a62ff266b7adfda0adfae3f148195dca9577ece234c58c71a65c8aa20604d490bc7e1f717a622c2af7730091146d21d1d12f0fe869eb4f3bc2a5ae8e6d24754355b41f7ada3a6b459a34d05067377495b1e6002218b4a51121b2d240442c89d40d59e1f65895c9caca46d6bc383d615736e2f474717a62cd085fce6ec4ab8fd40db50bc068f9ede2aed8cbde7c1a9012529858a2a883944df2904d72768f352410e8f5cfab6612352d54d3f27d7ff640a8ee5eef216773a41341f325c731b8e08a165411da5b3146f367240066970561f42ecef2682ca0d239b4a6aae0d2ef0262f46beaac00acf73013dbe8d7881b7d65b08da68d112e2aeaf7a1a2a2be7a38127fcd4e474381cde4bacd0fdad714ea1ec6f865171b30bb823ed61ed6485b0eecd6b11cdc9eb02ab47086c53cc7b66dac0991e318cc712ce628e5203d6623914a24121784952cbba0a54757ded1acec7acce22c106cd72dab47c736cbb8ed6d36b88c9b61d3e84db6eb8d3d7bf56eebd131d680c0ae1a10d8ec59018cdec3198700368d5e7141d8343a16e4f1348073461f05e951901e5db506b06954d3a3779aa547bc6383bd8a325a53552ca1ad5bbc63834d200768ffb0fd7adb8296651d535ec5fe48dfd648a45286cd6ea8b1134085601f8dfec7b3a7d14d8f47e6a3ebac0fd947c764b83d65591562b4005a53555069302bf002b38cebb2db68588ecb70365a0c67a3c5c4404d08996332c3648e551926b3c9e488993659a9b4958ec50c2b7141d8b3e600f820e268fea816d9040b63ac4b5fd9c63befefe2f8e2209bac8360ab2effaeb33c58ffc126eb263659b78e991e4f0f9c63ddeaacee4c6d2d61ea814dd663b0c55bef7a68eb18675778d9c56df3b6ae808d7e2d8f2dbf7da48ea86d8cbc1efdf5e8ccd934c6d9f06db2af4d36bba0b28093764dada00aada915acd1d76876437dbd87a70ab96edd7a3ca55bdf1ecf9eacd73c9e985bfffa30ba752c86dbd388eb42c0841edd8c06d29a5ac115bd82285e36e2bad16db087c08c0ec112fae29e6c77b13d86b3c1be273e95381b6c42c02add893d957eec6942c41c8bd9c5c15e6d881031c7647671af558b404c04f4448ae19ad03060b46f5c137b2a4d9bd1042a85e92ea8f470d2de44298e93137bd22ec52a2a2a22cd26aa3027ed18cc2e8e5b3525ab7141d8af16c416c4b32251e4a806a65d5dafebc3f6fac0ef4818733fefdb4e50619b784dad404a6b6a05539a6fcd8e49d6d565c5c136f1ce0fcbbf4185162a52546081d9abb8d737bc237fde91f2339a116e28b7e5ab2062576c062aaee809c64bdfd09a524119ad02319a6b4da9a00a858d63fae19a9bedb8da113efc0def74eff3273ea3028c8ed8cb20d76941bcf3fce1c3432d087ebdf1ce9b3ff2da3145c595ee9af5817b1f7f6ed6e0b7f7f818bf9a11fedb963389ad85b6f5813b9eb5205e103aad0a641f153a19d8145bb83146c2afb6c7984dcb6529b822031baca9aa9ac723e5caf2bc135fc134377f638c9c59d69a4a4195c8fc84d50fa7778a2c1906be436b6a0a335a4b58920daa8cc9d834f31e8fea9b1d1578827fdc10db095ef5bd07e9f49b40a5ee02eaf90d397d395c15b05d2ec9a6aa25ad3315a2aa7a3e496f84af60ef712a638efd28bf53e63df3123b3736c5a943c339f3b86d2a3008b9d9f1aac90da3f9d697c89ecf5f0d08e6dd8c3520f8d631dd2a364d4db145936e7db1cd9e36249b3fd8b58fb88e5f9adde8a563a552c9e248c7489c8d115854d4a5c37ecdad1a92ada84b24245bd425fe4ff6523663758b4d4f630c69666c92eff83fd647efacabd65d276940bc1b9148ef610c6a45a275dd5bd67bf8694746b77e480ae4bda4405e514305f22eb0c1a225baf40e76079bf4121704a45f8a8a5a28476f17ca7a7bf68284646741d985646f57ed48922e9d9bf48d03baa14bcf38a0056c562a95a6ea0f1287c18cb96ef48cb3af4644d72032bbf4d58cac160db461ba235aa24b9399d3d6b82ee3f618a7ffd96b5bdaab32a69a1b9be4ac61137f76246d0505966483ada929b048b2c5d6d41456a802c10103dad657c79453a3576b4d6141859ee1f64681680aa4bac5a6eabc5cd0ce4c81542fa2cd53d91465938f8fb2c1bf77b0abea9a0a19c2af5e3d53215c5d712a2b60cc9cf6e1ecb286c79e36e94850794135d12ecd519c8c7af46b76436d5d3522d73bab7f988c7a349b8cb0c8fc1899dfc3d599e3e5011e836bb109321f1b724453cdb3eb693e76c56baa35258597d6a844689e904d10565c075b721d93ace379663a032c3e6ebc63198118679183b087a3928d2ff9356c52c560267fbde72d3753c3a66d28db324ea00dd3a3cbf92383907f7076420db12e8dfd35b76a4646db3646f48c2a8d3d36f4d2d8e4e5212eeb23e9f2101fe498642b7f747a2423a764dbcfb069c455bf38ebab01597da340f4d6d4092d36f10e9cd953b8066624fe719d91f878d58abcc7f7b055bd87adcb57676dc89b1d51cf70351b163928db160765df23bff9f30e6f05f10e2dee717fd5f7f1cfb2ac5bb3abbe4059f363c98f1f7ff9f01873d5b1d58af0ab639cad567dab1e4688e8f737557f58f1969c15d755ff79cf092321a2db7ed654fdf13422f16f5aef79fb4ace2c6a43b092ceb069e1b4e4c62e60abaa3d2207c0b08ea8f72523f252fb28fbf5d1889be16ad884490eca3694ed2c635d6548da790522b96cfec8efc63bd7abebe8f1f0d97b182b6d63aa0d5119b3b169749dcebeda909d1d512fd76dffc8ef591b657346856ceb316ebbe2ae40f41befe8b4fee23636595ded11f99d58297bfcb66a4338603d9b357366afd911f5f58c5beefb9e9771dd68c8359a1decd1b12ff7b8dbcede39806808adfa239bdd8803ca469cf65e1cd0eb77bd627bdffa01c1ae30c975f17b8bb3d909b45dcd1d1a4857dc0d9bf4f144d54a27f68ad3e9ec10f8238172766f798b6727f45ad9747d8677467faf1961d8ecb05fc72a0e7bf5770ce3b6b1ecab41365dc738ed8cc396751f69b52b4ed964aaf971b3f5ce4ebe5dc9695f9cb5004e28f6ce1936b19c9d125c67b55a2a634c386c7aaf7e3655b3877b9e7290ebb681364c983061ba236abde4845eeb75666ce2ab16e796cd1cc70439ed1bde79bfff5021af89461ba3c032b0e967364c71b02c42966fa0a1a1e96173e383070dcd66b12d102c7a67ac360488a1728962c835aa2e56a6ebc37a59a3f5bca3f50116b5aa0fba3ce85021ba069e6c472a84858c5aafbb46773cbba1e67759bf327447d4500d0d67c7130af70782b6f7db1693e5b064804a0d05963a4d6161858692ad0fdaafe3aeb421dbc4b6aff8956644166944748dde635aedee5a6f17f2ae3491f6975ac06295868fdc06b69f781dba8bda8b454edba70b3d916ae17bd529a71427809ce4a9c89cf6f01b05efcc347c8f1d546c1d938ed7e96ea63bcd0204f424457e370a36c15360eb368a2c343c4abfbd9c325cd10318f4000b97a2a293fc1e939c9e962b825fa040064cc4200827294e0039eda9c89c9693e2049faa5351c0692f392a0a38a1ae0cb14709f172e0570beaca10d5e544f5bc1cf86aa2ae0c21bf13f597032fa78ebe9cceea4e53a97da75ad40c4f24a18b2fa851832b3ce10dbfc3049b9e8856604610b2c882085b724086939ef49dce102f2a3a6d14bca343c36f95561c86988819be00b3c0cbd121c596be694d4931466325beaa90209d7eefe2ec88b012c777cfc8a8e3047a40f11d9cdd5043d59068978ed5e5bba1eedeb79a4de4fc61a26754e938e5e551f210037a469593d58575ac899e51857f9868979687ef6447399b689786ef6093044849359c5d4419e2210d327848838c9d9d12fdcee955c3000f6990d18505f4c284e92e8a7c9c800b2aac14719421ed72baaeef483958b9411945d08976e92e8a7848838c2299002929ab48cfa8326242bb9cae59a45d4efa2eeb78551f5479e8347582375a68bb8b221a3670d004178a8a4e3aa30c59b3481f670767e7a4dff7aa0d1173053666108794a2a2930621d3fc1e1e62a2c8f28b28b87467359fffcefcc77c2b0a2dcdcf98441145c7d69409c068cd110155dddedc88767fd85e5c7ee4ba1fbeb26977170c11623d7648b16d454545452718b90787ecb6c19dba8509acd83678dee92acbfad93465022af182caa6f8b4207ef6d679feec6d8e8cce1f9da7d0b675c86d5bbcb3b383af1ecf9a91fd4843025fdd52de51ebd0821c7c15e78ff569fd599710e8868efb1fcb62cdc868fec8794d6b625596f14ed0b6107775c8a618dfc3ef61c86d67bcf3be5933ca777bebd872199bde2d4e02da1dec07adf7ec7da105e1e11e4e9beada42ddd5d5cc7ad9cae0c6a698824d532500d3566baa046068cc7a1a1f7b1a927d67bdba6a46e0ad092556dc0fbc9cd6b51a9f3524f03bbb3dbc6a40db71666cd2437904375415c2694dc5794a604414ebd16b696a5bc1f8e9109b6a0e206a0889761b80edb1e5886c5bcb6d13ede200848d1dfc3e723647227cdc08e399932b639cdd3b9c3f2688324629a59451cacbb88fdccfce1d526449e2c61a0f53d6b3060451ffa8bee3afce6d53587c32729df578c9fd58977f9ccd91f963fd5dfb65927b5f0e63198fc5ad2e147b8fc1ea9d3c7f0fe377c8eacece3a4f28b1abf73016b3e5aaf8b8eedd9a3ff1fc4acab88f0c98f20efc42ae8b875fcee6c85e5ece9ff8bd36c65c10908f96178acd9fe97959c63b405543e19667eba73ab466b7afbecd5f6d08cf346b4634d5c557134a6c792c3227af5a1178de9ddd7b9c3f90e3721528dc684d4161a5bb52c3efd09a82020b8c98e49eb269954d1d6cbee43aa2e669f58871b521ef91dbee710ec6f7b0c53b3644b6e3e3b47a2f39ed9f1d52c40934d4bc70fe6c45d01f5bd6b0b1128cfbfe0ea31cc2ef61e51d1b9e44f8ef4f7e0f79a78bff798797f216efb09c59f7700f9781e9101b5682020e0804d14e8b4df0f058290140430d0fbfd76d38954ddb014c19d3568865bc6373e48509d3ef3f42dc1f8032eaf75da27db4be5d02b3762cb1bdf3e1dfe131081fe4b6557befe107396da25d1fccca384c713a4df53b152fef3d1d04f47b1cf53b027807fefd86ca967ed0e29d1ffec639efda6dfdae2f46d9040fd9b4efb63ecc20ef74fc1384539927ee23a79cb3c738839b7ac28cd65bcca327fd6a7cd588f0e1b432de614d31b31a586bea09dd196c9a3a4197dea22b4eb745cdc77836536e03db16716bea045c7a7bcfda912d6a9ddd16f53ba6da1078e5a0c0d643cec8d6fac77544fdae2ac4c6c8a8e13b4da3e183741a4ea052eb3b0dd3dd3bbfe73d4e5b39e54cb935c1b6df5636807e35a0f7bb6a405bbf79b345ad3810bde527586978c9a3598a8a4e59205682bc23af6fa2f598aa10d2318c283b89530592cd0e1b02c42d8fcd8e1bfb3ee3baa1ceb649dd93a1c60e3fbaaa90eb2405429a1df677ed17a70a449b5df6a7bd1c5015264c98381a3ee33a22228b71da23ee074e28dbf246b8e59f76049e6747d47c6deccb75dbfba71191271de36c8cc0cb6baf5624bb2a907dcfebe18c03da306d3d38d8f28516beb00284539c1618b60e3edb352c2b8fbcbe01ccb3454008c13cfa1805373aa63585069856adc8e3d1329c60075f88c34b1b58a44e900a5ac29851051a9868e304e1cf3b9a8a021c0d8fc33cdb09fe07f3c0139c5e6c19f36cd10cef288e8973f6bae7d959bd9727d8b4a114a6904214dde18481294ec745cdd70d8a900bda6f414f81ec85ac6605b20f8207da301d240454750402b4611acaeb27441d04b4605abe65e45681aca540f891bb14087f394c85ac1e2910fe8889eda325b6fdfbbec13b4ba5f90b667dd866335adb7a3c7ab2bab36a9adffd4d2e920253de19c257bed5bc7c38244ec8bccc59adda3ee6fd01a62ae4c5255c99c20c264ef0052d9c940936c8620a32a230451a5438e96b788787d6a2d60bd19a2a2aeaf9e1f15827bd1af138996d5b830dfe3dce6212a45f983061c0349c5d54d51c0a72ba12a7cd11d8f0301e3e4ef89ee2ace4fd0214c27802172814c16b14cd4138018ee6bf275cd1fc37faf5a70101b9a7d33abdd9e88d2a0dc91bfdbdaf4664f48771fb91a551c07a146b46c1ac2c6a47385b8d0216069cd893f5284eec49ca4791af340b588f6259c07a752d3037fa1d253527acd1ef2f7e7419f3984bae09ebf2911b1a9de255855497736874924250b94e1777056801dd11f5b65b6ca33b51fd0af6a2d1291ebe746d2798d118d764d4d833cec88874a811d9e7c8de713f4cb067d7fe34225c13ecda73701d51c7ec4ba56f1cd00b1306889da599c4d61d2c2a22713698e6042ab480e104298dd39ad2c2458b9698619c0d49d334adca30ce0623713698a6bd87a3566947b43bc14a577236614d14d169349da8bea7a8715d50a9b289bda7e344c9f8ea979c43315e1e35645d4e2a3fc95b313ebe920f8bb7c1e0d066a13625e2b4c11ee377a70d1689ac346b43de37c6a92fc71a926c5d01e3d2872c70da28a07d6886733c7b14ed39aeda10399e4d148f6bf2aa59407b0e2eb3aeb7002aca298721f8b461301b22ca8e678fb27dc7551b62c7b3d9c39a05b6ef780f37218a7e3f038e7e8fda103c1ef38cd34ee2a2f038e951c3408f21783c66a2489fb9aa9063313bce51a41ed7268ac73312a7a71a2e4af61ec7e1a2f4388fcf705150d979fce23aa2ee3668d3d4196e3416b9262323a38e9f3986ad8601d2675ee2a2905e7a0c87223de61b87227dbb6a18e031c3a14ac779c68d8e555944651840c55c3baaf49aab36048ff798a8ed5a0c17a5c7a3cc47e18e1a8a72c3737ce6a8ed312f71a81fd5631e35cfbd868b824265d78ed2f19889aa398ae632d7130e170585d2bea16e6ec3f914b521488f79d42cb09dc744119d4adfc1a1f6549a911b82141f33a36c8f3956654fa340f61e338a76d22b4dce21783c4af6d2737028eda4391465c7712c90cd267a3c7b690e8d4e31d7b8a1d16953151267a7d35d50213d9b43a35376f918aef48dd3f6b414d8262abb369d20fd8a9c3f4ce2afcbc7bc87b1d9e9f4f5d1ec96c8fefde29ac4cb6da2c763266a4f39cc28289ba37c1c75731b8e738bab9e714df438ce7770a89aef38264f60a5f58c2af204565a3e3634038d5627f452b1690a0d2fddd5343c7cb7c1a3b1050a59fa8c35ce00a3cfb882096e34018d265ca1e58a2674598309a96602162654614291195d1acbb2c8d954f3c8d5f2dba3aebcb476a9bcb4d42e2d13202505dbb852d4f255cbc64859e46ce22bce264e232d7fb5d5aa19e1210d328a32cd4802a4a48ce8195548c799a83da170981a6ace216dce1cc54d2a3f95e6d00dcffe397483135416709a42742abdf41925f4de061fdc0d37a47de6367368fbccb6cd216d52f9697bf61e1c8ae8c4036801fdd3e9f2d0698a0865f4eea986a3f213ca421d45e5a721d2b3c77c0787a29943a4d94469e6281d7328c76726959fb4cb4c2a3fc5cca11c93ca4fa467b389d2d497d3698a08a9de2904d509bd1304db19ddc52eb03413d5d227b2d2971681ecdab7c7a34d2ada49d3096d36b18013491fcfe12d2d02da63be3d9e984985f46d3a419a57e4b5c3571a1044fd13e7cf04884e253e910e87360bb545459b129ab28927dd899f4897ef9cb49c36710eb1ed3b22faf168338af6ecf0d6fab0b36679d8c34b0d032fd29efd694364274d14e91949cb7a1059bc71017b561a5e7f5347c7b0cd465ccc4831e35bd64723cbd4238bdb8fb8ec92abe4b1111725a716d76944b48ffe38cbc28e91b88e136224392ab8bea32f678d88c8a7cb69bf389b373bec8fab360d89a9dfece2b1ab36c4f6b878ec6d1c959f62aeac8098891a2a5dd900a3a3940df0befd1d6a484cbdfae5b0671c7fe3f454e2ae64c796d366c65923eed288c851cf1b71cc55ddc6b8838a6dadb4ae958c6515445d09c1bf38ffb80e1504c5fabb10bc7c079198ba1b7a7a8b03ba014954c12382138de9aaa023aa9e0e1d87bc09c59a1517ffb4233af49b91ebf86b854d7a886a799567ed880eddbdc3f73cd9e9e111534389bd45fdb4f0208cf0c1216ce1699ac606b61f081fb7fde0b1c741e18c6cfd0e399b8ea7e383743a4ea0523f08954d43de230fb0c562e32bada920fca0d94a6b0a082e68536bea074a682cb647466baa07547ab3b4a67690a57fb4a6c2700308c8c81046c0d25d91388a48d0dd93296011caa23ba1a222266c742754a508a83b212faa047527d48696d60319194177494c916a3d5091d1972ce2687d911113b834908609c3a5f5468234f1a5b5a8a861519186697d2f1630a0f88a7b327ff8aba930cce88e0b5a05122f6435908669fe6874d57ed01f312ea7c7b84e3e4a2ee0b530d6686d343a02af5d638d88f5eccb651f71da593b727db7e3b90a643f7ac675dc50ac067a7114b5dee2ba6da26a990b9875abe32b6c7ebcb37bcf0342b5b5bb7ba09b25c234940ab289abddd90971032d1c2d0fab43d99a092c5aa23b3e5005c712611a8ad5fceb71d877329775cc930f64496162890e8222fb3a94aa9f10f505cf1d50f5a5e38518e8b59c364636d5ef7cede51f07851b1e63eef4c7f5aed664eedb5d15ecebcbcc3cbbebfabd506dcd1ffe5693885e63c3f9f3fee68f9ea77ead955c1040193a40ececcf432f90decf30cfea608b0582d49ad241133900b3da6d30075e5a9e2d21320b1001b1a4604778790b3c2eafe34d3add69193fc47821703aeed0f1163005a0e389183dfe88c723e5ca68228079e2495338b0d2b13b36f10eefeee2f08ed4886816f914c8d395572e086801cd0ae45d48b61e631cde01da30bd8f0fd20bc92349806ee8bd72400be855206fa7d48aec59e38e046d1d858a12a5e5353bbe0ebdd9c9eb3bbf236a8bfbe1f3a5119e5d1439bb7dfbf30e67e300fe5b398f6c0def54979ca6b058d1928bf2f1ab0131bb5d434b07100da1370efd516d33dcbb61f48704826808cd45fa4397e83dbf2f170a305d166cba3da7abff20040403bbfae32dabdbba7b5797ef744b57278277ba205dbd7a909aaeaaf754b75efd87c723e58a35ab1bc13cef54dd0259baba0678e755516c099a39ee1b50e94aabcff00e7c55e9970705a6bb820dfea56c00a63bcbca7807271ec0065ef8d5d4f0c053bfd3e37ef7a142f6ef4500d3eacaa6dff36fd687b59aaf8f4739a7db5adf6d7d049b00d1891fe57dca9b4f2ce0c4e721de633a00bd923008b90d6c3ff03a74d79168146717964601c5c2c97abc72d62347011ed2204298931ec62ea20ccd223da34a87ea383bf8eeeaf79e07391d54879602b64e6cda5fa2650560fbc4c64e6cdb7c0854c4027aecb4e1851b060069407c071a10af9a0718d04510010f97226d409c436842c3847943785869a76c199bde0e7ae680b6513cb444fbd6045b34fc888a86bfb8d82e364d5d79a3e5b12b5d1a5eb3819486c7b4eb676a6e8e63e21d7978785dd9af2cbb956540a8c6b0f730a65dc27e6c8e548fafaaead7d482c0aa11a9ba46d7be469388f5eb57768bdbbe542332faf513abd1e8d290c08fe64f7c07ff4443027f65ff91879f9d7c36af3751474efb88236aecc875edd7b5acc4492efbd10eaf97382952a44829dd09d5012cb7fc9e9c501d40f75ace3df53c3d619c764794ed8862d3ae3dcd0876393bedd8b4c1b46983cd23d6e5adcb8f5e59d58f15c4b32aeb9a9d3c760cbb2467734d22f1d8b139e22211ec67746c76db9dc4a62a906b026d98eb0f9bdde8f21987bde7456e771b2be9e3d1d312ad27a9109d1e8220606889468ca901e32ffdce1c11db9d6cb2bb9a7e8fe9aeeaf7e6d25f1aa05c540b121bec98ee4acaa5077b579cce4a35fce388d83a0b0bd006bbb38a1afeddc2622d00beabe9a8a313e3836c1d4d1d8fc33c7c8a2930b874e4f7189f91e04bc7345ab9e0d25cf3b112d0f6ee912ea4b44664afef79ccd91c8969f4fe713ffcee0951ef2190860913860b38200745474336bdf9318d5e0e8a8e5636bd79e4cdb3e37746f6ef44f66f76cb41b079a710d67a21ac6750d4421c64f57ea710ec23108b1ab4c27d5b6c51a5df2f99ea78e59dbdce459b5d2a441efb6a48deafaff6c32e2774e9b4ce252fd6610dc9f56efb677f65cf2ee6ab0cbef4fbd38076cfa3c3a74c02da302dbfdaad6b672d71adc885c5d18a8f59963d8b311ee796d3349b2db0f4fb759b6b5b58e9f7a765aa65d933ec18c7691947ca30ccc6870d3752f2614369b1d8689a768cd3dec336244bb3b9751b9b4bc607a3e1c3c6c6c6c686f3b1491fa7b90f3078c7c7e3b1991b6c1e189b1b304d2683bc73fdf4f8759dee7abc07d48ebc5f394ed4ece3950fed3b6cc0e01d9bc757da100ccb6e46a3fbc0b82023980dc74a37a23d3b66c3c44ab3d3463636bfb13986845b3eeb18637368a3bde6da31d89b2d0faedbee71d590e4b4f61e1c0f1e353bb868059be269b8f7069b62b80ed539b80eb5711d8ac475a88d56f0ce3e301dbf8c46c7bf37188d8bd3c656bba68d91f71ff9839c3b2b30a2764dbb6a43fc6bd39a22820cb6486da145065c64a04506292ccb54cbb273d97ffdfa443dcbb4635ab660f08e76bca6bd87b3ecb24eba7512e9f1188944ba48d8955dd890d27b780b32723dbbb26cf4ecd7f52b1b6159c72bb4b7be4a1cd0662492f6bd36170c36c5ff9c12ff3cf72dfa392efb72d95ee7aec867bb511b22a7d0b6919cde29c760d3d5d7ec42d0d7316505149d1b6af9e53a257a7fce899fa20c71ff8bde1a5ea0a2e8f429c5899f7e4e4ff2f25dbc22c366b7d62fee7dc4754af4550bc2d4969151bf773906ef588f5dbca2e32d8eb5b0297659c7c5d271ad6c7bd6b258e286d171fb827105fc116a4370ff9f36c48f9affe43ef5e5c8940de73481e972616564a5618febadf5a17a957eefc175dc36d7de6307159bcd75ba5b9dd669d56c06d03c8056ad07159bbc4e77dcdb5743d2e31d77b6cdc7542372805605b27db96c76444c447244bd9ccd35aeeb71bef61b6eb8e186a71131f50d576d881b8ebdec861bdec3a5920d9c0d36dc061bceda101b340dc3b01814dd7c311fa463ba29e8d19a4ab9d1588f8cc7f622db54366d27eae536aedb6b975cb7cfae3d373219a3983d60a984bda40dc1ae71da254e1bb3c956dbdf60ab3d20eefc219e34baf98edf7cc7cdcdcdcde8e63e7cdcdcbc877f737363dd4c9b23371cfb0d18869148bb450faedbb67965c3b1dbd0e9f4cd3b9bf3318dc8bbcdf6cdade7868fa821c9d9711fdf711f1dfb903218295621f9f081f9f0e183235d3efe342439ed63da1ca939e935271dbbe18260df9c0467301906462291b4ab16c4b6b448274d9b233cae9dc7b5631a87fd86b37aadf00ea6c3c713a2965c576d81cfb86d0dc37c7040dbd8b7e56f38edfd08bb0dd7e33daf07a7cd83abd060137c0d27b1b0097ec788eb505c87bab80ed55dac72c4d4d8b4394273ed34d302c326786dae151dafbb6a4bc35b60aa2d33dc5ad9b82b347867651832dc5ad9b62516ded1ba58c50befc4c45cd72f2fbc7361a087999b93e38cdb6d591b729db3f0ce9666e9a5d255c3c0e4962b616f72547ee2e6cb66b75b74e94f1b52fa72da319c7669721636c1af15ccb238ebf06bcde5e65e8b2f5aa462e0a5795a5331c022032cbdd39a8a01182db06841851652da476bca4a97b6828615311acb91555cb71896a9b6cd0ed5db97ebb6de731c959fe6cc969b28ee43a393b201b6ed189671f0bbad752ccb2c2b5e72367b6da2b639b25dbec836b7eb2c381ad53b64dff3ac9d364746d73eba3663146c82a3c3639d10f74823621a82adfc665f36c929c4adbdb3e0c0dec318b7765267b57cc60519c9bedd488e675b9091ed313752faf66c76f23966363bd831b303dacebecdaea42d970129607b04b43d1a6948727a346d8e5cb77ecde7657405ef5887561abeb3e0582b6c82c77a6cd106b4454545dbfe5457071059d9bae7467319702b39bba0f2138ac3b0c2042d8a4e43d00b115c40c6298a085044279c3fa1737242e774651fa3e09de706ef6c5fd1daddfbd25c46c3b319383c2f387019ac001cbadda2e1d78bc959e6790b56c05c2b5abbb31aca7741e527eedad0464eeedcab00ae6605b08f5c0ffdb18f5a1043cc737fda10e7ce1a04f484c3dc5ece7e3508e8694eebe52c37f5e5ec47567cb04e0b7aac1599d654165e5a8b46ada92c525d14c1d0d4b3f21eabc5c6ada92cac68ddfabdf7aa33c7555655d50e2f5ce1c490b57508d066efbdf754606adee9c27a27c41d89988660eeeae1f8d41a6deaf7b2fd42ae3865036c8c73adc40cd5f0cc591c959fae2bb3a8fc1415604d94f5a1eaca0660084733a7b790bc8657a0b0a6b0f8d2420cf43a4ea087c96cadf08e3e2439fde65ad186f004aa861e51e4d1138a9546b06df68007e1422d5dcdae92aa99461c6a7b39fc28d6cbe1d7bc1c86d3c4269665c01407481ba62a3c0a354cf0c1083e24a0939dbcc9040448eb0da03c3ee83484efdd1bd6c828db87225247a7a33bd952461fe240800f2a64ad2c9b198a86aed1c58d387cb04adb8eee061d4c3ce8f0c4e1431c6c60daec7cb476b259eb341e1bcd61a99bbec3ffa042a2bc6c1b15a2fbb8aadeecb6895a15082b901b1b9c4a7954a50ad9e61dcd6f0d5b87c3df356cfb4e36779a84de1f1488dcc784ed229925cb09dfdb0aa89251be2863bc94ef3d0d09c7f7dee3cbf3ce3e3a61bb2c97ed72e5e01f50d58c3d08afbac730e56016567de49883a9e541f99c12adcb4459d8b43daf528ef79083300bd831ccba357f9c61eb7e2c952fcdfca56259db5653f39b9c60d8ecbef460fad1e1dcf468341a8d2019a3d19f3664841dc13cd9f946f0cee3d9aebdd33248ef540b4fe99d6ed1e9219bdb8f974c35a48965a3f71823667117d72d57441b3bef88627b77357d6118363beb6f64bdba98f4d06c9ae94d8d5876a95e59d5ccd0b0fdc05619cdd7a9ced59ce9eb9af575c83cd715eab78da70db92c35eda1e6f0649ab3679ed1f9d88873e2a72bd6d3866c5ff345b4afb9238a6da64fd416577117d7557f15513399e9f8a6c214c0a15c560d5b67a99515d1dedbec717ee8cc221a04013d0de01d9bf8830ae1666b88b51507d9c4737d2f4e3947790c3d0ca0f5474e2b0ed77ac3a307988264c02c304b196fa0418654ab0a79d72ea6b5bb6033845d55555bd5503fd909c587049eb9b85c9607fed386446e6379608ba7ee9f1256c3edc2268610a86a98f1fe299be6a9ecee2e8c47bc9c97753333db468ccb65dbd82e71b78ddd2edbc6ee6e1bfba55f8c110c7ce37d6137d6cb72d92e6c82db4577b78bee5cdb3babf46a76dacee895a99add0ce9d737cdb9660767b811c733d3269399667da633bbbb5e7ab78de8c4d6fde8777662ebac2d321ef1783665a9977e9b7ad8ec2cabe2f60b6eab5020effbe2ecb6ddd2effcc456452f18fd94cb76d936e0178c492a40230c6f34866da6fade93bfec6016f80a09cc5479b6085ad9365373739cae7e74d5f5d015ac6455c9576ff43ca80d79529eb5219277de540821542458f7bc6abe2a1de1c70046ebd09a1a83143098d13c5a535fd041632f8b5b201a4f0b9b514d58069b209c304b76eb15ecee4df8a811d9decaea6aab7957d5ecf8d8557978bce6aa3c3dbee3aa3c36d771559e1b1fcf71551e1bbed9c0a9e6f8e054736e38d51c1b4e35a707a79ac38353cda9a656b363765957a7999da56376335d7d66769bceeea6abcbccae26c7ec70ba7accecbecdee4757d7ec7ae81d4b6c3c99f4d09c5d9bd8592bf2230f9be74ff6606cb6e6fbd390c496b38c7e73563c65e3295bbc6a5be4be1196153d1eb6d259dd16f3aea6fb336d9115ebd6656667e598dd663d667635dbec4ab333596c65bda040e2356e79a040e279cbf5a8731d9b9de9353bbbedbadcd2f14c658bef79ddf260ee58627bd5ec505d1d72331e1ebe8a11e8758c4f12d1b04c1274a4acaa57d568b45eb6cbb65153533333535333b36d6c1bdbc6f2f026540153b15db86458b55c2c6bbdf0af2b94bb6d6c17de59a6e2922bf72504703d5c0382b0099eb4599732ca28a38cf23d4fc6c4187f79598e993f7abd8df521e6bb399839c7fc91398e6dc6d74c07bbe7ba6a48dbc296bce71873eb92dbd9c11e41cb6da948e1a25ecb9a70f4ce8e1f25273b464ad9979470f0c251d4714bab115dd13c979bcb0549c3f643a707eb316ab9ec97ee564ac9657d90bfd6cb325b5376dba53ba1d137e6ddd5a537665ef231d77571b71d93998e8fd98b25ef7261e6dd66679126b66dac0f9d656ddb4cff54bf6666baaa7ecd6d6379c8dec3cb6119671de3b463c757cd4ebd74ac51388e5030fa65049d08ba925b05b551ac1411c4639c7ccde30952d3d76b66d48b15e4f10ca150d7e8f86bdbd8362c29b70dcbb2e6cc75eb1d93991eddb2aacafab66159dba592db466979a4008cce7af428be7469ebcc415a59396ed8687646ac8f3efa6a48ac8f46afa6b249bee7f5f008ee5862eb60192f1e6a454697f3a73afc1b5941744ca6bfa6e659d7592b62fd6734bb6d0d49d6d6838cce3a3a26d35f53a3dda6f3b1554deb512107c9581ede54fd12c1f0254bebb4a6be50d16f34ec3088e18d36406b4a0c63b418ae68ecc706b334dc54c3ad945a1fb6af6ce606e7470f1d0fcbe0f8919201b3f04ef518df909ca50da926f69ad37ce6a46bcf5e712836c15fdc16712be56943e254824df0717690b98a5c45ae225751b118abcb785961f3472a24637dc07a9c2bee317fdee3d86658f5c8b17c8fd9c1de22d992eb441064347a8ca947cff11e5da6a647d771dd313a8fc8d799ab660747d05c555eb80b97ae7ef1af35ba9add5e36c6754a34d00b0347774782965d24f6c235aa47261d5ca3e33bc8a563cd3b8be6dd36f3ae86f4eeaa3b3d7648b17551e068263df0181d6535999bb1e29400b375ea46c333b913dea90e2fc43bb0e123d76dfd18a5c46e6be98e6f69465e8f76764491eb606a7da82ee78b5c07cbe84e08e875b7ad21b966c7bdbfdec12ccda37397a519ab6e59db5653f377a686ef4c2d755aca2f931e3a4266524782d8d248ac96dfc330a515d957232ef2047939f03c6667d5ccceda31bb8d66769b8ed9d5ccccae46667627cdee3966cccce676ebf2a3773df468764c7a68eb4158dfdec3dbb18dbb6e71da710c2a6260f1c28a155546f02c2ef6eeeeeece31a88881c50b2b565419412782b6e4171ec30deec26b301a6c06671101cc362ebec4550ff2789438e99d8ef6ce94bd3bf6ae6614047664d243ef3ba6d2f1968624ebbd128f67d1d01c66291d4f9a9d0e1c1dafcdcef446c767b3bb1b1d8fcdaea64bb775a760768d8e97134cc39d1d091a92b13c5499f24e64cbdab6aea6abbf33eda89a3a9daef8d564d243ff5c97d7ab774c7ae8d1ab5107e163d26a46625bd72119eb83f6f54b1b7265692358cb09c9581ee2ee581c34ca605941c0040982d3bde156199b20dc326cdd4cc3f3ad1af8be87bb3cbbb0ac3974454e9b232dcf97578094e8ae8a70cd4086ed5358458ce10b57b8f1c51b44526cd1851450d103339e90c2a93ac217c0a86a00060c76a08618ac48b16106f8b231e86433376eb0c00d2a965837ac5856103041dcd8ba996e8803074e187646d9cfbee786142fbcc111d31488751d7133dbc5d71fbb50f4b2851f1d1b8d6693aa8a8787672f707457c3034fbc852fcdbfb9c99230b324d48cc0cbd941a80da9a6c5262f48698cb3eaf2f17236a91ebf9ac56d470e66ac41d5b956c2204890206d595b14a4090e131c9c8650534d70568a0d4aec1f08394739b3de09c5b67e1db3b82c0cdbdb7a43b6a02cabe0003aacc105697822cb1749c041b503359e38020b8020042a8cc038a401071b5c5c09421290d0031647f0e28b1a08010c293869160dc48d4d2a65148a2d1f658d0e1628e584168c1cb784cbef55718970cf933646e2e5a364399bf09f7c5b18a3e35783fcf7263c841f8cf001019baa1591136a75bd540512392c881ff81327cc2cb91b051f102108403063085cd4b08b76f259ebb21f0a84dfc32bc6d6653545acbd3533e4a2215651eb98a00d18ab0a0a5705b7d0847eada92d98a1832c78719df99716a1f908e01debdc850c1e98d1a4563276d0a5b1520cbc7c77d37cfd3653735319a96e718a0a987e5cd0b6bcfc729a82228a5eb9fd34ebcbf14ef577ebbd0cfe5497b7b8b79ca64c6045b369abb184d0639db0bd975d5321f12f022d84304619638c114618e16319f01a9bfc3b3c9cea840d5ebf0334d4cc0d9fa9906d784d855813689b83de405b0bc1b6aa5bd6ec8460cb63414eebe7464a29a38c324224608ad36d1bada0d062132b515454b444bfc93bb802988ea97ee7f2729e642fd8f4ce658b9632526260f1028c1756be58b1c28b1555b8547954b63c2aafa8e8e5bcf34c81585ece3b73893de88102792fa3e689f1729e184f0c88a55fc75cfa9db7a81078e6cbc792cbe09d9a7e87dc9b65c454d5852a976daf4ff5ed4e5520bc45d0ebdd883524d8dc2eec1736e2d168346aa34b67a325ea017624d9dc221bdb4f7c76ec5dd6d97caaf0bd2bbbaeebba46d9b691bdeadd68341ac9d16834c292a869a11aec71dc3bba106c5520a37f84052afaada936de10a3b7570b5eb4b6f64e1b23d6af5b19b77b84a7b163a36cd388cc74bb1a762ccb8658d74b858c562b322ab2657b85adfb7178e7fd1a8dae11c1de5d5736c1b9615c1051515fefd135ed084f5f7fac15b9de5daa45aeb98db82deac7751bcf70eb85ad9b69fe7967743e0eef5ce79b78c73aff870ad9f381a890ea7c01ac0ff29cbdbf69649f3d9b448d3dae2ba2fdc3c47a13ebd69505311ae32ce3f618b75f6dc461b32ba2edc4faf526d6af3fce3ad4865c87da90d1552bc2bd5f4b53207bc9919687386fd8a4d7c69624851c5c010538e012c7152e60aed6d415a6f434600254e2c8a2082c4043973780f08116b0a8810934c678828c2d60805bc6607d617486a8051eb6a4610a5338460a1db3856a8c217e345c2c6cf290c90ff60272bc059b5476df276c1d83d1fad5940d5590218d25b0818528a438553d90d2a5ca152d0c010544885b92f0aa6acb181644c095510f228f1635782db060956b4b09641a708c7a6a887e50c510d23802144e34214507ccc0c69532ced0f2450ba72af585d11922172d8d26c41861545505e0c117695c816dad292e4768d99ae29292c9627507cb80561abae1854d10324cc1222ea9d667a5955f119714d462653b2e6afdb25940e082a5b1d24ab9bb12a6d88b0a89e763f2ef2cb754a942e5f14c5182ca166d91124a387172c411441061010b0821c40f3ff4f40409a2a3f3724c7f4dcdb6c5a86c7a1c97352c1e68a9badb3619e5e9d19536db8db4be4c70ac1ed8b441d8b4af3804d860ab8ed043ef57075bd59ab2420e7ab16cb235650530badb9a475335a68bfb5133b3dde06c5bcd351f7467b2f881e969404f4da765f413e0280a79c2091803d52043490d2ad4b860bb020ab0aa84b430011635b490428a153a80230d3c58e24a961fc4b100359690a99106b42c958219ccb0821778f1858d2c4e151949f882162e3e2841155e14c0034c0d228c628cb1accb0978595696c83385f572b4a6ac40a594822d5c99828a13cc284118bef013c7185fcc600a61c8200d0950a305971a3198a9aa2e524811843184f1250c601001830db818c2115880852a10a04614714b0fa21a4fc49a1e1bbc00051452f0e28b294879220a6dc0c00966e082c50b1fbec8299821a6a7664b15cb9ac2162e215bb2c42d4ec0316cc1cb0ea8b022a5cb184dd20004296184e10a4f7cf123e60ca32b68b9a1c646797aac2b85430dce4dcd6f70acd7d42c14acc9244857bfa9e96254f37846b3e7e5ec2b797d3c438cd0831498172c6189169c2a1c3cf1041531d4a0c616bc70aa0ef08434ba80b36312a4ad3740533d6c5a8ba72648576374f59b2074a5e35455d6ecace682178a6e10871421e4600aa7ca0b96263ce10421aca109a76aded4587d713de8fca6068773f65d4d6baaa6f73ff4d4dc341385ee74b4582cc390f110c227abaaca2a6e7b3c3fd670410ab2f8020b5ce0e2547de31d9eae5e5383ae8e5365e1c611d6008514515051c1a9c261137c3c75a41e1ccb051c29d9f8414bd912e70b41d874033678d09d8ea662aac017606b052a6c7c3636be7656ef6c6a7b17c2f6fee0ee7b7f908ded9dd5ea55638b9632526260f1c20aaf000e305fdce025b8884b8a0ccc469115a4945276d9e4bb2d434328a5509470ee1a5bd8a457e002a129854527d3f2850a2c06162f6ec5b262abf2a8bce8bdced4a6d4cb512d6644010d1d2c0acca50a638881058c2d2242ca4a15d982dd55edf67177a5bcdcbfb9838a6daffdaaa0a5b5b531cdc1ded35e2e328bf783cb830dfec1bd824d5a250a2e5a58d1b72a8473b9289a01d3092897276c9a5ac3cb8fdeea4e2794d75d88a03a4b9122854a9053752aa6537529546a4ed5a958a7ea52a438619d9a2881292aaa393551c1515474aa2ec509d3a9891747d1a9ba13414ed5ae1554b0e98b15168bd6bd42f78c4db7cab301a6385dd4d27c6cbf73638d88ce1f286db14979b8b3ba8da7ab693d14638362b029f5450c2f58b878b1c58a162bcaa892a2220696c73325166101e3c5172b5eac78397c9e2990cbcbe1bf2a2f87cf3305a6bebc1c3e3f2221224181f0b7bc1c8eb3abd10267b7c1325e0e5fe7972e4385e80e2ab69ffd5299b18cd5d25c3afed2fcddc1f6e616dea96986424b775b19abc6b6e7472d57309dc0a6bd3a3b22ba37946fc89c50ec58856d1fd7d8f60ac40adb4c77d9ce0df3bca8a868899394727642b061c402bcd966660f20b6ed855738b7ab10e632ac61452f958e1142d1904aef1669ce2aa139eb4473f608cd592234672da0392b84e6ec0f9ab33d9ab34134677534674d9ab3d79cadd19cdd34672dcd59d59cbdaa6664a9705d9c4c964a37592acdcc4131b62d834d7a9e29ace5e5e8b74889329470927272841847108185080b786101211ecf14b6f272f442bc1cfd14b6e2e5e87f7839ca3385abbc1ca5f272f4415e8e72d1cbd1ebbc1c5d302f476ffae399b25f5e8efe2f47d7cbcbd1d7bc1c5d2e2f473f65b7bc1cbdf57274b5bc9c58e22d2aa4e343f8d5788b02d12f95e66eb5b49ee8ad3c01c6a39ad3c9f47e9527d392f2e86c89d68edeaf17cdd22a141b7edba7118514d0b05dd8b69ad5b9e47a60d31665410b192800020e8ed0c6498e018e3138614513caf002269ce4ce14a8906d99c235bb6a3209d2f23d8061eb745a874d5bbd87751e4f26bfc58c96bfe19daa251a2dab9394d55c29c1909938076766e33236d570cebef3b205d1a172e2d1d3fe8679e049476b8a0d2d9ad49a62830b15472d96e8064c708118a6b0020758e082015490230b58b8f105192860c2076188836bb056e4d032c8c00b2ea0010539d0c20b3d50818918302c010a166c210e348ad6a03ca802162e68d081195c685080348800354c0ca468c28c17b0c1832c30910e6c60832088a1052988c20b01a8c0450e221c504183279c018a29d2e0823830c5d9ce8a90772a9e3dc56f35375721da71764c70da3afcc266b109c22c68a14614a4a0062ec4b0c4290ea0639cc2131d634e315e1fcf088a02a231a8d40955cb83919e2449c710a2a991260109331540304024140a87e3f14c96651f148011a2a848529cc9a3510ee520ca20848c2180184200000080ccd0d056002647df97065a61d6435970e3dee46c91c37d1e68dcb250e32fcb7dd5209a9a521a99fcd93c5a86ca70d4b4fb053d15f0ef4da41af190373314cae3b531a990debb4b74ece74db8608880bcd87e363dcf7544b0597fa82357e699a4882b8966e0fb42fee3da757d81fc94cfd05ff70c0f83fa4c23bc6242d486154de895042e829d785b167ad7141c4ad152f98a80350ff9c9a0a6df14669d6e7a2083ca84b3090fb1b58388d5c2387e7db3c71785506b612f1d49a61babeb908c2496da6f7bcb5cb415937d06ce99de76e1637c8b227d3083bf6ae023dbbefa9a1dbe599dbe4308fa18b363e6e7188501b6659f5a81b088927adaeee077075601b9050b601adf47bd695939a001e37318ee13f207112b5a9582066fc4477c3ad3390d9b3cdaeb6cb09ad36a5c9de84577f453771d2d6f92dd4cccfe664460480e5383b976d02f2821634b96b11e52b43b0eeae33d5e53f91fc576e99aebeaa6d0122d1577fec9ffcbd6a4a485d089a423dc8b07c757cc1da2999b2e2a6a80e80b0e2d6170198d3ff5e760d94b8ab7a75fe1a474eb4b8ca82ddb2bf44c87c1637482ced02298a33024a2a5b6a1a12d005b0e867c785a86151c42506b74480a5281909d60a11e3f6f569c75facea35a970b0e23dd187478c31e544517fada4954a4176cec95409463c89a8ff9f2a519c93c2b534c399ce84c15b1cf1f6efcb325869f8371f2aa0a0955cc2dc2ca336e5525a6dad05509cd258cbc9aa1c4f743cabc57ad4ed2f4a2e3dffeebb1cafd167439d87f350cb0e7d4144a05a96c11fcf7ff6fd4a47212d80e2b218bf316c1c0e3dc5c28a9b872f6117f70d5b3f1e2c10f9b68b4caacd8af7894b4502612bf86420c4e10e0e482e99375710dabb3d84d242fc4cb9ee64369aed78a3d40df03376155e5bb5c295eaaba6a4504cab29a02da2b6eebafb2dc21fb5dc9c1b18c37b8365fd36758b0978038730641aad6a2849110dd622b51fb742a1de3592f0314cc2aa323eadbb3cbbff8a0f27e2426f978f49cbe9d14f7d766872a1b8c3f80700c8f859c5f24f6f3988d77e28c22e964e09c96fdef25896703614bbbafb7756d9d1049e5c6d73448adf3f6a6af3c19a7af92e56231bc90af4124a0a72851d5d1241fd01a3a6199a3505a4b794a680472e0c5068e36389b9f1aeb17895d2835ea23204975c8943866f838e67f1c05a4546693221024ef4ff2ada9b03e3c4d9181e09cd759246f834b7c4057011f3623ab6e6e551a000d15a77e29d22361ab0d12e1970fdf655eadb341a21d60e6374474205e190a9e15a314b6da5b118828930885d707acdae683649c7df70cfbd482dc709632df86d995a95eb78bf285b40fff99f9929aef4e16b8187d853a01065ad908042eb1356a3cd3a3f0a80aafaf20af3cac44d949e5fc527ec551857fa441c20259b6514be75f2a4f8a779dccf9756511e52622bb52d382a88a8e818f8eb679206c0f0cd88f1380cc0c090263f586bc3f4a1655143ba2ad5accbcd109e7ad06517f735b00430740ec864087e3ee11f2b30bd3a539d4a8317489ada02519e0201e9b7dd4586be91cfc1eaee8f5d335cc5ef0818da56203939fcfcac1856eb77287edaaba64a0ac7cb8b5abf03859869f4669efd15dd46095f4e31480d6ffa65069a16408e9238f70526bf24e30620dae2370825fa28bb4d5ca0e6149be694901ad15d40889fd1c219470f99112f9baee2dc20dc2081716c801417be58241f0e0355555b8984ab43dcd60f0b17fecb0d8cc4d74b5bdb8723edbf32a13b498481dbf9342898eb6c335b32f0193c70a8f029a3635c861d69a77380b57d9b118827ff2134f28399c9e2253f99d0a009596fff39fd93a251793d0bb91ed23fc4f356c24c8e79725990da4f7b7289f2787f25bc0b66b367a132410527d86091ac35022334f63873f1300cfc49566576d8742245efcfab974df0c35f640568220740083762bb01e01af85107542cb0aeed00a92254f831fb729acf53be5ffc16d2946a98c3a483347e653c17e3831816e8a7b23d634c37b06a33ad0fe82bf6c6368b1702ff9c9af71fcbf0b1f4bf8e650dfb1e3981fb4f449a9c3158fe7f4ea690920e786d229d2bd91adf8a3dbbf53f7e1bca4fcbe60261ca7503de64d01f6b0397a79110612ef1e1e667e2a6d15c3143578db3e1dfb90673fbced0a4aaa39c76b23631c3fb742eb88a117ed05f37e2c09afad74ea596e4c10ac192f5edaffbe28fef2a621379c5f91692717b53f7212c9bd9e5e02be036060058b4a62883269b6dcff0aad88d19c20db55adb80e760e14e4f030f55be9b46dc62243e84716fb352857e118a0388e0fb4eace4362bb071a9814dfba23e1566926f5192b3a777f24e5659272f5f88c5c06932515abed947667315015773ccfdba17ac9133b88211061c40dda8127b2355d45d1fd778a0c585f75106238a769d30a8b540ef2c483697cb342a392e47934a359d13d0198e460310c89185f18ff96eaac248ffc549afa0db771d5fb99cb455f9e7797adeab0cead17d5093d09a50f314b3a4681e1d7f6288fe5129f250c4b0f9545e9565101e7b0022c3450733ea8e010cf9617169fc02e872518557d37728694a37671c1880b74b22cda0cb07407c7971ec9963072c10d6e84d75a38ea5b8fb877b2114c45c0b23e8863e393822d5eef6dc9bf2dd54f395d84782f361524228ec9086d3357ce9f0a9c7622330be9bb26f3b99fb0799a2efb5b652ae955c5adc363e0543def7b9b3437ddb48eaa8d032ff74ff80001d40f06d855991b0b947cbb4d94b05a7bc08890203a01cbf99eb49c58e4f4d302004c19526e39c1b5e817b0be569ad4b2ab8cc095a58158d5be2b60d686ffa9488ec52b51d7e22b98b2e44514b5e95d5c38c5747fb83bc236dbc3d5f4a023f82b22cb58c880648b0399a8471b2a067d1455df58e59e3213f727171ea325ef911fbb3fd150533855a51de3162b5aa3785f81ecf06e175e903489e390e38bb1559de8488db0084360dc58805cd209fb9f3271f82b9ec04fdc85635ab5ec1b99df5678f666c25e9289dc62b81a33c582fa986d5e7ab1a124282cb19609b7be0feb2d624a7ed677268725cf0e55bd6f763a76fc0dc2191d0a91a5bde03f372f0167ee879da84978d23ca0531f180cc8d0c75c3cdab2c16f68b520a47a897c3adb3aeeec72e5beaa242cef22ece01b425de677a4993a8753277caee21d46cea15954acb345dccf2554c4b9fa0dedd1f3449a75e6ca562bd3f0944d2152ae24415c84c8b7fed6d767be1843d38a6e6f421509d69005cb7a34f7bbbff76ab48aab2d7f18aa8a5b0b7da6be95cbd60d4b475d5abf13401bbe27a7fb4a39eeca0377858fd5beebe08cf85218068ffe293c6577cb350c3b1cafc1131fe8ada10e36a8f60f74c27637f18b198d5654848d7b750e21be6d9e4cb0b56e83ce979e7ec33345140624618d82a9721a750e29ba9dcde4f0db2f0f3d70a7285f337345c52564698e9fa8d2e7783684dd4fb5b083ce0dced07f438e1d7f5b4cecefd1ba32b1cd455c79e2752083f8070f0d34a2155e0227707d0813b7f30e4cca04b9638ef333bc887f67208519637eb1bd25a056ce9a197ea129f8490a89c5a65b028763005b7e5ec5b16a6e88ef04e978482fb96fa16323dc5a959cc211f47b54ad116033a42094f1d9b138b8a93c84840335a70476303f96e70ab31e439134ef5872a0b4d4a3e8366185a0890b9e37b90a980bec8127cff96d09916c758f180ec9f50edd4843f03aa0826d5555b16862b0a81f871a31c4a859f9415a20fa71780b38f0fd33d493e0c3ea45e209268578bf05d59d32a9c3cecb25c80bc2ee333ce860094423f69c17c26a2a5bc16ff61cfe5ca2a6d7e5e35c6a5fa9e6be9512df0a13c9c3accd3b200f13320eadcf505b4917f3690930d19e9a1f4d158ad00aaa25969b684476b2b82a27d286d3c2447ebdb349d9efa130dacdb12063f753e4f5f3fbfda7aede103474de430b16824d170525d6032e60b6e1a29cc823d80017464d6f0bfaf8934cc3c64f590106828d966b30d8a0616ac615c74626c68d08cc6ce1939b6c731aeff6d14ffb213b2a60066518450e5e0c0e61e0a7493a94210f68e1458cf7847348ac8a0df123d185e61712489b5d5ab1841504300809c9a034339802918528ac0bd9ba2f1d22d0f474f9e54ccb231041791e402e512340aa24d03036ffb94c97c6a052a5cf2a05812bfc4171029ee94e13f4c4278bd65bfe13eacc9601ab96503ed6f01dd0432d6c8c04173fcd9f7623e11b7dc126551b9ad9e2a67ec7ce432441c080567e8fe635ee2a998862ac16759d3eb9fc8c62687a45dd080c3faa01bfc779ab13f4aab6270a760c91a818900b9adf92f5e9e6908d2a3e39dd3d66e84a52acab52a7cad6e3d1f1aef6b6009a1acfe8c349e991400396e6028ac3f6d0453b762a0378af635c53b8550cce2ad6a2413d41813715c009bb39f826a7f8a45b8970b4020faca90ee811513d4198a15f5d27e316cc327671082ab427d704b9f83a458238b92995edbd043fed382ba4aa0d0a8d46694b4b517811de3dc27b8131db7bdba71d409c9b626f2292a20c2d6bbc85624f6a30dbacd6a38b134a74e43f23051105122ce5c65138b2c8b768b0ed446b9cca0c7742bd7cfd9b28591ba61f39a97d0290417df6e5f41a0ffefde0755c24f4cf7b25db1ec1ccb18ffe9f4e0f53635460005d6130bb282e32f4590da0158711f63b6a0b963c9ad3f050aee7ddc7ee4106775e44d5de3f8dd7c5d83e8d8f0d7205b862f0899f2331df2b6ca56eef4e1df0892ea5213e3415f644178aa734e2194542ad204fb633a0e43cc6a9ab752ecae2dde5551124cbc8ce6284a61148971366f23c73a1d58f56debfad2eda794840cc79d0559ccef54d9a0dd99d4c74ec0ed8ca98065dee1453225be44d6f2352eccffe4371708e46bfa4eeba52dd59f5ab86fa3d8e0578b2e71b2583f95b36e4c796eb6ca93a3d60a3a02c3eb0c7d5a9dd3a5964c4c3d3e6a10d70261a6f4150886ed195f863a83c861ba23d03bef342c1c6fec50580f32be4592710b28faff8d46bc0e2e47ff24c3061233acc9329bef45aa7ad1596cfa8a0d51f3e0686721319e7aa982124e10e5214c43cdb4715d9a9313a63b405f635a2013e951afbcd2c71d4b7ed0e7e9914b3b55a1e1a2d5646a56aaf4b73924e6cc5a7222f7926f1b615c11ef3df2882ceb41f3c9c32000d18e12eb198e60184375ff447b6fdf7e2300a4febb6366845056aef4118677b639820b767903b5095d1bc1e4a6de437d1b29d440fa6c28f323f2972baf5d43c707cdda28b0841ae4a63227024083e37c8d8bf19291ce16534ea1568673226e88e98e0d08f02ed17fcbeb07a5ca8df51cd5b1f773cbed9c97bfad4fa11adea00bd5eeaf5bd2eff28bc9ba30eb6d05c1df0046ab3d2e13a44d73f0eb4ba1913f4290b206f9d553e18842181a40f0e02f95fcbaa5aec28adb1b7678a5586d69b19dd68e4456d4233fe8ac41134dd8f07945dae0175ab6465e29818ad379f38ba56147b3d53eabaa0da209a558fc378c7b0b2a05ae533f1a1aa016d3e549dafa7f46ebb547a9c805be6a4f5208e89d1bcac768f1d00f53ba94f629f26a75907213e1d6f0ec235e7c3f765da6aae50472f0dfd3eb0671c94d0373d7103b40bf2c73b8061378e2b5aa31dc617f9cc61f3132832d55130b44ca48676e1a9742156fb0fe3f1a620ba2fc7632951ddab6e29ac535785e3ebad811d62eda1d660fef76a0676c6455241eb9e7dc042b3f70d84096e72402648ccfa983ac073164737c2535c473b36666af09aa6265cec6ae544dc29c1f5d9023b0e90aae9630d26aff8c2c290534262052744105af022bca23d9fc86230e14cbd739cff59ceeb096ea5187a2d2bf44bac329a6ea038468ec9044f473cf8de2bc01fc790519c1e07a48c61b850d2c558c759563a90196d5719e665acf79a5ad238efc70f7d787dfcec59a0bb9109ebd43d4b37f443a352a6f62d886b3e465db047894a0d7d0951a39bee06b4790cb899a3bf734740de4d6806c311197294f5801c2fb4a9ea86a198d32aaec927c1b56e859897a67ba9fd2faeafdb486ddde8c04615bfdf6e87774e7f89db5afd7aceb60086aa3853ccb3d000cc3a74b9356961bb948a8d325862ce14ca95d96c805df513e7292b9908bb1d42fbe9bdafcfaf3f1ff82b1391316d786203b03b050998901bc3093cbea266d4a4ae58203b0041aa6ef4e28b161268d4eb7105593c902befd073abdaaa641dd1819f619c6a3bdd96166480062ce04be8d0e4cd68f8a1cca0effce654c607d9058e9c7d22c4493602183e118bfa7601e282ce357ac33cc9f38955d0f334240a6083af0957a9697a1573b56f2476d552df8462e648f81103ac27de1b602914c4545c4acb32199913192754df4756e1868453a0beaa374cd509bf11d4cb214f0c3ff7e850256131c5513d298985c6d59d681e26b748c34817d9c525df0aef671aa03bf3888ad7056d48d1e90e2be74ede11636fc565e1f95638ce854e3365228098328f2ee1272abd07e232e55cef35bccc0cdeb47c06c3f4f4a3649b814ac9a9b26d8696e973d9b89d697150a6eed0a0932458dd9f47f00f18a942e8897635bfa8848924317775d87c77bcd31eb7a8cb38485c9ece0ffb6a06564df7abd6bb81eee954db075b28416bf7321ea757ed5e699c28859ce7d9851a576a79d1d38076844de27d8c4d2ebdc9be7416d589bf3ef8fc872dfe51e68ae5efc1b9c1b64b45258a2b9c0031d9727a2932dc05046bd895923015a6b4f6a953070eca0effef601aae877a86a35971ea04801e31906a4861136c3f40fa92152bb31f192960754153129e960ca8824f6bedd197c61f6ee2f69856ee26061a61fea6aba19d0ff60f11d03b81fb24b83fc1fb247cdf04bb4780d01b50d60c419782cf90196e64f488df346310e4cc682114154b499b262f64345dc0a73cde231d4fba68f407132510174c1b14b78ad2a612f7b50698ea0abadaf5665549a1a27379323c59712d0a42f122a7f913263f05422477a47e767bfd14b7e97e48b6b2f1f72372c61a0263c10d60249964e31965e50654beb40c8105cd78cd7ab3e87c5d39b8a233f3d0f5e665430c855adc78c059162154cee8c96da1022cc33e964a0880ea4d4be94a383228eaefcdf217964212fb75c7c25c884c396ddf6f52bf25a1e8bb31b50fed9365fea9daa5681200d4cf2e55728a9eff0d72c059df86aa8d2393342d2186b7d894f69ceed8a7fce0f8bd1eb563f6b469b05eb84699c6ff0bfd0c3c726f1afc45d126a4789b0061c211f4e539a188e60a5171732f39b6c1a129cb4063739b8fecc22d9ce8de8a0bec9a765199cd44773cb791a390e854163676df86969460d3796a4878db601666a10fc76c78a06f04b0f7478dd0f71940becb5724e659c712a0a4c7fc738f72a8753b336b44c739172a1132f272d200732624606a93100031c4355b5935bfa06fee1fcdee51817ec02654cf82a63521b415ebe2b6c938ae3608348598d49d39bbcd2a10919d320527a8a97d374e519385c687758d2ba257f93da33b8bda557c7376116c89b735761b47f419e262d93f2cd6cbe49fe3abd366afe0208c207af1fe08495fb03b2e0854144277267791e5b84050b51976802b9a33b78da6c719c768709ac09ac530c566d6cb8128fb937c7d93b96a362852f51516af7c9ea8f6d5c9d162a304c78efe7d08aee788ddc891002283594cd6eeecf9568227591261ec9d9adce627e426a7c5c9b6d5a44c4f69e5f1492e560683e688ce060a47ab2e67dd1e66c8d01a656910a1b9cf39a230f743fb0042fd861f740a1875f6b5c39da2f2c1e8b32b9dfc5413d3670d1019554213570df42b5e6841e12229494cf017ed30d798f25ae6f5da081244e9ead01b2b484b1a61bd3eb0e059c9ee20a3e8c2a8ace719dca788c94373f23b2936a407024f72d7c364ea8a55dcb6d6372cea5eaa5e1504be51f6ce82670a5ddfc77502f2b17ffefa677990cf5275ae6a902b0f5965146f3324bdd2d8ed3bcf4975ae02211dfb7d8c2049b501c632671348efabd8abc01419f76f450add5a8d83e4ce2c51d87c1951d42c5ff1e7c099d6c68e1e226f4e33e3199ad3f2105b943a9c5e0a2f611c46163744812d664d93741fb63b5b76540d73ecfbd4c4b8588f0dd0d536425918e819ada8288189900d548ae06e253f7b60ff3d3e184434737341e315d638b0908b5180417f18825fd2f08adb83c389abe4089411a7e8d29e113ab854e0f871d38121444293cc6306b39e0208b1a8f4972cd692a9da2000a7b7a64c0e93e4388a80e4846f56d9d403fce30fbed233856237a9a0397d6c2a6dcf271bc008372e41b5f09c8873d66077fcc75b121ea7d4671b81dea29c3bb90d4b8266f95a611f79a0797826d297fc2075a71df9bbde1604ebdaff6c8bfd6ba66d99b8e543d0d07832e7b3a6980f3530f1f93f73605739286fb129e1755fe1488e41c513fea134108b6b9555e4e61c027421c387331bb1bab43e1a325fe5d225ed61420b4f04a8b122c9c2bae9b772650cf77d80d4ce472b95d0cbc1cba1c3c4a4fae6bd1f910a1953a17211302d1c876962971215c57da3ca973e680fcf696680ba15ea0a54cffcd1d11df5ea6054edd25aca88211d8e11f20378f4d1d143d6e61ed04285bb19c85c58fb67e459890cd6455427291b9e06a4148157b5c462d2f6ea4325a7aba89981cc9eb03ee758e886cee2dadf710395af7d7332b1700dddce505b618711eb15e87af760655d362cc55d2a07144e883e227a411246d210fd9309edf8b0cb0bc5eaf2888fb9b09a89a36440dc7cb060a1d6fd42d93124f0abc4bca782673f525c331bdcb00786b1b26b462c2e5c221db1ac71f79a2e444603522289fd90a8284598dfb47e34abfdc1f2af5479e0feee077db6d7f7e8f0714df280cda8eb1ab94dad0d80be3aa98f238846bbd5777feb1d6bb3a6dc839a75cdbf667f9aec0f6aeefe5b515c946bbd64e2bab042feb842f5aed00ac788cf61a1e4afa952e71ba2f01e05cf1176f9b51377ea89dc398d8aa0ac45ad77398d11332b2ea98418717f0f97a8c1074fae88800fcd04f514058e4845935189f3a907f114d18f99f9d4b799a28be9d7723317bac9e96f238d95ab9429801a4dd71afbb8c445cc88d96ce28548476f2f452b29755c0d6b5c44456688d934c52f4585b10648483fbb9e8e2478e4454543e38097c8147b90c4fb3ca504ce7b061c7dde0a125c1f2d7b84512a5020d845dace3a21ace280de29df12e9b501718fc6187fac6c5bc447a373964aaec6be1e8f0381201876160f7ad4d2bf3729651a3470c6e63df0d289becf7babdae378d2a4db01baaa3c03ebde3c63d24b51ff4fe44290eb5851b648ff5c14215c4a567eeba1182601c66484068971114447066ca81893005e46e607dcc0d0b717c01abc5493a0c78758e916c1dba78eecaac002559ebf9f94edf5be2a85d863e5e5b7d05c3e66273dff184f22525b68cc556a1a814ec184fe54dbeccac6bc227c66919211e3f8e0ca0410d37cd0ef0cba717c9dfa6d2cfdaaffb3b0f92855eadf14a5bfde438c38717f2896ee621b6c38f05c33c113883cd1cfb0f6249e091e4580b35961553711091b7a9392bd6ea8053237e654ee116b16335e85ff0d71f50a464763f9d6924a7314c666888dd2e70425c681f94825b63ba6280958c9a20a43c22ee2f93d3242a563870788396b37d0a668c966d88570bf4f948d8647998b6811943a578dfd361bc5c5176bd936e474d0bf79eadb63d7a37506af4a1af476f3d123d482a74450e1514551f23684d3f375340f4bbcad7cde09d5209707ea2d9db61de0298e8e8059227fdbad6c171b16d26fa3237cb56e62854747d2ebace775b3a8db6d4c08edf6d5074beab6c4b6a9cec8ff796dc7720b7a9d6b385f7bb9ceeb293ed50aa9e077e6e3f5e0f40bdc6a411f70e9d9f8a075cdef4ed2c04cc4077257d73d7133ce5f1c613c820350ba2e1e845094f761ad843f24bd263c6f6103c4169e32050d874e526632bee518589da0e3568868d25abe7a8ef13249b83b5ef7134ea220a044e8bc639f2e49f61b9b79e362f4f3203e2db736a5e120b858f95367561d656ee55fe27d47cc7c61fd9c52bc1749cf16ae9f4c57684b482b0d3e57894502334da6448c1c82388e7ee4013c5f341562595968b97fc1de57105be2caceebe030de1cf41589224eb212067ca372abbaa9ddf2e8d7dd506e353753f4036658af36939819bd7b9da8e287fb7bbd9e6c2fafb28f1101a5e9cc3288dee66b1e75d9fbb4f25a27a7919697b4a1a911ae32b1cfecf8cb9999567c2e2f6ef03ea833d0131751e81702abc90dd447697b2262ed412d5df3c718738f7afe02a64f93eb5cf32c6c8fbdb0097a69790c7173d6fc126e470cb4ed617be60c743886b8a655caf6bc1e80ffef77005b8b1dacd2ddadc70eb823db11ebe761e2afb407c740cc323a86fc045626a834597d5c2fd4863e7a6f84baa30df5f15d1cfe83c1654d66ce9935b3a42a51b16535794c199a498d02073ca7dec7ffd5c7eeb15a0dd6d9354a03ed1b092d102f4041a4217b35e1ecddfa4274f73fbd3e7ffeab3072ca883903a5a3d7e3d112abbca9cdd6d0774a74663899408fcc5421a6be7826b094d8735a5e229f13b8211e8d84ffd7b8f9caf899fe9bac1b54bf94c5898fdf6ca335e59719b3406fe474add9bbf16f9209de3b9924774d186c4e68c9f8245307d256b8760e562810cb1adc921099e53b13dd641f6f788350ad03e07b8cec75693236fce2914189dce9b4108573730b69c8224f4622f61f35136b2cafa282bf641fa49b2f62e84eaf518f99228658c34aa917827ff291055cbd3d90a078a460c72374a50bc6080951f11f8c23833b520973987d5ddfc818f2a107af2e5e3ac8c6cfabbd1ba6e98c46d5ac603f949cd5b5b87c58a07956a0aa060286dfbbef64bce48eb561e3efcb71d51c5243dd2351f3599c518950fae34ba0edd678ad23deedac453244e9fd91aeea79f70d3e8de600903786c75d85c3c6f7af300f4cae0c019c9f82671b470330e28a2ae26dcf0bb9ec41dc33662c2551f8af6e2e881041d90824c84c45536b9e15e32400a89c932cdd16010224b56c44069e17c83a689aab643da7ca2711a5751fe2d7b57993694dd6740169808f1066dab9acad74871aff15aa28a8dbad7c67b7272a62c1797d5d2c970bbe5ee7b8a0faf051ffc9df4b84aef03237c8d889523ba477d9379514babe568aac2f78f34aa5d40ff66500f6cc133849971b9a5049d9aa50a555f1db95ecc442dcb20a9b5aa2da16fac95576eb129c5ec8b6afa2124cfc16863bc50a6e6382cb5267feb9497b40115ffd0349c5b8803857a788cfe8935d0501697f671a8a5573195b7fbe77e1fb4e80b3ce49e5b9e04d696f122a291592f0dc2455296c1896f078f0af19ad0d16522e75ad64305aed21c2d4d309cdd22f156e37c049d0be8f842d1e2a2e5e8862b439e86a82e588016728ce6d80c74e1a7a6142d2d116cf17483ffb6a84fcb596022fc627989a3aff554267165081c142a7e76df7e4d6e1af5a161b1184e2cc6302a67bdfde652a11f8039e6eb50bc9a5db6d90f66e3c01cc9add917b8e54c8163ca5be9b9837716ba210f5da1d482bfb9d24b078161691d4a3247349d8845155ee47bf9339bd2d20702c727a46d2a7d21e027c41875ede327781a34b0b1b7090be7cde7ae55e85c2c1421350ddd3a87683bad9c4d62b9109b8013c46f4922a0b348802afdd464bb7ccc76605ac30dbb09e671ce5d006f40199ea043077e29370c78f73b2b98f14c4e41b11eb72473ffe0af6bed04939cb0d8e066ea83d009b92e61da481468f27bc760d2ec6eb7c6752afa36360220448b925ef927efe2028644dc983095664dd01d2aa3df6b414763c2a3d1b32052114486c15f165184e8610508cb674986e4aefd6629b2e976c327436bd2deb76005e77aa653ede7349baa1cb242bb13eb2caa156ad14a9d5d38f746341dd9c5db5829326f5be7237284dba0a1555766acf6566afdabc1f6bdf08816bf8354ee30835eed1adce016d911b51e8276f7a6cefd35d725bbed2947c3ec36ff88390d1df12e1d23e2713c38ff5f497dfaa1610126f1e060851e9566a34a910e710f512c94f96adb4dda3caa248aa1fd4361f5dbbaa21250d139c4ddb43cd71c85f52d5c5348d9dd51132efb2acc08d49e7554fba2b536f5b670055324127f98d89175504c1db6607ec99ac00760b2163824d63c819875053e166a235b5cd2208c08a260e78b996acef3902a7fd1b72e294e728dbadb6153f113f2380211059b7c58938e07b2036ae06bc7da0547a6b19ff28b21047f8c23178234b69ff2cb3705cb45f457157ce7a7f49f78c9d0c5d09002ba3e8ae9ba166abc4c53a5e7eb94d96c44f4278891e8bfbb4a51e0cffa85edff0046f3113cd7172e00a523ff29b0a1c8895d816c505082dd5b72fde7284e8b6998e5512078e6ba546bc2daf0b406649fe0aac04515b2c0639bc77f89284acda706319157427f0d65221f10e0dfa1ae549fb651c8183da2006aff4c692fc50d1cda4cc0e109564b082a9fa93beac0c37acf8165c0b55aa5bae25ada687a5c5b59afcc3b7d6682357c0ebd5d8a5a30a9c55f7998610a3bdafbb0ad1446a09210b4797c601eaa15575f4f2454ab911485a61b7064d3df3a62a555d6e39272dc533127f618b3cf38aea703eb1552266846214590ab97978b6c92e3e1f7ff89f171ecdbe5bcd5a658fe47d7b23112ac1fbde7a2fc1ad827fa31f04b8664c7bd55a818c42e2cd8f614c3e4a008e213400566c815127a89b102fc8ae9e245c39b290951da7162be8359aa6792e75f00a6ef285a907e6a7cb079b8d5c76579b19009c4123abedeaa9c325f13c12cc1da34bd5882339e431c69a09ec91965f27f1484d272d36bf1bd0ae0afbeb8a78171193db374a94bdd8aacfbd53232269cfada7293c55826137f21f6387dee3dccb1c134d1acc9d236bddf33cf061fd5f93506e2fcf95dd3f3b15210ca6822cacddec6fb2fde2cef292f4b1aced8f7d559da0df365899e06a3b18a98be3736f106d130f39c54d9c4548172465ce3491c23f9923ad661037294208e29c5d1335cbf4744a63dbe0a3057842d489d22f5958f5504282d8c8f5de7a0d628134c79a46be67b12e34487077e80d07b5c5bb34754afc463f02d2d5a366d74f13bd48bd21bd1457fa2a7cfbe76abd3ee26135a8c66603f1548049f7f0fa848a48bb1ec30b42bbf2e1d0c3e134aedd3e356f0ff9a00d00c2c996824181cb6c48651419861996ecdb9a71e6aff49a7a5a9d2f566b374e816eb55c67e76bfe93205621de22694897877111565808295f43b580845ad017837701a55c4f8afebb7bbf630403b0d41bb781b06e7341bcf0a23381e2ae8224873307f789ad0bc947650a8227bb1f61678009e4f340248f80b706f449aee61502f314a3a56c3d255c443fe2762c46af7eae7ab3a418cd3f2088f0fdcb900375ed86d1bdfad288fe09acc2f6070c69cae62ad8c423b88c9ccf2bab255fbd34c8cb32189d2ae105a3947b72f1191e7ca315bf5900d85f3372fd78de281232c605a1a5f0b83b00fffe4659253f58ecf33f2da5b375e5f83c66db3113f0c92ebc16800b85b9d2236ea0a81c61edd088c70078ac3fe23157c0083314e24b550186902f5a4a4bd11469c1114fb13a4f07cd2111cf57dafd1c4406193221f3867cfc86c82e3821886df51e710a0e5dc3eb8579490c5a42a9d1c45e18020641782aa1a0f0a9998ec8ed5ef7d11c1c913319ccddfafb18614e0bdf58a5b04940ed15605b39d382ec661ac632ffda27af44da1fbbce44db19a39340b01556da33f934e7f08ed4e98785ae4667f91c27e6e4873ea2686895ec1f2cdd2921fb3c7768501ea0a5f4af52a7c9d7f7078318197be5a65a0d687c9d8b09bc10ad3b6baffe5ba26c4964d527a1c67a4ef7218c5967d3ab92e49eeccd82389575b65c8f30a0e80f4bd66abef85c49572203653ebdb0c4396524271a38449b72bf178bb413336e78d8860471fd11e940e7502bcaa6cf35989e85a63492fb98349a308165b41620b909ddcbc60a9a1740765bcf8f8fac686ecc503ab419f202d345055b628d79267eeb18a5d9b178a8fe89fab391f0c04078c3a05fd32ccc68b5e773e0e3d2675af727e8e7366922692e81517a5ecbce5378f343118b5a049e972bc0a5f42a98a6b01cd06bb54c447a48d5342fdba1ba07673e09e774f9e37b6bcb4bd4014e2229941cdd18a5e1d03553d295322c3e1885210c0ee42ce25976c19f4b8ef5e8e7881d8f05da8a145e3c51d03099de4bfc28b65fd496513dff43f64efdc6f4515e85b99ad480cab35d3befa11041ad8850918f6c466663e6ca4e18f79a67a3943a238a530906ad87dd7925fb5ef660b398caad68996a3f54cc333d943f881f7b79bc57d473e50183c4515e23aec8ce71e91b8b59bf48ca22e5c20441442cc6c1b0180b563d4d7b0af77ae8862805bcf0abd493753458967956d24a65efe619afb09aab8438c5ed3751d6987c65de2a3111e1b114ba2924a5745689eb9a8323f4d6e04e396dfe2959a4d44cee1802bb716481dcbb52120878eb071c7008ab2f7fd1a4b39e76a51be1944a53c73ec4be1bbbc71753ce60be1a30f119fb593f7e661b4f8ecf9d129a547245a380bc2e088e363c8831a67686b9f60359a24d660d5bb8c1984be4c5b7966d41566e69c37e7835d424929361b701420ad5bc7f3a42d972dac00e14ca8d17996a9989503c682b6435f0cac22b72604c2a13af05f719788656dc8bfa167167a10d85a9a0ef4af0c046fbc293ee61f3a83b79240ae8a0161fd267fba9535cd183dbef800ef71c73ba790d7cca6bbe13e64ae4df7ca79461e23590322831f81af9952d4da476fba43787416874533605df321739f427333a3545c903b56f5917ff2ce72a5965cfa2d68308bc5773361acad4d10d85914b9f54aabac9e941dd173a06a8c1f13fcd0c62914498272173617fbe34985429c1d2d21e07cd2f203c24c8fb5ee9e84559b64983b2c715f0840c5642caa1e405c80d48d636e9aca9b7ceb1d3491828598bf6911baa2c2662c1c6cb71e51a6c7e0278a96a5f6c1a2ba8a2c5c5fc6e2c5f995ecf01a9089ff260abf5dd096d5a9d0dc4bd591b1b462b6e10bcd5b127e40d2359f10ba87c906424b2e4e8d0e0692e03219273b8c83b1aa1d0a5ce69c7ed78a196cc14077ce91d3d6d16366dc43eaedaebbb474e61025f483eda6773ff03b4d131b5a92898fb759750a99e4d086d189469061c3e3718e11123234d611662e396b3e53f60b4a14adbd60f8bf1143612269c48e05913c03bc41fe56fbf996157144106f68f99eebf10324e50290f045489f4becea8a42817c285f2e93aba34c9af40ddf158ff900fff49555d445ee71195e118e16bf95e4c60ac864fd32e81ffd469cf795cc3c4dd7c1075fba3ae8a0372470580c6608f4338af8869d3bd9e9629a203c5901332c381e879f1f4e31f9ed2a30abc18d2962103ba884f0f725aa76678d40573e3b073ae4317a07fe40f6d03a49f52a148eaea0c757084e23e6219433bea61a19077047da548c0de806fe84504682caa87d0cbe76bfcc661df405bce6c6058b1444cb9138ae5a2aadf83c498da46b96b488030608d4fa331c7c0e2f5adfb62431baa008739d8a728a252719346112c318b5e51794465b170a4d74cbe5ce23e799dc63275134ec1cea14d16598c8d9dc84dcc164cfc107f523b4fc4e7b856a3903e81ced8875a26bbe7ae483405fa1d8c730d82ea09076c4a66e881bb1aad2e0e1743109cbf057216b51302e514823144247722b927408be56c131ca10ec53aadc0337021b911a3ede37fa61010dbd5c34db8977547a4e38f7661497e68668e80fe52b07c8b41f916fd8bc630104221fa2a4cc4435cb01e29e47c8fd92e36c136220e3594fab70e096d4d79e047d386a1291f803ced6f009eae364a8e0c885e14f4652f2455c9ad98a0d761ab3d2f1b8c650edb6034c64c120f9b97c4e416834388e1a7f1ce0286489ceafbcb3da463981b87d9cea832d820411feb1e23906946cea4ab3c20c646448621961643ff11fcccd2e872bf54a873cc8c3122b58d6e8bad7b56210e7c22ab34e6a8dc5b24a76e135b9cc0d25b6d09ad95e75a174cc6b8355a38e70248ad32381f50688e38aa904c88d2e602c8a6770b4031189e54fd5066245bebc144b28c9df6c5b55966fc6330ef960ad655e55089645e15184f64c0f2b6832a4c6bb8fe48237023299df61551cf66693768a336fba97e3f9e82579b91643718f7e816981dc520e240c75dc93b42ec455d071ec91a5ac6d2b66968ea2de5245d28357cc666419244f511d7c5ad49373e7db0461fe59325b1d5671871d9f0345aa82bf4acc49bad1114dff891f831b782ab82219c4c33c359784e42d73d0c73bef1f13f4bec88b14d4faa5b4556cc5b909c9c0869e46d8dad5f17dfe79e98ff6275abb1b07ebd0c3b6390640d7ea6ffb5c6871860bec119fff05eebaa2b5f17042fe7e96b920eed9e264f4594e4ae753c85ee7d8c59fce3f1b27a782162df28a05479c0cae8cfb24e6e3b0d5fb492b172c3e3a24fceda4ac6eec65de62c2612e52bfad0da49db70923fdd7b1971dd3d9bb58aee523aba52ddcca8fb38dd90d04c845dbfe5f185ba32aedb5826c706deeb3b110e108be08b16e42feca9774b6b67d6aabd4cf6739725bc46de57176a9a71badf70e97fe49f6c92d385783c3942bd381463043e787b697ed61835571b3729a755b7b4568f8780062611e11d0edfa24c0cbd48c6fd4503f1fde97e792688ccbd431c4ec0498664e7707b36bb989bf5b548f6bf77e9e6408f2596e541f8365fb0262ac5779f946e3efc9d05df9bb38fdc23f75804fdf61e00419526f124aa05ac36b585cfa50baca69d0d381a4713b267833eaca6b938f26191a68eedbdb0f7ba4b2ad3a684589d4a1a4b810c1324b1662a5b549e2ec3690118a8d06bad5975d0ca786ba717a7bb9101510b4659ef5ab7111587ce8a8619611c9dfb788877a10503eb4062391dea1248bbe84a130aebb11ee9285d9d8dbf24a8178faadb30c5c3400b08e2437c224c00ae7c4af194a3fe88f8aa086124d9c76074cd090943808ee63dcce84033f5edc22f698d564a3d5b3772a13d5f366e75b1ca018cf8c1a31e5c674f266859214d957383874e99861f5178a30d109d8245124dcd6edc3f420e17880b722cc0d013a8ae1272bb633c6b872e151a5babdc77063c377164bd0178a1995b1104049018abf654113213165402e8345ec412986851d38fd68c2f359c76120590cf63b1a22a2e6697fad2802249d3c15f3317e7607a9496257020021b9c2db2f1fc2a4122ca0309f245b163a5fd63e508fa7d48542748d846466c38231d202ddc520321d54a2287934b614444ae216b376ccbc38cd525aa1076737aff009aa1a26766b7b1cc7cfa76695cd6db7ea8a3236939eda587d25a07ed44db3f121e520da2d15bec6d7c07347c846c5eabd46f32a71a2e9c8229701748f44fbb2b029f8b25d3456f214f45e3d20b3f28c34dbd1f2fec32aa40c55bc358faec50910fd7fcdf60997be664ae17373a732a25419dcc149e71e9cf6da360cfb449ed5bb1ab91099348a040d6bc6d851eacf96b0f68dbe2dea91d82dbc248106d73683b1721898e354eabf88198eab3963605005ba20f8447e5b831d86633ae508fd4d846160a3b4f9a7b24208548ec4b69ddb6c81f74060a25cf99248e6963346202593437326bcec987cb795480f08818f1ab190fc507d72b73a5b293b2487e3e97cceed988cf0b2f4e1fed11a8113c265a8687861c3cef8e0fbfa434114ab8eb53e0e616165ea13779e70e2a02299ad35910de643b2286bd2b1cb0d45d90e08a3c4ccad1d2356e1e616e369ab5684ab3564e8ec271e6bc6e77759b770cf7434710d26399659176a112839af26ac4ab8ba0e910cea5ea1559c46eed32e555490e648ce0b88d09eb4ae4d8de13d45215e1e2ca38ef6b3ca2b9629e9a8be1e2f9e3d563d3d332239b972575859963a35f49045bfd25665a1fdc5bda2d0e7e212d9ee316d318d3d9601732b9799570d0a190b67396a5c8d88ea722a210b65c646c22a6edeac7295f6007d75a0a539605b27d5996d5be1e468df8ef838717a04bd2a8e93ea1983915d372bd69e12692dc459f7c2087bb0acd7596a393f53667e38e531e46ff67d2330b8ed7626995239eae1cb21a96bc312cc19966de7d2fedf3b2267464eec627b6270f19fa6f3f17de3d0be4caeaeec82b5930a7bf89db2ffd9474c7076a36756f59d3fe985189ecdc157aba9c75290d04b2316874dc56ee30d25096c8dc338195950231faee5464b668f9d50c5f15fcb8d29f33d2a99f0c4669b49f2502cd9fa484150c03f90948778c5e334c7acd73aa81adeb4d3231b92ea6d8fcec19ca0dbf243daa39a89ab8cedd83bf8dde9179817b2320060fbf7c3f5f5377cf1b0d28804cb5c35fb966864eeecd39333e5690b0bcae3bf48e8649fd3d7685b5fead861e284b420491682dffc024d8ba7d507fa00b2e784fe9063dbfa0f386bd17f651a8e851c17a251d20c5f0efec8290f12338ae63cb5b9c9b0e2ac3d77eec646c9f4249bc9c8a7fac307fa340f501fc3d505c68bd94acb8df184bb406022f0315334cf09b19910dda7175484f52242fe429aa0e3c88e22ebcde531107febda5a9692de843637a77719f1ac937609cbc7cbe65a2ab5a6a523ef0a9ea80244be9d25053043e46b91646c537bb3fbff06871c57709b16dbdb2b5fb8fc1adcebc98c51c6df867a6803c67d07f00daef81383e3f286ac6f35824b35a56e3b740a1e5a8c7de32bcb3bd4eed6a8f69f158eb1424b78d875b8837c276a8a19a360e41ed693e7c56de114197baa39aea2828c38d307245ea601fb8282f2c959e198b43092f64905527625aa0463a458c88688b0c80fe99f9f69756bb235328c37918f02c8d4a3c3c684842cf6a200c2f90a186b41aaba089e18653e83de0d5bb8558611f07035712be22038626fc1e3e3d5b5dc061a7ed75db6db9555d8f2549d489e395fda569648c493bb833201416f26496c0f962fec6cc12326b70b052204aba80768cddb2669f32862ab60264268f13854a2beffb8d344b25a125489bc3818fb0cb43d4f7a086293d7295411477496246c00547ed4f34bcb32bfaee06baf1867dfe95330bf5018463e008b9101222e491497f26a71a523fb43b57968a271c9fa704e9130feb2bc99652302336308a4ae4284938c7fd4aa36bd657be3e8c1426efeb9cc5d3d7d6035bdcf5224cb10941df04a2c66e22854c5256620c9b91a30e62c84e70fa420d80d2f8cac1b1f168db6921187493c3a7ecec8884e8a4e0f9bd7f46df49158a85c18274c30df44cdd707b678b7207b2414847cc8a69bd729c4a0a44194a7aba8da3f081b8917a1a5d36a6d61649357e3726f6293a028ddac0410ff12f7736501741ae72a15f57b03f141bd62b64c0ba3e6bc33ecd4c7bd2d36e6a774faa231ecb83ff4a19b0c1c2951c72505c05363c1805f7fe0524e8157e54669cc246c3dc2df06ef5bba1fc2c4811a72f2bfc3884863698c91d7d07bc350743ac2170cf0dab7e059b0d030d21c49ad6061604a1582159820904bb87b895f04b17857ddda4512bb9c9015f3eb4eff431f83835176443bb3868b132cb222e373b579e974214d6284507ce8384121fec6ea01367721ce2e8b5c9eceb4064815614a134dc91a5cde32639531e3881328b6658dc1c9f71a87bcc496bb16e29ddf39735f1243937326d911872f7d80c479aaa96f908acf4c23f48bb8004eda3c582e1ea1ad66adf8cb352f8bf35c0d93453677b0e249f097ab01665a198491c4131a455654435ddbed310b7fbcb81f7a0443156fb8056845580067e494960f5d03c4da21671ce957692332fb5fbad293a3a171b85c4d97db4780ec38a46846cc30a15f532286c02d2915f8c3a8d3d87b89a511f19591bc8148c54b0d9f5bf9ffbd635f8d6a821fcb5e3d420c1847f79a250b1fe264bb2608daf9660371c81d7d5f720404726e3832790fd51f13cf35c2a6b011e75c20f604f28b29ec78ff092cad1922311a0f49059f4e3d5a0d1a8b508000fe466b6342b58347cde99d558a7127e40b4aa49e16913b2fc69ceb77885cc351105ac32dd23ebbd982e7f7dbffb36f4fda596886e47c016199c30fb142dfdc27bb5555d67558978d62998dad4a665bb5600cfd6e8e46bd1fce885c38378903621a5f38d3effbfa865b3c9ca27ea77362412081137830be198826368192d8d5cc1402c14ab366c6140a34d96f8aedcfbd1711974f3afc9fe8e4a8ff644282357399b14b8481f8c75532955e5c6ed03d279d59de21ab6ad23f4a433c401a383de343a56b8d632634e094fe915e5c455299b79c69339fcee5086c450d1886afa802a838352efdd2368776a3dc9e81670878cc7835c0befc9bb4159d180dd73e09e061355bdde48a660ecc690b9da6527bd9c9b9d10ea2a85aa6c9b3e9d54452c7d10d831e805b6e5a37427dc6ab966eaf222fef98dcfbdd6cbb3a951b0dab33c3ec7fcda37f17f42cb20f2b401150a64597f5be8a71463b4a341de8c8d85fd2103a3f258bc78b36dad116f4763b353da1621f35addb350002798df57dc19c7846ed4bf8a6049d76f04db245c806258b4f38f1bfbad5b0580ea19e0df4ba041dededcf6ced9cf02a6c5e1a1057047b7c0791e3c77593a640b4738c63b7a151a61ab8f775f7d6456687eab3504c455d9114e87439c904062421c212e052eae094c30d0c03802dc44fed341c8d241c4d76d3b4cdcc0d62f834fcca7e439f26b6c1a16994aa22a1a824e24b12bd5bce041ffe24edcd415cde163b079d0c47451417532183b8a110f094ed711d1c2246bbc327e8a349b90a33c20c19f329951d13cdd2480d66d49d4aaec2fe2076da04094a4a772c4a7687b9e73006c15ad05db119fa890c153ca7f69fe2b0850cf2b0884fa52d884f783c184c84767d42e34e1cfc3e589449beca9777e68cb6ea6d1bfd26b129fa48f243e760e1ff1f06d0911effeff09e6b0f3348d00f3dfbdaf3b958a70624243089af1854d298d27b41da7846d52b17563d9078f9933a2013d52dc5eb62aa76243fd34e954e9f41ed0c7dfc7da1d74ba810a3d515b29e82071a3d3c9cf69797643f193606286735aed61c316df81d3a1809b5691e9f31e8f93bab78ea43e8ae1d7f7415209b0f77687d75e637381360978b7d0d017a04ca0dc3f3b83d575a89b2b57061185d01ad6950b9d38a6b2c636a12141e482cc06abf88500ab7697d2751a484ac84bd4cea97b11aa17a3b536dba39d7fc433a8b1c8554342ec869126dd101b50c7e26e10742c1e68467c924099f5492aa086f6c91ead81204fc18d943a951d363197241c2b14400a05a0598826073764618fa4b06881b146d599afba1b7b6220a7dc6a448a09a9bae86627169bc07acbb31991079a4c098a7cc280bf5cd45e2f7fe648fa70cfc4e4af0432a3c05a23f0b3b63c124694b2a03d74b767bb7884ba7b43ddfa3eec8299eee81184d292b9b1a39171b0b2f3262b7fb271c477e1465733aee1d219abf53a946d53317e616a5dec0f720703671752257397855712329cbf63a10ff40918f2a70966647d366f09d4f440586a961d83975a623f8d45abb155dd22cc6e2c55ddb2f8cef1ebe5271c319e8d4dac14dc9b378c721ab36daa8010f60d0a79b9509bc0c41e12c68af4035df6311fb71e948d94076d42ded590f050ab910fc1ec5fd16023c3169e044466b8b9b29b1985e1fec170ce6693c420e39ae5050ea685ba66fca8014b65a1ed09338ad20e496b3452b721b26b2bfb6daa9da6d1196cf73bd3c489c6fe26cdbbd6dfeee561afb2fac44287085d185906407990e9e81bc4b1304d28519a8680db629e29dcd3a69008ebc9b230c18ba3b8639a20d50f09f73c983015d1ff1364bd16b5f2847fa5dd8af8a8117c66b81e95eff2ed5e205042d907218b90cfabd72fca95f42ac8d8d431a2c6393ed0f69392c490376bee8f3c49ebf272215fce0b3237e8a5e3d64d34a0f629319577a9f15cca971cfa4eeb3d7e3f678bfecf90099e83e274289425e66aaf3bdae59ed0eb6e4d9950c16d572a79e708428d4d7a8486c231811e4394fe25a5c434eef6020d74716c3bd7f70a48a9ff02fb3f4c8c5183875a752101633e317827891eaf3d080be4f3f6316c9f363a5b614165f35e7847923f715f7c9bbcf030489bef3e7609be368426d6c317585ccb7d9259a96058ae127f7e00bc02f77cbae376e8e541804833039411a3146e3d1afd5c688c8033118bcec5d913b782019043431c04bac0c1d23457e89d95851b3af9f54fd947bd189868278a22136d3842123d6b954b2b21d3deb8f520e4235558c457e38ccdc4e32b51e2d1ee294e730ac46cad5723478c552330a62741ed8e2ae81c2e5fdf03e878bde23e6142b99c8a758778f41aa7a345c4c1d65f65e118329fd9cbc427554ae91f5bb958f6f600ce2e3412c65db9eb15b5feeb12e5a13f70eccd933b614cff3c7122b5af898e455684d7fb3b94df014f0498532c0f71ea8d8174f3935e9b1a098712173f850ef97a21620e075d5ba72d207f82f7625cf15c54d6f7d712b70d892578a28398ab4578d1cad5ba11f88445a52b821a8114700224b663700a2fd5f871bae3fac1966f37fb00797609de8d6e5d076eb4166c584a54232857e758f065f0b79900344f872005e6ca5f89ce1f0092bd928e272598b68bc1874b8d50f0c6332504cd10427d2267ac011d439e8356af5ede992f0e7848a93941cb00fc7e93038204ba50127ea1a8e86223e8724c0663a482825b2075b0de0689fad07555c69108190e628954782adb06af6bff1a426eff82e8fd13d9a4dad53f827ae1852f795e2a2fa771024e46f13529bb327fc245a677fda22d6083972783f4eba0c20925851a23f4e4773e3bbb7a6e139919161b8e372fd70dff5b6d26663e0526bc3925483c07c19d4a849d5e23aafcb71f847abe61fd29c7fea8281747b184b0c6cb9e65084f4412672a03a3d935dae745e4e87c647dac824de49035cba31d0db88a3dedba12207d501068ffa0e9c5e59eac90db4c6578224bc3e8310cb4959a44b1e3aac79835d17c967b65f7caed76d2be09a3868cd427bb6e146fb132ed29da8662ecb2ba8a8e76c6f737fef9ccd9adf85273ce783357f8b1bb8124787c2583785b77c7b6b9bd5f401dea74a6540d544bc77753a1a4ccdd06589132dc9b99410d78035f4f1abd01fcabec83c35450f4a4760a50df7c48e82f535a272645ea24d3b6126d27134813b1163f19adc9df39f689a33c249d64a00905fd6759e587dcb3f568f9f4bd9c7589a2c9c2d92ecd68654b74227a283a4bdbaa394a9c15ad40d2f5666c21f7cc1fb9adefaddf3b6e14b4fa40bf55b324d1d1e11687d51d10ef653ff231e8a07d219b4e53b55f338ed4dd0b2914b0a3b32dd4b33bc4a75874d699dcb0f770102768fc2eda3141bedce8efebd8909f6a12f4e0dac1f4ce1d7bc180cab6f0bee7443160eec32a280fc72309a60069527f53d9263d715f830e2104e557f7df37bb9b237ade1a5836d7d2db1c4885debd92cee41a5ee7a320b96c48096ab556cd516531208a7e1f384def0fb7e7e25805db1a8e8f93865d4a345013ecc6cfdd7bab2f3dca28f26f234497fa685814ede07b5dea698b6f7515c3a58777b91a13b249e636f7313d78d60736c4efd167d4d4899ac23acf224cedec527da8712c1c4f98548d509beb1ccff8b6d47f8c63e7bc395ad6342de3b8722e160b16809808f8cee912863fcfb8c899125ce264ab0e841813a25355e4bdca832307249a396732d39f82a95dd911d8d800b7dbbbfcb59bb9b94b95c4776901d82b51494d7cc5c03fb274a0ce6dac94d6112ba9a2e2f34fc1b7456e6a8bd21025706d7049bfb45a35456114a34b61e441e662afe08d3e680b791982c6e03cd0d436b42d83ec83666551a2d556ffa0ce661d7c3b23cd1a3dc8ff64cf48b52b0787722d86ff0b7109feb2232a858f3e61e52516368c2d5239dae18aa29fa1f228e71eed18003a640a2bd3398051587461cdc454f4e12f547899e4c87bf112331609f5c31ad5582dbe7bacc30813a61ed866c3f8659ede4118d59338a920f0775c650c9d0792fbad43c3d117205604ee377f2204e64dba32f8254c4cd748fa11258ae71ad886d8397c9b6a795c06cab61e4b42de118328d2f0347b86548e47615363be400d5bad215de5d88794fd284c40d1fc5f6535280f635fa4a0a52e4365af548ef3bb8313de0129140283d0cde7548c8781f2a10c770791d68f03e2c093281e7e8f2f85585e1ddcd440de52133883bef6eeb89545bdc52f4d03dc164cf6a7238dc0fb9807b2ef4b04b72131d7bc438d46c0d0f600f453ec266763ec06bfba3c56a09684b8657400502644210b698a429ef5382a7949697050b9c32b83cd2bb0043a2e123e5dfb3e79d18d929b5ade38d8cdd8dfd04b620d4523fdd76e8b792b5590d1d76260b4da876cda91bd9142366892ab149174448c78c448b64252d4ec80ec1453f2c4111a2e4eed11878ab7b9cfb6b0956354b67e9dd188420fb3ac48a60ba36e51db4ec07523317261d0d23f8b23734234e2a9b63ab05c0e606b11c4bb1e4216160c04d65ac7a5fa3d946b0fc6f165a2ff03e3ee1ed055398e26c0537c47e942fc2b7b10733c54a74a0ae0c980d7da708f45b3c9752c438c9594226f621185a02fb407b2a089deccdc405a81f2d1cbe6e683a69640be65469e758ea1f99ffa45ea6975948cc82c870d4c6597f40f6c4b86ee14a72b92f29f11905a0964ed427581b3d940b53890538f63b50b5e5479cd14267c181612d7c6ac9ab956dc490a42cbfc49da0a1f59c2636a14067bb93833538fb416c5b4ca4f631ddd27dc0726bbc910bd5e7210f5f16781769439625ab74fad0657f4c51a1e17580c7ce1d4050852057d50c29cfdc24bd93be879a1c494c9d81ccca2026d4d1a9961c56d27ca0e6841854b8acc61e650ab2b542362285afdce9965024aa123122933a873b8950ad68c359cadb4e54c590271283089c84cf4dc645d45354a1b0eab5a9cd1cc81082a2039663e3627b352515b3347665871df0965025210e21222cb0653bc3859aa4069cdb598e6a9f59579683894c0984085d1e6f20f6c6da621d83abb7749e5a932d9b4504e9171a8e6e9174e574a4e35ca54694f7022a1d32dddcefe1b5a3255b6746b371459c70a7e801e97e64909e08957984f259e400a28abf514a3200432f1952fe04598a6a9bfbcc7750a144cb6a3f90cc43629034f38e6c0a6f79fdeafd5640b4ab78b7de43d167736a790abd70aa28af85481ed36a93594ab6bdbb38eb3fde8a9452b09ed2d8825e622b3d575d44d223a33a05abbacae02b23efdce6945f7e653719f1b8fe8e25a12577966ee7ae1029ef302471671df85a0bbaa4e45234ffe8233c2cba740ef761b1faded33b54f29dc6bece1298b066eb9655ed228a926fb6f8c58b5ba5ec426388513f42f7309e1565a576e922553644f00186b895a57c4deca137a2476b51a44885a1a67e8cd5883954165169704c975f7d0ad41d23930de1cdd3bdda18b83db79d0d7a577f8521e4c35b11976dcf7e57594db126f5eacfabc91e11e3b94e2213b24193964c35f9a6898c8438c30670f3f8b9746fc2f86307dac2aa2e03b9e7f93e357aaa5a83322a2692a91aad76de9d7055a52c79436e84b1c36242d06778159637a3d6c36c92a6346011de9c52d2aadda85ad878bef2cd566ecbcbd8b0f1ebd9e85de42e03f917725371c12a4b55ca9f7cec7c3f6fd53f1fab4110e346d5289d4f4cc87a3bc9eb43895b2357b017dbb4c4f28e02fcf6c2195284e6b3d1c530450c1f355bcd296b760c4bfd63d1c5d436eb7132e80d8c810588971f4039047b9dcb7db321d29153188e721a7d517d02741ff5ac839c11ca2af4e53d71e1ffe8628abc40ed01e24e1cf3ec09ed7ad70b3922b78d56e342d26f3cc2ae6441e01ab5edf58fd1dca3293862d85f7f80602878248140df39d4c17a0c42e7ec0c565e0a6ea3225618d33d09794fa8e2663e7dbb181668d34bbc832039450a3c30a6054209d597a33ce7ccd2e4cc035a00360a6646a7db0561841f8b4667dc2c634406c85027b60a633b8991dc369c862d018fc8b7c127facb6262852a9840b5295d19d0b406e43d2bce23fba982b39040a1d99482507e8c5ae5ac1436ba3d847076a90db90d0403c3318b208ed1700928a22493a920592ae47e697b70f033aeb446e07af1d33fe83e40fd3aeee9bf933b069c6d0c7e7146a1cc4624ab7eaf2071a042ce858e9959c3f7683b98929416f149180d1142bb00e7c14ca9504d89d69944546ca382d0bc2f3c5552a60ce16bc5b376d13b6daf2308b2996b5dd442188371a819587926fd20ce6110054f3beb2c15003037a2219aa844404be4d9b9ed2fe4adf06cbd6822b2c892d9d35dcc6bf0cd014b65e092f14f63b72f7b110d588c2f28461fd6433cd80b14e77e87c6f6367417f02958f46b34783bda20b5a7147bb58df965ad1b4c35678003425c369ac3a9c0a44f7c623320fdf8ecfe17219b02283cc00612aa25f1970476721f0f458a9d70594c07148a3633022e48bbdb9f8307a38d222563bb8241df7fd275c8d94acf99bd86686e28115a80238de81804d3a7ced5559d75aecc3b7a7b067497e5f22ed0b400d71a1dc3f6b05a235782f04d2ff56a3da135801d42b4f939768fb5281fbcb0f6fab61658340e960c3ba14d4be3cf7fab5ae67a7bf4c27357a04d51a9e115e189e73aa8f853b47f90d1c285701ce4d047181db00ba11ff9385026f0e93b0524fe89a93638540d04bd8a0000728c1872e69bd3d268c396c0acfa1cd02fcf705f93882dfb0d6e6f64cf59b3a30d1578c961e7a2ab67d5a530b8a0a894ed1be741c7b179a6fd3593353f7fd0766210b3b2b06db4db299a6abbd6ea0fcd05eb809786ea07f0d7f20e882e33b92f1bc9b6a2b278c47dc6c083a3766168a8bf98eed227d51e1eff68962b4fd3d60c4cc5b63f981468a07fc7016c0f2d9bcc854018202333aa5faa352ab9cb8262d7813281f45ba1d53977035a035481fa8e5caa819b985d0b10628a79282c213eba1a410ba3bacfd75fc41ddda4ed3a400b569f74ef9f73c94ed9695678e9ddd872abd1e894dde6ff674b226ce4ae47a383211f62013b0f93f99309556e5e965a1d7449dad95b840d61945c00273436a7bc036854cdaaf876fedd520d74cd810aaddc44cde5dfd40ac04937bcb3c151fb71ee12a671bda5a7b0345166e9e4b86ec5e014c6f03ba3c7b9f55309e11251d395a22b408d65e61d962a8bd32dfc9d8121459c34d8323598d1480b8865d15da973ec46d471a472905e0ab59f32d0784860f5405d0defafa30007b30f6bdf915ccd507faad6d4208d9846c42f6de72efdc09180aac090680341d82323644b263adb5d65afbf97c3e9fcfe7e3f1783c1e8fc743535fffb6e792c3013adea6443df6b657080c57ca6effa9c7b46faf58080cf7b9e7aefcf0fcd8fe387b6b5c3eb804b9cf7109721b2ec1d2e7433cddbbc9cf83832880f3dcc8d4dbd7cf7d5c9558d69ebf28daae8ce7a6b12d4724956038edb3d9120cb7b96cb7af10fb5c18cf5f88a5258aeac4ec94c93aab13f3587b61b8cf85e13c1786db2e0c476545c03cb7eca54d5cadb5d65a6bc5b26b379e8d1c384a725c724ca001474020470e97061c91030213d8b1723855686fc97e48ad70bba5ed432afe5121dcae8ce70365b4bf28b25746abece33e9fcfe7f3f97c3c76d332ac565d73eaabd1bd9ccfe7f3f97c3e1f8fc7e3f1783c9e8fbd91c32589ed293e629edb4fe6867fd43f0ee5165640864ce054e253def988a70b773d64c34114c0d59fbcebde69483dcaf11354b6b0918a046cc2558c7deee33ca04852c12918e5047f3e9fcfe7f3f978ec466fe4b01408065335769aa76fdebea9a2a2a2a2a2a2a2f2294f9798b2bc54e23adac4595c829cfde79660b8cfabca9df19a724b2b4f798558ca2da9bc94f2959317cf4f7049e59ebfcce5e41e5cfae127af2ab75453bdc60505e57aae726baabfec45e53370e957f90bca3db844e328af343ca7f11f66fc87afdc92cce73e7ce52f73f9fc46ff0eb1f79cc61d623fe33fdc21f63e7ce50eb1ffe1d5875bf2e14356fea2bc567dc62dcdf890952a67f7dc92e74356f08ba2cc736556ee79fde1cad0f88b22191a9b0c0d1c4401dcca5f14753e62ce8a9039c3dd0ff7711af6e13e6ec67d9ce73eee87fbb817494164dc1304f4194100701f82f470900f332e8da292cc8f953f0e721afecb8e804cc8f4356edf2aedda9095c30c1f019bacdc1afaea3e41654affaaf59721517116e53eee44e53ecedec77d3a9a2d88878f988d780e97e41e0000baf332e63b438206e7b9ca7d5cca7ddc091228d03ee6f393a3b8c4c49cdcfef339e79c27973ebbdd0383b5a5a1a14e1f89baad4ec170f4d77d348aaa6b9f88a2280a0a112244484c4c4c4c9020f55b10eb5990ebda1fdd3abe6a7bb4d540539da2a8f9b22340372ca694524a29b5f4829e88fa02a8cb17415d1e02d4e5398a923d89d45703c7fcbc19b6b03c94e38605016e0145dca054e841e00008e00f878b33c09926f39d8726962041c723044b34b104093a1e21586286a2a1821e69480b57635996655996651dc3a0ebbaaeebbaaeeb3aea61f2cb265e414247861f0d42053dd2cafce3207d8fa34ef4402202d7b123a1e9a8c73e2f121acef076ed0f890d6b18bf8ed57bb46e14891c6e72680ea62c5f83855a1a33ecd96dbdfd667dbb766384c070d7b507c98eddde20f6f5db0db2ddba768368bf827cee81e1ea85e1ae5b8281e12eece4d5ba2518ce3acc5cac9760380c86c3fe3297931b1d6269991377b1f3f41173952bfc44ccf31f3c6448e4ac4313d755bfa7c23da0c8131b41820667e198aa614dd3344dd3b40d871e8400fe9005e1005c00419c2acc6cac07d6e9b32cababbd2ca59a976dc36eb13db9c525ac54f3b2fd04974a18b6afd8e20f815c093b10fb9363f5dbed76fbedd53b6ae93b50bcc2c2dc419a9cecb9a5cf8d8fcb33fc72b26bb8f47986774451760f2e99b47f309c81a60c975e14e1643ff98e76cc1ec8e7157bf74e38f5ddcbf9bc1dcd94c199c79d82400ed2d81749d1a39d5cecd66b2fcddce73e2ebb3027921e57e18e4e9c43710792f7dcc741243918ea44918447ac4bebb00c96655916cc813aa07a2d2c03cc8168806e680ba66a4f1837f326d201497ea739c8b4e4779a43915cbbd65a6badf5baaeebbaaecbb22ccbb22c2b2525252525252525a6dc3e5d3859be5e25385c626262b0d75fb7b09c579dd0b593e5c9ea25330ab683a6ec02dbbd137ca7dcb5c9c49922e97132335de4dd6dcaf2d0e4f1783c1e8fc723f3f97c3e9fcfe73373727272727272f2212ddcc9e561914842414141414141f990160ee5f29026921e1702611886611886ddc8e112e59388f23b22e971219696dcbd134beede2994721f8772725bc6feb0b75b6686a2da14452d83820ed2a696a255104d19ccec4f16dac6d6abddbadbce929d31daa46556cb342c0486cb364d333d1bb2420ce2d8c09b48b2b88fd844d2867b06492469b88b9c2229c34d13453891f43890959f5bd80ecae4ecc8dc78a7776279c83eba64a7091ce240879db6d1bc40936559966559a6699aa6699ab66ddbb66ddb66adb5d65a6b2f34c96479edcec022730b7be375b4b3f9c5777a9c761ff7487a1c95d97d9ca6699aa669dab66ddbb66d9b3cb5d65a6badddb4cc8232b0a30321a0a130b33118e05cd7755dd775611886611886599665599665c19928a24932248bdc4124591e9e0e91f4e82519124696875af408def408972077c14c89ecdbe17585c070f04814c96377653efb864b3513bb6838e6baf50c0b81e120cd8a8ec759f8079c8922f9c75df887f5c70981e12c0c8b3c68f36cc873d164bba7738233ddb394ef2656be85e5215804cec01a4016c0164018c0990a667666456d028a2d6cf797f34ed87d5cbd8fbbeee36e44d2e36e70b27c4ab26c617948de46923c8da41d370497c7400676c0d9350df63fe8413f3ef7bcad5af707f6a3e605bbf59517fbec8f83e1b01ff6d9eb754b4260b8edf5d82dd54400fbf59a97ed352fdbebaffb637bc51e7ce966e3ab36ed3e4cb1bd6066d72ce46bcd4bcaad976a5e540e2ad5bc00f15c7ba9e645c64f5e0272bd542a01a9cf0e04c3300cc3b00f69e1b0dbd353102ea1944e8e7219f8956a5e3eb7ae829f82ad2da1e0d20966c137a248ba4491acb5d65a6bad7f5cf6ee9aa6699aa6691fd2c269efac073fcebe63c97096655996651fd2c265efdee9c28fb3d85a6badb576d3b26b9f080319d8d18110ec8822f97a97c0400676742004cfc2ccc6c650afebbaaeebfa9016ee3a3d7d247afb481e8fc7e3f1783ea485f39c1ef448540aeed13c60c6af97ec6ba9de5eb7d6b5bf6ea946bee6c5b26ae45f3ebfaedd9894ab3cbb312747397663b2987aecd5d6b8785e21666fcdfc06dab66ddbb6166e53494139f9bcd87b70c9e20ac876414f446f5dfb44f4da7d76b15b2f7e96655996657d480b67611a45b2e31bc517a2977ff000ef05412f5f3d52f544f4f2db1b627b3628ee2a8c02ea11458231994ca61993c924847ba00ef1b0f90500880633bbaea1be1e599adf490e4a283ca531c6183bca4955d4ba2a96691ecdf3de8ba412fc14b5636c8780dcf2de93d3a2f4f0d614d9ba28cf060a0e7899f52842cbef46d8fc7057499b416132995610c4c2770c6c6221ee84c8b14d763e14490868519f8b2e3a88ed18eb84cc1da5b807cc46ae158a1190e1e369245db8a545fd53ee77131f4e2cadc83feea0482a5d07452a338b4eccbaf01705d421f8796b9cc9555a91eb4c41ae14915cab2a72a554e46ac9e47a49916b1d922b2624d72c26572d48ae1b86825c3f58562f8b561b35656cf83e565b31c2e6ea5af1c9cb0b733c4c84700e626c919a9755b19bbdaf132fd8335cfafb865beac59edd524dbfe6a5d61a6c7bc5a5ec9b765bea31cbc2aa760b97b06b38c4725debb55ad92f5caacff0b11bba6e55957561af70a9decf5bcd57b8547d561397a6752b17aaa63ac5a54ade97790a97e6bb6592fa6a50ebaafe0e65c96a58a22d534f5faffbb8260c8126c626d88491e3b1aaa30c46c94ce1ae65b028c24f50b7863eae65371ea8aa923e66a6fe00053469d2a482900c94b62c69892a90b206931a2a80f009cfb4468c5105534422b625d316c0267d5384200cc10d564041154b9420032b8b18c8800a42d4f0841dbca0c91b80174caad862880d50008424cc543b440e386678434e11376c38e270c5112162e84214a0808423503340c1ce902d2cd909021ae21c6a7e70c2c2e90a4710021220580e4052050dcd162970420ef2d043e8c1178c6461063720d28523e4e06222c80ebaa045197a10051fe4216671051060820c11e470840c3fc003378d9044c8169e1eb860c312c020061404e11459c0d2f4b402811a06cacfc3086f75793bf91cf2b18a918af813cfa0b0916ac4facb22605dd698bd58bf288b6251d4afc660b75e93a0200759a6446644841d3c16676c47736b5aa623d301b9fa1b0de335b2f508d2aeddeca11e5b6c6223957a6e5f9e190e97eb73ce8a7f786e5faffb03fb752d7ba9cf3225eab3bf1ff5d9ab757f68b78edd92757dbb767d7b76b16bb7541301ebd86b5eac63ffdc1fd631bb5d68c23a73c1be654a64b7be6d9912d7b5c3ecc5feb8aee1ecd6b8d4d34802354c96f1ca70508791baf4d5cdd1a1f788e2aec23ce281e497293c70d727be086072c446aebfdc812200aa2e5ca926a2085a188a0865a2084253144197288278892882df91441455ad4551413d7ad1f6485a19685ab2a3f3deabb877172ce0cc15b0488f28ea73a5014f0cd93acc5d0763836c490146a6b0ae88f7856ce1f780e8e6a9751957d84951d52bac431505336164427c8d2096c81245f19201304b06408a8260a496521a4551c619b5f91c4bb044924b4b242541dab145e3b84412e4e293b0f84b44128c29de25e2c457fa67a31f7a43748ea731c6198a07f5d508bdfbbdce0f04b2f6117812972047fd3d92e404c5d3ea426038ead65dc1a51a885d2a1c133f25fe31ffb80aff90b22592a8899f8cddddef043be65498ebf6440fb824fb88b91f9be4baf1681d13896e9815d124d7ed3d4aaded79791d134b0cfab3f180344c7717a1ea22c7cb8835136b043b34921df2908ff4f1ae18411d1bd12436723d8a3172477355258989c9d5b1cc25c6f398edf5d7e7312b72857ebbed083ff516288aa2c43d5c2ca6f8e5ba864bd82ffc6c6315096ab3963adecb74d077cb33c84c7d2609f2833cdf498260a145a63e4f7d4a88431da22edf437cd70f1d419d5607a247149cd6a95f16ee60e6c421ea02d121d8d5c816e6419d9e07f51a401cf15ee901a91e434e984c3d18fb5687b7eb87568ea04e4f318f3e8581c07a54c9dad1539f14773055ec288c4d4ce36593ac0bea8ba4fa957e652369259efa65bd0c878b854b5009ea57a926e21e2eb4f10b7dc5a52034b81ff48fa3a774d05fbf7055fdc294fa751dd42f981524ac5fd761fdc2a028cafad6bddef7c5baf5cefaf1a5dec22550c520ea5abf5e286a5ad7a90b57abaaacf742bdc2254aa3a8e5bbe31d920831654f7e4962c4c8f50151b758a1c0eab18aeeb61694df8925b2a0a22e4ae368851008e8517796962451a820f765147640043414810d5290821bb8cec24d1772dcb08430cce1075c11f2adb031bf2451100943956f88be703ed41436206ab4481e66ebf04944d275f81d91548f1dbe8948f21c1e8a48b287d9a146afddedf4be6cd71e3398e1a035bb9f6fafa19ffa0c97b6d7d7cf2dd5d0d7b8d4d0bfecc5ba0797b25bbf2fd755a38665599665599675e1ebbaaeebbaae8a31dcc2a2000214802461ae2b9c20c79a361aed9495723053a5b94ed68f1c6aaa68a8d30492234d1186668cfa7a54e577495dd9e7e31bd543dcd1a07027234f4abd67e389e621eeb60ce1ab035487f3d57d2f8889bb1bb97abdf185e0b35b6d4540087f61780bd30a7756771c4c1b8d76ca4a3998a9d25c5f9cac2f7ee4502e982a1aea3481e44853fc0286a6bfb87104cc59a8af060db555f546d6ab578f74bdfa7b07980183406981adaa79ddea892a1a49db8ceab2c2dd8edc513e66ee6664d93851c6d8f346d0cdf147982f43e9b18680958c2b69d0e73a40ff681a6044d049ed03c4527c96fe700619e50964837c0063ce48c98698269833a81f5434499580a22b67a8220d195baca0a85e0f67a03394928002600a56347972b49eb04057b876a0a853017de835820baac8b842cd49c9f2a4aa3eaa8a17180e88524c04588352ae909d64cc48999913198af6830aa5f5d04eeec5b7a601c56a7ba426b6cfbdb03d6343603d43f0b4a97a437840e0b19f1d0adacf073e14243d6e3bc9994f24df81b613264ee6233d4e43c199615178a0645aa49caa2ca54ba9dee8614650b1f94153f1800aad5ac88034946e32aa2ace2564d07c69019a89a20e80382b070080a6517d2000bc11e50000ea1bbd2c69137ad8f92177a01e36d043eeb0ea66250793b1f246b44354032b1875330327cf7823ac431998d1a309041fb498721fde013018843c86011ff2c43c5ed6e4cd0f2c2a39fe8777000d06a15de0070d1e205646aad3c81203f5685e468ea7215f557176f1db113f6247a69127e6113fb3ec204d4d5dc2243fc72562e4f928638c714e1923ee9e79c4cfcbaf18613b0469304c43a8854a1fe991acd35354d572b158a12882a7f75174062a468aa23ea485a3704dec86435892dfab7c363a7a784587b0110cb3307ae9eb64e487241e2cc540362bd457a8797885952b8477e6971d018b40fa0a2b8aabaaaaaaaaaa9e684691a432363a634723c0962c2c2cd98876f88780ec52b3b4ab629a6559966559d6755dd7755d57adb5d65a2b866118866118a4f10640595a2e8b524acda6e2505f8d257668a009d84208117376c81d4cece58d6c87dbb5552cfb869768028a2ccbb22ccbb2738fdb1e69d3a86a7bd7f31d8d2cf17ba24e46a6ef64e467a3a3b1dded89e8ab4b5ded564f94dd1d4bd4cb44358da1995ab0af0944303561084c726649128448b66ebd85058e5ec6e4413db258260b89651e3103c452bd62e940b963a1b73db22ee573cedec17cd5cf0c77f3d82fdc650cb03e5fbbeb39ea5d39c2e27161239f5bd801ef599665e18e5658880ec94722cf2f772c24db323faf9de968c2f4b217083d32cbb344d207b7dcc8e1f1783c1e8fc7734e1e146269d12e010ac04252c0bc505065786106c999a1cc1d29c5108bea4d50158527ae031651461965f5bacd4cc7390d9720a751c73a743d80c246ec6d872e8bfde428d44af694abfc653dac67b8c7cb760f2ed550df4ee11ef4187ef97cb07051c125c8a5e0eb82824b903bc1dbfddce7b1d5b56b9fa8fa565dbeaa7e35450392065a24ff9a68916c020f16d3776f47036d074b71f70ce59b88244a779270b991038a26609c1001099aa028289a807142042468622623020d88033d527529314a0bacb41d55fd139db1d7d71156bfd14a7a6429e95057dcc15c17844587fa16181d0215e9503f8cdc6937b931e88a27d8ce5292fbdd894dee6c29694b8905468f2a6c3b04b10e5171d8228c3364f8acc357d9fa02273e087b6acf667ab15cddcec2e9ac2e7243319940c9f1104493d2d609f5d560f2de7c7cefbd27ff229c263c63743a041f89d2f76a84da08b67b5ce43e11391cd0233a9ad5a8636252f41dca515249e5ce181d8297a78e50409388e5122a58f88ee2c8539d0d24f6a784dddc2211ec1372c6a06eb26bd97f59cacc886e20103a41bd3323da941b3be1c3e62064962d734340c2179227c8991133f763060199a93fd1b0e393da83c13ba8108201c3c8e9d07b5fe080389049875e378cdddddddd03486e0973774c9b3af4e0181d7a70a743ef75e8c535e4e4a61d7a91527bbd476a1a0a5a128b1cd05c3123afe8109de910d5a243d4aaf3baaeebbaf5d90348be2ec94587e8a943348b0e519b0ed186adf5a943f44db05d9f6832a5effa94e99b26df28b1cc993bd68e0ca34312f75fe764f9d24c9627209265cbdb594af2eb01a749ee9ce44eeeac29c7f7184f805818722377e48eb52365eaab51bbe7ea3d6a4124ca84780c77a06a2f4be1aeba3571b7234f232e292a5f25ad68859f9879462435c678db214ae2eed690d4fbf60092a7ec01f38c1068946e46634d0245916cd275699b603b0c43e9508e16c5832289e5f5c8c29da5b8a328b0c244c42c6cd4c2c21851b2ec98c8f210254b2c318b22258d264d9af8984fcce9457d353a899363ec2358f91b519a62f7ee3526b19dcc11633dc888c2364deeac4d8eef2c0291b34eb090a2f965d4cc2f93f3310a56609199689a2cf18a112d31089a264b89935f007a9011857d3739be834b706ef229bf432447fad4375049243d2e476727bf474855d8f041d831c69e9756aa8899fbb5e3ac2e9d34b0e7ac3a3e18a3d460df74085294a24094f6a89a73ce09845751534e5ca343546862a11a1da25e2facc2408f04e32bd8552535ebd472d5513a44e9ab23e2a785df21ea334078b0d69b0b16ead1f9923c455178457b76ec2b486caf6f9648da708d85fb86d26e76b15b5159136a850deb84109355462c3bd445cc1c3fb322b40c619d9874a2520f5294d422a46225e975610aebd00c906c0a21841008b6aa9a7a0025578c88593ee6880f9f28be4300e93d5167e5f8f09c73c653afcd4587e0a9eb5386140baaaa620d5e69c0cbf160400829b51604fa43a18e25bf9615233acb4b7b1df516fb761dd8b7ecf43ab253595dc77c7598ac7dbbd7e9b55e5dead2cbfb429daa2cbd305c45ff529dc225ea150655a7b4a214db96ebd270e92c216a3dbbd5b14bbd5e79ebcecbfb627de2d2cb70c8c6e685e1b20bc359d79cafe66c99734e962882a1288215c618638c319ebaa93c541a4925eab2a1ec4b67605b4a29a594344a29a594729bd7f2ec666488120f6b674a50ff519237c2668919d0990bf597bdb45282a2044dd44bd54bd66903913240e80c10acc80562db00fd5983395d600ed8a08e37a0cdb3d1368abc78369aabd4acc18576307195563416d42168511bd8cbba41bd7060e1b3f183423507b6a394880cc78d1c3ab0177836fa590fead00b0e1e29d12741ef8e289aafb007cc5f3c1bd52df5ecafc02f9e8dfe8aa47885ca67c362f4aed0e3eac1e82dc55b4f307a4b2b3d9c70847b5f3c1b0f0a4738fa2fb2f9a79357e0fc8d0841fd6cf4eb07a31785ab28d8bc30d337047c3650307a275753307a235755522c4a3cf9347c1e1519dae3b02854ac23948d92e58c3bb0f3d188ed505066765014c112767b880484f0c12c09edb46d83fa30c6d848680fb1b4643a1e77030bcf06f52ab58e04f93d1b7dedfed88e4b166b7db1d8149b5445adab6299b6d90ca3ae650aaf44259c382b3c1b31d2c0c6772f49bff683ad7522c82fe20c5618ff3a9ae70d8aa22d928d2b9533b0f11d6d2b620a24118abd21fa728ad0b3215fa98c25c535a40ac162b22018ed1146e5eb6bb96b7448de09398fc1ec3db0d8fb1352f152afd4c228fc698cb4de1524eab303895c76198b03923dc3355d112ff7a091e39f98396223f6d03e45ab9dc567777bbc2f59f6cee27164f7bc6af7f3cfe75a4d7c8d4b0a2e412e0505e52f274fc1a5ed278f763b761ff7aaacb6cc6ef9aa19f67a54e5e850856f1031033b5fabc6aa885512ab265659970822de10d8b3516115c52a0bab2eacaa5885615586552718ca3db99f0bf25c1b637c766f44513c00321ccf483d767f94aad53c96e2ea9e64af43b3ea1518d4a67f11eb1094734af90e411af1abd149807026bf77378457d20e412b5240a48a37847c36e0dfa79091628890982028d8b40c8bd7726c1cb3a8dd0fd4a1f71c55e945914b14517f87a1fc5c5555b59243f92196eefb6e72ed4c0951159e0d8ade5086afaa2ad8c5f3cb70c09c67e3d460fc4075d7ee1b5daae90bafc8d397ea159780341db820b00957035f7de295fefcf58b6adcc3c5a212371d388a7238ddad069955c7ae53cbb2aed323182e4138f34bca5a5de2dcc8c32e7aa404ee8824ebb2b04bebaeb8c05398512aa594d49452ae402f9e8d789b57fad026c323394a29a594524a49c9295f444a29a5cc894d0db9e62d7aaaaa2a7aea08654d0c8b549046265477dce0dc74a104ee88a4aadf774902abee8a0b7df58b3a56710cbdd53922d767092d1149363a48729f9ece4d0e171b6fa04c14cd14a1a1d4521a7bb6a152b0a50c41dcf8459ec2a58b93d8469748928f4fe2e21ee492a440260b20bf24553029414e26722521305c09e4e789ebcc459a283cb54962d06be22d8fc2965ee4e4feab828b0c8f24a9628cdc8739e8910d7d755989b72e57e0e72b8ac225a8c47c75baa51a887bb8581862680713476178042289a22af2eb5037c1f629f9bef5aedefd9eb80439176aadd414f1b20c22f637e0e986e258a8e4e5ec5822071ea12ea4b9d0268a906c61bb73fd50c39ce985577a14c552288aee8f1c51143f7f7030c3116985198ef7ac27ece2d98839f2097d19514058b7d7a32769f0aa6809c28b660134e1642abf24544c214a8173e3adc878215a1010f34e710a6bf34b42451272672d15473e960a2c300b44888a16e0c82550f306115454a16589bb8999a891a50c42c5903b546ca75634589718a8d5537c51e90d9c430a5bf34b3285148c705219d9a829b0a8738a2a3c1274a30916ab39c7a8b3faac261ab22e689485335b1383102f0ab18232c3de508c624121209ecc1272173a8d017b9e02d0b286944690b88b7806754901214bf9c34c44f74e373a045192c818c952fe6f083c6305b603452c448be0fbb274a8e69744060b99061414198f4404a591614c8165a20644c08d2130681162a915442aeccc2f890c91dcc9d82abf243242728792e16906102c74cb2f891473c8577e49a410237740c8a0e39cfd18633fce7838ebbc5dbc8c2b6cfd1e7e1d1a42d557b7c6c632156318969458c483ed80c814102c3dda4e5d881e69a79868a18e801e5da75e55d76e76513a545d5edba1aababda0165597cf558728c628cce39d7a8b9dfa786b8deeb6456b0183023b7a14b1f797e8517c9f891e5def6f57880bc46da11aee68ce2e4585b57e598b568c767f5cd4d03a5a41c6e395d1428137c4277be99175408f2a11af431df23ce28e256eb83b0a8e61542828ef94f7614c8f3a1f319f1ca547d65562cd89a4106dd971292a6cf79640d123edfd528fb23755b90cdc3d1d959b725f3a148f7293e850fcc9a54087e23f77c7b311efb9447428dede1b1d8adfae76b38b450c5fb585685181940aeaabd1dd7abc16769d56a71dcd7d38071c1c9cdc41d318d0044dd08483f3ae7a8a0a5bdd7a875154587aeb34922a8d2050150a75345fb86bc9d1ba980f79ba427d5c647a09b9c8dd6312df60abd3778fc95bf296e4f88e89c7459e58de1049622386655996257b26cb7aa64fb44928af2e7b84bdaa7027dfc12c72a570e723b615326d45cf9c60cbb4153d433591d73327eb42996855f9c30cc7356fc4f3fa97e938a19f8bb5a8bae756afd1230a57463e9fd7c8099639f739cab52d9ac7e285a92bcf450ee59744085864213011c217d9068c0c80fc9204c109b9466ce640d2442cba08cc14ee2b3a54bd657a4484c23dd3a1aabeeb9979aa620aa39cc29df69377d9dfe7d43d94e43975147aca47ccd6fbf69efb5ab4fde4be16d9ce47dc70e74366ebf31dd5b00f992bec3e62aeb0377ef032579807862be943e67ae92366f857ff70076dda0a78000bf3a8af2ae6013f73357105715bd157e40a63aaad80415ca10e8172756ab22c91359025cc430d50ee96c82000658979500cb03df23cbe52b7faf53a2ff5cf756987a8d700658a01d6a9ebc257173e5a1708cfa551145128b5b6a3b967da0aad3d4178187549f5a9370f0ad390176cbfc372a43962f9d9f990191e3e4227485983490d1c08218415eda8152a6ac6e9451d2a948d13df4ae23ba747efa493458e6f317a74e5f8de19a349938b6f26549698caf05d24be69e2fb488fe012727cdb1cc9f19d458f24921f68d124cac59c393a3b4b8ae478c8a44d1dd344a4cc500255c0210a2a2081074488021797c801112b88a0e40c353de022dce2140429b8e851df4cd14593b62f62ccf04dc443110f4d3d2a408e87324c723c24d22399e3e14c8f5e922098723cbca24915170fb1e83ed102086538e1c8c4e87009f8020cac90440554900217b8f81c3d825ae478179d1cffd2234f8e4fa20e399e024d8a5cbc06aa1031c683be18d91c8110468eaf018417b613029aaa903df925a9d1825601042e804084f82a22723800d4a158052bf34b528324774220a0260b895bac603b214242bc8cbb1999d610a16f0b9067d4b0a2a6267721254061a925b3e7d6205183f3dc5e19c8952ac0796ea20836e93518197e89089764084d32ca9f5a58724e4a903c9c0c7344113c9d89d4826e422e0feac01c18c6cd0d8e92fc9e448e0e7ca077c3f26e8e448804774fe714f25cc8419a22712605f91dca44dcb54c863da23eaa646738e6ed9ee73b942cbb1959a2e43823c777f6d6b32b230a2d7bcdb4ed62db7d59cb7104f6ac9bbf7e23d64badebb6a95f4671c77408429d2882afae8c282c057b8c251d82a7a82f3a040f95bc39bfc05049b66538ca136d352b46bce784fc0e935f8d4a9f2d49297abd7a0fcfe89075eb947c87e249e611adf75e6538de753b1fb3aae092fa2e461ef1f051d814454fbe07a4280a4749ce8d8c518851b0f0ef36484ef0488ca7cfb2b394ea9ec9efd7bb15214d7e87324ff41e3bf9c652c6cb431e1243418c0ebd57da51893b2a5132cc28999a22bf5fb8a356144ff430c490095e3142762b134391ad4e460c93edd55b0cea13d9cf873b299f258dcc4356b8a3fd7a24fb99823d86fade48ca470abbfe1b49193b36697280e6e104ccef46bf532358487d7456408c02769493aaa875550ccbb20cc7bc0c43c3e4293be58eca239164cd489948a239d22647cee4e4e888117522899e280d0549935d72da01e558253438d426b72922e928539489a49993136772725a2792e6e92692264d14f54f3ba7134de3d0d03cd29451f29edd3f517c1f8924a9d33291244f48746c40341dca31894c55b76662b5662e6bc6c2d60cdc41af45a4438da525834d6cc55831b98f5d99c5134d2db8c834272727277716799ea08beb743a9de4152710c3a2349486d2509a38468908a5266aa2266a8a5f947e509972f58e32c5521739143573a89943cd1c98459e40ba9827294fa713bc0288189266d24c9a4933069138657acac829f3bec8f3073a910402499d77ba7113492090bcf98e5b36579f4c51dfe372449245bade7fef58f2ab1ba845b32c194669b5163ffcbadfe47e27308ee4865c69035c0dae7fd9eff1fd264f2439be509e49e478289a130a9a3913d5320d55eb306953cbf40c3a06bd82fcde53bc9d1ec5317a2497f4a8cac95ddc9960bc21a89bdc81a030c9f421189e193264437e4f2292289b96b9037a3b1d28831e0ea84856c49c994526cd3c2277e492699a32122792281b1ba9c446e6d8489b48a26666249219799a9137b92f672269eec82292461ec9fd6913772269e2cc9b799a4870e20e4edcc1893bb33b765314056900840c51c2299e0d792a80cc81b2b1b1a1e0145902a143bf3474e3e0e0e07457d8d4296267dedb14491372ef7f8760c09c48f2fc1deabc21f0f086b8feea00df90df611a1ee94588f30554024fb96b1b0ae6442459eb7853796e45a449948e4e2ca243a37384a26c6c96d8445394c9fdc689248a2ab139d48c4eee471cecfdb689a409d2b1d8bba80404b2b69364ca840aabe216b6ab648ea091eb614e6fad6518e660b4cef97a5d98dfb361d1392b9948aaaee8ea8adc954ceebf2b2212aa22151654754575054551541e5050510fa8e105541a604049e10894680239c22792a72c1250991194ca707021a14e0e120b4fe9e8e8e8e4fe8e5c5513674e9cf7e640458e28b9a2f0059e0df947061ae47848d95036940d6593fb8d01a606d40c0864ed4cee97048609cfd4e7ce3c0864ed9b3bb92f853b0be4f89b2dec4552e45ed4deb321612a1aad039086254cbc72045443d334cd12e48edc79c312623c7cc753549431c2092115eaeb513442c2179a70cef93288e1a4e4eb942de1fc8d963d92301fa9af4607a2c9fd2a99f4288c1ea91c5eeaf428e5f0528c1ea11c5eeef4e8e4f0728c1e7d0e2f97f4c873f869ea913dfc8ce9d13cc492c943b197190e0ac2785b6b356d9cf373e2f17c3c297f190e95dfe8ba1dc28d42082184311e6e11c22799a85cfa946b1de55e3fb9d83fb7de73ab5357bbbddbe78d5227f7bb933ada63ac6e758c31c6481f610533c5466460997332fe641891f11a6fd747b0b1e2b0c0e8ac9cdc97714fb2b82748b67b928556840d6adad69aa6b5a6c56ddb342d3bc9a243fdea9e20e910864f6c8660e32b8cd5e10b429672689e20c7cf1c3386dd07c511317c36aa5b4a029ecea8a4ea590aa31a654cd1cc00000000d315002028140c0785a2d160a0c8d13e14000d80a84258529e8a83490e83308a31c618620831000000880100190568b5022458f74112f0a044d7ae51e8f0d379e078baabf9edc651b77742d83c5f753cefc7a9e5b99e75cb4606a7652427ae4fc849aea7692caa514392aae90a7c8f5083115e41564fa3f7c902e56aa1a2570664b2c8fe1c8800ae2652249e253bb14e3134e1ecf9bf53c9c366bb4563628aa71e2f8510de9844c145da383f200f902242ef35b5bfc94a2617846fa4a347ccdd82209dd9199371897edef444b3ea3736ae203e5d916395a86c8d56b1a3d057273a9155581cd6c222b5979c2b84e3b26d625f40ab4b777f7d78f61cd1f5faf2f6565bcbdcd72936d1b6ac1835a16371d47263530a1107c125118c7dbcd882d23fa2bff4cff53be46a41f9bed2d43e9744caad06778f2bf0999c183e4a259d1693230a22575a51fc89f4930321ce484afa81880abca21c58aa449d9d93f460220187343a97506a092c88d35d930f7e71c37568f88c0800d3cda144d253984f370bacab211e534341aca2be0c4871623a405eed08ae29292f47c0a14510c321931aaeb0ce1001ddc81945f05f1114cf33477f4d7762b9e4e7cf36c67f81860e0e4202bfa5ead933c35d5a8d69ee3a9284db04cf0cc20f93bb3abbe3e5e0c5c8c0b420b13993f8105f0844f92dde0af981e1ffd40aa14ddd51ca302cd5c1c020f321de6da4f317156c9b760c28bb8188a6b74ed0821fe03065e3c63378038d57a1948adf45c71c522145d5258704e51924904e3ee43182e120f4e95a108386400550d3061cb0c35a265911acba93e42bac005f3334b832853be6397c1b59ac2d1a1fdd527152d7b9f8c312881b8a3b067bc7edb2fd60b2533158055ad6e3084a01e40d8b6d364c313c88bec71bea235362fba6ec8f724c162a61879306875dcb1770aef9ce43b170638320f39a70a96ee350a20f8d27ba2ae3d18f964274ae645d6b10e66a1c02e44f942bd789691c5c02ec45ed620cf0194ba1a331236a7aabee36c6ff920e55b80723f492bdf8a5b1b30911db25da40fc8792b506d273bd372a1e1f51bc7c9912fc80bda06ca2881ab02cc56070f39f8629b4b276b26b8984341a52090b7ed2c8975e4e8cbfe65760fa01bea7784005cf497cc18698bdf478636086b73ebfb2ccc5e47d1e797c3be0bb87d30dc9c24c927876707928e377fdca26efb0ec489d05bfa3bd551861142597963cefc3f4051317d6d673a08c970c7424a3d080514b8f9581473e311c348727a0faa25eba4912e8e280141941cf6e7ec97ac7d70927cb784ea8a3165c27104a11552f6be630024178491c36ba053d0f28c445d0f6b4f7784462b8f527d196ae78376b2d717b6e77c020544011e9c85858686b4e6a37c637268c4b5bda3daa52a7b29692ff432b4da42eb4650ca1289c309ca468907dac8da09a8e5450976af84b3b2f51149310b9116e553005a2a1752cdd3376b458e2906bc5f7f48684f229c28cf7d0ae1e9fb1729261f16dc35278a6bfa001b5a71d8bfb0dc0df4cbd7c2097b0170ec5386b8202bb5105e3a8b47b00c539b8e1f0b91b29c44f4267f6a42dba43aa919cbfdbb6c4da16eda0c39e987f463f167ac3ee0a3d7c9b699f8f21c626c2e8571e68042e6b73923a865ae154fbd267a7604bed197f47ffdb25855fa21f8837b531c3aebf9eaa61e90fa4e313636a91d2c9d03ebb16e9afdd5589212d469fe31902e61dacc97836d9dc25b9cd089f3bb20fe79a1f1889845a42a0dfc015837293d3daf59caced96eae0dd231cdb7bb6db998280251d95762a765ee9cfc7152c893904ba20915aebf5dddbf6b37c8f7de8938e7d5816bdd8edb44fc0c4e0b2cd9733ca4cd498ca1072eed0b6e6143d6acd41bd226c995a72e1314374b119ba3f5d7d3bc20b4cf9fe585e66c6daddced820c6f4bfcfea275265722eb47ed0f739aefba0dec839dd4e9dcf834611be52b186dd47fae8ceb2ca450da09d2f9b56375e938e2da0725083bed33643c718bc85a9dd8349cdc292553a85042658bc70b5e37c0e1e63a1b5c3fff4ec44756aaaa6c6ab16d1c4940928ae2c101b5113c91d5836fae2942670bb7f13d4d6412be46c431dd064950a822228e2ea36ac70cefae0e3d002228a4a1c2c43c6fdb4277e86c16b9c387e79f6f5df8c64b8e9ffd0403d0a3b2cfd85da1dbc37ab8d970816651872e43db9e091bb15a44843fe23f709daf238df4b0be5b1960465e09084aec2bbd615f4458f9e2aee2792e68d5282313091c776d1180f26ac132eaef029013a4560f8ac13423acd197c57ec106ffa35f1b316f96dcdc813f03dbf4f4a22cfe848c46a7bb44eb837817e8ad8a606bca432e9baa4180fd6b13a39fb44f340ab9d94416dbfefb765eaba0ecc88fc5ef0a5593154382327ced2d5eaaba93c6522c0ff26dd18771f8c3eddeac0e7e9575ab0fe8fa50a30ee613f9b722e6d72ec52011b3cbc3ed31970875d3b249440a16a080af3c3abf11df3c48b5e3da59e9b87fe8146f2569810b7fe269cf22a01584632081d9d937e2b71f6e4a2d12110e2e5f86902686e6a4004ccd80f573370c94b1f2d304bc621e9284cacb8e687d30752fa8ab22344788e7c85288a50d0f370c818db48ed32b5e1b4f1550ec20a3adf46252aed9c747b6d7b58cd8a6aa8b0840455cf76ea0a3566dd144358ac18fd5c08f99863f93f102a612a6eadac1a28d9289af3463142109e3558daedc424990014868f7aaba8c4563737b3f1baef2d16e55a843995d014efa458c59d1f89b7f25e520b4d14a3854228b95fafa0f787b4e4c754a4ccb05691322a285f1cc52a51520e7aac08999c3bb508d12d6f19e21ec10c1da5fce6da32c772713b11994fe5e4990e7bf03c6b3b97959d7f3b5918670daaf5c84533414a50f0aa03da46f54ad9312da1f7db997e1dc0a670f69861d8c015c5572335f1803730b9320e56603a01a1a8cebc275ac912ddbe85693cffa44b69479709a039402d3f09346f4170f0444ad733e0b5ad8d482b8550e6e2847ba2516ad351e5bf7422d124249352909a1a00f444a0adf59ebb79a26a4b5ba54d174188251e0db72191f2b12d158d62f24dd8c4ad4be74c614c0b04050536a1c5acb9454ba5b49ab603740501379fb9e37688cc05a5517148880bbfcb92de16d79d09d45a5550f5465cd9c10a03156f4d266ffc4daa9d80dc540dba8fbd0ff5845d20a5998483b94e8d3775ebad4ad546bbcab7c8f62200bbb7bd464108a28e45343bc07d4879da917d43b823b3348d7c44ecae5ef021d3e75779d83bd6695fe37c10f79f45b47cd2d2415b73e1c1510e7cdbf59d18e3740c8225105838a175476ae600e1e58d38d19251c4ce98e6f93c526bb50ce4be75684ac00107cc94804215b40557f45ffb5f7f1b823877a1b3336904ffd1d54e833d826fc71a4c0bf41a4adff71a2ef88e13f7610a3cc106f7aa2e7b88f02265b50911352dc2fb98a89a3e12488ba548ff0ff03b55c4a14ebd3d3ec02988feeb907e7eb924af56deb7f9a25e308006d3bcc88a13ec6cf1a452bfc30d7f22de036a1011ccde554e4a0e885a37a37b684368038a05397bcc200119407d0fcfb1c3b55ce9d0ffc7969b953b5927518772fed0fb138bd11db077ce801fd12f4a6f2838902753f059ef2409891c4bf969420a1ec659ae3709837f1318f29111906ba6ce6a046319da74e87e585d7aa7f0a80996d635085d7e3717a09d6b684d70b96ebed50a9a746cecafcdb2e43add2f501ccbf209034878a248d3e9fa28293106932f34a2ae6e68d779088eeabbed1c60144a625a9c0f13f314125889979d05fb48d5ed70e0c2c52917476e5cb807d702f22371d6ad0db97d936efb93f01f054487acced6caa6a31a35ca13b6f3e8c6feeb29d3e9aee07d9f01063fbb906345889947a8452fa0fe1bbe6560113bf0d3929791352fd8613747285932e276039c0308012435dc94c2de238d7514fce4c1809d23931449ac94991315f933495b12ab56736a8c319cd5d18746c14fadc28b4183922df83dd2ace623cb344d3c5c1700cad83e34565d11c3ec3a143f3304a3ae7968f01822f324a4028f766caca7ea9547cff22004427dbd2ef5e07d6d3356e68604089aa4141aa37d9027f27c0c677bf3b942c4a34cdd1a8cc0fb20382bbfa6308b9a7567f6e78bcf38c0251afb89e9e4e610905334500a8fe9e794dbc3c531b9f41a6bfa1a2be1a5ae2a666d4c40ab4140a9b6d67ab630e5c4ca137a50a9e75c16e98b498934ec6d9a154293435a999855f6d0eea67b7fa04c93f713ed58bf869e967f1581fccef565a9050ba3a7fa04aedf808d94f495430772588a3a5fb6d7d70e78f0b82c8a001ed09cdfee62ce20069ecb58dd7622b78b55eaf8c0c7ab2039d08ace503d0340098476580bc2ec1e6791bf7a6ef563412e4e87be094449584aed0810be0b47c9235cd4d26bbcf8c8831affa2beae38c3b09f25c70ada235486cf9ecbe8d010ee54031f30bd1b2edf2f3a57d8f30898257b81c596b911998dc8335575be7426862e68e107816d3833321fc9adf1411dc87962a232cbfd93963bce9c31e4801c8e7a25312818f29c67638a515b1553006614e6e0cf9619601fdaa267f650d39c7703049046e0125dd6d9628a680d0e148e78c754f21aa35a0234a47e85ba8561fcc788ca12d5a58a46bc0672e4fdf0fd722ecde3ec27d7a751c84190e4152c322b9aa8b0948af1a98dfe87c1abd8477e53e58d6f3e78942c1fb1f5f9b56a0497af011239612833ba3e22e4145b1d52f2d626da17aa91b026e7d4e0cd5f9222ba27fc8b4d3e2fb6b98bfcd8659d19547ed01334960d92b9fb1dedd54cc4168f8a821c1db24099ea1f35b09025f6148439531895e0b0bffa6797dceae9715b85e4c737783bf4f34f9514fd642bbff1bc7e8de80161808b0dc430b096a39634b3e7b56166a567ba38fb7259f1d621ed1f2a22536fc92d55b7eca678ffa7ac6f4c7e1c8e481df4bd8c881d2f23578a06bf2fd73e79a8f902ebe597ef2541bb85d492b724a0d97247c923d37ee6a34c924ea58a0da832db66466431b4c1c00e33ae1e44dd5d8b53549036688b4a35a4da9508d078d962342b0d2a6c08113dfe84722c2f20e05e81f6506484bad26002a9684b00c3c2025b0a178755ae6b39df594d65010b0e88895404c34f6b986d4015bb07e8590baa4da599233b225f3daf17ae1fb8dc896a4be3a4e582ece0667bcae8d80ee083a3088c8a029c8b4ab19eed6153dd3bf144d7234fc57b41a555af32098637cd0514fa7ea54d931e1bb79adf72b81726f92cd143ab5fce098ff90c371ca49713272bb93ce6e8b6c22e922ae07ab6e3d062ec2537f50c9b07ce0d7025f87e9e981ec830e22897a03a002e3dbfd4a4fa0933c0d62d3bd862b0e200bd59b31b855512df287e23165f6800a92ba8478805906e01abb0d0a30c2bd7401078bb054465e70cc38a4de6dd97454d698e1fb0b37def9cd556c8c01127831b8c86e72f92ab7a8df3cd337932c57cd36f48a7a85c02f9a9c394f830f861f2c87f8ab5f689f6d8eaf44bdc954409702e4ef58c01da2a87c443544b0ae0f2d0537750c2685bc8eb8735a7e2d752795d16692c2ef42b343d8aad9877085ad63318922a70092ed9404a9c0e016aaebb6e860b9da528a64cff62ac076995be20c56f511c67d075ac0639c199c10c3d31f315b08e6f075ac78fac21cae4ce22dfb56f948d9b9427c6b1c8227fba22ab03d148f981147c43bc3011799b57d96e342aff8e83a7f17c50ac35d602850ffeabd4ca342762a7309bdd720d60657ac60c6253c5afb949eec6dc311e8f3c44b7784b3c79ca5c44693a27b9eb28dc60013ee69008ef7c3b28e3080477f988277dd27f826bf1f6d7fa01e0e521b2577efa286c2c2c2999843d631227a59522cf818e26d5816fb0c9aa56c6eeedf180f1c548e1c4021e6451cf4b6f724e96276d81c5fcffba477a99448a9cfba7d17a878f08c510005f4edec2e9583fd38a920d087987153bba46a9cb2f78bb3b9f005070ceb06008ec795fcec314ef66a0b9fbf5a70df2cf525245043e9a09fb608c2eb319a472c822d63d40f75a6167b5c9bc715238e713d9aebfdac5762e2ecbee6ed54ab83a5d96a370508a6b7952e452a4f94af60818b2891ca8aa7a6cf384f05a85e4884f9216b913803bc44ad872610ff313a3ac7b63323ebc273efac863eb5423caef5c16bf9acf1b5dad4a318c698f109efde67eee8272dfc0945ab35c81c8d47f05965c634e7849920228bab3d86c7a35650f9ae58cf4eaef657f809ea7a6da1cdc6e61cc0b00486e2bb5216e0334085e166c4ae063e555515d143b96209b94538038eeb1d9b90873986cadbab38c5ae98277d30c353e044837f8c609cb32a533e37b678232f41a02cc512e886083de828bff15e3a1122734143b7f1c80bb24efaebb6244579b77bccaed3d74dde22736cdb352c57c392c6b5fcdf3f7ad66763bf9850201cbd46d8b1aaf76156c2b6809bbba6fa92dd61d316883258fbc3f44c788178de4c6f8dd6c10dbcb082a7747d0f0ee99bb205e8a35427a77efda15687aecdb3d6040a67dbe6e503fcf41580b261c4fc9b0f861cc57ee080fda8e039c3226ba27bae3015c00e91244d5ded9e9e8e97dc76158605797a7fb811246df06ce2b4c4511d13a972221439a70fe25fa429bf011bce0c2e7063210e1678cae26f804ebf810f8de2ce03e6edfbbd9f929b3c00e1830153d413757163829b15c03f2c87fb4606f12c2e1aab43abd6391a6e16e3b0a2a412f628dc85bc7814ac0aeb0022b26386a6fe8e96ba7f9f23212c6966a989623ed8eeb16f4e911bc3295cab4c447e5435285c8139d5a151d79d62e3d1d85109d6ac9bc8a2b55817106bd7955befe6ce9f4129ad46ed4308ae431836b7f8de4adab2d438331da7da4055ad08020d432c45733861cc2e23ac32842747657cbf7c9e70a1b0e376f9220daf03d057adccd7b314f57ccf52a2c9b35510c451919ff284505219af925a5409236c26373d5ab062e8687f5aaffba01ccffba184f03752920c5d9bfae593135025f3755408be247f02371587ade97b141f2f4012cd6659d4e53b75b9f4731b12ad290514ab1ab81c6894f684b534dd328b9879ecb2e0b2d7b214a2fe7518908a837a95d3a64626cc922fd52c81a5d32cbd603d26a94b5e96c1e861f2b67070f1e39b758415ef70a030c10c3be399936f3ba6d0521d208dfbb2ebc21a65d41a5bbdb848d104203ad22fc9da5e8b46731dc2764856850d6862093cf0b568504b471d298399814e785cf64798c92d0eea7ed7e9e5b4a3d06082c4aed290824dad6c737d820fcf22db8c9cd06d50f762cfec273297ffa24b10b6b1f27115d838d7ee6b17ee93c04395f7529e90936e2e85aedf75befb9d16f2348df863bd1c2ebc269400248a67b49b484f29d7286cfe9ef6725ac2909ca194bb005e0adebc905b8a329fe62a534eee910b417f0cdb6395ca30f8b3d6c1a44033e7b8bd033bc0e02b750c2f43577e54c4bae386e5f48da160d4ea936b00f7cbce560b5e1982858770220403d17c84ded4e2edfb5641ea2ca6e1198e426ec6dbf27020197756a0a6fa7cbed0df07455624102d4476b2beb3d305f6b826e22a195b1bc4422f535e5e1fa802eaef437a80ac4aa5af22b3a8a28c1dfa63d30f3f5fc3d8a2f85c51c86470a46bfff46bf5970c89bb53c4deaf5b693510c54343828f36237cda6bdd816b74f8394de0c83049073807494289db49116cc2086caf8b4b205036c304f59834b02fe84cbae5cb7b3688a3dea8b01d5922774582f5ab1793e6e93707a42376add5e66985b80902d4c2a62153783e871626f88ba989dabe3490b4a39497298621dd1ba4fb224b8cc4f742a6cdf47f8681f019bc6558598f7bb7241e67417955e81370789ae94e2bbba68e629bb042a16598cce336abea69cbbaca178cf26b627db9d0013c51971c4b7b8f01f256c9e70a527d3aca3b40fe3845bfb31a2e28a7161512a3a650c922c54e2ec476019d25fc86cda2df9e5d0289afe168df9f45fcd57f382fa86f12cc026b1936a471f83b8c1cbd8efc7cd00ff9e98d883b07eded658dadaa1cd0161ea9ae086e75c95fa0d8f306feb239d8e7fd630c413ec2ea242bed4a2b477cb78d7c3f6e52ec5144ecd696aede533e1d8aa5ea53273810c60f655b5f94e109bcc160679275af62440545d45d927c482f94aa204ccb2b5b4c5659c96166d84f1a3bc2f07647a90da218f34e0aa1951dc8e6a01b3264fb233f2b7808945715df7624758ded87a517b9f3afe38c9a1c733463c7de00daf5a1315a7e9b88d073717ebf92bd996f2c014766f9878a7d4466df12b8f4dfeebfd510ee340496f3ab750dff191bf8580e409d46382dd98073ee384a7e80645b120b2fa6234e1bba5ef6959a3052c7fa21bffeac3dd735cf4228b634c3117cd0085a2551907d46b125ad100a8bb56b85d42bcd696453996323f128bf3d84a03530a549f2e91b301ad64ee6b674faad563fe5f17f204cf821d782f55b608c2cb00c665855702946875501fc3502abd0a46fe035826b022372a11725e0a641dbc20f2b064dc87379062f94089d72bbaff3701c9b95815497a2d1081cb071a4bf50c424824dd109e4475636948c7c53cd70c9a8b5177d443c01e50ee9a4aa370b68e6e025824cfc182862958c4921e81003b3ba882298f78f29708fabce708bbae53e6df77caaf4ac78239a95536e79b1daa983059082fad2320f2bffa03209553dbe64b5f3b941869095fd2ef2cf572c0324003efc88b32c1d79afe6ddee3d837f4f56d2a247cf0a71e15fd5f66c1c805373be46138d043ab11ec132e7c9125bc853a775f04a96a77688804a677b1475b7b37c184b6795313398fa8493ee25ce2cb49a34eb618faa9ed964c79cd74286dc7e362b20c2118c05c77cc75e0ea21cb55675e67599185002bae337164f6a184b55de7f8a5dc9190983bb653a2b5c138bc904b99f3c75b473c2c1a4c423a2f266f8fc87e7e10053dc3304f038ac17d9652848d92f05adcd03f26c205a893453f57e6547dda573ccb43789c0ed85e15751a76c44356ae4dcf5b0901433ece01bbe0205ca54f27bb269046cb6287fc468e3b35f02b4ad8e09cc0cf517c8d3455699a1a047b2233f23219b8e1b470cadcde86068552e848df101cc71173b73d7de046641dd6bce3610193fe0667839e47aabc73644d193982d30f38b013441ec5af84d414f52025a5085498e05d194d3128124986d1935b9646e260b6f99b8906f4c0b040bb524f8243ebfd93028ad002da4e5a320606fc1fcc09609a7756d102b4ea27064a2da8084709829817d48735184aef70458bbdc0f469cacdeeb2eff9ea3c582cd908e14833d23bdfae438ffd55b96e8f8cd3bdaa580eff1256a15c217e7f65f988bb903d6de4cdfa6f51109098431ddeca9d9bd1c937526f3c0553d2239eb1ff6e4228d9b8339eafcd67d5939f213737520496ada88dc8b56e40658878489f7e50579179adc9eec4c43775f77da940a886d5d101a52768bad7faa16eef688c806c58493456b4a33c6783d6327add05ed568eb639eed2e804a1e1424f218e341b39ada3ed77c57c16c7948243b54c56709141cd5ca442227e23f49074075d3c6b75073dc40d83c0ce81ad7f69a3a2ca680fb46de08481b515a63158a6fefeddcb510a3738b2a7ec700865045c29d229fe9b6bb4f011bf298751bec1ecaf3a681ecd68030a7525411e4c3b3c6db01b9692aedc42d57e47baab4a1230f4c229d7f0c03977e9872c452489ef4fe4f9729e1a574458a861d57c23704504e5fd55fd9481719f8850d9b391d8916320c061c29312d98f61dbdd23802cbee9390d420dc692d2a875240c2de9034baa3371b2a2ace6239e79130e2655e1f51ed90f917fd53f01d167c62d01c938d388477e3ae32ca267da1715fdf815e5e758a058255bec85bf7869e1238e9430b89f9585baae06defd6796675130de88b99b3df0a11a424ee0f27a12e3d610816cbf804cc589245e842e1c5a2f85afa6e278baf55af34207c120f96b7c9efb3d20d98d4b2eef1327ff237216904b4bf037e1d5ac8e7c222d72a2660ceb37c205032addf5829330889607b86661cc0653b470a794f9816243eb61286cdbab4c784a28698ec74b3b2512a31be10e20722f988ca3fa8f1fac96e35a8a87eb398f4827b34c1e5f9bba2bbb97fa6bbc7dfba265da8b3256a2163a01ea9802a9cb328cfed656302948387005b71c182eb19bd0c135723715139c5da481b80818f52bc670a009dd85ff6def5113c1f0fdb50fa12bb8dda6a4e82231b330a4fec18afce74456f5a5035be8274ee0b29955c62f5fd23afb7d1fb8d3222307a71e41b68475aea9ee6439805c3eda5e927487cb03f9b4d3abe97d0677f77e115ba2939146e9b9f5f91f7bf976de1b3023fe7ba44e384601611704b129ad5fb68f54831272b5a810a05c9707180e54082d776c3c8a302b1f46723d8c2c6c5ab81ea035bbd2bb8eff0b0b4c8c1662086be205d96f08a45cc8ec0f9ce5a4f1ebfb1ab7ee3bc523a804dd6ac2468a0b8d39b71a7d9d7d4150b86bcfe63d1b227bbf6ee846454f672daa3e55e8ee860361838e301b8e8490ad46b68f1007b28025115421c3cab0b415386ff2de2682b5953b1ed28867cb31e27bcbefbfbbbb81627eb940429566f08ac0ae0f05324fd817d5bd69652b7e5549aeedec2356129435fd6858ee155a467e84494b84c6f9188b39a65a2f00b0209446fca13982879ad094ddf8aa7d117c860a366f80b6d2c2e80366a32848d61983bfb0de67b195967857db250d427e497b59524009b06553a6128ad915d95a5e42c37a3158a5488de93a481ebbb40a6b35a311e1daa690608ed8b4fdd6539760488fa0ab96f3043928c914c41eff8445c661198273babd9a8a3afe2a402130841538da2380a90674fc008aa2d11e59c49ec19ec66f7c157eda3709cb4ca9a410fea896a5fe07eae945d4a3e2d6d147c2125f32e1efd7a355268faf2d7cb2231d5b1accfa45263aef0926e400b47555331057c826c715cff8c4c43c5526c34eb2e772aca6fb292426fc8d9491a3c4b6feb29be23afb3e5eab7cc374f802a2fed84ede8f84d2679cc6791dad37d076c866c7375e00b86a84e7596d9f6792043d03a059199bf66f4ba2febaa606610dc52c8294922c2b99e0fa96db2f02230e261dbf875c9652aeb1318bda0363fb6873ab18a61e3fd65dea3e058e0c8092dd7b05080977fd204aeda28137f623a6b40d87685870f116a46e309227b431d22d9d3dd8fbaf24e681c94532f955a60525132d09ac7cfe60f4fc1b548dbaf83ae7da06dd4dd1dbe26cda4b5455baee1d3428ef99b054f6ac232112b7938e11e07811e438731b61c5bf1d4a90b051fac29a7cdc12280c96efdf0963c44ee1d48c304f83d1aab00703c05102a4527a0d1acaed4b78298b20eb8eeed711940f4bf2c0422d77ba628c49170741790e4f5518502aa54a02320aac90a3e131f864d220b3255a8298e01ac2e92af86466afaf83df579f2b04c16f3a638dd6f4b77c6d6de2708742ef58c1279264bec7904735aee400bfed01e1e2e7f71267d57bd72557c359c15b260297d092bcd3a06cb450d50415a2bf6e2db1d53c20100f13b4974225801b42d2b0627b5e1850feac9d4c7e3894f206140a5ed7b972f9ff1afd3c6961cf43119c8869bdff3bf6a5dc402569538ead65b3f1791dbbed1d2e7de06db8e9f2cf32a5ac2fcdb9a4223d72da095f79657e39982ab028c6b592ab260173d4a2f33bad8e1edcbaa7e2b2d438aaf49b1d498418312c01114e227497af32a75c8326bf1a2575c3c04e22e2aa4d4440aad21960a559d033bd52f86dcc8cef8f429c2bb2dfa62d28af1e2180e78d96e8a451bf7681ade02256c54b22bfc62d369f118f535eaf054d4009ce47a49f1bfb3126f702bfb27c93e59d3b9bfc000ba5e0cac72c12069943feab96cc27b263f94370921e3ea0d925b0272923dc77199dee7912cf97985f88ea9a61f6c1edca358c7e187c1c82ba3a7edb5f024a34521aecb046ee599590f644bad52de3091cdd4ad76d880db46cab10e770cd5d101fc8aa5af38b995935bb8070640f3c1a021c70434ede1595e56fd3bea66ec2b3ec0b5ef359a8cabfe520da975f22bdd7fef6b5f8b10f323ea229c8b9835a8bfbc92ce41c936b12af8de1b5a5e9cf1f9cb076ca8c5797c00fc591100a1ce89fc2e84e806a04c5aad2bc1f54974c6a946641f9686e26f96d150333a46dc3e2b26a52ae3b82b729ab70d933e79d4e7673aafb26490d85d16c6ddc378f3f5f06bcf8b4f72b65a8a2becbba7811d9bf5e4e7b45ec10974f54ee22fbc3baca3aed289334f6ae7aa84a349b3082b5266900296fa6d9eb8482329a959e80cfb2462b993705e69c99fe1b1b387661e11ed5362cc17db6c6fb52f808f7a5623e7c414f48818196c039796371945895e3afa2237212cfdf07dbd9cda1ec6346433bc863ad977001b9e1a74eb9ee5df722e268abdeddd176753c390fabf3354da5ac4a5200deee9372f88eac096be7ad19f720d6d3f8f599a8983e5daaaa929522dd387805b6f27cc864fb04dabc967f9b72061fb608c2e1db4f83b20c48586ea44ae2d86c5ed542f060681dae9436fecfebfa90eed5f2da90e90e2cd10eca7a1ec66a18239e4bea95a7b23d3362b06fff00b9b9743321ac4a893be1b365a921051eb9021782be2f374aaf06700ed620c28232a40c58636659bb8f34354fc332d531f62f85465f1c883312634caf2ee4a54c8b5a57a19ff118c88c61f2acef47105f0347202fbbd0c0f6a9962c63cbb164bbb083903e04ba4150693726690381b78cb8e55d8387367a8e487fec75be83c928ac97cd5a7e23bbfc6f6ed58468ca234c10af58b4d02cb3553eb5d683452ef680dff056202d1cbf1d7d8431e28479013742f273630aedb27c9f37e565a95ab957ab1139042892133df133e291f038499e6bd5995b89a221525e24f274ccf4d095c8faa456753e9d9721deeefe813998a177ff186df303412ba87e2de19b5b5abefa84ce6e2fc31059606566d5ea226293461629a314454640ef3ac202cf39a1e93b04e0b016cc69febb99640cae61970b188025d4bf889d991ba30c6b3729ffa0ac30143fa5fefbf601f09f9c316b989c9cd122fe8537418ae5ac5fa3eb15dfb719db50128d00940f9e9d5b4ad0dd5fb72f3829c0b99fa82c5e230edd6fae1d33402baafc799008aa56aec5ef2219c343d6c372c4dfcb13910150200e010cf6b76dadc851b14d364f0748e56022b51004ad05c2d4ac47011652ed5d66b18c1662b3e2ba7eaed5d7194a360a5ddf10d457ef1f14f680b7d08b0b99b2e518095b021ab0e97a538a2eea0c75d81bae1e0f8e42ce6743432b3c93f3dda756a233284f97dd65852fdfc3ca956ddf0970ff5e0ad1c24c61a402b6e64a9c0a5f05899bd362020d5d68e659f281125a411d7c68511da75d8d159975247b86b52250410b232ad822c0051347f5eda7c53f4204e06e0d1b120da8fb7f431a348ad7fa2e40af5bcd2ea8b4b3c7716512f203787b5a6f467d0b434b8234d5c10eb9db93ce24e422eb6b60945bc1937224d30c1fc15a934e6b46abb4d020a30d410bfa32d00fb11bac4ced44125d766e504b36c99979e4fc27c40e36626d0f663625a975372420f4765212e21e30268024ca541fff73f73f0b60911c9615f7a4f9c169697ff10c6d574d354d676f6ea15e68c1d49914a0e31461bca46af9362c2c3cb2ea843512020254f6b025d2af3ba4bb9581f05ccb1d16d9458242e13dfa5d81d8dbb51e658250ef8b8cf74d7346ed3659ffa8ebbf237cff23f51601a1acf963ede90cd7aac48afde0eb952e1873e74a6295ac7c1a780811ddfc15fb0318b07568d58c139db37bc933afcea7ef0453b79f0335890e682990891969e8cc2e861816813436654694d7a3eed0e0f5b8c6a53fb00b93e390eb5e4f0d360f330e64b7d8e2ed01555a933ae465a0bc76dde2b43b54ac143a0f8e1ef829a25e837ba788d53827101d22c5372776fc4ebc697febfe460c7f6cf0c024a53f6113228a6661da91423c8b3bc9551c402f223db1ddd816d37971f8ca6e245070a294809baeebd0520e2c6208ca602ca0a8ad0b746682068181a696819861a331144044307675a1a8864f3f9047d2d715a7ce539a26bea98ba117104ce1b1275892fd3396dde22b4ccc057413e76251b6bda668953baa0f7b5429c2206ba2eb8dd43b272aa5eaf554acc4f9bd39ff915b476df837a991cb706787c6c3e3accb323aa39961c46582252b3a98b3b86ff27045c0e422f5f8c3e6d922339035c42f28bf2bcb96d195f1f7c23c956802cf6ee564195e21bfdf25f1dff3f3d13d31df170e454e87ffb823fed0dbf59fb6675bd7b261c74c9b8b98e4105592321d66809687ae29869f626991c9efeb93e9a6c642dd7816e6a19978301184798ad17384c635a73918842726e0b959aa81c5b456197ccdeb07a97ad9b145f6ab84e3b9a1e1c3d502243e47c60dc4853e1aea3cf0e0849b0c00da71e8cb24280c1d593aeae8df2f51e416bd72771db0f4685bb1598ce0b85e9c849bc85a963361e5fa13883a11cc372c98603a11de8859a66a872e0d2fe87a2687f83cb6331d74d0cfc989f650f59fb895d840d4d175325d20d65e852c405674481e115ee9cc6e5efbb12bd8448b4e6167f445b53cbfdb0e68dd582370220b089e01b44608eb63adb8a091888acb7254bbb9cc63e4bd36fed8f3284e9380075dfb2ec4386f8e8b1867f20fa14a6168cbadfd0543de16a9a01971abcaadfba0bfb6d5164bd3797e524e945d7f5f40afb37db504e124dd47e6e79cc4aba1b02c93109c9944defcd9e2184c85c6b66ca0a0d20fc4c98602afed47bb738ca328d2ebf52e3f1187bf3578328976c177759b57a5f5dc21dcfcd1491735c3a0d3f4caff02cea6417bacd2482b9acd243fca3a53d2b16ac54cea236fcf1a526655691c211bed05b12c76bf0bf1dbf9ae002d2d610747e63d8280a4cb6b25f1efe1250f741d85c7c8fd077f229d5e87a27f44dea46553acd92a9ddb6160f5f89299c3e67d2a8231b7277bec4210255918d53968348cc19a72b42fac482262606955497b4652501d7cf29cee480979088936636d9b25026e7aa44d398f56258f56e830d9e762008a5b0b2d17034c5991e10ba01d9210d7662d1c0c88f6afdd3f0ba3d47d517ab464367f63862305ec854701a17faf95769082f471f7d4ef63e18d4c97381d74d07f3473dd10cab4645feec744e715ff230488e003d5a18b496141fa11419a0f20d3c00aedc293a881b3379d2e7f5610b409a671a3a4d90a6b561807e0bca3de133814c95062f868a3fc16b61e28919882e5340144429b5e6b04536a6fa49e66385d1e93458fca6345ceba6bb407f7003a5fc8d846f3735de1cdee892bc06b00a546b505e8320ade69f4492fe052673a820da12dc8ee1612caff4a07b9bdd5ecc169b5ae177ef64f9bea74169dd11991b20cff3d92186590b8404d97c4bf11228142f689f8fd476e57825efad1df39d46d66aa9394f5620fc7e7fd2c47a8bca50ec0c067bffb4fc150ba4a4a79c5916a06f247883ec680840188bea6ebdf7052a3ca2504e5767d22d00d18d9c2ae31f6f4c8d1d289885b05686ff8c0625e0b54d99785cf055f070a1f0c2168b354e0686b62657702891cc2e6c8ba781f167612180a4608f514c44e4a752f114372ac1169fccefb06434970b600d21042dfe50418ad2dee282dcdef022641114e4ec50877a3c510a89a0d31982a62178cd3c615159944d9a523cb882b6688ed6143012d8c158c0c8e8d1b90593133e5dace58cb14da15c2831cfad2dad3acf02442794fcbc7a6dc955c10f6b295fb602d60ce532dda8453dab08bfd3de9967b8c3c36b6826ce0863a89624d3e8af40aeb19dd4f097e5070440d43af6ebb4c11e4464d4f737eab466570d93008e2132081f3e1c0abed14766955d77c6360b70133ba6830d389ec7e75ef1b0863bf24aaade87e8186590f8533ee860879be93e9359e405718403da1a87f9ca20037bf57c56f6c4f991252969e4209ce547313748b7c585a441ea868e209eeb1b67697d03fdb1b6f3a08c8ca5e282358804c008d678419f1698451420c194935ccd40cd5c7bd007369cab999d75c2731f38dc8536a65622754ba3a45c0e55f78d00357a7282155009dd408906724d86d29fe2fad283ae935d4eb0b3dde3c84f21372551bb01edba3cd3f5908bf0170c9d395af058a70a0b4cbfa792014b5d0b1f60b69685857e2c0e12b24f22d24270d28033974b242e45bee1bb601270708f64c661e0adc3a6059125243713b937038fe69f83abd3abe563ae4d072a7ede053b29b4f70e9d9aad767c5e5aeda0bc5063bbf5b9e6e74269065611f29d9f7bb08454b3e068cb306f0766976b264b43c9fd0fd0e9c21248dc50711f9b2879c43d1c092182e380b997385753107ceee4425d48cb1608c9a52069271b4b06476cb424773c77a5db035c7321f27413f40d1fb3c9cfc3f81f27a2706bc56cedff0f6186b0e1e2a466a2133fd94a07f8e55c7ac20600f4467ef0755559f56943ae65155ef80b05a3b092f2ccc024affd33278b7dae9505fb72efb3e2aba8da3126509ebe703b9d8a50728c4ccd4fa0e914d09110daf308d2b371597011250a350f9f1191c61cd447a8af3d0807e6b7b09de26e2ddd8eb9dbd709e1321cf88be6663c064b66ccdd449912d5dc16611834e49a479876067555c98b87bcb4fea83b09347e7cfe3b269a75741c84ff4f76bbe86fe4c97f63ed325bd6b7a49ef985269af4d96eebda9a57a65ba642f99ac442f9b2ced7d934b7bcd74496f355549af9858dafb309d529e9ea92e2ad11660042f21cf7f0eeb32f13fc9f7763a16f858453823a42bd320ae782cfb8455965e58e800c694204069064a47aa2c0a566be027d4a88684202d8dab62c3377610d2d703f1e8ac28e267855eac18f75496da4da5697895bdcc23e703f24c8fbb0d9693506f584bd4535625e909cb49d4139612f4e8584ab2d01b5683ebf905f2182e4037ab77ddbd56aa0287a6ae5726ae27785b9925dd888c126f221324dc76329764711b99c17523b8fa3632f93a82dcc4e2595453339fa82afc5787249b5c5f9b1b39eac1b236fab7aa1c0722d23aa983fb13946835c255aa5e3a1910a3347780452855bd682635f4cd800966915b56d07d6a6e6ccf1bdaab4a576d96503452fa7987a6ad3df0e5cb4b74047c2eec8bd768a751c03d2bd91ea6a73349e259cf2df6c2a22d6bd53f016b5cf4a1cc864721d7f111be1d1821500b037e987c36466b8b3515acaed7ee2a0e8505bf62741235ff6c6ebd7533bee4e6e394487ce9faabc129a2248b14aac746dce95702de074a488c74cf2be369846302e19141f89bd9d3d66cbd5c0d1c92da44189352223141a36d319e97f1b904b5d50924d045bf1ff1b6fd5022f1d385d6262750817afca1b6790b6b3c235e9416505c657fbb28b22c738a6361935555b6d680fbd4640a4cecd50015eaa75d05686c6abb08aa5167dacc30373e1c566d2b351ddf2e14b5387994e8270af69b7afa8dbaed577e18d5fbc8375ff8bfbf9bf92e7b26fd739a8412883d7aa63640b45a4dc94870de190581a686235c4741f64b2afbb902dcf834e57c9292701391e70613eb420189734ccd9587e719653285b0806c372a03040344d8265c674a407c6f772db8d1ca946ff6baa7c3b0375065b2f9697e06eb4409c41bdea59c47db9992321d706cd38338847b1d48ddfabc1a5958b324742f2f036ea7b6641a97ec106345340f541b5e4abe5c3c88ee544bab6651b06b612a86f780dd098dc6ab4f221f2fea9bc7fb9eeab37972bc278e9dbec18ae9a2f15122314c0f172120cf0543d291e8582c4a8132ddd91ae48e7cc55951ba842ccb4a635330a60516e083fc7b8ef7cb40c63eb8d7422e6e986166917dbb4ffc791afcc6d5c7c74909886f71dd98ed040296cf4db7b7e9540c6f1699f129218805d95e3abe40b5f2d9561a94b89e6bc26414486c47f3b6471221314b781a76d391e0b4420a26c27f171f42c647daacfd2a7474d49080b6ad7151c2114be11de3de6c23e0a2c4b3109ab4708178526c6afef82900b11fd5232ed4120b422fcdb2141ca2e14ca04d9cc117730ea0d1304e4b14d8bfe3455e41f84de47597245f76ec6f9a0d65e25ad2141df7d5319a2d7bbefd0cdbb0de10e4d797ef537cd31205b6ffcc2e0997605919a6c32bc46a0ff5d026a40413c78798df68c0c943e1208dabc327758bc129d0c7835bd3ba92393659a865218da2605f3516e1df1c42dd605f69c9e46897fdda5574cb581472c404a7d97816ff06b6cc4c04463c1354654ae98392bdb48a13f4846ccb115b334afd9a1ae0caa15c0205108e0029de32c4110a9af6c95bf49e65efa31097760d1af4ce5c2673422412bec994e9430db56cdc79e1554b03e7b45678e3f610d5039e3d09395ba7d347ba5e17611e82c616b3030221e50bcfad103585a08a0301414a7c9380f1100347220c339447f795b3745afee57d84bcf9f11336066940b027e08f67366708885246c562e5daddf03f2307b6ebd704480c3ee8a20e528a7f613a463a091207a4c71bf43b738a7be4c051f86bbe671d8aa4c52b691c0e5b857a0d98b25651e0eddc47a188e884557c0fe40b9a542652ba6bc838404c8cc61841947ee423fee002485e5d93d94e9cf86af1b800416968c673c75d256c55aaee7887e6c38ef7df2d433860c83df61337e5038cd0634b5071fc0180de8fee36d4f0984c1514785da5ddc92616b57dab6ff8e7f4f80ff8d6f8caa242ed348d88578bc9fbe09be920c76effecbe301348f849ed1cc840ee75f13eeac121d16f222c5efe7b5ece8beff3739ef76d69546506a5082d056f8b5cdc23e7a5132d07cae3313bc1b200ea0de90fe57caf8ea9f7faff1a1aea327343331953f0b5cb70c7d3bec227905663ea06a58e92016409247dbcba6121f0dfe6d4045c38114d47443c84b15178aa50d010ce838abd24f9acfe8e7293240fc962243125b0615895f9b874e2e6ab0f00974d0a9fd05180e65b797242559d7e6e53c0fffefa7f9ab534c4d28593162d8498e3d624ff9cee980af86d14a68a36e6123c0370529e7140a71310690b50e83131101ca3e07e6f6a244be65f87484c0f51a760b0ce229f93fc722c8bfbf1643f2c53327c8afdc499eaf1ed74d8ecbfb44eea300b88ba5efa867f6a17c002c1d241778a51b25e665848e3537aa1e92798a8893fa82222581fb3f99e55f795cd4c9e2dbc064be894c1f4d92ad0ca6072f4c8faf4d46e121e140584807a0c3e8c6c14bb0f31dbcb7629408a7b59618765ae1a411a88bc4c382cb98a4125272b8ae55129d784655fb1020b09fbf011fc054d6aca4cecc414889d8d41abcbf0b41d5c242b3a613cb05adebeb496c9d6b161a908d914389546aba397daf5f52c20e6641cd77d7f619540045f9d09c1db342e15597cd02aec3719c459922e9822ad03abfca8023bba3ddf0da1b7eb5d4bfaf66312cc05e9821fab9712a3ab8b11e2302813d3cd35d8e9ef62057afbf467beb39d270eae240e94896e9968fda84469adcdee12bc525c6337ecc9df5944b50a71630fb215d51bb9c7a9cfc3636843c75419e27ea828edaeb8cdf898a0d2bdd5183107f77e8bcac0018b7c54b57134a21c1d5b039d71412988b826eebf8feaefca9af9d290d6f5692c59ec8f7d7806852234e52362329852fe58ea4394e235cd7ba8a40dda96bd95884d52363f542ae867f252ff63d6a14d794ef2b07a7376b89e055551eda8880817f78cd904603ae04106234eeadd397f5befeadb904e21463791466b91b6c9ba3a0f3582349c3180283f05be36954169f88bcecb6de6e731f304837322a9bbf378508539d40d8d4f98455387c57431e0eca5a67ae02b7d5e201475935e195c8282a2773f2ce34698db7193f31acbd022974fa75601f14f02d9c7ae9b0d8021716c032c1eb628a9b769ec854830cd612fade25893b3df850b43dd8363c676c7f2abb7b4a5156033e2d14bf44ab944a78912f9e86374365f57ff1bd76a819a6cd157db3c23a43151308944878705da43809e25f018f53b5933b38196815e620ff67f49a624db2b2fe871ae78570d2a76b0aa4f07093d031f72448651815009da28938c09b366f1daea4146e8be019dfb99b919019b8c3ffe59e53a6372ff753be7b1fb7c36705c6eee3b6922f47d613b1a3f0e4168ce49c3923e8534e37910cb0d41e15b37f0064442a99139a78d597742ba416dfc27e4846b94711004203a5cb8fda9ee1a559d71141ba5fdc3bc1c7cc321b2e6ba480264c7cc4681b8bba1b69a9b7b54bd96f6e4d1bbefda2f4e544955c1fbf8533ede60e8cf156675dd3321ba605bd9675e8f54e1019e70ca0c415f445b814971ba28350cb0d50508b65b3042759155dda956aff6525fb9ec991a4d7a7f60a1398525cbd2eecdf17d37a991c0081f4b57c7839044115c0cd9c4f5b4e42f2bc89c54fcf581d24e760f2730660ca23045e261f5443fc0aae8c43064b1b77381b5b0971c5bb3ab60287ff2f8224b03c6a5bf12451984926e3c7fde873eee171677d068c9ea760c9b056f4c0b7e4122e388e167193296d6a15d6347b7b2e8838bab2d2f2b64bf922a239a5c5d6cf85321cd8aa46414067a6a8f621b4f6387a204dc6fcb23f6ce29768641af90fecf10bb86b81f4e529db4126f1047374efc18b819cd4748a22b7bc4b4fa916d156442d7900e20e133e418cf7d9f0366712956f29f8ed2e3e5f4ec44fe8b66f3d9711b0967f0b1e6bbc74978b37ae1df94ac170391b9f1f0f814cd3aec6a31959c8e63652223c76c53a286126a446870b4d0bb5c59699c358cf03d654eb5af948b54d17a034aed7977479879a407f8aa16c05a09d02946347b39ee55c884af961f5c64a1649bd81f98b28e30f5db87b931b095fde6f60506e16d7214d2ee77b62f0020cf101b6902ae350123d1006272a4b5ffa19f05c3e5c06fabbef45070b3f0a315c3c0f686f90652dfe605e25e2189271c35d7590d961c7d9609d4e896383c8e70f2bf3e393a1f103822a43e1be5262c7cbec8928b9695782fd6844540507111b0134a32e4aa73d50a2372c0efd30541831a2b1ec3c823d2b261d05b8ea2c30579b6fbdfe8920d4b40fd09ffbc17aaa9dc8b871ad97eed64fd4225d9ebcef3efcd46f6397da1f15ce71295dfe6a63b6c205117df9092e3958e60ff1e041c907104407c8192376e89c504f47f926b5ad714c91bcd0f90fd2c53a4bd36f134d8f7b00bd7542b6c047ca52bd33ead7fc9ea6b797976bb137b0f976b79c7867eb633b314b549ccf91cc6ee00e83b6e2537001c1ebb9d63140048ccf77e807790ff125fac6f480bce6859572344c3889e82628ef8ef966f0c974b22ddf2a68584e1751baee97bc1c1d4b4635d2302013a217366101a5cde022321a89363c19422b8069d73d05a3811a0ac23e6e10b6f79080a3412f927e642609426bcfa64d15c154c5f1d6f059ef754633a3eac958fa28bef714b79deaa2c3565a52a5fb5b8db02d20268a6f3e5519fcf4a20209bde5ab0d03a4694b6f7b46869de526fa2f07f5eb827347f5e4503fde0339500ced882f3370867a7add934bd66327158fafb9c61f6a491e858b0def09bee673dc94f03a14bc71fd5c410ae72630a529d36643971740f71bfb67a50488a0658ef63e928e29fe49e456bc6f385512245db9c93ef8c229b8210f94248e8371e98ad729f52b7e21b7957adfac82ba2e5e21b625963c20a7090141794256b23d5d35be44112054df452118a43672d0a074064fe32cd8cfd8d6b848370da9c706d76b5396eea4e35b36aaa4d3f0bf4646304af114cf0810d96eadf81f18622a56f31e35441304c5abd2210c89915870d5fd0427c73cc251ab2430c3ecad0b1110d32f03c058d29f94983788ced7d3dad0315c5fb4c9e4d823f12688836f9531ae29b0ccb4eeb859476440f3aec32012a2f8233f40444880880414829164fb0e9efd33d8826dbaaaf45c42a99320ea0919ebd1ae281232899ab59d438644f7e00803b44c3c0a09fdb30aa70e8ba3c919d83fec7e68cc1a62cc81732c323d08385285633715f414552286c97f6a7ba5e45daec6382d82cafa350a3a4660505f21e2c0bcc4c5c05d620fa5b0d5b498a7654596c1db654c991a91de27087df670099fe2944a728e1d056a245013e738d490725ff87c538e5c46920a1fa95c0439d630748d103af37cec7126a4f29d6241c605d58948f1bfa9daa3474caede2ed1da4fbe1a2f7c81489131aa1c9c0d87de38c14ac5fdaeee772baf16fa4f6305eaeffaf6beb42eb81fa9fbba5f3be3e9c56a29314c63f467d053c8cb2182e74afa852776230a289906edd364e2044810de96a842465a5ac317d715bc411e7f199bdc9a89719737106a9406c688a9d30df224384043e099752c52d9ccf4d09907f22c2a525fa1fe7e0eb1b1cac53b8d4753b38ca5b60152437880a52eed437c6265328d7353ad1362bb8e50333bd66b506d567b9020040074cb3a1471b400206d60da94b4ef9fef763448c1ea985805c38b58f605f2827d30663ed814b119d42a3be7fb7338c308b427ba8d3eb442655c344b7ee3ff376ce18675a11c16772db87d71ad1ca3ab3e5fd1ae2891ee090df32c838811cb40506676cba46ad6b70b29b187152161e7c5fb7f03cd545302f31f08c1e9dc56a546a757cd676fd6c759f350ed843e55c5180398c23a011b7ee4300c18e6bc11e51b33a61acb47e5a523c6bb44c1712c5f8cb3a502918079caee11c69183922ae689728182342e03b9a968883d62810d0f55c9ec465f4111e1aae00b25922ff7b5fa0bcc230d5d48dc48f7e337321790e38291f32967f294c088149ddaf4ed6fde062650a5475eb825020ec47d0effbc6377417c929be851011fc9f7a1a443f0037ff6912ef616d74c8e4fa7e4d58f9fd3cc9ff0e1eaebcc1b854a6ecfc0adbc629a9145b253cea0a659ab4ac73c014109c7e10b0159dce561eaf5ae12cb36d28830c9262eba6df5584adac8d667ae9ecdc698760c32a320fed55bc2ca4bb8129bb64bc1ca6b98114ab3cbe1492fdc7397b81b63096e3237ef17ed080091c533d6f97e745050e6b4d6059b1a8fc637d4ec39e21c9795277792230db1284eb9f041543912cecea9017401eed24a55a0be0a4ff459bab224abf211a3bb14ef17542846ff0c8397af4963052b4405175423617d38c13a6615465f34ffba3044caaa6363d80d67ca9bb646239b652a47a200bcf44bcb2de01a68eefee3c44916aea3bb7a5101b501bcb58984136e152b6a16b5631893a4505b2c60a219f6cd8a631d91cb6366e664acbd5700064621c0e675e161d2faee67f8983cbc1208512e8c5434f08aaabf47f65feaa62ae2e8e2328ce85efe43d7b512a729445a0f4570e51ffd8788a34c9a5360261f7bf86c8c0d6b696b069740f139bc70e433e1f6c12e1441f3b797f74ea77f44ebc2cffffd049939d11b0c9835171e83596a8aa4c25bad1c10d9e73cd4d8226b564332968027b4329585697883448943304377e43e3b6d2b4e02d32610f27972d7919e339b001f350d504f5fa84521a757de94fb1db50f4013e399fd230cfb03a0b23a8c0402d9b7c9a8a7a7849d969822cb193705ce25dc398eed735a9b045e867360cc9d9b04d0813fd5964fdc3b9274206f797e69e85ebefa4b26ca714b9414c70797fe6c0f6ed25601b687a6343a06e993604b109f59454392b9f11d5ef8770044b64f68feeb728d54eff7463daf28e4b318c07105af3927a43a3e23497c46a889ad317b1be95d3f75ce6238d7c58fdf9b381fc45ddfe75c572efe9530855ca309b34e990131059d764214806e7fa0060557fe6487e263e1ca8e0bcfaa9cd74dbf6c11ca4492bf2f490aab2215a021c7db7129a3fa394ea570d67c2bfca3185421e1368baa25ffaa7f9e9df599bd17943a96cd8e0439e0093b2da548e263856ff8b98142af88418098176c23af25a5d20e7467b3face0613c8ff14c120747ad34dcb101cc853e8821af4b82e1f2564c7df886da30e7ed37ca7ab8d8781145384f4483d11e3b6ae9e643639de1d7074d0e209892c25ce1feb9560036880493ffa6375a3e02b2701a4c41fb06fb80746fe6a1ecb09a1cfc71f9718ebd72b9413ac59e564e80e2802054dad0ebce89b2b2fec31a027600f31034f8d63e605ad168829d89b1c856244c00cb45dc84c407d17a78af78deefaa50619c7bbdbca12c49beab6a5d990c34f602f11bc1e6b4d28f4561b5d5da88d7b2ba35d4613b6b3de82a6de4b96ff2542a490581e1959c4feb3a463ffb69b2b0db64c79556097968b73f00ff94eb28ae15eef3e983641080b28a2cbb455ad76f7968da94873521136bfa10f4273b75d76bab39fbacf4da35e0fad68fbed7ba180b6fdcb1124479093b481dc230cc827821f48d48f986783302b37f0e8110e78dbdb88314d601c1e0db602948ab927b232ee1099a644f05283c23f91744a8c43654cde5d8095e7953af640c4913af15165fcc3b7ae02b3b73ff6a474a4233874f724ac4ebcf3424610e709871625c904ef016319889fef2a86080ef585a04f60101464e095bdfa0ee16a674cc731f8572cd65441915a2b87f6b27219908cf08e3327c9c1e7b3b70f2a9bffdfc067859db569fddd75d716cb94c059066a0768aac8ebf5ee0c16e3e2d0b346d32174b142d99a958955cc5e9a8256ea1778ea052753be3ca9875eb051866e308427e9ff61e352b8abc5f734ff7e493dd17627f0eabbbdbe1a51ece171026723d16a4718cba90f6828e3d76c98b4f10bf486598d67753b9b2df9e4de1ea2e612b4ba30f1f8a58733e3251fbb45a69d5c9b9872846fe39ded78046b4ab05384fe539af8ef4cabbc107cee785c17c0297242d4989d63ffc4a6e528b928541d0af5a8234bd6de2fdd44ca575d74c503f2bcee7ef2400a9fd62e56ab1c3555918516b332e35ffb34d93ccd193fc0bfafefb7552e450610be591e70524e048e22a04400a871106086ed233efea842586eb39638e90b1ecda401c4b1698b8b20b6085fd51725eb300dfbed7964d8c9b69599b8d33c3b23619339a61ca7c9a1e3de10f3ca304fe1f449a0c57209a19271d464922366582cbc73bc1ffe5e50902fc08146c0965d5e5f0afbc1ff607b52f818de952d02381c10f5ee11c643106c412a3774778772125f8b580209e3987f2de1ea3b3c6a3b56d6a8d904dc8267bef2df70e280cd40c5a0c5fbdf77092df39d0345c4f4fcf1a562f080a1ee4f71f3dc3e5779d9e7941475892df85f44ce777d8d3f4de14d173717411e5e2e822283f98447e2ff215138902aef30b3a420972a743be29c2a755f9a9fa0f2bb92e2c49374428d1aa974df90515e10cb9abf941244b828a3045035c952490d2042f73fee50c1e884c86386794e1bb1470a91b98c48a5c0f4426571c44e6f84e4a789902aebeabd763bc4e29cdf402a1d7a1f9fadb7268e0a23007427858f3757bd1bae1e8ebc02c736ca20843d14669e1657d8498155fe1e167c6dec54c29863b78797b9b087732bdbdddfcc582cf89199eb8c6e059f1553b3511aa18c2936bbb99a75863c5c7cfcb921adca815a47cd9e24596a0d69a2a35b2042f2590248032764f9ab7922b21f404410c2f3368e8e086992bc7f3f06ac07c922e3d03638c4240438ef17f355e11aeb58689915f9010a690657e41428042eeaa139cc8404598c835308c94e13bd28b0cdfbdc8eff0d1c007f3b43703ffe2af1b1f4c8c319e7b34a307f314f05e0ef1ef3ab26b7a4a25ee74648a813cbfdbf1e020cbcf2d025406399bb8d3912506729e17248414e4869f1d7f644bbe6cf12265ecbe8270b6b71e3a54de1edfefc708d48a53267ca3fd6d17834046b6d71e4f6d323980275b9c2291b84dfb7613f7b8c79d70ea74963df71317dfdbedb6f74db7db70e723bff873b7dcd54818ded1ed507974fbba5ea56b973da3ddee74d38eac7dd391b5976e6f87cad6646be5b8d34da63b3acaf46b05736769dfce69dfae6925ac04759be6b20985b76f1877daf3bc9df6706a33fd3a3dcb45b769ed6e37dd9ed97067967bba38a82cfa8a09cdd76d8cdd32cb22b878edb208ae7fe54eeb348c83ca140781a21cb95efa70f4d7e5cdcdf53008085b64180193c9c49dc43d7b1c6732596bb9934c26d3cba6dbcdba715de9a3bf9b03b7c3edf0a3d2965d78ee7666fa566bdd9e326107f0e45a6faa56b3197749b89b31080862b882809085aa675e861b8f865bacedbcdd4e07f74e9535eeddb90f40d347ef5059dbb6ed9a4974eca79b4304bedc723bd257ce7273602e95eeca6d218223e1fe235d54d64837254d4636d5da7179d3be55134e9db69fb69b368dc39d8fccbd4ba4bf6ba49b9dbb23dc89300e2adf0753db59f5dab77aed55b336aebf98e1b8058e1e9ed3640f470ffb5786d4a62a16473d7dcd7cbc0aa726c6f132f9081f7c3875fd7dfe66c79e61b855a9fa4ed55a53d7851ba7e459eff4f47629faf724cbe414c5385ea69f34f293c9ef49635406e51292888e926914dd5e92ccb42359d2d5b86b973b0908cc2ced2b96d4f217bf30cbaff7d6c3ca35ac9d64229948269c2ab1946e2add64c2af55af5517a9e52d7f9b769b6ef9cab5dbf9e881f48be5a6079191575ebab4ebaf718a053b8027afe0ebfacaafeb2b2ad35fabb4974cb7f391afdb44eda2feb60898566eb7f216dc4204b7827150597b6ae5a45f58c3a9157c637ae9a69774603edd42adf4c32de7030cc83a30770008cc26d3497f9b4d934eb77f40ae6b3fe1ae8483c020306bdcb79bedefc5745cd72678713bd2df51b72361da9584a07526ac209048ea3b3030137b269d7d109845b72b973e2b3875f35cfa73e9a4ebc09cba29bdbef47a11cca612ee7872e9a495dbf998e1de9d32e9af674e6f59593989443a8b6ae5dc5df96b1a18675939771835936e13576ee7a3f495db1556090781d9f4973b1c54369d74db9ac9f4edbdddd49b6e4db7746b7b73008f8d5ae9c2bc723b5426956ed3a6dbd9843b984d2ffd745bbe7259cedd0e95b9c7ed74d6ca597e5a39cb57ce727a0be66e134db733773beed9e5d643e7d24db771bc9c6239cbf495b398be7213267d05937ec2a856916ed3a65bcaa59bfa1266d9c38ec338a86c3fc239ac4dd4ae8e46e723a76e1e50be30ab0b721d5ee7c2416066fde6446498ba3d30beb3030ccc047694536b53d89f38d58b6ac68b1427542733ec28e766438e6217e075681584d7755db55553079b564108552ff345ba5c86a726bff7de43d168d5ac9998c3a72d38f8eb3d2c8583cf76d05ee05033ef70f2fc91a74e9eaf8e80436599655ad5ef1eb04aa3557d1ff09a91e1e5388ee3b29665d9b5a6b1cf32ec167b39f36998beb515a772c83c2ff3c4a9799efc567981837f5d2f2501f7d22a9b08d3a8aee171050e1e22a162b0594d962f5587dc9d0e110ddcf57ea7437c2fd3fb6e3831c31696e4f9974cf11035596aad921281da05d52a39435e98d39eb6699b7665aba8b599aa559262ec73ce39e9eb7d19abf232ad922d257c53f4f262e4e5dbe0acc19c738ea15679ef453ac30719191c3c5415588183ef5e15f9458192dffb89b56eb0d1e149f1deb2499436449144b03a323f2c44ab5ea7bdbb4eed21ae8787b84bdd401d99b3579cbac15e5f8f61d7344dd334ace3da60b79ea80f57bd2ac6d1aa97e985d94ac943ab1e9d14cbb40ace68d5fb7cc0eba28bceaf699e39bef068504ac1915f0d19dec5a9c9ef3d4eb37931ef34e79c9c107972f0382f79cea95528f38b6be0e0e7cb8b0e35d40b4f8877f98b79fdc493420d4f0a1c355f689c9a2df8f06aeccc10d22a48f323c240191a3ad8f080e34a410ea4d12af8fe14b8bfc4cfe04e31c31996611c2dd7bfc854188ebb84bfae78dfd13442e0f04147141a1d0d73fdfd45354386c6ab616d22cc2513612e9c565d3e5a756991af4f2d5ea49162e8d3aa8b74558da4e5eb4dc1c2154dae549f2af1d3f83a5cd2331996ada249e694f39d86c5d58d6daac8469d713e5ad53d38b0c960daa524c079317d9948039d6898eb579402d74124f2751dfe5cbfe02f257ce0f44cfdf51f3d83fdba4ecf743a1774c2fe72225f16629c17256bda9539bb3263a7f70c8841c96c5e8d1f2f0696fe6a147d84717f7f51358de9ef3233f349e9c22c44cff08023d2c8f0e04067380e6d1729db707ce9bebc5ddbc5011f9b8b13336c21579c975c31cea524e09a879e99d12a940d54d9114a74619ed133a7a3e2e34cd747c3c4cbcb012bb8ee8921c7c7d78fdf9992eb7fe808e999ebf11cf0d133dbe371647edb86b1adc7156247abe0b112134a40014e4dae9847aba00eea03d7b4ca8bead5a87f9fd133b086a626c2481a558491930b2ef3a155385ad505d7bd2ab2fcd482eb1ed647a267307ce3e546d2979803ad5aa267524d6b955907634d4d153ee8d8d1a78d615847e67effe5c55c174a02ee47cd310a5cf7b6c8f2dd777a065e1ef6f8e0f041c78e9ee9705e954c7fe83c9c4159ef33228a2c649c2745a6b8f64bcfd02838da12b058dfc518e3acd89cd3c6196b95f025bfd389a2f1629ecc0c1abc0c1c3c15721ece39e77bef350d0eff7ab8fecd0bcaf0300734f746e7bc129ba64a2e4c04b562027590ba3935a1820c2f711098e17baa90eff49052fa66ac910b1c3c71010c77b920ad211f801733e54e67f928f38c3c23dfc51855ad7ab18b9d2a5f42bc5c81f392e529b455eb71304c79991930fee5c5bcff885338f8a823b394f111d377d7755da79d4eadd2d2c0caf78eb0315e94fe5cf4ba70f7a8e40e4795af5ab19f5aeb1257bcf38ad7ed15fcbcc11a79af29bd684ff8f960ffdd46326709e4df3b4b4a29dfbb6c155c837d3d43cfd3f8c270f6bedd735b7bfbae5adcf5fbd77360db344ee580f31d2462ac65b095d8674743a032eb291a4fe3ede3fc00c429ecac98baceb287bf32fc4eef3b762105cadd71e0921c71101e0cc22dd8a7de5912fb3f1071aa9ef5143d6b3e9ecec74f8ce1d78204172ffcf0eb7e1fdea8052e7e492731ce9392230e12f31f1483c5dd3b0402af2353118727f3dcd48d9c59e6ce0fcbb4eabdb44a6619cbb10af7ae0cb71c8f0265885572d2abbedbbdc38f7267440cf6bd74b3618e7237671a44f0f61635696746b14b3b49894f9a4bcfc05a7327cf494d66fbaaa81392533846b993f9bd991eade2e63c8e59e0e079729645df254281eb5c725f252fadcbdb8809a04d531447f34354b6294d83cf60e7235b7bdcd97fbeaf943d0b3e7bea063e3bc479ad9ab3a272ec50310c5cfccaa967bae784dc6f0d735c70dddf37823d1226b21d555151f9945c1b7738aa2c3f69d00f9064f803e512bd0225600e2d91c815c018e34fab7ac6d8dd44a856abc91042f8237732d867aef3d775a9b5ca479354e01a4a7d8fefde9b7f87ac271fe5495eb6aa5adb2382818373ca39e774794e9cc876f4de7bb06160efeaebe15915773ad209fc84646c668d04c33a22efbd7e3612308769e3e13672fd45e0d7cb523ec809293295b79140791bc97cf35e8717e6f91b2fcb5885c6958a7defbdeef7de7bafdfbdf7deebf7fadd7befbd7eaf46bf7bf6bd06afb883e11263343a27c230901bd1b1df6c1761d849bf29755b2d8d5c2e2f8c8b7288e4965bd812e3e6c0dcd2a5304b3b7c4b77133d03e3b4e5f4b4cac380d102a365f4968f5a5a2e869ddeb2bce5b288e44eae3add7566e9c02e952375b372f996cb62fa0b7c3a0a6befb35cbe9774134d7a86e5b2fc6559a336ba2fcb96fb726561c11dcc2bb83b6196f678136669cfa264f87afb6e854fb88a83c028abe05e90154872d74353b82277bd24d3bf6c85119a07d45948610a5086a464f8a7615b0fdb1b7752e628fa75bb4ab71eea45b789eff56a1877a5cbad87eca4db7a95fcb6de7ee736b8db7467eca3d7dbd55f235f7dc7c857ffac4464c8fabfc6cb6b7fdf0abb2fcbb84c6a2d6d394898751dbe5e87b789ef177747a2abd3434972d7527aa8675e50154399beafe899293808ccf119110fc8ae0373c4a99aaaf6a62abe99bfb29bcaf126735aaabdad1e4ab9d9a8784e2b9264c8c258d8e13b1e8bbdbe3b371bf53a9d2f2a2f3a036db86850154d0445a10985512fe9f59ed8e1ed7832ec63fdb7d9d0e9dcaf17b694976c19d9d0f0bded4591fc96fbb6e53565532af372df97af3f28db4ad92de19417904c1645f3761389a89417cda8c44aac96591c9b8e6a6b4b9a25dff9655937bd5aca775d526a30cb20ae2726a1e060477a3dfb8d0cf3e4ec76f4987cfddc6c5029a97c307bd50450b2e63b4b4a259570528a5de4ec072ffd7cb9e7ad1ad0a92517e87623333ccdf3843ad19a7dce3a331ba78c51246fb75ab91aede351f05208e7a4a713eaa2176d3a278d9d9aa91cf6d76fd8ec14773b3c79de6ee7d8afcdc6a4d99d174eddccd7df9895bbe69c746af36d5aabe28541ecca0b9b97840d61cb7ebf64ae4be3b5ea92b9b01b14fb75bb9d0ebb7d8665d8f51bd8a5d9f743d97132b193b9e372c54ab65f5889b6e1d7308db948a3612c21d6350b3d734d48218410422dd279c12cff32bc2e774fad8a1288eb77dc8569a7b7d7c520851462da95ad7aa2615ece5548d130daab91827fa85645097465b23b93af618afe651e1bb5fec6867fe16e8727d31b371bf4f2ba3a5df18d0c575cbb55f106145c57087f4d3a29a55070a839fbba709d36e6ed83f44591fc3c7c35e4d517ee29e145296cedc5d8b64cd807c3699719d3ae6d12fbf6209db763a91b78ec50744dc32e92f218b641618b8cfd896deb583a9db16f87dbbd715dc7b05fd9fb1884dd7d7dc36e57ff0193e9109a320825c6782f0cbbcd7ea33dc32c6d42084bbfe14ec2406eb08f7e23faf6126671248c7d845922fc309c8757520a9b0431363c28ca15414e90627b7b3d8c4090ce103fb8dd401c6fe1ed76b6dbf1e46dbbf1f6763b5d3d142ae2896ea1229cc82d59f2b291c99dbcfd65db6de2360f6f476fed6fe00c0be2ebdb863b5831adab797b7681dc6437fda674120672939dfbcde8a29b30ab44c2a41956760eb34658845ffd76af67734a9dce1397e09cf28428552cb4e2095be4be14b1b2ebb476ec0fcbb04ee7eb7aff7a76d13b1d59054e6699b55f8739b18b2e58d7dff50cb3aed38bae259d457a770ecc575f3a1de54ed67ab3a1b1745ac20ce4a6b537f6c6dde71beb74ce2eab7d5fed623707661116fd8613893efacd76516317e16ec39d7b1e2392694673e0df96e3ba827d97cff0f1508abb9cce4e6f47644efb5e8f7dbe47faaecaaa3808ccf253cef848e981c8bcbf986f840297e587010e66991c73b5506261e51138f8a791b856a53a3e5f14fbfc09f5f919324da3d16c34a2cfe3789f17dddaaf5fc3f46d85e963b7b6aa628ec68ba38b2a5ae5842672a7e5b90a6a02509ee75c5e661f615f33014a7e41f90531e148b623fb220d8c1853fe1dfe441a97bfb603b88cbfd4dfb99a1e91067ffbbb5ff9e9ef3c228d490027bdf8cbdf85449a96e3f0f7fb820b70037cc6592e0eb8f582c303f0d215006ec108e0aa8b2ec62d03c49ce5dabdb81500fc7bec0e00b762583ee3f5cac02dd5004e805f37855bf8fee5f4c6c0ad940b6e0d800087398cdb8af15611321e04a549865f917197537c64c60a00e76e4b063e5280554b74192e4fddde960b3eb2b26ad5bbe023a2d51f03b7609cfb8bdbb2a9affc745ba995c7f8e8b656f091b86aa1cec5f8e8d96d1511031f8959b54a8ff1795b237c6401ab967619161f7159b5ec5d9ec2474eabd67ceaa6db2a8001f09117ab167697c7e02375d58a4f5dde160b3e525ab558cecd58798c17001fa1abd6e832de725b04c04752ab167d0a061f7959b55e9cbb00bea9f091d1aab55dc607808fd4ac5ad75d2e007c245bb54c8f71d26de1f0225a3cab00e0230358b5e453c7f808ccaad5720eb7f08fc055f6bead225a3cab177c8401ab167719329ee1d6ca5ba7b74c6f915e3a0ef808cdaa95dd05e3167d6bbe25dfeac7bbfce223bd6a911ee3bfad7e0ab764e0967d2b7b0b7beb7afd11b84a1d00b7757a0cdc3a02572eb8c5bd357a4bf496f6ed29dc82f1d68bb7506fb1bce53611c67d7155b7e50a8930ef2c17aedcd3958930efa65b5a724757747b4498f7ed6aeff66617bb3e2ebc2e741261dee99d57de1f11e63d5ef87321d065e9a088c4c0da04fbaecaddaa177b094872ffa45d8043b5ea0529410c8f0b55e4fef5240b2972e7ce4ee497df1326720ef9054d8186ac049f275ae43ea55b8e3eed4c618e11e8889b4896bf7ae82ecec789e165ce28d377d7ab1134454f0e22338d315bb8cd5fb733c54f01904a930c0f04e629bc4a1f954c690dbd0d8592e97548c1323d8f2f647a219ae6c58a9e03f4c2245841135898628a2d84008515dd62a8064f7061822f10818815a522d3288232a551302153d38ad22963b3e417940430e44e15850b0b67e672e2503370c1927045aeb5568b5d1a3ea0517107337dad35095172adb586860e31e044f90525416846c3c8d82f386cb420e4d903c9450fa47cd9e20556e99e1f46923c7954867e74a064704411b27ad00c429eb079a23ed14f58217b506b4d959a57250de092dcfd4308ec814692e4ce7d88042a0197a071611b1c3a92c8fd1d3d63739f87101ca051392117e4ee1faeba710d8d4c39971a70dd03e2c1079b2434e1d1c110b29041932446a08337ac9a0a36303162073c38a2053158f51292d082cce5179484235840b958e10c56a4610d5698a10a57e0b0010a2e48c006228461064fa250220a185ca1288ec09c40a32022d3de20cb90bac101d7bd218903ee411c63943f11064224b37bce89db48186c142e76bc363cb0a152c1443b98d3470e94cc800c23a0c1176af07245153f4a5c8109145c610a21296c425a10ed40284824e4841d5032b0c1761d7cef3d9b39e7acb131aa628cf1a8db4d2ec264f9c5fcb6208278402b0aa18e08f35841625612027a2cdbd63a881db0a767b5e301ad28c611611e9c3918e5178404a009237ddb8d9704371ce10d4edca082276090842c857090a550132b53c0c21284649083244c5eb0924148a802129c30857d2f92092791e67a3fb9bae7fa35d446a438e9e1e3075c027b601368a4f668558d34541eaee4d531e4bac4aa7979c4141043ec259659bd95851ab5a1a307f8f91d2253cecfdb6b2fbf43e47a762b31912b93979da49b68040c49c1308c12617a49abe0618f9008d3f3972a05843c96b1a184e24798ee24bd24c2f4bb49375dc23ee8c3bd202434c92f480a9f1c935f10127a72377935b817232f6f47f22d6fc075dd24cb7735cb21f340916608fd50a4996da892a4273ae9cbc725912689048a346f259f44c9127bbd8e554c84fe7a0f459a8977980001c9008425f4aceaafef10a19faf172632df932a51629548f3901cc0881a4469e224d2c0a19f1b0c0dc59e1fd9f356514a3422934823594a29b0250b6c7d35a01dc1682182eb2519e6c0ed40d0972e81b77a16025dbfa013d8a455b08461942add43c270888a9429a4cd478f6de36e2fc229799e15090b490297c80dfff8814620901c2040d45f07827ebb04de8a74203c76341ef4560293fb7c7c0e1020524060d9b1bf95e8407488301761e0834801217ae9253cc45ef4b7dae159dd78f9fd749208034fba457037d5e759d1b7f2c12eba851b103c2c0f8dc708b7119c8ae7596df88d24bb3a52b1f2d06b13611ae7c02cb3aa8930f044443cb12f1cfce0073fa0f089202a4157a052051fa1d01192c6d4e2555126ca1dc8441a4dc808e9832a858af43921d4857a72f7d282277df04414478872072f47b8fa4e00a4864ca9cc09e80c99524aa93c82437e41404e1002c393100959ee204b29838098e49a5f10101172a73af2e811725e4a194491290c81055c7c81ca112b15a8000b149c610559d8c1d04a4a9187408321e440d624715d3c40108212b0c00211593c994280a19f16f8fca0082d66b0925120992ac8725b493965127342a121f80c8104143f242451c50d56c0852c5861042bd90329d8a00b25f8828f0a563209d8a3e5170434830905d00f0654020b6404ddf20b82a20db0a7132d9c68412211e563a4d12a2a39dee59dc41209d46211c61039249ca67a792df90541b10528b090bb9734587849e2ac4dab7420a5b4c8f33b3d93a2b88720265c91e571344d047ad7b1038afccea36902b7eb5cbaedcbe12030a773bf54d335d57478d32189335d9a48d8c441d385b7fffa5646ee73b78399e3a424556b234bd7a155b226cbd255c272cb72774eb7696b5323af038e5c238290e58e606585e53691e52add1fb0044ba6d26d62c954a21a8be9a5d3ca65026f8233642e0db57555256993dea95491a64624a9e0e06b74e83fd15b156972952a588b5c07f3e8367193120b5c3cecc6ea75450925a94f33a852a5ca1aaa5491efc4dd45158fd53967c45e21e623c2e0f44c9cf331d638e79cf33f7a665eda78ec458ca3d3d607cc0133365339300ccbe6ec0cc33c19888b4063d755e98d79789e7c7fb44a1ec7c71994e811d2332fc80c3fd9c8855d184ead15fb7892edfb47cfd49b8aaf2b3b865588611c1f5073c99d03bbe8c611ebc89cbd5be61e3d739dc3699564c0e8f2dce51161e47d449a1116d203c7078ea61aea2d0216cbe0202e39bbe57109c163ca141f10c7c7d0108f6b48081e53a6f89832243a767bd82eba1baeadfad133170f8438c3383e648f9eb11663417bfb0cd3ecb31e424420c32cec01d8e77bf48c103d637f65178369700281b2cce2066faf9419aeadca18eee00525f321bbae19ad921fc2b42cd33317b67994a1d130385ac63e430e719d2aab2416dc7cc5381dccc7e988e4eb4060ae1887a7e3b82c81f28b4e639d90acd3dd0b3e862e7f419d506b50620d4564fb6670324b8ec3f121bdc0bdac03ab08d9813df3dc0955b34dd79eb1d8e13b5be7b1ee033cb966104b0cbe5e0d48e497fc82d23025a76109c4acfa7956fd6bd5e5f680fa29e40a2e5679c094d0da5bb10ccb30ac5eb6311532518646b775cbb48a7ebbf3f1ce96d7c396969609021919488e7d7c4e7620167f8027db478b3acbbe837dad5157bba99b79f879c89ac78c64ec98165a4cc9d859b418ca1d2a53183e4c609cdee609991ec729d3d3bf502d9c649a869f8c9de516d322ddfad796633b9cdb75bb823b98577eba9dcca75f17c80d6e961e44dd36cb326b2deadd6fb9b52d1685fb2726382f566ee385f19b78a80446c3bf7871bb96d75fd489c0909d12235fa57e139f1d95e14e490aef1081f1787adf52e4fe1a015d0bd6e9bc72d3e5d6c3fccae396033b0beee65756eecba75b6f2a5dd2951d4f0e11d1f60db3724dcf749a129cfdc335345a15f3ccb00e2643693c71f4dab327a8cdf50cccda555267c5d0e0c419806aa4c96890020d5038224246707d04d77de8ce0f7a20395187cb3fe88104e132c4b032a197b0e3496a819bf252b6bc6264b38b619a4edf601aeee833dc7586b363b7ab39306b18c80d159d6ea7229b3debd338638c8f2390425f17ceb6c9ff4841d3a414ba63176190520822035002de7b54889a0a85ba7d7a6fb20cff391b0f9165f8b72ace68957c76c56e4abb9bca5f17feb2016596c96752caa9baba070f217cc87ca3b69cf39a126753fa23cb187541a1583859c6f010599ef04d69db8edb4ddfde3ec34eb3ab6d5ca773b6e1e02130909ca8c3e51984c3dd85b52ad2e050cd506597c5a19289371a3f7a61d78c96a9b52fda176d1d5a15616b4dbbbb69d33fd31bf99a8024f378c00e32aa193d03271655b0984235bad9b0f0d25ff7a60f7f9ada75a70bccb2466237a2dda66b50f1275b6ce3b97eea1908b90b0fd19f9fdae13dcd1e42f0700287c3071ddbdfa66daa08512ea88bd3aa188fa96a965ae0ba9aa18ef6fa0d08e1e74ed6c145a729be312f314fb60f46c80728cf6f5707e6ed35910647ac79f79ee088920aee7af786e0cc9c18969b0d1c9146874ddb2ecc13dbb42ae6a01f823ee0fabcf4f086ce0f312fb118ca4d44ee27d94a0dde1b8fdef98983c0dc41ac030f731028ffb7aa46082b6a228de831f28834229cb158a2615e8e3863c144ab5eaedb0376c8f2d549d0159ec810eb3485f2823afd263debd299594e1b94d581be8cfc3ec0bda02b2cc94339f280b847cf40217854dc490c62164de5780e92bd1f84057b5821de108f1b0c63b83b90be0e3cd4691e42f4a0e7c9d9cd919161374fc6b012d1e8dc45e770cf885e848730e94095b7694c934fe0e8e18f1cd8850cb8f520234fdc81bead709ed20f1133ab03f0144b9dbe91e5ee4b839b0d089fca0d5838c15edf76733d0776112447bedf4d3985f82cef0778b24e9f27c39b2323b7d422164b32c4a04cf16489956478878904deaac7e22260172b26fdec369ddd214c3a5064ae98d42be59f29ae39dcd5b2884bc3dc45f65b25e1a3c4020999202c7cb2cc41570ce5f8979e89bf8936c6d318e95b251fb14ee397567581ebb42c6d96973ff5cc10af116584910b5578820a409d65f3dd58ad753ecbe47541f9c63a9d29d96e99bcf7f6aa15aea8c214ec4388b4d5704f91afb6539bb809c9d80e0ba79ffdc243f4afab4ff1107d203a5ca6cf9ee1205cbe7087519d6eedbe55df8e7e1ee28ec6da940511d21863b6f372f90687511765e7a95530e753abbae3384ede48d353e08b55b60aeaf061e2e30595a18aec925f1019a2e49d6d35a3cc425ff86ed8120a47df038c6fe24b3b8ab635cb0e037b95d662f6d95337bfb09d8cddda7b6118766114772fd307d40b9c8fd3a9fb2eb539593b698512ec303bbc998d6b1af92acb348c9e12a9f3e66031cf3381bfe8cc1e80fd5a046fd3b4e592d973ce6e39a170f32da9e0249d94d239e5101519b398b3c693524a7923a594525208dfabd1a20bfbe8d7e366e3c2f4a291e83afd85dd6e7b765dfa6c34a274ce3927865d2cd2753ad2e375318cb57d547f731dab9875e1ebf1d8854b3042682f4f2115513a9387aab4eae54ecb43541ae6e5f8eb62d8ca6f4e3769ac137ead326113ee64be34dc7874ecc267d1462e07dae04eba3a9d391a7fdd8aaedcae4d66d126b72c4be5c8b24c7bd6d8d53ac3298b6fc8d3f3e4a12d729f5201892c7fe58051c6ec76d7eb31ecf62b84bfbadfcbe4a8b0efa56b2a99be89279c6cd12a0a9b34f1079df8420f12245a45cf7a4832141d6e37f1d11845adc48ba15f9056e03a492fd13ab0bb670b9c28ad00bfc041a027e67653316c23dd46903052e5467edb4884f97f5f84a9b87fec4f9556de89e1968255a0986130557f2020284b80a044a92255533946b7bf31bac53cd9ded166a376a9473875a3e26e12a15411b3cee2d5e0c2d06c2e3c05f41330077afa9861ef46edc4135001f34b54dcf511eae76d1bbc1c7a543174d250a07415503a0a845245079d64ea044aa6ad8252bc183a8465d143dd415cd7433fb266510ff38bb88766cbdb43ada21588ebfa079b23ad87228598cd3498bbfe81556aec548e1863971eafdd6c947a89d48dd1aba675a69d45f76573a14adfae5b99de46ed69151d49c9e2d590a7d9ede876bc8d75546b63dc3e2f86c22d9878314b7e86869ac0f5107c129fc02a708b9e9e89a76f9f57a35ec6c33c8a31dbec16bbf1d965c46ee2b167f5f135caeed8377e66d92bde61e1c48c5deae021629618484ed4e1320b27e6c643c40c4487cb1d84cb12cfac9b8cb2db4d2081ebe09329508b2991a67f7ea6fc2cf193e4e767c9929f9f244b7e9c68d2c49225353f3c8692f053eb4fcf2cd133330913afc6bc297928eba5acb77f9648e2050ee697ebfbf42d0536e9db4d38f16296a886b2181afa8148b40a1a814bc0241009843fb54226a01255f492254f9634d1a4abb48a1e0a57ff440375f713ada2ef1a0aac32d446da88ec250da555f44d98c075fdb344ca6642e256a2e9133dd34800f54c1b69283dd34b501c2da48a8c82eb7a68c91045f9a8184ae1c4c91b9aa112a287cc1b5241d813461107308d17439d7835ea69ff2cc9f4768956d1bf24b77fa0708dd56057c9df3f91e6b89744187a7a490557df4b224d0f350cbde402d7d54c756815cdfd133b49cfbcdcd8a655946b157daa93d4cb25705d4da6345e66af5472bde85648c92f8bac8892e5ab1540f9d26ab5308a787831149f5ecc7b422fa5e03a143442dfd564fa4e0a715d9d92697d5687faf601d72bee446fd133d1edbb9aec720a8ea523a7e0b0773db71b7983613895038b2ea7e0ea3b3e5e84bb98b3c737d1aa5e62e517b85aef76a3e24785fa9bfaf989e7bb098ef5a23927ae58a7bb49379105f732cbbb5ed2e409178fa5ee721b371b153e0aa3286e3df415d86d29a6bf78d7433df462e8dfed2b5a25a5b35002a7bd7f3aea5d0fe5d148fee61d2bfd61179baef749f99b4cca8b7e132f3389bb37df2d5d18a974531f61f99e7ca337491197e6bc3e459f5314dfe525956e0e913c9aa3d147278d48a4116944baf29554712fe9263d33fae813eb78f2a8c9687427aed8edb0afbcdeaecbdeb17265699221cb1f5086d7a86451062a538bdb0dcb7b49abe8134ebbcd128f586ed3dd4476aca8c188010300302e6f0c00c4b8dd44abe861dc9616dc4db69b8a732217d9d62b31164ba7b3cb8d7c150546ecec1654690116b610e53c81a41992422fb822fe6199384f007b280bb2c85a7e422c18cadd0bd0157ae84ca709b8ee0d3dc2c8d7ca7128d4af1aca01881cf0ced36295c3df0604cf11ab1cae8a6556db44238e54329d56585a502f60a45c620040c62fc6e1250002b84dbf9594720004f8000e733b9e0c73b8d980b9258034c0ad015e80dbc11c43c3871c3fe37630cfb835c0bdf1b2016ea346803be36f83c0cb06c02a0318c00038b9df3dcb985b8019f7e5025c9e1c2f0e8d4c002c85600e0378df0e9507709b08734fad7a57ddee940780391a4db3f218032500393e86006e7e31fd00dcd58be9bfdc06bc983e0e978717d3c7d7c68be9dfdbc38be9ffde78317d19170700eecd8be9c7b80e78317d979be3faf062fa30ee035e4cffc585c08be9a36e045e4cbfe5ea78317d96fbc38be9af5c09bc98fee94ee0c5f44d77c78be9972e055e4c9f748178317dee56e0c5f44797c78be98bae055e4c7fbb41bc98be762f70857831fdec62e0c5f4b19b8117d3af57033d5e4c53f860fa5825e57ec7dd1015a031261623e5f8aec2779b0fdda30235f36285b8dbaeeb9a79356aa533b9e3675e4ce7f021c7ab012bcdccab01df0e6f8a7904d7bd5091fbf38819294bb048a00829c184101231082511a5dfe3ae96aff7f075d1c51dce29637b0d6715b32cce320cd77e530553055cbc9d28d0223f3f211428b1811713ff1ebd939d76e10ea7c26037f5d8dbc2065e8c112ebe7b5bc8116b3c98649845a0642d674f411359959f500a7c320ab2c832f909a1c0892c84021f2594c808c84f28055764a1143c317da8d4683cee705e664f1246e6bcdca955f2d40a28b224947061f8d4aa8a95d85fdc9331e40488c917acf0a3644541c005134c00c51386a608c38a4e2107360920648fa309580197c40d4e4aac127d5dca2eb8c7358cfc0184924022854c0045ca53171c37f12f2998e009132cc95586ca1d3cfa9ad1aa3902aee6275402a00c57257012615e8e19d52a182884c41bf2cc4f08892a59a653c085942f5bbc70516b4d951a7b1d45d41daec7629b147d0bbbc5acb5d61ec32c668f6ddbb1f75b613878b76b2e4f203fa4e845daed5b3a8aa83b5c0f86b31bf115f656868b7c95dda7488661d8ed767b235f6578e7da77707611767b9f5323a02ff3b6f777cf9bbdd5705b6c1361fa01bd2032b3e66f57af89efd57206f60141620889295114c003cca10f2fdbc0a5b0d1f6ec290cebf069d91bf195f696c545beb2f7b19aa63d133dbb91af2cdef9f61d11ceec487b769fd36645d72e7af6ee17d54dbb96d9ac56ad6bcb221d97255c8091af523a7c5af5467c95bd55b1113bac8a7c8565d9b1ef749665aff67527c33b3b16776a026fd5ca5eff5645bed2f00e86772c7e11063eeb7e0d1bb1c3aadee20cc3afe217611a0791395e7ac12963c725d86bca144960824a0c8630839fd56b810f13546006224a50862856ef0fdbf7d27515ae437dba8186c68bdfc143081c3dd3551b1e7ca0d133393d63311cb1940ed129f056a203f11eec0689598e70ea87d145a7c0e8401cc34f6dc79ed24637b59df4d14537b58d704a3b29a5e1d40fdc45a70077d181c02fc2fcc8d80bf20c5f6f70f97a17423670ddcb8c6883636bb94317543829b6690f269665946a56d3b439e79c73cecb5e934e3b23a517ed07b1ab525ae96d5182a3b8fb512bad555ecb5c7b6e9141c872bae9d857564c26d35c69f9ca8d7c65c23b23bcb3d3b262fa64e13eba0f8d46c07c91af4e78878b30f326bcb3729d3e3ae9dcdfcaf48e3b5d266c134ba46bc40e2b2c83170795afbfab76d5b41622b64d74edcb176ac5c4d24ae948c90813d1564c7a895a65945438d1b7bf0863718d3052874fcdb094566439b933b2228ba945e5f90c93afd2ca4b2f5fa62d695ff5492e6b19062d431ff98dee53044f4f4f114398e828fdadb4c61378ab225aa68fbe43faf68d8453bd721f52aab10e9f96e8467c357a4b847d8a7c35c23b3b4c768c2e2a223581b71a9d67055746ecb02aa2c5b36a9d4eba91af4478e71186ee109dfbce09d31da78bbe323ae93e270eef88f0cec9841fcfaa848deca0e1ae669d8fbe9df4eef91b36628715e924fc224ccb111c878dd861357aa57f11a6fead365c23cc65d3a8fce4757b9c8ad5f9eb763ff2f597b10c37ac5eef42e6f90734c9601f10238c642e3f21237e728abec5f328d6e1d38ad7de8adfde7a5d60d8881d56adbe34628715bcad17c2dbe2d1de6abb43b61d26dadfca026fd592f7119d3bbc3e1884380524f503e9f041981e9ffa6174f81da3c31df611efc4dbbf2df503e9a30741c2233c8433e167ebe72b7ed5ea35ed55abb56aafdfa1bd6ab5ca0cb191a9dab177325a141d40a46b2fe121a46bb7dcdde159ed30d951fa8677b697708a72c7ee0e93d2316d74ed41905e7a6a07760defd05ec23bf1dadb523f8cf0901f1166bef42048b88716cf7d7bf7a41cd1037b1e953cdfb202eeade08730d9313af621dc90d1b1dbedee30217d7bab1deca995e8ee889ea21848ea07eed883189df4d40fdbb1efd88eedc06fa778077612de89c74e64c5b37a9b8dd40fdcb7efe0f086871081177dfb8ed1c43d30be834874c0dbedc22811663e5e28e5c2245292f8c0264011661ebb3e403509766dbe4505dc85735e179945b5f91612701d9492a792d4ce035a8520e2147dfc90f8b70a01c4298a27f068d36ffbe1ad7cea901d26d910ec43769848e0ade0ebdf0abb2d9e55767b87c0bf95765b3c3a7cea6176ed62b715e05965d8881d56467cd587b7c85746be6a4825b6fde9d612b5a54435e527d422a2d9f0a68491bac10d516a2085230c19f105112cd10414e4a0094974410b2b2808155922862c3f219f3500214fa1223f42457c70e8e0d1438b1ccf011f320c928a946110f2c13561e03a1aaa07c4929f908f15f9ca4fc8270a945a6baad480e1e5a54a2d6ad7fed9db444b6dd56e31ccd25a7b57bd406e2ae95cc5406e2a49ab1bf6ea159d4cda4450c8550d352985d8e7ac9446ac6fc56a96d95f3f7432ecdb07a11792e1f520d4da68b3be64d8c06e4b129c4ee7da879d4e6318841766f5e746fbbe0c71a517fcc415cb4b08320af5f8e4776124cbbba82e18af1d3ec69ad54ccb5eed21ee2066b55ba111f4582c6b7dbc41ecaf781dec30cab830b3b7af61ae55926b95eca26a87b05e35d2a03218f69d4edbecde459ed5bffaf63eebe0eb2bacf0aaadca70aa072c5b35b1cb7cecca5aa94c75a25a96768a6df8ba4076861001f25e8ccefc657fe5ec64ed9ac5574ecc5a8e8cfc5e0c761fc4f17888f8b7101146b0eb7af9d2e978fa2122a74189c48c52c6a8d33c124214d83a5f0b9155e34e28971c2139be239267ce9523eee03fc093e3bc4d3f56fc03222e22a5cc527fb7db616ccf329aca52a98bbea552377543b1ed946657ea62db6d5ac2a752cf4e5398dacc3eb3f4f6c6c8aebd5df6d429a531fe361b292c63c4c01dcddea0457e79fa6498a9135bcb47970597489527bff88b77a86fdf62891b9ca822676fe1428afce22d975b8ad294cc5efcf498b2a90be4863ec66f52a7317017e394be9fc2af55a9a7704771863a006ee965b9b8b87c25460a03b989f1d46f603c462a7596df8c3a18311e830577319ec2dd8bd177b92f03e016c690ad8a67b5fcc55ffc033c59c9cb477f712b0edf79393dcb59a9a7704724a7eef2728d7cf512e346be7a790cdc4906bce09d1e4388e090fde559bf239de52e9795135337d9e3b3eca5c7bf9c7ab9385c26f630e8e35fd016d47ddb4d0bee7872cbb317bcf3bfdc5eb8054144c699d8e38077ee71b84dc4e1eee0f09d225fbd1cffbd5c4900fe728710f903807bfe97bf601f2676c40513b9357b79f2cbdd61323a137bb8dd681f1d0796dbcbc28512f96d59cbc53ebace82ef908b8b7c75cc44fb5bad5c560e91d365657fd9747320eb7a3ce9b2387c61d95fdeb6b8c9b8af1190fde97466459a6aae0837fcb461097bb232335439bf61e80d523a991cb1d339e94c4d4ae72136958c6e998872648697deaeaade939a37649165545b5491e367d4c8295c766ae354935ce0bab14bab220dd5163855be26bdc065384746ce4eb10dfa4ea58a720b9c7cec9998e10e508c519a69dcc96aaf6720a537bbb33b83d366dadb32ba5df4110344b867fb088fe8b3209826ea747a67bb4c6896d14348df7808fa205c86d9b5fadec9d406c5d86d2182abd65e3be97c4f753dabd77ea3f2e42cc3e86623933a7d9dd61bf244b37dc3f90d4338bf41cacc9aebc225142ec6886bfc9cf546784148617c54702f3e5c618caf658d7d42b5ec8eb1e98fadf2a64d57e0d830a54a959d5c9201809c2363e49c76c939b02795731e108c9cf317398743e59cda9273244bcee9959c037b4e39e7019972ce4b398723e59ccae51c39ca392dca39b067cb390f48cb39b73987cb724ec5728eac39a7af9c037b68ce794033e75ce61c2ee69cda39470681390b5ce97642322b3bc6dd964a37077611240b5c0ecc2dc3f47aee7642b2e9b3a667327755495412953077699284bb9d6cc23a01a7ffa8a46c15b5a91e650cd18c000200002314002020140c8984a2c1704c2ecbca0f14800ba5ae4c62a28ac424c7514a21638c2184100300004000606434490039901ddc42e7a3f4ba072ddb6be2f2c6671e7c2c147e4edf65beee35343239b5ba6611873e155d1132943c9fb9ff3bb06b2beda5c6276c2c708013e1e657cc540cb9d7d2c6b6d2a8048935bf30aa724a9ef017c0fb455691570e7ea22b0056cd3ac8d59a1bcaa9e145796307a73607e7a2545e23b97d8d02ba849a882321ba02c09e912b28323c19ffda608f2b3c37cbd578e9a51aa30d119f688c122a66033e7cd6312669b93df09841cf94d3afd9c6bc193da0949257ab60fc6f1c3ca16a1897f9a88945b5ee339e7d635d0d74b469ce0e820bf5004e4249c5e88521a9230e0a30ad26543d70f02f9ea95e9f6b4d35c2ebe9b6b793ba41ebba748e5a073621b37f8263728e440a021f9c230338b5efe9d1d2d06b25d2ef6bbff45a71fef0eb3780f69f1f5de8877c10cfd30350eb56047b323726c5450d97e6d8ecbd828e22fec4a8a4886aaa61d09c48ffaa663eeb8ed9b13274677063593be98904b62e1c863e0c1fb6d4fa7ad6aeeb8a89d7e035c00b49558649733437f4e2c0d23bd08308d5bd0372264ba02fde1aae6be09c42b703444496fc2ecbfd05b580f8ddd5cbda6803dc467efe916603034a05cd7b81b68aec4534c350b483dba25e4114b49afa285367d238cc69f54f3d3077e587623fa4b9c72f504ad00bc2c5088c75bc6867ebcd0f172d492e311c6ffe18b02f55d112b3f10289d12484eed8fcc4c6b27f0d5d8d02b23cac24e8038d17dc65f4f9d32221345e7009f2e3a90923bcf03bcc9af40ca56ab1f782fd420e95e452860b81a5d06a3839651ab14a20554a50000504eded02c42821aff102340e9d4dcc405e701b2ff0df514008795de7291c03df424eed134a9f2f337bfeb89727a892046f6019661605daab86b94dbe699838b1241002ff14f46f26e255e6ade2b1c2603f059a72b7d6d74bf092e06ada539104808e41223a8b3504bad18fa402078cb45f0b75f6a3bf4612ec53113f778c65058dcf7c602c03cb648259ba2a2853170ac025d259afbd1c6b554935cac4c46454830b526dc24725098ad20a5a093762fe2388d915c1e01538d2253aadbcaa0af6b15294abc18562fe23649bf2a98fc36498eda1806b0c5390853f644533e8c543c5f20482bc5ae670560ea1fb202833b0fac556d643814853cf17732e02efb37420f59c879b29ad8c4b75735bd0a0567004a28ede7ce18ddb8b191d198ff201c129f80093cc142080f88b5190c994460dd9bf710c6e68c830c7094c7ad78f5606cd2c3ae3e6e2bec51ad6486ba1671916b0828b94734dc98b6472dd3d44ec085679192d27889583edaee35d289367b9724a8b1c365083973a2231a34053c3787975af8745ff4a2f44dee193206eb18b8ffc07ffcc21dbb35779723957c7f4a261024a99490db3474816a82f707087aca01df055bd2ffb405c5381219984fc2ef1fc92479898e630a2875811f40dd53ce025a7027d876b1b47f6e9117fc10d889a54b369b198318e8d6c8f26c321f5d29845dfa4bf6556446e6d36d59ca2b74e9d3c281385257b4542808581e8a0101441741c3efc9a28877aa59dc93bfb12bf3df19953546816b1593861330b46a0c81e3f2a84581fc2c052d2c5734280ad6712d60b6d298e98c568fd7930bdf47c4d56e25c1b505e59746448ec072844cb078146ffb8c16336efe82ca2fdfe8d1892cfe627ff05c4cbe2d7e28b858a76e655f467b3521e4359137af5cf822f0ed4ba5de18b39b5215e0ef19d48860485bbe306f7e728719252a68b8753f6cc32254b54cf4d5ac829fe9cccce6d77f8b77b506795a6bc80a9bb2175e2ac199f38b27cb72bdc7c7ca41c07dc313fa87c47efffb511d9535446933aa491a08729aebaa9057fecf76502ca9308d9e1aba9303734ea8af79c26c367ff57234603a657966aa659c10b346007123e27e65511d3391c041c34737714e9cf6d4797ae705dbaa60bfd4242e85e325f2c78ab1b94b41a23f55ea2bcdfb4a125e97716c5028f5b6ae3a25dc863f7920d6e22d3bf843654eb5791a084ce903a5d3bf27c70537be3fa59ecb14c0740265719268935a1ffe5c10e3dbb27369616813a4ceee9a452f316749c3d077f26daa2c3d51581a459da18ad4f86b068a7b0652bc9f85090f001131f9906aeaf8efa4cd66c4b8c4313742339ec3ffc70b8b9b99ad1058db761c48fb5dae201c86f6819d2a60ca4202715970b28a4e0655c3b05789b51bec458b43d2d7f6852cd46567b6f37dc38d417adc8633f788261be92fbe31548a55910728160aaf8ab18a89b616e082b7056a09f6273b7d9430c565f5306e6dc35f3211109f79a4677478de92942c1273cfdc3607231d78677a02dbb0709b21da8f61482e09d1659a1bfc4a2b016ca80f6f6c3a86ebd3a64c5bc3202e3538a0eed1268433444631b7a15918ee5ee7fe0ee14ac1e8105e055450d90c2a8841364b83a61535a9a518abae77c0cca8fe027253c7d9833ae68c902220eb911021a224aee270bb3f448a4cbee6315caf9914be1c02d04f937f60601806ba83c7612e3b04f00c9a44ef73976a0eb42ca9922df1ba75c237549f0df74368474d30f4a16a85f35c6b64df3142bbe9e4d1f577369e82dfafffd3f4ae107f9ea681bfb3a403f238e4db4d3e86f9201bc19a1c415c7a966c4ada4c2375a301b304a8c3318232cd221519ba546e5cc89bd430895a5c193252c5f96cbcd98953edcfca69f4d01e9df6b85e72f2938581c8f1d249d318ec46862d4a3a4698890814797106449df148b30f89442e0456ff7abe30395ba2c0e34e40970785b8753d14354b7002e72335c5576daecc306bbe83c6bd31b5216c4aecfb9235b599b6200a7888ddf12cb720cec8e4cdc291ebc0719122035de8a45ac4b93fd238e9df110665df68384575c0072ae36806c2210156efa3fb1d1a70b468a24379550855532f5cba961f3b35924333ad501235cf8f56dde9cfbec55e1a61388348ba9142833beeac521209ba607f61f1b523cef01f8a1ec041320885ebef1ad82025aefa50efe057e96ab19a80c80407134b9bdfaeb986709d06a2e21b6084c9b40b177b1232981e9ca5bcde7405cdc2c669ce2d0cf68a8126ff8abe71cf097127b2d0f09dd3ed0a8fa11dbc4cc154d9a36e802c247e15a01cedb0f2c20087fc28c54ec058d0f20b3ae51998d4efc640bd99ea47aeb68c520c3ef2525df6d4540780f4dfb1d8dea68377b395adb9a4120e38700d82b6d09c00d1208a964eb1448ae5170e51e01aaf87dd7f0fd027ead032c23a3bc9ca5ec34437501b7d8c11473f733decbc2f3cc5640b58a4b27e326a7432adb0cb16407d9d741922ea46e1da7b47c2ec7357431878bfaa2fdda5b72ba7359c5101daec9fefc3e775136f3722566751d0b67f8b7503f1e89c90a8504948d0865becc8fc21d462c4249d96bccb1cc95c8fa95b875908a445e506ddc8dea04ddef0dd6544ab73243f40cd5619ee7155de6fcdb330a373ba8b195f1b520382929cbeb69c5da461b78f5699dd8eea53b13fade90edd9873aa95cc9d4abe8b1335658ab19b083612319be9bf86dd9491cc000b173d434d8bf4f1844908ceb677ab301f051a5f026027112551a04c8968c3ad613d2bc2e33c123a7d8fe75f8484c07de3fe4004d3a47df59f0d022371af7b69896c40f89267c238e6ff5887e4daab74ed57ac131cf1d177dd40332640df3018b91844fa7f109d31ef78530d7729ad9290a961143e28e015dc9e0ecd04fec00a2a41c668aa221b056b7b52c47ca918fadfc856161f7f7fa90f761a652f53c11b2bde055c83dff9162cfb54d48c733b6cff1a8dbd5feb37b1347f6e2a5df5faffd2426275cf333ab52c4aa9aa370b601f69adf631c8624f1115d489c308a07ad0e3c47f87b92a771dd10e3c1a869c8532babc5abeb2c83cbad53afa2616f9cd420de8dd8feb161681a95a4104aa38af847687f7ccd6a556ce32190930fb57909f01156859dc3871a9e5830dc359ae19eea144a4456b1226182f0a543d8070922945e5b0f438515290543aafe89a7026f110eaaf17ceae06009a50e28a48a074111d87b9482c888a9e2d8350ce499ed15a45c8dc74a93b92a90b578390005906afb045fff2ad577933f84f1e5de00dcf4209054d80db5247760c529a4235ef6b9b760722de0b886816f11b9fcc5e8b2de3cc277fdb5ecb4ae34613eb5a4731397ed3a4f3631f48a658e3ac1b0fa3952ab9014cae3ca024dacaafc7f81282c0a624e7dc600ed0198c13da28de0dd9f62bc63f0b7c0892e5f78cfbda84b3e2db275507e690b3738d6c30fae8291fc41e1ea40520c410e0d4206e46c0eca5493a7fd69aa8f45ecec52d0c7f8d73151fd23f451d2ad909c9db8665a3ab1a16ef2fe0efd8a2f113b09cb864619d0353038b5bb5e56a5a8d3e8813c72124a90d7c06cd22f39a7505b8b12470a9b83c04c4b6132c8f550853d43848f9c33a12a737ad255161b1eb1608594ac898fbeb44acf280b250eba961544ad2a70f372ef652b412eff05cdb00d979013835cfe87122715c4abae5a51eb2522cfb8eb4f8f781cad9c53db3fd155ce348cf5095d6ce35093de01f1e78c006cf90ff1417bf76462e53de7ce14dfb99e891f0397ee829af17f8dfac18a903ac8c0e14cf0eef0492fedf479fcc97847565fc969f213be3d5d427be41a308d4154467adfc42c2a2bd37443699468f8402ac9137f443a7a1a18f2610d46b3c4c3654f7e88328f1546596ef55704646d388196d4ee41ca619a0c89fd78dc079e226e27c489824ba615d76b43124a6ae670b1aac55720d4dbabb2b71f5cbae6ec9ad11c6deaa107aabeaee3d06745d096c8257102673f35cf73bf0e93a5cdd4b2f4bf1e4f26b44ab5020d2528def9846c972e3193a76c43e076d29c65c727f98b3c8eb212c264e0278e2d55cbe9d3216c938ba09beede0851d8faf1665101179424ce3a5a387a2a2b913acfdb25fd5762a6c7930610074450c66307b4a7695034b55d60c3b3ea932e729700aca6f81355421cbbcb41c79b6b0e96082847cfce8ad862fa22ef71b19bc4acdc88b2e87341b2795e553b2c610d29de24c88f64df9294a428d4c2bf1bcdc82da87bc54f94d04e8c5fd2df8ec35e003da24624df49c8a5d16646ffdebfcf43089444cc86f405d10eccd7417fa006fe9e0a6a0ede29dabb3552c16931ab8de9fead42be0b123086b017c909bdab45b80a17a66dbedd0acaa198e8b3f1267a59844fb64c0ac41ea3bec5c63165d14ee28aacb3c2efa2a0fbdca8bec371670457d06a8188b9313debaac6d1576f53a7ccf158d7243b8a51f9b528e6d58ab90b7ef87d5d01f5ee0dcd0aa267de2fb2659f9e3cdd35dfdebb964e6a146d72ba7113443b983ea5bb4aae2474d488f90a78dc6fbcdf813bb53aa4a7be2402293fa7c22db00c2dc918b612c9f52128f39d57a337942a5f4efc6abc497802d4ea87c30146a1ffb47a2b6d013681e13a8b8c09ed88b187063a656c78442ca5022df3a11c6988552f15c41839dfdb5eaca3d380d67abee9d906d5e6c320e2ef61e2509a14c446ba79baf735720ac7514ed4923de92ffb2c7d5546af0f62c525b6413abd804cf179c32f4a6194f2b8ee14a8762e97139dfebf8c659e7354c1a7e50c27b949c72af9d937dad8ddf94965883bcdd9c9c876989b70e2a8589ff8cb4f37488fb7396e41731f99ca849836957f0b4ef84b94e35d5062d13fc8807f4d2bb7ace577f8327fb0ae3948cf7a1a84f34381ee82abcd19ff5829e52c57fd309beb0f88e74ef059188806044f26863a6536d61a98e05348fc814d7f7bc7dc817f36ae179a03f4cf020432c627ce595c6a38fd16bc796b3e88a8bad23722a5895f0e185fcde1ed624103ae21ae1337de1eda5d7a2b8e1d64b79f8348db7e0a3c357c37530a9e89f56f8fb462fc383f9f15f9264d394c0d76d5c46daa71335a9106a56fcd9a2b0694c2872c3da2635a07c1c00be3ec19ea8cf8914950a40574123718db302ab209daa55928fecabd0aeba1856ee24a2b064878b66748b7aa3652d6caaf5c070d54437c0cc0b1ab1b150c8438786fe23fdd95d2bc8ae2c7cd9089cbbf16ee2dc53dd1ff753868be5ae72363387a6457c8610495e262957ee4488ce34730eaa30c541df57d9942844a86fc23044da52a20ecee64c321f93e034425b55ac5e2ccc248c41e8d6b6f9c1b4fae76a1183ba8f55cc91191458fb097afec70be8126bc3a20873d8585f1b52d137bd55568d5f6f133d5977d366cb863e6744ed2e4afcf19ff1c88196a19ec69b0cac95939ec92f8d999d060433e8fec1b6c43537e2c8462777310cbb42600c9ef08c1a5aa50cab0c2b894610bbc91cc6b306aa81314f42a545e24e4caa6939c0b6bceff3f4a434da8783e15061ba203ccca4961d766b2c5aa7c1e51019cc5bf26e4e11ebb4be756c281dfabb2bcab2c00a396a80c8cf673ac7772843ef6e76849ba312bbe2638e942c45d9f16d9b18ddde4061e5510b65f807a9670846699cdf8b254d7371199b7db356c040aa39581ec130ee14d608d06377abc8bdc6c025a85fc186c4e2cbf145e5a34cc32c69272543806ee0845c11c5db47728b2ea663a6be9b907b0b505655088710a5a2e34ec9eb907680a564be72fe5cb3b08b2d48e82a9d80c867605272bcf3153e801ba926a4a339525231d23aefd5197f696069b7c6712603c4ec6f1ead9d52ee709882b1a2e5b9c045324ba1a44c93abf087b55ded62b516df422520c38a21dd58bdc22d8a14d6ee092bf19de8b59b71a4d8135465e964137e812cbce11d504ffdd1461674165dc264fd822647b6bf6a60bb5b1ca38478439616ac419f92ed5acc506c2bdaae17d90ad8c6ec9780f605ac6ac7efe055b6dd2720401d5b420305a09c7e3ee64514454598ecbc3ac656df7acb3e7af01d66e9c163e3491a5fce0ffd4a485e11d52892e60e54a3445f1d59bca54bc05d5e950bd8124a84e75b1cbe9e56e63ce0bf11e4c6254a276c02f1860921ecc35c577e13a3b1720118a1c78ceadc73a940f368cb733a7d01ea9956ef7333a3cfde375ceaaddb10bc3cdb04d12321a4dc9468eda08d16f28d6c1762e2c584f9f05634086f1f2659f30cffe9162d5ab8552971bc91d1e1af8ab5be239992835d25245e2f8d4b4258cb04fcdf8da287bfdef479434210c35c60d02c27b113983df1b6148a5da338d65a455e8ebe460048ddfa0d43460ac674f316403b9e29ac7b7ad1059e496ba13ed4dd63955b2269cb3b81588c3387aaf93fbb4dae3ca4f77e9f5379ac723d44c731f3c81637631c61ce5aa45492f90c5e3a74fa85b94bfa826ab621aaa0e906bc528dd54d7328a979cb892c936d4bb28250d7c36e82e467d7401d287a99a2c30059f4e6a7e8a9656abbca596e6d189a4707c4df60a0b05ef9f40589195b3f96314aef604ea009ba5ec09bdd9176ac79160a79ecc27d9871b510e44d436f2264539991d9752582cdff7db9f2e966072d4cbfb4fb0020e77f794edf96257f54574e14094f04369a7ca12511fdd70bd24979446c4f6a3380ffa4b5aa6d3a75275dce62709c43c49d25efa9b8eb201093a4a2fc8d1ddc371c51aa1a3386067de7589d484d0441d8febdc093944fb3404daef97950d564e6fda78204f12ed9a0dcf4c4b427c61a0a57ed84de570c5c1e29285145460277842d0e5a34585f1bab1d5216901a73fde49ebb8aa06a8192ef6535f4c8652496c4f58a5d58ae76fe9f8839b68c3c3242655c71567b0d9d65552db641ec0d8d328c0a5747f2536606da4ac67ae9798ee133e4653644df15e5e05f6c5ad7689ec060502c2581dd8053ae49d0c677e47fc5237484adb883542a185737d197388790c42dbcf085cc6f3b9072f77396686a7f021513b546b2f869c6fa815d372f56aa9b8ea5d492ade550f99eaa8e38e1e51f522fa9a61af74b415e088259e5dc9cf11e00513c50f857b6f813ee32071db7a0ecfa0447d8ad8280ed1d147b71d267f847c522ee1ebcfaafa98ed39fdd0c60875b7fa2fbc454c0c9e07d0a574249ff95225f0da53a6db647f685d30e85f71656624a58aec2d97759396d14ed1f69f83f57d8844e117f2f36ba6449589275eb12ae136f42cfe092efdf09351b8632906c43bdb9de40a194f6aa03c109c25b6c4ddd55c9722ccd8c047eaa9866e5c9d3b7184cb0e031be63bcadc3da4357d34599d5e1c056a8ddfe39185558e004d8dd81f18255639baae14c96b09b05e451c351bd1dab555db25914508db1e1fbe2128305d87dc697ff9ff05c8ccb5cd606b48fe8ec0e2efd9dcfc7a9585fb8cd99c7503b13cf5bcf178946669fa70e37d1a6b021c675d0ca0ffe056e798f5448b9464da3037a858ecee278bf4dc0f795f84345fd4ed84f20639736d068d3466b999fe7cfe8133e28a0539692eb3b4549c481f46e9741ff5e78db8d001485918c68450ab063aa67e0a74b573b3fb27c2151fcab2d9eb27fe60623bdb00c88fb3388d71e3b8657d193c8d62fd7a32fc38a5ecaa307fa2d5984d0b86c29dd34be8fdfc8242f13ac89e60269b055c02198318805febff084dae0c727183491a8f982778d9206e41783dd617258d2d4d0a59aed35390b358c5012cb5493b98e2e6b4dfc6148a41594637b3d57ce4ae198d2a86668d38e8605632f389ee2068146224cdda8c71dd18d886820edeac22ee264f0015c7ef2077d88106d3804b7750daee8ee158c29fc3bde2451606a4664fb50c64124bce6dd7b50d26eff989b7d6623c007ae23666c79f3fecf184ae95cd78dc3e24cf09f044f7211620d1c8055b2936d218caf6bc9001fedbcf36203b4c32f10aab026bdb126f58668e24ce44050d56d13922544c859561d3913bfa44278ec510da54448fc4f5c5ee601feaa1f87c133d422203fd5b27d302c762e63d6478f0663d28233f9695a6db9a8443ed898807d90957bf0e9f0862542ee2a81263ddda5cbf956794fed380930ea293d2b7f098527080ae38c76edf0e8286d78d5299992451c52b54d1eec573ac4cdeac390ab3c34ee3b607bb1c59e5920a08afb9de59b0674be16f0530c1e4e7190d742f114df9726d9e18b9229cbae4af1036b28a0a9ca913d93878770037c7713b66e7be9fbaa0abdf31547c014c604156560b48bbd2b551240096a29c19942c959cd305636080efb1fc32ef639a0cca8a66ee6ace99ed8c17f4a862fe5a151d5b0764308ac508b8f756077b0c0e4706821f90c0d563277b6521b20b8b681b70b5dfe940f32b2b3759904621f87905b2df5e62a90a8b2d175c8e81fe0f722e19b88f199e1d63d4056777fe55b3fa17e1d6cd0dc68764e138c1a3817b91a5dbfc20eea5e10aa26599c8f76fd0b9ab9585615162b7b7d2ae5222ff2e188edd59be1443dfb7b0f6e2bd883844abb62906cd645953a6a911a7191b6792073f0620c561c6651f2de823d26d472258a7ac232e073190227c4db372e3f328d7b4e255551398a8f62e98e9f0e2efc066eebdad5e89352dd7692eb6ef12d14df1d62212a9d75218d10bdd138d3dfa00543ceebaacfec204dbb9ce85a5955213ca2ffc682daf2ae8b84a879ec1a38b6ee568cb8c3a8a78af316627db03a5153196451cc2f3981227515443f38cedfe300b24deea1422c3d75cdf55bb9719246f278ce2cc44cae6f6e34959f755530b88a25621dd4bf7568a90babf6f186a71f418902cbe7fa7764696f18c70763fc01daa92cfc4eaa5f079a6220b4f5cd7fede271f388a13e716464f85ec25ef17455d84db2e723faf076a9939c73fcd7bdb4d99c680db0f862400c8775a22fa46bacf967bdac70336caa2160c665c5e9f7abc688b4bf2d0ed595aa4b1d0f6dd9d4e8f8fe45d5292cd5fdbf0ca54bae72c06aa032d7e6b5431978026c137576a3f4e996353500d5bf402ec74df98836e967f44c313976b1dc5e932c80e2d5996e4effb95d9772127296232fe0eed11ac6e6b501039317a90b2f37a9c52dc876214ee1075b5ceb1d843e4a2b8f6975cfcaa9011b4534c3ce58d3998da25238d6632b36c1efd628939d710c8d2f5ef2aa20e77b833acd1ca9231c0e1e624920358b95d98e2af40509264d2343525d1e03c6221fb2867c2ff05b6f256e8e5810d0c91b69c6bea410d517c9929a86df66ca25d2e08d26315eb7308bbf0d8ee2af450b2e835de73e5c819a19c93fcb39a508ad7debe72e595d036eb5f0dd5373a24a60dace704f059bbc817d9a17c6ec396a995e7ddcdb79e127f63454814e7d0f187babeb01201c4817ff65e48e727e150aaefd5a1c904debc76f28f4b8e7d4df81d0760dba2a5180a135f47f7c994dbdb8adee4133b8955c2bb99cf24bf8452c1887814162cb57f258a2375c15c258c1b5d0fd3822c8b2cc64ae1b08fa6335f6943e37866bbe766d020b0a2b867819e1dabdeafac3b9ab9c069c64f0fa2509eeefe804d520068bc44874e004c3cb5c59d5fba24ca07c1d94996de94de260957d224080340b3e9b90a5267197a6b3f30e4014cb8ec0302adc24fb6a639a62b36a4f406885d304f0a12b8164a476d53cc824780d15fbbe6cf9811d2ecd80671a4c86811a1dafd58305cd8e5282e2848acbaf70857d2bf3d34d513485de0c9066f2319e658aa903c7da6deb09b3594ff059c3c285bff633292a5e010b227f2760d284818e1fa067acb5e42c33944d0586b812f0874657a642962a321a921425556b55531479433129f119eb668cce0ce03a51e1b51d8420bdb66f3ef82da08183e7d055424c6dc1f5fdd8c73351ef59f0ac60aa36720b38d7b459213905cc50622c9d5003f6bd552ada6e01857a1a1ae2edf5511aece90b910e7171eedf26204de36b4e768e0487254d0f56213a0fe8210b66eaf2ac06e1c74297560231ded97795135350696aa3b5e246b1344927348e9e4b0408655c61d2c47165da2c63464ab7eeb81e40fc38ea299cb4c9b8555a291160e6f3631cd49765b24e7544674121406989302969212ee86dd6c37e0ddf9ad04c461065e2c651fcf1a70d52f83ab549c4501eda060835c11753373301b9a9b5fcd0dbaae42992a290c5221f53363e98d34e4dd192e8686982f57facc888276518757744207a0c29b2cdfa0a12a856961f28903c58c29f4c801987337e85e81ee026c8a8dd34ddd97f91b3b77ed31d9fd006367b1c6a0b7889790bd9660ca6c91da3d56dcd973bc13ea51340b8c0c6aa7dde3ca608626fa8222a3e8f64643ef301197f716bd7f86c10807b7c43231fdb2e1fad1a52aa974c0947bacc23e6ba454aef9adc7eff8e4601e24ef46e59fd13d5455b9188238b5dae01c0cdaa1d339fd6c5e915389c235c82d081159cd06afa1a80976caecbfe6efc9c224342e1c25a09a143ba933b0a21aab78950237f0aadec8f426703be7cab2c01fb05ad6d2769a6e95853d22a7f5bbb4ae1ee1c7610211aab7a09664714500c7c747d115d3b22014485474b21395d24dd8bc302e37cfa1ba8b2b4639e96f86ad1352a1def7ce2331b301af4cb9217d0dc2ebe8a006e812107323bb0c0b440ff8ce0cdd4281376caa558dfda40ab0a36ab6a8a93f1959c8aa1093c91a84ff767a724ce1445257b028f124bec020647fed3900f1d310458a74396ab6a2123863f783a3ef6165ffadf62eba68fcb0b0c13176c25a4302624f0719738ea04e4a2b89984c533e284a1b8139918236c7dcf46d8bc6a5d171b27e585d3cf78145c15a880456f2502fc2f46d9c7816d111dc00c0dd1a7fd509ab033519b43dad9ca96a6a382ea67a9b5b4695f942aad29b9b32cbc3889fc0b44f2b52a5ab3a6ed4f530ec2c08c5c13b094ae33f41b0b903b0bee6057e4a37499e7c342b9e4605d41a206299dfaac319947871f87fea12cc1655e3be5bc39198bd163c4b427e077b5ff4df1d0abd6ea8bb2219a459bd5b881184ec20f8112e22d328825738d762bd2b8dae45ee1d32ee5337108b90461fd54a06c3d5e7e2bdda7cf2b3c988e69176350b98c78f31bf96325483a0c7129a4a1b967e57288bbeaec529f6b888797628cbba215ff8179cdc051984025d6a4c3084c202f106fc743a912eed9cd936370661a7091fc0da3e4b0635877ed9853b0cce55ba508864c66c16aaecdf8ca1a34a0b5161b2fd6524873d1b7af091766763554642cf2f6fa3338ccf42e09f20bb56f413423933cabdcfb67b5adeb783eab0455ce53eb1e0ce04cb9b80e4ff6927181d24d4c172ee98f4743e4ec4947a81025d70b7c610b097a3fe68ba708e16fe196d474c6af0617a2a3b0c0f7c83036bcb163ee01515da53bd3ea25a4c15f9c0b39ee491eac0ba03b8326265b89071b330746477f9fed1d141b63f501c04520101142afbd468a5cc0e32ed4b1ef1535c52d543e8d017a0da4b55bba30b1899ac3fc6758ba89b67a5fd302b4947a450dda950e15de3f7772b0cf256c34b90f3412d5406be5cfc64428db213940ef1f6dcf1e72e8d40fd0bf1f8b0775f88fe9863227e0cb31c21980de68d642fb7c1d453044d5c1e082bd2b4c710863a0271997f90d90f257289092ded7000d17fee6070de8692a8710b23da182024d902bd07a35364f300a011a19d39f6629e5f1c101c7f11fabff85423ee3ea097aa818d945393e097d364515435ac7bd6e64bc69209115b699a72b9e900ecbcb3cf794fdbc8590b030c8d2cbe9254f775284741409fd30f1cf4b47a8c5343ff0502f4632b04ec20b47db43841c69eebce392a24e78288013e1949b725334d4638b28df1efcf4e6b37c4e155a4ffa855c1e63022d4b026f9f101d63fed460d14a64d76e6e5ea90d3f505fea013915fc170d19bad9130510dcff5975404b67ae2a0a67d2ddd91cc8b903dc3b4b88aee202a97ed1b3bb00043c10cfe19b0311be0883118c6965cfb8af00e6dbc368b9b310d9e495e6813251a9372c50e96c5f6418b5cb603682fd58973384f9de56c3a0e1954702afa336fb050ca5a2b80e5d958db96dd978f76baeadd2b720611c97dc7ab5a3a99fe56dbd73d29e95f181abacfbe0c1f342c62917c63a3cab76d362d9c02c1b06766676d5cde3ea686dc33842b0e4c1ff7f1406cbc755b4b07e9c16da89fa217a2ffff440aa52432ec4869794bbccc7f2eef61d8328596fd3afe8ec2043f5859c4233cfd7c6f26b40682bbde16ff1cbcc7707b4aced2e5e4d2a1aabf8f831dab2b9db8a248e324d15ab2ba5fcaa02c5041b31af88c51cf4d87d47d84d2fd635d6a16183e43b5589ef66030dd92c0dc9c6a3f53eabe1af6e8341fe8f7e420b1ac158498464497cf2ca73306eb0a03cf37b9211a69c45e6822b6f9fd7e5b8a4bacfcd7ce4bfcdaf155cfc51da69aec6db7ea0bf174f6660271e0c3a4f2e3590d4c5113ce346efe49f0bf1692dc5ffbc1a5d6c8742ebb1d02d5861c4636cb48fc3e4e54c305d3eecb54196d52fde63899b469513cad7eaf6bfafca929ef0af34758245e60dbba022e6c98c9cf497f8ce521149e596797fa472829e85051f41be9d824a9e6e781e8a7af6a19eb238fd0e7da1296bd36f1522c2671ba52263123333e8b3ab63bfe2764406406751e6beb8c87b6d59a7e3a959f3c6e2cf1caedcef6055f3094396f22819de4c68535597036b4539ef1118e0d5d2838af392203e433d9188287020d27bea09dd8f01bbfe18a40f0ccae23182c7ccf6d2576b33620037f1cea40de24ea0f6d3d6bbf0f7c2801759a652113bcc8f8bd129a9ccda5908d6b5706d88d5b768eaba51a92f67dbf5ade0afd00105fa3788d501a1c944d802ca4a1c1dba66ac29f2a33807e2584c49d7e35cd0fc446518412bb83e8c1f643e722ede2954fb7eacbdc48c96704700489160689c4d4cc5be9c24727b35a3854e8e06403336b37dd90f66182c2ea0d6815003e4ca24a64590c2eb8af89b3fc90889eae7c2ef6bc77eb5675bcc9739ced1a45dcf5b584c950f81164000723ed4c75d56e093af33d64973422faa244bfa3219523d2230106ef43ddb2657a2143967f343b0845838a7a38659a782286b89a3bb2e5186460be63cab04bbe23282fd5b7ea1da02de030dcce149c206c382cffcf52fe99ab1a792615f386747d007244d600c25568c353735c74ab030731b6ba9622befac62165127a5f8f191e008b8ed26b16227b79f85e380c8f0b23ef9ad9bb4b724be974d7d4454e7db5a94cf8a00c9ee396a73a6e36cbd38bd0a5005ff95eb7f228c8e07d4572e28a8b0c520859926c2cb916e4da15e115ad294cc0311b155a3ca74a809512331324881c9d2b3d9b357c4142b5e17ab5389dd5d4db3dd2fe55ea8e1a62243c1b161457053116b9e6ec4a130ebc867a98565ad2d84ed40882664c0237764a7d8dfbaebbd8a8ced54eff8d310330cc0c04fd1ca81cf3b097d5f8342274093ddc47df79f79799cce3bbf1310fdb8453e3cd3dd6b5841aea072911a1bc432e672c699cac181deb204dfee17b995049e34340a8832e9cfbdfb10f849703a896fbfe5114ace05e7f4e0ec3ef0c64bd85764a9ec2365d17cdf9b34719dc27e46a7ae987968cf47f26a3a960b0a25b193e75f93aa10ac4eb78d0304ba9b4c66d2c1a4d5515ea7d131cfe21d36116412b58bd7bee52e2c9a65aff74e67679fbbd4a40549080795d60910b1520904b945952438f8120f3b12d2c0ca3fa76d77d432fc390965ccb3c64d23205cef401d93dc776b6e9971a6e593eb722871f62f7f9dc760a2f06aa172d9a433c7fa37982814ec07bba130d2405d7e1ecf0322da5ab04839ad8c9d0bf200b84b0b76544d961bf39aeeb4cff12ac4f1da2e727ae32407eb03cad642098e9af2cccceb73f3e87adf70e3d5fe5c02295027b3468c4217e12d65a53489b7746e77d1f3215aa63f422b95b4cdc32bac038e0bb356a8086441373c31be5a83ae0c4fd95f8098e2267a3fb89f9972f2d3b3fd7fdf8a6d54ed22215dd3676bab75aa14760f1ac1efe3997172e8719d1a77a9a357f65f59ce3ff84904e3f540c5eb8c6346bd686f7d04b2139226e4be1b22f1256872bb51a32c9040a9582e0b98776abd9ac12a422370bd915d808a29fc36e479d37e3e3a7e2ea908031990a03b522f4ea2a42cff8a9adc86e23877499af73c4d3356e156754c5eded422d9f847f51058fd0a6522dd03725818b1d1a8adcdfe08c516cc4f3ccd30bab3a3a6e4b30884ee874beb131db0304d0e30338765c37157661ce2b86a36201eb97e3e63be3cd84a6da8621f16be56d057cdcb7cf87f38d5a305bc7bc14c01106ad83f13d711c03d056043073804c4e6f3aac3daa5527b034bfe248ca5f926175b2ea34aacfa9590b1583458b88f484f1084a04ee23d8cc4ec4a32f04c88e9d800181418ee3e9a124306559498bd414e3b9cfaea901ade97d66980bc81cbe4460bfcf54a4aa4e46e12ce934df806a4d4f3f2e9800ed97c2497422d827a276f85f717fd355b745b95a0f0e20be0e089a050c6eae4938db1d8d83933f1e509feac0d5dde73a9d54a87bc360307f8ecd8e727235e5e370e74aae123f2e74732a8dc0482d10627437c792a829d4546621140ca247becd8449818453a7e84adbfd4208fa39bd436630b2dffa98a98db30e834b04f36b41f1d2796aca4794d29e6c67c2f52bdbd186a105dfc3595cb9f6d656e4c3fa208528d870c8810a81010b3d86f6bf6e689f477f82b66ca6de419166cbf8fe9b42fe22f5bcff84faee8a82de89733129dec037addb81e01f8b74e589ee9d80e668220573cd6ea32c87526f1066395bb074c7f5f6a16341b2a09db512f721e2dac5228673398f084295d8aef30fb76abb69120645bc793549e5210a88a6acd47c7b1f3f78d6ebaa57a2b452c41e4f9b488ede6b185d2104718e5c60e3f2347c2121d9caabaf02fc00881c66a84f8316a8d81be23d431ad5b48051f3eb00484a5458240cc7e2109634c1772430ab3493eb8951a9ba440979e876cef5bd743ecb4c4d940db5e331b69d95d4e341a46975b40eee0b030a6636a51ad2bebddd1ea20e2f87463038f214d8d8a0220e6a7ff3321f702d41506ae031c7998c8c212fc625520c8f356ce6d4fa06007b3775bd66087af076db22eb824b9b116e330977b2c47352bc87a9a0dd608c80b1772add7caf59c2dee7f1c3dc858f768ee079b38f08b722b07a0a594c1c4514259a63dce9387fc93b5693676470c880a28d863896e7d4bf56e531f22fcdd7ec858cb1f5fe41c88ed3a1887d0e04c8901bf7208107e4d2ac220011dc9ec74ad06c17c24f18cd9cdd5c430d9aeca405157081af798019371e2a3feae29bc413f92bad833ea1ee733e7b324e9cce0db2fcb8f466eae8201eaac4df925c01f51823c616bec40e8be8bd6c8240132ea1058cc9206c02c7ae341dbee85c85d7f911e09000700e486e389ac060510d24a41f3875284c8b19cdfa5db3836f9f92631c8a622b43fa44d7ed96185ee4b3b834460df71367962c942103e2c21271cea39e558ae4ec938a92c0ee88d2010d21fcb6bf0b0da010126d110c7027ad6f79cb9898fddefc0259a3eaa0963216dcabb69ce63b3658027f82286a79829a06ee668254dce8e89af4afbb8b2cbb5d745195ba282aba183c0847a11a5485afacd1df65be6101ce0d5a18ca7e97ca2ca37bf0c54bd3fb4e69e1146296c82209c49f514e4126a07afef04adafabc7ce78319a97a2961e3a2a4581f86b5a657f220b86ccda3820511b1732023aa9acd8ea8aee191a60de48e339a9b20806f4958710ab385a921d4bcb2b6e31b39d0d05fd7d029b1a568b81071feb9cf6f21574d58a57d2bce45e91859647cdb3a8d7cc3fdf0cfa535376b44780ed56f254b1ca51ae780f6992b2dc9203c7aeae7451cf77fc9c673e20eb08538f7d65074e843d1cb56b9d87dec594b4b0454a1731b43630ecc537e8bb89203195895e321965db34068d65efc3df1be3b17a418df4ab23b241772333918ad1bf3020e7ba498846e1636ff931c2856be17fb267b138278ecd83916ff33636d5ab1aafc9bd3e604e9db1624367533eaf5f094900af908b53d37a10138c1264c5e59ff37fd31b44db0a592e5d64211f438257fac0b06962cd637399074bbb61c3091942e0556c97744dd18b52c21b549ed7400a9616801573f10d71c2c3e4ed103456f773ebe8b0d34e3c556fbe3cf5487d61ef6ab06c8574c67dd4d6d8f0836f893d3cb278d2274fc64224476849d526a657f9a0e65ee8c6d1640ba8a6460fd5727584eeec4e937128ed9f18df399952c21768df8593667f68e08b58731b56dfe667a8c3d9c72ec4fa8c7deff90b532a397f5c673b12f69ab3be47b30b2cdb9071b4840cd9c8f0d0e477820b6298a2ad1102cc7d28d650bb83562b0da51cbb5b108831f0c947627128b60bb8adc20c3b2f46960fbe7cd660c56965fd6d9425df9b4560477c212548c83d22b8c9366cd6433598b33995e30e45dcd1c9ef98c9b96e87391ff14733a39c5ece4f50433f22733f0fe92cbc9680073f8240badce8e2a4dab26c6661ab3d51aa61c9130ca073c286cc6e71404d83c01d2b4fff870b770fb147b6362ef786f081906be6b9b7ab262646fd542ad14bb70bd954589fab84fcda1ac0512e6233073809b7a101b4fb0ebc79ac83281a4cd825bae3a8b7b387d803f71608e398fcfe92a3dd51bd90d06671a2d742845482b7581e4fcb9a412bf7e90eebe1185dd255082ddfc3c57ca7663f40058f9221c23c92ba132f010cf9c462d90a959f25e4a1f40e5ae7966152615a02e43ad741f1cd1522bb84dfd4297043ad9311e5ac5fc673d005340e6a2b13215a55c5c49c9b1789bc4a2be82dfae402fe885b3555a28d939b92b6a5cd12f7cd46e3e253fa0adaf924796ddaa38304f8eb48aa3648895903eb6f8e823ca586011aaa69e0ae17bebaabe8e04d00ac112c601ad86997fa467a03abab6c4d3cd24cb23e7f7a7416ab5158532b70c61a518c588fa0b287a49a406ab35ed9901aa07c01a207305efeb9d56faba8cca90094efee74d49826fc697a2d735cfe91cacb27df6524dd897b7df56dd54d3ef0b89d101d88da1a6489d642ddea3281f0313db02b0d40ef45e009d023c3501e1b0d73c1f7817adc9b2b37af59e11241b8ad789b1413cf3620e9747e5b7736efe5e7951e1b87e3b8e2293eea0a49c80d214a14c28e87c0d18a0aafda369ee008c5fd479022cccf32efe4c6a9105a92be8e4fdc922a91ab0c7cadf27bace8529faa2e883127e96a2f681753646bf99e63bcd97ec8454b69b8fea78d0e069df326127c4c7e83dcb1808df1e958d0680d8d72afb2f7e997c610b8356e55e62ba2523106981d72d77a379dce5700186ea3f29be003d61bedea9c26e7f56e652aae135a060eb3bad6a4816f24041b38ab7f6a3213c35324f5e704f07fd47d28c8262c027e8e77fd242bc1caa6aea45bea22c983d6a6718e5a6cd1309b714c67f26e63d1f994ce9f873c56e36448ec0b048557a39a8e65ca8cb941bd80a079192cedb06f81287858c62ac0af60749231afba73f0387a614a46bd6827c2cb2560d10bee33340bc8976797a819f4d09c4136458367dcce18b7797e7545b69a59391abfcf40c263d2e596f8c2e9f1e56cc051987d3b40a792c1fef78c52caec4420963b44c7ef08e11266a64ab518f96ea47d1c25920aab626f8f92bae7e9d4bb06de804271d56d06292738de758987b04e6ab77fea0d47d096eaea81f5736a5eebef1d35d840e950cf99c830325d4195f2e251941ccf727f68ab51d5db7342ef1f314f1d1f65be44717824ed9f15f4277856f82e7b6eaba9de61ac72cc69b1b632be729ec1984683b7f95c2bf1796244416854611a79cad1fc3b30ea1ad4ad29b108c9cabb16c12ee7f71b8f83eb89e9ba8ae6364e5fb0bac7367d325b2ec618fe44501a56df7df3abab375ab6536e59bba93f76e5c05d81267cd002dfab205189e72675e5eb38a4f7e62276ee502b28eab1259796eb61e83f116f02f596e2eaa74fe85fbce01c11018ef7ad52097bc3b47d23dab6d1e20b739e190c3c1bf4422c443786a429e67b062cd476df5c050e2335245d265e04eba752399f5352c193d9892c9a5703cc1357135c06989cc9670e71110730c79a2e563272b41f4bf60d2e442bdc875a035ca31ae08e18daceb5980d8157dbae7bfaf57e64c71e0d2dcf256d158117bc4bf057bc2db9b6b63edcaa3085343a86975cc9674cc69a307a664680f1ca4457651f4e4f300b4ad20f74b0f7c10f0dbaea938aa229c416ca9c44c6597ed35e5b2a774c7ac9a8f590ce1f9adffa2ead6d82a71fb9bc83abd4622d0cd882aafa2188ef2c90c568e80545da7965284be00ded34fa1536523885683bc2c4da465110b910adc0e7c62a3c80a25c70222c2f8a8047990be1c55aa6f703bebe107eeafb62195bb6aaea17055f60c9339bdbe34caeabb08d7d95ed841590bbfd43701d8d9a7e091b4ae0a00e7290a4e8cde35365d1b44ef2e519da5bdf607ac85a39c31f56bdb0f8f5e7fb65acf0b1c232306a00e5fc8dff5c05a3224a04d4a135fa9e8aff8615e6434291ab10fe38d7066737929ba2e0e65443184a6bd44a3f7b21bac434f8e0f755f18b8dd3f65c08b535ebf0100bb3b8366ca8f9bfe52c6d2f7d4745555d11946b6b223a93430ba01a4934e96f4b21cd0bf0b34021b53cfe2e8a9706f382bbc2f7359d698a9346c43296ea1fccd8f98fde3086cff03b0c03c8c4a8c101f6f2e84cd338a48576f597e6a6fb3fd0c587814bdee48b57b50a14ee399bd4360d7fe28913b0ddad50193eb587f4a7c7ec00f0947933960a0ade6686bf55d05fe6b2572030c287d000c0b78a362df038b8d650e569ec9ded50567917e558481bf0321cf97e50f9dd4cc46b12bf9aa62c2c9a00417fad0d5b66ec526fdfb3a60068e310d78b77bc26defd181b42776bfdb3d41fb1d0fd216b77649754a2ea9e2b04f852874dd4f2d6bc7eb57abb9615149588c4567819a1cdf0c42999d81f7fca900bc7036f0a0e8b650dd1bb7dad7e385d5e465c3c11fbd4a00859d232d3a7610a46377962e077eb1d653031d6566ff9c012dc7f0bd7ab3dca75d723afaaac5b2f9d989c4bf852cc35081302621cef866b942a4e4656b360b00ccf1900a119a2626e44de9a1eec3f02b8c1a7e6ea6e2309b95e666123a4253017d3ddae6bfff419a07ea0069fa410adacc7f2d0498064b042e25a6f2e6eaa072a64fa64cd93464bb338fdab76296eeb1b58a77f3740353054403820c56c6c508c7c9948d256890000627885ac174b6bce10b95b53a3c184c5823c51d8a6228a83881b74d3982d56af7bb5179e15379c10417d25fab92ab0856308aa0e8b06cb37fd992bbcb545ab42162eba503e67200fcae3178f2a6cf3f7111933262126770deb63cb480aaeba23e13a03631c4f118bf4d352a23ed4c14c447748d8e17db54aff2dc7ac0264282e6e8a64f5f4759348e247c2856c48d4dc08490dc88961ce96016635517e562ce7b647a9c11b44a8f0fcc210c038407dabbe626291a857f1287039f30fa69557108f80ca9ea86a270a114602b655f5a6760c9e86ee761f9301afdc749e1c2077cd8ffd0413ba4ef6290e1f24291d8510c8494f692ac3fc5860d4daa779a5d07dca89998aef69da44514aaa198820f6d4fc0a38d3f0c3dfd58fe31448f27caa710b15d873594203dc47ce7eda2f1880730bc9fbb229aaa002be190dfe273c3c02091a055a6c34f137d3ff90d2ea672e19e8968a3abe242772121cd3475231bd450f44d89e49e4258131a96e393ffc5ee8ae607382aec4161869fd065d529d93a1440a02c05f0e5d1b4bb9c72885eeb549c17411ee3a85365be0787aa020935878154045be4843732f54262c33e782b63cbce79082d94a6eded59e90a6f2264ee64abe1119b5a6afd7abcad552336b928183f01b9ea4d26c1107b89df5355d84284a498187009410aa5f71a7c1ef882fc470d06e179b5869a85513b1d7bb3e53b43230f37106fb410da3eb682cc2eaa8d3e28f9121407e7ecb487a6fcd287137f43be1d1141301e5fe11f48e9e88ade51e94425151aaa3a78a7ba65350e412910c94bd97de25dfcac8beb942b837685a04077ec6f1f8fe4acfdfcc8381270b3f345cfb68f6cdacc9b058014aacc560a1e43001f08e414caf4c19154f64b28861f386a2da811940fc789d703f03994e6461f1f7a9c9367a4a9f6a820f3868f9ab1de9173adee2cfc20005ebc5304bad86f5ba52206a8ac90b6c2bb6d2ca54b6a1880d27766d21ea04fb248633e90b36d4ae6b01364a53b246106e53a3593ab7ea8c3632b91e72389f46d95789bf00586b2a7cd64fbb002083748c7cf9fc82f6d35ce69bc34791ed2c306618c7e6e5e102099ff48d4f3760766a2e94b34ce21cff7d11ffde9bf137fe37b67392651e98ba5d81b2723cdccfbe82a837958f6806625950ecc289a0d81bba153b021e348b74c0ff15079e982ef2fa36bacea2a89826752b38e715211017c24ddcfc9b832dd38457c02a065e0c2dbda5d0b20fd23a7d5b99c81e6b066389e29d272d1f60f85d5412a92b2327e9bb85cf3b4cd1f10886ed0b5f7dd205e631309932b46c584beaaf8a3f9ae1815fcc565d80f8c77c72c72f496a0e1686b2378b31c25392c7a55d07533de8b1809efe67e5bc746303374f5ab23f187ae2b54bdaa2a66b3b20c7037de345fd4c2a02b04113fe344814d31ae139dbe3a837604f548b644aeb3002fe4c1c8ea8d01f9736c1867a31a24d9088aeff3c48d1c1f1b5b85b19c0d92b28df56e5bc8cc3658b3c524ffd6ed73e5d02ae193597ec4664353c5fa8baeef808adcc11c1d4ade2f056074faa9ec70c6dc94d809f7c3cfb5191786ef3555dc6cb115bb185182f8f9064908c11b4bd1fe1d1514a488a0ba63ee71f2c341c7e6e1ef6f0507e470707070e4db63e0dfb99eda9a394f0534c0b259b809a246f9a277b31e8e9611aba60c101db2027c631042554222756c1944e8191a970c619e1968a878207ba76b9460b68418c79151c178b766fb6552970007bfc702656dc013b4039e3c1402bb8ad309f4f2c43b94fb675ef922ae00da377258ea8d567333a4d90cccc860ce10513575bf9ef78bfc7d3392d41236f979a6f2371aa6a239730ba8b4d5215eecac3a6bdf87719e15ac66545f3286dbe10f5047f958456925c4c995a2803b7bc2a795a99e7bd5617c35f5e5dc0b92f131927fb7ce1d457e3eb30230012a54b64528c6c15d0d7533f780149d2160298c1e9350338dbf5f0305529aa59a82072933610e4cf65c47631ce83532b0812a2b4bb5df08af97ca217e6cb89e5ae002a7c4e5c0f5d4e00b272056864196223d1a35feefbe1cf978c357b068356468e2414f29aa6b5040248ef4feda5af95aeb23266a623d49bf01e84b72bad0052a486be2a80abc62a0e90af81eff100be88262387d25f0ade335363a3872051176c379053ab47b491f4b777b60f76089cb066ec0916c4a0082a140863e954170bb2cc88d7e67ab96499efeb65f09f13da266c282d0093d4611761bce624f192e5608f73e2c60114f1c261d5f1103301399502408c66f4ad2917b488a026972428ba2e8ea6612d6f7ab99ca80d83b256e8a2eb76ef7bd567df70a462d8e1d01e1eea9c61e7e0211004e6cccb6e9e87fc885c0a11823fe9a89737111ae8de4f9cb8110426e8a65f62a9404dc1df2b25d92b40804acee6c18d5575f32db19aa2659ef8f86eebd85c80bb144dad3e114b2d0490eebf40849f5e0ea0f22fc2eb511ef10cf5fce99bd87fe33fdfecbec2cb0e881d2fb6197a2f6ed360e3a16dc8171825348ede598c7858d853ee1310553850f4dba119f6fb4f40203d4b4d6e1ea867e7f4860c670900e7516d35027a502bf9d41c380cbdcc02ace2fed79942727571b2ea000856dfcc78c766754f43405bdc1f09f89a27dfddbc77f2ee97c9fffc3ecf6ff742a3b0eda4aeb03d398771fb747edc2b1be670530273dc8997cd5005bddd96a07634b0dd21d5da543e7d2d0394ba10ac8ad11f870efc1c316d432fcd92e7c8c70eef724ed550d3d60b202537a0d6185c62ac2fd14a71f005099cf873f50f4f757bd53435aff21d58f1ea67ecdce82cc2e9e7c2dd6cd3d540e4dc8c916169eb1895cc65ef66808d095c7943d5082193cde330806a0f2c564c3df2c9b6f4eb2614494cd6c643ac4b2acc762c656a951d10dac672e99685964208b39e312f1efa3538ca0c2fa98f13b334d3d93a2ae0536865bfb07e1e697a8920874a944125df5096567d89836b3e6140c25b3cdec2b4c26d244efb78c97cbd2e48a7932f185f2fb77c861a0e272c9ab54901ad35836c665555ece9b820f67df69ee09cf426b96dd9ee6802e2cd9842fe03e9dac5f3893a5319f2e55effe4463351b9398dd56927cc10f93878812197dda28aa8bbe4049efeed46512ae7e720a080f6f2f2cfa547c79869aa023d401fe8a4f14fb3247186bd6cf2c3302d1026d51bc80be53794363d0e361507a8d506f5812cc1f0c422964ddf822a2b4b5a787d852f8765d69ebe9a5223437c5cfcb718e1942198902d455db9bf679f981cb1984427c24760f777a2961c0324983072633d0b068da4ee5756c1582278320e149aaec4ed2dd5b3756018dd108b6e3265ae5f5ffeed279ee2b5f410eb3c290f7960a42de851e69ab2afbdb0df04e5639d5369da84f0eed626b5a6fc6f05b1010de7d5a4d35befc4aadadc396cd5ab6ed859e3cd7ce6e6a0398bc7448497dc176f31b0ad84b455f0139370164da2a4f6c9e38c7c235c05505c2c9475d299266a35ae1255ff85c0e6ed72828afaa7485ad9611933ad45ceb19951c1f56af56f300aba2bc934677c71486bc2367cc64a2b9154dd4c78c3f4cf126ec87a3e08738cc27bcd98af90065368ae9bd2fcf37797e53b4c6ccf9caa9fbfe4161a10af5627967b7f4774f60e64b3614b129aba07bbd5579021088932d017309ded307543b2659c960023b315081d1eb8cbf330535cbc93e67598002244c567da6f4f1d4e74f12c0b2b83dfc58240d47689eec35e2ebae119e39610fc5a0f5b0be26a42bdac953237e7f609fe0174c7aa2f8398b945e8da8f2cb032c321e38815cb146161429946c712817351e6e6f2b4719984b35766c83702bd1d8ec762cae84abd0420dfd12538af37e58cb47d0ad8b2736d5542515d610f6596be8576f4f43ad25c3ffdd1d63c3f449391f467f0f1ad3236d98926baea09c586b732a8efd1310a2a19be2c988eabc45926558a27f38ac513843c563506f3ab6b951eb083db1dba0b01b18a59621d59618a8814689617c6dceaa332d3e1d90359de5b2b697680dae41bcdaa07160bcc24dd3d257d52e2da4c07ddd9974a4094eae654269497ee0febdb77a4fbc91cdb718ab90fbd0ac55295b8a21ecf7d4dfe60945509fd32d70471d3e681f02e300508de6085dba6e0f1e07e7cb6a3ab8e5eceff80476d86cc1d5ad95df3d1b4e16fba5d879aee553659566fa136f67458733b1cbc3f9565505c64d4afef4440faae5acb4430e551fb9377321300366ffa3b658d64794db596bb0d0ff4920fc03ecad9a6d56b2486d942dfa13337068ec5837ca9925ac5531bf60f00e0ec11dcc0a2290a5648a85a7649c4b6adc89764847ba27cdc21fcd22c04078f0921faa765c8254d8160b7791aebb9654b8c76dac4833feea1574eb4cedb4aaca95ee65a357e5642629f1f1961cef074d9f855ba4d410a1eaa388b2b522d1f479675be7ec5cf787c64dd769e5dc54086d8b3c95b9c394ecbdc514e809961a284c0c17c0ac1c5921e5575a98f1037ff15952fc774a7cd688fff70d5bda7deaf691a41f2e016bb10b9c6096162e01c892288e1da192a3f920bf7dc97f4c12c1c34d29f68b61a87c983c89f3b841b2b3bf58568797ef4514e87c91745713912e70ff7c28465ffe0fa4b525404700e669619b1edff7d1fe9cece2ae0e34faabe0a320d692e9d993e4d13b604855262f73a8e39cd368c084a567bc1e74b36363fa13767e025017ff8d6703307037eff2fe3593f38fbb8a3306b639a02881654eeb61fcd2cd3a40956320ce36b1188f482409e6a591a4da67f9d6f10bf59af73a7b377524d2c317e5c34f0bf560514cd4d4ed51305a2886e2188f3cbc6904f364c7a4f8007d38f4af8946b7910e4ebf8640b2f252129065c59ee165981033dfa58fc6f35217d4e548ecd851df58d164f8a8b01dc29822406fd21a9f4247b058776d5282d46a3381bc4e1d2e88fe4454ff3cc1e4c3b9091e633dcdab1a2994d4c5266849d5fb9c08931aa4c2179441c51d1b986a9c8b7e38c8d0cb2d4f08f0885ce9d9185d03baff73c7b76d83f5d903220313e31cb2aa25ac76f8dae283c438b16d856ef1340b4a3d1f630b58eec3054e4f56a87e1b0de759244b04cd905f72a04e97c3aa90b5ddc28bad54e86b5cc3b7cacf5402255580937972f9c9de3c99a2002789815e3023a087337ac1b9033d2cf4156f6b55d78df7caf6b2dadf976a77d813dcbf8b322cacfe6cc4d2f5be1324ec02c4b3a30f14a424ed1f9ef1bded894a03d2c5cef714f9b36c7beb1740cf7e742fb8af64737971311713212175b5c364bb87cb563d30af9b2b7f940b059585963748aec9b6486ae601469f760e749119556278ef821b155c8b3e5c3dd409affc59fb9a741dd4e7b638f861ac40f025584f71d0d2b82dbcfbabc404fcde5adc9cc0840fa5527755990b74416531d8614a8cd7b75f6247d0b114bec838ab48c3e93686398e30878d1cc361676615f50622a3a05422cb3ef52ba28eb83e6c3a43d2f72c16dfabf627245c32a4f239185e4e43cee15476a6c13921ff35907c001fbd20209c1e94a9e74339eb7a57a055ecece71c5725ca1f5d4d0c518deafba9beec3413cf5aae73d6aed70539ecf73988aeec510658e59a2cab9556485bc4a6fbd71039caf8b2315d51d35a075bb6f7438fd10aadab1bf16467974c9d7c8fe13f2451e0b59a175788a84e025448a2b816c1c1e12063fb65d8d9df0c283819aedfe26603d64387692fc91aa397fa4d64c324b0832d6e6c85cb7fc0cd911ea911bd90bf0f94ad3629c193011ac09a07691922ffff9d0fb7557febda0ad241cc84e25fd1391ec2b8aa5637df7fd1b1665ed54a84506f19483467f0582ff73c56a8a42412d4f313e6e12d965a7fd7cff1cd72bd0d107c505d2fadd7cff6e8bcdb43c82676939fe992e6d1d5b431f5f7d3767942c1ae228deabb09008509fbc18e94dd4693b4780c3cd84d2ba65384a0e1545f3e7dfd08c4583e87e58e348a298f864ff25d71f5efc19d9e0e6a44dbd795876925482ff5ff4c48192ef9f38a03b297b41c7409a177079ac825a7a9eed0b93d1ec12f5f4a1135d5f29150e20c8e50b954f282d0bdbbc264698cac7bb21e3dae9a9141a5330754102d3e3468c58abd7811fbd06c6bb6a8b4353eb81fe738a0dd6c7a8bea8595b66147f985b6b7c12816cb709a9bfc62b9492741bd21606f9a51254a7ed112a529090d8d2bf78f70a8974aa1808da5f8f5da06eddb8afe0003becc9c683e7393080cf0ead46d5dc054e0892d58de030cff55466b1afd0b781f286bb7cf1d5727382a9615ce8cee38a83ad682ff062c6982eebd4796357a6a6b13398eb51024dd0282edb82a1666d888c77dc7c82838c1ebc9e3abec61cc93a56fe4561e4714d0a332bb4741154ac45b5f9f7d1faed1e0f62910262bbdd14685435238dec95bcc3e6360e9790cc37f7d6ecf641ea95a58b36ab0b712931be0fa55873ea0f074dd5b82760c281bf66025c263a21db13cac0c2aaa16dbd41983b64d5ad1578811b5795dbfe9c0271146047045e99b9b323060e98759808614036af7c44ce097bbc33a0af55af200f4134b65ac44b16e22d622f29ae819debc0272f744e4e2d56f307426a0d418c2a15ac92bb2a0bc6812bd0c16a7e40b2b2843adbedc3d4d8bddb8f8f575aa809a191e1a9ee8d567e572182378ee2e1ddf8c4bfcee8967be44854611378b139cd904ecb593cb07fb0cf50e3ec6fdc47fd27718a237b0f77c063e20427f3a5e09b79b5f74a1975ed41b207690fe4a787641782272c65d3e52ef1fd7116b9a8e806a5428bea957d882e4bed0fbd2ce3dae4415d1775c116a0d2761d59e52dc08dc702d0924faec86f7689d2c9cdf485eda6ada6cb8633d242808525e1c87f17c84f4d3cfed7e6dc540874932b1cfd565e08b64f6bc4f032f95dc62353f47aa889b4029b4caa9e3209381a48e8c65506ed7e4cd936af859bf1f54c231589ad0388bebccc5670118ad276ae7c6d035d8b74bface02d4519742799708a43f9d98a49adb443be8556d38fb95f9f75030dce8a8c09fc0ccb75d6e31cc32e3c7dd70bb8428b9988aa01a44f0a7f511dd925c456b013f46b5310ca6711567a0bf5cfdfd144866e0e6a711f8835e4238c27377a5f01dfc8647dfc90fe2e000d08067e1f596ab32ca703967c106057942bd305b540b66521d202280d5b96637dfe2508d6fbd58c19ae0927709c97f65ce19b07e9d903333a3ab92d3dbaf626a152fcbdb285871fdea2d2ecf8cf5c56ee5e7b15e2d100462207c05a19cc1772ff29e6ecff4a469be29105f28db1414936655137a76491f77da1810e09b7526ab706b16f05b61719ad3feacdb5e4a30852e010d7d119a8b40c59beb2530dde42e6269f4d0c92ee6cd41f3f809134ee11ed4072bfd757fc778c97dfa5df266a196a4eb7eac192517ef2325cb9bf3b5b808dded56e66ff29da6067f6feb3e27186643e78ac99bf161dece98542fe2a72150c0770e1462a924c592c5ac785aa193776475881577242c0a8316641b370bc7a9bc7ed922edeabbd2c0393c57ce86678fe5743b6c79667cf3d9c6cef635beb9713424f87546df13d7a06a1664492e381d75dccb637d1ce87c28dea4ea0fa3df3cba26abf30c5784f190215bad55868374a53d32ec126436320b0f4cd5643dc6e94e4f52211994c7c13c3cbe87a7f7bcb7bbb05d760be46ab334ced48f5f160acd80c02fbb2801afe0d7ef636a6aefe641b0425e6c62e6b97f96b1339a54f47e4019975c9e5ca708ae8db65025d94ed188d868de27d0af6809fff602e7183ee9d3855f06fd05e61d4ccd2a2dfae16fee3b416a5364f73b20581121f86f3e5bd8f7881ecd6140a9239fcfc647b9b00f84187f5bfe175fe4e677973476da31ebb4268e70d25199cea5908f278be3b6741ff0a90f16db535aa98227f6f9cc2543e117f017cacf4878e8cfdae1264fdceae0db9a119ea7a24d769f3fb304384f3c6c072b6cd4f8e6ef03dd727d660c531943270fbda08ef54958d5344b1a67298ce1838f037c290415e50e34df1c6cc9b21f51475ae4b5f35531b27dfb6422003392c47cbfbf08b7b0635a92bd77934c72369c6588ebebf771034241e41a8aa74da64e01e6f7c8e91327aa863f133b6f77ccc4f94eeebae651dadb27f03f5dee2df3697354d3184537fafc1762e5ac1b377ea97bb1175ad8fec276eef4c23762fd690c153378783e2184b67dc538d2458fbb5a36269719cb673a4b77711796393fe20bc7cf8f237def34063445bbfbc15476a48576fe35bfafc6ec94df70ee707d8745c18ff69e76a60952114878a191823f22ddf3cacea59928b68644d92ec3978df5ba7a0de9a290ca8d6ef41362d5722e0239979f823b69979e7e364ab63df685eb7b91c84e2f086921e9c99bec36e7834f9c04a85e017718e25765f766ea518b44538d5bffe536b87b2412ddba3e7e4668481f3149f4e383a3816e24e4ef06f17014e3d78f2dd260994005322d5ae9ce2066ced8feb70f6ffe928d9ff775ffd7615d7186331a31aad8f786425921f20ceccf94cac2da84f6f909956b5cf5b484cad940a75a8aa667f121d528c7d55c32a943180aadf066d51320c5bdbe4eb4184ed007d89f463e6360d4439e28d60753a7ef862d4cfa47aaa08d0a02ab465db47e618b27ab67a8573dc4ec25c0bdcb854488a5033e51fdf48f5db7f91e0697ba9819baf5808bcec4d9c48f1e1514f61b14b1ec6ffbea572e520c209852def36faa2b7fa291b8a18c1205c1cc922e249f8d671997d5c9b0abbc805b3ed71f053316a4f62cab2a1da5ae14a7310b8fa0065e5e21e6464120d5ac6f353b15f3c584694ed25ed03be43d42a374b45bff14a560db71955223af20feea64a2412d9538bef33e6dfee4d6a5bc5067c73dfad9f8ff378d020999066ecfe9071bcf600e7ee343be088cefa38428633df0ef1db5d87fef49223f37796df45690e9bd4b791765f0f5299a7302e1ea586f846ed67ba2219ca9c85769707375833f272cb7ca98d4adabb14f4acc7523bf1cf66baf232c4357bdae19f8614b2f4605435b2074615dcac3c04bd42e1e94f781ed843da8c01ffc587017738f4f7b6ec9c953d1cc8daedb78cca21203b5468d5a51f5257f3dbc87c710ba27b52206b9db765a75e5352ec1cf444eb7eadd61443394a3c30599f1e97592b283fb27bbc9dc501edc817e15c0736dac4dd885dc058d60b0f32a2b3f26ba08879c095821aca5b272ae87c852da16c4576c2af4978377f4fd191953c95b3427f558fc993e55f7b7b6671816c13f4ca56763439ee2383d85c7529520b1d1e13614d13eadac74d18b0d05a61c8b4f4124901e5842922b2d3bfbb9bcac44544608d711a91ef3d17ac8a3570c5064162ea471e4dd52c0d49bcdfba4ee0171cd14a38c70deaff4e4f9aa22af6236ae313346b324a2b3e0dbf4c422a1655b3b659d009a572bcf1da6118e8d722a5d1b0f31c80e30f841200b5498ea08202308c618203d68a9fcbe3529a30dcf02a283856c433616e4fdafd761e144d592d61a175e232509e6eac04be115bf2e8eefebd7db1db89b9f2abac044754be49c133a05a26d523b59d1a8694f654dbac0a83861fd7a70e8b18017a19cbb51e56fa8337841cebc5ee755d3dcbf489d24d2b322766104db8c7ed52c6ea4cb5eaea6071bfe3eac53e211fadc8eefcd2144fd67efa277a0d685879a71a38c86cfb190c35a53b7de63aa15f8a1ca158a98c1d4a456ba42ba759e868c5fec361dee5d0d775b32ee6655998aa051b4b83688d6adbee9756e3cf954e806f2ccbdb50ce3e7de229554f0217a7d597804f63564c2fdbffd2aee2ac45a265cb1443058425db85f32d507713d2e1f409ee49f5a58c318248783a60edd0c484c8b2c9bc143231c588a94c81edbc1bceb2f90dc7aa31eaf8a189fec4f21a4c22fc01f24aeb5e1b8d63f731ef9049e12881240cfffd35e624ce70c0770497d96e6c0751b2467b2724f07aec31bb41eca67378659d180b3cd8cc6cc0a764aa6bf66e880f3b9214de0a8698696e303d4fab2b7ae49e09cf57e483c4193021fd6864ca120fdf9378cbbf485595c28c5e1736ed704ecac16f79af0f73dd60ae6295cfaab0c115e50e7cae59223441b656431f9ad450122abfc78aba6b6dd411fb18c300af59e96254a39ea2361b9973f4d9225a5041bb5157ab2404377402f5d936c25e15e3ab219727f73e50355c286db53ab62a08ee810ff780e29c056a1d451a1d9f18db1e24433b047a4d1bc4157818424057568cfbed0e3ee380fa58c497535ceebc6fb26ae245daa267166e803f5a84c8289d1ea852264e443d5ae3b4a6d9340a5b59c36849666107c25723ed685220b00a8c30b9b97999132b883d805158b7e517e96078ae921e948d074ba1f99c0a3e55fa3fc9246e403dc6b2c6526ba4330a1bdbb799564772eb9d432646cef3ee331a882205cf829b98c864ec3e886bc3640ddeed796c4b3c7eb677def595565c00c96a85c4265d12927007a645015c0aefa29b9169956ecdca28fe10fa4116a0eef81230b7977727902c5d41c48bed1b5559fac18faee7656c191856ca21a05399caa03063cce6c99fa6d8801778fc0df5c26cd1177af251f8139dbd0251e1df316fa783c4ce939c5fbc07f8df77df3585ccbd90f08cfc6d182c2ddc8be82236ca6925f5dee9055b887481c28e22c4cfec09e5e87b9181d0dfd294bda37803706d6d79ff2f816981c1d8a46e65ba6395db029f6e31eca811a5248174d0ef66942c2aec446773314449f8d3d862dcc6fb3779f81113785521162885b1239974491886b905d36647651a1b52843a463ee59fec7a45aad1f6ebb373376661318585528e1f01ab2c5e8672483cc2b03151a6240db0ad8475d28e22611b8cebddbb6a3228cfa985ad2b907ef03461ec892f3fe209e5d2fd79256b621526924734161e569e19030491344dd073dc89ba30cf2aee8a921f78b6c37173aea703b64760c8749516a8d89d3825dbdd8e63f00ff8d075badaae6075572ee7cdf6ee25cf8740418af3019b38123ba998f76506ea2c64b9af2fa3fa4c100519b3ae0e09632b53ea13385fc55c66eadffc4d392677fe5beb83dcbe2fd6b42de5f16281c36b1d6c244635bb8ae81a2fd146d18c58e80e5a614ed2cc9dbb02ccd266dfa98d57ba670f80f1fa410aa0612a9d1973474b4f58f595511990f407b43e908775ebf5ca476f4858e56ec5c154158e39cd693d5b86e33d56354ea43b19e0ea7e742f59eb901e35adead80312bb20f469e71ab3991d7cb7335dec4aad9ca771456090f37eb4cbedfb3468d763c0382b1c781af1ee8b416c53cbe9604fe5831e325777a976a0467c9ed99efedead72656771caac46780762c8de345c078a44f521844a41f33d5bce5885b15745a74fc60b73825012ac9406bea81ce8302abe626a66f7684214dbe4bd2927a4ed5799ca7593250eda320cf3126fb88f1384c32d991e7a1f56cc48dee6d6377f220020a5b20e399127e324b6bcb93c2789700403f09d46f8e7bb68a2b4ccd3511672c712ab86b860c42a8d01d90393d1b14141c6d85946aa7dc968f60a7fa46deb0178c98fef24ddba0c137a73e7ee4defb4e72070343c76f852474a21d87838a02dc2ca75d538d28a80326b7cf0f12c7f6360d4c148a6728f6a1c2625984e3a487c99806d01b496d2e4cdf5bc3f7a64c3b46628d5f7c7f97e2a6590c15062b1332991d14056bfa156cfd5f008c7360c0910c7ab0d262db8632b49d4f8d6cc2d4ca229f1413db26932f66f866357b7a6ed95123104397826eeeff19d78270f551f0df5cb7fd28e43007aefac394a9106ddc1b2ba62495059af9b5093a4987d5e7e73c8518f2e61622218602480a74c2591baca7a00b40946f3cd96185b05a7efc9050364732aae0b70da7d808c981c6c276e66ad9aa96e27835d9459343571907ca47650084db4b6007495e1844bd881d10e9b4166d54703242344a46d7e748f400b5a570a320dc534f0bc6a0e8d5fad4cd6b842f3d74438dfead03b2d50d20c8a00f789fd7628d511f6f29772ef93e4437b48471d8011e5b0476233cfec60bc1c354f486113ad8d6185aace35d95fb394a3fae38e92e3ec72472d2478a3320a92ff5e6b3783193ff782a5574eb722be814785812458bf9137de4b728590e2bc38e0c3740d04797efc884fc5c4134e1b1178d4bca2dcf9fcf45e6afa7eb9b2ab44c4deb4c8664afd22fec8a927caecc83eac27e04bf0b9e5609d9c79182c6a19142277ee7b55966bece58075dba85f7053d74ec67df389622222348bb4f989ad017f09ef70cba11f68af8e81cd7533577df089f8470c0e087948c32f20ca6e50fd3032a3ef9bd791c083d4a261440f2ff67cdf957e002326b16f684c609283d74041d44224a1b8f0a2d921f560da202c3992127e0a417a0b38dccce41764b87b6c87c84f7eb25af15cec85d6eacf08f1ea37fe3f02cf21910a98a471aa547c9bf5eddf658149ae8b1ccb80e053611c53b7afe8200aae12ce92cba9c46a5bbcb6e8dd0115ae0f3c9c6ff3edd0a87193a1836a9938218388c10fb99b8fde814104bda37bcd89741c0d9ebcca9448aaeb22a1ede7304b51ce99e84ae04a5126a736ff63fa31e7c6acaeb27124243b5a924add699a1dd7bea24f3505864c0fb8d0a588bb5c943976ef2842f26c27328acddd4d78b09d659bf388e3ebe0f8123f0300c79b705336175d028c079c8ad2ec1447b5ec6f89f0e1bcb833d260db052b9d70d68d25826ed9a1143cd25e8558dfad389440213d2fb64072737213dba7ed47c5b1ee30066fb0c29a57cdb2ec0e3b56a280a5a3f819215199073fbd0ec61d892537e6c3610967f430fbbaf2200a74bf91546a54421a8f668ac4e4d4477278a31db3c9ade2b7166337ef15de086cf74105ee87dd0481528a469b290a3865d825659680ea5054d0f055e7a90623f28d20c7c80fe5e24610805258463a8c93f1d89c15bb6e590bc72a7d5e40f9d5731a967043dd4fc4440609c1ee54baef1969b8c9d82db78d42180a7319dfa3206e85315b57604264df9cb216cfcb7d2e661cebdae30de6bf33601bc0d53620def3d2e91059512592b9fa1979e7163c95c094d15f127c6b13e6013452c69c1c6510d53f5e98a00806cefe7028172b1b8e2d994cc84ef31556a823a8bc09d3a592ca709c28fd6f368459b83b8ca54a8dafe33a7956019248a8a337ba89eba2734d2041bf17c347de12af391a8267357344a4e08aa83708c15f8db332b2061b4e1e66b6d40554941d12a0abd69159088d7c91274b2f7201d96d58f1e818de2ed5cbbb5af0b411b28c5fe7e961389da8d925a41d177e7f44cc836854910520e9764aef9cf79f2bc12607985feab59364d42da4987ecb807c7cac8e13f5dfd90b10ca3a108312f220e4d8f1d66a37d204b93282e526b4cc18982541ddc62c39bac61efa416a4946b0722cc338eba0611cfef8ddcfc31d363f13ec7f99817a01e3d8865c0c1b266955969691341b6a5a8a7082f775826100b2ca1d915f0ac438c9a358f6e3e1e29d71527f61e1c136f52b3c1e828fba9ff339523be67198f53427099246fde199fc50ca03ff61963bce879b15df48e586e7a4dec9bde2fd6057ae75632f4cbac8f7230a8b9b98d52ff7198824e5d830b546bd772effc8b818eb2a2867de3eb6510e97e5e83b992bbd58dddb8699178ba14a059cc4875a0a19bc310733cd5bf0f6ffa0a1ac95ae5ea6a7225b11357accbaba9c9071f8f61590b22d76495e0bd445dda823ba40c84ea6c45960bfcd90a27ceea02a754a0e486c36cf32591302413eacf5bf0d6eb7878eaf65ca70549fdf17a843b9dcedaf2427aec8819f2afa44efcc166e3db7176445c7b44d84b96c444c4927f88ebe65479d93795b3e35ffaf1e64a6851e6512c69208f1c4a55c5e431fca0a1ed37d138422d7922f829451630cf8b69053e0c43536d78326bf2e7502c590f16d5055f24e6ce1f071c9b924a39a266988e29074eb34f82d6bfdf2b5ddb8982e1ead39c7e1c8a87d87a1308eaa607e2060c65afd5d09de938087db8d7e942b11be301e1359e8265637c75a90176ba2cef403d93d4b837ebcdba11c575592a3204b51aa60ded6cd3fce27fcaf5e14a0d895f1b68be7048a02a855390841d2cc61c9d0098704d23977430c546223e077c1f8f795f30823ac10fb01df96002572b7d3022b946137a8f05081309083f8292fee9106085a234a92f8309731e112828982833320254ceffbc3dd69d9f66330517d8ad42005de464949bc5a5b798e8288b13e32a7e3171476eccabe9c8bc326226aa40b6d0c1c6c87f2d05838d69430c7139a6c86cbda7e5fec5ec0f3fe541091c9cde5a89c9249ed2e29bde0563bd0f9a83e5c5fa73af7b4da6357db96bc01b52665eca9e61e13d9b3ba54aa5516d49b4a6f524992e66aa72ee416f5ce5eebe43a25e412f5573de63728f9ca5157a9fd3b1a85e4025e424448e59df514c4ccae62dfbdb8e63f32cc16bc76e666f2ed63e01fc5ddeb83a5feb8c294d5bbb9d9ab8ac50692bed79ea3723d372edb1c0e9a5d786272b00565f0ad8fdf924243441e79a699949f1e70c8a49cfc07268d2c6c238106a29b4324a9d3de77910acc38bb0f3b3de2f60e6f35e84efa059a00dbbb60fa3c8bd56a1b79f6d44fc0e43cd53c323b06eb82030de404996fe65406569ac785cf896497530f4c85c9463eb2c9006e213255446deecc66505c4cf32186d95802da9859f3546faad12f282bcc6add6aa981783f58b685928bd70e88b4c25b7093441c19aa88c9f98b1ab404b825c73eff8ba26c1a4ae00806a8fd16f95e4473af8dc56a36eed9053e56dc90d085824336049dabf961b1d70b9e522dc9b1ba112961fc6e1b7e7c135ada3e4c8e325ba60b9c645b33166b3b24fbcc8a1a61da069155b6d6bbcbe4466a8fac9f195c10da091baa01502acc23713033a9fa2b58233002d9a49916f3fe5bf7112c79ecd0a2b2bd0a7b47d50dfea543f98410e0ed059657676bbb61c6ea60ca7042e0cc4aa0c56209c55493ad998c007be301ca74ca8689c1b6717334857c63f37b7aa9d61272067dad03206983fbf8d880f0c0d04159008051da487e4b97cab19b4e61579d6e067cd66c6501b238b52474b5a238410b2c9de7befbd03b10c750c550c15f5f2528d5e5e702dda8a50a86f28140a855ba88a5451413828540f0a85abf75c93503668376564100e0b0bb63e5366bec5a7e50bdac1f1bce3bcdcc32d97bf1cf1b0053a01792e3fb1b868b8a52949a29244e5c5fb8b10b64c5298784f71f1883c6c9d989c50c0f41be9e262e4e2826dd156c44284e5db07591acb17b483c3c2721ccfc316c9f3b03dc28e7a226109c26161c13d2c2cd8264d996c931af55dfb632dbe7c2e1fdb826d58b4232bb8b502747abe804e786645c9ca0abe92a83c5f495654b492109394e78b49cf7fca4422ce89e9f972d2f3de94812c8dfb5a70cae4cb48c357d19499f62aea89bbeb48d3f07534659eaf23d695f4a528e651afa49e87ac7c25dd230d013024c523250196a0c1985c8de8bd5de7793f05a24014e83ae988bca21bad8e66908e24d523f5c8755d5dbf5bf443e4e3a4f608253141527294e4c8acf111c069d16d0d4b49c99ea9bdad695ccaa5b4a28a918aa14ab9cc9f941d4c2553096bebe2428b54b2e749b4923a8e4a957249b9fc50393a304af7ebdd2f95d2af97b09fdeddebf157867fcc8e9c0eacb557a05963f463e413917a6a4fcf4fd2cf11a4234a8ea412216a2489a490248a51c63ccb230178964a06f02c8556cf92481a49231769e4229166cfec9148b3e762d876cb4d22cc74abe19cedf2d809039939f5f1ab6f0ee09b01f866cc37934c9979007c53c9643285a6136efe5cb7532afe3181809430e929d473ce4fa2017c7e16cd1a98cf4fa359a3fafc3c9a48b36652ea336b607c9efecc9a007c5e83f1b560bc088f97a31e833a008e3abecbd7727911d4bfc71880eaf3413de6a9cfe5f3411d7f3f8ccff405e0f389bd82f3d52bbf9101f820ab1ee68bf900f0c12983bfeffbb78281d8aeaf3827e550a8e7cfaca1f7769de7fdabd5cc0cfd324f006c3aff983c5a621c00ff3198c73cfb0ee3dabdabde1d8585bc1cb252c7bf34b8f3336b8a08e02eb7499a418237ab199b276d448be8137a7403034695f262b4fc3dc0c01c864a7598e79914e62104c494991912b96021a0518fcb53cf10c9c3f1a7e788cb73fc8981a3922331eea18888e263c0f8603ed597fa5cbeaf7c80ac96940be0236207d64b0024ce33310038c6455efee10b1779790c5c7aa937e1222f4f7538d7772f2b3857fc63b60a06623b052379c1266839647538dfce84b3478b4a38af6851cfb770dbfc9935f76638771d86b3e7e1fcaf5638cfcce4f923abacb2ca2aab7479fda80bb6e97a3c29f4d59ca13653a61aadc80004415aabd0e56d6bb2c4a7c9108ee0316208592481451455d0a20916ed42d3264b80aecd174488ae90c4840f98a8586822849fa60d9b08010b2b347848d43c1df33cd4320f0f0ec62453e6c88c405366cb0e1f44e979422b3a432b7a9e474d4227c4acc96e571eb3463bcc7e3dc3a386875634c4a8233a48d4b0bb4910c60059de94811bbe4457ce344078af9c97f7614a9e3844ca124096f76aafd30bb7acb5d7eb71527e5d13d25e6ad57b9cd2ebad769c95db6f2dd1e87a4aca5570144ac1ad0bc3adab6dc7b9af2f956eb229377d65e52d2c27dc5a296118886bba4a4a7d875b26dcda704b7b09e3706bd3b05b2f9b4196b516bb9765adf0447975a1cd7b9b69050aa9c7c92292adf7adf9eb38daab3d3d4e77fb4c283b872352865bf4fe3a0e77fa5a9f1d47e5f59a12965bfb0ec71f2c0ae196bdb875e1568b5e3bce757a0eb7b8978270ba97ae825b2a67c127dc52c1ad126e71170331658270eeb55ff87ae929b8c3a7196eb5b26be7308f5610ce6ddd5c5888cfd8836124a11f6fc64849ecc9bf44573c620f59f5ac8aefc59ed1853b2296c557a8624831942a3c515e2234386bb02fb26ee75d6642b40c8b310e10427809a138d9b10c649f900c63425a4138f7935e0886bbee6a0551609e3e08679efefa84cc5b5ce937e4464903ed76d96b1e167ca5f3f0de75f9e158fbc845ce86c4b9b7b875e1cc5bdcb29f41d8f5895b17eeecd70ac21e4483b0430e67bee216c499a7b875f18d43ac94b387a7efed3aefaeba996c5304f5634e4ec76ca963769c37337eb1511f113bb084a8ae4a4221b51c799f3e319e4ae1e8dddb82bb8eb6e99a0deca52fc72e9dfbee9787e8dbf29c72537cc2d42222b282ba77d7e4b722f10e8ecbbde3c41c75e8fd25c605b7288e44bfda55aead685fb9f695c62ee331cb539e23524e3dec215d7fa1be208a7770507f398ecb51413b38a9a3eef22204855ba8a7eee557af2f4767872851e2905de5d921647d3ab1234e655fc1a56f92b391ca911dc8ec9c9455474e476d93111110d3c32d21a6cc3c0a7b179a351e0ac79e29331f7fa6ccfc9fa1d1f70c91f073ec6939640160a23eeff1c341ddc32d98a3def2b578582d8f5c8a02de51bf80879f81782405e390d5327f33519f90a804260a45253047ddc372088c46d4e6e988b3cd00ccbbd8b2a376c4f1a66f18c8ecbc6a00cce32f164d99f9ef8b465366fef3301f8c0f4e9948f401999dbb8e11ff9812080808a8e723d2f43e5b3e2f7d664deaf3e5a9af957a112276e0a1baf7b5bc17411dc65bbe56cb8ba0b010d4210b6607171fd45b3e1fd461a43e1fd4617ecc972f7583621f140e9238471e0a75cb212b12cd1ac964caccdfdb75f503629b881d582e7f49dd3b4ccbc7050b511db2508771acf2ec14897197e71f930984134a2642b286b29a04c1a8e72512a493ba7dd608397c79cbe13d9b86debda79ebb173cf39b2933ff72ef79e60570cab460d4850c41dd05f7a0def296bf6448e47d1707ed8bf3ecfbfac5f888d881a5c245547fa9aa7b974c607011d551cf70c6f08fd91703b12d3112153641eaf5769249cfa73e0cc4b687baf70513b96026509c83c43bbd06853ae6203101aa51f28342ed7d268053267e2640f574e478c40b350a775306f5b59c7eb2a721c7a365f6987856a4b785c77fa78e38731ae872d752d6fcac5b630aa18bfa43a36ed8240847f172caf886264a9a90a7f6bbf274a3dba487343bb2b74a849a6e63c04eec8ef2da3a8f502499c21a15ce808f747ee22c3b28570d6bf0cc287d9a0041897b2317a6120a69ba9ae973360a57b9de564ec7d48182ae39e667132547743d4f6b74935c0e5a69ddaae524b08a39c85bae32e964e7d52a3200b68c7d5d0291f2c210cec8f4760a09697235a3e8e654d1dbf1b7234ee99011ff884d6313aa10544510931fb0400a21280e98105e1a3609e2a26fc326414f6a10a6943b28dac1144210d6cc447b18b5d727ba7cfb742b922e5f9a2cc7dc2eae0c6fb726e9f2bd9d133ef23671020c36d290ab3cd333363ce84a0d9b3851d4f97614ea9c20b236e64f7479c666e6769e133468e2c44fe7db22a03832d397ca8e5efc231250bce88216297042056be3810fb200c5162f10ba82b59234353d139570af4d924d0a58f11dbc1896e436f1735d30b040c50a90f0c4115b4cc1aa5a74bd07d4b549134e70271ba841055408f2a2064b5815df1e74f20850c4d4202e40f1841c4841093a2042c5cd11b850040927a220cd20668103765e38a0c175cd76f4110730b8f35a4ae912484d71a0043dd2e553c79e0e072da0db3d5d9f77bba4cea78ea7479648b2c4114b8cc13659220cb332b10414966042690c94989a033ae7fbbee6de1b93a60ccda293f1288bee67d640d64df2d39289146afa9a45279fe3d53e6cfafa0bea88cec70e7ded40a4c864055d2f82b1b0c7a45903e98d49f1c21109cef851e715ac719d9e569c756e5aded42cba7bab73d3419495c4d15cb19248f23aaf5849204d99bc421dd1412634a45712214919634b1268291f208b0563bef8dd296353f591756241560a8716b1e27b262be221d987c447dc0af201b288b858f13e931571ea02f1f02c7b2dfb521788acec919541e183a7452057d9d712128595fd24572d4dce696f9f7d45262b889ea8bb7d7b93e9f32ba5c01aa5144e05d6e054b61558635bd14eb086766281353216ac05d6c05ae00c891d85a1608d797d7e10ceb86e5d600deb525f608dfa0267c8535863d2d454c11a532561600d09036bc01a30e00c19a10ed963c01912de0cc3c88adcbc0572221f85e292964a8cc8959c33fac8952c7a81493029224d1f30e9180d9b240114a1902bd82e90914291844fc368d8e4063ead993428654b467928e7fc36604447c4481763e7792064740f195dbf01b90262069d8ca63d5f714ec540c855bc6cc91674b908a352d0c92429841072155f95d0a08c0e26f5ed2b25470aa6902bd816800cb000cc010b0d9f21165aaa5cae9c585a50971742d27897ff21695c2e4fb3947637ee25d3e523c043d2a45c1e07d678b95366aa0e73189730a96f240eaca1137be7e532c503103d52aa868987f030aad4f7f2e1c019f02edf8f0ff5f5902bf8962f08b98267f9402057f0a70f08b9825f51f9523e1e5f04e40adef4953eeebbd1e1a3216305e3bb5306e27c0fa7246d83a6d5a08b424cc823a3638c18880dc815e4a2e1b57a44578de86ca094dc4abac0da5ac4bd364936b5084a65409151575089a82c885b3401faa2090d8c64485ec41c2c86721559e2eac8496f4d7f92f4aae1d04f4f5f37c52dbb6e71ce71ddee50624f71c72eea29ceb13bae7a99e31279faed83f707b54b705ccfb938c7deb1f575597cf129fde464c250114843450849a0beadc1dcc1a11828b12987bfda7597c42e244d86834a9a780fd41143ed7e2a6bbff2ada68cb5e73e1bb9b24332f86905341cfa296a4befbdee75af7bdd7b3dc337f3de0be575af7be9b8a751fbbe6b9fed9b65f4d2b47c828e4ae2af11e943a4ef754dbbb839db59953d9226fb757fc99ebe9e2591beb85fa7178f59b372fa457f6b5befa8b36d71dcebcb5d4fd91a82d22f3ac7635c8ed9dc8dcfee331cbbb82877f3f678edd974ed471daf95b08673877fc86cc2daa5e156ae5dfb177b52294b190595d2ebbf91382a91ab6be887496b477d5bb317f7ecca320ee760bfcfb6b84564804afe215f504574f139aabc8473b06b8f315e535129ddf4950f4e19eda70f4e99ed9ca6f265d752a051155dfa6a634e8a4e90d5e6316be4afff306be6af472757aca2afe7b8a45129e8b2735f742257d74fdf0f53e6facac763ca5c2780486dfa225197601547462668cc042adff594efbefb20519bbee8a44b1f6deecb718a864efaba76c52d9e5dbb9efdce9af9ec9693c0bd8673c4173bf6a8246e9165f108bb17c72d620e17b69c6cf9d1ea614c965142007a41e619e76bc423805cc8883dc21a06e87a585f63d31d799f630389d1764200eb0901e8859ef3cb99afd7ec669fe9eb904ee9986d3ffbe64006c0274afae24c6b18a0f33caa886e3ed7dfad7ed0e8079deb04e6bfd0e5fa4c35bacdcf7ee29decf511d6805f88cfb487148bb1b2c7963dbdf0c315860aa750846dc8fd60619083ab21f74303882ce1d22da0c01a723fe4800526640db91fe6133218a135e47e08c011203c61fb62480b2bb886dc0f303070e2881c94e40e88a4818a25981a723fb46c2108441c750db91fa217803086279088128595a534e47e20a23e9b3b3a68dbd7a76ed4d68951523c8888acecb569eb50407bf61d24db8d1cccf4d2979dfb4cb827e34a590909f79b59ca41a2715a76d3a79dfb4aaf1f77fbe9d8b03a377290980ebb079046a2e1eead652cd333dc93d92feed453a0bb0e0aa49164d72077015ceac9581cfea1847b3256770df7642c4dc7013a23e1de834789469271dd67fabc4067ba867b2017acd26fe436f36c243e3bb01e00831ec019b0b37c000c92c01c60967dadec2be061055521413baecf977096b0348dc7dc28b7e3fa0f0940a20a56868744000c4340a20a300c010929b0b2f334e470e420c90ebb070a1a494f65652d40c019ee1c6e952051973bd3e1d019c84af780543c61455fcf99bfde12021b2569ad0993236df10f1db3e781a8740f7ac484b63a3c3621db4bb7c1838815f0b08a04d9f3b0b2536ec70e394a5f347d91fba2d0942995702b126946421991513cf2f31c8fd4cba368d04dec030ab50e8c920364a57bc488228b20986ec22dd9234b3e8d89485676c8ca99f807bdc53938787a1ec8a97b5440072be879d8c40b3d32351fa48ace41a2d01f1191a53dfb8a48968653f35afd7672c89ef701b2b4eb98a2f4bc36030390951d890f0d5676ed23e28a12250a4e023c72250b122d3e0fd9e16919e3101dd00b3da38e1cb0c084281d2f65edc11304a49e78049753f8e9a80dc927a0393de0147ebad571e80546fd23562c049d18490b7e88892889127a5817eec9010b4de0b90c10699da481121e4e0ec749ae62774282ad758b8e6a3f68cf5b288698ec1466b0f4a572944e5f3abd513ac7d5e740ed1afdc67dcb21bbb49dd28fd6a0f4932f7df2d9970373e0217c4115d1c9477a294f313ce56c48788973e0e1e3efbd72ccbe103e1ebe6619fdae6f5fceb2573b7b9b9272b1a9f6ed10e7ecf53733cbb02fc7eca9d3ca918f29e814c5392497c383b1e77a03949f10c21c618470c643f91b23a610464cafa4320d93c6a6cf81bf9752082f08e10e4f0f07011e19f1675eee06847046a42f11b85fdd42a755eec695ab89610e9b0b318510df0b07515cd15fc3264b845a8316e82ea24640c3265228218551c7da852e3ec71c114a9c532bcef2f631628a73a05c517a8a73e0eff589201e5a8a77768078330e3d3b3f6efff03a5e46f13ba5a4734e39a79c72c25f0a492199b78649a8410f994861a467346c428427adc9ad3ea13576a2906c220552d3cf1ca4756294ae6ea18bb7698b7328ce37f2c279db54971c0efb18e1bdcd42e0d9c92c26dcfe13a4d50b149fe46a8565c01a4fbad82aee46bc2757930a799f74d29ebe912ca8a92c0865943116d13649938368a867ed29796ad9edf365639ce52acfdd533897df67159cb107a9293848c6f20c7395970e5138484673cae77390ac597086c1329ce783d4ccc6fb8811e7f82097e22059635fb98fecd376f671ef239e3ea31e7190ac599ee3331c24a33e58ee63e22059a6cfee5970ce2ece77de479659eedd47cba70fee3eee4d39fbc541b26ec179c574577090cc8777eeb3f159e51bb6d95ae26c0bd752e26e2ae1ebb4dcf47c7af68c71902c7f37e9706fa9dc658528ca20869f2e967a318eabdc0a6a6e257b7b5b6cc42ecd841fe4fa5a2c1984e09086ce3ef0ffcc5de5b90567cfdfb993673ad96b85e5f2aef34bc7d34cd7693977babf8ef7ef997b7d369d3e7bf3f9ff36ef3aa65f3aa7eb98b8ef3a5cdd420a1d34d17947c7bb4ecbbfe74b9767ce3e9bbe7bdba954d26e365dee1fe4fa1ee4fa4de7ea77ef2693279fb9b3b4bc3e7f3848d637716f31e120599bcebd45bbe91cce5ccb4f3761f1dc4b3f5d333da79c7bbedea2d515b8c00660e84c9f7d944cdfde1d7595af3cc5e5d9f4181a8caa94e2b61a3397bb5d989feed9cbae540f07c952271c247bc1f9e5045458e1862974f6b1e383a761fc746f83a93aa9c33c9f8e3d7b47bda43cc380b12955ca56cfaac493ea3a30de7554d779398ceba47e82b98ef794e7d3efb36ae539057396e717d3754e309e6a4bbd0c91e4451b9e78f505c6730ae699eaf219c605a3da52d572295895b7648281bda4549ebd5f54c9dbb94e3b305cea3b3e785af513ce9e5d4318b0c0c40e8cab9e4f7779f63e5367516d30b00f9e4edd4b71270da3a8284ddb65ba545c565230ede51ccc752e8ceb783f59ef2fd7499de559f59a3dcf54bda2056940a2f38e8e0f9e3e5da5f3f213ce3038c378100ce6a7e7886de02afee53e522f0f7275f671b2a7e7153c0357f1aafb8071efb93ef5ac827580ab7818190667d58398bc0729a94ecff32bf791fa0bce2b0fc275f671c2f9c587ca7dac9c9eef53f7e15d05e7d483609d7d9ceee3e52bcff62acf2f3848d62fbf9e3d1c24ebd3757a90dbd9c7cb7da8785f795639bd8fd45f70567990dad9c70ace2d0fb275f6e1dd870a0e92b5ca5df00657f13eb8073175f6b1721f2d5779361d856f0b0e9275e92cb83be12059afe06c7a9052671f2a386b0fa2754ec110aee27387a109fb287dbb8f12a63848d61bbe98c2553c76ecc155fcf58b0f63e02ade62150db8c227b882ab788965409e2f16e00d5860d164899243d8d313efe89a520c218d3a28cae1f05d0d3d552e74f0f99d03af9e97bfb5d65a6b7d111b56a594524ae98bd8b0a8b5d6fef21a85427de19783c40416b2e6177b9a7e52596f249d919222d9210a224cb18492302479f185243208891147406ef0e20843f89902173b8a700424a42852448627bc7084078a3018f1c302285c4891840d2b2afdd9b08910bee879ede1e56ad6585cf12657b30a2d3e36dd22c698840663f23dd2f3fe5c1f9f9ebf46240d90a48152f5e272ef90f361bb32ae2bad68f7410876c86a99f06db929fafb20ec79d88661c7d98ee1d686572b0c3399b08d0d863d65c3b0e3988ee1d6761386e11ea093eda6a01d9c6ddbb60dffb0c1a2ad7ebb56bfa01d1c0c3b0ecc31dcaa87c1301c04ac4138b5f6d48a8780d546f5b58270527f891126c21c27c663c4233038029d22100c8c9f60c0c0e09864ca4c95984425460cdc8a4c52229314184430383a9932d3149d9854aa680403068e455b2c526d2a950ab754112946158eaa2746d5cccbd70ac279b98b942a95ea0bda390e8cab700be6308ea8b0043a01a9607e7a8151924425890a0cd5614821c92485490a8c4a12a9b07c819146303058166d452fdb8b44922f3d2f2f5866f9b272f95a41382e2e78ce54cb837660608e4ca013504af5938b4a491295242a30a9c34ca1c92485498a2a35895278baa85453a5c2b3682b72d95c26d274e97171c1f3e579ba68ded70ac2f13c4ce94bcb17b4a3fa0b6ea5ae3af28229d009e825f5939752924425898aeae52a2a4499a4304949bd50a2174cbd14354aa5302dda8abccda348d4ebf13c4c5d9ea9e7a1be56100e0a856b757171f982768e93ba0b6ebd3c75c40557a01390cbcb4fa8178b5b56491295242a2997a784706592c224e5c5a512b9e0058056892e7e05572d85742bf2cc299fa0c17f7649073f03879e5f4119420245c71930c18589a66ccafe3a6c7a486f8c1cd58e7a3e4952cf5f9f9e9adde6a7fd327105134c34d4b44fcbe5d07ee17cafd77a5df3baaed77a557c5598c52c4973df1e3759aa38673b776e7edb362ec785a4744c078f861c9221192b087b8facb15f7de1cc83db815d1e0061bf9fc5992747d6b7001672b274714ef67becd965e4b2db142ec7ac95abb5d6fb8cf3e15224f1032cbc9004271c61412883655c8edb1b87e3729c04ee3ffa28a1c6e1d8b6c84120c3196b0d53eb832efaa083d8afd348e326f6ad2f10805046e6705c1717019e25c88abdd5428634e476743d8df160da7fd8ded1d9a1b7ffb0ad733584334cdbd589d1998633ccc363e98679903772156160c019b193abe8d3610d879e48d2135f2a57a52468f09f8da2cbf46ef273420831cca1833116e5a0a8e1100e8e74866668f99a8643385022675abe0189ea20750882dc80a4c93ab4e4018770e0d3f2209034f02d1f840e3c482934d0799e1b5aceae0e3d81041b842e1e09ed891fd5172b5d2859210608321a0e3941040d2b4e0d879a388203e0f0e28515a226a5255b921becc0481b56c0b065c185092f48520d877460a44f5ec32126bee8173bd4c567eaa15a584e2b2a2ea58a04084f36970e31a184e99734a6c7235d983e6fc2f349d76747a0747dc784919e37d99b3eeed797c3fd827046cca6974eb91d7372374ccf2e15d3875dc574fb8d335db3dbc5d99b72bae760bf563e952f9b6eba9ca69b633aec942f9baebdc399a74d39b663d8766ffa6ee9a789bd1ebb38c7e324fd3142ca1c96073db9089154c1f260680924db0412f086013a1e1eca501b3f7b5ae76ba5945a1b6b1ea2a7ad74cac94d7cc3003ae42dfdcca18fa7527e36d1201c5ae2882e351c528207ad496fa2a1251266dde8b5e8fad31da227a7814e627986967289265a5e76892bbae22ff62c513c1329842a6e6889a30dce90106909a30ff020f100a7cc4c142d1ec6c45212926b38a4440ca6290addd250a919ecece2ba5cdc1216d846459684509fe297351cbac1923e6dd70c4c2eb7c5ebc591bb8079f9bb2a4312446601e03553171d19b848d9e21d430fddc0c985299da9c4952e28b4b9dad16e448aa3c5311f63ac15d71dfa1c1ff20c4c9efca029cef1f2666a9a69e8064734bc6180b6b6564ae79432723722c5370cd03a2cce43e0b0dc0d03b48c5d239c3db1c4b127ad91a640f34047a1073acc3237eaf5c43edfcd9afb697dd02972062cac5012052eb860f1d4a08a2db4c00c46a2a0240b5686ddaf9b32f6c68537b992322699e9dada6ddb36ec412a57f762e9040dc6e4994b5e2cc3b027672411a18b59fbbcb5cd8ecd7ca79661f7aa52ae41dba2a489db86f30f5a93b66f38260c5d8ee956936e387b9ba4d91edfd56fdbb64907c8d39fa4037cce9a0e98a7f75431b4ab8d4736721c4e959ebac0bce93ecc9b304f9770ea02f2a6fb206f3a4f6fdf274467db4dd96fe40fda9855d2b613a26cd0604cee6ae0c5b6ec5053c55fd1b60c809455fba00cb98aa733f152ae6c44324317afd58bfbae94a9d77e33eda76ddda6653f686718ab34ced91377f68906822e9e763ab163145ae28a5ee20a1d7726de20e65a1d1cb2c1157d351cba81917b790ed6802d9fd270088937f449aee810125d40360c21f1642686a1e7101255d098a95176550d5d7dcc3f260db99af9642357330d5df67a4e790425ae78dd6b93abab93abeb3ac9d58586ce535dd7755d57cf17869030d270c806478d8086433648ea7f9d2757a72dd6d3aa860eca9595df19bafcae40481a1004111910bb5e881f43481a1f1b70d1f4b3e70a0b618df8793de74ca441ad5ec7d76863a37d7df75eaed6a083c4d7a686072933ad3da29bb1d18107ce14317ed4ae14db2253f69017cbb0c30f7686d968eb0d42ae24bca5423187f5f4d319d211aee4410067c8f390ab08c8150f72257f0387ee07c8bea083cf50283611b1ad4197a350cb2814a7a842d240254b240d938804db44132d298e46be4864933543f4c8954ce9e42a1ad1115d5980f4722ee9eb291df457cbaf26fafab4c1118d9dda608abeaca574d21e6e9a426ec765efa5615b0e21fa1e08c8f500efdcec7de5765cbf389dd8defce4715c9f1b9c31317d09ced0aca6b19c7e2b2ca7dfe9f3d3209c71b91ddc0eec14cb5b0ec7f595df6fe5295f0ef6949bbe8cdd74ee4bb11c36e775f7be14cbb9c3d6e4e458ae320fe10ccffb327de9a667dc8eeb99fea25a8e6a49b13ca583ebe6ed5d7e7fcff2ddf872f6fb954fe5cb4939bcc779fb75f952be9cfb0e7772756f5ffa6c62e4aa621ed681bb71fd62955cd96fc6a79ee4f5848c73c66666256566866a406488063f38a60a12d3684337236b628f8d77ade1500d8e68a2c19811789d3bafb341773bff76eeba1e294a5b76ed0a425041405750cb1082a884524a2b8d47b18ba8e4281e8501d65a2b1d9a4113158a8514a9d65a2db587b7f0d27ef214095236584d6e35bb19cef75e88b3e7dd555f68adb576c6d24bc5d0cd4dcad09f34ce86b66dc721bff1f4f6616d5b5deb123408e19cf062f2bba71f6cecbb53ce686764c815bc8410d22d9864adf5d65a6f67fd649d5522cd496fc0867b6d926c2a1beea549148e20a673e8efa1b66d9a7623f3aaeb61e5b2d7afd61ebaf2d0951bc265daaf5c699b1d414ce75cb7d7eb17d337bfefcd6ed7f7562fba2c43c60c8d1e18f751b9aadf3e7838a3ca2cd25bf1563749dfa04d1d1bf356c7033447c6a3e2187f33bf25bcc0db1b900b0d318433a46d41271b0e19c10919c2f50029ce3c36722b75039ed2be9112c2159443d04ea7eb539bb068c2a23961d184452de535cfa6691f8144839ebe71922b59b91bd1489ee9dc8346d3dfcc0dc33ee7fc90ae797ef1749eb311a71731873a0445ba9dcd8f225d9d3d62afd9effdbd5de7e5ff5246de4e3be7e4cee12136ac203a4f7bf6c4913433e8b6bfe15e2e342869e875d58bd61fd7c6988323313177bb97415739a6a576611cb0a3917929e12357317225a5bc9133722569c895acdfa9cb33323e662563da0dd81fe42a4625f24cd5643d94d4ae225579137b47ea11686b26290f3f4a866e7e31b25e5a8c03764bae6cd85ff6d76a08b952c5adeb97572fb4af5ff5c3011b47ae228f68a4655e553274506262fadaba765d4f5d3d55d77a28692ace173e491979a9d56b2f5d337d9b56faeab552e5be7f5ddd367c92ab58cda0ba719d5e1f6c4b2d92143c24861534f1952b699293a8de4b372da3f8de9bae751f66fabd66fae8af89761f6c13ed4edea79a18be37eca7bca53b54539c4a085d298fa5adb3ab7c29a6efb7c393c3f9f41bce2bfa785b6a97902851a238f95185a61b72cc5fd7b60fbb2a49d7634e7a3ea503fb7ce973c80826daa41cf61cee97ca219c9192f2a97c197b77c9ed98cfd82fce86f6ecd7238433b2cae5e9552ab7a3fe529d240d863d857bca97b2df0edb742c5f291df5a5d79770ca3ea5c39eea2f1e4444960f8407c8d8cac77d9f2a27c31d4fd74dce2bcc1fe42a1e87875c491af9ddc89b2fd3cfe4d0dfa0f846f22057373cf49003d6c80167506dd35e7200d194621abbe860db7a83a763e2ed474bb0061c32a2a869fde68347abdc0dfabc83ded39e0defaf1cb1a75e5976ecfa0fdbd877b0ffb09dc5d0d9a1239c711d7210a8375d6fd097e08c38e98c7843f6b449d058c9788ca73addf060a343175f2079e145bd7525a59452ca192fbcf0c22a81d4b4eb91a6462ad65a6b4fbfa03143391cf3d2ca478b2469aedb4fcec6914bb3f14cddaf7aec49062457154ad6f288cd5fd48bc800d4a3d6724d468c4ad3348de59aa6e13cd32e38e5d963b916374dd3344dd374a052bedcc212578258ad7ecfeb62c42252e71ff28a33778dc5f97884fc31d2f1dabc567d3ae28c61b6b339e7351f498379517dda3e5723d248164926f67289a4c9bc17541128e8a9b23d23d1183afbdad5f6fcb2097afef4f8d1beda97bb9eb235048641e91ccfe5982d2ded2232c0fea25f74fe217566e7cc8cdba1a5dc22c9ae84d4f13262544e4e36f4dcafe71e34f24c7338673ee597357a52740551154ea6e82bebd0178dbe269723e5f3b35f097338d38ef3d1a6c4d32e620ef3d7bb2f7bdc374fdfca9763d1bc53a63e7bd9668b414c99fadb713877debf6a4d25c618638c2a51e5927b8c1ca65e64da2ad7543eec5b672a71b7b6c54e307b66b58a113fdfceebe491ca5ba231e94c257beedaa9c455475c17f38869641281f285fdf65d4053a67ee595aa5dd256fb4e7265e5cade248948197b28da3e05e755136d95c8de116d5fc2b99346da9ec3405d4fbd3876edda36ea0566d31836b16313c3d9e61e347ad068ed18ce336d9fe19c8b5dc339f34225de0bb8508301a2c4007b9203b6851e0dcae8e66f6b2620e0af6b4e4a29a5b4ce19a1c424a42e3eaf7a903423b09916fb5cf5158dea97b3cfd359331c8d26b697145df64ed7ac765ef417112cbea2e8eaf3aa46a4d8855cd14c1c8f886a183428a3b3bf5dbb89862ed32f926409857e41a1481ad85168ca084d986403855636bf9874990219e979da84fc42ca2ee46a4e28922689128135e863b5ef61d3d34888284f2059245757c82770c6fcfd24915c4d7904488950121ba0d5cfbba49e079a44240d94d9337db625dd759ff92324cd258fe46ade47d24823924662c9c5fc9134189646b20772d179024d204953a4e76792a4b12fa0021565e8f989d46598d4730436f332ba39bbce4a593a767bd8f4bd510a7a44d28c0026758ea4404abc60b7074cc23e297f11a1cb3449cf973e3a0298d41cbea2e8b067ca6489a4c1b0278142d228399248b1283ee102cef822264189454972f5855c452ba594d206ce3feacd8c4911ca93a22ee42a1e5d46e8f24ecf164d616825093165621a34f9a4e3c4913538b28759d3c30504ac311f57abeee881f8a60ba22704ac61b9cb800fa287a4b95a7046fc8433dd09a78708f0f066cd4c89fb78d83e10c8e87044a3b6b3b763c77466eb44edeb61d303c341ccc44b6f5e45e86624cd75fd071cb98a1b90323cbe1ebe085035cc49e975d51ef50b42ae2884104208ed0f724571e48abed27979e70b341893a3d108e0d1bcaeebbaaeeb8247d82986333c6aec15263512baebf8fab0d75a8de419eeccb6785dd77565a7157a97b579d33e4fcad039374cce1d6831c618a38d31c618638cd1c625da0f218200814d43f843883cd341f4c0e12157f54557c02aa0139c1f78fcb89a5e02b93a471e5e7e347edb24420f4cea7b842ec79eeee9e9e1f969fbcff92b095df61c7fdad288e5eea7881831f7c2a001a3f2bc148e76ef0b0d0dc29b9243054faed1151dfb4ad2e5aee357b346071da351151d7fd231724243aa4129638c31c668caa18b87310acd034653c4a0db49d29454fda9bd2bc2d59cd2092b62cfe753cb544d55bc137b7a1849bcfcc20e5dfd6273c1a826b2244b5eca90a2cb9ea42b4f3e6627aa240dc548a203264e0e2d37b9922ab992d70ce46356b2d668e3633c17881a0e6dc1486753c3d36838b405251a72392c76e9e08de6753ca8960e1e5a8da583543b754482e4bca741491353f14860c43848245ee93e24c61a4da58354a327b9b2cfde654497b7b6934628bf9dd894cef821f1f9bc704a574f8d6857135d7739d199ba15ed46ec528ac67590c6bebf9ee8b60e12451afad9c11ad0a62cd6e9da37b28b50689a9675448222a67275a502e4692e797dd7e70523cc8143368f8df109a52ce8e24c01b595b3516319b41e9d064ff1d95a6baf222cb7d9d7a6f8f68d7c144b5f6bcf3fca1c22c6b848259783ea90c075e5086718e606e5ea9a4197b7ad3b792aac5b8176afeeb0a4c1189c6985107ef4555628b1ed5216df2ed2557cb7b059c0011aae64789600990085a6e0692a79fa1d3d979486bfb1469c1db18e1b3cf206bd9412903a3a80737c9d432febe572d04bdc6119584b75ccdbcf7ad8d7af2b475e31e87c34184324a8769bfc7ef4d6c9d5d6f8f4f99a6f8fade5554437af9ab44aa44aefed72d6f99db30ccac8c82e9f2ecbc87a5ec60c0d1b1d261234c88486464b1a0e71e18b3640c3212322adc119b393ab08c8d53c0fb99abf5ad0655845cf67ada7dc00fd76624b24f637b27e487cceb2f483435c306a8b251bb41bb163374f2428b2685a8d1e861d91a02a15307ffd74f2b1c99016a05cd2e8ba22ceb9708fe8d3f5d7753df60c21441040fcc0a3871b9b99d5bdeefa9d32b04715ba9ed08291be6e71b69778b369e8e873ecaf7cbb5e38bfa08ee8f0759b630f6d0a344ab7c05d9b5c7974ce97211d1cd2c249e76d62b0068435c5622d501aa700063080014208b9efb381e32f423a38f404a86543f12449434c033754418ba32746b4286a78ade1d09314cc89351cd222a90c5a2881a74d2ce91a9d5da39bf6ddf9f90d696edbe2b57fdc75ae782ecbb9dfae559c9f9d9e7be476d4e80c6bb4de2c4cd1f4dab57c3f654ce9a017cbc21592e3aee5a8d15af67c6fdc4bee99f61fb7e18cedcbf7f33a8435727ad4680d8fa046ef64ff711bc219735efbb2ab5d3803cbf1b1c6215e6f10ba8a905034d4822e62d0f936164f1a62a105736201653b2a82a2e110168ee8acea8a85265ab5920eb8af97211d70295367ea55c9557d90eec29edce2d0d1ae9b75464aa14108e101b4b05ae7cd0d5930297a0294ab055a28e17ec10d435844a1b58643580845c1e2a76f432d8e341cca02175d80864359f8c242273e2d3f63d352b2406291a4e5e570dc0b65d8ff2dbfaa17a983435754d1195e07123bcfb6cf708a2e023d7837369facd88676bc02094d2f9be299a36ed518e21b1dc0f0b6363a40a106225b274269586307c8edfa1fb6a76cfbc99e8f15ebc01c3d473107d831d0604ca646b993b733d9060acd2353060a45a1be91f3c8ac99465366dee615e79915c5f9b9c38eb48d0d9111ceab88944fb191519c463d7958f27902c11a2f3d2d81ba1514f1048233e6e54f2422ba9ad29e9ed88a3dac9b1f978d2f257f7df9c7d516e7d8905807466101023ac8824e7ad6c41ed66c43c75337f420691e804511b872026b5c340fc0a20570053bc328c03634ec0cada0011b66e08435efcd9a7fd6ccaf660d4f122ac8820c9a64d186a21cb0e66fa89116340b5f2b8c9c0d7adbeae9690526747c4f433cc5053fa3278b34e4725c229a623a85b8e0a283910e590168a80a4ecc212b28616ed1d14dcaa8341cb202144d1b0e59214967da2fb05db8364936f75e2e70a18827c80a4fcc400934d882124c00800d7130f2853428810a472b304285c80d79250b2a7c4105228a885481c816b270e982166a80423e5d164646551822ea19b2c288a5c22589e8eb1a22fae9cbc4ba2e7b85adc2001a0e112d69db7088e807b60a510656b0c2bd36493657b8c245eafbb58278588b7d413ef0b088984f51c0629f788114052c16128493bd5e884f64591c21192652640796bd4f6455ec8b2c4d464825bd301e53e63e7e404c99fbf91df58d1c0f223753e6de5a313365eea49f546af7f2f14edca2b805a794a790752d8cb9380722cd1bff0909c2c9309c32d74d1722bf989dca67c730cef6895bf11bea059dedba2973fda66bf22947fdad209c96cbc76bc789d7b4c76318c7f3308f885b3353e67aca513805b76ea6ccf588e194e9246e7dca5c6fc1d7fcb6973e0eb7825214a0cf8e43b1b7bad36318677ec3adf83365ae88bbab158413b34bdc8a3df847e2562b08473ee2167789819832d75ba5abccac1cb2e4590e5957bc7e33218be56b05ad7c42342141381a8e47a6ccf5ec42502fe870543265aeeba81a7456482bc8070859598e4afaa2377df3a50fb2b88d887c1c9a0294d6a084b284a4fe466a1f0ffb0b4456fd8d9cf24a22857b6d926cac14288d811263a7b05d1714e9f2a4af2b24594bc5755dd7af6b480a49b68aa12a72d058c3a12aaae81c2334d7a0c198287cd105681b988c71c6496549fe88382485a321295cc13ae9a2071e3f009184b6a5b6f69241438728dadaf360a3d00d510145dbab6c142c1486a8c8419b1a0e51f1538da0a2c7091a1aaa70349a7c4acfa12124e929658d254227ef5cc03c8d335e61c807401d19100fb7b903a301269c11bf03a301e40e1092f48fd830fa204917e5fca43288d168bc9bbcfd64ac620e71a39e0a93745e5ed7755d547672befac047c2991aeb0d7a3ef374ae37f6db01a2816c3d1fe7bb9e782912882f8aa1ec4ac62a43594fa5d9eed46ddc636c7e89ced0a0af339da489a7869c0d38a5942bf8e92057f0837d816c921ed6431c2ddea1ff9111f5f47c15ea698a6b70364be8a01afadac1e1804f76544cf1e572cca49e0c9df44c263dad33937a7ae21a310779c8d9c41ce4ed123a88d540833155ebb6a2aeb13bc9ee8239f4973c1aea41d2b65193f55435365266d208326be57270362ebe1896715ab66ddc2de560824f3a8a3bd3d3a6c2d9a8d826a193db632acb565fe26cd4f8ade4274366118b31de2bc66869ac38a5dc81fbebf7f75e2973e8eb732ecd41bb793779fb0b3e9901b9ada35d84aebe1e3a696b6f18a18b7dc56d48a314cb58014dab9a9431e648d903263dafa4c926e82c0f64369213601c0f0c13c1d32374e4c787880a52d0c32282087cf2031bbca0095b9c81c9131676222d0f98810d6f80431ca22cc18885bd3524ca12b8600636bc010e51582bc032f099420732f09942072cec10ca487b84cece1c8b7586e89cae39deb5522a8139e99c93d311716e519d565f758b3330798243cac0670a1dac2ef955ee067c827b620867d0532e0235a77e62cadda0dc0ddc559eca246854d2e4d44f4a690f92b47ced0150cbcf3965be91d9ebb4bad65cbf43debe7e3951c6dfb8f7faf2103822d7c36d8bafdf4caca7ce6fec5cd2e2cc238138639da74daa78921eef7188483e9fa29f9d9a66e8d4c416e061d9c32127646838e4e4a8c1d0e515fc20670118850d1627a1e23b03a837a854cc35d5b91c650cd18c000000015314000028181089c4429150381e6aeb3e14800c99b64c624a17685194e31042c618620831040000000060309a540113acaf965b4981e869baf157ba52817a35e45e3210e82902e04e5300cacd7a8ec0808bd10de4bc862fee860080fc022d02fa828ca4f2ff641b8231cb6116fa7bacbd6b18f73d6f1a491b41071bb4326a3d4c63c8e91560a5be9c67c2b60805e6e979bce1beb419564ed1eb622538a085c003b66ee6b0742d9c54f1172d4285bb142569b9be9ba593f1b1fde2dacf50e10818b1e0e165c731072a984f8db226abe391f320f324dba98dde552bebddac89e69c503a1e663274dbd5afb9a0517ed401813ba968279ce9f3a7a73042cdc69088b36075b8e9fe5664032845b518c48e379800c8a2ca6b2f3188a079320b380176736291bfcfac6b6a6438684045ec4748be7462b0b42c7b0ba1fc6682080abc987c1e9bf7e1857247e7f0c6bb687121f2b1f48e08d35b287c252285147734eb6cd084deb3fc7ed50359323d9a7e9b6a94e5a980f3d133e3feba86961b7a0a1f9bf76f9392feef2f5eb6a2c4b75e8bf14bffaa307050566026e52cdf046108e35993e75d684f0cab395fc1399e5c5acee01406bc0ee9ac1566702b8f0a9a5d1b2b141d2925daa5fea316c15112e83ff604e642737a132bc56d7ab12ec08cd391fb437d6c6a0616e14d55bfcfe5433d0972c5b351440625185478a2ec9c62ca7368ea229b36f9b341d1cbc8f03b11a74aa2bfb3c7218d29671de8e4f111be9ffd9efc7e6cf395c1729974781ae230e3322489671984a342603d113cbdadad737ac5deb903defeb13bbe2b980cfe603d9445c1175d9d14eda7d06dedcb51d57f3606024ddc6f983526a3e44c820af2080e06b7ee8df8b96c384103ce38f9559ece2d233b04840c583e36be077c77191f479f45f599c750fe16f5df85b30a5aa3f7ea0b926dd4fb68db8f6328bb6f38a5bec753ba34ff8a09298dd7dca0437c17834ebd0825c04d609f9fbf592075e5667f6d487173a091a5c87132112f58486719e84d61e02f9ec718d6caba517d9166d4a777ead0900ca725a7363864eebfc8331cdd24516aeb1179cad97f413525b89290c2612be40740fa84a4618582e9e0e8e84e2616f61e668b8081a65aa33acb2e039a437c8dc5613275b0a75fb0e2f348fa67d6e9c7141ef8411b924794c14c00acda03d1f644938b0b07857adb624e17c0a70eb28046a504f8deef497ba09b37b4fb71c31dd0cc09afe461175a282c590fca7fbb799101d60b764563ee4ac5a6f1968a72ffb2ea880564aa9ebb622145e630c2994cfa632f21ba2d133954ff5352ca38e3847d2f890de9f990cd4f6d41e2f6ad7be003c7ca925c1dfcb3c33385af1c4dd8ed2371dc743e52919d5c1252cea5dd9f28383b472a39b77f21fe4268691a00743669efdd0d6bd06ca0418dfb4b65f3d3adc169a9937312aae36c439eec95be4eb497b4e6f9f6ace09a8b4383ba03cfa8885bb90072a1e2b61359922df1d7d08a7cefda2f0e7d45a308faa43d23dfad286a930d9706634db36de38563b295b0675b16c3a7cc16ec00c14c2b4504505ad66a0b474b41f5ccb3b7a4d6177460dc8479699880e0e4ee12acf82beb44a53d2dec2cc34ed40cfed680d5d460861c32575a231385d27e67811baeb9338d50629fe1139f86ce8a4ee1117e230416a9b7514aca5cced237fe09e4454c47c13e2523d18aa009f9b0df295dd00ba63c4fbde4ea1fa902babd8d8233cc2150b74a05dcc32f3c93feb64741f660aaa4b84af82223cb449b806ec9a9e9f2c98a241db3a76f8f813ff63fda3c75661601de6fc82b6c13e08b9aba56d8d8af8f5c99bca88f9c73b67597bcba5b16e634cc988164158a6d4d5c1cea5f3863015bf2457d8acfacbe11bf27cb1c13d1c2d86643f7acc9131f13edb62ceff3cd5486b65f3844d1c760709ea11925de21541c009abfef6d2e6d738f39c7c01792da1bf2e6f120e9fdbcd078857e25f0bcba99dd64be051b0fe0eb311a8054dd632a45b6059f33a72b7430ae7dea4f3c5ff10157ca15c5b6ece3c7d9671eae5bf63106b0300cd970215b011db36f1fbb86c5b460383bac50987b990156343ca09edc6a4f6429717cc6be0a5815273e86bd1c649421120fb0f290cd8aa1bc4290d375acee16d0eb0d4c555d71b2b475fbfc5de71372f19f7ca33aeab0e1d3c9562d3665a369e97e7e8ded6dd5888200bb9a347665f8b9b2d0a18c58b6594f70f5afc5427d800831d66b56d192dbb2cb1017ee99c5d74b22611b3cdcd7c3b7de64f0d3851c7fe05a0cd4b012d98b8118b6b0e032f014cd80f327e4767b9e61baa4d07086a01ef4ad3f5e180922871c191efc7ef8599e04a66765cc2651c5b5093b88385f98f2284127bbceda72606d785b7a973204dde81bb83b3c8e402637d985f165010c1e42593c7cc0fe2fc810eb9237175436f9554f5c399e2bd6049019676ae4ff004c14a210f2a58f2c6a3a04b929ca17147150ce93c2e31a80929d3c5efea3be6544b7811ee34c711dc4ddaea3bfadfe47e408bb6cbe9c31cfbc2b2f2e24e3e3975d37b9d7abbd142d753713f77fc567a2ae6a8341832f871733bce1b403b9b10ccf95dfc06e65b9c4722f4be7081fb70f93894191bbe2579f31fef3890c673a1a34cd950c33315d47cc00ad4ae56bf3021d29a1d9f5e40cafa0b15d129bb5bfd0c4a40c043f509d1aee7bfb2c7dbc96287b5068bce6b5ce3b818457352127b02a40e0de3a6c92f404a2c86af71e46eebe4065826fdeb1c0d8930731c988485223d65e79111dadba807c5f08ab2e6c026fd32d7b9e58e904371da5b82cecd4611a2a476edb2169f37c9d2eb1e1a659357a09317cf27e8e3361abbf98d8c6c379c174e640f096f87b9376cfab6a7c087de0a456e2223c3bf5cb56ef38b1dbb193d2b2fd0a36ac2c5d73e8ce5a3d02b87d27f18cfb950454d90640a411cf966c89af9d835159772d2a56f699eb79d8da30e122d5e10b740f6fa14425263b5fefc68b406e16f301d1cf7e0a10677220f0ff437e41b0e56d1edd3dc419e70b1c9a8ff4ea2f1811fda45dcb6adb966d46d8566e6e23f404f6e53a1c768a6481b226cfad2537f7ce2b5460774d51967b4c1e8d9490a182ee2a705246306734daa2f481636d7c31072ddb74cdd702510421f2aeaf16ca2e5c29e6a8c079d84917794d7af66253a4145fcfbd9c681f2d1cf26da5addf4c8772b20e5aafc1794c38e1f743a445f17ff2be71f7cb46e701d2f3b299fd6c7ab2b2954885eedfce0dac77599ab432a4a2bf9dcd8b7c59090acbc5166f8a2b9eec89a04f542688b131dc28eae78cbb52892d63fe9a5e893348ce4be91578b97fb421fc5bab5337b6db7a979004ad8be1c5079cf398e5b1d2bbc69972e108954f904dc9065ce0c18884ac6fb722044065595fccad23c746b89a2ac48bb8cc239a6c2fa6d029a712bb1748f4b45c54aaa4ea5040d7195393d00e4221ec07fefa1555d154cd201d02d0d89011ab21d78fbbf97dde9319680b7e09c6c44567ed684452b62c6a459689f79fdabdf8b5b4a0f57efe0aa0d51d36d35709cea8e7a68a85a9a22f47bf5b2a28f4953b01f5c4b5a5c395a15c5527494c757f30d8fd8fbcc6d9aa231302beeedd4f0f56b6e4088d060f8564ccc277277e595a678cfae6040ed93c111a2d28f8cc503629234a3657ca83b5a4ddc88a7c96d01c41e698aac0c3d5384621fd5580098622dd307a7b774a561ea1cddd5c5ddf716d4fed2282ec87570e1a32a8d1fa2bb1b60b51604bd2a865aec529c745ff34d8213c8e900a75f743f5bb8c54f53bc2f1b3c1f2196d6b9cee80932653f66021d1893a75a7088dac78973f858b4e4ec58babbfc93a346866a00b0d55cdb6ce2e9f898bbec5cf17de843038698f94e604d84139b9a0d084bb62f182b197eaa14c6cfb11cc24bd005bd894e7b934b81df97a41a38decc08de81325fef1d2405ed2c899c5056d6a54e3ff005afa751d4d25f0cae4652723f9501cce073431d93ba33ddc75b47050ce2d4bc26343f7e01d87282999516761c781bae43d0cc68e64f9c036c7f6b7dbd474902b338931d37f99ea7a9629968f84898ae027ca6bcfa0c53563a1a115b116f76f170f653342eeb12cab022b6303dae3b45b87da6b92d3fb2a6797c936b2c0ef724067fa49a60fc0e879b0cd969444ef5fa5db336c301d3f2f9f98d6467ac6ea1dca9de70a2630d8284e7a21992817fe7946bd3d0714e852df0ce88957f1dabb223258ba43a948cc6459137d2d1ea5ec92762eed53f6a9df3a12a1f8540a89a47d5b4a4d17db9ea266ac934223bee3c14d0067858a57aae1a3ad8f6db97914e7d60b6bc18a104a0f6be91fb110b83216086556f50a8e73906e828a482d81863f01ba824dbcb9737f1859809f2f3d8d0e902f34048b24a23568d06036e04ab529002c44c844a21890e29e44f2c57731d20a122f5e6515d57381e42d913120e1bc92779da9b2b3118e3074ba7e2152425e5cbad09198dc158dc802acfb42ca80c813cc40c5de188ade64b9e46ec55be3c6c3007ac7ebd68664ce68c3b1cdd55e4d58915ff668f430601fa9e04e4a86a9611510cebdedc61bb25df3a5d541328b662b3d0986011ac0b0f2fa2af69dabe963241a7578506cc99287e380f9946a31cb416e37d72b1241b0d7e9988272cfd96a50561c381d5ded8e8aac276c31ee81636234609d4e51a105909262b4a44ed324432e55a8aee89475e28645e287e8beb18dbcca890e6bac52e6dbacf34e6013ab135575175ab8b2f63596d19d80f5fd96ebf8192e7953b69e106e4897f603bcf291ede6d460db2465646237533b293d27633e76fcc43c6810c919301fbba99f553e76d53b59258036615ab4ad1eee5f694091dc9e04ed5951757606437cb958d276874b5d3d8f3b59b30f2a99b1b993b580441eab07e46226cdcf97cacddfc7284c99212c1ff99d626a7c58e42158350651c084871ef92490168440c98161008e4e54c0ad540adf61992d596e827e5d34ddd966c895592c2b1090825bb0d43086d2e26e61b6e0fad16c07a0d4de48d4378d46ef8251c777431dd7510b94c2f76f0027f731b57a052054205efc33c1f970731485402635958ee4332a9e0b14748f05acee041ad10ae693a144ec99e6ac98c8a38c13dec05ad1a57f8fe24ec188791cc8e04930eac64430bbda2ff4929a636e98d60360d8e89c722388ff5622b1367713a821ae9c8132b1a90bfb975eae512fda657e2975ba28501cb3be8bf2113654f3aeed85501cf8271a8c8bc33d0f934041dc6f1bf49a28d0353eefb0cbb42c7f12900b4067886b9d5656a19002a32238fe62a13430b121635a1f1c68be6b1bc99871dc58732f1f8fa9e93e26cd485ac86512318527ef1e8dabb1a11d6dd3d3ed584002a56058f7c5ba9b13d561ac0a92bc2f379bc04da21bda8d09f8edec6eecf5e0e0808a9517bf8383b8ec391bb78d5ae17a14e7daf7ed34a899db89df37581ebdd5c1886a3e0f002654023fac06c06664a370d8c021ad4945293b14e7bb2688c366abf95fa33a96cf7a7f176798f07a6c68fba1f6b7eb94e15e8ebe006810888b31d88e060ec5763a87d1cac913db3d74d1f6f6d90e4ab82c8f2d609d82d0d579194dcf00d6f22e7cd0637c67990a4f0e19a5b14968aaeba879a765cab24221674f785cc77e8182dfa12efae2cb97176b743b6667fb37409ce1077bd61443b30d76899686179f2116444dbcf97197751d8db059d485a7532641b54818da9300e50da2d040a282d80427b4ef9a37f9d8ef3311091213dfdf97d1858335a66e6dc91e9fe8d440b5a7c721ce79089ed6c2a43d202fc53ead76fd093f06522b7fd4680c548b690910324b32015d009e70314bfa7781700ef00dd1de0526e91968f6b959ee38530a2fcc760868ae273e1d85172832f18dc0fcf01cc4b24ab48210c95b099f71f78da2b099dbdda4e32a9977d99008614680103c6f65bfd4410e222352e2d305ecc7c1a7a3904a3dbc3f7aa4ec451af238cdca20a3a16e68a8d7fb613bd7aa41e060848664ad318e80fd4fd618ff43f9187223016d8db6893daf040383631ff71a0c3dda69cd3c9b00a3419b4d7af7a253b5de0b56b79603d2db87f8483fca89c207d454603c6205896f89602389a326b2cc5b75ecddeb0bae00d86ee0a55257a9704043694fcd512b51cc6371d6ccc15cd804522af1775dbbda23158c4a1cd6493be325009a1458d6363faf2314100adc385e907c4caae7cf395fd2c739c59914274bd90d90d739143ee7aa2e8f99fe155135cf272387bd1b4b926dda65f5f07f40e54eba5ea9ad355f80d4a32a9098f7d9058c8b355f58f23e4261ddf3bdb5c7dde8033e513138db2e31aec61e58cf31e92953656ab9f0575cefe0a61bb4c72c492bf4fa17b6517ef2c0bfea624f587657f5b3217b053bd5a75a911e4e14f7e08507dcb64e85cdc9c7bb96f5c0f9a82ca0fc588a2168572bb9a1c98477b91bf82913499737f10a812c6b438c212cea3ca7e5e6880c8e78288bc8fa2900f6957c3017afa04afbf66697dbdba805d791f7b38f7632dc7ad68f8ba8d3c97dbb61db270dcb7b021378c9e5282c1173ce129354dae4090843fdb22c165187ec04cc524af01d6ed439edf436ca328868498fa3c4b2bfd1861cffb1e576241f41968caafe4255d56504b66e8be7ae458654e6df1987e3a2c81600fa948045f35e88cb412bff26d1dd39f9faa387c1ccca63c491060e485da692e47516ed40ec73817a82d2b6991e5eb944335ebacdd1827dca598be83823e580a97d80c904a544424ca8ef38a05e086befcdb1bd79b31fed5080f6a42ae245d750da708e64a2f52dce08ebce4e95cfaf8e90cc0bd9251cce40d14724744a99ec1f8cc7ca9459acf4fc388624a2faf77104ea76eb94618b77ee8eb4a4f654feeed068f16e719bf0da4db473443a7cb73207905ebfeb6e93a1bf77f4bcc179cf0b290dd2b1002c9b05b5b0f05df22b4416cd35086637305b685b2f5cd7a10c808a63cecd5e3acafa980f5164a39a692fd6c1defd894800848cf0b9f88bad05e7440674ad8a1805ee80413c286af0cc758b8e11bacab142730a002fd5e3f412985bee20267fcfc994bd606385cb8b134a9e8df5e013943d6be5523d7f974ca2f28c370ab2a1c37209f41b42d1a3c4eb1e026e2bee93aff89da52e503e9de8566fdc4a576951ef63b99940f7fcf94a45af7df5c254da75bea827b5ffadce9ad4c075e50c7b5a49c8f465c84f043e71c6a376ef6e10d4dd38c71590cf2ab47211eb57dfabbc435593c6b88d9731fbab0f56aafc11cb39da81b4b874b28ff2bb6e185deb3308b1e14bf560be31427a03f3f9ca456bc5b688add8436241b20af1fb5997bc5c85118101111b88da8d7ad8ca7d4c3636f3a75ec8c7bf7e287b582f9b1996d26fb8ea8d3402282067d0d5cada4a0f2981bd37412f9c13f497180cbc097aa52b476cef79bef988c8e38f0bf05a06c983d98c1fd3d759d67c70751b6e7d87818286adbb00caea45c8cbd7252d7bcc45f447bacaff1fe3ffe005a21ac84eb45516d07d0e7e80444ee1019583c4b622f27854c143969c2c42236d2be61590c664e02d1c9fd6f293092104bc7b9aca49a4564f3f717107ebf71c75001b1bc402bbb111cccd8b8cdf9527f8bff3e4194b3984781a370f80bf056c0653ae6988fd61f539a93d225110c6666a1a50d4862e8e328b87d3db48cd5b85c118de910957eb6968a4d74dade4880c5b476a4208fa4760402cfb15c89d965a48b8bcf450afbc57a0880ca3666535dcf0cc8e56298eb955cc37986c7f4cf931bf8ec7fee980d69fee4d07c8754aba81b239df5b546082a0d4d1e2841ff634e62e97bb254560f999b2ffe267e04b087863c9febb6cf497191e623424474a08c748f899a7613ed662150bd627fcb54a8a0fffeaecb9df2dcd7197b3ff234020a20e7519426b46e65b49b6340fe395b2338a3cbbdb24b620bc01581f9d3f60e876ba970073252c80bfd6b01c42c46867928b613b4488150038abe6c4e4525d435010b708ec86dd990ed96b0570322d74ba2b159f5465967cebf7d19b04cfa5775d9dd3b39eb8b6b2f456d628045594d3d04dab6b8966c5c09be00376d1bd628839f0a67c8467f55c310cc4fef21b70e6d42b295aa0985444a3dbaaafb4387cbad6c23b81bae12d16c485d7b0fdf149d6bc31846c006762dd24290db8199f16924b70c3534a6ed5b9edab324dbf40d720b6eb8c3e0cfe964bbb113685a679b5b20d05ca8c165a4c11ae919b4e34c0aa9b3ead49fdc87c8a0cc5051e26f8afcc422e9531c92cae1a9032e20f24b7375f2e6c790b8b3a4672bb1ffc59415dc330dc1dc93dc900ef043865495129396e022922570d38a7e013b9813ed8c4b900ad267295d22a72fd1747ff28ef5301c540e40a39f4a44bd67cf5f3d3b9fd9c4434f8b17a2acb9da0592b74f2072d589c9340182e5d6c57ec301d679a8b9f0e87207f1a26d75c7101c2b564ddf094757b73f767658d023a723abaf4d71197035c201af38280af8f3293cce438995e2ee44b928c37c6fbea69dcf464157f0ff5ce083eb733c9508c8b1bd1d71a0b3d79626250e598acb4f5be63250d7719156329031ccce51df5bd594feceb55f3afc7c20f19e5c39702a9696f0e52052a18e8add91a2f039dfc995b60a1c35ff4d68a1d33e4b2fb08c337714a4f6a05c7f582f470de12ec3c9dd18305bfc3caee3524a1156a3343bea431c59c1dad45ce50e7c9d689500ee36934989a9e3f9c4f834a5f8f1f2cacf864aa48f78449b2239a02494d6f45aa82d47bd84a3b8671810908c950a7c967cb1b578e2a0182ac162ae4cd9e31d20ccbc31807a9a6d2c53cde445463c353fb075fc925a340f35ae455636860dfeaa0edecca351bb27e976a02a63875d983ac2f944e26405b8f777a552e61b29805e68d6d73ffa9b159249728d92a9302937416214e28bc61b4f44beb4de36dd170435ad47805d61ab4f47540034c85cb306232ad9565ddc42056bdf6beb00983d64518cb4302a49f829bdcedcca28c276a3a45921ec51c7139eec0e8279179fc136ae4e44449cb5b55ebafb2f101d71bdee70b934891b8f45690e990b6de46ab5d2551a866e5ad5064e70523d9770655b20040df460ca8f726c038d08824e499055eb0f83bfc304493fdb24e0717220a582a415000011bfc0b31b1093141ce3aee35ca35aef4b63841f7bcea452f254e53693ad4a7cc8b25ec67811f926f7e265ef50d3e137dd9ef882da4f608e07bf21fe878bcd99c3e5fa956bdba6f96d6545baf8c570ad6042d69ac4873895eb394943b98278f4004bc3384944e1a186048be52ad8a23b5a1f3e816f32d9dd45321c9dc0e6d5bc15c1709206dfcd2f75070c2f0a05706db7d1ab42fe5f1cf22c43823f00a4589972692afc8dab41ac69e72c6ae3c29928585f2c867c03934d52e0423f33b7fce98226cc8f2cf7c3d659af235afd6e11d497e4ed676915626117869af5a078e3b2e9bc1a78bed18676f00e546e5cc489774a7639fb9fbf5a58e2faa11c33a6b156e5d85b356012d56e8591e15de2d836405cf2d3b385de9cc92d5ede2a2a231f0ae3fb661aadad4d613442bb6900f278f1c46538cd9f48fd2d4b65714f0e1156a2bf62cd15c66d6b910987a3d46872439c95204f748a1d3f57d11c775ba00c53f0f8ecf075633f1fdf163ad389e348acc65552a36c7e8239b0254d4d02a3ef59d57adf5c28c52e0b96aae0330ea463c13c0fb0f544e0607616cab2abbe8837e1dfb80dc0f7ffe2f324135fcda05a5cf3a2b0ea48be36d3a5c81604741c7ba884847dcdbc222d3f150f7e5089805ffbbb310985be1f29cdb886e2b4536a0d289c09951097abbc2534debbf6e17d6b7efd751a56f5c9e7ee265073ee6153d0c208de578918434be6dd863f283d8e89f455d14ff51b8c5fd4921424199146495cea33db1f581c935171567d2ddfabf4703a0b9fcc389d0371732737e9810ef0f200961166e3a877caa57b042f59dea8cff1804fd679fb199ea0d08d41af11ab87eb6d11910c7cb57350a4f161dbc8073ed9e98908c0558740e093faf930f90c83be0b4d4f156045086f9d0a18aeace656c4021259d338d67cd49d76e9bfeddb2245beb893cf0e879bd29966752a9e9f6a76effd843628285caf2a18401f5ed1b3d56f5b1f09fb19d765a70f061f7e8d44fbf09da7d6a2f29215348e89272801cedafe1e4def32e58175e057267a691b4bc560cccc203a8d01fa69c6b2995b97c9c0f436a3f458489798d05164fe11d2d1261cb43a1510d69328296287500979cfc4998eebb45e0614e76e30069ae45b664fc4c2b2d51a3923d0571338b6bab23aeb799ab34c3c16dfd97d1473398528ec282d31c8b6e0e78ab6f87a0fa619b72e948808a192fe2f777f0618ddca32ac62733746586ea3e5cc643d51f4b6311d5c8d301e41e8ae9c9698049a283e35e68feaf49bb7e3243b00dc85a9f39c66e616503ccec677902e55cf357c4fd661e4788d7ffe4e2bcd38f733f1625d6a4c6f1c7317256718ece6eceffe1b18e8538f7faf6dc3e9e8a0c5083a738797536aa14209f3758f70bc1e230a90c9724c285c028436b82083c1abfbced1884c013bba245c35a631dee20e5b6c4cec98280f81afbae00358ccab36c1fd518c955afee7da688a0c4ac7b237396ab207d713df24524bf4533ed74c3382cc9ab1c84624705a7b718fa26ebe916ea87fd71829638640efaf868f7991cdd0cb5b19a0ed53c9145ebe0dead03442d292b72af4aee29fa7a6a303218cafcbe9f54142afe5e274c2bc1f3d8d1c28dbc4e8b5e8821bd7e4cbaa2172932b9b5417d501bd3f69dba9856cd12cfd35ef8aeb0a6bc125a371ce69ba671cb1df435116a44ce51a71d0460f27439ff9dc55c925272d7984393af4c7549cf409306d70cf35cb37a4db5219d32ca520b9282ac8285c569a2c003a7922142573a04c7665e1438206817b1906fb6de0e4ed9f0e2bb5e89e58d862dbafb92f84dd048ef1d3c5efee3961c5e05f0220cfdaee0b200a218c9064df1bbf5b26336981766f57aa68a577772e88a31326c7207498c9fe68b4f2f3a059d049e57aea52f175b15280102524c8b2744a90c9570361e1ddedc4b63f38c6bdbaec009595650d2156c222c53dedf65e8bc8427988be6bd0d0c28eadb46f4bbc8e4d827cb0d62228b63884221137deee83c0e37f23065e746cc367ce66d0d1a89e8d375c175009ec34983a5c65e138838211a935a75b6fbf99deab4a24c2c7b73296ab68fe7e94b38149678a3c4dce322be61bd10b9086c553adb3363a5b045ea349b0e997a7ff0767815769ab04a447de6f4641ce662e90d34e73a6a12ca017537e2db39a897a73418c5b288d378d4f70b11d4fc4e6b27b1d8411a6079715f9e35417965ff41a9abf67b3365ec122c9292c6d43de5bf647c909598cabcacd20d6dca4e8b98007e8ba3b88b5431f6c42bb9cefb626bf832a8da580ea4dd9fc862076d69614a19860560ab4088e80b648d021c2accbaeecb4a6e9ea159d0c4a864458ef4b48c454596d7604ff9e83815452d75c5109408b02694e6b0fc32e67ac881f0f097c00d95e1f450d8a329fa7a5d963f8640bf92f1fcf903210d8f59ad801d74eef83ad03419e68809adac4f4259523cbb44c8d8e764545d42242dcb69902c965321c53647d36a3e803367bb6abdda62fcc01531e99062cf91a95a89870c31d9d89e24002690a864c6cb6b92febb43d4a7c7398587f085e36ef3fe7df5bd0453e0536aa3222c4f1da42809134e3adaa98348f4fcfa2b7b59703f5e37e30e959329aaa32c5942a10bf7cf364f5287e2ce1680c1e0b636960cabcf762137b5c9e63d03217500019955dab15bb91ac3b6bd6a4e2f45463dff96785840fcb6ba30f96f95d5e20d6260b7bbb73fbcb87afb5e9eae44dac4e6115c34aaaa3d541252ca3916494188c2ba457c0d92284bb23ec55556af64ca4979d26b2bdca15abfdea591fc58d1349fcdc470e2d42bb8c55c2dcef0f74664d641e1ab2945f4b822550b5e77225b16f481e98e96ae264f5ad6b0e6fd4fc34c345a24f927430337a80aa4e0430b67d7c5211c31f5b181a7bff41618bb0388898d54964c05cde26039afa43a7b66f33119147a20c648424096e4a791c1026372c3f0c7fda761c937152f2677de25f93ab9662ad02559577075c17ee854b450cbba47a56fc3c6459c3c09a56a03e40bb3e4ed4d61a6dc9ca6068e3106db2b63d0ff8adb71fd3f81370a7b393711e525e3025b86f021d0839fc55c15bc795ac0c381f7416ff3da9fa5df9e7abc197331e48ec3616a04495f663408a3798f77bfe3249982aba9c34aaf09686af98b302006ef0fa2d0fe10d5c28c49c7787a89a9170400e82f61b39bc214cfb5548d4c1dcb6091447483550e800c3e45b7c98ffb8577da6c4fc05a60d8417b6aedb5fb958decab6ed0f16f0b54815d98d6078f8f1a955bddbaffa1c503a50ce3f03f5062e9d0133840e7bc31abae22d9a27782b71b00251317c0806370a73f849b19990195eaf1e83e0684662c8a264fa3166aa423766c9d64e3b9d795648a97d93d8c28c54bad12eacccc90cf02801c2b83425742f256add64ea0c077219fd9b79ab0e67763cda3ecf2ab15684ce999fa4b738121dab02dd1bc9ea5766aa3401e0cbb2e10793904b83a18765d20f272087075306c2ef7ab09fac515921b7f2aa2db31235aff68b5b6ed5dd733d0dbe613903be537ef67e5ffc4e4831558bea612a096ae637bfef4377d6004e156f169465360e3e8da9cf2e84fef6c7d21fe94cddae5335fda739531adf4915e13492386defa3c3cf980f554d4f63d81b276831aa47026d74c3a8a2d47181a134183c8c7ef82a199a9eafdd55c25e26f4cded134c7ef413686a80ff066ede0e1f0d4d96eb61e1e79fadc6d2905bb766a0f7c8748b989c315eae84afa4dd671b0a4dee3627fa3567bb66196a9ff80121ac8a8dad9047d09a7185367c43a2cbf2b9551a5f06c76a94b9ea957a7f365966612cdb756e2f005b096c9312bc66e84a746bd0c107c49206b36deffaba099f5f20e5c189e9323c8afb46e4bb8f59ffa41049dc35be083c4ee709271f1e725b93dc93daa62a3bc0f2a3340bf23d81f578d0042bff0eb62592c1075b59f4fa573e67cfbe93ea91f726b8b71b4f54943ee665e3782f2a4b2a81b52c756cda02a35c88ac3576544a38c8962592053b54634c185fab11e161de95d3abc15e4e71e233d7b3f979347a1c17aa0b47b9eb3577b2b395ee22b142e8f544df8bd7e7134a4a5c029c4d7a68ef659504015ad570cc2a192fc89031a58538f464c8885e3520ff557013975fa837374645195755e6fb0217c9ec0764e17cfe00616aa4b8f1c156fa87b44c59254e961303568c084503f2ffc86afbd756c7d72c35f1fb41ee9a2914945dc56c3bd8c7a3de718bd8eb8bbfad443e44fa773a8a7350ae2643746d9c7f4f5d94b224ab94dd522e1c228f0845d6aa96874040f62c0b4b5aca23edef5cc3fcda625a04d2b48311f6b9541c5100b6c72fde003f125f3904955ad7e261b7625d86ca30b7603c40cc40179c0e9a8deac1e00312d4d1c0a3e1a3b5bf21c8bd4065bcb270a355bf4b2ea902ae77510ba7ae8e84e5f0d3c33ba47a3f10d903eb8eac201fdb15ae1d25dc03a2b3dea61d70b70ffd5db4eacb1756a48cc2e9274c71e8d3a520e1ea0c0e730254bb187146c1b87b64d529f121458ea912e8e39f69e06899656e0ee7d300b4b363d48d72dd0c566cfaf54dd7b20203704981f1e7984bd44e15ebd671bd71b1ca1bbc1a7abea545e4b3b99405742e61aeb59888ea0cadf3cec6b944e20995f2c9c88df94f28406ae3431063f0728bda8be3941160592c0923c45343cdd9cced9adbb88953c61c590598063aec0e12a04bfa5d68c7b6fbc4a7052c3a1de54de6a53a39fc9f397b2fd52b0e9870837fabaa228768d87a0e9c4588cf2d0924483f282338edd5f234dc3c2a713d1759834c8bb5dacc3ac60e292da85be22361462e980cc37818be181dcac7e77d854bf85266a8d1b5b04f4e12dac5c40e0cdb81e4a7f6d5181f54b35502f87504586e63ca0cb24f81ede3d16b39237b8db9b0d9f47f4f932ad2100bb2345a266cb48d72855878847d7b5bf755fad5266f3238dd7e474b896e34c592a11326d6511aa42da72f7f1069647a2fc18491e4d8bf904c51ed835233ac7bca52aa4891ac07ae4b1429da56d4d1f5485b6a952ce654fb9b655a332bafd7f451d77cf0c6d861d11af3aad51054d7b2b2aab173a266e27caefbc46b680a92c17dcc1024c66b8d2b954cada7807c50a7fb4c60e0976d4bfcfab5da492b569e26aa8d8adc916e2feb58fdad565a5414bcba7d6cc466a9b1e404da28052aeac8ac0ec59d3cbfcbd864adf51e39bf774a46c20741b81d0b949a09ad4c6c0f581403594b5778e98ace2aae2085382ef7e0ad0156d32c3724e984547ad823735ab144cae5140c5b83e941972d5e2c750285e81eb5f33735c14290a7e878ce99f8f36f2aaae12c3be1c86d19866fdd871b2ec676a86c9d56435ac55737b9c14c94159d691aa42ed821b24435ca1a4f3427765e006f300c55b8829a574d5b98ba47fb3e809eacca20a462d944cc739b844ec2ea4ca6ab4bc15ee56ebefbc35d61912250a51b8ca1d791f131a7a47a6e5e32dd3fc09e349a41c40221cd63f282c0478ab6dc3ce04afa8caf39ff153030dce4f3f638ea122a646608de6e76526b06a9b4e901887aaef3c0eb2e1ae00ff6c83aca654c0ddfd6d7fa3320b44657da71b298dcc4715f97298b7383399068d574d2353539d267b41adb99b50374a96a8bf8419a0ca211ce2946ad7863afce52543b7e1767fb0f19ac7e4684b721a43aa2164a6d869f2b4e6f7672f3986f46abffe57b507d7d4066cd58cc7797368a9dadc487cc3ffc4f653c67006418618fca89f489a80e774886ded87ae379b7954037330923c86f23e784020d83c5f1777721de4135fb1b346a9f662c8aa4f4e5f085fff5e66c56742ef7f8fe47beef93d93e4c78f73a741a84a5f5ed4a22005012c1d16b0aa03c37cfafbe2499e42f5e54b661976d656b07ffefd24327dbd20d3b057889ce5d93883e126bc211226492a10918900781c1105afbdeae3ed856dbcd6d0fb36555552f5a337196c09ee6b6d60f1fa7a573574b90e3b9ff2231c4add373b91cd2c8f086ace7522ae854cd9f5f832c4446e724ab58e46e968c1634c4473709577705a39e794c17a0911f4b4bba871fc697181212ba40c36241a15d6a3007636ef0bc8d7b9a910d39db0e278cc367f9bbda059fea4d5ea681a8b5fe09017e9d976ae1e27c8898303f2321c69fd8c31019b154d48b84d23249d3c30dce052fb17dfb9504b93d9c3e0e1727f5616454825d469170ecc3f483e8bf49cd9448c2d60dcaf30a24124536b026213201f41b699381bc60137c12f93e043e365e0bc953c0e81417602ee1534579b76eab8bac794f91cd44e05e27045a81059315514b42cb485cd460e1af5f783824e24eec57ccacdfad7c1e25ac747992ce1609de63df0f107921c77cf872ec37beaf32a1a95dcb5bcec0469a5406a59059e3e62b4bfc65c801c56ddcffae6920d6bc98b17acdbdc7cbe0f6b4734742286b510789db649b97b39da21c0da1ed05bece22dfdbfa464462c7aa501a3d769c9a1ce370068204ca648f679a2470daf17a7be1c526c6a155a33ac6dc4becdff8ae2c6e23e09c15a565a3fac8b78fb00f2cd759066f343734878f5ce199cb6720d41ab937221487f6d0c4980aad66b0f16e817a3bddc44644c3107e706232dec99ff13ba78a9523807ecb5157ded4c7645e8cd8e3e04362295626cc4b18914bb444aec2539d0a348a5e6a0e83a3918e5d6edebb0a8f2e766ddeb9327a9b120675aa9160673e5eab28af6d75023f437ad1de489db68684cf8384fcb19ba1f3595e449a6ab52d25df8eae7ff63354a84101217e6a77967028b710c88f3af700b0239326d590a2b31cc8f382f59a9930e110ffda37d0cde248a9f74f2e9bde6c7222841f7149db0a0f81250e7a6837938657f6c7ee3d9bea4dcdf65fbc71b1f9b5f708b5112db5b6203d52601e5cf6527f5cb261facedf7a8de4ca10e2b3a17373b85321394d8bb53fb5905ac6a7c966980e2465d145c86a20ac665b225f180bc2889ce1539c64519e9c3398709b11988f6fcc84982dea63a74335cc4cc11dd0c086aebd5a96f2c97955d07ecea998c3fb5739a58702de78c3ec1478e926bbab943077eccc2a861bbfc582aa70cfc8e4bddbe023701075e3aa4bba7c389745239e9ea9a121f8fb1e93be9b2640ed8482ece11f78b92f533701120a025311aa45523ac50769505f67f0860c48ed57aec90ad8e6e148fda68f78288cc993a66b83305ce24c0c9247b05b16f2a5ce82306a8741f733fcf21f4f95087873fca4477fbe283704d614451133956934a674b3b57dce5fd8d7bad791b1accdd395ded54592b185f32871919e3c8a8292c6d0eeeedb4b4e9352ed07d42ecade8e33d16742073916a0aeb04c15b1cad5e2ccbfc536ef51fa98452afa07d1a659f9721b263fa16bcc45f185c33cf7eb420bcd92d286374e99a9a4c5bbac0e210c72bc5a46bd5cb0fc6516833c43bafe0e557d7544dc7962acdcc92567b4c3761bb868ba3b4649464d6e195766f793189469958b9a0f017963ebdd273c715afe4040fbe8756fa25b08d5e4abf0ab8588e419f751252d32f2207e87fa495a2c99b9525b69caacee231816e8031fd021f57dbaa846b431cab00e9a1f2e4ebfcb8b8affd40ce578d3de05caf396cccdd74de459cc9625556ff00e9f8b86d7bec399b807d633043c2ac42720ff7fe904de282607470c3d21e8cc56a7a49e4b45339414e9d98ed3816a69863c4ab787a9b04177163f911041a0fc5904b1b983ec2318b51ed1ad0280627ef041e0b2d3285c1674dc7e5fe0957d609798124c1a905a90fee738bc3fb646094cbf1159fc9198ddc4ec504359fe161aef289d2b472aacbf865f55dc4fae30a40ea5398fda38e9a7a30856c8303c4545b5dd847a36d420f7ceae9d6f448173af168859bbccac8d0fd3ac6f73cde47624d654557af457071296da97df1f0c8a42b2d4e4373df91a79ec1394a911c184d850cab75742523f654607767e68e0d9c1eaa14605341c1a86129a440b71db7da70a3815f1cd7977300e62c6a908161a89b3607c0674f613831267a00cb9ef6c4b130b143e072edb72a305220e8ff013fe5d0ae5c0c997eaccf1f96cf7e64ecac47d98c7940a183406690336ed9e1ac41a290cbdddc06f8d8b75addf664fc003b1c80b9c4e86d2dcfdc1eede855a97c6d5660e92b5436059fd61da03fa224266a8973713bf77296f2fddffc07c19d876695ef695eadc9d771c4daea77eadb8a5ee78c4c547a816a382ffba6c33a2051109f40cdfa62211a37610dd8711cd7861ac5f85822233970a5953c6aa5a17071b396ed51bfe52f432a434f839ebe18ff35a66e12a16ba6b7d109bbd3205883e031f7404278b7f47d012425c64db7d63ae37de0c6432988c58af026da0f92b19cabb862430990fbc7fe78d2a7294801abfbcc6c3b10a557e18fce1ab31b682f4499567c45252050933eb71178266d8e410c8208769b47792e677dbf50003ed078253ba926248d57418ecc2b09000c24dc1d126703d4d6ebb4d504fda00df12c1b53588f51f2850bfc34c1d98b26f845119cab6e64251acc6d15df701051f8df0bbb4ff2e87ea20daf3770abc15e5bbeefbea913bd149b52e8f680f9fb0692c7f03e09e9371b75ef5485455db5bb63d1b6249b15e0564fbcaaa8c808b50a0d33a064a0148b34c59e1fed64b16df555547bf54d7755287ba1328d3593892e05932c5c228c55261c335e00d4a03c19faf77352f7bd251ff02803b6c70da878553482818fde43e4f6cbe0bf637814236cb8b15980c8a6e8cdd3a42f0ac67a48cc22bd871589475d4a87a057e552b320a7da32e6c9e0b833bd67afa3619194b654588d0b9dd47c16d38932c373f48314606f8dd065061c7b973f034863ad295b978bc716d59fe6bc979cb7fb2b6ecb85d64f80e6746d4b5eb6333151e6fcfe295409e3a87e6b52fe5ac0674cbec637c70793fb191134cc62de5673f48237222dd3949458b6bf4831c06580a25bd0ba2e60991932bdf49c2d63bee4cc02a48c72f5fbfa2230a4569307fdb72742709d8bb2bb93a2d19b47862dbf9a3090e8c68fe260aff96f1000021940790adbfa9851e52a6c847e0f0f508a5199806178635c91d5a20a753c5ae6901912a17c34b30dbea52696d11cc6a4b678715dda8f1bdab08f557a6678ad4d61b8029c981256665d5ddd11479da370288e655b74c01e16047702856540f7db6116a816b818b0f4c99d1e5ce147d24362c689e95bf77673400431030e77e8751632e31605f047e26f07a8cdf3e0737d4a6fb08d9aeb4793391f8e0e1404545c380f87da6b2a522f4d0a318dcca6463fe8b1f171950d285a35eaeef0404ee829efdccce83cb975ccf224fb4fe534f980dba21e95b46653bb2088da940f84e57ba79accafddc2ffb84eccec30f57caaf378ad45a5e6fe64c14899a206a31021b06aeb9d9cab4ac710c596e73aab554dfb0fad77bbdcbe45ad1a77a4bdf76baaa8c162bbec8d488bc06c4c36b83d37b503a51df962be4cc96515d94cf18569a908425a7e07d228a4f00cb82a489ba351c457bdf2e9b5644fb4a6ea5de59753c7d5388550f8876f0afc804a1ac6509aec4d41fd4fa5065bd654697d3acd572e66f57ebb933050595a8349c3f2bfe3ae109af5a20b3b8794b16b8137ad65aafe4e56fd8b6e8b83ccda49a58ce419d0004505c076918a79381b6b8185dec172255e81e52367ea35ea0384f581e89074d815f461429d0339fd87a1783dd9927510c40a038aa95b465663ef7503d158a984c4293d7209fc0e184a04ddcbf52b21a003dbfa8a7cf1a346c4f503a01023ca7ebc3c2eea2d6d27c0904154cb833632a7b8ab722644a3b4e754587aca1cc96448736d92f45d54e443102376fc731f9adc24d31a5b7c31c44c18f17bccf6d550b2d5eab3170a01a4d3a728427eb5c50d1a3b04eab7c45404d9a2a90bdec23ec6ac14637398bce55b4f507c43d607a1129a3dd61605769fe149dbe8537edc3f9c26f1826da5760e32de974821c8aadfef10be205eb8098b03bc9052b68af15b5bfb561bda2befb82ccc59e6f46703761301098060ee7eb8ac145847b813bb9b3ccd1a40515f73d54def98c4e7e091751ceac7d46798c4184138e96665640aab41a054f2a05059840ee276e5f7d28d039aed1a5af65bebc393abba3e71eaa7333ec64cfe696cfc4cef63a8cf8dd1e9a40931487a3679fdbc927cf9dccab2197710b4e3af5aeac49a8bb71eb078a56c275a2ae8f83591eed8a553c228fca111ca25d0f662ca8e543d943f575e87ff82e739726c32b8876387e033bcb8ac2efe99d9bcfdf3882dd825f68fa506c5976be0696ca42bd620e1749e703638ba2128bb3c0628bacf272250956a2993f03f02f8e4c0fa1db74794b4964d8c36fc5e46353a39037bc6dcd8e888544f24201a58a4c653e0eb91cc66919c84687de4e94aa73f76aa6bd8e5a028ab252df5c2a545712893dfe79df4c51c9b67c5a16bcfc314399e2ccbec54044178547627ddedf3aca5305db66b22991ea4c2b7a782b041d519873814f276be86a4a08cd1bda6a67d8d6e722d2472b152a6dc37ddf95cb1dbd00c86d842d60466bcfaa99132454a64cd77e68133f1d198b6e633ffbb2aadb4954e4a38b436d9504c45d175146352a3d54055aa4ec3a537c127dfb7241b92387289aad75b771bdc57a238e5b5e452e2c96caef91b5dfc4dde6a39e1cdfbe51845f8d3392070f8b0b80f99263ffe62b0e03241347547ab0409de15f443b8eb0ebfe5fea6ea4db822c1c5db0f1528351ff825c269608830bc79c49c4d5045f0bc954367620f7bcad87cc6e40e07c2df61ead45c18921abde16cbb12de6ca55b24e66aa57597a5954e59baeb6a3a820c8ec65275cda591e4a0b147145814f198301ac2970c957ecf0ce5a1b72478b574589c3b1122d8729d523f2c0a0c3c68850c82a5e30a0575b6a841525c81573cf6b9b20d35115b99f6bc428cf74a2c188794b6d50eac749187cd9efa5e88e737e6790a3551ad87132257b39a574b3f315c7c389b57268808d60395232e6708018f5101e5338eae6c979dce01a09c9ff125fb3017f296214bb843e74a6fb37192b07d9fadaf0ec568ad6225c1349541917acbd88d5497b824e2cc50dd52fd11460d00d14f996e95f5de0957e138448d5879202bc559225e48e3039ab8aea815dc59a5c1bbbf8ff2a17419e1199033549e24beaf0a33a6d2f225019972d3e0ee5d453ab1d0d90ed86ef560605a7261c0aabfc483c86b28ca900fcb8518d7070e66c215b70efc3f26ea903ac8d3c62b5dcd139c9eac7b8272991bc8e4af985955f544853d958b9e2048e0928b119dfa587c1dc6c27ee13ad5fe3c3e2b5016acca6224980368c9e76fb1367f68fcc518e4eae650c608ae757d14ae808ec396bb4bbb4f06d5a56b324bd8b87266424026992b6071dc13ceccedb52d84cca365051ea5e4e80b63db151cf8f12484991bb818b28f97b2f9a100c19c5c883d0da74e2ca6b8d271634f094d380687ba6dc18798d569bfe15de130e217fa241ebe2c6d7c0d3b5e02510ae9818ac83fc0bec43af15cbfc4ebe621524a7fb8173c6fa1bbf639f0e0d81f043551e5760088d03e77c733007862aa37226ae9f4f8190f9f5ff1208955169d237238c270db23d5646c10d8ddc6aeaf4f944428e27a0a3cc3062ba6f9b8b5390029d5917e88dd755842509a65c978893104a23e9b6848323f06b882ebfbf36fb50f99ce4dc30ef417d6dc08f138c68d9007513624d145047e8764e9428630c0453f0a5bc02e4b59bdcb20d3458e12fd6d4490d14192e52faa7f3e86d01ca95919bb08b54bc4f1d724c26084966e3fb74ff40c52266d19b31aed9e91a7318552754986ba335144722b45cd0aeb01ad28ef246506758de40b15cac79d4af02a0e46e0ae05a3cb7d68643d607b1f0a8ae2f01f5876099ce3abd7abbfbd468fcc61032cc4cc68bb65e2c5e010c28f56b0e525d6d59c1db24468d0da57c109b46898dc03a2431cf2235138551052a0204534868d43a21d99802b214f680a58ca10d56b1c7a042d20fc45a8f3ce8b9217874e8883b7dd76d28d0f8a1cae45065fc23de40af6c6090f1db4b165e87834b77f03b7220cd51a8a56a337e4f6196d05721b3b28e96ad061ad951df311378daf0aa1e52a4572a43300d520829443bcf2c79f968bb15c8611a7180797b142ad322bed82ce0bb0f3a50282ad2957e6fe3f4232ccaf62ea4b761f3f15d9d06bb9455d4f0f50a741193a85f8d8a01bc7f3fca773b3fb283f54091bf44117e270992d1201a9c7d6b8a75941bdb088b679a87f280190b29a88453e25aca14b034876ce3329b2363b43699dcaa4efc2387780c038d01cf89f13339793a2ce9424a3c938697d982f8cd8eb2ed15a912ec8c3cd4b09b8f42498b9069f24f85e6e7808f9115063a61dfc5edd4bef429055ec89ad435ae4915c8049ccc5bc6606d2b20b0880147f5f118f7df9879c023949bba7ea39b70454a5672830c94bd0c056da035703d990f25fe8b98c535ea30bc7089887377e09cd0622caf4d72b0c3e724d09c48523a4bbb18434d759a0d5f419a092c90ff53d1e8d204b373255d59e6cec6bf7a5272644330b91202958ee144ad6f8f8a233dc1c8a3da6af0613c3421117f69a6a24da6fc1460feab0a65b14d55fc20d6a7165f2c3c369de9951db216ba5983a273105915bfbe9154bdb995308f56291dcf61748cbdd5cc003202d72ef45a6e0ccc660a586aa669a54da36c85df013c4bfacc8de52057574386bfdd7c4de78db3c97ae30bd06d2eab4a8b1abbb2366c0bfa6807d4a84b92f6b8e115247028c1e60e3896b9d23f3b7356e8cc76033c0132d1e1e5029831f850298bbc154bccd6e771bf1a59584d86f3622ec0ca5e877431b381c39d2651105cdcc665d4d7d78b3533de4b28d4ecf43b533d505a0be4dc1b82879070bf6042393c7f191aa6f2139c145319a2f062eb1a20d40a04d886666bdd115f301b72929563a4a8e29951cc350d6a318b9b950b62c53831a219abf296f9c046ff135edab6fa07d00cce97effdb1801903d07de6e405abcacd8b3e609b83b402aeeef5f18b0282f1b2080bc228dd0f525d99a6335511033238f8836bc2509f5ced1110fb2225723dca8b8e098363f1a1951a99d78a0b8b6cfa4ea0c8df2c0181b297448f14eb1c1e05c509e47d71d3eca11628f1a8b87b15cd387bf4de91a5d9637855c185f74a4e89b5fc25fab510d4cfb110fd4ed04981605c574cc9326428d76478a25eaf7beb6130d508ecdb48b4827049f4395939291571296ed8ae1d45b1c65ea3d56efa381a99b71eceb41a1b97c7534839fdc521cdd6777553eaa606e93236ea0903915171d5371a8da066aecdcd6cc9c4fd8672124b20bf2acf9d0722b92080fd793ae52a8c0844c65ec028616a08d80bff04b9edc84f97f4ed3936cf12fd6f528eebf9ace507c90a8581e675f0565415f1505dec63849fe42af185ecdd3967536bddd3517ad051d9492c96946164095b223e34cbe5e8239305754150be15821622f931ef7a423c6f0917ef39ce97a7328069a529a2b55dc3f1bd84fd674d95421dadce75742e4f47a70b69389f4b8b8619e58ab7cd040b69f656cfee30ddbb40506c8ca3b50ca87ff44838919f4353e4aba81e87da4d69e878f90a126ce883691106ce5386b8d2476991b9b7278c1640a25b68202b4092b995d58fc6b3a6168b21009e34653e639529cc0e4a426804b7c10af05efc8ac3d972541edaa9be5cdd92dc9620bf459ab65d867057137044b3262f7fa9d29482473869040a7282e1b7ba509648177ec46dcb38093997b60589e53c7fe282de1d2fc989ea69efdfd0be0d0eb44811a8528e3f242e500ea4881cc1a10ecd0387ea54da65bb8a094379402b90b2c48e0c89ddf75e3481e71d41a32310e69deade6f398bf1f5ddd8064ac9e548db25b1152b990a10a13a74ab0edab092f44a8b9ab1d83d5eca2412703be52b4690f0d3ff7136870047d26720318a0b9a3752ca7cf6b64c6550f7cb55ac05d681620d0d4d9642de016baed69dd2647468ae22c4b03f88975ee41fda11050b1a1640461c3b367febb5169913b191b81317d17f285290021ee5312d81e6ca5ebc7a313f1960f47845bd40fe4d159c3728cab2a39885455ae39abb4e833a563e508e9bb5cf6670ee99ddbe6daf4d8781d0d181700c96e5941bbcf9c56d5a1a0508231c47900362c9e6bbae930aab18a09078df1a93ecc30a922c10097b61e21be122c42d1def0158033eaccc0b442b7255191b8f1b510137778276214af994aef1323a35e7a056069b75a1ba6113b99c71413f091a45b00528106a30ae642639e204fc0515876f33d60e03505165377b030c51bae31b93444d65374bcdccf523a6d8a36144c02fbdf4130cb93113be4c8a69afa209e5c35b65c811fb4a54f820f3488aae360cb5a2bc803c200547c666ee37c616343fefca2fc6991418f6ba5c1776b0979eced536531e4f555a4298f4a8099a05d080789d81150f3c2696bef82afa0d1307e8b153b180334e62c5c1fdd3142d7594a963e9b1f08edb1dba950e599bd2940bc62b66fa5a125c143e038bf6bdfb3147f3c8679ef35645ee3f7a3dcd1de0da0aa1f3c42921882639b5274e9fd010fdc386a92297b9dec59be23b9112c34d10291393149702c80aa3377b92df1c28ccb6b7792ffe73c39bfc6b4199cd4a68936856186f707e33d55350e2489fb451b2d933cb314224325a28a810132214f88eb03246336975e5fa2cc4b54ab275093169075658b190ea5892bcd315d4b79513265d727e6ed8d013bd5d2f752a7d3d3112441e3f794884a4fe460e2d1b60d5d89d474db6f8aeb239a99922b00ae9460139e9faeb1c9cb9969b6fb456898d6faa3af2262f4525866c6a861a51cae84a185e296ff2c9aa903c19a70c39838dc40d2bc5f1ca3d5c76feb2035a1ffdea7457e3ec2c9c2a4358e8f114ac1f0b43e9098337fbcd1ad1b16642fcfd381729d1c619c6bbb7c842c1bdefaa93171997ee226a4bbc0c0653c1fabac7fae7170f5a469b7b847d074c2bb9e387afa89c2271ac803bf8860bf57fb33d254f3ba9657f4b63c78c65e27455069badcb0fed38da34cc78040455753232e5ec6aca1fe267518d8d609d15efee41816a84f1adca5f648155ba781b3d9ac94ae374e1da18841e40514444e22a2594f43b5914ff4688df993b7e34468345c83a7bf9da4ccf88c7ef1eb01ddc28e157cde2c07a26be6ece3e5470c37d15df1150b384203d0cccaf041d70848a336aec1988d3154797c82524ca78999263c4810c85995747da77827296cdff1f8d0e9eecb0f5de3820bbb95cb77d10318f2bff0108013151e3e65dfd3a32fcc73694fbf1f63b28308103a9af1ad785432cc7463a6807c60c4eed7fbf1790d83c3532c6b0ff321afba5411366c8d7a1b4e66e5b874ff4888447fe6c482f874f7c81a1e073dd3823c559cb5133671bc50cef03613d631d427fc87ce6114b31d7701b9d7623782c0b22b0963689cb0d62acffad356328d1e8ec9cb179dde2e09d13711749ba15da8b2542918a0d8f348025d3594414395e2c2bccce4812241720fc1a98e4cb475031c7c8d4cce6778193b03c09798076b3fe0d032677414ba3be43c768e19aa7284d765fa8c9e3d0a20b848f8308624c368276c08eedb78125a8f27ae484d7e2ac2641ad00226cce1e9f81aef9a8c90df8213966c635b6b27394ec4c1341d6f398c9fd1d84f0eedc528e0b1f0c201bed4a8f0b4d0b5b102826110a59b50949da9b37e48168aa15d3f818da50eed7be95aeeeb44963f7f3cda983eda2528bbbb59c05f3cfa00748e4b6111652eca0e37e17b7c744458b8a0eb32b4026ebaac30d5bc4a8fe89bab7db8cdae07bb68bc0db55538d99b302e469aa4fc7bf459290364e107581bcd59b50213a3394bdd3b8bc49d0bf8a0259a4e0932a04f6b07c1789907295a73d2959f4bd4034986225ecba814c566b48e303c9aa80580c453df168ce3125e0da483f7b3bddf4993062be0fb324bf42a482bab81d46eed9d1f474fc55fc060870da90a91a8ceb8dc912f0bead48d255b5e0b5cadc3449c58c5064c4879c18e52e524dbf32817809056863f02bce528a6acd98ccae66860277676035348a2c30c03667a48cc512f60999905800c6e5f5b39b286910010a20483782266fed8c7cee346cccef0615f76e6a60f5034135bd8c2077d7945ce867be9a78e87a580d14ac2400d3818898d00ad2a3ceb381f0ca148cf4cc35bdf8335c1c0d39e38aa6460f7cf14cc4da7f799588ef8273f3f0517d2849456edbfc5fc7ca8088c94605132013c0875abd232b3fa736c1552d8fe7b24e948ac279003eacbc2bb40901ef597306cfc206dc8de6ac9ca6839635a91fd78c5d29779455b78a7c3ebdb6fcdd0c23efc6bcc2050ff0742c4c43a68923dccaf01427010d8e53d883540002bb44b31d3e41c5d5b424339e856b47cfe20141f82c31bf3113bb21f10fcff693d285737cb568116848886b205929f73c8dc0dd9db689a67a50d8ae31e02b05cae16976c82360185041c05c254b43f84b0607468ccf9cb0d40bf56a7d973688450ba7fcd62091b6cc9fcff8acb7a602e4f7eae275b406b615d01971183af25c9ee7e835a454fba8a97ec9fe7ee6fcd17c3421a848ec1c05202ebb39dd1ea329b88a4bb4dfc65a155567b9ac43f20a1ff1023a0b5366a5869022d6766e31f5cec2a72dabf14dae425d6c49974d81ac710d095599780b5a6e06289c0596206e8d919152db077dbab34ae467368176e506ffcd0f66381e963d49b10d1c4208c60e1b54956f4811e789827cd08a8863b8344c11c0e42b42b179d7741ef0e37f9a717dedb72943c883fc8e0a5ed8cec6aae81c47026a0a34f1bf6571e2da7dea1fe1a655d64a0b510ca2f6e7e768ce9d128d5438358d1f962082af62b76a10470fa39198699d48d1e148d31d0f2f3db057625623debf3d270e3b9397f459682c2144f881a854698b75ac0836c43f664348c427d2a24104c6269e775e55dbe762becec8eb0f61d1d32d0c5243ff1f7d6109b55632445257c4644c711021db11d60d877860950ff4f88b6ed04e561de63fc46d772ef712d316c21300449e72f085a857ce88d4b21f8c8fa17fb7c82116a612e77a86c99e27a1ee4de2374d0e4abd6d3caf1911b2780330bbaba8696803309fff11bbaa0ab6b6809f898fc7d7e4940a71f61d48ac626f3556452a8e22e642900e7bb1378feb888f34d8d5dacfc15ba09bfa03ae0d8ef127277f94b47d7e3101a6dd0d30867b8d35729ae16b113c4dfc6ef12e0aa45870bfd87dee2c0df9d72134196a2ef4bc5cd067637eff18c95be1b41abfea52e41349a9973026dbd9d96b2bb178336c6838929a1b6cbaa96074428f9ee8feb955ce2822ed74b633aabbfcca7092988cf991b50035dd650928ab5fcb5d3d33fc3691116a082966b36bc305e1aaa78f236d1720dc6633414c1cd20d15e0a1a56ea51bd31a6178a4b43375892c42a9bcc84529f1eaf98a08ccb8c7e4407d2fcb93eb57e15a593b5e5b9667d1836e190197addcdb72bc93c42b3b4aef331d30cd1cb87be0df1e11f7a92fef50257e835b0ec4ab3887187ee782153c4e7bdff32472f1f158dbbef7a418de170e3374eb1f5840df4c649f112489261a835d1fe70a4c2778e93c2bd78b3763398222e8941d14f745824b671cb0a6b036db94535e17b5f08dcc45b0f80e8fd419416362fccef381435615832cf70f3c2c05778dc19e6d7fcedd8b483140b10138b641189c1763f5d391ae2171435942ca77bb6f2a3dd57711686c4e7a4bb3131ead6eac4b39106cf6e7b952f0cdec82f7ee622241d8db32188a3b8042a8b464a45d33631ce89caa9282eb2824b930673aecc39ac8f0e8dacdee2c43b5c276c7e20719a55b85e2879a75247a9a03532a6722699657684461e76a16da6c1b927e5108fa9328106022fefb3b5c5e9638a66b24ec32dbe92c0a78ed1f7c849764e7db75681880661fa2e39801482185b4606fc82726e22a072f97a5891717d39d9a2f0cd4d6576123832a1704a9fde17cced1821d0d4fabe30194a1e1295c310955d120df1124440022a64b19a2a1010ea37c21293b739da8827549dd93e5b87907765a3f23db274d175f7c53db086c78fa53e2ce5975ceac0b4e8d381514a4d2e7d1b10fdb081245a2a9783c50b0beffd108d0c90d6112914a6d58f440e577ab25288974a7cb2dbc7b3480a65a854c8499e63b5a750e1fd9139b5179ea8f067a41d8e8c57401aa09d4aa82c99c0aa82647fdf9fdfa0358e10725a7229e6922c9e7c237a96d43b217c41a50ea645b50c9fa50cb7daa56a023540c81f364498b0f8960d047a77c450c4a9a1343e25596609c2debec280493d41dc9dfd45047515702efb726e8f2d5618b4a81dcba5483b2af885106bb9474329acd4136ef561d21e7bdcf26071e4743942cdcd93b7ab52479a78150600022d8b1d20e550534e0f002994f23cfd70a3d495646295f242c150d5dc9f06943ddf468fb288e81056b571fc0e66aacb99d7910a89544369bb3e649a4418bbf9850f136b4a6936f65719ee54f049d6199abdd0af30f75038254a9940a8e06f0a05d552045628d53d8c0a834913f6e4ebefe28c147e84d09da7618352a76962340c0a015a16a5c51fac540c007b9ee83e5aff2806451e32eca3f8284c9477ce6a03002cf21563868a50201bb03e0a27f51d399515dfd0bc211b99c90a273ed37763923c54f7d07ee0a1aa0af8912d1fb2c7d2950282d4834529ca550564a190bdb4fd30200c7508a75a61d2a63d727a6f7138c51d4175e0d3d8d051df34311e86cd006d1627731d512a36001be9c9e2a5c2739a112decb1c8a56ab71a809611b69030f0917659f8aa93880d544e003ba1e38a8a0b96cf0f2c2858eaa0b7b27f7458ad02eec8ce66d86381ca8b5ceaccbe146e81af099ffacfa81ca01d1e4df991fd5825efc5f41dd903d1336e5b29500d084f8430ecf9cb42f457ca06cf7bc40420e11400fd5a003d4085bb442d08610015a04511bca30c0cd14b98fd08d56d309a6e97f8662caec698b04dd5a6038400c89d8d1e024788d33b943703bf8f3619bad71819140c51b8e12d13958d08c3fe425825fcea1d06c501a7aa8d6e52112e2cb4356ac22c50ad73c9d7035053a90d7d22f3cc3b689c95f2a60615c14dd001cc7eb37e80f0af905f068fa268f7cc3b59d3841786adc79995abdfc77197be295e963248764eec2af04df79533ee606194e7b2d4306e003f9c49bf6258c2814d2ccdabec93da25cbf977f40cb4e8e3eda492cfb4e283997291b753e839a22db2bc7f5b60a0c875ab337d8fc9bf8157cf5a29362818c03a222de86baa04fcb3832c3561dc3448eb9780880ee82029c91f2c278079e5d767ea74def9f8f5c411bd29af6daef0d0c3fa2663a8c87e0345190d6f1a4adbaa3fceb9463406c4fe2a93925352b9144823ac435538a09e42ce6d7e60e7a370f69245ced3ad90c24b0158d9ce4d82e18b572b0da59bc3f46c70de61a551c56d37546f80d37fcf46ffa25a20f6445ab9070ef25a360c426d2713793eb437a57a875d1ed502c10c82decc9fce6bae16ceb9f2c4eaa3e655af59480970c77d46ca72039fb8b0e4733cd85e053a74fe5ed4420e2f61b7f67cb1f697c75bda5f3eb913b79cf2dad3821adf518083f7ab7b8038d8105aa028c9b4ede1a0da70d23aa4d174cdf2c4944af95749988caced48c0ddd620b7b7f3a3bf17628f0fbf00ea169045dea96c3e63c596b5430f8ee08bf44f17467b08544793dd5cab483d3525c135b17594e94190302d9e639fa0b517e9b6e2958f940e71c017840dd50d2c6f6bc7c9397108d340d20d606c4f3a63031dfb86c019dad9f29b1d9b30c3741168199c455c0270965631929a6f13b1f95c77fbdf54a604a0c3080c8afa55998d62acf1f59711f71fb21018bc33cba903d315fe1acf260d0de639fe8c14418d2b3def63d0fc0b659c722ab90907614670573d383bac348a5173213f366a93cb5a91170ee4e4acf932f66a42d1a4c1d2e380ccbf0039d83f5e6289392703f04d9ac05a1a518be417bc803af0d8d9b5673661df07eeb003c21b5b16b89232ae0468036e96e0ece672eab187d2ad080b94102066d7167668c108bd1becff878a9ac5ba66743025cef4e96edeed0ad2d0fb37209de93d48ebc38034133e0a44ed68872afb93d9c0ba05c19b2576b6e6e0afab0fcc27f792a7eacbed7375b4df6788df58bd77e70a420ecd3ec775abf28f631860deb971e372192728b89601598efebabb12fa931dadc1da1ab32cf252e674477a6ecabd7bc87fb4e83da9f4a39ad359752f0511679b1d2c309f3ea4bd9265049a99eebe66a548725259f3430310400ffa2803a948620b883515edb79c72364bd9b8decedc848d77b1c7c3750aae88f5f3b59807399578c8975488eaedd5b22481a688740e8b6c3f0c3535f01ead9c022fe0343f6e60d0f3cc0aba28d3121ccf9319c1dc0c82e118c69463b71f9091e75d52c1930e9d761b8f4148490187a99a64393660c9f0ba9df68f27370ff9d6ba35412f71298ec055a7f38a524173c7c158f297ea5ee64604a592701e8aad0b9f2c80a121f8456f2ea81a0cf76dc191c36f94079e62c2e88dd8e2e8bf16c2654007faf55d28432af42add6aae1074fabd55f835fc26a64c4094c7aeaab91b99b52c67c5699364bb7dd2dd82011f274781089c5702e72039242b91e6ac2810e0b8d84e409b024807b11f76b68a4755407d37d09416588e6ca3adf912b569b8b3cef5262f45fb5287d47d59e6b177f9de6e877dc4ede5cbdaf809e0fa8f3002b1b128523d95475bf8e169d48b6708626d9a270d5a70cfb103a5068d77e2b732fe28cd73d65dda9126f10e3a99d2ab2636f0b3dcf3d479fc2499f9dce2f4ae7602a23329693385d99915eed809a17740cda14c29a196f34022d8280094605b1ec549c48d773bc25ed25c91f1b0b99597fe40abf511a14000e16df83ebb26b07c5a011d1c89fb3bec4b4acaaf40b60a2002c7dfada4504233fa86df881b2ac3146849dd9f48f542a853a0631221464bcd62912ecef7e2d6dc086f6314465ed3feb3c6be9bb76d97fc2aa00a4b357858e37ff935a6e1a9c0defab048dae63dd439d5fdae92b45f09cc9a286f88ec69eed9d6ac6ebe1662e0459c582cb2959a71043ecde9679c85e27b024640d14db8d6f77066554cc0e0a0d2a99a2d2e21a31cd313c03e0b4a5f34c5ed2d69926f137789342c606c9ce2610a65d8a3d197a390f98b9a269115127da9890bb7de5dac23b3e822f8ebc701675821899d4ef467c26a24d6e9029d754609e9f7fd22b72caa0af670caacc4277a7c76fda763659927e0c94ae16c44fdd45a153b2821c96b3060015f89abd2efd703243b15c501d3c6487cdc5e85c281e55cff52715534005c05d58993b7b34cac66de6231406a8fbee4b4f99e3357ef8d8a3101eeb7871c5ae47f9609d8394736c49742fa2526384d311c59b72817d0400c662a254eeb76464b236641226c5a70889806240d118284b40f0e2819da2d0f83aa4423abe4dc43eff5c70aef715326118802f23e4d83b4b4d5a2e3c5c4a08c2690dc3ecdcb8e06afc83d0f0649b186da4826ce883068190a9e7290a3f4f63b41e5fcd94ffb9992318cc5ca6c17aa00d37420115726610cbf158e66c6124696753ce909262b588541beb447604fb85621cca19dcd1c63d6d088f9e43e1d50e6a8acd2bdbf5845d713b7cfe50e15e8ae1a3b6c0b420d9546fd173eb8171af4cfada35e9beb34fe75266c25ee1feaf91b315bb28b469e6f663e3bbf0f5148b83c188b846f8f755e08b056330e6a50025fe690e4aa0e426db4c773bc0f3ed370f0fe318084f0a0492376d6b26711d6c22c00356696f81ab7e87cd81df4bedd3686c818d9cd53b400eb7bdcc08cb68a54a70decbd7abc4f471a1a966e04e24357f3154a7b810fca1f2126f9dab135e21eb9d3db05df9b82a3ec1167a71c37e2446a1b052b7f2063d6cc9db64c1c84df13e4d46735fc2b8fc8d710add465e0dd358381f8dc8ca158f91d1483fd714295aa7a43fc5f341d91abbce10b2cc6ca042a67050e5244eecffcd252d4e30a05de8911091af196b33d6028da2a21cce612dd818e7a878e9a284c8e05f1beac9014e18eecc54b119dbb3878fbb77c336e79b7e405b10d6d6b96ec87800602bd7a0f764a7bdd95cfac4699dd98dd91e34062ed97a726b2561514e6a7090109352a3582b80ce7e5a7c38dff1d361080a2b61e651a1d2ad37c823d088e18c02ae8b2a0c634e9b8f31625565a166911a4fc252ca9d333a8378e019a5c2214eaeb11f5f606fd3e4b199e8040fd278387f18fa151368a6dee03ea0571d67574ad6cf187d1feb2469ddf06561f3f64bea5c63aafff4db95ec8def2136faef6dd240114c01289de9c921fdaed50df84b8af9b219b0d399a3d269fcc7f1ab38a026c15b58de666edac61fffd9c8840199d39a1c2b1422f9c26d751423c257af6ed168fa104a937c48fafe673ab4d85b6e72ae0b4aa58d9a2859193c8c70df55d94e16d4a504621152d1e18b7699cdcdacbc52971bff540c2186801cb5308dfe4ccaa1bc581e641e7c3a5643affbec66ceeac6570213a42aa2f5701af9e2e9f97cb4699b958be19e6919df321a7a0f1805b4d13c8d74452aacb81bd7563844ac9dd43d8f6f475010c199261766e241719bcd1fabea3505388674237fb1512f3580f5c9dc5993ad168e0c490fe758e894c6f6e241b772163aca4e52bdf3eec25932494900c874e5e9e5c4577a776bd9a39cffaae7235694c7fed7512dc9fb1bd38d7dc55b2065a6b37fc113f8672d05212393ecefe4da611f5958623d47e4ee41b24ee9a154a4fa60510d6df8f8fcf14478790d90471c4ccc7fb5557ee21311e48a1e9e0f1b3a72b5c5ce5449b1c1bb4d24a357e397b7046931e7e2a56a753b48e66e9dceb17507f82624cf690178b8b3c325caa6081396fa20e07c122d7b0f5faa54036cf4333b47e0172d635e45c215bf199bb2c724487020731d429c4094bdfcf5c9a8e6b808b499ca562acba4e4cc2b8ec2cca3ad8998247324722315a2a80360fc31269745561cda81efca1874e37e79493277f200f20a2bab4737393bc7fbd7b62dbda8151e7a66f2c7356286ee9ca4dcec6332f8ae436842f5e26c361ee29d6741118154bf427159eaff7658f1b48ca8676ece65e2112aa8ab340ad513efff0fba122cfbdf0f3f80f7c93070249d5ba6da7546a8fa4a37816ef6553971ce78474d73470e774bc5aab1d5397929c06a365de8f76fbce4c405956b8ef4066f5c69c3c33a4fe3141307841d6fdcf924dbdc17a872f5c593183af6ffd6e2438e5b2ac793941f089501f22089903938c2a5fc6014c46634eb8fec42059ed25c2d5b3390ba3dae1094a4111a42ae64f6f1d82490dabb706867318b5c0225631190c04a91d51bff38935ae4c90319cd69704684cf3c535aea5f455cb5278fc5020bd9b9a10ba23f100cc62d99b12c29f392e8d233975c0dd8e680438f81e0d51851f5ca559fcc753dbf3404396fb2949260c471ae73a6a38a6d4906fcbd8be0da760e8138b94a664371ff9119a576f1d52de833935018b1e595475257f95670efd7f7d868819abd61e32dfe6a40fbe3b3fb9b6499932ac3c2ce49e73f17dde393529d95af2273b3f2e5eca4a5a6859044df5ddb4bd5b2bc49da870349bb79f7b89215dc8e3084838c125b1cfd2c3c6a031257361a3df18caef9e88e924ce447e63287a793d9aa50d54a7174de01616290b75ab463b3d5de2537a2f3a43ef5d6a83b0d2fb10fb7c46f2f4a336ce7f7b23661d33ef43fb76536a521172cd59fd671f8085fab5937b144a80ffa2c0e7356e535dd192c78a8df4b6d1292442e3bfa740b322127da6cf6ae0d10caa29c13b56ef502bd9f99cc20cfaabecc4da020df885da97a2211b29318eb087be91cc6a1407b71447633909c91f7c522f731061e12702b96b0752f12de69aa9f4dcc53b24ac4dddc62e0c59a66ebdbee0562a303188c730235365b0961d8da62e037c1f9868fa77602978eaabc860174c026899f4a6a120000f63c41d011a95052d0090a3cc470c60a6a44bfde1794b8452f3eccb35fd7fe1407d63492feb058b9606559fbf10d28c158499af0aab756fcd7392bbc792ff08fa6c104202719e70b98ae452f9e8f0a40bac5c9183b39de85bdd187bf5202d4866440014f196f7e0ffa41ffe8884c62d6f9611eaf11ad0a3a21103c0980fe58af6232145758cdc3196e1918b65c6a2647951a3a4e8b3757fd7cf67db77c9af94db7d47b218182b862efea024d397b8ee5dcf01b881611ff96be7bffa87d85d7a03062c7b85b660c2d83d051ca4fc0f0ba66ea59ef585a827f5dd8d2ac62b41a669d43b4ec623a6bca4a78426838b3ab22de77d20fa633fc42b7395f2d9a5deadf8020ddd9b8e1a13406bd032a1e20d2dfb526c98360726903255c8967b13e3dcd6d1e2ed4aa60dc11cc99bcb8062879b2a956e82fa7331f24512f970f8381557e1b4731ff3dbd9dac8d96a5e4f8d3cfe1bddd9dae1e2e3ead755399ff589b4154b6f6587a55de909e8d5e4df7941af4b52b6f90f532fc38f98382e2178edcac80c7f642b12351af536fdd7f488aaa1e330a9b458c8b1b6e530d9d60358a10c5dd9bc4a707d51360d6d1e11b2701001d677d441650e223cd7087a6dfe4176384fc02730bcb2c721ca5e7f2aa2ae514bf2e473bd5060d86c647a433d2753a2fe4b18def27e796041d40b197d2769ddcbfec72c002126e85f6d9d40160bcdffdfa522b6a8a0a5750be0d5ca3a05298d79cf06bbea4566af2169dc1e37a62313ebf7ecfb76c24104cd596c6d73020c9c590caa256aa0ceb2366fee2707518aa30860aa432e5d1118e51b3966ad61f37903280f06f314f8d8c89c8f396c8758a8414968a220166a46330a3b4c4402c4687f2beee1dd1445dba78834abe0a5cd65980a1d73b9dbb7b6dfecaa1d32977b287de3d76a32a5f37bda9ffbc17cfc05ee7d8552244e3f714456616fc236677c8e3701614e4662864a17f4abd290b356a14db774aea6a453cc6cb94d8b5b4a4dc71cbe317c565109ac603e45b23fd8e255e1e64e0ad3616a8c346f9cc709151f5bfc5b1798969f4ff8dd882d63ea94fee9a24945025fd1c19e5be992fb3af4b2134ad343087ba7e492289d7bc3e5c25ea808321e50e9cdd325c38c298a1b8c24b81c9fca1b7861c40996b79251c644ddbd8bd2b8289654eb6094116382518585fcc69bdaf446049f53af91d32684a90630445040397d2ac0181b9034085b238262d33e6f08f2aa1b614089944c418d85668ce8c8358db6bc8d1668e84c200ff592c3c403a9345250a0c43f8ad62da899c6067330830267fc0887bac3cd0fa1f7d2771aca82f87c239bf0645ddc2127b063294a0095b3f2ada77f0ae1dd842974bd13740dd0bd2892882c04e68d96a475ad7623b2d83f7b9d1f564706c74b2680fad2158839c24d6166adf8eb254e6a146c012c6afa21acfb92ffcfdaa84ecc6352ae92670eb986f91080e02a92b31f5a0d5646976ba6923b3deeb29b174d7e41e292a201f780f83c9c8e9aa1aea46b864e933b9caf562c5f4cd12dbc4b087017b62fceb7bd0e5e1e6f1d5d74ac21a6c77874a7a39cdc3ffcf880d14a810742481a52b21f0ae1ca11639032bb295128570f920a0b53c480737f0fd6f16ef3fd3b89cfd4945707105329617da495161942ea256eb36ec8d93d95b811d4d17a52f22bf5b1f86396268ab486c76a56d2606b5e5c341142e8a49f208f5e05e967f9b27e48482728560510c4b97a8ff429b11e269b766b70b95fc646317dda465af53f851d1624aa81ede505b982712306fd466ea4f4051d2d530f913dd668c9232b3f2bd24b233938b61ae4055ad023022e78df6a3514481f490a886682a181c65ae72098f7a5fcb52fc93d528d85201280a1c1f491b1bb953a25f581e8a5a839160ffa6cc6ba53841a78afca3a07c6aea5f40bb19b7a957e4da0427316baad9580a5b950ce41afac00cb26ea5dfc41618b3eecd218d051b26b1fd8575b80aef5235e17286ba441ace16b47ed85a1272474012a364d465840cc5ccf01c3a0600cc3c08364f0305de2d1e54af01512d570983af60262702218801201360cd877c097cc81dfd533627783dec9abf3dec97b911a27bd3879fb7d3586cfdccfe313a200f3b715291e25b74c29a524a54c295b043904430423f07a4c9cd74163fac1ed78f8962baf0207876be27a483e25a81bb5e051293c0bdc8ba7825b99d27b9ae3626a9d0a488e1e5c2dabc7544f79ea4b4938435eb9e349d8f0abb798b7b7d79be0eb2d9ebd852d8fcc4f31f9524b2fc70a1b3d4b5c44483d1d08a7afb8c9f03ab712337e1e268877713b73723a30feb6e57394dee946879ad1d18c3c8ad6233959eb736ad07495361797b615207bc92767b6752fa74fd851573771e58b92404f6b4a5e85e8cca7bfc8e978349c079b4b926dc51bedf9a467e76be3419c3e2aacd774f1b82b65d2133d71362536a21b3e2c729a68e8d65cfa726da5ffed213de5dabc9093f385751a5d9de8ca9f48363df130254f43e48f3e5339dc8fa64bcd8585da4a6fdbf32f4f2ed566e3f43e61fdd9c5efae7c89a4c7f1c4cb9438165187e1f323c7c7d0a4487399495b51daeb56cf206d7cccb923acef7575a12bcf93e4544f1d46c9af10f11e3e7d2e478b866ba1b994a1ad74b73db8278cb60ee6f42dc23c54dbbb986dbfe239a6fa908d3e6386cf71e4658476f0f49c15ae112f391e8d6bfc6ef6235aeee2e4d98b6becff8cc5457fc9ef2ed144acfd280a8ecabfc9c1e743cf6ecf6dcfc4b6f736d53aa71da5d53a55b7360aff287a923f10ab298fd6d8f2d4c5c3216b0ca2e8d76c50a768c65a441331e6202c71d1afa37712ba5a2309c1e0178aaa5aebeeeebd89493b2c0d4cd3d4bb6a8aa27f281d700130aae6efb53a9c24c9b092644f3ecbc40314d549e6a216b8288a7e0fd0fed26ab14ed6aa4c5fe3d4728d26de454be59ae0a89796c4c549e70b777571d2b9e31a85e99c0722a2e504cf1e940f291737149490128352eed824a1529fd55a6bed995f0c2fabe4bffd9287b736e460acfc03748acb7e58cd838a65579e577ea1956f300087892cf1979208a980ac84992c3af86181d06607906df0dad708a31c349947fd20ee4c1f00033801e037dc67809a939cf284b990718f2c83a3d2b212ef20c177790c770109ca906b0000e308e61d7967c4affdeb9003fbd091fbd0b0978df402da8a273ab899a666140d306887cf478e931072c2dfef5feb28adbd67bb8d374e3492e0a1a31b5294e00d32b10944114130653b5f625928808ada8906d80e26182858f68a9a2854d5604a27d64ffa7eb42db352a6f0a084469c5c4c343579314b2cf9d999f81c855cad61f9c53ff21e01705d5ec252154a5ab041cd69c848347289160f30902c1c798d0aa76532ec345185933d10c0a9567e53117e3633c827b2f303e6d131641a982e2aaf10c341a6e0f2101f9e024ab11d5619072622be9a31f491e964dc54806d90bd714c86c192f674721d0fbdb98c83cb328b5b01b25502921905d64339c8297016966bc36d39c602b08e1936cf01a2142ce8e2d88eca1ace989f1f15311536959726fa95d742d3b637c7cc7b0a6b45a44879f321fa81ab23c2555b24eeb29a9b931585ccb7013643c3cd0bfe32d811c505375b6afdccf4b895702bea2657ebb216ae5e8b1a4d4bcbd1aac231f3c263b9c78214e6ca5c594b0ee35150df34c07ff9e90c5bc1f06f019843ff1873e09f9fe0e3df47d01ffd59e9aa53294817fd1aa8123396725d69f1cf5b9c45432490956e4acc4aacbc8539e0af9dfecf4a5b69142ad5efc9afa886e67d4b7c511ddc9e35dd4454cbcfa627fd5c30a39e362f345e908aa9915c5215128646df9ac22db838e937a28fcf359ae000e23f14a1f799b9a808368a5eef1ef03ca8ddd5694bfa539954003b31dcf4a748f4831037fda910949bfeb4285d4251d42277552277f34797b9468b0ae9763dacf05bdecdf86153d2a0828f27a84909080f74078d0d4ff29560d33d364dd3b40978a907102010c2989bfe0b6820a498fabcf4f78ca5f4c9bdad909ca2e7a457e41a37f837b9c794d49bdafc63f577f5b7ea17e23c2d2472510cb02d6f52ec9692ba44d4bc4c8d950dc1a4f9a059a98b937a42aed10408f80161fe3f672c37d7b811a493b322ea27064953a44291c3c6f3c5292177d581107e6e29d4e3e19e73bd9a90aec7d2f23ce07e6e9dc6aa616c9ae669b179c93ca5366f08e8964d725c2ee272124c5cceb1324f06c8e69158817d7ee56e6d885c07d2ae2e4ee2a1b94621ff6a35d956bb737074cb98a00abbb3dd2e4ee21db9461c852224027994f3dfae7039e72cc74be172fe3ffed04b7054072008ff863b23d7d881292b8627f146b0ec9ddcdbde316d18f8b1fd8525dcfd4b5edc8d16f7e6fbf7edc74c52b4df9db94693289e2cde76d7748dad076efedceccbed55775cc2605b6202422bfc77ca3ba7bb16c0129295d87bba017f28c106cc01fd1bfa370a51f005807ffd228af89b98f86f6262f2d10d251de57fb32eff7a036959576d83439c9e7034ed0162f48b90808c26ef5a6600b38b55a9a41dd3987346d19ea6f0746dce39e79c73ce39e79cb31030fdd99873faf30839cd3aeba6f663f5a8fab0de3de07950d5205fd08789d00a7105d56be1ee7770cef9067f369c2fb65696c722c7e1f22fac73f92f413f50c9f046ce9677ce3738a42b366f97432da1a66e46734ed59cd56f141a4bb01931ed3ce53a75f1fe29cf68cab19175f5b07581297067a3d02d99100115379cb44b72d110073c20e30d3a75f59025aa68e2650816c028203a70511587e1a50642488007bcbc000742d000fa4150d841070f842e4edaad70531727ed6c5ca3d0adb28bf14f766f1a1f773e3b0fb6ce42e66530bd95565a8e311b1cc7120922fff674199cae23880cdf0a52c2d7f0eb3b41b2dcf89f933fc13ad6569412ed46f79bd134e256489ecc299ab9a93bdaa84b39baeb77707967be47ac37bbba0f1dfc87945fc1e47f8e3a0a2026164b35fd7dbaf819cf11bc2b6f4dced348e35c63725e38b07092fdcb492d06ef13ea7d2e9c54781b3a982e838e85676f8f4e6a8d7b357f7cf8183baea8ba598d5ea7c475bcf03678926e54cc9d089a2341d3d74fd46db5f9a0b2e3179f5b7665550f83e255326e8a7a0c1fff6285921c0a17722d7ee7afdbd9759d377fc3cc0f8575312eeec3caa7888aa3c1c16064fd20754ad078a93813c838951e2f829a34450d15c3c694d38d2515744c4e4877fe434ecacbe9a8b0df1ee608183d2b782fdab26d08c80629ab4fdfe061a58ebf164955cb2a36b11f979f139d046f33466e07485b170a828f69dd7befbd2251964aa54565a9d20a24b77456cccebca0c2cad232a02c778274542071c2b0045a889c289c7b2a78605f406d1a3cadac3939fd8cd05a8d53ad87d87395ae73755d93a452beee1da3cfdd9b6f76e3a848a938187cc8113d655f616d6f1590509341e4e7c38704cc8d577a190fc4533b3aaed658a97f74b855c7de8730ea1d659b7206a8bc9ab4f4ccf44e14359326068db337a49d1a1d8c59764ae9e96a2da29e6851b46a899e601055c6de32d976efcc6445b8a6929444765106c172a1150114f6b5220f0accc5b3b88fae88845ef07eaa64f8a001c4718165c96e40e70eae055f5e8f172358f33a5bb391e7b7d583c54dc8e2c5c28cec4d94ee0f2cfab8b7978e9e6239e33c1666bc6eeede412d106f8be071baece9b8815374e421c65c83e2ba0a62e6b206f414d19a8aa985aba7dea5b4048e61e2d2b1768c83e121d135d3439d01d36001b7ae9924919f91d6ea27acab1f92f7abce7cae9e92335a67ba52f6ab525eff36f51e84914cef7c28c2e5880944d6934cfae072f5d4d192aba76a9a2c0464dce08c10caab5b91c4277a433327b6cc62feb67c9070751908643d673be25a48ec780b526c96cfde3247979a135d5239fb307cc0aaad069755d04e9785193f4529515392bcfa13e288c805ac49b0020561860bc3cf01d1d85d0e3e3a2421fe0d7e065f0f4b882f865ff2f790487c89ff7f3ed4407c77067fc3efc313e28bea7ff2814313e26bf23f063f647801119d30d480f8eebfc1b7301c5630cc407c4ffab760f892fc776ac48dcb41861feca07841865ff247866f06e21100c537e467f818fe8a817814296af824c4d7823ff2f9c7f085c337f892047fc91719be223f483ca6c5b7823ff2fdf02d99f04b44fefad5e12b02fc19d6f56320f9eaa7307c2d74e2d182e2db3f868f128fbdf892bc27c15ff22d88fc0c5f138f148aaf853ff22f0cdf0dc42349f1d59f84783429bec23ff235f8ecf0a5f04bfe667f869fc1fe187e3b7c4d487efaff853fe2ffffc39f872f06ed2ff9c4919f81f87ae2dbfe77c27f29fc37f82bfc632e66f843ff31105f0cff988b9ff8e6ffa2ff4dffabbffa350c5f12e24b7cf77ff97ffb7fd70b866f855f427c492efcb782ff5af085ff988b18882ff0bfec7f43fe3bc2c1300551ae05c20a2e580856a030a11d66a1d683075a86194908427a827f1f86203dc19f0fb34c664a4fd42104487083bf889c8213b407edaf975cf4abc6bc81a9fee9948ba6e9d7e9c67239278ea0875969858644202566ac3d34aa1a280115fd39640229ae5184ab9690979843fa53a21113b3326fe10fd97d66e5c6c09c73ceb904285ae3a25febafff540acb9fd85f91cbbffaff6ab859e94660134750ff5e57da12a4ae7a02375553fca1843445f1871250cca17f1473c01f4ac89843ff25e033984901aa22a1113f52f4e6ee549aae56690386004c09afe5ae8ad9e4309a1b044c338e7f7f40c88aec90792ab24f240a4badee5dfad053b3d077b3ce20ad7ca7b84957cd6a3091e3a6698bc4584c1033a6d56d05d0148c399ea33e8c6abdf7ba722db988d0ecbdfbdfd97b9a66ee1c0352364d453f376b6bc55d97420d98e2e9ee6f1253dcbf830e377f767f566a3a9e8a5b0592d61eb45e3777f7de7b5dc9ccc8dcc8eac8f8ca58ca5eca6a3a78f02ba7e16aad76aeb55eb5c6e9cab028babeb857b9f31c8351664496d58234aa0b82329921984d962e65f7a662aab19bdd18b328599607a9daab684f151bbb9d2626dd0d0c0dc8f9e9aad1f13e95208ad4d8fdd9ce37f3e849e4c82a241d61ea0eea27454cd6d61c0a579ba5857df58ca9fdc4a9de23971dc944365ba49af0eba873e9ba86a985c9e9b60deebd77b0dd5baf41a01c3218dc3c7c00926ade1b4e30af333920396ad8ea8c4f8792559c5910a6eb5b3e8f2d692e5ea071434043541bcc1cdbcc7c7ed070c41d39068e707e4e2e2a5284e0d04c68d88025a62bc7dba32474d20a7d879e62ef6f6af49ba97e8325fcd9e1643ccd4e850ed6ce8f21e69bf38686a10a17bde6538bb12ce0cd6672750a824a4864fbbcf8d4f8e8f82053fe7f98d2cebd90721b6997baf1102a291c63cd90e13453a495a5e4f6434ac48928281a4a552b49432959ce7796457db4f7797fb5ac4462953532bab2b32204c471e1c252b36e4216664405a62a0b99cad5fdd73dcc760985b0eb0ac676c9084169e37272b9a10860a9a38437d346b413e2d93c91c7d275f466b3fa35511026f44ba7eebdb5deedde4c786ab08b6c8d625d8398d213dcfb666ba1e6859aba50551742f2490a7a6a7bffada6eb2aa3839e60196497296a6596845f03ff1a3a5f9b510a9ac0d9c3e3c7dada9f1af681d554a7137406e308b7f56ae84dedb21f193b5f405677418a3b476b092aeaa766a8b8d55e5a6c75efbdd70dc697cd90e20f9d9d1b561cd25c1ad90f381c1c3b5e8e6648282696eccc44501690b41c2d148d0a4def021192c89a3b86b4f6aa52bea6fab5a64a61a3e6dcdd13c88f479a53ccd9d1d7111a1b0204adc78fbb2cbd20a8975f1a628b49c5b55cbdd638aaabdef3b4741e99ce73d379763e975b436845fddc60c2c4172b249638306341cccaae4a46d4b488812dbdf09140b1514105f504c522c5c90efd48bee1b04bcbca98cb0d086b44990b99abb218ac531f128668cc044f5106618367a3531cbdf53e444a54ef5a6bbdaa4c9812606b5bccbc14645467401a5c342d51612dcd6282bcf65ee3e854bfe8242491bdb7d623611446822d963a53a30107b4e30acd45d2178db78b0946af89b454e21bc1ad92910f65d9d3ce3329e5b90be2640174740164e96624e52ae7423dafa51735b0f716efd715048c16ef55ad6d6e426c7e54fea14440fca5b051ddfb14ef5dff85e9f7be771d257a82979dd936856a5f0e3dd13a781d5ccd22c583b619f236493c8501c427ed86bf76ff01dbaa89a127d8acbbb575e80956e3fbeede1bbcd66cf72c542dde028e7da8b40adbf23986cc2c8240401100331900040882511c8882288a21f2f514000643d470805038303a340c86c150201804840161200cc2200c0320100341104c6214d6e1078f01312d032aa9f218fd11324010f811a701215d0319e3a37ee7912698fc4eaaa5a586d99f2dd92b7c1b30482fb2e77075ab79f8e3bab867da0ea21862e4e1b7e5da8075546008e5ce8961658605add8d175c0104c6c31ebab69edbf721b5fecb5be1f66483c4fdfda55ea3723464d1abad4066172da9274e0c6be210724cfea6f685d51795e6803108a324f81d9d47886df827d009dabc7c3caac9d70af91e9c48ecc4145a665daa400d7555fe3f5347ed5438bf8132b141fa77fb224ba49aa2dcd265a7df061a1a0f7f4150ee044b3773044948e478fc188f7def5d929b81ad321b72bdc0afae71f5a99192184fed1a9344c30b4ea16c0d809b914af288be2048bd9a494432b92774c194a36efab273df176f684385ba5075aa2953a0602ea820af9f064244c5940d3a77a06e4aec7961b2ceff60bc5a0521244dab589b0b232f579f208e0a1014567d27b41ab00325dc104feadab615d7a8727f5f1619f7c5211c2a31c40d04bfcfd417a39452aaec647e3214a3de00853621c032399201b47c93e0b98ca7fe9aad3098018c4b8a1c5f04316b1e8bc5a6398fb5ddc66169539309d5d518e294cedac237c474fa1787506c0571e1933d9c951210981c9dd3b86f4ee84892fa73ae7c2b372c0b72df8643cc0176a77908a886c4da2b4b73838e1f2a45b6d6a3e0cc7db8612c55e132f1ea4eafc3b6df9aa0a12118161a0b5369c5b86c4ff9f7a15459a118652f5b0cbac7c9056814787754725fd81b5cafc66cd1aca2eed38428b87d23d18030f1027a825c27cad74020455749412c7827ab65395b34e7facc18a7bba7a8d5e1df6b3f65611b53564646d46762adf7a56accf67d1a25865f18a69831b6a0bda816b3a745e068ffea758907835ab260d9d0c2488ddaa54925497338e1b273d7ef60cbaba3cf5e7af91661b0a7233befd52ec53c3cc6aefd4b5002dfa31eb75268a2fad7a363bc60a39d74da932697c803d1ed4313ca6e0ee6c7b102bc86909622f52a34e87c8f2289588bdbf472f00d8fa20daee64e83e7a01c05af35e0b3f9b96222d0d1a214b2bdf14a316588afdae9c642cd7bcf057c65afdb949146233f2eb5b8ca713d108d0d7b9366a7f09732f328854e26759d2204e23009a3d41058a8025fba1a64f58deffc366bd016bace2c4ded2ff8a7e2005b9822093d5c997cedcac3d9490490aa93f1d3fd0dc89e04339722e573170548d24879fa4f3c938e847ffa7c07c69468b6d89b911788ae72e56c76291acd627fe043b398ad26662619fa04af9a006895231ffdc5292c691086a31c1adb6a0df283d469b08167ca35e9107d05ea3c021b547b306b15cac2ed0f6f317004b0c1ec3b8d91c229c1d59c6c8036dc581608bda95321d5196c667089ae8f63534376778f3af05817c23f58aebd3bcf354b9408e09d6b90a54011eaeb54c877f8f512e9099277a7a5db3d3ea3401aa9c5a4116d5f9c1141dc21055b41993a04a78843ffd0a4869213a8efd84e835e2a77772fabdfa133ed2881c93947dd4c670211fbb22ac0b815470c500a06e7269f2689f617f49aa86caa929dd96b571102041df119d947e305f22b7c0b5edc217fa9e07137fecaf7cd007bc04c88d066fa90506c9cf033925d57cdb0604b75208f35771629b7fd7d4d08379eb7fa4e60936ff77e18341f14c2e561a5a8efc707d01ff7efcb808d8718a0751092973d1d5695604d3249d40aad97ac175d3e601eba8ac1881db1f4c6600eba46d4c63f614310f012c4ea8c5240912a4540afc0c634cdb0064ace94fd371df1274482460e0471332e1e946d3785e91c690d4188c14ffa02ae21d97f612875eadc0d22a551907b81225ebeffc021abaf6a80424cb80708acb024a10d05e8a385d03b9c1be708e8c203cc72dfada5b294ede20de8072db5ba1db78f2b62eae0d17c9fef8f6d2bfeb348e94bf3cc1eb6150a89b35277c4817479f1b208331164317be88c6747c583a4dca55a647e0472c1c90059e557510d2d83509bfb7ce6cddf8d6b250af4d7cb517d93097c5dd936144067b1ade46904cef55795002da34e14f8e06368a9cacf9e971eed156017247c87a4dc5b93af10391d36454d63ec4442e124aeec9992fa9cf8139169a4b765f1e83bf5ded0723d199fa27694f03f963a19ac50375a1aac5c6fe69d1ad1c393252240a335295c46906ecd6450854b95df40349248197b823e0ac7831872661ba500c0490c20dad783774dc3bf8d575c4b4a78c146c423174dbf3ada0a0c21817044db97ded80ff0f5d75b4ef260c416c2d1b134457d1968e03acaec16887483fee6909bf72f2d97414de6cd27678002a4d067d4d45fb67d2c306f7a70c56df59955ca2f637ebe3a286f088aa04dc31550b7090401b7e546b0030dc2c17202d5dc1104a0b9b92e49638c44a9a07f161b90ac408e258011443264f502350855c39a4b3430b8c21203e370acda332e5255c1cab4fdcb813abd0ccf78baaf528efd94317567e2ef183140801d693ae06bc205f31c5cdfdd3e7f133855c9499dd9afe469e57ce0cee2a541960844ce59f8e69acbb1aaa792c1c9199f92f662b9ca46f11d998b1bc63b9f3e508961deefa2b61ef2ecd099f7fa74b0f2d0a61546cf730b502dea5e57c64f3671d2151887eda9a7c7f0c286ce982333fbd0a3c0ce871db30822389e88c24885da094c0a74275561c84794bf0dc5e52d22dc27bd4b3269597249f511aa381133435e038964030e3abdaff995451d5ea955770f5050c3aa30edfd3777c84f19b4754ecf3c22110bf2bc6b75583b2f17b340cddd829e243649f07d3d247b515fc7ff441f2a2565f1cb8f18d5eced05f044829d1f377dcb42c5de4a9a6ff5daf8568b7d22f52ba2f007ea3a63dd39ee8f5e45d8586a7578c21d30ac462c661de0fe49f4075e08f21dbd160e254767fa9e424644d2788f1a6054ab7731e60af358201c60fbc8584e41d96db803933a8b84a6733562657b8d0f7797e0a5de78335aed055b8d2a174e403ed2ccd0e88effafb7face556be5b6b890c1c8733ba460b5ff300e8153dd178249a2fc5f95dc3fa6d9baa2fe5a8df5374e104fbd177e4aa52f6359edb10654e8785071d9654b6175a0e0644234bbe3238579a2268d3c722817181268a790fc389e4801c66a1f78dce64b8902b1c2b8852138c7ba6018eb93c90401465dd6b52471249f53b87518271c44f09ea678843270af2e9a99051346ab157b1dcc7c013b8d6c85d711074bd140cb018a29e25b0d077d53c338727cae505e63b8efd347f9b0ff3c80b7df71f8bf1380717ebb78398a9a05378adbc66cdb46374a6f27878f2710e50cf48791f62ce2e73d5ee637482dffac2bcd492b98bc597225ab78652dfe327a2b66df8cca6fa5b8dacd5cd7e90b23ebf3b2180ab84e6a6ad60865a615b0b4dcf518c98d3ae7ab86f443591991ed67b0e0efa9f722b6f7f244dc60d1f01dcf164ea5366c47e8eaa52c381f91d802553d67aa20808e1fc1f83206077115ba1cf69a9765704ac628111472f4fe21a79ccfa63b1a027c640ca6faef3284c072db087132ac8a218c601ece7b8775d4b71192ae19f48ca3680a6218f10e007dc2fc0879ef7bd6bf19edbdc6627ffc495affc302d37890d72ab6c3fcae7b3f6aeb742d849d9345aeed287c669ef5a757f9801fb78de6b0f59601e960c702ff0a06b2b280f85c1acee9330942ec8a8a8db8f2e7f3b27668651e84b397ae1466307cf2147ded09d245a0e2e264b3a35ec914d653956d7c5f269443b302169ab234ac6211d79879225d5002275496d682d566737a666ee44374509ac125724a4df5a39657db786260430d35df5d406465b6b46b4556dd9cb140eb0879cc862e2569d9cc245fb317556d7157bbb415fba0354e51414d75fd39d6b0d5a1a3ec9996469d130add2c373c2d98d1caa05b579193c2f80f58bcb2c30382ea7550595a8fd346d049f011d73ca6d81a70058251a285513bf920efeeb6c70e4f5d5d41b4ac962fc6168bdcd27a402b1afc29f60b68b1e9462414597afc225cc5da0fd076d25aab71c6b60afa27a30ba895d7a55e89e1b8238e4ee73ae12ad61bd0aa5402f56dc5044bbbfa7918115515f8fb6fc21e82222d73fbd4ac1f92af71178222256cb2815ba4a31dfbecac58aea4de3f27957f92a2213cbabc2c5a52f7412c487efab50f467aae2f4fb5709e3d44fddf62ae00d90ebf92adc4b0056cefa1456fab06845fdd85ee598ff7e95dcbe44139e0f1aae72d087bbcd66f1a368005f6531576cb27196e7ab2c8f61f8e443f8b3d1d8f92a1ebf76db8e38218e1134dd86c48ebecad9f7996251fd8a1949ec799c76b790c13083c3386b459d704d1e49a252800e2759da3516c282f0ed3df3bc9fcb58b5823b8ea4244d8b01f3641c75831691e21a70c19365d1ee28d3d51ce5ebec8e45eac9faccac6eb6887dc44429b4e68a82986774a86070a021fae42935344ca693bd822d952848f1b1d29e1ea050674360ec1eb9d3eb521559a3c68b47cf4a98091e3082f3e167c6f59534810685fd992b204be967ca041eb11b33f5a1ba8244aecf9ec4ec90aed709759bb80f9328b016be99fd405404060ee1a86b144b46f682371677a622fa97444900eb832acbf4c30518d5e8864396e6ad8ddd681eee620cc645f73ad0afce88e70093dca734a28db18cc113c759979039328bccc69f3da5939f69ab14b81f4b127b35af52d8203ba9f4732a3c7be3d0a7dc01212c8c2535233404f027590a952ade7ac47cb4824ab4fc943e2e26c0305f1f5c6b944a5e5463e6f572bd54fa8acee449c3691c0a3b8e465b083df1938efc4e42285811c5587739518e00a2a02ff0f1ca16ca52637aa79b047db632ba7777bc1b2658040d1597723327b391fcd72c7dc68d60e16893fe865111af1314468904cc55fa9db792da3b94d15e91bf32044926a292d97f624835a51ed55faa3c3a8a60f1f9a5786ad4c85ef612a753d4c4068ffc65c58e93755b6e1ef99e87876d1f468249b52fa25385fa5d1536af6214bfaad1823b4152476a39f613c0e3830cf0b10143046282098af8c2b60f0db2702051efc0b02fe72fec7217418e517a57fb85a586996e39a3b7c79d0ff180f5852d675b07916487edfb15561073b6843c12db6f96d6b140cfdc0a38173017d3c411043067206527046edc054455c81f08822ff32c13a9a15de4508d3d139ac5ea5bf0971ca74f6a8744b2f6d01e38505f980fe99e9a745331a449f3dc56acfb28918c3449bd8982d7d167ae642085eb60e9bb98e3832fca34633acf5adc5c339bfdb1f040fa8f9560decf78f5e63816c3c9f99845e89e48b2ae1e29d73557f8a49ef151b31a63de44b9415b7141b77c036c5b6d4975fbb843c809e8aec4001bd2f2aebafb33a0b9c8ad2957e38d6dc753aaa8315b700f9612b0295704a885207c955a0cc8e59a9370e0edead71bb0ef040d10c9a4db56db137682a3717097291075658fe2a55cf74439da862dba671c3282ec505188235834faf3017b1a51df3da940fc0c87a187db35b220a65ca2ab404eec35354cf5668612f590951757223a3343ec34f50cb0dbf7258d9d5cde29a2d4dcd2e55d952b3ea3a0684dc15930a4da70f1437707662bee5ae9c75559383b00949efe0d04091dfb96b5d494da5fcc923862ec431bb909399d93e77094d8574986d631baee0ab744f8d47462ee6ce4cc638f8aa6d7f6dcaca3a2aaf26064379749d3548c03e42b21c67981aab87c316651e292c0f662942bec4203bdd874afe4615cfc5c619f785eecc3106de185af33a633e8960df55ea81f7ccfdfbea4e7db364e7fe8b1deba3b1bf58c1c8f164c92acd6476d57195f1a79d42cdd8e7850682343c9fe3d9fa4e595edd198d16dd8d9fb33c9ae0162431ae0aed0a3531d47b00864ff11494ddc3a0cec67f0fd37a8a7a5506dfc7f13190d0449a109b56ed4b77118f0d149db6fb44c7c18ad5dd828d8bd2bbe45f4251c6af822cc71f5eab8a308cc6142974412a9ec8b0676777a63b2cc7569c59fb156bf2af647e6c2a1913940e3c4e3ae44b6dc74a9a09e44f61820456e7bf1d3472dd19d0985ee292438b129c7436ef4744f2ffc615a141f9b4485ba119378dce6645af8dfad8c56cc9a3efe20018411149589969350914a5f7e551a84b55fb06e8af20a6494f7665116e4ec4dcfbb65e370afe6816bcbeacc0ef3309b7a8d29967f4e75c13c02827df37054fea63689986781831918345fcad859d2efb7c8ccd5c7b80207dacb17cf73d14e3617beb1ed211c975b500ced80260ea182f4faa1b200022ca27480c6b4fddc7c89cb853f4124d3a8bd0029b2fa55649ecb2c5c339bc7163e678a3cf9b910cd925fe87046d69e84a03d830beb25614ed4c5d772f83fa9ee3fca0a111e84f9cfb2218ba08ae2e70efc1ad92cf97b54f24fa0257e44a069fab4a7ab862aa350682bd8784363378d8eb4b59e69b382175bd32c4c6a84a42a14fb4e9f10e24d23aa595c7c7ab4c07039811479c5990f569fb243d82626469ac0f2cade97531c6319c8a2085af99c8cbc9468b4f196045cb1424f0e965f72512b92f3a0d871935246361cf64338fcb710f15326b13fe38c9e72a29756ce0bf98940e238f47221b30e1750426ecb792a968f56cb1aee1c6e3271ecaaf4af55dfce48cc5e8600c879296caab4a94bd566003ef63f2045c9f132a2caa49a1ed0eca48913d4e82eab7e84b014af1fa1ea26a2b47cb35565384b034ca1fb661426fc3ce4075a5f3ba2aea4e3f6a09f0113466aa4eb940e1852f4126370fce487adf92b37f989bcb0611a23a8e7a1bb6bd1ff7bcce5332b8e90c180e9f09a8c0f2fa1b810467a4b83959f05d1ca23f5196cf4a147f1893801bcad36534530149d0a08083ed2ee21b9cda0465cf8d26365513b8ab22bb92ced5509e2746266d47b11c435e017e496c41e20aa2125c5d36d10513a2ea56b6ef6f55304bd2031c8d5c0069ecc057500772a7e6b55ad0a0d81b7c33cc8055d288a6399472759f04e778c8b96b8fb0fee89a841b39c73d853d9051a7abdb390ffcb7a8f6e86d238b04535b21ae0014340f5fe2c5bb728cdbd3343cf9f8a6325fb049637532b8c80939c0668b646011b01a12c601bb939a1945628447981f0fa2414d7bf8363b805d4317ff8299ff377c1d1b23950e93d3957cf03d8b04d664d2a61175cd676121ac646f40b92771f38023894946dd1e3ca24a91468d5d9b0138cb3a9b2b5828dccd947c6ce667af44e59c871b5c08d036010d8719823b3645b606f4c2ee150a7275d0bb7875dc11a92be32e7ca0abad845d5cc954467ca98688a3a8e4546c8f1c25884f2bd51163240b501602713c8c0958cc6e1414dd4a26625d6a5b8c76a840db64d8658528032e0d46848a21cbf119bab80ae3b58881eeb043a4eef6b5524b1281b6ddf4a4fa293ca112bb67fcb03e6bc224ec5102d31919a3bc577ad9d779c734dba33c04063268aa95a6a3e006920096d0d099a1ecb6e9c7b85f354bdeb731c62d73c3bdcb9efa497f6a1c179788407cf202b2f8bd05540881c00fc7e5a99aa93b68d89879d2dfc0794b1dcc274344f293c8309384fe9a1be545740661e76083ee74e2bb71da97e321b8e6f78716f2ab1a101ebfc649ed30d414b62002614a62b0cbe8b065569428000fcb875a51cce768337cf9ec57156427cb23aaeb134363056bcb1744cb0e1fc0c54592dde29e9a88d21110248803d7e0c82340c46d414c234188056f4cc21fc86c730d65c568c5b388167522d2ccd71b2bad3193e5e8ead9432bd79cade4065a5b1092adcc418925db46c785fdd11e4a2694ae3194e0588a56ac0213cd6dc1014453d32ba8a1e823f7f8aa6e0ae1a066d90a0237ab476a241cac031cc8361c845032a7216e765292e437da33042d58d51471efd20ca62334dc103540aa765fd300bba4e781fb104c02485c1f3a0200dc721218a62340dc1c45c0a2f23fe4cbebc11941b930e3d56b82d38b03aacf135b4f0713c76ac0b0581f752dbc4f1ca5e7188b524edd48e9c2fc5de48dc325dd03ec5321b44fb81116ad875a8107a1b2187e5b9a7d20c1d66234df9a25017ede4bddef330df94697de598e486dcd2b4a883bddf103975210c09ec9640de919496dd1216436cb07c5925a987d3b5ec2e7db586111084e019d248423ee3479960203a21e054c2a957d5961c22170471a6621bf62f32e848357054f7662df5ceda549c3d1a59ded5c798798272c843c11308ec05016479475e5e704594ae738b7cec08e1342d02defda429326be70edd5d109bfb79cd7a23a7e568062cd14c54235dc643f4dc6d24ec6186ced529113de8508a402aa036fe6dbc192ab0d5186ca79148313143339950cac4a7289f67a9abe9589a4c7382bc4da6702a65034eb651e5bf6b13dd0ef4a3d05845e48351f96a57645c09cd14dfe11858447d49255968aae6e50c33d3b72dce6f5b9c0a9a8a4e2ea4d33ab749859d084aa6fd62521a029ec02a7da895dc5b526c8adb9d49e9610df20176ed24a919abe081195f9e535917207d3fff928012eda5e371a0ad03449e83fde271afa1e704cf075e31e8b1b7665f59cea46cacdf332bb1c8b3d7e57198d5b8c96e5c23430c8a115625342d8c684ae75e46728d0dd353257c5e9642f8ea88ed4338c81d3fcbb3d938f8891e64e4173e88cd30b48e380973f07afbe3a140a7431ecca46450ceb5615439fcf1131e0b393edec7ef629648266a5d002695ff069cbbae33dbb403cfb05122cc4c63e270d67958c84595277cfe5c266f1e3c8908a90156c64f9f9b566fba108fe02b0781c8b6bff3e00190652a63b77cdd2fbb241cf8c30c28ed1040937a9f6f90e8310e1fe2f5cf94a72f7d62d483e99b04e224de046309ccb136075780d3540ef06d50bb537f902d00088d2deb45517bf5c9fa6c5ff5373f405ff4e7525220b5ddbeb8aff41d2b31d4b0c74fd067fa8afeb212454226f5ab7ed6ef7ea0fe2a960a7016b5b4905b4dfbb3940cb4d5d39f62c941ced4926b4dfc8adffa7b9f01258648d6e8d7c7541035164b0893acfbf4513220d8354b0ad5943825fd251b9481ee959840dd125d221855534a08d32fb6bee0577eccdffa397f80a502d23586927e7792972522d19dc22a253062a42a15e8167669416115fd599608982258c900cab03ebe2584722acbd2c32ae5fb955432b059deafb7a480fc92fed5ef4ce9e150e1a444a0a8d14b108b95bebfd1f77ed8bebcb4ad7c9f7d2902b2aba4afd6b7562a00d9a4b4b0ea0ff6a9bea1d4aeb63fdcb7ba841073ad3e8a4a062a36f6d2c37c3578b4d75ee42cbf9624c21b48dff4b3fbacbff1a502800aa5c49f6e8dfe40ce3a94f86e1b41f5275a7dfc59f8d86d9f408278440204b7f9d549590e50a51538359b082a9707219683bcbbf8e2de5370315b3922ba783d27a6ed376baefb434eba429d5aa370f6326a21bff26e9d9a5accde284bb12e585ef0b21559df9e7bddfc25ac594763e474c5a429e3863d9224b2c1d31ae46d72d0d0ac30a1473aa3b517553ec30d11ed4e981cc9c00e7e8fc925914dd36209815a98874c99de066e5cfe653ab5dbe0fee167bcb450cbdcbe124a0672d67d7a97182ad859d2a87b9fa89ff56b5152805dc87e45960a928ab5d2c14109a944a0d6f04b0c11ad8da582cdda2d29506ec3fffa1f2d2924a56669670e02d5093baab66a5b509cbfec87bdc4d1c4dafc835fd9cffccd7d763fa02ffc2d572a588cb912048ad7f4effbd44b09004af16f7ed7bf482902137be6528166714a0a90a8c3fff4f1fd3995106e54d6afa764604e3959ba985aa55f222056984b1cddafab5ff463fa6a3fd387fc85dfa68f943c0bf60f7eac7f4c4981be0a59a920674be936b9cfea9201d6dc3e964a08f16bf73b7d164b0cdd0cbbeffdb27ff50faae471ae8c0621894f6a08e8cc32c0470ee5013705e81bfecccff2f77dd07f64a9211cd3fe43bfd0b7ec5baab4e1ce82fe9c4b0632d7eacf5852406df63ebbfff765528ac0bd1c2385b8c450f4dbfaad3fd4ef72e982b9aa55dfc06b54f02ae45ba65ff3b77de0996d08cb53ea08016191d66188e4e3fef062fde9d93b4c258250c98ff7ab7e56dfc35241c1da5842e0f436a0cffb102caf435076a262f978a61c17162f086b49b11e65f4715f5280b35a2a15e4add552836f2ba4be81251491e4d2feb17fd49242470baee4b03a8500c9694977a8bdfa37eebf26a1d29d411f09375ac0ec99a5199649dff7232a419c30535fbb1f4c2921c0aafdfa7dfe92c39122a31201a2422d19785bead3bae460533df5493fe7a5038be5fc542e2570af0c2910897b540b036a267e6d5d401416a70df13dd4fb2225d0c4db2a993ec10c1188f58e3ddd3e9ad28474af76c8a7a1a833f0a5404f8f2c65d1ff346a3a292c40ec193627621fb1df4f1ba1d23e5f65f5483d5f68c7e1ab245d1bb3ff66d6683742441289eceecd2d03b20750065b06b26259f1c7c026ac3fbf37671c1d8b5126ceb0efdb8d78523fba9e317eb2ff97a4bfbbebe74ee799f23963b1c5300cc37f1f7b3b83a5bffff732bdb543746fda25a3518bd1943dd67326ce08bdd07de96aa5baa1b951d9d89069a9922cf2e7e7d54ae5d16df2e40dcd8dcac686af869dd59dd68ab5ead961d510c2fe250b0e9952bf9ab4b9edcb90aa6d294d0cfb26cf068764b1bfe9cfa4e92f6facbf5b7fceccc41916c3304d635e96fd8cb93f67ee9da90c9b3355e45e113a5bdbf77f82d8a70d737e7cec0c0846fa567f11a06f2b40df667fafb51891ec521a61a07ff2a9d59132488798fccbc2864c2572b4e8c9d1c2066be520e1b5739420b315b061ce4f929df35364e31d31d5967502388868984d5136c9ae419bfe6779767dabe32c32c45d1fdb6ef8436c08a6ba584bdace93373285ae645a12f1130dfd77378eb3fc44df3dd7a9d8da6aabadb65a6b65adeeeeb6ba7b7577f797b23aabee3aadad986a8bc1a5b52cccc6f2f88eceb66f5911636deb93e55f31d6aeff613abbfef4d17d7d19f6adb51227466d3d4d5749e408e42b4b7c25483a0f1a8aec2f7edd2220b77c6b2d0bb38936ec3b46a44aec986afb681fbf38a6daf1e54bfded88b2728fa3d6bdd4f92b0b9541a650ffba7d3b4856876e5b2d661367d4bfdb0df72fc240cbba3bfb881f1b9265dcc7d7598c9114b3983dceb26cfbabdaf5663138303e36fdc91b950dab5d3fbbd9f56f9daf9ed99a49660c4e0d3c3a99af28ca0db13e76553a522553ea634f0691e9d48f3d92e5068129f5e9634346b0b12137885d6b76fd8c6243a20d097b76f6ed803d1b7fdd41da41c2b01d24abb3ab65614330a6c286c41955ae347f1fe607969063831ea49ae041142b30810a1f04218e7851c41527988175410f4d7554906961d08d6603cdd69530be085aa28a22581023815c5183c2155d0071040a2c64e08430484d68ae0088bc20093b4374c10420fcf001e2a4870f5d08610414184d6890044241048a2250e040a1e337052840f49b0d73523cbbd69bdde2b5d65a6b55c18acc524a6dcca67404853041c80a88d4e420668a11b4e2071c9e38e2444d0e10a6ec61069b524a835050083099534a29ad1eb30c8c96a740305e375f6b35ba83318a614e6f7e36bd6982632980393070a9a042d73d12878165c32551b3a8c922882c886451240b9c2c74b2e0c92209eda42a0a1876a0a1108787181c1e56208dc43b53c4144aba98697901860aaeb042850ee430c1080e5014416709f1872015a6dd00c169750b6347f3017602a8d64aa99da9c266b5d65a6badd5d64d460aa050c1145e80818426297045f12a269680a4892194408813a32f6c7c20314cd3385983526bb3ccc5e34ae272b97e5c4b5c4cb0f0416bf8a052abb442c70a1e2b9258e13259f1f3562c39a9509a5d3b799858490f2fd5901d23c8188107570b82f880b1240740e8e289302a4ba6c0ab25119f30c2086e3e2126a2206809ec8561d967506834ff75c730152cb92a609225e9899b6427494f92d61617688b8b3d0173b950135e19462189286ed0c2a2c60a2672079f293c1817f8a0458a07582c71445ec0053f6600440e406474240aa868f20383102c28f20411983c218b8d862b7ea46a6e7e5e5a9c208b163c173c324e2839c12b0608b6b19865d8133ff6e67a83096184f1f221420f86bc4077e0030d84e0e2c70e30412f50985488e787ac03143c22287c10b09344d145cd0e68a850bd4071980ca1881d30a979ed1c69699a431c275eaddde21d0f122874b4889f8e2e018fc81c0912910064e7081d8468c212702073a0e24703543c84b14513582738224f0014b5f06beb9191b5559ac00424d511f602485451450fa6d8810843bc405f08139cc89951e28a16500002e0401be6005101d55a6380531db083912ba490c1102c2353074fa08028811246e840fa88011721d40a44f01d9a2ccb6c6c28bd7722b918a7f0441076d52aeb3ac19230e07072b243b51f939682d0943ee85c806bbeac1734c94d4ac709299460420759022c720c30d2020c1c525340a1841544ec4313ad1d90581971032a240e25500295e4f84082a407c98f20d8d44a4b3b2b519ad96c988302995dabcd7ddd14801881c4cb08315ab07ca084142c2b708ca8e2091c5ea83738d111a193a81814a18815c818720022841e201e16d8e085fa28960e5c841144124ed829849b596badb5cafa02d3c5acac9252e1f21448c5cfa56249366535bb5616a1d2a0064fe4e0630718f4b045132c94a00097f410c60f3ff84265031bc41f447e14f981f343e7074fb5941a0182a402014255a1c9656d52c88d7b1f400820a102c80d164fd028f104171336bde1c70724c0cc20a1a48aa05068421c25416c4aedad93524aa21a11542421c90b5e39561c1146ab8b240851f3831a1d20318322dcc44a83b42aa99094ab4630a636cc39c29562428489cc21d204bbb5c69865322ab7b5f29063e20423257d9009620b229828a144092e6610811c7092f0211224a8e785ca024a6fa416405ccd8b9b5aa946e711202e093a84ca12a1b244745195982ea039e28224a8867831c5103b4ea8810d680d6eb0ed90da0103490d8cd8e040190c71a385114418e222f2850e265855ecf820041dc02056226ceec4301e60640abcd361640abcdcfba07217662417d72b645083e5c8408814b449044a8b04680287226a70b0450e7282a410e242824309a2f0918455032803134674a1490c426adbb20ca301cdc1818bd60f35d2f2449f5adcea5729a5746be332b342eebdf7c67aefbdf7de7aaffefcde7befd576a4dc9eeaecf889bebcd5d66499b72c0d0bc7ed6adff796db22d274638b5c5b64d7ffec6ad78f3415c278d383bbbbbbd3203a4616921c6d8288aa2c731e9246aaf6e7f65a1a9b2a6d266d8d15126d68f8da9aedd0466823b4d1e3bd399b4cff18f014fab16ad8a5f4b7341fe4913cfb8b3cb626ab2e19b642b87b4da6ef85729ac51ae7aeec435d0e711b46575d0e711b96c518637ced1a8466be6cb851d9a4626050336802d516dd59d12035f4ecb0a80ec5a14528111a04ade1bcfa21ef7e64e22cd106bacce73c6ccae2220bb3349615e2ae9dd910b142ac1053a6d3a59264579e5de9d4d9552bb2ebbdf75e95ab3f776d6f5921b6c60a7115175586a0176218e6a2d57fe857ece9bd9efbb88fb7dc677504cf4d93297fedb971a65d93c97fdc07deed4674872f2b535b0c55e3ae7a18c891016d8b816a1c7e9adf8d2aadb4d21a71adfee311bb4fb481df9d4423295251e6667d0c63da7d68fd5037aa95520cd74b2b0f0ee363d7f796bb246a578aebc624ca57ee3f95281f9bde4cebbba773e69c53a45de93cdc156dd4255de62d77f90fa59dbf328c612ef45e085930ea34467f776d376436bde527faa2bce767daf3f11663dcdc27ced8bcfb1a5d494ae9a6b951d9b84f6dad7a7658eeb355d35b13751ff7e9dcdda74a206edb729f6803c670fd65abfba05268010a06e802e6d9f9b2afd87ed5358c1881a8696406b512757345e3c4c2af604a61e24017b4af3f797cc51a618132a55e23730785dd33c7c34f1115bde8637b806f4dc722b005fa3524fdd143597a28633cb67f6fbdf5d61bb57bf1e4c1b6a2f0ee32f0df2be3afae7fefbdf7de2be3be0cbff7de0bf17fb17a177b1145f1bdd5be7b577fd3869d57778903edfbf067df55b471ab865ff7ebeba7627a52a1e14576754f631a96c81ffcd9f477c8f0b2ba31c699647f2e63842b3c793cca18bfb96324da90efd99d3b7b06acbf8a25c5926249b1a45852ec14c7c7d78519e2d6ea3bc6ffdf69635a3f7a19dd78aeaea495524a297d7ddab4cadcc1f82bd6eabdf7de7baff6d934025d905ff61fe6fa9b385b946d31c6d34945c5489c21a261bfcbb03a99802ec8af3f28c2046ca1a63cc686da04d00f600b55c7716a989d77e9e71a35be460d2670b69d93055ba8f533ad1fa2f5395a5dbb7e9664d720237146bd376793e9aaa87c3b686c8c6d31d8b983dd69849e3014adc18235e0430833ccb2ecedd315c5b196ea50d6cd1ea3ff92458734d5c82a27c7d897e9179ae968c15a580bb74ca6153db20aa247503aa041b4cb4141400ef47a994c4e755874c8143a21dcaca07d2587e9e87ab1c64f340621b718aacea4f3d06aad1fa55681ec48b4a1bdbcf7debffa2bfd35e9ff4eeac5f8de2b81f8fe5a497eb5f96a8092a5460d1595ef64ad538fb1d6ccfb6cd892aeee539cfbe32fd7bef533f9196db9e65e777437a55abe927dbd1f6db976fd89aa1366d799ea2124e30bdd2b979e868991c60739a27c453efde8c3572eb5cec3dd79f627ff6697ae284eb4713f521d59ad53d6fe5ee89168c3bee4aefe286bcbfb517fdac7907ea1dfa64d4119e8f317fecf5bf7e6d812352dab7b74c7ebf2294e9c517f6e375c6abaf253952c219a4d8ff5f72792fe4e2a23fda96c91fe6a6cca92f5de7bebbdf5de7bb34fd32f746bf448d7ba2ff7a0edfafb0fbfffd76dfa856e17ecc3df3d8e317658f6d9839bd2ac503436a462606e543659a5986a9466a2686c98a91933616e543675d59a34ab1ae6cd544d9bfa1865519d573f7b178668646d6aa2476ad4b70553509225a2e891cf8280767d4ebea8a9d6bff7deaf1b05ec6bd7fbb07ea13bab74458f501676e99138a3f62045031c91b90c5622f38179804989a9b54152d8759771bf527d352fcb5a5b622f314c7f2f74cecc9919d3e27326ce909aa200c315be18b3ebe3c9823fe3be2693bf669018d11dce9999f2156cb21cf3177d7eccc3809fea5f2f8797013fd58f51ffe4b1dd62b01a879fea6398c52c66315bb361987dfccd2011cf9968637b8f31a27cfc18638c283646ed31466cb17b3930efab41fb4efb91f6258ce7768befbb67c38c99325811bf21b2b19f3153e6aa3666b7ba7154616fed7f93488cb72f6f248be97bc024981d474fbb8763071906084cc057e6bece23c658b33f7f0d63d88cf1157ffc5326dac01ecf2056d32e56db2a70f5e7da3b4e6d7ffcf8b5ac387a7bf9c96e2f7aefe6da8e4cd148a2cc691ae5862c5facdc298d3aec63606ff2204c41f14e3c8831ccc69ea4bf3bd21f8ed9d88be40e4e6d4c7f2ff68baa907eb1db66dc86e363d06efaf3fefc300a6a97fbf6466db74ddb1cf52f324ccdc34f32d240a03dab0722cd76997a6acd4f377e6adb6b7e54611446e9e6136d68db8b4bc9f017bbedcf0fa376fd30ccae1f8ed9f5716a9bbca83af1369fadb5b9b6d6e6b3bdb66d8bdbb66d1bb7c5b8c56d8775033d081159be6a7b6d3e4023cf3931468e8bf863dc5a344dd3302bc5726deb2d51cc628e51d33ec618352ec6c8c5c871dce8471a7aca9d5a260a498c9998d35a6ba7fd872d1c137080cafe70a83c007ff6b8e6bdbe7b54c91419472f472fca31d2e8fbd1d33a1d8a28bdc9d73cacd65aedca576ea3ca0d58d3d8f28ba87babaed1ca2eaa77051668646bad9dd6fe1401dd2ef3a756d13554aa2e09862b60ccca2ef5e996ef9a26ab5e91d2be9d90466c336b6b58ac25ce2653a601ba10b14c5fdb3eda4c63f6f6ab7ceda1c4fe77358534d51c863ddce4bdf3fecdbe5a0cc3aeceb00599cd4eba94342120502d1793962ba8e55ad27201b55c3f7eb256fbcb4fd66bd45557adc55f06f8d753aa962d9225f4127efdec55fddde7b40cdc4b4e7f99fe4d6b1eca0d99d35f546dfada5b9f13eb4ffbcf5fd3daf5c4b44b7cbaadb62f2d749f14fc2457387db63afb69fe741101ddf3e555923f16b6a494523ab12faaa27d28ad95efeed372b57c5e3e2fda7297bfdc87526fd1f93a24a6bfdb222a227fd77d50190a0c31c4501379a40f893c927dc9711cc745d7479804b63aabbf1d2f32c61c396472703972705c0e2e461a34974820ff897b7e8ed88a2eeebfe8da1ba7abfea26bcf9795f45ffe095dbb86bee4414f09e90f26d1b26411bddcbe7b527d91eeee77da76edbbed71d6bfbda5daa6dae61eeb0f269196fbf91bb785acd5f108f1e106011a5028140ed3ea6f0769cfa7d15abb635b0e6c0b9b3469f2846f870748db6a17faf7b3ced52b5940f4a4879bbed8db6cc8fba1f43852cf629207bdab790aa5dc93bcd16f5ef5a2479fe489be7adb5b8f6e25cf8710dae7f02f08817fe4919ef342aee52b43ded500c3155e3b3bc686395920b1b1d46810d346d6f8ae7ad2f869ce207e9a53cf5457ffebf48bef51eacaf88a6ba9d3dff6311e85c7f47753f892fe72a73f53edbe2b7ded1e85bb3bec53c8bbc31e00fa83dda7e0a1e0419822c38be14198d295bebec943f13a4de3ba9f9b16dfd29f5bd32e19fd6ef49db6a3b72ea39f3fd22ef4e98e7ad2596af19384c02b07094133a6524a2926594cf673e96e1c33d4d63a67a29e317366a6e6cc8c9933260fc5c32159505e96e448771ac3e02b18c5832fe05b1a75917aec4af56ffdecb1f65b043ad125fd9d48fade78e99541becca6c7fafb4c7fa7fd41a02d6dd5d64a2b1f80fd0f281f69e4bd399b4cffdf49a2e82b53e4c330013fc939b343f29312701cf617c7711ce5dca7ebdcd5f99250d7796b7b776dfed385b6cd7ddcc77d60b8506d036c98c3850f8f528e721cf7e29b52cad1e7709d7f3f66dfe23db6f65cce39e3cccd984eb7480eff8b6f4ecf2077f72deec2bdf6b1872e67adbf2863dbbaf8dba6b9c79f61cc311463c77d0ee92f73af610da1fe768f1c2d183335eb9c3573d638cd8e33c89c291c3365e60c727232532727279e09a5872cfbefa4c46242f9f92723dbd91313ca0987f2a62789f2c9db9771f2314ede74a2bf927ea128244e434dbfcc8db33943d24a8e0951c2636dfd17df56098e92204a78d808d830678b9e8d219ed64ae7410394d89b81c7862feb8dfa8b0fe8b12f8e582f7120fc035f62dfe210beb5f8ddf533679018e387263ff550ad8bd51f7633e7e10fe1cf38e471dee665faeba191344b64ce54ac517f73c72f6fe93c2cfc19f336ce9a6a672a9ba9d293febbfbe68badf62a92a5a43f6f91b4bfb26421bd97de9ea07cd7e6ac3fd336a19c9448217ddd6a4cc37096fd87cd99393367446e71b0056b0b9a0dfd05b788d905d83047093d3b011be628a166df80fa4ae751a3fcaae10c0cd8f5a3a4fe825fd4faf3570cf6e1964d7e82f9ed6f77fbfb5cbe1fbafa336d1e84299a57536ca6eb8daf870ba6bf9757bb54ad6d15d0f6941a737a24535d9e2cfb2c7b6f591aeca1dc606d2ece6e8caba8f4987a720fcd628cf4cf81634c4c4f8f7c2bc40ab142a20a089667cf1017b236be923d8d2915637cc830913cc025262679c9aefeb32b8ca7d08f5b3eb4426ca60df1e9e40f317da241b2a8c814ff377d77f452f9ca075b447ce5bb37a922372b5ff9e20ac757bed8dabee2aefa13508d7d03ad56b98abaaa48c4d9f1579795774c3d30db634caa45d3b269a9e24ab2c810b48a302b0ea424cbce4d390b344a30250260c701eca84305ba50e36d6cff2f0107803616006738cbc953fc01dc1e29c99f03c9944a06f195cfdf61244bf68ebdbf034996f8f294f8401e81503b0279ae92577e3de48e75148ec02e023714f113dc9fa77df5739db56a929fe66732699944a713e2c7a042000090020a326298504e4aa491a8cb216ed370865d5b610bb005095b802dc016fc07f92dee7a9320f670772b7e42f7eaf5ddbb18c8a71e0d5062817dfd0b59ae9d79c70f6d9708a1a4f5e35b1debc777977863f23763a41e9bcca9e57b27adb5ce497f5c2dcf4922edb90a4d193206b1c2d50a3fe3fb8c74564a299db3e61f795e4d0494bee0f39b1d9f44459ebedae1377b7a31f3ca659c2fa8f63781688c1072fc0f578f50c67b654d0a626e6ef6a4299235ba840aed9ed7424a69eda1b4645b62e76298b51ac534a374c366d0cf52d37ad39f1ad8d9fbc6af22b94d4553f99dfdaede37f79400b5f5d64abfc5a9863b5a9c2e8dd2f894524ae9fca8e57b73fd2590a626a1ae96611443a218a2694e50a0a9e1d32a510ed4c48150273a73ba6b6606404014e80bb8f3ad56f819e69cdab45725a8aae4ac520232eb4ca2638c317b0834c349e0ee01e8418725b4964e08d1401215f9a3313bd2b8cfe9356e33458efadb6169b53d9655526259b627083a1ca185655956884607bb923d7b3e690879bacd9e5eb3e7c3ed86c3eca9cd295fb2a7f485ec912f99fa31357aafb3a0e70bd9237becea8b3b4d9b6af36a736af709f99b53cb39679d3caf668028864461320101eb6bd2eae03e8c4cb3cc2c0d5eff7efca963cf8ff37f5f6b63e8f81cb1eb69d7d39e7a62974cf0099b5e9393855d4b5c905a308075a6a5cc9984812f7264406360871cbf65a565d29c2842960cb1e70e1658d8b385643a8b0f21a66f1570d7d04ff108698a13146947a30e73bae0d92f2ddc7ba2af31b97175f693b4a72deb896e1290abe504b840c76707c903a42904c315348d64298d51c78e19d8b17ecc52daa7b314344d243fc15082c991520de1f62d063fd16a27dd3901862b78d3a5ff9cd6626d9b76d3f0a763d7cfb2fb77467bedf5e2963ea5212084bfc209facb5f2f35ab591c9bfb78cb5deed3020118767676a4701f29802a11fcfffe30c2a781a6fc14299529af63ee446f45a6edd9771e842919f7d9d3e11598313872f849be9f648b0ec9f29e225f6a58df370d8185870c39fc0b73262620ea58f50c9204fbeb31844c3f57a8b945d2fa5e53a151034726fde8b72d1b8d826cdbb68d7eca8c461b29ff372a3da90b997edb46a36d34da46a36d34dabe456e2723d14f996d64fa163f19bdc9243af94d9f8cbafcdfcb3cd94e4a99e8e4e3cd499c5b46f92f6fd38e99487f26d1cd76837273a23f13e9b3c7228fe47d5da989ecd2056122bb741155cabecbf02864736afb92d77dce24fd6d7ace44157e89697c255433b2f1951c04919b55129c9b22a2291367e45097357eeb8542dc8ce13cedd26822c7fdd1983310984168d4a01cc7e9e4cfc484e94d99fe7aa47062e1669504e7a6c89cc17aca703386c332d8398363a7958f8033c53225060a70a3ef3ee7acebba9c459fb3775df759166917fb23ce662fb71b2ea41f85360de573d6b296b5ace56f91b93477d65e24d22dd2253ecab778a97b944731893e8b649c9444a4cf4cdda3e81c6de4892cc9ee3539faec71f646de17223dae1afe41e441c3acec127a1a49d9879e87af645a7bf932d0e02b9dfe7aecb8a17cc0889ee4859ee346fa13e948a3bdf6f2638c4ce7c11d53bec2bdfc1824d6f88acd51bb2bcee0669091d3da5b6ffba869404b7654c186394a5c5bbb3fc8717f90c76a0ef84acc808e0decc040c85f8d2f4ac03e2bc7fdd5d8f28bfbb37a06d9a4498bc3e02b7125cb1ed39c24ace41775b67cf99148b4f1159893849b2d37f78933349e415afa6521e8b1ebdb3749538614864c80a9cdac91341e44a6fc34a5ccc67d9b94f9b0d770f6533ebceec2fabba25cffe4e647c9399f7810963c08451f9fe4b9e81dfb38d7c4e2dbb931ed92f517b7e831adf9ce5302116997fc58de989640eeb432b52f96402a55a92165628c51933212077f2f2ec2b20422632410298323814819192381441b1047029140e28cf911e5a78be9bca27145994677fa99fbd61a6991febecb5c8c303245fecda696ad1ac6611cc661eabd399b60b6a4c1003f8160eeef4a190944d57949880472dfb66ddbb66ddbb66d03f2d3f6e3a79f41a8542db92531643405000443160000300c0c068382c134109410683f14800e6b9c4862503811c7636910c3280aa210420c30c4000380010419c5d4944d009e9ae937bc781ac10357a7578309f89433e01124dde0490e0afa5531af19760bfd4a69dae52cf2f554dee9911c9a4b70004f6c19e8c7ee3d2a67d01183951edf47ccb153b162a0d71b7a92f5ce79e0a8914a38623968fbbd18e2f61e6d74dd20d16605cb9c7723654d2bc5537f40c779b78e8f4b7b80a0048cad5a61d3841c5fd7a28ddb4b603d1641a007d81a0382ebddaec020feca596b2de1ce5988fcb5c190269e448ca14e5e88e78e0624524e6441641382732bc810e2b814ca372026b4e2b9c0b810164168811ea3a9006f363cd7db40d76323cadf4775d3ded468f365673a20b55d04dd40dc55d01de3d9c9cb68e6422dbc51a39c86686648b145ae495349ec8fc931a8a9e6b7d95f8f9ffd5a8cf9ce47d17259b1a919e6612ad94b35e9aaa9b809ca8ddee71c43721359dcf2f27ce8848332261979d248422d497b2d7d82abc86b7ce7815a8a7983f00a05c6a71ed4fd0f003b4b3a60aeabd4291e8607d04ce1c864f6c005769de42740a20b2ba89f4899ae633c2cbfd2e4712c420a2888bd42e89c2011e18b4228603f8891775558725b8fc836061359b178394d7e15e636142905f274ec3252a5a5b93fe00e52a295d0fbdcf5ab5680346f5596848b9c59ff439df0d86d9aa05361403094f3dc82306662b9580d46ddb1d5354cb0cf417d60c27482696d0ffc873c3ae7707582581297536c2ff3fee5be832ca4d3ced1a9d260832d97464c77a49c461e8e6cbbec0fa519c1a21d957251b4d3fe62cac68deff08b427c5e51905fb13ea0d65d208b8a7754413457a6863e5c62fb37a346a2d50892c7b5c66ddc6db2b8beff8b6cbf39c419cc947f2b3d805e57b8aea71ee80fefd268aeb9d669f933f2289a50a6293a17d8f4e32889eb047449314760e88f4b89f17a8dd007461245bcbbe7be08f4e68cf3c1d2e11566fd1fc195c6b2e4136c1193c89dcda8b3a9aab647850cfcb6561e8130aadb2ba037f956d0e1489e003d912405a80f6ebaa92f571223e686bb395bd7d5291199549295c684159a2be3a04f7d12d98ab299c87e6a3ad6e58ca89b4be251780106d3993ab48d8a10bf9e2f60dc72cda8c599594a348719a73db5ceb2f52e4ba747427b95049ba6115d6223194faa92f48fb04a2827c93434789d6417728bc96a7d069312b2507c35ec06eadfa8f6fff47f1511673653fdb5d8a3b0e44d788182cb42ec3b180e673735bba9015800b28e5f799e8917c30f68d48d5f2f68a21529057a1f58d0778e6c396acc3dfeed50005b35b3a505e7a046e201600a859bf2996a97ae131b03da6fcbcbed916b256688a8419d61b285f1c038912462c5cdfb22c0dca0833f2d39811d4218f9044c329f2ad3ac7509ffb08664955e415e98e8085551cf02794ba370e064b5f154491a30de6f87f7a920a44163503bd485d527e433d149abdb1881d971e3ed2124408a7fa901bf38ab74486005875e9361dec96ba5b6c50d562b800b64bd986bee074f41f97d907f9bc6d01dca49a9b1bd2b639c56de179a3dd61ca4f44ac1638419ba404fa784c4c25eef220c36d9558207e4dec1a66e741f049c582c79085d1e78fc7095646b0b3f84264f9158a5e017ac1152ac2f08017a90507e6fd4846543e598439d3f0454aad144512c58262412df4c44812f743581d7d4104627ffb9ce06e7549c388be7510cfce1654015860818c236628899b59ea38cd3441556816e005d69ca96871585555e986a6f2b01d46be7cff4af90dc2d6abe510251a11c4bd97884c92fe0d3b550e13ae3bc000ac6c4280957132310a306be22134c78c81a100436407cc2cb3d1345d28b9801605e924aec5ba8e2f4097ad11483e3f25a1c0f197d198e25bb2b1e5ca136a66700a53722600f5ac0c8976d3800f0579b4b981657ec65b129572f064a9563ac459d8e5b17752928e8fd30888f41630e4fbb783e098cc2e2c51f95ae79cc6ca0552f0cedc1583043fd33c4a5661ffcbacdc204f49bcb76301147e2ac10d4ca72423cc7ce24b5e1c6b5fb6ed15995e48881510073adb2a917787503b89018374d92430a529a56480634ff9f56cea934e22268c6151f139c0df8095a1cf08d6572aa25018a0b368c84022eb5c239d329fc872449b71c4d45881a175cb4ef54dd87c0d7ac4caa11792bd8602678aa4a013ba2f8187d5a1ca8eb0ccc55c98fb96ef87745351bd7ea386d602d005cd6c664a197294cdf42b528f01619df13adfcf72128a26d1b7948b8a08e5ff876fd222b0ac1d3c629a02f906a0e6a795d9a1e25c3cee54301a1d8635016f7870bf752a82848d0741a6f1a8bcd06d18212288144bb9c40110e8a19118413c0f3c9d285b9df8007bf9444a04d572051460388db8ab9b1dcd515bcd192cae933f40518c286249c6511b4026bd2e293f2e4b89e04022c52b31863f172380650cc8a0633c136ea14abe5c3d08ef75b55337e9bce019c318941cadb5e2dc9d54fe93a914740c80f3cd782ef0442979e38e81a4cef102c501db9b1e07784ab6d997350c51f3f3cfb4e5968b99d4ceb13782a3387a2fb85edca6767231bc5bf5a8ef9878e28024c64c36800ed9161df4903adb2bee3453ab49ad36317ad634f532ffc3fe51b65ecd7241c01b1faf7009ce581630bf310948366a07c67c09606bbdbca14ff2c9efd21e633382f48830c8263d764d89433f100ce94089f3439d70c91018146a35dde72384a3cdacae922e9bdf191670a954d9a1ae534dea7dade9a8057d9a4e0aac89f494aae6b63d16c8574e02c680288042d670cec813b46ca6e2e4dc9c1d87abae14136413980dc889498e894813fc51f252d0a85eb28962ae8b4d3631ecba08c6e9ceea2d394e4752e915c94fa260145e1e28acbed80536d07d792e3ea1ba46b7664050c8a3fb8c806c3cf15db8e59e4d6a87832c65d25114c57e998093c62db28d90aca078871892891b5571304d0e5080082d009d85518013b40d305e82e6c8f51a8e658e9a6195fb18bc2c040b651e1d64dce9f30d0c700f71b102e812013345f48ad03ca3c87c4c120e29746604cdf57a81c4f6475694b7a283726ea8119d15e3847de3336b592873f3161105be1e6415c981ca475305cbab93d020d6fcaae06c0b6bdb17a884ba4dd0500edb15e62f9d2559db543d08f36eb060280fccd062f7394737c72ec8e782994a2c4643221faa003368d8ea757acb0b2a458eeea5d630652d38e5e7772c42da5c31f6ae2e3a9c2bfc3fe262f2ce26cf567c1b0095906825816b9a307febacb0203bd25640845b8a7ab9cc058af37f90c81c101f96fcd50b362583475f91b9870b83493b26486b88ec0400c92ff573b294d8e827efe4f6444f9718c25d314a828a2f16ccbf6f5fc501478fc6357eae3294acb060e359a09bbfb0b144ba65570c78248f5ca060123c2601e2253ae7ee68974242465a08397eb53c1a134c07565836e4030c0e57c2e1fa24377d601e7227dbfa7bdf14b12b5d920d468e5b9cd92d027ff36421801501997433c6e59ed0b8b0a963f4eb7ef099fd912a84499003351fc5ad613110b5d9e904b583045c96dc933694b7ec655f096e7ce03f64b1a5bfe3d61d41b9ef3f91a9e26dcbdf46e3b07a021e99ec1fa1d622dda159b4b426370617a2f876d45a48cc6e0fecabe948931e92412f732b93261ab301aa8cf10d8ed1883cf7f82b0379b99ac20f7521600611ac33afacbacc21878f07d172345b41b01602cb4234ee0d36fa4287e814e85a8285727d0e5dc51276583907f81fe8d7cc2f3ddaf03e7af5bc6d8c37aef4fdecaaad4e1ec309505453cf85f516bc2c729e837da46195e83d78ccd006a28a7ffdfce6e5239fdfd33a2f05978b08959326d5e3429285c1e1cdc1be93177e4eb055255df1b9f7d90c7161dc11c19f2c27fde3bfbfb644173480003f802ed65302c39cdfbcdae378d04f9cf37cec6721eb88aad9cb5e14e7f2f70b252dec77f675b119106aa8adaf81785378f6bb1ce619d8aada05f165f01fffe8c00670fe9b6725f91d989be15116e64a6c429425bf532c93e8543571b5badb3dfc81a6830f2e116c28e70e444645d5311a48511c3c0a1c6ea79d6627518792a3899a06b241ed008c80fa307ba658cb59ad74b4130858a031d028b4dc978979a5cf817507bae3104aa0f5e2cb4bc67c886b51276a941e7c064e97e1ba61b1a14cf1c70c02a4e635c5745f857be48b7e7fec7e930bc797b32a4567f26a5e945fbb336992035272255fa327266f416631698fcc8b01de64937e4bbc8e54eb5e042679c558387bd772ed7d1218fddecf289584ce576869cf6ef2ab06e22ca3998cf93a1523d8adc17bebbcfd317bdc608709263c162d37bc6a3a0572e265dea967fae5a94402a3dff01533280525037853c70bf6c9046b8de916e1d96e03302957a233f4cfdb5e2552c5a4516896ea2cecb0fff2e218333e445434d40dcb8e09d85e02d990c1b51ee0341392328c36ddd9cc3f4ac6e2246323c5c9ed5d3c0e9443b63a1bac9cad474a8fbbbf2cc87eaa3ff41593c704bf966efa9ddca0ab793d7c00000effe72a5f659d3a6a1a227af2cde42771ada52a956dc514b3280d0a567ff60f2c001a5d1fb80f53745e1b42e170065457dd1acb1a1ae6de57ca28cdc57410966f63b8a002b0600cd6f68e434464a365172e0825ba95d61d2d18348f85d9f2eaf79f6946b0f3701a80d3226309a8f36be08d3bb860da6f924798395139c977e908e8e0a9e4fcd41c3000c5c1ee8800db26775c414ce3def1834d1cfac0de299490ccf032b299f0d6b064e93ecf32fd5fdec37e96305873ed151c1a00bf93cdf4083b9ce0dfc3c71657373308073e5921154469572a936fbdd1708c1ddbd8bdb07f03dff6e1cff0ad7c6f8bf048c4077f110323c70da551c0e7155c2c3656feaa10bc1a22288011437a3be26c345858ed6ce4d6e2c86902a744def825857e4c680c4991a78b291320529390a88ed44cc28901fe69358e13b1ce8bcb00220e040776961400ca3252cab4ec08d43ba8ae9a3bb432ecdf543a391f8a54b0c087c0bce14857acd5c9da44c290d101aea84aa1fc1c246795e012bee6ce33378daa4cdb5f127706ad35f6b8f92077fe8a99586050458b4c95d2e7f8d7a320803a91d8efeded094785b127c0f00ab417be24a19d3d3139100e9093b911e48e7c9a19e67fc2b4f6b03e63392b62ed71c349f2ac7927cea85ea2a146cbf3ff025b945d87d813a970d572b07f87a1cf753a353b0e6406d0bb7a245b248baa1e0a72d03efa630c0622c3fee7f43f283faec6118c1c9765455e2295297c307b2118d9867ccefb6a4a7e04c648270b332137b3b636d162f4f1bf12ca7adf28520c0ee63275044446a71bf4cd2b66904e296a8f44b8b1641985182769ed37d4412740142e58e3cd8fb91cf93e56e8bcfe44d50a4809eeb71f758669ad1ab6b3a7a222df290cb0b89bd3fb2d039879e99303507254f26574f7d86c5d02226e61a1cb41d0a4afda6b9a6595477cf8b62f450eabf3984e546786b4dfd3a70e486d8134375cb6e3417b244b61f36861494dcc2d127133881a608ef6a23ebbb6db7460d24427f340f25c8fa0aed29f88ba6cbac9a6f36cea9195a71fb526c4d00dabac6a49ba5a1c81fa168cf5efa70e92ba12023ac09c33c12157f5328ffd0a9febbf2bfe0f98524492db4bf262c74e59a35e1a95dde7c625d56b69fd805b85517e1fc506cd29c8ce5eb840d5ee5c3dbe7c3c11da0673f858f0c805229c95a58f641d51f333542afe610675086f46d2fd4f1dbebb375d4e7debe2c485fb850421ecda79688ed10991385ab3aa3ac412dcbb7bc067117fe440b71cc0203ea8e54916afa14931a796708f332efecad2dfe45dd59c3760400fad11f248bbf68e9dd7f5bfc8e2f402dba6555f0dff88165e69981f54a340996670d27c5c1b8323df7b882c369c216a8693ded125603fe09e5ffad0310cfba8ae2deaded880a3dd4b98a699c175a8b82c8646f8e69abcdb478c5e24e83fa87248ab6ead3d1be6374c08568f4d98ee02cb7b76dc7409ed85325251b20df53aeef064cd601d949cd952c9fe7792d7457175b48f95a226bf15c46d6ef54a202ba44fb0ba8e28a4f1a6131787610b1360412d309538cc071d432bfa0137af536f26721727e0888178fade22776b4d949d607fd3f00c14d833a4dcf04332c558c45c5736181ab09bd88c5aebcae9b40d851c543eb445e495776de9abfc250f1d5449ecd5d50233f8a0c5594b932d6e67f45a8d412cb4f5811ba77e3da43350e0fe4a8251040f73ae6489df964f9b282a09235c357449bbf5e7594db9a29554b12b20322dace8dbb3b0776987706f98390d9ba58d5e00d6c1c280f688f507f1efa79c8fef50f761babb6e9cbffed9b0a7b53c08ebe9c347551b6fd03248c2a6cbe98ff93ff4bd34b85bfacc834e30379950f5e376f9f9bc98448d7965e178c9041b882dafcad7f5e661eaac13902fdf1f9a97f9fd41a2c7cf4eeea33070dae5c24b5a727bc57267b196d0d84353fc87a762126bc4e8ba3240df0b346d859118a58ffa0a16c3a97afd0e530fd0f5ee9141fc4e0149341efe6c680ebfe9bf27c13354c1c2659748a9ea4ea675996be8795b295009c9dd4b53700160ab3873dac6475c2e825e282e81938914ed3eb79dd12659cc7c5955da1b2e8a0f851af995a70fa0bcb51271b362c28868d38ab0bfee4c8ae58494d5c68d9c8d09979192a5252b43ea720e60037570482f8c71b146f1bad5e410cb37ca4f119be838ed9523ee3358c1e644ad000533e3ed862ed24a963146720ad8514302e5cf9ebf9f368643372af3e7cc9ea3790cada227eeab283f0ced63e0ad310def512aa3acb00d3e98eea65f605a19866e4639d71a62e891973735079047123a200048610706641872073a995735ab32aafe494c91e2abb8c58f8df8b4162c085a5a7beb3589276a38fd50455bec17c550681d7a41fdd50e1385f1504601a272ad1e26e2555c65c0adedd7d815caca33ab72bbb8c164b5c32e003072246594eb044c5500dc25b5bdadfd4bfff787f6b10cdaf33a630b73357bf53eb0e429bb323ba7bd1aa13408f3c721c9eee283b449f8eddb64e1dec6f989084a2401b4237d5e281ec5b4bfae450c5ab5687452c7e25957993813fb2962806629cb933ce86d0bccec07867bc865a29683ceb8cf955b3816379dc10b1c73ac45d0c965efcd744c54423f9327f46b31198a317645c61ef6313b6db2d77801af3a5064997aa046381629e6489b01f3c26c37a9e38620d45153f7f469edc2252a42e31156ec51166da7efac465dd9e8963dba96253f8f8882a340e29fdf901a28431e9c76a46ec59d2946116003648f0a0c15a2fa14ea70db1a7488be8742ab8946dd23cd557eee1962cad90ca66c418da2479dd52fd6c55248ed8905217c34f0ba2a315c4e7069929d09f7fcd8648b809d620ae911173d22ce89fe513e7d3af5616d0a77be3ae42036585013cc16e9a6a69a147e215b0889040013568ac388a8b069d42539527b88eebe14102a2615da033bc5e505876611dc1c156a045a55d8c50a794f56ae0d13e32f87c7f53ec86bd0fe60640233175298053da68b2f0df97c82eb26594980fe42e0886ead93225d23d092f35e013c1768fe7336fea15c6b52003341b679d3bf4b61af19f33b542d30ef87c421a1cdbc72cc0e72f38a831ebef9406a0db5f68f24d900901777eef6b918290d4dd13ff99cc7f8d20f4f3c96ae836fdb0bf65af32d1249fa10d8ad1dfb255107b392dc4b6a6911d2a6697a55374d6212b541c4dd5898c6b221bd35f4d7aa3e59fcf406481fa942f5b9cbde4d784a75baa358db6c98bd64098926115b946e524d06c8b4c4b3801ad1e9d3cbd21028e7208bf534993bf470c637537507319bb230efb7225b957366f782ba8e38e3de6b66fc31a0968ea8fcb8569db5e913636fb05301604ac3f02e4e177bfb502f5af9a44e9e906fd8a3c34a104a608962b989db84308e0a64ba2559a033dcf6b2e1d1667609ddd833ae54a269be00f98bff8dd150521b0399261c9738e0a78cb6378277858e3a39c801dc033898d0274e9fc95fc9874e9dda853e560b319ab1b666f9b0ca33d22217130cce1c4078fa76175d1f0910eaab534c1590d54a51923a766d957739806301ebf4e259e62c1cc2d9997f78ade6d8f18f227af66a11428d8e91494e83c2bb493caa1662476c63ffc629d4962e3149a3029e2b229791c55741b217c692e6c835502e8595196240f698211f30fe0d7cfa29018a8ffb126b3ea814ccf7b8549d5e56c898c0e11319fbe8f8dba1779887ad4acd46813970311836e5a43e12154f0300676f75b0b84aa65f9e0322516e5136f338dc41921a40b1fc25fa3fa40de0a2d23336c038175263616b51d97b76e1743ebf9cd1359e2e37bcbf22bdb153bde2924b611e915e853fdd3839b89818360b893f8e62b8b4c13667fd075ce6e9d85ed0ac4df8a3b7300d6b3e3222efd6865348d301768d0280cb16d39071c5237ba91d315582b6f456ae52775e834e54ded2fe195044eb09306c56840d952f7d5f6d947aa21bdc491836df80bcbcc8381fc038d6ab04f55e1932755e05f3ce1f50e60feaea6980d6dfd5999b20243d40a8d8134037b0d9a2903c5c24413bdca7bb8a0a4236025f1aeff6267bc0dcca2c3f4f647800ecdff8b372cadc1f03e3178ca681210e27c3f4846ca47dbbf878810ba3afae7e158c2f183bf62419750d69f301e13ff722f00972504e0e213dbe76db1f37eb0f3cc280c62d23666a458c185d9904b6f30e7e74bed6d10d6d992605c24ad5d7845d17dbfd46b58ab109b3f2f2dac115c0cf2d7c944f1207d9dac85f7380cb017b6a4875c33de9fd39bc6fe0783102706fe07fd0762609f52937aff5a351a81da9eb9cfa1e56e868718d33792f932777f1924cb7ce6eb303e049ce04366b70839327a25d74f22c8da50025b160663d39739ad5664f08bb834f3ae104324b34c2be211afb0659c0c14ece5dbecf3a11d603ca08d924d48afd8c08b0109643c30e1944df3bb6e044053ca67ddfc69895596731f0d3660aa5dfe8ad0ec5dfe0c6da03e165c7d75c110711bf461c5985aab454264d328e675a582072228aa500b01c6d37ddec6ea21624f4ee3400afea99d4033189f91ab7caf3ea70682dc8944f48637a021b9c3f72d0c7f51a54ee5f79279f83f6e2d50e61dc9891eb9121131b847bc8c8eed26311160021096451d0411d64ba9a1df45ec09dd8dd8f714d93d342aef5d670c84931f8ae6c3793f320d9e7e7a58de47f6166567cfbbaee84b0bb4ed10df3bffe9ef51f11b3b703fb1e904ece9d126c47451642258bad282e0f79eb354e1264cc06a6674f3b0a579fb03fef21b080f9947cb3677f05463f32ecc5d0b55cbce42c2c6c6684da7cfa39821198a99400acf092274b242a7f4cb2c2a0a1d977862be3b5d430ca20c49c30ec00b66dcc10cefa23a900487ab44b50f4d87b145657c8c668eb41db85f0294934c1830bae34f509c7afdf2d9693ae4a218e462caddee17de29e9cf65039e4c8f942fbf3ba3297ea30f63c8f6125e52da5db879776ceb30f96367609d10f91a0bc948cc194ff58ac22982d04a25ae3b512da6bca544d076e76fb0945d9fa99226a684aaabf813eaa524c0e597b698c708584f428ae2a4a4108be2c865b8c0cb8cb36552ca96195433f92a2a232c58da642ffbdade8b7622bef12029902149b6ee9fc967a8fe79747336e1da12c03ec58d0a0e4ef7c3a8e2ae10b9da0bb2c142e6f587e3946e188b5fb22eeef6d6b6a86b96a1bd34528ad603d7ea6d392fd51299aef9265c86283e09f63db5e1f31ec0552ed443c88bbe5a100b3ac8b88b9059f55c0e23b3a31a8af40bcba8930d0b4a931a5845bf98e0394d58211fe52719a0fb878fa58428c0a5bcb2912424ed103a01eb578b2fe4b0e31ac56c8ec346c2bc2c49ccc5201c2a7021c96d79c2c217b621b0228ed422c1d56d409a8defb5927226e1b2f6013e53c526b9aa133e5a3e1e10f9c882dec5f8e91b8a344215d70530dc8d6856825b568de07a4c474b5ea1829a43a9d339a4ef5f79e548a7575ed57fa7cef63a57141185335810ae772cf0b482013c2a6253068f7f1dc1452432541a28488f7496cf967ada2990061e5e923c854348dee595e25e7d9bf077e094cb1f5d9daaaddd79b16efbca61ea9f6eb2a6935a5026c98eaf4c64c74f20e4965a728d4dc07fc68374a558278b60513301951fbd84550ae7523ec3ca2007b35a0ecbd0a0221afa2a7696e79f08505b7b1130ae967b4fefc07259b7b005c56ae055a48630796aae7824c446630ee17660cdb60ec23b0fe227b83804491ef543aaff88650920cf499205fd9d078fcf5b6f00a4081c0f393589e9ddc24625c18927674e2490bb98495fafe1180deb997a2f2b70a1e9f4db51697a8a5256a7aa08e3fe4f14a43fe3860b6cefeb919b9c5aa502ccb1e90cef27a730ef57dfba729702291f45acb0b2f7794826aada2e0ba64a9f2256eb65447434124b3514c650a7cf04e174c54cb7a2fe46e7cba2081f18d92cfd81b031b025e8aa470f4cb537e34598b8da7498881a836342af0485d4f87fac3c071cc870f733700440f801b1d0d72671f4bde8d2b5fe516a8494f26d02a230f3fbc6343b23f4e3850b6c9ca4ac68844334d71525fd640617c19ab0ad79853c6ab7635b2d68167783f58f0215a261a42c2411eef14e3eb89455fa99244ec66d2ed19135f3bc2951efb65e1d6883e580fc1f66cc857f10dc9ff572811b20ea716924bccab0ab6214d0862f1574e1693d8dbea5fab01d024967dcb61cb54ef8514c2e84149faf86c73ae579f3a4a780486dcb03239cb9d30e370f79b04d9ab0e8e038c71460c42b6958420f3c8aa6b52d409139ec9656aa5d1f4a9f4bb452cb148483d9d787689bbf347310ae7e5cc20fc4bcb43b0b91e4e45a73f1477efd95b280fb1195944554efe8937394bf39d49651940bcaa0e344b5a41cbea8d0d7803a9c1231709d99bae7555b2b3a1a47455e8271e9ff69ba9c905e9d88fa6fe1eb290274c1d648b5462fc3913287de4d66091986cfdbbfd0140f7f17862f08128579f9cef78e8b8319d09aa2ff2f33fdc587e95e7125333913fba1d514ebddf12ce30a0089f792093785757b2fb23035c5a6f09214c5635b03668b9ca09d64d25b144d35c5babe0dc2737e43b0e79d85b55c73f127882dedbd37b99f0916165179afbe8871402f3c1bdec03f10f6bf144625f4e44b00054f33425e183be9afdbd41a7c55acd7061358d80d3a5ad88ceccb7eb759b63ad9d04d6bec0e5e807b45631fdcbe95bf0c332635b1aebc026369511aedaabe3602e8d76a086d770e0fe1ec0c7b4e7fb22eab95c8124ac9ef4980e04bddba4fadaf8903ee09dc2e1281eac4d805cb638b7315455c4c4fa200db80799c71ef68f95ba4730d0c3f6446f59286e409e210ca8add002d4bbed6feef39b1c62cde0ce366d87d99b5e8160960242cdddbb26d9031bf94e8594f4ad81ae9e2e05f458e1226da9ca01b8501b20339fa1331ee511bf321680d03ca5c50c770cc0e8f9433cf4ab34c5ba1c88d7fd7e29a884a263dd7e4c39ee2260431107bc317ba2360d294edf05a84507dfa524e5765028eb7a27ebcc5c714a30682a5e8823ab5072bea04a5fcba5a31d33d784386cce2e30a2e7d143738b1fbc1a0da568ffaa424f78a1b01ab44a41d534e853f3a791b36f724060b8e17208cd5ce3863b08649f0c610e589bacb0507b95b5a4dcb0c69700cefdaa58b9d629f1ee1d67f36bf5c67ce107a99529e85395de0d38cd408a0667ac9976b5f90c60fa29102e8b0c4aa0469c3af340df20b778c9d4cee441fad17ea68ddfd87a1f2ed22b4130ca603c64b56f8f1120be2945a24a3cb4fff41acd2e313a7a56d12040f2a9f0aae8023afdac68e8c221582e5dbfa7a3b8de522295b40d7735738925275b3794ee6d3d31c776fc4ac61117e590f54b217293c1846755d69f3d2eaea4b374e800dce66b5a3f064da6d69731e4148764cefb25f0fc11f5bc4ba71633d126c7ad4b19d8376446b643e1dac0b6678af3a851294dff6d58edfc381a75256b303024751a4db04f094c28708592f4d686f3e6a3be7258c9af775a95b389415c38a6ea2c8d90638f303d610afb412b7ca02d3d1f46da1414ab2ab2b2574cdb5a3c6be4ab51545b4ad744aee5ab14ed570ad008a701e4b770d023c380537df77db247d8ed343e92a80adb496a6f69851e3d9789d2792bf748194feb199d4e763dd661dde44e3d04cb8a320694f206f64be57ac3c6a191ebbcf278f6d46f442c9dcbf6ec7f8a6de2ca94a1d4165e2c668e512d7eb3134515742854021cbe045b12071631cdc2c496629fe6f3e7ed83ef4e6e00b8015477c208750a60c6e5fd4e2ddc02b1971845b631e757e05abc4b27bfd15237166cd1045a4fca513b740f5100c19a8ea2b8f267b41d51f0c371cdfa8172986e7ba8fbbfe026923683b26c41a7802bcd62f0e39f9321b193a78aab33d74446386480ad1183e153e34c6e777840797f031e8470c8d41885c91e01b41e95af6f4d052a50b3979a2ac6bddb3c8df481184d566e0e1703434cc32ec7aa64db92abb6fb3a358b3ca8f109ea911a897bffbecff9c16b18cf1f60b0aaa9f1d33e904761b4b8966543aa331414d2ee944862c8fc37822c1570d6a516aaa78d4e2b6ea1dcb66b3d48a5673769101a2002fc0f828a1e06def6ce14793d5eaa141ea05133b7211af01af34362ba5980ef79ff28de00a0ff0991be9f8b3e94032695883befafca53e62dc48638c1ba262abf70177fddccb7c86f531ab003233e7541decf30023468d19e331c0dc045b293a8afa682a1aa61b65bdc573d7d0f5e0a7b43b59151a7477e60186ba5ef3ae2ee58d80bafab112b698fe8ed34e3ce9c5f5362a037a350c6e668035ea228c8257ffca3fd32402fe250d6791789c34a3e192efe6612157037aba5ec840ebf60255bebd7f85062b867007820611e55371e2054e97d24d02e64520c3c132756220214377464e2347b6f053a51bccfc90983824e38c3562b4184951b0c2452de940b7ac0c19821735856a3a3dea6b2b0248e51b4e39aa0a1cc504b76d257714fcc1a6df8910af4615322779d86d275657bb10b427390e54e0412d8ac38cb904f90345a8e31087b58ee3761396399d797a42b37e1ccf8c87c63c50322a8738288e9d158670302a6dff3f37c7d012b64e9c6a87f949062a7095ea4c921d37b55004c48e5ff4598c98ab3acb1365d31bd4480d17c3784d4fab0943bebbe736983eaab51526506e03091fa81dd30d171375ac0ca8994673b0937483179fd80e4abeb609c6759cf41a6e8f3782fb70d49039c27b54174115c71d7658cbf8afe816581732c8d37b6c1b2a3f84dcac1bac1ce3a280a411991d14b6e2ffac8531be4d16fa46081496c3c920f44a13285ea706644b858e0126b939503bb3ea2b97f79204543831a120be957d3c6370812594d11b6882c2b25ade175aa7da670213101702e1b24136a51653cb78ea6927751abafad8990b918c913a02e5e0864ba5decc35e06c553eb1bb265e6401a2622ad60ddf37fdce75163ae67ee475eb5741a89af1254f1930e0be5a067c6a2e4f78e2b44e6980363e7390f1be88fe487137ddae21eace5bd75aab85367eae51f628316332e28f30c079f6ecb3170be251202d5996994bc59632ab65a2ee1c434942e1f3ec105a2b32ff14b7624a14f0b03733e5ac4b59486d6ff311e00214d8127e82c7de4b018b46504b403475afb07f2f0223dc02510eb9387d7f0b785d5a5853366ec1b2f3983b9931b7439d429716d5a0316e7d639c8977f6b0085d0e38652c2260c6cb1b009eee5d9f9b6dd9ef2b3db48721270ae69524020ceb3ff5a0d702164c902bb244f7006499d29b3c23fe7a48ec118c0e6b3852097bcbd58264841811b9b9a49a4be2793b5639fa2688583287bd0b33febc90139a9a8aee0e123820c97c590b64c88af3a3484a965b4dd46d49624e56184d50120e585d5f0b071b25b2d6b5b4f725c3f91322993f3a300eb0360b8f53ef4521d102b302e93e5a4cdd7e2661a0fdd83407514a46a01436178b4e0e06733c9239842bb26e422882f213a26002c8c5e2e4dd8785c2a8274a8376cad0f81e4d260be94f094ac2490206a37b677d3128490d1e02280226b35866fc3e4328b1d413e03eb2585a9e756aebdb989b15e6f9ff014ae59c6d02e563b19cae031bb5d11b6d3cb03eb0d30eb72ae81a0d818cf7391e1a229e04f51909fc1765c37080f9910b6125f3130c562c41ce7cb407b91b65ac7d72f8f98e4aa9df85a34da2511a0a84b8623ff26c583630e27fe1fbb1b1559b90f527ef1024e687c4f54a16ea8332a4992ab408fcc878aedcdf081fca0a663817244c51a6820760526513aaf58f05265350bc904d4dc7a1ab6b99ca1492969cfba8d308464fc2c8ab6475ddd02cf6c52f11382d89c282c17e99b3ed98969fff7647785a67f071f25bc035cb8c58db3705dcfb8718d2c334a9c91f57f713d760e947df13cbcb5d5201220ed0927a6c8161948ddfb56815de1aa7189ca8a4271021b2351de2bb4bd352852b5261b16c41193020ee47bec793c2dda0ba6f513306feecc3d22c56f2f4f9d983b097c14a50469d00dd2f98589ccac01dfdecd9fa2b4d262b2a49d264b44828f94e94cbdddee617c78ebbf7f91150a5742d38c566cae596ec2f2be80d215e5e6a14dca44bffa7e09f6fd614f6b79fec675a04c911cb2b47ada1139058024ec5c4b242aa25b4d0447c82957e4fd69a1d3020cb7d03cc572bfe5835e570d76c683aa644205d34a9aa352a6480e8160fcb6682e8ea3ba5ea5c9d0c169dddb0dcc5b42b439ca52f94601ba17e23d5085194ad823403cb7273b857c3e2a8fb6cddc925537352aa23841208a8effa84d69a21a030bfbf8eb43404946cfeab12bdb5f143c95055c4a20c4b2c54e5a76cdd0aace3f1f3ff164ab8ffab40c0fa5a57fb921f0e61a3d84a3d57b27e9acb78337efe588272a02568bb7859336bd7e1f482fbe376bc2d508dfa7d2bf7bfb939c4322c9b9ef5b9b623aeb55bcdc56a4a160586850a6a23ccc00c169d3d5c58f44450c18aaba6dc6e13b0b0144ef07e4c79c79dcb5b1f6e413a9745543dca4358721780388d8b4f50e60b183f63210a3d5c86411470b1a3cf1c08b306a6471b46ab5e86893fff38b422a60042a08ce4cb8076ce02174d2adea2e768dc0e3190199695023051ae47aa5c320c2b4c2a60765a1c935ed5043a0f32b9fcb809ae20ed075b2c57f64e2a01294c08e477e2abf39b7ccd764c4e1a08f920dc12664850072f5d52807269f5e4dbfa408903987cee90123f86a58b4d8d99fbe4a3e6dea7f6ad7eb8aff800ee13baeab080e1c064420093c310bb2c58ecf87682cab061e3c57b0f0d8d49b9eac2f7cd6d162c94b8374bcce3a6ca1516ed122eedc04e34897085e506bbe5e98ed95972f3b6a7dcb37451b71334c9acaa05d2869c3312d13ea222a3a80e975723b4b4dc436338f3b014431b16d4da96a6a20ba7300b0b1859d3d26fd93b227ec0a5a8c2222d9f4218c212e5b1bac64a4c19e11aa13840acb46cb0ef8b09671b68c9536fea47bc4b9c312c9e59a6e307ac5216bb9723d8e1351aa9ac8108a7785f921256d18d50960a161600f34dddb70f6b37c2538950c4095d2b6ba94b09e95120260dc3940aadac94baa70768079140f44988bdcc85c5e5fd0eb4000585b8942951142f5c83abc11ba219dda66e2673f93fe8af665c2dd1910dd044bb50f1c3c21c958d5f0b0b7de6cf5fb1b25011d9a5841922c934a93273217aa6c136c3068b1c922d658c698232363863040569e2e6d85d3103c2c8c01ca33f104b5502f02d308e50efa68506a8da0ddc8ace31e08aa14cfffb0d9c92c53125f5be79637ee2efe0b6e017d226957cf811a6b4c2725b8cf45a8d1954078060cd4c55d868fa16794c67097fdad748ebe62ca4c4b8b0ad2e4f82a1f6b98567a9d90e24135ab8b47f4129c2b89171b1520416d4118e8a93390efb022cebf42d98d79fc4f82468aa4fc09b7310dc4c317e37772f9276512c0bca4c67d906e1380a140811e6d9cbd0698aba5a3284463602cfbe96b40145c39cdd0dc64402a7f66cde7097c0ee2ebfb26016339aaa34ef88ee6a6dc9e611db4653e7a4e756b4f40d3a326a65ebba9874a7912ffb70575c6cd5f0c37b625903aaa239ecba4429c5168ba6c5c874ad79ba6e7dc5e5578d27de4e6a0b91d9173078eb2bda0103453be4e21a65eee48ea338f0b1bb99a351003196f90a9a9b38c5abd02b8b4989354cfaca082c40c3a18cedddda1497e67b8789b590b982beb222e951ab97084a6ac2dccfadaa4f6941eea738e00326d9c05a23154d2339098732a10d980474138bc2d8668700085eaed2033348e61c5e969626c8936ffa649cfb53e31f329fb48f713f3bf849a2c32d177d9e413b3193645bf4f091bf03a11d1f9b25739009be5a51b8a4e99cccfcc20fac87a40c9c10e2c0eaea597ce1460e56897d476cda429e8045a095018d56d45f597c798c6c1d412fd7844784f67cf3cc2afc2fa64d30df72dd8b51ccbe959c7c9bde761ae5c20f78197fa72a9516a0ae38aa40be0f8b6406b3ab5538d1dc88e68e3a9e47bbdba86110ca6ea56ee7508bdd5f9182c2d3bc512bd20af37588b63630e11eb2e92c55a8c3a5411b7b65483dd62e0640de7f518c4bbe83110e41f2bd9fac0990c66cb047ca4eb582db4a06c197505a76f81447b0b151f9117b68e83ad5a7df39a1c679e8fba6070c0e573c24ec072228e75a755d1c87921d28aae78d8c77d509243e992706e60f2c2cf1e0b1fe511402546e831ae054ab8838be6a1fad66522009bafeba13f5a99b95c674de294b634dcafb9a72501b0e2e09064fec6e949f543db1f47af7ddd3d6796dd598f32509867e11429658d45fd00a19f6f73709066a7f9894bc044f73a25b0c1be98671fd317032dfeae7f3403861233683b0b105f14184436dece7d5e3ae8f31e14604ee271bca7142c52cd43ab0ebf96b1c15e5c110103ab87df01af781ad9e32e8a213ced2aa92cfd6b8a63e12700622d0f6f17fea8828803939b64ba7f7086249a617bf2126fa601f6e86b9fd9668766b8396fe00911b15cb40f36d514c158687548553d44a32074fdb30dc4c725ac8696a1b7044f3bc0fbb5a859a11c0853a151265c2727b2668d049dba057cff0efb30875efb8a3ebc40e9a880655f7661bec82e2e95658d8471a064f57d8883690046b071c100d3173bf108f95438025fa09e3885030dc02e6e4746db06e4e39d14a93cda6066d66729ad2f7d36b59a20cd312c3cff78cf69464484a33a21957502440f7978ba3551a23f303701339a88278b98550f23ae31fa234b47c673a4621c485dcfca9970ddaadc3ce89dfa4a09e72c233c79b89dd94bf2818d5283b4b678c585ece5dd4160a44f52d6ea82a67dab30da519d8edd61cbf28cdb71979f7bb6f92ca1b2f17ee4084efea009d51c32c8647ccedb691429d589efc1c40ac100d13105770ea43d6cb395e3fd31370b73d239401ba87c5c14b90469f304f29f4417bd91ab1bb941b209dcfea53ae94983feed4bbeecb08f8aebf1587fd0d24a7bed2e012a430c377b1850eae74738d3123607c0d21326733911733da1aa655fff206dd5791d119f86a132158091f1e77ef2f116f21f2eacb0c3a1ba55d0d438352f921ee1bed7cf361150267194fb71a38774a0f030994172b02e232ab9870e2e20b2690ce9003425b3441417ada4874dae3220cdde8999251b06266260049f1fb220390b39dd332790027724c7f018d003fa6e861b268cb1d29dd444f518d2d72f036267f354d11a3e5bda8dda063147afbbbe6bd81346cd12c2853471325b3f054c3b391001504aafeb819dd64bd70e7b97a01106978c840e89264554f3d5d6deacb561ce24196029bf29fa750738452154c5c3e510caa6e54574055e41fd329a4602f94f4ac54145221341ee66d7e5998e5e40dd00be679ce51ab4b74afce3894fbaf8498f68e4af9f1679703a676020a4f51972672f5af5a97dbdc5ed320fee34fdb11289529a1e4339a9071bced3a58bb7d7580c2081a10fd5d5ee704c91a4a5fc9d2a1f9c9a2343428be6529a54baa67423d221a4418e50ecf8956adac43b9c3e223542b6b46b9c37fd15d7f418b7963030ccdb9d0318e89140607f2b2130e8b5cc26d63c2e0e6cae6ec5399f96938a41a80418cb95370c0f3da0819d11b78777818b1f1904aa30e1f46cd21d30f526a4ed9236d6511329adf21232292b1f75aa016bda48c7a38eeece37b1bbf98e1b9fd2cf04157a65bd97545a1fe5eb932ea11ff88b10814179acc40e08aa832bf834366b08d9b45e8e01038fbeb21247df9619c350af3422bfef1c4be7272490896dbe928e27f4350d42eb5518d2f056a5b39dcc941f7d12d4518cdd6a3361fad4dc2d896635f2e0a9e8d6f440fa4bc65127b492e9414ef9084e921395882788ae52e6b946d586becd096705e01acb7c03e66e5affc24ed54e40b7259eb77b134bb86396b6ba4d3cb08ba3e2565851650244d065bd6689da06a18b90d29f589f370eb684c3292e30761645e7c02b3fe39a5d325899ac11419454fbbd02d2182abcde6e3b724f0d51feb3bc508af5e02e83b49d58baf3ee22a281f07d0723a44ff45e0ab2d85839fd335eb1a84799bc7afdc08d23e3bf5756fe5577c198389e6bc02046206f109cadb0798e36cf86acc9fbe1228a8060b1e4b56ef4cc6e694f2aff4669ce90f040b1e15161fdcc710c603aff90da55c0b3977b59e646a15030ed01bdca3f07902500a27ce5b8637d8defa6f87b64fc803122953e79d2eeafab3a87e84ba1887a5026d4f32fd920934270102deb8e9bf9654b94dd6e25dcb124e4bb3bbcd6de3c6403368e1c1e6a4b5c69de2d7a0f6acd10067f2bab388b04abf81c54fbabce355dba3fdea67fc3d77488ae373d27f2f622495a5cd147f8e43c0717287cc2448230d4e0e2f6b035cb941e201b70236ba3c9716cb3730590c3fea21280d6022dd3cbe050746065f936ff21d87d24b8cd87218f73715801e77e9b05f5d64ea611a6a03e42d8bfe7354ac356100b0851bad0754f76aa2cfda46fc460fa3876bce8e96aa68b7a74689e85fd01fd5fa09c930c07a3807378016cd0c293537407925270ab05f0ee3e0660ee2e3d66bbf4dcd0a399ea296ae0e364ddbf70e416681929bce47d0c18edeafa509b6932b751046d7ff08c2ed92668beb21fbd751a574178184f436fa199df311b9b46e7a2d3f825a68aa6d35bbb6914506e3bdae42d91619169d6509c95e53f4f4869f13cdbe90633c36a1c713e56fc6c1e7a39570cf47e04e61a034e91f4d9e415635947294f683dc6f6e8c47cc4371217d6ffdb262a9fa0dc2c310e6c16079880b37e2140e1efef81ecce143707dc574c589a7d1078b7b6e202672f3c73625564e532089444d015fd8fc60815bf3b099b9a481065cf450fee72cdf4c5ab87cc1f2450d172e41ee8dcc8c6cd5bd8fcb47110645c6692cdae6e5552e5bdbdee523ff7632c57a661cea5627d6abc3b03d25d9347748e933743a94523b2e65458d6c618b70c91643c1540e714ff414bec823f93044947fdaa3d8d692cdd98a31a6f6b95fde7211b453aa501d5a8b18b1955624b4d3bde0c90ca22cd575552a6ac4565b4cec6e26be4e38f7c56cc51feec239f169c414372a7abe578b8deae186014177efe397af23a107e00f2a6bc994d114323d1f284e2bfc65a57e3e567a48f7ecd33a0dd069b144acba2b6a159fdf143b8ef47b79c59b06f416da091bb6b782a8070d31f043cc4b8c3fbed3463710b313c320a6fbcdc4c057e1d0ca597e084b81002776722b717f3911ede5512ee87a51e6824135735ae39d64f9b9c5162bfa293bc3c60bb4d86f1b5b14f2b5362e1be20a3be2fafa58386155acf9be3d89d592348341331793530b288daa33fba0e43bb363527e997df8665c278a15f9f9707fc58634269981accc9d1bfb40668e4ab1af249328910f729d090177383404da41ed432bfe118c1efb76bdf0d8c57fb8d107ab993163fe35c51decbcbaa166b61220b50592aee51072f188ec639d0acc8e33b36b2d390859610012853cb3c15aec322f15317c50c55134813aa23c8a427c5373ab154ee0997135d6338927c6c674b0e60755f5ff2627bd38b1df7a3c7ef27868a67aada5cc5cff07606204bc8098a2648f1833f7c6e573951fc8f932d03af3c7f0c9cd3c7a3a5cc109d2c7f4b136e443eea1e0cccc217179b9e610ba6f4c6f008c42dcbbef9a80cc7354ad105971ae6ecd6742c43f237a80de6e8a6e1162fd6f2ba71820375e77520d3b3330cd081d85b58108b9596821ec38b94ee2fab81975ddcb7b84521cc5aa2e7edc58046b6da58d49e24d813336a5da71da1a0f1da3fdff3eacb8885cd1e63a663f7d49c037fc6001b02534053c5c62c7bee1ebf564b09f45470099f9a2c767582e04ce79b73e9f03deefe32be41bfe88378c1d667b4ec3afdc68f7dc81da553d304c4bdf5c089718107530bc1046e7d05c55229f5a80b78c729687f2027ce52151fae36567cc93c2cb3b408516e31ce7e9d07f6b7f7a592facf20284757c8bb486d48106df602ef8aaf54159b1a0240af783006c41894ca57b9383def6d9ad0be7ccfcc9d450aba9f34bec35e442714411186959505882c74d3faf427c950a58447324374d38773cb420073f53742bdf077a5aeea3c310594e32dede24b31dd9c8051b18720b3477c5cf03cb0ef902d55752cdac586431248f6dbb8e6944ad06ec6b758ba3bd1b86f61e7a9147cb57c35ea6d97a544695c06bde5f1d9e5718da32c0114ea1da4e65ee71c36ecf97c9ba5338c549ffcf102975d0182516904ecf08254e1874f124c272133fd672befaab25a26cca5d2b1422dbc02e3b7c848b6469d5ce3f5609a818ae5c30e42058527ace04c64d4dee44b3b399b16f2243acc650c8e7e573db1499e64ec884dbcf5ddb73bba312fa6b4820f272b03d97243b3a45262e169fab0023c365189a62a5bccfa7c29591116f89445e3a9634dc46b2ede58a96b7ff811bc07da73734ca91cb50a3e56d8ca0677adad4314769de7d026c339e2be76d2d55bb389b97aab00204863b6d349e6e263491b459363822a4b2f0b09eddfca139361393c4f3c72e25f796f2ab9ba32868b76ee09b3dd2db169bd242e7b3c235ff7275531a3541b69fa99f336cfc58e69f94c3d684e27c96c241d0685bcda1c7cb51085905479a4e36d629fac4d2efbcc958b0a08a5b9e3319902dd1551898394567d2a226113e661338d0f39dd39c0ad1d52d1bfb21d3bd24a70f217a0ee7cb613b0ca2a360a061d475e9b35769c41b65cee7be4fac4c9393cb6c43225e72031bc7f8099a3c0ab3fb8052479d15fe4789330b38dbe58be14796a650f6433f4032ef9f8aa985160aa68e014d8cbf2ad14217edbefa26bbbfef1b757df88523a93de8c098207a5a3daad26f5f39a9646a854b966b2fba6bf380b3da549a944d9e7c78f99a02e356e95ceed3df6b83ad36e55556f0e394563c00baee43c2bc9daafaf218619eb2ee95911f0d12398d38421ac9f5cfce9e3495b5974857da550298825a25bb8a4c3f8591614b04dffa0322952f3ec3b88841302c3eae3b1139556e4c761882974e0183d040e5c5876e9038ccd282b4da37c97907c8142e7484f5f52af946482da80088909fc87ee8a24117ddd63d53ee88f10000a97ca5eb302e04bbdbeaad5c8c8b58d09bbd41f934ac45f84e990bb1ad22ea42ece3d2aa448d513a684567c1975c49c2f3f0ab556439d6aa059bbb16cd8dccb6788068e4d7402c3247510e60e0bf5b7c128d6728d38fc0ecb37729e361649ae47096f1f1abc5d22e2f3df89a08e47256430fb9c1992566bf79f067aa96c7b0f594888de8e0c0a827932296f504c6b2932c9852a5886dfb0718def609877d64e0447ca0e79d6c8f80d2bd5c682fd0d02ba74b7d12cdd6195936585774d1e87967db3b8bfa790659cb79e563893c4bad5404a773ae92b5568af80ae4a22400ea24c8e5810a4f3166f8e199a0524158484649a4fe000b0617b68e0999f628f7b5a060973524b10ed052270afd14a881f5cbc4749a7ddc26067e2cf36c58e949e64507411f9106a64de8d1937723a3c2da4bb5dd71bf915b158e773541ef7b4e92a0526e30a5f9dd9fea6cb62166b79fe75161e8cf9502134b2a7ebdb1204c22933c9efd847b6ebccf4aef8d5cf41c570c7480c5c6763bc21b41bf8329d51e8f60ca0a5926bb7502d9ab2ddb191be0e3979487078018c50137ebed35cc705976f2eecaf17eada9dc076671d157aedce7fee512538f9d2ce7b85f2b53269690493d33768fbc904f1c9a5c935bdc36310dab24e665bfcb114d81fb3007c5999fe12115e6b1ec9419a593ec8826e8def2d22e1cbbff6cc2497b45458b77b89453379dca65859c0d226fb306ee5a7b31123dc333dba24a6966fc0e074fd8e4d61b68680ca1bbe69753b1a869ba5af6e0a70e37b7fc1c2901fb4301bb31623853d9ef708292e63471288490e48e8f220f42451fb992765bf125f9b86d78a756110580dcc7559716ba8e3ce6085411949c035ccc4aa9650dd4527601f7c78332044744985f7c91b7c7cd207bbcb29f743ad04517d72b75578fcf07b75b8bddb0684ca9088096707d2c3bfe6d4b8a0b6c99ef9e167bfc308d4325e94f44027607e1579954f48ff71cbe92ad3e83151b07f78e632ee616d4658f45a8a816c6b1440b79612dd6a5bab42739b71b534e0b7e1b58dbeeb5bfbc24cf7a46f6a53b41009467399358f6f2aed4e1d6fb3502be4b62459bf821e437153f96822acdd38f729b7b6548d8da377b5472bc9640674de03a42976e548691bb140dabccca05cc4b63afd4d32407ac2e40d9c255cd5d63de86cfe99142aa5cde6f975b388636a4d5e39a06582dd4e5795f220ecc07fb734afea08f09e65727179d8f38ef75d729f34321826c28864e58fb34d4989e4f3ce6083228b0e030fcdf8070c19393306489d9efa44f23f923efa295c149acdf38f37148062837ab0515d81420aa7066038dd8b4e28b0104ffa155e57d8046a9970366e60ff7a010f0897e00f558e74fba52cad005b677123ddce1908f15e0f2595f55b196f1d4077f50b58c04b99476504c92ec943e0d9acf3bad54948f53234e2348f9835827f944305cb0e0e1905d99556e3d869669cd8347f3db5dfd5e696782752d3030054613eb1ea6db57eeab6b2a3734db251dee4c2fa5bf9fca2b2e612fceb10d63534eb1760a09e46f5540abdc4cd1e9dd96159e4112338205ce249bc966bad60efd1b18769d9125e120db13cdfa64821e1e08f45a6ab6a1411a60e49d47875436ac0950107f74b62516feb93294ca4b7423589215a88c0147389b89a188e4e0a77e57f6aeb57a8d38d071a8ea30af7d9745d5964ad6ba017d5f7ef50b647f50ac13527a39b04c63c016b1f303289152fd7b91fc7fbccb87bdfea08fbadbac4ef555f5f678138da25eefed1e0b2a8d4680af3762bc02d74d96adf3babc1e068889d6d93181272dce6dbf15bfdfddbe0f63589a6dbf88f461bdba632bb6786a97966f5872d7c15c18ae3552e76517aff6486b2963d3380a745bfc39396e3d72c987ba0891fd77d141a6881b9ebcda68045fe38a9bccecf8fc3c079716c029c53792c24016caad5ab3b9a134f79c66dbce08bdfeaafe83fe70147a3528e3d1c88361b3f85d194aa5ed7cdb17adbefdcb5604766ef0f1d85ca54c4aa9f09a18d57d7dff069b1b9bb6b462301abef0c4ae34137a91ba6526200000dbebe71b5837dc79a0548a6dfd5cf59ef415a0890ff8aee726c2caed8e8fe83d88d9c11f772da1f8b91a61c69279da1ce367d043d951e263f4bffc8067433da0ce3ebd6d3615f3026077aa390332b8fb651a864a846f9441483a69fb2cf1285f8643684b86345e91d1a9250679e57475c864ca851b40d4dee88ecd01cf342ff3c22e4fa0adb65955ed4f3a7ea4bba0d95f809ca9228674cfbbeac0a39722a62151c83bbd9fec9ea5608c1df0e1ca6c1c4cc31cabc774578f8e3325289d33ff4ee69ab76c5f1cb453a6935e7bf8735ef601b887f53fc6925a191ab04beabaed81bb74756ee883f8b103c39b52819d2fb3b5891a80890f990188fdaf5169fe759d9aad22c3480b98454bc90f20cc6edb5e02ff8bd80c1f1a7e52f6c0351eb53a41bdde94febab285db7d7b4585d2a22ae392c70d1a51c6bd10cb469dbe394a8843c42df732fdeaa3fd50c2ce8d1305b4af0adefd2ace79a81269362d89f055b8a519284810fa92727da57b9795ccfadf8c00745960c3d457e2bb5f89e49dff025ae28cd1b0f74dccc1f72d85805eb000f2bd77b132c9eb0f0be432ef42ca4d35e79c6e272a4c13c003d5c50d7ad2b29d7c4b44147ae3678f26bb563c9945af398f8801a0a19199e4a6701bcf5eb95434e1c9b28040099fbcc1158c5f3b1b961bfe1f40af6cea87c0a85456fc349e379418b6fb6e2ed6ec039956487c34ed7aa2d15ecf1d50254d490e99b8154e6b6afed2e344dbc0e8b6937dd35f9096f7a7626a3a35e49e173bc3f038f7e556a51dad40e03d7f2a33f7512a16c284fe76f06f1d9ae590a969d987ee0aa40dbcdf87c6a102077624c5bf739520b49dd2c109b8d9d96a4a3f061a008d94c202daaca5c108b5c5fa621f80049b97c13584f4d06585df609af4a837758f19cf3c00ba89b4d75d92c4981b56c7e21725c0ac2b41fa40148f05feb975044031fa672d40cac4fd03303f2aeb09bd9469044137c9cf74298ff9792959e2b7caf3248f2bfa01dbf791d71e23b5bc43cc2b8f98b4f36f1acb68a708a221802ecf7434f0c39bf69000ac62decac4a9eaf85e453a016172da813a6edc6832013a993ee050c888103908847a0a1db6893b72115bd681fd8ef6509a9450bc5e703bd7af1f74b778b82a96b3338d00f73b0e5a8ba1a733b18bb5b8d147cacad276d568cd8c22d12cf0cfb69d605db42b5e1427b912c0c4a7e5ba1b0a3178bbf84fa136542c20d187d6a70528664ef4ee09a682ec17321445b90b9e128293142cf671c9b00e0c79036ac7c68d592054326e0eae29bdf2fb635c5b8470d65793c469732ab4563e26842d660cef8d55fbe8b62703782923e006fe2d87075b5837c07100185c386b7d948c5633d73ea3bd3c2effda0983902fa37ea837d88b99edaeedee2d534a29a308bd08190937364242a39f3466d15791e576a18e5cae06eaa01e9bc531164b83b514ff76b95cae667149768d624966a0e16be2a4699ac6a529b4bbbb7bf376776768158e9d56cd4de748f63018fd6679ca7de5523ae50f0e51210f7a95a4b85c8a03f5e80df39477cc1d74ef3dafe75463a726e93abd93e830d411ac3a0c06ebd0891c4b8fee2e6779ca1f0429e544d0597ee5065a72cf95eaef30180ce6ae395d7f848adc0385dba125f7b096d52cf69c9e7c4de88a0b7ade494a9da10a3deea77063c3e39b220d69dd1cceee9eb1bbfbeeb2bff46eb6bbbbbb3e35cdb510ac33aca9de2e4f1e75863795abd43c5f89f5b85484266f99734e87f2424948911e574a0a39ea29488fcbcd7eaf25d740729ee251f735ed81a0e537e714358de348a4aebb11f2c3b3d915c242d7afa465db86a224ed3ddbe8e7bf6528da95847c283368f955ef2b9d4a42bed3e97462efc4794b2271d7af55282dd2c00292c5f5540ddd140d8febce9f34806a987f51b45565d63c3f1dcabc04975913fbf540336fbfbfbabf4e88c4577553fe5254afa2fa6a51ddc35a2e8c4b41b647931e77be10b1a1a7c79d48ecf742c4869c1e7773d842a059750b55d881960b1bd2aa57a1471fd2a3970b1bc2637becbfb85e88f047d22a7f140c5e40b36db78dc67db6c73ea9a66a497a92d77d0abc7fa973b258fd5b3b2689453c71eb0b0b233b71b59a55d604165637f1634233b1a3c233f19480f039f1bed216249415947fddddddb92fa68aadc4453bed609a5efe5204e52fbfca5c39f7d30c28ff965c97bd56a164220d2c20e9468637394887655663109dd7db23d5a6c92a8be5ac353deedbac585357fc11a48515aa9e7bebb37957f35ce32aa97af347e6a3ae88da3e0e405df14758bf7a4be2bace06ff1887982a8b294c5abdce39a2d95752aff4b8dfac64451e5a28fe3156d092aba53568c9d5930f2db9caa157ae940166b1c83945ce53dde7350d9172b20886a81e399461d618406de3b09ccb6ddba671db639fabde7abc9e89e6058f9caf552853a48105a48b2f9544467389b4d45720b8b4e78b755699d6c1a67c76d5523ad5422e4a91d2637f0c13eabc3db4f7dafefdc0a747e9cd8d2166d63151498b6ca7969c939c8812836a1b3744018da49e8a11da3672ff7fec2add1e2535388ddc929e9a2065e43ea5203541e9c87d2ee4a0bcec507effd6447a4ce911947d6522f7bdcfeb481fb769d937fd6b3699d663dd1a5dbab4d658030911d040a375b66c51430ddabf19b382b870694108253363264a66c6cc39c3a043fe1f1c798c3ffe0b916ca0458bbbb8dd751b7104617840cb1deaef235fb5cb53fd30988f4fb943afba3590569abf468cb8ba24f8e33eef88f66f566496e66b256eb9cd8810051284689d43b8ccd0f1a9def210747fce78556fd909dd9f3376340dfcb6d287c3d9542e5c125c9ccdb13dbc736c0fffd5b13e82b44d935c62c154bfede10f630635a201ee49ef3ec3afa4900ba9a7fa3f2e93748c126849772ba92464d2203df67fad2acddf12287ed37fce6d9b210a6cef94bf92b92fdb6389eb3146d2c2e3f69969db7231528d1b42841b22377ce3052df9c5549c5faf174d6d9a4772295d6685b75db138fe9198287960f44ed10c9cd3ab22454f9a3433a9a607000d69a7e8102df965d4aa72b4f195f6377d73d337458e1015dddc68372f217e79aa9f79264c1fb9b999bedca6ad6b46e3f699691b47eabcaf643a7df4c50628850f1868e46371b2e7f143281512c0062301c6b3b450d918319b0e9af36e908cb84de3441edddd72a1eed68d27e351414b9b07a9d8d880a52d68b9440c82375e2e91f30ebb8460e512954b3433828fc2090b2dbb55721a472908fe6853a517673e77058bd14f6ea153fc0d73077221eff770cc172de0e2f8ffcf544faf08c029fe0338812365a108aafd1e0dcc951cec1c6321b6c25ec4b0d01414dc56cb5ba0a7430646cb8e752cd6b18e75aca5b3e33a61a60c5afaebf57abd5eb5df857cc8634eb483a6095a7a9117799117edb85e3caf030b5a4e9fe9337da6cff499b17914ee108396198bc562b1582f9ecc27133f9b716657dddaee61579bf66507d13bdba337b15b9deaef768200713b85c2026921c2d20aa6daad229a0165401950069401d5feace8c83596dbd0741290c543c9cc98398328e829dc3877418378cc7d859c351620058247b486472db995c20f1ef3d370e0d18101cb0716b362447cc4519e711c91f00f2a291c1d1dd1707415d8076bda10368c25aa25b35c9bbb0718dc14ff7323b5610de914ff0bfd44c9ae4ac4478ca555d94f24bed2b6ef671703f13f42a288680bb530e3b7b9e123f6c16269ccd298f5332905c17f9e1813a2a2a3a9891cd746aeb2a3d4de9f32a2d47eeea1796192da43d1441a6a20d7533c304770fbcc3e0da49931550ec60a2d3916a5555d9e50fbfb556829272c1020a9f5c105581ffc37beb2e9d5904e41e32350ba711197c14ce018c77c68b9451c6bd213058927b59f5bfc2d38d1588a6239950a0ab5dc220530152e6342945e1d399252d444a4ed8cce06018fc293be09b4e458b7a68da7bc99f00335117a52fb1b89aa75370de2e855cb3247edd592fca3c589cacfd5f0021ab638bc3468cf8ac47316a2302fbb5468b944acd3aab2752a1111516a53fc2828e089ac8796ec8ac241529ce871b93418205af2105fe9d5764ef3966623c652fb7968a8f6ee8274075fdfe3a8bb67dabb96b93b8c10747a87f40c8454b714015ea34e710641bd4e0346d018aa467cc5e3c790f7d3b36e32ba553c86f8cae64be126864f73fa39337f717373536a907e3c60b4a0eda3a3338e3a3a5beb2c91ce2622691d9048a736d14eed9ffb3261b2a0e5122d0f1bcdeb48dcb69fa9545261598b2ee824d039a3a025f3f0967f10a494e35a687569d32e96e32b163b72842716045a36ab59ff204829eb9542731050906fe9ce918787a6c83c63ff83204c155a6eec48ab55cdcd3c7a2c5750d2505d1cb7079b6a40721cc7719c12f60806243414db71bd787c5a3a23283214239ac15736bb470b7e4fe9710226e5488debc5e3039b81d5d2d93112232a2a0203029fd22d4fb1ebd412d44417b9a913852906f49b5420565e107404113e40c3862a98d8a20b103ab0317a487e9311f495cc40cb0e3ef8c05aa20b1c2c1097293b18da420a183c41f29b8ee8a060a591430615255c243fb7ab00f4a043113945284211c620f9e9ae160c1b6000c512a0d8e20620921fdc9512268e30840ca03449228828482eeaba6e4ef7e69c930435b8d6655dd7753c5d77c3ec703c4cf75c7703dfbfebbafbd975a46e3e4d919c1c25e47a6ac27c077e37836306f560487301f0611e466401cc835d87faee613a9448532427e7c6c7c8c884ee8a09d753f451a1c3baaeeb4cdf9dbef3ce3befbe81ba6f57476a9dd6699dd6655dd6655dd6bdbbbaee3baedd7b8ca8559e8dce796a47c5d25fb5ebbaaeebbaee4ddd9fba471551d2977cf46ddf6dddd66d5dd775dd26d382cffbbccf6baf39afebbaaeebbaaeebbaaeebbaaeebbaaeebbaaeebbaaee3ba6a45a42efd785b536a45d5fb222cdb9769dbb66d9b76533f2fead133bad2a3178b8142676c7b78fcaa36509a15ba7ebf500051546ffccb9753a77acf7539faf3fbf9a78ffb78f3e5deebe53cad7a1ad214c9b1f1a85742d29f3abe7a79efe78eaf60defbe9f255cc7b374207a231616b92f461429a0bc0fccbbf882c78791891c68525394f79af845c92bef72f61a6e3296f26411b0ca1255855098933c4105e3016e9308ff4be8f1c8b17b52a7befdda855a4f71cc885bc7797af2890ebc85fa8f76cbce7f590d0c3401ff7bc772debbdb37c35813ce5c5aeb4caf4de3b911f2dce823b5ee9ada943f57e77b6a07a473d7a9f85bca547ef4961b37af41e55443bef4f5da2214df630af84448534d9bffc9236429acc9b40dc7b74027943d58bc9b4200b5d5832c7c6e7bc3c2595bed2b7d453d9d310f454f6891ce97befbd2fe4ca60ec8a59b02aa4b75c8e0d2da82567e1272ed2fb1b5fdda0427a1fc4570180911ee97d11233da4f7487c358016e9fd087cc5427891decf7000d273225aa4c748b4486f921e253d1b31d2336121bd671f5fa15ea47785f45eb690de0858ac168bf43856f51ed52bca6a018c457a2c56f53cef0bbb6e8d2786402bc2c25b57e5ff51c3a7b298c42bb73cf86fd89073852e416fdc6002e3644283a2c00315b0ad4b042c9488911e16e43e65207da242bb99d76025f054092a3283b9bf56f1d7f9d30b1ec8208a0e8bc5729153e4cca0cccc5f4970a476bf0fc1e00db5d96cb9df0ce62b1536d50f526d13b7f4b8552b03872b62d429c210c32c09d1320e86279a0ba418c38bdad90a5cf72b3390661ffefbab8f8134cbc667e7065138d181154664ff11188c70ed9e41ba34856ecd441270970a6304e5cf6878d5f95c72a1496f955c600a68a4f65cba40476a4d03b37aeca75f7833ec4e66f5c834f4c8487647f0b9a892e6168255b9a953f9c11f95e8b04390144e8448e28629c8fd1b5f7962c4c6d8a206546081041fa23a608d1d17113ad001c28134c00f5a4819820e9a504513e4be9156b91075bd68821853301983065cc220d7092a394236040971c404e93b759f8d7ab530de129bef32b488e069720322285d90fb487ca5848732824002a604359e1c41eecfb0cfac7dd6d9e79d0d436708ad327e38a28718902b81338e86a62883881ce8902b812d3c54baf070850e3d90db0426861085478a2586b220f7f9cae254612c23689507513709753d06751d88badea41295eabe0d23e864557e26adf2a21ef959adca69d5141d4bab552e3a11ca09fdb4d0e2fbbe6fcbe2946aff57a5caf711117d5facf67facfeafd5ffe9f47f3bfd9fabff7bf57f3cfd9f4fff07ebff98d4fecfe3b240dc3dcff3b62cce57fbbd2bbd72f73c215fb97beeb1fabd56bfa7d3efedf47bae7eefd5aa0ea3f67b3cfd9e4fbf07ebf780a8fd5e50c76581b80eae43d775dd96c5f16a7f77a557ce840996dadf09f9ca7776bab28bd5fe8ed5dfb5fa3b9dfe6ea7bf73f577af56b90b6a7fc7d3dff9f477b0563993dadf39a9fd5d50abbada4fca9285442291485b168754fb494545a422563fa9d54fd2691569a79fe4ea27bdfa493cfd249f7e12ac9f9444ed2705715860c1711cc76d591caef6734343dc10ab9f6bf5733aadea326a3fb7d3cfb9fab957abdc87dacff1f4733efd1cac55ce43ede75eb59f0b6a159705d238681c6cdbb66d599cadf66f577ad53d9de2ef81f516abfd1bab7f6bf56f3aadda76fa3757b7126affc6d3bff9f46fb0fe8da7f66f41ade2b2401a880642d3aef48a591a16cd48dba209f9aa77866aacf66bac7eadd5afe9f46b3bfd9aab5f7bf56b3cfd9a4fbf066b95ff50fb359fdaaf05492145d6a5f667d9d1962c2828cb8686b2a118cc89da9f05b5ca46edcf787cc54545994eab76fa3357fb0dfc65c66581b0116cc49c736e599cb962241889397978260fab7fb65a8bfee9ea9faffec9d33f7dfa27ac7f4e51fb679073592029581f5ccbd5e25d6abfbb6f591ce7df2d58b8d5f2a23edab238ac7e6ff5bb4eab7c877e77f5fbabdf79fadda7df61fd9e45edf7a0566db5b9bf85f88b168775ba91507bd6fef163c857417c061a1687d5cf2d5f529b81bca8fd1cd42a52456159a1f8bbfbc1feef356abf4dff4d7f90fe41638cdadf8269095a7a95ca6fb2012d9dc8095a7a0f68e9b0ca7f43085a3a93ca7f638796be53f94b5428cde18fa18296dd53f963a6a0a533f84d5368c94195dff4c37feaa1252351f94f4cf09b94e037cd809ed2a0272d94078a7a013d3d390d41cbafdc25d6d4098de0a9fe1e0e4f82386f770afec84b845843ad830f11e7ad19d3e122568b9b36643b40b55fcd93e520c43ab2445bc4692dd87618e216a5318ea593090909d9dcd44e2c6f4a9bf1b5297a242ea78f845aa8662eaffb4c49a0df0db46ca02e3d75df5dad2ab32855288bd2aa327365ddeebd56a1783c2821b2af0925398e5210fc1fc77e7d32a065f6f2cf6cb0ab8eb52acae2f8f4eca77af683ea990e4aaed584965cf56ef1ebb15fdeb0181eaad5b281567b41b55a5cb6a396deda51cb9edd5f875c377395caad6ecd9f338cea7c17b40b74e496096d3e4041f9b9ba3f5ab64ca1fcb3eecf918f1028bf8dba3f5ac608d2a7531128bfd7fd4923a76e0486f88aba7bf6cb7ffa7d1ae6db043972fc921b32c76f3f797cd3a1032687e96970d0d20a5e3f770e87fff638b899906eca1f0cc14db9492c4fe2a944c4ebcc666676666666a63773ef996ca623916678469b99e119e6284c2511d27721e97178393e1d277caa8f4921c99ff813f627cee344f8137fe24fbc08e7711e5fc2a1943e49e600a809803680b194f24c5f63b1238f1e06f0618302132a2d09212a9a2e5fe56c39dbc6fde66def71e1697b50b024964247e1b3119ebca05caa6de4266fa3f61891cf224f6d1f13ce234f6d5f0aa26de4ad3ea38dbc8dba8d1a0df72f3d87ee52b7f75249481f80e62385318ec30808d8317fbc27a00be9f77ddfa712f9fb565d486b87fb7d374d8b70f37961572e34d5997016b1416c6a7b9a70f6b02dc676179bda5e266c236c5fb1e3f636c2b6627b6c5f0abb8aedd142a10c130a57654842ebfcee63c29c5ec2a2b0fd128eccc959f2e464c208d87e890d39795814b69fad4ec0f637375b8b13a8c76d06159dac4ca0ad7bd8c776fad2673f8180b63f6d01fe93c4728758cad472c65ab16ddd86589e6a1bc5e61975fb181563eec3fd7384dba65c2c83701b18c29456e0fa7dbbba476673b1a76e6f4301361c47f89142cf08c6c8a85b67181919a1d13974f180003901f99c7f5e5915d1aec047c59c4eb57c9f4f18257e79a396b375a3aeaf62c49308ce222f7607ab6e32b55d2c7b5ae90a531292420a1f8cfb0200f091421bdf57fa7cc7effbca8f01381f297ca95ec8a512572a3d17fa8ea552492c95b0b298120b258e71ac53db17b158cc0a97e12219757b5449c8d7802e3cd598184accf96efc697bdc08b74df98e41ea0ee023855f8d0973723c0c8ea799017b6072d0e098017b3e4ee646c9f34aa898d2f70035d13d0ca4b99eaf67071f10d0f725471184bafdd7dd25b144a46bcdb74c3a55808f1476f5144201df1442697dcd07e0718439e203e069c29cf0673e26ccd9f1ffa83047470eccc7bc4c9893e351ef95c212702d099598caf6e8568f1a572fe40a863870e0c08103078e5f7243e2f800d0d0d0d07c0d0d0d0dcd03000441f0451004c19f99999999f970666666e63fdc71e3c68d1b7f828c8c8ccceb90919191f9989898989887898989897954982344a150a8ff4e556839635db78f29b1f0892dd454b4ed67eb697070dc0c18d24d712f134ea270c63cb5fd5cc2e27cbffd8c4d2bab32fdf6538c5d9942dfb1ff0b4fe0a6fa6342aac455b9f702f0edd666269dda9e79589c135066c2403e9427321366c23de09436ae721155dc4d953241d4ed4be1f731e16953dfa3c26d539f5806a99c882a11e94a0ae0680615cc70b4717505ec02bec1019e033e2fe4ca855add120b41fa0a0c1e80e1ca950fa0b184babd0a1fb92dd57cc18f3e5417672b9c4cb6c7f6a72f683963757b6dfb195b9caddbbf6fefc2e29c801661202d42698de44669057675b252b716cb23b59c596d5449488b04f8484216503d16bae862c8d72177a93207f8644a42e693cca81e02be0eb9a8a2eaacde0a899b1928e0081c23807c9d6b025f878b450515f031a08225d6c2858f632db6074e876c54674a9c4505be0e1b80040b0071718128aa78f52ef075a8a3520c7c1de6a82f46be0e69aa8d121f617b64ef65e0f3764ae5421ade82abc7c2d72173a95d48c34375ab47c2904b92394892246d70436878bc9028d20b656464482d6352035b473a012477903bc8195207494e6ff2f90c537982ca855b85c978be66287e188282600cdcdd6b5af5add2fcf3ee26891ce775d6dcdef3fb462cb79f1fc41ff43c7376d293bab0fcada8dad4ec6d6a6f650c36957bf63c5865bd8e5c453b44b1188c08a8486837a09e5d48820674e9b2a56a24f0aacd706b7f268680bf975bc243f558059dde4763611011ed16764c62f6940c137aa47a63e59fdb835c976079a4669ff94f1b61d072a998958b7142979b455ab87eda5aa4c0b8fe50ddddcd6343edee9826c0a3da9f43ca1269d46eb27be36a7a5c9895da13206aed008c3264a00412c8205d5c19c242093b18f18517517b0a0b8cda5f33f6dbf4df4c61c12a57770acb070a9ed351529c888e69625b164b90fbe162d45670c152cb9aca5c78a7324936a7b6d550bd5492f5958e79fcf17225e76cf7e9bbdfaa52c99bd1dab22bee26c988b084712516c6141d9810bd10e193099e0907250ec2c7dd78e295aa9026cd818bb982f26ff7a9d4459b2629b2130f2667aa814f1950fe6e1aaa86048f26acfb44f578a8b9bc5c86599364129881c562e5d4f9e5e869ea67da230b5c751234972e35898b344468f53755e7de9e261acfb0cccd523dae79b969eaf7a27a1a4d00b6c7be58178aea715b786a926e12ef34cdedb1cf433549d33c60ca90d518c67a228276cdebd110f16a56fd89aac4397b016f5616671787b3a4d1aa8bb3d565e6c5c9eabe9758d0d4f0618c32666985dd915b8609e5c5d1eabe567261b3f4408b1b2851032388c02077cbc8c15096305c800328be2077e7b69c6dae5153c982dadf4a50548c72dd9f327aeaf6e86bb0be1d5afea8eb84ce213e21e8be14dc173f5bdd1f2d5b684f50205ad2ba6700d5251d5562c1c51311e814b5ba3f5ab0a80c8453a396f3e78b72e5ca8d49e4bcd4fdd12265c90908b41406a575a36809d53d8d414b92236d48b138fd3cb3abbaa97d29c2fd32b55fa210647bec3fe32063093f8c71c393571048fedf15cdf119c2500b0754b620f9c75d858087299c94c1c5962a4120f96d76a5812590f11223892856ac90fcd3061028d7d30b68090b3d1d51f084032dd78bba6e84976303aa019103ed9c7444a09e848703cabd3a21f014d1e9d3a1416d38d119214516357070d178425012931f57500d08ef07da39c9a19e8457c4eb09caf1784cd0e9b303ca4dd10141b72c94f8b430599494adee8f1a3ec0ac46f26a49a5bca02585c9192828ba1b3021836a4098413b273fd493a082722f1ff0743bd0e9d3fda03185b7846eb5a41e8b92eafea0e145d7846a757fd0180344d11c352821fc9c1154bdba3f6928a196633683afbbdf7ff97b7bc5af2bb6eb8a8e8dd96c579b6599b67d96cd392733b3875cf7c53b069b63ce39e774efee201da49564dc30afdf14837ed31145fd5487d290802b9334304983a0bb3ab203041290604218549420fbfd6857281023063f0881c1039d2d64ff64ed6aa910b2411935e061c9106cd89592284f58c1031a58f1337405690309caccbc028bc0876a08f8b557f547d9404b50a7f26fefaed6900b4e72a207fd60ab1c892e464d18e207201a4ce1810df5604588882c6414a9e165744153165a52214fb3cfb2bf01035a729b9aa1a6783e935b937133961954804a8e0fc830838b2dae48421620d4200b1ae4f0032940901a80fb9dce63fb7f08706db1aca17696a3c78c7a08f638045a7e35a3461ca1a407287296684d51040d7e8061e2891064f860092c3ce862478c9d3174ce30da018ce580c91452044dc9227b0f06188c6af915955fcdb6ca8b0f68c9acdd91fbb98ee5e0bbdb88ba3d5dfcbdab9de2872078112454850d787698e80106371c11461184c80308b153c51016376401831400174459ca18e20b2a6290692481f79b10b0b2dcd333e4440f1b41a257e01cb5e771681c1a87c6211d243ac57f244ae51f1a87c6b16a3b7266a447fe215856e58b99ed6b9999ffeb7ee72f73cb80ee778738eb3c77cfdc331008040279fb34db905ef11442455ee037d2ab8fe43fc20f037f0c5cf99344a9fc33f0338bb5e54ce426bc430af92948817c6466668e4733e25fa1a01ed9fbc509cadcde2dd210b1525b84d27a327b25b5666871689e2b92ed11d4aa16359089479eb5581508164b95ca6fd281d6d4fd5f152f2f7337b32a6f11c7a0781e3c78f0581c536d2350ad963cbc921974613087392cc80e62be59b632ec67d9da00b6ecd3634f8f132e4f750ffbac5c4c7242477c75fa1dede7ef4934c295c4110449e2d08ba437e2abeeee0ef415bb5e2523be43240ea6e1e0b9367bdc9f3d8626f691bdc67d35cbc4f9b18f7d1417b4d46888689918835839aa036f6b26ea43838a50b24cf44c4ea88b5f16564edab757e1212a54aa30607b7ea6c280d693dbd072db66a4d30fb432058614591c0793e08516b5590801eb84bc430a99b5a412160beceede366b8d06ee1c0537dbddd576356d77b56cd70523f792858e95999932fbd35ea242909b1f3cc60f0cbadbde4e7777777797da10c1f39bec83f4d8fb1db165f1aa99473450539da0fdbc93eb90f5a721d2357b9a15bc662292edc1cf9eb908c3eeee2eec9f9bebc2eaf7eeee6cefe69fca7523c2c2a2c290567d950b32e79c73f6dc094eafee141c6295084fe7feeea64a4276869cf311767bd0b68119d623175153112de74b10e858e7cf6d25c8a01d5465606616621612daf76f8eb1d02c72824b56d0fd8f0bca2bf0da286169ddb4c766fa71ccd16c8b46b0f49b1c4592c5d063b34eed679d92cee6d8b5c5eb6ebc6d0de3e1d99a7fd8ca959f609fc5998b33ab3f6b519daba8fe9ef609e18789ec84cf0de8aa34d5911efde7aaf8f7d98956edfb73abda842c0c4862689506a479a8fb1d720fd62ec950a56e4fd375a4679f5ef10f74602c254af567a05e7da4efcf1a3dd59fa92481f4e72a32a8fe1c6bd5a9fafe7421ead5c2b8a83bd2b63d27965f04039218de43b0083413510de3616a2f445ac0a4c7203dee0fe991774e9e224f9e4cc521ccfb417cf610e6b5f9d12a66e775eacd59780b23b03d4aeda7f86de2d7025749a84f02db831f35e79c53054dd3b4106837add12d446dda8760d3786cdbc66ddcc6715edd9e7b6e1369889453136d323185290ee99181c0b1234d4ad2a3fb77e20c3d7e6050a39b30855085216211efc8f6f08f19a235b5dcd80616a7dfffc8e29816083ac5af0a55c2b1f7606673fb4cfb8cfb2c9b9f655c46d2e6d63d472908fe13ad23695d6a2672934941fa20672f10aaeca66ae27e93c8af1efbfb5f6e4069edff56f5f2a7e7b9aaac552a93506dd2aa4ca4e15752596c1bdc2f0fc27c973cd24bc834e4263df6d80f13b28dd024f24e8f5d442ca92796202589e5b3588e7548a908748a2891f6f875417b723144cdf4e71aae6166e61a557da1a2e8ffc1dfea4e5962458c2939348103199d13cd051a101f088220454d1f6e54602add9376c56dcfdc85eb2966fe2d1c412f64ea4e592285c484e4c3c88d63dd9f23bffb942563144dc9a188cec9bbef141cd42031d1e6cc6eb66dcbb66953da906e50cbcf81dbc2574bdaec6ac73a99ac81d9049e7511f1851e9b79df88bb7bbbd8defe62b98546bafde7fbf4ad487b770f69218a7b11231a6815157777ef239865d411688ed9829b7f3b80e29f457068bfcbccbccccc3ce73c51e149a8e1b549083a850e71d5651e4b9b1b8ec562b160e43e45e5704e74e7484bd0e2515f6daf9159b8cb64162ec944502c6ce5befd9f7b21c2daa21599e5b6cd6d9bdb9cdbdce6367f13bd2c34328bbc30376dcbe6d4e654a15553d3b4ac09b097f9ecd3dfdd339ebe3edd9d13a3fd091433737737374751272a3c092d0d6d3931a8c8c21964fecf396767ddbd19f3126a3605aa7ca14723dd6f64ce2246fc37e5466636b9225b37b047171d35a485284273ce39a753f939c149aa3b25072e6a49b71dbc8ce39b396ffe463535d4444dd4a670c373fad46e7a45331f687973f3a3a4f2a3367fa9ee94253ba8650d2ac7db9a171fd06f6b321e5a7f967db9b0cfc46c87a8f03a52f9390837c5e9032d6dbaa451e6970b9b737e75a72ce1524b5a4b1ad4e3566a046fb2c75daa8b3224a195667df48b333bf60cb96a9ecf6c0fffd8cbbece78a7a994ed7a2f445a8044cd38a48d8282f2975f4f79f9ca813cb53db7403e3118115051dd7cdb6e3cb5814816c7fb7d0e2c0efdfd7deec529fdbe2f8e8ddf5761c8936d52d707935d710e825dbda736991ba898a7791c3ff3a7dff73c6716c9d3368ed4795fc9d4e15e519dc8574c6e38fcf3ee16e244be7a727b2ff22356ddde63433438dc4b257fb1d1610ad53b95887485f9b8b07b2fdc0a1332f9e9d0f1c1e4e0d20a7c844b425031df7fae16eaa1d20a5afd3898ae4444d3d971e9d0a143870e1d3a7ec90da90316f3115f279c70c209279c70c22fb9214fe0d9b163c78e1d3b76fc921b7207f7bfe304fa3ac21923955698f58381c90152b17c11e70b575aa1837025225d6d7c0ee4423ee431961f3991177d1f572a89a5561202c2844c7a94960311151d653b2d94e9f450c6ca5a9f8eaf06580bf5908dd20a59fdbe85da8abea28dd05dd4107b2911c9ea0782200882203833333333333333038bf98893c8e7cb573972e4c891239faba8846cf854452d95a11111000000006315000028100c078482c1601e468a167e14000f7486446852349a0964490ee4284821640c01000000001020033243351bd5c03e80a4c3acc8090383436ebf9e175d86ee45a32b15bd576401b7ec11754b232579e1debc575fd6d11e66077ff14b2094a5604116ae67bdd54f0e5b8b6c1e394d90952879f3ac4a8909db8a69f72ddc413c83faf876e567e27516266a946bc97e7069f0f53d1ebbc2ddba388ec72d628e4b6fe517f1aff8352aa7f90e2ee622a62fa02e2c13c222532df2e943a594d558a203f465949f2a0a98ab667793414e94b903b73fc8c918eff7e316c4b230a6af169e62a2fa0bb739a54d9566168b8a8083bd07da1a214b63befa430b20c6801d26267696e904e88918c9dd726cd62f65cec1c5b60631c8b7589570155cad2ff126f83125cdbcc9f4c0c801a1bcbd3d654aa409934f216a0948736663fb80f8e7dd9644ede323c2004d037d79ad405445b0fff396b31876c21ae29f64e6e9a079aa8275ae29bab89dedf899dec845163b17c963fb4d5fef35549872ee7ce9b9cbf7b054fff64715ba619cf5e69504dccb7f3fbc4b62dddeda42fbecc853746e5b7e3e2a67d6fdbd4c4fa5d1a192b467058abfe761f3b8121f817dd16448a0b4be4c26f47af639a1a76921b81ce0f6ab5416c9144dbdcda04cd6936bf932c508c4bfa371eb0fe07a734aaf8941055d23c4372a70f071369edd0bfebaa73d5eb8a8a01939c83e43a500f89e65f0c642333e658d25f1508f8aad4ec63199529c0039704eb59f5e61ce8fe52b5789bffc53ee1f40d7dd369829a22af0352228b1f08f98cfa18128b59890fa7c5b0edeb1de6e47133af8925b328d697ad35ec90c8c5b98b18e98414a2ed2fbc6927c71f564d67a8e7499f765492f787cf7debedd172f69334e80b14f1cc1a8ce566549848b186e40e18b56a60cb435cff1573540104415f1db3144a3a14decf167135ed124a73282ab40f43deb6a433201cdcecba5e164607a2d83b4d05b820daf4abae1028244f394b16ce2c6228a1c6b56c742150edc3079bd7a4ddbc3244124e354424770ac58acc96a9fec7b8aa09709cdeddbeb1d745b57810a800e022c8d35bcf0f36a2a424ea1e58161c3da0947d3cf269a0c40c553f0db2d1ce24778f32eea6d9bd59ed4b9091275e10e809acc9d743af533aa72983966dd3d3fa853848e0826a6d6c98fc0965352b1cf1040ba1d813c80ad9ffce8f66427792585882e4e20bc149b078a04377958f086f785c3616f6a6be557624ad17e52fc7734ea2ae3af38d22333a857055edf17fe8d0ccbefafbec0d86e570c1583fb7cef4b822188f76e2ca9096d5bcb13e135724c2a862a21dd2bd0d222b55d4250ddc045d70dcd9ac69b298606ce05f6590a05c2d85e87fc924e91399b39e3974c89d7a984056130ee4708f41683d26cb42288d11882eb6b95341259b9450ecafeccca3f253629f8afdc911b88e306d95b3ac41b94d92d0839db3645b500404ae6788ddfba58e4281aa9ebed70e3ed80d93293529c943e0cae47394ed19de0da615d39262720be1ca2c0d724fe85a250d2529d75688792421b03bb973f7440ac2cbbfdb2ebdeba1163f6943c346d834cf7f2343b904c6d38795566007308a92dcb8c8f71b7550252b668165242f21a6a604f0de2540ce79f220fc975d4726e60f04419b554f56818c353168e33fc5171d83bde868ee54f2bc5033cab12a25a6698fe0f8f9abaa78f29017573207a8c10b8ebec046a62cf80b7fcbc5c9a58c73485e76aafd95ccbaf739d453b1f274fc9b9adb9b6d4d0a1b4145c09d9fec4a3b5144605a1f3b9b91926ddbd442cebc5aa8dfa6d2777d6697eb67bdde82972ec6a53c700d664acb5e026dbc114b112206c62c7d3bc43c77cd519b6bae61afa6b4ac94b5a4e98397714b11a5724aa29af6a589e5185e31a6f86e7d75e13d866e0c993a3164f8325ded3447f255b0d69da8e0332521ce2708258dc48066aa6fb330bed49edcbef1c67198ceadaf3cf62b24b424e68f163d89af13b0caf5c613b12e509d7cd6c7918f6eaae874afc11c2d82cc8a2e90b2a6730daff7f9b76a2d75fb2411337ad1a402f01174b1707511f407a36116433a77f2c41acc9bc72794290cf8d7a09bed3277b66ce24da6a54ec4cf330483eb6317c07fc2f94a0f9ae58d46c5e9e3700823a460e0984d1c86f5626ca950e935d51338bdecd78fe92b7e8522923a4c0896381846237608ba10887ff5200a862abe26ec3773e38cd2c402679ed78cf481d3d3308436e7349c36ff18c798762b6e4718b638f71296ddf913e94e97456638c3b42a50536fb99dd12055a58ea23b56669d6172e058a4d22696692f6d9f69be99c9d953b8a28585462818afaeea12e87f014e074f8ef85c0f4b02800d4503005d9c3681c6ad46a001b24972e603160c130b9d99211f47da8e28248a28562f2b505c0cf255a774ec1c275d6fa3a3ecb16af93e2701ec76c7415a6c71fc55395f85d1c205ff1a4d9ff8aa1eb1b31197f9295ff4788918d178ca9714eb1c9e6c7fe28a651e2b0f55da67cef13e44514b47ac9c896995a982a5877d047d651897c132d60fbdcd0fdd5bee6d988bd26a90f9a7943462815f53b733eab707414ccd722ad0d1c2c425823737d0fdf58fb28468d1e1c0466d76ead749f70ca1d8c87efd962f9c119c18869f89d3d09750348a0ebec530d379bd757841b6f9a1d0f80c5233c4be679f56365e0567c15b92b1ea257afd70afcf5253e0cb75a8e7e7a4419bb92e4099a03daee699bd140732ef62294c59f505984d16ed691827639e48eee6f2ad46d8f59237ee69f09fce1b3537d9bb87e6b54d6971654aef442bf81f6510e04a6c370fd493671d02693f47e49980f1d2e3cfee69d28f5dc9d0730736cba8f3e7890dea72f8185788f9f772d06df9eeadae6a09cce3ddd229a837922fb54c5ef604f7ae0b34c0fb7409f132513387750d4b19c199251b11d93a91a0766966d9c0aafa5177972e7d37911c082d129b8d3b8838dd11c44bc8c3589c777fc5dd79515bad429d609174caa702becb507261faf3ddf7f7030e8b8ae96ed67670b4546eb9161e0776e64747957d8719830f472266cee69f0a10af3331f0d3fac7e2dac2ba2d9c35ba681a6c60d34ec46100d7aa07af9d3c104154f81721a4c54e6594706f9910bb19081ab022a8c0623035124130c788d7630ba1e753ee0e32f3b056c16c073d6b3a017dfb60094bddc5a32b6b6a348012e9349be04fde47d471e3067f6358f35117185c50b497c3ec1a2516f04e18c8f2299fd611c326a5f2751c16318d07f092a382216201cbedf934da977e8f02fd1231da4facb66d1c64bc0f444922e0c1b2e8702b32fb722d3e76130bea5e395c7541e29da810beb093753c4302704b1f5cac7b605e20f4a438e7614872738322f4a60cc0975801bb62e77b9798d3201644356e482f17fb68c35faa4bdcf2e6038b8c7aa2edf3da773c477ef78e3dbf4cf274610fc30a658088c5c7ff42fde01c924010c5169ea2552b24bc9873111fd05dfa83b4d77a1f53dd496cdc8bdc8da3e752f9b19fb67355948d301fc7ddc5ff0385fd55551d20ab9aad427be64d6b30a52d6772edb8c2e0c0ecc0aa0691a2a172485f94068e696e62522284413a2f2ca244d782c510a8f4790e606f278f66a342c88b3a14a5cd39d38cdeca50ff29a842de44df814943c1b0feccd06a57ca88acdeb12e361b0accdf20fd95c260bb5407223f72c500400629cb0f8dc5aa4f1fda044973864f17565cfb1798808af4aa14f7522c33d63280801269e28195325bf5bce777a3387a599b65d24291ac9ee482c6acba8e4a4f54f3bc0a73fa86e88ce87555e2c79cba0ec56fd8788c2d22d48a06736a4fe8323100cb62e54a9da72dbb877ad8bc1c944c34f5a52b84b21f8b71997562e22b429aefd4727ae3f412d40123af71328c2275e4e83c5a45edf5258c72b48676bdb4b43fb4accb64b90a4e675443be67cd87c396e314fa1ae0f894e14534e0cfb42793e351372aa73e5c22487ca1428f193927bdf899098c0a6b2fca60265f8a16210ec3c2f88b9af08f3b033229cf3026c012750f0b4f214f6472bcdc1cf8ba0d6341e5e758df6e3b62680eff3f99f15bc069de74534517966b90ea8c970055d8fe4413cd7ce836e12fd7d4abf54c419f1d31e60b9186a63057352e5c5ced1e8e5956fac85b95b9c1dd7bdb8d3381289be99e1413f74a5979367d7718c4dc20c6cd4326bcc26bff14ff70622d127bf752927b67950c46d47a44920cb311852d62177ea78d76005ffb7e33c910e1da192b0c345c3229bf2c94db71ec9ad41b77026481548b8f93004fda8179711dec426f8f16112ebd68a6c02b731c46233cd25675f8a0aa15e395e9b6df0c13c63ba43deb38a6d8b02216592c82ca8b25276a4b03796a0364611b42d6ccbc7824a57a3d934e60b0443dc3505dd3fa70c9c5dfca9c146b66f4beb1801aee8ee8159c6707a4b92691ecffe529c40b98a39158e192cba7bfe5f683cd946137c1ceff9b9de67f473036722bfa2e8bff29856888f2cf65ba9227c9de112e73961d930e23f5f44e85eca11a4adf33382efd8915f4de3792d245427548b885a72734a61ebd42be05f3d13bd24f535cd022dc88a9b259e481abc8a8b59878af446bf7612a45bde6b7b10c52098ee2a9f4fca5814192e69e96449804b50999458942cf5028c8ab2601aa8e48c2d08cbd91020b320a6cf4e44e3318ac97b278aa31a625fdad29814292b0a9c024faa54f42e967d8135ef33cc91d2fdc6985690932b39142292a3e168f1cbb7b195a46ae5bd715e02d9fa9968b382c17042589b16a5118e877a0a48085284ef8b2bc2c07a8432d4ae04a2d64a07f1fbd4f728cbff267d8ff26b76dac2e35aa1042c7851c9cff5ea2cb0f6b53f9f211eb5c04f9a70138a857b4e01a6ef250c3152974d181a2a82807791849a325bde0c2fcfdbd3ae982240e20911f7814676354505275f53a2e737d8a707d013591cd7d349cd05aab7bb66ac12e11228e4e7003ad4690f6cf69d190c52f02554d64e4329d9cdba1e7523bb140e3089989e794fdffc6579e2ac1592fbaca6776c1077bcdbfad82743c1d0da8215fcbd55b956e29854c83b21ea7372fdc56743b0f648bb5b917118fcdf8f3516e1524d7f0b5acf737099b606aa5c21082df75e1c585fd02b6fcb90f833639b26e9b73377248571a256bb63325de214a181c2dd44d600f74d1fee0ca876959eea8525aa88118db08614c54b1ca39db56e6abda5a92e3dbd08e319c5d374ec2c3e3702d721d212ba8bc5bba8d39d4434e26cf9d6d3bd82ce170fc5a45e2e1556ad42e8f25b5517079c0320ddd8009410da8bac2d49c5e3fc6d968fc462eca7ba95d12014a9b2b39f2fd743492469e01e53550e27061d2570061f354626429e4efd5e1e2f4fa8bcf0ccd7fe94c57f8ef777337b66d59a94feb63c9190ea078b6828bdcdd0c720e5298557440a296123b0240c7f50428722a54591427f44489b81233b7163fdcf2330ec4e9042c1d43ac5060333bc435500e223e5edfe2da1072b8fc1340cba255420cf3afd58c6fe8c5345651baa9829a25627bcfb45feeb7446e2f7ddc5b5c0490b2b60fdcdf7588e5fc5bccbf9fdd8e8518c394d4a335f6c08b8ad34f7dd21286fbfd03035c6415931595a42d6205a864ef553af4b9d671cc8830c053bac966f60870e5a9566b4ddbebff9faa12ac95611c2ffedade76ee5f34703f082b9e2dafe23d5124e0b3c643a7b60c79a283b6398679ac36a41e3b160d17425ecdf8bde82190420d5750b3756dbe6d617b96d22855b48faa89531e85fc6cd96ccfa8ab03018ee2da49199328c717f64dedcf628f8485e03fe78778bcc567707831ed89fd9ad5662d10d2894af3c7d220ffc23b39efe79b1f4fd149f6ae85a95851eae5137dce4c59bd4c69888948f05ae43a94a1a05a5a3ea124912a536640c06daa4da0f0d77771aac01c5b0a32b6a33f26fdbdd5d9baeeb36699d8f46e484cd85886b1229628fc5877fa9b472874f150dd9251a95c4f977fa6013be057629eaf052114461a3850f462bbbb7b95645fe8da90bfc55cac993da1747f7f13fe267656630d450fe9196ea0f03307a724636c19e2dd39f099e9a8d3235dd14865a5c91765d029fd1926152db0b01bfbde8d8a9ba89a07479ab3c98eb9e8d0a6e37a61520e131f0c11a3b2238d4cc4c508b6728a4a42a1a144f298928134dc50f0ce994b2f59ef4e98372a42f91880d01078ab40784dd6919d986460808b54b4ccd49831c48c2a0d04b4a35828aaffeb243bbc9d28a7092498a7863bd630325e1f7f2fbd33891df00dbb4e79bea7753d206ef677cdfad349365112f7a420cddab9f2f2b443d22937d6fac6315d3a94671418486bba26f6b06125967410c51a2bed449e1eeadad2de34c19df14fc32a6ed5ce2d4167bd9040cafd026132a517ce36d28db355a5b174fa5a330560d57ff6b21392d2aacc4335a3db159848f5247de76b418d572ed0569925dcb4432ae7eaf868531da5465653d6a27ac6e9c0f165f686f37c3b1859da55402641bae0fa529b36512dcfc0abab59b4f18a2628f9c36b7213a3ece32e0dfd62a800d5fa3e84f57e62f0d51f1ba8fd64ffab450733a69cbc7fcb080eca0a37406f5becbe705091ce6c35899705d8f8fa076137807f36d092a4796cc2289cc61a96da9500c65a0bd8123f26f24d318be6024a2ca14bf68e4ed61ef1dd03e5b4e7e815c3e68e01347d43ea30e20e6279a1bda262965fdca9c4845b69c42fb24a94a20c1b7d5705ce3d53c0ec538180c02f78241fd6b303465db6022677b6aa234a6a7c9356e25dcb736dae0eed244404c439d43d251d3d4a8a3af591ef43d5a56d79b483ecd9e0acd2c640e7b6303a8ab91b9b63958a02291e2a013dc6a438ad45c3c0f098114703d4b5cb9e98716a41dd0f18a3da54b4fddafabd2d341b451eab05b6f0794752edc958b8d487721106991f860af6b6b9690d904a866e6b6ce44c7b329df32ecf303a263c2387926cbe1a3a2454e0b0fa1ffafa7bf7d14aad8ade0a342ef890ec049439d3a6810f474162bc890127a463a9d8de33c304e8f069f4a88edfa46dc900be51d62c0d93aa24d0958ee460deff720489370edf11487a4386246713f785395d0546dd5d88652765374a14e96901963a7fe58ecd0eac17132102ecee86c676a0d097fe43a27108ffa4622b0c8708f9f4066562d0043971e33f4bec4d0acd6354dcdf10d4e84474138abbefeea14bfb5deb419c60df5b7a3a09bd42e0e898ec7a48de38f1d8b42bd25c2383e71e0f07b32316bdd4311c9849cd89e86e477dde989fcb24d66f00f4f96ffbf2cae7c4d5aedeab0ad05656f37affd89e91e1c9aa910cda819c641d888cc21a0c10221ff14225eb3e531125bafa055275575e5f38aa7f0049fe86ff143791df93bbaddc6f783fab51a6409b8f94ee4e14c116b6617116a2099ebce0ba6423c14e70d5c187312e9c2615b773e124be23750244fcae85aa73f45ba99b80dc5bf0264d7f916c55ef9a7d80062674bd14e0b961dd51aac427634dbd06e496603b7d70ad08e19313eabe082804ea120f2d85a1fd7296d6893d9854a574b035b8f5dc5f927427370499997e860247431ff92b207421b6b684e193d4511cc621169edcea12180a800f2a17f1342f666d08cd9c0b670f6fa8057068a9bd14e43862c136b4a475623f1c961ccb374ad2a33731d431545b39716865f974e44c449e113b52386b1d263c7a47c9414ab5ca361204cd0a14f7d82ade2f00e27139eb3710ad0f704c17238b86958e312385b4aead41870e5f0c47bbacb6a02228ae5aa794650eb7460593d870a30428c52b64064e84c5135abe3db59892c421323afc6d9e25c7d4164adcd185d924d206fca7d3297a64ba1265cc547894c0d2f101b77d9e23d7eea2da9a8c1872085cdde95e9f22ac4d2e41e52229496993e5e4289933cd4dc21f7787035e87db676bf7f36397dfa4ffe433a7466e5b7fce1f92d5147656dca2c888e3c0b38600093587955311a9a4509979aeefd898d294ce24c640a816cd8e6bb3c9a42a8e366432c17979a93369d950b7d5baa9e38bc573bf460109a190ce63af0eed5ede0201c748d01ca4abb714355851b01e17837f558bf32b3052cc8ed15473d4fce7cd5b7998e235b85040ed99fd4a734d26933c6d2424029f441f5538c7cbf1368a9618077e9e137deacc6ad2d59ee4b3d2d8ed7f4fe1dde0722636542365b621a176a991408eda221ee0a231547e7f1a6325d0901165bd9915a0e7288ff282c63469622ad2d35ff75a9d94a87317e2b16425e7ecc2307935cc7106240517efe59c0649e260253b23e4e989634965fe6b2652f5f6209bd9c78550240b46b78e36c1c5487e35c00416842aa3efa80c88b3c7e66b016c4cc949d4767c7d019d9d0c3f7d229382ee6a6e7f8dcb806c3956c4836b44b062d77bffad0923bd7a92e7022a016a1575fa95052fe8efb59aed5617f7584b6d2954c85b663757803c6f598bbd68d6e643e63016798e4d1393b72c38ae9661c390b3a830f67588eb756c990a80a6237e406c2f763c830c4ced736307f803f07eebd8e67d15233a556e325f06d1ee2aa66acd48cde945d3bb94af1cc010ad3d1fa8369f888b83478d8ccac800e91129a6a7b9b37f99cf3b838808766616350c86f7e5e48ad2162ad4e02ebbe6d91eab6e79085536a037a0b3bdf8078b6969a8bdea86538d545c9e8ec1f10bbe1880cd099209975e675664aa648e651f4ec0b103ea9ed3b54a668fead2fdd8830b77ef6eeb9bc1db2e50b0a8a0b34ac6e40902aae122be223c512c584272b0a47881b62c97903f3a0a3830e6d84f72a35ce2e5cf9a9ed06d7c26fde09a72fb248b2b5bbcb48fecc86c17c6144a53036d37f9d4c9438c7476b261880e9ab27364498f32dc23108713a32cd9c8f7e30dcb70537dd8178e9e19645548751dd466b4be59861acb12e1f3e9c06c343777645509835eafc29d9de015544250b2ebfdb062386b0c49bc13333f7d61e27521593496e7fba6ec2b967b31962b6399b5c4b0ee8197fe1830462ac85de5d75a1832ed22f894cace53f26d04dbca71093bc349d89a775851f2ea4b4f9e73cd32a2c3f73021fca410a8e4977f051c4a688a0680ae40095a0f3fb727306be3a4344875131852ed7bd03e2aac249e841a13a6b228230221a2111910f40ab61889c6d7d7472fc8951de25e0c9a67dc41c4f138b078bd5377a1f2c2253042c7870a3eb2344f4d61482029701fdd55b594e86f1411021df144deea89a9d7b4220e3cdb9ba757387274b374f5bbc340085da216a66ba0b3ad1540def0854c53c423d58d856cae639f3652ee09f105a0fe3ccf1e0b2481a470a6207fb4da2b8828671cd338b46fd72765f1708d843f62d2e06ef7be55f8e4e6d148cdff78319aa2a4b4485682cfbd5af7fdf234e006d54f7ea8f5fa6e7983e8095bbdacf538c74e88dd76c19cd7ea907d9e9d1b23a2113c2f076b147affa27059ea66ed7bdbdb2fe356b7710d30e76b014e75bb0161d2f7f789de289d8e2e989fa86c3a3841d3962e75163184944da4435e5c140b36f38f04f1b93fe6c5ed03b9b8c10b2e227684007a0d520957d2ccdd10745705e2a7bae38b602e2182b470224c4bb33d8f0e43ed0f8f08e82d9cb50f09e137431cf3acb3aac1676cc8c9a7e0d6f18189d51e106b5e7ccb3cb8ec2560873cdae23c8aa356645ffe43aa1438d0f4767e821d3b2c288edb522c863c85fbe018b973811bd30957cd1ba0e56c63216270ff1a5ee04029a1e5f862293fbf3c79dd7b8668c51ad12c2453ac572070bff3cd7a5ea2d46a4b686153cd02a5dc8e2af18f93cf3b90c23a277ee3698773a333e58ef5e561a6c3512a9fad86afcd1153190861c9250ca8e7d8299dc888dd3f03012fbb9b1a3c693b7358d9fe0c62ef3464838040e774df544628bdba18e29ac68dcf5d798534c57b86e0c59c8b6255a680f00721d3b8bac4696d5630af6b384903d3061062b53cc115474627aa9a6c5df8fa389f190461d80d5137949a8a25aa153657796cb3c27ec7257fe8e1fe1bf5b7762d5b80ac184c6c1b27a0bffb9605945d435ee459463f3c43f1df4c5035e6263ab26ec37d60905db930a145b7079284dfb1d2f927523e5285cf265d7fd4b00d49e994bd3dcab17d65f4811da1e1f595e461fe4a2ba5346d3d4e52e582293ac5d9ad26fb24db995bf5e9695dd09b810f7cc3555646de199a44f1801cdab5ff42cdf7ddf16f3540c040b22a6bf3256ac60a92d9f155b0c441cd8d0028bb9b8aa942d94dd8797400374ad44a45f918ca7ed3bc5626310558a763e8a57e1924201a3a30ff3c54d795880e7f62f76900a5612c896292c748c3ef83b33f8d25e5e5112505a56f98c8ff90a1fa52fc2ca0963891283d60f382219f9e9fe694c16768a0f7a7ee26cf23215828ec26a499508e7156c961304caef057bd38e95a9f4fba715f013cf16dcfec83aaad8caa5e80f873adc4c2ecb927ece1c01e009e0f2b3c4aa3df83b70b01635407b2e745f7a591074d34e95d3cb300f13ed8700965aebbbf4a2226950dafb9419241d40542931588050915e5a09cc024359b19970467404e18106c01d4d34ea4645fe8238547c63a5a1cc882cf7631b428f51fdee4524764a33f84428c4259edf666b45813834bde07aec6ec990d8b5960f7011f1a0f8a1694ba798ba5e7f3b271cd1880b67d6f6cbf50af55a47b2fc3e8619766a4458f976e2d604dc9e2d305ef112ba22cec94de5c8bf2a61ec81216ddb1390928f035547d07849ca823032c0bc1de02a9f16707bd9d7c310746781895f782a3e5493176492da53509209985fc38177ee0b401d1c3c34deb43bbd5406f2066affa0b962adcb138947fdc4e0a7d927a30f8a3f83409f2e8e985bedaa89cd75052b8e3e18daa0c43ddb3b2c6b29be956d14a3b24437be135e4ca85444ff25861c16dfafaf119bb2d172c40c6ad0c1850008124c171658bd4f1891028891da5805023cef76452da28780be5314b1402d95792f321b4396bff2f16733a526d18e613a4abd1edade1fb4236f421dd182068712980ed30ac1f90bfda58845c47f0436d1a1fb5fce683fe1ce68b8faa91e51e3476a646b86bfb1aa9a68d6475292af7ecd392c4e29b361925bf5c5eb60966acaa0566f3da7c0a0d9b08045b4a193f7edf6d7d160a7f942c3f93af212c699aac70475664c7cdb45b5d7eb148c0639c232f1f3cfe6f440dc6d342c49e51d34164908b04bf16db00142976f072d6b76762e7658460b9356a80742a3286f7d23a2c37275e1f35e6d0836c07c2fca8ade67e333f6b5d444af0239267a3dd9ec8f9d45453a52c8c1581529200bbcc3440b0711df4179e2b32398dfd8eda1452878a84221d3161451a0b6960cf4d322ffe2ccdc1dcb58c97691edf59c127682573321390fe68e0eabe1990cf25a02544b6649c9e21a4ca1895b954a1da921f2567550f98da71e524644d5c75c8d0c8f8a9a77a7e22f816490837143db74b6cc06290078a28ea5d307dcb847f6e9ab92632c10a975ef985f3dd8577c4d94bc736c610dcdf05306bf241561bea814c1176cedaf172cb9a647cc33fdff661e1d4c6c0fa92e6759f5daa4863d00d7bdd5083b9bc6636c9b448d31a2a7222a31ee1d750ee2be281456bc65d4164889a790a9860df76127acb670e76c9bf6b1c9f88e703d89951c9f3b9104103526e8faeb0269a896f77b3536b589d57ccc6dead8e215d5b735e57bca65e350cc9e6b27d4e56382cf4f99cca9d7cbfa2926767075d4cb93c2a15f3ae605c028ed2f76c66964d2a2669078e71608da8689eb18c551f66a035f994059069d6b65df594626ca2c052de3b39e40b67be6b6c81ab8d1b3681def4ed24a2a887cb913528976445f71b7f37de4ad09b7a3e675f20ad4211e8c2ed2c8f6bff99894a2fd0d2439dc2a7573fd1406dbf693708c466cffebf1524ff62fb4178da153afb0e484d2c3c99ac99f2956921b4f0374cfd1845659e264733a7284e88e62f9a05b7aaa1d0a2c9fa2694a98799bc2f496478532785a85d8878098235dfee39391490e40f809c9e99a62dc92077774ac09112079060b96a0b41e7a6d8c844f9fb44228647160c7671a8e51afc93c456c3eecfe0bc7209dd9338a4739c2a0019f75acddd39b9112424fd6d9f6d8840550a5c076aa3396a88eb140e72000996479baef39c3011f500b8df8dad452ac999d31523b1df0d1dd65b8001ec7320637e963ffbe2a7acc5c25efa301bb1bd4ffd76de8f0b673781871dbea1042c41660da05fc818b4ecf35ea449a063926c28697e56f60bb44b4f785c29aee5e2a8f2b87cbf4183162fc4f225746cb847487f2a015d3ebd3669efa843b73ef8946418308721636631445d0e7141f590c874d97646b02f02e55087e8842d2b0932cb568be88c3968127d92f0f52de93c1561384f57f8827290351c9a3b2ce3de89362277da3367cbcb0e3d20130576bd62b7124b3efed86f8d93d0cab1c56282068ef568dc71b968646066492969223ac7af1780cc43c1232783ffe55627c7b0c330754fa0afec125aa9e596dcf2495a7ccf1bf2ef8079bf7ecb448bbb422162da8a5008498a9f6ddc9d09c32e88475ba302a477635b6b4d278e6ac659d975c3ac32bf58b4cb87f6ae1db06e6420aaf7a19a07499707d388ec144bb0891fe78b0ea65256c2402d74f4a15b98d695ce304eecc7c4aa518577fa908a0b3cf0b43c358d64f3f89ebdc55926971e17b39a25f26c6e5036eef8ae1b8c58d14b4e38cfce80a52d83f195f5541ad16467154d72ebae33917d462e9fa35e24225395e07c2c2fe34028e0c1578b26ae0b07176efd39ae2bf057a761805f4e5d85a2167056e4f0530c8e6dba631f029b7b3acf4841251f4cffd19b0f2e581f4b28c18c2b9e6e673ca847033adf5ce57963eea9bbce115081e017aaa347e5a8c0e03baae9b77c2a57c1c1b0e9caa08f8a6109aa01d5b8bb3c1a332328999ef26a5fbfe84a43be7b7722d76a8fee5d12f10dd858619cc6e8ec57638535a822160683f304102d92066348a403e014540f1d520ff02e86f57e06283a91551c27f9f2d686a32968ce036a3c16e77d3c98d1d9c16fa853edbdcfe7d7c40a10db589412039287b9e31e8869ebc38867eabc1650b346f0fe8898e00882865f43d9080f3ee78823c6e2525397aa1563c123901c5ca93a7b5b15acb71b15a8c52216fab57578906309deda0cb7709ec450e20ee156a8841ca5f10d2bccc3b11f6022712af78266bb374e10e3eb97f27aa9131719f6fcdc87461d085905f41c38c047b79ab3f421d4dc16cd2f839e7a9091e0b80659a8a433868504b4778010b280594895d91a2a7e6195d1f367abc707f9da3d1ea51651a9cc4dd00b05e731655054084f299ec68349ba6247951c34d2aefa266b575ab5dc58e5d8bc4a0c590ef9c4c9ba10e66a982135eb48f2f2de640b2ef6fae6c86548059a542afc368c11628c79ed154041b01282448493ed406990008298b14084ddc47e21a140781be8e0fa0332a019daef21172af959769cd56f6edb05b247e53615e3937031ab0950b3696704a46466ed67de8e43d83f6e3d4a4a94408d5fc8ee469bbfcea381452546d4f900f7d18851a7831ce68dd63ad6c669e51250befe12a08e4172c5ecdebef75f1ea148445b2803f09b5e0f14cd1fc05bead25a4f418f7d16a3985158bec6168153d0bd1b11a177c52aef72897f442362bd7ae034790fe77c64d908ba4044a1bad0c2e599da8556bd1729160a9cfd2df55617f988ed2afd7c055febab0da4a9ce88cb73aba72f4fcf64ab4137d6c07865587616c3098df67e7d7d44c45dab41d450c88cf2ffcc60196018876cfb2bede995af5cba696be8fabd71c7e561205af7691446ed8b7400b7bab3e1dd96a2e314fe51594ca11cc280d049d185fa41771c72f856f6cbb1e0782c255285f7941146bf3c34957cd2825bf4ba3b01198ab99947f244fbd497f0ecd0a448ccd2ab00af960042c7a5acad1ec53d8c5859ccf245f794e166c008207a811e718df176e4476fed3d5c6623f8bbe479d65f11fbb4c0436fe7e596a1f06ce0bc9f5f663e713f9ae32f0ca72e040cefe39bfdae411bd276707e656a9373184852e2f1237e6a85722b9251dde10aba2c79cc59724427710a1371d6abb5e66dd90ee1e2030fb871548aa2858ed16127dacf62d86ae4fdcc958a45fe7763d49ac26c27013148f9a7d46f4dfde814610468ce3c0b40d94df651e684867119a06c639cdab1aa6593f01dd0966d1ef28f731f4bcc4cdd02c7055663c31ab7833a4f1341f53eedb2599d99eac714176b759c1ff8584392f02d079102843b9e174a60c12c3c8283d0556bd31224659b1795abac1e39121068b1f1797231e2e5b754141366523ac0d74d7c833f64bc752a91469dc123150fa36e87fe2b11852a2470529965065231c62330f1b88956259da4adaa129483a113274e349669dd83dde0814e254ed79e2ecc0d0daa6096e578b1b32ef55312e17f548e618d2ca2e8dd8cb367a0511e42878d5d962377e841a1e4c38164f5a381fe610a6290079264d0a7217484a5190a67faac90e4d9dea10ead5fc6039beb7750767780fb2905527c04a83ac31a62c9dad71559d8fd8305acdd2c8dfad1ee33de432925abee2d0f0871570531fd348c873ddb84afca643b2ec03f9c5a34b18c4d2faa17c25acfcca40c7c980405a5a08a359b15ec71be6a455b3cd161019fce2abb6801c4037c09401195aad9231330878e079cde465c4031aa3eebe1990eca26f3f9286b6e54768ac266861665716b93bbc6e0566217415eb591aaf433ee6bfc1693b6961ccc590824078ce2985f97cdb53edd41e28912fcdffe2bafef69d45acace86a4475502fbfb53c396710157cb94a22d24f5f4c124b196f4fc61ea402c29f2ce6140c0a514e28e4bc27858fa94be80c616811e217ba6dd6f79429b057ce0637a2ad7870f2ff6cab574d12ea06c8a21baba3087c03579f5ad592cedd5790b59fd552f3eb24940c19efe7a0b8d0aec5de56f2482108d5d5c283ee3c865a172f550855fcfe74bec8dbc9be54db48d0ae068a52f38f3cfa1b29130ef41781bb606f5b30926d85deb6d14ff8624071c73d4e093590e4081994a4ab36c17a26f6f374015790313f560b05993bf420a1cd1cfde7f8a3d3b65873db2736f4dcb3f45e793f6d5cfeec65b5d1dc97fbad68d32be67d902b9b2e7942f1d0ae9d514e86a5805e068e21414496ea4aae817b8105915b0c1e6783004f681304ac349b8fbccb8f1857a8399f29ef2f8bc39625d6bc8d196edc4e23c599224f84416ea3302373220bbc6dddcbd063ec2bbf24fcf6e75e83610dd125d0553b10baf4d7f726f651bbb01b27e0feb5f27ce194a50d1d1961a23969d54f340f9888f0f8b08230b6fe4193004a3ca1bbdf77860a7b662d1d837c40cce2839c706cf99ad26637cd5223a4d3bc8b5ba1bf2380e63dc36a0f793765a827931a117137d621254f046ee084d0ef97e7edf7ed8955d083cf28ea9653d6fee1b73556fd9710dc4a488d21da9ed708edb0f70d898c948567c841cd09f98e92c002de89378325b9224dc4cf160c7925f339edf743beaeccc311324d453efd4fc5c9bd4f3afb277a4e4700bc652a32b43f02741ab9a145c2b45929a3270f3811002c561abd9e9b978d60d491b2c07bb78c39508f25939c8765794d41fe6ef4364241a2c620c96083f2381fe618b2d38d7c738a5f0e2264c4d79ee09943788cee4a23e5d44c122c3fbf5e7cb8e8169c5f91ec96a333a97d339616e223bfb01ae6e5f84e1960a34346143b41fdde5a6b4f93bfa48c1ff48977e2392267f3ae8f18907637901c7002d56146a07a3b922e4491c99ba0f2799af118cc79841050bef3e1cf8cb2a6b6145aafda2550c170a80b68e7a3b135dce5b743c5bb28a0dc0a0970c83bb68e835740a69b6a7d957fa4e3ba57640463ddbe7b645a741a46c739635cfd5a6c5ae5f0ae873bad8c83971f8c9b40df74e50c6e389890f5edce725e0b33b3f29c483d86ab5e6f905fe94eda91c42e2fa80f64676e12906869698754a503dab035d0031dfd36812e791bbe32f2d877f9cd67e37fb538b5ba0f682640f27f756381df6b6798e667b7c300e6387e2a912dc9a2906d06c278a8ac037d1f1eb28388f4a3783651986ac3c75fd29ab7f4b21122abe216a8ca01c27691d76afcb359de3452884a384cec500b10e55fe8fd667709472fe0c3e78195ef8402d9dd10de3375337dcc2f26afbb2f66f73bc228f3db40fed010c5c70d0b0d7ea342506e20acc4db14305009b5a7ba0e604750d2370964dc954a600f8ec83aa52fc6b788745d17bb8239a34ccf4c0490bcd72baf25d5d4c10aab7532dcca3edfbb18467ab93c5d9b15a9ad7d99a8b8af5ff1d2ff5df88a837e9148c1ca116d95b80d46a497fbc5fc6abfb861a1d9297285d8f92e103b792c2d2b1bd78495e292b0f29898f637458f18e9607215ba57a22ca7aa717534b8a9f84f152d664f7d85eca92c85f9c50d023f2f96d8679d7d31db9ce5279bb315da86fe7059d7eb35a417dddf894a8a2ce25c707bfa4575e0edac96cc656ed2d6a932a970a64cfa6c66c4c97a96349c5d3d144cd9b3b2c02cbd6e3f166e250432025698c4c0017761027fde65f47680cced0af8e56a73051413f9b6fd496db6e568cdb625b4106b29f407eb97fa60cdae227cf1eac25eb08e7e5644db6e1c20bc84430533bae6210a103e78d33225f065da8e2e5da2e8598b25fef6812299cce225b2a89772220ec3ad2bda647a3c6c55c7c8a88a3825017401b1110506d3a4b7397fbdfc5a79483b6cf2d28344e5772ff743a8e5d2d84d1e1e1f05dd2a177eaee8e0e7be50222871259b4a3310d8c08e40715bf3d432fe081c45b276399f77f8c47342a09ebb0adbb0d60f37dddaf49a16b6bca69fb5a84c59b7844c6b43c854648b01f1438bf50f59fa6c9c7db5600ac489f5a88b5f56529f6d221b3550c04d2ca80be2e4b30ce52f9cd4b9f1e887007f05cc175910e9765114c02d12b96d3722c592bbf5f44e859a40c40735427199cd1b0210a5022bd0c313dfc203083b779c546523f8b41ae218daec2cb6bbce77b8fba79043e13ae463a654b6c75d617b2c5c6d60f8abaa2f642aea0b4b52e8c08778b5e8f29e00332690ecae1a9f188e044e0d45f6ec56e2bb0e05c32bb7bd618820da63234d4fc0090922e3cf939da276d1972db9a6c6ed29891aa48bc46212fdb5bcadf5daaeb15e2bd30c69fed98068e6fa87e62256106b459d0ff179eeeb6b241033648c529b7eadda4ce1bd0cfefb6ed98bb9578e24a49b274d111b34648e990dfa798332c86770d0ec871553c824e77ba78c6ebd37c42858c3d0789c1c91eb8abe3fd671656cf68306ad71077a7ce761cef78fe5e48ff5c736f301114ac7b831e08fe66cf28549fd75e1245b8ca94c41e7801e320d8b6fdadda50d06675a256bbc1a9d3994a876cde4016365faa944a604a9b76888daaf38d8c2da8adc1df7fa58a9536dfbe3ebe5205a0aac4ec94ddfffeb4d504eeb52577ac984ccdeaf3026c123d080d337fa1161c7a39162361260b1d0ce6e8b6a8c6e05e00c2070e6c48060e659164a0494a7a1bcfeb9eea9bd15b794927d7a52f0e21d527ef587aa0d2ca2bdc4e376fae8f2eba58a71252fcc12ba53bd19f4625382362a805c8652df11a922048f770bca39fdf9da9fd18d2e192fa49a49dae261712203112ff9a7c8fd68d1ac54521dd04981cd1541f1ba3886d04a457d3fe839ebe9c6a3756795fa0cb43165441fb162f01364098c0cfe4326464644aee51947539746d938004b02d4e6f2eb5705128b148629197d12a3d164c602d155efd74734b2781d0e010a955e4e2ce8f5bbb9a4e5808a40b917946c5203f4adfae4c3b257684101fe55e10b6e855f118ef591f2e2d692af2dd2803b5458b26ddca87da3556c59a92c2405e31d53464b4229ae8bd723682def99fdd0e6ad9506b1e079ce0bdf11dbdfc07a04189e169fc23c3218f852f3d31220c61943e45ad4786b4b44358303e68cea300fcd475edfd005e15881e5033fb2d75e264f80991762e6094d4194f0a422deb3f6aac71fb4b7c85ee0d6f8eca921f1315757ae0bdd1c21d32b7b23e42b433767e772c1b6afe8608144ce28e745b21810e16a0c2307b27b10f1ac502881ccd4e599aacc270cd2bd5bb2e67abc4e1a85989cd95d2fcde0c52569eea2dfc472cfd2c69e6142e79090d0eb58f5ee452fac5773362bf170a2b66780968613c489393bad9a881da55f4b5df97636bc12b09482cc3688ae582a52bc2967675c68fb942e94708a0bb58391223feab58e1f5196cb203a8b164f41c6d41cfdd020c8f7250620213cd0ed4a2893c32070e1a45b251b666be873703a4e361bebf695a676a2bb0215ea9a2a5ebac94f76169adecffe9e44831ad3b865bff6e046c7f1ad743e544e21035b68b68533631d535385e43acf511a5fd394207d0d29efaa4edebee5b43c436e2681973a3c933afbdd5daa81a25d7796452842c26cc149e7888b0956af02722d47896a6a9c6690a8d4fd082eb68e3dc78f5c3fd7604f9683181ba16383b445b7cc69a7f36994a79e22682c743d3d01b1fed805186a3926ba87066437ffe73c168caf62ddc58488103d90561a5cd2bea879f6ad9452010a70a9a01fff6ec804eaa76c7c96a1fe4e891243f476e2c5e0efc0d45871b44c285a51e1dcaa40db01460c88252e26a5e9aa200b83821aa1c2f5d609c2fe41ea483b0a845ee92b18af22514de741b507d000b6d0d86267d5d319fa447d3f68e6d8501b1a82c1f32ac33b755da9471f175ae464f057aa5d027730d0176ef6331a07f8bcb6f498adcb0b498b3df3f45708f2a9ff9a5debd4855ae69b2fabdfc4313f6f5ed4b65f516bd888683168735ebfb916346a6bdeb21c36ab98459b87551042a20f638bcf056353a8998efa9fbc0cad6da6cd01ab4bf7dc5238855c462e892332dde726e4e6c007882552f81e96378bd6b36c1efd76d05055c651dfbe8c7207b4285e1d1fe767ca77aec191bfb0ba2a45662811bf1470c8007d512702f97c0474a77e16428f617c4cdb72b664f75e5ce2f0bd939af74b612dad932deb85fad5802e913014eb9b8edbec79d3a227987518331ac4a62e730fd9ec5fe9822d2096ef0a5c24f4749bb454e973aeaeb92c88960ece80db310e8ed087c1b63bc1d82954bbb2e7e1582d5f5b03796dc995911466cee1845795504cd804fc24922634dca894acfed252169522509d96bd0ef6e11f610906a4a8f080008863ab22ff809161ff13d56a4264177644d78dd158a9a631282fb840f784bf6cf7b2327ea52fc4075267d735bd89a99d1da382118b3c3bee26887d2831f28a0e8278aa4b4fcbca0428b67e3a807a819667d50c82691f928db97c4933a55a5fd2b5c617dbbe1843f265fc75fd7530ab9baec25630549edd975a0a59bdc257f945f982f899857adc0a08889fe003854f2d2896bc48e3a3d9cbfdea2cc0d7b8198e575fdd20b1be233c7f75002e9501d65bb150000edc0ba17d8cfdcd6773ca60e8316b67b905b126c0b146b63878a4eab037fa72b87a2c76b897c4d9f90268e3b7923dea3dd2d3ae3a3fe5d8fbd3e3e31f7f1f5ee4b4a6fee7c38f5d3089f11cdcd7cc7dfa02559d8edec76a9ccdb21bb83f085dbecec2ae886577717479ed6f24a0d6ac90c9dea8d1e863c7b7a7692f3d6ade3e5f78da1a14be94d2224f555e0b38c14fa77162751ebb4469fbb4c8eb5c9207570a1398826b967ac782302aebb81dbfbe65aec83039d7c20c51a189c21c903a658b8a332acd21a5e9f2694cb5f165aec7d8de8e2b6f65db782bdb0aa321dff547cf8c1b9f23b18969b760f15f8c281b8b10dc1c2b9b10fdcc35a53774ede33fca3e27adf4eb0ac660e59a668f40589052c8358ddb6c60009eb9b244c12ccfc47542b1481cecda04461b0ce4d0aeb0a8eb335eb4294b6930039a1cfeba3c840e6bcd42dbb718962d29f8a4b3a862fb8fe574cf60864908fc1e0688d11be728f0e195ad4c0303fe875ec0b5757d9327994eabecd16d8e0b567f600276b2e782445ff6ddd5014598361f3063300be486123bdb1116243a847bc5ce330d53ed9f1a7ad8d7272e9706fa15a9e76f102408dfb2cce6711194461c608dc7c54d7349fa86b8b526081829dad859ea99147a3ea090836e3f1f82f47cf571a1b97eee07865d8aa3f4b52bf6b3b86ec61b31d0dc1191b861b913d5871200bcc5dfb679ed9ee5e32df7bd94bfb9edaf764cb8677d0b8a6470492b65163a9149eb804fb551fd765af4579b70e1befde03d0f93d13a83fdcd58baa882884345b0feea2f4b42dafa0cab21e5f03c97d42aa7cb0db142e0816a005803f836f593cae512c4cd162f665b4b404e68e0e5676028fd8d6d33abd3eed2e2deb359cc16ac56e9a7cf5a321031efe6460739e64d7e1ea54749ed202c24a61ef71236b6a9bfc80dc96d1ca7527470c2f410e8f68c48aacea57da2eab6633c9f06c9f30940548357587990959eb7d3aa600f9d979bf45e1a75e3a053f90b6ff455c7b193380f9dd8295650f987f59eeb69e3eec2dbfd9a21aec0e10a9094628e10342f2445b314d758ac40aec50d0003e8e81037e4d70a8a5a61efea4ca24e9bd2daea43abe240e33dc88db25a0a559fb4376b7677b1d3d6f31b7442be641be644ac7b899212de863a8febd1726e6e63177e36adbe7e98dadc5f655487e96fb528e81389fa52600588c9d99cc90d64ee5222bd76194f9c164978dbb58bbfdab4dfa19d1c9de562475ec2bf70fcdd974363b74708b9effaa911a93ac178c05a3643d5d2725e05d7a6d1bf2b5353c6177cf84979cc30f2811f63509a7757f3b1eba7d9b623f01f2ef8aeb2c02b85d8b38291f001a43a9bc076813ed356777b155d2382a752306d3cdc93ca79fd4ad88f2863cca45401fe3a6a69131d7d6540f47749aa42aa5ac3b1e1683906e908438d147faca04eca1b13352bc9cfb0c271976ceb5aa1d5b0c127a0a460b52e05d8fb09384d57edc545982ed5d9004524bd259157f6bf72c4059be1296fd07b1a2b9d1844028a619d434b4296508706100ec4ad1c6dca0512439c42b5a0c6d6815d11240349cf6df6cc91a7b0609ea87a28606f4abd83ef0add6446caa3d56740d9ca2d939c2d5f7740c12db623e31dd12752913f14c1bf424c2a88e2fc77035089a33c95335dd13f8627f81996638f198af2cc1e1f08032e9cccdad1dde407f690e8e07a3bf5c4f8fa1b37a96995636de2401702d327f5d498ca98bb68c254b990e3e04b8bad15bfa5883696033f7929853cac5452a2096ebf3f3c5c4b7fd2713b4e407252b9ce86a0aeb412cb355392935aad30df7aeee16a2eea32652d81fe036b80060434f05a56c72e88e0d9949bec18224826a01a93bbd8e0af8931148f9d2365f1c486327d47685f06c005b52730373da31dc7d736e71b8b87168fe14a33eee93a71b49b74c45774d4e95cd76d2e14a052afe7b3447a30491444ec4aede03dba27f3486716abeef839859f3b1b54b33ae6442fc35269e88651fc4e6d331b697c546e455901e92b2606fd106ece0da1c4c6dc71218d0d99ae1768c4eded789f511c340ab78ab58ce093e31e392ca4621fc21560de77c3b5c979d4e9eb6d801a421a503ead374628715b5dd1295e875db8671236ad8d9fdfdc131f7f113c6c024caa29730cf6a5fe4ed51bdc854f458f9177e8513c2871ab9461284f643c866500e35d085fc1130966e29be2d12c2ba505aea98720499354d9bc8a1ec64f04bcb6d68db8e55a1c04720c953ed2ccc0f39360e9be333362023d00ebd8a5da769761c75865d72992ae092b7e48a38179872569921bab0cd2d5ae691aa1ae5e6ab98864ab7162af6e9ab0eda6aa26fba9510e210ea2a9964b36bf971524096f2a109906199665d12074b123c7932315e670b00b23ab6721226d00bad673f8141e2c426562045580e364cf2186a1249479358a7e91723693782eeabd181efb42ef9e40e51c249573e2096562227874c5a43c8d0bf70b801e54cb11fb8ece71fd5cbaa1d94029b5bd422d279634e81cd39f43b7ead1ee85ad935c908cc59759d54efdd58004bd53cb195b834e2d7d153e83ba43179431bb3d710195b91b5f55e6959dc356af782f3c27261ea00c2a72088799833b0c71f9c3630e9b237481e54a13e5b9abfdc685d1f3d4d53a4e6b6d9b5dea601862265653daa7cf0b5103d673628b0c5277bfaed8c4f5cdaee55dbe518bdd736340bc38747256024c26be3226316841b96d58c7f49dc0539da40d5c68cb1b4c06620aa4547413d1734ad3487c5b40bf70b7e4f20abafa0931de4d41e0d2b45155a3c0c86980d35d6ff903edbd78e8c582fd20ac2607ff8540e522761fe143af4e170bb24d38741d45a0aab1a62d31d2fa04b30d83554ee3c3879ef4ead8492e41544898ea7af0962216bf7a57e681cc0788f5953a6b2c3a24b3ef0a3594b0717c364a60f86270dca8fddf94ced9eac6325b1845ee643bf741844cb2c19dfafeef09ed88d3c8e139682684e091dadcf907debfbc4c344672c0c679684b0d649a2ce23e1dc9948267e73f8e8ba2202e87b50c1c4a68036406848b7c0ae3a05dc181e2e5eae57d73d738d81a2aa45153b581d96c191ca7258fc0647e92adc5642c6ac3a2dfd83db923638e7b9ce032b84c58acda45ee1d50216e5db88f4e1a4e059a1d2e7afbc22057d6bc584ec2a1715cedbd7fad9430e3ca7e6a66474634f5d4c6bf4b3aefbc5b8f4a59383b5cfc0629015eb5adc115c832434635f8e3c0780ef9df10c1dc1837d40b298951d0c03b2f982b696de350a8dcb4f4c1a8b1d196ef72ddef7b20822642b9e680788eb63fc88aeda720405fb964e42e607b2e6f94bb026a4181c70e523ac0569bb02ea2da49a9c6a99f69411d0f8b898044f3909471565a3fcddc9a50024f9953ff099f3c0ee212c56f88681889caa32020641d938d7fa56dbe1f2663b238c1266a89c83ea9b15dc70145b7e31d44af21c6cd146a2365aaa59a2cc2a15cec1591d87bb48c01d3eb992c38ca59423c42fa8eca86e45c6960d8da4f7ea7f2496080b247308be941b2847ea5f62fdd502a5047fc968c0593e7bc9d6cfc97c7cfd851726b7a02394e3ab20fa523449a2ca61e82de1a286341a69da575348bd4f5516c40db1ba95759011ca60cb34b06eb50bf1b1375b3eb37f0f2d93ab1b16e06892bcafea4321a9ff71dd9d5a7982164be9fe61470179d43a33d9e3a037e1a2a69c8a0b60830a397c333cede6813fb56bdc1c6038e33cba15484ee5f2e55e6ba28cb5cd53f77bfcc2473ba8489334b8b28f46cbc2a9ee1c098b6e5fad0728795999edfc3718be930d8ce690d1939e55d8253e6fe13024d0e0e6d9cbf8593fd24300b8817611ce1ffd8bdff4e8685244f938d1cd95dbb87a5b4b7da440994f10fad937e7be4af0ac5e10ebbc2601af6d20a38607ce2ff3dd7b908189502f00f7863d6632fad91dd7962e437d52e1549a21834dd8d034a97c68066b76340bdeb181214cb2e6bf06e8a69c7083beb2a794ad1c9195d96dceab2d5b362b861a3b25d1d1a1eec9eb1e40deec5d024f3764347338c0fc01d0eae1f0496ecb04114018d04faeb6c562872a6cf063d2e9d28114b14bb1a5c24dcbc511256126129388351497aafa20abccb4dcee33bf58ef0ca492ff0b2023e10ad0f50fe1de040efae951e24d91477ca168c0be4e150088dba220b0d14e510118bb8a88963192cef683c2c6e157e133d7213d073c419500503d79a72a69b972f3aad498b6054900322125516e9e4ee2e6e0157217581a36a5624cb0259ebbf13d630de8fd7f5b8fb72471d25a2f4fd971ef6ef0708bfb7a22a12f266a216dddb270a27f9734fa3b76fbc98b5873c7d18f287447cffe22311c154215cd775b038a12d7905d791466713fa8f9d3c247383d43861900ba3281b42c02d29af2e052c995d49df0465740414dce686e6f564c66d61cadcba31b833d38119cc4c436c81268c5d968c58894d4b7f792b503799ab55558791d65f2336a9407378853149ea2c96aa5d1567064a9a8d2efe70d17353442f71f9127413abaa320b62d76cdbad648baca4a79493fdc2de07c2390e2fe474edb46182ed9132ff1984b405f7be699e7e3f0fcd18c00a5e8281b2d4071c2f2382cfe2acffff893e3fdaeb55b28f6f85eade67520b7aafaf86d50c67aab35bfe189b44592ca1462991eed2b687149898b86e0f22b65f674080c1c257f6ca4e3354c7dbae3faba17068e4c344d64b7136aa364b277a08ee5d387348cf951a1193da837f78d77a8941ecd02b592cf59d368cc3ee6396cd2569fb47775183066a7cd01d95ede1d9158d32bb728cc3c5b9f6fb893de64350911097bd20914a6ec848fb8727560de095dc8f579698bc4cf402fc36f3cd872a902f36ddee29f387f41b306cfd9264f9c915a90dba72ab60f37671d562f74dcfc171513caf6e50ef86fffe3c3480266fc83e7d843ffd410a144416d2f613bea507517940525270697d2424a41edb4308ddfd62d506f0e656810cc28a88b56b3d3a5ab960495e1bbcf3839ffa3c8eac1dfb7338fc239f9f3792cccb6dad1c99a5eeb0924eac9f0df0bccf35c1a16def96f0039232edd6bfca00257cb104ef195613da0bedfd7d00fd359807edff8775333e8d7fc3043da5704343a2211119aa64907c91ae5cf3b0fb0c148fa801c6a06aea0c71100589b860f50d42c4a94689239a275701975f8f2161725385f7e8141de1a0ee428c8a374bf05d9aec302f95b25e41abcaeab37ccd0b3d290c3bb807464125aa697e6c6a6378da882a907b088c068d405d5c379a2cb4256d5bf1e65e2d8bbec8c089b9afa143aea7ce6f85801d9b90db3f2ad6fb09ea3b5ece09bf0a710be992ff43fc2eef37f7385b3efa93a3a3563ebe2923a5791cc59b3506dbbfcdd3cc3d306cacdd180b0136bd8a1881be641fc1ddba150d0ef9b079b0741e768a8c8bff13eadbce10b8e9f9b09bb0bd3be18aed98e999650262027dc4b5df01d418da4ab960ecbf5810a55a170a21c8adda78cba2207421d0f5b20a01d8b3c09350751afa7359972cd612bbf92c0cd625ffd54101c3a07111c2509ded3303d01502a34b327c014e8b4580b2ba4f783d310f38a4eb62b0251b06f06792ed961ece8f70ea2681b7cf3e249f07905360735ee992a99ac0490661a37fdc6a82c00ee9fbd9a6654f1cc1e060501f774a40d95141d83dcbd768b48b3112b4b674895f938d6b41c1380124db1e26f2a1910648ecb8a21967f6ce61f7ea3a7efabe22e19658490d1f3e7caf501f8791309cb375a8b9e54802e1ca7588ee00f799a908c14124a6e1b62048d79dee72412373c4617a1014841e2ac0d113c852a0688704c3e7321a7b69bd6d80180be80c55c714459a40e308e18a9799b96ca4bc34c848011545eaaf27032565ce86143508a9290952c8c5df1b02848f0a54ee2d1dd2878628ff04d613f2c1206555ab196119d752eceab13cbd4b2cb440e42e3a69ec46cae16f2ea40da0d2e9bfc3b4fd8bb8b5357d3d3e4889dc3e668a29935af2bc2618ad62c94944aa067bd087358d3993866723b58f8c105526e9eba47c8551715f38200679a522484a460644f674ecbe2caa3c24345329c18b5026be9a6ac89bb88bc14010207fd6782946d1f5746cc155824c1232535ffb7cefcb0082838a5eb90a877f19458951ab4967aff104be1cefb0102c46cf47153bcbf38c2ad323730923696411007b50f8e725583a8820f4c72e6011939d760e38f811b84683c85baca2587a20830cc70b551c1827909101ee22473afdafee07409c91c35a275f0ed106b592732459cf5ad4e1267e455b927fce14b8922c91b71c7b3d9de9bf4f93334fb3a07ade6f1511103f3be1ce06fd7c9e4a9bc8714a3dddf4169dac7c92d98e92ba2a5a06375222b38a623395e8787efa5930b0958d057adb05cae1e3ca9139955c8275218701c5065d08a465a652202b11b952d9b4ab789f1a27c31a2dc6a60884aced2866896ae563b3d8522ca13f2f5c48cdad87fef7e9420233f88327770203cb752abd13a366b5ce3fe0bff72263fdd9e54aaaa0811113b85b0a31c4613e27f22e111c74693899b0c01e5bec20101e2006681e9b8ec47c90dda812e90ca292c5e087f8601320232998a027288239f4f0a4930c7aa090fba1a1d5402740267e8009dcaae98ff5888f2af44c2e48d1cd2ba83ff2e7436856800794643322e6be838929a313ba51d0c05eafeddd6446e0f344ef72bd07dc8a50c39074b1b9f4140767c79c4ed5fefe1aac6cbea059ba0148e3a8c9d43131512b16ef010346045da54fe1a05b7c2f36a79f5cb7568c2910013a30a7b74a44f5ce81933b12f96bfee49af7fea2c37616b19575562914dda52d8bb211805b100bce705f1d2d7f27290443ef988dbc6e799227aa1d330a34a68c2a80a80e9fcf8f5029b22e72f9562112ec0f1bb40cc615f94228d5b351a5c23e94a53fa20fb833ffb209665714a7c94db44ec02e1692208359394634ada0438a59ef9ad044e966206e61b3cf8be3ec70c3031059af268c4cc6e6a840a51db20165a6cadf417613c184f7dcb5a16ff0997a816a65b72a047a2edade5db166b6b08a7af81357391f59ce16550e74f67fa2b91bbde14ce4a667a60540c605e8b2c480a4bd1933951d82c661b7c4f90bac09f6ba57bef1864dc7fd08cb71b769694bd00594abd14a3546b9f9d90d91cb3b27940e167985ee2312f85b2324c842e2505d93314d87c3ec0b2744702811b9a1f8ea69fac139381a50e919353b972148065d4eab82c1bd9cd1cb66358995ae25ad6ec0e92040fa1f7a66306b3062e4eec22696d65b003d9c806a81e22283834202d3d670ce3cd34f2087a0bcfc3003bac46dc63b682ea2c8211606bb00813915026442ba0d5c04fc3f82a8544c91220147c19460f98028ac4a1288db3003b1674d21902285c508fe97450851c574a72d42b80053d15fa5c412b462f5bee8d9fed2ff0668d10e8421e8951f076a2e0edddf5b6e806052629ad3c77c61ceab40a7d226fb33323fdfb8f435d802a098edd922ebdf292641f5a1f2b3f802160214e91145da8ea83988fdbc630b30aee7b7279045009ddcf58485bfcfafefa02bedd931a074fa753bc30855027c85036aa8128c5c308ec24a07ba129d777febd73c7371a2fd4281dd02b4860da5863b77ecfabeb173d4e82690fbb3298a76c3d917cb83e960d4404067252b58dde415bd62a188292b206b18eaeac551d1dcab09817206832c2dd97bef2df79652269902ae08bf08a808dc7fbe42990293c74a95e12226062dd2ece05443736142cc135896a898ac408bb09ce0cf4d4f501d2bc0151fb290928313253ac8ec3bad634d4b53850b13669aa082a60e4d1efb5ebec0e4b10f847ef145fe9e6a24acac68e2082bbe148d0992210b13ae68c162a54866ff8a44e206268f7daa8f072370f0e2082a2f54d0d1e48b3245cec080050699fdcf0371b0609bfc0232738fc963bf8b40caa547b954c7869420c6872566f8424bd20932fb4ed5311358293a1383131fa29042661fea8a93d69dbc89ebbc24272da54b4edaf744ca449d38da5453052ebd8956c9f6fd0a54962d9cd8e3f4b7679883bb8f3b36c485992b1cb82c394282ecbeab6339072b53bc8801cd0c5fc8eef7bddc8f1100773d8abba3776102cf6f2b2e8c4775d92e178215e2a45dea3151d4a7bc877b7bbb8dfc4eccd1f941631e4577ecdf8badb5d69bf216ef295d292b4dee6dcdedbb93fb935f7187b2ef71df71bf7197732aef91b24b971b83664cf7b7fb1c772fb789413326a626291bbf9143f71ff5f24377baa7b47aa5ffe3bec3c98e95e957e564f7769c649cec4029f0a49a46f3a88a330914a7529863be52925be99dee3b2cb9eb26cd8b8d03281de753d3e8fefb6fd6fa54545433ccf17d3858f0007c46f94ef75d1765411c2c980055dac6fd17f8358b0067205c9ad9ec4ea7b6b17df71e42e005becd22b8f90332f337b25668c095225e6852a64c11603298a28a2852495c71020b645d87bffba47cd0b7517d5f4eaa4f841155f3b835cb358f933bac495a524af2de29a56206deb3a8f8ba948e9e77b7f073f20cbd9f4647489d9193dd2bc8679946358dee71b0e09b2f6754eefebb1131c83374c0cc93cac9ee4780e987aedc6104f0e4e96ede67f966bcc19d7841eeb0831790995d93a77bcf184c9eee69f7b3aafb69d53139d9bdcdf8c138e46498dcd5cb12ebc56275b27e0d9da1135cfe9c5f7fddf73f4ed43d38f270b2eb4195bbee27d5f7ddfb70a2ee79f838d9795f7eeebc07bf194e76ef893027bb6f249b2a88f794f38988c6a6acfb1fdef37dd733438ffcd0ebfe5e8cbbf994bb2f9b2a2aca7bca4935bb4ca98ef51df8ddcfaaaeebdc3d4bcc71f2fb50d471f27b4f249dfcdec31cdfddf7f01ecfdd173902bf31682605be07fef781e0e789413329a9a96ef480cfbc99538461d4566e2238443300aed76d01b874725cefefef3d0b2842e48c0c29fc10c5190168f9f2c5852e2ffc6083d30ff5865af697ccdd7fdc634f64ff1c1b77df724395ec38d9392c2e1709c0d1b41f970d5ae816036091d402124f8ce4604519993fa1517212a2863249644ea964af44b2f3c8dc9dda7003eb8e77cce13ec7757570e8f801722259649bbb46c48a86fed256fb35024d83a35d755cfb1200c271c3c9f671b2a46fadb5b076b928a5d466f95ae7f39fca814f633522b81198df2f81b6c1faa64d9b5a9f1bdef703c168019e5f23cede09bb1c8e207f3f3f329935869e48d2ee72be91337486c0948e150b0c5ced1744c0f39028655c60d27445112dd0e470e444135e9278b1940219130e169c41c6fef3d581ffe4a1fff915e4b35c478fc5047f2e31a6ef22c19317a694b88109221d1b7282104ea0a96286ca1554643427f7c36ecc0cc9c181df9c442af7ac25a1e5f96063d018d8fcd4a63bddb0efc609971349a9460aaeff376270d956ee1cc77dcb5c1cc69be3283cdf8b26d2f6ba0f7ecbec1d5f13e8fe7b0fbc074711e87bff8d2254d941df1b5ff75b26c21d81cc4cca64dc388f8c48bfc005a67cdf326ffb1181e88efd4e6435c153699c492017ec3f27929364d218ec8f058faf09d4ef7ea8be6c88fe6b1b81cc3c748502152bac10359bc988e88e6d823fdb9f48f6a792fdc9d4b121472e1431c28221cc8ca044667f36756c480c54a6a0326381490a5432fb3f684c088d3d55df9ca6d36e56eeda121f965c5932c392166ab55db7a4a8b62469db36cef3aabcab7bbbef93b25413c4b96b4a7ac8adf0bba1a6c4851a300c43564d8d92a32d774dc9524d09915a922c72eb06b40973d8d8dcdcdcd49250d5925885e0c76275d3e877ef8a6fca36db794df3f181c16c77b93be9f7ceece16b9def76ac893c76bd07fdeeba7b7d46ae5fe2a7b1a63bb9d69fe1b1d0c763df571d423b86c2e4fa1f788fe7fa3c3ce6b2faa1f8dda22ade1f79998f6b60df1b6b38698baa747fe46530d7e08a9e3dbce30cd1f3e733ecc6194edabfa2e7eb646f3d0e010fdcdc6d55b17c3858f0ccfd4e70799754d57072ced94f8d6893b611b60d7aa160da029521fbfbd4f08dcec2f8152dbae93ad19d5ccae652bcc9a5cce936334827b72d0cf5271a9b32fa5363d0741b4776628e8e83dd93c770c2784f39cf90f11ea89a2c31bee6fd7d8bf7bc845a3fb3c78a8ebc4cc6b7de7f4e5119a28f6b40bf25d6700de8c71061ae01fd1a71866b40dfa53c5633d5515b5cc9fe5ee5b129f32aaa24269792a5788f977ee41fa3327f3ff29eae153575ad089a99c667de03f67c46a198e3e4f6a0a823924e7ae33bb975e36b03fa220c1519772368363a06cdc66c1f34a3db53ba6d740c990eeca4f9fb51d3f00f9be09a6f7de94f4c473d809c290a971d05fad3e857b8e0fa328ef08b54aa076d5a45bd11881b373afed00b6386b9a1b319b2159fb2bf8d5854a5e6b15854a5ec2a19324b2caa524e5a53aeb1029764f6ffec53b23f8eb61df852a6cb0e365879724156d38c8085cb105b2851a288ac6231c382134c0491459132320ea498909282284a88f420abb5566a5429d2488f9c746a4402c6c95d5b7295cb5b5485c690e4b1e93d5d3b423a721b9893d455bf19e5051319dc4114b1a2465409c87be646753c46195c76550f26201f3fead7885071f6b7a79de364ad4f45328711a4a6d1f9c72993f778f61a11a93ce6aecdcee4198e33ccf15f0944482e87e41b54c44a0c2a8226a8c89593515d84c955ec282f9c72871c780e3232dbd2b39dc638833b88d996fcb54f4a5941b32e4d23a8c819273b831e80d9d7390f99d3027393c242e0f26e4e65021832a862892bb470716204231a174b3aa440a40726be6805dc2f0f90fb2bbbdc3dbfd15a32db71b4628c1b7b873a930fa54ea6ff61dafd03ba68efd49fdea9df2fe43db7c95a9bac64fd2e7f640bdebc6d239010b2b5e3142ec7492abbd589af755eb2edbbf7c0be378ae0bdfd6e7c0975ff2f0f7e5af952c308679a66339937bee6732274e36b8eaf09787fdf83eeb95104eebbbfa308557670dfbd08f7bd7f4da9df32eaf2f9a13119543c3193f503c1c41fbae33edb27157fb806fe211178ce711a9145574a921a71823352dcb848d3ab0b1fcdc9f43f4a9dce1815daf142ec65f4899632a535154cc894d65238ca94d2e9946ec994a220d3c75db07f0d0a16b9bc91674c07100e135cfe481f53da48635aace970d5f5daf4cecc32fc84cb17fdf145470ec221f0e712e3f9aecbc50c54145f94f10285460c5c8a3cb97ac2051a993ff1d594df2c8761188661186e716bed3139089d6426d5d02463030e593af67dad3f2b78afcb75af53e53248cdf7fbab120a35a922551470e8a25495c20c91b1586cc9a50f7092995443934c9740f382bf56af35d41ed7796b8ea58fec559dd2fbcabdab1bf1cda58f56eba60a9760c9802842344881c025ae6d63721ed2e6a921e4fab483cd96207740c1ba3db594fed0dae27e6b5ece1b6b14056fb5b5d65b3ffa5dd7755d7f9593f372954677faebe8d55935aa4855a9a3aab2babab428a929bad3cf71610c7cfab863dfd37775cc7bfa5c285226da449f3c914e3a33ca8d949b2ab9e8cc7e95d595cba9ea8ff546494db99c46bf65710b469dcafdb652e12ae5ad8e1bcbeeef7f5dd7f404c5347137725cffd66ffbabcf28be1e03caf74dc50d07dcb5244bb90cc0c7e3a33f377805515a825ffa98efff8126937d78ef011f4d26fbbb5c18df1b8a9d41114f1efa53bc993cb595e372928262c41f202775ec1822e2a1433da74ce81933239c9082d308312011c28a2436f8ff8ca9193113441926c25000c9114814f9b2050b9464164bb64f82296344c123eeefd9fb44597451e6688a14ac90d52820bc40e286135a005385ac4221f152b3412de24426f0c39117463318a11173830f401c69bae1045658680e487048f20a6441410616948882268b7d32c49926903c51441414072456ac5b4bbb0a23aab822c6842527375819c3c510355c71850d45274022c305c25a2451946cb36131242434d9ac58e1450a2c48d0906871c4e3882e9e0051a40414a4805e4192c47e2bc02578b3b760ebbb1ccc0598846141144eb8803a8a21e5ea0acc1758d060a13744c1f1a001d7d179542921fc4381a8bbbb5551b55bd75abb00fd842904e60624572880196205993572f252c50949052dd406fb3890d85a61edd3314add8bd8bb12b08491db0066cb936ab7aeefaafff5c9fab07a440ea16db761a1564a6992576dadb5e2faaefaef3d36727db23eacbe8ff728a0cb752c7d74d50efeee799eab73d9dac612dbb165b5b63c86ebccf5246c6671e1c83e1d49c1c86d9817c8299984912850368031020a93118e8069a2f212a546ad643b029a6cf1113887fa963c6b2e51dbe89e72c7c5ae7fd23eccbe8ffd1f2ab27d1c4964f67578cf5877a84deb741b403bb7c9cdb975deb6ad15032ec14ca7936eadbd3f74cef17ecb7bb60a66f7569e3747076cb9b575163939ff8a8e3588b5e3cc750c419ace87b959ea9452e71ebc75cebcd9fff1cd267fb367cfcab2d6291439b028e73e7b5263c5044a9fb273553c1d25149d8005286868c10ded45092b928c5e58f254a56b23f8906b72d74678dad2f47ce19c1676fde0b886cf0d2e38cc5d1bc1a8466d842263e943275f2db8c4d8850583b96b455a64ec3b13bf0b0b0e474bd3f00cd2d5c28d7f62d71795d95098a0f7d48a5306725cbdf9b2ba6970dcadaffbdc0bbdeec881e7ebb11848b3d98c88cc5f873cca0390f9d7b88afd6c365b81cc6b55a8c8fe386a4e55d97fc7e55a352867b2bfcbb751e73dc749ff5617787e99736d27ce9bede5bc76f9f12e35bc40845517142c6992f9920f65b0b8d0c415228ed410a5822d6a059d3b083d78e1839228a2943491790b5a2851a5ca0928aaa0218a071c45c4abcace28302acbbca54bc70f50d113ee4550649bfd7d58b96b454614d12e0a3eda553f8d7afc10529f06f584a4741306971d7543e8a11e34f6baf67f78bfe38e3bbcffc6103e04d710a20f5c4443b487f7d87ef8a0c17c7afc103203a231211ab3dac2b8f7d4f2b50e8e713f9b6ad3b9bffdfc19dd7c98d7c347db9879fe7cafbb9b8fffe0989cd8bee3e3cbc197e319ee2e7286f758d14944f478e239a38527e0f2de22ec7fdd563570b0e0aff3a8a8207ac77ee8245c01fb97b611661b9e6d12d9fa13d98258d0a4b9c19d3c551485b67173039621de9c0053a3348ec4bdcf8ab6f7d995f7bc827c962fd817df50c132deba948cd1861ef58467aec9375870ed9430572b3501d3a8a6613f4cc277e47e9c3ccfdd7bef6d97a177ecb78710a8799b0f459bf7b0839a0fb9d19b4226515131a6c0bfb912bde3eb2abdae2fb912f5a87b7dea46d1d8bc4f46474d56579a9cc8542181dbec7273441d27ef7fd508c683ffa591f2a5186fa4691e2131e1e0d60d4eeb06435518e36b4bf3da7cf68d4133a834b51a29daee183483fa3e6806e5e4b66ddf0695bfaf5256d08cd6343ad7b003a775d6b3f7c5c1ccdb6fe26b87eb653c055ca38c91a43bdc0fc91d6ee32bc8fbed1de08d3d79caffc9c3d10fdc80f83911fc6f861ff7dbe80159923f79ee58fa8065efb756d954f9fed07dc178eecb214df9fe27be608c1e348cb114eac95302e51b64e60f3455ee80ccfc015886317a607befbf8d036ffb2b96b07c73fce4e17e137f28f89d580ae59bbfe07b627933fa8065fce0db886550cd871ffa933b49c15ee53da53ff133466e85c6aa8b947d2a325499d51b4caae6b17f398ee338abb6f1229b867d32ef340d12481a2e942181cb0c50a614692a81052e63b07461460725d8e441c04c0013d81016a22051f97085151870184285c64396a62b92ae20c95e4066f6f9a1ac273ef6fd49dbe86c3bd7b814d97e0cb1a8ca172ee17232d1685b9470b0e02dc61438c988c9a38c908a90c976c9999a420ffcac4e98c3e3b8a417676bb641468a9c38a71c31aa30f7413327a7fcf59c4e59dc1834bbd2343a4f24efb9f66f187447a00744551ae6b83699e60323e90e692d69c918658c310323cf93ec4f919a9ad0311e6454c8fe940719d25ad29296ac96faac6d59779c4d637b2f7f170cd360fadd363cfcbd28be129e3e6fc7851460c9c025783e53eeff36cbb24f2c245c703fcd5d83d2c49d1bf8ac29b7d12f61dc1ba108e1d5be4953bed3b70cf672d7a0d03c25b0cd5d83b2c327e6b86e6d3b0503ace94017065bd4a13c7d263039e8b1a64169ea74b670c1006b64802e0cb628885d20865128455ec5b3e544e93a61ba4e9aac74914b1878a4a4452e412b304eee9ad213d9335262229720d822755a1804c1560ed2910e6d23d233a07aeaac95cb123de46a44565f87d0d00744e3dd01cf1e31bb5296ec7edd859f1b376e5c509fe52c9c1a70ff377f74f0f987bf10ff39eb1876c262a6030f564b46c8fca751c7ba0558d8a0830a3a3c552923bb42bde34e455d1d340d1856bca0d01dd1d919d711d30f479dcdee9c985a7574332431314830f324a96b282865315cad15b4bac066564a2b752a9f4fbeafb42a61f99caa06ca9fb23fe538ee527ffbf4ab93712a5abd8ac957919cf29461d725dbda6eaf56741febeb70c3c7c727e64db1e1bafb21784fe9c3751d07447f883e117d1ef47dd0ff413f4877391f4a9fa43f83d256179eb7446da929774d852db9e4c9f33b4cee9a0a61726d894c2ec12aab2d8dc9338357e0ce2dbbd18229ed6012c9f4bf195e15e0078d8841ea4c0b45474d6470048a24562063264d11d9a43d96dbdb9f21071bfd2dcfd0fe943b9a809455b920d8b12149a0a0950043134ea09c90cd6f75ec832c306859ca61041498209b9fd3b1be4a810f65c83c495942896cbe4ec742b0e2892d761822cc122ec0baa8503734a4231825c05006aa92804a8924249eb6a43066c892971d72b09ae28b910c45c2ee89439a1c8e74be2cac3620c2069a7fcedcc07b67e69498e6e0e4e6b2e52ad3b1c439f966f2cc9c4a5fa85696d46c3623425671239b5f6396e7fb4cc92693a93c63e489c22ccfd7b1a352276a71c9f37bdcd4f2fcd67c17bd991bccfa384f9dcf5972ef9827a122072c5508b1826cbed7b1ae495d818587a6161051463623f269005f2771fe1c9ca0972036fcef13923daf71d146fd50205cf6beefd21ff82ef683a2dd3279fcbfcfd2f0b7ad4d1e7f8cbfbf45dca28d7217f1cf3007fecf1d87cd08e424eb272c02973d35d42f8388e7b9c7dae124eb7ffcc60913d15b2305bffc87c848bac3fa978f42453e30d9d31dd6972e1d53e30ce3df3a01dbef416317fc7c2134e6fa29e327cecfffc0cf79fd8cf113839fff6120b6ec02b165392d7b892d9321b6cca63338730cb16538e26df27b50049bfc3e47c4bdf3fd4bfcdef93e8608eb9def31107f7ae7fb0b6488dfdb88b5c9ef6fc46ef2fb6f8235fffd4686ca06fc970d2ea714686303fe90c728118ff93de6ff981f647e0813cf1c73d97c1b0c4e291a6bd1188c9ffd1e428001352008d6d48c53707e8b93f3c977e63fd17adc21349fe62ba8c964677d11a63bacbf7487f543f26b079e0dc95370c6a63bacb1eca9219c18cfbd0f0dfd2737660cd39a42f2077ef7f47dfe7ddd95fefb7dfdef895dd3c84539d9dd6fb19b61f2747fffc7afff0c814c17d23d7d43ba27d11b8170f9de3a5582b99cb49638618856e459c56975e336317061188661187a6166e669e125e18f6dcc5c3882c837021e81c847b96badad5c77038624343592ac2e696b0e0e1dfe380aecfa2433b924a5ec4c87169e1863064aca0b2b0061430f4ebcf400c554169b2755254d01f371aa5cea4069b55a95ba7705bde53754e0f9fdeeee0e2464369b155d21bef5ad56cf801125354545bb616a7a8252c2426646483fe88ecb8531f735610e0a8a425ec7dd4b5d3056487dce20594d4f5034a6706684a424e41b22eaf143c883f9fc00bd93fd5d8997e0d962109bfb6d58f8a1a2478b929a82eaa6d2d721713f84cca6117d5a5dae5ac1cfeb4420a12122ba536badb5d668c1c8600038768e65777777b772b55bad9bcda4ad990b00c5d734e6b26e2ce6fa530399fefcfa2e1b424d307dd6f0b50ef5e9b4daceebbc0f0cb1cd0d8c168e0cd705185c9041fd3169dd14951253d3535709e9a99eeaa98e0dfdd06817bb5cefaaaaaaaa92511503e7895a61d00f4d4d4dc1b8f9a1d16c5e00c8fdae9c17124263e0f757f513146d768d5c565574c847c850d7533372bf8ed76197eb6d645349c9a6a78b2d9b437098c3e5aa6109b9babab20acf805543db36b54de17c19f4a0b1efbb8419d33360356655f744f2bf4a98e987e3d950d91a004ec7489bdc4dda91aaaaaaffa692d27be1045c162a21e4eaeaea7661d0e77b87a838a3c2a0cf76ecb925e48036c3f37f38ee772c906b502bdf279bbc01e8d8ace26c72062efb03283190ebd3aac98d8e933d906b100ee8b3b2ba6958471aaf7cf4cbf9f33a596ba563cd17dc4fc49826302b772dc9872f927238010e73d79266f848487ae16b01d3dcb524a6242513d01851733f0fc66d8117d75cb0d5bdffa4a2033b3f02c5fa82c1470bb9789ed1149803ee8c8c3e19ee912b2f851aeec85467c2d196a4e99a30032d12240e8b8a846a23c3a2464d1676448d83f7e2244615463b27427cb3d3d28d3e4798288cc6aed79cd03c0c22a13981f2449dc7e0bdd8e5a4492ebf95a6d29a7213f681b5af57b0bd2bcce5ae3951924b980785b7dc352745de125c73d79cccb2d705dfdcb52657310e9a58d14ecc715514e0127603e6536bd2e47d718d4915b9e6ae3591924b17ad02d1a1530e388435e0f2b626125140ad2dbacc7fbda590db82af75b6f699443d784c1f9fcf55e85b9fecb3e44ac247bdd399832645bdd3b95fdcdb17f7db77aece8d419cf40f215b313402f7e0e16479699010e828e4964d85a6a7f8fa818090c33f07fd1cf75e500bee97ff274463dc7befc1f6df28c2f7db7bdff812f2bcef7bf95f11bcf1e5e36b02df77efc1f7dd28c27d11baff7eceff314485d02942449ef8e3eb2b3aa50069309d9c9cefe36c22e79c730e1112c13d29e8c58c396fe45923cfa7340ceea78ec11fb0b7f07d5ae03bfe8063b880c126aad02c4e76cd02fb0375182b54471d29c04e9d05ae1c705a42052a27b2e88106a92d4a5aa82919a990250c8f279e307383992898a43004ea86232a3f1c91410818bcd859c825e482b96dfbaf3a90b9b9eb8000e62035d3d1d58452f0fef836e79c63d98de078bf9b1b376bffc581d347c126cbb67de040e07001a169998e41ac14fa31a4dc7b9528a5948a40bf6504a59452fab24977b44b509b95cd1094d23a24cfa8d1057e3dddbbb2eaef642aee60948378fe691a7362aa4288c29775321d613780acd83f497c2220c590e2c3adec9193b8455badd69c4d2bb54fad7d71608d9c9c0f82cd3edc2a6fa345aa57d45a677b69c550d3b818d701c7c85da3122697b012a808e13af3c2bd549e309851599a9aa105a213d20c63023003103272cc30358395560e2a4abed377cec06483733845f94e5fd719b08bcecbfb485a70fc6a71cf0c9691bb8634c316fce5ae2145c92508b6745a18045d6768455f778ba5987bebadb7ad52ba6ddb46bbdb08a594fed725f7db38ce3b6ee03e27cfe8e0ad558ea5f2c5deb36d4d5af2fc7a691118a9898aae6b4c50c083952694483202e4e4090ae9480555fc408bc0483268092718a40d6916e1f404459b51b38bf7dc3935a95290a72bcf9f55f3a7159d3fafe6fbacfbf948aee43d5d93c18b3cdf97bc67ccf39d69be37cdf7a7f90e45abb24966e6e8aea3c91c0786052e5cb030355105836cfb8b5f4d52b5be6320a6a4b943a4c8f0e50432d0313ad420c352debc5d40ef995f599367834b9d3a759fdf6a02a4db4629074d9df0c40e3bea6a69b5946071a553625498f5eba413cc122af80c5f8a7d0925945229b9be8374d6a589cbaaecd60a6e302b155cd63c9f7435a694520da8208a0a4274d1858b2f323aa32aa16654944393918c1291690b327d1c4d5934e0f27fba7b475b704f9922ff67c1b124376ee3b8b7b7efeddfc6daddfd762c7d90b99f7e77534ae98bd2311877209e538c88b1f9115353767021d134e505d7d46cca127784d19412c2a9a8f7294640315dc484c11ec3d5f7496449620bd6790cde1b2a714d3bff8a603077ad04283a46704eee1a095d3c6118b96b24988921c6cad71db3d47b73233e23234a639d0d086647abfde62cddc8e80b36da406aed96af6bee3079e6f917bb5e8784d5f07992e7dff09e30cfff01129a3ff4019eefe3470c50e4f94184cc99f7c47253cd6633232ea9a564ae0819f7604d0a1699eb9239187ac89c10998bc1287344642e86233297b9bfb329df9ab79083d530c77635c8168a1cd6ab8c4c9f877ce7ac2973d312d1dad225fb13a3ec9bccbd854197fb104e5626d8ca1940ee9ad311152f72a9f3050b0a97353b815dd7d6ecb8d6da1470d966c31c40669eb2fdcc1d0874f44166124be58a6fe7067fd290042d7fb5028d362ce099e38539687e61496cc225e8e5f9395e1429998ac9f46f142e327d3005998b2929d3cf6192221b91690b505f327d5892ec9344a67fe304197d1c2e54910d90e9df30073d82854c1fc7d1cf6633239fb27a1b89ec7f5770001696b23f875b3e14b1c1cc13ab1652900db90295a4480f504c6151420824a220a93a57d9dfb628e5a204984c29b576f43047e5592188ec4f3b05ab314f2c6982668716c886d060850acaccb600b3822f41205125d3c7b1431d5b2c29be82d201b2ffdc4169172d481141c4eac84816321a9529173145328d0d6992a508a91f96bea00923a33b842f603459273b4b89afa6b15b2cededd39333603e377000e9101ab24f9666a1ac174bb346b9fcbc04032e6d936de2b89a46aa16b1fad1699896e618efa1db369bae4ca8499b5da694f7e03935a98c9690ac580271f7dd76614cfec3ae08c4894342365070396752b320453f688c88c8ca56a1d3659fcfae77ead330c826dbff6a2d818e2ffb9e5f9e679e5f447d204ca72208416edeb671360d9ae33e81a384f56d9cf7eddbf46df36d3a04a609f2fdc6ef44a13bea3849753849b1102018c4f65591e6ea5c75afce554e9c4dda599bb2ea55e2e7e7c68d1b7763f57fc780284b9ce1380a970fb4ddc8f6298e5c9f6e1d0d45b077ec83e27d1d1e39d9de267110da53decf77f0b604a60020ef00bd537d68ac136a1bdb574fc4dc36c29a46ed20dbb247b6d89ab9ce432b0dd34f12d26c8664140549aa470b0981098ab2a3623871a27a9223f9cc91dcc8a3385293f3ea2a4d4f3549c9dea9b026afab132fc7012c030981ccdb6f2310211967203fb013d7892deb44115330b3190e624684080c271bce4de738e7a65731a8a5c8dcd83976981bf8dc80c77572e73abdce59a7d76cc729f7739cbc95f2702fc62e20ba133251f1ff3f42fbe0ca13f90109abe1f38343074e81683ad353930f564553897ee03d34293efaf6abbb4fef0f61babbbbbbbb7b4f77f7f9dd3cd55dd4bdbcb6fff6e37e577f2f408a4c0a5061bafffb200ea9c2148455f9c727532e5db98ea509a8ba5ac7728a94c90454d97e57069760c779c9fe93ab4f67f53199f2fceebfe94c2ed7cf3b996c129511ae9cd78101b5405cdbdddd5dae39e7ec295818822e97cb5d4230d813b8044128aeed88ea08201d423b74a8139a04ea64ebb9de75c0b1fc2083e0fff89de1baa1038222672f76fd7fa0a373038513382f504dd1ca2902d3a10f8878c02a524521142f0762ef611f8ea5500ebf7c9f39e7a425ac8622f74f1b1c5d4230d84d1456e0305981d34a513df653c34930d8b9bf357e707cef8da1587e0effbb9f4bfa9cb52511e7f2a162e83bde3bf8a2ef81d1fb3a56b224ea907b4f0a5c368debbab2bd7cb4f3a9a102f677bbd9bc39a05af103dee1dca2dc64218095520ae313295a64b9f1a877bb5c738ea5bbfb98dbddc5a6d13832e0f96ea3bb69d0b95df195f4dd7d47d36475c474a7bb5ce7f7119ea053a7b3a965f9fff81471f25767fe36df666f56cc1f05e905260d775071bac0235c37bb826f76834cf07c1d1228188304af14db44b92e2694525a04cb0bcb8bbf833ded4cf9664fa7a7a4a0d88068de3087cdddfbb5a26d727b4eec3a6c72fb0fc87b6c9ac4e9e294829c4893a812124502a2311b22df72d95476a33e6d5b5677392ea035a8040d18553dea90a919000000007315002020100a070362a1502cd37451ec0114000c78a0467050974a645192c3288a610c32c618628c21841843c80c0d117500c6a00cbb012527845ae230f63cb9a98ecfbb3e2f5502dd804ff5dea0741bac7a3fd8abbf9b677f12578004312b209829e96e67c6cb9d42820007194c07ea9adae63c58194c96676f96569f68e64dac6009da651e398d1483ef74468e9c9df650f01f9e8dad1f3346f73bcd2b37632dc1f3fc5a122f3f5666694094f8983a96b13cae8fd97dc5445501fe4b05555956a3dfc2c822913dd2f513e9d7e1385780bc3c9a67be8da55850c0a0586628a262ce151918006743521f1655be6fa51b19fe02bb21b07bd311f477e3477095623d8831f4ae2afee1a8333e2c5113c97e3ef1a65103d9a5fb7dedef51ae8b6db81bbc89f8dae45af42e2bac301ca9c5c3fc3fabd9021c007af2efda6634c0c39d54b5f9e249c0c2dba137277a1d6dae0981a291de599922d1c009217008b2173980218502d19d659a73c14600f142e6215fd328b7281909687677cbd17c3104fd3e28e395e87ab641a6aca07aff4b60a1f7882b2161612ae79925d44581dfb33eb30359d2aa389965c153a8db004cdc8367b15d804ee80c604f7ed1e1bdcbc904d4a2b496ae544269b1be9a7b99dcf5b173048a228084c0b5eb22c4060b17e92ecb919b282e749160b066e2ea633b24c80da4ba3f5045873e501efd2e61a4ec6215d2d1acb224e9377051729a3bff52609cc6b427cc260e8d55be06eac2f2d61c71de5383da001821c7f4a9babd7d500100bf9fea3926c3b5b240e36465d7a0cefe98899edb5579d3efef1ed0a922970751df49e1d25ef0efc08da05adbd9e26a80621e7d5c4999ff7200654e134eafefc085da1b1540b82023ddfd662ecfb0539c836b0709e992243290eedc896474b15f76d0567580d242640d103aa01d10e40d04e94041b0d24870e2ad32977e847a5141b3bff8667c6e06742c16a6f0e65a2a35ee0de77bd326c99150f3dbcb97ff3e5f1985ef0646a96e01df7803247a162f86d24087245c19d4ac2d2348845808e67bcb5831144732a94de30c4ae644afd2e6572188d2336e103279c81e40b04a8802c93d073b14c395a47e851d0a9d8fc1e347a94af862629e880669c7eea4e760cc5acb06e6fddedb2a8fcf4191c45632f0218a02d1cd55788c1df8fb926cc25d6491433cb91f5df21548f13f437be5f4a0a7572ae1d22faadb642ef953206b5178c3236405bda1f5caeff125e919f67867ab5c9ddc75caf0bb774a3d30f2db89deb0d237dc6e089a49e898069d6afc42897fe28054e5627a0331caee985961e73057c3d99a10f6848b4e1fb11b203c11ccfc742af9eceb5fd5ca5faa9f9c38b06de75814b35f634e4dfcbfb65ca3b0479e64be726c43039986269e095f43e29c0c8fd1b5dc10057abc6659eb356745c87eb5d30b5c4e610e8177ee508d88b97c1e1810dbb11f1bc2c07d27e4ace45b5a07c6254cb3984cd068071278efa41b6c429c22dbaff4c86ba795e093f892442ede82bd52112a919337eb71315d9c728991ee5642fa535da9efaa2f7f414f4a8bd504b7fb894d296a23c59e0c73357bdf93830061f73aad60082a3cd72adec90035ffc9ca7fadb294fe056fb8e5ae99af940cbf0e9ecd91c80261fc8fb3fe4ba4b187dfe9136303f48c68c07d09f60fb6baf0c9094592381ce39a2415bb290f3a61d3cb71c8136820fdba20f6ec2ba74a344176c61a426aafb5c3b6b0c6266f68b27f1d8292b690d03c257f2fc3d93c14e49db7832e36a86c6f84a7f2755506b1b79f555f84b51ab0a77bafcf9b4a9aa6a495063bacc3db989448b0c0374ca55caf074545f76481c158bd94080d14e07db37a4f6a8f3b59f7fea76f6350437b25c9da310383f5a02933ace54dc036f61d91d04cadd29f69bff29e9e8828528d4b9f9a412a0a092bb77d632b1233f9923d3508a060d2b198ff51d0f09102bcfc636ae07ea68f244ef4222bfc182b85c990fadaf091ed3369c296ee7c3d832f0f6562de8dc87cc09ea8daf04d7bf4f96df0e043d48c3aa488aa209be9cda9e3ed14d30aae4425e6ee94c6ef45dd104cd23864dfa15a4206ce456f719819b3a919050a914fc73d48f86ce41037f5864a182ae2510a32d5c28e00a1cbcd8dc56bca9988d2f4aad737c92de02f1235efd5bd28662c6602c2191ff187fc32dee28dc568362069aebbd0025ec2a381be70d205a94b83f3b74f6a2bedcd3cea65637edcbbf6b58711c8eda325ae93bfcc79b980a115ac384dccd91b12a18245e5ef1ac57903e7778d5b691c81e7c431722627521f6141cce8350a344d17cb82649b863ce0c70459823f369f2da1bcbdded589124584d3bd871486234ded71736d1a5528b9e3a739918e311c624531cce8621a5c5522856b22f6cb1df32e9dbe5ba0370f481e4a702f2649b6f2e87402bd87b6b2db54e8b1a9272e2703038040751ecd7be0826a4c5400527138083c3e1c290d58a30a8896ccc3b07e07fe8e23b1919814e9efc2c3c9ca197e07e3df70a39e9302257d7f3c69b3a4e6b081a53d99b2016df4e37de7ec141141eb062e010f4170640072fb3528628d86ea99af73c42057f6b03dcc4c478a9cd9ce7a6ccbfa34f2ece1633c879150695f749aae55a0f818980b7ee3137147e483094e6da13bf8f01416caca1bc8f75946586812de3d900e9e0902a8cac7af50442838640645904a8fe7f620e04c4a356115a2859b85a6200a223850cab44687f543ad9899245575049392a660ce40ed82d282ce09c73ad30a8126f425575c646af0144c19a7595e1ff50ba49843d77b992f3103fab22872e36ebef82584f8a7f8edcac2211f2895f072150baf4ff4174f5fb08ae13359943f10c8688ff47000c8bba49eaf7049580821f0995308017cc04808687ce49f02b16c4246b1088ffc0b5acd2726b96f25ebc46eba5c96d4bc977008f7319d9abd8e0a136470f2ca0667c4267b680d8150ec5bc75d3ccce4473d13f94031611591d57aa82864eae084957e809d570ddd405c79a0b3b90221f80fd4478ecf31198369ee7483090581c7a1f3c8428d51e6e8e77c91984c2b080953a756f0546a172bd5ec6d89a06214333c1e4c2e3cd698ed30f776135a82245e336408dcab6f3d4b9bd2b09fb20ff28e212db199fdb826b720b5d03a767ec7c450369b06f0a7442de453cf0e5d7f0f606c96bee74332747a3532f354431080481e4a683f72c9535fd583be766da4e36d0e7b8af7a0b14eb144824d23508fe908d2a4de21a4436f7cb41861bb13e180bd124d286e024061e3f290c336384c97bc22169c342fb625aed61cb952ceecf45950b812772d5b82eb35cd0ab6f74d597486a325512b2eb96d0a90edd9cd02bd56ab7bd11d44cb8cd7922b2b37891f5bb226283ecfbf9e0faf28e4ba241cfa445cd273b2883be9f6bf586294aa4bf6404333a9ce1ac103ebc2829383ecad0c8f91789e1036aca4145ab38f8095e2979af6139b60e358c7e9dd40bae9de198b744da5a641830e12de1666b99ad81c24fe9e2bc8411cf414fae02c271d8cffe822422ac91b39316161764aae1286fbea33ba05a83711fc3d108e377d20d5bd0666fcacdcd813910f10fe583fc0a4aa23cb6cb37fef4498b264cebad69c571249f16e648fdfb55d87aff81b3333e92659337a2eb45509941ac8a9bf98ddd24c568850dc5d3e25b7169d910318b4aac3f07df78e1147bc7b22382e1a77a5d8e17cd3beb646892fba7825146047d70480fdfc5e4701a7ffd29a7cc0a009b75cc42ce740fb028499976b05e50ef91b463b511d1ecce22c1aeca1cb7ae52e907e2f9e1bd31ec1dec89ef0cf91651d866db31823e25461f5f3284cfc462cf74e19d87b85e49a190038b87493930c40f312d777f405acf9be9255e358ba2869bf6c631165e5ee67d3820c990465c8230a644c8126fd34a72550c0f9b33edb7bd808550da6f39ec3b3e5f81ec541971c0f5fdca7ee7ce9a0bd3f0b748e5c955ae2689bcf3c0550753f0e0e10d1a2c4d93b4759c6c4a53dffc9e2c1e076b03b2821d8a9079aeab12872b2ada757e388d5d69fc6945c688ecc66781c0560594ebeced1068b46df5c29ff4265dbd11b6769c748f6a44cbe805b5079e83a3094fd5ec84163e8583912002bd6b5dac680d04de316e6826c5666d2e3c3a4d3b205b713760deecfe5ac7e8e32616f3e7c4e6c7bce97d8f84bb0abe70a227a41bc6890bebb560c1b6150176ab19954bd9dd6abaf5f84207f6af07654e1a8950787b9080eb80537323c39049ce7f18bfd0b47e197cab1e93722fe67dda8292d67947a6cf39bf3c17865d9cb0fc0ecab60aed3f518747abb376fcfd3da8dbcfff2a6a266a2dfdd31a27a573fe4aa0b5416aa609ce124f60aca24021cce820bf984db13c0736a47cfe47731b1ba2af669b2bad87ba8a71e409cdbc9885bdb8f4452aa6c120ad774cdeba3c49ac44373e0fabccddc5f535cda4edf7802d8cc73eb946e08fdc420144f99781551a0d5adb16d20035bd2656c71e9e4a5b131549826a442a93247addf7760d1d48809058734da8b97cae8e7bff78486c64d8bdb96959baacc910990272d31b498d89a04e879385685654a6e7dda97264e7bb327c8a3932b3055e9d0cf804b3c2b74bbe24e8781f3029e8682becee1c6f744be175bec23975db9f5fb4628fdb76ee62240d7295b53803d8733b139295650d86af6de682445a879083ac258613c5e840ca877bbd2ab8d14070c6ae3bf323d8481e80995031a75b1e08e8503dab6f82795dbc8776fe275484294959aa52ec1191b324a908bd4e1f98c15d224754cee2c4e01525c10c6628c2fb20f36d2097186d10b472ba5b351f8e8f43cecfa26c3d2a47064c6126cf3f8abb0c7450dea8a802a44274d5433682a9c15cbf14e9c88284c70278aef584f4720d154f799d25234e2ec35c7e704abc66863c69367a1aa336387f8a360b823264842116a2a85a397f08b1019f52e61e311a4d7ec7a78de99d95806c973691cb7421034cb291bb1350d3ec800b8b25027c736b5f230a2fded851cad73ad1bf37833448ebbfdb92d4cea12c2f066e2fddb056d31b854ca4dcb20b00806d2642f6e1c68a3394897bd4c29a97dfd0411b6995b5715d1330f709805b7ee2b9cf698dcb5eb5bf10179f1dfd83a47e23c1f8381d433d39a0338cdda5153fb852df80a57d962d58ca0cac610973736832cc0ad6e37b2aab17cc86c5a84a8aa1d0d1ce24342557e7eb54a469fde82a68600b6db15c8a902cd5355ed8705521c1f55654217084cca671f71b602165aa77ad73d6c059e28eb0a4848f4aa1e402106b63a7adb5a28fec4a98d6c9f8ba9d0628aa6cb3fe052fabd49796f0aa094594940b9240194c52d2c87e969e47ae4bbe588a8a7a68d4c97334d50f70b79643a8f6e07841a27300457531668251fff06c7c3a9da77138d9beeef2c634808a000c7ea619a81d81fea1314f104d80be4770fa5f89e91ab5683141be099be21436bb3e0fa61e75fda8d809dc6c70df81b5f0d12452fae8460efbd4577309e16156a84e0dcd7773f276a57aae71c7bc031c2812198d8f5625792b1f7e93ba29773c1edfa0947026dd3536170e51287a79b964a604ea2f918ae6f1ac8fccb68f2121f3373d3f7109bd66746cdc6b09ce2eb8d3a0e5fe0a3945448efdd67443457b3575dc1c15b4c54881e86d4c69113b0f9c9b8e56a37f576803b70f48c4755c66d47e6b887ce385474c183cef849a41af62d9abc040461cf8d3164a78703824069dcc2b3eebae10f1343128771db6590bb03b10c79dc57c3d6a4348cd2dc3092a8722666169d26378f86d118a1eef92e958e2dce31dd306630e2465d468b913dc3e8245bbb9fd7318c59909dd84e542ec9676ac638c802f533d43cfe331dfbca846dd57e9f764ced943a68a1f18919c6431789e2d7763c5b5e7a4ffc1b27166e7c4b4f733e24c5882ddb9719f9230b7e3f9bf860dad128c6f94c58c17e57b8027e8891d4842d28cb55b20d83e4df0cb846cfa1c7561513b47dcd5c49ad12c4d5d56dc2dc67c5c4a567d60425da8025b9404e9a96164ee2dd279ad70261ab4758a2c86e6afa440144e19de34c13b3215d7960e55a86c202cbdf597c5ef25c49de72d1b97d716e46b0c8d608831a62a82ef7adf17a08cdad439bc79bcd78fe358206bd971a33781a65c015bf7cb28c6765e9730ad9b518280e2f06a3cba7415d383ac2630f11223e4cda5f839916392247c3c21401e020ccc3bcc0e6deb3d2d7030b019693e51fd15dce37cf6e2ebe908c3d6c9a6c83e3dde0858e4a47d6cde882556018d204b4c0ceb435103cc1ff293d457277bf8ed0f745df54410e3f04ae8b36f2c96b651533340f18c9a43f79047492bd296739ca978665cd06232ee1e264e1c7ab68b6b259c54ae815d7f9d88e00ee1e5a26337bc52f4b0f7e79c82259f02b6cf7a3336eb06183463551e2464d80c903827881ed216053d575b40e3b771d851d802421cf29f9628392a4974464be6e032ee5f75a31527767f2060f46cb24691b88eaf467361b89eeb71b3139fb86df39cc4a42810288a5ad46eb844b396be3fc0ccb0edded07611843e3b61480016eea9145962497791b7950955a6b503768a48a75b3c540979b4595604dccaf9feaf90857427e6f8368ca25c1416193268361080cd9b42e83e53ad4dd530122f77d3160fff1e41ffaa7278408180f4a4918f71d5ac8dc00454001f5e30b1068e60e3d1701f4b6c261e0f94cf57029c9dfdb9b4509fff4317fb892263d4d509a4f12a6f2117d19117b6166d36b6540325f532d4a94cd0944b4c06fe271ee1f28d72be08e07f30c84710be951c3721e5beabe497cbc1de11a43f16052161ba2ea81c311f49da1e5b1799f5e2cfe81f328f4a894cdab70f2e630413bf7b2b8fdb637aa1c1afcf292cce6df899b85c0433b85797f7fbf136686ecee81513cabfab0ee6f8e302f8bafc2e1cd8a118e1678a78e9668145e084debb0d7af3f6443b71173a10127d1fa0c0433401a1e7e8ad3913fc0b614894b5a21712e4583e7f0403a1a839a16d22d73668324951795e40984b2da4002917682da1e3813e51b43be43dcfa0f7446ff7048ff869ca0f332f14ac3443cc0c43e43c52769df046cb69da8c1f5d8bd209c1a1b62341b925a1609a44917ec7d0b6c8d460d976d8113386e8f1382758cde2127a3d4109217b4aee2dba51ef14077483cc5dcbd296ca85376ae553d20fcb287940007dfeacb75f59076c6b66e18fcb2164688d144f2784023d31687ab40eb21438ace036e0a86641ecccf7bff0be4a47ba509e189325cc8c8cf160a0a7c3e6c72f3dd5a8719eb03bc255ce0448dbf479362dc2c5fc980bf0b70d086a2c483373906f3a39726c604ce8bd92cc2156ecadcde2c5bd0407c2bffae40f681ca32739baf6c3b630df41ffd17b46a4177c98d11bcae2f43c31b8c7b496963791f0e9e1a2993903864f080bd684f923293fcff6fd9b443539273539c80423a628d5d415965bbeb3e1e716a8627cf7663aba992c19d91340290fe6a004b2b3afb470d35ab54882f5102a126f8d5815a08961b7bc496cb96633d62ebe1f576ce3d6ef827e02c63910dfd873acd459e8b6a1cfc5b3fbc68d6ff8ee0c334fcdab6a61e512079572fb7edb61b0d13080774ee6f7b99076a1f224dd6263807fe649a21eb950e3447f2564251fe55696f1312b0f36bea460df54e5f362569990c96ffbcd5356e442aff70c55328a45e35e350805a922c637dd2c06f7f887a894d41a02727d7162ff4842aa2f215f7a7d8826d9735738b49e02d8e2fa29d5542349bb0fef463f0cb29249b9d06f2e68af13e0b69aa13b521fb276cdfbfe1b684c2ee4483c7b0639c11505da2f3b01f54986899b1f413ea5a899d856a6cd051d39f2762ea7037a4350130e63e7f08b502dff117859d80ce7968eec39a2fe64681733f04ac3b3abd55887c8106b86d5c666bf839da2134336fb71ac54ad8002ad701ebc16a1043bbde4e3db894e38c567655618a36ceba3458533da71710eb89c9b300c2ad95a86b9ea03d95f35c9fa5266d5819709f2f2980532808939f60097bbaba0b469318042446b502389c4b599225a097bcf06a288ebe1ade708a1bb4bb1b9265ea095faeeea39d1fd9db8367fb0a15940792aa9cefb7b22f0c616c6c789093bf2f1fffebc55ccd6bd59930276547cdf256681418d9fe1df03ddde1abd8441d1a69d04fe0cdcc412f00dadc91160dfd0c5be951dc40c0f7b0976c2e7ad985aecbb7729700eced23f2c0207c66bbebb5e2270f8d3f0507321b5a59d8ee65d1c775c0a614eec97ba8f32ccba474b88753548c1a74c6e72a6605954c5519a44ea9310967c01081de546869bf7e9841d6cfb3952bc78547517311dc26051cfc0c9cd99734b4a644a530fa560a1587d69321d32d4adad1cd355d6b9ef23a6fb964bb055da0b9ae8dddec54980293571b4ca74e6c44c7881a140289d772bde52d8ca720ca5642018dfe3bb9f825caa87f5401d28f636d013c54203e5529d580de76dde5b3fd0aeb6c45e32247aac52a9af026c2cf3c68edf10f10c1e3fb43c8c76a540a9cfb621bd597d6c0966c499643e0e76a286f35c3cd507a7b6165d0d870fb875828fd1c061ea3fdee9331aa346000ea3383b2a59e7bf06c9639ed4ebfdab85e76bf74077c4d65fe66cc035aa5ceb820272d333d0cbda209b9fbb922e94bda0fbc5df6803a692bee38c5ef28c78f8112eff41785a8c9cbbf7f27c2eb91d614947c1b9acd85a79cb70aa3b3b6e6fd9b3dd3971f799efbac1d8f3aa9815d4815961fcfaa0990f510981679b236d4cb07c7885338a8cf7f539b49739fdb16336334adb645b75cd9b661e0f549b9aa41b7d84ab8281dd228a815b7fc5274983859cf581fd7b3c6e7b172463c3c9455129275915ee08fd8fd5a3dbed2847b83ecd3510c3fd692a5fbdff1e315a4efc6e651b3b028b7913065902fd144fc8462bc7a2eca0d75c48a629e66439fd6aead98f7fbc852b3d84293f9ea548506dec9cec997eb5b3ea66da5ce1a97196e84541999989aacdd5264121dc8993a5b59bed953b7fec77df37195e69559cd39f9bf72032131178d3331b40f48db672c933b83fd59d768d82f270685da4ea4f6b62cbd00144853b9f6f3c41a3c660a481681038d1f36f60d438a60390b31e4f446e5f4c4aafb3eb19e7bdffe587e62ae417a43cc9c972e697f0b999fe17de66402b1a143f9a53b35822bf853f6e7e0b1d3fb115da42b4e90dadf6b731efaa1632e856fd81c87e1b8c8a87164a63ed59159d599a9afc6728bc1a37d99739e71ab94946fcdbabad5577160d0184a4a1554b76aea255bbf28a35f554191bab6784a412809203d59ccf3a95926030b93fc8875b6a69d0bf51314b05fb623b5d1a73748e763b25aa232af361e558209696a8cdd2333edad7e7f4fa5178b7ae320ba5288d74cbf2f24ce7907fb184f22410ef7c92db950cef89efd32c88e19000227ddfa09bf45b54c178149d22213adcfd01f014023c52e05dced8f3865e6aaac78ecd1fe56d57f4eaf0dbdd0809c162715a82c5d3400b937c2e2d4267b6e5e1f344cebed7491effdd45f2ceac661f4f969bcc6f54be454a627c8a26f42e2d33711a90501b5fdca6659e18220557ffeb2cf84be6fc37b4c692d0ef66e8c9d97047754dd25f5d296193bc23a00b9da5fef75a8085bc72769abcfd7e57002a9729c6f2fe50350205f1d71f82b9b5d66eee054c606db72e95df62ba30a54ac64e341b014423a22b59614fecab486c78244a7f1c72ae292260e48bfd0baa38238dc70c54602dde57cf41003571eecc6b14b6eacfb2e8e844fc73e09b53909da59ef8063a2ee6cf3bd17e1748b9a0489e90dc0ab35737b40129060e039e221d03876f688b9a565f764a1d0e3140ba248141c9c4d648de3760ffaee86c4f9eaaab341b14960e6388f5245669ccfd724121d9d54098ca7fcbfb8acbbd676350d9fc43c514eeb435bc191994ac3171e8ed5c52fd7b862414f62932ade85f6f8baf9249fd89d273ac13e9db106438a14f345131061b8d16b078e82913b87583a52b5b6b808ddd4798352313fd01bb94d23bc6b8571143c9815bae86dabe5ce6a1f61d4d785c5f534e3015c8c8304418e09e808de40d8f649a578be15deea699fe74212c1aaf360c40670c7a84a276eafd008b8f758ce0fead2e4cb328302f24cff876e30318ff67bb7ae0f99641163b8f1de029240c3486d66a70770111f3754b736d55a5c51f02d376ddba8dce84c5250c2347634954de69649ab250509a6d065a656d63985656ebf1896a01b4a6a4bbc188091a3e8f2a66ddc9078514c025115a346b3986a73e8f4c5b12409969a110d874c20e69cd3bd0d8b8ffad463f0efc3c06f2e5fa5be314d812e89f13ef434460dd90eda8093a4b77b9737f4793a4cef97f1e9832d1669b876e61a151be78846b238871cc1e51a78b4a4ae5cd04ed652d2bca71fa390cd5b508b04b5a44138879803442510e3d53c3faba786b77cdabad0665a531e5ddda6c5562d75043f9e4acce2b9cfa899f18e637d7f08cc31b465fc25d4edd212d6dd9c394710a788360a523c1c0e99042c087d91a8b4a34d847bec4c4765958c3630192b9892cf323e2b3fafb0e153a68712973660119fd3014b2fc8e0f82d85fec7fb78956f8a6ddceaefdf5c889c0ae4bfb301beb3706cbfaa2ada737349c6cf2dc5d70843fb792ab3e7765fa24e54e297ceb19669e016e39e6ca0c6eca743b41ca635c8420e0653847fb8b18564be74423be82c940760264de59af7540b48b61e7fe8dbf4c8dc43aae0bef98b1e6a0ca262a3819e3fb42a5709f9cc3069dcd6561fdf860d5aba011ae66c81ee17b689bccd5b2576edf48435e68a64d50682355313c1e90803bb9f0dc628ed3b873c6bc17c48fdcf45771559c35b7e73b5607048bf12dc5c7178977bbf93eedd52baa404a9e8058595893ce378ac7f1bb737fe98791c09feacb9f773f4b4645435f49cd4369a5c5c73b6689dc991c1ef91b68dfa1fd7a1b29dd59e8d86a6aea018249ac59d75c7bdb89f10e519fc3bfa1e13a2f17acd84b4f3aa3e3f995fdff4a64bb6b65502515dd7f86c7a0abb669c29a2b09b7f32fa86b2516d7c38ea169769fd386565a0e34162fbe4f2a25c104e1f27405f4f3b044fed51b70dc456fcbc3cb5eb86800a7dfc2b775b3820210167d49f7276102e8e23d3765ff028e24970a46005342892f5237a8453b168fda6dc1ae0a69203318e684d192491db466746850e7863be234344cf9479c1dfe70d55121b211488322416a0d42e40e0cc510b467d0961dbb28d0377caa59f891e0b1651bc8085bf3bd85c23aa853945bb8fd5271524fc449a2bbbffe36a02c4147408c7e6d09cac8633d428877ad6149b5d2d5b55313626fb741951739a990a0c0bda62c4f34b3eaffaa40ba6aa82892d19af5a3105bc2b03b2dcf4fdc932927e2e84b777c39d627a2a376bf80eff8dea743c07ae8eac2250b2981033bb4b77d21964223489c2043c300d4bf5d7ed028450671dcd10c9c76862e859aee573d3fb9b8ff77d4c9ddefac5bbc437b700e7a31b25b6b8f5dd4d8121bdd0041098af15e7a0f5b9fcdd2840c83e9258cda1608b2a329f796ff6779399a7b37f854eac8ca475aa31778873f8d7d47e11cbf9ddb77c61c5fec2140796a4cfad5040893c2fe28ff0fa2e447e8b12a16d08a5ab648ee37c53ad5894085bbbf04b93bb9222a5dc9c75f9f5a922578e57fbab406ac103c8b893c5e9188221e1ee09326af6ac91cd38c3843b0dddcdd385ee8e80f1328322c99b037ce3e63bb42d464f0790c9cd5e7c2cdc8e000f2f29388ea4ddadd2dd0200116d7f885cd01e023779ca2659ce55c3c9eda035138730bc9b0ecd1dfddfc0bbe3bc61e24105f7c7c188e1cc1412f0001963ce668afa0127f3c2641adceecef9e03799f9201a670b2ad00cd92144cf838506386a2ce074bca2da8c92b7f1a27cf5cf785da256b353205767797bf2f53151b810c6d70aca56e29197355366926c8405808cbb3607e826940c8992dd2cdfd6f4b72faa1449d2abb2dff4ee5c9aa13842f494703cca3202daafe89f430410c7b337c0994a3d366ba66c19c4a701cfbb416fd05cb06d52cd6a98f9d334a129e7d7aeae630357877253f28ce17b82910b0942e00d950e5f50abe021471128d077dad0d21680f8b607c237cbc11177ceaaeb06323cee823282b1a0f76a6f85fec6906e532a48d2bbb09a425f1f431b991544323dbc90e4b5d24bec5e9d838cca58797c9ef87837dc3bcfdbf300b11940a711917888a0be3a78463caf4f0890abbb974b2ac8148165500d4538d288564b6f4e2e389ab164376bb6f9e9d95458cc8690cb48b8d1187c9b2cc5a412ee872ec0d9c8f6c78372a891c692521192c9b2071088f41f7d05e0b7c13b995f1a9a47c606fc84d3b54a883009fc22b6149caf23efd208656c7ae647a042a624c1cd8ac4e46508653e9bbf0cccc7fceb493c2a0124c6cc3757db81b183c51c5d263f10f0aca3f21421d638520b25f70c6ebc4c422d4a28ff6ef9a128e2ee95b725bc694e96af47fc4e9417d39fa9796e01850dc3bf6a733336cc8fba7944a79aecad8877430bf51cf89090c62c05eccd494403192d78cb1d2f368e4454c924b3edc5ac8008f689d5134a64466c08bce777b9b482ff03af0849694f46525df23c5b8b1ed7160bd1673d8e552a3ba50a3e7931e326e3a1261d7f574f673e647ead60cf3b4a8554c2d64920b02b73fea3eef6c388832c63adf114c933e791ecf8d60faa790a682ce29c79dd5a90270d9831cc2e2dcaf90121dfabc1f92992e3d6f98ca4213bffd3e2ec6faa682c823488210e0c15568d9a86113681d134c7d04e46d3c4800210639ce6a333de191a3c714a3f0806b77c4757a03da1a07f528c5240fb92f76c1ac6450311a2325634dc2aab4bb3761061e6a4ce8f5661b812b77e46e2af816db1c93f76cfaaba840e96f632c6843908cd0648b9f7fd90eb69594a6c9ee11f885796d968453a09ca6d5197dfb8a6105148f18ba5b93d62ae124cf8b4c021c0761eadc9be416b0f51902c0f628a084c0fb051672cc01f2a2a13f73f31a0a249a71764f64858585ad1f801f3f649b287d93c246e3abebfa7ec6f971c96bb67f26632cec19b59e1ed47223f507285756410958a4b1dda96257a79f32a0cc2102ee1d87a6864cb0d2d095859f89a29cbf380a386a040ef3e8099638ef3c820647cf5df21978d98a815892be0541b7714586a73eab6b66ba118bb5260bd91c6ce4666f3f854cae535a7669b60cd28d8f9c1a36e3c176715af4c9c5d5a4ca21ec69971fac95485bfc8d3b1cc20839c3707f352027e6502ae4026d22bfcc36b5f660f57a242c9195c6ff5ddfa6f7a9edf4affde6bdd4013fb69558235b4442e2e2135d183068e976e3671883f22316b253d74431094e54f206a1b203f3e14b741cca4538329501fa5689ecb80ea1403440058c282cab9c0feec77aa86ca5d9b801c95325a48ca577e329534822dc30e8b77084e87652e7d0b4d305b2c49f6fa7b59e55ff19c668647ac56a1efdb9817fbc9d1ac5f10fe70473be2829f91aa84713b20f2a173a967510dc30da115d209eff3077147096285a773a7018cb687c79567e945e96ab43273c8d9943817b6f06ef5bb7a1cd1712cddad6a941e974e713b72376bb17d19a9cb31c0bbafa55fd30ec63d1c2a811cd0ce8ffe5192e1c1040bb9d1735b2671be477341cebd90e319eeb7bdb50a106a69c59d800d169b55207b4d4f216b753a64c9b8b8c719510f65b1833207e551a97579c2d65c6dcd0edb7e9d425186eca9821a95264895c13e1cab4821793d14523d2bf158787d208be19e5e206517f547163b2cb395288c5b8c90a40c3957618e9bac4514e33f1e5ce101351c45c9bb2fc275d98c0cd0cd284857b14315d7ce4918061913898b21e27dcef15bd81dce8e1ccb1cd2a8a2d0e228afbbf27b6bebce6d492a78b03be7a6ae85adc9b6daf4d0f8e2f250361b6318543a61b1b03a658a50610313e3225dac2ad358111fd732371fc66df1a00b50547cb5fdc10be5d8b8025fd02e0cf74ebcfbfae5f5ee7bb4891637689ddf9a7cb369da3eefb9aa3349c0346394f04e93d7308bf40a14cf824c430ed4e5744ff0108df441009e1f90215ee052949edc33bc6ff76b124d018a72fdab874302c6090c6f48b49b58973f3715ba43b9cc1f9612acddd5b80ced3aab741d3001fdadc6d0a1ade23e1299da2b3a75b94082ce7f9c103c01d2358cb9679be473578053326e57a4d28d8683604511ec3f300743b5070e4f27527e0268423f83b4e4df627ef9d8591bc501ffa8a8470b01d00199645687c54027f19e39e35b47b1bd61c237c11492675ff07623cf3be1c671dda83309c454b791a3b2a388ac6b36124e6c4ff60c647b050d12dd8cbbcecc195b5acf2247e66c42fffe063b5449736fa140bbf391a116a3898710bd441b9051fbdef5454c8b38c40f13da805945e59f8767312d79c3f0c7b4a596dbd8ba4c6b49d187c48631176b259f42f43b6811933f77401ebd3846cfafeb70314e015bacfda65d13a322c90417b34fb0d963ca83603a0adb36aed58c5461d7aca90d5d27b886506ccc7525393e97846fbc75209c6a5662ae8c299ef9d9880103df1068435e3b74a05de3bdcc601a28bcc6bba606d14fe1dac77845a10f821315a4a4cbb1b0b661814eede5826c848228ef63180822816f4dd4990f7b13b89a12ccc1a60f469932720070700db5f667a9fa69d4330e446366e9c46551d1bd48b87a19606e38d3dca773e29f377f5a55f5cbcf413763e8006a2f060fb45249805628b0827590b7481b6f1703019d3cacd22a7a2502dc999d6549db2124bc987c7e95c20726f57219fd9452a860e41fdfce1090fbfad402b759851da46ffa6f9244040511a99cd8e51e52485c377af7e39bcc2f02b0b1d52216c84df4e4153f7d4b7e2d10e51b61ee159c95a32efea640d4a46901a02c6add1cf778eb891da9499b67395ca9e87a97677b642b54555c004b350647a7dc3aeeaa30447c49c8a233276ca9d467e257bf16a1d5ba19e8eec23dc444d7e92af9232f2328d38f34aed05ade93053b1ea7d88607a95b58f200e0cc49e3323aa006091068349c01ad82d2a1d9ae10d4a5c040701b98fef1172ea7a10b52ea101f267a5620ba3d6989a721d27d95c37d24f640b80d8977d1bacb8eee33d1ccc5c6811eb57b2e19b0319ffc6e03f5f21aa4624bc6b8f65c8194e4cfca95e06785c72a6079d87e709010c961689b0bb43a62f787856dc802bebac27f7e6a5f59ad7c95fc7c6611c835d97914d32d3aee070898b854a633b4f16a3901f534696bd8e955d1dda4d23d54b782bb2ab2e40acf4d40ebb317676bb9f8e6dd6cf208d06dc428aea739d2e00cad252de93ba2cf3d286614fad2ec50f3f56cde359fa293c6b802331a14f7552c2e78b8341c3a48fa850cc1d7f61c41c379df1e8f09dcbdcebd46361a3670c7598c77374814be1b4a7fed1b31a0b3ca5f5ffa0f1dc11420d775807975d3319b4ee3ef55b061534bf1569618aa046108324ed958b69fee7ce92720baad496db974627287002cee34aac7af176e699eeabc9d409ef5a0ea3192a2526f998f0c34cc85c8845e04fa5e321b62312997614ddf14bf379687ee3fbef02ba42e5c3442e407c4806c3eb0fe896024b7dee3ff5361e2c60bb83ddadd50d27331fda937309193633c0417dacda412c1ae96ec22d58f0885ad042a49a88109c99ce62cfab2664f0719a8d15779496c394913e23ae6f00a1d4bab078933e16739e04b49a5b91132eca71b44c0004460938aebc102e21a82cb24680efb84be83a71d1610da336ede703592d61aab32e5e57d7e0fa7c502b1dd4730f0fca286d99b70ac0eb81bd0b7ad1c7d319ff945bfd5712dc20286d915bf6998b17b6203fb02236266e03c01bfc7efd9b72abfb14222d488f5f3673b8bff1ff75f6422aec3d19045e61dca574bf7a6e93848113d2f3028353b4ddb66eca9fe220a3306a7a040f34acdaf277dd8ab6476ffacb951fe40275a5b624f77e889d2e594aba8b409b8d0941b5912559715f01ae559ce244730d6b2de12698a86c939650baa592227e54675f69c67b913ce235835ed4d8dfd34fdcdd75bd4be7f2a38b4b888afd93d852906c1f58879f629451390b8bec6a21401a9ec14ab14d9054482fdd649b9e4526f239d07beacc0c2fc371c21b2c6d1cc4bd2ba3865fea99bd0c3bf6a8ff4d1d371a36b36adcdd9bb80311607602b2c839b86f5295a925a189d6341db74bb6c581237571187d7ee42f2fc6a614c246617822fdd20d4feef2301a0cfc8f1b6c009caea1f758ad7e5dfeddc6943d1df411066ba4573f74969373262f330b0c7e2a809e71f595bcaeb142d8bc91d7f6cd0fe02f441585bb8bf0e1d65fe889f40172d3bfb1685a48f8427a2a96285b66528a9c495599a4b5bb2429da5a84f40c7dbd1d24fe25be37ee3a04b09cd59ee567d945da478965c4689355f43c78fe01a4460d0ad9f7707ecd6c6a147db8aab7fe834e941ade2e809cd2d3ab4589bbb283a585209b214269f95f89283f6b6d845d087eab9ff60047ef5b5d2552aa30f6ab99e46683d7bd9a52159831ae1ef244ee9b91ef9e7d66b66ce6b5645e83060d63bf8f13befeb70dfd755e52fe337112ce6d8376b42078d022059fec233d4e54a18cb9b823ee0c459bfecf48f2bb48c1cb03a066cadf4784d3055d3d9ba79ccf7fafe2e03bbced72eef61f9e6315ba5a8c6c4bc1cb655aad85df95c066804b4fcdafc2b63629e457cbf893cf035d669f242d9c6a116de64470468d87aa5879eeef3ffead473b3d57ea97e67e89be82fb8bb1da38375fa9bc19c8f3a85f3ff68d65e2e53426ce00f6cebbc089989ab462cc546d66893378ab8b0e4f8a80a3174198a472501565305323c690818ec5dff9dd7a9450ae1f3b4bf439f2c85aa68b9a0642763f2a550b1816a4dc59bd7aa73437da3c0967101bd7d129559da4c0d2b8de2e9c597e88d21a28ad8ac63f4acd37521dcbf9a9171ed0eb483d8873bdb82eeec6a30ce82f6e16dfca68da10df907dba24b04e9ec02080e1656e1c6f97cca5b0182f0dbd6a1268234b69c807170c9434e4be17e318acd9cb4dd59b936f85142a417d94b0de3972771f7ebc5b45f849a8d1ae891694e6a6e7feceb2e0cd5e661c385642a86397156784ff031e3030bb2784d51855bf07cccbf8a60682b2fb06df90589a0f17dc91d7b65a2f6fe7abb9c6a00079eaacf76fbc8eb5342f9b5c9ac20a9a5899d737ee824ff4fc1e0e491af4c360b59f4aa8352001473fe57605a20e73fd8996b4305dae3a063c38c31807da3d6ddf84a2ff9c638551b5d8bc6a67ef36efd0f6407737ebe01b203693c0d6e6450f997351a7c9aab2d6594cf9b60dabb52dd74724f3163417aa5c4ae425410c9eb1dbd89bb871d56433f1cd2aed2fc3fc90ff6b495b26109c2c313f5d4ce55f5f347c0b44b8149cb1c23dc2914d659d67c6b446ad766f96a21402bbd890ef1115c9fedf73daf2ba56ba39b32846385c2b8d0b05f65c52c45b4999f9f5658c8fd03ad64a1421208ed5a816306fd15c49c36359e6ef03b775e3b531817061e6e9fc35872ca99cb193612125c163b0a02357b32cb294ff8f65768d508bbfe8878438b2772769c521d285abac88dceaee858421e78859d28aebf3f353aeb070282530b9b3018e7079399bd412826d62d081385d6f4c71d094103740ddb273e21424ebb76930f493c8f11ae6c9754b2d1f4e8272103bdc299e79202a00a3f3c5c22f8ec952fcc83bd9df46141e2fc0d85720aca46c91c4b76f1b39e02dd8078401ec98fe66d5a07e5976477dde16621971ca0d8ebc8fb163f3686455508a02418eb96c23422cb449f847d096c15029b13112bb318f96ee1b6460e26003b70c6e8a941a10e58a8c3877e5e7e339e97bc381de75f0c2e40d98e4932fc3830333e7b54c87dac9a79e340edcc822b3295dca2825af0cf245c6b4de99a6b215c4a76a833fb1355860a70169b42a44e21dc9dbe259e60a756e4c645ae376ccffe47949cbb8fec57e3f4a82cdc8d2f0e5320da0b6a4178e5040068777eea0fbd4ed475abbda238914386e6103dee5dff07147d0e713dd6ef70eea7d36a7d8bf18106cdc209f34e6097c8693f377781874d12119f6d6def3eb56f8266a9b18013f7dc42a2bbed583d1f23d64ccf3b47654c51fe7473456215071e77b309b0bacc416d75bc2f61e82df315642a129ba01bbf6b8527529ee466c9e4039619d34e84d320dfe9c4a20f0ef7f3e147aad97bb574ea81a2cc4c3b1c768d3f6ba8b156cb42a315cf7f8e3fc9b2c356d5371a710bc8cc8a31c527c6230eeaecad5c7accd8ee4eeb13018e27350b09c765c25034f138f936150684c6925c8112d661c663b58fe2053d8b41d4a2a147bd17bd07a73b0545a1ce86430ce3a31b12594b627c621c2f252961746c4900e1fff1b0934a3e8a2f2fb6933df6db88ec3ac3291356a00035a991f0f4c6289bb098c8fb61aff28d95638130780d6e3752d0b8de61caf7627c2bc519d3d647f0c667bbcb09d3845bf7ebc5d6f76d995ccdd38e13067252fa06cfebb631f5753cecb954c349e0aab5b7d1581a6d16960717a7d877c0af6f3a07850b8c239e397f44c26b881bcaed0f3ac6211501575308577d1fe800a19ed3bf411f5867eecf30652d7a146e0519ef246544b2b189590f4a2d290ee3eafdfca149008ffbd3d2b119accb26aa76dc0a3f26d721424e05d33ac5380e0852f0eb3fb1ea39d10eb40feffb09ad910b2ea5de5c780ccf52aed088bf6a791aae73de11751465c7ea4d053b0c77f3631f88d2ce5fea0222081dd739f7f0b78b8093b3050f4cd528f48138661f1a81d491e9b227c39649b860170311cee0df866ea2e38fa38b87be0370ccc870811cf3459708c70f274462ecc96db5f924e4437674a60cacd7f6033095246ff102513f3c949398766449bd9269133737a8aa3b895793ec43c4ceb6a04c9014054494e0e954c27e44ec8bf42456c726566982f59d221f2389b2a091f5014cd6f4416677293d3073b0d2c47684c5db0fd0665fb84895c55b35f523b4b3d24e28b4a09aa78a6bf5a438ff14131128688e4889d40ee475f485a5e390dd28c7b67cec66e7eb38f5fed0a00441db33fefbfb3e0d6482a7fc7814bb1685b67930cf2d13d22f6f77c8956771f2d4519dc61044fe851415ddd4a79a4c721f24ff2995c5555a05e247b2be8642e7786f30aeb8754a3d8edf5deb08371d93b8b46bd3dd140637634beba07b477b5bc63582254a9d4cc682c03d2eaf47e3b602f8156f339bf25889ddd3512f1235f3f9f00167c9100a6f879cb69a2c3cc04433a62eb06fc1b103620a35c397066dffc7270660e686c33d7c71f52c33d60fc8476a4601190c724d6d4fae013e3410c946c6a3bc3d63aa5fbb10ea8aa8d86029d0c1ad80d116e9a833c3c600bf766d7f04bc519f71f301e68ba74996b9bdacee33460bd08e5e943d57e8af30efb6fb45ffd56943825ce586075a0b81284ac867c2f3b47902b0c51960b1c4d65706d6da052b3ac99bb0b33206fdfbb9393b8ba2051664b23a2bd50f9f55d4f71be7936f0ef7c35a43acb84b6d15dd48ee1bd760d6cc11f9166bf999e500c441e7f852506db7cefa172cce29a3f8f1b7ca01e85181e3bfa8fdb519e1f5f216d77548d1f54afbf005ace5d1caa90de64517af524f7b238a4bac1e8f25137d92590d62d5b92a0c7ab01fe6b89f03a5f7afab3e2618dacddde293b6a4904087c74cb7bdb3f75328c9ee2d6750bd94f46edd01694dd24fb462412dd68c9d763d7549b93bee4f82b080f67ee530287e6326cf2377865146b7967976434ff75114844892dab81cc338ef611eb9337f21a01b5fa05b1cfe5542a0e69235a0c0319bcc6a4e0bed19e98b458c0e518345084212b792a3d0ad90be5ddecfdd487a8de9345fec90ef9abec9832e60d92903a6faac77b3a7c3db31b04ef446a82b747aab49bd583e47c01d18a9d0ebd1eefd95568ffefe0123c93f35ca757f994adb17df84af07b661692655829775f61b1dea0ad921b3070482d0fe22a90b774bf9bf4923e2e3cdfae034172053d10a348a7dce71a7bfbcbf0e06d6de57ce9f27ea0254cf099fec1181fb743815d05d1c3f66be9a2c7d4d51e302c5b1d3fe971b9aa4aac0212f758cb2ad2f712b8e22a5aba3cdf707fcc26e2fdabaebef39e8b3cbb096597344f0f91f86bb0e753d724ca77800102c0012065f120950525644f4ad1c84088b4ad6c94f18d82443afbaec5ce9aa74754777c3c376c271818f67923bf19d510c1002d2957e9a77d21f065638af239eac1066daccf41879a0e71e557fd12d173c304a13b4d50b4e4c52900ddf047f9341c8a7ed6cd01a74b0ee92075e3f461bf9a59f03839f6dc9bbfeef04143f01330f8e20bc8e058e3dce7a215cd05b5c0bb71e445d00eb092d5d20450ff26f9e773a43f930ad9eab30eab160ef5244f3f324ccdb73d028238d8435c8118e4938cd5116ca0e40316ab410cb053ca3725845ca69c1aaaa30b5ceef47a5fc15650cb136da14eb47d2966da05e5d81e2d2140b248050f32c0ce4e6135238b01932dfa2bb8859868cbc492e7092a28f508a2a8e8b2755f9fc03c65e49505cb62605ee3a8ac48443f88b72413a37d15301e81c027a366320e195fe40f9ed746a9d78fa127b65bb0afc6d150f5f01879575e557a084539cf08105008b1224b19705c83cffa0bdfdcdb64df6444856aa77b300941668651400af150f28814fd2015b3f4d044dd1ad9634bf0cc8ca4a5435a0baee46ef47dbbf7b60a50cd2fdf2818dd7dd2448cd05b4e8038c69c65dcc7677dea287eda2f83df7fd01945c8596b2ff2612477392c6ebe6ddac1ee42b080ff462a17c35c923e8104e6f3e5fe83d4eb610d3116754b5b3b5d9308f1a365d72f818660eb28b067e3819091cd5694bed165434f6f40c5d02615c294a286c1c1c2be569f2c9c28970224d30d16e98cdcb96e05298f30ac96905886709ec59d11cd619fce3a89ab923cf27c39ee33b3c6a638e149d85f247156e2bca7c813a3fdaaf72c18e029f1d5786a9987e2f0e51b754fde6cb70d1a94c2e36bf779f73b8ed81a01ec51478f76c1b8cc4f81610ee5df58d43ae6b091a5916816814238008e83bf063502f878b507cc2e764376676063ccd8326369403412130c72aeb397df427ce997d9f953b7437ff382a71ce5515bb83058073147da5b6cccb29e7a6fde5760a8144e4d73bdb670cd621e91bad735d2d94658f55e1fc1a144d746490ad1d7f94178cc81ee6380afc066079150e02239d9812e8ca12e4b3971b60a2872c21f895c5ff4dae8a32d2bb585d086d5cd709844cbb49037b4980c61551b0248471032ce7fef9d73cb7af2bb57793c8fd0fd4a085ab21d386a1e02735b82cc07fd9c9adbbe05c22fb3fe4781e5b098b8867bbaa960543f181fabc34de86005246cf6f4d711d76d9c3bc7f70139e0465e4e842885bf0bde0a299041b2fb165b107ea5d48d2a8df27afb1f4b25726218cabbe4871b78fe02df44e548347b4c3f44377f092297e01b7dd4375e660fb967697ac79d654570c71218aaa69ef479d0273893df4f622f36545f6eac91ae9f77300bfc303ceca3d7587363c7b9b988bb2e9e56c7d847d88a9ba17c235d29796c6d8e075ca9148a6f9f024c9a59bb84fe011d261d960c40126f2082f6a67474b8d460cbc284cc80840da33e97f11e73ce7a2f6dc58fe0ff155716630eacb80a73c1531f0dab540e22be526c12cba4be77f140579d02473324746580ba593822bb0b1d83f80d8f3beda8c64219944600db9f71fca3946f053d990ce0c0a6060dfd7478cd0e6d90c4525a475fc3f328220fec528bd7b0b7de574b4ae96b77be07468f61736946215afdfc864d281d63243832b0b6c475879bdc3d5b10b5704a9343b4cfb57a828d241b50e106ac71dd309833c5f1456cbab49392f1115b0a6e1a51ca7d5d4b2d40663813997d2b470080664b23ab422a21eb702715ce9b5a439e0f65315f63b0e714838c4ac55a0ac0e04d1937b5ab6b0bb93e68e419d91c00b730df3b6525c9845e618d7d69367746d7adeb5b78a7b1824ba9b4048c77c6c9d89285f0b4fd330520027f54072c506393c163dec32eda95cb5ca2e3ecf11396679d39982c50fd737a21f8661d1a5380c6e8109ea8f3fb76c4ce3c012f2caa7a6a534d64223eada21342cc385053de76ea25ba9fb1628e28c04a6e77698040353e3077c633b9ff761a3a68d4c41b9a4ad243564b904c46943be4eb9814a681fcccf1a19ba6a10fc48457233aa784fe0b4905789a69bdf914a3dee2c8f69993b22ea7422d3eed2a8d0718b492dcd268436fd14805d33811f64fd2765f58d3648dc59cff8c1a59e86ae9bfc5d81a451fedeae0a81ae046a3235d8e8329bbb0aca22b6d3e414996f3dd5dd47f4c84570d142d6bb4c4d67591fc6068c6f4643d628fca6952f5b500ce58785238c941c912abbbfd8c864a4ca52df69fce2316a546a9a2e1a13bea1bbd35541ec5fa16c0afe714e026c97167a9e04b0ed163bfd5df59e47dc7cb4550266755d2e7e4854119ce72bf5594d0b330aafcd58d7d3771a81519d4a815e8d09d0c7be1b1a34abac0b2dfeb274bbf6e5903809fa3a4d6af3b4d47dacf876f758c34c832eaeadb9e7a476c6f252574708f2ba33acf1961b22385f7731236ddcbdc486dff9514bb9748ca548854ca4d41c15c8435e99046c50c7992f1c343e4e8ae482af482d4ccb78b58e799ba13d096ba970c3f2aa0b6a9dfaaf18b820157d21e6a6b378aa848bf0929b4c5fa4a2a8f2733fb92e630abd8048ae6afffd5a9b87bcf6cee9e16267ba9982c0b6ee9a8e89f93277bc12bd308ceec600cdaabfc7f82de259012c52a1cc33916c899f066c100911df1a6d4fbe4f9dfc262ca5fbde8e8c15ed4702364a4ec89535818c2a041e82377ebf6ba62811da7640184c4b0886f8fd4f6ac3e2b741e668bcfb950f09934c87a7bb925592f1111583afda5c16f49f4256284b2cf1f6d1aed31667c3cca0312d2f9c242ea2002829ad5c90bcc699a944a649693661be5b910aeaf6f41336d67ec24a976b9254668ec0ca62e272b4ad3e7beba358b805408b85f2e091bb8494e4e560a6d787d721c2db6ae73b119fad3c28e5cddcda97ec2cfc41e68c754a96ef451b7ccaee53d2ea01c5c0e161182a6861e16a81030535e5b91adb728f9fb3c1636dd4e10be57d7411cfaa169cb998d706a79e57c7425e08bee993beac1fd0a64822df082834bf2eb5f42780f9f71cb7dbcb79905c5cf5b8f209b914e64e605a53b62a6586ca39919d85ab1fca575c58f6434cb4a28b8b0c919a5868f5f07fc49765b04fc2b1d1004f58d1c8cd7d225df25c2e923c82768dd94a801ffe1817819d5ee85dc3ce32f466760560928300278d7481825cea8afceebefc4a05c15af17bc024f6fc13c892728ffd677673925a5e3efc96a152e6367d28dc59e7db03f4b349550f4cbb4651e8d2af9e6ec4cf2f76c77b2108fb6fdc405514859095ba7a72c19ae0d3ad381dd585e4fe85b583bb84c3a3da172ab5b88b77ca1352acec320989add0027b2ea5d0263aac8e912a52158e9e7a3fb812b916dc41c7900fd620b232ab9715ad71ed83fd3d813c68639b637ed1138342278453484e1a1c193786abb191802a6a3d453eed1df4bc0fdd469f5389a28400aad56217f3af626e8fd077c4338c046a33f6a972a30a98ecdf312d1d611e06c4c92c3c96f085ad125d9bd1b31c5dd1f8270b8bb30055b1d0649c3bd585d0f53eadcac6c11307f605efa52b65f6ca22cc97ecfe8c8c94f70df707837598a4cea687d38aaa93816002ace5396719599153c7ca9ee9076dd303b8971febb85115e88adcb309c045ea8719a84957d2a695a52ab75e1c8c5cc8d1a7ea692d0c40395fdc2ac7406af52af39d87908f74944754bb48da8e228ef4c43b6b256efb81ea3b2cb520decb3f08198de61f85ecb710cb922935c8db9d2310f9ec8a5987f09543c2cb37f51abd779024c2a5bcece4e68d1a24aed5c70ea7acd39e3e6811736ba2f084c02d08a1c02b6319a7ec3d044fb3f7321e270677418467ec06e102f66ce17a174c93a49ae5a0e08f13cc78ea5e544edda6da877dfd38d1c78487804418cc19e2c6c9065b7708c255935bd53c10d808b75702ad9c821f61497adbd4ed9f685d566dc03a6fe72784f696136b7ed8b48cac071750d1b8823714a27b5b1f05ce16d701ddd8a15316729aeb49e0f5ff32ded5425fbc8a4d1aa742dcf5c51025311291d161bf7fe20d31936906946c4d863522866c7bcac69593de8cbe578246a316a27ab5709abad89c4e9a51a86808450b6dd1ade8dd56722a20d4a647dc8bab2720ebe4543e8a8b4c02625f459596c23c0f8dda482bc244c4c3ba6b70166be376f6a773392651c5fc78952b3c72dd48f9ba65c603c48d331d685e8a088727d6504fca7ea7625163c395b2ae7d34df6505156109a14131d45e7e251305cd571018a04e5b0c8375045c3ac301b764871b8cc7116fb80706626aa50a518c5c0a39fe25c6ea4170568d7de38e2ddbf58db52ebd0253935a699d918e7493550faf4fdb87bb2d1fa722da1b22bde13cf28941228f709d19d83ea695ea4dbec82e2dc253fb48196c918ff370559902e6ec2240069159565251f601c79e377554d51b4104ac319a33112f26cbc77b023d3f10a372aa6f18b96ce3492b93e78453af319a9527602004839507117030b35f7271847b02eeb8b0ecd7458ad5e14866a429b74ad104e912274517360218ab134b1a525ab1e155e79c3b29ff40cfff59fc32ffb74497d9161f5231030a9cf81e3b670ac04948a93a00d5d54329d3656b0eeae31e4a74df08e04324107c9089531706348f1fd1e7497127b061de9b32525e44f7c75bf0435668baec88ca76dbd787447c5ca3087d1c12b75471ea1f8d417c571ebbe130054fa098b0444758b57fcda8cdcc43f78ab82c0509c5db0889ce920e6505c8311f99cbcc13cfc64879a74d798165acaa8814585845e4abf63151efecd4fd54d12ed1463be6224170a19e47e13c6c89e4b483529cc6e162efa2e91d542032be5a04bcf06231915a7ee914b19089571351bc49a5d6be3a5489ac60cd89bc67e4880c181bec55d44260cce2845c04ec41810672e0a59cc76a2af4098f24051ba4570519c8d9944625db1aa1586b3af74a6867f4cacfc97e837b3f352e8420262a3dc98343a802cf0d6016ae84b1b7d694080256de4e5bcc573eff102db2ce0644e769219e2eec5b801d2456ae4ff9fdd2b6f51535d3219a5140f2ab5d8b420b5e175c842c71b5b1bc062ddc404c99d616b173b204e880daa37bb89efae2e9c432bb1a0c7b353c0da8b50c10be0ad2c248aa8d842a2d0a323146d47c6e6588fa059d4a78ce57d7ad54ac9b0fb58dd583cd3d06d7ec13f07170416d91509132658ecda91c8816d7e363483b4872f835f67ca689f7be73cb52fae36c0f9e60312ba202b4996a149b9ffa42fb8aa20281b8506cb01c378004e2a4271829149321c3068930a4c2ddfe1e2a222e356e44f54a903539082870c80e90657b7a4b949c5bca434b058129521e02182ca62a7333536bea4c32a20a0ab6dad71a56c7bff0b69862ff9456414c117389f38101ba0e0b453ebd1037a5fc57de10dee3101595abc02315d23e876475b3a5bcb3eeacf5b0dd8ac4a29efb9dc088c01fff7cdeb830a5604f6f283826432b6da0a7f56d2b759fc211b1afcaf7f7587547d4398c83d8918d35c3bd2e966679b4b6da63e51c51c67dc0e2aaffebb4f156da9049ed28654e94d206dc3d7fe850e18827e4901b62d4b6fa0a5637fedcdc1b9ad4db1f0e3278cb4dc33e089f697b94ea15a68c5f05aa2db976ebb1e72e5472a8cd1c5ab2ecb2688689d875f428c733985d0aa2721ee6989189e3689a7e701744133f4fb160424d11a3daa8a8504c256ef956c4f5ab709c510d95c0a90cf92c93ef3de1156aab8fbdc15964e16bb84f6185243cef4a0b73e24032845eee7814504e12306c774b69ef4a7521b9f46648d8d242699012d135512274d5e157a83888415dbcf2e0953951f49e0a16fc29b565438735c0f8379ad68a407917268fa842d8c4e4592fc4b3c12a76090d2af95aea40af9258704dff6859a0e008b33c682c834c13914b6c9e40e3b55dfe161bb00e41eb9b7859bb49eacbbbd3b6f9b0c6877e45fb620802009b620fed7c45a015e32e9a1383051c348e21d0a84159aad3242c09ada5b639fdc0d009583378d2a2b7eac1f0934d681024e65c37d50bf8903169f659a15c5929fbe71626464df4037c3197a53286c4d3228596c9a089e8d6fdcc67ab100d31c79ff1d76bea606cf69825ef910157011e529cb811b2068e85d8cdda046354ee633fc23c423de9044d55a5e194f998fc3fb5c534b4741cad1b23383d6475e330e352ad2f18d649814f72a045860f2a08ab2346a7f0e796c16112164471ef6b022c43a73e75bd910015cac191488e554397b1b14b3ffa12586724e6e2d41eae628de29ac36c41f2d2d14b45f9d8fe1ea7b30f4e09aa226cd91c9591ed7cdd6339b11192051321d1d6d85d2dd60271fc7fafcd2708c30f0ab7661962e4fe80f5f4aae92efaa42f7863c69dbfcd3a350d71ba22e19675365cee78a21da029926382db23be245872113a484643e0ae5dfdffd8e52faa3acfaf111dcd0d1ef44ba02b9d86b8e46404fa60c7cc2a62d073f42b4aa21ff3d8cc3f6209a03fa660a8a3b7f9b96f4a91e81d109e5ef6b207142e09321436bb57ebc5d022d14e2c63bbeb911ee6b03532ec6dc85bbbba81d8a84219e0f6d077822c2e8879df44e66a6848e1407b703a2b86f18f8162fd29207301da1ea996cc4ad96f1bfaa144e5545541ec52d05385081bfed1b1cd4230c86c902e63a64e3f1f7196c4cd9d7e0d6de3fa094f512fa257499b97d77de4f6d6e9d7bf3fe8bbb8f7a45c44877b2f31272c81653fa1f4f073c58343c159abaec2a95e5caa347746ee6dbbf4ce7b0d42d074648c15043b72499c0482404097507f838e5a26d01d628d99677d037d8ba71242217b340c985031b71a943c72a9ad232607c71f2c2ec1e33dd2e56ad0cec158528ef700e482e0968fd7ceb5b059635d3618808d032aaf82d46bf55a4a12fa3900f854eb17376c659af2e845bbcc4434d106fdf0dd706dd141e6e58d055b134e65d3c9181d8e3db250c0eb755c3c5b676046dc04353c959eec502fda43bdb313a903337a87f743409bb12f4a019995897d6e7e3685134e74fd7c9debe1613c75779dd823134552c9d81084dc07ac49346e2489af83b4965cf2497e14882438df71ad93eff1193750891ee03dda7da42f316401e24314f901c743f29aeaa5eb5be7bada2c7a112b1c7a01853baa9b93aaf5a5470553963dc93eaa5e6b27ddbd0c5b0abe247cd0d7df2f12484236f6f59b2332004fec9125937b8af58b5e68db950eb7db6b8876318bad992fb6410c808ab17b1f7bb2033aef7d81839abe91487d48eb5d7b14549a68a0a15e75d106babcb1c8889f9d6d727219bf80188fa93f8f6d16662570368905707101d4e58994dd0437630495aa729c4c94a804cedd3f0e09a55b89eff141dae16580414c91d12776e6f8e78c04664bd69317ab3632ef9db3297baf89e4c2f6473628ffee4ef43bf2b24e7ce2b57f2b3fa6b45be1354db690f348395ccb8c2d77e37dca0f75293d4284a70ebcbe568f8410171504ef19443688055f350f81cd9b4990587c0cde50d3743fd30fade3e1def259417c7bae0fc08beaa75a0cda3558b5a4548953dfe99295503d80fbff71aa979ba85ff624eac99e8e9c148a70b5caac187d0c0431043a785bb35b20d0b29274aa89a5261a7b728236468364f0e447c30b5c47283fb50e7508fe29014557a51992f455f02894edcfe25926280a58159f4bd60725a41b740047761092e749186c1a172b84e450eb8a05d9d6766b84904636217b6fb977090ba80bb40a7576dd2f0854998332edd183fe07bd08f423d0df179c663391ce66b34c248594524a29a59ce1277d10654e8811e7357a505a6396e51a465cc2641917bace92072c345202d3362f9961bf22dbab92e020427cec7f5e5a5f06da0b51c1dea7650310ed7fec8bb44c32d903d955b69f424eb2d5ba295b21d65a6badb53098b5d6c260f6b11bfb1cdb62c25314dace1db9df649c7d97baaf9eedf7db412e949bd106c4069535228963975aae5880c7767a926592321c4fb040f2c31336647124653207569ae060833049ccb0a184ceab19b0bc176397ebed6493903eaad419a32692e8a4d5ab54705fe69112d125b46800b94f8da072df2ed926acb4cdac5f901c5ab301e9e817a49b62c7f203d2b02e0472d19a0602a3351b90d39acd5e2dcb6296da4632b56c0062df36b58d545a024aeedb2d6b887dcba56da492920fb96f9fda6695fbf64bdb4825278cda854d93f4724fddcf73e1d7c3fd8640f71c38c246d7e6bae0eba6c028f3377cf5dca79e0a8164b781e37c6aa471f6e9db26cd20d1684a27d926eb649fb6a58da99b7227e5b64bb4a68fb14db249b0db2a23a224a2226a24655209253550c2c24515554811fbf448ca826ec8d2450b72c0821cbc20ca5a6958d24a063c4f432c7dc88f366983d29af543fdac4a7491a5acb0275e0035841234e8c11306f0e0851428e9c109165288f3791e892f354819c286140c5581b3d8b2c5121e8e386307715e4606fc2cc413514491e4ca131cd430e2021cc078010d4014611483a2ae913b31306a98ccad2a18dfae5ebcc40e511c69f9c1061996106ba55460298ed8d2104628cc12309ae425ddbd78cbdf7e642d27997788fd1e29b91f8407622b1144ee1bb9ab40c9452a9db09815b9dfc5da664a1c1942a720cb377e028fb34a0ae63789331b206bfa1c378a306eb94711c64d04e94305789c79d620bc5c6708729c36cf354894c7306b5998b9fbd3a9ab22ec79b27b26752c10996d64f92237df97e066d9f39dabad5dcf814daf760e24d2429657ba64ce03af5280e5e527edb2d91e40964a4a5372e7b45d6beb56640d26494014d9808323aa683a63892635aa00b47842891632484292022525ac24014516b975b7d71e134a4e1c652f4ba52494c8238f28bee43128d32b25e124c3b2544a0a939592b67cbf2d5f441e351bea4212636cc9dee56da8657b9bbd12d4a64c6495bd779d44ee2812b9ab38c89d3522779a57839cfa4a0873f74edadad1aeebbaeb66d7755ad7755db7e5508d414e7277a52488c8293028736f951cb77ff22377cd7e257011980047015538ca73e73e9d2e5442e9a9bb94d95a6b6ff7d1dacb7005eef42b588e9b00778e3bbd4f8d740441994a29a5eca67686ccaf8c12efda227065dc32c2f4b7c3f7102dd2790e2a4993a8f2a205492255620493d8a014975841174f22d006a60827b105596587265988f40d026d5b882dc80021d2d0eb0550502ad1258723b1b31e05a514382cf124769a4741f94418443489dde65170d2f0025192d8604c8ad85d4e0a2a6230456c50470c620b3de714b49f6a9d48994aae73d659b7228a6c6b96524adfbf6d43ad4669ae33a460f53e45074ea429797e7ea474ce39e7acb6eb299df34d675febb239d98e36a36d87cdc9e6a49fc49095494b6562aa44b5a82ef99c46c829b2e5efe9e3f2645b9a4f9843e28eb625c921b9802ea144ed4495d02574c9ac331c8b50163451130d61932c966a97c498c22477d3a3b43bfd1845f9592ed1256a9bd9fbd81dbfbeb2562e4c59e1383305ba6cefbbfa0314e1b261294c575415e650efdd97edd3e9302608b59dda46d3b4be56942f78c3c05b3806c1ecc1f0b5cb1d7618b66a4f128725711ec003238ac46eda50c4141eed35c12eab6ddf422096d09627510baf055f3d1a504786a8855e135c1b3669d7296d520e37348916ecc81069b710b1dc3189d34fd2479f28f7e9953f13f6f3d09a395445fa4a8fc2177d3bd19a8ef5e794d91da3fddaaf6d87ecac22e1b19d7c68cd7c47c5a83213292845228ea89b524a29ebec1474b1aba6e089c29cd3874ae594f2858bbbbbbbab7452dac85a296e586d17d45aebacd6245e56b6cdd82d503b67921eb7e0cdf29340eb906f38a48db205abb5d65a4bc2b4dfce812268a37cc321b429d3dfa156931e835e39efbbb016358c9b94003d5cd7844702643afec8f404903832bf3e954aa552174c71174ac80b980c66b98417a67c654b53ee56f5dd4f5d2fc3982bf01893fbfd1889e3d9d99b666b529bc1bd2a91c7d46bf7a812e65e8c5dae1f0693b1fc432597cedcc71fd9e33ef6c8de798c3a4699d1cbdeab1589d3f79854f069d9777ad3b2abc2347c78aaaa95a9fe28612755732a9c0fca39bdddd487fcc85b95b3d6a4546b69e4d84cf0a6e0d11321d7efc42a8f5c633995023bbca5fb8685fb615baa9f4e77ec92b03e0f58cb3e0e49d334ea79e386257b1b38caa6bc81f74364f20db91f2608f6283b39d15191aa4b4965f5deab40395d37c0d6daeeb6b3dd8ef56c05a5d8799dd7ddabf7bc1b2ad1bdd34fc7037bd84b65aa108bd0369afd915761a702915c8ce269dbb67ddff77d171cc1f16377cdeb825260119bb90be6d04dd3e6cc06dd1195eb529f320cc75ecaa9706ca69cfac8ca6138e2c8327425e1d12584d6544dd554fd8e08b2baa272d7755daa9dbadbce2e5d47aeefa1a36532c452841cd757bfe6ac5de26eaf695ad7755df77e504e81e339fbed34285fb088cd5b0e9d6193d5fdbdaece0a1e5db9bfa465dba4d34edf7014813bc785d14e3a52979e84c99ae972fdcfa1b576e9645e6de183f2066a9e056b50ae5d27d2178603b8b354aa81932f4a6cb0050c940d9d121063742ec80a24c31afb50e8dec9468078ae673f498139b4a68aa930a603965a9834e1c18aa82a353083490cd610ca01861eac60429cef7e02295341d6e0d83cbd80a0ceb792c040dc65cb215be56c9591961378945cf2bc0a1267e6f90f489b8a45114e94f23c6b0afc65769f9f4354960a77a6c5b5fede7b53e0694dfdedf12c78a352cfe99aea70479ea33289b1cb4563aa19b0910dc8b0031be02083185f6620654152d8006286a71ba620fad2b3db1f5337678cd648a9e1d5efb5dd6264c1f259702b4ba51a28e151f4021aa6141ee4f93a6733cd66331766661042416031431060689941110dc8f4b019a091e97bc49098c8f43f98442170c8f423ec087194e94de011624aa6ef6922441636334a424065fa21f43f521090e98d8091e9815a2a0dd12553a945890638c8545a51b424d3a64c95a47cc95495e96ff29d35f747279d55894a2bcb3c5e9f9f964520eaa90926527e80610b91de48cb641a416041031e74d086125122a5526cc9f4130afd943297bab960a1060c9a7831ebc114348aa6a2c64fc8b084166c3481050f229575df4c91248e7d923eeeef2f91cc562a93c7b7c57a690f1257978f7d573d48c49731efc7d40677b4fb713ae5fb8e7ab427dd865cc0f7db689d30bd41038e32efb5a4b6e97c6f9dee619c1c5d59d3c0289105d34cd4bc708465ed3d2e4319d042d11a5a930a47970ab44eb4864a91751e5a73555fff3b50949ed5fbaa901502c568cdbdea38048ad283af0a81723013d02a7452fd851f5148873f0dbbffa0a254710323886633d108adb9f7d6e9e9de42dddba87b9a19b01425161e98bef7bf708b1aa5d3092d5a275a735f7bc0d5e80689f7754a4da2329592144d10cdc4fbba446532e9de365199e54194d1ec4ea37b1b456553bcd76654668029d2d8026926de6b43541684441b6db4d1c6f64465b3a9a88726f17e83a23229dea17c67f96e51f9be22e1d13ae57bc3152e918a49379d346cb691f471ed35ed823c142848ec2ea88139af3ef7201148d21a4d0b81a274d873cf8540b1078941a2ab61525459c135c4d207fda51814a5eca6553a4c069e592a450993e7a3ec20cb799b0e1f80ff0e1000d701d2bfc0fe4a099e51197dbd112a1ba23e1247cbf53f1267cbb5fe3dab3f048a720f44bffa0d7b54074008d4573da73f0057df01aaae83667e2f1e7a997bfa7b0e50e638c098bbc0d66940d66f80f81b888214858462ceba50ebf8167cf1ac8e8214572a1e212118642e24147321d657176a5d085ff5994e05b6ea65c0afea59f53160bd14634029ae82663e0dab76f4b8c0f3395641f008d1579920ae5957743325436aa9a495527aeb6663b1b67945bc5aab1cef102fd3dbeb239305cfd3cb4b5a2fe56ecbeeafbcb4c693524ae9ddc32c22babdae7aa96ddb400e80dbddb6dab2660a24a577b55a2fa7c9f4804bd918525dedbc4b65d3049f27254e97bb4a29bbeff0e34a66d6a9be2ee5a9a4f4a1c53a27680e5cbc9481535d50a1850b2e4cc4bee092c4162e5290e054964a5c7ec85c74e8a220358157592a71210282cbec8b28d7ad525efc451479741de1fabe58c24bf59325ef0b292cce07a4ee8b1f529787a8d4173a741b104ddc17422fede8e87a11e55928459b175d56951be14991e645153174841e926c8c7a51c48efe61ca0f493f2cb9bcd021071046401ce1f68268751f867c20ea1a99c78bbd18bad865b354eae2298f6f7941845d592ae140071cf0db481d95d1c58037313a1b6056153870c205d84322e505eea42c5181410da8d8906a42450555b096a5121517ba7062425e7c84521735e4d1f544376a74941f27974fdf6959d24eab5e8335d3964a6b50a9599b20a595725c777353a65414ca2bd5ec662fc6b69ed63ae303a601cf5b37293d1af094524a29c37afbe9d4bb5cf78694e691564aa9adcfb5d6ae817dc687d13571d45a6be5522a15185dcf255dc490fbcda48d8e66d9da786f9b7bc47edc30913b0bdc4088294de410c6101362bba0403a43890c8c705843ec2eb91fa4bb7b0b1f72ab7277134da379a446ee9b251b3a1c85c106d39530d2103ba828094a0f5044e9811a623fe5c6b99d76b00093292a3042c2c9062f6207d5200d1e9440e9800d1cba882d46eed6a206ef4d3af810c5831519bcd0fc80851a434051b9828630722771e143f67e10bd7b788aec65c9de5d4e32c8de75784e6464ef3cda4647f68eaf07cb35779f072b40eece7d3a5d771295612e5cc8a9d4539f4e6a0d9c74c484d434c529e9696ca82d88c8dc6f7706549278af7d3a176f5af2f6edd3d95a4e05d04287f6649dd435f372f123d353d615aa15c4c0cd1aba39ab20c50049c96c13727694c04892c7d86674f19cf526d73bc7d0ba5100d3c409243c2059f144ec2839405111529a413185d860e4ae022a372b37124b5b84c8f4953681a9c1c99518d8f08203120461461a4aac4c99811a5cae58830578ca1ce1161a32fdab8a1814bda7ebd3a9778ddccaa2874c8f035341840df3c614584c91e9693e1d7a040c1032b0a24b1221175aa06129092f70c8b20327f48b2ca0289199545cc146a69ff974a8964a5517033211559cb698810a26559a90684cd104154ddce0c48a135e3859cbfa7468e7fad6a75327154ce4662277154a72f320765741446e2b66c8320a2b8a106f9a6cc87d11bac94bee29ae3822e6d3692a96c820346d56958a1c323d6e6dd9b62c4519b98fc4ee296ec87d650a2d725f87142d2dc8ed446e2d5b1e90fbaa4fa76f5cae14907c09c3862c52927e089ae106424e515ee430c3155d5451a47152609714438890e9bf561652dca023f7bd4fa7bbbb9b60c88d6468a66e9528b464faeed3a13f440103f7e97414262e06d0178b1b88b4c9c44443a6dddd9d8f72f822c4931b9080426c29c595226ad0430d32203d11db29371633e46e23ea8a057874b95c734241460e33bd7d00163c209ab4c64aa6afae8e22f747e8ee9ef30050dc9029d2ccb20527777b32efc192c4d16659b064a99485288f770679be47964a598c32527ec90ff94fdbbcdae5244f3baaa3f2a447f25137b0990b52f268a36c54c3b4990d4305060a810ee2bd17e23d9686c97c94e76776c0af7a9999e4f92ebc9e2ac9a54c20c542971a76c1573f8acaac1ab266de85590c794ead05794689a48f4964e6fe7746088218820b0d74780206194c80020d27a26e3863c8081174d11aba34da28bad4b2e9d436520b96a69679940bfd42a12898b6914a4f1ce5791a55679546cd6bb3993434adcc6b444c143561e4449ebf471bd20b79fe4e11caf34946e4a92d51c9f31b17795e634a638b3cdf693cb6256d4bd4286929292929296989a929e9c9889c249e24a627a82612eaa1261aeaa11e12898a8c1aa95f78722fbf147a26de5008ad11ef6be6e4224a11c8fd16befa92e7862f8d48d48aa68daa536a52506daa4e16ca46d125288d482bd28ceeec0e4da33c6f519e9728cfa83ca34c54a6cd9a5cf8aea86b47794ea6dce4f4041565a31a36e7e91265a24df3d4c98999d0ac0911d8197dcda12443221822b9e4eaf49a444bb8e40625974c64a58849d17c4da33c9d342c89d13c1227928dca73de4669336d685e239a1749eb01307532ee01995e014136551ea22ecf3caa522065257162d2074580aca1c781a3d54ae531954755a633483895c79a25082a193008999e2788107a9f21a688daa54c0b5b4ad7f46d4825f7c7ce26c6ba24ceac4cb46609a9073cff636436445474341b29cf19f652334d49aa4db9977acaa56283952cda5092620662bf97a46c02500cf1021314616c9086d82b25788ac4e99613786c248953736391922792f4b12ac235bc48d5c9bea093f2b0be942efc10860abe80210d177020cac3a4ac75d4460c4e64b080e906a27c3763415674153233e0d359dbccf0251bd6f5aa24b867338953690c72bea92b290d2426ea836cc105b8c862e4064105a4ecfd1cb46cfa97a552fa6543123adbceb2b94692239927ca24539f3a39c25294fb748aad7487caa48869cd8d16b99ff3634beeab5c807f674344fda36d78240e1d923ee4f4581247e6f94b1f922571669e1464491faf9ebbb39ddb1e248e3d9ba79289ce9296989a9c9ea29ace9ace988c8eec9025a2336b648b28ad79f5dc10d31a4a3b2ddd045d797e3a3232997e3a58d26f86f5d36912e895d3daaa6a5967cdf366fbe9ccdba9699a2637d58882dcbdaa01cf1ab0bd905c2f418f0c3c726f3581c7b994fb4ba6ef2f6dd3a1a74a72efe96792055f24d0dc69e0bcb8aa5e80e5c7e352b960692e4da6d9349da096e8e4744df91b34e298ac913139c311c77293176a4ce1441a6820c9209998001185c60b4204418428a594cf913209060d92d8010ca81ef8206517e0b2a5ca10104862a022ca4b1eb28aecba1924dc3d59b83449f097e51213a7dcf51a12a6ade30d93d1b921e1cb2e168adc3c2341a02fe2ca32db109781e9653e6d307506fa1dfa980a536840b2c30cd4d06243900b84d881862c5d6428e308913e26c11f4041a27dab0a9ec752e067fa1d1bd2efd02c959c1023e3156028722cd358dbcc108bdde448d90d299aa680210a32806843a4df91b21c34b0c10b8c60228311358834db246077e129bfba7dbc1fb7edde99376bad4bd3b46c29ed2a572bc771a1a43533d770c5c9152679e6a52439b62494e77b7c2f9eee2848b13b90276db421763c997ec5d379517884ddc084f8d054ac47c36040444ab01584d9eb80e5f0d4f03aadef1d81ede5474fdee53a95799f30d02046115790969ea822cec7a40c8420a004a124c50ca82812e76fa44c2e19ada1061b4dac20b2429ccf91b2a0590f3c7419420a0e96e022d2cb98f621b16cabf540ed020145e9f1de8540ddbd10c86b01ca286b0f479eac9d089014fb44a8382496fbd2c05525094791aa9889811312366815698b1b7060b1a4c416332da27248b59a78a02b2a3036f242b3a4c3172f494b3298827463c498524334a8b45c464978a1c101115eb2dc1b63aca0294954159b521b2d885922460f94d848a2456dcdb6705d5983ca97a52b6d2475c1d127cd79441579ca88d388a23c8f48caf3469e474c99b2e9e2d1c33c4cce386189d34bd2c78a056fac50793698b6a9b5a134a7d96ce6c27ccff77ccff77ccf77923cdf5172de8659e43983d8df0f88164a0a8ef2294f2c7dc83e9249b5073ce2a4f95974d453665237cdf77c9daf73cea45ca186e8248f5142e53c65085e8f7a216d33baba651c14bd08f423c864123d0f7d4f102c995e85eaa2148b4c0f0b0dc3e08eb740d60f4e11fc00541d00e0ea20180505d60f4a91d24f87ab01d78fbb3a74a4340080475e5ffd03f048949ed7573fa2e3aaef2c794b9ef77d87a72788101586fc1431e27ddd776f67c98d17fe588aed2cb1c0dda6429e1d47418a3b4600a45fdc3f7890b803c467bd079f758e0b7b5aff20047abdf51d0f123bd92ceea35c4a1da86db8efb4ec05c5d3a325d70769d94bac4530e57a158654c9f53f3780cab34b7131a522a4ec607dc7e547c2ccaf13f03f780ffe07215094d47784403ac2d7f153614febac10e815beb8f065c313e855ffcc718032a70163eeba57f515c6adecda54c7abb7687856a0909f39c34f5143aa989d9b1f4bb1d55517632c9047884a3ed9a59e4ca96e09d1555abbb6ec43585cb160ff4408c915b1b8e2d135d50a0dc5c4d5916091f57a18154184b054acf0957abd9a8208f1f9991fcf0f95e9b891b952f21344c86c8868956368870ac7ec4610211a8072ef08b0fa200d33e1863b2b50c755e0eb3b3c0f44e1751cdf41bd0be62480e5009c5c396e4380f4112362c3572a63c02785262f82340511a282cf4f11a099d01051676d374210270dabef9ee05fd0079fc56239e1304890268ee3a8373f165ea99047c7ebf73b402121d7735c88e638de514f03752ed84302cb4a161b8e207dd4cf58c176ead0f1e2621fec7802dffc78e9008f44b1d6d32eeb39dec37a0e7ad6b9b0071f4708d4abbf40d57380ace300f12d4857efa15fdd863d7d950b8c390dd87ad74dd68d1184fccc8858315f3561a761b55a71e2bab5a4d176c0eab246ab197964ed2e2a5b85317a2ad3c01610f865b597c567b5583abe0a5fe1cb6aa2368966d134ea8f47e8751dafa9e33b9ed39d94a214b7b9ba96e31a8e6b33d73e98da27d28d6b337cb7dc0de4a179d3d0b60386beea1fbcae0275fc831cc7df91807bed72cae4ac1971b236411871be1f6595acb16ac024b8200b45a40f0d4cd676dc98c4e9ae1d01523663905c1776950ad62e6710ed1a681b56d62e44bb0a6d4393b5fb309943da4c0d4d2d0dd39e8a51d91cbada90f4a1596b77b070ffe2c29cde91e342aee3eff0ac94e0a339d4d73e8d2691c4b9594b9ada7f68a7a1a435a308597b3763055b5991aed1ae5de80b09aa5c44fad03e6305771e2598126626f23ae1f51d07a2e31fdc2e6998f6c18e277033e9a25e925f3c2f1d3cabcbdca3033cd257fd05aa7e849e859ae9574fa1afda62de3a06a5c89a01bfdf006558c717cb4c136ada31388d688df616389166927696b694b539d4304d88061aa65d6ca3ad6378e8248fced378c0af2b4367812051fb4a49cd3c4ce2a8f2fc450003f27ceafe3741bc4fe70d0b7934ec456aff346cfeb53b693e367f332fc2fc08f33bf326cc0769993497e6e591a4737a9ee705961df8e2f13cf9f13d92c74b528ff9d8fccde74760e5a9040698daf2c84b9e7df49f86cd53a17ba1d4b90ac87904c26e768280dab4a07cc3e6443a53ed54189dd3927ccb37943c32caf21d536d91834eca5f792cef9297b99317cbbbe4654ed32df788ddac94d0f0359fcaa1b2f64e0fe47b8a7e3bb098c4b979db6079e3366e75209d2aa5e2b6edb0d84d8e2a4c85373198f623f4de3b3cd2ffc217a7853dfd2f7c69ff4eef9dbe4ea0f7bedd03ad4b4a0c8481db369392c03255411d0761b446091e5df90647cb36756b3790fe1e48f791fb1615d8953a9575ff0ec4f3fe79e1f5de85afcdba5cf6b787d9c76c08a335f6733dc1f4fd794f0f03f77ef8da4e1f2486af2d044a5515e4f9e9bc7828d843f7f43df734048ab27d0b7bb87708d4e7ea5fdb055f9be6a461f6a0cb4239e2025b333ac9035359d3210ddb4e4123b4667b47bd4b65746edb7f244e97b76ffd6ddbb6abbca70ea4bbaa7b2a7c895d78a4c3570d5f27f4e98174b493a227718b0aece3fd50d9772f3ce2fdfb2afcc297b6852fcd25c54d7ea1115ab3f9346ca3e19128f547e8bb87862feddec39e54f8d2c2d7095ed813a335dbf6b297e20ff8b2a14fc3b61bcea886795ce06d86d04359d2f753a0e1eb1dbeb81452e1eb86affb1efaee3dfdd49bc8cc39e28ef5d9feb3ddc8f639db66085b967fddf004faee29d014faa93008add99ed3da7b46fb52d1491ee384b2522684e48a2ba1a11b7175245754b944154c54c9489910921b91f57fd20143576435606489307423b23ec6cccbb72e4b50e5f089cce46909d9e189e29278a84c35cbd90942655f8ee3d07276c2111ab64423b23017ada967812d2a45fa15d8a791d15aaa5cdfc999748b38ddfb93f3da412bd70f31729d9ee6d29c4b54d6a3479e3dac953e6a6bbbfc886cb9274b1f75058a5308c945391530aab29c0b1865133915e624755d97b363024f100da8e033e4c748974add7be7a5ba27fd09f234ac5e039f0c5db1af02873092d810163b89f5da421e4a5b48e8757ca11cffdeb9248e2a57d51b5c7dc60aa67974e5da7a10d65be1eb06a1f9ebb60e44f55678244a4f7ff523f4aa0359f55797e20b9c718131c701de7887820cfe77508a9f05b91b17129a1192b9d0f7d5411af0a5bd7529b2c09776d65fdaed0706f1a135f537402333e00cabc41820abb7c223df57b72010d509aab3c22347f055ddc782cedd72881a56bf611e21d557cfe9a595a8025f5a98d3b0fa314d2c0d9b4b136a15c475cc199486af13b67707a23d151ed17ea4fbf614f8e2e9ba6e7e5405900509cc1ca461f53a3d0d9b794e12660e32b796b39ffa055ff42f2bc5ae627a1aa31c28690d5887f8dcaa43b7c98c67ee01c6c01b5a73312c6b3ef43b3487caeab5c3248e96b5c7244ecbe85d7386a3a0a8d3ea09a679ccfb230c06d5690ec3f7189af0654ff32031267cd9f07582ea34ef519d26048a620f44ed67fbc6122c69cd0dadd134d8ea093e12c5fec877d58fc49ce6f3236ccbdf55eff9c2d7f6eff5aadbb027267c6de1eb842fecf94effd1d3bc072cb3bddb76abc4e1bc037d31f7c21ed58168ae0a65de81336fb9039be7bbcc3ddd81ea55ef4220faef777bdd102613b3355641966d4c49a96a44417ebd4e685df59ed655e18beb61fdc585af1354ffbed39c26045afd7b90d8dde69ccee9564196c0cca9735aeeb854f7e2511d0529aac22351b81fa9571dc8171ea1ff9ee7f73aa19ee63df534e1ab3bcda5d843ffeac2d70932a7391099d38447a2f4d03ce6475c97399098cf7c263c42f3984bf1822915e48e067c119999052212380b3ade5f3c2e170d0dcd53b022461aa63d25f398e7340df8ba9fb9145de0eb86af135cbf7120349f098fcc9ce637c223517a664ef32337eeba14636668646eb8a4b8e573610ffdf79c9e521aa681315aa37d05e6d01aed2c50a5b5404935d813785eed5c60ad6deeeb847ad57bea55e1ebf6d0e38669d79ed3dfccaa16604dd334ad9e5ef382b6c6b34ef2186fd7828247578b8af91d3f29a8be3a10fa3e90d5778447545fbdc323517a54e18bfbab67c757e16bbe9e86af1912a955d502ec53ff536fc4be3f9ec933443fd8f1285c71ccbcde47f55a5daf9f465496e3d5a761f5c7e382ca46a40499e79486d5fb6c148c828214853ef88e3728c50fae0277bcc12976f3c62928c5aed64fe7beb39e6cd6dcec2793b61927d4f46999008c9c5e5b767045882cad2b485872fd34aadfec849257909272fd8caa63e47adba325571254b9c7e68881e7e7bfeef223d2852f6e76de7d5a36674c3f45ea8db48c46ac9f332f62550a4328d74fa2b661e5aa04b524d7cfa26954bd0ee6d330290dab4fa9b28ff451ef7d8167183c3fbf8b8214e9bb1c9e1a787ec60aae99859a4758ae2cbcb890e783cbdc634f4121211ca7f9a94cc75fafef02b399382f654c4ccc97e4181c8363704c83c93138e6cda5632e65ccb71d660833c7c47c7e3a319b933c8faec5e018cbb6e21f2a9b57c81afb2eba64fba983a11f2a93a2b576e2707a4ce06b8fb26d22db92b99d61f26cbab132e17c7292f9d863a647bef151471e7bdc70dd99f0ca8433573894aded3627ad987731c7e0f823e3b3c071e6d6bb18b00499631ec38a8989692e99158ef8dd5ba0eaf22b01b740160b94190ff991555dcf1a2693c7d9d475e10cd3b0f9a53f9b5c3d78e4713675a8e33669210f4b83562d73d48939ec0a701f48fae001cb6c752a8f903522d35ebeb9af8c1c6fd6400b622c98479ddd5daebcb044afd4309429bd2e39428d44806400286b28963ea8093b0da3f7b2c054fc52c0a104b29252329d718509962b4cb6c4647985c918529cb5de80e2b9e2420c793e881028795e052dc4f9213f576649f2ac7952790770469ec73480c9f3039821a886f07764cdfc9db0f9bf806d05a548afe40087227e3889214aaca0143be941c1e3cc94c91039105b48e50068b2118593d88208453d4421da57106822115b904aa20da3d017be28125b0081073b30014d18c098892dc484bc48d142f0400d16448915ac33642176d7b320905c620a93d8027d41f47a01f39dbc33253d3274c06248ac60f784d8578ec2288529ca618ec8e3fdc24cc932954abd9c53a3b4ca0dabfe793db4a969ad69436453d6565fad382ee44e413955e04758ec2687b8076cdf43649377c7213205c823ce55acb5ce792927b8c27ccf8d6bee87bb2d35f743cf3935a94d4dd3b44ef2985632b78dd649ef6e57d334198c7b6c9b46697b6037d79f2b10d9f2762e73e10a7d993dfa49410dece7b40ed774e1e0504dd372a8d6c03c1a566f032cf3330dc7cb2a59e6f100b97edb56d83e3ff3768ec8466937bf1282f23c48af49fbe9c8a09cd3325339356d7ebea747b5f136ed6efb92a194daf4b2e018ae38f992e5952652b22ccb2b4dac64e9dd2f03585e69c20406a364e42956259cf892ebac761b5f93a452822c17a8b5456c9e3264b980eb298dcaf6b2046b4f3fed351b8e8066fb1534ce7e7e144835974c6f2fa5f4d141a37d9523a059fb0ab6b76fad813395bb73879ad5344da3737ba1936f7a29b7a694c6f2d4827ed4b677daa67d9327405e41db361ffca016802e0e57a110121fe2ea4331a22a07cd121ccbdd63b2fceaaaefa3bcdff7ddcf033f8ff579f73eaee4d3077a1eada9de559f552058d024053be0401442e243f43e14237e171a7280e87d050e3940540105f1ae0a8176bc1008a6ba812d2d791f6513ecc69b3306e4742efd064a4db368c020cb5b22fcc4aa07b29bf5e3b4d1be10628c32aaa4ef223e1e407995edf5cd5da8815a5c3a67b8827699bc82d4b49e94988aa2855af824f55186630b5f10f9859892a96b201010ac48a20d916b6d944a3ca0928bccdc210d9f1c694166211253e18cfb0894b570941f6fae32b99b5e0ae42ebf146416229193c953d3ea27c31b4f60fbad87a6cd7cbbb3a0946e60d5344dd3acdd346dd3346b632a50cd28c230ade41a594a29ab943879b452e650ad815f3f7be4517bb596ce6e420d30619cc240f59c4f5fc7dd86af1e0bb4dde20789ad0789320f126f3c48743d48ccf12051c783c41d0f12555eea5af8ead17eb50789ab0789ac0789310f126782441c0f125f9f19d8857fc03940d80d223c3ecfbbc01b1a30d605df0077c01c2f58060c320305b758a0102f78944e46c01fd50c8f124af5a9be99bb6f96ced36544e38589a2252639cba51e3867f3df0ee6ec82c749348d627cc0134b13cd10fa138bac999f144b130d31419858c626caf3b3562c4dd388a2ee32c148a519a66d286da22e1ae24b9e9f56b439c49432b5340ccbfc94420529cb00b48023a8b6aa8c8e4ba2d990ca81f2208fe645aa53648bcabc59ec5645d5c2761759fe330439fe4a29ff4e494aac458d2ef218eb86c05a165d111543e0fb444a055776c0dc1143589bf2027c913a26f81e8181391d524958c3c10658aba15b811a4960a086508a0aded64821e196970e882e3a1aae801205c50d578ea290901235250a6953b2ba5deaaa623fa25ce0ba0633258d3262d0204ac3497546511a5a3c338ed25842074769dca003f39446131a1d3ca571c377c6526b074869bc100386e8a251c6ccfc118bdd98f1d435f24e349c5478074e5d232f1a4d313968265cd1e051845f592a2191c50c4834d104e32c9590b8810e9000e20b123a2c412289d2116cd880c7e0fa48b9cf2327e16588ce3543a94c77c7b458dd98d215a573ce49291d29a5f4f3baee4eb9b8eebedb29ed0e77688d640ab5b6dd5d69add65a1b8e37b5d6bed7e59294524aefbd2e97ecee199998160bdf50f5c0a2ebcaba9cacf427a86f652b5334cfc6975acf93605056a5b80e36f1acf3f3543cfda3610d82b9c3ab4fe705ce90a78632f7c0be74afb556a390a3b55e905e7e1300405e815ed68a57305a23af593bd65a6bd5e8667b84492696d10d16e07929258cc32927dd35ad9a4c71138373a8e79339c3b77d684d9f0583a7eeedd4656c9be5ba6eea2f4178b8aee94b6a4bea4bc775b69bfa4baa9fda29d55fc22d9ca9706c399b4c2672ea2065abf72a9c50e6132853725f4e286ce0eefb3e1deedf557949495a2608fdae0226e54fb696eb52495a362b9b16abc5da242d4c4b5a54aa4fa7bbeab2a7201d41ef75a9ed88ca04a153db11950be58617e6ba1d51b9531ae9369515f66e6ab55ae126eaa2ee8136513bc9b9b9b969a225de9752714dd446ed6485532b6ff5e9d4afbe123aab7ed332a93b7c391a204b1e60aaad912174122730b0bfe5dd402f4a6686d156f0baf96daa1a456558d624f9ded746992437f70eab42f985dcbb2ee53981e17223e5754e60a09ec07021cb637d3adc595f099def79e8c8726e915798eb647389d6740873cb04a17f6180b96e2eb50d4bc2362c1098f1a6d1743299309135da3699726fdfa25add2de45aa9d4eca0be2600119de48157dfe557208ffe4221ee42486e1f0916bfd3c3be23c1223e7d4c888c4f0adf5b07e23de6405a970963bef075df0a5f1d1299f98ad44908bd0ffd0fbd11faf9f1ccaf67873cafe774279d66f442e87dbe534aeb94396d9de238bd717a215496e3f43e46e6d067116d210da33e2a348c3a49b1fd44845e889501bdc74cfc02a37ccf014a7107472ad191120979eda0453f8b363b7ba09f546682c4324d6080f471237d50220d7640faa01fe88159438fe518999e0bb9ee427c86d0ffd01ba107a29f4294453f89521d97e2c009a561f4a927ab4ff067758cff611a0aa135dbd63cde65eef9a4a8b1de5999c7a8ee02678e23e604d673ba57384029b2549fb99090cc53c328e8031aa135f431e00c388b680d950155a0a4f4520c9a096918859a1e17b49b080771dd7aa15633b8c8f3b56d5a52e079c1807165d20f529e2fd2365d9e3742a5c666b3991045a386d4649af50c2332d794b927e55a9df2e56edeb60d0c192e2eb936205b3041644b8468ad3543074f40aeef8aa1c2647a191d4891e9757c073f647a1e30336699be87194db208505072f774cadcbc2bc872bf1eb0e4fa7a57ae17e3fb5d21e6cc8110b9be7ebb5228cd6530c9d507b1d63296c85f72bde6aa41ad5f6e90ebeb97a75c9910c91022572fb9de3e0857186be07a0fcbe8380f588fa714e4fa1f6d3391e4fa1b1172463081a70b0db9be6709b15e034290c8f52ad40f1183895ceb8d885145ae076a9b1eb98b965c77e4da6528574a3443ae9f4bea27932e3ac8f5d3491d63895c65164846b97e4aa94a5ec6c8b52661d1039117626c44eed38beb5d75865c5740346f5723281d401836e4beb803a2ab7dda3fa2e3744948101f9b77583c29acae3a90d6f181acae3a5e85afd4d20e4f10213c423bce9ae0737ac947c80e8fc49199f51b35db96827cf0d7f350590b00aeca6342c3241358fd4ea422a8c4acb5b54d2b95423403000000002315002020100e0644229150301829c39c0714000d88ac4268489689d324ca611032c818428c31801860008cc00c0d890527292b65ec521cf6b934663f4fd2dd48d12f4ae93a8a0682d2aa2b67226228ad1316450b96d23a402948b6afa1e8ca34fea97ef3576ec1019b259e33925503ad3690f2c7f9ddacd0edf7ae8d91a750b523e94b92d19d4b595fa6114eadaa402ae06a2e077cb83da1f27c400a755a5c474239c35859d7df9462044823e998f0b789838d5dd8e648741c45e5a4e8a64323deb70f416cb19e54a34fc8c62b677042763a33c9622267c4f5f4b38cdc6c93a789cad2797661bdbc66ab206f8b6b784cbf62ba97f022859bd422616d72c9c5dea44e73f8546286cde934973cebf56f6311db98602dc0d442572f14b8f3c84a92e9dfde5bb0e93f4258d7ed964b1f5a733b9fc926a64da7a37c10ca433a9ecbe436d3bbda91e2e4618ae467e5e8a7d203f8b002e246325260a698f9d04b2416425ab93099ebb32c6e284f7dfe32bad348732741d3ec4becadd6a2331b69ce2ba321c09b162b0363842ec1df0ed2cb63adb88dd346354866456a03335d7f7ee11f303047a8664f20b33772a3a8637f1127e0d726819f3f4d5f38cc0e8c76a6394bda18bfedbed92cc109e27362a940a3aed98b65e9408f4769156b707eb8640bad228a764d4ca51575cc91f5f1460e878826fb8561dd246d9f9357845590ca6b3881976c47da10eca75320c5f624cc3471cf0e63ea6e6ac37456b86d51654e296c90ee648577d6800ec67d5af42f5bcac4568ca6cabd05c9bba758f11184c688501370b415f014718d9f6628d1daa39b203a1d03479162019d8002a1fc66aa015f83173ab1cf31d009939c055a2f500a1c1ffdf82f0b53818436e0e7e648fe8774a67311111374a77fa61551bdfd7ffe824060ebc0abefb8458aa2e94304dd94aa63d1264314682cf7ea77645d20fd8d9be9e4ef99f7ef494849b0fe31a65b852bd0ec4c09816c950c9d7812f0f5d469476e1e28a9513c759c5289622ab2cafc5f2abde2b3ab32962bf9ac58349e28e64e369fbc1b1afce528311998edf1986f8af5ccc43e3012e2d94a3f5d63df8d3191ec65b706347a8e009e57fa5833ad5c5e5c961325b1513660e564f38b232400b1f6157006cec242accc167aab6aa1830c03a56a3ab6feb0107c80fb7df610c9fa1b8c5861efc15865c7d60e909ae26cab03950edc73d5a7987cfa3ec662d815b6fe211cfc59fe760b0bfdc9034c7ae68980e83a47f54b8c14b0412122e5883d0137ccf1838d60b05e751a6d3100343a2aadaaa68411293f28b02812f4ba6e7fc1e4a491d20732b3a45416171debbbccd27f1819a0ef0fe2bde93b1f20d315b786991004b3600561a14c00c69a751bf37ae111529d1930d7a0581203c5df34cdc8bf691d511f45b19e138e61d2ed9ae52cafef7bf9aa6449d8bf9db651ed58d7cb314a2fe1bf11a449c0c7fbd54607aa922240b0e7593568022b9fdcd8d32abedfc59f05643763d0885b9d6eb5fdfbe567eef757f03327b960ad296e6f403d7add591a9497f6769d7980904a5ad660454a9834254d2a6578440afc77fbc00780153024f36918030ed856ecaefc19fd00677565097d723308bc43f772562851d77a8c839c652f7f8a624109598b1ec56ecce365e15384137735fce419438cb3eb57ae2bf19904d54bf9e8550e5ded24283963933b8632d179c5330dcf5e393da8ba0e2998225b19b37c8f5c78fd86801b1f74a218b3db81a004997f2aeeb55700034ff53883d170145dc0932fab5790e4da722e2a9358a2a7e2f8201d8fdd60dcb5f39f96eb9f165e566f52faa9f37aecd9c773eb09df9ad6b0bc7d64ebe37b3fe1255e8a97495d34d4563263628f6b82a79ce4239bcce00c282eb34699fe0a6a155a8d5bc1ba870efaba7b01f567c0f7ac3cd83ef3d538276155f22227bf9d225ecaa7ad651a7b800123861dabf32d5a1e262c5c06df2517db1ee703f13fb9b0170dde2483c437f387c98185c21f72222f77ae4a143a2e9965fb8ca55a0758ce23e3b7b4f99cdc63329d4192fd9758919fb02e2b3b16b01e1f8042947c4ce1e723504b00a5b511fcd49b6dc45ff9c930dad4c8d65857d2eaf85e090da97c3b0d2bd88017830c127b18928afea982ce6036f397a3c4317369b743192c7f5af208ac2a0311ef7ad2286a66ed67f1c840927ebec5fbd5a35882cdb8be33a793845a87143669ed15c758e85d34b2c288057ca062ed8773c6504aac90b44f27bfc817358f1c3b29d2b72db5c84bde0599226c846bf66c044e13c0b075203b59309f78ac5c2fb7b1dd571f20fd3fc3b0ab96611ab443d7d2565c051ef49e57fd0ed2090f211a31e473eb7ee827cccf48e13f74ce3110670b7a02e9ec008b259505b91bb533635b042de7ebe2abb87522b420f005b0c2a42303f9575e90dd938d7200751afe3abf54798b9c86d1f325f38e26d6f9e5892373e26234c17ac7b882adf57269c6922c1ef47d95900b34948cedad3062a8bffe2d0862f2a1f0ca3574baba4f2f1a9ad653ac983b14ff037b859b1cb115262c2068a6139187546fbc48afde5ad218724238e3527b14a39a790da807c6aed1ae1232de710270924cbd1b2fccec103ada0ceac0debc81910f94aaf81392cc9b715faaad47d251a03d7aad93e3f1686d480a3c77c4b1b08966b746dbd65f344fd7efca4957b0279d2d25fb9f637521c94b21696acacb56ad287c85e08d29c7ecee5833251d5ece1582b3d154028baa2d42ba8da01006572ccf1722db55781649b56561c21eab8e9747a7f002479d181a901a76f46b3f8156c6ae2544e8899c8939863769ce072e8bf715ac3dabfa036a95457fb55066c664306b54e85d512090d4284e05d663efd6a77a50b8978e6667f33b01718e86569c6f9b6d821025f844a5af1154424c43c58b97fe85104b074a5fc03ab13e27ba60250f82524522daf244f49c746abaecba8a7292dcbd599f2be19616f5a49d2c8232c26b3490081077d676e18a5953f54599523c8b1ddcbdd3c1bff571ce1ebc54edfb5c6f578f9fb44469d7db416998b192fb9f0c346e56719f30599a4d89452facedc2e981507c63205df96f0bcc3d995a6db3aeab6af2a13f1547e716d3962ca90cde0653efc3184409247906dd6e4a069fba0b58c18cfa4a0b096619c0f06e45e8e4a516a8238d1b4cfd291bb5d3335baa6037f25ff391bdc1cd83706439923d5805e1d6d55031813c9e90772b886db63302d4b341ae6089d904825213f8f9106978a8e01a58eb1de3a2712aa6b20114b1649bbddde7208d9b9d1c3beb377ebede5759623f1bbd989a53814fde1ce86c76f2a231a702cf4611960a87527e10147eafa5995d96b5f47814663536607c792219099e29f69cade19235dac3899140a1ca841253fe76c3e62e42cc57af156d4e8c32095c2de3d5e4ad150f5c844b87c96d752e92fa506c726b0490105edc25526d99699de6152875d06238ec45b85af5b809d2d9b7177afc97cbdd7820aac36d4719bae1403bc724e4a590d2ae15501242479c492c086946003805f406a6ba4670e0dbd05cbc62ad7b5a125ff5bfc234eed564364d53a2382645716d2c299521324579e3262717b12f8ad368ba0f7746cf5c958794e1d255a35853a07269036780e9d6ba3be8ab96ddc27f5b2ddf42d9e14a7baac9b844aa3d9f5f41f3ede667fa1871d2cc2a4251931c8d262db2aeedbdb90be8e9c69b459099f4a2b487acf4d99f2db0210021ab0a4d8b7dc45c8be87d7af49ee7fde853a2c5f27a0554b98fe4a47c8baa024b5d6fb54ae98bfbced9ba74ce683537a22b1c17cdf186fb85e5a60e853317d00b3c9e00c373d506efe0d79812cbf0a3b51ed6d093020dab78a907a91270065a1d82201fa79b42437f90b0f99e3c9467c55b5d9015830728c3fbf4ddce19b0d0a999e9d8e27a43c756ac5e940f622439367e98b521a0cb8e08aa931e86af02ffd9209cbf4b1d8f68e58150ae44319f7d9a259c7088a8387980677e21b07f1d8413fce5ebf2e4841dab94e775f8085a062e8c3ad5a72fea36cbb32ecfba849d19edd4cad461b1d6588103657816fd2127ca5977f88c036860e0f6abaa4e6a616ac924eb5ab1907f7002968600a8f2cf71a602518b2e1332fbfc60de8d2502a8dfa24c9d49d6be13a02c8ca7196d32ef8802890593fe3cd3a35b26cfa92d935cd0e91f296a7ebe27c8816b520e4f6d57df6a7f4f98a93539b5906fafdec7cc9ae87c4e40654db497b3b965d2991557b44d3ad3c19afcaf26d4667ab832985c64d21d21eab516aedd0f5499780ae3ca2476fbb837ab7e24a549967632ec1a2bd38af85799e0cf2ad30ee7050b730af1b8ec951ab1be621628fff2aad142e4eafb3ff7a30cc06e7ef3fabac8bb7320f29440144e7063407831e47baa14dfab355b490e867aafacb6e23bb5b0b5de95aa2d44cf30083b6e4b586f92e4b5c7cb24e9b87a382724757ef2bfb0237902fccfc3815602a06f359615692e93b4e21f41e3d60e09aed1b35616e4eb7bb87c408f4d92ff110089f2ef03123a990abe321b33e88f583d73af7e2a2c9689faa5ca0d7737457402cc210d084596f28aa0dc42dc25d9e5c3bacb263bf77865472f9671f4c0f1f2ab21f511afc9088b8457a6ad75b793ad07d387d85039c8e82f08a06a733973ef94f94e9fbac06823211a11835632c7de04523af78b67d1707140296d681548c9014d14e04a195a03d0f96606344a87ac0cf07286130fd8d2422b18afd680a224b23248c80535b1636ff9a74536ff1720421c1dabb5675b907d9e38d1d8a1bd5cb3458f7fbd7bd5d2fc0cd06f9b52d41eabb720275b2fa791e07283d0a04f8ad630eec0135ab8a2a5fb48394eeac3527476717b41f81c5d388ec81bb9bd72151ecdcbe040becc8cf082586d1d33e40bdc1de55ba342004475e7f11f5f4d38dd5721e7b0dd0ad6b1128098f19767482161f76aff5f28f9cec101e6e2eda91e4b55b1dbfa7df03a99e3f8d4861bd2f07784dcfbdbfeddfee39e9018a6c7ce1e2a228e37d901f23aaa13396ed66115386b2752b050c310b0a512a8555f4f076e146a5271daa53808fda15defdf8d3fee9126408f5f36af20b5bcea910ac339afc976f60f753d3f3e9dd89a3add008e0b81a52332548ab1bd0941dba2d475ed759e80a10798f7b97e67984331feabd7345c94efdb4842aca39a218131e00fe3dff408fcc05d0a79dec0e61f7491147b827a0eeedd93873c8d0d20a000448a72a4c51e601b25b76b18fc311607f09389bd28712d97e233c32ede8d6acb0e5543a3a636a20b84c91d38763860dbf002f67cb930d4a695a8e72da0130d085c31134da4b31d1a2d9c83219e8314770038f0d6e23ee888e0deb3f0d63eeb38d117a2e37ea43c95a283fec5811e807824c0cffdd78bb358dc4bb42966c98859c7f2633d40c734f010a8a6eeb6648031bc40d92b2f6e18e61c507b53e7bab02431b74e36aa3e8803f6bd6834e23c659f6eab9ac5974c9d22cd11ed264263ed437d6533f89d006884c21b432c61d6e5df5c158c2d69af8b3372b7365b8e9f4d8b0f7882d28aae9025cd80649ac56a910d58dd500a01b82632fc8a148c867c51955f5db7b6333f6554c33cdf0ad7ae2b64645dd132642a0a072ac51340a73f08212e302b20cf867c8f3443f6c31f1b079c3f290a78152e7fb2f18ff12bacbb924d01db6dfcee7c068fb558d4ba2168b4a12dc184c50bbd64669bf8082b4052e6d648505262eb5f5e55be3217e933fefae57211ec7c2e1b355d59aa60e5919593b8c3acd2882dd4539e124ce1453b6106375d09baeba84db07f95482ced9908521b2764b37193e3c0684f2c9062b29a7143a37a1ec38ee6c056f1919ae69658746b2c222b48e1c6509176adb32f39bd86d67b301531a49eb9d2c687b6361d742b33f318459ecb69cc4362d35c06e8f62608de9c8e757756f07adb7b45852a14ad6691ba51f6d0f1f1fb2c5374925c965603c0770254321e72864762265692dc2ecb25dc392b74aced623534b5fe62fd0eaa99c2e60d357606c32ebc78b4e5ba075f205c37c1fc7f709bc6bc42bf20481a809a6d448e001075fbb763d9e4e93a5c4f511961e414d9a0bd26e9aad9a690ae50f8bed385c9c1711e2402d63c0f5a8373e53d756e63ebcc57df8685c233507c22fe144c4fd629c6ecfd5c551978ea388e52fe158c17cfb774f07941d1d55a68724df9c4efd1b856055f31c1063f2e83aca45f4b8a9703277777435d408bc0a5295c822aa8c73d508f66a5b99436031c5b4df80d16c11ae016c3965176a41ce1e360fa1111fa324503234f82d473e3a9e08ffc736924e0ac79a21e0358f9152164ea13d538e4f7f09476a51ea8862c8cc7b1ac3af24f4fc5361a69928ea008348da413d2fa1da4603b5091f8b3cfb92432206e6b703aff931af9fe7a1566744a5315d979402b396a24c8feca5cf78b6049a6bd489a9ca2a3e70ecf171318d310ea908e1ad39d03ebc354b1ec9813f370d82aa95e9a89881e111a5fc910a98a357d2ad1ad8d84eeb5ad69eae317c6c6c323809edaa980c348d1480e68f8528a0b9078a711b6d136229190a9fbd4ed723bdd165fd3a1c37194fa7463657dbdbed51e9adc255d54b451e389dd62ca82f3a861f344c58eeb70cdaa2062f86df2684ea4eb154f99ab15c6a160d674779c4d256d779f7f2e25091a97a4ec69737a974a2343de6bc21ca71deb8a19717143969a04b5f09ad0cc892a4c001c0b6b721045998f9dccb08f78dd34a013b5aacb8462f61f231b46d0b0484ab990d779bf2103610e3381ed13a136847045ce0c07ce4ad3911704aff8e5fbdf5d19ea9a378c6c969413b55874678d584f979322f8cd45d4aa2d5691c707557a481869807d22adeb59d27f6b0cc2e16cdc4f4444ce039917f530a42a4cd55813221825228ec64087247821a6eaf0cc986d1dd62c891be0ff67ed68814c1569e878524b481a72323a31d6504a165210eb2f74931c80017da3d3f627c130e102d07c58518d108484b7eaee3c0611ee38aac4ebb2f5fe16cccbac2dfa7a94e56dabf278f324265b0811bf8e3e490871dfe806e1032ee2308e3f641d57a447ceb13b04b725acc8053a0831bea204ef578278e028c152a5c9ea18c5b476a8db395d10220a53634dc155cb4daa251e160e8fc53ae0f60d158460cb022320c8a7d9b063caec6996d8eca883445890c3d7fe91f115891da249e64f3c6e137c1197e4f21754b8a3921c08254db38b9ead1ea63d5278e1bee2249eb1c22bde19f9971fcbd9fc06c88f654b8481203cb7249734e927e848a890b61da85bdd2cc1771ce06a6e1b5867866edc8534b0b69d48fa7ab8a48dc9b3e7b83eef3e9c74fc1549624f8d0b377a5fa3fe637bc71ff76065c5b2ca176465924b198842117bb5f4c7be33c5f1a25b45ce02fc8e45ac82222a0dfb5760fed2a72dc99921a2da227d6992a9d695044136147dc34b42ff63e66ae0ba286d96d4a3fa2bf1478cb2495c28cb567f07ed345d0fa906dac50e962eb60ea85dfd1903e985b09b1266d093258295bd809a209c25fab1c1570a285b534b51d8130d3cb796f612b73551a6625c586b7bda2c46eb5b28b516eb6f7d779a677d1850551fe73c0601a5f0feb0cebf8ffe1635adb1bdf64c892ffc875f98700db20966a988477166270d27790d7eb19356305d544f3afd3e954d8bd0ae58490bff818c0f73d36a1bc2307aa5cbf2247874bdea97272b36c20e8b24d7ad4b1b20c8eedb2b58e30bbe640e1a57c86f2bc66132da010a4ca3838f7527042d51c88a733c8954d0849c07112141cf41de92c739de1170ff231eca2437d60e51e78eab3d790f3e698cfd88c5d5fd64ec8a197f0c7e6f6cb35ddcc935bf07442aecf1452f26fc6c4b29e4680546e3554bdae096e18dba63dcc870655e0b083229e34eeaff7a14aba3707476b1f1e8c6f48a02a3ee7bf341693c5155e039bf652ba5cc134ee9f51598b507de57702e238bdc01585429712c64090333042375e999ce45c97293664f5125cbf4e82dd3037d11f4c52046fec67f993292780ee214758613eb5fb48fa9404d00a68b2816734ff9094c0e7a4ca8dc0b888c80ee66fb6105abbdf54cdb65dd87b5ac7a58c3dfd577372800ae9cb8b7bdec1890ebbb7c23c825612f9e1cc19f601fec4fca259de225e493acae5121ef824fc9929c32f900e4f459a849e18ebd11cfd8f97f26305d6eecec3ed458c9fbd56b0c7d3c3ede5e2a8f87f740eea52d832df0aeeb2a82513adf9405dbbdebc72cea486b00574955d85b88d8f0b22982931e3ff8884cf842a4b057a70d24216babb7075e663ca79bb564e9b85d09456400a89914c408a33e967cdc470ef5e8196118dfb755ccea50979eca885e2b78c40a3a49fbf70618b20991185fac8a11da9c9d577e3f4f21e7780a02effe921c1506aad83246c3e8e3babd436e6ac68c593227c6c6e034065564c206292c2bdfa7e981000856fd787d8dec716bf4620bc2053ce764c99173934edd06b6bc7e04aa705363e6678f9ce17c4018948f9a07c8e7e2cc868a1132eb31f7070090f6871af53bd9182b4fd3a6d81dd57e9df7321a03e2589ac814d50ae5048042d5dba20c705ae3e3f29c59b540e60b1bcab957a3107dc76b986e9ac06820518c39feed653d80c7e19d0203463e084ae22714ce3a449a3a898616373e306b50f1138df6b144b580ed0652579511e7d7aa8d61165eadbaa1b1186d2c8e5fb0572b9f20b3c0c158bc14942bae8ae724f4241569f731a1abe5fe8e6aae7604ba235d1b3974bd736604e9a4375d7179773a1f57abe31ab6618071758d175bc5a2b3b55994b6b50a667c529ceca25b8c4bc725ad3330a72ef12f338505a6c48d1accd67da7632efa803f64cc2e3acb106e60b01ca53223f1e621fbf6aca577b480e618246aeb344f2db4707d22588457c36b69e22f254bcc1cd00cf656969b95cfc84a97923bb5cad6d8c652a4a679f27b25673c7529bcc1fef2675599d5784c07eeecf7bf71b2cfa1e1308e5bfc311157bd8b5dd6e4f64c43877c0b63ef139a0d84866a4161151f84775dcb71b854a66652cdff4d20d59768e87c4d5bdb43e2442c4e24c6a9dae0d40941e95fdf4ae84c89975599ce906d141564381bab13468d3480e8f22d950335ba5a1abb5830697d5062b62c7022f4d696fed006fe0d4fb781bced4ec9d577ecfab2e3d1cd601f3eb81f9e1f632b4d13b3965df717a4bc027d9954aea12c399cf2d52ae5215813ca8e222ad62f36fb65f5602acac51051d1be26bf6ff558cf5e15b255efeb07539ec6cc6c63efa8fe61619abc0c1209baa07984ab00b726c5b176790b5b308abfc79328c02d446d1fb412309708b438214e1fede06ed2e56ee537827a81e8fe79bb613b714e78f636677ae9e0f3d89f07e2069158ba80eb20462d30dcf61d16fdece07fe9921d1df3a3fbcc78c50fc273ef86174f4c2881750416d854de9e9d97940bb25b2a5800ceb9b20f89f19ab215f2c30f3b252786c616d182d83406ade694419e6119fe7224f67438e8be62c7dc3369ba2a561fbd9612d441014e7ac0fee9be1c27ef7b168300c67bff41177574881e84d2887dbd174f62eb524ccf0a1219a5e715e7b8fed1fdfe5494eec7facdd6ea4665e2512a208149e519f7480c68826ee8737e6f7ec1df85d47bb75f3b5d526a639cc03b95caa8e5e0abc396fde662b0670ff03b56b422094dfdf308d3bbdf84ff9bacd5ea55ac6bd122f29bba3a0e8fb5229ffd31903134f7194b76c2378589fdf47354b7bb845c11dcb7b1eaf80248bfa511174792986c2a1335bf1b40ca03517ca22f54346c89cb8a98044f763cf91f235387692a169f4bf2cffdf01254bca329a25af9707d58df69f6300928d4ebb9b9314253ea78a1a1492b239619bd3277ccac89c54125a4e333235763300ce60bf8d38adab59e773107a6cba53bf4839e3b9beafd5b3ccf677713937c1313f1f1bdfee20f47ad35eb081a10ad12fe153bfd7959dceb182b096260986134825e33ee9f728c22d1ef55166740afeabe6f81f9d4fec68195aceac054f0296f4101698f8349e0d0d0672e4ef537aa535a04341788c3d32b400a33a4c0815b3136e39e55039fb777f80cadaf9e25084ea4907a84fa4148bf4557e75f491d3d2286a27848e3c777c7a7d35b8fa01bce1d87eb87803161ef8e8b4f643cfe79e7d774fb67af7d79c2b1f41595b4cd554b98d92d0c8cdd48fceb0657827563aebb337280ba9fc9372c2c75c052986efcf2b783c765ec4e45a105faf7809abd6d52d8c76a31d79feeb23eb959437cd735414f1aa34c2b6857e6c63c07b0a547aa1d2bf8df0529f56f08a822bcec818d19b71075b2684ef1cccf4b43290f2f6a144a266929a39d632c9b9b0fcb2a35403712262043a2857718cd5ed41cce49d9c11da0482d1b7a3e0fabd5f2b42947d6914f8008dcf2073019303bc4995223ba1e3f663f4e09d660e247d7dadd3c3b6a65a71d5e8fc409cb6094d485a435cc8bd9278b2780dda78f7ce3ef719b6e0102412fae0c47faf37b25ac6cbfdfcbc8262b20081bfc4ae8d167f30bec8d38145836ee7056be011c6d100ecc8843b9a0e76dfc25c81bfa9a1ee815f0bb9157f90c66dff7e4479c2540cf57aab6710ce194811cfe159c64e0eefdaa43b5e552c6356b63f09b48ac0aa1509e8f959b1653c6f11cd5c9d6a68f118e48a907a654bb8cd7e2ff090e58f769ffaa0c7cbe560d68796b2eb67131ae63cc90e97ac531c3d080da93f8a0d87722dbb6e0fa3a8e70c8c596616b615e5bcfc8be5b9eae5c5b6ea7675e1f22a53838b797e43509b374ed0c58420d65d5a338f05d3cc5b848d642108e22d86dd285b3a04ea2d38165910d99386a220e965886231ca587800ea65b2b84c2af1942ecb88c4a63a21474df38916ef04962e152749c76e9d23ab8061b0417e8ce453165163b4fb71fa140e606d8042ab30930767c50cd2245a08e515c782476fbcd1daf92fef247afa900a5612ed16cb151f1080c6fcc82861dc21ca96e1dc4aff9a63e65006156513199f5c6f3c3821fe3d6b223943701d86fa0a85e501af09cca201b9b1b63f1d659c75582d4a2b91cf88d6fd5ee1bc7eacfca992a3922c272eb6c71f0fb31a707d9ac5122b3d67527707f8348e772f028cd0ee90b460f092b769b468794a57af42217c2ab6f68c30107793ca589541ad8f07c3f853dfe81d4081984c10e43ebf7dc71fc83d21022aedadfc7116e0d7f60d413305a7b332e1aa0633ccc9dec1655a1f24022b56aa9ef4bb81bba7752edd57718cf448e8ed242a4a53b1165c5b713f37c8a6ba916e30ab2f47941a80c01643bfa88078014ea37c8d8147e0cd5d07d3f691a8ac90fea8ad448dd61acfe6ea466301e8024a02687fb77c7ddbf131ebb628a6a562c16407082e3aafb54082250520d464a53bff2290825c320809a206a0c835153aca67f3aa1a6ba4cdceb2208db21672d130d2a9fe09b255ad1edace30e627487ad4b5951061230490ea9f38f48f3a71917cf2a2dff45eda3a25d051c43def9f397814e999c9043d9239cc5f8f30f059dd998a5d1ed7562392316b77f2431a2ddeee9e91c246d83a744bf42ae9de3832771e605e4b7233f3d5d4092da7b7de8f3e7dd9f9742b5c1e3cec24531b1992679f20eb4a7d17971aa6d873ebb4e39985ece9cbeb0a03428a892c7f4e509d0e7088db6cb6beb605937400fe965c660a6e04234be36f43940a8bfc25c368d07f1d3c674a8ed71e1b123e3b82a22c6d646636a2f6e533e6819c6f622e400d11eb10cb48d313113b4cd8a32f7c0c3896267e47522b6a4143c0b6ecb0eea5c27a6fc4b51c0f0d3821b2f3d3f9290a46f93dfccc47b6eff994752032462962677c845831ff1364ed30ada79d320621d61c189cc1926b87294c709ef039ee1375c7d6bd5951f0178bcc93ff4db2739b778417e85344baf913e531af8d3a5e0a393e6a338ff5869c9c11df4ff2f1c70d4af3f72264e4ffae5141deb049ed38a5ac9776b83ed26e3d8ba23f2de1a5850f8db837c4e78c1bfe8c038cafac40d69737deb3cac0a63921fafe0c70504bb3f0c9f9d57dc120ff678440faa2f79f3e17c4e0b03b45d52eea383d8829fba8f1ca03dd87ba34b15f14bd9b284dc1ef2b61a5d98abcb35f90ca4c0e86a7747edd65c04a900602617633e67e81d1cd143d7f218bd973424a11329abbcf890c278d1a3b6a821922b404df65f6ab90e0dcc4ef7e73332e99b471149e15a151f4755928e437103508676014516939d478231d44d88bf53a2eda35e418b040f4deed732a021b811fac61824ec9c0017dc64d4e5da1e8a850525a4af0eccf63af3476e68983b50d552a4a4cf01141e1e89f7a73e39da421e9ec1a79fa4f86d385c0bb3c86df66ac7ef7a9d1e3165409d9026a049ef0523bfc78942253123fdb7f4d847de3b8073fec14298d5dbbc6b404720941bb136a885702b034a5c7c408937ac3d65ef0c0d0fcd50aa63017cdfd7f1a044568c760ce035dc3332b31715203fd506d9a8dbbcce01ea1a1586fcaa1ad6b136dba390a28fc2c6ca05b5bef61394eea2d0062832361de592b62d7a1c0315daa64e7d91245e011696d9558ea19316b6cd064453f9cd02e635b7578076452c8200b51532e1182a890bac3d06918ab215855ae54152087cab008794af9d4d14a5759f4d04b0b602d4c21fa82137785f21264888e274b9c7ff38109dd3db082ce22fc1d7c2fd8b29bd51ef136541f20358fc52a5fb1df2177be1dee63ff4b3d1a2d1e05e2f8c127d515e49c60b580aa547f49d07638c8f167927efb5d2dc50cd7d88e1758c131719a20d5121539a95b3d802b801e41e6ed1888bd8c9d11e78570d7d299714f2d1f623e2370ef92e899e5b0f89b184114686e64201ecb085c4d028530b19b5346482c079111719fa0a006aad7dad8c8e27c46004df7f3c428f63f09f447fc64cee065d36b54c2226bdd847e0dae09a376a9af21bceb9b1bcad1909f56226712da141ebe281097599bd13a2faa79142c68838991572f58b89de59887525b542bc3f15f27d5e9c76e0d148cf5628f16192a22a344575bcd56fe1de759ef13183909d41a0afff105a279e785d228c47593cd24a66c305a6f994a47574ce4a7f545be88bb9919fd6555b5afa48e0689f57b90f36df2705f891217e76911f36cd8f91128720fa09a4dab09f890674ef3a8b018bc1e0658ba63186577c2c49c07531b7e651425255e20eb3c46c11fa69a77672ef8b3c871ce720db8190a6fefe2dbbb1df3c71aeb2ac31f1cc52cfbfa4169fc4c10cbf9b0962e56b99ab7a2f5434e6c4d3a450d6552cb1bf96b0679ba1e24c2af0d376cc7a77de2b042f0f4ad34881153c57133273672b9029f8b33db8c707a51a15d3af268aa01469cce7242c1631c6868b7e2d050b80700ab6ac867a51570d14f155c3c302bdb4a3570ccc462715fab834e0c3e86a429534e81ef191aa0bd1cd497bb5fc9552d1d67133a3507427e4227542a1a595f0aa743cd0718c4d236132d584605a14d2834e81058c45d1360fb6a2d2f1e4296b99c3e8d0598a6060d7b17c12343196be98d6baee1bcf72307320eac660294da44c93e8eb58df685d1f2f4bbe5162c43d2e807937336d91a7266aaa6417dd17abf620a3b971a849ed0f9e4acde21a10408ae5d57164a1c8eb5c97107685ac5558738607486cd728291ae7fd3b3aff910b76cca51d399a2c1367ca8df2c4b0640bf258be333d77ce90c633c855c91bd92fc2968bba238e3d6f36499e5ac17dd5c146dbf26960507bd2e46352089e3cd128a96d28dfd27aca3387560ed36ff51a4e134d613e50fd20bb302801d9b625862e219cd59beb693578f0f5df1999403827e90a5d2a6df549f873b0f2072010a1ad18bc2c59d3cd9282d85f622f353de9724860842d91b8469f8475a76fd2357eeb58a933a7903f7b794cbabdadde7149ab0008833ba52280091a605207cd8f700b18841d689584f9d909545138094170da12c4f3a1165cb123f7eea75ee43e97e202c62540363da0cbaaaed994f83f07e50a79772c9e53f5e9173567d78b69fb69f63c1d4811f04a9850f08c42830e114f98246150137616ea07eb6d1d5c3366579e6f5f061bdca9f7d0dc8deda3acfb893566e009232c7da856e86249f7213bb163e3073360bdbf1c407fd02d9067db049f1a76c90da60acb0d46471a0244edf0831f2dbc5cec62ac2904d3ae17249c9d5f5ce21a26b87e6f120d8c7728aeffa7668f9be830c33170571ccd4671ccff04ef216f4f7cccbcc123121c1e0f777e5063f8bbf137dd5e038045772a5e851d945aebe73a81a6c454f6f396c65ca66b84ae0f2476c8dd4184d2880154bb3366aef818107b9b42043003a27095b11712381c26e2d09ee52450027475a312d602839583cf9929134b7acc0bfc1ca975ad0cfe36904f80b1f983b222f12532202da68e34e2bb00d616546399ee218a91fe1c9cdb34f8f355a3435b58881952496aa08405abb328e665426f79ab3501434e2253b0af66f4474626948ebdd43bdd700bb8ff55b34d96be9f51346259c2b5bdd0ca2a3610f84bbd6943b317f2a5676f95f520910b8ebb8e91804886f070df2f1dc7a7c3a5bda98cf2bd1e8f91042a0ac7523c96e24463eb3f6a8d549f64aa22ee6b70b55610b2abf10a0303512904f232aad2420a7830ef1b6fb595de372e162b33e5e1f13cbfd6759b050d411a0a93a3b9f7a5bb12b371ca7834456d354acab6b9666b737552ec0de0060c16c64c2b86f2f4f1c86596a40967b5fde0e36cddbfbb71166849d949330af0bb22e11caf5a571bfe5fb5ba27f4168abbcdee5af250b87df1b68f3d7b67c6a22ecae12082f8478808cd3281da7b64a931abd5579658bd7d8e9249312942c3c66326e98cf3fcbd2b8d56c4cbde563537ead2f22376323c6403fe24422b82ef552617f6e0494fe0576ea9f66d720528d54d895d045de0c7ffaa1463c5d2d70bf9c50cfed758bcda9af8625e5185a1444bcedfbb5b920af729d6f984787b85ebed0fba82a7e605dd4af1da9a6306dc52e94435dcad269b954d73e2d6ce61d740893ea8a8a44548bfff56cf1bda1ecde3dd1a38d8645f727682e856160bd4129f2523734ad585920f675a68a216ba6d4ecbd5da3252555ae015a88d31c389e3741d7179dccd12b65f0d61e0736072a2967628ba7aa0c9a9be4132b1ac159f4a52212d43f2033f1dbcf78410f4f9a38dee4378db0d613358f354b3d740b5060b649b636f518d6f4e1d6faf08bc285236012a77bddfe3698802a1047168f65ff659ca7b3ed021666ed9709cba5d5f14a311dfd2ae7c6edbc5a5af66b5a44086b6626730dd5fde002ef87250a0a305d8889ea85d05b2035c97ffa41ab0807ca0426c525e390810ca9607592e59da329800a5d52b284f145cfdb77d7d6779a0dfab022a6509e81d866d8671e3713a396dfdc8f4d4ee126ffdc02ec4fd6d7a35ec0be17772173e2445c158c615c32653b4366e8eefbc6e4bc8d873bf7e6c852c53f0675a73b373b7207e69bd0cec81f18fd41ed8242e8b75754628ab564fa0d1f8f96cc3aa0222c2a5095ee8105122933846dc10373c62a0dc54115ef039d5f66b215611a60020e8404bba580063cc3a2a9876370ed59ffba6c7cde49955842f9d40560e946e713efd3c7039c62f427b5b6f581560b70c99433758707b7618464c198c9d270b7f449b7d29cfc3e408085405934fee383e54e2497d8b9e274fc0f5a7b17f0588763394f0b25e3d2f5a13afff1a03fa1ec67b47fdc3227dc4dee61d6166178b29b055a4f31472bd8eeca6c27fc9f1fe8391134b8bd273654d49fa9071322ff6100d77884af2f890f93d4d43d439f3899f08f9228d07e0962fa2c1b410fe212e8784b20e2eb3bf37479c631fc12bf75ed099aa942354a6165b4a271b8f5bda0ebe8fd9d36c3dc2e15d28e30da3b6ca822ec07bb546797cdceee9777d0865d842467cdce0936963694449fc3715e2a8e40eed38cb0bd84146b113a58135393ff68f4077dca8242a56131d80a0d08d02f912285b829f6743478914fd34d9196595ea27d2aa293b343f902691d291e267340cfd5f6451d46df21d233bf423f003593e189441ca6ff7ed09bb3bd574a31e3a90f4b8613beaea2b20ef20bca139470418456bc17701e28156ec85f27acdf110bedb0808ee877f9d7aa14a0f5d083abd34277836511afd9705793f534fd4fa7b7f80a2e4a6b8e1c2795b9878de93be1b7bcb6f3a8e1216110cf24320a45c50fd3a44d59a7e3236743dbbc8046ecd655089b3c0a965d37222393f2f0ee1c9601d13c083be449a1f33f2c673162dd51360687e817408c9d215d7891e00d03ecc6641b2dc149313a46af9b444382a84a773da2b37152e5112ab050077a172275fc103e4d05618a0b1320a3a259aff774a97d640f41e9607d5fd1bfd884b0885971f38057eedef76ce7fff27832289d0ee320e9bbcd28eb648aea27a5ce25d67bb1d50a2de2ccb8c4ef82bcda869ed4926094f724396ca8c4d1f9bcf15846d95b1b16227eebd4413069eaeeeb216e6abe2d9de8e16e929876c2b974ce071586fe4e7a20c06f8149393ad6f93a93f2ff1a72ac9255eb10f51b2464d840461f064171f6841da3d0a200f421b297447318177cb1a24c08e1dd20091d48aa4f7275e25438d9d3294dae386ba0452a6306ef96cdb6291ef2e140aa5f653d0d32b427b76aa262a2dcbc64d1b3472a17f8a56d5f4b88dad8941a1434d64990ab44916d7b5276a3ed985218141093ccfd0faca9dcc7e1d7e73fcdc4726f4dc1dceedf35eacd2f4efdb4373c4fa8971a2b101a418c04191ac9763c7c4c90048af8fb34a6d64356475bbe37e003be2fc44a333db04b83638cbf60682a74bded0349762001d6c5f81196c820820a87826e0be05702e8ece5def0c0b5e04c49d582b63f7296cee3d0c1dcb21c0badc9e5d0eaa0373bb4fe5c0ca94cb985c15522b630455c614dc1ad27d92c1704a4efbade44022ac9a6c4b22088a53984eb8578588d90166d35db13f31929bffbe5c18824612a66bcf69c33e80205dbf4b8459085f0b602edee986d7ca0721714138b6409caea7e13d32b3f3406772af8083bbab0e988bddedab28a4a4aeafc1dceece0c62c6acc9c59889c680e02d7af3dc284d72b10f3daa58957c7ae888f1ede5d365527192aa38e08bcab14e4ccbb5c9e24bf7be724411dba7e7c568c97b513dc4dd5c7852535100ede6477fe49066231185d05a04b5dc00b5bcf1bd400bd36b8e5d334f97382a8bdfe5995f83a742b9ae8c55192168ec166e8668dad0144ce10a19578ba0e185f06950b3e05c1161790c648d158628abb95a291f24f8c2d5d5ea8012def01ee3712045b04215ea1cd35b12b64fc4b89c1ad88ad47bf69f5a58c48a670e85b1e53a4022e61b148a6383f2c3ebb70a8dd184103c913151b9cf7c8714d4b204c2c3f54fe9921f397706f52bfa494f045930cc92eb443f931bc57d5f9348a5d8c5132c0721e9690570e0c9151ab207ab7fa7c31ee436020122172dabc0be65b1134c6ee51faaf6472646de7ac9ed150bed667ec0d44cc804c7ead4ef8b9b5e91c9c398b43b9e6a4dae1477d2e2602c07411b1f9e4cc9c63f3e77173f6bf3859a4ddbcab20198d97b66c14eab17d33ca90f198b67a7237fd80cf47b4a039276758d1197b31c8d919f2b3caa814b9bd97438c6cbce5c6982074b02f97502f0af63cbf826f4663716e640859ff9c5adbfc7c665dc81086751c788eafbc1ca66b2eb3ae29a3fcb5aa708465c8f66141f6974e7e16c329643f71b1026497b9634d2bbe67029692bd03ed1cce54596e9433eb4e22114c08d44485d85307e6e7ed2aa7fa6c4b81413b3f413880e88be0ae1058d7af1171d33c42bf92ba02067f3afb0a99a265b170151f3894888d5794ea97eb84e6cdaecb2df2a434db0d17f5172c31e2b9f0cfad889d6d7b69f676ee5ee99a1d94b856f50fe4e79ec0f5c39a766386348fe0635cc1c2481e20a4bee780dd48e7c9ba307681e36501222b7eb2e4faa4031ff37e2259215160231411ed843648f446cbb5887a6e0889cc8fa39d7d52aa1dff85dbf1d028d7cf672caa5771e84ec8025d4d92cbee37126c0f911d7047cda1c801be44efddb2a5a3e4718aca40e8aa8bea2b41ece3caef1c3a174ad85f637b0780bd0a246aa66b64b9249f1e24843ea31b0c713672b9388d3bf112ec9ed4172b98eb573feb917980a4e45b793f0f6c7439cc016e274388bb8d0916a566c10f11085ed63fb193db04063b2da64c69a24c4940390f4e0e04af787e38f4667bdf6c224991089856e162234b63f9ded51b717e1301749df18f296fa5b7ea2c96a7daca962054dae12be7e3192bc0052fe4d82a4338eb26f9bde55f4f3f3d92bcab7d73b36ac46375a2296f86aea54d166c5bb8245a675d1b41dc6d8f7d6aa02013c661bdbc163d6b89a923579c871a064026cced360323b8cf8eb14db8ab5cc48384033899fb218a40fbbca35cee988f7d0c11531603b466a893042a244ce0d96a749510ee5a8024f9da237b09710a41b8e2d8750f26b423c87e40fbf682998f90c9cec8cebdc6a07b5ec241eb0a187616562b3766e7dbad2e17e84b427a6c41f62889999c5cf0c007ecc5ad40d30cb625ff2af1c3ade1b3db15089218e3c42a5727074ebe8acd804cd8a573c6c028242c29b4f6a936cbce9df8d4a1f33197fa2ffad1707490950ec562a599f88745156ec989516afc5d88991b13847fcd9e680f513813f093016d209c41ba867b0d43654406828cfea74c842815cbb6d7b46476e682ca2b6a5cbd8dc6a4e82ae021fb8684a54a8d5663bad56b24ec36dfa2d1012bbe3880409f0513361b80086d134c14d90ff828cbb4fce36e23e4a055815dfc08196268969cc51976d1ef52a679f238b8d4a83d6b364ff025bc865f791e2380acd7ab01cdf362dc9b6bf54c3d83d0d928aa660b2fb71179238e5505443eb32be9af36d12caa6845258536fb813a4ab826e60158929e42a91f3a6dcca6cfcadf7089d1e32b572413400894e50531d994b07bc08202c29588f3a474630007b4f1edb7270a7ff5855cc8de7342ece85c23bdea4038946bb6920d034d94648056e4966b288f31d644e17d4751c039e5fc47c182185b1f8d2f6cf54f6d0df7635c00f4a020ce01a79bf787f1c00a3d520245f3bacd74a9af777aacf9bf80dd5e83a14143e1d54fb0334073bb01f55b90cf76374d1265143ede75692c078c1e26ee45cddb85d3755c79bbb1c7720c33bb9476677226f796cbfaf4b155d9548c0aae51e528f69566a9f97d0e3040f50f197d5fcafc7453e155f349a1bd90c68b6fb35d463afa9adf72619802b16051e390c6eaa74413ac0b59cc8b58a27e7a07f739046e4043f94521b7353ea56c1816e3099c1acaa2d94d94560bc7802f5330fcb49bd30973bbc1e62cb1d914ec78bdef3bfee7d66658b0acfa67b353a947b20f1093239d655dddfa9bc56e1705f191091b85d71b29f413be812330cba73b22d8a80bcf98b2238631210a72ae46e6cef22d3e75cb08843c94b88b5c4d9f32094a9ef42c5c84bbc8c238ffa40b33e0b8a3f7b86514561cfbfd03634f52a7b5d31b64030dfa68f5952d0de655327534e851885a0a667293fb9025174f0179891b476c1295132afc885c0ae8e8276f1b263865863be0cd0a4010eb2da1a2e95d34101cad9aca15a718cad9810fd7b271dc86462bc3e508cb90f5e3a60cb6d661a102c9837dbd4a62057e860197e35a4e2d30e6180f0c4420c3e06f883f83318ab6dc1dfcb1eb69fa9ceb6bc97947b2cce88444fa33fb02da4cb4c00e31f1a0f2dc656b1d71edcfc4c7b5608c931c713c057080ae59be1144c7b530b941427cbef76ce039426fa84a8a4b24e89264d00224af269ad7c0464ddf6a22c8d30d30897f195661791ddc4f87b9fddecd7087f134611f115394639a15a75f87fc91e9e4d333c66b265c2f8091b8cd39d9a5973f628c8d015a310f75bb9bc491c5a9f7cd74b8ac604f875a0709f9be061a462865cbc394460f789407fc461079b3f8187c0e674b8f9a9bb3ea87c8921acd881215b1efb8b220460e78267883e09e12600d6993e6e4441462de7ca233a69f11ae897f5f283058069172bbabeca71ececd2643bc5dd450ff62a3497897498d833120b11a856eac180ab3210a56707e3cb4e10ba0a89739416a27babce7b70da0ef21436315ef6871a39c33fb19d2a62da592a2ff1d34d8e24d605e8268977885dc4902a90161b3c8dd0ba691d26a10e7a5c19c8b6be39fe8bd234d1bf94aaa0766bf0c7a48297f032ab56c900fcec549b37c10dafda23f0ca8b54acd936b019a38d372d374fba52cff25062402503a1497e752ec70189881c185721675e456084c4c2754306fce847a88dd4aa7828e6d889c7027550fe9f525316ad794fec825593bde823597abc2f71598843f8a63ebd0616c9547378cd6ce12a14bd02845285f91b2a9b6d726f29fbadf16e6ecd13bb61f1ba558c08e20bdf45624ffbb45311302eda631c652cd8de24e046befdffeb5de2cc04a71455b3c671375529793dbd8ad9c73aab215d3f923353eb2a760b31ee770c6e60a1e94077db51be2710883f95848cb75538278a16f6ac17c4acd4495b1d875e58f4d41f6426af7a6ddbd037cb8cba3f99196570221f189ca7c509839f9fd560479ab0069acf6f4f3bf0118a66fd00ba375978eba470d9e031b163a8793628aa82f40f90b0032ac2589ee48d5bae018ba5a39c730ee5efcdb6a114d95d70f2bce3d00d53a7450f81dd221426327a101190c1ae87da271d3a6c890396f8a193bb1d739baa2594969d96545872553bf04e3a9d64233c01dbc16bd45732d9440876f4d8e706b62da0abf2627045696cf624fc0017f3ffaf982773901bf304dd45947b22c0017361079e590e82c84f5429b5191bc703186f4bd4d890005ecc7c9ab7f17211e537f68c22ed10a5af53566ea7c8ea26cc45c68caaf2bed1ea1c82e489c6d7fdc3a4898821ce100c3126963a7effb6f1ee7dd97e3d814e7b4dac8c1e774ee89e5d99905bd9b3448344462b3ea1c1275f2ec40aaa6a420140b0160658969e323d182d6c078e149b995c2a7ffe2824fe93e062178aa8c81e2049baf36434310a623432d82286140fa4870b1364c276fc7524c910b4c379caa57751761ba45a00317722539de9b7d41cfc4cb644b56bc6ae9252c9e1fd01333e7ecb6cffb1eb55084c7ff73ab23393a2bedbd7213cf686c7491d512bc538b9bd7ce18304865e1e14cde608dcd1d1b6e5ae0e7ea3bb5631f2b87fdbb507fca0385bc477dc4c4c8228c571b42ffcdbd43fcba9efa759d1de58d846660b28594698e8a7ef22a66545653b4817220071de81f8c83647bca41586c92d188e7bba87240d1978953d96bc22b3c8aacac19211ecaab2fc8968799fdbe72923b9455a706dd2dfad84c9e51898b103a0632900b3dfdaed4d04de75c73201cf1f553ee5c7152cc8bcafaa08b7e4ce5397b21aa9051a80d8035059bf6e541ef9333aa23d92963454eec52c2d9b3ac1003facead26c6528a3664399a6863ef327a511e155409317a2f1eb31956e6ea3492e333b1e80888d1a5d22116c6486dd45ad7d61c14e2e295ba1eb1387070f33609e206d4afada1c9e918d43db5d1c8a7c49c1d93b7e6869fd99c8d6ef5f0c28b1a906a347058bbf0f8d797a39fdda9dc54c93f0ca52c4c9a3a8c046e0c8ba57736a692d9aab048ebc3263b8479ef94ab28734356747e33d7b523b5a563d5246d7aa8ebf08ff1338c217be0287abd02bc2267511e6ad79a7589db5e189a5df86691ce73cd046f4502474456fcc01a8fd67a31dddda745f918e09c35b3b571f033079f6241605b293715344c08b8befd1b74319a88962f57ff1a4403bade83efd1005f6500b6ca1366ad0aff9466dbdb10159dd08643c97f4ac67c0d71cd88f4de029bafa23b4dfc97f6a9993bb320ea7028b3519de408ba690a0763fe51cbf053679c9c1e050f1fadd5c0d062bdb57bcbee4c6164bf919720b14ae8f7d9e5cd0e6b6098d0380aee23d0430568e7029c2b23a629172d404d83349a09a279e5649c0a9887020650e45fa81584493f5e5b4908e4ac0ec4359f8c5275ecc8ac30da806e6348e288d65fd2acf5b4eb2e241f764332c04fae952b160ff1caaf765b623f377c8e982410f4fe54aeffbebc1458cf0fcaf48b3ed3872facbee4d5ace5638fd9bd2c60b6569563ac22fd869686619c60c003cb3ce08e8385fc5996124e4af46bd8b185aa98a155043823f24b65580262f97208c4941d083e4c898896f4bad92a8c52011bf1790feb0313091e7011515bf99c8323f388948b811fa31d859e70467d5c8bd52233041350e51f92010fe9255206bd205852acd9a90c46309f50f9d21928b0df8ab32b989ac7f2441e75b4ebd0a79bc69213f48487f7012ca09bb8452d9c55a493d808e95f92eb89c6f26057023fe07a598e28f944ba6aef23a79498969b52445c7339f5f5d6a6a9187095fbeebc025e6dbb4262d57cd9fd5fef3d34b7167523c86f54e6be5d0a01c0e99acddd5b57bccbef2c3b7f4daac8963f0eba20b80244891c9c8b828cd9e16df508c3b142f0e563974171618801d0f1b4ca1db292921845b8cc830a084ad6358129ecec5c67e71d8535407faa4304361cec08d9619427326dfeb3da7368ed0a0062bc0b7127988d387e4337f8e29a832e5606b48f4a7c7df7a7c25b38343628a1feb8c6a38d220373034b41fceda55ebe8408c01df234fe7bca4f82f30be904eab08f2391194322e7286a3221bd24d1350535d3c5b4b55f0978beb60c21d5012aec317aed3f27ffcb2e321fa5aee547a61b639595ac8fc3ee9474cc1c139bb5bb8ed547149a0564f74bf059aec61ac50d842da411d39fd088bd61078b75d85a168cbf0b454ec8b3f6c86a97da24b511690743ac2de05bce6a88df8bbfa02c43cf833476981b8dd6ef54914444d6224856cf78e33d9d05a53c0134944452ca0d42d6b05763cd77018a96c7ffb3342a4c101bf8c6d18d309590f52ea859da3e525900a7024bd71b53275212d200514344a9356ea9c25150ad342f0d76d1430673b5b0e0bd939515de2c89fe78dbc247d42cb3c6f342d137cda35f577061b85000f000a5e43ea8c231669404f7410e82c87d1b525ecc002a5566ccfa4f12c5762f62408b6728cad16dba11a0a1aba75c0976f85292aa408cb7d0e86c3b858b9d584e473b0278ffb4a716329842c65c3f0007517a7301c4ef21cc0fd2021da39c2c8b81ccdc42601b53e4c6600c8ba659f40b8a371f7c9e0d180b146b44fd3ee74d4cc48a33da189124efe213f512e8f3589cebf171c191bd0253f81921fbec8d5597b157fc986c4f107902e20cb82a24a6b01597edf803872895f7b5fcfd70513579a2098bfd6fbe439b4b015846781962f50cf9ee7a7c62e9a1bcd7cb9fac9cf7a485740b644fefc1ea9be96cf5d1f482254711820f82984bd1d95d221d104d7da9379c648e5d9e4c6c9a440e66fcca2facf7cd5e6d5035df0021059d974fabd1344f092eadbc6f3f21fa4aaa32768e2daeddc4bdaa36e514bb65ab55bb760abd6784791bcfebede030abba917729687b7e8a4e79f55f12a35d02b69587acb32bfeb9ac4182802a700a6eb729541138bc10602443703334b71d8a9bd50754e110dc6908120619a98002f87188b09461ecd50258404bd247c7d73074919986c5cbcd3aca63b2d49e3785173def406df8caf13d4e9fbe9b49f5091c0cd8c2267e71e2b9e103a3966b6f5041fd4c49ea3f0d09ddc967bcdec27f7ab7f77ec7ab221b9ce50f01639a2999cfe47ab7633248828fe149d72caf364bef7b8c22669369d44849a517ed69b9ef32c8e53ace6964e7c9b36fddc15a312ef494c8b5d2bada93db55b2565b01b13fa3ec3ede7f4d6dd60ba09f58cf06c672b0a2d62b68b6195181547204ac094f5334980cefe98afe97b44d7438b1a9871c13c3b527fe3d071be8f2043a8c44918134658bfd410bf8ba46b462c38549b1cac5f211a73cbf4107cb315b97f9db4485b06a896a0ba2ef2b2b9e54dc7c85fc4dfc6d74849a771ea8259959e41114a302f773cab07b48ce33acf02f345020212d7c04676865bbf00e853eabec7cecb13d3e0b34b7a6685544a8e4fc92ae87b5a5d202683d5e231f728150e0c309a653945e4370e2b104b01fd5e21532565e42ae6755fb4abd1d01b596b0cb3ca7877b4fb065486650d8a91c95bb6ccdf7c160028df28ffc8f0b9f2dc7ecf3d39d6c78dbdd1ba87b216d7212189508b9bdadca5dcb6fe124347444bb4cc451a107de6064bd1f29d15c98019ac84ef1c0388edbf621653dee8c233f4a6de5f2aa7e09a4c668c1308e00aa6a7af9d10bba1e56d0a143c157251952c6ddb7f654edd98f272193c908d121dc39d1bfcd004a5ebe8149f26ebb87f567a5ee3a30f247700adffd79691bb5065e7cfb6ab2a8e601d5578f772cadc36d6c8c3cb2b2fd1bab815783356a8e548ac0036486752c88dc52472f49f9b21c04172e357d16024102d7be8091212a2754193d07fc5662793174322410095e1ab5789ea7bcccc1723656d8bd3f5c312a362a9881f1eac8c288740300f68914654a427bdcb891870ef051c6304d75b8b716357087708fff4aee7005e296d03d9e0336c21d32036b49215caffb0ad9e4cd82bd25401bc350d46ceee6b19ad8f610affba99158ae7c63871ef6adf51c61390619038f207f118bcdeacbc4772dccf64472080e2a4a285f74c120294b31961753a396aae5c9b422367f264c05890dc40c30542f66168c32fab7d56881a12864008b8730317cb16631c97dd42e9ba37518481ce25ef9087ab4e2c69abc73d586dee0f89a77eac9df9fb82092fd4f55cea6b2a8a5a1bfa16e2c465d31b180fde8eb4027d7f1ac38b4a32599c386cfcbe14262e934a2a093bb5a80e437b12329405ad8d05285460244782e82d182946b67a09306ddee61dda58454c1e6181702c9f3f92707175138a039e425fc0dbe0943b69d8776be48a0f4e223f8ccb627202c1f40b853916a74f07ab1fbeb712b246375c96e1576723b0a20c32d091e5c309d78eaf34b45836492d09ac63e6107f41084341d0f80a2746343651357d292ba16bc2dc1e5396c224c830f12ed2668e38e8e8bd2c96b0831767a175303f33e3ce6965fa6545c6c2bd44cebbdb137d064fec3a607a85cb034bc359160459455a09bd0df041d20e0586f258be81e33f9e1abd7773c46e79da0d88c85713907cd39323dfa60701dc4ab34111c39d3fb9991aa2f22476077f27c73d10d0bf93a3fb3f872d384506b1200e02070d2902cd127fb8d3b58270da22550952ea8e69ef359229cc1ddb81effb2c507223b3dd9f4997e78c0dd98077f078509a3a0db51bf859e3419b873a130bc93e75080a54e971a8787f3a40cc39d26b6a4d11caac03d5ab1579e29ec7ac1661ce6c3c7bdfc7c0f1faa52410b98f07347c6240f2a0ac20158a99710be2e17c504031ae2e2d8810f09882ce3c11afea0bb963764b1cade396f9e3bbe12c56762bc0f7431a74807e7c23976304302890b1c183d47576532f90b46dc6efc1f518bd252794d664fc305232ff3942658f5c18398f6f3a54846baf02e2d8f6173e036d88b163c83d52444c02cd1418473215c9886b23bf2b28bc2d9383b5913a46ad47c9797d0d536adaf96a4f35615b0648dc43c565feaf0652748b7ab92396760120137ebee6fe35ce602965cf5a0033b421fbcb19e6f3a8ece0a6889f9592d90291f10d3d4c54072c2ca820569f573377c4d4269f21721417864e122803000a4b06378ed76bbdfa28dcbbba5f40fe04149d3ef3a46e98e5d3a7ef80ea2fa87449c41e8d9e8e8b286b379a6f77b907272e7cf9e65061741e1229c10e31ec08c676346425319b1d6c57eaf136e86313355865b7f39916be99068826ff92986c42ae0fcb696fd9ec34b06a86cea2c13e828a34cf443f75a76f0e4cf9ac00faa87525ee785a6514f27376c4bfb2b02c3ba0b6f101de169eb6d382cc3abb301483a1c57a9ed0001fd2dc07919f28d8c53f924fedfa308a637b8260c7adfe67fd58885552d8295d74f84068f4aa38329006a039088dc831b3a69fe3ba61859cef252e0710f5bc76d0f893736e8d54b04f0e66068f5c759b029cab25572c60c314d520317a5ab85f258087fdae49ee73c66c1bf49e7d2d5e11da023f85f862012508ce493909e9924ce97bffdeb5c5c056ed5d5dc7775593f087b67c5b1740209da2b303957d4935a4cfcec5b8bf2df14131a88515d202c5b48c1e1740bf3fed1da8c246b7f6c5c38baa6091766bdde882f4170f7aa1d38f7564a23ad69c2c7762341e6b35adcbee1d2c3089994c9f88f5e766ca984954ffa2e6b85121442c789251152cf597f46d212dfc7f0b92e175c5444ee0bddcfaac3a93b219d1c33a163a89a86a2c6937d5c92e590305498f5d6fa4458eaac74819f65d1ad05446b819dda1244915d78fdd34ace87e06e6114f59414fba9cdd0f14eb948cd7e2bad315ed7adb01d38cacf54d4bc360e347c3bcebb47f404dd3e340eed3031a56701f03eb88a30b6a1510594b1a1ed7d658c7f3ed8515925d37766147af76f22f22b75583749c7ce8deb02f53c8a4f011be8b2fecbfd4757503f4d110530367c7a31451192c0724d4dbc296785dad6b3ef9a2946efa403197b90e8f3df6e7d3c8812e20bdfb4226c3d1dbf79c2e1d42344063f39691c8b688f03c16e97d9d992a07e5cd983f32d4559fc9a006d3fdf9b477d0a09a33dc14224c8a58e91822aa81f56be04688df2f3830229e30218b0791351758d6dcd338160452fc217603220d9be890cf1fee8c103233411135b87950721626ee5d301b45e57c0765929980d309abaa5c41732f1bc6cc86a88d15d65cc3078e4ceea24c890104493e10b4c749b0ec101aa46aadbb3678bc96dcdae2fb4738b7cb4325c070c19e66f1b56810fd45e634de771a8bdf13b877488da792a635b5e8047a4486fd93ccae3eac012b8f970f8bf249048d60c48ae9e64bd2daadc83b0e012411c9d990e4c67d7308fce55f6667d35fdb2f721b8579bd657874df9fd047cffc1e0390277e65e76400d07d1a6b4203a46ad768af7c69e03a5f4a057f2bc47789fc3f6befeb55a94157a56c1c2102700c1b23cc226febb164bf56c85e02fa438e2a07fbfa666ea45b4beb278ec89e2109841ca301466e7152481400ff3b1773135818bee34d2099243b2c463dde58800da2648bf046f6848333d19b1be0b2b7e10bccc2b9a5d024f0b576d0fd7871940bca24f169bf7971efed8c0a1e2758a78d9688701830a779025dc93db240f39cf5af96c6d1a0d987a64dc279b42ba6e9b696148eae21c3b5bf156f18285909fa9349a0ede50e5160aeb19cf11a837af4c4937b6d797ec53fa205ea37175425d92c81ff0822af131c70d0e7b299e9a6944c0366bffd5d7991458cb851ff04e3cc78dd1e8f6506f00c0094e1716e589a44b2c133b4a1f39d652737b38ef3e495e9d59baaed08302d34e3d79447c23774297cd2539a92c18a6b39143756ed07d87d1d3f2f56c4b4eb04e4baef86b3a4529aae637f0fa2c37725e5394f1e1067659c52f6f055a72179cb93a2b631d8184102b19bb62493ee8d23afd739a7dfca1fd1e1d74fbf629761757ea2ff05f122c9024317822345384d9567133f0a2fc5398a999ce3642c0fa6410aeb1e328afbf4491c5aef5d34c9fc6ad59248266c996b255628d85adf3081453a4d99ca0c63db91cee9ec669e1766b60c3d53c0993ce407d2ba3669834629ad913723ded7ff8bba0c5e224400677ebff0e0a0a7c90fd699e46fc1eae7338cd8049cf5bc0f7dc5d83c7bb4cdc21071d4b20a5841059ab6314eece5e8d70cb9644a4dfb287a7ae4968215b73137f24b51d5a8d084811825c578820d158a4c56662ed93ef04d516f0c955455c7a9b479d5502eaeecdf8f6a74432fe4178bb45f680df924e61e6f14411c9bde2d240f42a8861e1f1fe32fa0ddbfd7f56d6d1a89bbaf0ca32db64fdb6af205c63ed04e16560e0b9974b1b8412fc407c7ac225220ec691acb9df95d7f3db7bd4ffa42eeda0c635580e1c1a74e8ff6b50bf5ce4c0a7c8a7fb8d4585ec60dd99f85b56e17c40036993327503ec00d1e1c2258f0e2f90ac6725b29e5e4e2ae1209d390bf7be9ef48a359bc3c7fa4a4119e975da2046521c2bbce333c969d0ebe86056491b83a72e661451c4ae0497c20f189da2ba503f2dfcb6afdef8c983aa2573c97dd847582a3d84a8b147ad733f040f177a1bd07ff0560aabb9e5d31ccd89e18ecd70c8b3ed355a3fc852d4512c48ce87b868a573a91c2b14491491aba9db64180e0b9d44d11177efc8f720a2e20b6db529f550efba64e23459c32514a437875687795e5a46a9544dae76308d8d51a26e6ac92a2e8da29d989bf15223903f95cee194395a143b87f36e97a1c3929620ade08596a19728084e4349c3855a514191dd05026b48e1d37a617828193b26099bba739438ef84656768713b3ecaffd39d34a981ae1bf5fef4517294c56f7257c0f71036c1ecccbad96300460692c1544e9ff4b9be3f6407f0bd384d003d5dcf21f0b9387d47a949292013e8ab7125c913fe3b557119009069ad63df86bd19f75bf099c1c78a44a1e3b4f800be509d8e971f04ef704086359ae35e68fadd4ec98443a50533b5cb9bb973454072b0800195d37dd86dc99edb8e4c84d5af7e75c49e0ffa90521a755c0bfa1d2ecf166046945c6fae63085358b99e32dfc130af9986e46f6c915ff276fef16e3de170a278d06509ce00790cfe50a41e1e1a769a442e19ec9e9ef455b2db3c347f4af90706ed277e734be3ca2fccd08eda7c40aff20f1c751bb16f21d0c81568876e3da081a20cf3a23019e9d304174e2284e942bf4ce85ac262d1bfa34909109d782ee7e74324be0ee1ab98a9fd2f6ba31bcc23ef18f4a7193b093a3822b169f17c7637a818b9b59b87d748ca90bfa4a42ad97203bec4c5b0e72a5fbde21a2f5031630f693c44837d9cf15e6fad99b36c5f427141d7ce522a4b939142290924bece590d5b2200d2f2231454fb619f5d3226690db1e6eb42637cc4467fa3cb27216490d78915b94d7c66b9a10a4351def69c60500f106280a6a85cbf51c5ff6aacbea36fce0a603ac0fcb1c1156e51ccd7d725f4d9d2e8982ace5e569e951973e42346854539e75046729bbfb731aa42ac93afabf64bc7b709c3450962b02222d82e77d8d529d61d9878f8ffbd36c91dfd243448953c5c5f4dc312225a0cbf0b09933ba38aa406ba8548a37e4fc280659e3e6b39425e8cf1b9f583074d84e66aab018265222177f4524407cf644bbc18804204dcb88192fc93a41a23ab1820b075764299463d4e0eb94a1b23138b3d5c1621159c788d527d9564fb9b465cc0d9f34fa339e7ea72bfa2a9273ff069a987be6c626c34ada4509834a4855a401e0e0e06e2111e342184dcf4625ef42785d4b9c9713aa8004154b835601765f19f6f56b4c0da16a9411c51251957db80c079cb53667bcf1874a6dad68b1e9f6e117db9c8c75489c917d501408e29f9450991619b284eb4ac76ecb8af0dd934f00c314a45e1449ea7d8a6a6f8f3e869a2d52df76aa1f63556d8239125084780820b5c9c4d43a2f8a052518d9581a74529746a5d98edf216828296d38cea0f1c39d2427764aac473750ae50a5d4b6ad84b88a0ba6c805d03be331c0dc8f12cf4f23254a494d376a90b951ee4511fd5493ea95b7a03fb150c17046c342731a8a0689ef52caff65342ec62cd43ee8b169732fe076e4e77330cc1ffa312ebdcd9b5877245a62259624f36d1981464e547b652db648981d01aa1526a04a33c0511251a076185e20da5e5596075a3e0e252e3b2f0c22e8772c892fc49d5033d298fc636d968e318baa5e56c95be85ec8f96344d220a62c2677e172edacf3863f4cae6952ed0e4083e9b183a8be102a8e5fb8fd8061910f13d96f905664b4424661c4e125688c9dd49b47635c9f58ae32c229d473698cd96da8c2eab1022d09d629f975ad5c12066f4208fa0af32c82bf69a7e8d4de9c97dbd9f7b1090c5853ca3ed3f713dd4d632076bfba41af5e84ae5fbb2f92a4c989f43c68f13a15e4cefd73ea99b6aa73245ad6cc18134ccf41f853678ce36c5bb30976f6edb56045ba16dacb8b6f1dbf0b95de9f1d9004345ec3e3a62800fc8fea7765c293c090c55a606879b4e09eb4dfde2bd0c80804233e2f6d075f664a90aa2e90d9a05783a03147b700110fc890362852f681729c3c24475ad13f773618cfdecf5188909f2a2298d8adf37ffa58ba21ff1aa724f9f8b72f1b352f851f3a137bdbdba3af37126d1864e07a24aead1fa692680b4b927a57b073a8818e8eebf6e0d8da3377f2367a238a6ed8237e10b8ebda5b70098dd7825db7a161bdf8206947fd7c6030ceb7ee0369b6591577112565ca6d1c05718910c1ed34c37f6f32404286f54fc620ba10e915281aef28c5b34c5910189824ed42244b6be295bac5f8fef559d58a7f6eb88314eb540e0be8b3bcd6ec6d7cbfdf6389e9b960d84b416682ff957c731637ce96e44ff2b5124445ab28b9550a0061f9385ec9f50a6b84db58b2d64184c176e118850aa0b0592b972f227ce37a1101704a1e3d8488f7941f5aea6030e01f2cc887362359a3b8f02769b8c4950c74949f028c927f3bc2874624fa43ed50ae04541febaf9f8e82cee49865b8904b03a3d3a0a48a179429a26b8e08ea8bf494bb07fa04109445fa72959628a8895789f2505ff8da8c1ecb93bb5f061ae71f264b880a2310ae636430b6d1ff00bf2a32bbc0a3b2bbe61e6cdb6982df525e4647f1144b2632268fb057a05c16f9ffde2fb47568ffd46d02baf403dc703b357b7d4fb1188034e107b8dc8adfa7a80bb3ddc03c415c2a557e16c5149e744ca9ba41eb96890be34b7998902a3580a92d692f131c722ae828a619d549015af01929529b7b80afa982f83bde4f4b4a1a55d17627b54713e5239b6d48be56dae955ac9ce23fac22b10e90d47e2abcfe56f4457ca58a7856f19ed15c6478564c1924b07d9c0573252c83619689ce7c9e660ca99b177777652463875ceb847f286b729e257f33513b6c0bf86ed0f4c1803451cda81ef41730da9e4781966c2cb6984a550e8e14ca2be83afd891b02e7a99dc1d8710c77f237cea6474d8b05b73eb65e0fee32bba99146e87dd16a0cafa5ddbebb986cc29fa3a959e46215f43c3242811586df46af90d497c332746c2706855f4262cea707264e2a5b28dd10695bbbc1d4394c10c6704bbc6d18566a18013805d87ccd6fc9a507db8a7b494c15d1983deb7004918eac3e59af4d3d6d5eba8a075e0259974e94d4863286c0d44dfa52c94044b481710c422da1aed5e9938a61bffbaa43824fb0a34fd9a664fe1f5a2e1ff86bd66a8361fcf496fe5e657064db5dc5bce01f1096d5f0eef0a9944a7106c1ee2a88740d531a27489e4d7e5a95d0603e1723b8bf7247dcc0ef1352a1ae6671b2c53dec8a088186389912f0b02aada508aec876923a817e5812ff5bc0e5c10620f293b11fd2882440e9d8bc47a02c10decffcd065293fb4ab66b0bbe87396a1541d5c24a1fa2f95927aba87a7c8fa2955e85de05fbb2f2f99811b1412cfb8b418373ad5ae07b4eda0e7a3d0318d0f630f8638611450cc8682f90b913a3265437edb148ffa417dc815396312de147b22116623aff48a8feca6b7572262cf8d7dad2f91d9a6a183a61fae962b857963464230b175f0e4b1284dfbd3d7c6edb44dd566f7fce26df7b00399ff403d907e9e1ffa6f49b2862cbdb86a517c4e11db85065a1b97a5cd32a3fbde5d9eaeb9a88ca80e8b9bd10f1531389142c853055697d88885ed70067dfe83faae1f7c0df36537bf3f3a65973d4253d31c06487f718b889ac39a620e7256df11d62bcb5d06ad7a4192e6159e6da881d6e28542150735b09204c1d7e3d93559e4de7e5ec75417685b069728cad483cd414722656af23a20accd1915f65ce48517ccf8b57228e98e9346ea540beb1e0d594a6e4641deecc00cae5ea803034ce6048e4c04820d57305ed5a803b93d41a80fa8c305537104758432a838204c172754874282c84e459de419065303a1c2a0bd58ebc0ddbe24110c06e1fbb9b2222669b2e14c744e1d0e2b30fe56c2818fb7ffe7b72f9becdd64cbbda54c49caa60d3e0d4a0d616ba6266a9e64fd19c31de79323467a66d5339545096db69399b71a35766bec96a95320859887e64bef16a4602f976ac56a6955f3948b88f0d07c994a3676ab9572d18c954447430fb24c057bbd5aaeb1466bbaa1fefcc11dbbb572264576c068978b4a7364438191ed9925feea99fa6193dcdf923268336f4fb550dee12876cb6a7d0d4f2b70489a971d3046f65f74f4c8260323fb34d7afe1103badcf57e569b28dea949c96c26058d0cd68b3eb344c5b5c61c2a5d9ddd3a8a7554fd33c4dd3344dd33e4feb78daed7c57a3f5bac8a69ff3f3fb5fb4f0db86135e0fcd21f6a90dad87fc0c4a6e12134491c40422c873bebda012b5a92384e109494a1084ec4db009608d6ca740325750cf25b0c40a2dbc21074d50718291cbda80831e64e1074e484531f227d9a90024bbcb78bf7b76479180091c72732177837c086106444a10631169421baac0ea48008525a66002206f908119ee14ee08234f19addc1e3d62c5ff58e5f1d2243f54503cc9320914aaac439649a060e5db3372be34dd7e50fff78bdf61e8240cdafd5d431b4a0c6ad1681c4864ab1be6ea240ced65c7f6b283d3b6b006f75ac8c343f5bf2aaebfdddedad0860b391bbeecd840e0df0ddf01fafe746caf853632945a5a7bb4589f861e166e8ddac9b8688eb61d200f7d3ab4df4225a359839116d6f0906381819e99954aa552a994864ec2a03936ce579f623227b326f54d036994d55eb0695b943462d27a1704034394215323366376760e64ab3632bcb5a2a90aa41a35d65af15a6badcd40e400a2650293a5620218b81f9623bb71381ee2101c6e6bee37fbe139eab0fd86480f69607beec76de3c4165994b022c85a5186468d9a05009143078f21ecd66ddf6dd6caf8bea6370c027d3fe493b1d9dfac8c2443278a5c5b2754b120af131145209104e9e6c70a8ac7109286b4de05c1c01065c810418920825a9a03a9da64dd103d334ba39c95562611951196d5927011675a3b4bd9de0fe861c890a151a346736f96bc592a79d7b34fb0d6058509474beb2470906ad4586f1147cb06470e1d3c86c0408f2290488204048e1610398068990047cb1484ceb59f3f348ed37e96a050ad38ab71befb6592275ad97a1c8782d2d282737fff18ea1f0ba083b428a0165f03dadb1fb5bf96c786599478993f7c3ec11a020344148184cd24cd1f796e9a4fdffc8778cfa387947ee4fd10efdb93283f2861859c4087b4edb56d881627e0158f1ee6f068b11f65b960532b2c57a02165258cd1052cf73f0caa0a9fbb1a8e3db64e468b4d6365851a363e1f52ca9316bb9b9d11f8436ab13f4e5aec14598a9394590a130f13eed842243714645926a9c28a2c23cb245530c9223a924982206971b940e282e542e562e5c2888b548b2da4c56e4172a385a5b5107171a4a5488b91dcefe24847e91c9b524a2935220423f7cad35b84b4a05aec6f31b9d796538bdd02a4c596528bdd72f311d2e287336577ba1f1d6ef99040ce68671802132fe4fe4fc80748ee6f09e241b8630b0b24f5d0d2a9b528ead8851217ae16bb85e5226b5b583e99708520863b8a47eed812863bd2f00ce1ba30b9c8454b888b940b222e482e4a2eeafc45e513abc91de99327796c6151992ce31410cb4529a8544aa55aaddcfdc32915a7c45aec942620948b5228a5945210c9451e18cc451e16968b3cb3994c168bbd5e2e57ab954aa954ab0f0ae5220fa9e42537b9c94f7e6221b90805e6a1fed94c261b3f28988b50582e5a2e4a79bd5cae562b0576535cb472ff0acb4528285f41b90865b552a952a9d3a9f491c11d394272ffd8f229c31d6172c745fb73755e1d279d279fcc45304e280169d4ff814e31591e39aed967721147253d978b409287542e9223d0ebba38aa0c92fa0492da049266b2581e39ae941ddc8ec945cdfa40afebf2958bb678329b6a55d882a4c51e39ae1f3eb77c4bb8630796fb5db4482e6a31820cf52ba15445ee1f415315727f0b4bce68172e174a5a6cef0ad7454b0839baff59ddf7314251a15c64e363d4f9fe4fca45dff77f542e02bfffb372d1fdfeeec33e4620fe7e7e39c0ffb08d8fd1f7d9f8e83c58caa0093ce51c9d0fc4b705977e0b4795fb5b90f48c7f0baba5258443c423bb2348d2beeb9ee2ee2fa9bb15963ba52b48565a2db25cf4e9ed47ce29777d296db41149e3bdff16aba1a2863bd2a0d1538e88e4f1838ae5fe0f182ef71be7ed7bf8c509ca45d2fd83f20fca5b582db64cd3596eb145510646c3c286c9305cc66acaf4c71656ee46cd4e9f10beb56c1e5b58634b6c7c89e57e8bc70f2b372a83a41bb004fee8192dace127157e84905a344960a945f3f3e1830ad2c2faa0727f0baba5d5e292220b60e1061114492da1096718f5b7bca4483ea10b3a000315593002148e30eaef26651a361ac605aceb0134714592d20a0d57c82f2c8108143178c3196454a88102259438c3122dc8c2133db2ffbc51f8d4f982e1e84ed3342d14ff05db77a75def38e168e5e61ad5a8e6dfe3936b5884e79e7bde76c501fa5f071ed80b6a333c318313a727a081054d18351b727f12149c922c6145f6afa3a86944a8c054b380517f0e25b95f874cb2041172ff10183892fb8bd0aa731cca36bf4dcee807b538c7bae53a841be289b89fb7a3dadb68b1b35843def04d111a8ede2ccb1a2df6a7468d02468b9452ea32c2d1614c207461112d7a3ff1ccb2d3798b3bc75ff5ff26eef1c95c38b73009d0f9ced7b8c5352d7a365af43caff3350d855b1b4da3454aa3460d49e33d75777777770f7c949f1d3ce50c0ada80e07b204d5df0fbc1225ad4388a84ebafe35e6b576dadb5833f1fde711c102d6a8fc35b1b3f1a58c369e296d0754729b536f491abc4638f2cdf62961ff7a3f9c812f7f8642d9c5bc023cd44b4d88f81167d6c73128173491a99ab905d05f9ae83ebc1e2b6e8b6ab67a4078b5bbf8391b926488e4c71a457aa0e712f8508e494dded535caf7af49b5290331c54c31d674c15eb20dda5582c66238f33d6c57e94e17e723fad982c07c31104e2ec3851366444ee3d265cee65b62df73026eb9987382729b9e3277324d2102eea9887b8e740b79eeaa99e32e7f5b4444787b86e4f4773df4a90b68accbd9421f7750557e6edbdefe69c9bbbbbbbbbdb6edf3ec5b7f045c7f6f7b7f0fe8bbf07e53d4350dea2b8d3700ef5fc34b5ab95f4d0eadcdddd3b8f835b8912cedddddddd51fe3e8ac7395fd3ce79c3e530d043704e32f7b29bb83247a35b1de25e76ab456e8a9246d2e0d12df7daf5ba3b3e2150c2867988fb1b823e25b7df7bffc810d7715c5a89dbf2ee56e6fe4671b99730b850035505130598cf9cf5e7e390997e95d47efaf3f97c3e1fd0e7f3f97c3e9fcff53e1ecdb4e3339a6d26dc9176099c04f44785421b812769ec3f614b9c08384e744d78371f139d256ccfd0ef6c3ee8240c1076eb4fd95efec8a021e5ec81d28f9c94d20e75e9d3b370ed8fb766fbb4677ac69b6f5bb4cf85b745cb711cc7719ce761ee2369386f398ee3388eebbe933b8ee374947afe3de87d2113a3121dd9bc1815e1fec50ba7e96dc07092be131681877ccfc161121ee24ad9a6c5499398262eb4dc6f3fe8248cd151b9fb4efafdbe2938dd0cbdd4a2ff48cd17597e0bfa6918295064be6db3e8297ee8fc7de7afd790bbef344f6aa10a797e57214572e619b22871db9525e7c736e5eee50dcbdd4f99e832347a867ed7bd4ab9493c26808151f7444c233de3dfd9112a77f3943b53eebaaeebba7715dcdba27daf45dbfdc413897fb6b7f66fcfbc780ffeedef86edaa1492c69be97e78e974ed8f5ef26f7c71cb3ad4bd877b2667743fc38e0db99fe822da21faddd77017cd51d7750f84a4f1ef58fde3889c317fc8195d87f2283f3f0868fea34536bca4e48304a6456283ba1a1feb4496e2dae73edef45aec7ef432ae58c31efc1ef2efafd5628f16a7fdbce117efb797b9d3b1163b3761ffe1a528dc96b5d87d27ec262d76dd7b54803a50ff787327bfb376d629ae6cb103e5ae05246926cedd4be98572f7750577eb2e7ed1716deefb1881baaefb42d9e29cb39dd6cd5a6badb5e0ec7c2fadb5299f0e9b1bbee8b85fffbef62ff651de26c5f3286111433cdff18449dccf86d3e42291484f8ca4b45ed7691ec94536f751a649da10b4c2843bca5967adb596e37918a6c5ee890c236d94bee378d65a6badfd3adef79dfc0db961121e9a6f9398a62f0236372c69231078febe27b449229c372cc243202869a3fbf7bb8b416093848742d633cd28c8195ed8a516bb50038e72318bd91b8e3d3e9d0a1bba1134d136eb22ce8eeb21d988f33e465f683d94a3fbfefaeb2cc7c12f3b382f3bbcfffe0b41f0bd2747dab7c3fb2f2ca28a3bca59129ae679bfa37befbd1004df77f6bb512387f73bbae7fcf6e9f89e13da7ccf715f0e0f8b9bc35daeaa64f47dfd76f8e081f7df11eef8efdef170d11c0de1a2affbef7bfa0df1421e1e9a43741d14f4ebeca8096d7ed479faeda8c0a823e587af833cd47957c4c0f3ba8ef7f93cd793c98cb53867a314a1308fc78e1a0fcd2623cefbb7c34714234e3884873a9f0f53881ecdad3939a0924aeb220cc810fd26d709bd809c417fcc528b94bea784eb4fade53a9def271e698c40644e07fb2073c77bf90521732764f9a1753a9d1e79be8fccf90f775fe33e32871b22f72cd7aff1ed339fd8102f154db5c8ad53f5f2971dc30854def73ef829dd45b952deefefc64dc1130856c21d6d8a3e754f683d757f9c9e94ef1f3d33daebf1dc9faf164932b826ec05b9b68c6a12265eb96a615465122782e4eab97e3f31cb54e4a3fa9e94ab865c3f5f1fe41f4fc3fd9aa6f8556bdd84e4fb379491843bcac8f55fd6de0b02895226cf56cad7945a9f342951700ed571b8b387bb9b43496ece5abc2fbf59859cc1bd3fc977e6220ed5a1fb97cef2fdc9a196dce90439830b294cfa0dee585daf9ed180bf15d555aff7f7bd87c9a3e791a819a4197ced39ee3d3c8ee3e8f940d5648e7be9f249f67c373d6b5bf982e1e823831c8747cea3d0ccf1bec179944e764e5d3d33368a32e9999193837c6332fffbfee4c60444d2c87c250be52249a457f7298b2ab1822e21f518462c7fdf5b14d633e0df96f5cc492e02fd7d2fb9a8e5efbbe92469b8bff73df5fd7d5fb9a8f3f7fdbecb5b90afbf20df772964025c1e96ef2bdf773c9d206780df2c47b95af6a240a0fbdd0b9e2317b8612fd00657e6ce3e462efec5c31c372d1ee67d8c5efc92be7fba2f9b49bedf8d1c2d5cbc083596875ce0165883c19acb4377d5e27d2aeed8afccf2f7fb05cb1187f2fbd6de8bf2a48c21a0f423971f5bd828c98c5ce48b5f47895a5fd291fc2478788b4c80cbcbef7cab5912e1764d7291f49787ee5b7befebae5c742de8d6225cd87d6bef85dd7b1f743f1f66b65e87069997e5cacf2c8fb8a1f26af1a65abcbf8239212dde77cca1a2701bd6e27d95b097b478b5958be689e372114bf8b2a382406379e87e7d39ba3f3f6d2567dce7f0109677c19fd4e5e4a0fbf01c81f09c9f8ece7b3f479ff590d723f9f5900549c3f92befbd3fefbdf793f031d25a1e22e5b8b13e46f767e95e976ff9223a40cff22c2c2c2c5ca883e55b421b190fdd67097378e83e2864f95186e55e2e34e23e111ebaf7beb662ddd75af735d77d8b3f38057b306d11e5e777437a5dd7c9cec346cc2eb42d721c4b5b692b0fdd972d39e3fe2d72c1effcf7de73ec8f55f6caf7e78fda2a5f0e95ef575975d233330f6651c2e3e9baae82bcdf2f4933f37d0f9e59cafb58e48be90d35c051e17081657fd892099b4cac7075cf272df667b5ef356c440872ad4d0afba65bb2bc143d282ce10a6b555775d59ea6f50b41d55a6bad4dbbb5b7bf0325e551ac7c11a2472ffea5879987b43ccabb789450a2bc7c978f95911f980a29bbfcc052b0b7c3f32beff99b94ffac842f396e5cfee6e5fdbb9947a445292c49c3c9fedd931f9e07a467a87724856524fb7b27f73c964bef66decd6452582eaa28cbca292c17c9514a1e535c3794dc14958bb8d81149c3bda7acb8992afba3945c14f3fe282617fdfba39c50502e62797f94948b40322ee622eee5e1f6caee1f83258c67c131bf82f13f0ebf9b9ff630f0ca6b58078c5f096d561ec677ed3df631d21e847d8c58b08fd10af6317aec63b4c2f230421bcfb37c178341bf826d8a685f4447cc83421bd0c77c37bd155c44abe9958f096d52aaca43daf64572e0d0668e30cb87a18dcab384f5e421ed6b0aeb58791cda7c7e25aca8245679b4df636be5ef6b3ae5b1ca73b8079aeb732f1775b30e39f76ad5f66291d5114c9106738a06599f9034dcfb532792a67b144b454d3135180ab2d726a41bda4976962ff42de521948b5a621ef217ff41a02dece17bab11d1cdb9fd0f376fe1b8f5d703e7790b479bccbdcc452b2be1ed662ea516b599cb8f0ef98bff5b6a4b6d2917201d97bb49bf7e37403a33f83d000c5f72dcc090a1fa373264a83e8d2ddcb0c82dbcfce02283ef2283e1109630b421431509998653358d4caf631fec41cb36fced2608901ff3480bc934481e1f56fa1aa2cc8ba0bf207bebaa4bdf8fcf344b9b2753397533cf25240828f51f53a15a5a56d9ff86630d7104a5328867eee0fc02bbc02d300c4e024f928b09cf13aa05e7e81cfc35182cfbb3b4525e1e32d2a2264990928ba44947b25fd29d519553def0102d6a4a3ae4d54987fc3be13885e4b1ae6c386a56b0c8ea93ec9ea7a14772d17bc83deff65e10e8c5f75a2e52397d405a5457deca45daac43fe354a326337eb661f03c1eecb554eaeec445642b4192bfb7fc070c769ea665ebd7af55ac3d1be2704a53cb47251cb49e5e42250a986cc4c7c59d855394d2195087d300bd75adb82a4456f69b5e83fca565d6547f949c5edf7b0ca4925880a2ac8fd6ee6ef91fcbd92bf67f2b73845c602a5402a17819ee5c71a322a3f8a9f1f3f0594faf17e602e0285752523aa849f124a0f519827fcc0728a2cfbd7958b78a4bcfc6175357e5dad525e054879094147286ffa51eb676badb5d6fad90fb3985880b4e82c372d3aa9451fc8257c0e926682526fc8fe3353d482a4678b15d9bf2501d9bf9b31c16308228a5019723d939c79258fe4212c452e2d0fe5206964f691cb2bfb8f05c8ee12cafeddcc4777899bf2283fb2a8b23f2848f61f5964d9dff3634b6c49f61f5d5a9cf7a8fc6723b910100a1444d366da4c9b657f96998b5c523216978b5c4ace9292819ea5c5b2d1ccc173c915560c5db033569a58d8b9862178e4c0e1a126224592b32eb55cd44fbc4bca45a214f704adec613793b197959a2a3889225c4a2ec21173d1f46f59d2026b61d233f5612097924b09053add5876a74e664dea9baa699f5c1f2677330f39271c3bdf81f8eb5010cbdca9ff61992946a2ce2af7787b2d44a2e6ed27acc5dec2c964b3b49b45c5b262f1ef52544ed91fc5f335edf9cfe73f21083c56f872e5a89b65f7842f396e566e56567c8c56581e7257c2ed1f554e2eb08f8f4e436004dab67974c31c909135b07ddd5ee26d9e66909ef999fe245ce479941fede5e1224f286548a284524a30fc9e62242a8d165bc6bcc11de52c099b9ef9e47e19eff2250d39fe1e1e7fbcd6cac8ed3d64641a5a09a3bfae39e88e501d315f3e1236737e62236616997b6aa9a52b23dc4b774ee2baaa472a919aeacce1cd8120670441cee8959cd13dcbbe921f0f94f9f7c63a0fce1da010e07fc29ecd94bff1a0dc0ea8c9b036db48da18e601fa3530cc1cfa3d1885f3b2a4c5b048c19d1a165803839cd1df6958489af99d3bea71b0cd1cdeb27f42b89da1d6448ba9e07aebd3d17970474788f9f5303304e6b7a313d2d6c943fd2ed4cb0c77741e7c0f21d009e9cb7d640874423074f03ddf5f63555667d50852a4b9ac12aac8adf2f9feca9234def76b2c49a35ae57e0da5a5b4d229f76ba46aa4eb91dc5f4b2eeaa7286bbaa78aa2acdcef3357ff9f9c55921bad293a6b0e8cbe7273aa2a6b2edb0d93337abee6d82d29619dbaf86576f0cb0c73dcdc57791fa38eb3fac599cc6cacd1ff29b9f24767390bfbc57e5fe58be8f87ce73b9dbfaf637674745e25b4e97cc24ecfeed9dd3901cb59ad7e77f5fbab4b253aeabc07bf4c14b0f3358d77807f4310d0f005027294a3d37fd32753abbc56a182a392341ec8f2e5dcc1c3212b2fffd61f65545a6ac16c49a3fdcb8ad9b66d5325e8127246fd8e2a21697c7bdd682b5aac1d8e3de79c7376086ae44f7feaf792ca6a811449c921e950e5782043f5b92556e4fa945392eb732a394307dc0e52b474b2f65e10e85f146564b8fb20f165b8182b3625f501c91d7fe5b7953b5a794ee519c2a97ae6a14a57b5fec69234733bd5df52bea9b695772b7f03f32f3a16bc1de18eb454d32c2fe60b3c592e0f55985fc12f396e28ea869e4cb454843bfaa994e306e657849843b4b88267a97350750e9593e5f792e91137e6fb76e2562d1ac19c2a0a77436d415aacef51b19dfa89bbb6b9bb3bd5a8460ab51b272dca7ac3be0667839c51672bb8a3afb2cfe8779cb7826f9cb8230a852c407dfa843c80b6651efde245ec57c2c63b56dec5cb4f88957711f6cc439ee3c6893b6af1372fef841db1bc78f9f98f177843e12d8537d5e6827980fadb143387fa2f787b166c3f217ab4adb6939c21450aaeffb89d20e0240f85f446fb8c989992e48cfa1e15dc919648b97ea77d3baabf3c54e7a9ae841ef35085f995979f1030e14ae8320fd547a55cf4e2eb6bda4a63b9e8e5eb6b4f48ed04b9be94a3268508c6452d5f5f2b491a95afbf95aaa42205b25c7f032269622e722bbbda2cd7d32b6bb05c5f6bd5af4faa7693eb5757ccbae60be6232d55527dcaaadbc9290ce4a2a551b23ea57e555553957dbe4ed66aaa266a9e4c9f1feb2cd7ef54f0cc1c938b5a0b3254bfd6bf5d865cdff3f2e34e2aa385e5fa1f3c72a42ce6713b4997cc459cca9a5c04f315f4769ba9622ad9d672111743b98863da582e6af1f5b7938b5c3ca875258b8bb9727d0b86e3b52c1749b728e74e95c4dd7025d65da950f7642a91a049f091dd713ab1e1389dc0e0f99a30988b3ae5a1fa2ed76bdc4eb0713be5fa2cb844472cff02bf6cffe2e5a803a95c3457ac558be5e25a2a1096238ac719dbf00e987ff15d0b3c475ccc45f324cb23374b915c1ee63b17788e38a6faf5a5c338a6c931f950bf0596230db328711f06b7bc8fd19c78862b17d192bd17f42f8a3232a3af727d3fd1938750d243342c79aabaf8223a5a3cccc38436455e8480f917af03e65f843645280c0d75c0bc8bd006a6452847303f5a98f0c5490f8054411ac9d10b0d4731575a32d5a7a7fa1455bf7b91b0396279174c5b700e0fd507e152aecf12bee4b8699487eadff4c9e4a1fa3e465df25095d9eb4ab8f347d9792b98892d8b2cb21815f125b2115b162014d76949cea84fffca19fe232d715459c68480e303a56798ba39456d850c75379351ca8af07e4ecec66e91b450c2c2548653af21f7bb12b92567f4ff6851dad24de9c77c326741b869110d32654b7ec460f654c391a6ba054b8298809c5a88740dc6577f5a1d778ac8e9c87589e8913eb5e94913a1aa46c95a4567979a3449b32164da7a85a384c58a08cf39691110efcfc97a06bf3f0dbcb1e40c7fce0be6fd392dde5f7eac915d5e7e94c92e2f3f8ad9e5e5c7cf2e2e2e2e2feff212e60f108e20983740385e982f00e7d5e265c2f1b6780284b3ec2ebe258870c3fe40606d4987fc3dd69ddff803f0a1f766007807c00f201c2d007e46385edc6107e283f829e3f17718cfcc7d0290214386cc1dc71300165fc6f89ac658061e12c477d4c31863eb612c007c8411212065018818638cf10a8e7989ff879b714c38c4012f3fb1f3799725e63b39264638c4018f453ca4f423073cf8894084d643f85fc47002f1364184d30140e070944620c129234173289472c688df6b51bc2d8ae1e390b618ca16c300e0f1e6f001103e0ee17721a62dc278d9220c18e10882531eafd83261188e3387cf24777ea439e665cfe08f09c71e1dcba14a1b422ee3afe91063dba23f1ebb1778e4f25865dce8b5c0e36684ec0f83c74d0ad9ff058f33e5d299b27f0b27cbfe203c4e163c6a62c8fe2ba9ecafe2cd5e47d08ca2bdc60be271e6516322fb773eed95fd1ba0cafe389e011d7522ff70cafe38c226b20fb2ec3de09b22a367ba816f8a8c4eca3e9fd324cfb778d3a6906fd414c02289a934517025153e50923b5952d10326240d26c2c04b3ae1215f73d69879a4244933b3c84186e623c02221cf26e459a385c561469e352687d29e4b299a3f3ad440e40c929bd2d5adad165d95346bcd642c596c1583a960afd4cb8572b54e2d9689b52aad9ad048aad42ce5a16ea236515d1e0a5141d21c314959a3428d79a86121a9be2889bef6a29486da8b9226ea02e998cb38c789c200113d8a18a24527dc51be929033b2703f797c4a1a1b891625cd156ee79bdcef3526cb4536a4ae49b2da5de2d3b16223d530451748a395f7a1f2b2dbe3f13ccfeb6a6ab1ad7bde5e8fe73d0f96d9dbec7bb69af6ded384ebbdf7da7b5fb1f72bf845c7ca835eaae0171d2a2f35ccd1f22c2f3f1e4f4a685bfc7c4da760dae2271ceb839eee7b96e76b7a9665921408419265921418c99c32c81d3c6039b224408c6449459649a290a5004896498020414096498058913932177129d40c741f24bec8bd3e6df33edbd783f5b6cf8807779e9393e368e7f356da693defd9138e36f9135ad534e5ae524dabdf8dcfc7f372f33cf87bcd13da23564e6b6927a5dbe43637da79f9c1f3e73d7fecaac5fe2fcb0f023eda642d7873750efd20bcb1e08d436d1cea2a71478eac7de810cce26eabb6db2ab74ccee877c31deba94f1985e559c21a57a18f82474e19c64d365a23b9ffc32357ca8d47f2ab4f99d018a6b24aaa3735a433eaa4c596794313b1918a0f4f4a5d2db98823eb507fb34c1c59ee97f6823e534a8332e8acec5cd3b64dd3fc3bd9812b9344018bc2954719223a8aa265637e37921c4106a4d1ad42060d1b0bf014e17a2fbf0878ef59dd9aae69ed3bb843838ce51f33dcf1e696a16ea4e1f1f3f540bdfadda8d9ccc15eb67894915bcee9b523e58c2e1cb59b39ec6525b9c71eb9c727d3a7e1a5f9f6cba061a37f012e4e57307412c6586519f4e27c99f9dd2bac565ce1eaf8d066032f18c99fff537e4dd78a724fd282987b15d2e24cb5382b132acbf4b5add65a2bf7f21aa4c5594ff353855bbd9abc07100c77ac33cfbaaaacdacaf33b2bb8efaaaf0aab312042b86345a15c545dd535512e92ac54757d4cb83f1ff4a28c6c23c37b150472ef389cedba69e16873d75a2ba86a3659a3af7525f2a11deacf5686a3b53f523be79ca017391bb6b55be8d9cf9c93e44b008dffb4c53ab5b9cd4941d3ebb7eea06e62370d38f79ea59cbb8bb9b9b043af45ab79756945ef740a2fabdda4741417c8a93dc556d3a81443a7b56dd39ad21f41de942ea045392ba5d28736a9abf3973054b79b9e65122ab6d071c3a52dd29754e4b193fb451ea58b87ec315417036d526b18aa0686ba61516dac725fb01c2fd8ae0b1e13fb71c176b660412dd80bb32859f06021e58acf12952bac588125533cca2a8032c55b4ba6f8882dbb68320b16e9a5f20023c1d01732520b07672e32c547f4f68474c4ccf24596f83313330b225c54ade5e1a2ed7a486a61773a271da594fa2522a74ff73c565aeb9452ca975212b9f3e9a452ca11fc5841f26fa95a4a6bad3f9558b104b4807e8d5a4a352b33a57d5a2b0c0d269c9a08523c90c5035def43bd0b92a1f1f2668d255c5e1214b4ee8d254c2c8ef78191019dc2b55926418109860f282871274022eda5592639016b5aab9235b8a3274a964c2897f4e0880c4e2435ac0105658082099a28830f78e00428dc54e1c714353c810b7ec480086190220956308318461550b5e10446108289a48489ec52b822bb0946ee77cebcc89d45ee772b1d8b1ec09880c24990d24822c10c485082146508c211ca4097a04176ef4115d2335c982f2530320220b4c1084da64095a0020db61c88a005b2202421084038c3e78a3b8a6212530e72b7f7a92a4b052a83ac0c02c9e08f16c1528b2008be32a82483ad16c1cd490685b408baa3b615911904943e4f260f819a8b73810fe34c1b49065469b10c7e0a2c02e5bbaf4706a52649731fc509e152330f81cfb11cce39e7dcef7577fb32bb9d819d70b49df53ab3d6a4816ffdc1af338d64d24e1a0a6c0e1e3922197c0f95c1f7fef328be29b2855b9316c196156d93b508defbee421ac5db82dda6695d13d2330e76dc3d04d93bb7dfed6e1b776f3b2cb33be7debdfbcf693b8edb669a900c72d807991d7ce9a445f07a087cebba2fdfe25d7eac605d59e790f4cca8a572d7f57326093e87029f4b11019f33023eb7029f3b023ec7029f6b81df713a0582afa940f0b5150bfc95075f6bad5cd594c15f015f7bd5130cd462147c4d06822febb39e3adc4dd5950d3d9ca18be883960b4f2ea2e1cb8e95a7bff2b4e5e9b73c6839e178c1af2617b580df12925afefb0f04c177570b482908822b2008d2186dd233fde053598be883752643e083f682bea445f0f539c3c49c8903c29db81577a445f06f0a6e85812ff0eb12f09d488be037d6542d824fb166a443e03bf8166baf1641d89599fe1c993c0fde074f2047cec4c120837fa5b8236742d96ccd1dcac6b17673e74c9eba2a5f977408fcfe7aa87e83abf2634db9e8d433e073407aa67bf039f0b9203d631f7c0ec5fdf648d44e735cb78ff289b59d6e3c727fbbaec3de1d8edcdfefbec68db0c99c8ef34678e634c06bb1f39c07ff4671c1d76a20b594a4919a0e32f8526a40c8e0832fc8604cd633200882200882200882a0b728088220c8f220e8c177533f0882de83df83e077600bd802b63c0882cf75be598e0241b073c173d402370c04bb972ef4317201822008822f2dc21618066b2d0f81ff82359687c0548be0af3c08822e267bc19e42b29c445a5a58405e7b1f9da6161004bb073bb0033b0d044110044130e5227bc10a82200882a0068220088220586bad55a5fb0f77c40d95ef1ee44e2d82ffc11c9016c1ef30676a11043f054c81dc4af8b2838240537908047f7e5a0a0f59f99615fa02163ce7a7e3fb95f07aa8f3b01c813a8f857bf0a70a74d041074110fc247c8cb49587c0072d08822d0ffa223a587ee55756bee575ac7c4b6853a457c0ef50c7ca83c05f097378085c0157c29706c10641107c2da5025f5b81afb1c0b7d8832596f6b6bfec381c0e8763ad2a83290f812fe50cf06f91db3d0782a90cfe4776ed8f9c2983dfa816d233280fb2288172bfbb1c0e27b42f492333f8175f4cc150031c140fa4abb972689d31dcd10ac9f7bb20f654863b5a23f9de18dcf9d2d421c39ddf75be70c72d96ef77c870c76d49beaf16afbdc9f73b239b6a6be57091cacfb9f233fc19446e332174e6a1abc138988b68ac43f761353653be1cca75ef2cdfd756a071924af296781c71659215c86464b79131aa1c4ad274339cefe7549c919e994fbfca3c74bf9b289eef3c28282c4a5cda7130878222734f8e86a237393a396ec670b99c60a2d5d17d8ecebf29527251a7b6fcc1bf7eff6be5fbdf77be8a6f8a80e1f6a4c54bca2e98056bb8878c6c492ddeef09b72a6914ea5c9551771a6289203539fa4a7a86f6f8dc9baeeb6847a787b9773c6193007372a174ef393cb7e0259102080a9d1ec7a445ca85466cd97bef5150a62db578bfe29b226355924546c13ec84c43fba3c56b6f5e2b4fb8d743f7ad87eeafb82eccbbf8971fabcb9dce178fb3a2673c8f43b528e63e97e288dce754f7b9d57deec87d0ec97daed5339eef734a7a4626690249becfb97aa6cbf7b9578b38a3fb5ea7ad68ec0df9ded75a2e57becf9282d15918f27d2d564b3217dd147143bebf916616f20543bed4c5d159eafc8eda2a4567f8361c2d4ad8610d5f76b07c7d96af2e5fdfe5bd70b45de86129bb842078d1d17997ef842f2e21c9e565861eb37177b984353c44612f3bc0fa4ed0510d5f5c35f2150bbeff6318c951c32e6dd2223ae3ee779f5fc1327b30ca73b866152cb3bbfc6e7c50edf9fadd708e736df5a5bca773f750db713eedbb1f2dd6d2e70c2e4e09d76af13e878510c9f7fe4dc11d6b69e61bcba3b6aaf3efd7efc644e58ec3da9116efab604d498bf737acb9342b5abc4f672ed258595b8157dcd1584b5dea99cfdfaf3f7a06e5ef5753cf74b2d5a4b557f8a344d2de8f364499a6994039acb21f6d704219e9bde18eda8a13d21cca48be44acbc52f44ccadfd78ed8e7501cca4555e679ee9a92b2a6644dc95ca4adaaec3e873b73b4d56aa5ada4cfee8c2198998367963595af4b27fdfda3c59e73ce39e79c0da46f5a6c12074f960bd42c8741c7952fca43f747be372dde20f96eb316af2b5f24f9b25abc4df20dd2e2a5f4d4e255b578eb859daaca435aab963a741f56238f5d6c2663cad72be50b03d5f03cc7a1a46c5df75b17eb6292a6cbda7bdf3df1485ca9c146690e87e369de771ec7f3b812c89550ba98f6842b712717552e35ebdebe0fb51bbd9bd9131b6e4c366d8b79de938e2b755d179b1d577ad27583dd60a374285dd7a1a0a07050509ec3d9644f385eb839d99acc501a09b5aaafd7ebd5bda078417aa6eb62b29b7924efc6fbe1993c20dec943a174874aad54ae958c555f2d55becfd2a42c34129d2b90e37d3542935024945da1ac7ad5a928899662335925b95e2827cd668beadffa92a17bebeb72a5cf1926ee625d934ee6993c202d5eaec4992e8a2bdde77e5c212dde6faca534221dba4fb1a64473b578512d5eda33aec4755e0b3a2c3a3748914672af075e9119e4dbc564b706500a2e09bc263c36e56bda5a8ee32cc7715d93162fa52bcffde8d0e54a37b82b1ea9eb190d78dffd8cd739e99919c76aa0a6fdc6e16c9ce5705c63ef6bbcbdee6ecff334928bba9846ba9faac5554c054bbd50ae53cbc42aad542e6aa24352cd523254ec043379e8bea889efe5a1fb5ec9454d7c2b0f758ad029829c71df158e204ed8c4d7617577d861c919972b5d201cd77d397a2cdfbf51d4972605e930905a0fa4280919ba7f3531e4aba1aec8f7d6c00ee122215fad09f93e95b1ea4dcf8c9d27d01235d153cf70fe3e0d22446564c552f2823571f2c44bb14a9a39c94d7e42a5542b49d3ac96eb05934924e4b16745c8f71d0832012e5fe2ac582c16ab937531cf6bd2a2b9ea62abee09ab739252b1565dac14eb64251735c9de52be2e2ea096efebd48a9aa726a13c0fe5a13c14ca455dac8ba1ba18aa8ba15028146a9eba189da7539348f7ae78aff233cb236eacbcf75dacc5cb997e789c902b75b24fd83529a14473b542ad50b214aa3b4f4065e1b2965e9f2b7b5bd528142ad58dea46a152aa159782a5fd4ea150aa52174395fa89933c9eee625dc77523d64918b2654bda0928fdc893004ff8a2c3e361d1def443d3bad3344dd3344a5febcd4d2d820ee48654f37c42ce004ba70dc4f3047206c8a3bf2f565fe5e527447d95b06b7a87ca7f54feb3e5b8f152beaab27d4d7f98564c553085f90d6d823c00f84ec88ce8136401c0a74a903980efd59887c0d7306dc919e07b80dc2d9c236d6550ce005f8a0bbeb7dce52a5f81ef3f1afc86813455df816410047b06f60c3c6510ec12084a2a44d2701e9c424a23f0298a96662e7a69f069ca3ff80ef31768ca20083e4d81ef2707bf5ba9f1da9f97a6e437830c36e8c193054f1c2e9a60ebf4a2282353035cc1f3e321943054f9cf17d191f29ef7785ee575785e25b42972c1f784e0df5087e73fa18d274c093d0f5e19f086468035e669a2666aaaaae9be3aa37ca7967eeeed79473995d3ac7c7777b71ba7716a473dff3c89c7394a29a5c79de8fbc84228d642d7dfa18fdc43469ea717991f5f2e973b73720d6503b180f66e209ad270015d337312779f4226912e42e709c39d4f7bc8c8720a99a8ce16ee903be7c9f10432c3a049a955fca24c0d0fc9d740a0cb71e1b8bd0deb6b6fa588bef65782a4a85fd3de5e1f3404b43d08772611816a0997de0074dd51b2848c9fa5a905f3039f70a5e9e43d864ec2182711524a49048e8f723809b2269eb1169bcc2933a78bc4c47fb2266bb2266ba2501305ce399148c2c66b7b826e49cf70b09eb14c6615e40e5512c0b72b489afaf4516a7238e847f96a79172947d95a91a08f4c8b87b19cad735a8e1ef1958bbc547251c752feff128e0f7269018530104b3882ee4a385e9592fd84a3bd29e1d7dc5086602764b15ef66529a55ce846a61223b5d2599b96a692ae452c168bb5b5b405ed60f01c75abfe803d0d268542a19c349d2891cd26534993ec3f5fafd923cfa9a4675cd30a67b5340a123a0963a42459cfd8973f9dcc19480631c81d3e49804fca6945965349963f91b448f450134943e71155732fbbf1bbbbbb5f6adf336bd33ef1598bfed3e422b7a78b02b5548ef2d07c7d09344977e62810e85e0b8b815e2b37cd3ed31439b3dfddc912273d505aabf6d2c3943de3b5d512a2478eb2c21d6d74f01c39c949f6a9f603ceda779cf71c9df63b1cecf57a79af40af1aa289689d6a21a38decfe6dd2b4368979f2c8747667d95f7e7ad8a821813ae83a649036b2ec9623e85c59fe922ce50c290fd00569620df93367bb33a94ebc9b4265429229a8483245107260ade5b829804c21a4f1144a74a019bc2f2491620a1d2996002691a20849a4d8811442f2274bb9822db8a0e7144ca670326777276181ca3d5926610109681216284151a092a5118a9c92448192b2d65a6ba59bbb74a47039cfc3450f76fe43b12e23238aff8d12def73c98f29df0f35f38da9c82a50c79f0667ffbec1a0f5964f186d003357bd8fd7cfbc1b243f553f0104f08eacf36b3e743376577b4afe9295f95e57378a42d0ee1d289c21d65ad1b46a24a7a9b13d22161b528e72412ced4e7e25880ec26cd7ecf3d65f70cd2a29c3e2b0a4228ba29a9745910d22767f4d3cf8879433e0b5e49581073775a2baa564dd392b0809584052ef99b13aad31dad1d6d67ea506772d5e5642f2769e17f6239fc1bbec2f7f053c20f7f04e91043e466dc136e0d6198833b3a8989f0497ed3333abcc7f819f1fdb5253d03e3fd3598a4c1e1fd35263db3c3fbff6b5a903be0f7ef426c3fa63dfc6327be7c1c7678f957d2481a1d5ebe4ccfc478f99cdc017fe17731989e6e8c8f1c7e87960949133ea8bd3c548371f81d70021ee3d1c3c0471831b3c83c3c1236e7d75e2e72d2ed70c0359d0e78e618587a88270f7887a71907ec11f1545e1149007f2fd5a27bb3d7e765cf5c1c23a633e11831b019602d5a80c21423067ba69e89f91edebf3bb9e806c9451c0e9f12f60ccdfb7b4f3e52cfc4bc97ba41f338e06e49b7e5b1bb4212c03f262626a67b69af970673118e77dbb9870356000d9639017801dfd5740c2c47d803362be063627808b5d702b0a600ac2da11d0f4eabb6596d89a4d1e1fd3b8ed379dda700acf1d0f9c04ef89d1cf2c0830e61188660b64638c22231ff12e2888187e0781d70844978e8064dc6944422651df0cc3c601b131313e380988e067332ce09379b4e6874c03377524a89b114dddd4d29a5f52473c7793c602ed7e0498698989818fbf930c990a59c81bff3bc189c9947f808246e0e5f4a02849fb1076ce6e1bbebe1806b9e0673381c4d8a108bb8e6252dfacb300c5f621cbe0c794800279b3b48498017efffe2c7cef43362e6e99233c2ffbe1b312107d6220de6bc3821ee92cc45da09bf188e37e67108b98f175618b8e280eb4ccef0df01d7272dfad3e810036bb016fd31eef258d72009e0ef4b5c18303a0e67658b5d0c8e89994cc854908ac10d60007e59cf8c2dc39c4ca55275a5dee17b0ec32a6bd15f441c7efb118a62f89bbff66a916c034983692b9041f6d7622d7231f2d754b0cafe9ae6bf91b615c0b2ff661271089de4a21fdedf4b2ef2e17d890be3470e0cede422206242ed84c3f16620b094a1f071e0100061bbe40c181fe2b1abc830be652ec2f1fe55e6f91f6d0e6587c02c5c1c5293c854f54c8c0fc50f63686862626868626262626262c2a73d13f3e1db9eb1f1e17b3d83009aefe6d4e17fb859079aefaf079a90d2e8f09e75a0a109658b3131587c046051fc186fe367969f0dd106165f6620bea6e723008b6f03c7f818dc5e4c4c4c4c4c8c0d1b1f131313131313d3f968be93696262e021403c10df01816f8a0840c67718cb90a1795e762bbbd6d25a9a929e89797fcdd5221c2ff2786438c83ae48fc377aa39bf1ea6d73d4c222d8658ce14d7ea90e3ef6cca8fd3fb7cca0d8aa9576362f0578c3739b78d76b026b5a9c5bce7184c318a8f3e327e1c6aaf22777ecc873f6a9df1031dc63677b467f0e7479bc3972dd25e1df20fbfa35ef5c4ef362f061f21feb665da33f8c3f0e57723c66b2f6d8906eb50d831686862bcc7881183e63dd3c4e81822e69cc819fe188f33e3aa6d9e56376b3d8ee3785c2767d7712467722c98853b6aaf188c0373b3cee37c37bacef362c410dffb7af83c4fec3a72763ab4237ef29b5f8cf71c231c6db2d8c396c550e2113fe7a445ff971f68167f66311c3f903919ca1a7e64245a0c7fe46431d8881090680e1f639aa9a491397cf9fd80c3772ebdc41db597f6faa4fc3e5772afccbdba6d02b12108839c9e4b870af2a5f252be545edf59271c14d2084eca76ae898f28a8f7a4744e8a43677c400e7d4dcf18fe4923c6f8f166f1a514c3b1c727e39f4c54d87037583863b20e3549c39d79f466a3d724fb7f3f24cdec680630e3e777c3880ecc2c3efeaeadbc6214c4771ec4cfe782086d7e14c4c7a302a320c221fce3e12306a320289863bcfc8cc099e66bdaaa20d38448c4f8996b3a463886c094435f4308fb1ecc45457278ff2e074c5b8cf131c27912f17cb988f332c0eb9581c0de930e71dfb93773379ba9f1332fc2a38f2c7afadd107d57638bf15d8ca7d9e1317e517c1d74f82e468c1a58871821fe951831de07996384e2ef806968b08fac039659ac31f3188fa03cf3352ec253d6e24c2853be226501522b1fe3453c7eb2f831c4c778ec91f1f777037f8d8b7832c13d3e79c64c2ee2cc646b536adea1f1229619639973c0f2891b7a8ef6923434de0ff023c8002c056091f9f16610017eb419f47a29451cd04f1c7ab31adcb133b9c83a938b82780fab7fa804cc1686518f32443410000020006315002038140c88c462d16094859260ed0114000e809a4c7a529fcab3308929849031c410010100000000180803031a2603ced34b123224794f30a48bcbe4522a83df8ef5367b89ad9589931a8ec78ed69e01f306900bb9b272a047d6a7dbaa199c60a8794aa9c70749e41c980e9ff1445b5adae0d763e5c518f4537e5ce1f8a7b339d050c627b933bcf1ce285b1deef7f4081688ae508f2779e266ab95d155da6e5519d7e7578c5b62bc3c31a5303737b3126f5c1b45e2e68f82a6378eb8ac167c5a902a23b9cc5442cc84a2756194612ca5ee8ab692c19ae45bbc32ba889b2f3efaa2e39346bc74a42a669210e2e634763c0905c213ec51ab71d224e58ebe66cd28d822d3a821582a68b8d1498bd86eb4f0874aa9b6121ad47d5ec7859aa68e04740d2e7505000c4a248adc9dda95156536c1868a0a049809760bfe29d24eb0efb52df289e7562970085e7d4d2514cddc400645c4e290a9bc023fe09f65a17975fa024918e64b0a3d6c7ea56b24c8a6bd764fc3293924df02d9ebdbc269784873e98bf4bb20623b63d7047b57bcedb78aa32ed71edbd907639f9651da25e7e8cb9e2f3d1d4ba7ae0936e843429c1aacb832e55a9f686aedb74647dcd42135e0b2b5fa0f233828809a659a9db509366c846c39b0e4cceb8c136c11c5fc9a0941c4cd1599b0038fd5dc27627fdceb42fd047b80fcba971f137830f4e06d8d9a6b35c0a9ffc4560e5661508da544c93c796db218f4fbaa64b2cb484ddf471a2eaf38ebfb90609f40a957126cd3885924965972fbd8182873870252fab06fe37b1606682453b4ec210ea4e1920aaa4296606bd88a5ab9a88947090ab624cf3a4d70536e55d27a88f816a788980becaedcc47290ab4a412f84bc9ba43f7702a4b37480069d7849145b04a4c3cd48233515f4b985e1664ade59635a6b671c6eae5604cd4667e2f61766b8b925dd6d2427d8fb7279eb32ae128f3b77ab259cd4dbe093731f6f0cca64c64649511329d3ff11f39ac9adc67a53bd1508167033cdbcb079362f2e04efea8bfe3fd0ed24ae91508f7425914ed31a2dabf60634692e32fdaa9b1d9c247d5e7f849f6167649f4d4da143759adc102932cd8f4b9da621e773aa5faeb3fc80759a0037763ef77dff576e46d7399653af2920d376bc803a5cfd4f63ad23d5b34e739762b2592080cb788338ea3439451fad0f3af9a628f86426c00cc85d28b55e1d55c3963207b03a16936472401ea2c4858094b92996071a0e17e1ed27b15495b79674a245291f380a0d743b8038aac13c9598ac9d771e449828efa2bfb81c02af263e4d21466367df43702ab6d5587ec6aa301e4eba393784c6104fcf66c8bd697f2a19d503f29ddaed2be266e03342e22c2a805f3c4d799056701c516302a43118bbdff8a21edd0585eb2d6385c690a121c00b4b63a8bd2d8218b9b94340a7c37924819e53bce73da69246841add3c3672eecac649196c0eed65a41f44e8196a7d9535b52a05718dfc81e508bbc58ac2f90591ce371505adb4b1dfdfa486c50fb049a3c93964198737040c831d78ca10ee1ea10a60b52a78996e77c1bf40b132d95853aea682e981d56ee6baf4fb18770cdc72600fa8db337822cff220fa63d521d356f2c841ede692ce48852f69d8e7d9a45fa7fa346ab92dd4ee444eb09cef1027edf6d18fd3e389f4ce57ae6d289e70328880da4d2b16a7416089fabe54e862e83be9ca8a96a7f6337dc912724aeb751426c14af1cce2d919ce83d2661fe3f210156d00f8a7412c3e2c45d0eb06f712ad498c1e3c304fb2f776eec0e7c97af1ba97593d2dc273addf1e1d5a91979229170bae52c6f1baf92703e62d3768e6ceb32ab2836f6ff26b53bcad7e85135e77e617fdbf11840466458312ac9a24e71b2479dd6ed101bb7955dfdfffe6c47b3d85d0cb028cfe56a30df6e8769c517b7071dc6a40334eac2cf803e14c8619cc23c741fc28498e514e5137fe9ff8b1fee1e74b094e9c3a3cf3eb0e970224ac5f3774904f3c3b39d4e5ea101368ebd9cf0280403b1c4759ceabee1edff1064421b0ea760c0ccff5af7c35ea5e5ecd344a06db2face01493cc9ddabdbd5c4a0b0e9b1584c5ffd743c21047d03b6e2e49e6a60c8b95ab5c04e664e50ed009f8eab330fff5b4e3559e5dc4f0c2464cfa0b3be3aac2d1e44a438033d0f76c4517e7280258fa52262a887b27a00080a5644a93294a2b27ab737236f3e6fdb22f99000f82c8f402febafb8dae2f82bc933b21f046a26d8ebf4852ef361e9135c2cd92c95fd7059dc33787480daf8152d7bb74f907fa8b30c3c2591c66bd958ff6239ccb4a904b3e3861e26271847f0ea4fcffadf5e8ae95f10af90994e4d7a1ca8f1b1abe0dde63b9bf72fd810fcb10b8139e38413643005a732d59ddac5b735a94d0e874cdc204e6668c78eaaaebf644d4b9817d16c6337354bcee5d217e5236c9bf777a8d1b4d114f34670ba4eac3f25ea7be17dd31ea23648e1314cb6a1d9979c8f5fac5ec37bd472e07af73c58c2fe755768840aeed3293e2f966681c760dc1cb59aa57cb471d4faf0c3e20ddc63dcf0a4f8dd40f60b22e25377eb3a2f8918921709718e16dc16f950df64edcb18beee6a484d44081a1ed856b73c4d061b820a3ada3a6635c91a8b5a4450304c67c506a2891085fb15890722ac5c788ac1cab4609b3e5340d65b63207391bf8a941fce41d6f8282c0c33e6f86b983253cd22dda1d71fe473be366067094688dbe940992208236f51359b70e8757a4defe9ce87499c98de43fffe1e70c1194dc22bf43c4f829543960a06c93ef90732fc0d99c91c91c00c52c2440e464e2d2f8406409949586f23f2b77cbd4c6df30e4486a61f3bffe0584a76d568a9dec986b9d07f1a223980aef635f6fb12b6822810d421b34a6164c683cfc187c38a8e54ac571a6d615514410ac4b384b13522c580a70397c8a9a4005f22bec57ed358d19b9aa68fcd47641f178a9cfdb75229c084334619bb51a29f07486af8653831c1c5391ec5c05e8b769e014202125530fe952e6a6850718c616862a5efbbb2660aa6b064b16c4f430d960754a60a022bc86e4672dd3e92236a783f6b1cf5194a6b28685681d0f96fd4a473613dad32bcbd4a65d890e5316571c16082f4da2184409d9b313b333b4757a573df7a333b42d93bd3a0958d555b8f12e42e50ac78e60c1037c61b5da99d0ce1ce02e0264fc932613693a0d26c2d101082082f7121517701f3a4c14fa01e32c69b6bbfb99b08480bb694ccd4a1b1965938bd59ca38deb58b0368239fac71c2804da42444645a04560036118e0ab298d279cc8ca898ca3ad0914b932ac94e9e4b20ad208c8b5e565a5c8ed8da4ee2bda4cd3a9ea4f87aa710e05ccfde9805bb80694e966c2c1561ab7e08542ec7cb7529d90f04a2ccf20249947428f46a17507e907fae42a1970b4bb1d2ec20931895ea220a30788e5000a845f3b8c76ed7e55a43eb6afe5dd5521e0ec412b4b8cd28b716e4a0e29858676332564cc0bd2774d98e979fb612f4bcede958eee29195945ecb4a1651e9924e3d3eaaec5b3fb9ca30fe20db94dc695eebe913c67d0024399385b204c48ba421d8b7e100b578b6cd9ff58617f5b0d91ad52a80cc385560809e135630c097561b7c65835cdb687561f7566c856a2d5bcf36797fb710126c10947389131c55361b7fea5b05d1a9b824239ced45a6cbfdd166820e60630fa5f64dace1fad63671e03d83366eaad97664360e404bc0323ef9b2d9bbbf820169053fe79580523d77451ae8cd36adca59923136482a41ed4ff9597c1069271c6f79134cf3e5646d499dc52852bed5e764692bc71537469dbf8958b858fef8bc2c8aaf166abdab0602dfbe0ae58422058a8f0e89561f12fe60a7052732c29481acff5a8d9d17068b8d71d0f3d861ce42e1112e1f52ba0f87be967914a1b3ba3113d6d38df16ce7670d21362eaaeaa4d46b061aea6126b14f503305107fc82a4ac7f3a2ff35df538659473708c6281c0ce46d9bf833660ab05660d4ca535d9618c61a39b6680115fdac0c24e591bea0f5c36b6ec058fc19f93000b018040530b015f45cc75bba79d34cbd607844736983c98247ef9272584e067302517a3d4f53a50fdf3f6304e490008ca771ec6ed37a5850622f79450a2ae44a056ace85276c15951cc179ec3371a2020c82a88a7002d1a0bbc380c6373337bf4a20c2540f7d3496c636a6dc014ac8b94e68f5cff7a703a1e9af36dfb3b26ab90340f12053afb7f10c5331a65ca6b006e81ea27efeacf2f646642fe9593f95a0b22e7e4e5b05d0e35e00acb4a6a75588260fe16361646c5e6e3becc30fe9200690fc6fded6e1aa5bad179c707abb1a3d5a36f736d664dddfa590a7ac69a2baef672bddf56252000e3062d96f8fa7eec5b0fe8bdb18081b4e443c599d01e81abf939a18977be96edb62d1196c5d3676cb49981181ea3407bd4f6aad989a91db84ad44e4301bf9a991d5d6ce952c28b2264428d7dbedc0e82d9ae907c18abe883e68b8f9c37fd87b4b6f19ebc6de2b88a3e57448c594a130f21d7bea75efb564da3dbe2ec6e7dc601b4496b58d8a9600e0571457f6205dbc6c25f0d9cd47d904b0d1a542aa7a4e2d8e2735a56d312d3cd83626bf23b484e99c67dcc4b13530cd39587b9878488d8011bc9af2ce86e6db5b85b54f84bc5f409587089cdac994211bc26eebb9a0fea47e4ab5508779e5313c7ca3b46169a8b7e1b483694dd68d93d01e4e63030eea027048bb6122798dbd6f080dfcf46c8e774f76750fdae4b01342c813f58c194d81a1dc8ceadfc0294843507cca1c11961b2611220cbcd227368aa143588263826de15fe952b120cb5280a19d1dc0be6b411a47ea574ba4c945e7eebf4610bfd14049deb435c1d764b9b832781d25571df9aea2006dbe5fc91250702c19910c27229eb7ecea621c18aeb5b9f05e38e981f9cc781824a341d185b4c607c3564a5257be1f8bba4d1bf52510af6da1d8d5066b809c3675c2f5c2e68f762b830929083c889bd387a13201821b9f376aa57c34efd5daa7ba6014e9960c70e1de35736806c0305b17c9cfbd0002dfca06f15523ddf66015b6aa43bf2f828650afb213b670f46e0739b61ab1012c2da5143f68dcfd6edfd578410590e190b3331cf7abe114b878f916eb522d383e66393517dc744a921d32596b8bb4f5798b98b5a05e33c75140c424292e16a7b39a5c4412977a3bcff00287de27b477c3f25737112b9f21bed3681e0b5f676ef934748387881cf59d46f9d710e3aea57231063e029a0264dc1a1265c431900514555df6d1f22c6f74fb136f5a32c4024cb8a31129134a7f098136e3a7d9e502020869ace32046de0d40f2daa1c4a3ee72c52e31b2417cb443d51993175b1e8686c447055728757ce02b729bb0e81fdbbef1ef3370681c49837f5bd7850b7ec04212075738d1361d9fb91bbd14b1b467cd19341349922e3ff412d50765856cb2e125db68de131a2f54f010172f34ce27216a5b1cbe4fd89a4dc5f00acd728a00bf880d4d5d3cac0410127158dc0542aa825bafe2f3db380e89de694d9a17f90f4641dc2c565d9295fc09070ee377fb56b1fc95033988cbbfd90c94618803ef5ecafaf1541e7b7fb2bef1f6848ca099ce3d28d506895188d432d56ff03c02bc296bb1ab80507c458580b93f063dd06dcb0f86c1a82042a588747980d1854aa986852d9616da296a8f420f43ffc94a1f312ecf0f0fc7651e6fcd364c66e2cfc7967b9a2a5241c14fdfd5a56519f0b5954aa98336f1fb93175a6fe4287d8df133c04b0d93b2251b654016b95078ef8e8a813573323b5cc9a5c1f791be06aad9219ac5c013eec2500cebec2156b142b5fd15d076a91c6ff91cdff5101c56ad880eb52c209bdf986da4e310abc45fe23d864e43c5094bbf61dfa91ec6d1adca091197129d4a97557a7cc81b2faecdf8505e04317b14130de9b40202e83e60b17fe7ff6e506530bae7cca82f51c455e3a8f946fac5cf4bdbc2490b325d13208ddbfac45c19f57df5ea512d67ca49cb1adeaf3868e8c2bc46618b9f565deecff0814377b09ccb291ab91316db3bc03532dbe7bd037717259a603e250070b0bebab5d04c3fa6516fb58820c1ef4efe80a559efc8e73af141c549db86f3d862408516743dba5c141de6e49d0a0c91415144b9ab0fd52828fbbb32f464a06fe6b23a6f3afa8d55f52e9f6b300db2edc6b85105726e68698ddcf68a79342ce6babed5572fb4c0aba61f8f9dad2c89ab86518f66ec8a7128c31276e0106e76a36548ef17969c9509885ccdff3e2cfeb38d8919013a2528f5eae41dbc361ac8c86209882acd4b2cd51a317e641fa901db68054fd85b5997e8b304c8499bfc887a5a0d78519a1410a5ca188fde264d2f586cc9747401030554662f1fe7a5441255dfaf0a197143dcb05b3e0607fbe27280ca7e9fce4973870cb17b88783a01f31eff1dd9d9123cce6d7ab260135f0b5078ff7c1c50b9f2e7d384097cef5d3e5fe46f27552acfd5ae5f729b3c01f906311412892ad357f6c633fe45e8d7979215e6314959f1626cc65261a35c04c74d37fc458ec25eff7b6fcc38c7040dbf4eefca6dfcc620492e868695b0116e64cda9899cc9545c8a0680c136219f801e073cf10d0c531e04b05bc2cb0e42815c6c74c32694466b7739f31c998faf532428b414f6e5cdb26c9cc4d5cda875fff2e41a34d5e1c22304c084ee48dc41cd4d5bb105e74b64e72ea016d5f3db6a91389295b2d97649271ef1228d1843d25498a80429f83acd069e21bb8848df567b5c9bc9985f821e82ad0b6f64abe2862522ae10672f98c587553436a3a989f36feb997e21cbbec8c291e9b320bd97207fb0386adce7040548ac8f6d1cb08efed8c1963c85e1f027189c1fbd133449c2f30a6208aa325221def1c76c5db978c9535e9e78459fec4dab8523e7a5e6540f8a8ff8db9089a810088d8094ae5e6b22acd2443dbfe7333d57f0a1d09ae2448c28b8a8e77b964ed0d911150d156da11856f38e7da13614d37fd1f87d4d4758d8018fe1292c5bace473bfb3645f69c430ba9729019a46135f0eb8dbc56591ca00880471d651c0fcd57bdd500d799d180197b96385e06a293bfd590b557b9133048307b8792fb060d26196d4a05b40db1e7fd36351824c9e88e09c1802443ff0f02c8182dcf56ca9817dccd147009bb6c434785e760ddf09a811ce73dc5fdc048eb2830b32cd816410f66227978490f293c9b7692dd2c428463966cb0f87e41a4fbf8720c7c91e46482e4bba415dccd848d6a4259cbc7a55d50710ad5827c08066d71d8877b91cb5d37a19b3bf74dd58c8fb1a024410fe77f3bb6e80516cc2e6c1463581afe28e1f169ab106f8925d0d21915c1b76fabb661604d4a87f56369f7ee37a99decb3621f483a7941622a184405a0c9412f8ac58ae1ce8d0ca0c472283393fe39c1bf98f69d694b78ec89a6ad3fb51b2d4b959db6d6d69c93905fb97ec1c734c38d776800744318ed6b021b64b87d888fafca0534b17b00478c92504f4b6764848a848a4673a32b9d602238c62b74805fccb7275e9caef881a34d2a5207659726a67f230b68de20a9ed47232c7973ec71507560da7a634952b8df7f70a427e680e4a203547eb81625a028763995d0d01ed27b347d2cfb0c5aafd5d45cb7136cf444ad4ba258b7f08055af3675df93797eef1f717cca38b3eb16786b7a6b687e5c546e2145410c8114f5101fc430ca79c0236a68ccc75d6988a1d1e6ef0424d26f860f4bc1b2e01565ad836ab0ca82cf1823c5fcedd22312db2f0dc2e865db881b7520d24742308dac5dbb97c9a9d3bed88cc163bde9ed0ecdd6966b7b3f1fae82d4249ce6c7cb87cda94dfea38aaf508f0daac643ab9686f515262430e41336132cdb3c457cc588799ca99c6c837cc895b1eca01f5aad9a73b49c4ddd22119f4134911b86191334f8979e7a598201bebbdc720d0b354778b19b2de0cfd574432d5f6733c3dcb77f9f42a973aaee73d83b90f4541ccd13e5b68c5d2e885867d1f40e1da078518cf674c46a053eb29abd9b731cea0304a64abf649f53080cabb501c5997b407e0624c8735cfb74ac34b1bfa0adef41489379b01cd846bf5247d027e0f0d1d108e2b51b74a0bf903d5615c2e4d92c7c1e9899f79fda4ef7ed391d40cb08c1891b31e7a5b707430491c50824ab4da5ef3c4e01294ac0e7ae70c86d4a141ac1a1253f9ad14d3f3c2c2159fc4ed44cf93190d6a0de1b7eacd9ffe28a0dd071edeae14172ee6dd8c6cb34b3f535aeffb1b459fdffaa1dc20f44e9faf921810c342cad115a88e5d6c7a3c145f5637db728e42c0a54abd993f7d8829e2abc6a68d4d8842e5c9b7861561b024db1879a7f3db7be6b402d0d91ba08440345440a9373794da4e2d6d87b0a0dec430c4680c0ed9c7b45b61a7a94616451896a4c3d9e4b395a3d10a4e9b17461d78e0aa28899372fcdd57a39724f454a671ded3dccda776a4ee52f4b3370d8538b69ea11595244cba65fb48227b6f3bd4db08e9bccab656f40b7092ebb16042d523b5ba13cffd0a5d6a4c394378e8e4d332f51add506e2c5d2120e4897bd7ea02c2398336837eb8b4b534485f5aacf110e9e5c658e6493e07255f1a0d830d64b45e7b09ac6d4436031c5892c09a076516814204a7acc81266a28a92db648fb78f0dac41511f9c11fb18b3830bc4aa9899c9a2c710afefd04c0c943d5d9b42c4326a5a6f885f81a40a4cbd26c8ef8a2d1d218c3e9626844e94d0dcbac1e1c72a6c551b612d273945abb244fc32787a70ccab1ed48fd36b637d8168192ac5565f3dc641f7f26e9a9ad4b51afaacd0242dc4dc7b47dda50d3ca4da9103a04bd3253bf7f19aed39b753a038f86d33b979be28e7c04862965cbe6810004e0489ce43cdb757d0037045c03071d95e5bf24ff06780d0b498bd9dda9e30489e5a9d0433cb2331df41369955c714fa3d7c1d94e34adf373d2b9aef32d0c942c6ab7ac22ad331474131421cb46f9d0e0cc8b23060a3a5a05bf391a03415c950d088fa78dd4240f98981d4d039c04dedcfd3924cf5c5439b9001d206f00f90549ba6360eb77106ab38db5120c9dc206ad25e414bd202fc366326e09a5abfe5cc60035c5d413f3c4e9260c7ab842cb4480dcd75a07c049b3153503c2fdd16009b8b49d1234e0c3b4bbff4c47bc4f01abc6dd7c2038856dff589162e2394c214c878efa61f170b0340c792efb0cec5c1184e68fbd527b510fedc875a20e059d4a3d491c2fe3bd9d1604e8393e0f52d03d9b454a928946877188b6eea41c8aa9419ab2fc5cfc39c75551e36df00b7688e0ce444a94ead1990a1b95b195608d18162318a2a4df41cc86520ebfa668f815f9edddd39a20f08da38368b9ae6d5781660f8b720f8d4eccaae88ba6ffc6eae27b8d2032740f7b30c4f2d716fc3f0937a1abc806d4d9519038e9625a75bf532f03d7ef14b856e44be9e0cbebcd7d0ffd5eef7963243c9dd72c9dc396f717c830778bfd6c2565e6e82a7dfe26857661fa0972295632472ccf598e7f9dc49cdb2ae11b98543173846cc7df0734ce28fce46133d9a77862f071668628499a3991c0aa333d3fb372045aa3091a3a47aa019590a42a478516ee19e836300daa33dcf35c61da2afeaac626f9f7b6137bb569a74e30bb2b014f6aca67f8c86f15bda0745e75b47c8dfc0041c6bdd520427bc347012be0ae23dc243be828779598268aaa114695eac790caaa6b3e83565b623eb24ba6e15d21abc09b438937c55cc18b94011bc8a428c05c651af236af2988ea25fac2311b409407608484abba4a26c5628da97e05781e053348925fecbaf4d7b4ed3a1aa15cecafa5708bd93926ee722b0bae9e990d9900c80b288902931fe60c9e05d96b3900b69202b0fa6e61048e184791e8059d1a0ecedec53b72188a57e3238bf290c6bef284cc1db8fd394e075c887d1863238d16822fd288e6dd505b19965fabff746269e4c58c89520d9e606b717f72b663006f59e5c7024796fedef01314ff07726483e2d1024010e95670e0780ab27d7a902d6817c2d210ebd0c8ccbc9f99145a75ee4b28c306c772000d3828efa2aa96d9c11715f488e18582bc34f8a5802625f4d300430a1d5c6432d83235d3a52df30fe5e8fa91f5f94fa06d283f9b7e1d13c0a79d96fb386874d79bbadab4ebb7a62f630ca3fd0092089d9c123d9437ca8383c6a7754afadae81fea800f53830d5db1ef64f150ef73f88437d22da1413d5c2213a434b7013eb239c73cbd46205553d38305f3463ca3ba7223b108d5d1bdb73f1ada055247237bb6281f6ebc5480c20f3c5b14617bdcc01f10b14b572ca0e30d9a3afa07e7527eca93964544f054e81cf972ab836c1f90a2c27c527c189e06c244ae07f51a4616a3ead5a6b9d19aec5ce1c7c2cce6d8247405b6ca1cb2321f3fffaf628acdb3678a90d9b1f6b925132829a259098f547774fd7ae5878b913ba87f2440d1b20dda268d19325a220467001c6e099873dc64095a0edcf3b715adca6a0bc02925e45172c6b30c9280ba153fe8a22f514963541c9e57f42fd59f2bdad472476c16b997d2897b597294e528eec26c3c2d4240898a2e4fd4b4b1dd6b10140900df6281792ecafec3b080d1e6dafae27507ed5b64e3d2ccc4a4088567c2c007b3d65e3658d97f34780410316e18033c9917deef1028016e080fd2f371ef2d8ebe76417c136e180b46e55acb7a185d0ed65c0fccfc01f75a213eb1d8a11cd7025d1a6935e9c3fbf68b41edd0387ceb0e241773c9cca0efde81c7d4ee5834374e97139e9c5a507ebd41366e5117af7e5ebaae0d38ca714003f7ce93708a867a979c19b7875107ecf429c8d2229c9cd16d1cd146752e231aac183785561c23b3a552347e4176f8f5b8e193d9fafdb4ba1ea7b74bfb948fc0d209abf3c1a23b3bdc0a30e4e57373abb3fcacb0183071c7fa8f1d0a64419221de8afafb71c651b370265ab602c7e4ae2a0166b7409cd1eef95a344689154d4cc111c69c42f86c2cdf4af002b443a371dc32f246a3e06fc711e31f16623a8eddaa2781109a4062b7997927b443323e886cf79e73f22ec02af05604f2efeb0e1122e7fc52d4f2e7861c4f85bb42a96f26bba6cf8041bfb63bfa99a212014f0a489fc31ad35ed145401518232459bf3227888520cc041343bbbc60b523be73c2fc3b83ef5b9cf018e0731ada679e186d2fc504319dcc5f6d8bd47f250fb006dc2dd88c1a240381cc6600a6c98e2b99820a37ef54e4f622ad01d478f36d0a31cb65a9948180a7182d1b1fcec494d4bd4a64ada38ab73aed7f3e5fd86a85be43877646ce74dcec57bf00f3de2253f14479b17d34e186aecf05a0864d2b3674b514cd574b656bb7fd221e4ec337e3687a5542715e92d21b70ef6aec23f28b2f83142b60cd55c06e3f258498918dd2dc96a163e216176b1956b4fd34e15d820bd9db4c4431e31b90ce2034f3ae77413922b746a6fc3c8838ac61415694abd941997f5f82a9d4d91fa07512bf2cd53f96991913b564fe4f4a4c18dc890083ba3dfda2fcd9a469573a7349097ca260304c6e005ff10eef897a53ed6eb43677aed6c58ed9b0635f917913c711dd6437d2392ed98f3ad2cb2963a68527bf6602a47807f20827f373a7c0bb0d8f8f9c0f32c1986611f9171a9ec1e8af6045cf1d38332218e182f5e0d6d5f015d61f45a4d5ba8ee8645fb147e209cbdff394ddd0475eb38011e4bbfd38c9db8fc9042147eb41441105f862955260063cb42ab7538b9e81607dc179ec2b0667b48705ce82550e6ebdb1054b40266d6083c050097e88b6ae8e394c18e5f6256034667284a6ec8a79911ab416126b881eb7df2afb0f14e84e94454ba4523466d141765130141c1cb2eda48ca09df8768f1b5b8d00790cc6cdef92f06664bddf0265b9b734a2167450214fc750148ae81f7941153ac5331bce185d139bc567c3dd3f69cb05df1feb1de35d1845718409aab2ed62fb43181636fccb0d41f406312f5d858445e987c2a850f55ed76540316b385e4e0614cd6c8be3e58be007fe10fd54108e3a8ac22b7463ac8e31660f8a960557fa6e4eae4e23c53733e7e79a74102dbe702a7f2a5899996719a25a4d8871aaf5e8ca3733746a247306d0e472b813ad1a73b7b88e5f9b490b495b38034fe43161fffb5bdf2d004afda279f895e900054d0919ab5d25896730fb5a89946027fba97893e2b28dba19a3de825be316592afe05192c934892394ed74f2130f11e33005ca091a233bd23044131fce4232160a6c1715c3490fe2cc8012a4be87f37886ece2be565d00fa44750649b8af406007a68275c98a437cf4cb1ad443163cb1265d8c2ce7f2d1c6412f49bb2cce49fda31488e6069a9bf699f1f82a3a37089e2c2cd6fc0b0d08064287052538a7f22d5dabbb2019d10cf80705ce0f2191a726a046c20a5f4a93a9518bcb3872900fda54c421847b768af7e555394923e95d00f98bd2736981c1daf0ccca864005a184e4a7ed675e9053a785f88f740234e233ce4c70771341c332c6cb2cc2b762f27b54282852eedee9958cf0e3d5e14e5928fcb1c72cc6e87b8bd3df6d69b0e509e83a830f495a40ffd1af86613326b3c71cde9400906b1236ffd2a6b4b5f89942862c7dc411e03a5d97d85883d94be1d3ab87268ca61038cdc6b4b283c7202234cd44616fc9e692427779980440f0b0592a46bd87a173931195ecc3b0c1f9c8246c93ed91d9b7e1c069a0cadb7951907ce307e02e3d22a6d2e2e6dbac2a93a11bddc7702ee52aecc4da4477b4e7e691f985822d6b6edab9640ffb10e50ef8a2c1c8177309a580aa4d98ef5f22dbaf6b218ec96e033304287347a590805a9ad7df2682a69fa07bd411900b230cdd51a58a19468da807981d1af841b8888bb6668a53068e181d805d0540782c27b38016895c804d59ede0eb3740f561fa2fd829d028fbc904f0968e93403e309c4148d7da4849e3401a72a40e963164c644525328bda48d0f82a8cc56fe82942d8c59edb2afdcfa92706b3209a165595b548e573200f165521464c00b3a21e2a96c15046da05b9222cb9fbd8f31258de852ff26f424053ce2eacb2b28a053074d2b556da898cac99dc1f00eb03799b68d51b065b6daf237281a17563cae185d192ce8310d066169a0ec957675a62216ef5e5a0f8f2fd664d46a2a0841a779e1f399beb1413ebf3d6af77362e052ee8e745b8ea915a9bb1cd145eb7ba3c5732f3121a15b5a9a0748c9af53a02dddfd73e832b07eb1209192997b4a5b7c0d645463a203931e02ba9b7ab8d838659c1628b1e55346361a3848b544e3e50c6c157666b808556904609e43654324a0c86f74eac33b529da42cde0eae83e7d1eb03f93b33f9d12805b161af7fdb719f9c26b4c42555742a07a50a9dd3d9f65aa20a92ba8b0c9ed6cb5d839935898e574c45d41c8e741ee0c691f827a2926cb1711e075807f42c2b6b08c6e57d9266c828495ccfa664abeda66a304bd393fc2242829e2287f4bfde4e48974bff8605821ea7ef5733e97c6d0c00bef257550526dc7f373a0517d9b15dcaba740ac339880c91cbb7a47adb20c398876034ebacc948035c55e0ce96f19bca250ca846fbfdbdb8355e59f2d4c20153498b0001f8d00aad8ced489b6bc1b7bd6223eaa2d56b126dc46638532464fd2ec44246b920fe199190b6a9cb9c95f6075b8fbeb8bc1e41e78c135d47596333cbf5deadd460dc4417d247e13ba173536fd00c93a0a5888fca5573a3a64c526174a8fb75238e43365813e3f8542b6f62560b584a01513fa7662558eda63e2dad03310528e0ae3ef1e1b53408ad0317e42c894d5f495f6b30b1361dbd46f699da5c5174b6500d27a977f2bc1439ff1de6257dc26c04bb3ed822b016846a2394aeefa8692b423226908061c8a9409722a84660e8456d245795ca3bfff1a161495047b5996da92495d4c422c311d457b4ee1fb2a186a9bf4fb32facfbf7d15bc3763895831e7f31e4a526dc5eeb1980d4ef790b447fc236225cb71f985ab45694f88596c7a9a2146190c9132a239c301fca522afd27ee74f9e25f4203048d29e91f3f5b53585b4bf99173d553eccb780ba5455544b23a5b417c966937aa28a94c1372757e17167b0ef729fc4aaf1e77ce89f7ab304f5d3f294e402a8f149799d130611e61cd055560334bd0972a4bc306f3327631f240549adbf471c6ccf47a5ff044ab94bba1338b4d91181d8a085da875f83433ee7d1058b909c94e3b4ef4c2ab8ece9774eed44a6e7cedaa0f2b42cc1f039382977b5beedc56324804ab9474374257730cbb9176cd4aa7f43010509824e929eb5f0c1fd7b1984945f852e58f7f6b55ccc41ba19b81f79d8bc2c3848b6c592725a56b14f08c6f008cfa1f339df0e5e9968f3841a497b4bf9d5241d1052d5088008fd36e2b1ad7e64980609ffa43cd69cd0ed465452b6285812f3a181b1cf17532c1763432f295ffe681bc0c81a711eab1c09d84c9921153b8452ca292522c8e29b0c27e5b17a7c6dfb9700ce7c52be0a12921e678990049672c4a2131a1dc2a8c5bdc3dc45dd9c5aff2eeb5a51f2fb809473b0486689005461524eb93ec3726c15fd8d339223f0849423c84def43168ade621e18444fe1fd813fd449c825c9a194ff0bf1199d4a7aa9205ba8c8f821dd092f55a4dc4954afdb8acdb08d60d4fd2fa91cbe2e40f625473951a70a27edd07d4b391408d56c6e4b3910a42925e50e6e9a45ca827b21119388948bf58f6da803a430c6e883c731df6341fa231bceae2a926b79f27f791fcfffe64dcae33707b25a9149d0fa838511fbeafd280cb2e7607eb6eb30031dc6af1066593fa26eb32e2d4904bc43baba6ef8e14bb498f7d7ec11d9c049d2e03de7dd829e2841e0134a2977a9bcb4907264e7e0e935980dfdc58d3c51b9ee3ddd3933666708eef571c14882f6f7f1da461fee72bb14266947819d3b1a92938aaced20df22440dd9737b674205999d15765be3e728594a60857441b003716d4298af10e0e66c25aa1fc12c3d13a019fc94c7131235296b0a608b4dc5a2e1583cce2616ff97ef7b35ea7cf1150b2eec9df66db44acff2828f6e7a9b3bb4bf7b2462a7c66145f3910c6e74b5d4b4f4981ea7725ac6a0a2a07d1c2fcf58854a3278cf3060690abab96175066f9ab749123870ad277f45f59a4016e007a54071432f9bebbe6e0f6d1fabc73a055e47c2ece5c54c72cb3d78ba474988c35412dfee7766c280f564d98e9a994808ef6211ac6c2a4e21fb4775123c07902ad85e941abde84c869b2f052385ba36cd983c6ee44763613f0f0c5864f47e055a44c743026a393f651a5d275e4021098c0320173baaddcd1fe863802c5d07b0f604f2c3e3e431764b73c31372cb390413504408606fb72765240ae065cf2f508bfda1a9192827901b121ad83a215d46d86f7f486216d194775e837b824e246524c93085992ffd326bab2479bdb1c094c332320cf8f6324a0b54105bd4616fca889577e8c89158349cedd5a2acba65a4275de9476ec23c83c5ce102691661e55be427aa4af8c7c652339f3bd88eda24eea092a391df2fd1849a88c0ccba180a0a8733b9f8c0cae0dc6b8d3330e53c23522ad462fa251465e764cf96b918cb65c91bec562c2f7829cc742ec89707c8e4ed60253e480e6475891ae9204c13ce039e816b0dec16f7d3340dd984ff5dbc80f6d9626a61319923e4346f65e0580d7765e88a516afe251675685e51a3c84fb9bee3af66a8920981940c39705282d5de1fbe72f27026a0f0dfb7b5cc647d9844617c30f7a066be6440c86e8e244c628a10a4537e6058f7d0f4039ce2cb4b9446329342799e393494e84b1f81deb765fd2ce7ca3dc4f4ee4a54ed5abc15039211cb556ebf60899ce89247919a834a714e137b86e157dae08ddb07eef52c4321ef59cb6cd4a4bbf67fbe8d08744d62506d9014f71834fe19c73d51f29620a86bc55b0c761b3f24ba1abf0364383c47070691643f541725c9622097f1ecaf0b4440436a75f41e697228015f4ce11413fbc43f0793c124288b65e21453a5ea3402f3ad7ab10da8f241dda66ac23454664b65b6c2af26c760d1579fe689d75b01431e6cffef76a7014d54374d10fc69db1870d93c128e2b0131773194882573e0b8529ad19c80e2631c62bbb728fa4915f2332145cf120e9c43db0a0a7a4407df06ac87abb81d2c4d6b6666544b197c39ee4911e4a9da8c1d3146098382705f89117667486e249cc1b3f225792087e53b3d6dcd6bb0668a097b58023e19135daebff73ade23fe129330a4d846de3b91025279ae965086da2abd64932785678cf5ad630a13248b81ef21357885b811c4ef35750f252060970bb4937df764222379d6d6a2293950753d38a653a27b4877ea17ac05486acd2b740299a36cb3808af25f7316f6d304b35ce68987b163c22cac37dba28ffb0d892562ecb8960a3100f710176d6ef36aae7253e8b9926cfa38bbb415c495daeb25e35dc69bc5a09ebfe15bb2fbcc7613e1219982bddacbcc6d28f9b9aeba32389bc1290a9d047ec44620182cb6f0b52b5b3f574323bf25e47a4bfdd4969ecd353d98c48fb933b806b57139dd8780150de473f6d4f13842db587cbe7a8a7771799fee6be18407e8709773aa80f39774b0f299d01e21ea11a15596a4836c68bf994235671eb08be746a0b45530189ca7765bb084a88dd95eaa39a9513184cea61ca33c3580c97bc8960fd38999b3594aed5b400d045a4e9b331587ee4338591ff16ba9aa91adafb62b6cc7c2ee101924397bfdb5ac0fed1b1442e2c8063d8a3813da5e6243a79d370ab0c66662848b4d6437fba5f14a52293f38fced2c58aee16850a2c3b27576e85db19fecb607ba12c23c518e182756288cdbd02b8d7e4383d7f97115850a39742a9e259bdc0f9ad58a4aa68a66d550d480fc6b23c437c9c9e40906a9bc97105b90f7a7e04b1d5a81714586b671035da8b839a8e8512b0d617112cf0daf2f0278b435ec6d267e9cd1745f5891e0227b3f9a40d2852eb926cef7be5f93b1505d48d1a8c55854c942c8bcf20d06f06d176c56bc0e1838815e4c636dae25495c17beee1bb2be02c1eeeb9f3f856f5a59c7b7a78edd7ac0ce3a7ee990936e88aa36bcbd91c9220e2673f5e36da1f4a084649c07e8564e8abf00322e25b392faa60a0f220e4e531c9ecbcc7f749f0974d39884fe13b10c09662cd45443225b6e2b7447180283294e419e0021b5906fffd69d220b88c7afe16d2b7388d28dbcb3e0dab5a060580ce2f7b6b985fb6186981ce0a3d0155f645a5210298723d8dd3a75b49107d5e17ec716d54493c1cc90834bb5ea63c1a0598e4260c006320c6527051c987eb378fa1e877059338f8ca1fa4041d1a1fd99df5d28158177518c70a8a13a3bee2562ac34280682c8bc36a4d4955e2a4d8965f517bce136c094d285d0fdd14363e3b4228ce0611db0592359176fb12267a9032abb7858b9c452496db5c66491619803e2a1fe7de480f9dec606003d1d963e874073dc1b39a612a940c9e2bf754fdbf6ceb622edbef699f9d765ce2384f083b453542361cc36b78b7ffc832179a3b0e7246f63002915cd78f68cccee81376b6fd089b77d47ac165a02f167f47bd0020382cb89a820a0e4e8ee9d54c9c5e99a25d239d7c8cba89278eeb12452344aa28e7460e6fffc1b5cd4266759d54c411381b726ba4dd2f02bee70b63449a8b7cd807ddd296b8e2d217180f50c867948cc6469a9b26d4cb1d293fdec42a0f6b43a3b605ee77a8b40bef4db46d8d048a64f838eb6debc016d43af282ef8ab8a3fbef1000a37664e28b06eaf2dda7ed0fd63d1179578311b603410a013e024dd3cf1c793c86f16479faa3821970e3d9937d043f015b80e52f93b000c0b4e34f39e73f13ed385a0ce073f143e37c12c733d973e852d8208b8dd8c0b3fc5fe8c2120fb622bbb1686bdb175a519fac16b17b8a00883962290f01308547e2dd8303a79732336f0eb29275c1a5b2a7a1077ca7de9ce4eef48ed9769d61549fae3867b06b162fafbd28ae763e723aed9e98b9061d7691d5c2d06e19868a476414fb14792a496bcd1baf12e9b61ec198a9b4f4dac8fe00cda38e49be39d73051633b5a579f860555ceb0a9d739c9b593925479365ffeaf8bd7d4e873356b1361107b3076b7cf02fb99677084283f90ed67bc1b332320d3da8bbfa4511b29546714b453502cf9ec1134a68b51996d82f8991cdb168bea519a8cce52d6006c684f4619435512f515e25e7ae5f2f9703c84915a05f9a150e48d457bb87c99224c5a1fe996b36b65126468e6d3d378df108c7c643047cf1a20a53503d4000a535fcf35e77a7e5f448f01256b5f07fcf95ac477b31c32fce57292a049fb0b6361691f34153d97971f8a64d118ec85c6060646742a3f6511494a1fe2c6f301f16b357af010273a3fc0b690b1446e28d4ae1d628ef429bb0e57323071c657d4a90c4621486a988fffa4acec65062319988572871739261f0f1a33071bb9adf35e7d728a7cd739c749c9446836be4f282b241655aa17822e1e0c724d18cef90922229f5fb778d68e58e1b9899a72004792288922f073d920cd920fe7fa00fabb82b30551c8ac9d439423dda32e5994dff43cdd0b0e249ed63312d4da19c6a09ed8f02d5dac0628514be1a91d9439d4925fc28f7484b37b57045a050a64091a810c68c09f4a2ba2a5d8dd38a88c1890dce965d759156f19753d2f5d03883c4db8c9dfa58cfc8828db9a54d867ad1fef401a21616603e1d8236115e56e6db38244408b96bec96c8c2310abf5f9d17e0fe24910e8df1a20bfd9d1c5efb6e351ba9531e8a8336bbfaf6ad421003d63b85eb6c3ef4d6604cc8eac0d549f014f28507a749bc9f0ceff9381cd2cc425fafa9af2284b6f8f6b3d5e1a9277a0cf5e5f171befd61b4030fca8ef73f50a76be05007dc97878e97e810549e1ed85ddfc5d34ac03414030a61224cdf24e5f318bfd0ddde9cee7398ca8b66a7ae156a92d381ebcaf809313b2536af94d1d7827f134606bd666c4e06443273b3727c57aec05b1085af70bb540559ce0d586b6fb81d2a7562edb07d44dc9b1ab10cb07ca18ad3df898ccd14ff51891304af81a5179e1aeab8b7f00982e584c7c35212a2e92275d9ee641a00e65f55f97805a7c8895e02e538815f4e8d03ae42c1c2430317517f9254836e2007b06eecd48cc19088219704315faca2afbe560a7181a3753a538e74f756112ab9c92fa8f63e19f278eb7fc05436b6b363cd08502a7ea92bae7a542470216e5e19fc046993f09f53edb772e046051c032a08f6f2f007a8b05c857f1ebba7863822b0473280b8ccba80d0aa11f51d53a5e2a14bb2982c7af0d4dd8f170999be2766ef8f266e58daac2ac7db34dd898d08da66f81b0bdcd9e5ddae10a1b0f451f68213441ce0fef0657a1e0b72727ad96ea1afc0a6560dc7117c7ee03c4be30daf1ee485363fb5dd04a8ae6b6102e5e8e1286b955c7a88b07a172bef899e740a8911028931107e7e24cd3f06732c97ab2d55f8224398f2f428f454ba02f4ede4f17116cfb3a10f50845903b26ee4948cb81d47014f0d331b863b2301ddbdca3974ce3f5de9d69bcbfe09b7a36aac1b187888a39e983d9a6600fbc40e9bbed5e0b9f3ded7c91ffd06e49f9c8ffff2e871a32bed372f70888e05a6ba759f9bca5045aec22f489eb9f65283a25e4e02bd9c40aba5003890e0212e9e518167b044499a81d0c62a341aa21a8ed3f962dd15a8ee1a9781941edf0bbbf50984efbbcc21f5fadc77d6033ab078b22646beec9e1c856d3775408beb9a4b5b0d829e7a6012516f4e28369f2298a003bd1dcd250759479bae74c7d9b762b632d0b46aeab28e1aa0c1d9f99c68044278cfa15304c25fe8fb97d3eac8b08f371e707c077123570a57ecd06f73648cb2036091dd85d9ce5e9960407d4fb4f593c1e53f84757a2b347ade12d66c586328f1663d5bf0f6cc3d301af8f0e591b52bd782d5ed2b676bc5b46fcdecffd5703c8c176a5bb45c055e68aae87ee66e2803ff071497dd9d36722d756e1b8c56c836cfc6576e469008a0d1683f842f4f3cfc211771649a869d99342a0557b21c5ed8f43e16c44d5122f285e52068994700290970d43e3b5ffb81634492ca81501600a0767667c6beb5c74dc1cfd72795ef83a28a967746313a84577ccdba0bb3daa796bb3a5766fbdfa8fefe43accc8c20a868c92be2cf4477804d3ed2ffdfba57c8997fdb00686b1db170772b219f900ba5134f29c7466df29961d6225858092f22872724d6e1dc098ab19f9466b23e854840cbd472fd60c9652575310aa790176b09c2f14cf39ffc6774253b030b437929bb71bdcfe959103f33c09ed44ca243e4742461757130f29e7627d90ac262bfacdad9c599f24456da72ddf702a536f244118104ba5a3cc05569e6e83c5cc3fb984101657388253cbe8021083776a8cabe56a22ce9d9977e940b66c42722106831cfedf764881b565e3eac5cbd3cfebafe1801850009738726f588e34347f78aabc6f3291584076c27d2282a325081a50c74f69bde2b591880b79f3640bca850b2779cff27267723e2d842034770b3b88ec2697cec9e8ee8f6de60ce636ece4109a742b0d62b8e6c2beef1cfaa1145b49747145a8e5e34b7106543d822eb2119429bdfdcadca8ecc3a4a558eefb5acad2f4efbf16ae918a7ec4b2688fea6e24133153b517150fa7e8344508bf42b288b85046a58df6411c4d1b590e9044ae39a14e5f0740837f0ea10c7c48513fe955ec0923ab1d67bef09bfb4c2829deae58774bdb34bc430cd9d89feee014feaa32ad05d25474ab7758dc4337fea127ae99b0526c7c76e03bdf6056ba4a14b039d4cceae879a65fce6a7ca972a4e8f874c724eb7f3f8d4b927722652b747e4439e269e719f37046509484c574b41c5d13a2065fb3b5101dfd61daabf9912b4fb39aec7020ba0b3f58fdacefeb7eb17560394f54a84b6cca86d43367e8ec6b42f745f3a38cb1f040b702467992cd43fc28e74a974b4089c6cd474b9e80f4638d2fb81e9913d06d557724f28377b5d7f2f81b77ade6fdb07806a79bccfd29e03f35d95099f4b4cca9cd70183909d92c951c65b8d320a695a87802d61e77d7b314f063c301dab5eb5c7d79678f40cc19fab2c9fdf7c1c888aea6215c763233c66058139763584fdc005bf8049589c28904903c81fb52c446291b15f700dbc8831f5f4ea67b02ebc914650f6c63f846960855cde52ac8f888eab53e6b72030957f04f750ef8b61e2ed611f6ce7b300dba50ee8af137690bbb623c0d68f02b495d65fee2b8feefa19521223c87d1fbb9c92a21964ea880fe1b0f932ecfa3c6c5328a2184c1cfbc2823f0176971d7fbf72c0e1591835d33566086a389cdeab2587c3744aa81c2a74b48036aa74d66729c3ccc378f4f4047e5fbb3c896e300de2ef7674f8684a47882d99aa6fe48953752a98ae9641747a5cb95cec614095c7c7dc39cc58dd985592e27d806a47ad556766c6d020fbab47be186a65950e825cec157a51687183918b85c62ef1330bf730b69b89feb745c825a0cff9a62d9313efd81eab868d0e9492fa162ae19e34fbfb50cc7eb628f3ec3e64ec87565e9f06e1725c689187bf57e6c0c78bafe381a226fc7afc24bb243b426d57e617cc8c25834eee92cddd9d3b5ee3e4efcee7bfe29cb74fac761d483a3dab8ff355ebab92ee423a8ebe33950e7fca910d858c99ab5b25d6d585f02ff2a8a38177ae12855e207ab92c933caf9b0ac9a9c444606a2953f84f8f28e5c5d0c848dcd51fd4b900431a4bfaa01c3255c5c460092af2dcc4bac5b54af067f08a03f6ba009ca3433ce29ef9b60cf53e76022483393e3820b5de41f3535192f4c0ddee3bd63e5c45e153822e932afb46f891fa68dc8dfcc775af3af62c31667477ff067e593c948a962ab0de66f8eca879462ce9310d30fd4be71fdccda64790061b3ecf38af81470faa83e555ce6a68f1fc189c90478592e7f3c37e073c66d20473bd10b0c71e21b0b2922a390bdcfe5339ae07ec5580322562861d37888cca0ca3643e83352afe76c9d9b492950ce85f39084b1f3f8a2365bc3c8f05b22677d908b5dc446943083749637c7aed7b15c983a72490212f247da899597c51d2a8a48629ad8ea425c532f03eca10c586a97571c9a69668b188c94d513104f22a7492ff7f8d5948cd18c984e4eed2b3b7c09565930feb059c8b1d9a19357e6a4c448923a42f016d218cba3de5e3aec0918b7cefc3a93083739875b15ecef860eb83af269581d483489424000ad6280c425b3f3a17f53dea85168cbf8fd2555c7bf93d809400d247098228064133aa3605fe38dad774c9908cadc3fb6cbfed4a1681eefd27574bd0142c6103fc94c79315f500b2275bf6543eeb591322fd3a000cf4310da07dc0803c0deefdb827b099e16eeba7f0bb91623e0f50bb4849baa7d6ffaec6bf96036469d3e9391fadf91ba64c8af88eb83ac724c6955da8ea369e2ace75a9d33889e55b8e0f3d49dba5f3bc580530195c8a84fd54f919d92882d5704f3c8cd96239fd53885020df0604e6eda9d29fb1054944ec4107f32fb5b9a2f9b2e2eea1f347ab4f45aee803e5df32eac9caab4861e6a56a1fd0b0a30e36f843f5d99b09cf559880797dfa2e07b54ff98262845507011a09e8205a9b13058511121b39e90c9550f1f9c461385a1d0767d1bf5a08862d1d9c7ca6ea72016c97648189cdef0fe1660d02379d84e56bde7bef5753ad27a1c7eaebe1617cfb1e5a50e48a1b09dd683a08ad30851b66321bcca3fa253c0c1d092876e3fa2c1fe4123fdd4b293409b398170c37743c1405b0e1627dc5dd2014a208f1e2bc9d759225f277056b55651b85c8f1fe2ca5d0db9f06437d509923ce88436465772e21b9202f14aa58a9f9d65481e4aa6681c3f3329a9129d4e299c9262ed9e68e5d6822f0096eaeba846adf2e1831b83030bb4f1e4479f276135c59348401922efb53f4c073b37d771746b4056099af86b222fadace8917ab71d87dcacd89361835b0d30ae7c1a86a1ec318c9877ed4672d0302c617adbaddbb0131d2407f1a4dca95edc4b31c063ac2b7662c5acf2e6714869e13f3ece5ccbbe6bf9328627b615b51efe40c1dc04809f52f0471d59600cd68942fd7de2c1ea02e999fd2cf873612305adee66ee6770f8fbf4825ad0b1126d445381d748d569672528fe0e57cf102320850ac2972c28432594d584c8483dad27124a391a88cd2dd29e3b894bbe2302f99cc461ca822a15ae1c0e6869ec27f1eb39e149e7ffb05343bd454358587b445c0a0dc02ee226e6351003b9f61d972e70bea6df02f85943814ed0ffa3ca39376389b993ef9e8c4be516855918689a885c8ed6a9b0b25f0bd05ca8a8879033e3ce8344cdc742289b4a656902e1a355bd59e53e7d9ade4c685c6406d5b8574c75212b27e931719b8930ed8e28799bf923aabe0ca0916210c48b9ae4bafb19982f1b6cfef1235554a26a308747c618e14677a09d2a876b32a0e7b8bfbced3d32af76a0102bd075a733bdf389b590aa118850646b81fa2ad9245949b4ad090ab5957b50a140d5692131469a11a65ee5daacffb5864e6fc98d374eb2aba7a7e1ff2c818e643f56c5f65a69ba7d6dae81ad859d2d14fc335f4b84177e6ccaed8ef44c491779cf69d96a24ee9d2dfbef5bf97ad1fa233ae1917893f8a56c985079937d5ba35ebccb527103244505e2a41f2248e7f79a4828bdc107121d247829952e67760534d4bdf7c4d97a2f8087c21af759ebd4f57d2dcae226ffc462238ed417a5151ecda921894051f4fada8a08374a650f5fec8a91b5c7817b0c8a06dafc4b7319e9a53186f050ba2b281d78549a136a22469dbf2f94db924c7f157ab7432ab7c2fe8e66f5e6afd39d551802840af4fc70905587ab5a3edca7b3c4f3f9816f62688a860a4308da368181873030978b43c78e5bd8f90cbbf5dba04e91ae5c4881f738389ff5ba0043d602dd019597b43c39ba1c09b8820029a019c7fb12281bbd9f530c2b7d157d9dc428218bbaeaa2fe6c740135286b33459d591262dab59b1d243e7bf96e85224382641f41ea0b7f0733d9b8d6bcb18f91412f7581b1805e5099711cab89373089b1c6a8ae817a9286916ee0d1027c0d2343f1ca31c6807bdfbc4a91369287f82aef5aaf99bbcf7849002434e04f60f4b31b2a93f8b153ce7d5244b7dd7e658d2e0cbbab2809d7a223c4c0c699eae39934648432c5567610a6ac12a1b62c99451c113dc391b99eaf64364abaa964daf686b40d3a3cf7433782e40198729ff5927f5fb7d45665223b2d42141035a0d4f31b391574575842c886e9baf9cf382b7246fccc4ac576d4f433dc7b9822d9b71d398bda3051e7168ad8abf3f47b7b026f7970d23a488d00c27b950205c924cdcdf099d2d81fe5c15bd769f88ab49d1d3ad0b6de3dc1357407f900fb910eb0bed849ee27b30b3cf1b53c2cbca1396c5c9b2fa9693e986a2d1534612b4ab473c284e23afcd93a208d769c28cb1f04881dd1387ac671311f68ab5249368e5db290896d6296806baea1d8131d9995097afb4f033f1d8c3dacb50380e88c92ec383689709d2ca989c02e76d2b4cb630a482feb9abdd629ee041b3c8e415557d9c9289b49ac314efae410a9af8f18e6e4b735752a93808c193a5dbbec6ec19cd1ad93755cf2e1c387de95fe8b7fcda1e0884ab273a5785de0a0354f55d60f17c9812f716d9ff91c9f550417cdd5cd93984af7ea09f7041803c5d6655d56f861576cae294822156b313c9ecd838bc2958c7af0071ba5e217b26f7eb6e029c6ef5a9b397a3144ca2ad88b9fd53351b595a30e59565648ae8110430d8212a36332f7c2bc6730882df115315f0bbd6f525e3727950f1cb76ef5391ed9cc17c015c68f2345f7feb4cc2d3511fd0893d061ffbda1e962593d5ed064763e02b25984e9d13ea6a637071755b44bb8a77abf610e4ddd13ee5a2f461e2e7042f0a3a3c058f92f61e1942778913dec39ff2ee10d70124f0d179a2e99961af48510bd5fc1544a9f5f2939aae2af65a7c5fbd8aff0b6bfe70636f00460600971d8bd876a740eb47979de192da9ff74197f1f8ec2fa95f272d9ff20f940f18995ff86de8db7f28d984261a6be0f8a7642e2e062d041216f5a4dfd1031874d192dfb944d003737ba328c1add0ed1c8339fa777bbe5334eee95721bd08735a6dc6d514ede49db7a0052ce1b70e50e0b9a01b3b19ed38e117a22ccd91bf4f0958900358f46a3f9c8b12e9a588a850ecca139cf5952c4ec35aa9e35a21010a745f987e2ae531884de5c501b6eee76c6695e2ddee43fbec44a1767108db971a36443fe606f41df865c1d333d2db33d24e5d3701496b6733c96680dad0e64f07f1c3891b43f22e512c87e6d3cdde6b7fdeea0308beea84ef44b8591f801afd7e39b6784538191b882b58a3e29837c7747588e0e3d2b5a714f69e39d8a15bbda40b1d8477c23465670afba9648ebd87e6ea3c82a4016f0e4a7971b289e91ba8f98b8de99653955e09a57a30ac2275c9d96cc138eeb54e6779b722b9e9436e2107205721da9cf83feb7a501210b9a77f803c61656c7bc97335e6c16b230ae29fa29e335299c15e762421f10106f82ccef4947d5cbf8362488ea8f2c89e1819b9fc1b2d5b02948560b51ebcde3e4e4f037ce086b3861ac2044a1779b9416f4a34b8a29795c7b05644037337dc9e02b2301934a86d91c83c43ef7e96ea6905e3f2ef76fd785ed899b16e4772373e984ef09d6b48726eb24b89906978d663325b5ffa24174954a0c1b086cc55e2efa3590c72bf44c0bb02fdabd347432632ffc23e24f0da3a0a4463f684ceef7c8070173dbe296e1a685e9c03ca1155c112ba1e3c6ff344c1a8aa1f0eac1bebe66c4429de3252021c40297a929bb50b313245b2488d111614415844d9d5c1d04f75124166f8482fb7700ac7a20b744864ce4b9b6098e540b65303aff27b7efc6f890c7f0094766c7b9535056316262f180b4063ce269033556a3d24eb4dfbb2f601e52f743ca9f78fba1e80203476f9b2413b73bb56b5d570708695be524c2838e06e467d1929b674b0889be535b2daef374b19e90e8fb36a2c082b8c5ea9e0d6b96b8afa20ebd1b02c8debfbb4cae3754dc6ab77d178b9ffef6380fa5a0746e199ea10d4f634cb55e2a947d2b5cad146ee9e9deae50ceada1d0e4a310fc15997e4fcd455c27352564a2e93b8762464cb431622718a24559a03ca24bacc943950264a6eac8b367bca891c60a0d2f0ded074aab369e61f2277b28b9161e3b50fa73f04a850596b0a2ad457c582956f5481a8ce461743152c4e166f09c0ed43c70e60d83e548db5ac07023963941dbe46d57d16af46215a06010d9cf80d3ba93234994a3378b07675649b082792558bc150b66c3205846f841237d216b4b13a1faba2fe530ce713279f79bd85144f23c5466f09952f36f6b260f150471ca4dc64802dc9eea36933c9cf85e4b2e1720975ca80f5837f259811e360d0244ee16e560edf6983e08af907265ebc6df019dfd835dd7d1f3f44a15b5a7bae911b32fbc34f7ee4b91e889f7bf34cfee4f7526daedfe8d888b21407d7b764b204a4bce8d3b9bf43dc6c54b874259d7ebfab0dffb7e2a1847fe8ec7c37b419676696d1869934057344a889d34204154ea20724342c2a27ee1ec53574b42c8a6e634475f79578843baa6c52a7fa768d96103e8f8a1ac2df7a4c42a3af1b139b781edce1b2a963abf5de91b7886ee9ac57ea238ac5a41630cba790b6c921e1a294a8958dc81f21b807edfe7cb664e45e370aa5783d14e7a1165a954674d3302b7cdd8781b9c0508e0b8835bacaf0f575af9fd766bcc3177b47144c5f3ba7dc98ce73fbf2146b794863c778bac4686da385dca7eee6813769f4175ba35405e93fedc1908dc126d1af1fd42f9fa1bdb4a5ce1ce35d471c030c1ba79156f36e442135a8b58963bc710fc002ea1e13c7b72cb02405e258415a1431e80203a1f24b670f5f52e376ba094279342d943108363077b9c46c2b099eb8d6603af1c51d712e0caa428a0987d54265e2f3acb4c0519f472ca443ed9e1364d7162778ee0d2f216427d48c826d4995376e2656755fdc6c251ae4ef7dd0171f9e41b2fe71ae732b75fdad9dfed1228927da796d375709a1b01af5a387679cf350f0f36c3ec43defa5b3683c1fa7bd108dd283e9a45b4e0888b1188ad06a3cc416b009f421d721fee5ac13bb3febd7775e87164e9695b799733208862dbda74fb6c0e4aafed3335f85b9b041bd2fe1b00a6b3204b916a25cea5b42845fd318558b6d0fa4dd41f8aef2d6644f88c4c324fcf1b7b70063f0867fe11ce8cccc409405ec9b562f278b224cf4c2c1060eedcdc9f20d2a042441050107360e85b093e02a734218082d22311e3ac81721a5d9f1bf1911e4d97996502593d516eca65db53ea4c98d43b02c4976e898d6704aa23d8ecd9d8a44432a4e32a60eca3838fc4152256e5349c0006e74cc3c6c00ed7baa85df791f13244bd1a3674d33a82da37830cdb5f4b5c3dd9edcbb0045af9bed749a260b593e3791affc6a03e8e99404b2585cfcd4058f0c1270343aff34bc6f6e28a45ec4a8b089bd8eb2266d9c7337a4ff98a99b05030c6dd861bf11b266c04c355af29ea1a1431138bf82285af58a05646c3ad921f88e6566418cd62b255f35dd8a031d1e26cb92b3edc9c5dbed3e335bf902f5970e3b7c00837430277265d7028858e473133c2ee9564bcc64cbbfa51c589e505c574dfca4a950fa3e8cef8ecfb5ebf8bd3f9221606c7d261a09c27e77cdda30b832c130d5e5556db89924e8edf3909a98bf651256c58e0910bd796c06b97214ebadc5ae2f14d63c9a2ee109ff2239122703da4cc77a4b8de3a121824e0671cebfe54e11f7c7a4f39b524a964070d52e55c85568ef96056290c06e42750eca3dd0abccc5af0c2bb2f731798f141fa50146302a48b65fae5b77b6936e0777a4af3fbbfd5e0a7fdf22a50e1c90f02228622f07050a820373ea097ff453242a36c372bdd0e014c8510909c3cd4563551c310faa215e1a908f606521368f4c11c680d9d11354aa724177c4a4df769c3d65729894a2ed848e857819e15f556e4e7b326fecc12933289c2de2953b1f4a723614eaf847b0b954a29d51c186a108ba9ea5042f494868544557ead8345c97eace906261409f82d7293baa5a04899fa84d7080dbd4394e44705795501ab7b0c09ef0b06b965d8ae1093b522e76fae129255254a0a2787f4445c29eb9fa692f13b540c4f50e742a12f016a8b1485289b8ed7a2f712b54478bd71122b2de35d1d234abf13864527ea5d8bf8b14747f44ef1ede916d93e0b51a6198c04b04858ed90a8234db052f59a57a98feeef2f8a0ab500de0f71114a409bf514d65b669196bf804aaca86c401a41facbca4b4702f14f71d1b934108dbc22290388ad2ca7ae10fea514183e97e0d6464b831ef6ee5c4a1f1e37f9fffe6ca7c2ac5b1eae81e9c9c3dd8920f525b3a37aafe11539fd62f477da0347c8ff0f9453f51f5ff292e73288d826feab6b9e989676ba9e1b51a5bc7b98e243158a8f5c6efdfd41dbe8770380b35720abc259d1d22d804336b8bcb1900dcf73a908d0830be144d4fb353e084f67abc7adc01d15a56985702228d537783c729f0e831d5601e75785c26b5cfc3f7c94b46a04a8c0851ad794c8d6a1342ffbb7dfef70b64f5b06af08bf58604437ed7f21f59c0208ebfcc1893f84567f60e8545bc92ec4cdfbd3edff4a0601801f00a97423c30f572b5c954cb9ff199713c8373abb3b02360c95ff9b377f00eab78424a38eb19a0b39744cc541321f61bb1b3d99a46fa45f9ce2d0b4f2868e180f24908c50608406895cacf43491a994144c590dd49d919cb8103c05694413ac6a150934bb39caaefa132d4abfd403347412926b3b70742ca03787507d09f54d00e48c5715430da536b6e297dcc7bf4815af1a34c4cb95e2f16fb0658430d956c7efce038b0c08009820003a0159d397ad94c6915b81fb3b03c89b6f12a0af84d24ebdd6d19fcf979f903864c246bccc0ac7a8db2e57de91e9ae6289870981550cb05cf542c0af2925600a8cfa2872bdf2a744d6c363b2338a6cb7d71d407719e6a008d171c481921fb2e5a42e34132541d0f54224eca6f7234984320d222c5470b1aed33b2214cd59af42b8b1ada8772b45a8d399cae7f3c890500a0103a13afe95c164c61b67a8907418af03f8a7d1bb5425f09f683f1a55a051d741131fae1b39b3401e3a67b470df758f267fba311e3b99e63bdcabf22f9772201b53f311e8add4866d38517041018e97a7b4b3cad43f6e79af0e6fb62bf1136199ef338a44b54ebc896b0220b4675d24040cf30298c62e61278e75ba22ad67ef7f1be17104182cc3190033aa4e2f9c022682defe954d7c51e948566718431b8a969939ddfa13a646b5c9097927e64ab234420e72c01dabc466a0b00737325aeb47a265ff9e0c674f6a81eec4a012b7b330533e61cb21758d1232d03c31fcaa4640c363c730013cd31cfa16db61bc00d20813b641e8f7e7dfbb4b7a71af8edfdcd0ce76cefd8d8e05320e85cda1d0e720cefb647924d8293bd12a7c55510c67489e22dee1dd0f6cfbf740871d0b3516154a938f232297a18ca90b602c940eef2e699e970e80f16678c154224c0ec6a431fdb39037b84deab0ec3a0533cbae928364c9d390bb3d0c9222a1769fc442a448aa6b81fd96a23867100cfd87b217c286a5b6fb257602617438ed0a72fc54447955579fa2a70675b6469fde8ea73e2ddd6a936c9995580a47beb6b2dee15f09072e48363c062a8be186dbd71ec7719ee573be147d554dd81f3ced3230f6f3b48b5ca92bce74a954f1709a6549846cf70af0f286586cec921ed01ea690f482049d8be67e90cbb8ef3c2f13ca375c0bb55c2950443b609a8ebb2549c375eade181c4da33f7d793025e974fae3b176c04645eeb4a165f613c00156071eab13beaa3a81c05ebd1d55f81645ab0b4d4d9db5c511adce125d6c90d6f8d5e52aa0f1fb49e3c961eb5d2db5f0938662ba0b561ea5e732c8c107a52c78975be7be96391fef55969b47d6603eee0dd088273d2561fb1d7dff85b026fbe8133536f516754146a1a913e1ba676c85ef6b730c8fb415a4b6f84684bfe10300f8bc77078c1cd5a2fd6e16f36af81e017d3bcb206a26d9182442db8105495601de5f30389ed6387fd908221ee1e8dbc2ec520cb147b8068d6d854dd07d7242339398a584fb6a89331e80241676d36be8ae034ef0ed1aa87b1727ba91915fd7d2e201c650c22ffd0a3aceb250dc21e40889d49e3d7974c64d76867c7e7495eb71b3e3c1fc084624a7a2e9e485f2bf81642014639f7e0ae2ff7232eba078a485e22caf717804634dc8a91f758bc4767ade436bede163a4a5a62befda9729b46b01235fdb49f05f2daf03bf2434a6008bbd9d4cd7ce9ac8f10a83ae9b27537cb45bcfe2cd983d8860f020698a0df2cf0a48b1047e04ed10059aa522baf8b15aa2d5eba9ee32e1cf6bb86b6a00be6adfdcc157968d1ce93811276580363953127f57fd44433a7249629fa38f6ef98ea5098b31f2ea182f43c3fd358e58749a97ca4ae29537c287270745434032ffd8878594e56b37321c99ec445266cba10dd44c4337210b255b269cdda5a2e7ce2c82272a0a25f072a423892b62c0919fbae2c16a7f64ce88d741db0e230ad30ba2084736cfff19633ea516239146bfefd68437924a3520ac23c660241c35ee486675a32c0e7fbad23307ec54d7686faa3961256316fe774c99aa6e3bcc3fbe8b355fbf772d7f6cbc0f4b682c61704821938ecca41ff93f86420d5904525ba7ad0f40755ef05dfbd49840c2042ed615ab1d5c4e1db18c4989166b503f04cfef523c140bb51f86aae4e5b19ad800971422ab6060a4cbd80fc4e476fea2a1132947b1a1f421aa1d1da54db4c1a52f7a1d44ac333d88ae6dc6d4f27abe1f05b9450e957f0c7b02e3630e9f0b5be7c98baf5a3179fc2f060f0b5336ec280b82048ee97c3272bf48bee8bf0b994df3b1779dcdd75d7ab9fa45b025b3042f228dba475488600ffb835896af1d530d5c9e9be2f09608299af59ef5417f4447bf37bd21da24ddee6ad638ff16c96cdd9b52d477b56bac8ea3408cf59102338cb87ab817f28bccf7d08bc987b6cf1c28cc5917e58da8c27acd9d0b7967835f4973d9bdc414930728f5f2438f69bda188bd9371d0dd415c13025acd943cbfb052febc491375a876a31303a26e49ba9ba311036ca1429aba47f502a057b135a436cd00cb28a38588eecc33583d820a8b04c1a3ad429b94bc38dee10d76a78ae557df974d663bf034c66f93c2e4216628822076cc2545e9a75793dd54f39c593c3699c0856b0e6fcd20bdee1489220834951a38e490a1af1037fdab461296c5523771468a7ef68f8578dfa938c8bbc17b42f64c054ef49e08708f4ed5f64312ada8be206a7255d42ab7b6b91e3ddc8e5467e389537a33543f080d4d14f037989e079287026bd5891080864c6eca386b3f273fa7d1141d8a38aefcd4f063a60022750c15aad3886bfe99f34081d25bdd4cf6b6dc981b7aba5090c9da48c743894c141df99d17b67b71525bcdc901be16aa77c5a4e52e4b3a30a034886a6b4c7df29f4475a00607381281f9f852dbb79aaf2fbe020d36f97141ce369315ee2dc9559f9f1209f1bc2b4887786a45dd2d48fd8fcc6407866212e35746213b21c997e9b0b720585d3a3571a67e3cb77a2bfc5304b61e09126e7b13caf5e7a98cc6329ae81b13daf48bba3e744c38f0a797f8356668fd146450b7d05c6aa40e6e2722232e12fab14e0da2b7ade5c8aaf9646eacb14c76b8e7fdb9a6c21e14a042ce612ff43deefde1ef2ae16cd88d2504671e1e96300e409cab748c971b1d574331f1732b15f3417bf8d70e0a2a21b6ca9d17843f2e61fd47376d1aa582ccbfd652c46e5eee7a2b7d0ea8ed6fc134ee8d76cd1751e2180020c74b8d88929024179ada4500b3bbc4aabb133c6a66a933432fe1eb8c7ea238c04c023e78a9a231fbd26ce7ba37bbe44eaceb204f6f6a9817992f3b36544f2eef6998952e0e02b585c077ed3c34bf471a2fdc10a3ca2001bb1559cd186df5ebcd1d1482ffa61e59449caace516c4a37960a22a1f6c7bbaefc3580d758480aabbe74022243f0bd71181921880605f9175daba5cb4085327a403d60253b9b219a54f57082ae48dd24da0acf0ef8d301bc69c817a77f10898984f6f359416c07a55357d8c261be1805e1647b912a26024c9b38024d01a322b704b580c408aa35c0ad5301a533de347f1a571b6cb12cc93809be82d6f7e74193d5330a1b68dc910125b5c18c0816fac8b98b4a32374502d0d5909f52b55f8327556c786df15ca075bfec9e37a152dd3da5bfc5cb55fe0e29afaae10eb06e4716a10a6e493e61a610276e193431bd1842758aa10c68c2af6760df36ac1bfd6a774a4d110e362ca21136d45b270a8718268dc4afdf084315ca6c9e89fbe0d86a0f1dd23da06074c83fec1c3d1fd867ffb0d3c78b131705024b0541340e9025a5a780f20accc1b4ee55e5047640a8335277a42f021fc94285f6d373c9a040a825db06d1290cc8bc8207841642127444a6812d2f87880c1c29b42b0f43bb3439b4038872f46b6b3bdcae4ec2e2e405a0618087771345b15335c0d6138776d9c9d419522dc9b9702c03fb34d55612e792cd421d93525d59ca8a2ce3526fece96a38a5fcd9286bfe190cea5087352a1e1c268b715c8e409be64721f791bcd0027fdf4ca23af33a6cbff4fd51335057e8a496431d314b3b1179f8c840c1ae62d37ee0f1b6f983de04ef23343aeeeec8563330f850aac528d904639786d7a283865762de223a30f920943997f84a5366d27ea2954a18c63a2624674eba4e416daaf40b6b9f3a85d598252164ac877f131cc6cc95a6448e4c3885a20943ce08fc50012ad3e73e1e6ad8b7c19cee7c05523706a5f7cc503c9bb8fc943ad9ae7c14f875bc59184531d118871ce923e808c04361085397bab42af7b7576888dbfac40ca6e16e3314574728c635939a1c1999bb2883b7d8fa0b8f78d53f7e17786da4630443db7bb41fdb9c7aee3e1aa8559bab69be95fe6fe425e76793780d4e08ab9e3fb9ec6a50c16644740fff54a40aa00181da0daaa31f4be11f303b86c10c875d7592867f69425b46a0d2a430db7f9a37e1c3a4e78e39930940b1ebeeb0bd1a9b34410fb8fca9cb060110b5247cec4fee9090580ebecc02f3fa45619e28cc0d1a8450aa2bd40d437448f4a9cfecf4f0854e6873b3462b05419083da26c09f354537d4757a7777ca2ef5d388b366811263b84f912f758cb1c427c68ce6343ebecbf2ac7a03e5ec26ab7421a2083ebd64fa9c13e1f4501dee78693bac2090824f425d3e397017229d48e62fa73ede120b669c11c1427f46b91cdc5b12d7682aee0f749e8ca8b554a2395d7a884af0d4de123369a0069df6ac0b752b0684edc77773ef59760101f0700085ef484e1719de4cc979c34e554802cc08cd26de54635001e95e764da311a4e2ba609d84ac0927bd8c6c245bfaae07eb82d0b9f895a1af0356d59c6c51bbf56a9ad22995769aa7ae7037e43e1860dcf1d67728b3f8c068e908843ef6ff6691fa737ce79597e09410928e6c26e1ae26be456f52f02bf3dc9c4b4321d427eeec7bd2d0e80d622385074352e9312f7f206c6e40b97d5e6055cd21ef78850221640b0afad9e325399e8234aff02df03652de0422b71aa052792da59e81ce1b1d49b2a7ee26dcd5ea8dbfeedf299183d5775352c4f63f2f5f5e77a6e6a7507ccda0e54859289131a548889591dec3c8b7059b1f895be426d148d279a41eaec8484b2466a948ff6ce475ad9c3278622f3cb93ed7f49c3cc2714e83cab805d021eb6a061d0959d5c5728b37dd5d4b0a0069c0aecb799c7ef13955c38bc7db66217a466294700c8457394580c08e0fd34c2af828257da0c58fadce7ce0c462656a4f2fc4aba8db01ec19615521f4f75189416ef10a4d0b24c002f7fab9653aaad532d1dda90929941b2436cea740fccbc5a3e15ac9c6e800833466f06f3f062bd2a2b41af0224038ce962f31c45e87e322b6ec21609ff4a9f97e5c4f3fb4c6d89c4718d44fd1a662efb9656e9ca2bd8ebc8f56abaffe5c6a8f4982bb9c44391d8aad1b7956e7b53e65891543540606fe791e36d8f7bfdb307eb5ed3f2189d752238c6481dcf069c101a4a254aea013fa4ae1685dffeea61a90aa036b47e9405b442f500b05645dcd2d15f3dc8d89a71b7d4ce34fd17b9aaeaa078a4083e1ff3911fbd6dc8e1182b9e61bbffe06557d84403f313d86e72ea3b58286ce2b6338689d0682207dba8939542a5de1abca2510a56e73d8eea8f831abb9ac6917982037f8c7ae83e98b2d6ff6925e1fd2d5303a22450b514c3ed529509fcfa03c0d8c32b0c2637a33aaf7886e1d4c3320016c10d1486100dbd08a3dd4579a4917d1fe21dc25d14999a646c15d50e723c4cb7035075e26acac09adc6749301c564df363619dd06234a7bb7f22e1159a01e5f58f8fa40649b6fe125e25cb2049ba2f651bc5ecfe2d2466c3f84dc367b39b270b9654a93cfa1832e1422a15475e12c173086501db6b8bfe86032d5c0e28e6936ed78c88009a83206b3fc0970885d84c82a1a399576681b58e9dac0aad207254428be1673d30c877c9f7076ca8764929b606fd839397df903c7030d7fdde07409a8b201f6ff39c7ef214dbb454b8652b049c177c3c489aa72da85cb828890145995d6c1f7445e37865f567880fc3a44d622855125d38ed5ff8e7855c19112e1c2c05340c7fbbc283f6bfcd2fc89dcd73fa74ad5cf820e7c5ae483aeb4fa3f557234baddc2f2a0b6ca7612259fefc506cb26f62e7aefc0ceadf6ce3aa1eb4bd1043f6eb58e5013f3d94c46bb6450811aa0b2c107a9620728c9b252e3f72878aca5e6d218cfd673799f478ab7c4b1b64ab28909162c3b26a88c1b0813907a6d5c11eb2ad63829ec5c9fa2f25173936aced8348e264c142e29375c9247284026795b9cb1548946c063e8c0457e7b982a2c91302d9f60cabb95e6d5be92375903a02f2380f981e5dd7ef5536d2b266a1e7514aaf61e806ef5b7c65ba993443b15157e06e4f6774606187dc81ea005590d74eb9d4246e5e63c3f54cf06167c7bb8f24451f7c537a73ae519fc0e9dbe35518813c4f1068036b95ec5b61144573c44d17bb3b4aaf08fa61208705a4a14126983d9c43f571e39e87e27cc1091626b26cff27b9cfd97daf10df4b8b2683b4f71f9cca1604fc0918cd6a27a49ad79f47ce8a12b64743f21117699672f93cc7d262b981ea4e842c343088cb97bd23f6cf89a2aaa38ec2bfe847d35c2a219e424d2efc13c747295671829890f1141ccbdd067f0a993cfd018eac25e7ea5db6d30cfc90be7e00ac4648dc4a1012d04a1f0b4bfec9b9e0791c4ce948d2b7983a841d7f7ddaeddc8e5003abfa194d56a52cc362828c924341da5067200356a4b01be400ea01dc75cdd44d9bd6eda95015e05855c7fec2f28b2b8fc71e017a4885c5193930981f1f5821e46502a7468b3155890d49946901cd65059fbedb5a1b9cb7f70c3f46595f1dd0e8c098fba5adb724d31dcb7a9579f868df73dfc48801adfb4bcd8fc597703d9f41f0210f9e933fe78985f77a1176dbaa2f30e958aa329a1e849aca7e65c83651f74e3852b75e18821e731e7d56544b3e1460e4b9f00984789f7ffa039ee4471fbbc08c473ef9d65780f4ba9ae6868c1da424bffedb9fc7e6a3fe75f331acd4d5284e42c6fec29b78dd7081982532b0c0c37b0947c770415938609e2ecea15781067b7f081a93a26ce313c2117a0d0508a966a15bb635d91c4ba5a4866865be3c3b0c313bc95718b107c24c298e9a613d15106ac79e4f1fd9f560598e4bc8c6b874201988c15924f92d3258d9cce26435c338089248dc764573c5ab499392ba65a94fb7fa7c9b2d11712a269dad6a7cc3d32e66e67ba3ccea28dcc1035abdc2f0fe58e796fb6907bfc1505256e27163a1c92c5144ba60e06a93055025b8024011c7822d06983f6d7555763153fde45b96f62ea8f0908422caed86d5134fa097c549f6858c950e2fa80759d26db26b4e4c8596a414efefbd95c18502e991ab51d6a5b50703a2e97f4a82c7565b2f66cbb470275a979fc9295680398fca7fb7bdc48c5d850928f4eb2d513e87b773086a536126e14b709cb718948f75242864a9499ccc0d62c0efd8dd3ecd46ed6be71ee0381415694697a7eb606d35abce0c123516e32d5c7230d86b1cbea2c414b1c9a38ddbf928cd446565a98345750f03b0079ee382c5f7c3afb6a9c6a083ab0d24915c7f0e782fa66e6d6b0332781d6c442f4729a6f12ece9cc152f65f49e31b2c22fd089a952b1cf0435c2754667f4c3a458f4c66aeccdbad6281b4db28ed200b18324e21752d4b08e7494a273629e19ee06a057de4b428cb82123c1d9af6433a0068e1e85a218047c332947f1f67e90cc5f28b8129d9af263c1c8f823254e17231bced359103b2ae5c39a41153294758e95d0ea25b7bdf51f6d638c2df3fcf0b6b2a58120817f2907a4c4255af1ae95cc667bf3f0c6f082bddd642431acd5c8a49e1bab0d271bd9bc06788d67095f4c74b1d4de87a4149c2bec4d285ddea443fb489a56cc9c489d7d648b2c6f1092b193a3a30dceaf5ce4e9712fa9a6896ec2bb5ed75f9a77b034886d3c40648bd17f7e9cc54fab14d589547b3db21819f7c020eaf6d0c8170951fda3dd451bb723898dac348c2d6707d5080a5a45663650ccb5ab106c8e30431768ea1e959de963088088ab2fa66c2c627e937e40ab4a37bfdc23483a20aa17cae865ca4dca51b7594baa4cbdd79803ba1784cb043e0904f20c57209232930e351087ff695e8cf3def847fbc09df638ed339a4368fb89f6f1c7609ed329d7c16e60fd63f54e868f35302316046485eae60d57d403f019e9187c3d3ece85ea0ba9f031edc4177c4844f69664cbbda59429c9a70cef0c000db0270510e64f43fc692660ccdffba98da6b0d24a5b58191cb6793dfa0470c77f950498fc3517b5ba6ccb6edfbdc58f33c8daf71487f9d69bdcb413b4522b65ce637ea8ed304806ee347495e0306ff5b055326c7b2bc507cbeefd90d9258585168b8d6fab30808f9d4cb96fe7fce7fc3a23c7e18f0399c28cc88ec178208390d5c8b810662713a1c4797beaaf33a56dd995f7e346c8396f851b214458093099153dc3e43629d620a4d2d11a9a942e9ab66d9b142cae0c9fa468c92ddac4496102760f7c4fe349ca110a9e4cf02543294b4841eab24bba2b3bf47ac8ec0eb23f90bb0bb0c092dd763e198b281006f367a1c08cc513fc356e6598211623a30c3b8fa246f95f1d429d8e623527ec27b35f1b1c6c8db171783ac1960c9f94b03c296969fdc04a853ab456489ff33a731cc77130d7ca61fb145d39ad79dbc63df7f4a7abd85e61fb35ce9ad1996586fda093125032acdcd7cae93c955e8f22b53bed55f09f0ec33ca615915962eb7f4fb1b5c2d6778f3e91cadb733e9ebc00c660a69a56abb6c361da5fb8a3fd8e1d400d7325a032ccb57b87694faf8ec36496d8141c0677b44fc17d26ed2853fe2017927630aa6671093d7b695882eda14e75d18eaebebd1eabe8b22d4a29a5abfbda9e627b8585bf9d61619619f657e78addfeebe6b66197c3eebb5c3930a8f3b44f7673170c5ae1af2873182e4de5af27cf87dceab76d831752faf4e16a853f0ed00dca44d0aa69da89d16de5d6744e28354d6aad1f25e4ed857cc29d8641306f73cee9f2abbd1629c51f07f286e70c6a9051639b06b53cb04626a0f2f76bbb585907644990e3ebc47761c9d1fe0d35be2c22c77713204929c164e8d45df4439d4f66bb3c2d8105fe04b2b5626ba55cd18cbb45b3f8f3dad0dc7d221b63d28802e41b51009c15518002e08c4a9757a8651b90938c5e7feef66ff7a3f9bae719efc436748ebfdd225706cfc850bf6322227fc742228c312530c419ad8a5175892974071134c8b31be7060b9fa280c95f7764e6f8dc94c902be6a15514800c042a822be64d973c657817cc9c934972cdb8b972f596c91c513569aa441c46cfa81114fd4d0411361967c61c5154708e1c4082317d2182304489c31441431249291084e48ec00f5458d1f5630c44e09b6e0224b10a6c83003680a284580891284259c9458f0833198cef0020c0a8498536e11071c1c2006145d70e84106574cc920881871413af2610a3356f0848a134ca8310582a9248aa60801e5c5124d3cf9418a27d3c8d1d0e10b10aac86822084f46d8402a4a175b1471c5114e8c40e6f22fbc07ea400918782186d211540c24105a510bb04051c4194a8e00428b8d6ad34b70546404163190c2882ed67002055bd608e3054a276092032a3317c1530978e85a399fe19312547995e1931234c89f4e0e31c68f52cab71e3d7af41863747fa813fd4acb5d8fe3c89c5dd79af6b35946a1186f4be66e4a9923a6ef4cc44dd3e284708bb1f556ca1ce1721fdb3222b38cdee573e5bc1c92dbc2000e697d39597e8eec6c6b4e9987b4723f0f2ad4f1e95ee14e7c0ef6c476cc41589c3eff08e5e04eecf63931853bb163cc1fcddd1015ea7cd189e5aec562fbb9a72e48bbaf95611b650d498c690fdfbd0e47b7e338eaa81723832dcdcc4d4272f24f95bbddf53aefca7ccbb6eac632c3d20693b5978269fddaa3de0d896644e6f6ea336dafe1d75a897bed9b4b6bdf5ddce7f51aeb35fb5ace6bdf608ca21fc12099d7de79803c6ebcf6ee03f411e1b5ef2cfef3ef24a50989ac35d310597be805b8ffb5167b85fdbae26c5b0f6a695ec8f30c1aab0ee6cd88eb3acf95d579319d17738da93d58dd16d3ad5832334bcca0412fcc34b18a9a6ebbd68c6ad3e17c75757e75f82a59c2b9f9568a3fee04a193127452824e4c5491a1194cb020c3990c9f985822573703bf19d0a3c13fcc98c1d60cab65f8c4c493ec53eed3d9351caf7d6599615b38eaed9ea6f352e37de53a57c5368d28abab93b95e65ee0d11dca9e65dffd95c3302aef1010a79bdb122d3d5aec3b767dc9582ffdea39fddff8b8f7e867147c59826e3c4b5792ef40c7fed3a7bebe770ac1fb817cdf0a9043db0bc2ee6d67fd555086ace7604cead7f733baa7a5584ae5e8b8695193e315144a6b930439bca79155b2b6c7e79453adb380fe08e66a3abd7bd384cab823b556c477d8de7c3b52b96b61ce64d70735d782f9c7db671f147b3d7d5db59aeccf5fc6bd8cf9beee75cb206b3375d8991b1e9b85b1f078eefa3a83da5567b7c3bca635baeb025637ba0655845733b8beed17ee676169a4ee6da1d58f89444970c9f98689267ae1647794cfba6723594f62ee303acf7b6168f69ff17fa095f6fc91a941328e431332cef078fab2e0472e2b81de52768dfc2cdddcee230ed6540a06d2d8fc3324d2c7d77c202ee68cf790d0577b4b73cd0342c30a8b3f62d97d7a3488771c12017dce96f5b85854f2a30ca5ffc216b0fd7c8ab19e4d55b4a5bfbaad1e79efbcad15af1c781bca23a1aae21def8085fa0d4361caf38cc7fdb66f75829f7f91a2a43c52bd9b73c259194fd5d8bfb74f678c5a31c4af67fe2c4ce0d7f2d5966d82f85ecdd0aac7ca7ef0fbd64810293651787f96b5e1cf6c5e5f63679c31f075a0af7168f9a8ab2de5330a88db247f791ee43657402930426c327249c724f864f484465226d949b6586957d2964ff0ad341e2302772c46147887454ec07c17cb02abbcf11246d94855cc8e12c3e2cfed0591bc51f8f2d90f0f34a06d9df882c3b2e12935f413a29bb0d327bd45cfa9c737a111c450c901beeb47b2c1495d0fff9cb4ece1985b562ad582b394ea99d1d7a3136f80ab4e18edf90dda3bbcb6fd8231fcae852ba33351951462d462d6a8e832aa983cb306cf415e208b211cde51bd164c39e39631099a3076173cef833b60e36dab6c4c8da1791464623c847e6778ede0a3679e28f03f2a3662342290675493b3a9dd44497b421a18442c8f3ab9471b66cd474581f07f2c45d680e658c2f3fe2afab94514a0875b03e0e787b196d63cc3d62875fc5ecd77997ed985085cd293acd40c39cdf6d14f3bc6dd44a3c161fd07ded308db1b89ac159fd8ff6d0e8ed5c618d5dbd6135ab2f2f5d81cb1bfe84c0596daf0599ac7dab28cf644da32bbaaa47adc461b48de0b476aea67673a6f672f575663ed1cf783e3c1f4172c5c2a7718a3ff563ae1789c7e2cf7ba406da681e6e64b3b96a8e5f6fba792d160b5f7bc2fa771b5d9871bc89c461d173bd7de4b511dc898fc4ae90382c3e1490c87d3aefe4f94790b05e4058805063ace6cd6ad5036e75d3e5c606ae1ca01480c678a9f14a0347840e7a3d267c4d6e57e3ba50113c1f540de9395e0bda6fdfc5ae76ac0f029ae75e7bd19b97f5152d91b5e944660723f86edda769df6e7afc560b5e0b310ea1b6a0fb47879dbcfeed2100c777d8304219bd8de8d6bcd605d6c8bc1b9e3ea27f7b2dc8d7344d834d6574af859be3b0fe5c797e7b089822a8360afadddaec152b5f7b083fedbb1a6eab4a853ab44a57d28228565f5fbb5e719255d5dceb7105f6703806b4c2074fe6de63751105582421be9dc2ae7e7589e4dfb09aadbeb5c254c0ea25fe84644eabacd5fd8464fad3b638ea491afbe7b74ce7315e8f2bd1b35178cbeeee48d3adeecb7f5623b482276b2f35acfd9065bab5956d4e4150ed9518cb024bb5168a42de767ac05261b517c2020be4a31e94db73bffa6ddbe86f2fbd1e1b9d937b690088fced0f0033fded35b0011c79c33550adfe9055a65f376f852dd7dfbc1f900c2a44646101924185082d32fdba6d2dac32c52bfcb4e53eb4a177647d0ca0966e50674a272a8d28bcfc8bd8628552024555446c5809fa9bf652b2b29452db6e09e86fdf247cb00a2a4cf948ccda7b951214d9204b0f96980195a4c2f6ee1dc08b00842a6cee44d68086378023cb28e2439d49e445ee118a4ef5a09ceee37dfd5a6be7b0597f7e90faf42ba62db03554cb025bc3f655fcf112797fc36ae6f9abaf792bcccc7af71440c42c3ef460b8c942061522b2904105c95eb1d5b2c0d6f7d1d5505f7e95dd5683ac320be34f48ee700d746b8162db729f0db71ca6339fc0b79e9c527afc9e71ae405bc89d6bde1c79ed13367a4156b2bc6db15b9038e23326f4a0ec09a3ecdfe47bcb8e5e0b1bb6f3ad153be74fd7fe93ee5ffb07fc1890b5f95d0b6dadb4e254ad51aa49a38d72946db2fd1b1c231bf9bc7d750fcaf831fa2b08fc995f9b314aaf052b765b81139237fa5a96bda5b1fde0b1226f0f3d1f700cdc390cc632aa7cdb33be7428360877b8a6bfba147f9da7c52d8fd22f83e494a6ed9e82f65a93854f4830693de446330dd386413d257f386c44613e8d241075518c2e46ed9664b6d03061e1c3edc908271f9272955d095927c76331ba60b72b22a0b1941c96fab997b865c576e18afff161f165b1cb16366cef877f9d5dd6ee6c9be795f76be5f66fcd250f9c5e2f6c4f371b637e2467dbc3b7cde36ef82544c9f64ae8735f340b546e948a1a54cacc5e0a6dcfda2f007be801be7520e840e8c336a7dc4240258dfc41a7fe950dac67f844a52a7f36732c0801a1b2032a68b89475bd96e11315aafcc1a280c08941258565085f541044942766f70628584207279a8408228a31bc4641098c6a8512979e415b14b2ff57d992fd7560fe327f20f7f9b15ae40d8b9393196160a1c60c92106307331c7ef02405504d9abc800b14344050f9020531d041182533138290431a2b0873822896c8a62a30066a4ce9e294050f446889818c186c615205124928492b609cb181e165732d874d3ee160acc17221b26fd9dd0b23c2e041a60a1599a72a423c5531ca35c3a72a4a322aa4f2e7a202953feacad171a3d9ea6dfcb94774c6fd769530019a717f4467ab15772991577c22e834ebc0f61da06f42f691323afef85808fd8815006714c318c3920636aab0f0894a537e6a822abb0f7ca2c294fd3b388bb58fe84c0afd2ffa78a128ef8724cb1a8e78a6c93e52468f61c2f088ffc1cfa191ce304c98d916ff886729db43ef0503cc360c634c8280c9d2ac77a8653290e3cbe438e7fcc034b26a18d3b4f8380897e3cf6e7a3d5e2e745fff850ebf6013842d02bf700fa972d1ac68e64f23feb45f5d25abb731e6d7a6075b047ec947228439b6c7eda328cf178a2e7a3fb98209327a2c0edbe099b6a6691a9db747bf11aa693d249cad288573bac00551405f8213f5c7674f4e5c3cea47e6317f1654709fd57b873feb72d5556cb9cf8ac2ae7bda75864e3c80c970f514faa0b8ab61f5d2612b6c0374f20129635b33023bff93d9e9c580276129bfa8b289bae7649fa981fd5248a1e6899d42115e2d0763c09b720df3b5a70e6be9be43045361fc59929cf45e385a2a02946b3812737c582e9a715fe4ebf9dc55c23d93a52240f948cca1b52ccaf285a25f98b96d1b6a0e378ccde941b8ecbfb4bdbc462484cd19646677385911dbe0797beee51d72a319879530b133087398205dc8eab97be43325f499d0d90a37cc1167b7f44b1377c64149ca8651465fb24f53a0f1340597309ea6e8a2cad31458909ea6507a9ac2e8690a274f52ece0490a1c3c49e1c5952729b23c49b1822729967892c2c99314491096a0cd9741d3622801c83f057f15fc81ac608b99ec0f035396ec3fc36c87d6a766ec3863c72c66ec3863c72c66ec3863c72ce68c514ea486b2761712e5714a0c3d86a1c3b4b012ca6e204839e1941142e81c0bc29df8708ea00ad2ceb140fba464a93e939fc5bc77951cfd2ce6993cadd672d7fac0929061155a78c914ce86bcb7cfe1a118238f1500673096f56881a4b0def33ec6fba39fb1be886869c8e3dec336c6b4a7deb3384ce18cf5b9b276b72aa4c2aa07fdbaeaaa477fbbb40eb919160dbbcaf0a904406416155bf47e747601ee687dad0f608831ed3d4db3c2c240e9e6def6f5c2fa1b8761103204a380b82084858dfb7a8360ef070955a31ae59c55310c2dc461461608744108dcd1beaac049fe201a1cd755aca71d7ca0e40323e80e4e475748f1728594328e92747cab2b09ab7b3fa8f428a59a9cd45e71ad195167abd7fb7e1d1e2cfdefebf57ebbdc6b160d25a2b2f4ead75a9f7e48dabed6dc6d9f13a956b70ef3605d2e574e57a3f2d723b597d15e8951a571977e95b5368f98f8449b0b18d35ecb01500db22683acad28fd5a89b35700893f7de4d262e798db58c01eed59b7b580d1f37ed8d8c272145b27ac1491b9af7007b9637dad40b6e8eeaf715fb78e2a3183ac6d4470c9dd6f5f7d8bb9c30db575501c16f2ecddafb9c850d049480528e4da166387e9ea760ee33e7a2d6c1c876968284845c3909553fe1a8dae625139c95fcfe7b860392ed86f39ae0f80d7030070c775c058d7db16d39251fe2017524e393f673b3255206311060b635b2ec88329dad1aafcc11ae87c8e0e2ccf7f21d82f2747e77364b021d8af05cbd169b9a670d0b6357f2a7f100d9f28a327edd32d01a6032bec4a701f87c1feb721b23c1fe603fbe9641d4f01ee42cf2896c598104ac8f9d8bd4d19351f501646f8e9cf7911fe068effbfd8475d6ddcf6386e57c598d64edbd64e2b566d281695d55e875ecea66e1dedea5dfd08d793982a1487b279cdc66b742afe50c59f1bafe1f8127ffe2265edb915958d698fb3992d6468dba29c8621541109919c7dd4c4f3623acfd5c65c6b57633ae8b96ee719cfbbb0126034b722500a40363270078e26a4c22b3a10161a8a4a1863e7dd64cff3f0c781fc4ebc77afde2dc327248c322cc32723bee46ad359efc2b0dd183658eb3f2875636e4a71655dd6e3dcceaf9b77dddcdc7ccb7d586bfc803378510de76e5bf5c4885c735cb70ef791f542f175bdbfb9d475a5c3aa876dcb611906bdbebed679573aacd2adf3eeeba1d703e776ae9d47b175b21567b5c930c3f6cf0559795e100ed740b1c3a4d783624d0adbfa96fb88a0b59398e97bc4e9014e171c1be0dcd0da688c1c3572d2c8e1e876895428b8da85f5375fbbbbc15fdff07c78f8b5c2f6de6fef3d2dcaac1b9d77bfa2ed3d0fe3a81fc537dfaa5f376d8b9bcb6dd3bcd76837a5ddde0d99853ffa37b786ed61168aae0b33cb6b61abf5eb538b061a5369044ef267faf5d5d15bf30e1513e3ae8ebb34f45a33dafbd15568cc58cadc853a2fe4d21332c2d757c7d95cfa366e4bf500bdc97d3afb150050d918005ccf2b52dfabb5d3b93dc338feffffffab3671bc4e8a9284e342cf74be675d0d86315631eea81ef5e5cb6b24288d34f3e22ecc2bcf859e8d205910bff37efc7092020883194218a55f6f7434892a99bb304b9a6779364dac4d134bbfc6c09876c9fa88724b759e0f6fe18e72269a0bb3ce85b3112e9ccddc8f7ed6decfe54c519f5fc91a53155b9fd25a6d7414070e1c387ee552da7b238c30c233019a8df0f54a1961841146788c31c61863fcf7de7befbdcf04e8ffffff9f09d0ecbfbb715f849b73697ab0de14d54594144d94c3b4e860bd29aa8b11f0fdd66ccb3645ddb83935d0ff3a6ac35f4b65ada7b2566b92e092616e22290720432a9a60caedd5a75e8f8a83dc4cbfc6a3324a2ced28f7d1beb5f8cfcf34389bca5a17d3eba826ed6d7096a2f2e7615a2cb4d29456e2a8910d2fc00f5cdec5cd6eed51f99353f4908ee43ef3b777a5a973611e73ffba5d2839542c2acb8a81fd748c5a091804c57d7a098cf9378f7ed23dfe9f348af27164cd23e6fd1b88f661716faf532d813f0e02e84731e6480e732e4cac236d31d791bac79f75bd88f623e08ebf8300fec820604c3a89b120a07bcbcaa6ff6494ec593255914a328a9ce23e2d4772e944c01dff6fe60e7f5bfe1ce95b4d28327fd1492a3b92bf4e09392fbde7942c5f7d913329bbb7e7ca714dd931da222cfda93dbd25783e3c6b58677b19bd156e366dcec028b71efe94524a1695fd5a4976b9b5de3d6eaeeec8a2b2539cf2c7f2c2ee106a1e34ef3f6b9f99f7f7018364bea3370128b596a6d9c032340ffb9f8bf530d6790e70c795582f555fa237b1b5c2caa7b96dd43dfe33b773e86602772c8eb1f6678ab0fde5bfe612e57755762e9f5d1add125a17c863fef3ee70986fdf964b2821bb946b64eda594b37dc62b08a4536ef97912ce0cc6980f7605ead289892bb864f87485d2154dae3dbc1a93855e0f9610726025c81cf6d2aa01946de81d2900c1641f7c177c89ed3fa1604b8e11ebc0d7f0f72e1776b56ccbb5c6b66ddf304a9ce3306f5d69cdeee6d7d94cf96b65e9f9b8c9dbb777135b66a9ae0879cc8fdf5e4bfb03db633f1810c8054ac3a7294d7986e631dfbf02cda3dfbfc2603e92e4af48ca95dc71c31f06cac8fdf08a2a146a90fb6bf48a38147481110e5394f2ea3dffd87090d510228d3272ffe6f980645cc9fd5c9aa801123458830c16e49e02060de01650c0177001b37001b768a241101060236ff82b8a820628f4d0b345eeaf70c5711cc7ad36d6172409146800b36cb1f3052c0d1ff806b91f6789cc16d806597a0868e50d7f19d022c3518e7232d647648adcb54b667d1b885a6d004c8c934dc1017a5e406310c4f367030b38ca79acaf033f3800fd227b3f6611b99ff37cc4a63c6fcc7555eb6ab5aaab55adabd5aad6ba5a552783f5e5036847b93f7a0758e990fbab178447eecadd791bf6704f2f2cfe6c30c6bd73ff4127ee61e4f027b369626b984f7f8563989d5758068751d9898dfc0f9e5c04861942ee1f1fcedcd3af466cd0f2ea8f786e03e4156eb8b33d37afccd029b717c433c532386cbb31484df33143eb06b64bf61f2203101474914519230b575cc77071820f93b9a09249b92ba53e158acdc4b9d7436b28b5ee2971bb3338ac955c60bf366a25fe536770983753fca95a93d7776740d1ac369453b25a0a0ba7369a94bfd5eaa56d69dc7f56d3e8bb73140339cc818c70d001fef40e480c11f503941190c37a340e4629684a34c95f4fb1d18e2a691c8c8c583ed0ed6bc3e6211ffeaa7de64f5780faf0b39121940a4086cfea1fa16b9f6c8c70bb3d45c845996ed72b79bb7607ab6ee5f5e8238fc260acd771986bff3f3a60db09ee260eab2b0ce14e5cadbe466fd5fd1bc6d6615ab7b0c9723749c3ae5ad8be8f2a0b2805a0d6bc1e9b6cc7b6c9b62d4a00b03e0ee415ee4da35886139c20fd3509b865f74eeac4b0117f404830a883415a12b04f90bd5790bda1c8fedd0e902276170c92ef7f0449fce92f8d4435836ca4fd8d74fe5c4870a7bd74937ed24e1aa99bf81cc295dd05835ea70b63892071984bd957867fa4e3c1b6703765fbbfee89f943ee830159aea1bef7b01b060fc0201f7ff8405810d20118b4623d9c4122488e38ac4abb421c36ff677e49d1ccbef6d00577e65bbc8301664beccbfcea672e8db12983618cc91063f357ff436499e35e42ec2f00ce2c162283df21186c30e71c82f3ea89b88fb6fd7c9a6b7b2b4c254b88ecb58ab9af157eb910f3ac5f3d0b132dadf010eb2d26b2cf7a22998ff991c1f62d265ae25e4a12598c4d8dfecccbcc60a1189b30c656d862a8ddefbf0d0fa91f73e18c555b57d80f5611f98f0c1e9b53e4f9dd84c811244af2d4344da3c161b3cbc2f617994f0406695c724371d88c725bc961f3a914706772c9d0fbd14c703e0d780687cde9b4d252bbb35186d5e21f6d2d529d3b56b9cf07b3e40ea2c3939ef90c34b892909c2133cafee973ca7f20177fd254ab2e5d7ba9fdc57f84b8529613fc04ffeecafc043fc1df8dfce7c89b34bc5706183cd67d94fbbbb57cb08aa98fbabfaf783325d130c47d9e9e50cafd448e2021729f2d469ff815a1548c01867e7282cb931353e4f6a2632061a4dc63742061a4a0c248e50abd63640109330577609e342fb01facaa484e8e8c5a60bf7612c384f98633dbdf4ee20fec9e7ec825bbab9f0502fb35542c927e22f1a7a79ab042d506cf652411c6ca165580586306674bbec2543b7ef9c35c43fcb6010c825c727fbc3770a7df2f2b04aea21f960813842e4db824f510c4140ca45831060cb65899b50bff42dc120513b317946031d6fffd14e72c302a347225cb952db9c6686f61507de8eedd5d5234eb3c49f77056bbaf0f67eddf9c12ef59ef5749bd4445b37ec72f232f17ecfb3f60e6e3bf5c8879ffa198f7d5474c147f653fe61f6093d8190c576fbb12d1aff5bb7677fdfea1fa5dbb711221593ffd4f56a38438bd0c4e62bfb26464f06bfe0db3a219ebe9255a92795a63befe03eccbfccb05faf587e8575a5fa64e25211263dacbfc032c96a176ffc129a3368ab1244b43314f3f09ebbb97c149629efed7de25f2fe35ed9c2c56cc5bffee271ea26fb1ffcb05d6773fe4244927c598f6dd0fc568f16b1f2c666aa618d35c887fede275a318d37e75dba94a4947c5584c7b7a95c0189bea289b20ec866995377d3a7ecd0b675c12fa70b6eafa26215a52009cf9df254533ee5737893f9cd5bba46846fbdd1f7a0d289a71d893ae3bb93d4c9b10d822304cae613e64aa3fa8ac2e2c1dd828d7dc327fab9a94456ec8b24e2e0ec3717303078ff0d0eb0180174e4c4c4cccdf879e8f989f498165d920730dacffff1772ca3d6de1af28b7bef300eee779004fc2fd3c93f06951dddda3fb81dd5efb51c244360392fd4b3ecfc3198699c32f89b1e7f83c7733f213e2b3486037bc456d503d3c007736cae97821878a3f3a686aa4bc9a281a98a445bcc215c730b42f0e8b4658031303bbfda77df100dc89923c1885e7f921149ee7a5c44341df8389747cd013e57814be68165f76758861c2cc964af89d2b598497d83b424bf212379796147fb428f330ba74dc243b3e87b5b2df7197867a5ec7e7b849783e870cbf34fade37cfcb3ec9928787767ccf27913d0fc5433c2fc3433dbfe393ecc044b42f3d58c7471e9ce38778f04b7bd9c3998ee7e9f91d496449968664cff34988968676bc0c132d15e930b9e6a524f91dd8c658cfc3598ef7f9d5d7ef68de84fff9cf9a807f84208244425888ec53781e6f23448cf160027c01fe83533ef8044a77c8308c3369e70b7045b81ffd9dafb99800b88d3e89918d0f29601eb89dc4588ed7c1c9b2d4a4f695e7d6ee7884c0184b8ab22dfb1d0f675f7b2f17785ef62ff0bc0cbfd0f33b700ffe1dba2304a7c68add1e7adc530e96393c1475e4d8843ce86e285ca00bdb8401743f9302bb7ae8fd08c00fe0857c4b6a1e2560d83d24c4fefb0c8bfde7cab058ec3f9a61b187cdfc4c0aac009e848d4a2afef47cfc6d2afec0dfa0dc67fbf85b54fce19949819579e8fdb81ff342ae31c51fd647d6463d1fffacaf15ce6ae3c23c6d54a9c969c3c6536ac3a39236bebd1e36280d0977841fc0c52f73676eec1a9130ed0aa0ea0370bf239d2714ebe67ccc7d3d00eea4729a5d2616352ccedfe0fef57fbffa39375eddebe5bd8183f342dee1dce070a41af6e671541ccf7325ce819f2b1ffdace799fc6cce9bf3f2e278ed867cf3379d6fbebd1e38b41b9a6f5c9aab0822cced87785ec7d7244b5a92a5ba6117743ccfc7d7ba49c7f7fceabf6e7a69dff345b3f9507b221dcf838778be67ce8961edceda97b9eef590e1b8793f197213fb335f6f519ec11188eeb1cf5da12893e493e8c0aff93a3ec7e7f8243d3a3ec70fe5f8a19e9792a4a574e0e6796dbe0e281d3db8a95a2a474d935de10f8291a7f7af875e0b38efc19d895b50c5cd39b939a5f69df6dbcbabfdd6bd36a5308a9973ce9752933132b26eeb632ecdd3efae8df72ecc22d4bc911eac977921af15f697fe727484a484f4ea2f47489c12ce0b2709cfd210cff727c9f1feb0be8eefdf9ec69f1cf85575e0577d38f379552c44c9121dbfc3cf787ec9cf2b21caf1444d39f2f0f0bc8e135ec71ffd2cc7c3d90e3ffbc14c7e96031379538c451f4ce43c4f7402d681899686743c0f26721d38e69f93e3799a7ec7f7fce75039f00e0698f13c8f940ed9dffc8ebb8301663d2fbb3a1031e1dbeb9183736e5e9766137a2ace6d3d776d62a4773217de18253dcfb341392c729c7ff12f1c8e9073dc16e5b0f85b962436a88eb9ac97b99d390de9e848239283294907cfebf8ed73dc98c4f33daf0327f17c0fcf8ae7f63c0f0fcfea2b98ecf1f478de17c99e685b009ce9b024c7f3e8789ecf8189968672bc8cfb1c984807e6e9c1470698f160f92b8f66e8ada0e7cd270e8b06f0f02b08cedf3ccedf34353575385d87838383132792177bf3f32797a9f924c79769d8d67ff348f6c0c6b7578271582402a5e346a82adbf33c373dcff3b5ce0a9da424029abfd55b8428f7f0dcdc3cf47adce0a9c461711af1c0b6bef5363ff332f13dfc1575d9e6ae06c97eb24a7e719f28b10af3027158f7b47b9e2b8b3189bf235bf611f3dd4fcf07ebb9afd5d6fa52ca17727bbf1bf256bd2e736ef3b59777be763d2eddd363626f4a6a4856b2c896572bf9da5dc5eeda3c7765debbad5f5d1b4ff3ac199b975e8f9a97b953cb9d520e93d7c6e68995413cb75a36d27561b6392273eb5b38b0add7814ba6b1f10366fa907efced89fbd8c0720b92fbd4e017c5522ab7b0dca0b09658a9efeb579f49557364f95066ae4a2048a8084654722820113008fac00dd7e76e111c53f5e7859976521ed249b9bbb3cadbeaf3fc92a259cfcb8a2315dc5902c3f4e01d0c305b92e37b5e3ecf8d524dd8cf395ef63d98c9cf78be8a45963f8774525692e3655fa473acea9ef86d94631add13bbd9c5612c10d8cf354de0aefbbafaaf8fc8f261fb482e5d44964d0416304ac77fd089e75d1628cff97556e86dbfc9211ddb0d5379cec9cddb75110dab1ffb885c7f85458df569f007547f067fb25adfe2ef3dfcf2a1bd7c1f1da6060d1391ebcb0ee4fa2f1778bee78778308cb11e3ca40357499523a5cf7df5c17e32488d94729f8ffe7099fc8ce773f03c939ff574528ffcb81fd249595b1965f93d576eb5e7793011cff760a21ea2a42a1f46f93d99e7c2d94ade4f26e5b87026ebb970c673e1ace72d1267171c84fdb4282f5153555ca4b6506de932a5858b10f6d392b0402531b98fc4714a296953dc6736b98fc433ea8afb4c3cb5382c4a15f73181fda617aa1c5f7b1285b44583e23edf74f28eec37bde4f82c255b727c4f89fdb429ec8cf29152b80f18f799f173849bfb48ac7d81b158b3023b9d8a70580198273208c36842c59f97fc2244fc924510bfa68afdb42f3949cff7fb4de22ffb3a93023b33c5ca6749e1791efc92cfa4674b2fed87743ccf6fdff1e7253fc9d2fc243cafe3932c6d7828c7f77c121dcff3f137a3f8f392f8a56117785ec70ff1bc0e2c9d0cf57c8e4f92034b273116bfe7e3c744b13cdff3df269d2cc997dd243cef5f37a8f8a30101c6e2e300c5c32682a91c87b0df0695bfc09da11efc92dff3fdfd3c97e7fd877abe9f07132d0df17c0f265a1a222589648ab1c8133f29ab613f7f1bd4061525057f12308228567c7841125ed098c5dfa6e00f0c038c319468aa1265498859ec799eff64528e3d58f260292197997f7cc928b813bf9565177027be90b34260e36b5fe26f46f1b723f80369f084099808421072404205b3f89b13f8e35ba4a8f44084921078318bd4894c11096e012b5a007f70832b7ce00314554485116b01173596ce907a62490b645040993a810834adc8091efcc08411445801e30713b42c41250d262ab6e0e24a1af3071aa5748b10281341702b4eb0644995e89a8a55d2707fdb5baa78910109a991fd55002244364d75193e552183234185f027ba260392d2bb6a9af6d246ff0d4f3827a6d0ddcb105241c71755a8481d6144c61368060e945480054c0f51802059004696094617ab19681ba560d8203fabdc87f5fdd38bfb74ff623dccdef74f30ee638d941c35711f8b7fc0ec447ba221b94fccf76b50dce7e5384ec9b18ac33a32c5a4a814a30cdd78a4f80371ff9d49c5293a14c765a2e37fe3be5e80496e1e3e9c39554c1af6732e139d99eb5f57c951ceccf54c746636aee4b17eea4afd1e13eb503c8afbc09b87d5afa60477fa5dd7e61e09b9c15a528cdd5cb945d4ccaf67d79547cca037a51cd6484e72f74f27136926694c368a6cb8cf1a74d32204d6dcdc3bea830842ae13aa9830228918dc00055f481eb630b183932a65b0c00a8d0b994da8c8680b229000c20a1d6ab0033d83aa082e92baf8a20a89457ee114b3715f30d959f38414ee370e0b6dd865c5174a74db36f7226ab5b95cae87d10c9fa088923f5927c54c3642de1e92f03120cf6f18db1ebe0b27e7c65f0c83581007ee6c2f0ae4798353813c5d70e7c602793e8c6d1faf8b863cb54d6a79f3409e4e94e777cf06f3ec59d1ea86e8918a4a21c436866e1407ee04e11bb803e78cd165b39c4f31fced4e1bdd0379ccffa4941fb539e7c799ee810f210fff4f7afbb5dd037f2a51a18e065ffba494b2a19ac6767f988d31b69438764db6c9f6cf4fc6483bc69e7d863bb065b2c4186314823b3026c5189c4db5ed2289b198317ac8b4508641310f7f06831ed03cb8871f43f3583d7c08348ffaf0658880046010ebe123893fad87350f716c6c3c7c1a88b45233619979f838d7c298040292c9603258420e2074d13001e803a3affbb76924cdcced270ed3e206cee7bcc7ffc7f1feeeef10c2d7bd8131196b008ecbc198fc1bf7c602f9368c711cc89af66d2473fbef111cf7c6857e8208d7c298f639d7f5ad3dce851a11db464f3ce6eff86b289e0d20ac9ced11ba8fb4b92e80e123b30112dd4501eeccf76e10dc99cfba3ce0cefc9b9bb1c836a70061330677c1448edf9ac53ae08e0908f0189c434702b4eee6b200e7c32d5172fc8e2cbc02dc9959aae478002d9ce86e10b893c513361785eb020d8b222b39fe58147eacee093f417234e1841572cc017ba60908c8d1bd3728591b96c19d99a3859a0b83b1298b0f299d30b42e84318a84ceb84c0b60e084d7440a0a94bc30cae269e6505ca801841a5e6891c1cc6515d9392d56f2153028c19c7406084d08302b5fbccefd0a25d4d8c20a21a6c0c1545c42c50d2a1b851d25c6690f16a6286c34f9c06130d5d2128526c2c0cb4c6412b5041113a1c8c1836a2a749ad6d8e22603bb65f8d4e4257f5d5297bcb2d2449553900175ad1c5618f9d371f241a3f3a59451dbb63a84a5c9f0a9e94908964ee14f4d54ba1f4218c89295e2d466d73f35356932ca1f2caa4a853a55080bdd2f2b41c761dd4ffc9be2cf7c329f4ca4f92436cd199f34c598a5e9c95453d753cd05098a4fc9d171988d322c1454744a9a4f9eb8cfd75319c97ddafbc6e2b1c97de09315aadc1fafb84fcc3da170597d73557575757ccb32319415a609064818300e8379ce0946c9902e0dbb180d813bfd424ea3457f3657719ffe9e9201ded81463fdc3c823162332c3a9dcdd35c2d1c9cbcf7bac9f7eeef839402e33af071b7f9a4b97ee6c663d698a4dfdd1a968e9a829692a8d30b088bab1828b162390e24a0e4eccfa93aa7b5d5867587fd619d67e637198cb9789b29d45765258b2ec28fe33c30e8fc9973b92a00083337c82420a491f11a9a261862144aaaaaab4a96d8e3f59a6cfd262679ee6bfded14ea42b0aa50c9fa098926f327c8aa2497ed942ea974ff372e6e5d7dcd685e176ddcbe017109865fe07cc325f94edfd3e5b996b3fe6b21e7a6e8bb2df2333b3b014227a7887c364514ec16172e6622a5d99caf99bff84d261306ab5242acb7677f7d8149d22548c8a3faeff62537ce231f9b23556fe2aa9fac62770e78b4d51e98b4fa2d2930905eec88f61c276b6f99a677aa2e6c6aa189347d4499612c9c98c173356589bb7f133586cff0c0cec27bf64f9df8492e5cf40d9f83357d8ed679eecfc992aacf693a9e6cb840283e4d1ea4a1ee08e7cd7954eae3492394825dd233f5ed903dc61d23df26ddc5875618cd9c42f597e95ac480577e414fb4da62c7fcea69828364a2a65f9322a45a5c8149bdac99b62cca36c6a5e7ecbb779d7bf60e36b5ec8bb384c52394cf6d7be3552d63b7e746a281814b3fc97dff5c0dac4c65f6c8a51e985980c16fb759398b334ef595596d5c9f660f0efa4970b377fe361b8c1afbe816178357eb9606363f38d876cfccddf60a29ab7f14533d9cddff81b98c8debcece1ecb5dde0a52241d9862331f747274a5c94329cbd365ca4b3d00c488c4925a7c8149be00fcc028a102630c19210f4c0c54c7e74823f454dcea8011a5ac23041163598c987de0bfe2f1f9efbe6895a696ad64d31166f6e27e9c0def8480583625e7e2c0306c9bcfca80318645fbefc58157f4478f9d2a879d0bc7c9943f39879f95249f3e05ebe64d23ceacb97473068f5f2250f30487bf9b207188424e54ba9f883e3e5cb2859255b2f5f52c9a9f8735fdebc7c99147f6ebcfc7bfb715c1fa0cf6472981210904c0683fdbb5cf6933f6429e526bff5dbb7be694aee0c3b4bafd5b36bf563e9185bca05157f6854fcb131d6b9a9e2cba2536bf3a2a45c2c322c6da71e2c2cee93a5eb1b341786ee893f731fd03df1b91b43f7c4af1702dd137f7565803bf1b579250077e257112e109cc9e43e1380b0f812e6a04a9619eec4b777067722101a624b2859315808ee441850fc71bd8d8f2d3d18fc6f70b3bcfbd91c5d9dcb5533bb9a395d5266f3b2edfbdadcd66c6c6cfe86aa55bf90dc6f03b30da2ac7d53218f59b321430c0eab31c2ba4fbb4fe31faf7e98a334b61bae31c27e908bcfb6e11fafed7f88fb6c586a7de43e5e918ce3984e59bee6fdc5037298fc48b5e1c80588d554ddcbef2a09ab644bc5e05791cedbc3598c84ddd44c6ee43ef3654ab0a44792123ad16b87b053f22395fc58253f7e913087c9fbd25e6e1135ab5fa56ba98ac3245395a5cfaab2dc432f56396c2a462f593e8d4ebcd8cfd583fd5c59fa519630fa51fc99d25e1e318b5559c69baa26aca40008aaf8c529891463d28fa6b27c97eff25dbe4b9a210e796e733a512a15ead0cc7ceb8766bef5f45b324f83895a2ff344343ff34533f89d90bc7a7a3f19cdc318ab947e70882c4b4a69683091188b3838366c3c91cdbbfee69d20253135e1dcd0aa2f6d64c3457f52fa1c5d7dcd257281fcb37bf7304c983060f2aafb16da49a6bf920d9165cafaf934976869a8e65b98a8f5355f6b2e910bbb5b7edf18ef9ee6c299bd2d56775b14a7e0dd1dad2b6cfc186010a595560a44710a0e8bf1ab10161c16557018adb233976849e65b4f34f3342f14672e9cd1db8a4f2345063a752fb0b5b6d3aff79be5de0d2ad4f9645294245695acbe6aaa2e4b99e53b183028be74f99d1936c688cc1f9cea6aa4ec4c86525626c3af5a5723656332fcba7535529626c3975e0f8f823bf26da0c03a13a592297e8d9e1025de772c56d44c1525dedb57d23d0b52197b59f6655e285a99eb9ab1ba17d8fea92d5a1c26a3aa14598c799e27ffb2ae14203126614c95fd3cca999c4abe7789721f2d2e25e5afeaaf562b6f72985c75944ea5498eeba7da73b7284f27a37b341aa47c8ff22887c9297d62afe251593a5312f56e882a3b192dec27f3371baa280bb9904308e5131551118a0a75be6994231627295b57ac2afb59f9eed54859db1463120ceafc2374caf16184514e392cc667555923d28b490e8b5a64a6b0bda5a5348d25659b2565fbe57c798dc81c3b4b3622739c3826b146602518d98161dd48ead0dd0feffe8e22042b711b39ac1f498cf551843cb0ef3e928adc4ffb3ff7ebc02098dbdd9dba3292e324135418e44133c6ab750789f8bb214f4cc3fc88b58717989a16b5ef2924c6b897f4658c730a692fb738fb6b90336c570687c11923fee6a4143e8ef85246181c063715c41083101868b800fcac2bca3204caf08580c49fee21fe802c873f18a5f8a313cb1063fe11c7e03eee23391f33378e427bf9c89a0beedc5880752d8c4d579e347817664a84bbdd44f691c3946861e1149cc25274250bb9ebe419438e100659f98654e5577967e79e195e983b46e6eab0636441cfb897c894a0028ba42713f0906526d58324968802c543172e3843eb818c90eb8c2db60082165d202102aa9953318411109ab0424a1039383da144eb41268cd965c825529db4e209129020e462b9174e74c1354185d5577c89292275519d6fd7d313504f34755054f8ee7218fc31bf4883e101eef8bb11183f82dfd29bc4a8613feae5603feac4afcc5682415d9edf4c3088e659653f97d19cdf38d0107f88eab3e44fcccf27721f2e3e90aba3e69c7022b1bede177d6f08a759fd26db0f270e9bd09ba861bd1c582bd610b6bb9d6e6aa4ac4d868f23c3772f480f217f37640ed31458d6cf66dd1826db39267bf845df67d6e117c5277031a3490c359c626c2a350bc9fefc3e9adf4e68c018c20e5508e104113718028a105b64814617514298cd879e4c93fd6cf27c9b9cd8d5485911366fd35a4913c33a93e61b1815eab873d989cc4c8989626188dd1a36a7cfa8d44c55c5911c7588d188000000003314002020180c894462915834265275553e14000b95b2486c4a9849b31c8831650c3286104244040040446030d2360057079631c86acfd08e790a6fc4ad3b6ff5dd4427fa8e68c64584b8d8e69a86a304e0d34a18389fa2b04968a991e79fe5b9c31824dcc4cf941ab711749f8006eeb7037d958d3ccb704192ce3dcd851ea3d083ecb7a17284dac4c2004936f8f4723ec18a6e74f428477541fd2c34d22ae04082d1efc05fe2f48bb847bc5692c4016000944477cbb46c6ab00c4731c16d8f4ac8be711d6483c11e578c0ec20b48ebbdae4dfa2a4e4947ad7b306e77cb9a22750144a73867034f47b4748ac03a7786feb8e9883a4e764e5780b2f01871b403eaa6c2e69d920a23b32acd22abaddb9537c4e73e407be216cbf42bd1be4ed611948e4e83835c34341a3a86448f0cb4af651c28d40ac08399c6456ab96e43c48cabd60f7a68b73fc47bbfa9a75dd9fa844d7e3e0229a798c9ddc75c4da5bd7d1a5e6b389905b1835efa10ea21eda980c5b2e4dfeda3e7c9e6132980d40d1d9ac80b9166e7212cd42476918d5091d911dd4e00fd12242e6ba0c415bc24f9ca331a401ffa1608a7b3426ec64ed211fb38350b8485b5b234bcf06808e1fce57a4de193628be2b6003eeb3853718ef25484b01c3cac93d3e37255297d097997deb2d53051799d3fbcd6c4d70404ebd9ef04449c9d99e838a85f61f1c1ee63dacce4b06b4aa3995c9e530b8ea0dc36097284c023c8638e6e7628f94136fb20706966d2465198e97410e95c34d7ee8d16714cb7cdf7a40348cc08111b421c73fa1955a09ac0afa54bb03dc64edfd27a166ed33cd54ae7d98ab27d55fcfdd9f88145ade830153c1467eb9a4ef58de7833d556659282050ce37877a7875e1db40778289561fc1abc0a3c84546f239dc9c36f9bc709a01ed05c4c7cd5a488e6c69cb459f0a755141fe569f9f8f98f558f891a81198da55b3fe19a60b92d6257d95f074dbe08dee6ad29c5d6394f97a9e7fa019b67afe29518f1f4ded704fa33bb16a1b616cf4d9adebcc786e10c1bd11bf468b22e2ff74fb40fd1c0b436ec99b1b37bdfbe186a8c888e83662ed3fcbd76b8459eefa42ff56b1a074e5b04c8364b8729656f5df83307dfdb00a397aeb3b77d0bded139c17c5f14b0e06aa938d143bbeceddd3f69f8f9262868a56018777d4bf3aa91a497c0d2cacf892ce03a842fcbe15e2102b0c8564a4fed3013ab5e7666eb799e2836d34d523432f2dcc5291af1dab53a975deccbbc742e57ea5663641e0b18656ae57950c13750281586d0049a9540ec5ea20248a5ee326e0e01d5c31a54a7845dac5b70c013cd58ca6f3a0f3c7e7e93f24f64b063311a10a86164cf40c2941c7fe3e834bf6cda22ce750d6cd91b582ffab7cdd605d1ce47c0e9a4cf8492d86f341184e011b627564d31b94a33596cdbc60dc44395d198ca7303553cf80b699c11d53549c3c3401d1b121a633151a98505220312d76b18cbfa2e93432c744139db04d857b10f554f57bcecb8f620e73d3aa4e8a405d7324f64ce319720e990ed09365d4318d9fc6aae930646014f880dc029150cc81d8eae727d5c64db9467364be912967d7fb2295364df062dc8569de01996b985246359be4020fd94197d3b71cf0ce9194e67a3b41907fdd67a70b445d6d70f50b258dd2ea8d91fef5a2ea6cf7a2e62397d9fef558bc5b7a13f0f427939381e34420aeaff5d4edf9e77205dcc14174a78766a43f76864b4d09de758d6da901fcbe94741a95712974860a46c86fab85a4f14b3580763c2d8513e782f803092e10d739c7f82a6682a0cd26e9511446cc913c03280a2935d0bce69fb9b3609b44cc2b181d28db791322cab7c5e1bc4ca1a1a41c15d06a160347b5f3092268c4406a5af171eee4049e263b88b02e06b7aa4825996bdf2488d0246a8a6d8ad51750aa6bc0f2864234deaab1935edf680e75594d135879016d0ce270106a500c3b85865f2dd83be200ce186d64b116e0128aa3d33e9ff5bc51742d1ba2a5a0ece16c2245c4b042b6e7e9d10b05881b58b0f307c0f4f7255fe88ee7fd9c5917bc3469ad2622ccc7706a6a1181830c63712170dcc9317f1605acfdc2d6aee004af422742f5d822bf4a05f65c9456868a6e7b8a586cf1b76fdb2d46e2f17846fcf49065a2456a3ce0883f6a6fb959d177eae743662bdb403d593f336fbce7f6e9eb78c229d08ea9903c71853bdb87c94913e0f5327477fd0cd540a46bb54d4cd6aac05659ecc48402c947cc0a64d02fc5d1403e4a8271d31f116a57e824d7139e758df4cd0340b2dc48843ee785b13c5b41a7d6faa319489e5b33184c085945c1ff630fbdb07b0e8c89da79bb06f283dd5ab845cca658a9f634d8f75eb2cf32f0929bd94b9e46d74d761feba824dbed91ef750980663bad7b72ecebdf4508d02702b3c70f930c8602618db51c7d665d76943d8a61cc52e138c8a54a4ac19fe11809b038548a089495ab4b024dbce3fd1a6a75d53b83255199a7375f892f9a516c42655cc4f91af40a850898e0cc04fc2b261a622d8fcee961b7900a2bb95222cd126dd726b67be7e23ddab94edb2a36fd472af2bd2bdd28bf22a685042bb9155dec22d32dab42bfdb64b60a6a00403a4198c13a79c437384d10393aa7d38e03e78e6f181f76829c3bd132f4777f0220ccaa10d51c2866b2cacef500a1ae7b4f9c1174bd5e23fb878e7db86a7b0ed0c859cd8a9a51d1060a8190a133b01298625ea60408cff2c9d92b3415838cb17304e5618df380c50c43d4fb04ae51509e7fb93c6c364a8a5ddba19fca2a5850ecc1e90e30bc2b93ceaf8e717d30821d12bdb6a30cee28cc318ae7ea4ef7fcec20305f4e72f93ca394ae55a42c38f721447c9d80d1bfc57605a4206d6e426afaa45291566ba9f16a84174700c731e9c89765a53e660ec23eea6b45dc063205d378396cff6b4d14d920691b22afa63611dd56af26929b26c7b723c8f4e82855680aca1c333bf8bae3d5c4f9e5301242773a15883f8ba820d662d662cb1dfa4c8cc11a3806044c4377584d63d4a27c864865d5c998ba4c6d160713afc0c4e9b4e0d2ca5970f5e5f9af9f04e7dee00d9ae182a39330dcbeb00e016e075aea03ece365dc38310610f68ec9f1df487718e8debadda155b3ed4879535258e86e0c293c84f6b0db040401673a8240c7d61df07ee36041f55877578933150e81d7c9ff4396e737c36ef484fe528a6ff6d137d1d8dfa44728b93eef6f5a4482762dd1abd2165a022910a2b5f355887d454425e96c8cac81e68ee842a760a2f613104174f546949da2732701bf139473559e275975dde1192f60e981d4bde7bad6291d443ce702866d29ee88e4791ed28f37deb3549c0720ea6ab8614474d7af6f35b5b36bc8ce09c06676f47247bf82976c2cf8dda71fbe2c559032ca3a7e48b2e273dd089e89cb6e54c58b9ace9e315c148a5b963cc425502f88d8404310ecca0c410bc8f410090f26c7bbd3048c333276c8dc7f5c7909e98195b54485f986e435a32c04bbe0870c4df91522c11653223834c8cc7a79359d7aa158e1173da654a0727a229ba557190730010b249f2d94961fbee99fdccbe1e621d378ac57d45561a9856c380addce5b13c3a0ae42e571a1e960594d8cf6265804247fb690e58c28413a467441cd25a92a070cc4a21efe2674d24032d3a2ba80c91bd26c393a19689af67111848a0c18083f934606e512d3bb6bc933dfa733da79526ae1bb07cbfd7e19334d50f5dece1235d94e2b74e0978165b12b4d08a536d65b6c7b9f1a404555c89c70d3d7a2e8a2bd3e13ff87706391a44d6b7820c32929ad13e00430c1f52370904eca1a278583ac72a735c56fce39625251bd76805dd6d908f2a62d0435c41a4720381cb3c90e9d82de4ac947d9f39b25a8fd96fefd41f20b8e90d61955444538c57ee650402bf84b6f9720fc60aff635bf190eec20fcd00e44737798e8d7319db7554d4d86bd9a00967ff48ac0f4c929eb506c09d003995861f712867a60e2f4323974969103a0258b3780a8010109ca5e048b2416f16470c9b38b8f6da29444248ea70e2ea5340ede06f54800c87f50e80b3830dd39e630ef825039d33064ab6dd539a49088da191dc6d812f3936c20d6393a0955975d393622c9edd13976fa1261da82333b67ad555ae6f2e065cfb0d5b0c34e5d091acdeb808d1a70caec6421c39090346a06bf0cfc73e956e8e613468412c4dd5ea87685921ed80c1d72f3a73f14d1ba6e8bce29fed588881bcdfc5dfddbb75554eaaff8d6b05e11a0d624c2c0e0e61f3f5659646d0c22ba85a12fa8003e69c146593eb60be8689a01f3cbe12a8765d444f72c0ee6d2f397e332b287cda36bbb0b8fbea6c94872594bae9c320dc3dc7972e01a5af35edc08e06be0907c5f3f03bc535270f0bbd110d4dfc7ba965214861bbe68bc5c281ae2cd8dae543995c3cd4626d6d01b39d2964d0cb78f4a1d6e15e954422ace57f5be910a5b1be6c6329e51e501482093e75359922eb5fda816f950aa3e544fbe0f2e8968fcedc31a62fd76c5f624ebed9c7d50163ad985021b09893c6df6f9bf043d054b3aac3a11c083de625c63b90859c868d3116e55d02878a0130954822a49a04ebf5eaa0ef86d8273670a44374d5dce457e11b5450c13e95c24de7d603b3053a01e0a4d785c1044b53940153125480cc1c35cb2ebf2c3354367a6a2483934e50cda287d4d1319941f2256229b1ba178a5fc84f17dc722c775efccef7ff59f2de8d349b55d0e43a7b6c15ef131deaf1f15bb59c7546934d0499a7489c5d0e260c2935c9ee2cdd36ed6dec18ff43b1917e0d27d5738b10da9a8f83289feb93a08e1987add97ee6c0f10d08e86f5a15ec160fc1021df9e8562d883fabd5e12fed907b7028989ea348d5e9c701c78581a77175ec3a10d7bea1d5c96fb1d4cda4b92a8cb1eb613a551cd22d5bcdd1c227db399bcdfd9a160439df3ae3bc157a5c19cb33899cb88d73477cb27497cc9f72b2682dc9e97bb24cb80806b7a121f5d20401e83c01808be69e0e5f24b5aa010b4e667b6aa1700a2e58cea912b38cbe9d444719a4c9fdf53db685dd246da1fc2e29f818f89e160a76dac25c4a1b050939d7d2acb6bc2f9da1965d1e6ddd12fbdb163e04182e2003a0712ebdf1efc19ffa45c9663176227821d582e42bc32ea50cd229ea2b984006f185a6f53286e65241f8a5308f2b045741023163c1b6f164717dd31147acda1600ca2b881b612363cdec25fa0384b3e13e35e57d51aca1e6bdd1c2eac4b8c9b4cac2a78f4f25667cc22a3283859a447aa5cd4ce86986f317efa5f38f859cc258f7f970b3bde495d564e16623fdac4c83032bba48e09a3bfb9ee5aa250819fb6e4fdc3bb0dd82f88adb9072a7c40f1efc9555180233e4cdfcd0442b8309db52e4447e86185bcba4d9c45d73e5882ca9fee8bb1b131bfd055e82c2e906fbe969774bf32426f18c7890da212af15617f719116efb8440cba7129942c9bd8d95c00513414fd0337bba56e6c9b1e91208d1a530c8c6f5b7630a570c6ad1863444082ce1c33107b51b54a6fb508ef3d250216f2876f26dc0b4b078c4f48fe6a8ad7a122f36a786a51b1308c7e7a605abcbbe1705d5a0138c71e6a34efce4d29362cb9824764f80a49fcdecb8b7e313292f2d96b26b08babe50642e92eba2d58994aa5e0e88326d14436bd0a2322301f78f0db5984e5c141a052f819978cc8987bc6c4a8947ea62182ac893d38b23915a8a85c145b1a22d256fda9c67f490ac99d34eea19c3f955e2e548fa0a88c6677591525da56a86cfbbdacbfe7f8eff30092d9ceedc2a97314bcdc24f6c3968122f8bc86173d9831ac509c76481241c79342158603115d8acbea0d009a4756c0bb0c3f77255d9525cdb459ec402e29a275db61d376b5929a31f6e92a190f179f069ea0f6bce9774fc095835cfa97557012d0629314f3c53cf8ed358c6f30e04849b241fa82ec6c124e3b5b7414863c0883380dabfd6a94c149265d8c8519254984212415671345a58587758410aa15eeaf34c95cd7a2f7bab0944d849c37219ce438c2b2fdb50e0b4ddbb9337522a332d01e9a1e6689c6f7d8cac4578e4476fea2f9b9f3fc65455311e3dd4150456f145fcaa79af492ff194ece9bd6a3bd9082da06bb8a263fecb918c23fe70c773e576a9e94f73f4958fd10947321558b2139f7dd82e5411f127d8b30c1cb1a641a4fb4c09f6e60bbcefa6ed61f3300e54ed2f96dc5569fd7d04d11a5d484d55ffb84ce7fa282942a8b5ac50897b16dd8dbde6c61431915fff3adcdb4d20069f7ac31e09a05a290796933c7ded099d0c8cf65f0a13c90ea0f322ad3019fdf010d9f2a863465157d0d1d676b9c076c28fb9a6f0a98a631eaf5f14b6399651a839c7c5aa3c33496fd45f52243c58c8119d78f088eb8b40089e4600502ababe7b7424d15ea42c96a4ce79c8e4b7f5d9df635bf902277f8b1bd601a326eac886fbfa979603464ed26fec6a564084d840ce6aef6c4433437265e0513693cca27166e85d834d7ad3472f6dc26bb35229f7499419138b03dd3a5334764f2635b17e9f99c79e7313f26232e9081d90e528abd966dd8db014528f2185cf158fef6c0b6d37b5df48dd1a37c6370b39b991dde8c475381c4beb47c447696e6a6d0b39f5390f14cdaf84bcfd89dd90f0edd68bc40e9ae53f436da8932b718acd925e9b946e7b587556cc8ad13d4e26d1fdb9e34ccedf0ac3db1a38778563a45928f9bc3549f18b15d9b48105553a0640d338ed2851ec456c0dfcdc03e8cbb50a5c26224296a17373d54a21830a0bc3a19848ca6813b04519b6ed08a3e09490996e65b223c2e0bce059e16558d9c0c5b4801fef9a42d3c8cd8f1b01a11c749469e900b86c1014e17ed98c7609e90cf07f41581831e36205fd1cfc8923a03bf8e7b88aeffd3b6659350eb75373dfad7073b0e211970de75a8c8180c891962db101dfa70510ba190fc682f0250b282b06ac53253f8e57d8837f0a184cf2d838d01aaaece74fc2a556f233405d8ff9f850df4c1d7b08e6f1b7a9471ac6414d66fa876ed35a54bf21536255ba1034849586103ef3f3afa69f3db0828d1c8e0529d05d49dc745299b9f8602f3cede5b5c44693d8a38a7e96658899348a2d723b89fcb2a028080ab9672d1939a47a9e0f090f324feaba10d34f6e560fdec59a11408e73e8e26c7837fd966582f9807921cda48f653d152b26940f40fc6c491daeca3b6128d6f73599f7177d0e2d98f6b0ce770b891629eda2ffeb52ba25afb7878f84b4ee6a740d2f05f086fd57fd04e7eb1c397b80b10f7c1043baafa9f060ab84eb390a832b42472e432f3243df823426c0cf887a069ac35052886719ddacb7691335da692b452e033e647302c81c2a3f1f656b5ddd4df984160051aab44c0a6d09d3c3467ce056c675783c28e42b14b93cd77b22c0423aed88b8aeed5fa937fe111841c8eeb8d052e309ef0bb3f18ffbce5503ddbfd33136508ceaa6bd56cf78bf7327a1ff05b3fd50b6550a3dd1f58ed584f441bfbec4335d72764109e8720ae256d058118d99a1185c340ff1910ac16d729cd2e348121f86f5e7fca2d0c03c7410ca49544827e4f6e0f3c9e47146980984b3699736be265f360aefc56cbe0bd94a0e2fc25f731d2740b7678832d1af67764f5b9521ef07fb0fe18c0abbaf15a6d81a6642ca758c913a92142f5804d5a27ec3c18529f2b43047840fdfb8a66d3f2defa9bff90709af30329d3e92b1fc971e4dee994fe658ea84c87c5783eb64b164cfd880729fba5c8043d41f7a111709f65190683f370282aaf82294b7d46f17898a99700399b219ae27bdc946eb263246c624a94bf34f39be8f02eebd5b2afcdcbd22abc1dbd01ceafa66a13a50d0f189ca4061da1e47e5301bf5d99e021f557a1939e760db2df11b15e6dbe7fb4933f56410786145e043600c930e5155e6a228f482d28ee428cc68474a610430548cb18c764a3f280c99aafe388e02a76bfce288187b1443cf495d4f639c336c5da25fda6ba5f0542504321a7a47778045121420e9e385d33ab08dd9a767c19ff4ff24e5c0a64b78c049158d97bfb69748d51d2b5e657ae816cbf9cb4412d3ff8b326e46f602b3e36c027211d61a0ba4c996fee8bdacbc69499a81fc010bf9bd2050bd1c0e9027082aee1d13a440a4ff7510feb57a8872fb641cc4fff079a1ee30d6929e6981a857533eb9ee57139c7ebc0316988ed6dead4661631c0990061d226f3c36fb8fbaa9cff7db6f6aa1761217070a2d9dae3cd40143c9ff7bc18979eac05162c8fc83d3cd7d1236f625abbd2284c3abad077fd057ebf49ec14e0918b205aff70dc00221f0b018d062532e4bb767d9cad89e70d4504d84865cdb1ce216a9d830513dbbd922cd6d9c893372450e6560e4f4c4987af6ceaf1a13bfaf4abdd9dea0bf48b8cf5672066d64691ce0021f24f7b1a8165ae83399784d21559781d3afab563dd15ee0e5eff16833f9bc1a9919937746e21e5faa98c02952e552b263c6fa2593bd11fb5ff618066c25be46156225e4ef1899d387a0a37cf82ee82289581699b6f6a77e454cd9bf926f8850d64d8d83774e80e51fd0b38ce87b5524d8d6ca25ddd8e5c5b30f941a124dff0db00da364952c81a801b29c97208aa4a1d7c35de3c27d5857f75ea1a11f5516a7dd51b0fd0b80ea7c9c60f4764b7b8e65d41841ccbfa2ab158a76a6408cac2d8a2d53bc92864e93a7812ca3a024b34bc1be649a1802bcb7cfc48adec75395f311986acaa32b754de9259c59a756253084288aeba3139771fee703dab542e8104a6326f5b2cbadf31738c287a7d23e5ef1cb936c164da868c7f9dbb5634af143b4d6da9229c7540513edcf0356e0b6936ce29e0ca6b150378d5246a04d168482368ef4674ea526a09aa0ed75c0a6634cdf586f84f4f26def7192855c23b5d34cce6eac82ce1cdea1987073c5cfddd31ebadb57a7289e564116e253146ee593a640308ffa520f4062f24a564859e8e347b4cef340dc82b4eaeefead865badc234b95b27e8adc50c73d949b7e020661eb85652d40be70beef3cebb8919bf698c3453b71c30bbd4de5b425dc16108f34f2b74312552cae9b0344e8926c682c81991b8c9dd394016bb8407ba84dd87e9c7df8dfba43ce34d56074b361855922c28b427db80d1929406fa82d998f1a2df68cb9320acea6f292307218357a3f26abe32dec35aabf9f6d3ae2c80e7b88eb2cb54749806850c66358e0049704051ee840d2f25a3f84d344dd1d64dc97870d5e71f58b8e01317f08f568729eb367a5b71db7838535950f73b02f9e28bd9eac726ef4ea02d1272c0785157067fd087a3eacce2f7fca00d0211784fb0208bd1fccfb20e9c1581ed9f6774956c632b8e71fb3f57921c495c7d3521e840f765a722157bd910d40ac187ac1e69e8dcfc6b5bc576b77fde48d707bb10d536bc557ba835f78554e2b4f9e813a9d47f378873f027f11e801ceadfe879e1823fc9a99dec9559eb1a6d63fcb4443e45c59e6163ccb54ccd88a13f7d5d9b1dd26943ea71a2e9a8ea47d172d2a4899d0e32adf84a5016b97a132e78b23dc35870f7d327dd3f3dfb7c9a270143e8ef4b44bf13c15d2eca05803486eec3ed3b9613879e8bcbf819c6bb574c963e24ec3177236dcc31bcca63c142cf794bade777f81da2138cd5b10853d3510be83fa97107648ac0642157b1a0b3402582c462cd6ac561cd84af570f5746bdda9c86dcc5c7882385dacd47284cf5de45c3b62b19415fb3b9d095bb1f1c46dee6bd1e78d4023334efe747060c64888b867d3df5cee34695fc60eaa67b82467e70a98379902a245445367de8c783bd9da8bf08a04afcf7d31e495421466f3a821888650780bc52ca8182b91c86ae7e562ebefeb5b25826b8b94a5c0ddba54b35cb1140b05167d83a8105e17723792f2a8944639c5dff9db2edc0feadbdd7780a3d3c565684842bf5051bb561829f161cf6dc45103cd6df76e393084e5c264ba69a2dc071a4b584e563427cce5328597ab246e729c8d8d0f08ac51a4864a13c46da7129ba7764a2a895058d5a8a1e86e6288f5e518c4264188e96d0b6887e12f1331835587d4f8072907940ee53648791df4bb6999c7416c7e845026e1633b090b85fcee22be64ae46cb7590f276240e48d3af63d25d5596e6e56687bf1700e4ad7e622114291550a2af529db67c9397c452abd8648f02cf66941e883e0f46888310df1f19e98480b53c592a3fc894eeea6a9175bbb06a9a1c0aee8c8df911ef00d7ffb31c8f09002c9adc29244080a444f331fd3e90264f2f5f75e0dde426eea64e816dd4663139906c34f94371eebc94b7b28f61c95d458bfa5faad2602576094223a77929a5f046b5a3be7e2a043501fe29cec453e285e31877de9f5406ae7d5d914e0dc14249d637ffb36723b666e4de904bf1ab056b8cb9230607971e3a99525ac68457f7a609e6cbb63bf69111401ae3920b8f97cffefbb970e563a84a776777a15a59597cab16de59b22308b557fbd4dda0756d04ecaf40ba64f18d8db998c771ccf55de0618405313833b7593aec042255b1b86a86922fc8a4e4cd2fc1104a14f86ee4c8163f0e49bc12ef248281115c8978c998dc01ce20ba44880123dd2df3ce1da63c770a840dfc7cd1aa7364ae3b1ba8abe3b3646d74fc4e400c6f086e7611d4ef9fc3792a5d02e23a5544da22a385573c83d93e6bd4e64874c1721f1c71121b0dab1793e535797deda8b69989d78e8a13315653a335434bf92c84f2f97148d6bf34eed7bf104f419059a971a29ed7964a930f82fc541c72b7b1d474808715281075f1684782ab06c6dbdde114fce359dd4fb34569a58aa2e97cf2f672a17cc4fae3d3fc107964ac2fb8da765c12b428d77ec1e1fd4956a691ad17cc1fcfafc18a011b32d6b764a17b8a0d9bd5c649f845377318e3fafc9f28403c645212809ff1c7f7720d01ec053504746c5372208ab1dfc7996b7450d1ee032ae354a24ce26a87576cc085b2fdc7799bc286648374399e7d0d65db35fe9cf7132b7b7f77c3a22cbfd0bbc4d297d14576996b5f8732d677f3c6e865ba7d946fda7d118414023d0b0b3d517d2edc164dea6c676af2a92047fc209358bed6bc6b4d2eec37abae122dd008dac635ea0f4cb1a09894dc434da3f292068ade686c4a73997ae236649f94c1a25ae897795506c339124fb76b3f8d5c1e521b3453ff00ac95eb1aaace9b7e42ff44006c5b63f8a358e461629695eb34bd83609593e4f3d37ee207ac855b0cbc4d5f7dc1df498df250cf0e602a62fa2300c9a7dc9eea73d5a5517e78f74e8083d3adb6f970af7e9915164becd55f1bfbd81e3c11acbf0fce5691e6f67ba9f88d9d55a4b93445e36eb58247c3acca7154aa3a11ad2dc4e64448249773928d0453cbdea8dc5cab506ef3598f2ac1c4db055017e48d3cddb61e9f4f39f89490946333c6129183293202571aac0cc4995726167276502167076f8b2c086a9b7363057c4655631638f9e33b0e21662cccbab1fae1e890b4fd8a3e96b493bc0776d3585c0c2550fff919990f737c47a313c457929f7bc1f82a6a0d474efa06a6302da4e05ec01ff242a372afe7a36911104a6677afbd8f865247b99f802076e302f92af73aef468182a1d080c99d8cec4ae089199349edb847b2fe3f09b09c3e305d150d2f7a5918394d7034e7b54a7a7f2eae3f8d64f62e0ffebce45032254a380433bbf3cb11119849d633ed09bc9dcd1d65eda2f66fa498e823927b83e36bc6a0327cf3cc5f08d10336bd7f056948f5a7d4adb5e0d0b64ce905aba6a3c8d255013fb906ac46a3426d399012f2a32746ef13ea1ab358713555415e311de8fd517887a85bdc3bb2109f963aaf66792f5ca7b7c55a28795cfbca25178630fd8f4d0e750ac9a602e1b150554d0d5a3f4830851149db0dac4b9a088677521027c1a3224522720490f7a70f3fa8c1a59527c47391d490c299e8becbaee2094a017272f6b1c7f6700977c609d28a414cc3684c12b88e81b293f2ad246ef0db1adb543770b0c4c425a1865bcdbbbbbc519f9f68be680bf9ac5b3a369e840d385e6ca68a2dd2576b4f97707797fc0aba55e66dc92dc408d9cfa03f77ff3859ac9de94e52668c9cbcd7096f6a88a14f60b549a6297474defb6b6f6984efd1fc1234d42ee9340e4ef7f5052034171bb489b84942916d2a93cd9f5c71c789cab01fd5c196431dfefe28096e34617f3c8c327413fc924a8eedb061193af7fe182a26a95391fa64ff3ba910877e4be3fb23892d21c9d964cb59060cf513cd567ca2899de2515020cfe5408403cdc30e680f2eafd5093105543dc39c4acc41391894eccdb301d4051159f5546673e1c4942f135714906c521a4eb1b19128411a8755a8fa21b95ac9b3484c96b148e90c4079ff98678e985d3fa028ccce06908aa6b704e6993025db8535720aa68ef8d1e3ba4e44adc14393b1d8d7a6ff4205a0bcaeafbe6c98b2428c46f41ac7215ead2878a5706673936f54af9891fa3fceb5a94f6120dffbf19ead90fc8675ba83248f5d1132a4fb34273181fa6c26b4e986ced1ad06584d517920e9474fd53b10396d6afb682d040860b037c4f5c1982adec1e2b68a8b567e9dbb435d2ab64f505c7f73d802b44d42e774942437352e3ee78cef04a749cecd2d92a7fb5139f2e061b97e3bd018e63324945a1400aed671b59a08bceb710ad41de966b827cc7c1a8b82509d671b685a6066a49541f46be5265572665675ff0fa78e6e6f7bf020e58ccd679befd1f77a2704d096e62f1c04ddfef3d1057ac2b8df9e3750ed49950e5606cebabfca65e4d2a5197aa9d435f5d50701ef6622f1e6a8de28055af9b8cc90423b84eefa96137c2fab1111f431c2c10e3a287ca50422e387da96db6fe95381594064908a4d755b520e51c18321934560808b4c965e038c226e3f9b393fa0e6dbfb14c90a3434f1bbec3d50dbc78e7b6ed52a600cb097d9f7f5a33e6defedd0d1c2cb8d07d33063a762fd031e67245b09078bdc67fd52ebd6f855b8eae9a027081c8b9f6d9b77208fa00025a4cea3e9228cc3f01e98cb4a97790f61f560568fb21d50cb88190f5f9f454df2b958611778100d673863f5698149d5ae8af861a483a98ff9597b5cca6445e5b0b76d2a0f8a8f1a2b4fcd92c6a71117b09cc086f81d8d4f3e986a3824d62e72c1f861802ee735bc48b1608aa623fb3741268e01f234214b4c6e1379a5aae663129218ac8922af90759fb94200ce0e812e955a904f782fcb8f3c89601cb5f40c7d8a26824850652f8180fc20afc4691b07bf4d6b3df79cdba01ca9df4d6153e163a6829f9eaa2de4950e00d7fe3044a494fcb81435497498bd460403a0ba7f99d7dd085a3e8e6d891b329afb03db76385eb91d6c88e20ea05e86782f2d7a2c2bf503acb4bf0d6b2825b73a6d9468f913c0660884aa020f5fd465faa206078d29bdf2a8d5ff3ba956b0f3fa0543e2030d97c8d09e9aea7b4ced3940575691dbd2fd18485245869ef8d29e63721103540a9d57d34cb013f043629e4b7a5a83fce588567f2b1cdf1309a4b733e7aa9d7c546662fbb6cab0e50e60844382252c244623dec3c6dd2f4720b6e7d11bdff661edae543bc3b3d41f8a6b80d9b200f431ac777aa2ff33883649a55faa4fa1d286f32b8dc9bd1b0ab9457f3545749b5e52e9806e6185336965515acd904a4d5a774acb7a4a085469aa282034f4c19dcf83103da88d59c2207d6f850bc03899f219ad19e88b6818217f296d61203f89015f71d4c455001d577895464f2b68e230641b8e28341885d5d026d0b6e4e03007cc96236c4a4051cfe46ce75b46ac2a177d6e9056a42d6fba59701d05ac4c0a961468d87b69acd87ac142633c55945aae1c97dfd07638464455d5257053a41cb1719dc7694cc42f098f2fcdc0d8840ad29abd021bc86396da380a8195987aabac0963c3170600b10822227963f83e858392068e9dd85278aacadaaa2c52cd334b58982347e0f63dce8898431b227070643341acf2c5f9d4dcdf04cecaebab6a004c8cce3a80ff04a1be41d1631d59f7688344913f982894834fb9c14b5455601e65ba5265452de4fd53762a252cefbd7854e29da484cd1f9c91a3d67a106c2414888c66653ba04a106235a7af4f5ed83b813c0f40b7bb0376d15d11ada77a30796c82017de1dc1e82995a3cc1c3224a53d564a7be07dceb572846f1fa19468e41eaabfc0f671c7ab300dbee15fe09eb4533a356f280c1ca10f70217b26064ac5713cc428de449fea01e1c8fdaaae80dd638dff6f3f3a8f534f7edc38f3139d8d067939dae6a895878b2b7e84f368147c5337c4ae47b24b240349e9f4f9b45ddf0148793e0adc8fdd727c27f2d910f3eb49ba9eb6dec04eedd258b4cd97f0236884bb175f1d0396b8113d5000458c3d60f63459163f263ccd4067a8a4218db8c69ff85329d5942c3d3c9e5c52c5e42af16db010691ef5e04fab3f357da3241ef3b8648130be9716451074c3fc2924f4e2824614621709089f9104f94d00580ab0bf707a61cfe66ef114587926c3cc732f1e3a1880b25144bcfb9dbf49fccb08ec9adae96b7e3378b3a470064e88f94ffedaf1e31dcf4e0affd7c302a0b459924bf730b155ec23b580389c4419ca3f1a824a502261417b1933531170de55da6e29ef8c67b62e3e27924c28fc809748207b493f2b7ff24b6d4486da794352c025614d06d142b89cb7777208e250ba68c36009ab0974e096e6a8aeb50192f3cf937d4551e1682b35fd5bbb25d0c3e7bc4ebd41ed84c52152e78467c951ad1718cdc133b503967c7ae315634af02720992bd37c32fb7cb0ff85e0bcec6da354b07156e8f00ad900e04b6aa5218e422b5e67948b533f94384df2114f57d136e6e0c4107f09ce2354494ecc6ace81918249201c3504bf20bbd90b62a0090274a0ae9f55792a9ac434f9515ff9d8b2c36544c0f697653f3a2a186ca5b0350c4d155bf50082cf7d345b7f65ccce5b2793525d94fbaa1eaf182e64bbd19c7a4e75a680875d3b7e3606328a8baf78a1909d861617f928d1476d1af3213766e089c170046e79228cc4cc63182a1605164c2f6e46e6824476343834a8eff6a88cd82d69babcfc2471c782ab09b38e6c4b93ecae1f9c220f9b45130d73469bffdb184d2458b0e8443b6c01df2ed48e25cc4963644d51621a7c5627df574e53cf9b4fd55e526b71ad1cb9ce6cc45957905ceda53dcb25ac1ec47145508cb4445636a74abc18c3d944463948304f5e766f76bbf4452a3769f9a02582f18a9227aaaa370cf14cc1a398908a31b6396efda13a5026740b6a357de90d1917c07cbea2b3365a875c6ecc54292a2fa18249398462a871c831b83cd9f4e60c448af6be8fccd8cf03b71dd778b9dd551778dcfd830decb24084e81642dcbde2f678c044b86017cebc6c26fe54bd8bd3b4e686118e9311d70eff3b29c57cb64e23a14e184d2c629c138cf8855934cf79a7220fa1479c6603623b135e97cd3a24fe4f5b188ff9799e731dc24d91eb653e5406cda857d80cf1d7035ff4a6eab3aee6d8d23d0410b2b41c8944b29d64af68fdba49f47957bd92e1b98995b59f9f0ed171075e9bf02a688224c1a2f3617cb59db189fd02a03ff7a4c5b5ac60e09797bb0d90c3b30514a358c8d0091c87e558144fd80615fbaee6970e8498ab8de11a071256a085d9c213348a2fb6e748dbb1dca850511f430a56dcaf39cf2bdb943a46d3685a8d1e4b2cc5107bb5543848929270d470b2d26bd1e75c678d1cecf7b0d19fc1349d12d78f34c84023ed314e2006acf80427a43b3f768f47e4806106e4c48146c3ab2e20d43f5b5bfcf841cfa96141cce59478f3d6e373c5247e19c245512ef8dbfa8b0ee69d09c366d21517e805509a6e74bf75733a7277c0fb4e2e055d4a1bbc27d07b833111b25d7134517bd68842b39d0773f7a2669bc5fd60146643dfa8adf56a4c75af950abb3ffe396d34516e165570f9180e7a3864ff07721f55b3e925127f1be7806aea86846c5f191631367bedecb5affa8a602aab15a092c4888dff21f6e2c6685521a44b9c87a7bf65a3169e094ea030cb7ef518dadac11cdfd9840ab481ca038a356aeac54ffa30ceabc5f1c0d773a2b34948487535423bd1e11ae7de17ef72685f3af518d7e582780a0db08ddd0f95a0d65a12be93b31c778e53f98784b4437b5ff77cbabab44ea4e2756e6126ef0ef5e3a1ea1aec78e1ed9e85841617f4c3ec5d01a718eb56ec9eab5bf194b8ee5b2f97a40204a889069c3c8aef6e86902826faa06be605e6a4c7959bc54076494df2e80dd433c6803fe7919b0236256138b50276e6d6707cdfbfe545729699b0f3cc8dec30b9498e0cfb7285c84d024e74180c414e7476c3df8aa3afb7cbd3ecf4fb3ef4153b984818722bb3b63306522a8737fbe6317399edacfae7a28d7b809906ab8875b158e3bfaa89703c1bdbe67f2ba727c2ce012504b07bc28b468a556e487735d35892c2ac8af787c60377026458bd05431e6d9ba80209137625514a52706adc994a80faa9b1c460856070fb45787b9ca4146f8b5e52c272b86168eb1a87b75d193921e893a5f3b923e200c54ea1568041b9d6f5aad58a53afec781ce17c74a1be0b72348d32a9569a459db80620fdb9c847ccdb681ce97fc917ceaafe8f398898bb20eac0322a848600357fbd314096225b5c096750837350fbc61ba1719042c96d6e30efe06e1d48a7e4954204c52d15718533b149583391eaa9726008e18e57534e8941f67080f8a5824234996942b514e5c09612185b0f184ed36c8042323ad32c90876c1aeb89a0a99e2275b3f92c8290700852a0995b047a0e0240f89a41c6f4e0083fe0baf09b1c19ae3e4be9bb36504935d38f5fe85439a31696f43f82a3093f89f4270275d97f5134df74cc34e34a16d831e769bea3466f64aa66e6aaebc23e29fcbf06a7eef731ee373ea38dcce9d0f76d3a04df05a8317f69746eef6b98dbf85ff3e4169abc83ca46607b4e3363edf8f5edf71c1d499fa077122619ca73572e66633e24a705c536a0a27534354ac98ac4d5f01ad4e201adda71bca3d4eee737546de12558690ccee4706a0c4fbb799bdc338acf10e9e7e3e4357d8b7b87a6c53b5f0dffb108f2b59167c01261f38b2ec52ab753e385a0ca9a1c0df3239d8e312306e20823c290891a86e0be2b1c3348fbee1adf06102514274c84caa3588a4cfd6849aa420451072352010a65d13946cdb195a7b24187c4643bc1d9b77ca983344aac61892bbfadb0f408436d18d3d769f6cc88e2e97c8e79b624eeaa366e72f88917feb9bd8c6da550a0e1b31869ec86996c704a91cc7f47692af13350288a638f04a073db72266ae639124ad0b0c9bdec068ec43eed862348d6dd96f159a0d6be5329613faeb27094877e82bf408874ffe8fee7481543eac51c62361d29847702e0ec09429d3f73d9811a17f999ee0944c3315ec1f243faa7416fa5c736f842ed0dc44eefffb49fdab987e40c65cf9a59fdd9f1d589c76898f17e539056e6071d484bef17142c1c12361ab519ccf09f13fec9653342111b583d7488f4fa6f797715352758ac4a730f83b02213b1bd119e1dd09f665498cf58cee6d97c7a06a07d70861511ca368d19e5d9a92bdc33a0b78a16ac1c8dc67b6557134742b38783e88406fee91765661a1cd90170a670a1789059746fd9e9f51f1ff94a52443dbdc9c9b339b432c6ddf7e4c953c01f4ada4181a5aebe9a505dd4a015177cacc994b1df7b037089f4ed129a17a8097b736f0f90458e9801a554a66c01045c660f8be1022e04612daa3849a7c0cf01bf1c5f0a02dc6245692cd62ffac70c8b9f518f7be2dea1c19c47817e4b2545bc5bd223f6245c62d3fd4b8e8714188ebb5bc06bfa27a79d4fa45a1a3c9ec1cc822430c52dc391efbaa782ffd8be0475d50f00f087185abdf0d632a2e41cc1236b47d214abc3b0f228081c7c35402e92a084716ded7f05c25ccf99f40246903cefcd36d8d969e23d38b129a8285f6e2f0eef54daedd38017bac7f58feddb26a2bb5a11fba0646db2db1b5d1f5b28e909709de20277aadc1bb18c82c33308ad8ea80fee786a81b7441c7733bc0bd341f442b58e05a20f4b1910b6dcf6d6c0509f4547a5a3ff202bc757029fb0b18f40b115cad184ea30fc15fa2ade8cc857e1206471b8a76c4689047e72cb8b4b7c4e75a72eda641c03d57c652b307eb882dbf3247843aadd2576ec9eb3c1720fdb3dd2637af0c6159b4321036b34ce872d060921a68ade43626b05a7ee83d267cf6142c206b378b30bb6e7d52b2d31b281cc5ffbc9edc75f9a4d5a3e2dfd535577a4f587154faf73aa44c4231c08d997e854ef21fa96c6f37bc32fa19cb4a29a6c4da18f0e06edaa95958511ce8d1cedec2e303b9022b3f20fe07e519627ec97464a862bf09ecb9693b7de3772af797ae502fd44f6c039dc133a27ab6dfbdc9d923da4071a8bfc2ee65b02061f4d7b58d4efd1dbb171b72094d8afce28e8d7e2297acacd018a1d8d98bae62de6f76da1002171f3af83bd6abcc0eb8ee558a090b0f978880942862bfdc544b05aa5a2d2367b5458ff63bcc7fbdbfb5478e8e04b532093caa269588ab8b91d39167afea55b6cbcbadf05226f564b7b9d53606038b6e8020356fb90eba164040d601cee6532b5b33b4e1b0f5ba48bbe03f6ad1d08b7bb26b5843e808715af81f311344cb72aaed21e8f88895753752dcd920710e98311461af23569c5d221468e19068118e565a194e6650c06182e0a6151ec4cbbb801ed6a3aa9e2836bdfbe140082f4ac27cea8c8d32617082e0c833dec65fac5bdaa30281b36142d8077a077369b4a831626da3079a18dc44704cd4100e1d4cddb1068784d951c402858ef3c52af7c69ad3c281dd1cb71f5be252e7b0bcbc59c8fff96fbd82ab5a05a4884e3d0561115045104efa94df4733b02a218345176bd718084281bac3b9b7ab475a27e0657f1f3298c09082dd0d1b90ac0d0e8d00a6d3ecb831f227085657278f031516307d491ffa29a2f8fdbb7ae02635f09ae29c575897a605a86de2eab80944a5a29ed7c554dc09ac61043c691aeb9d825969b67efb430e006ef5d3c2a8cab5c62b52e209f8446222202e6eea90eb423e3ca65f477a8b22cd5953c8ae9aa9037f896b03e577a407edf8e8c4da161dcae7547a22c4badc51bc7744cefe02d8bad52609a3661ce7e62e8def7b50ac5997e24ae3b155f894c733f3d0c0f531ff8c844ecbfa8e475bda10ebe396013cd0e922081134785963bd0cef452a5ae3ac99d11fb474778898b38a5d81816be307708906b542c1c79e42a95267c9a03ca64be7f4d3756fb8d6f2b728a4a0ebbb256b395a1f1914a6794a59a8972a342753f372819740822a19a308dda6212d6d21f6095147a878168f6d3bb88cd09d40f856aa80f0ace9f19c29cabca91061fd2963bcce6cd46f7201af9c0aa04cf69be877576e194ae1b957d820715304904bac5197ff54212fba1d85c6aadf78e2dc93061900cf052fb18c71b079af85149fbcc7d8ffb1f3a23529fa4fc6af2d2304bfb4ab3cfac643b9536a1eaf770c9a94dafa3b691f3f2f667f810b3be35d1690a23065db932d63598d7842c81e58586bd1e0f4960b9608677538e04e77502195163751ce58f86ee191c6f365875ad6288ef12d31d56585368464c9dfec5e73b0a1b6764938d1339013e7e3704deab9ca4008df6dfa96eb534a53a703accc79287c99a70f60181f694bedcbbf69b700c7019339064d83b90d2cdb4f9ae820b06276d665059e241bcd0477aefbc0ba3433148ae9950fcbcebefc62366bf23e33bac55a9b649107ff2c829da214054921b3ea31918765d2fab7b6315b537001467af65bd3aafdc6fcb3819c9a1bcc864c199fa1f2e4325231101ad8f5110f56e2f142ba3ae00536ca6f64136058860dee08579ca03a0eefc9a440d8aba60707cc094e56509e4f96bec137c4315593e71a9d0b95248048258746dd07f5f7580ce7ae6cb219962ed5397b365b4630d5dd3c81d597f01d7713660fab389eb7945270834f0de5c050c3eacfa6a51f85931b0bd2c63c8b7252b1cda9d6223d366363226217ce574c1bb15142c22f44615bbd42d9ec35f50f1a3c7102523c756c6bcd78657e26e16558a907293682009bac50486b377abd4fe292dc4cd79954bef9af52db88fa39e9912006d2064733fc89b4b9ead626f196c67a57dba060abcb7aefabad2381429dbf16106269f0bfe347e42442f901688eae2a69ef5f6465cf3ccfbcfab3593ff8ce7b151deb241c317d416c5f9d22e09851f3d567e94d4a4cfe6231b0482504107b526822b72ea6354f044b6782b10f5a7b8949aef3d495ff5f6750064fed3aa6ed60b7abf7158f26ab01102e4bddffcebe0cb2b286e1d2cdad5f7b1bc20028fe938c62694d009a426f12fdc2425cada2f5b854377ce92fa24d6a7c897f63634cb9793c89ab8f37379adae0713dce251eb9173ebd08bc99b2868f2aaaeea4baaf17247e80df073d95681ab3d197bac71d7802c1e07f3b2521733cd02b30a10aa66b3ce8e29afa443f206a76d0ebd533e94c2af7765582489db2754011a854461f94d4cb52030f34d6f8ed5f2d8585735cb5023e06acd02169cc979e0b72ee33cc8bb32ef4a95e2213820f927ac591502111fb5ff226717869c32eb0acdee1453c68f6932cfa3f4194e691044243001dc51aa280126584033f8d4f42670cfb0e4040803e8129b8490c9d79eb3454a912c0d8db773296cc6560fd1344a8c32ca5a019d3062a8dbae71012ae2243699550586891dd06f63bf712c3348800ecb190d1b261a34b4b78b4ee79fe4d26f27421ba97eb63a0135cbd44ba8968d0a3d1559f7cdb5d8fe06c5862b7bdd4fe5813b756fd44c77b10041a0af0d86ae835cd9cd360173df8d345ae7340fab61449d56942c08f0c05ee2615801a5ce276940d6ca3f1415d3be3da0f0812e43fdb5d984b7121ff77f38bdd6a1704ed63a6812e44f26905c11744f0b592b05c42b8e35e50f78ff1518f0b7aff41a32b84372da1981682469b08e287795c15fa0a422d3cf6f8dc41cafc5298fa43f09d8b6003857a1053305b9d1483fba77c0b5f301539f8edef32ec29dc6202776ec96f237a91f34886df141a229a930561473f5bbe76d49543434dfb00583cb057b5fe1e527b0e1401fb838a85991ff75dc8c9bfc0acb0eba3be74ad2e97a228a4e5877ec4a0a063dcfb3f0dc41215bfe236718a63958395306595086e69a827d29d00c2af784300ca61e827e9a43c05ffe60e436558d6c5db96c44e20e046d9fb06b4965aa7c5f9cbd664ad18d1cb979c64925c633625bd243ebcd3606359660b4b07fe5a971a560a79180220fb038065931d6b1656700f2bbfc1e72aa7b35bb9171e9fd685b1d1de0a74c25e3d3a56f66bef2ac4b3a55424a207b6426d98ee8ce281d153448849ffacb59ceacc6ade1469690d16588082cca7286728ad3aeb3dba4b7d687467ec297082d35445bf1029270fc8d55a5eb1d13c881fdf72280a115770f850f29781ad7f43115c691b5600909763fee055fe44639a403e64c88f2738545a4aa1b7a7cd9d8cccad20a4bec5c2da7a7dbbbe5ecf9a6334f035631bf0510c24d94f058b526f58b13fa1e580791bcfb8b38e275312546d5a0a780dcf058dc8419329c5f36bbd53b987b249f0c518531e3209e4f3a6b11705a8a7b78358412d67feaadca77e2739bd3cbf3b0ac3af02e37d3c4fc816a49106fe0de9c8aab005f8c91c2082f979a5fa5fb666a2266af22e72e8a38fa6d4d3ab95f48b284109fae33051934d976679aa057d3b4f47a95473a02f0bb5dafcefbce32e88351d293ede5d5e053a6022f8cc529ee60c2fb36d1a071ec05165147a135a95f5be11e1cd5c0a7f2504660db7105bc4a6785fda5e33866e40aaab1f69690cb8dba0b70ef923ab8d36a53570b9b581ed2f8f23cb1215e35a368a10316dd67bcff35357b5f3890c01bd848bae86b200144d869a5292d080914d695e6e12c5d5f18908ff27911b03e0da0f771f1472e377213e8571611e9c396a218436e0e73e637acec1b7d6956bcc051541a8b1e8b93671920ead5ad7cf1c41e514f171729bdcbdffe264f065237402a2fb30fdc417c0f0e4104cc90167132dcc839f6cacc3eed1c9b02dee61b9165d93721ad7794045a3f4152772a6bbf4de80b9cbd22a1f92d8aad929e737d9b972a37320fb8958a7b5864bc2d58e88df59c82bbb63a9e6a522ed0432c349d2fabe3cb3f8513dfa64c3b3b05694aa56ad063e23efb0aa9ee15cfd8e1f4d579628d8f680fec517a19316e4cd622ce8d8db1c84dcc4cabc5bc6744a75605c6ddb3ad36b4fc6b90a7fcf7d458a2ae2bc12f09a0440bd24816024902bf84a6c2fbe4e8289cc9aec5bf3f72d45541b4f7fccc439d53052e2f1cd7b19ebd0fa08649c644ee6f6efbf73b426219a8438a88d7f201ad4bde972406ced3339919695af6a1d956b984f0a0f82cb35ab5ebbfa6c78f864a5b12d5ce673351ac31895de83b0d4e8233b7b692502a30b9f979b25a152a602b989d48a740171c6d9d4b8bf7c95d3b242688a7a620350a61b43e1368636e263bad35dd5ca83f947fb93f47a545ebffcdeeb4e294cceed707a01169387ba9f995c8f51caba5178035cb1672984b216b4630b3a2b14166f649a4d2d8027bb4264f81b99f0d125b498a7f9ccc1554738da8e0926698b2b8ebdce14ed43b226c94998e386736e031acb7860e6668899eb8666639f37a6ddc08348460aa666fa1b17210f1d8fabde94d9be2e637219c6e1912aabd5a6b328eabcd745898afbfa64dbdfa0d53431b1d742b82834ef83ea3595288844ea8b809da52aeae3b5e075b16d81418c207af7f82c81ff9de0b4cbf45a2f74669ac8d2ae48aee4137be7ccb4b4f131d020b24abc63e01e6dd67b046ce10f7146cd45bb9ef5426f4cddbbbafa44e83ac856d0500b41527f2050ff3f2174d12a2cead30d7b1dfa2cf6dfd33a4b81382542d8fcce0fd3aafed20cb8890c2daadc25dcb272acab367368fbaa91f4b1823a3deccedd305b49c30af92c1755b11229e8ec0f41984c9d7a17a1a3c9b4523c806b587530026dfc9f7dbcc81638495d865a1e1b5823071c30b5789658c17ffc53fc10be793cd24aaf3b73f9a25f2878f91fdaf769c0df75d0784b1e847cda6e612ea34c9a6a9142f1cad169db825a1270bbc3fbdc53e3b71d268cceaee1a41e075460d328d2ee54e9b0aab1a099773a7a0c44349f97efbb519fc2b284f9e090647eb592285f718cfafb5d1203a88a11edb1b9c66d2f52c64ed51c3d444afcc271ad40f0fc49c8316588f889b8438c1b258ef05a13ed508862bfcc6c6f7c0d5c41e8a5e6b0b171bc578b6e13bcc8de4f1ce6af23c07d181e448b378a2786fdc9502adf4bafdfe5c52c754b740f1718fa9f2ec144fd3d103640125acbaaafa343bdd68612cc869b3f854b06394bcfad30a4e31d33d5a9857d1d5e3987a79d6fb7faa5923a2fd73a0341cc450ac3cbd98f805a70da51b9e95186a57a68e7e389a8d15a6b69ef849be3f5d7af0af57736af661cfb3adb11a2b4bffe73425422eeb91f414d379502d47bf090f0ca3e8782dd3eb68b7716c06feb6cacdb4e4c037b23205daddd15b2f840341754552db798c0ccee85e72fe8d17cbe67adb0d965bdb9b95474c96627104e321a45235915a239fd6bfc0bbda622b54e097b032d910ceeb6c00400f55067a080c1e6018619a41e21df170647978220d72ee7622e3e4ebcaacbae63ba2582bdb0a9ac96dc029297bbdfd4926b4256e429d3a86071c2183c3ae210b88deddcc0ba609f63032fa2d1e192e9e64c0f74fd09578dc2bd534ed17933129f54e630868e9ec5969783d3cc17bb137e96578fe959096215338211d941dbb86a519dc8c27ab8c5acdd3ed65d00ad2e3b12892e96edd40d9cd66e1057610e0f4a5da66f19fd244573fbe04c63d3498033b6d6db5195cf3f1aea8ecbd10b573ac1924fb31aed438b4ce9b886820f2b258aa40413a52c5e43cb447c16fc2ba20dffac5804132d2c2a97fde0171eec436e85b651b874e6733f4b8953f5950757d2d05e6d20a6c76330f812ce6818f45131c8143314036599f107220279c7bfe648ce519412353c21d6ec94ef30079ff5048676ef6b92dc82b3b2746fe27ebf7297dc8671af9ae30bc8f010a8d65f19f50e67dc790231d96743741866238009b57aff7cf174ca60be102a51b7b175c2ac9a9ad424db9bfceb6fbfd949c21066c35d390f5fbde24feffe4ddb1ffc4cc02853ceb4642c5834d74958e81f0da299b3e6c4421eb272d3d58356b2d889b863e6a70c77fe1d65b03684bfbea5d22109bce753a8c4c5eb6ba8ae4f9671832b72e98f28288bfa2c3ba65c2d4dfcdf99b9daa17055060255f5964d90f84f9262c7a56447777a3348457d519f342c6bce34ead3acdfd4d21e2883b9bcc90ec3bdac971e132041842fc160bc1ee957c69e7c14924f68ebf9f0b9190045832fccf93d203dc201990d3b8ec7a658bccfa6ce2246d954443556dba9890051f69af575a988735cdb22b80e824e8c020e93834cf5522c1c84f3a54112d55762a92331c9bf7301f9cd24597dc0281b4eb861913eda4e6ab23a145825ac65fa2fe1f8256a538d4e2407810fffd02c96b751e57ba97fbfe9a5882d69b3df858534dc309d6f7096a3bdb462a1f6710ec0508419bc0efedbdd85dffe90f48789949813c627ead0677db2910d762a33ec0a387d02938de525e6edbc8579533b326dfc6b0cb59fa2f2f7a86d47db7f1552ec224db9270ae0b5327a7ebe6b2536580068dc93c4f95cebf07823a66a02299c8882c1c1b0041100b867378c018068fa4cf28f063424a4410bbc89519a69ae070dc2f115be94f3b534b19327ec905bea3bcadbf49c1d30d7f8a09f78f6e39f5945ff17adfe353a971d53126e6eef50aee4dd7b999a7ed8d1c96ec2031493649118ad2b6ab818dc214bd4d4764b9f1629ba871eaecda0f21538191fdfcb26eb3406e2accbb17d54fb1e7c93137a90c7b1ca6fc7febf4a5125da319d117d6f26475fb6d77fb8f1cf90834cd5f0f5d121c48149898f7cea8333df9b260ba9f560c33a5c94366efb9468f88462cbcc47352c06c0cf40e61a6eb743f0211583efb6fc30c3c6ea025d41091e39db69682704bc924c957d6eaef412d774d0fc200d3af1c624fe4930408e1534a7c045695f7b002fae2f84a4dbd46f9f7914c3c1d3e3c94ebc416a551a87bf87049da2eeb8ae79dc1a4e1c4a738359ee60ddddd380a029e80bb482f00d1cd128891ababde5ec54d8cc45b79b5d203cfe150e06b5318920259c93f84306a896055c68eae08e0699c232d4ec80987ccd9f99945062b549018c2169c6aa1069356ef566e552799af0568a8ef7a3a780c37865f97318a06e0f87e0eadccf86f925e29f9073b208f2c65b68d8d99cf0250a5ebdb56aad187c1ab4329cf69960b9752b204b293370ec744342cd4283b6624e8e5fb888e98ab7f8bfdb614436d6d0b06a961cf2cbb69b60c0f1f4760236626dfa194e8bd1735904aad6342c988b570e5a738535e9e9a87f1a37c61b0a4e31c7f93ead8465b051d99962519604b720faa999630a109555150d905a329da4149b9e88b2a8a22f99a59773fd4ff2ec64391cc348e90a20e8fa4ef49530f1aa1cbb20865d38a046e66c7dcbb1d61154b8cbc4a44c20639895ab4109f1385a4b6001710ae3cbc0936348cb18f1e64bc37b10133cc41b1b042ab4a298090b194fc1d9db183a89b7bf3823e706802f6defbde83e9349f6762990d48fe6530e438558aaa523f00532fa4cb335a17e615050aabfaa0fa4bc0586b22ab4f9ca7b949c9612e7a474208fb563794c31d1bc02241b7b6f0d89ec101e027e0acae709168a02d51532d5d2ff0ce1a3344cee32837c85bf0deb7398dc4c00426bc3af8f0f2f0b21d418cdd21f8997a755a145fae797d0ab73a0df605c0f7f10a30e9a085bf58ee68579e8c9202af5bdfe58307821872a8b102392634520958ceb7a5a223d014bf710d2db407b8ee50504f4b8f4591036784df868576175efc63293913ee3ca359bbc1537df38d360afb53fff8dd5e201ab4ccdb0bbd9c23f708883cba2aa38d771da59ecd30822aa2321ac738fb61a877f98b84992ddc3eec9b275484092b5b6188f6093a1119ee9f8cedce407d9b012aba7647d44c815627fa958aba3adcc80526887a62219ac9c05627634560d914506590a900133a39131e0d3a0237b4647dd9648f849e730f22b4912595cff8546582df1ce02ba61251e2619000d5ddf92eb6a057d52a5f8ccab2730fc2eb9058b21d4ba5c9d457aa953aa1cbe288f0d3e8b3a8e930e23fcda75bcc0b40f726c62b326c88aaaad285674cf320c2e436b0b4332fdbda49fc4d4bf2c517dac87f8e45de4a15d019aa6c8b7fadc8b92fd5520653f2f5c8620cc3151eb52e717a8fb0c55b0a1d42eedb1592a7ccbd44dd94319868c5182812aa036bcbca9ef0a276eb169d416ac216e548f295f665b3e1d034ac6b069a95456e4d9c8247d7f479b03ffbc5234524ae44b8e5aaca1dc69d803605c3aef2d37000d736209f544c5afcfc807f85d7247d9b2d08f41b78d585817e1c3b1738899fa0ddb0d0c5179c4574f8a2c6f2a2467007aa41ef4022c3405c5a6905a7c5b9a98c8f09c007e3035b922401cbecfcadc964a9b7a161d9b7376e319aa55a5e6e56bc5d98156ed423c8cd52239b5e3b675dbd6cfc65293d25d92cd1d1b29ba6e62ca9a31e3ddb0660c63bf8019fd727b2a746e34109f06a932f5e24bdfb7b283e3692a803c306ac85fc15bb240525e8088e9264f6c7e147f61257c214d58197a9e5dd208aa8bf6bda99922a6fe7b79939f40e4926213170d4897c2ae31e86eb16223a312ffeab1a124be0af6de8efc396e901e410ba0080bcdf4ca0507da730d7c49c21f15375a24bd67f845b10d8d2920059a3bde8c7d1a22d5236a502b458f8deb79eefda5039eeb38b19538e44fa3ca0832006690afc4e42846aa8c9c371f44fb3523d3c99f474ef787229e68655285555a765d2570d5333d9a349a3eb75c6862315a4bdf271ae20a111a63699b3015a4aba617d37fd323b255bb7a42c81f9a5f400af1140651b5b33f1a055661664a10966d954569ba444791e502074a9788bcfc6bd4231dc22acd3904c95d655c4eb5a8b51e2b1c3e284a63f358fd47ec965941fba66e200798a6631afc37a1c2d6a6f369426f352d1d148b3eaf2dea1327e2a108a63ed7fe702ca757bb56b4775ce39032d61c8a5e81d099461ed0382462888bb12afe8bf4f17083746a054a802aeb2dc0cdbc7eca75977e2364833da087cdca7e3bb2608e7a8444c16c463e7922d06ebbe4fb45ba0228dfcc4ce1e7144d4af8359fd938694abecad86187fd3ef2456e2833b92b8b581b359b8ec389c8eb38f1a80cac78cf2d77676b6ec3798992f4d23aa8e160c812c1560c3d980913b80bb460b3d9da9859210e14167a2d2d739ef4103af3753d47c8abb205993c5ea712fb962506723bfbebae3f12f56ffa1d2cb980077b26a0cd091917f437bc316127d443c8e64275e15856a39deff026708b903aa0273bdfd14a9fff7e01c4f2156b675a167951b27a80033c82451660ca717765582a3e4afb64a5e11c22ee136efaea6abd99f7c342d57d70d1a68265a6f868765812892b8d15d01d023eebed1183b966f6b18e2552315fe2b7a696dd4dbe16cf37db9bf549512ef74fed7914c90eedc58d7e87c7c24f916e5b8d1fc1b303414d3120a7d4e8c5d9bd0aae2d91bd75231f49391153b24e4b942196ed03f5e4882493777aeec1ca5a29ae8cefb088b29cd4f442322ff85f4e78af531e5242c0c776a8800f62552bb8fd5046bd3474139ceacd40b3e817202a47caf1decfeb53afdf512dd2488ca10c09cd4148707f91852f36f5d49d8a03d3eee5d9c26d0ab6232c726130760f7833cc25a90e3872e2c65315bde031776f2382543aa0f11375921cfb8a5f45e5d3342393785a1a2b5fcfd8c172250ef0ee7b7c41888e150bc45806b0cccc64313e35adecf694cd6e0db932ded36635058662d5607e9e504333ca686dc50059be5b12111f91a524dae6d251e20c23310e63b3cfb68a579dc472144211e996dcd62e8839271d23a3eedb4c0fc5d5082c7caa851d2cbcbda05f7d379ae2a79934922adc4d10cb4b384b0901960584eec1212349232d530627ecfc159b98477ab3a91d45656e953e4251913a625fc778a9bdad0e0a8738ab7f2ca082d3733e7ffb15891dbde9e3940ca3ea559ac40eec703e7cf253b0527121149b8639fb9418a92ad6efaa0436f0a1225fb8753ccd725e0345eac6cbe92950baa65de34f294fe8491d733ad4b6fbb0fb75cc97c94d5ad110e8f745dc8810e12cb4db7e4751a72805613b81426956ebd3e1861311acac9e6db9547b3fcaece02408e3c1715e35fe59f1bb2570ad8b9e4e327f99149ab90caa5ca41debb7b54e9d70af96001cf048224a153243fe627778cefc155454118baa2b8d8da6a14d62ba8a699907d557d0d7ae4427dee2be8b5e5cfec72717d154c11beb52e45ec0bf9d3aa8eda0dd2c04df68a1760bad2e0acb9dd132e550367e424df9f8f980063ce0e85247b9937e414283b138ce6de42e11d448d374f5d2aafeccf04ae364ed0072ba3e064b168e87cee0973010d61ff0bbfcc0a8ca54cf1bb44f18d2a7203676aa3743f01f4d41a8eb4544b2aba633e3978bd06e29ec0878b827470e3cef42beed23afb08c5f286710a90916f168def53052d2fc5d082c43e88107b76b05e83413659e71440e902e6d41cb079e3fc82969205c42c0f1d84665acf165b38a10d382024f645f48196296af3e029d8623aa7a0ede07f9431a2fa9d541d0efb96e9f9c305247cc084612a0e16527a86184da5bda5cc6a5529a75d5c8c5e7692e6367629578f4cd26418facb26eec638ed733d258a5acde1961028c9da37e9d535770f0a97b5e5a13ab342c4d183041719e908a559a7ab1ca5dbe07a08eface1d12a7e2b885512bc447eca5e819b11cc82ebbf75f2f28951b24e19517105a487ad86009fbf140a143b1896275633d90192c309bc6d49a9d4515d02b1cdec1b0c483d1c7fa43681246e872a8713088a889102284071b73857988d7fc1c39c4b7d5678a78493c68d6d7f4371f3c9d7302ca4a5c3ac82ec144a8f1106990f5321493bf323fa6b21dbd5a3b7c44f8f9d5ba5b6216dfde6f1de547fa1b2bbeaee8f724a455c9a4cfa219d753797ae8da03df53e0d2347dea7b8a4961b2b9cce26123d43788629bdc039a3c5f079cb736dfe1418742b84286259b2816b539c214fa1eb649e849a42b7150fc70fa914376536c93ee0fc7e4ea08c5bbdac9401f1c9376c99058fb0359705a592a3c040155a0ce61cf6cc99d658807d71052755b841a102691cf3aa58d7d059c9cc20cbc549d7a52a6e62653d458d3b86bd59cea34c1a221eb0105af3e123c6b690252d802cb7bb7918001c7c592ada46b1d3a94127d0b5ab8d9f48da220bdda480ed41ec4e372246a5d114fa6e919348b755e5f78ab6886ba4608daeb11048cf770cc191fb0d6d8093427a4ed1c044b54c5f88dcd6f32abadc48ceb9ae371a897ba6831a029dd1b9b75b5c8dda3b4a9534c882520d4174d2d8b6108b12d2c4b013e60a7dcd9334a22087561d1368564b702b12b925c872302c8e9224cb609358946cd4fdcd214ffddcba4d83c2f96a40475f68c399a086b5cafec157206d94b26e53140566869e7264a722d1c73e10a029d8135d08ad019b4d54ad0a084b26675049e74d1c338a4b808bcfee546b9708f445603ee4a2cf5268dec0de13bbc732209e333fc294532b0eb9a3a4aef29aa80939d586382ed688c4df1dd14f19e691adcd41648d4534857cf447ee764418ec2410142102523fe4c7a24bc06839ee0ea8dbef68e0a13f9d08e67cf836e6d82cf17e48aae8c807e9b3c6ffd60540d82d1cc0a38e2b83f5978a11ea9f44fcd94957e61c9fb101e75f9825135e67a31ca5640302bfd55af3f23fe2028e1a5b600ea6dc8ddf02db4dedc0d3736ea946861bde1a556de404ce9aa1ae72473dae7df0bfc73766096171abb5b517ec251b6b5586c837cb8ac5f43a5a70a5fd15376b8645302d3b86c1a488bd36c963270d3de442d577a07b70cb7740ff5d1ca548b2283c30cc5e21f0c7ea784e2fe9c19e64bca93d06c2230ea73a1d3910ed8d210cb98dd4de78853aef1223a9eca938162882bba796dfe918af7790078a3f12aa94393e9cd177d37c10da8ff544290cb6c1e4ac0b677075735f3771a9ceaccc876ef5d12485680c7f6c955477483b120bad5816db398eb52466cd548c15d006cef8bc0724abe1e77107d4c3f76bedfe989a10c45cada5d0835c8a91d84c024ce49b0dec53309e7993d7404bd20c5f9a90d190257201cc495a73d1fc55e43e53e5a1654f98cc0bd754198e49468edf0723174733aa3d68d0c413382a3d9aba8932be09080593d57d88b67fc06c35e09d9200a3a218b5606ff9a96cf5724b817cf95d9ad56864745ee4dd2dee49df718db00e9bf0ef59dea09a4dd2256b837c85babe4c5166449703a5086d84ee5f40d48008da17fa02c9856abe32c7b9a3f1b5f6772abb6d6cfb59299ebf589a39ae48d450c5a709d7a738110ff5f74094044b09cdff49fda9c180c4aa9b64d2aa5188dbb53bc7a8f6ab4a59b39874e29f322837d544da422c732f238f434a8276ae0a04498624110bac316024e63d19907f836a77058f82b6a6ecc4605f61568f629f18854a44637fc0e9513777902f23920ae352dc8bba4844220523a1e7fb2e45ed040e804c6cc6d77a3321c8e7f994bad94d986da98467282d6cca800681becfce28054d28597c06551a95dc351c9d7cb752b1c29e63542f1622390796679c5d0c22f9bec4c0de59adb7215653e49ef654abe504d61eeb3614dd4bc3d0677839d83b726a4fe2895135f0f82cc8e840bc7e604149f321e7964c201d822562204d1a121a86091dbc98bbf15bde0eca9eca26d28531f8849103580cb49d186f951aa2b434331b41ee9b37a9abe9d6aa4616367b1da1d3e426518f7d6c64e804be01334b5f9c799514168e4c4d543b191ccaad8601838b47c42810475c5cb59d7257134358201d92194091643ecdb32e39b5fa853008ebeacad457339538e51fc533fd9f72971878ea8637830d229b9ef0ca3a68a11ca1ee34bd82ed50cdc7a21fcb7507cce4796b8d7d99582e7a3e566433dafb34fddd60df244f5bc5c97a3fc66e935df53889c3c60b41d30071a028811f05a9c116957a30ca1558b534220f6d2a3e3d670f14f1c676d68c285bea974d4bb0ee4f7b425bd14d4434498fce16b18a0ff878e6bbafe7a1aef4ddec5d11e2c42fdf7f3a33fb47c6629863a310709662cd659690fec651f8603f9e9f9ed693c737c58cb88a4319053b150fd43b3856dfb148f9da2158b4de04ba751785b271049467d12561c0a91a4ba8e968a2efaed5297564da26bebb3673fc329b429cac106ffdb3e3bdb5190efa881f40b0ecd08cc32fa6d49373a8615b5371a3c81c6607ed0d9676a96f5f3cc7e881cafb06d7c5b782c3c2b4fe58509e06cf3bf108d64b2bd6cc0c59cbc1fb13f80f470da8c5c57acf22e6147ebddaef2bf2495e5dafc3ec9e5bfe58192364dae43c726a0acacf1635b57095a32787cbc6c16fb881d9264441aaf1437d8f00ff24026640bc26ab9ec5672211400a5046767e307a316599b8eaf669345a3f573010854e10ea711d4910ede78f141ab18d77054e61e758c921836c4be6446c99f9fe05819a39b7365c66b90f02a7fa49bed492e67be69ba25048748d8362482c94928e2059e4e3abc75044b96411b0fe5fa0d755276cca664412a403ee3170e993845741e519ba2247d2f36a6a9bc819991c589c7dd8e10b63eb103f7e550cd440fdc90ac44fcc8951d9ccbeaa246a5e4ccfec043ec46f0956ebc324c01b3d5589123edbd4885d7e8a039afd8025614b5f2ceba5e5c2c7229bc44a9fb10489e2769cdd34b2e82249bc0e53ae3ade56cf2bcf752a5c5a04856d425100a67a69f4a55bcea9f775831f734ce79e8e01c5083fd58d05dbc23146acdc600f4d19f195cfaf397a7e040858a0050d6479c866cf240abab37249654c1313c2b3de9dc1866e81679da70cf5c5d35cdc9c7fc0896184d9b8540b0af0091a089b4d581df931b4b7b4b0ecd323c87cb2099052f27b858bd3149513318ffc6144b7307a7cf43620fd9ed29a9c56d299b517d8103d7055f76322d83e83f7dbadea7c3b04bf5add8904d4b8d4a1723d600bcec9b506b21752dec3afd843862fd048f5b2fd427513a9270349adafb5afa6cb88fc3c8dfc84d49425f4f50e322214b360dde7340ab41156bba0f81483e8788bce2ac531bf3c3650343287f360b19769a5d5a1d4ba3b1bd6b166cc42309aa71d29247b3f642b405490f71bbba8790b1ef0a20bc1866cd57ceb7a32224f0a43025e4bc924a131377c4ece6a4304949685066a1faf91a1c3b712b111091465f46fa1473ab49f34caf83e76901d4001ba247b500ca3859df305dd68d2e35f555448ba66ea578f1108c3840ef8a0e04a88e69501719eaddbb9fddda0cae100c7ade2ed9d7ab77d771b38ed7530d1366c5473f0ed38d05e030b8a1781562e746b8125ef0386bd69c5feeab5c451bf0751c6c48bdd5e6d8c2b4ebd434a6047916783c9bf3a28ab9d3b842015e066e63860047ae62039f13e7dcdd9378406a837bfea8bf89765f01be81956ecf831d2a9b57e4002d06956e23ccfe7ef61ee5c4e4274adc8b5eeba5b6e5693d139c91859edef8ae0b2ed1f800b62d9caf88000a67245332d565af88f5720fa005ab99c75405d25908c335278626a0395abde84cd8f549bace45b2068d0021dc5e4d38eb5d927c907658be2f9cb8eeeb85eeea02917b70563b7feafcc7f1cec5b8c827bc4209b18f2994c85859088a099d5383a8f767fede940f5b2cb5eb3312de5237dc6ad2be4604f8231a308b634eb764807c92127dad82e4812401f2249c5b4976864b62eb8439007c9880fe1967490e2050fe3453116db0f119430e9656a8fc0edc49b948718dc2c074bc7b2119e8634089bbb16b8e26ae203512464573c7d87cb7a4ca6511238b09eef6743d1886fb651339b5429da9da614985fdc67228a2b474aea49b821dced22a1bce83249de1e7f606a143c27f82e18d04865469d4d71eac310c47c90021e834a63cefb362e923bc2682691e75ecd635b6c312efe56ab639eb40fbe02462e9f6eafb0eb78737f11fc9322d4d97412f7ed356cc53a9721b3061bffa67e37aa59c0ae9abf4671c65ed29ca9a8ada75af682b02febdb8ee2cc279760b0dccea6ebb60b39830b544d50e1c262fb3697d69758567bbe265a06f176388d3eb7c797e25933ad4d63692694149c3921f8ca65d235cf29f8e8fc734293692f6bce290e859857b6128e87b6a42d4d82c2896f35be7833ad202ef6dca3484aafc3c6d8501e24eca64b56d3e87bd4b416c073e2f378b893a8f2027e5414dc0f1ed768a4c2ab2bc68dfcec98b3eb67abb807d7a1f4b1b3e708c06f7e334e090a9fbdf2596ded9f3e37d56dbedb1c7f5a9006b03205439b2c3ac574c3861c07a49d6b62f2d92e581b0933b3b1f961829e58a1d1625aeab0b5c67b0563c78af61ce5f3da8f655a39be24f787c4551db14758f6c83b060471d58c2f2d614408933f66298e78f1f8794e1b68e7dd1b066099a337bf7070591f08b47ac8f66b0000b73884610ac3b603de17ab5e4ee91118ac1c5b10577161da1195b99f02eb16a56757423ca8ae9c686034ce557c2766edb48698b198621dd82487bb8d9f3fd992748d850649f88c485ccae892e7c215832dc67da4100dbcdc1302ccf781abf0940f9c5d7c14e9c6d929488a13a288a7a856e40e7f70696965610012d62c4b4cf6ce44041926b8e883ee43fa7a726d1362819e66f829024ec121d3a1a95ec75f9f10fb176622045284f4803be2ed11dae51ce97f141ab30e85de7cc088d1870ed00215c58c7c682223a473fb9146be63c35a6bf18544958bd9aaef334007268208243814f400aa5751bade0904ce9623ff338743654682ce5952dfbc919913aed35835f20aa8f30155aaefa4e5814def4dab8782d1b90f7404b5d0c76f23db421f1e34c84d67b0af0e84c7dbc221f5e7e7ddfdb75334214d05a1449f7d6ae57e1fd7d1e21d2fd27514c7a2a555a19bfa10f0432874fa59a0d1397224cbe95880d4e4da5c417b22405d0033d9bd4e4ae5514707f9ffe472e7a25f83cd4ab4b6548cacafc70972f9643d439743ec5935c0340f574d372405e6b8f367e8dc9a34ba8ac3222e95628acd0059e96fec99a6e42902d11a4174092064c3af30634824537f84ed1b05431ea0aa689614998f05a44063ecd8c7456ff34097b738e9b749a9909a04b0809b302bcee1cbc60f2c4c0749a8a5f8d592fb10e246d0192ca22dc57a34a5792be3a82a60732ad5a896b91ff212d8608601f3010b8d02ee9ba6d647d6597e8623d821804897b01ab29aba35289a6e0793063b48798eae966077a17820289efbafa0a1edaa153d81f88fd8483b8789ca2143b16c3c6dcf047ab69a78e69f21a2b23f43fa92d16ff94f651c58128c7a21e95e2845d0e222e4ef86264dcf50d1c734f257755b3375c1768b40a29ec8a4e47427d408388b35e80e2bb6f0de55aa26382a3097394f29172a3f8e869cc8f31d6837a25e5b0d79bcf0306f5d130778001b3c05c5fb155fafa9631ec528bf93048ae2eb254624fbb136e6bdf3ef07ab2dc2d2c7654f689b3c04f24a7fd2e6bb03d8325ed52513437a8ca7e676c11b9b5d29332a637715cdf03833006912f5938c4a07962786ebc59d1a1b6ae875473dea08b7540fc6ff054b0a3b03db7cbb1ad4b4a0fe9070ba6b42893cb2ce5bc138facab0be3bbc5152b23f2140b51b6bf84625d940e31dae0b05f0149788ab81888e94d1c1854ed1405613f8aa037f563be173c8971bb3646c434c35db8aaa5bd0b4a3ad754c5e6d77663e84bf1b31eb1b8bdccdf30c0f95784bf27db0102557ff0356dd00341de08c96e1bd2ae1522f43e01893e2a26ebbc06b25febf8eb00574dcd854de76885e89fee32681407d73856ffd3e23c5a5975e8ae86efbb6a0253a49fa61909153fdb0c2b07c82fe1f361b9c6e739981ed7de4e4ca770362f45081d5162f976764b03277cb807f539ed81a98b867f05b92f8dd0f4232e0bb4e835d9027022075f035a74a76fc32a22e13ecea28f86b570877d5b3c1c0a9de604cb15cfd1fd619aa9bbc381aef0058ab6a4c9777dad1e7484158bfcddd31e6308cf9ff9a650ea84bcdcf910b692a982e8f28a53d114cc47244529011a9959fccbd5142ccbf61d9332986e06aafa08b7cd444412c4354927d3d29aca169537c13b8906db82e7167214558556496ec6bd1512c1c0923f81e0625270f23f56c3366101879b8c12117cf5ca384e92a14db38a05b2cc385197db39849bc8fb68869e5e9220bec7678d3391164546e732f035643b6e7f244086832ea3705eea762983e64511c2d754fdb099d244d52920dafe16c194c78aa0c1082cf253cc20eb49a1d26a0723a706aca3fb005cc425023f95f40cf68a0323e591a70cd6f7480bb4ae92298a0407a745385f9a21568607409be563b06597855b8ea4f96893e396106a04d206022c739dcddcc43e7cd408cdecc1482bfd334bed592f9b96b522ddef49ab35fd1837a1fcde7fbb57f43c8d2545de8fa1e4724273c18a6e2f716c91eebfcbb182c6b16e687fc59f74bc8e0358425d233761a79004b54c8b74fea9daff4173cb5e11fd80b7094aa67cc3fce95ae43c587da75633e4914131cb5c0cc4504a6126bc07b944ee2cf631e3dc513b319b8503f590f8c5a57cb586840092db6a4449cb55a1495f69d1d7a4160bdf3677ae1eb4508ed8a9e25045d3f1dc83093cd39c0d6e76560206b800c1fb4e728270dea76756b71a14a50cdb7b02b32ce13b0f727b39cb4bacb93adcf8963cabc84da2fe9370c6620e29087cc7fc3539f56b515be1448178e49f6f51786653f55b00e56cdd2311fecabad03fe7ea9fb92d5ce1501dcd401bb10bfddba44cc713ec0ad889cae1cd63b7ae9b47b579d55d684cbc4c35c7909e19cb985230946a1460379acfa91ae41e545d68c3ddd010eb6e665d5c805c294c283b947f19214c879f099d2a0eedba1b9135d1392ae4c05ea6fbd98c6665058b71740585076d25415ea719e3be4d1a9031f1bf8d566cb076408f7d01a60f2b26f3b2345c6508edadc8d09ab85886184adc4810752606b316bcb602b6fdd0b8475999705d46717677dc3eb2990e45289833baff48e64491cd11565246997a3fa11f9cb3ce6f46444e1dbb409720b6b4081578ca1823746846cd002acb44d905476871c4c20e2b9b640aaa699f8e5c489118605dc9af1e8c76e2c9932a89235934040cf8fc365e13d437064522174e7e83da04c7dd65682378877b04bcd6153f01244b04ba6527aa5720da15271dd99bc424b11f8567872144da942536e3f825b3908ed0931d93d99491dc7d74906554623971bb5103d21d4004a982a62def4d76e075b285f04df5fdbf857eb5892b18a3ff91baf5364b8834b209217b4bb903c10a630a130a3468d0a041a3ba802890069883a86384c4f4d1d2d2d2d2d2d2d202040b0b0b0b0b0b0bcb0e1616161616161696157a5ed97ea524cb6432994c2693e9b3f654022bf68cf4aa9d2302ed490a6c0aec8531c17280f5a8ebd1d703b52ccbe80bec1c297a8a7e3593ce01f333951aac6f80c19d9346080ad2acd99a464872e76588c026f3fc86d447e8cc436c3883e3d2f316184e0d7967678864e1c07167abf8b3312b7a06e6a0750f1bc67b58e4d2f0881d84601ce6473624125931ab4ecd10c79d263046b246512504bd66bf4ef53d492d2603471713350e2e04fae8d4ec1ed26fd73c1ef4dcd9e3419f7d87dcd11d186207a253dc65f7ee5921d8332b44d86d5efcd1d920324934cbe4f47829939647cfc7771f40b8f99dbea325cbe5ca657b406acb7734a9643a47bbc992a4fa9874de8764b5d82044944aa552a9543a929856e9f3457c4e5b6d5d0183f8f83030c40322e0230913e8a30406a951455fc15354d1211e403fef837e3e0291a5450cd0996118298c0cc83ba4553da453ad862adf5b748a6f022f4813699b277af4da477493721389b69077cdd26cf7ce8546a35077ced268ef64b88f2c4de85c6751462016d5429dc99e22bb922ccf763625599cfd2989694329b5b141424f3648524862aaad1b78c490535465afc9de37a23f10616408224b1b9261f63b491cac473af29e1a063b9f266b31a1d59602bd2e944415ff95337b0e813b45ec3162d273425df958e28d6bc3f73df15d791c29d500129043a4495cf14a30c085bb6405e9f19c502f63ae8c52c3d8d33db44a5ed22acf23ead82edf03ff109b7069dca2871e62cf8d5b8ca24a02910251c7167a18a584510c2daab053c91a6d54fb3ad50327cc37f132b61a6a760d44318acf9673743c2854c6a2d3a22ac13bf00a229fe062c14e5a254760d45e82cf978fc41dd832b949b5688582933c71d9091aeaaf3cdf753a620811456834417cec00028918c9921cc771e738ee48625a9c7cca560ee49b90767622ea18c51c4a2c1161644c3511595a54b93419559ad44e354bb4e2e9a95358938ce07a71a37852c1413cdd70f185e39698d665d911adfb4e8fff4bc388468fc7b16a18d2e373883a66cce179a1f390579ef471476f881a18e81c194314486812852bb440cf86dd2cd221cd355d8233dd2d95b00e0d95411a535e1716b9a119535e47bb98f22ea3d7d990266427653aff9da1f2c359b12b482270f16506379e6110615222882ca6476a099ee017441dfd3026554f408838fb902247441ddb2a4e21e6a042cc219f6a18ae424c49205c416671e53b2eae3ce7842b1ffa06f29398439e6a5750e1813c02d9255fe557a7532539a9cd3e3e9cf509497a31d0a3f5e4230aa5176b9736042017bb4049d4c131320daeace23a0802112ec937b425cf40883a28ad554ae9a4d24eb19424eee623a5bdd83b30b4b70b4f69ade1097b66c3ee8c0376f67874a7f3ddc44246ee16a26bb894896793b0ad26e108ee76de91524a8d52da755d57b12ca485b430ae366de4b1630a55d453e52f598faa7e8aae6a531a6abaf30547e29853f2f6574562953108765d69437906e3c007b0426cd00255c8fc3c7b4170dcd1ac961e2a7bbc186dd16f496c20929896668324012ded37b3459f591fdae395a92dca843eac61d7a51a186476d1560082a2450ab2f0b9510b245ab86849891d1c273bae1b77aad879dd6f92213f1fb2a28cefc702544125b60ef1ec1139917aa59d42ad4265c2c916d814620710f5f4d4cd4edc224600403e3d60020a405608a1a6075ea8400557784219ca3005095fd87447f802a7c48ac219b2289c81411182152ee9462842e8228b6ff4c4cc9c5a69f6cf2c16babc941d48eb49aaf895b604aa823b9e18f6be2896d2f6bcf4722d273357d1b4558c9ad43ebf94e0f4cd6539ada8950b251b70a906359c5de4d9a17868b747df6939e6e06d4e3bd3ddd34c57ab64411537a06c5d362cd42acf53aaa8e1ecbae6c4397fc816f639ab1595a5123e5605471b26c628661666d994b25ef6eca8545dda6f9e562a9bdacc6aa0c4ec099b13c3b8ef3d8cc08ecda46a3862a2b97158a0f2596c90767763db6d2a55ac9d868a66d24a5a954278718f9479384ae4273b82509fca37de5f3b3576370299999999291192d594d67a3afda9d46ad5aea674e7c5ccccede3b3e3d3b18f2071c6950c041fce2289226c566a968190049450fbececdc9898d52a95fa67cf7641c8864974e1ca1fd9e954abcb670a4c5c596739f0699f025ccc01576e91e481a65b0838f9426181611e942bb1ec988b11dd2d322f66eb185c7c09331d32aa194a3a27873be78a1ce61533aa0492662c7979a251e702bea4249068c912964fe6153d584fc3442842d8e2f2b12883a6ce132ce4163c54566f6451bde4f2eb664910cc10f570dd88de8944a21eae9b4ec57b83d3bdad8745f18207f3028794361e6683ddd878220ffb6998707a21027b2c018564714bf41934a74c9fd833c110b9a457452e9d12bd822f9d123589059ec31974d9278a61e3b10503baf196f3674fd4c19755e7df00635a07d15bc01c5a07d16d80abd641a483e85850b3a2777e66c31704c16986945631633697cfa104ba3c923580f3e5940e82943905737949a492ef7cf99254c81ccfbb0a98ead467df29cff67041212dca9b5250de049a5282f0c413d91e2e28bcf77041213a2712799e880b17144bbce8e6e92e9a85f9886c6e5e5a7fce0d1ba7b9c186006ccb6fd8b03491e6061be5a3545d99bfb63cbee52faf5169ac5a4094e83b622b822891f5d14a1d00bfe1485e5a31b65a5207c09f48d68ddb7848c11b6ed8a014acb5c5fef41c40f3a8409b26e13c0ed0a649b42f60133cb46a1c00600aecc07074ba6ae96e04ceaceed77597ef7e0bd8239af8161b5b6a7b231bfab8fd9696fcde2dadef9b51a6ca9286699e4aa8c0721aa6edc4e9d4150d23b2138a4e718e646153882a3e1674c6b8fc30eccc1c7e00046a5a351e105ba8f6503f6a1c75191a77397b0fb061f90947b27a099f99990688eac783af01a29aa6a605de065803b4373cb46ab4d8686902701aa7b1aff11af6358ef9580c8c9efa73012822e6b027eda0bedc97df70fb003c8c3d3e6c5e7e83e783888c9a5d4446d5786e8402842b8080c5c57024cbc6f9588e64dd90ac1ae7632fc902cf2de7634f6a8053079c36c09983f57851e35b1e62384bdaf5f97ddda3fa553ba3601cbe4805f89a5604e35b2e13dff27e8b8db79c067c7c4d6be64856e5b7448b1ac55bbdd7ab8061cd55397b3ea8fc35570486bf22cfeb445f79f4fa1e58737ba57e54bfab80fdead4677b890d50fa80124832a5250b44b2a104ba3cbd1e6d846fb78038361e5be2996849454b73e33431c6832d077ff3d2ba61e3293bc4d2349189b761696c3c9ea6e5a0a56922033e5a1a1b965d600bf8188140978db7dcc65bcedd00a2fa37dce6e605894b4b007f01536fe2a575e34ca46c133cb470dc06894beb86a519c069f8c68d1b4fa99efacd4b6b007fb9cdcd4b4b00c76191b8b406606978c7d23491b97101581a8e2255fc1ba751597e2af51b96865fa9bf1cdc89516ed8267868bdfce5061b36c0d802c12678684530b66e00bb05942f606c4dcf0791e51e0010d57779bc05516d513f506ff903506fb98c0b1297563cea2d9609f04df0d06a3913a06d828716f8265e5a2d2fad78d0227169b5589a26322d8f96866d133cb4e263cbe6c6a5158fe4a5d5f2907d6c786ca1da32011f5b485e5af15c3fe914633d20e6e32da1ca1d8905d6136238180ecf5a311cac27e6e07b64c01e99c473524af9049b32861a623d580f9368319c326a633d0dd360f888d1f68778a504cf342336dcd2a3a67de591b5b36861bd2e27cbaa2c3365dbbf97406a43ab7d1a18c62d1ad02ae067437b2dabe23101dcf86a801b2f7a943a6e7ca7c58d0f3d328b32abf4c8dbe923ef909d7b6456cbbd4766d1f8e89159a893346655c9869519074ae3e3ab0de9c88636acacf26c67c3136743ec3980a90d67ecd5de019b0111ef07b65ffb004b92facd5270a507349ce19b9b3d7219377ba20778f9abaf557cc071a514d47e6767b62128a70dc1df061b0000801a355c5c50281a345a5a4e27169695151595ef33994a2512a9d6d14824f2bcaee3b85068dba89597dae5ee1d3f742e34afcd6f369c77cecb0f39324ce414db7909464ec50bdc197bf9dd807865ccde9ebd18068636b435210ed970f1c5f35eebe8916138e705977bc82ee0e2725f758f5cd779281e3cb8abc87c222ed2603952c3eeb19e73bc4fef23ef21d56c18e33db3e1ca3b66c394f7920def799736ac1d3a17f2ce79de55accce7bde675bd11c81e18922e7fd2e82635279ac00488f0193f843e8109907ac4051497dfd50a768f20187ea0e672e79792d487de81dde8a351733a330d437a67598ed428858713354ab9dd433ad3a9eeacd37d76dfba53ad239d8b5e123e110ce34e18791cc071b5477d67d9f301c5833b1702b2721520dfeb4b9634fa078623ee2390c589caafcbc5503fa4f295cba8708ff1a11088fa008a87f77a1e355788f77ad40f957f97319de5a377f595fb2eb3f24fe63b0b0fd13d91d71df563e52a975951e92ef35953f710185774d03d3ece60ae0b8633d4e786ac1179f92527aae49e90a3dc1d7e42ba40a3fe944852c36b110be367f865842ff33b4e30f40dec8e85fc42f1a0a7163bea47e8dc65a8f6adaf0686720a379ef933b3281ed827668170e3670c5d86b351aa425666b32fb906feb9d13bd0d32aa7891e6a9e07ae5ce33caec4c2d9f67878d75e229ddb2135cdbbc67de7ee91ee99489625493dc8812111976b21ddf32cca7be99cf56c0fd349379da4719cca16489761118c39952dc42258c75d23719ac8d31edf02869a274a82c66950b649f72661373a37da82361a956cb0010000a851c3c50585a241a3a5e574626159595151f93e93a95422916a1d8d4422cfeb3a8e0b85b64d458544b221fd1e6a3a4e1f3dc474a89c6564c3ec962efa098c3187c886d9d5fe81576389393e1bce5b7a8c30a4974ad7b4158d4422d9f0a4af7b48f2a1da20ba335f1118ef0ee99d06c90a638c31c6185ff8de811f4bf7fa4eb32aafef6c57ebe9a462512a2ab353dd4d76764a7bec94465ae9ba95d7776048040f959b5ec190c8af111ab7be7452d15eeb35edd566c0f4d829226ebd090c89b8daa9b462598ed4eea87ad2abed617ac7f2852f984c42583a161b964cddf715c1ea55be502b1812e1e2722bcce9ab1fcb576a5d51390bf8551515fb7d44948418e16b7a58045b7161b9f4eabffaefd5461b3bc562eb6b5db140c48b52b990efa6ab7c37fdb3b353a49bec4ba7487fa78a602f44bcb8a0bd744d035b4e5fe95abdd6759da6bd6b29cd7cff4aa68734ac26d24b1a090c67581e3d07985ec3d25b4a76e62b956c0fd3eb4d5cf8ae890b26d3673ab17c5cf8666a2d95666e38f37d1ffde847bfef9b09fd4839b54891726aa9711a004891ac2e3dd278cb89e57321a15a4e2c8f2e364cddd2bf77948c860da90deb259dac67c39355b1e16d0dd055a3868ba5bd235d58ad56b7d33aadd33aad4bf958adfe54ca878fd5aa0bab2eac562854175697f4120e522af5724b3e6e38b35aad56abd56ae5c3cb91405e30bd034d5ff792f612a8f293d6bdb4f2d24a2d9da4a2f2e8d5ef6895772f95eab577a0111beecabb97c015edddb5772fbdebae692b2a96e548edec0c93aed96a519dedf195eef3c2caca4b2a5e2895564a2653487a3c0b1892ec0cbf5a5abc503a092c9d44ca92f0e117bff8c52f7ef12b091f574b8b043275e846e52708be2befc0150d3482af10d24b20cb5b4eb2df49a697ea4b9dd6699dd6699d6651f523752c2c67b9e91a1856e06a6f8fc7f7d24d466cb8f526ad86a71b9e64519f5d40cdadb674d34b375dbb090c2b704da4d3a3e780d26b683a8b6539524d1665d22cca647b945e5f7a25a99ce3aefee1cc0b7b44547ede752a24151bd6126965e5a574959fd28a0d6beeca4960f872492ffd967e492e2e30df55ae62c3d325bdbea4522a7d570163bda5d7ef961e9b45e3df4bafa701c65691c20aacfc3bf781e1cccb15b2f2a272d33913583ac7f50ac8d704f63595a4b7f26ac397bbb2a2628188377cb92f2f15e84e0a2dc3a27052ca8eef1a2c99d3878bcc64d4afb5ab94fce4f2ed82e7620cc02ced2165173937de7839eed822c90d032847f8817284202848b8818204250c52a0f64f49e0566791841f180ea2238798237b881dc36686619a9d140c67ba3b3f2b4671506c62a9ecca17ad31f94c7e6a1dedb4cbb776fa4ebb039a6e49004295d7a296b5c4b24ce56276a6bbd35e5b03f61ab17f25555276a22cd32e3f92d7402daaa8706ad13ab2a28675c582796ef234cbb993831a7217ec64ea304f1d7e8dc2a8db632b9c2fd9834d64f9989f64883b6480719812591b0cf639cd70e7671422ab08a99a27a36ee1c70a777e6611593b510775c29df3664eceb69218b2fdbac96cd839373d746a162159fc9af349ed9f4e01bd94fc28c1f16131217ba44a35a3b42b8827086807e8e7c98f8f8e0f139209f9922ad564422a912ad56442e248d59c67a2815e529a21e6989ff246aae649baa46a769054cd2b83321914734c5250cd4e9fcdb9433710f391812a469c3d083179e64eab26e94c4aa71a6b32154138f6aa080827bbd210cdfcca89f35cb2fc64454ad55a6badb58e44ded671ddd1d33cedbaaeebbaaee3366629a6a0da0b6b1a4b304e9432255592331055f252689c22a59452ca775c54792062e4911fd1d0861bd29085ba70a4145bfc64aedbf4b4597d4985d469ed9aa7fdd430f2947696cd99dd25bb64c9179d3f9d9a2fa097921f25383e38373d37d31565ba8278828076807e9efcf8e8f8f4e4f4447945e151c2c30486b323554c4c20f9c2cc8099e16606d1634151070b1455083ddf582c28e6e84b1f5250186f3aeef820b94dd3b463daa9766e0b827bf78e03438a75972385d4ca1c4945a73a6499a83c6a4c561e3d1fa497cc5121a97ca6d28ab7221a559e1df225a70de96bc57a9ee7799e772431392291482412898e24a6257a5fea48d693fea95f552c894422914824d2f77ddff77d9f09943992049e72f002e50b9422d0934c640e7a4ac975690c58ce9ddc9d802e3307a13b95a376b1974e0ddbc99d0f33173715932f5f1ef29aaef210034a022459bca497cc6357882c0602035017ee3cf6c2300cdb912c1216c69dc7c0e01de87b302c09ef80cd634ecce0cec788b5e0ce7325905b1c7d01e3c00d83a8e2b6e2f214af1b56e925db4a64e946ceb7929b1cbea2558c335d3a583889d223b94518f3f00ef4f30c468b74f809e9f3ac8418a9f790937067e7cc7ed9b056e14e1b522844962a60131f36a1db70ef6e023ba7599397301539af56cd27c192b46ad22dc4755da7a132399dc9b7e4ce73a7731cb712a313fa1e0a85368fc769d4d4f3a1331bb60e66b5570c7a61af2054ab5986351a6ad8afd77d923bdf2fc98a8999af989764515a2bdf1c41db0aca92514529cda53e641f8242a15028140ae5e2e2e2e2e2e2e24283068d33b262197e3085327e6005176198d1ea6e1473ac62760001c4a188f0e5f80252a98a31c6ee233818661aebe9a915b300258f5d23f4364a5a22d748bd6d4531a8bf7ccaaffc137f045c7c899377e81bc9d22e9f65994c766ddafbf753fd556475523cb1842fd400a74994563f26b26a6c965491c40a4420c20eba98dd45e062c3844aa6eff1dfa97b77efbaefb27bec388edb365bc3eda18d7bbca67b0fbdb4d18d6e743bf5b64d0446308226b00472a3d0b9cd0345e008ac243074b9dbb6f52b283f02e74520764fdb36aa85df3d813526c6a0e0e6b32ccbae65d9e3a59d62491267d7b1e3297aa7ef66597699358b5bd9df211b526a3330c563a5d9146b31862eb719a3828b2f6173e819e85428f41d1d0a3d3e4a29a594f2340dc365dbf9b53db4bddbee6d178db6d72d64b76733fc0a7f357026f46a47563ef4ce86a94dcecf8034367b2c3b4d1881685cbd446691d04e1f5bb5d58a4f6d474209fa6dfb6691d8ae6d96d6b434104584b32ccbb2af380d5c34a24623886106d71c6b02623a95c30e21d765b65d14ea7c5869b023a1c43c6651403224b067164584efb434b6eae929b933ca5e835d661ea36912ad0cf6ccd2d0d470b715384edd66c9732a5e7b6ca1a245fd98cf0e04bb6691e863cf2c66511109f96951d11269cdc7964ab2e7c3465a1dee0ee317b84113a0d0031c48210532ba886247462d707688d0021e26b4600c9a61aa1ba140c1e504241c010a14aac071231428dcc0093ee09ef574062ebe4c5e5d0ceb732a6360ae3a51c37ae549b262e5d35a4fa7a752b08a12c4354f299943bd493abbb529674bf9b6b1b12cc3b449e5d6219ea18d1371cc111f2d85c1bce49773736a9aa669f31469143029312965673db18865538618069eaec471251873b9516909359eb9e4234b3e528ea4ec29a594524ab0e5a794cdcf2e138e4f82dbbbe1e24bb845b9d93b297d342fc0885a179dca34333a957936e4c097cb711c18ba472489cb79da944e655a50a7b26b523a95693f9dca9890bea34b54d410ab1f81b2c5244b0247e74102478fde10d203126ad120d17a752a5bd2a9ec912a8939b2cdb565e7d81b226bd5470f48a8552d0d12ad91c582a42a7b486f967dca9eabf55c6d8ba245c1a19df8c8ac6b57e7c090e954056c902f6ab8e242baad58352f29aba88dacd2ecb43b649c720c19234add1a56ef153c78922ccf52a9d23abb650f5dc86a367b41b35da7b89b73b8d82346bbc20865ca15b76d916eed8c35b82ebf86d98812a53779ab87382effbb6cba0712612e59120cd84492c111120a5e4b4edfcb316aaab9a6b008b5428c609f1795a9789d7b966037e578efd2924bb239ac6cb011867958c986a7b406358cf91a06b5618f49c08e1e806898d0b10bb11dc35e8186f18e3d0333cd8a2d910d6bae28c5d733fde54f8126ef215f9289c8e87a776918930d470ff9a74e61df678dccebd9187390be4392ac4ba7304a479447cc94f4ca949ec190d693404a5f0fc65b3f4a49244a49f4fb1e3dcafd0343df520d73cf9154caf84bc3909e5df648fcbe7cc619679c41ed777279c2948bf01dd170f4b0c8bca5934ca60f34994c6112977a2490748ff4d2b9c5601c587a3e906cfb90403e3f5e4a93c023623ef5489682fdd329aa5d50047205391118bad65922d5fe10ef66298d574352f9218d528342a46e09a90b8548dd1252170a897e20bdc350373bd58542a1771b0fd2fb4b68a73adaa90e099ca6842faa907efcc635602635425142d0a5df9e751c0511973136a916776e97caa8610c3a42b2645aa55d1e06f3a39b1ece9cee56baf6200d53c32ad37911f2627a3ed4969e0f252f083e7dc8eb613ab51cd349e9473fea996c633fa894c8a861dcf9bab8b97c92925bdfff51420fb771110235de231a46e5da69d8c5a980bf1ef81be3b7531bd2a07a45a2c7c83a22aab48bce75dd11da5540d1554091f7eede63d7d04960480a8bf40d996c58c4359d826078faa174ce7340df040ad9eccce99278300d824f7a08dcbe439240148f2baa9aa6699a56fa078e404dd495caa861ad927544abb477f80b839a8531c886a6612887f58886d14c367c10edccf3617349a10ae9971ef6474190bafb38d98d82e897ea4b20aa47e9db4bdffe438e70fb285e13aa073de9d464c399d3ad0f6d25906463a76af43ab003a71b1671393b733acd86f9f6ab699bb66935aab4cd8bba9d9ef3bad93054db7c20c2b153a24e6eb73484d81e3d1e9bad9d6685f0eb930257836a38cf5dbebb2cb8f0e266d7fa9ae45b64ded0bd737c39e3e4dcbaf61830bd1ea1dba33d1edbf9589f2fe605c172db862108dd9a2ac21edd1bac29c2959c16caf7b524f45cfe2d12441196f387227c33cc82611261df6e2d7caeac09315602d9ddcd0d6ab299bb656358b794d8317088d1e89eed5a79ee611605c4f35aca966f2c8704ec9833e36628cb42da9b661ac761d8e743dcec8e61df21b76d0b6d54f34475f49652caeec80dc2490ef3bcf67e4c8f6f701ab34044f73ead9215bf6c8c54b54f7785e651ef19cd7e507b02bb7b20b781a1ecd37b68d33299ec214ba33df36428f5c06720fb84382e44933d64b987b334db439946b70d0ca265d8646d712391300a05c6c564902fc75e90283a7b3f362bba0664fbb1d99354f543f72e02bb6be0f69037cf819a6669448f9e0fb3a645c19a962804d6b4407a2d7451c8d270228e7dba4e3b6799877b3acb51a4ca8716bd2282489504f972d4817d3e040621422601b12c74ea9321510776792246302bc42af950a854ca248d39e427b8c51cf22516541c2c0c2ebe344ceceef6dea92337beb9203146b9bd47bd9bbc94de3bc577bb1cc27b3d7b40bc57db2211cfe8f5438c5e6d47912ade2c0a483de943d4936cf74815cb5e0191bd2f647bb6c14c18fa3e475d6e88bd0876439c7609522ac37989d17922f2ca6fdcb56fa00c7d38cd96651afbb0a9966d46969fb04e8e7caa6164cbf413a952e9b4924e7192189a42d604ef206a020ab78a618b4201e9ba673666196719771af66ec98a8cd928393b5dae6969604d8b8235ad4b564d2b55d30a636a5adc04b73328837db3341e7ba1ed98a5c1be3d04d234e13791d1b426fc08ca84ae591aad83384a39ee9da5d9ced9f691aa0602654221db3f52c57c87d81e3a7b40b6872ca50f593a84f690adb9d19b1605047bf62130cb19f33529334beb29369f6bcf870df6ecdc887f2895ede303bbe456f6e85530a675e0632011ad03bf412171871e81e3828ad54574e5a36b1ba772af8f7d0554898c83c8d2b658633762c39db177c65eec5136c18d1a8b17fb1c3d328bf4c852546299be772ae0074656555b024f9171f0ba90dd6c589977e0095ec0aaa0769fa1c769d0b8f64ccbb0c6bab12cfb9c47fdd84e2fb3d199d97066da7006ebd112b346f09db608dfee2fa04cb97c6e1404cb4fb0845363c6e2444bfeacb9d29670aa3c4b30acb946f8be18075c7c5901429de7520aeaa48f9c372291465e76cd6a34b457a32ba652b6bd396fb4622a6dd9eb45ef1ea2362b99565858b415cda495342dd328a8d17a3aa59452cd6a8f2ad71eda4bb93662c3fd40cd2d7d93546bce1b514a291d795cf750a101650012e3f6eb94f3c5d934912fef7c50c34b26e0008629476609563c8041c62f6a136a78ea3a7a866b8ad1a9e9337fa6cff4993ff367fa4c31e28e9e3eb7bbdbc7c767e7a3605872fb1d9d34c787eeb4139f1d9f7672fbeda4619eb8c8e026cef5a6a0244a4a09044d9456bf9ff40e8313a4af69d1486965b0534b933a4dbb4565abdd94c06aae2ca89ba286330bbab3e7f693327c3a28ea3cf323d35c3e6741e1ec9976f69ca08659505036857638590a56970e71b113458a28e38adb9fc1611433a3e25316c5af69d1a0a235024b1981591a2aa354d5b46a5a529b0f4f596c6920103f55ded89a6094aafa53f9c6d6b44db82f9f9262b4e4e56ace6eac073b30614c4c8341881d649871fb3db4ab816894b5732029a961dc692575470e0d24b1d076b49d2b98217fc8c0e2f6a5947aa5cfed47b6524aa778078f04923f5ed450fe5c09d4307cf9ca1f29a56162ccc29b5243f9839325c96e628e1fa22daa1625e6e86b4e88395ae3d9c9e6b43448b4e44f37450de5cf8ef4e9d48fe6836921837e7eb426c82912880c9bdb97666851a4194fa8222354e9d329092471a48a0695de183528294acf6082142f6e1f47dc018bf84945d71728c5815b5254ae7b864ef70530d8f3a15fdd49aa9ae4841a767552498304a45cbe7073fb9757aadac5e505473f87fe0e185e58b26203ea91b15af130c615b7ef927d6af45fd5a819f5da49325875e682318a8711d8d74951bfee1ba386b3bb11f30167d36476a495d28b83c6978e0635a4f2c7c13f66709eac9d5271d5f032729c8d29f1f3e4f62b3675e8572954149f2d8f79c3ee737929c3a5ce2e44b97dca2e05ec90a1045270dae34b38dac1c1e0cae6f022251f3b49107b0489247123c76336d5a973523a05d43af4493d35ac5f921a529c8b80688cd486728c501454b91fee87e270c149898a1ad6274e5a47fb8e664d8e1165186e5f9ee1f63c7275ea9d419a0ea784e204ddfec491381247e2509cd0939093900ea7c40196da703f1447f43d51436a73bb3b9edad09b39da095121474747a7084e38e70aecaabec7535927c61d5cce396fce6e58445ef999ee4adbcda0e6e8f02b278a9656c8e627852aa594127bebd0ffa2a8fce821a1b20f2779c3d6e50c353cf510dc5ae29aa4a861dc61d64aee58bd9cb6b0c5edbb7848a8e1eab6cb0b486ff4bc2d6a187776f450bf28d8129c640b496ebfcb5e64088661589123b2d14f0de9d7440d69199a4ec384b2e7724e6858e8344c84228693f9f81272389a132ad450f67c4a548a137a2259f333943d3737943d5ad4eecc47aada074da7e776e889543d51c3a8e9dc667d723833055d87a39372fb15c95b4da60e5da7ba6f779799815631b809bb2450b4e0ba7db6693219d4a12ffa410dbb336a27863c6944a8a794940117be509a4e354da7dac59633327c414147d0b8a26b0adb40c902cfedd3f0bb2bed19552b4227833a41e9920217552797cb092c8871fb9f4d6dd238dc474829e5d9f51da934806a0df806e78b7ebf72309910a160e18a3be2d6e7aa35deb4a086f48615751d2bb879559fa486fac31594b42abe6ace49e74f523f5c81a755d107e8f6a1f85cd163099b8621c267dc1822f550428c4e759486894630c3cd8d30d1086500baf1f2e0db6309d70fdc630957c3a0e4f94adb6309d7edee2c28c6cccc8c6518c6cccccc588661369cd178fadc018de70aa9c9b8b3c0c5934b6c23d8132e42a066e78351f9580f7ef6d82921d897592158772318951f73c46357a8bfe1a9d98bca5f4fdb8c1ea38dd969a7054d884b8ddf63cc5e3b153b1df18e01058c7396655fa59a36a7c4c02218cdb29bae906c9ea22afe83024744483fde50bbe1440531fbd2d65c96e7c847287f0e68a209eee2e3259c7ae0bafc530f5c259b293326994d825fad26984505b1baf2ab2b2d2a88f91e48a25cbe4c826b647315263001635182daef0112e1a6f67bc42cae2cdd4c2c1e19d100e7f24734c0d9418284d2a0259608c38b183c9e145cbec7938212132526621456f18b501426b8fc5014262851514f2dbbc321449ede505a23f286bf1b900f571d9bc8eeee29bbc0f5eb14097026d0650f077751e779876c10b34295d2f5d22cac258f23ea88b75e0c9b7208ddfb0952d8820a5abf72cef8dd96525e3e3157138b35438852862b6e9ef440064fac48421876cac002149f30e612a47085ec33a3bae048b9dca57f62c2bf4d0470e1cad095db26358d62ff9a55a50c2695afdd5f60c295efa1614e5308a797179879fba9f9727b727208d007e310bf074415160a7d462ece743d99f976b78f1f510777ec1c07462fd4f0517c1091812266861439e239342b0321c5f1f272c387bf9e7529718454617da7f5c13860c75e8a3ad80e117360c7de757c2558a488213319e8142655980bea5c52e765f57eb044ac218c5dd7755a6f5964dc3ccdb3621da21315f54706350fe5a93cecfde856f348d57cf33493eca1641275c41db423d57b7699c48ef20ed475e3a512dea1ad8cc2384c69e513628e792cd3382a951c0067003701c8503762a6cbd12d1475b0b49f922abbe8d43c1755f31305190be48b06524ca1616a982e902f883a60105918909ce2ce2d6342be4049032945cc21a788aa2995a0c408773ecc7084207970a7b4e2876c79562a595243e9a20f6586c5631e8fef05990d23d08d3b18a134eae08ed2bae21eb69f921a364eefe8e9e282706e707a683de1441da210bba2b8a2b8944856a53d56d4502ae96e5043fec19d7ffd809f4456dcb933ca9079ce86af0f4f243a2da9d66aa7fd45a91ba6e6a7f7a35b9e9dae1654f9fe66a3dce923aaf89acfad3cb9332abd117a43d74023f5862c112d6e7684a452fe91b53ccfd220d11a32e9e9f244c974cbbb4c3c4b93446ba50afae8b26d36c8aa53edc5bc159030db46375b04bb926f942e5187c80975e5727b6218b66ddb7f88777bcda5e026af8135578245b09bd9de21bb6bba5badfa31fd1d7d207c302d0001641e3b90beb4987cb713d96c0509445f66765f5a9a96a7e9d7b4283f862f9b077d257304e39b467777cc71032ebe2020c6a8a34fb100f28fe7e2727177743d7dc7060639b802b910389910a5b5815e0b765a5403a70c5a1908439554228a187284ab5b2a813b0be3248b899ad67c3c06d6b47e64d72e93c9d832f398a58916d536b58a6921004122024122d625f6a3145486e2f68bd0b00d27e1168da13d2fa7a55215319a79ccc6c871471813c6c4d07a7acc8129912d0410600f4fe61582af11f3b62d82dd48a3a521eaa9f11c7da5f57b79c1914302640f587e41c3427ba261a1edbc7034159df37951e3ec3e1734441b4eb945a67db99b17b561b89637036917e6d03d679743c360b2c398d97d2e63e0e24b28ffcb9e0f2e9fcba94a69bb9e53ce693b0956296de792d2a9c83735a9610e39c4b09caca4f3419d0244eb890cfc8dd412df4d421c70883a462c36f06f0ce1db88140b5b60811a4ee0849c28a40881164fc8820c2cb480491540b01297e082296050a10434844186e805188210059d27b8e084134610e08a2e9f00bc433c5fb40200be0d22efd37a4a028e68532f2f9d6a3993ba6d29bfe37f2e2ff2bf7d5a655d45d144ca0a5e4d04410dad264213ace8c2942f9610834deb45ef6f4ad27ae27f0873a48210824ef085133650a25343032dcce8714206933028e102cc3545ca3e96b59452ca9658166dcc00faa650e534a35331a853318af141c14bb80f8c2938ab699aa669d97caf4c517ff9d2523b69e59f66c0e76e5af9a773175c7c918fa744f8b6a27c6a155935ae243478011339614c3972830ea8b044109a842149152d7e22c63fb23420861760b0822c48b9011216079eb0451a9650c51a8e3046082a0effc47f0db8a8aa5de4983ad5158d71c58a2d8e5d6c71332d3c110619b71fa60aa8742c97954d2d15a21908000000b314000028100c87c422b160341ac9baa41e14800c8ca242744e9a4ad32448518619430c31040000000044000466a83601a70d3d6506000c0ae3461a542549a18858748710b38362a4867b31bccbe7d17e2276f439f00f1fe3bbdc424272c3820a690040938a9f4069d4bba2b8f630551a9d55a102920cbd449915785fa9d413611ce5307a7dfc76a1c4c1ecd09cc093d2a24bd9ed0cf52515258fbcbd481cf30692660f6fbb4562d132b62f1ec491de1f24a91648e6cef2b678b89595d4f886e14cfcd027e43a30dd8f12f49a1f768476eb4ebdac4632aca2b8c1804076c1f0c60330215cb90974c3dabd06cb888de0a65ef155b813bad631d97ec14f74a3282a904dc08119bbe9573d680e15f149bb41ace06dac94a9b51ed42be8a36a304924f433823ba734d5bf84ef2566538c4acd1759257f672c4a9c915503ea0d10d9abbc3e0a6d71e847ee05988a4ca6073aa9f04f95efdcdc3007613b4642e212633ba21a29af81f5bcd2a4fa4d6dd022ba2c8a45ebc7a3354bb61da3df3cfcf306aa1e781396cb3adb09c4ea734c0887102061337bce36506759163c1233df426ec265acea1f52f8d2ed226b3844307b8cf7c8bca46cc7ff775136a4367d1a1435f59d37699a68e8513d11aba30322a16a9ab6dc1a10e79fba6652a7518f15da0c6880226d1ff870f1c808a502cf52c9d0df9fae0a85d93e2b4b86eed810e4a9baae99861883e51d7a10f68e117757a3993a6815da50637654406c15fab018b67a677f4623bb7cbcb591c8c9a54893587985c1a51cc010ef90020d1626a8a1723b1a4faea8deb15cda6355850258095735834fcf827778e118566ab745c602a0768982112c0baff7eb94d74db48f482b3f04b6d5bec5a9d3f6c9053ca461fb61a233aceb457e7367bf6316954b6bca7e73c6bd338dd7f3cf49ff3da36e3efbadf1c44ff9dd73ed238ec463d959d525499d95390e6bce8eba2154e79016ac6f7f371744019494b2ffd514777b21a99c96c8744cc960525061e2af45101dbb4d7708254d82015783bcde4e47cb07ec0b4f0dec8d00bf63d2a3b965fc7a581041339bec14f1af44b5f336852114b0d0255ab02edf0972f4b7b0e0429d755cdaae69d5318ed53e94bff310589084e70b666b0b58218c3159570688bb4b5fdbcdbab1edb67d8e02a953f7591e52942d6cf81e14ac2408585c330558f48ed6a8641a3ea37c0626f7ee617f68a3c3f5865019b343c9ad5a26065c167304a0b7a5f30e203e82e8396dc5d5be0d7d08fb1774ba390798e83de3edfa3297a16e2496c00aa90206c596287b3d9f9aa887b7948174a246a844b525ffa9e1cce683f25108eb2012c9a639262b0ccda007904822c593d314eeff50af8a4c942eb4769d81db4aee4c19e07aa2d7db1e4a9e24deb98269fc3c876d5bc891e6ee2e0328c8e6cfea049d26cd826c1bf99906aeff63f5ac2483ccf055f0478bc97256bb0b4f22b30693dd1960b8d0925905fac433bf5900879be97e3b204e7aa238c52d23adb60a02ef49834ca3e2abc904e8382da0e923ae4cbde276ffee59dd9f2282625ef2bb19fe22c82c1420ff6b70fcef622fce0713e2585bf6fa4fa539d5ec1a8db0e93d38a2fcc24b5c1d1c20348832eac2bcedcb3297aadc0db2357c32f625c242af3bae265f74e63568f93883be237c90236e7a124c476dfc093886a72916dce61c6367713717f3c89111115bd68e0c8e573b92950afb102b0a6987819032167a7ab569abe7ccdf10d97d038e56b7e674c6f8320179fb3f32969665db396284271ff5112a6cec0964df042413f67fe9edd6caaccc7b029af305f26b4e797dc7f84982310b78f4d3c9a57a3db2302a6d148ac49f0e72a94178722d9949961c16899ca6b99064121b1a9c2539df113c34cb6fc6b519b2b67836c5479b4b13ac387fb0f25c50f444143a0ecf0688b8c95abbecd172c53f75e4af4eb04d79a69ccdda89ab1ec595cb2c0259a911a3f34de4b46f420e7263512785d9eb3b934e6411432e948ca3ee81ea36a4c98b199700329e8674389869669b408fa9d16b02ac48ba49b57b5a225a5863dee589f0dc7ea21e3684fcdc0ed426d893725f1d51fc65818516343cdf929b6e807c6191d7aa12c5ec4e55527316718843a36563059ee84143704643656ab8e87570290412af6065c1801b16ed7660ffc0c8c17029ccd3114ba95ef975e0c390552aa04d8d32598330589859241b61cb577caaca6a9677cd787a39705f2c498df23ea252cbc4d43154349529d4e88ae52f94dca23690c805c1e33735117adf90576937447140e32006524065e4ae041e8815d41702bd550d4b0c997ba1199252fad67d41fbdc87a9075d0270a2ceae4e058de2306320d5f7eb03dbf883b6b9c02c33caf266f14b99497e21cdd60cb152048f08506cbff2672d99587e26e415aa4ec46df4110b59d00267fa3f2545becfd8a8f38248cb954d0c877e68c060a3ae2c28da795e32ca4686d3662e9a67f585828a607134cc1de397ea018a3b62b501b385ff0bc214814ef1e68e4b9979267083f77423cc6104c87f57e6eec78be5f0328a40d8776b2880ea3e81c9f07ab804ec1e06c8a24908fdfa8532249333083193961872e8ba00ae234d12e9c0b94526c5372821792463a265240ed63bdf61240eb121900ff9382e47f2d8123d242e41e8006d60d946709a40cb7bf32d04f544fc07f08f80b6f6599057642f3cbda5d946a131a479f9da61de19a583ffc2a5d733184b4ffbcda08396c3826bebf828cd632de674ae893cb0a9fbe2eda3b6563018be59fedb50508a8f0d5d93fe41f596d082baa9fd5bdf3f5e00930b80a9b09b915db99c3d674e35c2c7618144dbb70d9bb06516ab2b5eff2b73b803d1e86981f5777047d18a8605e24ccb64b931d701b6435adcad4dc897d06133d00234dea536c809d86919ca2ed8ab05f0470652e8c0ee1eba54b059ef20ed7b82713d20251d96bc00a1b62edecc630bc87a1c4db242320131fc4d99a4bdc2a2bc787b60ad8ebbd93a638c3b6ee3be3e713de70abfae5d6742a00844612c66e1b7bfd15ca2ed080dc9a9af669456aba8b7590ba647b7a68a028108373598d8aaf2988173bffb35a009e3ca09b81fd995ecb120a1b180a115c79d5236eed18603e1008e1a8890f2746a5a2a851b5bd68f3272f64a0d524765408e2855a53ab4757d52c1de6b5f3b80036909da80704e04db797392784463fb0a973076a0e99d73cabf846bb7681354e3cc14cc2e575314798b2e2b092f80ac593e03d044f06e817472b5d1611be863d495fe9e591edfbfec66e89fe188fe7d2bcdf710f6ccd9f3cab5ebef16502b558c76392811687a1e0574511bc3e999c0577248d07e592048dcb767eaf0ae3aa08f522db19b47bb04ec634b0e1336d147c25addd3a2a44754a790b4131d2735002b6ee9b2c75df3b9f351ddf9519138be5fdd109799151c9f5792c0347ceac60c9232cc17f7068b5714d0a3e0a12a5faa3e913d90195d2549a02a415ff0570b4e892eed0312061520b1bcd70e3366d8118019422fb0cc900a06b6d66e3ef741bed683acb49ae94da35a6f7d2378ca04745035dfd70a98e691e914522c82b0b4f5a44d768accbdd83ac47bd092c8690a0150a957197a61858b2485eb34343ff827256d89de74a9fd78cd1a8f7c79e6563878cca7a4801820859591927a2509bf93528ab4e5a24df7019330441f0a4faed50130190a9a920302c2ca754b4dd27ef59c4dac04f91956320872a196fca579f87e718ca00cf11f97131c301d5796a807d4eb26b41eff316edea6b4676d0a131d4f0faebb932a91d514e0885d17171bb0453fdbbd0e4630678d456822fc1c2a38634d39a4cefac90a9a686eef9420ad00ad7397ffc20c71d00f49e62710663aed411836a2379883ce8056c2045f4ce70581319d48ffd37608c5ca84403c9b1d7ec6d4876790f4b6b543c2650cec1204489d8ce4d289ab58e54455a8e37cc41f0af08042ef92e81107c7cb77c759dbca5bde6771fca69605f6fe2a3b51ef8bc010254f681454e41d3e42867664685c096e78793c1763dbb39ddd0c24fe236c8b4787eec34855eeae44e933dced7fe2cf632a5b1bb8a22ffd4f4e90c798a218b5f09d78c7fd5724f8df81298f0fa08eb87e9513ac824d3416bbb20acd990ce4a5458caf9c3405f45b8ba892891c97e7112c1060109c9e40f458e2058a72c5a0993c0584cc5c0d8562035adbf1668cd50a75d442d4262b6c4f45651d662167c6262a7d2596fd9a4b3feb421a6e5ff36315dfabce1a77b13459b9eacf1a13eea5948a4f584501e358847fde007eb8ac41eb8412acc3f01f53abc53c939fd0d41987c4da6c9d26247f94ec9000959bf4e6e1a2520e81baccc055b97c9ae219641b074ed0b80ea24e775b384954256959e240bb24329e1920403cbf4f22034302b1b2f02ace2d98506de172b88decfa6ed5427d8a20e51e4af5e8f4f719e72b0314733cb9a5c694f316b060d0f85403e12043ae97b94dde49077041f16a8d39da8322588dfe225d82a751ad3e98248825cd8e8700897a7d71e8a8391a0acf1c241b924f61b6acc9b4ead9135fbd6432eee14534d32c6d45c9c8f55b5165f7a50503e7905f5fabeaa37622020b8cf3541b45e810ddba0f990d4c27a2fe1d53f680574188f6980e93805d7b36e626e2aa2d8d5ec7c39d9ed279e54bbcd945af63d36780ce470bcc21052a2cc67d2ebac377be15486de6cc43a1a46b9b4e79a2006e4e44fc495da78a0e13867c3e1c1d921ec13bae2b39d832f92269255436ab1bf1c5541cac03bda0fd222a7c125636bd0d4c81f854c7ffe9bd118571fedbce7769c73487ec3453e13ab3c79938dd9d18254d84033f0824293e8c3ee86be44ab57dc5cca65816f2217520b4aa644d9d095e9ab6181fcaa1fff81a37a294c3f807ff8189e06ca604f243a1292d5f4514fc4b141d35a79c1354ff3c83830309a896bfff4c391d03e9513af651ab47ab203b7a7c946a520654733e51a81079036d4f39bac0a79c761efd1bc7e57bf4072ef4ced7a0efd0bd004a1adeabcbcb961f929174acb34a2506df054f72745ec69542a4acf28b8d6a6ac2fd87995fc4e2598330df058f4d69aa0e77b5161535bef4161587ddcda87c672d4915ce24522bd39d1d1f9b752499d1665dc952d9330952002f6d3d12ec5b34aa6e624656dceb81b01a369948cbe8515d3827317de69ad74661a421aa37f62422a2c6f3ab8ee62f899ec417b3956beb3e65962d4566d16b9d559073130a467236f779cb584b9ec608b663c84a1f3d8b693b9b078a83c962996302d767fa6f792f9aca99cae5ae039e1ff68f11119d7f7b0b5405e12c53b4501dfe7646b717ab80b96bb11bbe641da564dfd2e04867b2f3d2e0d63339c334983efa3c0fcdec71384e7e6eae3cd18da4f104dae57a75bf4df0ea84816efddbe08c64200f6caaca21d84e2941ac76b1017a5eaa1c9a2b40acfeeb4ca58f956aef6ecda3e3a53979a92dcb937c8d77eaed26655be3854b76fc04e27cf77a6b5e3e0ee6df3a11342b7a9637a7b9cf6488012ddba8c19f8896e7ac9e6bb4de857e9808890a94c47e17eb3c5e794f19f8de0411acbccf66c439946f827ef76dfa96b047482f05d31e4b3649b112ba4c6d2756dbc141aa767750cc84eb98739557637b4d76bce6d773ddf02fd25b7625b957eda0fc55d6472cc3694f6f2a2e98817fb1efdd9b842c44da2608596818302ca62388409ab8f0135c12f0756e30e11852754970b3d1c3e0adc143b855aaa431568e50ddc88e757905d7ec8887c87a8bbbd80fd0671c94154d18f180aa71ebd180181e336a8f6fca0962b56c55c50ce0410e318fe26372c5743eac6814548682281f5b37fa540397574fb0f33475760a0e805c8d16ad863e0b677fd99f455cb565caf58412cdf72b6f1f9f821a8c7b9fbaf2993db7f8d5c56900a85ee5e6238b9238f287e29821e1d9ff8a64ff1bc7b8c7afc34d564f1e07f4aa5737f0cab1c5738f8843542bd8d4486385aeae0f24569a0ae65f7d739e996e603878e8314ca587a50e613513192e90c57e9f528965bb5a53fc375386e10b49bc9b0bdf908ab6d788d63398aaddda80eb89479589c2645cad19b7212ec5abeb1a315b71684afc04f06dc711f89d35a1b3b67aba47fa8faf00650063ba391ca83e25a088db15caadca8922c774ab02b6328ec54da28c9ecbea6574ae030b5aedc4ca0d761269953f7b831ceff72c17b41349b936978ef8ec51352685d786330e0a5c2b7403d825681cc7b05c63b062e0530f22268a49b90c402007eee3e95cc68f6c9a096e3952cc068831e09e975070284c850511edec99891320a1774611b34e2e1477481d3d86af1aa9c338cc91d6b100f7f790a2f6744029ab2bd6d98e6688c64ca209a34ea528e85fc6952573171a3bc24f33cea8dc62042b2614833be430479eac2a29e715dc835d6d651106e70ddd399406d1d54a2063355481f0beca60e06f9f7a4e19585bd056f984f72c4b68232d36874b0b64f78a625e910cd17e5261319d3c753fff1bc0951dc763bf149b5bed6e6131fa5543250b202cbdd11c1506c74a6af684a8d92659586aa9b440ea346cc336edbdd883ddf0ce0d58412f03d2fbd0938a5aa814d056787cf80435742d598863ed851d615ded12a5f152fdb8387bcf7682d4a156aab8d80438ba7405e014e353878ce7fba51cc23d1a10854a9537d20b7a9b3c8a91e6b11b8ffeba2fdb9198c25378f0e947a5010941fe7470310842f30cbf4712f2138a27c93146a06b4cea08f186bf8ecb4ef077965bca2d0a862fd08355bef642cc886de405ff0bdd9b0d2d5f426dae83eac967f1e775a2618370b4b8c3c8d5ee79d06c2d0b268ef642b91bd828c4a926b81e7f5d58cdecf37c2b707d5f0ed9c8b051931a2dbc60379eff5f2f47af9c9d1ba5722437a5833edc9f0d46de96eca11da5b4c8f6efe78432de0b55508660d357ae34d9c631db9bbfdaeb2fa85a5bc57b376db5ed540160db8c3a80fc33fbf6ca7f6ff5123ee0acc3a78b69a3f062410c3c631bbd505cb66b4cfe98ebf3b34fb80ecb5f7374ff06e17c3f444f15ffcf7150b4cb0e5b2003ac3b308ea6c5a0e0bc2f5d0068eb701fcab634d91760686f7d67a75d28ca476d0bbfa1fa4d26a66012a3e08bc3697b56650a3594923b7538d102982f1113aadabc3908187bfa6c7d5a0ee4a652eb95a42ebfe0465168390d5dc2e41976eecdc91849ec42d601e41843a571d2cee4def2e748d3417cacb1f4766d30b067d5ab310c429ddf8f1207c6b9099350bba044e9da2b7f71fabeafb70e5375a94f020c17aebcd90d4e07195fc718c5532d6d9ee183026897d6b2a52cd64fa354d87b2e6f966c90abc36cdb7407c6bfeccf84b8ad61bbb08483c2fe6a37757ad87030d39b078d02d99eab35635745e8a443b35635a5ad951e47e4926421dd813b2ab1b520628f4ed6bcc66651599607a70b78cb1f33341bc6b3f98e4f447664f3e0efdb6b60d110e1b1141c277ff5f15d5308bb71e5d40d3fa647ca7b6a85260356ee31b26a041ae653156f0803eaf5ccfa9e6adf0fa7ad30b6b193dd265ba567984eeca94273338aba12c4d367590381bc15d381efc50cadbc1c0c31794ccb21a324d19398805f7631ec24818e17d60b8a813e44d01aff82dcc2f90bcb4c33b2183870241e08a59b59a392073a3f5ef68c8489d62c9d912b6ff44d2a00500928d644e9522f0bed88bad0ce00e687238744ba3eeb7ec0a7aa6d56d8b5fe1cbb343ef335d883adc925e13e357145a7db1059021a91ae0355d3d1507a11f3ba61027b4adf5ff863c2e44d06066809150eda07911d91c2e6931241e5b265c31c2eecd7f076f525718f58c7afcdd2056645fd63ad913a7e5ca5ab55cba068e236be62923a22b6a98840c7ab84e0d6285cb03ee7876dad64a1e7e510c0e854224811db8ba3644319bd70fdb1763c10dac73171d15732d5f53e324ba60894be50c9e70d089f7df9ad08070cd498f1d6e2d09ac84c952273157072e474ac4a5d927d5e3edb67f60cbf61a97cde58ec309e645218b8414562abe1a4129e2a4fb149540317e92c63fade0c45ea2c60beae40107645dbdebd93e275ee7695510d4a2dd6f190a80035081565c1b54139447a773abe7b2a8328c05cd10a2f01726d7eb937c7d0dad4f812cf7a81d653c666bafd39d8660e9472c8f108f0e29296c6b9a36454e9812f403d1d8c0faff1a493d30144a3902949fb0c469250b8c3b0b1c61af0b52a7da782f29be478613d4dacc80570ed0c3d03d8b8829b7dfa86d85fccd0e1d1af648ed1e1bf940b9bfec5bc513e5b44e083bf3542a21e6c42eac110d5473a9b166822b3623186ebc1362f0130dceec3f1b8c54917cbb8d61592303b48fad4c6d01b43d42b3f29d8ae94e60b741f0875c4653c9ea56d6b6f02105e640b3fe67b12400f361c396ba8f61ade873f9e696fb85ef852b73e2940528c4183b8b51a065b44058611789eca4ef7583da908960e395aaf6bd040b3afdfdca4b055500ae7880dcb211dc6b0819354e5ab1648730dfc50ffd67679beb162e24e6bb82f4dc3b2e1512830ba33633c28820058cc667d7ab9a9cac4f02a1334f78ee7723289d0e35a35e6e14d1bb6c7cf303e26e6aa00ea85a7735796ac9ab946c9f25f0247bbc6f5652685cf2477f77023e772c0e390d70c54a3877fbe52d4a44c96daa19046e017ebe48351315a7546603a23378566c4c41350c0fad676ee4f577d81f5acff92ed1bba782d2701d043ab5a45b0018a94179eabc7ab205211b383f3dbe47d20f1dcee2c7e2e64f0685aa588cd3d33d8e95fac6599db1152f14c6ca54b3772989b893d85f1bcc7739e39452b15feec77ff1de11704f6d63d847931e9440c1a3acf22e4a5ec0c00615e473d5557de2b9b4aa8ebefab938041825583756bd0e41a5d7c55c9ca8b18b7877507e9011fd088b7d792f033a8744501ad3e220a995aa215b8b7d99d918dbc506ea8ddcb175af0d496a2cc25a0d8696e521282500e58b1f6d32c216fb225593abc89510f0fa49bad2fadda94d83ba280f6d8f40dfab71bee047d1fee44e41cda7ad0a8a0dc3f342a1fab53d375bf170cc5b4064341a32a4ca9efed0bb726658048a02181b537a24e042ba6cd089e26bedc41f1853a4ca2dbbe572dd0bcfb4538162bf6ea0919512cfb7e6bcad1a2ce182cb86c214185a393a0e2c4cf36193b8b66ba7e854cf8ea7317a2dae92a949eae02e321504b4943007c9bd8308546a7572dbc2c35fa55058eb3573cc02d1de87ce1875de40f12a10212f5b4ff1e6aa93081374ce7a5dda6f34d69073e294e2c95a7732172f8b663294bc6947a525caa0858dc71b1db369ab657fae1fc5d6ec762f772fb2ed1330176f330d28f4eea813226adf33f6cc1d856665969e18e2ca440310fe0ecb866a07cf0f0aa022eaabce6d8a8a5dd1a3e105ec385dae135da76b4931e5ea9c16a6880073cddd2888d83a242e02e973b9796343f3c5368416afd1d8079500d5e0314d48d66cc5a11ba29014fac70783ab3fe46b02a14eb2c68b94d86b8b10d37714fc75939a690837b7c9b72d37c4c21afb7ee4d5439556e90d5236eebeb2e4722cbbb17cebe802812a91e870cf38220359530b75fa2414234f31d2f54346bb0f5e7c6c3f6a399744c48eb50a235cf5c6354cc6a1709ab88f49259919fd6a1249af4fe28a7e8544257092fd1714b2d32b9a578d20fe947e8ed139b0f2264d0c99a2e2b9afcc3f390cdcc8476a4dea3357315b403448454e101b0c2fe044edeb506eef0b5069627556650673b74b35bc6ebae616e7694e79534bd7f8d34c419d55f3d4c9be0157dd09090efb5238159a5a7431c054a369aaa47fc1da0bf63bbb45589541763184f52546b74c8621ca758cd495fa65ae13aa8eac13091d121b7715b855708eb42c1eb1fe0b7c6ca9bc0b8808319f3afc58ad1f26b9aca1f38095d9949dbd90a714e9c974e5550f6d135b0a86b7a1deb664da3181228d66c8b4663f2b9293d2f08236e230b06722a8b31001d7ed278d1a07e762e47afe31634dcba4d0a3a2155bd0c8a993d6dc3adde2e7e8a740610836e66a8d8e66226ca90e2633f5f46722a5762d2e48c1622f0f22a54d2783758dd1523fa09d5da1fc9f8ec265c04562772352444b5d72f575fad6413d2ccd59f35573506fa4d2122890c73cd8206420786c25da0264bc97780d8ad8418bb7d56d9064a99e3068aa1adbae4086afdd828c659ee0663cefc9d72ed2a2e3975d613a83f809114c04d8ea4c367698bf0f869b99f351d50c33fd5e71b37c943eed618a1eb4a7d31c83912dbfb93f4a446f6be490567ef5f77afe3418bbb50904465f75b362a51c966d089d0461ce294903b81018fefcecf8d1606e35a947305424d5404e4825dafdf6dab56850bb64d4431438638a4f7b4b00fe7d37a8e8e1f53121c0476e9e68088860ae3319b3c8885b77f68e6e091280f455e0537d43b8fc514340be2219bc8fad94a2ad79d1dc45f3c04273e6e722645357c9cad8b3252b8918e5a34a0de048c6193c83389305cee1f53ba42aec8649bc9d304736008af8754fb3bba4872425e92f599dd0d61f4c84e48911be5b76e47d7dd093746c532f4cbe2e71f8c460c660af2d5dd12fc86fec7666b08028c98ba9e223f3906cf63b7aa5224899ffb0a0b870c672670b62a34cf1bb57d0e4e3198f002fe3bae722e02c8c45c38d96e7dc6c2b37f52a765a070539ee5e159c883954d8e3ab4601ec608c2240e97eb3f556d3a59c10bd0d665f60b327bcd15cc5c53d041a73c392aefa98b6e6e299d62c45123becd6d97f91a63c114e7ff93e41250af6cec86d54c7ccf1272d63e9656e7b49eac7e62714255e8988860244acca2b338a95cd1c4c0c07a1581d890d6fb9db1968f7db271ad7771dc3f563eeb5260d78758fe2faeecddb57df49481f9d84d3fc4f81f18ae1d075367c59da4a41aef758123153f1ed1d72043c7204d213a0a8d29a0cfe91aab56e18e024599ab31a297674f64f3a9e02341ca45e142441428a578637b5a226cd441a9ca24b06dbcabc7246308ffd1745eac9115a505337a9627397c015fcbac54865f05fb59188c48f3e5f32cc0614862da8000986d90c26190b3ecb872c76c272c2a578ed82129b67f430013504d73cc6a360d3799954bfee9f555d020a3e1b9afef21992ddad5a5a9ef6077428d748476c51baef3140f665089c4f92332e2b478c968b69838e82a6300002dc8e82012d2c8b7a48a7b209e4b98c260eaeedc8ecdbe439ad83af12977259c04613efaaad9eff110e7ade9d217b28bb141c66d98d4d95d68db6cb5cac4d912864fc3be9c26480bb2cc2742ed04591e366dc5c82cd6111225ba68352c64223e16e88c66513e541bcce970c0ac81f167d2061b1e930b247e49832f44096dedf7e451f33772abea53f1e1718d7b0b7a2d7c92eca8013c79c90fcabffc9e15b465d83fca4d2a955f34c905519902a8fc6c40db5f8120a7ca5f3774ee50625e0a0a02923cc03a2110b00ea80f831e97f706a4ff53eb4a0c3c380957a0cebf8163a9916ba1f67314ce6a28920bdcabae10b104276d18a58ece46fdb1596061f44903f4482400c4c60e60f469ca727e330f4bb8b015abeb93e7f176d3bc84b26bb25b3ce415c22c4a8028926f4800bb4956aa3ea2d3d98c2e04ddc29050ebffe0796c8cf226006252804f2bcf97b388aaecc307e344229fee4e789ea10f245c51811bde15bd7fdb8773459379297343d58fa21770550b26de71c791d4eea64c0548c9fc30d581f334695365b02c3d3e0a56570581bd27092fb334597b26c3d6fa463fe99ce1e445c51d2a064f8a43a113fc87e7c5e2b80a5ebd60bf4c2e7b210d8757812770ac0fe57a76ba09a805e93ecfbe48cb5c08aa6808a2088a43992c46cf6f122d00a51453b85d7bb86ab1db2cc7f29c35926d2d115fc098695fc21ddf7e105a87a08c042a0b8a34d861d0b091174b5b33e8f5484211df021616a3d80d554399b483ebb90c23680e1d9da1c059a025539521716c15b1649d7d052197ff050574f93d1d6f3cc7c6d0b0331434864acda1a36187a28df1587257169661202460d31627b58a65020537154dff10ed2d241997e0d2b9d420b0f78a47ee654a396073433e106f776882b02ac0e008719db74b4edf31971590dcbf406badc5f64ac04db2a76166e94ccb4da008aaa12ef439be905d18c7cf439e9c672b962b2160910d4b823c0490e28b9418be5f041c0d3e1c6d850083d464f233107f4f66060aee6da563d6f66e55754bc0243787d5a5a8673b40b3055f3b4dc022e09db0a4abfdb81328b9e457f79d7f68bf35b6c215d731d83823d5847f6a8dda5ed2151f36b9f2ba2cff7e4591757c7dcd26c90fe6041d072eb0caedf21d34590d875756f28a155c773ce15c6159ca664593685403a127b987a4aa6fa895cc2d4e082a0ba036bd641c5ee145a3d4d0abbe54fd4646af5f0fb30608e8d8bc15d1ce93a7f933358884861a94b55de432ed3e883a7ab9a19cbc14ab512224010d1ef19d54c00d3d8f4d2fc9bd55dfdfd2d06be0662f46c86aae5e6892c3ae468374178d263a5daa345b396aa6eae116331c129047eebade2e6b12a3318cd1c884d7b3913799b99851c35ba39b6f86d653a8a0ec3eed3445acf6dab304a7915268ba6b663437f2e2e4c5eeaee12cd7bc9aeaec3ac9ef42db3bc3649c369f0a018eb0d28460df0123267addc7304546ba4d4d5ec2aaa8e0c0e13fc237dd96848e48345f3898b130fa2c63046e2bd27358c761ba80800ea9eeaa2a25803c39a0081e864dfe617daf9b16a9a02a0245e8da54555f569a1e07248ca537d387269e206a159018330de5278423d46a0be5e3f6e743d275ca181e5722c33c7708e567936ddaff1533a0960aa801d7443035455a7200930b2c9cdd59f6d2c414e00a5027a642902bcc679c51fc206787ae4d9b8ccd523d4c7c9e823ade1418bdca37f8496f18bad89ee33f8531ce53fcff481ca615e7b220506b39aa248f158175d313ce7b1d17a412ba4b2d26a5d360a07f023a030be405e258cf528bbb3a04c76fc8c5bb5d76fcbab1e2af809bd608272f68508d69bf2e71db5ea9dde3e1c54cb17501882640a53f7d822490229b33014fb39e47c5639ff5e930d3735aac46534b00458b8d08d0ea13617582429f056b9a70ebed61c36321cd4eaa248a6dc763611fa36e4b503eae1e301357fce21da51826f958b92736ece7492e0bde98b7a47ed9e855a9bb26234cfc6193a183a8fadbf2ba3b3aff77c198bb3e716ef1fb14a1e066ec120bfebbe60ffcbe7b2b83a53e59017c08c43c9f3e88f7562a2126a674ece39731278523ecaee6c537d2e8362e4ca5cb73e80e3e5d873eca731906f8d81b9d17482127481eef0203964bfa8adcdf0edb4ea98c0b80f85fb9131c3b4a82b14ca4c2b661e215c68c78b04ca123e28b942d72435416f8a75493e2687434fcd3e9b3983ad431a4a447b869c1b4e71b9740a5ef2c74a50e27f86c9483f4068811558d174bc58a96a836d7650d913f1b68a9666a81e171dde1fc4f56ddae2ff655a484ee064ba41a078a766026ff6573f8b354226b8fd5fbf2df7027d305441aa239a34cb538807a0cd883a5bffe076dc895c4183a3b5ba4f7093983ccfc7440461ee81740e44ded4948ce186b3de3372200974b16ac8cb22b97d02e3fb6457dccfddc91bce965aa992ccbefcc1147f0c447e026ba6f77bee2e994ed4bacbd69fed5c0b0a89a662da0ebb657de4e5a9ee0a85a3beb7905b48c5e6b587c4d11312c22546a87c1b007b4208ac60191f82330903b74cad24d88e65280b6136516aa979f7a46a1a88730f231999d6514d06947e165281ce66163b891aa6ed2025ad86eed632399c14f2a2c51043908e6e28a89727952afb6013975233672edd7729983ff00ebb2134a981822ad128d4e7761866fdc363d2188a6158280611f815525984ba2fccb882215399442dac263aabb1898fdd558c765aee97152f0701f928cd67c257e830026e10de7de9f20603cfced9fb6ac74406c9021d61708c48946baada3497a74df3483b616505e2cc8b284f96f4bfb973ac041f993aa59e587984e11115fdbed1ad58e7130ec10278ea89ab4cdf75c9c2482ca2b32926419556b832ed759429c74574969f3e1b830aa8b5d92df82ce75abdb4b49d939dec194b4758843f7eaea44afc9e30b9811e9849668de485e1f602cb1275a3042af70b0d75b92c4282225dc399892a42613ac63139f4948eb890027ca1b21cd4a9444a86296d0f3ed1c2e85ccace349f068faf3a4dc32eb36a78869e3f32d127a0ef00d27c2afcf0b50618f99a4f5b17dcf840382701b7fe2034db4cf3058f8a8042e42aeba3e748d58042a934e46394e2b166e7e1d40d25604e98e4c7f4fc6726d7e119d1fb4310aef24c4fa39a55d9aa40c5dd59597209ebfd26ae85a2fe8802d789b9b27c04dc40d59936965518899066d88b00834d1768b1a6a367a1ca6abffd3567ee2fb01dfee7d2e5d182803138bdb0894632bd16c7099f69b78ac8e3ccd5f2174280790f9ac8c2bb9818a129c923033c75c8b1184f31aac0050f315856899a707816e1442b1613464f43e3855ee7c11aa812b83cebd54c31c7e3b69f654883d280b62c147dc5a78c91caece30caa8fbb8d6f774e599030c75c507cb41f282a8af1b4249799e179e10fe8f5d24122d4848f1d8598b9bc3a23e5f68b944419e84d6365248d478c541bfe42e319f7d151c8e0d0bbd58e5464eb33bfee236d23af3d34b8e64b4e0896be5616cb6d7d8b3d27c669cb6b18da8e546d296d9ca54c00a329eb20fa73c0f0eddbbff361e09f24db62e29659c2c8797c239645dfaf8492c485da944446741a2aa51a0c274c244a2c2643246ddec6d1a0425bf7f226d2bdd578e6bee090e2b6e812187a0e4517335aa6f3d16c3c3f2a8730aa0a945bb35d886916ffbbbb1dde092df8871ed0bb2e24419b42b10594a6ff1c2c4ed9507eee325b4a08e00c150f80fa7d6e747682f1b6c4cd126aa7afef7b6e790117acb9b11b6bc878b6ce6f56a946ca86f01e28bc33bfb31cc3633543ac73a6ecbd18d35eb25965f8fae9a4d3869c16b75a385dca8ccbac3ce0e4e400e5f9a6562f578e5cc8f7856ca9b6489cc21e11f9a76930ee45945b5808b2389c48bf2196a26e122596c648cd37ee6388201e2fef52e01fc6b34d67801ef05148ca27897ff068b9bd28ad3633c03e2083e41d304eb6848d820cdf4aec0fe41c7da26973315724168bc03faf4e613dbd9e9b4d9013127634a58d91b14a6db2c8933c9943a2dc2152584a0900a805028333c4c810fc8080d56942a4e89a72a5a29f4c5836ed0a49bc7d3bcc91a86bd478c5798c20aa3f2d5f38404c4348a8a9598a8ce7900c0447f006b47a45e3c8a9042fbc540d081cb4d33613ce01cd9628a80b0aeaf03843d1e9507b3f2e54a06f610cb96c2e2141444e20e926d59835c8953b0d72b5c847239319ba997c11e07d4d1d83a7f2e18af7bbff40e06d410432d4609ea5117d57aa0950df7a63e047b23408518ec3a7962ee9151d24f3702e3a73a90ea5236c28c7bee2f8c34be559314de207ab58e9d0321caba443e262bfc4d3d4b62442a5ca871860e9314a9fd684192cfeb4c9b00212990d58bae4034d48792103e58d5b9c5b839f57f56020ca6bfc8a7876212d47232b3539920df2510f984ee60ff7a2dbaede0b0d7f217d42567a6231091e84f224c0660b4e92c83def48d64ba9c68827c54017905f924eee0a4517fb370090735678abeadf4ad279f0b2e267e4c73a6c940225f542ee46badd9f9e280409ac7a99620e4ecefc39c9b4e010816f57392b03880032ed3e004f9f698512dd84ffeae42eee452cfa673b3567a5c7218198c0397cd0b29fe398c81b81ee334e0643036d22e32c5c37f3498c7dc28b32279680cd0b38f93198cabf5e8782b9981c0eb8e28e65e2ce0d82549417226e3c6a9067116be62baf4bc16e14ee041cd9da9f8e59d85a85027c333924d01e5572702f57646ccf39a43541e16c9e050cfe2da064b282acc9563c030b1330ee20d863b43a43f2f1e680e053e74faee895d08dac6d6deed50506d67eded29d81a67a7b91a6721ac087411a8862c11c7c68c2f1de641e9cbb0a015c30dbfdc3c7280fd71517f1c727a2fc8db0203a2d002f4835195f2391a198cc689f14488132522774fdfed4b45f9ead7e090d2b1c88651b4be073ec0a21d9bc2dc9f32cf085059b6422be61be9de7bba30c9897e1fe265b3f51e48966040fe4351b809c1371ac675b20e951b5458a0c34e583a851df03fce85105c825ef6fe95213cd0cb6201f4899df542edf6ef616f16ebbbeb7dfffa4508f9ca8ea94ad433e894e9d45b65d53c239ccd95e16dd27501468ad96f406850607cc494a24d7d0d9d67d55be013d2768bf4a8d07e702c43932c79db2a18215f45fd53045555896c754cedde9825fddb670c5369d6ef2cb8714e9eebdd4c4455f2d8c6c2d8ddb01458e399adaecc56bc90b2f25e91c8b5c25fb6341128d535f2bda38f4a00b1d9d2bd535fab059898c091c1bd3a23b814002a3aff7c8eb2d0483662c75e96e26c907662ad7edd6509089fe8f4d1b88091320a9c666751215b0525dfb89db2343dfcbfa6503b37572e4431cab9b0fc256b222550b7e02f499706312b6b7b7e8b4effcc93943f7d6ac518f63c773295d8932ce793ae63acbf5a2323df434bd55bdbeb80caf4ad092e75a536f48e47f614c4f221dae2fa8b64c2078f9bbe9812b5dfc26c203ef1ae3f4309279ebf2010adc8a06bc93d6e78d8ed509c2badc662dbda4db4c8d7ec0a16707f856db512c247f079d21b910bcfd4ee89ec9e0ea5aa6868c04efc9f92faa5155c6047fcf147dae7211564b027cf45f236682b27397358dc999845144cde821baf4c253809d01ba91a5f5a772702f8526ba0ff2c8a0010e76e04e9b8c7d78bd1c010234de48fb649115c93a15d935cc0f01978641046b482561ddd7b17a50ea8a4800cb1aad7d25cfc346ca0b161a7a7b6070f6583d0b942b575803ba77d3975fa7ecb9bf3d5a23fccd9d6c490cda072650a677be23cef9b91fa5ce3be9321cc005c5eae726881328d25c2d94804aeee8308b53dca848b23e0e45cf5fe13094b8f76043773cb79d95971d4baa2fd9223a124e2f154bee9b24aa8d9862fb86048849fc7397084cc0499f90bc98608a1f26ffc0524077a24424a54184f0240f50214cbc5cd226f205fbf9485a4b3bed3e59c036f26e498ce342d6534ce1c4989f6a80b88a49c0d231827882574e418513e033c833e57bd8c764902df6fe2b7a61529607d79defd156ff6ccbc6d991491aa496776de7b47e07af0fe41a694a88e2024613f9ad3ad87359acca53c2fba2ab56a68be94f4ffaa247acf466f88bc93d4670ad4f7572bebf1d2248aed4acab72687cb7ab8c002bb40789da360585ea694e50d54be20bf5ecb791daeeb580438a8318b97c52ada69924b7fb72b47b30e377c430c83c79b245cc60a45b5cb3b18e4fc74ad353f4c8ce9225d9342b72dc8e8ea2cb6aa2346d358303c52adbb6fc531439ad3a3d38722ceb4d712da65b9edc1982fdfa2bdf539a0b22ae31dd1a8237e6677fe40f33336f242b3ee3f63437f43ecc6385b61f5503eeaed9e8467dcedf83882c4693ac8530e5eee12cee93052d405b11c5b53018650ccc6d35b11185449c3d46673dfac9325f048ac7d3548bc990c9a3b403e6fd99532921963aba736e376e440a25daceed8365e8dcbddb0b99f036666c48018ea9572ef62cd5818ca46229c914b02c2ab96895382ce1cb0d6711936de10ab9d73b5af638a26dfd75e33dfab285e1f0caf2c788ba22c2699e6e63ec54a14ae1ec2284ed3a898aab9f12053fcb5c44a11493574673f19bf5a97008094c86abc8c4a8f3e33c80d4bdfd5ea4fe98e8069d79c48b5940c864584dfb6721a7584d2008ae2e46bec511f917aa53cf38692ef711cce6cbb6aa6e4b7c82d441efa5672d0ca4b61b6c9974db4d44b498921ff8302f7e7c9b868c18588ae7a4962b015e0f9b97ec231f75ce6b8d77efa4f49e457e211918eca1a2d08d894f8aa370ed93cc78372b27fc556f1e9a5a4f21ac79f24e8e25fa696fb398ac984054da6bf5f960b9733d424bbc1bfdc6f5c2354cd7d060609c32555e4e8731ce81e9d4a4a2fdec5251f002845864582e33f287170992d73ca6a42798144a46c634b3896cf81dd33aebb464cbb98cc889aca04bb60527357b5978b8541e358faca91e1e11c0d651087b92b7c52ad85f3360e1deb0bdae32e970b46ced35c1bfa6b4eec49bbd43504cf0d08e58c550070e5f56a81e831787d1f4f88210b4831e4e5efaa65b38b9fc3eaac0c308efcc8c87575da31968689e5f56a4c570d5f227ebefed0da9a941eb426d550a68900f04a0531c5b60202af2d618fe35e4e9fd8353d5ac9168fbfa74c25d2002586dd8c9540656800cd8f22fb2504efd40ed6ca2260c745bf94e9c1692bc418ad9e1cd3b1697c3a3cc0d192ed4972b0f929c7dbe22a91b9d55860f7553e91066b5c8e60eeece097b169546ff1d38660c513f7181858d62fcdc2bc03733aef42c5eb06a726a2b0713f8a2365d14003d4207a511929472bbae006e882c240595ad005654007d406cbd0420f98c1ba50315a060d5a400db683c29072b4d102254d69d52bf1490238146d5e1bd3f224bf34e08d8a207ed75eeb3a0095bb4c6844ad310c907432d08ea403dc0d005afc5d66d48c53905717e2375052b292604e15c0cbb68d3ece8e894f9f2833a68fd0ccb584f186993e0a83d9dd8e962f770d8a0a5a4485d2b2bba4d92969975f411fabb6f8fd4522b288d5676abcdeb1505fb232553ea0d032a522c7629588c82d5abc544fe404366bb14d4da003f08c82c57a72145fa142bb4821841bf5029dcac46d6b210610a083567fccc031273a3d2bbed599850a2e59d158fda6b4fafd641d1d8a6e65d8f0f314ad88a70b546a4b226b57cb8a4e1be49bb350b31ba4d1d7d3157aa408a38e9294d90f6a7dccff685831bda06d87663b4a65ac6c9038dd2542a89dac4472a6c6ac16aa1eea9d78400d4d555a06a61a05f0ca6bd7ced77b52db85bf8912b582c5a773d5508ab641e3dc6682e554174cb6d1df60044d0ca0fe516bd6d08bf34c323560e51f392f06481bc626c0f4456e962602980406d18908b0f3f902597557b4891560a72c37b87eb2c02d325cc2ed0dc5aa9f03aaaa8b0a77340ceb1e59df8ecbef8be3df4681220fa8977a2d46c4f460a098000fbe8f6aee283f350be1cd3f2a3e0a875c6f045d3d8c8becf3a8008cc4eb451060874bddd98b1d6580762be0a38cef9dba84d5d3523c3db3eae3a2c853b7e7349e3d8175577773199c6a4a40509e30b062d84a21044e215c42fedb33f4cf0cbccd97b38bcca6047706fcc4babb57d157906c22f495d0b3a7386d79c70cddc146ae0bce5f9026da74630bba7874319b56c44799262ee708638905276d7be1842a679a84100c029c983fe88474c736cefa8d7d0bd0c55c1aa505e8d4493baa77344600851bdbea4c752cb6776b09091bba0bd72884b662fdf0be29514121870a7262ecc26b289326c6946cd0e0b0ed1f3f6074f0fa23efe854a5cf4fb842b5e0cbef4238b388519ba2675c49e75a0452bb743011bb719ba190e4f2bebb41d940348213d9fcfc439f53b673fc3edd2746ae6081d27bfa7ae0f66b5266935fba4be524f8b5a60b6b49db1d3baf2e2b74d5d71ff9b56dcdaf22417f8082c7245a2ed229584069bd9aa4f20b564cd465ad65a17a757d0acf79eb5f40cc7444b709f887769327fb64d8db89095bfcabcecbc622050f9dd5ac0dd3768a65f4d0ddee290740dc7e15145a98c652ec0811f549489fc147b4a36e7feb532b25e1f628e6cdc4717be8e1ffe452e8b81c84bb86b359ef05c879a0c471942c956fbe898d8f587abc049689f9d604f2a3231e8fcd96a59a541b14eff8277cb124c7490bf379dba22aa269b571dd2c8f20f1cd3297d5a66715a11d0a2cec91c1ab83538c818d9f204654347135cc86330868602668da6cf5e7ad0bfd7a22cbb24c70deb2e9fb5c78d018b21226f6784061dc749c3574feb5e23a82506667754d6cc81f166848a60d0d8cf9158d5819285e8f9d6506f83e9f5fc313e27ade9a8f3c113e58d9dc74d689c24859b4d00235805e1406cad18e2eb8017aa03250962634c119d081b2d1f234d00262902ed48c9645831e500376a1328694d2652a8713c8bdce64501e484b56da3b09911978392845f0bc878accff70d526dce2faafda2e74463671024e918f8c224387583361210be54c1cee188bf331bbe5509e0b1cc5b0f247105dd640c9014b85a1f441a89ed805a5937a88fb43d5f3c73b4e05e987a4c58261a04fee35e9a6b3967935c85221275f91bb6daa69883599277d405ce2930c3d4c410199afde3eb1c3ab52ab8124250bd2c440018d3c21be0a3e1a75aa2b83833cd2234ce64cdfaddae80e7279c1776c9169b4c18fa9133fefd94296d8caab5992c378e2f60378428cafe158ea8e8ad1774ff475ea17d61dac08883ca17364503d170e9f8508e313aab4fde6fbf93513f71189b591c3208734699d407ccae4b5cfe1ab8d749d2bc2973f792e6b5914ade6fbf880057dba5729109e33093eeeb59b8872dc2b2328cdd6c7256dd2c7aabc881967b93f2deaf2371ef10e1d51631aa8b89cb47718f302d9c9d8af3094a4d040b3cc78d2cd1abcf03315137c9408f3dcedb8462f03ea8ad478fdaf588f9b9ef2def9277176db15d91631afff6c3e809a420cf85ff8a643a6a4a7f7d1eb9bec5893e5e90b378c2048e29304970061f54dfd2567de427c580ac1e9808940c653ca9929576b346aadc9cfc394bc868e510b679d921fb08f018bf4f99b7d968cf6dde47b814e2d78f0010762768280dc09128ad49ea2e0413a1b32886c1ccb89ee60ee82ee9688f760669300349c685c3ef8c1d423a99ff1dae38da5ba6211a03c27db30e290f5450ad122520e6ac57899ad5ffecc6463a794eee305ef8a22c61f3cf18132b4ad0806a9ee2c21dc08f00f065472be0a3d17ad8504c7861cc5009d4798b03028e220ec314abb3598a2731829c41a77307a8c842953af7b0e4682703d44acfb8d5ec8c6b939986b9ac3d89fd8c153921f73836fdd1a1050ab7a5e10cb215219a1246e33e7ed123cc302033405867e5af1fe02079bebe5e96c5141efd69d7c09a0e441703581e01e6f9414971b0b7c1f33fe302d8421dd7520c794d6eed4e6ee3adc55b758e61cf9b2688d8d4bc4021f466360e25cfac88bd9719d67824abf251aeac5aa71c10c7f0b4f0ca7171edcfd4842e027f70870bb3dbb1877eae3bff237f233074c749becdbf039d07e47f1d45150cf43588736703c8999a3fec3972ec7f6ad975d735822adeb7a51e70c3e4c9f84015047aaa322473d30e962b4a03da69c863c3079cf8bf90a3c530b094c0ace8f437f93b03ca62adad8f1c040956d378a03cda5241e22c63feefd2faa432eaa7269516520730060d18aad56b48d808a76e24ed11a50f4233da18ed6cb83e744510028c1a1307fae255de732f0ab8415dff6c19547e9e669e68035502217aaf31a6d3c71cc9accdb80c70b0877a32881c034498cc53c1f68c44410a36dd1b94178fbd08745d98dd5e5bc3915e969c42047dbaac404c35ae2c159c5919e15f4480d641716f212e3c524491329e51cf0a7582d1dc9f33ec4bd96745132f864ec920077b0062a138c2c9db58482327a4643ef3a71bc1b4c0cd076d2a24efe4dc9196478af25d71ef41428162a966d97e42e8d787e692c18328575b10e61cd38386c22b544e38644da50dbafd2697029580803f4bc27ef75c8cb46a1f02843635522b524fe34ddc4632b3ce5aac05dc7385888c4a07d3158b68c3804649b89732d6985ce142db48497a4ab4f5cfc58862db9e136d58405f91514a7aa9c48d415bb9189fd97f33d4061f3e653f6158133fd81425f49ee3b3f4d1a7634049986ff5ff55672a2565422fc1256729fb315e8ba4dbcb59203bc8dea75ab684533a234dc9f086c20252f687506bf98bd76349ababeade6c9c312b9a0d50c6c87fe4cccef75d14b7620acbf4c206f7a10706719cb122323f2b3edea8d391d067f0ce0ec9662052f49409c2305581e569382a0edc78200c546521dbd2f607a4352fbbdedf748a40b16404fbf2df00856ee12252e13871a37ebbf5c7d6e4aef0d5e30426e56a8e45f59c4ab11ba20845c00169a21ebe5ad0aeb0b7e8dc185a8993150439b30b8664e0c515f1336001176aa64411275c47c9bf12cd2a73f483f80b8e69602406df932e3254a711f1d0061ca770b5a438527e530a76e818d115a7208ad00fe4f1b4be404ac8a1f1c931129d627e265f03115aa226ba682b3d0ad8ffad986fbb19c66aeadee30f30838724be88cd42be77a8ff0c8d401d8b2b98313e4b8d7f6f062ab215b9d2e7975065e11e7deadb05f094d73ce8725f0ee56cbba691f45f5eb111a358572c43cce862eb515c75ed098b96eebd895acf05dc3b42c20636e108c009f903f2b7ea47d49d8c6ee237628c479de163f0326bb29559bf96cbe9d93a084c069bcffd49451cfe18ef758377a701dc66fd5a3b90735aaff55df887b2b03ab9f5713c8d215fa25f4d57a3c6a0658336c5cc40140504c826c420f4c1e90db4b2ca6ff7efd226bf5e9579802698b11307f3c0280eb8139ca2278f5ec86de14b1b23d9ca09ae9302422d477be279771e5d0b89609b4d297fbdd2d14ae2a387fb046208c643e222da906f7123a9382ab3da8bc15da924cb41e6bb9551d9bd8883bc5f0e16f2abc53990e0c6f8fc21a84faf8bdd4306c51d4690fb0c612813e0e624cdd267db68910d7cb74ca14ab6da2071b116544b182d37e5f37db1b3ceee450f5f23c4b568c589ab80668366bab5520d86d62c724f43695a21a2af30134f09be66ff80533b1716ce3168bc45656a595b98cc602b634bb68f7b6f885ff30751f79fbf19d5ae066c49394f0765a653c0ecfafd0e5e8c31fc528ad33225f0077c9530c15f54f52a538037c93a2300cb84e6b0429c70d158d7e66853f4791469b58bdcc80b7d2ed9e42806a4476f182f63a6a13e3dc065c44300acb86b94686e1827a9f594571b4b1c965fc7da83a8378107e0e2d0b3e0b1e02a1f945a800d1b7e64254f85259ac1044c27ce58a5cd43afdb8ba32c48c91a0a90ee50e06035561a183d8988c5e755c2ffd35100f3477e3129a79fc8349f9749441069d06c258b7310241556dfb6981eb9c1c8df991963d4275241c5dbde7598e161e8735f08a2608eaa265045b5cc95cf3484549211cef933cea6745a3b25163555c12858f58b155e318a341ba98fc52c6fb961754d055e9e4ff60668c40cd06d4c93774ae282859faf90630338059644f2b84723fa17b6d9e1769846d76a9b121c13726d5b6140e4fa4fd596031761afdd7cd2e681b0d427291a25b6963ffee345f369c6bc34ee851b1cfe85f04e49b0151c89a11c4eb7371cc4b1377a9a8f54c45b36de2c93fe73e785f0424389bc39a46936a5a3a8836433c014ccaa76730d5b2041cf958fe8adc47508ee951131a39203e86f443094fe14e001076f23b979fb1d5690a75f292ebf793e094a446c31eca3b5575caab006c39a91310f4b656be72288609be609aa56577911e1f20838f9a72ab4ea147d679159de73066ac94a8c42b6ce68256eb44413babee18391bb39a0987fd097f0f82a03765fdf6c84ca856f249bab887c4fad021e15194e567679751aab2283ac553c548f6edbd42780be09ce777be93fb5fb3b0fc3c13c855056a7201d457d03a30f3bf52427cde6e23792271e4c198ed0f5a3ddfcd4e02ac47cf222d66e6b3a49c61fb01107d06a5347daf60593f8ea4b8039870823250ad424e6b8cf5f44a01aa0927f1af6017d08c1373299b68d59d765e12d2783b45b1a3bf0c9459193dc350b3ea7d80400db3d0f5293885f10af46f63f2e30705efebd1e87da353a7ca2e7a1b4ad73170e94ad9fe437d7f34a271345a79eca73862d261af9556c3743b610fc330cc8a6f93000dcce628f826e073b9ed57e828ed800099900eef63733145a5dc22192ac47ccbd94a8e8d1619c5b003ae10eb21db0a68b314168312550c0fd0824f1a2bc427d00c621c570f60f3a81eee3fec2aa03c52a9176fc9cb4c6e3db882db1f957c1e46d7ddb80288159661b5d74cac191c78cb10027e13e6a77a4f78da049dea3e95087d78a80ab55329f47c47988de7bc7578b47538bb08bf89e83811960ffbc66638d7fb7a24e6d6b817c3d97309d57ee470968916b758517083e93763601a4fb633c0a0354202bfa0145c6cb953038ef242115103270425500676333f12ef0556af5c947bff087733e33528a6239ef68c12efc425c3741de0747fd40353063123420c5e81e66dccc212414c54a71862d2320bf3810a6389c173e3764078241168f0140a59531ab3e9b4f8d389c982e88290b3cfa1817c30460bbc18d4163ce123bcc801e85d241d046eb4a18a0016d44e38b1e0cee672dac9dd90ab93e0c76a59ec2c3826700a3db9b0d551939d8357448ebd11f17fa4d15f28cf56d9c4208ae85de96b6f4447d6e65451c009f094452338651117cce9ae0c0734141f7bd8ae86e9a40058c4900d05240d09e6547061af7b4764beed6c0745c103cdb8b30ce005838723483110902888f6e474374dba2721a5d8283005e3e20c922da3e6fb619ac86bbec0f3b5ecab23f5ebdf867c6bcba9d63675f49cde275062ab9425caecf99f3bfbdff203e7bd1778579aae223f7dba9314ebcaa220c8d21f8c0e65edc4621a0c5f694963f56ab05b56c1aed55cdc8797a1f0d8177478dc5dc96008636128ab5ac4e5fc915fa6187e764957bc8f0e88a572188cb84f4ac6c1625533c736558983d1c903184e7839d241fd7e8633516f93392da6bdff3d84b7882b16e8e6a20fce49487805919b1a12a407b0fa65671dbfb8572d31a78a491fbbd258f845f36545ee6c896041748d2da42e0aaf6c551efa51ffc47525b668824fde94b83fba79634ed65fc981b61619cb8d44c3e1c6f21925fdbd161e8fdcadd5acf013cb3daf7a540533f22b2606417349fba20cc54a4c8be1a5753bffdc125a3e4a12d1c0fae21687528710c1a32ee206e37d5a3a4e42be1bf7aac891ffa5c25b18a5a08927d32ea1f08a609d40325e8db3f51befa3dfb8800fb62dfebc19941d29d7dde449c971b2fee970b7d942dc84cb8321c32e8ce7571c0b04784faec6b60a1e1737cb238539b2bdb605c9e77dee63e6631f7179d65c2aa50079678b0c3ff2df4324dc0bb7a6912d21db40e314120fe02f02d0ee60c4347802517ac5c058e1e9afa91f2b32bf4dd4bf04aeaf37b831546c997de2e9d3be40c703220c03ead536143d4e036ae7111fad6f193b49081c328621afbc06e12437aa0ce07fa483eba77cc495aa2c3982d33dcb470c53f3d83111fc0f99e06111b088a17edcfc3a3094d340dae4b708218ca52fd9e8a51faa787f0a79dbf66e43d4d1e9a3c734317192c84ae84b5f82019ad787870ab2efbfc0d1a5010e95a639751bcfba290fd09eb5288c2224129009933f4f551c01041290b481e8151d8a14348aa8bb06f161de6ffdd4c78d0cc9c3ad86b57a8d2d397c7a996f3961b04cc241aaeb6445627188324e632e226fd6d0a67192296b2b64c907d702940158602a3368650c73480dc7ccdc0cb0457238f639dc792379510c9b4f4845cbfd9baa575fbd5abf7c5065863d586382dc300f86edb80c7e3526cfb7a53763b08805cf903cbcdf2bf4998f6e42c897b4fda7b7e0ede4b9f1f2f09815d3fb2c8c88229db08117154d274a9d5ef515fea5b804f3b63e29e3aef48c37d0b2cf55023d822038e8370d2ed86b86119d2eb5f9523993475d251067b74a74b7c8862ae2701489a2892cd124e24216e85b6e7babc7ba0b867a56dacc9d6f81d4a415348edb5f09831a19cd9c1b47b1736a6910b275e16aaa1a06589b9a7dc6efda3f9ac4784e5b069e8a4180a8e3edf9f321e51a9a94e7b79aaaeb4391034fb982d142302331301082007090b29505a3af7bfac667cea74ad0a891fb81af2b22b730e832d60c58e59cc9324ebdb8ce722517aba20a25b5f98b62e34bc8da8d1f56d2c5408227fe765bc2c888257816f834c3fbf9ebb040961b5c4c8b4e40f844f4a749881a7ec20c5533152199e4557ec30c4355273f02bb2fb0f04553191172430f615110d03ec4f520ba7e1a24ee7e9ced38170bd7f117a953de98ddc14e3241541794014bc4b5dbc55da275d856cdf123e03d5bceab707da4c72b70c57bdda9f4438cabd337afeae4d550191582587d81be494e48a3f1608ecd9d477bb737d956a49e5f77756c240c848ad75ad439d3f6ed1f5562bd1e28684005e875d814184cf425706b56981ca21d5de0a6768d4f5eb44e993ad2049302aff1b08687d70c3979ba08d3c291d18bc71e87027719c0baa92d7b2b02e9b703dd6c1b52c2e7a9e6f52f70cce12b1d9b5b29ff2293f4f8b26ad48f5d4a10f468c5e995c6923de02edb9d40a247cff229826266e9388de5815c7448af8af149e64dd689b92b48e67d4923bbfd585d9cd29743118d31669205f2028363e5a02d40199f8b7f4a369783c9df22719459ba0ac6636422c7dfe7b7744568c831719317325019149f4b3b96117ee0296fed6fa48152ca756b281646ea74ad9372212c194bb976156ec482d2d70156db4d97baa83b8e2780f0030a6cdb1ae59954484a8cbf335033117a255d5b1c030d6e2a7ec7b1e4c37299215164c0a0a07963e3996b4ed04347501afbfc799a61cbb0691ef1d655976fd332999b537fbdc140f08efc972e31147cb162c76cf220ccb1e78ca8b99f5ae3619741b937846159447e821cb1cc7e1f1e17f0a2c4b60ec3d48d6bca0d9d787d1b289d1ff7f1fa13f5e29504434897899143320ddc7f34103541286b79ee6e45cdf645c5b8aa0e52fee02ea30694efc5d2c9bda00094b42fa92883e4222b243dddd3773670df954331d97e18ff22d52e01d113373c25b5ae7e82687c6dec0ac64212783d2ca5e31b283dc57ef66e53c953658340b743189cf66d05d8b428ac5660d1163aceb1a8fe05d6fc7df7599776ed5d67275e6090016bca57579b45bfa60d62362e16a31a8a4b9e13dd1c37f732fb49d637efc356dbd62d1a7d38d89c72fd2dcd950a968475416707d71c37b2d1d5fcf18e90fbbef6238bad2c33d6080715174b3740db75c396c722a6d817d747391d01c54adada151c8044ec68552dbf6676d78e81f2d3375bec48a40a8bad58fc535db71e8653ac255e8a9d6521394b9b4992d621ee16ba4ffe8ef07feb6a4a8dbfca0a923190a6ad4fb626a1a6cf0e2a5f9c7b9caca619cbd515b3b8677589f26c6e7daa57aedd932384b77998862d76a395406f4d8d8763269dd7961f16f1941dbf8ad25ea9691c24a96fdfad328398b1f6894871ddad0924e3f51c0b1841ca53d3eed27c083cc8cbb3fb9ab20901a92b13fd3aca01b16451c43b714e605b14dc2a0a4cb18d5033e40f1f47646ce326660b0e13ba1a9dd821e4a452a7b929cb6c575b75782480b20d25e5422a6d936de8b13f3fda5c4d717464ac2189960a5d115826d28c33534a90fa32d86170d38ac243df557a12b0df8050588b4aa068b8253be2683039b296d36335b98ebb83642ca7283ec45ca746417bc451e987539ccf2d9459665e2a8a66759330ef6b8af58b195d2f1f84ca98bbe14eed5c3615890df166bac9a2ae0dd535424382f4959c501a3b798992b00590f0187f35a51655710869c8a770214c2898566cdb4a1e0eda3aaa60ff50c3cf3ba13f576717d51ba2796aec73edd379ef2bb2e5310db7ea47258461ef348477f43b03006f47f13b095b2cb7881fcf0e38d29d7ca1dc13eec44d5623cb16ac99caa9157285e08ab076cabe77a558cf5f443b60304dc74658dbc63e8e407662c62f6c71a1577a9e0a57d01a40b76481e53a7a5186fa56f4165b7d0e75cf86956647814dd80fd55392167420b3269cc26cb0a2a67279386e50d6fcbdf3bc51b5cff7ea9f83fc7c19d77e4f88f919d2da6b22494524c053dfb97013529cd2e20b1202ab954b182d15b8abd24c80df0bbb2828e970ab21a2574fce27a3a372b6ba4a9ec5e4e591e53e13dc8ab115e89ac22d2b035078ebd3a3402960bd696c8e0b9fc4492b611789dd230b6cd040ba5ff78a32b38d838a7eb53b0f014be71cbf71262522a24e6b0f281c1dc8638e5939ce08c3fe79a09a45b7ba9d2bd05b30e23c97f1f015d1e4fda0f6867ebd635445cfb8ed88934ee701b09d8dc62229b77d07a01f5ebd071167ec4776e31329a23f14346a51177faa7785426f2518835e6625d1df2900bb5e25cb4a6576d87b53edad561e52f04944b59a89e8c86a820e75f20966fb0816554037606ce20cd7db6766a8ae833548c984192f3f45c6557560365cd851c6d9af5d422a1d8c0cfecadcd133a90d4a75c986649148819965e6b62ca02331495f1539a3e87c3dadeaf512096d20a6516a88197e38752d7a2556a46c58756f58e3b1696ace3e6d7b7e166db19e73ae6aadda619379413e7c7dc30f97c853b4a6c22d43bb700a5122be517b3ab3a27f21a4d335e5a4aa98688d1c61262ada7085c9e51125375e21c3a45eda261d825bd3a2eb3a2dd1629685782c521bf1275e386c02dbce516c78c855bdea56d58d5f6f3d5b30d570d58641985e5ea131f4aaf8489ecbb7e4540629abca9ebafd24f3f70b4cd193448838aee4b2a111b55c994a83c64335f8a2c4145bc269304d8e005bce880c6d7933c326455b856b6ea2c12602c8c44f24f62f0285df294e4362612df9ec945fe5dc1323af90a249485b05a61925b457455c45146b6dae6ae9a2a89378ac643cb430ec3cb7e46009174e476dbd5c11cb5251a9226ac1f17d771e7f08cd11d6451c11d6d346bed0e4efe52d5cd0c56dfcc7115294045fd04c798c270e04d00a84289f5fb4c8efe011ba0eda342cf198491a072cace5338f104243fdf5fea245a4f49fc2b5a9c17965e2cf12c85ef59adcc987000a0fe2a493b8dda4c9f9603290711e4f34cc32f50702cdaf934d5b6c3ac3e2979d4f3e1b3ef8020acb604048948a137dbe2b0be120567a5eb62655e9b81e6375618fdc00d2695390b9210d9dab879a8ac5a58a90c64086e211da90883d270087cf845c484404b6f2c429053e8f3f8f08149647ce0d138afbc2abe629d64094a7135ff7a2a1310a5451ba9a0dc51e741758d7de7167fe2ac3a60c991b675d28e35bb58f2d000e7718a2a9fe9adf94445667e1350fb9904a40e3bdd812daf7b4ff0791a8139371d2b03a8b089b7684e6e44cec72589de8aa33c9f437f21214dd68683f398f0b2bd4553ea579134fe687ccfacfbbdf348d5431e8f19ec3252a3b8a9d7dbf1ba8e316c197894857cd0a783be27bbf92f24f55249a7c0db016224879962a28bfb927fd6c969fb0ee5d54f305169faf9cf97ee85c5669e66a31733e96bf8d14fe829400802c2335de281d20255e45a550816a0a4a71ecab6881bfbfeabbf694e33aebe69536f46b7100bc402a3941f2dee10201f04a84761e0e91d736542c83396dcc7a497f61a957be98e455401fde43590801e64b6e3e7116fbf7c11ca906a68f333b74731bffd2edfcc5e7bcf389c3a2f083b948b8419c3f9da0df4ddcfccba88dfc722462683e78676acffb15befb88c726bde16871372ba80cd666e173322df39913292dfb896f4ad7aefd87c8f82ad73c1dba610936e6f4a992681d7954c252804bbfb4a514d4d33c92c59d84021bc5ff74baca4d3eeea2f9a5e31ae2d0445aa5a4348d56862f0cc7fd759e419231a21bc1a92b6f27c9659e2142388fe1a0442455f5c1331cdbb8df1e5e1d3719b59d203c88a432faec67e1c5b42badcc55c9c833bfd15664fc503105c72a3178ea668ae32328b7caac11bc5f8dece95248c002eb8a480681c25044d71e33c63400eadce566b1bfee1004d8d9ed4912a31ad8623b7f51887c7c5c401606d8417421dc15c6ff708c662cb0636e83668aecc8f18da50093a0a5b0d1b2b6944b6a91013784960f5c224b20dfcc6cf75c7292a1a30263524a06dd84fc8de76810bea0a31b850dd58e63fc816b05194b9187f5c8c1900be3411a43823350581d740d248bd9d3907f0f8f54d6cba11cd630325d60a7990b3c71bb1270451c87d8dfe05912bb7520ae7dacf014691b23cb742bc4d5a76630aa3a84908feb973a2d3e412376c62ad6c02c4c44587afdc773fda9a950b1d47b1b15aae8037ef79bb202f7b698dd6ee9f095c65f5250d6616b49079ae87499d7cf820980b0d88dc558503be79276959fefc76cc08c675b5688620ef90b16cf47fa77547efe7188dba4a7531b45d73f86ee5db49dc390b3ca3d763878707390be8e4231922466282db8f5830d3bb18e43b52c438bcf9038aefc0193b78c05b1737e296a7f031ae9f46c5bd3f7f32117ff273f3e99c45f81d0c0a570c8faf54caf5fa90c5dbe686c12b87285b6eaf332465a50e90b20c1d886b55f966da9aa1258c63a86b0f9f032882858691ec1b57460d029adac61a0f144dd8dc4c9fe1ded551ea84bd0127f7037bfef181f9926b8c2a93642f30c011e8f17d3ce38c31959ecc53ec6a7094f3c8de7312edffd7f17a7c08076cd6dd67c2ebb68b58abb41f23d816be3658a2df8b7fc365e733ce704dfdd40883ef822f7d9be5e9c03638a1b9f08a08f00cbddfb66328a297545538f894f015a85b2da72938349a7f345f97da0297726c6c3fd296ba52b8298b71e2439931928e150dd9bf3264633dfdc420e2f7c1520789a347302877435d7b9c3d1fa3150277e68883bf710dab9c359860b9da27a32dff7e711b88ef2a7ea4f50fccc64985ee1c9b657c7381d939af8932641e5cfcdaf0fffdede7859f44412c9b374bd60f8d94091d9fa4f3cf7a1710111ba80430c2a00c3f99c1e32f17c6c0639c0cc9862104cfca574527c3bda3049e1479dd9f01b87e08d1b4d33aa9cf16ec2184317e508a75e82a479f485aebb6711cdb30563b7147a79deaad05b80da06adf147a608c3aaf899dcef9ab5fb6a15653d0e0222b5b768cb9985aa7bb1b3541d5cd1518dd51dfbb322516df70a619bac670febb4e3413e10de2485352b68cfb071786fcb398c3582e6d2b718e29b8a7f25dace366c53420c044bbc8712b351a6f8df8a9d9bbba1e1bea7b5fbfd5e2c13d19d1c8d5b266ddc13189b361081fa8ad7eab29427275dfd8b2647a5b2d3f0ddc8a226407426ac2ddcd2ab3896968fce51da1623bb9370c567235f827d14e3eb8c8c69c5d68a2c2d123e9cb646ffb61b1a5e13004cf89af72da2c75028184f5a21b400349c4b07ad84c56a122df87ba23a708611c15f5b0b8a967e489d256f0098a2a1f818a55b66e477d62e122e8108ba3d7a442c7af562b10a6227181b329bf375eb5ea3bc83fdb69434ffddb30c6aaa441500804fb5a12253e52ed5ecc3016136edb17381e8199f2a1cb108def591a47ac1fa686f14408be19723fa14092e685bb68bfab9610b7085ad34ed184c1abe2e399ab920d5a22b429cd4542221b8f8aa65cd8edcdb91b33b72ff3e8d3099ad8e53ac64eb85b4c06a14ad45cea33f2c8ee86721e0a66b15aa33c4c874b3857ee4d2c1c78887b2bfcb35471413c6ffb588341098e86825f3e7a8405563eaf4cd8e0018e4c9a7b6bf6cd71dbd5d5e80d71f0e9bdfc96b2021dd515acc9978519d8303f193a9144f512b65ba1a14b8d957464c8b14991c8015a74e0c405bda9148e35fca03b24b88141377b537e5d331afd4e1b79d8302bd4cbc09c39b45396f632cc6afac9dbbd7f900a345613b273fc70f0489333a34a02056a86b384a1c2152156c1ec85c4767a3c53ac179cfde0e78e1523abefa71b9ab573e667b63578e2725dd2bc6ca2dc959804f736f257a2ad5013db81368f04350b6ca48a0097903f21507176f82539f73b2fffb7c972b1507520ffc8690932c00246744b4fb5c1cbbb0f4b2878adf618f09d654bde72bec0f48312f74a804361435b17f0008f4d1f0e2da4639a86b6f32ee1bc63684ed06914d74339d61a7a712436041d08f78a1f10e048bc52e261cc11e5fdd2285f3c391112dea6cd06fed43f4ea97a6951e2a1d25f1b3d4a576225578a4f62cae883a633c2eca6b7e339612638ce83b4ea1b04f64f174c683be0b03d57ae7f5baffc455b3c793972d60274201ab005a76162a58717d4f9c8d465e12ea4afd26bb18c69049d7c819fbe91266e8c9545e09b1ba09e12d9635055a21ac9242e0c86e041da8c02cd7f8907fad72b25a44c0cf14520f916f7e4785b58998de4479d7dbf67fc83491e8eb94179822afdc135c350464d18b1ddec127b889300dd3311a3ebfe52a4410f1fa515a150c5ba401e76f918f81c6b3dba93417cba4615e22ea937d7797adf6949dff082174806536c71f4f2f269e92e0a7bc9d7ced517a011224f548be0f6e2f01559557937fc1aaaf61e7a554bd98dcb92f042005349070140544f4727d36d8804f913d98e09f52c443606ef13f190b61939e06db8405a48714c09d5b08bd4a9653c02d9574484dd3b1e1ccd8e4475678d40d090c606ab6e067e862092c6ac128ec79e220621a0aabd84288cbc52db4dbb969112927cc14f98a85d858a160547ff28120d357617d28dbfcc45cd264fcf88bed499d1a0a4168d509084889f9ac5876ecabfb84b17c275b1aeae77367c3dbff24f89af638acb5a6486fbd840f15b19170d1bb8ce3628fab392f4d40f0c1b592f7e36057a5ad45b89612c9ed3747023fe54711a06bce68f7727d7d2cca13355ff2c2f03c53fb99cd6c0bc867aa9951af59a83a95beb5a348a6435230e9022136fdef53c9004631f2e562800d77b9f36d71374711c0949338ac82b638fc221641abea52172875a268e7b4a478318bccf354dca5c26a75728352ea60a87a5157fa1fbecccc6da886379de38da7cb51bba185492485236dfc7b74c0ee2b7d138da79c437413a8a072b29b023d2d58deb98f6be00631562525ab3a2a7443dfd4417b095d7c35c2576d75d2922302174d89975ca661284229935e7a9ff4191c9454a75720771ecc50ab8a47c5d3556d20946ff055a5c7383557a8c4a38185b9e402b3baa24e1048ef96c1e72bbb0bc0233a6623d5bf091c899408f988806ab49bf15ad53dcd0d42d14b964976b5e4ced59d63e91a4aae287bf01125aab9e576cfe538805d6428858cf8cc311569dacbd44bc82244af79993fd76d0bc8b587cffadbff02b59790096953484a57b97f6c51d8fd738d69ed2736d407fdf17c50db1d22ff1dff7bdcf64c05a179ec53b5e0d5b3a237625c73885b1b47fb9f2e0ae73307c7aef4708acbe5085a644f0cb950e2e90def9530660260cc8487ca600c6954dc2600d11aa2259900186c16e8447dd26a0b43c200aad228057e62aa7b0a94418281d2cf24be495f951225abc32f4552ea46861d0ccb5f394c0e829c55fd2adaa72410680f10f9cdb70bf716d9b81e97ec85aaf0637c80202371c510c71a8837d44d73b1af0124e7e84c17200f35231975a03164f2afb03378d244bd00f45e1fc04b12e95a7b7bd28b588fdf227d27f467618c25fce5638ee2fe64818c9279caf3383f83fd177ac85aa02b423099f8c654b1b1e89404e3f90b7031c202a81ef4a7ca4479c95ccd4d1c598ebf1cc664ee52027e13a76716c346a93e13805db69e3e3447057706e16b8d134784cb0a06446f72e97e08ecc30dbf673cd0b980581000e0b75204117fef74cae9cf8eec429fef80f03decdce860d1a8dfc26321feef6b1ba5ef8fa3f88822acfa472010acb0758296fac24323d24ee24184801d2048f391ea42db15c68d7b662d7f61510d9407fad1d16191a6eff9a378552633549940f372606edda9ad5791c77fb44acffa7042f5b8ac4f222d7214177c844ca14df57df2c5e852e9573f5c369700697291e208364e3c50780184f62183f3b1d78dcb445419dcdf9499661b6ed15a8f7fb558da2ae9730f7db6f3c3009142b9e7027f882534c8f7a4a481033ab2a28e55106857451db2155a66f32ca84631d64b8d636c11bb9ce702362adec8382c685bc82c933f460d287c8333902e4076910b605757549d58c258da413061c5ed29cf82b17a6f18a5215fff931792b64bc8de7b4b99520ad508a80828094e6d4af5a199123f5cc59e860f9a3a9ce0aa3cdf95a9435f1595dd104e6a752744145f79c2aef4c0824b5ce6228f1479b4664a22f22af59411970657df2bb0451e157b495ce6fea24f54127fe2920321c9cafbbb13fc04e7f4fb142bbf5aad562c2dbf6a6159adfc88cb7ac5c4f912b7df8b30ad7f65ba35fb89d93c9735e95e3b79315ba97f513ce732d739921fb951d1b8db99742c5a689f1f201c3974e4c0a3878fced530acb123e2e8ea4a7e93b5572aabd3e57231cd1f8584c5edb0eb963fbe98833aa5de86739326abca7eb5aa9a42992c4f9eb293a963bcf351f989085e5996250bcb1593dde0d8767adef4ebe56a0896fee9f22e88169729a5ec2028d60ecb522c8294c96e706c3c3d367e8070e4682685585898d6582c0da9cbc234ff969e9db938969269ad9459babb82df606d16efa7dc63a90419dbae0eac610d2b7856a67595c97ee312fed9d8d8d8e0d8767a7c7e8070e0a0a36564b88f902cd6f1eb94cad02a43c95a9e35b3cf93c5aa91ba3acb4cab6f634303808c9b180220009c01e4d46c04d099b123430166e0b937d61175c2f7efe19af9fe2d2323f33232b07f9987c9c85019301447d3892c5129955559adb0b4b8bcb0606298d67299e68b67321b1b1b989f90a88c73a436e59294b8ce77cec49bd0b85233b3e87b0dc3ca7adab736fd9e4cbe756db1f6adee2a8f82e1834c92dc46895f47d357d358eb289e9669b5742447f28541768bf2eff8d0dcfc81a05c7f1c52a0f08112cd8542490fca3578c76a34cfcfa20a1fe936f9de7ef3dbfc662a7810ba6dee90ba3dc6dba91b336522182f3d63346c5035fcca98d6ccf4e9f70cd365d512d62fd3d94e0dde69ff19d8009c03bef789c3b9cdf4c4cd6e3fcecd169fc76132efefacf37a7fca3aaef7afacd37a7f907562de3f641d98f7175987f5e2f2fe27d669797f92755856522ad6b1af7a7f15d6497d49fee9fd5d58c7f4fe2fac337eecfdc3374df3cd73e6674e76d9799ae6f3f83f8f9b26cc0499d62f63864ceb7f9922d3fa5de6689a98d61f639e98d60f639225d3fa5f4c14d3fa5dcc14d39ad6cf62ae982a4ceb5f992ba6f5ab982b4cebb7268bca6c315d98d68f325f98d65f9a2c1326a6c5b4fed18c992f9631cde6c686cbfae276763c07d71dc6a5673dc2fae9e41292f9477ecbcfe2671e8f32435125c01134301dd184288e9506a1828bf18b237a088742778a8414f0081e9a3e39a2882356b06b8a04017c2066419ba8463881740f02398e3c2c2a8c4674614411c625423cd0882b40561024d7afff685bc92e481397bceede84aebcbc0b92c4252fef8218c145189a4666eea2d209db3f920e8260371882df94c3cad58a7ef179f4997fd70a84da272433537f76cacc2af056eaa7476157a46457c444c9a4050b0c2550763b1e92542cb430ede039de55a9a0d6c035937d5847bca6d3d7f1c5afacc4d2c26271ab79ebe3d88a5b5fc6b5f1c6c6a78b1196fcf23fe8040aea5c7f254f668b1fc5a3c58f7a20b7a516f39f4e8f3a8372fcd0593debedd4af43df1d584cf35739ed6c2d20f24f2d202a9e377eddc129488ef98dc7f4fca4681b35ba2c141acf56ad270f9d8526f386cec2faa7fae3f8a731287cd3198a9669f55598360a41c614eeeaf22e272482fec2e55d0f4aa678e14d284d4252c0808b1a18f1ad60e7c6b6eb410a31977743b0b8accbbb9c113b926d6cf74cd64db7dfd5bb47b2b8411754e849410848a61084217c448c6085247a3849ac48c1164392bc2008196af045169c64010c257aa084cb5b54c105113c2882832638f1002a108109145cb14418526efe3c9e53afb840927a5ae8098124083c16dcbc0b2cb2108203284e9881915b4d0210232ac8f19470a28a2d2cb9a17a4e8882164340421241dcbcc9f5f7416bac0421865c2148163678a2891b1f010b40d0800a2e145184d1cd9170dd7c4294450d92587285949bfba0f0022b78e18216f0a0875b3dc2b522095b24e1c5d2155a2872f31702165cc0a408278820d9c1cdab15d78186d004113cbce0c952919bf3165bc8200828b258c2136470f3caeb5d1eaf49204f5386a6148da671a438205b37829a0a483dfa420066740b8219ddc8377d5f8ee16edac442158ce08114171c01c4af2708de0d8cbcd8220a55b8dd20855e13a0381a0284183c11c611464470620a28846efe27308c23308684b174798a30922eedf21461ecae0ae7d4004348bff00cf6fd74ba0618442d832fae0501229ba08fdb538021e452fa6df6a0b5a90ec25c980b51407f55c43ef119fd95302ca56e24058ba33d7fdaa34e42a2a42ee8625878500208b7bb90f3079973703164664e92c4032316078245462490c8058b5c7f9088e718e94422b26f1cb3f50b26d77f84a2b9d005097e35675882d2ae1ffef6c377d9e80816c7aacffcec46b7cf5416f4fb73a0bd9b635162b294c4541486200882e18f2158e43207890c49ca021402128143454c2678a4c4ba7f3903db0552084958c3ba052659d81a86e287668b610dc130043b895a85ff58b217beeb5f41a4ebee0f8260d8a183eede5d97ea13292011384407d63f250321a010700848042c020a91236b61e9fab34e94524a69ed7a7ad389e56254b7e9dbccc17f2c389ceb26b37481e5288a620dc1d3a68cb07ffd5d317f1b21501f91222246b99cf7921c692177e40892128e96b038ca3ba2b9de108fe73bca1d1d1d1de57239ef2579cf7bdeeb2525b13aa7eb5f5151d150d1d0af08f59996400a21e12397b97f77ed232ffac151a44b879ef49a5c7feaa4db86cbbc4f1f933aa1be2458dc5816b13d243ae4bb5ccddd284cf3a748be9e52efd75bea8d3a8b8474ff59aca3ebee43b4d64c7ce6ef3b4ffa5925a36e323a19b24a3057a2530e7c780e92201e518eae7f8f6666f6d18379f818426b3af0cc9fb930f210c4751e513c684985fda139fc77f8db9ce9acb2f08cff64ba38c633fed1b4e119ceede74171398c4db88b2515cb1541d9197b70e47e54157688144212f2875fbaccb21d476e85dfdfb78b21d7bfe4dab7f24d187399bfcc5646715393d0e3cfb729b2e0bbfe3c22d8b5bb7b78764c46c807723b3d8bee8ca6a533e7b5e8f36d67c7bfc7df0690bf4f8a1dbb1c726041caf5d7d1483a96308ed6b258ff3219fb70a3cf2345010bbb2e32d401354e272d4d35049b67630d83ece65a6beafa8d0258c70adbddfea36882894105e6c4b1a8a8610d6bd7de22d7210c16f6919973e6ac14462b8c9275e69c393d04abcccbd58a8161bdb8b4b0acac54ac2a852ac9936914ff7cff86c1cc87c160f47c3f7161676767a7c7c706108e1c3a76e4d063a4a3cbf502c157bf5e2a3bb0ec72dd1b1bce8e0c059881e7de0cd04383861a3e351c0001366c48c00d3f0a58000380687737a5ae560c0cebc5a5856565a562552954499e4ca318823297edec28a1d21d1d1d1d25e99630e135e9f9524c58972d2ccec644da88d966f3b1419e76787eda914eaa3f91a857c23a8d2255a75379326d3ea339229ad05fdb767eb66e2288fc7ebfa51be89347ad3b9d2a38b0e49f7827f399bfccfb6cb5ac6d28bddeb49fc73ba99f88cd86eb767d99cbda15a3e07b0df54dc409529924f5e57beb47f57ddd6baabefe367fab32717c00fd29f3c607d05f9a363e801a6fc78524d77d8e3267ee494470dc04c74a4d0e512e7642a4dce61d11424c38e4d0e14f28adb1f88cee84f4764340e9d367ca93ee7ef2040a029c74d5f5ef245a3b3d792a9d5656581c2bf1ed44fee94fefcf83d6c8d3ff64329d1d1de9584a283393ee0ed6266959cdf20b8b63b12a0882212886200856162bfce2f7ff2fb3b9b1edf4f8d8f8c1d1de65a912048bfb59ff87d1e0e9045290ce8034751bad35e2300c4fa6513ccd87c9bc5cad1818d68b4b0bcbca4ac5aa52a892a4949ee6c3645eae560c0cebc5a5856565a562552954499e4ca3188258e0ee236f9a4f133babcfce5a5b7ad6e6e22a45d1f8afd4a42e9392b45489c2e2761e26f3fe2c989896eb25037bf39c89d1c4a891cd5e80c186060019373e35b08ef9fe077014021ce73a9969ae374f66daeb9b9ae6cc699a309997ab1503c37a7169615959a958550a559227d32886602572c2e3f1783d273e25281e65c9a5d01c1d6a66fe671def5916ad91cfbfaac4a3b31958dcf38828ad01b9b5c7384fe9b7d4f32dfd9478bc1e8fc71b495ad21a86d50ac7c27d7dba8ac879541c47b17e378a86f86dfaeddab5471e0fcc914350eee1f09a29b783478fa09cd0d0cb586d3073af025cc38175c6cbb3f3679e122e5391bae50b2ccea5f4de0835c23a4d73c033fc29139c4375f489ebf5c4cd2e8e1ab90e3a183eb89497a629f1f9742938b8d7e39e0deee1380de14e7dcca08fc125504a28140e854242a2b0889b523a8ed6b258144946918efcdf54ef2d462cb8c434f0072a3945a2b59b1bbbe2031b1ed9579d43f5a6bae55467eb4748f542f6551ec86df5eeeeeeeeeeeeeeeeeeee399c88d4456d64f6110f60a74066b6dd944d3da7581545c3f43fa6ea534a29ada8a77d51a495813e5009f4814fe810e8ab412c47c182df553ddf70b4e83a8e0a41f2a984803e2194c873c671b4d67deea3be5b52d287ef45541485f8e997524b482e3ed814e8a33596cffa7ff4813e1eaea3c9c7c68fcbba411fe81b8950ee7204f2c7e3c723283724644891e7d0b08ebbc7d15a16eb5f663b62b3bdf9a469c2fcc260b087c160b5471b1d6d36f0613c680e1df23531c03f82491c9869c258463ef32f7293675016b00c7f3f8269ceb79a9aa78961b680623ccdd3c47820377a04bde6ff33cbccff89bd69be89631f0ea6f993608caf791a9d1866df6acc1650cdc7a83983ce20562cdd4e40916e48fa81dc68cc1610cdd77ccd19047bc18de681dcc82e6318a989d5983c314c1f9a21e591a54a58a77d1061716cfe3ff92697422c7d93afcb127d837a465f7fd3eccbc37378f74417b0a7460e3329115ae432ef930e615acb8e2a1972fd79e8b003087a84400423f04182129820e8c7099a87eea183b00ef93aa7d7f9817580609d21aac47342a74b3ca782d77c46d5c04f687c0b15b65ef31b551f668aa81a7d61ffffff3f73fec34cf3adca8a692b2c2d2e2f2c989896eb25037bf39c89d1c4a861da8c67383f1ebed35958a0b3d96c369e1e9f1f201c72e8d8c1a344f94f78fd795887deb1673ede565a1d493dea7fa8bea481c7dc1145b18a6265c2e26cf7c7ff285ff53f509f6af503a9be7ca0569f0a507df9375427d3d9df489d3c8db2e9c0a2ce563feab93c5b7db67eca93e9ccf42ba4ea5b63389a4af1c7913a05694afc468df554c953b531ded86c3a32888fc562b13e26bbc1d9e1e9f1f9091ffc0aca8ecc603887e2c86c662c63fd111637368bc546567ec002031618181919191d1d414a52b264c784d75b89c2f6b9e3b2fed3643acb23e44a1496be09470e3ecf99139c396768cde6f95ff8d9cbbee6c6e684611c5fb076c662c9fe6b4e9c2cc6a96ba9c20e4919a260d0f8e2b78cd0fcf73f91252aa5b22aab1596169717164c4ccbf592611d52e7548b71ceccccfccc4c8ce66768623333e74c695598b65a6169619acb0b0b26a6e57ac9c0de3c676234316a6298339e711d716c4646ba98a7a8406d369e1e9f1f201c72e8d8c183bb5b34a42e338dc562d7ebe5226b75b9985f4f82654b161667b3b10e8cb93896cb86e2b8ce1b2d2cce662380ce8c1d190a3003cfbd19a087060d357c6a3800026cd89000d601dfff06d6e1dabfbb5eafd7bf5e32b07fc1645e2fd7bf5cad1818d68b4b0bcbca4ac5aa52a8923c99463104eb9b2f9ed964fc340492636477777777772fb9cae407c31e58950a6ccc0b0f96a7b83bf4b8a4835c7f19b8e6ea99777d1c27c18608d79ba5b8fecc849eafc6059bc191e102c11a86b59614157e35c5e68167fe2a0a3a4d51f1ec1c2a8ac5f5ae77ed4fbb77ce33594144914876a7455cc6ddddded34c48a6b5d2ce915d2b7d0769adb5565a1b1432c2a22e75114cbaddae9999beef784d7abe27507e5196688e69f7ca73409e5961993fce35a36cceb14442c6a131a700bfb99ce2ca38c4676310230f3f4a641c6269e507b69f3233bb51e862fa8d9aa21471658a2b2c46e919221758868b586099bffbba70fd71a9eb3e72c50716e74a4a2cce7fd75d49f4b5e5c126e1d19aac12a9469e832a8f3c877cfbfe15a92655259e63aa4beace73c257795672796fc2739977ef5a30a49b883d97f9cae41b8266002e35798a264d6e87264986e483d63e4fe5138bb341d9b04e9f307d5216fdd78b003a33766428c00c3cf766801e1a34d4f0a9e10008b06143026ef80165603230199b0de62415643299ec06c7c6d363e30708470e5a41b04a6171acd267fd2c2d8bd9c8646013e3385a16d6c76c6e706c3cdc4de9eb4547cb3ae0bd3ec6a0c23aae560c0cebc5e55b5856562a56954295e4c9348a21587b98ccebf5a23f1299a04801976559b2b05c31d90d8e6da747676b59864234319ad80f0e5a8bbdd3c4b4c0a25faf3e52999ee67956b3b22aabda6c369bcd6d572b0686f5e2d2c2b2b252b1aa14aa244fa6510c29a5f455c1501c4d27b244a5545665b5c2d2e2f2c28289016536db15744b3e967cf010d1102246458e905eae9b600fd0e2f5eaee57cbbc5ae66123add1e0993f119af4c0c09e3fe363c999c9ed074020023848600214c851010b5c40070632a0811d1bc07120870e78e0033c60278ef367ded58a8161bdb8b4b0acac54da871f80180a4288218410510458ff349fda54548dbeaf87997e6132b09781c9bcfe652ef98039ca08739b3b2ef3be3d3cbc63ed76bcf3f9b1c1da85a218fa9872c03bbc66caf9e8eeeeee10fc7eee276badb58ae0a64f1b97c93a3c9328d5fe073c47669ef93842c192f960717cca64aee4aeb40349c482c7639d700829cc8539a22222458e8e2025f1783c1e8fc7e3f1783c1e8f5744140ef1783c1e8fc7f3c12eccf1743b5ecfa7b414e678454647e3d04874e42b2b15ab52a9542a95e96452a54c29552a55a2c25c38140ae5c2a23017e66c907484d70b93e811d37b8ac7e3f178399aa3399af3f57abd5e5252128f3cf2882ac9a5255e98e385b93017e6c25c98439a415996250bcb1593dde0d858c794ba5c745504544a6555562b2c2d2e2f2c989896eb25037bf39c897997bc11092f8a4f13a389895fcd6f9a184dcc09bb137eb360625aae970ceccd73264613a346367b01061b1a0064dcb49579b95a3130ac1797169695958a55a5502579328d5c71a8a094768365781dd54f513e7d5b1c479177f07a996ffeebf532df7c951f581b1b1a0064dcc4100001e00c20a7662380ce8c1d190a3003cfbd19a0a76132af978c9f8a209bb982ec37d6cb6e74fcd6282c16eb596d1432a1d3b10eb864f4fbfd7e4b52c25c38140a195244c4e848a7d3e9743a9d4ea7d3e9743aab120e85393a5bd2e9743a954ea753a272fe0893acca5bfb2a157bb67e84ec0ba9fcea81d49fee8794a4dbf17a4a3fdd8fa86869cc15118d432b2b151b44a51a55a34aa5329d4caa9429a54aa54ad46f89fea28443bf5f0ff688c8cf3e91a1dfd129a5d3e974badfeff7fbf176bb9d3d3a7214a952fd543fdd8fea7ebfdfefc7e332ae63697b7c6cfc00e1f8fd8c5e84d0420b52ec6b7217451fca41200866741bdf74ae807771aedd0a76d7ff4d26e92e57cc0687512effd8089a98010e881829a1c413377f1cae7114908a7e37600210be00e206862128be28d62a822e97898bdccecece4e8f8f0d201c3974ecc8a18755b95581347e6af8b5c1b45ac3b2dce11e6e8789108acd39a69c91ae54672f4defa81a7e4f4f92a76f1459513585aa3caacd8d8d1fa09dd30f74c0c406131b403870d0b183470f1f4142cde74892e391f1f435b586c2f0020ce7bff0ff2db0cd34f07123694aa1ca1834b199d3640050036e3800c7032010011c2430010ae4a880052ea0836b2fd4d4d47c4d8d6cf63533594d4d4dec05a6c1604303808c9b18022000a6e10c20a7662380ce8c1d190a3003cfe5591dcdd26596a56dfcd89079f9c44606860fea40cfaa03ad750b4d24d4c33aa9eb3858276cb9fe3e6e280d434a8f9c4c3d6e3a5134a46ecf9225e4a5a8bf513eea06f9239da5526081ac408ad1124340700112441af0c31253a07085224fc8e0863a7f943f90fc205bfde403b99566abcfef2fcf20247d967ffa209251ccb45a3ebd710f877f0eff1dfe3c9c8634a4e575148d1fa14685611886a31886a18fec02f953525252e2a59c901027f2215e64e4728d2d54d82e5da78cccd9345cacd31fc567fe507ce6337a0b96e15d05a6b9689ea7299622924b498ad75a57d3295921efad44f36eb27abe1b8f2c12f368cc5ee2b51b9ef98f4c6e9ab8ca23d897aa09cb74f6e6b75061cfc7b9fe3c4dd365548dd165aef74167ae276f23f1609d56625a12aff516cc8499d86c31c4309b99260c0cae9570ad745ba8b0e3f5239715c1e25ac77bbd74afd7bb2c6171add44a0d254acf88d250ba9576167763fefbfb00a170c25e44d920d38a8161bdb8b4b0acac54ecab52a8923c994631046b8de69e33b13f6333e7795276591d716c3b34e68c95947cc6575372369bcdc6d3e3f30384430e1d3b78d05a69ad2c3b6b93ddd86c3630082e97cb1593d9e0d8787a7c6c009967ef603acbd42a43c378da1aca5014330d19141f59be7c5b7c5d2f19d89be74c8c26468d6cf6020c363400c8b889210002c0a90f939171b97c262e706c3b3d3e3f403870d0c1ddd6e53ae22b25d8d8bcdc0485a7c7e70708871c3a76f068e62838b97126b0af4461f9945510ac7eb9468f28d7239b13efefc4cc09104e80601d762766eaa2a2589ccdc9f56f9bb7b7b7b7cdb6842338e088bd5e319ec966278b9f69cd67b77bb98cc0f0c2fbe3649fa367ccbcbf057ac6f9e6bfff8e0db08eccec9da3b042af7de8b71871933d100fb7d9c320f3c265940dfc0436bb8cb241f5b2cb281be80f3cb3e632ca869e7286281aaf6e9a58c7b88ebac1ef4cec6968689e862646cdd3d4c4a0a1893d4dcc9c316d2da3ff34755a46bf69eeb48c02b40c1ea65da6e1c021470c0cebc5a5856565a562552954499e4ca31882f58599e963fac4f0140d5cae873dcce5723dec6128226c2b0686f5e2d2c2b2b252b1aa14aa244fa6510cc10a73b95cef72bd5c322f97cb456398d662da8b672f3ff5c06559962c2c574c768363dbe9f95a1904fbe436ad0e55879e3265ca948b03726959321661f8a2f8dcb56ba59576d35adb440045b2022ba6dc6b647c1ecf1c12f191b4543668810fe482d5ec015e5144d5e8db65c9db0159b69b7860b9fa63fdb2fe9b7e9c7e5bff4e4f7b4fb9ee438eb99b99c51262d15aadac7a5e5cadb5bc82c5d92e8b521645d9787658ac97ddd86cb928dd4c6c3031e570d0b183470f1f35d60935a531d346fbc4a137ffb1a7791c3371808d1c7ec24ea03163669bfd67ebfab52aab1596169717164c4ccbf59281bd79cec46862d4c82a131b5670b95cae98cc06c7c6d3e363032875554d58ea2e8a47aef8a2cb256ef1b893599e02f52dad815f6570aae0498fa80cead757e2b25ac39530acbf0a05364cf21ce65b50dfc6faf5c3a45017ee425efd13115582585fbc34f8eb57b334471a1557b90cfb8a2f82dc3415c62812f52958bee7f089fb187e7edc78033555c1035b1fe44a69f57b6badde05b21c29a5b4b465148bb3c3a792e5c7e18cb759ae60d98b98d5f3ff288075c0e75f402a6909a91d1452446000d75249d4c847d39209e93ac94cc38b384a01a72778c032544cae2fa9a994f0cc7b462a774daa24a68161fb71aaa4be2377452d80de5665d1f5f79faa48d5021512499d4a4a2551950baea792ae1d2a8b70aaa47aabc976a82cc2e254455724ada278cd654889ae7e2a7f954e05852a0ad619b1c03a360baca3ea827552432b41f8d08a900f49b9feab2170cde588ce564c700d0689ce762b2a5655ac8e563458d58075e8fb968084dba2b34fc0ac7210858b7319822ae9fae9c1518a8b23efca6c496ad131cddf64b640c134ffd16c898269fe2b453897211cd11a0c6fa8c5e5e8ba6db93897a195a2d483a6eaab695fe584e942953261bc0862712d4f2e0c8fd660b600332506089c8d11d2727130bc0a9a305a80f10289c5b524dd189828305a609a3f3561bc609a3f0c12adc16c81672e448a182060a6245d0f6190688d6f3049303a1c8c14305d30cd6388c414c17471fd63865cc7d196a4ebbf5274fd554a70cd8ff0aca86778122ca3df5fe50256c58073e8f300e97a122654485c8fc2d21ac5c5f992db8f4b5de146a38fcedc6fab558c91759b0553f0eb57d6b18e3e8b0f96feca144bcf16e36094cf0f8e9f771104264a9442df934b3f7c12fe2a12eb844a4ca34f4d44ad1b67abfef90212282cd1e00649722f20b9b9f840fee2d717c51fcfa020203c743f397e3cbed309f5a7af271089e39f68b6ea9be3df1045d3d9aa3f5a75e9161ae16fe88c9e4ce39b9e5a3aa37f069167d0780671f9e353b7e2f3cd74faf17fa0fef437c81bee0602a61f5b1565b62a69aafe64a6de3e905b37924a6e7506b511119251ceaa528deb1523165c235dda3ff2511f747a6a69f3a80ed5bf3645b3f5e3dfbae15bc291285e18e572b7d4db4702a47af145f1530f247eca487c7b0679ee74232291c868f534a752f1d95f9d41ab4fbdea5c9d7eface1ffa664f97163364315770ee439dad10e7bff2f9569eaa57c1d1dc8c96e2ca8b1f447f6886dbaa2c1f75966710cbe9a893229d3ff46d75dec8c739523803e9e9ac1ffac29ff3c8473d92d3938f243c51a29322d119fdf2b466f84b99e1d2e9719468881f48806e386a449e2da01ba647d2fa31fd02f8663a7f20f981fa1b3f4e27d5059d603cc9c751a4215227e5511d8afaa88f57b970f2a4c913427e9ca03c73a81f922b7af0049178b6ea5943256a2d806fad1ba637623ae9f8626804cb3751e9c6b71a143bc0620b283abee1429ff87d13ab119d91670b487cd38b6f3a5bf5f916feaa51eb46dfc6efdbf83547677c3b9d2da0d0172ae52efd9a54757537b6c2335c7a9c3874297d1e078d8e28901b7d3009d4d10777d47729fd7089be98a32f0ed11f95e88f3f6aca5dba7469e833115920d563b8682398dcbe19b1e4f6573f75e829fd63bfed67d1809983c233a8befb7080df670ba89f3e6566666666666666666666e69df3e88c9f9ade636e6666e64f1d61adeb2ebf651d1dbfeff89dc7efbdfa0b85e8773a832535c8938fa7d05d0f93a892eae24e4a2ad535629a0fb1b830e988d64e4427a230e944249e9c780e155c3b29cd6e4e47a71debf449774c73ea04a9679c7c2d4389d628153ccb01d7680e78e64f381de1e811eeb4054a9556564e47a727f87ac6aa67692785ba5089cbfca5b02d6e2f2dbd4ccf26faacd1374cbafe214f01be807a13bf4f44d7ff7bc6e9e84f35385d1ccb878b23c9530d58e7e2e8d151cfa048e390c58549fe944dba12862573a616748f4f7777f7ffac8cf0c33a4e6b2da05350a9fad3d90242751798f8dd5025901b484467dd02223fd56f32c1665e6ec7ebf99496fa57448de81138041251b0482507d6f42a46b0a65791c29a5ec50736658e2ab026cb4a8135a9506071ac2b814e5f7e7906952c42fcf4e3f0322116f7373620b87fa535f8d6e71d11df65540dd4c50144033d7f5060ffe2688ee628112d52a5c0f2d01acde540873c8773c43a9e424cc8d1a1b08622d84f6f68963c6a2f68e258c742734e873c87733079b8ac6401104540108145da4814411004fd4889cb3a693cdd45517c174f6ede0f4e7e68f2e0139107289783b005a2cb281acd6b972596773f10b9e0910f47355ee240f42eae93744940f094ec58502f422c3ff88eaaf18eab0fde6ada4b56540d540dfe1bd6d3df6a96b751354ea62b2c9f38517cf079e88b5dc465fd6eba921f5dd7493c673cfbe8552db044961c597eb04f67cd4b0161535558f2597cb0e4af4cb1e4a932c2922c4296645769812ee4fe5ee323183991725b75e39d0f50a0f06e880ab757492e287a270df96eeb7817c4910bc64dc1c03eaf7b3408a55a0dc2c712c4f2144d965c1c7874fbc123afddd0550cec0e3deced2798d6df3c60191d74a4ba9dd483cd81fa70192f051d5d50882417d7bc7e5bad6ffdcd3b92d4375c40df489274fa610eb4d7b9205492cb6cb4d656f0ac1f8bdb6fa335be358f69ad3b81dc48f27c46b24a902b23581dbf3d7e9bbebd05343250c75069dd38dd5a37ca279f3c7f8c5f3edf58c8a5013ea3401c0be18b219203e0a75a35a0ae3f8a03e27bf83c0e8a67ab06ff50047e3950ff6cd1c042f842c915c2174354085f0c5d6aa246233da06efca5d9ba91faf1c7f347f9a9d68d71c4817ad3d90232fd693c2ba3709465eaacbd56327d47673cefb98fce945246f6af657dbf4c74f106a4057370f4fb595ce69472a04f56b54cbf5543cde572b75ebf8175b79df65c92b0fea3d0a5f5d2a7b55745e774a5ac0a6521ee0005193461c2165b4cf12d84b4f0bf31e2faf344e19aaebf8fff0f0bae7f0e212b5c7f1d3bfc790cf15088955dde0935617471b1142c61c5234ba12150c81dfc77e861cd13ec4b4fe7eb2d440f5c441f544839a8b46471ed847ab82f977741aa7071b12d583420e861a23ca8040b9d6a6aead08c00000020009316000020100605830191581c8882a6eb0114800d63ee4056441e8b644990e3300e32c618638c0100000040406866c60a54c3275430b5581f9081b2202728eae42564d3c72e83da0fcd8020872c64b21fe40b249a711eea9b84d4e295cfc923a32851628bab7ee7ebd093fe13cde83f872adf891a0eb47f7f20e0ac5db94758cd05160ea3e2edf7f709c42436754989a9bf4303051257d887ed243e502a77b8f5e24af0d06f39e8ee50ab37692acabaabe8bfe5e01e6c5babea1fa83f2180f712955ec5dc032fdf142477fef7d439a0bea992e866e0b95d091cb7b39f40721516461c1e0b071c72b108e604344122ed60101e48ff602488e993d67a328cf63b17d42adb726d9646a04ff894c5d44187a0cda8024322f6b35f5dbea2ab0822fc8b6f8ecc8ebd89a7d893ff8638b1c65e58b9702d80d55c4521b16f269ad1e80d2dcfc4657ad1b2fd88428b652e03c33771018470eef51200770126bc3e3b6e7e984c556b8a97fa2066d50815de980499581308c18c2de6a83bbc0f542315b24fac1c700fb4f447cdb821cf23bcf1cb5a54bacfff3f7ff3d5099f02488686ca3f30dfe426bff038a518e2bd411e624871eecf1cf516d3a78eef2eb6d7841908ab15bebd1c39d753a5a37f15e2618f39444b2f660f94fe505b4e60106bd6a4ec055a0a4fe92d7c07593b08e7a3cf14d4f0a87f26037743545cd96f3e553d4af7eecb1140e212704925668a24c8a991fa063d0408b1bb692bb79b66bdc9d51e86b740d77d1691f4ed2a6cfcf606a9a729f82312c3517a59bde01cf11b1f727ae933c8cd680e42983c52442dd56589963eceb2b9808d1aa9319ac6ebebea8f8c42fe2a3dd3e814d0702768ec3d9cdcbc5b57f1c83b36ad596e234a626c5a3ccab36b650d40fccd62133f2be51717497c49a6cbdbe0c5f484a91b2d67e88525b2a91462f0a19134247400234fdcc33381bc505bd8158bbe0ec0a6c328648e2598a5995a0b78712779ff1e30a817ab98fc2666b056b53dc05896c8412150607f5af5395c57cf2240d18bd8e7b0b10e00b9c60727a807879b241e72d7a1386a013de17cf68bdbd8aeeed47de3a9c031dc6229796ad535b5424a772fc32de502b0fa79fa894aa025a3cf710ee54f47d45f9740e6b0f3a36dd3b7dd276f5199e5ae5041c512a6ce432b1814fa75bc985472b2859c26846e1116c1612564b39f3ba473dcc60638a32430bc91bea571b0b3b664c8afde7f604cd7aefaa14bf679409fa3b70ea126ded423d409ed322ba010362ef0b1a933f4561d691d49a306a3d6b16b4a8c4bd328be766a5e8a8f7c080f4fa45461e67e3e99bf2689f342e3e293b17c3dea8b52215ce1d3291b42ff5e867cac4db01253a9b5dcf7a64db7e00c36e5ea28c7afd8fbaa96f4bf976f10a55892b5d97dca49a1fbb8873330d6ca2d45ad82a70f310c246e2f86a4dede855b60382106e4d79c96333743388183ddab0dff937229d54ec39c501d526f1a0387058480dff1569f834084293ecad36ebc9eba370f06767e0f2a084ce01a55456009f40653abf42968aee50de2dc51a9f28129d9b9ad6a0bf1a447f3533a1550b0b53eef4e8bfa11c7091494f0a9bffda5126aeacf6eaa643b03c806aa1c6c76098843ee32c202b31312e3fd01308a01425e0ab445f7df95e3c94511be68fdf7b7a7d0a31c793114c3bf1e0a609410269f00aadf75ef3c83e2d03c1ffaf29d972edbc60fbf9d5713fbbfdb0b8a2e0fa8bb8dcbe30165fa69e8934d68ef451151d36798de7d1e369b494cf37a2726724609c20a20871272f017b7a1ec5a68ac9e80cee61af49f28e3e7460543518b228e8e45f97168f319885e829d5c4d160d698470d9c0e3c8c9776ab4ab06b97bae8d19aaa037d73103bb86868191ec2c1c13572da7155d02c99942dc33650810ed0958d09059029df355946bd2ae5fc6b98cac609b044ef2f6ed833fe29495fb6a1ba5c849288f31a0406425b29ca45d2496ae888306d4403abe9f3156f81b0419cee05f36aae04e39053a871b82cea1626207c5c415d13b7ce5aa32ec96665006cdc2a2db5d2f04f29b1e83d7e80a8f0b36170d22f799b979085c02268bcbc5707adc3892014388e905a1fbadfc73de2e3dfab07e900467d1e751e81541cf92c077a99cb7173f3b547340f507d7cf7c72fc85d09bb6cb172482beb101bfe60801044eefbeef9a0d27d1c9a92402257eada04a434230507a1a2f0bc28551ebe6549ec90583d4bda36bc5ad924d48ac1822f2fdc707a291a2d96797b1ccdd9220c2e0431ff6eca94b12703b300938e467d1ec1c8c76eb3a8e93134f45ca010f78b945ed4510d48bc562802a63366f2f597f6281399fe0c5773a83e041cf3c5f3bbffa0009826138823c97d8b3510379201b0c6910ea0dc59b759d0df69546223c5428d82239b45e14c643e87c9c5798cc694fff96779ab36fa87607e9304e9add257bdf23d3bef78b0e6915c9d5b9160dc9a5643371541608f6f7c61d79fda593332c00858748f1b718cd6a4e3908ce7bf30834ae6e6325cb961c67c0cb4510efc41f50f0de6477f0f036016d2fb1aafd635ae888b83791073410dcaaab5afa3d4a7055f299ce6be453aba868a222f5921487560029a351dea26d1e204805aead796e9cc7cea659e48db36fd0c1a94e34060f72e83a83b22208e5c0aa27f98d0acd291485388c4186be545261329648585790d3f14e54988ccff25ca29e285dac98614a6116a2d0ec0645b11149654e27f4ca83d893a9e0139d1d135b73bc5c1083f57699d348266bbc1d9f7cdd1a0affef362223071bdf83542471825191c469b03589bad79a44d3d0cf88acbdc92894cf6ba34599206653307c6122895bd17da50327186d84a22a7b3df219d2caba333a46d88895a18e618e1b58216a0be8fad34e072e3f6d870f8fc90829d8f5d00840d82ca04635964b8b1a01b353fe5254a512a6581e85ae0983ae8163a8ff0c777e1652b81d5381bd1f1597f1247c73f8f13eed96101ab82cdf68916211cdda4b5c7538f0bca5ea62ed135d1e75569d95f1fc194000858f4b7f18b05667dab5070101e87867cc3545bde7fc9b643414487b485772db3d52ade4407517d5072fbb7e678a7f4292b6c124cee0f1f87dd37310726472f05ab30642148a02aef0b5f030198b3ccec464e8c7e00902d86ae2b265e19f1055b239fa6870ba654b2cf08b4433f4cff85f136937d24005996816948a873681b163d44d39463ba8c54cbd30552902cd9dcc6b4863908b33485c170a90837761ac3e281ca3a3f533cab4b2568fcf28cd8d43ed4a53b7a4b6788280144fa91546153f9f9b87fd0c04e61771b1c55e6e2111cabe401db661c9a21a34fb7a1cf2a7a5c42183fc10c713a224e0374fee32f29f3304871096cab02767f1d51e13c80ee6696efa78036202988004eefb5a193dc118076ae84a24c875fb0f8290b028828a449875cd8494ec62a77384848dacdd582cac4860b0c20ba70c7308cbe7fdf52bd0f25cbf2cd4f9442faddcb2617b8bcb74b3b6c0b1751b631a883ff9f503482943ad71b613050020f12aa381b2706cde85b5bd7954923f9957c47503e16534ed64692440d59e6c437eb742a6c2e400a5bebe38f4ecf5c768a2c7fec7e8d0e2307a31206201fb6872ac766f51e65e465143a8c7e4a0b56d4de93b7cbd6b92ea3d869567d52bde8694f2c05f8da683aae22010d5e3a6fd05836003633516b91cc47667f372904e12d03496ae741c4cc7d38199417301129258d4e7e54696e82091d9de2340e321e12b577dfe2d2cf6db5ebaa281757a7484da94811733597726c3826d948d27ee92f2eca63a10a05bb8d51dc0029f5808ff2999293eaf30b032aba1b09d838fc70433b6c66d59a3771fb2232a75142b6959cbc8bcfe2299432a4211ca1a70715882126126608fe56101d8d33e00c000cdcb4b8f2051168ca7c92c0ca0b3d0fd538401456f83dedaa6b028cc256034094cbb2900c74c17c27da3a5cf3a21c09e6174b9e73a0a27ecb22184984051711f67e0ab8df9ea6d774ffad7bfd2fd032254674a337088c44eb9626832fe2d9214cadb5648b8642689b44807a07a5e0dfe96f469588864f644f3af08ab95cc1b52441358c3842d50593a130b54566c9044aed6801e5b1d39f6328ab05aca09e8b25ad95a83bf4031cf14d8975370451b74eae49bf8aadad18721576b87f59332fc1f7ccc0c318a692044d892c87ab278fc8f3db3483f94ac994ba637833c0102d63e3462f5a271d14d201e9abaac165bacce4824be7e468b2663ddf17447cd524703570c573ce00dffb097c43f10b9e44077f577a16a6cc01b14203569801587682999382ed66d830d409a5108fd3ef43b0319490031a135a3c1fcf6338a917db324319e40c264601558424576a177863528dfba49c23f75299717682b2de1509aa4f244997e11557adf529e73f4c7249730318f6d2725d69e72051af902c5f0a6a5ed362ec3ed5165cb116aa5885e5d568e752fcb0fb2b26e87fb2b08b895a3ca23976251cf82ed9db86e52eb819c88115d2eb71775d9c15e773a4971a827acfaa01b99e5d502a9b540107e7dbac5b1e5a9ccbf0407c6d607231972fb65e3efe9b4c5620b885ddad5440bfa67d3e6c0fedb6e886e53b9e78853648fa8c641d3044e11c0a0e88e4d9425e76e1e6a23bf1640853f8592ee323367abe7b042fe77dc56463f59a10c325374a3cd4130db71272b655955016d0ed4b95f09f9d0bf6135d9d676b712809d7e821529962a6048c6d09666332fe899a9f9df4e02e97fb71bc0f46f13495c64825fc0263a7a8e8e0307a02c7b1ab0134d10fc5748937f7852732e0fa27d90192b9deac042f88d9167e05bae8b4a20038293470893c27cd0e13090824c13fa51e094523f535f42113b7904be448ed104289962bc8d7600108c7f3110b11682651a1608aa14731c6e46338946556da9cadc48fffe8ffd54f4ad450065762a7335bddc8567a0dcba946dab15961803d6d7cd08b218d8b2aea2597a5da91b5d3abeffc91d66e3523fb609900a99cdfe430bb69ac9ab84556faf6b67898b70690f2c893a93def5305060df6c1545782ba3fc1641b1e1bcc3728bb1e8775a60ec74c9c69589b57a829ac1a43264ac3ddbf710913780fb3b073198e7f328ba08e37cd48fb37944da0601cc3475b413259807ebf03aff7eecb90f5c41cbcdf778388c9afd61999bfeff2adb4435c106c0120e0d01b84c6322f2abb67a95471bf7ab261d490b362ee6ad4aef72941980dde89077d6d87a4386e26fa100869d92aa49261b3d83c98af93e24af0888d2ba53b400c2f70800ddf526a2defddbd30e59ab5d9f63de1d763c5d0836d19f4f1f9e1b3955e65c1d7de235a5b4e86713026c91809ec1633f34d0e392b9f03403ae90d41c127869a910f1048f8fa788f3ec0507090a28b400c4a2b1d6b03b2e7957c30e1b50012594d51534703f3679f422fc926252d79e0c90982ea312725d6c8ac90b06eeb0f1513fdb1d52ccfbc8419151d5815789327c016323a9431487a0131613a03023927b009850059f5b21fc34ec0d0bc4deb86b2a4c84e75c7f79183db1ca24552bcbde7a5b9c82577ff62f4cd4ba14bdfaa1dfa967eedea43a91a83b874babffd2f43c694c7fa1e0d7a4ce6a4c4852d93b69bb41b496f44324c1a6b8623f406cb154eece1625aa6c8ad1fc1051bcd2ca28f742f92677536afcd6f54f8eb3670f99fee5c41fc8b87747545bf2c2148f285f582ea12077a82a0916024fadd7ccbf086cc6957753c133e7f6e832cb01ed90fa08150aea6385091a7121f0dab4d5a4f27ceae3a27a9c5948a3fdd23e9ab65827ff4a42725183ca57b2260b0345d81f76d5f299f1529c5e95eb1512e752f95c186451a06f7ffd91bf3b317981acdc4e3ed186279ff8c4db6e7e74ae9f6488249f375592cfc38a10aa8fe7315c7b327b6adead0137cc2e51ecf8892de5c5c99c77075c59f425bdfc09fb6f2317cc9c123feaa5fe90a4c81495295204b6f57c27c528d8cfd431792fe1594454b1a03e01bbe8d0e5a75a0cda875415756e5c2a02025c8b42c76fe27fdfb21b89f8425b947da091efdb189e393dd3c6b38126f37f7de2afbff6bef1fdc14b2e023fa55c7431e5a7c0706fd8b5245e2e35fc16bf1f01ce64bd7a228c313f0e33f405dfba2dd0e36d95f8f5108b623a1576d94282d12b6aa1776eeafa0e849c1f15a6d728506496b61af6127a9020162d2548ef8a985783d47b4538a24baf816e0bbcb1ee81ed8023402e0988e1572e8625bd417b7fd50d8c5d867751e1837c95e300cf43ea56e65d0413ecf9a29a9682c1b72560d2e7748e514df0a666a3ede55d72b84ce3a96a2fde0c5532f326724e984367486351a1c1634a1c597f14122cb1da710a8b6f406f4a64820dd29d2055114382e618bac8d103bd673ac8f408e9c40e12a45b523859598951c7a614cebaf9d06d8b7c331de2a4eb77c346f0d6c8b1a705211b713f30425257b1d2bad651847ddc89169e0ed7148727ccb82c0f3321559657e28b4071700abb91655bbca3d7ffbbdd4af24a2ba1155f8650cd312c6d02750fd32a43672625a50c346b5c40479c3d3771c3df64e6dc587835501c130357564ff073d0be7830d3cd41c68560cf3ea954a7fdd43980959a480bbd134ee083a4ed69e74137a712bd4ded26e0ee935665e4da5f67d14383ccbd3d89c271a22b97c07fb45f7bd82a92cf2ddd032bf3fdf478b158e5c5ea8159367a094f350d6a8f0e9199de5a06fa8d97587a2478a4365a84dff6ab09fb731bbe407bc5b6976f6aa92ce7cedba007157118e75ee93d84922a72cffa02332328b4a2c32a4f5996bf3c5dd7552c58b7c84aad31b4b5631910654d223e6475133b2930304b5dbb66699ac6512caf66a715a29e72c0ae53863eca7eb162221b2f6019d8ae545cee72f0bc05bc0dc9d9c23ed5902d67599d53eeccbe2773e82b7fb8734e45b0b241e3b06def03eb060ab0f8160ce2f0fff9ab45d06b641f555f105b6d72b87a9253e3819b958f3861a12a05ad4cd068c55b6574bf06596b069b0cd6d7f7eb855fc608e778ed53bf8f1ba16c27dab187cee380213b126364831d521a62b91d0bd2f224de4ecc2f379fee6a5cc4902efc23c28fc273a86156588a6f446ac6291aac76a3868cd65ca01b9d64d564c10f1f44af7847237539af39c7391fe63cd8a98dc4158ca289646793d437d941dc61a71711a8e09c13e4edf1c776921f2d063168248177a2c799759dc2e41a3eadd55bfead4eb92d4346cc68b8ac5b037d46aa90618ee80c370f72640a8c10d52478bf9ad7acf27e35f4d8c80a4072fb9919a11b8add65a54e95e3ed24f226b8a111c2d52ca152c6f4d6338986ccf2bd7fa28d02104dddfc834eefed203df32141d8cabb0c82d6b4b8294168022f1802a97503d6f947dd6628027eeb2b5387a57b90d189f2585b970f22756492da18ad1ecc5404b32db260d4d13c1d22d1ce2b25065e3f99be7449cffcdbb2927df5deed51d9130190e6481be4397780de2d31328d66f0a80a11bfe34016081d985dbea0239444aad0e0ba7cd17558b3b342b8d291d1f186031a0545a71daaef6a0b6b9c5117ef32d062777a30809ebdeec3486dec6464e7503c8b532f8e908426c6e3808a7f027c83e2d885199e7c5f7abced772f3df0c33c255e130b7206d3bed58527f700e874480220568fe43964b104b07a78a6388324cb22ae864ee24434c87acee07727ba413ee983b8b8dbb964c48f602877a31cdb30b551560768bb196ae29e422fdd53bb8c40bbe71c1de9007bada6d644f3d2d35ba615ca327ddaccc809c4cdc07ad82e27f574da5207d6dd1500360187e1addf5328bd0dc08b501657ac8d000ed5199147db61e01de8663b81cbfd15859df8457314e4561a5d93cfbbeaa2cb2e7659560f0c8d3eea9c802931d7495473e002078413e179c8498228e51125d2c021210e304671ecf6866305f88a5a685d4cfbd89deec3b5694d1f1864567c07fd1eea46fb36e4015679a639cbd55ec081b3b91adb13a1f6a73a38f3a091b545b6863dd23e58933a8f1b324dd53e31dc30a09b9edd1b695ac36f719216ae06df4ba9ec7154d98e64bce755ee8d3475f7f3e68e8fdbdab6389cc6c1a43514e4f3ca0244dcb01864b553c5bfa6242d613106f2337cf42050c1acb7ec9d9e3424dc3eebc630ce4362ed83af19e51104d80e69d09cbc3ab159197a559c6fe59c243c5b75e357a852dc1cfd953fccafb788d8abb3998d5f354e915437e4d280e6da65624578c64f1ad08123f04ac84c8fcf792a4c48ee7c392ad0b9c8769d06bcf6ddf88c9b5ee7b570ec45ef13edca26d62657c202b789d570da6fe400706ec6bfa21d80748f62380bcb336468cc028567e17ee3adc4e7251ebb61c1322074f40473371d06f419256649281b1b28d792b06304129d41bb10d9baccbec27941347ad284ca0cb33680e6e5d3fce84d3a66b41adc8f0061a4c1ad68e287ef7404f228133f59b63e06fa22b9535a6021586ba9b4ee5217d20fac5f2c2ac22f8b4d0282ed9c6b40e6552d3f1ec4063a4ca23fb50ea40bcf729c4397faf02f3b57ad55442313c75d3067f006f86221cdcaac407fc5cda1bd9f98ff2df8b223f943023fd8a98304d48ae3242a3089b41e512316834573fe70ca79f9e3154596cd0b2184a376ac953df4cc330158c37183687a5209b54df76d000345ec6850149a941dc97af746565cd49c2f4e01c5dd04198ef136741dd0cfc8528f5b18955d36bbbb250ee65f40c3313024c705058dd81b966d298e00dc3872d02a97b051b1bcab13da84b3e5bbbb43933924f754d2fa9510d725476c97ac315e32657bc9955dd43d9c05ff3cd6ed85a3e1f9c292d6cce1645e4c92ae799b9adab47c28f683bd8798040513f52262712fb34e5549535e3ae100f2b916fb5e40cd8b592057a15ce5b135fbd4b52ebbd855d70a4a0084ad7231e71f1ecc8e34fbdc3d5f1298b30ac83067e2f13459ead111015e305124208c2db5da5b856d0181022120c6c32239c4c655eaaed5598573e1c484a316791b344b0a93d43920b659e01db4cbb36105ea596d5d07359ee8cf66793638f06c566db20061bfa619173c803096d7ca8040adec2aa946d00061e90003a53c5ac14184019400664a1525bde7d2f2f57c8a5e10362ecff5d4b2fc409a0e109831f743f5ba1a00119edff29eab72962502bea4508c5d3926346380ad6415840df237182a8b9f6f06389878462b95224ed238b89add35370fa78ff25225612b8270d7f0a7133c360ae41c4059f4130c243297aada6c08c5f3044be8538abd597fbab12c2cad60070beb9948b01c165376a070ede93307c19fef55037533d95726c6293c04fbc79f349fe6c1716a2f6e54cb5d8c8b01c6d1b90b551f81174110177ecb383ee1ef03c858103ee8d94bee6c7ae7f058702e4e0864c3228c7e93db05268dbd82acabaa6073c0f1a59261e1cb99d4efd7ba931607395c2dd9c219379927bf033f36d9928f00a9078d6c5899732ff32fac05422829a75adcee24753062e8b6620e401e8ad510cb09291e4f83d3532ee42f04ddd54e9bd4a054c9cc9be4bb210add4915b5cdabc4e4638fb0b32a6067b2938b67ae12e0243fdeb5c4d727b6c8ca14ff644b2a82e0e9a244640dcfe1f0e3a15120e47179b1b34cc3e31fbeb73c33486636b63c516bf95ae05cfe1ed3b9381216db6ad1eda1800bddd24913094c2b53a847e90273ead1fd527108f9c0b8b8002758c61b21c9f43db4ad99a36302350a0c9bbb608cf58727c687be4eee3caa670191be5b4aa9b75040fc26c0b74c087967b1e8fa04d7620cb9de3a67e5e26301fde0ea96ab9a0bcf373aab07b61db71faadab33d32d96bb0aba84d2459f03816cabf57a05b97a89737a6779d709b65c8b2d720a0053f9a390c2c25be7e4ce45db06e91f429efb08f2e92d1af6e95ed37a33cd7bec2ee22c5be0b4ca5573af1b52185bb616d14cf5bdb032a78c149517e9c551eb6f7cc3085223f4e999817ac7e51527c79fdb75d1be6259a23107f740e95c5a13e76bb203ea9901afe092d9bbbf3e50e587314a0b91d6cbed2c7166f94d1cd1cb7682924ac138825f39e6e5fa5d0eb3966613bcf92106239b36bf573b5ab8a8de539a3a9d57c4f9f4ec40d2246f9306ccef54ef4d707d1700f0fe5cdd5027c50c0ada040161d18be02d3de0417c803521a27630a587e251205997406aa45767c5a3372cb09b6df8669fec816084e7a348a0e18b75ff176b202a403c69c7b00aa5267ff03b29bec63a13c6060bda4e015c953d6055045383aa52275283e43209f3f164a4647af5e6c7615ce864cfc4127e01842f028fa5d41bb2284cfb43f4a0763ec5de3744e3feb241ddbf045da2c88234f4d4db88e5b70de0df02d5e0807cb59f0edda9338e339ba6700e9c9647ad98140e08d2470decbc4edf337160ca69f3b9e00ac5d0d1eed3114f584ff49e5e8fa960ea96f2527a87f1f4efc8010f1bfb0569388c79ff8fc7fa6e927e6f8d094bc1a19813eb75246ad87807796ba5c4aa83441111765fa3ef53905cb147c1195a9c8cee8ae50b46064698f92765a7368fc7651ea9b019db426b5235d2ca09e89fe03b5c523e2ab4cbe88533187f850c27d1e7a55c786da35f1e174391732703c86973e37992dff37f41fed182e8c4a7c23015c7d6f13f81092f55a5eeadce41a4d3fb6c479ddf0b255a2aa511e7c91c5189f2148bbd3b059f3502281a8595899284a1cc9d10938f525fbf3dafdc88b8f22cb7acf92e0eddb4753135ee6873b37652817f8746f3042818ccc6e5a870b31dc16f1537b0d3a0d9ebd2ee18239538a647fe173a48e1abb98eb5565e7ac03a44fc2316d072e58f27b096d04cc90db17cd3c8f272e3c88a891b4d3f18a50cd3c3a5668b90229baef505e4a7091d933f3689fad7272f99794d2305f387bffa67f318d0320175154a834810599ef21852ae52d5772c0388e0d09b5b3dcd1d09bfe174813861277a79929b11a51805a1d69558378742073bb171051603ec542b9904ac158ae381f9c5dd64e010729b4ad0eb9c79e138af1bec4e46a18f530ebaebbd76b219ac2107f38d38d6611cdd909816a7fa73f25d2fcecef442c5b48275e72976f86e1d1b4a783ce7d8aa25d062cb60cad87597cca6120c81a9c19ef343b53e0054569f6dc3c1bc100ef63287310947fa7f9e2c80de59c205b4e8c25f67dfb94c516ae0371d00a4ec8431322836f6b9b75bf5ae7b5b7718918481fb2722295fc51937d589dbf224689cb79c786e4ce06508941fbe0205a3b17cbc0b8af1955293bae15b4954ef11e3907ae42074823d96d8ef03a3883d61f6805def453775f4fe21e45190c8c54907ed4101e1d893ba93daee6b7d0cb4a36eab48fdc71803baea405942b99790d7a77c4e05752057948f3eee1da994791870936c597d2a994ddb85274fa2b6766073d0c8c201137fa6a8c8afa31ef6cdc219423a3dc59b39870554bd1808902e8ddb7166b684cf7713c5fe0e219f6673747490d5f13dbfbdd9dba4ac7a3c81b2f1dd8b315e85479580db208b52fd8fa016751cd41be198beef7b15c1ac20b129d6562e8aa2fe5abade1b5499aa85046b30f04f0a11d2010e44fdb0c58cc292d4ddd0f5dcc089cbc7501d4dcbfd75fceb407d4e07a83514907afff9ce175c87f00bd31072d783ffd980c05cddf8166fcbb5f9406b837bc0037890449207f0036b0614019859366cc9265317d6ee8398ee606e63f9420050438c9ebea535a741527bbfa93dcd5e33f81f766f9db0d6e4f7f48123156684d9b0ed56fc8d752b607ae85305d1d9c907ab3f09e04d7ca2f79a4ab18d04c786e9aa25530bbd3d7503ee99c616eebebef68217f3b4c3721ba081f33d7b9f93f883d4ef8987b93c19950f0c2fb70ce006721705da133c83e4cd05e9494cee517aafa20578e58e9f6c44a199eb927fc09f1532d67b43ef2481f7d46603a420d61e4eae7286929a125179cbfb7d57053204d893e4044ebe492fe98868ffcf293a3d62da0ee95ba75627404b12ba7f364328011fd62e2404e08ae727bd810ce2059eb0f059b4cb6c66cd1ed3f927e854ad9e1ee9c48032f0fcbc8e6afb08a3b5f96ee571c6971273c28b54f9a7a588a231d7c36e269b200a66b86400f0112751e0ad90da75c835419c81118a289ef6680bc6f1f98f99468f07a237324685b848a0432c12f16517a8ae061ab69a76518fbbd349b1ca017abb25475a94f583cfde920b4177f9091960b2d7ac04e29243213e1e54a2c82b781c227ad5cdea397ec19819b2315299af3e75396973fac2cb6dc5c123e4ceb98559026798885516874c9664b6fa90827b3c5bdaf86fa0d1a3886b560adc2789fc26017efcb305cfeb2a3942e680c791acdef752213555c593323060350268dfa08b74c140687edff049fa2c4cbe12ee12263f85d54db6437d15364639e38c6e67227948fcbc022353a67c4701a499eff6a85cb28a7e752e0c708f15c6d4dfba4a8fe0435f6230325cf98e0a9e80aa806349972dedbe233f88b4240f1e1728cd70a5b8a5e02df92fc5a8c7079b3d0a2aacaaf9e3639707f2d9a9eef4a7a44704d2f0f863b7af8294bbd4f361adef2a22d1687d1173d2d5afb8f580bc9087b1938b9803a4539bfe7cf61c3566a0d2dafc0ed7ef166098bd0ad1af6a1c31606d490bd9c8764a2f22845fa1387a1d2019609e7e405d9ea7640abd172465d9b45305df1c872836ea5d90f1d7c3cd4106e9ffcef4d586a8a04c62d125a06c5da8e7f5a6f2f71f438f0c66b38dca4ed344e8f3975f3979f936028c9cee091a208059a3fedc90ecceae7f4d4948df51e9930175ede9ef09b552c74f2c9572cf2721846320c1c43281c40a266ec2cc047d9e8e20b83ab4f4b9ec5d33e38888c26d2d4363c2083cec562fd23e06faf15429f2379594d974a4c52ebfcca912e921020633a8326ea5c83f277f5ce7d6eb20f5e3d3f409f3e5db806cdb0906e8f5fd357ab9f88a5b07a7335b2529a741ae3e7aaafab0b61b126208676bb316da7ceb42bae693346ea7c7b559a3131ac610b16edb7453f56d23703052a52c1f281be37e3836f4391403961d202a6e07f7e06a06207e8e4d8d93fa07074470520bf5ad4fcd2e9b5e225f0a940847890b9bb616b7451e2935fa64a8689d5093ae27fa8210d84070d6e993cd234ffc4645b9166a8b8b14a6862761a7fa246666b4ac0d822755039698de83828b33d07d17515e7dbd9b088e4ce4921ef08c18b149af8fd2749c96095f485bc0d2d83e8955d8276de885596f77424982d8ed8c8015d35688e40b392103381b935ff8b416f1b4df221b1212567377583aa0d994ab84d05aa3c400fd1618cc26d0fbf7feed5ed7dc56f256146e15acbc4abdd2c77a1a4f4f49234804771529205a508e5be014e7e2a6abfd4f5a7007d4b7ccd60197a927222cbb689da7b19d2812b716c01f8fdf91d75805269cc5aa05148a9d9b580f738a1e9d1eb5ec46a0028ae83fdef1d0f17181d55adfa8cb13241126d3b5645158cdc10594b50579b6059c6a00371a7a198eb24de20dc3f5dde72564d6738b95e6e9ecd626434456b7d3418a3a921166a5a334d5bc2e65d5866a9c19edebee83b818f2448d00b8ccfbec14f078816136afa4768bfffe600d065aba5e72d6e57e39edd22f6ef473a02f431220aafcbc8d2fd55b150d3c7c916bfbc0d2aef0221e77dbde933ae9a009cd1201b5eaf7ada0a2c793b1d91540ad080681104fe6463661c0111df6c8cb1b66a72634ebe58b9349e41989566d984886a2bdd61e96782c1368931d0983cace20d4f7cc89ae36ff0a5d240331195ce4b161716e680b1ee369121d380cdd9b5eadeb4a0680c076394fad2dfd04ad9f8d33992217e60480d1789162f31bdfb7714f304ebab7e38ae196b7ca951d8dfc71ed951425a6513af479ad3f927cdb241d5b0c3a08f0a001397f91e110f77bfd6e63148fff84a6bd23a423235beda9b3f881b8f1ca4fbf898851af625d439498826eedf824f2ead97596a527759282c3a424cc05201a1f9a6b6db804f69c7ce6b7f6b7db57e30d15e22051761427b256328cdd9f7f6028816b5e0d6c7ac12c146fc2a8b1a83dabac1dc03bad4cf7f154427aa442f5da9d1ab7f0866079de2ac4ab9de89610ee723b007ddf848aba21eedd058d48804d2a82099b947a855b0a8b44b55db3e977894e73459a3fe09dc031511dcc53c5627ac3ea73a53e4b0db699ee780e091b1d73657ea88d3b15e2af2bcb2e14965d022789956f461cb776654138659cbc04e8eb1f0b388acc1559776d32eedf3b0bee205fcd6f2e1b1933cfa5df6f5cfae3fb8adb8ab830b16f743e3d9256d6c8f965cd7f8a680fb0d836b34cb6f384059fc08cd35ff724ce8c29561f841dfbe01710872ba80c59cea83a47495a0552273c2e59eafd2e52b979c57f1bc8e2ef95badf9528caef0960ed86941d911ded459e244cea9268a2ab61ebb564407b260776dc768d534753d0e0c647bbe36a60afbc674e8cc0bbd0f6bbb4c7df1a88dd424fc9780b19025fc6d5cc01e3db9d8a913df55157e4b52914101651c360600eb9db4d8c6863d7dac259e21cc9cea520cd713d91dd5dbc83a31fa95d2ba749fbe4e6c9b2b3f30e217394570733363569c3c4eecf9dafc65e214aa9a631f831f1dafb670653e342cffb9f41a3dbcf9ac047a3cb941f3fbc82551dd8ec583559533955f1bdee18d5ab6c9dd9f46957d0cf21125fe689f389bd39299608dd859c751ded0ae889a2db6a992eaa2322bd120246b9cb4ad594afc4ecc0d7610b5c9666fce68a8f5937bc44c86921a661d2dba849a571e59e0b7735a0cabcdb3ad3b170e0a74cce74b7822546aff6eb072a69ac1b36943b9dcc8b7f0dbe8174efa850ba2ef019aea89c5c47207da0f6d8d8c8a8921fe713050518bec41323251e92bd5745aecaaf80a437eb9677cef53179067aaad3a12ea57793a36a84d30b74347fb8ef42c8269b7a927910241240acdd28290310913dfc8d46f135e71aeba8fc0e102eba796c791902658d4c2992e32b926b4b9cd5958f66109003203237160ccabaaa1486a89cfcf59fb4557af509ecd4c82e89fd167a2a1aa94519e56c8d699639c4472ad42137044cd68bb927ed8999f859a16941a27d7e28f77b3178aa5e57ae067dd37b04839184ecd2520818df0b4a3d782470c22ab842424db2d17b7ae50ca3f01d902b803bc393e9dcf50ae80a64a26de24ef0e53e00e69a0bac348cca10f7bad8ad65d4908c208b692e21050fbec9b3ba3c2fe4ccafb2ddaf2e9e252b85a001bfe243d4d99f3bae25ac75767f522bb70b3033e3b555f25ada13748557270cb253e17402e9a88e0f5f04b77a56a3a72610846854f2ff2b5ed3efc5ec3d2f0105037c3b99e0a56023e3cf55a89f7336432f7042ae36bf7d67108cdfee3896860cd176e16052a8a54a3b4477178948a970ee176d03bed7085766b34b4e18e131ec33099ba1f5f885e0e71a1253615f89422c1ad7a7cc26d61cf54745ec0d240dd6d246b312a3fee29d3c3ba17f392f4bc196d4f3f6dbdaf316e6120ebd89dc50dd8e1fffeaefbf405a2c96e14a883772f07e2152d07e3deaa68cfd2f6d0f67f9622700acbc357c2371df93d4fdc5cf7b4247ea85318555af4a39d8262ef85d49b83bdbfad44cf4081eba644ccd049b4a189e0188370e46a35b7782a94ff17067b846bc7e866725bf7ffaf38edaec8c4fa50ace26cd74c6c523b395e4712f1c1ab70cacbfd39bf140a3515c97ac75a769adc5ef038f2d2553d8d489727ac1a186d7a6209b3c55fb8f5e7d248500aec3a859d5887c0fd4cb3d82fb6b0c0727cabe22ef2ad57a99959c6b52a77f47e2205305ef52305a00afd915c6762c2342079e9234a0f3b5142554089851caa8f441222fcc55e7b3795c48b018787c0f1e34f206c3d9396888615b60799a91f2749f67bcb3a626f43d6ea756e8282874af37c5c7d97f9412a90728841dba3acdafa4a6f9b16569e9c36266e37ba96bdca183c80480ed170331507ba6a4e363327594197c306e0f682096da021922665565afa47a8854fd75d6ae02c7b5cda07587878a2092adf2d96a9d7784354cd8d6027ee23bbae99960b99b336084daa36862db99588cb40403398e70c5ebc30877c124a9ae688a1afea3c427cd58d1a3158c06b6934bc28213227bc5a6d55e9ae22165e10f78a7a71adcf6699f8a8e95b844dcc8454a7648f42c0a72a45e663cb8b11f46cfc7c20625de8efee7856031e7fbea91b8929c8b66e27bddfc99def3ae234724fed3bbcaead8a558d604dc6e9dd4c3c75e1f52bfbd6dadea2a35854ee397103b0a0d9f0e95147855af176fa1dabc97046ddaa9a352bdffb65f4fdd41e451a8a6ef59918312d8d240c25fc6d1d974f4ea136e6b3b6963a4a91d78c77c221b8c23a816b5bcda80cd9665cd56a53cd4f5d1c64236c1d4ad4f0365b0db1d0c2fd11735921c6c6899ac04fa5ef895a26dd87bc1122e307c17adb919665d350540a4aab2df91dfdfc8208e6ee72c5178ba6ae32390f57551561d611d8007693391ece567db01941b24a4656c7d5cd0014b7accd2d679d708053b6a2645a767f01f02f9224023f9e186897505f5565f85c898874dd7f997cff47a3ec5988a35a1ce5456e0a8c1bb88ef49ddb7b44ce8617b79fdca1765deea7c99027c58032da88206702381ea538df77c1de4f7703a9ac9baf58ecba5a51436f362f7a0982a548e111ea076f1154ac88283ebb0fa75c12746036322e250ac8727895b10ad6a7c46ecda8087e9e92c5e83914893ec9d74abacb3d0d5a22f2f507ae988a60d825665c8790ca2600e976cd2d76124c6394ba194c1ae0e0a07e629de560e7de65c72d321d16e761b0afb01300a1ae37173cc6f4d791bea37b81cea83e12aab40413b4e7f9a3461de96781032bf1b8ed76804b93dbd916a00d0d28fa7aff66b2ab57ea07333b1ba4f0f53e3085aa39e58a7405f9e3476b528410318c08a24ac2193290227f8873e548b8501e1c4a95cdcc70ea24ca9a33ed994cda6bf3e6c862256927eee624ee1e8c5bf0d91d50d70039d7c715adb85be9f211c04890c3f881c3fc416727e83a7698214c6f856d0c81f92158b8f5b059fe3275d88bc0b95b986fc632dca1e74b50aaeccec910e4f6fb6778f4f8946650d324a185ac28bc7f88d477f5f99ae21d623ca3721806157bd4560c835d0bf93310c7341024ea93220c2475d9e48f4cbe7d03c2f61851b6c1708e7a7ae1bff1eed514cc0b8b042a867639586e0aa87783ac2a039e072588cdcf0414edddaac128f0a934543951b64d0075eb22f9714c43c029c0a0767e657e1c98e29bb4e81aa3523a5b1eb865ccde01d8a0410b7ca744e4bd005825406e81047b07bcdb0909da182028253cf99d9e44099cdcf91d6a3069886e9df4411d8b29768db14f48e73e048d9d0a1e0bed53562248c4254b88fc843c5c396e5235a98330af9e01f63fb390983783e54b24af452e717ffeaf064194734c35c989133a790ccc43d19e83c758c1813ae4ae05f98af3ac96a34de621253c38adae234bfe18e16e32a1b6937e683f4a94929796452b999afe6d8af14cc9e22e1fe6215578e92594c541ff0a09c9dde5b7a2ac090f54ab928c000702873bad8890c70691e8ec9e904024b20b5dd0a024a6fab90ae940dcf3ce7c1e8f5d875df38181b79c95684bf2e9658937656df65e95b68267b78b1c002847fe08662d05b9abf753fa6c19ad11e1429e262dee776c5ace58809f381c99f502916d484f00f117103a4096a0a4e67aa85ee00911576897579fdfe1626c90644effdf0ad4aec8d95193e6975ffbc293c3d188f9a0d1735214d0c7f443f3543c4633e0c2c8c90f2f56210b69051a81eac49c40b4b9d078830b762b1dcba70921418c004e39010840575af3bab550046ba432f549d9c23c4de4e01e4f7e7225b687801982b372e2201f542b0dbe84db0574da13dd1da001a61a4ee377d3ac84a6654a4984e197fe4722ece83acb15273014c2fdf71915daae1f726ce2367f1adb503b155ffc471bce4c3f3132536ad72884a89b82e447ce184c62ba6a812da448971b6d3162183e0e8ef1dcc6113a8235a1edc3ac4de011f7c976839dcdcdd78398490b8f9b7ec1ac649d87e5e10b7c373956c47d9d18872226924b7c1aaa421e57e1dc927191ae249bf33f20df10393abf9a333969ba6133a996625095dfeb5414f61fb3040bf1f5e7d637c7f9dc3b0c72f3d2ad7d722182184db761e42d2ee05b99eee4b3c5a5db540f06c28595da733c0f607e48a1869706861ed763cd25dea2b2e5440ce4c11154a6fd4256398e9aeb3736ff02f098c1aa951c60a695071fae61b1d7b0e7dacc367a49c93d1a78e539da597ffd141b0ed793f5768cdf3a1432283bb68e6592ca874ee31b576c080488ae0e0f8699e34e15e26a396e286baf035f07f34956ed3bc7d50460ca8cfc1d102dad5f7d4e08e81428d8c99f0a448264db8a72e839140d470c3289124474b541d78392c984ece1e35f2e68318bdf30c17567e59140d31eaadd314a546737a16eb4ea66cfc43bfc06ab527ddb733025711205f96775641489c427d307e846c1c7ffdd20cfaa1350d9d424400973692f006cb7810a4542df37b03ca82d55582041f6b4224ba64b6810736031b4d252c6d8afec82276a62cafc625eb706f296f5bc5f32a2397abcc53e0e81d09ec0d96bd5b709657d69f5b8aa9ab8c53afaa077b9a23008cca0e789d6a3e2ca01a1f2922ba9ad23100f4bc82ab22ab14e311f661efd3cac4fe253ef9138fea07912bd0da72c3e9d91a5c815dec34687bdffbda48612ccd40f9c817bccb6f454e794c88a1afb3b758289c2dd7d69f0e416fd71d0751bd9bb29a0212f83d612aae75f40a72812130922768aa808f3d7239333247f4d609457e01df3224f2348b201142a0da9f4ed11556f5215c293429fb1f4fe4123a67254c42f17b9bec135eb17873e8ccbde4c6cfd6741687ac3da2ccf3f3d3d7bdf849c5f81b229f436f0832723c76dc1b208b86ac8bad98e61f7b077a6630fb206129df62921a9ffcc71228369f0694b0297c8e70d6029a83f582b8bb8a1918153f16921eddace4fe3df6dc27ac1e051759ba9203b07ad53a9149b439c321bd923583bd27af9c98a4dc840994ca517434d886266e17ea184a056c01b2b31096641b00df942985f0d5aa5d0e0274694b2db201551500c39bbf31c6d68051b7e3ef5376e087500b6c2cf561070486ff6d53f4fbe85d0b848ce13330b719d3c58b9423c903706b6a7c870136b5355c8ab814e76146573f84154334861bc02f528039f6ad16409ab8fc7dd234be481576cf6913f30eaf5f8d600df406460d68fc2f3149e8d60a7a537597aa355886664e7a1d10592af72594c256946de1a3d41c852ceea200e184e58197cdc63805e2c3cf176ab4e5250352ad6a9491a58b84d705cb74ee1a70818547462f355a88cc970a6eb49844d07439f1963693ea870df513a6df9cab77bd26bd096ba5c85654020acd8d2d681683d00d6e20eb06ae018f2ebdb6e37b017424b35ab60b28872b1dcf424f029416878e36c7a02b4d1b8d84c9f3b9f0dbe66be1c9bf501e0e3a4da30d930f9d39502ef4d4ac10d06835bed7a4f7294ef403877edd5ba2c2fcbab98d61b2dc85e146cb195e8b2326680d7bdc05168c222dd491439b4d3cc0b32af3efba93fb517b204d508bf424e75b31b377bcde66058ea2d399d1f4a2a17bb3d037a61050d78f651aeee27d783b5d435bf90f3850ad69c90b28afaf4be2077e854c8cc207cac3067646e8e4983f9a9e90f8e678bc20f32374b100ac5424e0ccf01b8e1743f015b98829c4d3e829d03cb2a3e6c8157acae2b0c9bd894c3775f21fb3bcaa9fd93243123dc69e81442271109ab38c2d0a917438f539ebbcbdf18b2c05df4f494c4fffe644a7b3341acf1f6097d71a84b6055df517dcab0723e96e3c10d27380d16fe7fbf125f3dfcbcd0209f9fef587bc97d16feb995c31fc92e1482eeee20400900c60977e0e1a264de43bced0944bf154030f798dfbfa95793c5afee5dce8f10ce6fa9bcd3b11e6dc4107bbec25fe106c16ad710bd8b4007338c0f7ecf8a0d5525d80c5cb59d0b9175db201cd122c8784c79882af17a0b2128138d2e2844f473d9503624518f7d1bb8d6ca03777285a2a0fe86cd0275e32aff64b4c692ef220830a529682964a321c55f6a323bb53fa27e232c289553c3aa4d82d66df96f4d8e71c8ae82dcde8db290e23a5c2b71ca62e046bc26d73ca7566bae242be2bc4b08d988153cb95c4cfd94ad2c0a769e153ad3d79046e6b0019a42becc6175cf0d1d3fa0985ea198b5cf87e429d11cbd8d6338f857a526496244929bae9d68240f0eac510a7886cdcc191140c1300eb63c955fd40e51a6cc8fcc0eaf5218aa816c0e00e5815b43b1135791ee5f5c0ac40c47b932572c965cd4c55ca32e25309f8536f3286e16987d911795a197946a0ba45781a22cefd333cee62588259b1998e31399af4d05f39029fa698efc3d8aa82fc12dcbbbead26d916df895d13166fd2c3533668ce75bbf10ab156763fe759841ce37c42b2dc36e7fcda132b323ebe83c10476f2ef82809c78efdf1d7b38f4696ca22c1e1dc1bcb2c415b98a88f2be2bc2dff29bd45728ade95c2e8ba12760173d27922ab1c9648779e09465039c3b9c0ba3130a321067694191861d431302a6469546ac2c521166e2b90e12592f68b6431b73900719be4ce3a3f2026ed1726d32a168834bd47ba14413888dd4022e881c82c4f8de72bbf7b782fdb812852b4ab3b637d3ce57ed4baed3406030484f649a7813279995c1d1ce55306ed0a07a7ff9222af852134aa000b710cd313089772e1ac22f47129c736802d5cca819dc98ff0c647ed18400ae9a5df77a5bad84ada39cd24561d1882c49c5d0b2b990699536a9428431dcbbb5302c474c3904ac1052290491ffc1438aa796ec17f2b867c414148b99c9b2fd3b526c886f7380003f427f161a8861b04b3d3e7952786a06f125ed22bb3b0802570da0ae4010ecc502e7400746f183f598f3c91981f194cad5d58ac0f4a380927deea96b95335aaae84425d45ea79b9f34b61293ec40a9f72cd0fa9ff1b8c5a96b830b95cff5c9c12b6ae0d8d63321984dca8bbda17281840eb09fb195fd31384dc65e24bfc66aa4cea0fc235bd11a5cc11497f8c0be44bd54b26d3eceffca6da83835fc30d10e085fae5201f50d28d31367077ad331b56c2b5637dbfb33dc5f600ea491f197242fef6644af9896aa177e1047a70529bbc3c533fde0a5ed8d12068bb39eeeebb72bbe99e1cbcb42dc635b0d367c8fc3dd07bed3c568df6536648d798ba58ba4690656c0b9c3b0976ef6fbe4fb5534aa5f1e3e24b3de03606c9deeef057a79e4d14e4e8df666a38e55091ddda1691103e1e8747a40f21200ff49bccc8bb4f593c4b85424b6a4c99f79bceb325d4b660e7167c8a820d17cce3829d5c30a9990b36b88cd4b36023343220e125c68d2c29fb68b9f5b00be6ec4198b16a7b61dcafe1c1c26491d2cb86c032b5466b346fa65dc2c34a7947365990fa02548c42e0079e710b70ea3865f2714b76281dc1887d8466792850ebb7d88b4e94416b49aded7b89ce484165bca5b47da73def6dfc82e698745a2cf883c8279162fee14f1239dc0df9df6e8b610cb038c0ee15b06bac7205eb5fbff75543154b1da720fc69faf94393026f1331103a365ca1780bf87e953aab7efb25283063d84f01dd6ab8a958663259b038feaf1f0adb09d17fc19c030820c969aba28f8aa9d9d13ae2198bd44a61c2f2c023c61ce45dbc5b78fb34ad420fe9a5d814972ef590a4a5a897296a9c7f001e90c5b360cae28fd2787b9ab37d38e796049ae8b0a38e8802ef36b4ae203df43a808f140dde7a257a61602f58c1753483f50b92736d11707907ce7c03634fd40f49b1b392d62857774d23aed0f0eb465cdd884e8a845eba12bf08d65f9db78c552afded5f1182ffe83049050ee80e538be777bd915ba3d4b178d5fd8058812b63320050e2599f448fa0c8ba83191e89adfc8ce23eda411fbd7cb4c31861183342ee7bba1aa42392b60729827495ab87cb5064e44aa24dde418559e5118a683e6c530a684a17fe4f71f2cf477e18ee2d1174c3fdc1fb1eb3b6fbdaa0a3b34768cfa154c90d1fe98a84c48d00dfc81bd4b74a8f7bde45b300e455df4c0dea3362dc843cc94348f42833d4971e8cf7438a25ab9f32e7c67f0c8766ae78c8ccc11cf4c8354397793af2c5fd1395ca1189f90ba549978896f19b5c0fb70536e72f9de2330f975ea5548fe086f3df12ceac338f6010007c71f515689827506c503e49ed54061f31f2e4c117e7e79c58cbd489e2a45ed070111165d44d01b0ce116a12e5dc0cb2d7dbea42a2d1d90cf852bb38899051f9f207491cb956f5453d8c115c88ca2454ca4afc8af221e568fe156e82621db782536d5e827b3d78f1defe2a009fd050baccd09cbe0dbd8a8558e308101735c01d849bf55746faad10b74aa2d3ceca523a90673fb1772613a218ce079e2e9127a77096838c254bb7893958802e5e7282805d3e3e8277d92c3cfaa8a1f804b0975943081f3a6cb6c58537948408d6970ac38009fb0c23c0e583ef6cff8a17f485fa1fa7bcfd08ee747438f643e2c19093f90a430f469e106d5c3e8c95a7d1ecfd49179a19be7991c13d18bc17d00b710c6af67e468b27b13f049cd6f8c4d10163b334a21b47022bc077ad5c48ab5f9a20d0ed97d206bd6b3b6d5cf9855c46806ebda27b47064c832ec1ef30ce9ac6954739b43afc8189310a60e7b4af05c4a75f8715a9bc126614a5b0a2b62cb86eab29da8c04afc718b455c44e0438b2f9cae482e48c45f842effe328ccd3d076021fc97e18bb84e8579b43f121aa2021cf1b457f12b13f87ac40276609914ac641cb246249d4a927563b9a9a1e886a69f8f81722c51a136c4913091e6ecae819cac8f862ac4db32a9cd243372f8ac64f65e731058d97a42ac8900a7ea36da219963beaa9fef1af7689c9b7dbdb0ed14ebe4dc6bf802beefa7b832c2f39c45f5c2dda8ee437af5d47a946389901c70eb5b0114caec42b0861e6ee2507aea928bd9ea90348fae439cca21f21b031158743194ba7054525d38b4a50cec0de18c951f218f52e65db05dd6a4685012c9355ba062f18981a506246123a46b5659b99144e24648a1116e79130e22bdfdc81489b8ed0e11a7cd89e546e3c610ea9754ae7cb1593d2b9fb39dd99de54691911cd647ba40e7d9ba5a684c68b84ad0f9cb88bc225eadbd80302b6bf602985f5bfac16b1823683de25c10c6cd6881c09783e60d4a2ff7c1a9a491bb82ef602315f595bc323b8138976fa7b2f8271332cfa7f4fc0a85ec55b99be25baab2be122ccd05805c080a5b4fa09cf6c9d224186fdafbf0ff388675d4314f8714b39a0e1a4961dafb8b83b675291cad0185fbe2faca38a745e17cc36ede640c297154624f276db596c011670b13fb25e432ed74a049f409e5e669f9b10761a9e6c8132e8a07024bd0a14a9059a122db8e4276cb0f9ca59002505005c90a1f35b60ffa764e0f3c10a753ecaa6763711e034e5d9e4a9f64af22c9f3238e1be71907a0dc99806ff8b009dd07b26b7ecf4beb9a29c6a736864c9b74128afcea2573c610b0aa0186425f98113336c1d20010ed32d2c26d548952bc8bce2e74c5062ce2aafba7778c0bdc1dc15af05b0f07d1a835d4d92f99e8ca20eec8a955d45a6132272cc33a7d32d647b19f9bda45eb462c4245d6b9c1a20a690fdefad64ca1f9c81ae4f3abcc9b96fcd9f0b172a16bb7ed86a709b94ca1a7b996a1a51974f36d378fdf320c8af68be7cccec1a97d3f03229a6d0b54bb5f0ad408ba9c08bd91db76cedd80589e2c752fe13aa384d0ee688073e460b4019cf5a5f6c0c137f46cbfbc2832d74b565b3e822ce98cad67103c72c5ef391a40ef0090238a9d2b890aa6fec5fa8350a5a5207c92ff386e349ddb451e60baa460a0eec4ea5788c94ed74d210705e8ca34f9f0ed82968331f45de8f487d6c2afa38d45229b423c33f0578b5e234c150c4d7a2ceb61fc2aa9521fd620ed07e64371e1f223efa0933c7538d51197b2c33a1c6775a200c098f10de342a494c74492db123751c8ea90c24dc5a9855402dd37ea5cbe805e083ec7b8e0ee4362fc65fc9b4512cc2ae104f47c3983aa3cdc0e2f476d34a1c18b7b0595c222ed0f0fa6bb1021b421e27a5536ec536b45b77f3b6957950fc580f441286b8a5693094f7f8647b9b12148af8272192575d29a06c7de7a73bd4a353800e023507e449e80fb05d6cd0d289e8ba5913396b197a9c052d84a5e46661c5ee7d5ddce74ecb7c092c93e337008da8b4a9528f31a15fe4a64e0f274604084e61aba045bb81697fe69b10562aa36a0434d73d0e4d8db4d3bfbcb952c45b2efe62f07bc58b4c62d3553f212bd1090dd216471e1d87a75eccdc74fd5e7cea06a3b946197b8366e2a8b07cc6295e882d8f0abc671205320d98cd424006bb8edbf83816d1839e1732a895d8e70aa954e398343eff3e8eae55075854aaaed8eef45f5f3e7b72dc6fba7f305bb510273f8b9c4fd8f8f84fc570bca90bf809bfe5e15152eb9b8fadf3b16d90fd17332328aa97fb458f65f1ccfc50aa691f4bfa151f5e1b16662d69fb61e23729a0bb89acb3f60493271ba1495d0d29845dbdd04b4ea0aa06025252973bcbad86d46faceec8c00abce72f974ffd844a0e8f57ce914bbecb221e89a5ada893c2a1d0647d1aba5c25ea21b86b897e0aa99e85705edcdce8a6f0a3da3d3130ca07cdcfbb7c668d4e3c465d60e1a396c530fd931fd8c7201ad746a217c7c35c570e957f9ecfa1cfec8451ca7feefc3c56b55fa55085e09b157f7df2e873a29c53cea1fd4877710a268dd80ad358abbafad176adc5e4d2474fb608944efb73de22f99b64152444864cde4ffd5a4511062f158827c20049de6a0b3200773ebe3ae51bd4fbb26dc91b5de9aee3db1e140cb3c77dfa84f5dd22d6719e30c3b5ea279203bc63329bf14990f82eec979124c7e71f2a0a6084bf305a652fbc3bf6ef4964ba5fcd888a68e4be05c37ba00f3c1154a615c4e111194ef41efedd19cef4c48f488e54e1b1959dad43c094c2d35f97930622b5132f98a84e258a4c18a6dfde8a87e3737fb7e15ccc78b08c9a9c971d440ffe3a6e9a111facb6a17544839ae09fd2cc48556638554e1d42b8b372622d378eada661ed4b7896f014d596fde923b2f61de8790ace7b3e5b1a020ab0d866314b124f551d701bc9e9f575408af623b037c2669d128efcb1c3ea63307febdb42d78dade1e2a7cf00384e9d8a71e036f18d94e4dbcdcd53e983295b9763e543e37add07c957ae7c46c03947aafe3b176733ab62d1397799b67ee1d0ec9d08660587bf2b6a05b8b4f441203358ef2c5f3d50796b1a550fb85eec63264c82e78813a9aae7604c7a4b925dc4dec1aaba07405c7163149b9ca8fbf04cc5d2ed381b705b9e714d1aa1a43af78b1bd10a0cfb254b9df404d70d3936a5cd0638bfc75bb1724ca69babda1f9b627b85ca593ca93620ffa078d68549a983e44e5ec143a826bf7a4415ba266383fd889f4a61e471e9773eab873ce75ef4a131db702168cfeaa8010e59c338967d8554b311af570a7af2dde01c63987d9f683f1bb91665f0bd7dfcfd06fbdec03c033800b356435d5dea60ece550b4b4d0f27a5d66cb5b39c4b08b617bfdc73ea66146912bb9491361d9f2a57c032c6bbce736e4778f4f485b997d2743dd824c59e56379212b0d8730f0ae5fbb83bd168708d04373e05cff77fa7801bcc7afc8f1639973ccea8775fdbed9872d7d90a3a1088c636df6b182104b2493f315739d250c6d9d01d19fcfbadebe077a141f98caae971372e8d12af1e0402186afc45410e62eb784a9fe0a45e2875ac455341f810a58283e99854e3ddcd981b6c605f74e07d50416f2629eae544c950ced1c55670983bf23332912311705e29921d1224f7851a019e1f58cd16109a373a4b69881c46093368dd59992825a1a1e38e066fd7593e2a27011d5d0eedcc013dfc3e853253265952e8f2170be46c6118b046bc2092469422ad3b1902e95b7f53acedd0a92758a6af363f9728935d5d160171ea7d60929019847d304db9adcd114e7e61438287f1cc17537a5fc2b9371b789266949e61a5175e61efd107638fe5b6cd97fdb1d056d3fc408bd561acb40aaeefb3c52847f60f62a8392a2075119ce4b4718994bee37771db351d00b3df3c3c92e08fe6ef984df3732c32a48e71e31ed8913a15593860a7c135dcfefb7f0a0d78c24e46861f05ee45ece614c2e200fdd93a2129f1d7a669512578a1a5cc09b3a84a0583bee07c8e355bee3ae29300ce05ef96f47de75344c9cb3a892d2a33289237a9ef95167623b2166f66f7b6568ab53ee6206afb3d461a7b0ec4004cc3d825480c70896b3abb6bd37671fd41598c93b505b6cd6cb8b8b762006631daed7a1a6ed7476424a121c4183a04214513d0edd70b8d57aee4131d74945787ca78c4b87d876e02080649d2bfa6f025c5fd8f607da9d8ed08d89677680c9f0e70a7021f15c7a2d2950891ff216c1a089523e0c238677c3a1191c95b3cc1e63924938240de05817e2a4c76688504c357a7ff856bd5d5b2a467a3aa0582a8126381e553810aef50d06d4585094d97b097dbbadac70bbb1de9c58f9a547cfb1420e471cab5d098e7f68c35474db987113c6118254f782ba69ed0ab487421606e82d4e689fc992d3debe0dc48fa1f5d879802ed92f5a21a84ea417ae2c9c14ce1802d18306da74788cdd04b1035053d63c4e193794ad775b3740dfeb09e864b6ddd70978bd1f3f0a89bfbd0d4afff08ba3a51b8c00fc8f90b84298f4e5b47fcabb0a28967d010a04cc43cbfa7c7e783b622794890e0b688d4274864793f7c5bc586bd8ad39d157a50ecb6be447c1811a2dc878fdb5f35de7688559dde1683930697f6123da340a9174aa7798ec43d10369582aad09f9a059084828ad205372661fb5976567bd62673240416e56c7a22bbac34b323d65e31d874adb7afc8a11536146fc7fa09959137f5146ea1a225ca964caa9f20649d7f6b083a37924900cb66fb83616867ad440cc0355bdce3202c703fffb44ac80a4617aee1f331420b077b2673e3bf8c2c13619ed2290556aad5702dc92e5f8c9f21f232cf7d369d8fe4a75929ebc0bbe5b2aa3c8284a9a9e181787b3b0069403605bdd2ff92fe33f04c0befc6b6d9ff7dcdd8729382e946d2e6dc0b460f7f536f19fa7b8111184b740c917c8783bbc1ed86ccc2de416acff33f8fbb970a2c7fef54764701c30de47ae7bfc7b1cfeecc59931886a1d09d9ff09de24d6d4f90c1cad489c44d67dc8842476bce08772efa1ee550fb18349b69bec9573caa155f01f9c9b9772449f48c6159ec4589a6948d5b615959871f7412f98636f946143aceac135fe6c4a01c00b5817dc60dc6b574f3033aef26965820d4aa510711fe692fee95efe4ad7bbad3139cd15d10c452744fde1cdecf2f7f76241df6b3d206607be2330bc1c51eaa60becb7897c32666f43b203935fdcbcb65c2721850de4bc1938c7d3fa234b277932db79432a524035a093a09e108a08e7e337df29fdf0e47ec3d2106d1e627827a25f82070a64f3ff01dab293e5e6035aea39ae45929893f35766a3eb531967cf4c99f7e566c94dbd350b72f090b2b25ddaa3557497eaca64cd06f9f7c0ef44de91a63a9e42c3fb1aa342b9efc5bd5a3c7feeaf4bc607c47a4f1077dbc0a6f2607ee8f1bb340a2cbe59f38a4c109441a7f47124ffe34c493c7933f8e8fb3663e25ce2999604253900b75dbd703b6a215e8015b55912629fb30e574d9fe4c9a6915974c6ddd35f2816b13e07859489fc964b2a4642925287fdeb7d86654d35c6770b2f329690559fa84b2cb8d4fbaa3feb4a9a54f4c938d67c322b3dced8a16967b9bd9119a0225081814e1e40a1f963471042b46d851832478608355af410412479e64494111aeb86396c6aa553d2d60b245184838d18554c38eae45259620e8166708417530421545d0e00b29b03859f510eab8c285176bc011854e9d89311718d06f8b507a93e846594e1d77de28cb99e386a8cb9a0b643e48b99c88c9ad2fbb74ad2f7deacb98ab405fb9af608f1eac8c719f6cbd5ce53d309f9ba555328a942d373ee8932c3fb1cb248fbb747a5e3ea1bdce7ab564383b9ec313daebe32f99b7762e87b65dde38309ed78e8e4cce9c5fe2e4e484b6f59284951f352aae4bbfbe7ced25b7ad366c932dab3f6d523501b1eaabeab8aac9f65375544d369feaaa39ae6ab2f5d49c26dbace2d496ab9a6c3cb5a56ab2ed5496f6e3aa269b4cfb69b2c5349f261b4ceb69b2bdb499aac9a6a3f1683bae6ab2b9b41d55938da5bd4027009d20d2c8df723419cef61b186ab12bb7969fe45730d46017d4aaa0d6c692afe970f335185ab7be84599a2377ae6cc2ac9d2648647e924d728835b901d6c48657131a749a1471e5b8aa09919c2636384d6a5aa8c96a62faf1715593f7e971559352cfcc554decacf23491f4ab93e674aa74e56b41dc7843eada91dfcb1a56d484cc8817e7bafedc7c9b6e390f833289b75ce5ab98f384e2441afff823351908daf12cdec3cfb984203322090d843223583223702e77777b115864456ce9828b33b2e377adea015bc59a0514244ab8f1675c21de1863f400cd1ac04f0a324360a28a7bfc14b518535b0af40e8583f07b65cf415fd7209a9c88cd4434f16b5fc7209ab86f104f50788576c520fc2a20e372cb8b9216b6adb8fc61e5252ebf04a1b41291869db05a091be2c92672e49d1e9e12cb2ecbc4c0eaf1c432ebc6dbcf5f17db03569aa1076c55fdc43c73c2d11b653971dcb07294e5a071c728a2753911178b2f63b21d9e594f1cc21247a648475fe6482a624a06114d2ea9235f12269d54b9f4b9976e700699fef73ec9cbc33c04e2aa94c4be3cca4ff497ac609ef4102081496268613e444dfafd45fc441bdc61868ec892d57b3b2fa0cc0c2fdffd0b38e503f265265884c9cb4f29e2814978657f14bb91e9de7baeebfee53bd1f34af49d4f1ca2e9c81bad4a9b284bc99a9536512dd626ca52b2066b13d5a8b4896ad23f490707a13d9a32aef94cf7f9da4ea7ba553f3429572e7dedd52a19fa5a15fa9a15fa9aac532f97bef645ecd2d778e83b4f2ea8a0425fd2a7ddc72b19115a2efdaed2a91f5df72d594def8625e3fd0b2823015e859e57a1f78a74ef811bcc4f74f6cf6fb0758f74f76d31d70cececf1f9a12cfab4a5e5500d465f8bd1d764f4371dfadb8bca62e106bbf4e5cb86da4b1936d45cdd4757c93428f300ef635e022f2f1f03f270839fe8f3f0f29e0d9a4bd3a1afbde86bb017d06a3a9ee66a1325692e5046c2cc2efdee79fc4465e4bfc864e4bf683b32129ca1f3bc7f019368303fd1f7404dc74ff49374a0e6aa3f2a81159cee3afe7298c7bc2fae5ca649e91369e8cfafa08d40e487d2a77ffcc79d38cfcfcfcf0f0f17efe23fdee33ebea5615dc574d226ca52f27cd2263a71da44294bc9ad3651266da2d2797805096a2e0e429fbea3118734a82dc11e0caf36d1276161a74c7bda3dd5a8f4897e076aaeca8121102033331b18faf041b5d7cb13767ea8b9bae53c977eb71aa773dad53afd621e9e598fcf4fb35887755eb0986c87fef85cfaa1e6baf491308b5b54ae2889757de40ffdc9a23f5b13c7674e1cc2db0eed14645073ebb66ddbb66d1bc7715c18a5254d5820e58d209e98f5b09c10e145070cec8883052e9069dcfecab18a2889a1d531a8ec8828b75f565b7a533faa7f8ac185bd22b9c0428bdb2fab2d03e5fdb2f6a0398ef3eff3973a10430a5b7a138a41cec47196e3c0d048cd05815dcdad976f05359076214b63070931aa78c16a82120c1d0c512c262fb72d8f27b81dfa657450c2ba0d8a80b0fd7cc56346bab07463cf7797b99536c95fc1bfc58834f2fdeb313888cf66dee33efe2359b21587b0b39ce52dc7f11c77b94ebbdad53afd6a58c75aa6832805b6df3f7aa3e76f7bc7c7e7a759dd6a9ccee99d986c8767d6c3384b58e705b3e1861c90308b5b210a556343a4080d1b1c567ee82f5bfa252bf91e7397c9957ce789431867b382dbe18fd44b3fce705202db839e078d87293231ce0ad6f829fe0b364dbff66080d1e14bc455bd9a5274826bd320ca4ff1677e8477dc255e81412226c4210d2e20d2d0f73a0eb4d50f4d3712f1137d1aeb6ae5ac05954adb3f68ba35a04dc33011454070ccce974fa4080d36f48a23826d1c6e99468c94ebeeaffd75b25fc224a18d388ff4299da7ade0e24c1c3d6143d9c51403dac4f64a90484cb91063caa64d5c7d8795e0401be3cff9853edc29fd189f348697c5f672db7e7e93b56dbf5570326953fc4a4123edba1a287fba3b41b9c571643952aedc41263e5f99184437bee8325182fe23f232c1f2b75e1107bb451cc63fc80484260e8997937981affd6a9b38b692db54047d7790eeda730c1283bcf363f019c3bcf3272723bb94211dfc4ae92fbd9b0a80be824a6424f0e38e15e879d5ea56a06f498e05a0bf7dbc626f06b9028140fc205ad5ef55ec14dd400afeacadedc3c122e5f213b7bf61105760291d45a75dd45734c61c4c16366cd67c1919280e1faf8be5e257b3a4f00adc8583f4d797029a381d4a29b775a24857175e41c240c680bbdc7e1e2ecb1f4a17884894578778c7f5689a57be09a6ec299370a489f393e07c09fa6a46b1183991833b869004d6169e55a3713b8a56172bb902030a1d264c9c80adc1237b72832715247bf29a21f24447deb01413228aa7a2b5e7facbcea6e0fa9370d6b83ec6f5215ed779aecb58d0bafe403ae50385fae1f282eb5f69d96029a519b2206257cac952acfa3b9bc5950961c41563054e3ad51cfc43cb3d4b95b20b9c2b9fe39733ac67615f58373e95451af90d86ccbab2c42bb88b83c80fdd3eef34c1f577d7b0e8eeeea6acd9d9ca65f944d0cc419a1dc0737ef33733fd2395e7fc96dcd14b3ea40f5e48dba806e2bad09c73b677534a3909256db8e42018054aeab8a14f63b1582c0825456897cbe5d29ad573d6d20b691b05715d68ce39e7f4f1f101813fb76d462694524a69127cd0aa07e028826a31827631053d4dc09b95cef72adfa51036b6c90745504a6968c3adef95522ae77b95ef559b74be57f95e29a57489122e4dbe6b94525ae7bb26dfe59c21838b331c839ebf6debeecdeb9e3fae9f3baff9bd6abd7144a06d54b5a66c1de6b2cf793c8b5bf9fcd526d0e755623b7ec5b1f8ac4ddee3277f0f7966c1376c28994826b2259d481cca85a180419281132dde39a2e09c692e838b9da29d925d732fbf725f8f1eec5c727bfb6697728faaaae237b5aaaea4f695e350c96d1962194d94d1c4ad6fd35be9d6afa5d3af8b33e1a0926e35a57fc9a6845b4e912191e5563b395a61fdd0a9d07f7efde100563e0efef5e96bef1c5630ecaf0dc618fa7e61fd0d64ae6008461a945efb481ddab0d47d7dd117fabc2ffa89ebc050abf56d5a76d25a30c94876b2829899aff6c59dcb6bd00f4b58ae8373cee9d2bd1f81492c08c4af94f001fa45605cb20a81ad1656f2027cea07820dc2ed58470d1ca497b0a1d598e0707086c1a4aa5533c55e82632d1a0163bbba8e7f4ed764d7c1fa23a3945d0993934ad9b0cb7570dc93d90b8e636cf64ef64b0e92199c2832bb4fa74c299594521a63643a9ab9f285175c6853048944ea3e657c1ae3c7ea67683c3c208e476e1b0f8f0d3b6f8e72db38aeeb3cafe646480815a34864b50e44eafc276def683d29a524d936854476f4f2f2f2c2715d370282fb48e21210fbeb8d2a1bfe1a3fa9de4f6c6317b7bb90428695973486e57843d075d00890db3aa11120578b71cde4c77fc9cdc2b5771d649e25973d08d69cb35f2da54df1793eeb8e8b839c952568fbf9b634b7aa35b3538934b3e9184f7ad29376786632d20b16d381e91774fce1f2d28aae1ee2880e02a65b5614f27a7a461ab518ffc7cba38ef7a55a5da556f76c470c8e0439cbac4d919bc3085aba9ead6e2cb34e2c3fcbfc14bf1583d5bc50ae5268bf709079da145ffb6ec8c191f82946773ab539dda0ac46652c9348111a6c9852ca36d5ff214da89a52a95629abf592cb08048c76b59438847ef74b5e795db9c2b1c1d1c4400d97edf2aaf71231880cd2d03ada4bf40c784063bee60d8348237b091ed6b87e339f75e5360c78f081f6fd7af5ab3f0c7c1c7bbdf553bbfc99dd50b27847f2608943e89b5a8ca34654cde8c68d568e1bff062294556296a934334dd7d499af099bacd9c2913d3129933b55c7be6072f2cc9d299b921525274a949f9f9f9fd96c168bc5622e97cbc562b158b3d96cf6339bcda235828db18fcc77725a83d2a7aad3333fb5edef8fc562d4e5ea71f9b87e6694f5e3d3c38ac562a4346ca8e5f8f8f8f8d439b51c576951b49cdb514ea0e9b44993e2bd10c5085128a534093e68d503701441b51841bb98829e2640b7116c1dfbacc0b2f499c3766d629f91113f3f3f3fb3d92c168bc5d8b87289122e4d7369ae88c5955744ca2a95acfdaeeca43773a86788f0b9ed5fedde3fee39efbabb65379d0322475eebb3bb77e3fd8dfc233382615ffb3cf3d69fed17af4723cb0e31013373e215e6f13e3ef7f83017fee12e4c3a8e3eda8f311fc39612bf5b8d732318b998affb63ffe2ea75432d2686e50fb5d8cbcbcb0bd851bed6e1f185e50fdbd54c380bef7c7c85b78fb1cc7c984b9bf887bb34ab4d0d03c61dcbefd385c14929a524d51957bb4a27a5736a5ba40189a06af2b718a43bb27920d0340dac9146fe3c552455fec089acfc29dfe794944a2a259552d277f9534abe544e1350eacff4859f38f4cf97fed3bb596b81a84d1083932a269bd4e833a77d714a7ff32a7afd36cdcd4843afec6791ecbafa8c412a12f71c206734c9df46705bca4863829be4f6ff608bb44a4e9e95381fa5928d145c04a0b329b93fb99ec275ad522a851c3e9cda94a6e0e1b43efd0adaf8694ec183eb30d7a708e2ba3ba5d4fd7d742b7f201174d73e218d729f29e146d911711c71e587d9b400e6157a05d75f00ac6a23a211c7a80618d26db1a1c9e4b184457f686a130a48688a31c3ce1b6ddadd1469fcbdc5892a78e573b54e9e7d813bc1d00878e9cbb771fe42251787f9cc30709050c9954baa5cf9e105aeb4721d5c72c1da53c4da4789449d3a65caa8094387bafcd5b4498e1aeb257f3739cac6658d1c967f3269336c87e0e5a7924aff1c7885d0f5df81551e8f10f3e1fa4756a1e0fa7775d830fae470240e41e21f82b802ad2f30e181241dd87e8e4715368c3e0f7a4e76316658e707bda8c086f141cf5e0c317d07e8939f11f0ce9780f7a19740f776870881b8aa1f57263f79089c323fae64f8fd35293ded8da02edd62d5f3bc1a5734aeb64f8724f775b55abb0a1ad136d0277f771287c49bc311245b98708c19560e691f7f4a6f68931b6993ef204bdf88853f072447d030c37a0d90d1816f0d07f1f728770807f19f9f833f127f66f973cbb91c228d7f466ee8cc8859543a780e304ed8adbd28313a13942d8876e6ba2a4659ff632a5c72f9b76ddbdabbd96a77e595b76398b9da7f4cf1d777efa6cedc687ea3e780edf9a66adb57a44df4eb77b3430d6da2eff1c01a69137d0dbca14d9d0f6c18dc0e2c23437cedfb7a6b830272ced3271161f98993bfe108922428e7be566b4b251822ef00fa8d2249c2622637f8697ef745af997386a6bb8435e79ca6b88a1eaa4d130ac839a83bf9c94442ba408401f4b352cb955f82552905b3a694479071fbaa70a3ec88272ee8863328233240a5ca0e141facd1d3061436884044154d04110514b2273e89435c20f65069d2c589385c455421c79330629004112ca023056fbcf4b421071190f0c6184d80c0c51a6dacc184054eba00428c1770c10e1654d102c611409822c2c18224a0d03283238091e3461b31d6f083288b80ddc08913590041831dc8208cb8e408982c0a30ea50818c089e30bec069f9fc60874b960bc4e88505e25b2c16e8321210650e101b651d0d45d2c83982091c4618821b47ac462af0820e2468b1c61d5bacf84bae12c11d30e8e10c14f0dc0008f108392c289814914307102bfec85ff92dffe0721b97656f74901abe8c2e63261c329f9b1f3bf9c9c282a95ff265e2a455f1496fa06b68d564b1582c29a455ce42b7c93bd2161e29c3ea82c22553d929da3cc82029b1753c7460411d0f316c6f50b68e8a564a3cdfcfac5aad2d95fe4d2614aae68a8220dbab40f49305a39f66da8b9146f4f5cb1bd6a62a1d6b537fd1a62b6de2f15323d969538b82d0b57782dfbe5024eaeead4fdebf7ca3992b7a6de64ad18fbee372aebff730adeb3ffa58b7562ba5b4123441fcf3dd93d29bd2977812049afef30351be5dc751ffd47cedb5ef32a2f355a3e7512d7dac0b2bea8a032e86130cb9bfb0bb2d41de4b77d07be0172f07da6e0b1b4e1b9fbf7d38f43ba035a9c91b3ded352642149491a17160ae5b0d29b7aeddde7ab7db527c21dbd4322cc32009220df847b46da35d4f9b68e7f1739ee7791ee7711c07a21c05691d8d5b65d2fa95f740fccafb5a3f12441af7bef9d473c3f2d336a4ecbad1b6fde8b32830d4be3e57bfea523e8a0341206f4c25ddb6ae56eeebbb2af4b586be8fa76de3401a7fdcda934174ab0d579b4590978b5cec984977bb5bc897ef9c73a64ffda0af549febee7960e97c9741bebf173e5d47870d51b74bee4dfba9dc9efe06cac4a0fda6819782453c874ec9f88b12b7fcd4371ec83bad19c096ed594f962db7a5641ec6420358834e9fbada92972e7fa1bc21efc42d3244d5dadddddd21aad3befd8b5d4aab292ee3384c1088897e7458fed8b5c4b2216aca57f18e9ffa79ba5988ba3daca3a33333c3b058152bb7a594f29f75da24411c4470f92541a66202d2261daf15651d5542b5c91382658f890b08902b24aca687f95ebe917b2f00e93a0fab64f799cf9cdd1f040a8140a1df3acbccb9cd3fe64d32dfee03f9cc03e994e44b29a56f7295e8ad57afee129491e13ae82a668d4c3cfa0986d53a1896ae0dae7a01e3aca3c2b2cb6b101d404243b0618d8b6ce976229011d4f547d1100201e220af936badb73d44dd905b610d6b84ccd75c73cd35ed4dae0abdf6ef2aef354dfe889e8a4025a8d59409cac85f72e50d2e43455fab57a2b71f132014b0127dab57f6e95744f4f3939f047c659ffb78183df7a12fc994195ede03933001a28555e85bbcf2fe0594592569f12af432f2453f6586112823b9e74146763fc3e8b919ec8fc024dedb4f127a918d977aa0c0ea1093200381b8eab82741f771c5abb0d481fcf26f0896b91504cb31900c405dfb8672ffaadc50154551dd45befefd057d38c877da458ee3982b83915f93e18706460962998535eb3ad38c8f1289524aed5feebabfdc420b91264b0bb2ba1359b6854893c5f2872ddc29b878121561800b361ddb52894d36f4a99fab9432c6625eabb5a552ab6ca38680d3c42cb6e77960387a8ef38e6ba9fb50ca17f1b6d934bb772fc81f7dbffc68f423ceb9cf41a15f72b7e9dde8c0775cfb1c2843245efb30c46b7fc9157de15f117743ef7da10da2af9e4d8b3ed087be25d7eb40cf7d61cf2ee86d1ca4bd7f365e270ca8e8514997e0dcfd864375589ef4975c3ae7912daca323398c3022cd1c6170e37071264404cb1f1a61d7ad2fff2b1bd17e44c5565007b22bacb54f149c60582a3587dfedf9d87691d175eece0cda9fdea9a6dfd1cfe24059c80c0b91060c1bfa60010d1bfab096643b5247f22e5c8c809dcfcfd6863fc1505a2d2c4b29dbd4fd1e85e05a190e3ba736e79ccffe4ca736e7f46739e77cf667a94d4d9bf399fab39c734e23d73d265dac6855ef425224212d240debcf3526d250af3d2efd981884966eb831d1443b70a593220d7daafd93dca50caa24f9e8b88f2b221d6321eac617bd8032ce42a0e982317260ecbab769506f6dd371aeada7145e25e1c06afbe8496066b5bd4dc7f81376fd399aeea4e17e319e24af684b2d74d041471c71c401071c70b8e1861b3ff8c10fd248238d37de78030b162c6bacb1861084200435d45023084108021b6cb0a162a275f794e9539bed3c5bb66c99cd666db4d146cf94de339b65cf9e39e5115ab468918393a39fdb9ddb5dc465b1226849939041d919dd11a31367660f4062bc8103fb49f7b495174bd189b268859f5c9ccbeedd0de5c636fd7031ca92d889cd1ce8d1e379f0e89c1fe27210ddc365e6392e3f6bb9ceb212febfa7cfc555fd6132a16a50592e7f7cd9a9b5398ef31fae7a4f28fdf7f14a8bf99d2b9d2ad911879cf0dd754c848eed70d57fbb4a393624f35c77dfd7abff4af87ca74dfda5cfaf7cced32652002ee961481ffe257d58227d686fe85f42eee35c3a55fa2ee1fbe50be29013f827e7b0c8bb22afceddf219831c04b2b574c20b2ebff7b8eaadb59e37fad2d7a3075bc297dec7fbf0e1c3073f971f1919191913bef49c095f095f32a104134ab872b90490a7f4c5cbe3b5e7d1e3f3e7f1c51bf385da2581216bb961b7c200841e171b764bb66e5fb961b75a3ce3a4ab55c30ebbf50f2a69170f33be564d0b71dd0443ed69c9479b3882aac73e657e305deae543befcf2a15f7e063998afabb2e37e7b2ec422efbb4ff6773b1cb1de79de8f6a8f46ded7596bad48241231f542ac75210ee5dddefb620c127e9b4d73d5c1186936a9c92e2412a884b49a625f5ae3c1b6f950d92ec48dac880b799e17fae2f53a920f46f9159f3b9b8d388424abf5fb8b382466f4dbcb63cce91f2bf2f8bb27c14192a171496d5c920c8e4b929d1169f8e3ebaf2d6eccf3e0c67c586f9771635e6d25d2f0db744cbc9ee32a543cf1c3f80b18da3bfa80b489bb78e2274511185a6f863e7f0e4bb7036d71c3da68dcb04ad985070f5049fb38a9a9146e3492b33b25cf87b2e7ce0fe5963b652c0073f4f423fbd4583790bd20503ff861fd3eb497fb1873fa840e85ee47b7e3a71896ae27f3a10deb7cf9a9df2b3d0c18804fcae28963423c423d423f1f238f4e7d5db61276f953f87af460673e855741854fe13915be994f4185191566dea601f0c9d8277b6640b9a54dfcf1362b9ef84130acff8160cfe289ff07185614c0d0c613c08ec513bf0f30ac2f13c0b074e50ecfcc2975bb2a3f8f9f189e1a61c0d05ee619bdf41f8512769b050b9ba77f42cfd9bed079fc47e6300000002a913e33ddc540a09ef4b9d0d7fcc5950924382cf7b5fbedbd8fca9d9e7beeb957c190b977e44ed5ea4f28042a69d86caa8002b9db872698274d3bbbc9cd0986db93c092c3bc80a1edd183e5fe0b815c1ebdf7dce8e3de1b8d9864b92ef4cde7a6f7c5cb1d9932b470c71d77dcae4bae2a55f65ed85ebe8d833e7f2b616040254056537cd47287e3a29cec734e9f2e693a568071fb674c281ec38a328ad060c31ab77f0348aca072eb8d322ba4d4d9152e65449154ccb20021077674a30c560617c58a6e94c1b87002aba2070bba51067b1181e9c860ac6a258782a9a4ae5a53bda4971a3d5410b28152c002f0c568e60a1600ae48a18a4c051af00061ad991714efcbe22785174ef7311cf08ed10f2c743e1f14b0983d1a3c4ea032fbe1858f296028582113839d204564020e5c3e6a00a5842c74646a908251490b990948b03daee829410e1e1daa569b039c527dc207a1181ccc7aec2086d4a16ab55f9f871430422a0a55d3812e58d18a796209d28b16a4275a268caafcc07c4ff9b1d60a1f2b7e5eac1691e88ad8488c5015334b45c98bc247344567d459e1094d4182cb41ccebf2035445a71382b7b5b859a5c2051243a45501dba45051a2309f2a25063c66ec474b820ad28a8b62013d0ad8dca2477753e0489f72bbbb5da062a6aa2b27a0dc7e1f30989de287fb66de7655080ba89a6a4b53ecdcf063a928a49ce932c3494de31b13495b65d732554d9dc4ec9a766ed7af1122a4822cb4c086b21032860d5101cd6c77a34c099d1bc618480576bb51a684123794b2233285ecfbc452ca8e2483410fa4b0e3863e7626199cf439356db626e764d556b75a6ba944e7d339239d13d413e3277db2945286d8b0fcd434536f8c52c6e82ed8d408717707626a53a954abb3d75a2afd0f5a33e76cc9eed25ae94e6d1c9cf79c5a05d5ca71487c8f4342ef5552ecd4d4366630a6e17d5ba4e90eaca134847c35de0b283550426a502821352854d775decd0452c35b099705add2597ac1a242228f5ddc789aa51d2b8ba8688ab50635963e8a964ab123dbee621c32bf789a05081d508a2a144ae3119d34e484ccb9f5caaed532db6e51cc8d2f2e975f56e736a16a8448952ebf0d912234d460c30d393071f98f742ae6f22361b570648eab4acc1483445b38396e5c26b9745e302dd6b2dee95494416184cbdf573ad5a37b7c3ac565256d8073f9dd49a77e5c7ec791d2a9ede5aa86c56a7079380f67e9548ffbf8cf169749ac164e0e944e712e9dd719975f52e99409975fc2f865ac53412ef3ed7c266d30841b923f2c0f27c7d543c8f9e7cbf9278c7fc63a652fffb46257fc73c785e0317b52aa5bafe8b9b6288e0c2e3f7d4273a88b9fea744a75994a8cca7470f9e9179d52e1f2d31dca4367b4876ee9d4e8f9a90ffd89b21b6cb9fc1a13ada5e1784ea73457944ebd3cbfa6e3da4b83456183cbaf55e9948fcbafc53499b6a3f168583a05f3fc5a8fb645f351e2f26b5c3a2573f9b51f560be749a7629ebfe65457a7783c7f8d5275aab8fc554aa75efc1556639d6259fda2533d9ebfeef0d459a7a24c0a342e7fcdd2a9142e7feda93ef5a753ceda9874aaf4fc5b6bc3f1d2f7f06e4adce37978373da4e411051897078f9887f16e62620f2ee96b964bfa8e44650597f424ef866453cdba303ff26e60e4cb5befe6a5fd8e5ee4dd8cda7ec8bbb1a2f7bc1b510dd555e83bef265423e7dd78dd83bc1b1e3241a0afde0dc86eaf7937db6bb4dbfd99736e894b2e98945623b1c71d6442bb61a2f52b0d54127be610d26cbbad0f111f88010e50d0c40c747ae0c4ca61a80842674b1265b80067e5528eeb3c34b84e5b882adec12b48318bf5c31214fc40369385e1facad042078b2833166bd5abfe9177d342e4330a6df8a0442b052f18038b958b9145972b9020034210728b1955aca06b93db6fdbd190020a0f31dd7e11f7196c08d15615f26eda7e71fd5d40415b29c1cef36edac26c283d2a7a20450ee8caef64195b8a90cf391a70e0808173e583fa0c1ff7bef237ef4636a1829736b0a1fc56c5984915633097abac4f1eef6196a5533d3f94e5aac8a323a50859a058c11b66acfc69cb554b869071d1d2040d35b098b2f2a7389d92715c7f9ad3a9c8051029b8540b5561c3b7216aacf9fc4cd66c9501c4f59f5466954ec55cd57387d2cb2f5b1247e64897949d6183eb2fbf9057248f9cf5ccd9d375fce5b0a8831e9c60882d76e5ef3fad92ac982256fdd2b6ac777e786ed0e58855bfe7b8ef304fcfda9f7b3ad53845b8fefda455efdf503ad5add3af5ea19134eb70b9fe2ca5554cacb43c3f4fda86157c604106162b9d134e1af02ca4c6858f0191863f191d3882a117d8bf6cd3268e5c0348c377586c173129ad978510a925e5b4cb5f44400156c58af609b91a38b98755c4775bd04ea4bcfcac9352dd305227c8b6dc1eadfaf90a12566b8a6baf778d0d91222f396eff0c34d4b0816e2874d009b9fc9505eb4410b6f4b226eab8a31b654db87143d31605016158e1411b50d440cb149b1e64711284932e586e286009155050b1e5072d28a3894f88891bd8608a24903004181428021051c8d8e29282cb2a7e29aa9654f1d3822bc8c0e2c61339abf8b1052ec68f317e54c0963172220d9e7894e9b82ed7540787fd05e96fd3dece12b4dc9c04d5b41839f8ce23133c322f95a08c0cfe36ddcc6dc8e7dae5a45add405ce7c5efe210affef64be42f59bd9fe4d7f8497e6888d0094434e8ac8ffa85ebb0fe91d48d8e10d38d8ec003499f7ac4909c6143c691116116b44cc6485c8ec195dd3dba872c79096d025f1e11c1fac7eba3c4439255f413ba2dd7489f241a36641c99cb47e2dc02368295601cc6619cb095c8e0800944958888fc717b3445a143a11b19c1faff885a6499bd4cf86e2484af1b21c1fa833fb08c0eec83a5f5acac118c036303cba5e0c3db819d8951c463c328b3413e0d2c245f299e445f8238e49a20a67c495469114983e191a9c28dcfa9d08db85800ac7c4e5923801f050f4037f219cd61fd79448700a67b89036d73005dec54ac15876b819af5f10f07e49342a50acdf7f1d42c05e49f3611a01b0d214837ea62fdb9639c2373ce141a2c41e928574ae10ad08d8a60676466666666be99999999137ee6070a3e664c28a1d483c74ccccccccc0c09662605075f465614f2b68e03556d864ed93c1379160a6db8af531c5c5fd615470f25b6c4c144ce0ca0dc578d6a04410654d0a08d217ab8acf8bba88a76f468e1428c2ba0b09cac58ceb183b3e3a244c45c219b0113090711340ef13a2e46508c5bed7ed6ba698c53c698ea1a87fe4813bf7277738d51b42931e5532bc792db60183df92ec9e4fa8b01bb0e1ee91b82d23d722fcb96c072a32c8aeb462f6e944579b9f782cb2bc1d05788b6bb7cadf76475bb685f992fe9c7ae3b5d081722d2f4870c13e2f6338c61b0ef924f1693386cc85a6e734fa4d9627de78c17171ba2b82525b3a679cf79da2fb99a365d630eb53a05629c9c4e6ddf71a28f9d7c0ca54dceccac51e7401ac01a18879f704e14e7d20d7d61dcd26a7588f2bc5695a4b59ae6dae4e2a0ad3ee5e683be6b4d9b9aa685da7bd540a0090452438401af50733c3e4a246666ebd974658d4e971bc8a64dcd428d46a7cb0d04e47258f2698ee3388e8bd990818840576628a472a8742cf865410ad5d008000000084315000028100c874302815828ce2365181f14800c7f9e46684e980a846918a3280c32c61864000100000002003254c519bb223301361d1092dc52825fa39768f7f5dacca683d428328c35b3d3b9758f20868ddbb7400663f85df57482dbf626f68de83c43d1ea097085d125b9f54bdebbc59e07b9228694d1bb0e9ea9a59f6071003f257089ce56e80ae28674818803c3804805e6f39a87bd7ba1e6eed7605f23b2ca281c1380703570b8d228f2edeb4f24595638eef4f02bd615d3dc31582f553ee67ca56518cc7ab32cf65cad6e3d00e57e61a9bdaa69911acc31cae853353b0f7ef52fdeb1f653aedadc98fd4aaedaecd8fd92bcd884d8fd28af3629663fca1faf71f8e98f6e5e5c7efa17bc72eaaf7ee313b67f75c44d86ddfff487873cf8315fa1893cf8d353693a0fe04791b82560e217320b1d549356e1bceaa122198e5dd5c5ade0e4b1a96e0efc7d8686cc0637099aff89e50a7a353d96968427375b869dafd664def8359121be018f0787a4aadcfb59d787903b62bf4e76397157f871518e7ed4579a9cabffd3173491a33fd3379ec3f4a79edeecb0fdaba33717d30fe252fce35a4efdd596349b537fd2ae342f47bfd2ad343b573fb50b4dcad1affa42d3731d3f14c1edd96f0e4eca30c159b622e09f15d9c331d609ca7eae0931a137e6092225236503226f16fedae45aebfaec59574bf0463dff16a92885c153b4ae258dbdd75a4d4619dd06bcf5ba5b2a2d52e78d640800d250d322c444b4e44c20bc41cba4b74309e7a71766dcb0e96666301b495c570b942d7e1ec82179a3ef60f234d2150c3e6754ca526ae3ed7f85b38cf788f5fb14f8e7ed0074ad4674e2920d20a499ca856c6c9182a07d86930ce117ed50eeae60b94bb57c7b20c2290b36300872981ca5bc0465119cc31ac32392bce6c1a3a29ee923fef687f8838fadc803d7205561cde4750eaae3080afc538d87cc93070a4ad44330b0c286f90f1e43ea8ef69f31e3ef8f53f8676082b60112f4607e055b6766e63bb7b6af9cbd865dc86500c54f9cd7a0360a5b1d8d5871e6c69f3f1b1f5f6293d5f6b8fc1868b70b59b27300096f58b2f640c0df0487ac186805e0f78e6cfd3f160439b5855015b9d7c4b23ea4326011d2203c8f0b0180aef154cb033660857b3006c29f7b744493847f7b5e9bebe47900f9395ca50b77815b34f447316e8e1f5fd872425ea2c3d09d2d25f1fa35204302d4dc9798ecf1660efe6055b8a69eb62f1e01d3bd68cf3edccaa584a21f222c2911fa8d95548f0c10374c1812598aa00364d71ac2e88c6ac094e7233838f1bde7be91f8a509fe1dced1950c734bb24218d478a3202de65829b8dfb44a5f6b93a04fd770c81eacc9984accd3bc819a63067761999275e17965cc1a22865a4ec82276dce4b209342116b8753106606a13d4f2a93d8d6b4d60d78bb59c2f082018d384b8fa17310a4c7cc1a8c823e68113e165402d1cce430802808a79ea2e6e0315606bda7c804855a56e4d099c0e800c190e7aff676b2dfa4db1fb7c1ff2f0e63a7ffb3d8083ccd273e0cc72f0b97f4a8d9b06143c854b0ae3d9bbde0e97d7399a3b13a3ffce4a0f0fe848a8301ea95319252abff195074c4ea98f2cfe7e2d9532ed91ccc5a1df103b440a0268b72890f635761da8ced08fbf099cacae79d648c684f332691f1369ec7ecac961b2f0bd7d0617f752016c1fd1af6c61641862e11095686e0316a900fe82f099b78247f543860bdde77ec9a58655a07688addd02d014d1089147044c53ccea29a17b2ee0c5f48e0e8cb889a9ebde69e34e6e641764df88d93a1e1a18de4e2309009e08c5a9b8092ed68762044bd856a904813cf1cfc0be7cec5ae4a63fe95a4822d447aac8d1f21ec3f400bd2525593ff3d836f8b4372944efd4d9a78d37a6d6b69dd058b5e9921f1de75f687db0edf0362562d729f07572c3ce8e085c9f258e0e5d10b91c0817a71930de13aa9c130cb6a8608be29ef86debae36a33be9bf06e6b7e8500c68907142cfe7ee4d6977b7742196a75c0baa4010f7e96476758500ebe9fb2077d53687e91894fc7a000a15717b2e1b0075b995d7942aa619e33c43b51252925b3bd3eb1d6875b0babf7d87e6c27248c23811268491c904118a46e02163fd2925fee6693bc58bfcd053e78acc5b6d56456f351e9c6292e7788f67727bb115debc87abd486748b6d05adcd38490bf3da308944bfef51b2acffe3f0814bae2f76df6aa53c6ebfae3504d88c63751b5f309bcbdb22d18574fa9f317df8c104faf4f383bca54a3feb402f8f8cc270e937f44b812715be05630ebbaea135ec630b599a210b0f59ec6c27b1a85074c6853c0f8f3b57442f9e30973d17053528ae913910022ce280665d1f55c858249072daae1875ad3d104fd2fab1c82cf0f86765bc006f5686cd7894575f8300390e84e857d2f585ff741795f61d0c4807a55d1f065d1dee39b920ff8c90f521df722095196b8bc3b676cd456e311943e05ea0c1566529d2c60034c1b08f47df455abc18b4d388fc1b216f9c257c4e7be5b42f92d31072113f2a33298406c2c626c306eae04f0504ef1a9047cdb00b5d86b9b5185d9cfd110c202a040bc64cff11d376f9228380658ad138d8a9f55d3b201280556abb6e2fabd14e0ca998814ff3b05bb2310787f6d1c1751b4076faa8a3e40546b157c73bdcc5b1e5b9842d4fc155eb8668c6f9ed1c25e86b561862ea38aaeb4071c63af67cd6ffbdf9c4ff2812f8bb68618ef66ed02b077c7b8cc6af3c8e0692616aca6ce8e37e577f1caf39fc9fe494aae3c8b4cd950abd98ffdc4eea81f86e629b34588bc5fe172effcd307bde66f807c6ed4493c3dc2340319f2c6364a66189b83ab39c8abfdea3fe8ed2e0f1c27c9c833bd1cb658ee2a8ccf6465d1d2abc95247b519afaa2394bd027586542dc106e85d774ca71eddab1801f643509c3558021ed8ec4e65982848422c3793c4f146d21d8d339e861cb118f971d67f916846c7375b3a225b13d3775105c58dda6b19f2a1e4ee645b7050dd1e86fe82c0eb1b1726d84e5334af7c47faf2c7945c4899d1e2559ff0f8c33ab22d380e9414c3f1838651eba0ae4b3588d03e83aefef8f0a085c950e80b02a4ee33a793f5c726e430044d9035301eb30d79e4e2e264597a125386454a5e9f0977373534025951fb344e3ae03597c93127377aef9fb83301c787c5c7710e4751bc0d2f2c62a19c3c9c6d3e2a7aee2d56bd1f9983a21660bba4031ae3cfd4287cf08a2604af766d54539c27d22ca3175922fc48d02b207d143fcdcba296cca2c60e815f84b5cc08403ed77769f9e53a82f34c7b79165cdabbc239c0009ccd6f7b51536bf4ca7b8a9454dee19d5e1a5706fd63a10550bcbb7f8206fa2d1a9bbedcbe9a201a51ef4d443ff74441ada29a42a6abaa2a382d33a94b019414077b45c7c112885feaa33f9d00b8c3de9bcfbd94ef1a59899a2e8e8d6cf7e1048ccabfa78f644758559a1873c8e2f2ec1570ea27758d40e2cd9ccbc64b4fe654c0a402683e5071d21728bc91e79cc38be635859983f5192909a78492687a9f97cf307c688c492c9481d02d65260ebf042acf304a44a685d05db1afdf7628241213cf025c84ff377184d98f0045de34692dd2aebf48bec1e9a2673c473be3e0f33c27799cdee3b8d07cc941fa99db0b8d1bec7cc6e77c367dc30d2e2173ca2d6a65e3e306c5754683947901b06333604bbe7130e9584030c3757f577ee10c2cd2121e500c8723ca2f1208c9b19252aa8319f600209818c1c4bc0d401ee90b58c94c4adccc706cc557dfc0d6f3d976a8dd76b05f84a8247729d12692601c703ad7973bc1b5d16dfcd237d4518c47ba9e49626fc5d15d0bf9035b573192e087f261d5c0257781fd461fe9319d82513db44878dbd6a1636256a2d1ffceba7892da4ccda9e7da834b289ce3abd946d056de309a3e3827c51965f1a7f544f9ec75e6556a8f662aa68681a6cfa96f35e9e890ec63eed6323407be8ecf7fba15c952c66a36f681813ea01c20d17889b7f95b80a5d8b55cec69669aed4c1a9ebac3b7037b4d9966c35ddcc99896337d64f5323f7de763066723637b394dfb3db2567c9ec64e85c6c2a11d983398bd62b1211631960503e5865cce945791438f60ebad44ad026f50064a6ceaa520b0da74075d0488a2d53f0aeef0aa33fbed25d155a2ef85383a3ace9287ab21b57f386378711a9a6d7a56a9a4a340ae6078fdf7dde46e8e7825b23de09523013fa636c42ee1bb1c0cf5f09d6e0d63173c01933c7617990467c03c3587be55eaa0ceaef7b83bddfa4bbb839d07f7c071f7563ed48ced4f8fd3346dc99e66dafba0e3bea8463d5efbdea5c1cb7dfe067958b747691ebb52793a6e70a07488603b5051eff2fbe3766c3dd423b299a9e4d4a81fe280ca1e90c7139a7969ade528a4278a0f8763d1809018991a782e0e2cde720ce83ed1431d770340a4af95ab07e2651a511bfd61cef0d84ac5f195cb03e6fae687269cd2c06367985023da913662918b75bc1303e68d113a89d6e60707781b8555c94e852ac8830af65ea1dc20d538f1ef01484e1b051534bb105d201271d2bf230cc0de3fa0f9275832204194197b496540bd5c1db0c454f8f158793146938b13a6fc50a0b17bd23272d4572e9712d25d5f253ffa7f4d18a6e4fb29cdfad3ee04fe7cc83135d598a55bf4936422002b0726a714cee5af0b04bfa812f94dde02263fcb4aeeadb0722d492da4360c99fc946b40572097b47285921b606c1f9914d7b56dec9e23b2c7f07abe27d7fee49b247dbf41c7e2e3d35f8b2c60994c272aef6ec20e90e02bc8972e25083d2de5a2e1d48af0f7b263471b2965a1d020d345676e81073d65ce568644defdadd55d2c770b33a6368c86be67c6d28e7825c34b11d716cdfbb80c483409d4a934597d8b45c6fdc5d7ae22cd2e9a389317a284016317403a08fbb47828e84437a84cbbaf3e8bafc9590951492ebcaf392548e3cd97287b31c2d7cd2a2196cd60bd75a4f2876a77eba26fcc3d5831e05ab2b83ef7842fd79b7a782580dee405d5eef1a8cf66227dbdddffeeab4eebc6241ee01fccbc6e7febb493d26265779f0f4299d434fb38e48d4d49afe8b7dfbe4059641e2506e9edf54e1cce0b86b73b2a6c7a4692a71b0a1eb518cc325b6741c07de78cf7493889408c4ac5d10a5448913d4562beca3177987bb06cbf9f1e499cd5aeb9e85606c11ecb56ccb7b409384bf134a94e9cdaf8b26a5e02955f1c9b3ca3ed552e82960c4244af9ac554f037702111c8c3a23bc47c401af94d212d9efe1077f15b78931b50a806e8685afb2363b4c2cb622c5ce3893ca6271cad5f3381c6dc1072b4334cc48f2b89bf04aca8b146ecc2b989a0f5dec657e99f675a2b37f57a880540dad8f92201c934ab2d25c803da4e8252ab1891f8fc377581fea91ae342ae7d169711b62e9800fc1dd9db0dcef90e4a6b3018cf0af5f883f5b51d7a46504a82b7b5fa8804442ae7e3ec99268eeb662c8983ef0d1915847e80b60653ccc023483d48423e24aedfc2dc1fef7077c372e8ad962b6eef0b7796f9a62e459ad32b21daa989be88771d403048431109d831be4bb1f20258f8c021ff8702a802cf4decd694bbbd7f332b5fe0f4a54d28d8f5c83299609c3e1d1b1264a0c80f948aa27ff6ab89dfcbd1ecb7868e20396dfae68d49d1ebc5303b712773ef70f1a655bf9c4f0d842dc0c3b8194f73f04c1f4195399dc470188530ed2153ddfc9bee054fe40a8f1f08907239c118358ea4948a1c7fe42bc28c2ab5fa1071f1e3e92a5ac49cd15ccc9e06251cf2a41786ecbd3da808a7f42837b99d3a1564aafeadf9fd2415c2b997beb77c0632537718bef91704f767a0e47708d1b87a0b05e1e31dcfe1f3ea61107b0b03a3a0bb8d9cffec97d1b4472794451abe2c724e70c5a5dea890a2cc4d1fe785fdbdd0c58ea476a6ee012b4abba8c0b87e350bd72ef0dfadf55f9f562709051e2b53ff06a638f8a764fea984e73ba183774a2ef048b8e5a813ba54126b50068260f83264733ddea2cb3e4d2fa2ed50e956e298228596e40847ae7fd4e3610d83ba7c2e819951bb873bb8b97cf2b08680f2fde0ebdf7794ed9bdc29930f93ab7d190768bfb3613d80fb4d9d7e0eea00b95ccd2316923933d45ddfbcb3a423069cdeda29f5e5a2e4b2a237dd74c0a6ae795221f94e052720fdb006269c02c1f614c4120ee32dd584bb72b6759c91600b8673ecf8f9a769b3b8568fd55668d4c5286d60de369670d235cdb8ae4da54b0ca5388f87d67d8d93eec9c354f0371f99b53c79d0e501764014a48e559d9396b57397a14a39f24b6d8001fb8776d80a25fb83b22602812c04d4ec04b175210563a69b41a97839af24bada0aa8dd3183952d83ae2df5e4d1bc0347aa49b02982ad189de15f02ce8181bc5fe504255cce2be765d3903cc44936a8ed7eb812bc81dfa208188a9d42f9c1270d4403a6c04cc1d04cd9567b6e6acb3f21391b79914d8fdec17102672df3b158e3bf89b2d012de1dc8bbfeaa1c4ce36e610b247dd713f91472112ec5bc59d882cf0489fca918b557130af8424459ff875daf8de6b6b798da66adbee5b791249d47f64bceb0f0924c0fda5ed75baa891b60f3b85624c8c132bc43314565cb1c7213384458d03d476801989be8afebb4a1c8b72325b95b406a23c26848e68bea8ca40d05fc30847c3da104299fe62978677122e89640777fb193ccab8f59cacd2dda8e8a63d9c358265cf53c3df320fcf5bf5785fec5a4f2c9f0a092add9f89aab244f230bf82f2746d5f4353fc594145d416d62b25ef702ade3d45884576e2740b99eecd2c610a48dcb54f4572fc985eff805b302468316cd5ca79500cda73c90b94b5a79832c392c4f780041b8386d23d7deee6a4d74837eac703d8620f38196948928407e1d580ce749598db4922cffa4ff0f35b43540e5809fbcca277c1624dd87da8b09d0419cc50e5c19fabac079c76baf397a26f5c0ac0bdc71b0a7b0496d74cc4c179b40736cf9d4449b1ff1e45da3aae55c8d6247503a45806301d968810312464c95513312ce0b650797c3cec02a38ee7cb03b3da291f41391c9e6b03ed695ca92f2f6c0b58ebbb335668c161dd47ba8bf33496e24e0676733f37c3797110b646079f5bc6e32fa011b54414aed1aa7f275f0439d2fb477f0e19c9355619615598c7be755d7695c2032afc59b3aab8147c182afc5e6e50ceabf5dd91d78205b146ff114a2d671253c21c687e8bce57a73908ad94e91c2d0ab24a8c2194668b5f289a9a204a26574deb1489305b3b9fe0809e77f445fdecc6bcb919a9eca61d71e88a460fdf5a2d96e162194053e133236aaea0c6a53cf810df5dfa3e6cafc23c9c3044f66640e471471d8ff2af20f8655070df7f6a313e9dfd13faec8f36de680dc3e2709ed4d7c89cf922721062825ad0581514c8fdc2c1e1c07f680b7ab49ca1cae4838d699d891544a8fe14a7f70016cceaad3e4663930e9924741628cb017d85bac8233bc18dae507f2471415accd589d011aa15f655b43c0ee5da2e4951a4d154d143520732e25554a1338dc1ab56eec16b25f71ce9f822d461c5aff993875a240e74229ebd0313a659c0d70efa6363c36d180c385dbece5dcff6a7b01fd26dc2c40db8580ff870b961b8d8bae2e9bb5da3d710a31a9d01f510319e9e7c28d558c53bd1c8b6f1641d248f81137e4b83aeeb073d7df1f403d93bb2505498fc67a0d10c016fc84d648ac93b02ed30e3f0c8db1de7d0bc986f2638b935ab17c209b156ff9876829d840b0c09532f1cdd19a08c27856aa2211dd6aabaca65997c8a82e67ff7309880843a1686ec36ac72396e638acf42f504ba041c6b95c4d81dc26411afcc06fe4d6c294323200af0c549b36fdc72a1e3cc79e3988120dedd81422ec10a3befbad4580028b5ce4a9bde8269a14207ee10d4ff9a88dcab332a087980d37478fa3d3232420c227cb37ee06c78b9125e9a94cace7f23d0f1694df514cdf5fd71611f50fb8cd54bb3eedd1b37360ee1d15a08db7493d4328e6770dbdb24932ec873ac2c5651ee040abf29818978eb120372e9035a37415c13f2399f7dd9462f26c853bb283d1dde48ccb108f51d090bbbe8ba7577442f57202013fcf9fd7eca3bf48f6381b028104d00e014fd9605c1d28395fb76a3ecc5759d28b43d205606487666713163e3511003d3cf7b161d1980dc8a943c13cd9a81f257cd3cf9a8a21f61775c0fd2c897ac2e24ec2da5ad105427134735218d16fea0461786fdcf027da7280e048a17c9dc426a2ab08c0995ae04953e93417a5023edcf058a8cb0a1a14e2f2171e37b135938b022838bf1e02d17b67c60e48337d262033011ce82132eaad740e6c32d764b77b91f85a39a703cb47c7eb423e71101e013d892b4b6c0b99628446655bce4e9cf583a8ae5cab6247be0e0c9ea657db150c53ad068e430e7702672ac8b9e7be4f8be3c75557f3409db9585d5e033882dad57c34d242b0a5a13cdac6c98cd124d7a1bfbab2158a222a88456af964d57c8585636dd577c0efb65cd2a79c9de0246e05ba12697767087490af59526fa7903dbf95a7067c0bece10016702ec340f57ef8e37e3a4cecde4f3f4c9e9da79f4bf047a71b8100699c62bb5321aea0c55db90ddbb6ce8dd260edb17c99c399cdaa8134e489f442c7cae481a6c4652ac27dace225b399dd7453b88d80c81e2f9cb9e8300944c8c3ab6cea3898f72c9c12338cabd7a52368383190899816e62e1ab7f9a816668158257316df1480b63f71d3880a59248666daa64a8ed05d02ee7311171c2390c8942d63577b7399531103bf016c5095944009137aeffa8c8c77c78a1fcc2fda7dfb70b1caf036513097d7ec3a463940c262870349899894f2ee16ca42570ffb224fa098b86fa751e496101870068362675f7dd733f962385a8b2a5eeb97b3eb25ec84e4d429784a74fae705146652398bc98867ce5d1d542ed783fc3f14993fd4e1c7d3493ab5564f86a2802b150d3ca221423aca1838e055f52e200a6d36a90d744cd0ec347381c91f81c3970ed236292f6001bdab7b1f1626e72eb0aab34bde29e7c3f3b186b0437173247379eb435b574b3c8a49af292842fa04e21d36c24d4fa9f3601051d44e08f3a17a538df957fd1424d0da444f42e5ecb004cd12c39b67877f11e0e5f662c554dd628842f029e90e86b33dfb7be1381e9e6122d45941bfcc1777a0f23110c98809bc70d513258430698da66146b019087532b49012dc8423ad55204a9cc75df898993d2c87b58df57f258914aa4d3f2b4704c5dd6bb8fbdeb3c9b0ad2fa748b3e65f1e4a6281484ae950807dc94dbe76bdf9127a7c521aec8d84eda96195a130fb4ba40a7c8065a64c3c5b072e507526ef63dfaf1806e55aaf790327eaeef99aa67534f91fc667e7ed77542e8f2517e7bacfda10ccc1f22db410db19a8886707a5f000807e1a60ceb12bd83865f284f977a63480870ccc678e5ebfc2746bf68dfe9540fa96c9e5ea51f0e3453d5dee51e29f4df7a3e08b1d9bf4ee15d4c90c7d96fd2eb3a54ccb4715868b146c4c83541e6d7a3b98519b556829192848088cd35c456e88464509e18c4ee3c11b7c1c2ac56071529433cad8edb00bb2ad18be060db555ff0cd6207155160f0c24d3404fab25ffaa21820f14c80c8321b399bbca09fd4bd00cb2268e2afd3bd380cc7268576a77b2152b35c1c21e22563fa3538283031b70fea1c45e3b84f3ff15853602e78aa5ff44ca1d76fcfaaf51a04459eb7e89ec12d6f79bb9026110de9798121551c5492f3c0d32b13ff07f0db85e870063bad1bc79257b05cd025a21d686ae2cd10529309b9a8d3cb4ce1ad16ee34fae00047798113005e0573152c8d7d05d0c71b2a113cf4117c4ea64b8d8c400d1a9cb522ad232341e723f8ccd895ff0127f96d5c3d99c39708a2a423f6f7bf14636b649b1724468905c53ddda31249afeb6a9d9b3f0e681c5bcda521b800e10cc81ab6ce774a02c1491dac7e912a761a5bde87b6ac4d95c1773aeb1faa2eee081008dc55fc711e83ebbe197409a14ae607c2340ec80bb9b425d40bee924695324e90baac93e6a05e4fefbd4cc1ec5e484a402f1b47add904936b36d468ba54432730c2d4d6ac52843ce534e8bcfe7fcd6489010623b95fedb89a28e6607f7f6d31e48fe29648717c1da970261be1be59c49e960296d369a37ced831584cf0de8c847def4f1a81ce7a3d9cfe904d23c986e694adfe21b0d0967be5603451b2fd72afd79093f44fc0e5e0853bfe299deb72630537dd220047feee9e893ca9e10b73ba3e24bc6b3ec27036f467fb5f1960f2d10c9e3d47c1d4faff0f3c2dce71823de87b9264ee33d29ba50455ab4bd051ff9cc26ec31ad3494f7210cada4207ee781f3fc60851f9e2893349aac4c4f079bceb33ec4ceae6a1f9d2ae57ee9d0f031350da0f784655aa6959e067d411f67293ba6be5d8c88aa192b549bb89cf5b9f7a15e016f1bd482bde8b441d3cb1a404fa31876a80e53b54377e113c56beb64a97f82a6f7ccdf74a2d14ae728699f51c0bcd947a936ae2ffcfec192b72bedf874e15dd9e24b59d286a04d7f7b3bedccfed6d4527858809eb3eefb8e85a487d9e1026e07541ded62d28b792ce9bfe90c58ce0c037c39c7c3a2af9869eaf5338fea227ec25ecf6d9e08ede332517ff6b41e02cefec68037910db31a003dbbc83a238440e85cb1464051ec2998c8ee1e17f8aaefcb756aea510a7b2a3cb28528e9ec2a624251ee4f75779fd90600d7d406d3725491b3f4ad582bda120b38476a39218238959c716d2de8fce023891bd10f227c837450af6042627a9565d3ea90048d212bdcb8841261afe05ba277cdda8a2ee0865a4dcba7a856607344d11869bca429f18dba8e5fab747d7a079bd6edea9048318bfc733c9a3aa55529bae8922413a595111db41a40c8a21fa8cf105b753158b824d2bf01cf83f02eb06974327cbddb20a5cd5f4b377a67e585d461c68048bd79da399fdbc531bdfb6ccaa287f66e4926cc788e71b25afaf3ae88f54e266d3d1b6030f573de6ada87621d6f0d7660a9afa77a4b41bef84d7cf85bc09262d66bef0b3065e4b768c1076e487fdda60acea0bfe4b09fcfa306d4a9dbf6134abd328ad60269875370788cec492b2c0c259b7a214543d7194441ea3d4c0a4515ce9f7e5c48c8ca4fbc1a89d6fb690e0e2ffbb3d7574fe76b8d9ffa7cbbf402b6c78830cfe2da8f9cc17fe5146019f87017c6e8371988e2b48f45f32ce1e26ed08dfd74cc7b7816b74d5c6f510ae3ce68a315a6795d0d6a509258f258fff5cadf51c41b4e716c4a9d6471a4ba82fe7594f16558864b9426ecdde8cd10a55b4b544305297be7d7d225e04ae501c86509f68a07a08034708ff5f79465b714ed872773662dd51a2c9dd40229568d47b1729c4cd89445e7470364562e5313792e0f58c675d7a8e5ad7bd187ac486f3416b84e732d10eca5fc20a10b9dccf5b5901d3f79d6a249e17ef7220b767c2f84971bc7f4da7a8a0ee0a930b7a748d56e12e163cbcbb249d703be366385b4d03fc86db705460f22440dff7be0b680301e4029a29fee0efd00bcb3553246ec78b482f95db1ef284f0c1c88d4d4567f58c56929be7ea66004f119d0cdacec7f31bf4cb88d54a7778b4782289628bb407b8cc3e78e4e64c7433989b50f053b045b9cfa4972e3fc2cbbb19a115af418c7df8de6bec678e82c3db64a69c15776f52a266134a9f633bf8d9e29caf5f94ee1a3359c3bdc9b72dfeefab206ce0370f2d0877a3cf5b2db7da5951f60925b623ea81567bb95fa8b4aeb963923594984046a17483c761ba29c5055506bb5c23da2db14031695b474aa0ec94ae5bdde1dea3386d691d46a415f46ff9c3520b6cc3fd03ade413e5669765e58157ae04b600f7b4d2f874c6ef450802f205a76bc6a4ee1bc763dd18cb804044694a7c55654738ee667f24db87d0f2b68bad772a0af90d7bc459232e37f137acba82512d0a502c0439586e74dbbcb2634215c5881299b59137fc3d6612e1ac2ad49e2708ad6e61e6ba40f95fc0a37d413be157bb222ec5222ca5c4265651c0766484362d31ecbc1b3d547b31b37f7c2fdc723d5191fd1761d0bffa8c4df750c09c88401d12f2f13da2c3f504e54661e406abb77a211749c1f9a2e1d2844309186cfb3eb1ab54c3cacb501741e23122fc64a3dc9cc2601e642a76bcfd6ae700b928eb45cd105323d82003bf58ddf4ba9db9193d93455a1445de9d5488b2441cfa4fcbf720f4f827ea935cdc59010371a82f2328f262fa32ee2b3896468a103a99654fc6f87976aa7bbdaed7caec03aa3308feb3e1ef4846ce705ef274fa5890d4ceb5cf198450a206aeae9b364803e3c13187edf8bd55272c96fb9b92c90a4720d26ff67f19a641e5a78c915155aac6b9774b0845f756f1ff61659163e78b92f04532d82c18a22c731cb5eb1aa1f68e5b08195d664ec5087f4a5aa8f302d4d08434673810062c1be0bec1891fc7c381b011a50581e23f7ac6bae20eee19778d89a2f4ae5b2e57cde86d552daedc28e9bf3d729b7b7eb0a7b35a7f5b358d1cee74e9493436e693e8d650bd3c48aea3846c5025f041b303cfbd9bcba9bfe158d63857b36b0321e30280ec42dc1620b807c9e582fc800d9ba8fdc4d85b27394d1dd3b00bd4f8f3d91e24ba2ee56c2df98f7b1d8daddd8a3774c3794fa12e3f32066fd36f2d03be8ec010f1d4157772bedc51ec49a03bda37f1f9730be073df40df453497f63dfeb62eb76230fe9d14828ba43291f6293933bdd5d07bca1f31e971ab707bca387990aaacb4c61375093c04cd4b64915fc4bf735d62f88fb31d1b642429ba5bedd074c4feec20063508f259a9e1f007e2f91a909f780878e836e0ff4888eb286ae6b2af537e63d14639b12903ca5621b2c1c84ae207cf003f27cbac5c17fb5b16bdc8f721ede9dd243b007a7c412a2c0326d033a45a8df5af718344abd8d45e689cb18776e59e070fd881d3f8cef7ab56791a74b69389b0b2cd4446041b004974bc1c83363726d949c7433d5e40a58c03b536b56b69081da0b32a99c25d3dc68c0918f451da465f514a5978fd650f305332d9d861cb146603535e5877a8c956b478885168e2445b587945af8e9bc98a7900f57fd48c0f16b7a67839e576d19b334977c3f656da3f479825f667eab80cb4ad6c894b054a822f3d7947f1f27c0af9709056f8b311ba14cfaf95240c86c66a2127baf141138049f6c20944a3c790cb5d2e125ccb0299f4a3530e1a5ef95c21d7809b06711bf90092e30bc23c5dbaa2255c7da04d2a4af6719b46f6fe250e76101ee55aa8628fedb3b8b1aea609c095786a24f0d7edf2be922653829269cf1980161cf8942053d82aae23a83333f920d124e33292c66d91aa3212bd69c04a96ca6bfcb5b7038296ac03c393ccd5fc25591a2c30ff8cd61fb927ebbc57d7519ec63f6fd1a4ca919712a7eb1305915dfb5ed5b7b9dab1a8d7b1150b3908d19662559035079a8669a1991692fd2820ff7c96e90e7d452266a27f4dd7ac1626459d44adc8effcc5007c7fc031749201d5e9e6236857e836af95478a4f57f8ffadea8fdb5d89e4b584bc02995157c73e09b24162d021f6d269eca2a520f48d19d50420dd30ae7c97bc50714250d932af274efed92f6611ae0118db51e6dcbf25bb953fb493b272ab4738275061b76921c8aa4272f63d6146b9a1bccbb79c7806e5cdbc2b040659360583216290372d1c089f84a03f47788fb91f70d81ff13e010c124416aafd729f08f1af55ff84099cf090ff820fb40ee8307e52aefd409699fca39beb27524436419aa9fb340b22dfa2f8a605237e4c7af486104b13d7c763a3d3fbbf7908edd88aad08fbec5b719e0c25f8642c6353e8c2a0f238dc62a076e73536dfd7e7fe27c9ef6dc31b5aa232f90838dabf51339cdad1094e7bd03b674e0bfbaeb36f64d745db0fb09c7889d957ed720f27fd71b660ac6fbb00301cac0dcc6bbc78c0cf199ad86025b085660c1a8546bbc12c0e8170373bc24ced60b761738c82e83e40af43808900b4b91ed209050d2b0a6282c2617057bc3c47050cfb980c3ca7f8ef15b6e910a0ccbea8c59817df48f667d29fc604a5eaff1cbabf84aca7ca0440ae00785b066a3d885f32856acbf2540f90f776a785fe8e3c96d97ad93ca0680690dfa5d33228a6a84570623eccc5b8af7f86172cf0a656c591cbce9eadb79c381f79c9156ec867dcc1fea18bf9702ab6a91e5ab9f75606f5111236a43fa64dd2f48b5b49ad45f74fe414238bc81cd0799d1890508fed145f80a561e320583687d1fa0352f4e45e31f267e52bf8d93669ec0b157e26b1f849bebe7976e0cee3ad14f5e0bd4e102d350e4ccae01b642f58d5a3eb8460c2f86b170f401aa7cb31b71a79e159764fa04a2b81fe341cd4646b47120e759a68d628378e158ec9118fb7281be67a5f66ef0b617a35262146af82d08be704f38fc39f5c46bd558f6865284fb93150b8891d26daab76819154880c315855eb9b25503ac1588c2234a2a0a8036f62e0ea778110f72f52fc5a1f728fdf03c4490e487f19564ecd8b41081a9d7ad36b3f0a22aa26224cd1bd71c256fc7c2520510923cd2f5e43c5f5d3c3aadd642d6fff28b0b1cfe0a7d5412c7b6d035ac0ee1545d18b162ca437359e7689a97dd4206bba06f94d601d359ecbaea004792c2015194d28b4ca39b70c60eb9f752cdb00c82933bcc6f3127a789c1a410d9a4cc7d761f5b2ae7b4b107f92951bac972517ea92c0846442e1f53bfb6ef0f31fd62ded853bd4203a84b8630e02e90b071851b3793a537ee7e46f2834bf2dc2704f7aa5445b75615c5f0f1dd843019608ebbae9eefbed98bb842279e61bd4808125abc709bcb0f9d65d88f7ddafc802bf2d3029b916790e47420f9a5845a4686d2ed6de0d1ae743f7875e26a1efd4044e2cc76a383e5ae0dffa290b2933ff10a51e25749c920428e53eca5f317f0f9f6c9d651c70c593d845572479e004671c72b3e1794f8596fc4a6b540915d147b9474c52563d18f400256a0c611fe0f88429b1a213423cd40914bf477bf051a2d96e6b26673e9474cab7301efb2410bf22e0f67a62709ed1bc992ab189bd8a61e805c686019165a398e7f9653dee0e73dbdc97c1a8db58271304976ea4165abe273448da1b55387db9f2838599f050150a4cf33556dd15ebc28b7e2d04a3d141a56d0d2ef1000cb9f8df70ac5576db32a08fbb9223734417633dcfabd8820aab90c350498f7f51704a40109822a5118dc79379c5a73a2ea842f8eb6e2a426ef740883d85fc28d630247d0ef76240cc0ceda76ca1606591c1800217b2f20eb6a3515a6fa2c7b6fa1d8d6b6de1d36aeb1ff2055fc1f5634f9b8a168950645bbe08732c423d4f5e6a4c86b7d18790b862664b5c0d33b9f9ae35ad52d0715939f4cd5f27ba9461a2426403f7d4d3dced93b1359475f79f9d08a72c24c9fcda64256c9c81e684a866bda169bb13d195e724e37ea6c70357748264f85e3a6e237294cf9d62cfd34044f71141a002ddb2047721dbd5fd6cc33bbea96bd28961cc846a7678066ab3075415d62bad973cbc7827f2e4d7eea714fa6cefe22ff88730328574ab50dfb9b6991fe56646b1fff663829d93c792c84d11a4db1cc21d9837b92108f1e47c86c5c690bfeba3d493fa2a15d79eadae46a87cb6a3a31722e473e9cf694d48a7278452d89ba680c93b818895618cb1adcc65bdb532174d156d002e63a86edd4f46c084db0db77b3b027b08043eb57a6e584ee58d4586778d2e4306bcec2557511af95bd8e9e6ad41f06b8bf41b68a06b62ba4ce2e45141004169cb029dad53e7fb9ec64e173cea0005cadafccfbcd1f2d3c2159f8166698b5619989be8e08c55bb636c4bf0274ed56171f8e62cc0b0261169472ec007b52e365e64f3f7710b0d17dda77f38f0abb693112543adc791c4a67fbe95a18f6686e88b282922004b2b459ef65b14cf7c148d73bc482493258dac5b05b02e47e58c094016e018508915ea51402529ca370972caa526e772db45c50bc30f8e04b1b003384fbc490ca08e1de7e27f30b69ed0e16a2efd1a39397b88e2e3bc9b0e6f51441bb49310b0bae552460521ab4212e75d600c45ff8d2cf797122b6e0f2e2e25f19ca37ccf4fb95c2e7e3dcc8a142f54bd80788753195373a5d0b071f73d266f6312307965dd3d8875f2857114842764ae32aa0d4c6184213b3c8218d4c2a6c0510f16763611f88f4ba1a9e2571c9d211d13e412c16e1c6f28382d77edd66ab08135949356c9d785224416f258d8906391e3f517688a357a56acdc4f30149199370eb4c9c4d6dbd6a8ed175ffd57d4b82087f0c94509e2620aaf8abaf530aa6c45f580459574a83d0b8c137f816d952ff4a6a4204aa52300d09ca9610cb70d06bdc2e3355c7bf2f29784c2728eb7957cd3c6ee856095d9a91bf902ce70ba575e7278484750d472b542ed7c800109792575fa29f7e422b6ed51f80381e38eb197705b0a59d031b1e9b1af33381c3338e461518bed6c860dcbc42cd9a2ede726c44f75fafb105d5262ca96e0071577b8d06436f16266cd6fc8c81b4cd4ba1f8423fd88f410da3675853d82fd708330b00ec1eebdefd841cece2dcb66e582670f3c7686b67ea7c701f9edc8d30097e1a4aacdfd815c09e5b0eccbea7849ba578f040e0ef9453ab89300f09b65753a9c21bf38999c09891f4e431edd348e4a9524065670f6a8853ecace21a72d445cef909045c42b0422fc2867ec9723720672bd38a5bc63dd1b4038ecb6d1b5657c8a06666431797dae7911ad70a5201bd82b7122ed5f5e7fcdf00baf91702c8e1feb16fd7e3d4fa8ca0809e57c2d69be0d70983eea47c2e972289d3c0149760852ceb86575556fee60b75c69b3f7b9cb28bf3f1a0b97aa0777db6ae1ab0ff81baa2778546b3850470972b83bf0208cc5b3f7c1a382e02469e3f0bd9a593c877093dceef97e69c8d15751a20a9b36689e384e2ca0fb545eb451738ef540ee80ff35c3601a5644c30ce5d2504e1b436c1765d71fe6cedd50e4e5e88087b3935951de88fffb752bf35d57ce2f656e9660339c3e7b9700be20a3450125526bcc7c187216290fc8e771942d01dd8d13b2e4de209b9ea5b020129a9c1410a588e0e0dd40e4b46c6333a9231d44544b32f8405d03a404481e7c448171b57529607761420d793600ce70d6dc0648b36d36d5163bd47481b9089736acee099e6f698105a852a83b6d0b9e9c7399043fb8b8e396eafcb71260a13f14372f938a78e994687450b092f0b4db69b32f6673799a3d4f62bb3c898ba54a683278ce2183b50d3f9fedb6c573d8f785dcf6aa98ddca1063c78ad774a650495434b5e6f33cf7d5169a346b275bdc4a38449948c3974c50a2f498ca2a22048d1ce648fc6f56344b3c19770492ea24beaa332c218bfb978404ae3bc339e233f79c12b82cd9df7202f81574815c54d109be028cc009dd64123a19d601d0e8a882a29a52fb07d2e61bcead7bc4ae8a92a12aa6f2a70b90a9db6bf0cd093e195815393cafe7965efb0c6e4e007bc8b2f05c8c3fabff6d8aa77bd3ca6d5c8514c0072ffc90041b0a26950b304796fe7b3078388341374d72f32551510c4d25900ac694bf891ddf13444d9e2a9244989edc5a88d5dcd0bd3e9ba73e9a04f556d3d708990f654aafe0a54fd8f3a967a10be183929b0c42b311d842e1d5d92a6375fd8ca52d4cfeadb7c40d6710e07e1acf7c408ac39e38d3c7875243f4921e7596c703ac280facc058885ca76d4337440f28c74712f9b0ebd9e0b7e5639613ee5bd00139e75a26ebb25e13d8469eb46985a86c2f40f01b88bf61b75b37f4b3ed903e8d80d4d5e5549ce3cb1071dc3e206d80f3b5929b63871ecc451b41d8e6addca51a96c53309eaa212fd15ef97ca8c6b534312577aa6b205afefedba1795b6ac073b3f51f5d996d13883aaec6279b1ac8295e095187c31ee1b182b2a2e02d8cc7e1deea49b857ecadce19931c3469f9bb7b55bc8e6e6c6e8850614693d485ca5093d4a91f2cbbd69a19b4784f9caaaab2d788382381f7326665340946a32b994512541a945d881f9d43ab140fb123817cfff2163fea4919d21745cc3ac85b9c161713df90b82a757481d671f86beacfdfbaf50b20e5aca2ab3c22692793933ae107620164aba405572dca165eee7fbf8eaca7dafad1bf09d3c53143509325e24e86e7177980287dd72b7adca5841df45d7e528ef32dddc88c5e5ac53f35d2ab6cafc1bd05fcd10baf5325b96169afce40ee3fd8b5d7f8c8a09dd56e3bf1bf28b1e1de457ec6f1a064e7d50da5a74e4530fb9f64c6439e737968322bc62ed904fd916d391fdda320ed13c3f2984ad07df2ce53e2fdf61f56ba97568e7dd411deeffd83147b9aa0b313564c1faf83e97c05a9c3eba67a9313a6b3a502b1d23a1c36c2047b84c3e1c3d3d6d44886a4b61cedb47f67468c93a207d93d220cf4a0016e4e11379a7bf6bcce019b49516dd72680a171ef160c7fab992ccb7a42f5ca1563a593c31361f24aa642ead347d460e1e01896a498dae468b5a2511e8d0b22290091b239983408813fc5644c234d1ff461e2e840c8aae69d34de73b8a95dcc5803f744ff405f9b2e95b36c80f740d1a20b074077cda93f55500e86293142283755006901b0daefc4516dd4ea0d205b7bd55e8b7a5e8df86a1fc60b47b51784e980722e40c522e38c9c139cc13c0a9dcd9a615a206671e3aeafb25f48c1c1bed917fd50410e1646c7924e088e00c5472d13901455d448451c8563ab623a063c6efccd8acf124c5867f0b3a968e42a14a50dfea75985d0bbb1d821b49bb332335bc7d28978f82a538daaeee46b584242f60acd4f0aa60e3522c99f40cd4c77c5ec4784cbeb8a4f98c603e97c68bc519c666354ee83d761727b9eefe7868324285929e14d509bbe4f003f26b07133d949c18e764ca82d4a6af3ba063c98bba2f89b7c47ac7fc0ad0ade806b976161aab9b76ada76098c7cdc6e2466e3ce1ec1ed7ca490210ad1b1a8924b34e5524ffd056086f052d2d7dce2e956b424ccfa158f4c8dab38cfadd1ea7008083818eec452f13f0ab22ad315dc081bcb807220ec5e03f383bc2034aafb23d04789f0f2f4529f400b6d0d4c4f71ab3c1cfe14ccee7f1b077dbb9484c0cd3330a434a524549c89d635881c5f49a23c89915f23ab4313ecab1a8eccd676663f6bf398a725ae4cc15b1ca69ada38b1b8685b6332ccf0ab29198ac0d49bc77c8fe631c30dc3cb33f66464e56dc9b9352aaf62ba3eeadb619934ffb736c1764ec0b5918a675d19c7456f1d113433ea35d954b961cc93341823ea809a82182ab7c7d6f6b29bbbfe9c36544c08d621f84cab113f4d0a99d90e723abed1968dc3a75ac4d79d36a7931354ccb39145508d40726a5f8d3cc4cbddf5cc85fc388850e24e9c89017e45df2483db5b6de0fd10b0329ce0b42805a3735c5efc8bb035317ae27dab7ec72f07d09763c8443726963b27c724a43d1bdf9b2bd746ec2ab448d3351491300b41c36d7f8b5e257a15bbd1d2bb9aef62057d711f704fd52a3c0136f5950591f05294999dbf903b1de80db8fffe06827503e239b23d416045639502a6f1049962576745e11131b86fcb36fa9f70930d674b5197711aac5c1ec4b4b9aca118d123f3bbceb4a1a55fd80e0dab690dab87ba92f8ab2a8dada6f803f5509033680857cdfb6fb2f732e99599e83cde50c29ed076593f4542a6d32519d38e0c604de4e5e4293d962a2d2eea3f010ba4e613dbd6114c037dcc91edc91d432da87f9b1c16de772c47b9e7c11aae0ec9c28f8eeaf8922673e565ca1db06e95163eb52cb243e811a5b225ad47dc8ec9e7f69fc2e3b86b9a24b4f4bcf733779b911444643312e284af323231a76c943c7a8b09d813a9017b19666961bbe99573f4b476d6ab9d2d28962d3feaa2627d4fd9d1e9bcc35ca5393a89c72b2ad24147e49560061f7bf3293a8e69c7c3c3e102ca39074bfdd59d8c74bf5ea889b6bac35153ff5c4991fd60b5b0b1fd769829173de4c43d4ab4f7b3477842a43c806901bc9685c085c4551e58bb2402158c0ebdfd30f82ef508ba333a3a2da6cf7c525992adfb19d01db368dfaf97f122f7786729e260979a780a4406614f53ac42b500c583561cb872e70415ac4b02e2ee7b3add9b43ad98d9435357aee85ead644bbb5df9e337d57dc5fab4b030d70a74a0335fdc0738408b9eec397d4ffd201b37e380b2f12920bc66f888914fdac07bb12e3364616aea1ab3fd606c5c7bd3d524f08bae84339938fbb618c0e965ef96c6858df5c9802a897c34f12b57e94346ee47fc8221545bea03b9b48fb44553ba06edb5ce1c7473b1dd4c572f1fdbb825aed211f958d707a88fb7230babb275357e60781032ea4f975a81ad0e4646da33f0a2ed84cda0dbd6a3785ca8dcb96d2c1ddd92d35eb518c3e6a20f0f0681d2449ac16e5ad5cc4eb5c7645892ca5f7c4c2fb21156e460ac8526dd9bab0821c820b7b14dca0acccad894e22a5fffc48580584a87ab7758c5455ddeb0b12898a135f2225bef421eb7ab5ccb58211b498d00ab225a8a145a3329ba484e0105d967d22179366ff48c28228ee84563c5e4f424c9d7c0894aa2ba7931f9a29e262615132fd59ba73e940653f13b46420dd05861d45b35f44fcbdaad1287270814e3d730b7beaa6266097a839cd5ad84dd49c4fda466045293e8894b7283524ca4446a9d75a5a036cb098abb1b4590c16a40bc346cd1fbde68407ec01b6d9759b8582dfab7f6794fc0e8fe343c7ecf9e6f17c007ad5eb2ba4594f89bf8cb7ab1df809be5226e45b5dcb6e2c6e4e81e0fbf3ba1bca6d715ecbfcbc93dc7f33d980772db74d344bce3664c3dc60380c0833eb3eee17018a086e3c994571bb3eadb86dfe9d328beb207bff3c8af4889122b9049ff7e263fd40832cc2a88879bef5438459dfc411ebc3608319d56ddcdad842d1fdb47c91dac0e55d052948d4075074058e8518139f63b096aa54c80ebf36852cda350e713f27f8952444d71dbe67c20cb8961335e9716c3188c6ba893849d9522bacd28f9152ba933cde25ae44d68458ed4581682cdb1ae927015cf96c22f69fe374558164005746de1af40409b222af8bc3aea63a182c52e7778111b534204a9c8a41aff61afdf624b8fde7d31375fc6b978dc59083d801869829e9a805790ead85cb228fa9bef7b8b0a14ba6dc34d5a941fcd27c65484f49f437aa116c28b23ad7605ab5affa9412e489663796d1ae79ca3b302b12e03d019d63d92fa30ccf20354faff786c774be69e73583d2dbb91e26b02a92414a10df891592274ea17be0664592f8f7cd4a4b23fd9e49c13c85b75ce97d15dc560adc9d0a777bce9fe7fb3f73617564cdd19a71e202915f8bea71714571e242f0bb57d7162fb9a5ea205d3281c6b7606d968db60ba05fbf06dbb53c56d5f11bbf0a3f0db6d932eae7f12a4da62bea2d5374fcd71f5e8e1ed3a7008ae5df30ea1a58d6845facbfc18032ba62c09f6a56da0815fc2f15ce3974b95163a22473358a5df4cd28ab12680c71823867b423069b03feae00c55dd81a12e7e6384e46cfc391121fc6cf666e9ef4604918367fb8c5f9c15be3e46c90b3696ce7c36981e89cf40cc81a1f11d6becfcb2f07730d67cd95d960991485a4084298ece474d199c8d605b4cba6578fe0937cca3eaad22f7ed4eeb50186642004d18a6e83be8930fde2498e72e8a7b1405d076bb0157e25736868da36eed1aad4e1dcb0e0ff26423830830211f3eca9398c2249026c5fc7a3388ec5ebaf7a8d13ba9d7242b82095b09a02e51c66423494b6dce4eb3ca1c13d241c64fc93ed3319dca5d774f8a0d5f9030244f1c06db6159772520062bbb918c75ad0d934d6b16423ac56e0edc8da6b5ae65db81d09194700b9987fa1aefb6a6429941604915742303dc32f698ba4650e626d3113a92a5fee1164d6cd819845e76e97d87d8397bc0b357fd30bc41ba197745d8da19ec732054fcd4d6fa305a9e4b2abf14a20f4a9e1a7d37da53c49ac5f1a0fe79f8a4009b3f44e7284bab2d8f21145804b3c23b7e8b5e151997ab84fbcca53603a89e42dfc628a3c3ac0313bc38cc347e95e0aa28a6782755a7c59cf0fe72c23a9ca046c80150e4c43e5847eeff84439574c0fdfb08986a72b4e37411e5cd7576bd0fb856fa5f9c89db9d2dd9330f70c127cb1825390b9480dedd65f92b0fd9ad7643ae45f3f6906a9d943c0b6bb08fbb2cf6785dfc11e5fee6ffbf97eb04809501f899451ed2634379b542a92644e621532ceac1d762004b4c27da80ceda3767c3faf5b7c374c6e79b15b294ab03e0b35a4cd5c98186b1fe1b9855f76c6b4bea2fb0989bb931961c2f1b91c9e0a6980d72f521d2e908071dbe184ff60273844caef6f8931a05872d105681bbdc92979633886401f49f53cb850b657cb7b56ced869faa6454ea2699f3c5bcf80f8f7024c7f9cf45876a5d26cf4741f5b8ed3c4002f0d12a91771b486bba62a051c71ee62401aecca425b27bcaad1d4d96a6728cdc026906bf7cd017c07a79014d63496aefa148a6e4704907fc84a2590b84ae22eef28244fc1103493da7e264abe681aa3a918440cacf971ce399ca0cc4967fb422130807427dc69ea91391bd710c6e11970eda0622164ab0fd24867e84ca03923695e48d4c73e901642542008904340ed19e2ee76363aef0cfb58808ee8861d7cc6592a5b32d8142451b87649078b489cffccb112c11cbbd17a6cee2d057fdf7bdef2ec531f409209a1532aed872e75d3699b42b1c73a91078f1bfd51c33981b7969bc3eb9b154f574e14acecb8775bbf23f5d84c675af51e005a4efe13f0a7eb8f81d25543baf578d03c42caa6db660ff5f3048c85e69f51386cf6d2011d945e26882adef15a0b38c652f580cc6250217611174896c5183996a9c3eface1461e2b1402b2edeea564e5a6325ffa0d059ed170d524f3d2063d848889338607c40d17306346c434083dfb06b5f445e5f72b54cf453cc0b26ef6e3f8a6c45cdc4b2fb509d133c02dd8031306cf711006ce264b63d5fb1756752aed5c5f7a59274aead5364ea86f179a807b001ef5efd36440515e88cbb9c181b14ac50de58068819dec82c54ed11038879952cc7511332bb1a3347c01a374ed2ba654a2053ee5bb684b114bf1317af85d7710601178cea982acda5ec17b42c91efbe122845574655322fd2f246d667dd75d05fbcf74fbd5033564f3a8feb151a22864f6b3eb9766844b3923c106c1a2cae98ee2b0c0a2e41a5b9a84723ebc284a2047a404fa3df58833ca2755dcde968520817fee8715dea3207be993502327f7a5cbfc81c37016a2bd494e377211386a0e7572ae16eafb50836fddfb93640114f42fa3bfba42fe10477eb6d46badfcbd6e8ea502bcf040dd9934994945586407f03daa476bf303587628937de03407131bd9ac330d8bd7253808a4f481e64a0a87f4069aebe75350cb94eed428db0ec3e465b8c046cd23eeefd71696343a8f75752fa88c98463e80c0e6a650d7fdd44f6fea13445b1beb31f00eee5130aa8241be5ef0073659b683a9d92767d1460d7fb36897c002198c713ffce9d603213a5cb6447b1752a006c5a086b3cb0f31fe1f82a6893cd047bce4f60e0835ef3603bb1359facc62ba54801f6a668dddf5343205af74e80bac9adbe312f85c558f55a486a0a7c324a52aa9332e824f5b33051e955af85586239dab89c7a2d4c43b5006f6f0a03eb2c38977829d5a0bbafdf34c95b8ff9ed96a6c5671de584dc73e4df47fbb130318a794c77ca125a7d1f8242283d5cfce9eab5ede8f32f388be4428f599c40ca17d8fef74ffaeb0b56d555eb65ceb00e7c52a29fb7208145b55be2d338fda124eb181931c96fec5b33e935433de15471224ef479e986bb3a8b13887a0f7fdc453602451592436e9ab7c21add1459ff1ca7b4860e2c6ae84694c06a6a45044d34060a5f2b6a8dcd74ff1d1f3588e965fbe204cbddc6df94bd18258ab1a264a5705f9071d287f4f64534bd6ba732bd604b780d30ed6d8702c48610ac6284e9160e4a0fd0fbb57c7d03438d05c1d5db2cbb5c40991092b2ffdd858ca3b1c59df2c494a9d3f91b7f3ffdd9d8a06a641b849ed71d95181bdc6ac2b33c68459ac86b7c116330102ca1dbf81b9d004cd9f0132475faf2cfa50a05eb053eea559475cb6f769a6025d717b79c79506232341abd70e8a3b27560f5638eb52a3fd849cc501483fe50c0fb29e4be6dd97133aad45eb295fd91247bf323e97a4bb62f3dd2fe1fc5c735df3d6d1199e9ff2cad13c159e88d4ea274f0a7d19dcdea8cdffbcdac7376181c607b7b535b78049455e85ae51540682d3ecfe09460d5e89a668225c523d6bca0231dd9e13f8a2cff85d67a7c0d9735fb87c4f8c83c90ff5b3bf822f9f3dcb7b2de0ec2096afc9d0724f9ad45ec0fe82b94abb16558f75ae6b5dffe51c049c3bd1ab80ca7344f1d60b113fcf52a0d17640adfd062c205fc0b7743172daaec0817c795ea40e78122d208744d79bb5e3066454c65ec95a8f879e09d6d9d2617f5ec0f865f66c9cdeb048562eba17a636be0dfdfab436d05ab7182a44e2be5a5ef4d7a0cfd3eb985d44541b40ac8eaea939b7a4d58998aa7259d0c2ff8013dceee2a291425032bb681857e501fe00c16886cd8037b1dec1f8e24778eb5c88e06f8432d9d4b82527ec20419c3807d110e5d7038a8559b20c14cb533f8e9f55a814569fe9f990bb1992ff75c2baf0e8991a8cb5fa8bf5b82ac8f1cbbd137fec8cf832adafb895d43b03916eb0c58f54adb8da78bc914542bd54394bb9164c6e5b8473ab9812aadff8608dccc88accdcdc6b91b201406e45a9d6c81783dfbb6f8c638abe02ce6110da1014e8cfe40ae5cbffa15ba1e395ee2160d6b06a449898702d5ff9491b21130dc20f76bb550d0f370d76a4ff1b4106e4a22cedf0724fbe3089a08f754615b814410f725b887f9332d9827d8965c74f5957b5f33e550f136cf84e7f4843439c973b4b7003f5c00ea001c54756b6e04693fa68522dec01f9e755f221edd298a212198723f71a80145f95a02ad1f2dd7210731bcff782a0aecc38eb924fd3a100bfa818836e904b21e24d7f4fdd3ee48b51efd4028484955d74562a7c1a5eee4378011ae112c6ae241eba6e4acccc674f9481f30117abe4c3442907fb544fdd1959f09d81f2380f9fad469985dada5e8f1f255d727ff4a1b273ba52fd061f917b0a2b094a74c0424277ce98752afdda038841b1aa0952b7dcaa2fc65a1840748865421c6545e0cdf39007e06ce6614842406ff382e7eec21aec8bb430241ccea9bccd4e1c74db5c0aca1ffd04940d05c5f602d91573fd5e0de9189baf233e300df33ad8e015d6bb5ecf0a45bb0cb6ae1ae415f4b5bc3aff45db925ab54155a38817988da985470d5775f6532cf69e96983b48830481ed1034b59224702e94b601e859c01d1d2e1ab83c4539607544b12cf0180c929b81d8cb21016f900e1c531a8693c5f498a040c1ae68a75990f465198edb89343df28964fcbe67b8f72550937b958e9a516939d1c26898e5dc711740930dbe48105069c63ce942aa08144c39d2edcd2b11be2213cfacf91366d46e06d0e8053ea185292a3644d0bac133a20f5427596db2209abe7e330a38d4aadc02d9ebc0dd5f754566e0db8709b3444ea66eccac3295aa6b898d57aa67c6501f33669e9e26c16a32584a0ac35b1fa653cdfb171163eaefa48c4b923761a7ffc3258c2a2b871949c813cb72892ff67eb5618d174f615b99199152055489c6a68cc00324045e0465c34864226aeccd0e879b38f9052bf3acbf8e875c0b95ef2bd87d283b92d35c24904fd7f893f7440237b1eddff6b0f2f016ea5f7235ae3c879bb5261ca4881bddf90a01a4621a53327b4a53ea5e86234dc78261c25b498b50b3c2a8c83de602090560252e722324c8092f139bf40e01e774302d227bd25e32c18852458e8c64a3e3edc520e39f89cd65285d1d4e5a8d599a4c8d777fe215474a6570e2a07f3a6a2669de41b0300184884b50f8079edcb7a0fa8251159c8970531cdbd4eba40dd1a611f78061a169c513eb032858af5c28b33c52460a3691a19b584fe2e4292177d675eca74ff1af081a8ddc640d37df7a99f3365f5d08ff5796ad72e1676bcb00148f575b96d8742a46786e4564994317933d4c88339502e011428ac34b94cad7bde628f08d947275de35d256f91dcf3e9e5e7cadd0e6b46006db601903850e8c42c56e7e15d5d6e2265239834e364223aac5f094fd3a6a6eb6bacf9093b6859fa4ea96c27f59fdc4895ca7ee3b1ce2709f0e73c394e23eead58efdd1cfd4bbb8e4e0e92668c63444bfd46052ace8adeadd122ba065b3216ceb382c8a2de122850dd08de4fef22ecfc833c9ffa5ddcc549d045ec92a0455c40dc9f0ddc4ce50d09be07a0aead846f667cca08eceaefcce3d95122c6011e1a49efca71cf66a0f0b99bb27fe3a6dd5689dc038a09c86e0f5614e0584bf5e760c199ab92e00d1a1a6dfdb806e4725433038ebbfcf14a5a37349d2b63a71d34c6f5cbbbf009ee5c30150dd1a18d24882b8495198e6914e4e0d1548006d9f148ea3b88f0c480c9688b476e800d93cfd6186f2feeb41cb5c1c8851982afcf4e32d812716a3b30ef0c4d3660a76e431d5965a1ea1c09d5e2a95d6a6fd86057fd1cba7180ce5b148868ce8f0e173f4f8a963b1eb67274eb08c9d732700c9f4e0ab294a9cdd769b170eeade41998e82740a02114fdb026fdb690b93401fbafc6a923773847f98c6c8cc70d269ae8eeb16cf2365107348e9c384c6a075cd8c346428aaf241004e6e4b035fd5c39be69c9d4f40ab6a144f529e86d3fdb0514676ca5f3f808df886465b7dc85f832c03996705208bc51b2b7536e04d8b2ba3949090bebe65b6eef15b239dbb761b2c6931dcb6bd4b7af73ab60fbd9d7a8d43f2bdef4e873f959191a7edacd30ec9e65c39f1959b98de3cfaf3a5fffc6f985dd3482125210540f402a891a5c0e94c230cfc10a2e2bdd3d3c68da80e1e67893c3fd294abc8cb801cfbb96ee07066cf639e928cfca8178772109ee07e8a995d99f27f8a8db599966176e3754bbda9bf5b56843dd00c7ee33dc2225c5eba6dc5a56b0882e61b8d103a1fd8c3958f56d00605477c1faa3b23ab6ca33339e014b5537e88d300fcf1117b60e19a1116920b59c3bb36af1074b0fb369eb2d7a0e517121595f003972c8422d2d4411209d5ca4752af1cfc957b09943a1fca77957e20db81b2374221eed8588f067bad32ab1b395a799f89fdfd1edd505d7b26a2fa7beba27dfb27b3a3d0c29563b9bcce6284287270e1aec636c8884dcd0c88b378d163bcb7f2d33a62fc7a0fe58d8aa2702acae11104dc8cbfed68937d332d0c254a7702da4c83f8d38a8aac123f1355f1bd53fb3da3b529ab424863fce7219484afab513b4eac931d8a8bd0569d7a50d8223f2d1bae80f1a688a3163a9a7bb9d40af6e8c6f46cf5d724f31ba32f3e8f04eeabd46e24b76f4b8088e042f8f656c0e1d631dc7201c9a18276a3a7f0603a2604e82fab896e4596700c7a36bb924019f5c515849e82c28015a4f4b26b81d9cddc9fc60f51add05651f4579bad91672c166b6adfe6c1e3287ad1dd4c26101ea575414b7cfa4838bf040f1004a1ce1e1cfddaff123a04e6c3ffc6bb458da42736a5eec11a44be741dbec3883a597855f9ea0604338f335b4c00e3b0a905c6d874888599672d0233dded5ca7d2d83a34a604ee5575a262e307c24c7b25428764369af208799eee5189736dcbc40a8c5c8743d75ca0dcc7690195afc9bd62792bf38d40500f4efc04262e1e1fa737fee8bfdc3d4bc7cce7183f0cc804af6629abe4cc3f246504fa65ff6213be6ff5266a7a1acfebb70c87b3cc91aa10fd33d8dee5cf9704b986f6d83244e60b943895bf36974f1174d21f81bca67a4106b3b1d98d7087a9025814920ff24a8b2adc8ce81be81cab263ec4503b5ae20d2f6901fee1d081a22f2888aab371407318e34a0b8038a7bd787f03efcee18d692d84905b2b42c400d91b81125c595b1ba9305930abdabbad6f50fb37310115aee7323f9595a3620cfbf5f249c8000427f7729a409995d65bae1e5543fcd8598e9b281c7b6a8ff90f5426885ebd18aec33a663635fa8bd6681d62af43d83f1fb07500f8c9165ed8e4729d31b100abb3a72b95d02e6934ca486c4c442ab241c41b9926509ab9d673726cc10e75bc12740e413451877c30dcad4b3328b41506a3566d8c6ca41140b20f68e7771032486a35e0afe0d5d2e35904c8d05b568a970d9313584ff4f6ab4175a41f8d52170828307b10458598149029a0a0e2292963cafd54b40d1f612248d3e5adee46e3b4715eb246a28311dd1923dbbfa3901b91d1b41d6f594c7283a216eaa5a51e18115771957fd89053d97e9b408c38aa9d40160049ab019d1e69f6c6454e0473024ff38c02e83acd90547a35dbb6f5a395ea61c5fad89dad6b684e754748f81d2f02f3ad5ca51d8643f5f42ea33c0db37f78d5280f68ba5896c78fb46a4c37e0d2c4ad59d98e17217ea847196ed72aff1f95d92cf553308bff22b04ad8bf4baf6c79edecd3915be7a37623c2f1b8f77220efbbceabc74ed72e7af0adff4a51ea46d9019558cfdf4f6dae7c9e2d69d63dfb1c713ae1e4285ecdd40f637a2941ef140dc91eb5519397250486daf6f848d6edc7dcfc6b088e12f77fe5db66bddcaf0063e8d6c5f86c213f673d72b5917330ab5068aab8b62e34a8bd08231b827d990080f9d6a1500eac779d84b715a223ab9d2924835ba287ba6b5f9bdc7b74ef9f80e41f62b9fb3439419f1a239c63f986d89f1a170bf570bfaade9e5d4378c8852a6446c4c63ab81e6ec6c6d09ae72312366099ddacebbb5ccadf1e770e36e20e349578dbdd28efcb626cf21615bb72dc529a6f3e6f9600a873f005afeeb26aed2d3686a07973b4eb00555146eee5360255bd217a205cfe1b5acd0d71248387917f88ac7851f41118dc3a6db3a3a199708633319cb83af798cec6aeb7d4c45516edd63c710122d336ec0b6179a887ae4042283c0a6cc053a8488156fa116d2d1fca98d40e5dde966abb18a03ce703f60640e7184d160b29abcb3012e20c4d4c3982e1c8102c57a7c1ac94ca1eea0fae1e65f8cb317b435d6fa08190fb5d6375cebafd52739e1e67488e4dea70fa5ef147dbab254f45d8cae5e947da8625dab5553b75b847df9cd0ef2cb3b3168637f75c6e0a48c1c7534be87a4f1e54ae39dabd245ed24e084b9b86c7cde9b0bcc1e9de00bb967ed9f4e18b955974c9183bebb689d0b6fd329be27aa6fbec813a42ef2b5250ba9f74ddb997aa3b2afcb3bcefb5b5333c2d7ac4040d9e519f278a99d2e7a7572b76ab74c713cbca4be12081782d079510f1ea26483b973c3b9900eb144c58e7e84be6b3651d685f5153c2d0581e450c0d33e5eb7d8ab9d73b6cc741ea436830a6b03bc2b85e2dbeb28e5215182db5057d766bc15e1a9a4c8de26c4667acab2593f458da7dc9875bfdf139a657d62d77320bda97a29c7783a88c5bba6773a97c0ae4205a6625e209e9e4368f1a5cfe1e86284808b9ada027093389f3a44f2b44e5144fbbf5241a7e4c9a853f6f337cc58ac0e29dd839fcf62af3321e53df54dbeaaa4bee6eda44ff20770ed03c7a21491161fa9ed298fd7942f86c76fcae5ddcf10e42d0cc1f9ae3ce5d6287b6e37d6bf89283a99e5b9d0d79c25e830b22e91b09aa019d177271e7730b9cb69008d93cca0474817e7c289f3466388e4bd1b5667d4f8f1e1be6331ffc2473e87ccf1ba47294ee9062853d904e6025a2927496294e4f17382776def67931833097ed40db0ecc8e98500ebd07319972471dc01d67859e51d83fe84360851d4465de88a5291cb8fb7aeb4efc18fe209008b885e0e4e84fe8dbb41988e8e1de3389ab7e43ca5910788c477472a8153d4d220d2553e0d6d24ab1ddb1dc1698a6b7baf3f52b3368145fa0c34b491ce7917bb860cc39b35e0f270dbe9071be21b63001068ac107b15cc510e00401fb4adc42993b7dceb6c58de91fa70c3cd10ea6c2333b36a39d2e86d8d7fb587d2b5f2d5f1bd5523866d19e9f36167d531285e6f532e1c43c6401fed50259b2fb449a10ac229d544873f355e8fd81cb6ad5d5415456b98f5d3f0561a8ff509270048e5a9d18e8605e985934ecf7171fcbe396651e174b2db6e9f4af8b9ad900a00e2c2c38cb6739334c80d50bbd9226e639ae0f716f63febf2bdb7a83f431b0e8480d8d4801dedd4f907057cbe96bfb2fde1d33ef62939f1e939de29012893890a29e0034f2a35b215747fec0c927bd6a48c50bc92e1d20160c7e2c4c8a401c1f3d9a52081784ca7e2a812408fe49e47469a2e56895dafd6ed705d1e47322637bd384df9aa1d22b0af30d3d8501b58ad4d513c1ce25f750c49a48cc4b6db5d6de0db96d7a844c4cf8fedcbaee0ee7a2031075d7c9d62768b3dcdd0fd7d3f39b29d69d5b65b5584eccc4d5161af60c9be650b1474000fedb46bc0f661cb07e858ab00f1e2fb8793e6a13e4c23c621b575d26df9402216798abc76a4a2f27b2eca6245b3d840e89809755a0b6aa2707ff6103a5942c10b09d7a73f0dc55402b84a11c5bdc632a6df415e83a8d096bd1e007861189e0b165396f024bbc52dbea217747ca5fb231a757164435b66636d65250712b964d6d8ca7d80ac3e9fa4d7f8280fd73f466df6821ed21019463bc3797feae6fabfdd43247cb4a3c58782af22762260bed9515d3cd25199a8cb7f7fea7452f53801470bc4a40da68b32e863ce9737712d25078204e43f31abd0875d200809f393061554ba79b6141227b764a565f79d0cf67fd5e4a05728563fde00638f202a510204f112313634cdf0c219bae95c840de0dc615b61132d1abe538ec7dc8a6c47ba23250971c8951782a2d75bc11aba9da3d9c96ab432ef056e8f0428375a61cb073bda496e6ccd48bbeae47b6acf70f86ff4073d53c6b6774905159b458c6e759bf483e87da44177c6d9da5208c758d9c1372edcca3f46f9145ed15e9859968ec0c9d8e3032f4713b457b2e880b51b23bd4512586bbc1b9dd5f5cc1dda324793f377d03d0232cf4d6ebbee75ba0ba636da3fc19101a8ca5cded5c426a3300ff595aa7c3e1e91c63a868e15a37306a91516f19480bd8f5d625c7819d1aee2f1566a8d7c1b9ec3e49b94651f5cb658781da7e3415a9c6448a6cfb3408ab4aba58f5d1d6de6aa21cd1c5702945d08248667c0f25b46d873a757af9f2ff1ecc72e40db1400cab50275dae0e624e036a4ebdc7d787967fc60234d47af64efb92217ca6d897a88c2f91f130756265d76ad61157c3874ed57de32b3d1511e2b198a9962a1ec04315aa505db8e7bafd25d749c3a94a763f908dbfc37ce070f68be07812760d4de50692d06a31b9f84f1695cb442ed45cafc37a0cf53b33854ab73c7fc5db28b657982334c7e5bf653048103afef66246603e30d807f707e9bbda4458ec1cf08c1c31bd6f352e77a76f7807743a6c78b8111f6d644d3d4d05422adc33b87ba17c5e74e55e818522cdaec433b2786718220117cf4cf0110a342263261cc0d55be952531230269b7eec2ada38040c9e4b73f7cbb10f67caed3dd2e4675c62c2a50307f6b91d3060bd554b2df853e6b871d991f9369932b6e816873d4e40abbb4ca4a53241318ad2306f01f8775ddf23308212a0200122c5185aa6ac8015d1ad78e381bc2b085f74fc00364f8a4af8c65538de184cb2a8ea14e93e1c4eae763530b0dae64f12ad57ef387bd48423fa8d7d6b04432e02d5109c0c63e04b19acde2d3d3bebb123806e24f1379a4a2361678d1f3a47858ad1678172223e3c5f4355101147902557a453884bb9094103bac5604de02c4680d5410280d6b3a7d0af2db33c943201bafbb0af076b1eeb95b110f951ec01fc2ce5a2c12bf5c0f8d559d1380c6f67b3d10292f00ab39788ad082f2014d4efb7d84cdb266efb839326832d242dade726fb9f79652ca14eb0c0f0d850cf4cdb6a9790c500ccc40c31512c8c20d0d30c470aa616301476c59c3023bdcfc8c023c7d8c01bbf3eb7d9f772fb53ab6251dc8be67ec613cba91db882890fd0c7898d8f64f1d526cfbe704db8ed1396fc736fd1cdda7bbd9560c2ec1dab019c481ec63606d15dbde3de441f66b166b5d69f5becfab41ec0fb91106be8447b1edef6bbf29b29f51b5d1b8dad4d459f751c360299b85158b29b89cb961b1656ef8a76e3b1870037f9e46a3bd19758bc292dbb8e1c7129e69e2068a7f8bc2923370c38fe563d3c30dfcd08cba4561c93ddcf06301bdbcb9813f75d335c8f74176b8d92877620c2c1870c3f25de5702b52838066115cce96808f1f9b5145e68c0433ca2d20a70c2c6e58be2e21b8814eb4d0c5076e58be2bb06ea0a9a406a13f75fbee7789801e79bff13a405bd38aca8dd514bb5d7f04df82350f8decd6f7a975604c3587ea03f7caa123e703f7cae8c830a6cda191716f8c4eac66d5ac0f04298d6dfb540c7efc512fac1bebc6f33400a39ea96730aecda979debddbfedd9f5f3957ce38d25ada5a2b088eb77dbcad79d66afed025eee5418747ad661b2668055ad5ba3d73e681ad53a74e9dff2a11a59efd6cb157fe3571a5d9a36b031271acb5d65a325d904882e409e345eeec8c79cc631ebd5014b5d6da1b63e40eecfd4372872c9976603bafe9dea9e14e79923f23cd0ea63649fef86416b318eed0781491e498c73ce631fbf4c4c67127efe49dbc9373cef98bd85cfa8c3118a95f464826927cfdcee49318cb64b3d833edfcf8b19d1f7f67cc5ae7b074323f997f143f7ba5615bc52a9a3d67f4e725890f54a50163e763af180983fd38befea4541b66c2622fee84951c3f9c8d39e7f2659e740c1d4385a067a69a7a44f3ac5b7cd88fe559aba4aa76f8e2eb3743518c3d4f4c7c51aaf1cf264a357e1886942ab74cd274a254d88cb7c35cb060a5a155580d907c9ef2fccdf3d9ab0c833fea1f67b1d848d3b43d8ea379e6f75cf23c261f7cb7757cfc797cfc23f998a7f47d3ec63c5fe8ef7df3fcb9f330242f1c7b27938ccea3b5d6e4bfc4275d1f3e0f8e398ee1922916d3e58974d21d83c160b02ac6ca137fec67d8ec606a63fcf9f1488ea4f8324f574ce351f67934cf9e97d64ffe3816d56831fdae711ccb9e4cf2f494e7cec3fe5552a19be79d34829fa9f4c9a2774c9de724498e30180c86777e34cfdfa3951d3b36e6fc3866e6fc31f37aa58d3b234c9ce167ca3f3e367d62d03324e6adb4fce38bdf4301ed427dbda6ba862a3459fa7b11f63c648b0d91211e3fb07f7d16b398c587b5603f4cfee747cc6216f3ff30f9f9a1f128fa9f1fab336c880cf180b259cc62163fdc09c39f1d8affc3e4076b31ff0f939f1f6ffdfc7c992f74b63041d3a2ba52e3851ec7d6bf5acf43b65a3b3b3b3b3b3bad7f7d6b6ce9711c955472e7c7310c9b6a639122224774530d6b8b9f4b9a9bbf925979551194eb3f6b186b2d939d7fd2c29d30acedb0b6c51ac65acb64ff62534d49add6c2586b99ec77ad86ff7f085a55af5850a2e6ca95559579bad0df671d86e3388a3bcf43b6c6110683edfc6b1cc7560e77740e73c914866379366dbac34aee7cf86216736b6c8a852fcb410ba7c4711c69bb841dfee4d82294ada3c57074e531e7a6d8ce622c876198cfa63d36c5b479bacca6586ebd07822df36c8a6dd2748a6d263f75386228f1fdf1cedf6344935fc5d04253552d9f013ff7acd15fc8c385fefef5d993943b8cc28c4d5fbf9349c67ff190e3b8b3b3b333fe8be7c798ebfd4923fa29937efaeed2483bdcba92ba3c775ecf76cc0ec60f43322c5fe619d31ed88f02ce3e691bfc5ab5dd1b18c59b0d3e0f10fc9aa7f6cebb5ef4e9d9d979d88b45ce1a4d4369f0186bedf33b67ebf1c35e3ba56f9ff28c3dcff718095f2553f8f4794a9f2c3a665211f6a279fe1677c41cfeec88ef1d6d9e48b05749be2e5de6d93275de87e37bfee3638c47d9be651e5f14f3fb8fa5f710a1c3173febc01dbebf88b5c3172e52cf1afdfd4806cf139ea3529167fee306f7ccaa0d1bdbadae5cd842733640856575459c36566ddc84b1800d26d126867d62345652d0d9e7e8566d2860ad551b214cef62753504767c63a03bfe3e1df336c018e307f3878fdd26fea737c6f84f3d6e2ae00782a6cedb9e370495953e02f910b2eb9332c84cd995dd2736957d8e7a058f1b9d63bbcf6bd77a63d7b3dc1508634b5f67b45b41e1c4a6d762a1e95306b811420374bcbcfd9740e33d2def7bd664b26ff7d54cf6ef66aad89a62f409826e441f8e06d860911640130225bec042892b7850a20931023a6fb752428d4f184be8346090e42e0d075c5469ac761e7095e68856561a22f211d5973462f0d10f6ed2340063a58961270b4d1a3c470e9083860bd8510f68a87861a1b1c0eb280c1834665c473e8c41e3833e7a80179f307ac29811e6867dd6e884e19289d078bb15159d1f746cbb1555964f184b64ebd55a6badb5d66aadcdba6e55a4a8566badad6eb6d76b6bad7e6f4d627bb99dd6eab7be62c827ddf5b37d4a2b5d4277bbdb926b6d3de9fbf79930b35f7f6a675a3259b15bcc95ef43136eee6eff1fdb4d9db78bd44d6b514ee76d2595e60fee9d9dbdfbbdf7998fc47e255269fe399db76778939b8eb59c21a9b1dcdd3a6feb8c6da58ebd5635bfcf8cc272f3ccdd004be9efd095f67d45886c60ab466bad55f2c1926aedab019abe1a40440b4d1f5bec95d21efed45a1bbbdfbddf87f5f55ab325f716be0dcd282c37128d5c6db51f88c5dc228fec6f3024e3f153a92a50f56ef61373d46aa682a0e9e1df1fc31544d0bc64ac0d4ddfd69c6c2da13af24125c21a5b20aa5ca9bc525993ea7f7fa298436c9fd0f65f448ad021de28de311688aad2847869d1f4f358d29b58864e0bc9136a7fef40e1832492bbc50fdfaa009248c230fcc0b2fae0d5d34ad97d3fbf46af3b3be4917d115a378741d3bff77a9f8db5616ddfad6a0591bd12595bb566d3bf585baabf7c5918d0b5dd6ef74589329bbe6e0530f49eb187c86e4deb8fc4b78a9be725d180ed7dcc7b77c293e132b6fd31cccdaeb1a16a4d06a0a86ac0b6cf43cd02766dcc2e5241fab9909d4719bc2fd291a92182481386aa870744e1c26d6a07460f5657148800165c6e57cebe3ad0a0c58cab361540a3cdedfa072440010db091c4161c64b8dd4bc6be4cb490c5be37cd6561dba7354d1a7b02ff9951b9d99fe1f15b3168bddd0acd962dfba7d58a1c90ab574da6ef3bd079a0f7b4d6d6d4a534864cdb2eafda973cdaa0d2c6ed5defd2c8a371670fc330bcb6d2f0e511d91f79546483232079c4a3d2fcefb5e0df7befbd20f8d782e6d0076250cc3c70c29007ce188662cee34892ad96cba545318f64adb13863d5c6d9c99cd3a7bf4520362eb3b118c6657bdce78be451cbe9ce89296e986137815edef440e5465bb80de914d5d858fcc0c6e2171bbf18c69300c28ba880ec0a3d85e32632968865c754225d69555870dcc86655a232d6f63df8f8452e7c8815bced29bad9f88a5e6cfc3c51e8136f6c4fdddad57415a141338acc12f0bfff281c303091441819e4c8ee190a34a14512bb3f650e8afbfc3295865fff0d2c674bbe203bdc3e73669fe743301608ffd42d56ce96c4feb326f83c66f8c502e18f9951644eea0039676ad84de19926dab891d13f75cb77bc51644e6713830e57eca68f4d0f3b7c2c39033732fafd65d6166407337514a9ee9f229b8d4f118a8d77221573c694a944f9ad97bcdb184b8b5970ea17e733a37e57fa14a9c4d1bb7272e679429fb72a84d6ed5659a0fae77b9b9247a2d6429f1fd679cbec98d834bfd26f9614337bfdf7a0197aa9418b70aa2d44531fe036d18b28ba11a95ef4c18dece3cc4546479bb1718826ce167388b917321bbf78c64b58556d456ca6ca6036c6a19b1aa209adb648a5ad3616af36fe6ccb90ca83f08b5eac2d0ce361991c7608c4c6efe565863b0b845b7b0c429f211a1c7a8166e30fbd70a32cb715314f2c279cb3c372a6c0e4c8f384264b005f1c6381f03b49c2f7b7ea56d54dc9dabae1cf3c4fe853a44a329ef7eb8be7318f497716a8245269f88b2a0d3f92d1a462eb581e2834fd6bde339586ff9aa934fc39ac399b7a4ea5e177528498892d10107e2f525b0ad0d9c43f32a191308e3d7e246bbb5516083fc658268e95229505fab02a107e8cb5364733971f56a5e11f65f0fce363dfef46e4bbc3a940f8fdbff28b5381b0073c08ff29c1feb6f01eb8f47dabac0d3b90f7d7ea566d3c8e771cc718340eef4568dd8a589b48e540f8f1f73c407f58f83ffc5f5625723dfe2f0e1d521fbfabfce2541a7eb2fc5ae507a7d230697e581e84f18b54188b541be7bbcfdf3c4d682fc43c4f68ef2919428ba7094df7f9dbc7b1fe05aaa042033180686ef8de5bfffdd579fb1b42db4b22f9beba116a82b80cc1ed2406816e6c56fac1d4168b58efbfab83e7799ee7ddfb4e066087cebbf79e8fcdf3de107b18fbbd685c4e119a2176fd2525305102cd087c15c89adac2ed564880b14fdad516146b026fa8b0012bab062c3317388101318cb0409d31eadc31dc844b68d94202d05ca162e001a10c60422e2058eb1618ee125b66e8f9e02261815dad0dd6d57a921cadb554167f58923feaa7da62d9a45dff65fb5255b6a454dbdaafb6cc58b0b67d6b624ae5b2367cf25b36b4a7ebb1cd76cc23d61e2915f87e5a2c12cf2c36b3c5dab5ca626d8bb5fd31a5a21aa9d8e5e7e7e7e787c9cfcfcf8fbb37fd30f961b2499ed80e939f67e2e2c11fdbd12efcb09f9f9d4bd8cf4fb52e7c86c90fc6fa9960eb99a3a74d37996c6b9ae7ffcfcf6b8d7168431bdad01e096d68436b431bdad0da7f6b7f4c97512e66d4236eb03c8b0d91ad8778d4ff9f1f8fb3ddcacae3586d8ff3e3c52690dd8af6cedac61c58f1eb8f49ecd71fdddd5d3491d86a4b77b1147f2c6b79d6171fbbbb9b1d4ced3c861f9aa792dd347e7ed5946c52bb7a7862f9c5f1f38badc725a95d3d3c319876e19ddace6553ed7cfd775a9a5b96b4a3b5a7f8956adb57b2c51ac65affd368e6297efdfc9e79622dfb4ddbde5b4d9a268d56bfcf65536d7fdfbf4a261aed5f871f622c93fdd368f40c2d43c7502afae57b110967c991cda1bb7c522f6e6ae62c9bad27dfdad086360c4373367efef04fd7d796391b7ff63dfe70f6cdc61c7ef8388be53913ad686d69c1771a3d23a3632898b13e12ced272e6fce7a5c89c6193fcefab69bf35be78c4c39f658c6df86179cec2a75fb6cf42c7da35f02b69ad474ef6ecf2bef234f7f7d969c5d8028defd7475a75a5e689c2ae5fbfc7369b2706e90541b0ac3fb5eb5b1dace84c49239f043ff8d9dd3d3491e007f19489c2c6a65965c7263ffc5c82e5d964eef1418c31ee606a93267e771f2f588ae5f995e767a2b0f3696e14f6d88aedc0c407c3f2347798c317c507c7d6c7c2df81b95ae1bf72feb134b7583699277ebf8f731d43d3a4b4f5e78f5916c89ef8c1f244618326c68fc2167fccb2e48f66d667330bfcd698b52da65867f3c3b0bc2f964d66128f4926fbde1f9be7673699eeee18e38732bb0f6e80a1f8f03bfdf0373e8931b660e3375df831c6d89cfdf9ef22cd59fed9fdf0bf9b45f1c31fc6d8dcd8dcdefb3b7d5069176fc3d1c8635487a23a15d5df381c0ba8cd29b64a18ed13fff8cc99681ef14dfef8f74f0b30a5d89c89ff3dc6e64cfc59fefe9ab33c13bf0f9bdb1f7cb03c67e07b17dbd99c33f07436dbbbd8fedf690600b48224c93e9b6cfa248cf25045c08a07521334bdd226a07520d6151398c00424200109d031bcc860c68c999f7dcfe485a683a647200211f828ed00c6d808238ca031f815d4ccc8d412f0f37f4f39f0de5b823fcf8cd8bff6d2f09788e6125a441145602c6f87c59bb2b53aa04c993294ce172288208262e9c01886186208ffec967eb5a64f0cba874c0f991e32f58a566d6b5ab19bca80eff705752328ba5b53684bb7636a7f6a87e5f931e0b0dc20b6958aaa5a83e02207365cc0d8218925d818234f4d60cc176cbc00238930c4fc4f519516570cc0aa72ef9b59bbddd3744acb1441b0c005176ae898a183d572374f28204b0a3a45b0c1e576cd9896e510238a5ac5a062b4d9f5372821c716438c1860f649bb556477a38b293d622dad3ea871b594520a9a9e59cfa64ab33358cfd4ef553ad21edebd9ef5ac67efbdd7fabf773fd7b3cdc41ed3d35a6b45512c9b786c5114afd8fe2d2c4dffac6c36c5d80c45f182351aa3a2288a0ff2a8347fd1fc44d34dff191dc8df5afdc6fd7b7cd0d7a3fe73c1c80e84ddddad05ef77bd7bafbdd72a718307f9bfa8763cd02f311b347df0317e7a4ef0e1675ce28bf17b1fa6fb3b3debfb7e3cc8df93d85eb57b10a0e9bb1099529af147b1b67a730cecb3d5c5fe397d8e9c2ca421ba168dd5f0bd126ab6f7ae04ad755ca1a8a856a3d1fe7d4e9db3667bef496ccf6d0bbcd7b1588e4895483b2d068787695f1ecbc6ea8648d6a675744875339a9458a4e19a2170c855b1a6f1a8ed2046179a18fd3a23bfa0773a20aaa1615744685d9569d02d23bed0b2ed56717428238e0c4068571be21a64ecf30eb909438b7d0e65088471b5cf7bc730ac3e47183cec338797056b7c2d16b21f0d63cbec82fd99276836fdecef5b7326080c326216202187071855e0008ae2ea0230d2c8684c5c5900c60f3e153c910504460d14b02943fba28dd8045080a9e08b2e643f4e80a1e08b2b48099c2833c117518ca612583f388d2e876ab5222824f88288d65fa0cafca2061d3bbe945968e4884089dd676521d3b104d68eacab568e23761164a981cd2c30464756103b382a5026475618f14612b3ac177c644fec70783107e673c30b2d6ef454ed645e38c1c353e5e385999e989aaa1e2fc2ec30c153d3d48b1b48d888b166b38b91471efe3a27c76ba8562b4a03e728cd8ef6e2a5addcc0b4c02e24aa5e19185b68e6680ae420adbcb8ba504004a314605a5d74d9c96b76e49c9688c66accd2e11365f2133a301b39220562a01267422e1c10fbacc6602e5eb8e1352107fcc08ddb44992f8b1d5b140518afb666471d2b0d3c3aa2caf340383a4c40c11faa34f0e802603cefc49f151c2fb0ef5b624c05d27076b8fc792b0fb8c1c0896b41fb7d5fd6010b28f68f047cf4f5b059c3a201fbfb3ecf338b2acd052c60a0d2641b0cd0e69b05289187d038b65bbd1963e60d0e62de780181d673c4351ad685d800cd33850d1c4802070e14018426b75b71c0872f1cc0210a0ec0e0812b0be4fb5eb0cc51813cc0c2dd6ee5812cfb94557d21c8590c6badb562b0d64a29a5e6d75a6bd5dbbd5a6bad155b6dadbdb6d25acf5a2bb6405e6b1e5bb6babad4f7a097b554bbbbbbbbedb3f65a4b7ad65a6bafe7997fef1dbf0c5a6bad85e2d4f6de7b436badb5d6a3f78a60fe468fbc2debaa9a5a6bad756b2d0c479af17e3aec0d58793d7038df477ae070b667520ffabe62f15e467a0c9d6c59a7b5158a56f67d07faac50e2403593a3ccba7f785781eaeebbf673f1b5bfa797ff0e99cfdc26be686209b6c57e85c5bc95d85bb45da6657fca44521685d69a3cb2ff127f2a91fdc07711462f7db0a44b4425b2262189a42c3de87bc701db2e6eaf6e938120363d5ac276f0ce782bd177df7a39f6f1783dd7c7caea0dfa651cb0967bd06771e5b9d2146b8aeff5dc6c4c92586536fd3b86153d6831824a0b1b68d04011408859a3e68a1fd6dc3530c63a83e65eac2bd9bd5859368cb1d86081d22d68c0c102a55b04b1b3e957375a6fa1e6860de32dac986d514669c3b80336546059e8c0111674008e0e1bc6ad27c9a31649fe481e917afc4c1e8d54c44437f143f248d48fc9a310631e6ef841f2086bf03ff208fcde238f3eeababa79f8de6dddeca9166d25911d88ee20ba15596ca0f6ded8ae6f6904c4900fb8eff665160d032e8083181ce290e9c10b2142848009326ade58a0879b0d01132cb479dddb52d354291647a6b8dcf0e5850fa8c9c00b18f8c1e10159aca87a220320b86a5cf1444fac0a25640e5537fa25b891b55d29ae6ef46b3c10dd6ec831820241d4c0c38d3e6c03fabc687cdb3251a6e856a03b3a459041874d1717908016372b00315cd8b2a60359560071b373c0d8768756f98dd225fe47ac8d62d94a247b330b00c1191aa8a8f8a102b70fdc20200439acb9c200086e368d6dad7dc748dc2a279be13e524a6b1de913f9fd27fbce8f7f2a9bb310c00f3f67530a7f8e9222b3043ff952e1b71e3467d9bc813f55944b25259457bf673711fff724e0ffcc994b818ffd86cbaf34f1bf9226ba84d0a039731f3f0a870fbed4fdd15c22350be1fbfb4bbc07df034b29f2f1df528acc12327c4ace4208bff526e027df49255c5808bff52ce027c972e63fc50289efb7563973334aa589ef3717109aeed9f8f7fd361bef9310fec52f753f7cd294b2faf5adb2d5bad1aa4a13a35820f161e514f17529be4b7c320a4dad289b4a13c51fb5d02e7e09a018905e7d7032fd4c4b24b64e1beea4074e5f38146d766542ceae148c1bcec0c1cbf8c2bb4053ffd62f23cbb358e38d107e854b51018fa2cdae5760a1050f54aa15253de8d9d63ca78ec84288165bc80bbb7e0f2940106c9d48c208716189301e8514bbd6fab6be7d49616ee1416cdb5aefadb5ce296b762539c8713eefabb5d2fab53ee8015cc5ae5fa47a3a18b167aebdd75a7badbdd75a7befbdf6d62e5ae7febcecfa437635b10394bcb5cd2c7d37a5fca93f3567965afb3597109abe7f91ead48d182d2d2d39358d3e758e4a2d12fb7d4f2b99e45afb7d9f3db2d7d24db79451a68c2a2ec41d6e1638dcd8809505b2d8618141630791bee83fd8b3ebbde532a55c52649648e51f9f04f1b52925456649ebc5971a3f673a8a53b75ccea8eb97bccbf5a339a33ffed42d8a9c8590bff5f45bad173f6afccce341388acc92d7b7cc2832a798d6efbe6562912af2fa5fae72467fea4696336ae696b4fe856522f8cdf52f332acaa76eef32b136750d82bff5ae3f6b30b44c97a9c402e140fef86439751baf0776efa2902c90fdd1cc89e0372a22f88da4bb165937a5a25fa8c0507dd9b6b67e2c5d47a6154aa556d5a8d6b74c5a869e396995ab887595f56fe92ae9ad4906de9f5dd3838b74858170cfddfdba47ad777a9ee75dcff33c4befbdeed97bafbdd7d6af8859ccc76d1b78e08e4debf698123a56546994481121b4f0b2cf58173aac03016de9883e686fbb551669ecd3d98834e8badd2a8b33f6198bf1a85520faf8de581658cb3e8b2f76fd1f5aad280bab2cd0c4baf88a0130025039219d1428ba27a7575a527a2949b89c0eea53705abad294c3293955795c14dd3be1a2a8f0b9a75c0ef74e49af8473ca55d1e1723a279c145cd314294baf5b4acae93e05a7259d2e494aee09ca27b97be8ee14bb3bf8b97bee29973b7277cf9d8a6b4ac41d67a5890a49b9976bfaeeaec25313941ccecad35fd12d3d499a92f484ca690feefee4dabf38544ea8c7955c52cec952538f2739a81e4e969a745055723d9c2c35f5a809fd2812f211d4942465c969494a900eaa4a2e084ad29201ae3839494a6a9a72e5ca942bb5146a4a5294aca47085290a142b4957724d3d70b9271d548f15969c7ab83be9daa9b83b8f6b67e2ae846b5a4a82f25038dd1527ff509e929e3c353525fd95dc93149c1477a7ae5de6ee3eae3dc8dd63aefd8613aee93120f23827afd454e5290ad4033dd412ed57c029392dbdd3d3922e8783725a02b2ee5eddfdbafbe8ee14d73193bd6ab7db6ec32d66b20c36f8b8a0ab172ffa00320d6ef55ba85b740bded7e7e2a54bb5e16a9f2eba4be9c34573f142868a069ba98bf7f5bb7826192a1a50f1aa6d2fad1401b528324bee7f1f753fca7e149925e0d328b751d68ceaf2376a466109b1808f3fff7d5cbfd43e2c682cfa7db6682ca1e9e56ff4b18905343f73cbf9342bfb78a9e1b53c93f794e4c033a72cf5c0bba5cf177ddf7bfff18864ffc13e341865a7626b99abafd3bb9ab96ad6afd73ea594e2f74a26f37b6a7778efbd5ff105c56b4310144f2b6293c9de7bafb5b79ef4c3a7f4ebe7acd8f74c1df851f47ddff28cda9e49256ae3b72515d911ba4ffc96c964baff9df5296852b1dbe9bbb7267b7dfc76839f33dd18893deffdcfb4724b2ab2cdf4bd6f5a9e778b2695a81d7e2da9c8f667eaec117a9f5289daa0c974bfbef7def7bd3daf49c56e267fc7b42a41ad8dea11b436e79aabe78f498c685ea92f2634afd8d760975aeadf7675a4a5162ef777f6e9d78abf924af0df92cb95129fe2a9dd4d2cbb6870b31f965cbcd09bfd2e1adcee5b70cc5a2c97f1bdfc4d7cb0e4b2b34f4d2e5b5c75ead4a9a3c5be68eeec87667eb73babc52eb15f95d4b0f442bdd01b7eb1e4d245835bf85ee84dfc5ccbfc3767534ae4028ee037f1e94b85ef37efc3b20b192a1aecefe9cde7054dc5ebeccf641273a5be982bf7af92fa945c629f3e482aa9f5db659f1674fd9cedf7fadeb1d8d74923d63cfdc1f7fe3edeb60d2176a58d3ed0f23375a579a68c03fb9a31ba71200ab3d70c7ef5c5c329a532b0c1860d33360d999b7fd92b119510a67e3082892b35b6d0214e0f37fb21547101cd1a328848430b246ed582ecdb2f1b3eb8db5d0f19bbd18ce6c8de0302ed566cdcb04fbce9f8b0e98fd95567f67dcf8cd46d4dba6b585aa142e76cac65e7df4bdf3925dd5ee9b63cba48b678a944b36b1ab1fb92461cc9162f95e6db491bba51e841fefe3f748becef37c7f7d11d087e1f0882df57face518972777f6fa3545f99c3dbbbdb3373b853354200669f5a0d1f7614b9dabef73e06caf083ef854f77dddeff541b972e7f133f7cefaf9478de97c0c48d68510de21f9643358807f1200ee4cfc32bf29ec806348b4c29ad25dd53945ec94ce07b5e6bad73e8ec5abf566d6305fabecff3aef71783dfeb2bcddbee55dee7d06d8e546d38ca7d17c530fc40efb1e75dcff39e471d2aaab6f16de47bff81922525dcb0bd56e915e8fb1c722193bfcf74288b5cc8885f187ea2f87d089a33109b33d0f3bceff3a8d04d7a507d2fcfd1bec64ac36aa0d9f6d2eb41be87f02ef449dbb54ae4465747dc4060df1fa2cd89b3eff35052639634e2d9a6717fd88c911b2cdd6a8e1b2f52dffe47c90fa636f87defe12bc77ba5d9fbc512f867fef8a5a2c888e037d0cd11fc864df0a540d3bd7ab334705fca7b163cb3050d6eb78bdc44eb980456fbc440ced4ee98ffb93530fb74b9dc688e973936fb56757cd8d53ba2d4ccbe1fa3514bad1a728a6a126bde13f4a9372d7384c0cbbeb716795af0be59ac42b0dbb69a57676fb59787ec3f3d5568b74a236b0ba9cfc396a1143c53d1acb0dbed62d821d45b1d53c720f459e18c63747d3b831bd17de48c310ee465c09ca13a72469503f98cfed40ddbbcffeaf37cb753c7ae7fff9c60d7fb67d0ae121c29f1be775204925a6d812c1035738cba8ea1d53923877dd631b6ccc5ca6e5ffe3cd4d58860045fc765f72506f2b1f730a17bac34ecb1c99383f6cd047bf26b4f139afc1397d90e7bd208ec497a29868d2f86197f1884bf88052fcc63baa615ba617fc21e3fcca450e029349b27a218c34aba5b60e8a69b9a416586973920c0da20b8da3ddbadca90626770f4ca234a85a54fcae6cc4941d2481645f2487c212a2da339434505aa34ac2dcf9af4aac7db41e78f7dcffb7c7e9550569506854f4946fc9e920cf921c906dbc736246d7962d9968ed7ddc88d3e7495542c09db299960a615bac93fc90f5ffa71f864f19e7ccf64f26e003cf3e4f9fcd6e7064dbe6f8fcc67723e73ce1f7befbd7ca62a7b4c3c6fffe4f91b001e33bfef588ee558cee349c7b891679ea72b145f8fcb13cbc6271496edbdcbc88d46f7209879628f8a753d767d91ea31b94c2b748b7f8a3f8a3e59b4f8ad1f534614df7b916ab7b66889ad9618dec8cf1e793f8fbc9516522ee439b5c34a1ba32aadbed70994f9470fc40f9f0371cc26fd12da90de406308c50fc5300cc3300cc3300cc3f0737eefc3710cc7711cc7711cc7711c6dd64a2c50fdd0b37915b632c30a93e48003f1b307e17bcf41982917ef9247f83136a917baabd56a358f3442373612bee881f7f839f0cca87deaea0ae6d4de1cd0ed99519ee77223ec7a5cb65e1ee43de94698848d3b6e34eee4981be598c8e346228f07791fba117ecf83bc1e0ff2c4f7117d3cc87bd083bcc7f8bf1b6ef4ddf070b89187e3cedce8ce3cc87beb46d9e6a83adca8eaf020cf0bf27e8713e979efdd8d767890f79e189a3da6c6de87779b5231863e9245999ac5994af39d8b5c21f9ed9927d2b6b5d62cd283dff671fcadd56aafb5a52d00b425bddd52cafbfb6129f53dfe3cbe8b9f9f84f047339be6cc862f9a336b52b989ef2d1ab42d65220886ef9159e299a554687a8f3f7fa5db22d5cbb8f4dbd595b5cd2af8d48db5cdaaf74bf07f1f9a5152de87ff65efc39732ebbbdf6ae5914a033f974ab0d5ef990567d69c85703d53cafbcf4a7d7ec302c1bf20087eef91474a6e29157a2f45ce42f85e7c1348255c58f85e3467f5fdc682f7a139ab262d5369e0d33316087cbfe1b23e3667217c8f9f844f2a94c275ea86cb29909aa9206543d16cf062d18ad544a1539c9a52945ec74ffbfaf4f3ec5a7fef97f87b4fc6fbcf9cdda8efddbc53b7a25b2a29c15aea01a16919fba413daffc290fde77439aed3d0a7bbe9a14f5aed089c36c878b32bdd65506df1ebce97563ae4a3b6f1f39f2dda4374eaa0591a364fdaf6d927b65b2c61f48cf42440630a7aa5f51ee1d3accd73a0f0ab063c963e13c5392c29c614630a522b39709cc6631756f0015672e058c9a1620d5aed1d7da460d0d03ed65a6bad9582f1c0d85e3bb0fdeb06dc4677f68a5a4514dbbf2ee1b62816a85e5d29a9958d1b85efa7eff605636dd4071f7cc8a2779ef61dd3c63c1b7f069dd696c551fc7a531140c26316799027647b1c6c5bafae8a8e6cfb4e8bed8fdeaf79adf6481f06a516574a79b022c3ca8a8c33566490a1b222c3062b32b88c6facc6883385d51856968c4c442bad94d611fcadc696ee1aaddabf5ffd287e8cadb9b33b64af44f56bddb8e7d13a26a5dd6a8c33fb94e590d158a5ad31060c4d80be6fadc6f0b24f4ca91092f41c92f991749ece13cbafd6da0ebeaf657630b547b33e89b1cb15e369e1fc4c18b7488c6532a4f143fd61e9823d4f2cc41f62dc82893be417b1bafcedd279e46892656e61f16dde60db0f7396d94ae66f691bbeb51f8ae9f92235f798791ccbefc9974ce79cb35c8e5f59d5f29b3311f64cfa5d0fb3f6adcde6acf5fafab052bfebb5ebfbacb578d6328fb8b5368be2dbfca168cec61fdf3ec69824373095aef9f3e7cb5b9f1f8761380b5ffc59681ef13dd3cfe4faeff58f2f92a7ccf5dfbbbe19f9b3d6e359abd5c22fe219691e71510c1f87e64c7ca65c9eb39ccdd17e3637a8347f7fa44a137fbed25e95e74cac2996240c63b1a6a65853ac5aac71932bd6b449d82b8c8521ec85756ce752bb62b1aac3129a624d61489e4d186b1d8bb9621b24125a9b6db6d6c674b6d67eb644d8d45a0eaf315b35c6381623b26927cd9fb689e0d8b7680b8dd7796312779fe151e7e1b1acd65a8bb1d62eea3c24fdb11d18d287a10c29b60373e1d7ef5cbeb4ce7b1f8b6cfbdeef5044ca3e22e1d134759eced3489e435bc4622cb3f6751e92e973646eaeac8a60772abfade070aced8ef52f36b5d65a6badb5d65a6badf56badb556ad65b2ea35e7241914c9f26caab263e7afe5ac83a9ed25ce9fc3b3895205436ccca8bab4892287353998c1830db742c7c213136831bac00f9d2ebee000c653d111304972d07942097d035100d620c116a353841622b02b059880140318e9e0300414486828b2c20852ea5c3a07006301a60a128c01c31374e82431808a103390f9a109099841c74806426042f321001db6c4a1c34386ab1d64be4cd1210287ce4b0d093490b1993430be59038d3a2a1441470d9a3749a858e34d1053daf0b9800e4c38e1eede06146b24d1058e3616031c475ae47051744fb5a127f250baa51496949e9c2804dc1dcaf58e2f525872d2434a15272121d2656756cdeecab0bb1f7c163c05cfc8a27fd879de0852b0812c378c8feb33fa10c4f7c2ee7e10f68839645b762101ae093682acfb466c04177da21d2213bd2776f8cc2ec6244b68b33c9491b5d8793a0b0e0dec469da96617ca5a151ce2f5f06ef0c2936fe4a0e5c6b07395aed206bd7a60d9ab8e16ef025c0412b12e4b04fbb0b301f0d1e3133f2176367f382e8fecc3d23b5e1ea211ef0290001f8e4ffcce3136c64259d80312c0b2a1e5c361cb68f1ac76139c57ca379940c7351a5ddfeb521b640170958c3e5f050700ce40103c9e16fdb2f5ee68adad16b4d886628e6b410180309712f1057e20b5e01dba3d2ec537ec2c4bb8c30b62d71222cbebbb33bc8196ab8516b3c97b9d36bcb8c2cd14574d58554961041abe1cdd34c0c0f6e444c6183d2ad02e0c9e60421210ea4841050676cc5003934311d7410b2bda5c600d058810d34388021caae86680ca9df101396faaa06209094c61418189092524018103233b22f0e94183c414114360916aa223c793d38e9616595091b2abd3461a683039c1a7e765c5059848620d052650c40c0870a1090a041840121090b491828928d28039c2810db4b9c0126bd4fce0030c2c6cf9801c2baa58a3068d115c76382524472f520e1770b4686209248e3003040d32e0949aa0c0e4840120391a6204f422db48d1040376a0810b4e09850e9018391ae25cc0692385134c207184992280a801015c0ad001120c8618d9867c00c15ed7eb7001270b279a606209248e2802881a6840800c5c3ad0a4004c34e82144678d0f3c70b5b0c8f12506184a1840ad071960b8b20299b08e6da3b2e1ad51438083b810a8405431f447f5716b542807d90becf7eca839e80cc4616f50d9f5a13de10e0c66f5758d2d4de2186fe41ce22b04f107d6eff33c4bfde3224ef0c40e0cc1f0b63011185a1de3922c209898f689b8e88e2e7ac7afc955c192f675dd6cd161f7b52a185e1ea48ea221762209a3d2e5d1ca5287669e002efd8828b1c3e0830d5e5bea15ef074069ecbad062c15516ea19bd7614c9522f0e1b34859619781754b1fbbe1d4ab8f0b86e2c580eb2b4b0bb110e608c8d310318e19982a14434764474210748356830b4a4c7745d88210bbead4f077501c9e2450fa1051ae082e7e4d0aad92bf202855c0f702794d1b2e3d1442322051f936b0128444b05c270a0050233f4e81a17f2c9072fb0d9e52a5076d842fe70511272d821e00da22c2228e41371cbda907060758846d0d889201272047c647664440c8f8c232811a9c0cee7f220123fa31df213f39189c20f3b111f89c0090c3bcf6a8f7e217ca237e4b320835bae1256808f7c227883dc20fcb920843eb11c14e0e8b1005fe08108146411b1100884046243a2041c2f88c333b244e1782bf82260088ab787e7c12d2a42bd992dbd9e5a889f582147436458ec096d590000421ec2b4fb737f3e08ec2c68dd0dbc0bbc08c29f9bc3e5c3ead0b213ea412d141b74ad770013051bd43c391131c45555192220e0c30b53522b403141c13d41428189092590208011947cd0c111a32220340a2690e02f134bd421238e171a64308189e30648150514627e08e14803231d3c63fed8a03982cc18313e38200c15030440aba087d00e3a2c19a10e1d339c9840c6186b9a3cbd6a9861094a064344700c0d5f6ce1156e8018632484c82796450ce6985160024c704a4940e800899123a3211f40b0578bbc3c20c08516605841d210310404a60640828d4816bb535c8180840c30200ac1af882e4718d1030e36c0708006f0c0c30c4940c8604805235dc386a0ceb9727e8c9a75bda85b78587403d58aaa81b08a918a3a456d53d1d4222c1195e99ef487eec03abc1ce48dea537968ecb5e3c1ea8beadbaad9136b88710541af5e6a29fddcdd2f7077d171e81b574d4e92744e4bb929fa8610dee424495745ca0d1afc8d94704efe8a52122ed7941400159e72b9a79b1cd91c2db3825afacfb54c015a46839631691992233d94a7077ada3f4e6909ca69e9a1965eb7f443aee4927249519e7cd2d2ebae38916920eb21bb40cb7420212d3541013d06449ef64a4eb8c780c83b2da5807352002121a113e2bc717f23ed73848f03b48f0dfe46e21be9a0e09afe45245d94149672ff3a28b826245c9427ba242918941860e0ee3cdcfdbacf12ed33e4fe504bb828ba2b2b7c1dd0dc1b80bbeb5cf74c81ca0939e5703a5dd2941e391d94ee39c1dfc8e5ec901c9402faf58b0175908a2a792f0aba8b7a3db445f18f6b737bc38d00ac187bd752ea3e55c8abd310ae06d4c1219ebb3eea9452cf1baab93aa5d4d6239482b4526a3f03545a29587b44a0f4a3a0574a0ad9fa7d34f1e9adf57ea197d22ad2332a0ddda3b75a1ca567a5b46201d459a5f5bb95865129fd2a0d81fa506a2bb68067c116eda194d22aa4f2604b19402bfd2aa5d536a1f58ae1501d6906987a3f16030ad67a7d58b1560ae422a207b83eb211aba4faf5fa007a2ded7a955af712403b40bdbad6daa9d34b2b1d83e26a01a5d5abd5520a84f6a0988eb5d6fa01805650ebadb46685f20d4c012561386a0ed4ab37e8a5967a55525fa4d7ebd2e78f4465b05e5a807a1126aaa51fbd2025a905532b36b2b4c8d25aefd731a4518f52b0767deca8d12a7eb882941ad15a39603f1ad66bad50b356a1d406d130578a415a8bd4086a04558775ebd445bf5a2979b5bdf546ad957ef442a1e10fcd5ea51e6dd966150998c34a9de011ac34048a29b5955e7a84eaa8426a8e9a2b583d6a69a5951a511d3557f052eb594a6dd4521a0de948291d4223a8a20529beb4526a44e9d75363f456ea5d2aa4666a6b04d4da5a6fbd5448ad1447156948f1ad945223aaa38aa0a5175f4aa9eda9cc024cc45ee0514b437a65340c8df209b308a80497d6fa551047354f2d1fa1b4d24a290d72d0a7b80953540e01c6f0274098ac2b029470e20c20a9034308600b2c5f526ec0470833056e84a4362e4218340c10a17c4a124298538e92a4a1221f84890004479272d4848491f51092d40ac2b605f9632b454ab405658308a90e0f44df860b21ad114110d298ca03eb87271e5fb3e0022a1e64ec40fa71c7fbc09c6aa7008ee4d1e07fb7b85b6742737725ee2ee51a86e449ba24a52638a5a7274b4e555a2efa0185c26500ee54851f779a23c72b3425a5240300d170529ea09a402d0901d19c54816aa284637a828bf24448e79444abafa1c40156689aa282bbd73e8387aae2b4e4565c666a9fc1eb9c92a40829393da5909453ea7125059c2e29a783f24648a3c91b32a430c3498c37bb3717484300686865e0d420c3070a0140553da9b3a445e496011374f010fd9061024a190a8ca0e2544502dcb8da74e03485290b254cc0787ab4e0e68a06e4d464a08513c0084551f70ac2173b28b03f0099ba81268a321b6073dfe00cb439238e043a383d5c3c456c582d14100a252003eab224f60b0dd4306303627210c3a9480ca535e70eea7ec70892b24f60410832b2b8bb045dca784a62880e4eb877c616ee6070d8b9eb56c469172af70ab4bbcd7277257717a1e0949e3849125264230a3204e4878f5a014e10790089349ad44b893cc403fc1b3d8f3fc0ffffbb7b053ec1575b3cfcdaead43271772eae47305039215dee09aaa929490a540f255c2e290a540f5dee09aa07eec95213d407aec70d7238a5dcd33725e99e749ff4579a744f70b9dcd393d73d393d14ee49e989531528eff404b5944b9a22e5e9c92be19496ac3ce5a604e5705055dc9d88ebd15fc9a9ca13940f7aa4021001791e3f4e407a5c0a4e49b9a5c72d35bd0eaa8a9437d2392d355961492929d724a7836a22e52907c5dd85b8ce68a03c7dee092ae9a3e89654f81c4ec96929490a2e87d325355579d294f4446730eefe94c319e0af38799cd2929525a57fd2bd6e8a149c4e9754b138e19a564892524da81dd56ab89a047c6040e46b424d9ee094cc44a006c569098424102e085af2119620e100c9064d3840324293127600a054711225e828087784a32351a6a2504d288d0f3d06193c10cd09d72404a5cb254d415341ad02279fc117a07602942a4e9070f7155c87113810ed8a6e8a145c13a8252128559c944f704a3f744d507a48a9e2241abd2ee995704c4f969c92a6e0348c704e4f2020bdd3d3926e4a121afa40817bb803a6b93bae4a4e87836a4a82029513527a9252aba4101f9fc1e772559e58f046504942841409b10921121244c8901020427e08f121a4264448515191ad88a82848d1501190a21f453e8a6a45426c45369b8dc816c436640362fb61f361abd984101511d988888882100d110121fa41e483a84624244851105b10a22041820c050112e447101f416a41840c150dd9868886820c0d0d0119fa31e463a83624044811101b10222041800c010102e407101f406a4084fc28fa61fb41f423c88fa11f407efcf8e1e347ed87101f453e6c3e887c04f131e403888f1f3e7cf8a8f910522baad96a44b520b5a11a90da8f9a8f5aad06c5dda7b8fea6b8af5083ca0949a9e2d44327050a2ef7f4e405fd65a0bf1c7fc5c9a7e0b4f4ba2a4efea196705174b8274e495694dc4b70ed15e1badc9393247797c04bdfe1ee45ee958a0a014f43e5847455a43489c0dd75b87b0e779fb93b0e7747e2ee89f0c3dddb0057a529c9ca23e5724748ef94f44e4f8f04449b929453c1a98a9191aea90a144e04a457c23535253d71f71bee4e77dc7bdc9dc77dc7dd61eeba0a61e96ba46f06ee6f04a5e454e5c9c943797a5d95a77fd235d12d354d817a0c883c544ea8262444c84710144e77c5e564d65579ba92f481bbbf3b15c2b33bad7277135cdb0d704a4f4f704a3e848208d5828a82403949e2a6fba5b93b0aae2b1b77a89c9093a52620423f84888282ae24e572493da0f8a8d582f84872e2e4c70f259b0f2844414f4b4250385d52ee89d0959c0e6a29055caec7530ab9a427423d9c96ac34e1987ae0a43c45e9e1ee2df78ac5dda5b8ae463ca4cea8840c1885390b114233020000000000000316002030140e894402812488f250d3e40314000e7894487a521a4a64511aa3300619630c31c6100000001000121a2a0ebed94dddf4c6df88deddcc8ddef026e6c6638203c10aed8327b713e3d88db3582837a67717a41afb97eb68a57f707828fe5f79c619d37a4966c7012b7db518e7aeae633b01d3f4b90823ab1b5a6ea4679217928b4abb0bedd6ca796c6d9fd5ec9d454c4e6c9c2f988312e178a31209baeed2b721d0ff1b40dbe4d66b549cf42fe4fc03f2b8055d4e7dc20f18581faa725834a30fba78401835fe73ef93b5fe791fbb7fb4fc919ec59dc113ec5323bc7101d343ff0cff798df5da09ce468847b323ac7a4e743d23444b917dec74e16314f87c18757409d1c398a09263f639b87727e50f2bdffc5a51f709dbfdd60d66f93090fb8e7dfe2907183f4caaa03773f934037da1376cbf4e6abc4a3476c0dd90d19b6c0227c210e71f1bf655c5adee831f3cba6c97a028de9afeb3967754a93b67d74b9cc5786698bffa63bad800e9bda6303590611b7d22518fd58e027f78491248ca7a56605f09e3293b995faf52b72bd3b060f4231f01f2ffa2e77a90fc57cfc07978be9fd70792df27a2a26827d7ee6f3d6bce274b9cd3df8a0461687f6dfa7e7952edeffde5d0b77ee0db0fd501c6893fb48339f2167f98f4f634eb31828923acdd58425476fbc1c19ffba49a69f7c22e4bea6b187d7dd636378703bdb441c0344fbfb71a374f5b9c021c50dbe440b6f1782d85b4a9598daf9519b51528745f480cb8373746def2ae8f5f91e1ad6ed3f4b10fb099e0cdc70d5963fadef3db3dbb68b1c99f5c9130d83d63d4e17695a6fb94ff8b213f65c06b0ba49a25904b0ddf8bbb938c6215f6fd0b6215fce60b5e9b8988aa1b12a97545e9f086f7ce28725ccb0cf89e0bae18a440824c3277331ae1875cfbe6f633fd74aecbea08a27588201f05f545c058da7a0aaf3a9e32744c86a0ff663e7fdb40f981541009d2f23f69ff7f76c06f0f19709c79639ad78f03ea24b598ccd0c4c743fa4472e3f4791a25360dd64d2c47fbcfe2560c5612ebbc1cff0ee8ea2087da43d33c0d91ddc4efceafb361ff6a66f6f1ba9abeb44c142fb5263f70a228824f2d4984cc13e353e0a53180896d7c37476ab59326f9b41c34969a34217652fe17f8b5f1f801e19fd5d6cafcb5f9769cda6d5c0514a32a8e10437aa220ba8dc6c6685876d770cee722eed83f072aac2a7b8ffa3d7f0342daf8b530db3c8b9f2e10b17a87c717248bc2d20c08f1ae8290feee3d5dc5f01c534e0bdf0eccca84622e51d59b621ff020ac3e21ebd8002dd2579809fdf115afb252817e82ae60d0bf288608eaa5472e0a5619815c02a29267423f46ac80bc177174e06ae8966448da046c7ab8da638d861be1538ff0944c2103edbc642d500a3e4680e11595877f5f37fc8e95bd9c077e8f877e00d912444a2f0e642574df0c5acaad6bd3249caa3336f235f49be0436335de1c010145043c2881ad67a3fac4d7918cb2ec12821e31efab02fa38851f7f2967fa9194608e141c3b04b861a5b29328e3079be1816503dc2ac67748f5fe0a6ebafada1dfea1e0914645a5e231daa248ee9018c7cac9205ac779133c6a12bff799fac2c6ceea9f101e0c863306415d03f3c3b164273833b6d23c1b559e0cac07e128b499959c661d95ab3d3a700298ce9a6edc51b3cc91f453daf33e5b86305590aa9db53d07ab1bcea92b4861bb8699382ba38e312431368f11b02e40a10335d370cc511cb821ed74967917536b5d57b6298b9c5c097f09acac6411cc6a81dee513e9d3a0d63056dfcef0af19d27a04fe608fa8149e11c0a9ed393690565dd3aa430b0c2dc61ea2689b246cb8c62fbb940c4fc2eff712b9381ce57c59d216483e5e9c068153c5296a1c24051f8e301c8b4131a7f4e6db120c3e5888d458c59c2b9edc5dd10b055c10a2cbe76119025503bbeb62d028b79e69de441f83b79112cbd15b524180deb78ebaae92d0fb73672282830cc4c61c0b118b2fd6e630331534214e408f7c82c4927b082ee67fcff1ba56a6137f627be38cbaf8bb3b473e96103d7075ef06a7c2550203f2e76c61baf0e73574924fc5e60d3bb8b1643e9553638cc7f7a473bf9c9f1d7c390942ee0898dc2d82d3258359bbf113e7a5508d14ea223249a601ea62dce8dc16f3ae4b0122d4c9aa59c5f0620a4c071c67eda405a7a219a2698066abd13e0f1904165d66c8cb1ff85f5bb8b50b01362c1b94a22a5a718860c9ab6c56cab08ace369ca60b4ee07dc9a133915379c63b35573c1e9db6fd6c59f5ba9c52d0a741cada620c6fc2cbfd59649b2fa4cb17bf352ff94ef7227c6066abe24218f92374bfd22699178b1c01d2d8848dddab9227b0455e7d04e8a9c71c278ee17e75b956e083bc37ef4b262e996c90b67734572331bb29361a885880016b3e25ebfb84cae69caf5d5230490f9406df3e38c2eda4fb4f68777254788cc590993274710cf837fe1197ed983c462fec5bdead7f8333ced33f9ff3eeef8ce16da7364331c6bf0d0c05db419150a0d461e32c0105e604b6c498ca5d332aee698ff11ed4e0853c1bfd48b0f3d04376d0346ed4a2fd3b490e3001759480ce73f217428b044dd2c9ccf1e0259a8b3ebb68d5ae38f5fc3a61cc82106750e5c4c45f0a5fe73087e99441162755877845e240556ef73033e7ce9f471fe89603e9ce06f6b85a5c852c70c2e3e84278ea801faadf4da111a1edf59fe79e7b34ba699c1d46a2aa5ea5b2185e3e5721aed128e623246cdd1d9a24bca9e6d4ee645f92334a5616c20f0c942513022314b41cd5cf82d723b4fb3c5b1433aa2cab02a8da8993ff4d898a52960834ffa118008aca24291faba5d89151623ed18e40df4cf419f8324a9eebd9f3bca5c2af955020d67d48b8379b89376fe7dae565eb990ca7b71f48fa1c439fba9e72112d62a7a65f3cf85339cd5a5fe47935178562e5e3fa1958be7d53b7ecc58733a46d81cbec3607ce6c24c420081c80c77eb4fb1fb017bacd8601d7911951b8273d215ed32aa8623f7fcfb3d04e76f25d95b943b999c6516ae1822f4851b9a0efe3a4a0e40b98d4e87f41ff5f0d29a4cfb68c99e8901a30113e284eb7ea5b27958a378facc231fe907206977033cd9f89efb740cc109a2ebff79427be44148ec8c95f356cc4fc646c07e354d9755e9e012b6a38f626406f6c36b49d48efafc9d81010608fa5dbad74af6932e90a549bbdfc20eb9f4290835315582c43dbd7f918aaf1a9b629189e982f43ab0bde7d04509bfd0a02afea76bbb3ba277076073b5328eb00283d84ecfc1553d2fd8a723c104993a9cd1e2d2cd6372bc4de8b1c887b7248c6084d72b6e739504b1510ec7cf80bf49fbcbc3aea3a3fbb7f2d94b8c04d5674dc0c1e2a03f4fe9903e6d190a8fa73fd237f28b42e6fd62d4a49933b4197c4b0276382c162c5e5938c19a7ba90a61af829d07c400ae82f331b70a6a3f4349013f6fe4e8d1bd8e7d52e09679ee44c7968ba2b094e03e900e5a8515da78d4119e9ba08faab3bf489d3a9ff4e95d520cae041602b367223fc47c643f36dd6aafa1eb2c7632e73e005abc08775dd748e82d52f7ca6c5f9a3f9cd9c72ca09828c43351618d99378e4a326f0ff7d0dec0be410973e2736568bb748029e95ce05b9c2344bfbbcbb3a37004a804707c20ce81a80876d40a9001cf49656232ecd1f1b245b3bf18ace8a93f763bb34fab5612e40b1a5374baff895b5a1ab7ecbc61594fedc9b72bd763eb09cd53790530e5dbaae2c86e1a272eac0b7f74e24f1509963738feae24f11fac18a48fba8f5322a79e1d165370a43eba9bf503094abf0548016c6dea8f69219f355fee35b4d63b5c97fe1bfdfef0485850b0e4f443891f260a93f4c7142ddb3de7afde2071a4fe64602af8d8872da83cda1e67b0efd7b18d372961a416b548efe7715e694bd396c43ede871eab4a6ce79782e053a96ebcfa5142549aab57d0a1c0e40437a43e47188b7eb68bc63302bff9f836a059692094f3dc29316ea62029c13d97ff8b9f1c0789dc3e0a4b0ae6da6add0ec7d744c0ad3e46339cb567ad5296d5f86428b6b15f6deb0148e427cece19e5e68e33a890d2ffc7a440cc7eb3925eba515a657102ca6544d4f214bcc6cfb5c7421ec65217c336b5bac9d74f802130772fea07bfae4c3d78fcaecf007467fcfe21275c71413fe808caf479f1ae5291e00b52c718e652f45c82c094707351f161699fbb50eed4dc8addfaa8bf625178b193d23026107ae72b8635d60dc010d9382c2d2a07620c42668a0bf30a3c3ca3fc707ed6422edf955a92068129c86124213be39b4607be4a106684d505d875b1427d263d452e7e56b1555aced1542028ec06d45d4fda49bba879c948bd237cb03b2be1b98b15bb7ea0bb24e3118b8b54b0db103d258cc208bdb2430004b454718117bcd8c7fde334e706c4124c09328b659178a613e13d1f9435bff08184601390b8ee9f8e95560ae54a088b79025ece32aecd29bc3bba825acf5b0d3139e22718af9c95a2a75a0157730c13a4431d841372b877f607f79f3c28c2a76a11615f682a9f8bf7a001300058ee7cc12ebfac58bdeb93073f23cb51091ae9416328444578a4e850d025ce4abf2a408313378d0f3746c68a0fad1a87f88ec4960fbbf9b5c8b0a5f444d62343ea0109605b8137654af317cff648ffc03fcc321931a7088351757dc1a7cd2b4ab3937a50bb76754a36e02c120121a067cd87e5ae88e86de35226e7c6f9f4fc95ff2eea538a0b22b04889d8167e5a49c32c5251e174f60982a1c5eaf257e2ae33d68cc350a9e958369cb77ca3804284a995d01f18f1662114951d6fdef0da8f9496e0a170369a8970d99ff8343330c5e5eb2197b6b50640b1992f5bd900c999161cd635e2d34a86698e88c192dd94b7cf36fd5808debfcf4d665bddd6d19a930352c6c62ca8c209e0224bae792bd3102a2d52a348838851def9ac031121662ef84aa2239e8a42428bf3a01a2e1c4ce4cae6bc123a6a928ce5732dd31f378ecbe024567dfa92b472d10deecd93519046e5ed244a547ae9919ac589bcea55079e9eb19af9a66fa1519dff1950718f6d1ec68abb9bc86b0c545c78adbc38374e0ad7377030212817b69bd69c7c69d80d07c4a55b7a4565e1d4597fb3c60d28594d8fdbddb22e3b18f8716cdc87e1e9e06dc0a78b532028efbe10d0577474a5cb81011c9a9b39770024c34a94a3c165b9a1d3adc0c04403541d10d0fa8e389761c6b8f50da541b1d646f9045a327b5fecdd2740210975fd261857f85d1997f7f477b2f4547fc2f9e9868ee50c3f7e4642d89213f136f39d63cedbf7a410e62a36ac160639fa947c0e0852c479f58596fdf5de8f429ea1a725793546d106fccae001ebbab0ea88928d44e2843ff4b76aa80aefcef4bd8c84da9769d14c272171ec993cf4dba02e7dbd190248677151b9285d8caef3a9ef583ec2c5307672149ba3d2a29a643bcd6add5d8f12c3ae9701f01c8199f3fb8f5050646e5d106678471cd6cd87cdec2dcaf9030543f8028d3e7a019c35b21f7a1126604ab22016c17741590e3ff06df5f3191de5432e5a111236ea45a36896c09f2dce9880829d8fb568cc755b00844bbed6cb6b436a1facf5911402db099e396135e5766f27858d32242c2eb2e698ba022be8f94aff283e59b6ff9124a526422ca0d07ff94b9b4a6bff2573f0265f17c5eac1947588cf7e3ea758b33d2a2749be87a3e18c184d60e8d08d970f122d34ea7f05fa8cd81a0d5430aae3ec031ae1efb182697762d3a2d0cc61eb727f930cc3bd4cb1bb370208a38c2b4bc7b817903eac6d3f33341016df98be847e0216d39e2cd1c7f2290f62b6c495db61c0b7c5ef2bf7996c03a5024ee1f1e2cfce56992ea592ef7ca2e93cdfbdd243f5b1e560df1143e646cc39a7a0d89be10610f38a1b4fc955e5abbe3512a1601e5a50a4981abfe9fc88b37aa31427b4cbb4192315663220fcec011621530cc223c96f69718b98e59d2441f59901f0d9a560e452a88f472c79725418471db60874da9557ea8b3cc78213d6d1a7240a8d899564a2019d45cd10ee942df457739b74a748cd9e8927b281ade1f58f71c2b1ec041e963e458e57d3df541c4a0be121083272b407bd2f32d1693a64aac15bb760f18a19d7fb7bcccf5097afcccba40e5fe8d4c11052ee5f699c9d50485ac9845e0b4272af86d3acfd2cfd5592ae8cf893b15f934835dcfe1afad983e9b5f90460aa7b7e543e3f7d813611ee45bf72356cd3de1b8fb6175171183709c11bc3863c65d0513fd962505689acf1256598ca24b0ba591656b5c871f096c38453a3ab30c45af9bfd01d13dad351ee35bfb4a1908bc1de284987c392302ca08230df117518c0bb61016e497373d79d37b3ab821364641526122be80653ed620140a46db40148352f06b0b5646de0c40f3d8a12ae46b7924ecd2284682244f08bb5e4abdb7214a66418002ee2ca0a400e9f77d52a648d4de1598c096b015c47050d7d69c31b25558288771fa1834174a0c9366800341eb0e75f46c549f6f395640a86af4bce4ebf143477e5b747dddbd25eb302980cc27b731b3eac0236849b6740dd50b523f4c50a5af670132e544ff813ce06190bf1110c74f4ad26501b2225539a69e9bcf1935f4275c5e4ea8d62cc7ebf0592cc802cd636a83be945e7309813f20742f7bdc4698baf6bd836fe3fb2312c8bbf3c332fddbdf7d5ec28be63d5fb091faf537da14a90d1b6c8536ce680518971dca91ce1f226d54e1360ff557e4c37b5db8dbf8df316c22eb27dc564855dd010e5268c909edebb2dd3b88b1aefee06b6f2294ef46d3c148633523040801f4c25072253e56aa77da0dda368a3fe25235204e5971084c86f8d83e4cb7c003fa5b04889532416a41a6e71220aef535fb7ebbd12937459c94f56215b2c8e3e268e499a9c557384d8048039da9e173cdb134828674b20f7a111185a8b7905c64ed6590eb4d2f490ff7ca2a3c094dda340c6e156453051278279dec1d1351d4d02b13f898e347705fe73072e647fc18beeac45bc1b0c41cb477500bf194b59289094b869d4b84c6603dbf0197f8a2f594ec28bd2538e29851bd53095389c42bc422295d2efd6c42df03180b1c8c9f64a5bf54abde60a4f8f4425066b584ea5b6dc9f1f3e51b829a5734898251523f8327870e714d5c28259762eb533363edbe4659df81f5ffa1151a6cda5d43243ddfacd7865de150f175bd3466a3abdcf0c3978b852a44b00e2823da045aa014fe2ec05d05911518fb2c1157b12990bc1bc63d022d8cad8dc5970d28899bc877866bc2e44de3cfd0534900e29c8c430c318cfd33e4a95777f68268eb929fd28f5ecc0ba69913ff16fe7528054853b9b55f4a2ff8e498f815d39b5cb38e07749d3b0efef54e01f9665fcb7918351fa7c2198ccf52bdbb3b357da18f3a4153f1e1dd10007d8b57ec969d2a9b92923c6879006333270acf4356ca5e2061a3b535e348d4f92dec037d5e71936c4aad8d7ee2c5043554d327b09a30d1346a1bb21e147355608f6ee3b34f86255211ffbfef4dc46d48f4d087f75c59e3d6cc26d6c36b2d45878604fca2882839998585ee6bdbc19187f62a9d2d969614a8ad7ad255ef3247b188a4c21e6ce606f5eadfa6109736e5fa7b5c19e15b2e7819a991422f86ba6691d4e77cedad904fd7cd3e13c5ee3b10291fa60cca7cad02e646bedb6363ff349d266c49c3de84d3d8500c1ceaa40935f166d35ec9781a4a8c28d7e454e1e2b92f33409d302cac8048cd4a373fab8cae5551ceb76d48854fe3bb957615a74d431fdcee6c4b6252ab03cfbd3ba44f1757097f47e372b788b0520e7cb4474fae4573b020823d8f7b801fedc92ff66a6835cfdd6013717dbcc2f2faca1458311ef0d3a0f9767a0e842c3a44a925f44a6923eeb79445182dc61c1f9e3bf9311fc24a1927a08713b37b01b03542b92082c7908f4c01101ce4bf89044ecb35a2180e347a980fb89aabbd7ea1b611a2f20fb78abc323c40b74c94548c8168bd3f3204d062ede0d0f41b617b732153220907f6ed1d670ca2419d72b2da505d80d22e488ee43a848c0f979436b6064192e46a45cb9ef55f8a5c483522a0635d5f7112bce8f1aee32d8aa47745296765a48189ac61e10546820482ed3a5bdd8ada3e9b8dabd692b29c406db2551f593a986f8ac643378f6ca61c6e23fa8fc11e9264a07b1430f371817bddd2cd6a073eaf5ca620224d0de634c95c288cb4cc0aeb3228636406d56a20498ff32876c30240a2d4f281b8ca0438a50085ade9a9ec664b27bc058f8fe0c5310339ec44106b079890c79128d6d1dab360aee3d7b45d95ddcb536e271041bd211c1daf6c235e26962804c4c69824065128ee8b532f533dd417ce77822717203b04d05ec5bc0a0cc023fb421aa58abb5d224fc6bfde4de9d3e7e61ec6b70e92409b04ac3e829fda170e13be57313c4c863315b03315bd52c3ff64f27e5e8e21b8435c359d3501f1a4e0cff4b3f5310870f3643afaed253aaaecd779894fa234124814a2cbd7b233bc44621e48712e911eb3185067a520f810627b80a5ccadd709943eb2ce35616845ba81b44065014524a82d760f4fb2ce5265c6fa38ebfd0190f16e8b6078061e9f943d76a94c9382d1e2649ae95a49836e69b03e090eeb2f4b49ebd3c135685e817f1f058d1da83ad15ee80c2074f6963ae371356510d02b485f0a677d88eab717fad0f6a582f6697cbb1dfd80e872312c779828e133ae05d81f46ae42168a232e4182e42de58355782c015aedf0433970963797dd784f4bfd8a16414293a615ef9548022c708222820f30dfbf2248cbb60eed9021a0e0ee2503e69dcdde7bafd7de7f00f226f55c7f6a7f3188a6a1d9bc7880f509660d38b43fe7a8fd41989b7b650411157b0ea678a9982892ab6b4612b5118ac4e3fa713fa9d0aab04aeda1c2b0d97e2c1efe5cbdd05775ddefcdba5037e0df684c0f6084d52953c3460c279c62a1df0cee59113f0059f4c7ec1632da1a6aa27ebc38a9ea776ab3c312a6c83a717f18103ef9ad4322a21c804fd3375ec0f5bfcf86887ef40689f1ed84b404962e5f5e8df66ab10613320fd974911901a37382ef5d8c2677d443dae2d2c0cd969932e93fb3a7d8a026d5de760a0074090c05f3c083e71e549c79205bdb2c4556b4c98a18f90fad7484e4620cf1029072236d31b4940fde5d34a15c3d06950c1d28062f21618ef3d29d4513ba6a74922a3e478b4406dcc96859ccfef7ae73a79f62c09e72d95ca688ad91e82dd465f73b149d8782ab268c4e0f89f43561bfbae273d3244a9a2fcda203790aec14f540bf6936fa9ece2eb0a5b0af4bcf9f9bd0d4b7204da50010eca3c67e404a6515460261eb9d31813a4e35d73a380c16a098cb5f9531a218c20d6d0fcead7b30508920b0d700330677aa00f312e66acbd15b9e7effa93024658ed3d9c6806379d18cc194f97d5a9d24515f82736fb20686654f8f4b1f9c341862d988999b2cc17c68bbb944af0e3da0fad132f1a01d9fcbff196adb4dbee26f93341165ea4a5048734a2ee585a2841e289dfbecbea676b8196987c224ac99261e980992cc1f07a6c59d695000559f73870086c0a66e435947e4dedebf6d705678987d68117a10b1d35bc7cc90327f5fb16302343d40061afeb332d0c694653f6b164f49a621426473812df50779609ca338fa77382b5c51639b510729c054e439a18ca725340e114d4aa7598dcdacf1f87b8f7b62875d1bd8f9bf9dec4fd85e375d912c8e2b7b421e721ab7dfc1a28c4753b32b9cc021440293414c3ae4fdc28cf1a37909d91b6e621583573f391eeaa3e927fcf55ad219c65047b62df66f7f5d352efbf8a02706acd35adfe481eb8889ad076992fbf7c04183b999e2b1bc14f8f0e0164a510fbe6b7ec0ea5235116af4a02d0a5ffef7f497288fb77d47b282345fc3b983dae4b591711c99a1cf1f27e84c0c4c4c762e28884d95491a1dd4be0ebce06c66273e81833e72206ce1fcf558e8cd424268948ce9180eebc86b154d6c5c3bd89ad90c4f98976a6691c9cd41adc661639b428ffcaa8e0eefcfecaac042ff4470443c558961f1d546948eb1d3710ab6b6396dc6d1a3e1f7f382650f841d441b2b5ff19587a4ad550adc6594f1c400702723bb559a4b4c7037d1a36b18d95a150b641e72bbdd59858654ec5472f52a930c452171fd42c200037a1d8321935afd628a6656fe5a239e5210b72b14ea2896ac9078aa7ab55a0a9bfa151cca1243b80a5852afadf3d6aaaba1f3fd2744163a079b91077d6e0007d095b42d6456675dab43be4131b8aa008e44109ea1b6d66c4a92ec929e8b49712955d6313b2081491844ba5c6775028ed055ee87518623b58d738e79179554e4a58020daac3acd0fb2ceee9713a8146e89a04d00c984103faf4d6ef87b42b1dc7005b6c938dbd9ea442dd2d932832d6682e1d0edc9579e632b6a39e5f693c9007085f96e3695f2612a151ff9b4b062a2765dc3115cc55e5ce80419d6fc4da62e900652fba909d03f468daedb0a7fe8decde751b1cd9f6e39fb2c40ebcc48ee1373b6d0923111b32400ca87f5dc3d986b61a7ad1e0a7448b8d7830ae4e51ff333bfb1cf414042b4fde34ebeab48d215bc8de056534436e2f516ed3c8b9fcc2a03f66cb80f875d7ce36d3a7fd2e8134e7c629ffa4c30ed3eeee459d97a1bb564d3961620889e5a9c7f9ac603d8c0d812b8db082f20035b05462c1645c86b216c19044bf3fdf15e7ea1a57b4803762d3c1568e38182f96714ed48191a091ffabf72520bc7d32d69ce90bac87d4bc6893fd62a86b3b74a1e2f69be96b0f16bd2719854747402c49322b0ce5495aed39406e4cd374dda1e5228714b2c19d3f94d33245c608774dfe97a0abc00c67bb1662b698a2b1b3057879769aa999c03a4f51dbd05a190b61fbaee574f20ec9e6a6a8870bd3f5299cdc78baafdb73548d96e847ab385c285a0551ee41714331b5752d8ddb3b8e8eb11765c1f3279457ef25c8b12f51edca34597ee56dc14a5a20d9a8d4e2e88fadb0218c6bd96cb5143d1b6625345fc792eb54c161c46da1e42bea42600da48174b25784776153e33403daaffa95e912d9b883a295d43db641e51f734edf5b5afa95fc839d798fef38e61e85c9f5570cb604f1afbe8e0633a906d8404caa4194a34c741798b68786700c64142f9014455fef9895fb797f1616a4270e5fd4a9ace9fb3d1658842c2c854a1872fa000e6076d3e2fb0ec6321d7c1a76743d65f074ddd9be6488d5794fc189bc278154c0f396072085dac61b89aaeeeb2cd8c522f4c228619dca793c8b275f069493e2d68d25602fc0481c36f46ddbcc4525cfbac3a6865b7627a2cb529e3da4d8dda4d3f376026458db4498bcf598ef995812a1bc1cc7e6ade3542a6726581e196bf392dcfecb1645b3950d5833fc7e0c917d4814c7a0dd679c2e37e92c68880327f8675158448ac5ad726851797bdb599a9777374dacaad83152e6b37904ad9f906930176a30c3c0cdd021121c7e51a9aaafa799026bc802800a101f4ee090e780c59d120651bc7dfc81ddd0c70889f939c3eed0e0f5e1b80d9afd29ecdf8bc0811da000c941fd1b9d433404226a49d98fe3ee8da52ace4becb4787af70cb47c02c94cdbea9839d42a5c2e8b09d5f235eb45a439c1bfe83c74b6e8b105b705cb5026605513bd608a9b73bc03ccb4d9ac7d966e873581e7392b30cb0ba13ddde83eb39da47741de4672835a12bcf1f0fd0a1900605196497543286f2c98fded45030390a0b2902ece0f3311a914051be072396c9c0767c69d28203297f44f728ec1cf4f2e7709aad09e99d0ceca243f830eb15dca001bd5fab7ad8fa3591057a49d3861fb3313f04850576df4a7566a31dd9b4e2ec3b4030c0b48e47cf3ca59050ca4d5c398b78b570610541e2c71f1627c4f24029e7fa6b879c0566808a319480d66860bd610149cadf68b087df3464c0fcdc2ce76c34ab70cb0583bb2632505460616fd67273a311e15f42df60e0d874b0ab1b322928f0f737063e70e638f0d65b1617a4ee139a485aa4be5edf87988d14a47d58ece01774a95ca7809d13f4d445f580be7cd6f8e9fc8a3d9b5247b42b7a65e1006d20965bc66763f72b47b1cc1b6760e2ebf905f8ccc45d9a87b6e80a65f7e491e802f3e83dca73ecd2897ea84cd105e1bef17b1b1feb2fef7793bebe49c4291e4a7b7e2cd985760a4490751053b1dcaa0b2166e2148e8b2d5612b003b49e769855ed20b04f9ba6ba4388bc4b67747a93b99ec66efe72acc9ccec36882af3f0a60a57461739652014ae2af410e57198409ee91f90048933853c2bc30ae895043d080076d32bdce2956568e38172f46e2fbe15a563d8a3a442620b9507303e711ef93264987694f03fea893e0611bfbcd5164f65a017266d0b55281912e60e2ae22c6f3044ef5ad5ba46da1bf8694bd329db5bbc373ee2a2e5a128be532ecf673c1f412ee6a3f6ed6cb8e91fc6ddae8091d5b5e91b1441601cc58b8afc62c88711a3648df2210b844e47b5397634ad9371beb6581dbfc7fc24c0d348d651d5ae5036a5a3bf5594d3539172a3f40c59bb845a90a3d20503222408489f6c4e9be8c9978d87e79411099d8fde2708de8142abd45d5fa2aaf8c5c627050212d06bbf57a5fec6ba390209a0ab0a567c56ef13fef4fc38d4de1a23cc3ad1ac26d3842abbb0d1b5267516d807f4d9a549e05398c6e3653fb265cc9a220b00f971dfa61218a9e6414c95a8106b87f9ba244b16867dd8192a6f6a7d0104b7631757dbd1e0919d614f68c3485b72c8b619a68501c0c251b443f284d7e85f0a0c282a558bb88ed5e91cf719e5880678bf4203922e84a64dc8abf1c708d80cd80b4e2a7b1cb3d416c4fce25bd32f51daf80b72dc5600f65d000ebb575a06b710739abdc815a20f7f55a7b6dd6af597aa172629b27d205e45920473d4e079be86bd0c81b550302b6590886b83f700e1499df0d6af1e1d609e3414e57326fd7a7b83b4802c8284d6025b50a51c80c025c08602dcac0098342b4ac021861409a7584f5c42563b807e05a6e02eacdb8e37e516283413dc6953708e38346b41335118d510e3f6d62aa298cfad7ba8471002ac81f0a942ce33cbcac693aef8962bce968933f770b2463bacc7e691c3e3c67b002f0a65895910ca67a1226f81fcda070139b42b7fcbacbbb4366f98c91d8c9628c14c2e28f1cc86d8f7d9315e243dc967e950f104f5f08010ad0e0196be201d37acedb5233b70986b2a14d46b43847bab1ecf55bf15cc05d53a1282a741284492214e1d2bc2df51d5d7d950656f68c3c9a5e4e6facbaae3369e30df84f51e2a338e4f12b3779c720015da2a9ad04b5e8c6c9b482ec916025b1dd14f799c0c2a3a7349f6012e0a2530684ff136c2585720dfb3c980f9d1fe713c73261b4c97a41a1bf4e145b82cd0c14dce03e65e651d00537046ab5d7364328a3882646df448368e7ef84cb6c62a0b04a2a0f84240bdc452a38f772f386ecef7ec5400be9d22bc37b235bc2c9aa985161e2934fee4e0302034a1458dac516bce33d769f0347fc42ef80f1a6c50150ba325e4478ff7b79a4c3d8f30a267c7b024071a8c9dc668f28488e242edc54ea9098e7e4036e54024a4e7991b487b831ac851beb136f9e1ca01ad99ea891064079bf809fc083741b2fefef55ed3a8e3bd4a8858a6550614956113a945cb1a10ec1f797f7551a00468973ac4438137e0f392888bb73e3c797b067c2e85e207c7efb7b38e1ec2268edb8a073d2a2cbbabf2880a194c6124940ad25f0c4d10ec9d1bb7be56a6d8c7a7cf3b036a317c616bae59721695b816a8796239bf1b8affd23c0c94cc7a0cf7fb5ad988041cde9d75ed2adf309a8a08f60f8ee2f4bb706102956c4a82fc4b1ba92f2b82e38d467e2d17076be9d713f3e33345dcd852907045c9cf6667de13b30e32bf5dab983baedb884f9ac71a3ff30a92b04b4911f7d69146c6081b8dc45633bdfeb60cabdf84b51cbdf3efadc8324f5e338c4277b6bc464b8090bbbc139f2e4124c78b7f46d031b14dcdf2974a0551bc4afdeffde4dc1c2f3b9a88cfb7bb20f8b1e1851d9ab48673be5310ff922374b75c3e1c45013007a2eff5d9bf1edd2d62c3d60144a0bd09bc2d353d1e4f080eeef7d2138ea572181f10778331069fdb0785b011aee2aa4576b0c14f4eaa96b2e802ef47515fd17c5236d85829cf600e06bc6edb0b791a63ed03204606f3ce8c464848fe355448a1836c5d77903e1ccd8df53eed8b55c18b334310374d80b7a8deda228020e37dc145a12cfea01951c19faa59153b50d0a197f36b98c835671b5807b889a2f9321025fb1e2b352c47935584b0ce3da4b556c41824c3e42baeb3cbe6bd6954951025c158ff55dccd6c206c4dde7cdb24a46f4734e7b74f956ee79c67e3aa850c827b037738a7107460ad2b78f95d74a456c4557ba3432195e523766f57a23a1ff6481738ba77672dff24faa6ef3debfc742b12962be628604504c702fbb00b54b587b9839ff82a61af3d7eea2804d8994114047826b2d57bc27bf217da283dc04e880081a29ec6b5a0d15dbf712d3f61aae302e093e757465588bf153f71879df7ae359528797cb8fdae61f0913e7a553cd37e0265913874f34847c77dc80a0fa29aa8aacaa12044e0cdd5d86090fc90bdd2a1d61650f0d6343696990ec94b4b63c34d853b22067007fe210901f9a3fc9f2dca9fd6436ffec385b7dd094e136826ccbce05565130ef4ff94906325d65969d2ad0e038051ed1ced1dae46277e0078e6e686fedd773cefa5d093edc9ca642f294946d54ed6f5c219717361d23b64417091049aa4e58b96d27fb4e40d280006e970705d6f9cd71cadf651aca1c61fbef1059bb64975b98918ee3f5de231bfa28db2fefea43948f3c2ec9eee63b0d8e9910f9968bde42e284ccb2bf022c9dbdcc4f49604cc96ebea4ee61afde0f0c48d2337eb17997969a3591574e10a0c397c61cec77a312721e4950f5c55a85c639d709c507928f22180a1854e3a546bc9216dc0d174de04e3a45847bc5ed73d0ff8aaa215320eef4b29595b555a44a7c784656bc0981b04968ebc1dafcf7ff567635690a789b2e101df564e515e89b04f9af23a0e4d888e5633fb3cda6a80c2e3312ac56a2f2a81755341628c0def5af5bc414b53ee9039f45000e5387f23e195a0233c8c49b63c94e5df54658f367eb9b0fb5f2d137a77c2f982ec7c8f388e07d90990abac16d5cce7232be159e02e10cba21221eac484380e0d90c44f7faa6e4c727ddea6bc62154ca1c5103ff2f1eb9e84f04857093a14d0fee3744a0ec1e67b6c605043dd0953c0f314eefdb777317624a2b34b1fa4b1a8d4239d96068243013705292a16cb3c33d743e78b8082b7f9fa7a00542987b9734970d345772e1a3dbb6a991656447d77574e98f2665b17ed0e8cd40b8783ba108ae2e81337a313c810252005ce61622d2d8beb1d723dfa11d9cb4f835e3db12e586bd3ff727d2e26c143314fb24ab433069b708afd491695f6efcb30cc8492fba35a1e6ff00c63ec8eb0d8bc7d5f0866beec99a8c51b20a318fb23cc021382e3ecf3fd860f0ed5074c2b457c28976e76729c28fe034c80c776e30ba7e5fb5279b324e38952ffe012e2d8d6fc0269f9be5fdaccc949a2fb673d211cfb1b2f38add397b76b1f4cd3ff4e13e6279f8bee8b9509e2ece960f1b49e7ce9ce5444d6c1872fd7d4d39381a826081224e88fa3d95cfc5009739c9171a33493df88a84fe9327f8cceb9b91f45e1cd95e144b97fb04224b61a5f54e3f795d2e64f461255f74113c2b1a1f162b55edf976fae9c269add830aa3d8d17ca15abfef4a373b394e94fa0792008f4dcd17d5f07db9bc79e5240a45744cd4576eab66e7d8d8b880b4d7828c155ddc70c7c5409578f9e39bbcc9772e15c8918d79dee8a6eff6241461b8038b8d8e0da49110e59923ee38bc79547eb1ba4cbf73840f9adcbca54e13aa9c1ce83af8e24d21b80efc9cdd948baaefe66f220807fa7023b5aca83e3ec38b394ab54da3b3cc1783fb78051ff2cb5a1775f6e171890a2d1c9103af6157cbc9b71a7210f206e41ca5acb6e6457c68e10aea054cea711783a1e85348a46fa52adf0dcb90352b682b8b70d993bcad9896ea2ddcd4165c9811f17705277aeff71f7eb5ef3c08a85f1b07e8de83aecf32f43e0287fa810bfe1d3aa1f83177c0a4e984026004dc5aefa083e25c7592d5aabc285c44d59b2fbd118ca1e1e40054cee90d6a7ad86c630819ff34a493ac8ab96e5dcf3e1189770e9089dbd5607ad32261c746c44ed4f3675ef8bae6a0b7468558177ad8ebb89beb293dd463ae9a8220df195ad9fd0b66d9d803201c131aea1c2e08f877e486f2a96e1ce7a6d3614ac6363b551ab913a777019e948771c5badd5e4af3cd78a3284e0d322b71579391fc576896a88ec7c4b1578ee328ae0f6047913689d4321357daa0dcaf64713bcc479e4984540e6d1bde0457227c027b0f68234691f20ce14e4e3be478886ff42e8c80972d13244f7b69fd1bff3277ebd3658c4cbcc4b7ca3474ee47cb148fc299d902fe864cbc8fa6cd99fce09d7880c6a70f6dc0b72b597ee3c3ea3b3844d5ff12e79c574080bcf3bf3463ea04d2cffa1ca584cc6775c8983677f2031a9f28d468ab9e553c80bf6ba0a32a134d94febdc63572d7ca8e090ce3ab6546979194def4191a06672413127c987dba5189782e9a5487fa778c16a00c11ddcda81586e68b46b8f6427630dff262a1d475e3312accce19070fc27a0ef4630d24f50e43a83e344f3dab8cd176d31d031e44a8f3f4c96f7162fe164cc8df8489d90d9a20a71bd1a07be9d4443ef0ae485285ed76bcf2d2cfecd203528707d57078cb00ff6b3d5582176f14fbb8e0659719bd74b26e5c84f9594c93c66196f3b85ffe7dd5bf115ef01645bdc09845b846598c6c5a521be6306e6bb676c9efcf80b6bbda84b48c6d313a67650aef9f2aeb5581278c7a1a5146392707a6795015f66c60080f0c5ec20f666dffa73951a4f84f340e0bb09a46dd67e291925637d31f3b9fb567e8f036b34aa21bd621189810a406cd7dbd945f17d68798f7715fffc3da3e732a2ecd9874f05e4c64d410dcec25b4eaef85b1083df9e0a9171d84c811b123e7d6399f330eaf456ca6295804e588a33601f68151a37c5851c585da923693dfd914a783d9433513533976b60b35667b419d807edc9f7fcac0c6cbef950d5d073bd0c917c6f78a189a58a08fd6872c4d6873268aeeb28cc35749a060342f5fe410084d04741a745d025d19e5cb9d3013abcee22919b77671a98e3a3349be0903281717f72e6e70d77754e05c450835e2c9460d8b2eae18458331502419f938364115bccde8ecde3b0997e8b38e81fb2b6e969d891ba2d01548824df46db6923dc6d27f2f3b99cb197bb0c1499cec09252441a4b3524011e6704634c227a0660cd9912fe4d3bb65781ae81f311eaf722eac51178ddc0cc8cbf1ad09cc07df6402e2008b96e528534dc17d2e2ce7efe6fc7bbeafb66b64591d682c4434ac44555352886a8bdef3598e3ff7b4d94c0bafafcf143071b77e830d42186cd80c0ae8a73807a268842c639bf3a054131510a36004bc8397a171dce919d2acbb5b86740d8d8fe31a793de15729439244a3ae564b304a31a9ee7849d2f6e452f11be6310e2642080547cc3f0918c4a30d66701aadbc41f7abcda097d9b06989e9acd6eb09cfc157cb12ee89fe54b62c49dc818d1c9a19ace46e3e91fe2140a613749a3e6e2a286068c9d9aea73a46e2394400b87dc379fe82a3a0606fb23001d970a748545024f8e5d26c33295ddb9305857f61c2b3aea0c1fb6de7937db7f120c186ca34d6c0bb6f1dd79560d684901ecf018f8b9b2e28e8ea16141c7649a881a9e4ee82c256664151135eab0b8af4d2b54d0c17f8300c0a9aea050549335034e56b46fb6ce7b8d0ebe4b8e88a4171bc13570a40ab076a3aa2db2f285a1e7418146d0f0893ebf3b98f71493c4b1b75eb744e557008469b83ee17f609ce5089118e308b14d9f974ac83f3494d109b7372bead19d248380d9c081669c6ce327ce9ba1a3f250a6f4557042645e0dcac68988233ac7a457039c60575fd554f2c3b8191b191d5412d63e983f5413e7f00fcb98beb6c72c6c20b5c1a584da9cc3e798460a11b01c1514d20f797ed3d12cd19f9223a6688f49ff1fed389f868376d8b5ff88a9d0d021f9f54b69953a80468a2123203bf3483bdc25624812a0766fc5babd1fe77d08104fc0cd4011391fc8a3b39e15b3baaa37e691e97c8cc24490644b3f5d8f6812135028f231ac8f2a872f2dce50cf8aeea54771794130ed147c74411c5ff0ce71462f58b7487e4f657c596642894928bbb48cfcf599ec33aa25e22390d8ff7a46a664e3db18cbfbfd054a6824c20d18618cfe1e6b93b782040c2e7731da3313fc17ce88dc02843e88deda945694f4a0791d1b58fa5ab7855ace041b87eae2347ffba00696fb84444646d6e28f99fb88565c43099db4c368ba0875df7181798d4aee232d234c1632bc16a4dfe4aca13b8694a54c94166c96153a2496d15bf2039fb0789dd64d121438cdcef41a659d3ec9f9171bd8e96a22f9a586e48de260684201cd8f8413ba3464d63aa98936dd20fe58ce6e67f4e3c10848e744612b896ed4c446bea1748a0cdbb4ac6568b1f88cbb82e15fa9b9bcc558e2fcf08ef02b6248172ed35def1d221101821de5d8d06dda234c5fc27dcdbfbc6976392ad150f1ac0ce52cd2da6227bbbd94d261cd5a713dd523ed30f5c22907c6d5a981cabff8dcd8850fd1df709534c1897f3b3a6dfd88cd50001d032d2b3bec50c6a656c630c923482d4814b878ebd088b315afc81a34ff5f3ddfcff3f55d4a11c805e9acd26725fada2f97d00fe7224b343a54b3ddf6aad41f38f83c13ca4587a77a25f978b4b03e1efa87326d44c04782a1ff0b535056ed45e30e4f9d66f464a9c6729c3053023f67ec9f3d6d4db6aa150fbdfec3c30d763baabfcb83f82008d3da80fb157798c584080a2a4ada52e09cc74ab0d36368b55cc02ad35642f2f917c05505f83f9271d0b9c5063c2269b03c77e3e7f986643cec4f5c3822844c7dd7d19d8546fc13f389018f44b0b7605255d08461eb08269dfab7b97fa67ee5da38be944c786b0af58e02fe210b2662d64ce580142b660dd7d27b120b701a2aacf056eae4d1f001ee6ac3734dfe4dc331902875e7aa898c4022ac9963528d7d2231614b1f8547ecf221c0f0bec182437ff2b61b5710cffd6e970c8557f8c9ed36862304b2d8a7bdfe08f48c998fff87ebfc18509c1f87f257dd0ed7b7889a56201999ce46ee74d2b3f0eafcbc22c086e4d297a29a3069e428724615fc71566835aac25bec555bc49692b97dc252e2a726c2f1800a0fced2498e44189bec058e38923a69bef9fcea0698589746b0eecba4207f620c641cfb765f8202e7cde51c130b6de9df8c69d72fc2a0030c13d33bafd51835a28965b4c271883596790b31926952cf17da57fe0960f47983b8a21809cc77a2b89e2c10907742b7250cb5557f6a04e085fcb059bc21186ed2a437e3442096c2eeaf997b6cbed871ae8be6ef469fc0faa17b67a4c67825270f3d2000cb808fad3288ca49384b8455844dde8e413e6902675ab0269fd1d248accb0c7730f6911c94170ab7ce5a1db46d74f10cec7f9a85d966d75722a84877efaf3a3bcbbcecca819c2ca6c715cac6600a2f53d2de18cf837e0c69def385e0fe1a6645268909f22480e9f7c575afff8819ab04dba67038a71ccba325f30ec4cade374b54a6289f5c3c50c9a5a413dedbb945b7e99377013d424529b1c5420e69261df3224737f3f9f0d5842366899f154461c351c2c6bca20abb0e2f78302bd8351ac6b3b7328ec0d950eaad5187dab2223d8749dad08db625f24e8ffa2b5ca322ee2459644722d60039a56c42a98fa6faac9641961149473b6d1048e071506e9a7ed8cf2f9d78d9732b976d4ee09189b25b83c8eb5209ea787604b42b496647cec6c773d28846038b337c1a8a5e0f6d612ee642d674db13640bab8c6be61d9df602b2f6572ebe563fd2120eeb4fdd518fff32012718d7aa9f26ffd30c93c6cd913f06e1f3defb32113005c9bbbc98eb6dc00145e51a6622bdad79371fb4c0c4bc1ceea8e82dba9780b022177b84f8fe7f6c5ff1f3f349d468616046322d9c19f3fac099bbad8151c419eff19f8db617618a2bf49e1d642115c1d77de3ee6ff97f75a7ec3fe4e7d2b4f18d4f2be2868d760106acddeaa45b8ba80fe0016d2fe8b4234e1a4764ff1d363638ad0afd46aafffaae2f03e2c378290891210aeb86c714a5a34a81828e867e09038f4a5f5d352b494f1555c22eb0c79352d36d80b9c23fcc59f85f646f27c267673dee5332e1ae67fdb49bc59851acf0e2a1c228bff624be2aa1ffa99a9651e764610c906aa6a4eadee2f1279103d7d08ffa8b56e56df20487ac90b0361f1acc0d95e151577ccfb533d2204c128300fd1c60c515562138878b20e2b971543f6075ed4d313e1220b0e3861d6552dce5539af257665f8eb1310034d2f9b78fe65a0b0bba85062f38b87ae2fe2fba559e581013dbeb50bee5f11ce4e8d8c220bf57936154e3721cde16a8f2ecae32a32f7e951bef28673fddf0491f5574062be24284aa40de6aa6bc7b7c8e57e401e31e2cca1531d92a5f4b0fca9f1c7eee0bdb635ff0dd8a8b5a69b65714381e49cf8da0b11de100ab0f6882dc9a3c27658e33772a33487a75093d20baa91ec0153a2d01dd8f2cd54f62d03e8000cf2dae06bad27a1399098b23faf4140b7bcaca8f528c99fb350b164d41d0eb2bf5cc996c426a6e53621279e97b0b9e41ad1a3e41f0b2122f2aca91e727c455ec144198c7b3907c5faf7daa1d0dd823adecf97573111df540c48045937d1a9a630d0f999cfcd565544ee7e3484e0f6258b74d1b9b42f404505b674ebd799023baa757ddd2cd84b6f4e33192ee86a2400036c30db9b5044532b4fdebefac40a179fd01fba950d5e872c93600bf3b897aef2b7a5db4a4d7f91ae5b1c6898ee3f22dc6d4d639a116958553d13ede9401b4bd74d46170bb28952268ff7493de81b1206c49471ff8f4882a1cbf88d0b3a4025b12ebd18657e2b4ed3215259763a4eb1d975ae488fc87a3792704c9e7cdaa8755250b7bf98d021aff16968f35bffef784d3f00fe382e8985599d0eb4c88bc5ca020d8033e07eef841233ce91e3443da0cc1c8ca63d1f0c186d4b3d32b860942417675fe90925050818c98176fd0bdae8ee8c4289de49bc7117afe8ba9801e74007a2d443db3e1a69caefd86fa265b2db57c42a9fd8daf4654a6eaf12537fc1c0944c714fd263e7ae79970eb7f2b170ada6ab0c8dfb8af607069d2ba1eda37ec89f15f6f46fd92191f612df671b4fc3e07686d854c712b391a1bf21431b3149bebe9dd5745b4f4c4befd21f2870053f69d2d9d04ed6b3f9aef71ab7a5f60339ab509ae8bf40399d14b798aa54686f9a34acb402671f35e8580e7d21e9a341570e7d77dde661a47b6f6b56a21efef7653bc65c28a0c2199e8333470085076420ffa0c77f111e1e7a157ac6ad719c6717be319aafe3ce896ccb5319f9d0ef67375b7ffea188b3bf93f706d7a5fb28b854ea4a86c7bd40ba9f37d3d7846e6bbcff795cb8765de319c85077594899cf2acdc50fb6623fe32b3ccedf6e2bc1498b5a2b4a5044b2679638488ddd131a3fd50a30682a7d38cd214bc69be6633c55f7740aeaf5829316b727ae306da23e7710a2425cdb995cd89ac8984b3b6bbb052228e74fb3cd62ccbbb75c87dd1c5dd2321119900af5c1db2b4ee4b7302602be782a665a613b24d0cb77cf43d94b4d7a30a3edafa691ae6f67fcf0bf74c7952d24427c607e40805d52f4e38526939f376c523b486558851f96a58bdf21b64429a2d17e06576f4c533be24eeaacdf48118a24ca10bedfb420fd7e5ba15cf8fb316507ef961f652604bd8e42f1686d907841db137f94254cdd51fe3e19d007493c50778b5c78e1bb95a251da1f110297ef31bbc2d3f2196abb4da61b44bab69580731f5c64aa2eac9374f0f46c6246b552e3a1f52f9e90438d02e96661c814b140efc53e827c6f68ea16f2769d1455cb67c80b13287257b5b5376a4cf0a8010909153210c66fa2e4f66c0b59020cea57815924345e3d646626922ba43be3429dc483cfd21e6db4925604e574351fb6da0420cdc45452dba8d19d8e5b332ac95bc3bc769e7a4e6cacf115d900a96bc1303edb55697526d7afa3daf099835bd1e6a36fd62c661f483031951523233d482571c052a0350a7aceb4dc416be20d28d394947097d3ac89bebe6e7813b53017abef742263376117b195d245783b048172e7c861cb704b25ac78b463c0f2534992d15e7e407475304191fe269faeabee0a5274ae33daa1717880e66e50a5369a7f2c1a88c4b1cec92f33a10cd20802d05d3b7630f3b7a4542a39cad23ccc613fee5089df2fe29d05032aa7cb68145630fd4ca330878da2d241352dec1c24cc18748d32193259f6a24b6d5d4ce54ddc238601659fa38511612148e15bfb97a360a946d522e58f6bd924256be4d89fc343a92c93f1fadcf68d329961bb47cac8c8d94ed2c187182b91f6e9e55d5ea6de6656b39aa1f21ad6a888a3d08acc6ec1cd262a1926a37e05ab3bb36dc9b465fb6a142d43a1d70a8482bef9e588559df38d0ed33c0de789711abd8481a9bf80fa341ff84380560ac6d8d48b3c56aae1ba2d034b9655e0ef7ce8f4e33208116ce1f29e396f135a7c45c16b2712b27d1c56b3b4bd19aaa0c7d492d732701c2dc0c66cef5d5684961ca25c3201cfa99e2868492be1c35458dd63ead5029823da7618bb9d67abb6179f486d9e543fcd69ef6f39b841b684da880213c10c7ac3ccfd98f8645d341989072ea6068511cd677527709d732c02998fb5ae496ae94be1cb34da88de36315c2583bc030ebc1ac011f1517e47f3d1e82c0a8b68ac06f8baa55146c68423057723bc21fb9215e311e5d054a5c83ce9a6210e3ae11e3541ba869b2fca13aabc94e2271b3d1e01209d7f11d7506f324cac904fe9e3c5e2d826e536bd49b94ee1a41c099ce069116ba8702b1e3b63f97eb1870b1f0e6449ae53889aafe302b5febc9db7bf00788c62f21ae988820f1cee65b6583e74d3d40fec6ee48d18ee63c530b3dcadcb9f8716a024fa771f5b00a38eeeba379d9e71e18f68849a193586df89fd1bd22ece1f21760fefaa0b499e1853d5bb55a7b4350cc6645a2ff789be7b9a8605fb8d5d4a13e5fd3ea83409bb9172093942d86501512489630d997747adcaaca8ac09c7022089123e2f03a424e3084a7f3b978c4d18656f9dc5192038e30eeff087461cbeb8219a601949ba9e090a8aafb4d58358600b9d08027da001180a29991578ccd87a5f6a639c679b56e31d5c3b0803680d4ae9b12243e3e566e96fa3cda3582a304d7b93df01673d592a96a5e597c5b7fe114b27e735d3b904341110ebf1bc37eedd5f03db9275f75fd78f9fe3bc678fe408d6b78d460079a7d76a0bf117df59ff6b05541a549ac4aaec5a44086b3c52ca795c88de83f32119175304c6c0d50e541f41723e6c3f8b13e2e0750d835ef8c7faf2b46c435529aa03ec994017d317d4c68dc97478469d77e955e0a8733581a0f6a0d40059b5c4bd6c9d3f175bcb09ea540d1258af93efd0078dfd67c906f5db897caa63009a7750862f57fca6161aeaa8437c0abb80720174401fe5c5a4d55d17a9e11c24e3eb4404e54b42492648b8e18e848727d8fc77605c7e5114d0809f2225c149d1d78f5c0c91f8faf5987d9337e171d4d9f6d27489b1f7c26e8def06b547ad3d7a270b3fbc3e130295eb6302930a1a9daa3fbbb0be2d0ef79cbe74ff03b599122bf6ca68c6ca9889e9e10d1e10e80d0e8dc19f8e5da1511f6fbe613a12629076edc209eb0dc7e4df6969be79561e8725de7605c15e470c8e607c54a11f46cb60bd688bb40b669b6d9e563a931ffc7ef09f538d9b3e0c8aa4f948c10d64b7e70c52537cb41f5d55610ce653a79a2f6c18218b4c50fcf68cc39f8f21181ea10ffd8cd81c2ec2fea57d932cca773111967ae7fb68e80342d569ed0b4f96dba99c750c8648357744c91c307bb0674ed6becb5a87a243e986f3303b84d140defe65e12adcb13cc8180575af8d3d6d9124c87d7824800d69cd464cdb08ad8683a20c11c8b4461ebd11e5aeef9a304a8c8d3aa0687e08f3d0285c0860563669fad68f69d2384cbac3c8ace630f33a7acb40c9a22c0057345864cf15b3460be8c4cc2d2c81bbae58877e7940d5e39ec02b069dc0a0706456b1e724523ac3f0db2a579127a4113cea75624833add75adeb81a974de6223e67bf90cfa9e55f13be9bb5bedb1b021dd95cdbe29de17553ce1264648fba1c643e11e2348b27d535ce5ad3b088803c82e4a847d2a7fb244fccac37d4356ea0ae318f63732a43298427ca8eccd940226d130fe58a266274233e9a5208a78f004dfb3d756f1c8eb5e28ff0cf9859712adb437100f2667e7c6588947ce966bb293cf0581775c10cc4ea01b5c00e51f30e427f4fefd5e219fc570464a01a0ccb653d6452224b8f615d1db283abfa17ee82549a7f9d5178dc14ef4b772c71a39603a538465ec31eb075f97625723d2c0c9cdadc6dab8b415fa1ce6f8498853ed62950d01721a71c50d002a88896505dd9d04c74cd68d6b43ae16ac05e5e7df2c1eb0b7c6f63c33539297681efef325693bfc7ce2c6dc0a5f034e8c74961190e2d93c7158caa98072fa2e676ebe6357fcb18e92438049c45226756823bc28ea472666d4f29cd8452e6e7cc7286c213026352eca2626bb6b92c42271029f9a27bab79c4eaa3d26e19d4d164129aa5d5d934a6e6ca63ac24d5c3b9873fc38e82029a534bbb10921b629ea2c97221c97b5e6eef5b9d199c31698544b5e01de4418fb1c5c7c4e50ff67a614874d943713c7c84a0ada60ec9331cf29c1e4ab73d1451e6722e67981eab990fb1588d20216eda1fa7d5886bd7e810b23d343131fa412c36299cc2b762258a6bd3c01f43a6c5d5e607ca7fee0570004d78e092017fa5c1d1ec1f1627f088e4f0b84ea7bd8d285af3b26cd1e1ca2776bcb8550452efbabb2a7bd48acb2024484726207027280c2cc4a9a635c114b6c4d9f0160640eed783bd9183eb06a1e0d57005ecbf640b758c0ff930cf4029cbd3a9314261242880bbef1790535241068d1289847403615b2d017b9c7015fe2d5fa813a00853d52d987823a382c973c94436909b0455553590cd2e088f3ef985cf9bc8403c02cdeacbd10945753dd5b84bab3f3509c46ef8b884a06068754af331dc472cd096bf8e623c9531328b91e6a4a16152399ed4898d39e33485867b5d77055035e9ca9eca28469f63abb840c3a2e3a5ab3396fd2d4817a148a0eeb0440f198a767157d4d55da5aaafaedcc1f9bdbb49ad6d841d681348f93ab79cd2176fd210bc30f97d6212b392a857b5e72ef130121ed51f999b08fd5615673ce7b65e23a55d0327c9819eefb087a1b5797d0ce3ec15dbbb08311e63c19430667b7ccad8812d238d550f96054115bf2ea6c6fc4fe37b3c2090e8d95bd9d43e4b8d35869e74b024af493c70996284221661488d56b4452a196f78320b9529f04daed9622fd7feee587edb4f7687c621b064bb92a3261179ca0e2c314c27ec7c3b36f88897122efd045d010b807b42d0009f6c76184a097bf7b7b543afd5243c525bed9fab25247cf88e64bad7b51897e15d3ace955d7a17be8a284908981a8e1335c400d49d8d8749c40a20b26e6d12956053a3cf8a90d720dfbac0683a4ecdc10434dc5f4187580bdc1a7956009c86bc1522a32937159d5180c9ec651c00c8fa32f5aea6ee698e839b85902919452c626b64ae9c777456e369a207bdee7036bd9081993ff227f1fa85922a4996f8fb93bcbcdaf962ba374d9d49e885b3fd69fa9bd05f59a8244ac6ef1d300d325aaa1fe31c6e8eca301e4cdcdcfa4daa5ba8470d11c2cdc9e65d4e1e9a41d684ed0705407a3ebc56afa4023e136b9fbe92bef4e30b451b794874c37fc4f1cdaae71b1f2ab79879bae76b665b0078253ad893107ad4ac94cbb59469a824bb90aa37acdac5e78afc8521c72ee7a3a8608e3d320407d6eec56fc56e64b2e7f387d836592a04fda2a5f23c289b6dc816f0933f7aea5cf0e304d58a6dc1cad46df1c401acb3e2eb70c5602c98ff28ebb5b028ddc0abd60414863fd8d689c6b45d33e8fd7b35463c31c9bf04b31f53191c9aafe99b51dc02da826d4d4acbb064fa892a25053352d38996937980952c52c35d014bd0871b969d4511856265d05c02eaf01320201160d2311cb3664a11c42727703b13ee73f2e30c932c7cf7263c452a327ec860c2abf67f424e07b9fef5b2ae9aa458eb1ecb4c2815cb475180bdf94b72ba3f421b4f5eca2030c6d980071ca2cc59367137507ca5a481f37bc37b794390557904b1d961e394aab89622f99c3a7667f2406d6c389150890444082cfa634c356ada4a55f0d5a230666b72c7180fc5f16aee3795cf8aafe77d6ff136646b19e29f58f61247bc7f1697e088ef3f7802541acdfe4970a4b8083634a1a86f01f41b8d86e3c38af4c9bf625fb407b40db78f1d7165eaee750aac9e16c97750a65710af1cdf78e995a20b43da21fc4b23e5d25d7fa20f2eeab6eb9551f2a1e69c3363c9105f882a394679094df44f9d0353773a987bd8202776934fab97f6e69717ac5e7a0cfa8e7fa57c839de495a561046ceee1ad5ec63471a66d917147c7d05a402c14a726db0a23b023e64e9a7692216ea63bfb4836ae7da9aaea7f2f6e13e36086139da33b9cd1ab2eed3f78c462521d37b499e6b994de29f54696bd777132e24733e465ff5ce781d47165c93d9ccce36579bc1736a6d40ce26b5a22abc45ca5479bb3ed761da567af196fafe83802b02367e4964f96a75911436a5281867cb4f0a9b094fc52c74f0ef5b1c3a4a1750caf0b1998e31a0e443e1c367fa9cb5d3b4a94930fde7f9354fdcd7edc89ad29eee8c9fad84c7bb35ac84331b2578fc410f388f72b4520c1c9caaa951289538aaf3a8b9796a48ad282b2e2dbcab1d5fe5e97efce9d36ee629b812771e9a955fc368548159d28c925f6e1901b2c6d04f029e328dbc8373d2b3f58947e21299c913e44c73b29d23a4f9714a6c748f9153ef01175fb94d4eb8c2bedf174a0a364028f84165a36b87f64f6ccd22e51a9839e2bfb673f095cc04176f8e343da277f2a5bfe61c10dfcb675c3955fcb50195333d4cc229a1876f7be080aa16a933009d952b9d2fb86e82275190c4cdede33c3901ff4985a204630fba14caf5d38b1ce8f20c9f0304b3dfba51665cbaf235982d55860eca2b618ca5a6c144922b1f3ea96ee60e2b085b58809fbd38a5b37ef8a39524278357388da923a5dd6898ec4fd95c565d32d76ad734b69e220ca2a8abe81a7af8602f0f9237d7ce859cb19092532dd09186c3f6548a4be5aff93a5977a9b5ac7f85322c33d512339fb681f1035c60d7499b862736a41deab7c2eef153f67de89690e535243f1072a3db19a7c35fbe20610355a0123ade9d24d67a32839359a58a13bf25be08d7dc5b53dbfbf209a441310ca660bda01c6d4473bdb651f85086b54c59253427d17bc021a2fe4be42f3a8f082380ebd5db4a4b382679930b17a256e2520af9c0d195dcaa6b214d447b9af6cdbd46202b295563a4db7b0ebd8ca6f44a4b3778380d7f3587666eddd33fbbfffa1b3e3718983e618c9c44adf61d7e8e51eec6c1602ed1bb36ebddcac556dd17b4f8f8cc6ea5dfd2395a9984e1470c54535daac9aa4a5387b718011df44afab51c3eb6df86b4294fb1ab2aa46ecf1bd9bf6f7a92ca51d79f6ca0c263221ed7761da4a46597e1acb63cd39c53df5d3d0849509a36d0626f4f1f034b266a949ef08f2230c30663dcec73815c253e140404e7da5742d4a69592578c23204475bad21d0120fc815a7baddcf0d9221ceb23cfd781941654cf264312b9d919dc3118689d136718093b874b18b3bd7124d24346ab2660855cff042f02aa354390033f92368f2d28f0209a3c80ae0c731d133c808e84e4c21fb39adee0a0a159d3f16ab39b8e2c042d7eb7acd7e7df88a68a64c29babc323bf8a5bb8e3209891c59736cc3b80b0d970af3f14e3cfa7ae270d592644917acc342e8ef8b9259b76e4b65f47a6d4ef165a72999895ca5e814eeab2649334dc1268e52aba509dee594492993e64d9cc42a83fb96ce380e89f52501dc7b97f4b646f81408dabbdc5c48a4150516a9a67baa7dd6efd3dce00d278ace2e0ea2fc6cdb7439c9b404d3a09ce656b72b1e62d72f4f9963110f30971f56b72c932fe45a269ba96632927dc24dc7487c240b5e38b37b0da1b2b1b3e07bc353c8f03da8ce93178d9acf5a1e86a8542929b2a13b739a0c2e6f2238d2403013294572bfd6a0f0c10993eadd3a71eb82da3c91183cbf20fef03c01a265bdf958fedbc3ccf7ce2acfe32c80c7b7bb65ee8bd12163eeb2e500b0440cfab17fbf314a3351d3d185b5d97460309ccb04da88901f525954ebc48d65f758d0e4c648aa0e3e1dbaf542267b4359bd5fe2102e70f0b9edd73ebf218972e23a1f9c2debc9459cb29c40cc8f943b664596a19e285ae87d614c47bf453ddec7fef86a4c4209034f9205b27fbddb36304984494c6aa12356e7f3a256defdd882772017161b5145388f36b0e3069f5085e58e62900e5f955b85a222c665d8ef83224010e8cdc6a08cdb8ae704027670b743ea5c74ca3bdd857b60858663c02dd6d54e864cae3ba48a64355c4c5010abd56cb64ae67bff3b157a0ebc8ce0c00f00e54f68b9cfa3e114ef8b28a0cc8fd3cf6d0d4c1b3efb8360c9d5bb502c32dabdcda702bd060f794e5f72c92004a2feedf08f7ae454100980180d767aca6286622a8b62263c88aac836529f37600663cdad5ed677f2c2a40cf3e299c797e9188d4e5ab977b97dcf0a0fcc1c72764bae6b1a220ca2f39adf11d9f538c6b7ddf0103e24b8dfe98546ecc27eea78db8cb3c7e0462d81ef4127a573e17d34e02ebb5730270f45533d93addfe7df77bbe933ed71ce127716b30aee2f0e68a61697b00fd456f2b280982641bf38bdb01b52950d1ae6fdfa8864d683c70de89868f4545d09f7bf9fb387011ee589cc518cc95bd1573cfe12ba8eb8af016f1bb8d674fa06738f006221644e9236bd6314ae86d9ed300a6180b0e01a9a758d87ea2585c1131e2c42b1fe6f6d81798574274d5614e563004f049081f0499202913ad9b49b79a124e483845f3e31f8b7f733d979918bbdd45eb4f652c6595903737b200f3f576c0fc838658bd1cfefd650b87956c2b546a77c608bb7893e264d6b38c05e026dc2af50ec15387cdda42ce1638d63d8de2a35f5edc11a1ad0d2d6864e36b59861c292cad597438d8021427a7a25e3f9357e9a421dfa5548359ed3675def879dbe2839a311fe5c70c3e3293d7a4fcd68d0e2b65171a5b6fae1402244d7aefac3b9cb5e32096a0257208e1f9e320f9b12c2d2c812b41163132845970472f2e9432a9700a9838c3619880e381407911a0d91d6b052f01cf94d2424148406d413c45bff0540fe149511cb3c0040a9cc98aa2e49d0bc52538e0b1e4328fef997a85d425ed0f695c0dc7f1878d6aac608343c76c4c04100f8f9273aa0d9e3c2cf4b68c6a47e9fbe99c305eac45d6976aa5591bc8a12372dfcdf6fdb15ea1d9cee1f9a41598bd1a2c5860e46ab53a09a8b874f187dcbfca480f9b442a77c5aa24deb14301fd7b704984a152ffba78b966dfa806d8b0094382cd22e01968c9439d3a677f50eeb227858d0606948d13d02c4a8fcacee718951d63e1dea6ce3df9f1dfe22f742129dd3b505d37fdd0eb7f0451076d31d310089ffcd19c3cd3568efbef9454fac5470962747e78f126644ff57eb0ac0ec22dfc849d1ce7a6f794914cc14647ac96363c324ef0af225114680cc864e6b91eaccf1828bf50308103628d54bb131929b2ddbf72a137171b5a30274d972fc7e536f8f2f799fe8c933f3e842f6a89672e4b0ed39290003816272d78fccde79c8edacccf9d7a34dc184baf717531204c3fe5fb8e1df614ab94ea9444f76aab35dcf381596171e536f90fea59a4223bcf52e3ff3af105dc7203a9fb0a6d0414dbbdc4ed951a0d90e6fd483b96ad0cac056c2d5bd2999746d61fd96fb5f9aa23a8b78ede5d1840c24efc2e9f9acd69b9e70ae6b21abed10096933c27071f9ccde28561e8f30fc232d0815aceca61ae5427f2f6083c74a253c97eb75430aaa59adba38ccd87b3b47805cd1d75bd40385277600a911364eec032071121e98922f31c534aa9b98a81df64e43923670ea4666bb8dfd6eb8b3ff20f44b0d0198caa857c40ea233af77bc7663d13bddc668ef7eb1a2dc8e6b851c354528f7d89c6e31b442be51981ca19b80920ac46c5535323d9c6cb3801b5466abb3a253b68b21bce4c0f9e101e67ddcfb66fbbcb5a200c4e4901bb016df5fc77024624d4717517232738792ab0afed0a03c6601e4e9057e14c74f1a3a101053a703ccec1d75361d1d65e7918fd98c6a16b54319b66debdaee46da6e44b6b5a885a21d365ac42e3ba2ac0c939baea7eeeedb6f2c6b92022c1aa71d9b1955d09874ad8c3c5dadd481072e8dbacc745df044a793141b4a00c4544abc320947a60d4d3ed5fda191c55a5ae53b80aa1c2232517eb2ba53e683c197a938347c0cd97175a3c7893d07c094503aef5270f953a64f8d2c000bf230082eaf9e0c0e8a70470eac92874c0757070a5906558e41a8ec2948444441dba5408fb059c9461a0249b9116343348c5090463c9e945d4d089127cf24c3255fb074a56802a64a916bc4da8d05667837c49e8490289fe4e990746166cb3d31b695e5e3e84e8381096d564e642367fc7001cb03a8e80e113756066cd1b981218b001010c1a12ad9bbbbe00743f201101a7304b02505bd1a2a51302cdab31a430149001e0b01b6e4307de8b15508d0169b9146037e4830f0c4b12693680c9105d6e205a2a9b8321a97b02c1670c1c012a9c23243e212fc74e17a22c7b8f2d053a1d5083876e2ca434283c03815dc7c1142e8eb71caa508822ff11327662c8d5144c7a70a4e8e69660da5160114c8ee618bc4868d1602c60b3d1ba9c9db8c3c7f691cbd59f85a90c5ef8f03ac3c30054e7bc96d93818a8d1c2b39d8ec0268c227f7890b099882ac12767e2ca5b9eab441e388139481091daf0f8357f3e187124baa5a6c0021f2e782aac3d59b2a9b4c6488f688ac860274623dfa206786136276bbbdc153853aa4a82b0a3339090c0f422f30e6f8e8a21a9328177dcaf043106eb04ea530397a7476532c3ec62b4e040d471892bad4871c022c32f8b42c644340199e28650bd2c8883200295198e8cb7306ee50009d5c3e54195bdc5c010281c406a504501361d000ce595b140c08d1da30ad24bb10a950693ae7514c1125d662884f53a0f4a8852cb4ceeb70c515087d38268860b219006197c0427620706109db112f2e72ea95188049f54f81b124954c20d254c9314b7164050329234d182b3e97b05ceae2a2d4e30281821c00b1021755a5464a840addf143f3562aaa762a2535e8610144412c20d29e45047352b4e0b20a11c7d01840036be00d3a2940d021e8d6e10a4065126a64f50c55ad0878786202b303e18e26486678868430b355c0ec92a5aa423e0680b8f3e5a20c1837bf250004d1a4e527cc1a4a079884c9140824b9b19ceb0276552153240537aed8c81283869c898e842aab85126b4fb6e2003113e0d29a3e0f3868e5c9f8601708ad4361e200d64b9db1e59707474957d536e713445f6018864b6e54981cb3f8f683343040aa4cca34a68945d6163c5edacb8b5cb4e8657629d12d8297121a85aa88d640710dc184da200698ca451e056518fb6c14695870e6041b2dc90ab34135a252551610b22bc59c2854385d92acf8502073e03058468a040f6bae0c55d6144f2e0144b6b5b63f77866f146d6111090240949ea080a8355777d494913ebbee9056160ca0e0d975e1b39738220c9b328a2e24e3c860b868528c056d305c21c1ba52e475438dc80043550c0301d0e273808110693b294a2acf48978b302946946f94735f6059820649918ea8a3e75d61a8af7070267ef67ce010a62f2fce1a257789b82a8d49f2f893b464b4f94479a941184deaf121a210d04761a057d8a0404c8345ae1674b2a3d4042ead49a1ce95c8d27bc715c8a9c7d91c0429e6f8b92128491a81c1e46cc20f20074de63ca0901d60c0b3e861858388e020a30d690c2b6955312c2e01b3b5450a8a2313096b6a248550d1011a87425269665114447806bd11925022f64941c20a0b6dc9a0a0377bda583b0820409d237ab61890b1e118646ec389bc2a1a34e4c9f0038b56b9424866ce123f7bfa84f8e272245445644a7c98670501284ed87ca123c75181560bae034e1b49d8f000e424f682051ee51713a80db12b7b6034350183a6688ae04ed5044e1cf62c882b957022c08f00f438202bd2a638a94383243e750cc8d920fc42c0cb9162063b5dbe1ee558e3468e95019cc4a0d282004633a94a104c984050715a8cc1aca89f8cc3b23c1528386a451d404689e2d52464ad020347ad12e157d41b33583ca8ece0401813840af232289b8102e9fbc2ba8394c226c20bd704c70532a631479674cd50a1d5e28e0ab5e2a3ca6fcb23190a9478cefc02354087c09e5e251dc12d7a587b9d92847db59d910100012c3c460ff8300804774052043594ac56187cf22c694447f94a9880483884039a161b834acd1275b5a6cc8a20d90ab892891c8ccacc1d9162d0b6890894c44219aef4b9c4c44a8e0277ca2822743266d898422500aec7e5a6bb3657762c74902d650f1fc21c516c7ec98ae3e2b1840b2645059024456193874d9548822491173936ede90dfa881262820941d1302b348a10bf807d7084eba166a5b0c3972b5b961e08e0a409d3c7dea6335e59aa883d936e77788c2a8a228c5e1d24313adae26395a7c1132333465ca441a812ab8935026e7908e18909160cd432647d6640cd5354b02a9600f8836ecd59c9064a39a334b0580527c89aa4b7056c1430b2b307641113462d337268a6b4a90203c884cd930cff4bfb9224a7d21e1379a04cf823c1a5ca0925735584668038b1d14404871c7c8070fc243cd122c322477565839da32d819aa4180429f0cb4d27b34218ea41a1fd3127fac1b14a45288b010542fc4cec390148859fac863259438e20c841f7a070c3970fe90e3c45ac78ad60e3b7858e63da9229dc9b620217855472e11c3a75511a113d0fddb9c9eb9ab21454c2c3b3d32346033640782e7860ccd445e78a8f3c31c254705be079b3e04c8d8d2a8a4a11448357421a4c621248ec44993a2c16425c1ca92004b9e8caf803edcf081d5d11cc54f50e5398e108b2002077270126a50f2029c81629b7504c806429518b4730579d5008cab63c9e7f220d9086a4497311831280f4e011f385cb9d29d5146d361450a25c1e4824e1ce8e2b87c8901bc0a89810b8cada186446c30d90912e734ba678fc6070e19114240c953cc2174c001590a9f1404452cda5462d03d458cbb266925e1b8735075698b4c0205485c4626782c4c0055c17856b6d10a3aebab1258a89af836a013b3d92513e3a919e6c42f4cea8e3916200843f568a82304cb9da0212442399131f6958150b83f93cbb32e2b3c757a4da7f83598a8db3563ebb9acbb155b730bf5e3536ee1021882457eabed7449e204932c8fe971b1efa7fa942269a19b3304d5b485bc37e00b2644d8d99f766b67696c7647150855f53630ac2c5e9364d41a7fd78fff9839159a2d98f389ffc51d64a358fea7902bca55ac38252dec675527c38767979b65c5ba29191f990f341c147817fe6e00c73570acf9d0dce30b766f795f7cd5f0ed8830392c71d103cccf0487473e3867bee7f3ccc72f079b757ac5d7247214518dbb683831f726c4732a923ccff23770c38636b422575b42575e8a792d33ab4726cca3109c29ffff7f3ff75923a1664b9e172863975379b664f9903fe75ee22f2be1c517e5f5b78cbd41cd05fb6dc8aed5ccec15c5e6798cb32b66eeeeededcccfb3389239186398feabeab7ae65d673522efc3d15ac9a9d2d62637c5f806c5b8a6b6d64cdec892bc31e4a92e70bab1e3867c433ff2c8ff23f5fc7f9e1b35d8ced29a3dbec6f2f58de368cb65f79a78d7f2c337ee1c10e657bf96cfd7c3d8ca01db76379b5c0a6f58e68731f53a67234dd6596ea8a5ee1bc5fe9da123085292e93cfcf1a58fa7476fa2c4a0de3d407eda1a962bba7d85622b6f6977dbe53f145c43c277796928dd732f93390c63e543ce5c939e45dda265cc36265acb66a6c67636454b5b4b8b92c9dc9de1589ef279eb398e650dc77a76add6584a83c7ffcf70f46f3de4e36d5cf7c8977aa9e764208cc05b009a049cfa3853cfdc4eaa604ca5b554640e38fb3419a80c10304abc50f4ff716dd837291f949fb39bc8e3d91acbd3e48bbf5f729d7d5fecb4772e9562bbee1b516b0dcf99ad9de5b978fc9fb1529e789774b14377b73aeb69acad58986b2854f3aaf3ae0527482daa16dc0ab5f862e146ad633bcc3b1c4bd1d4fe1f996421976411f65417f2b0d0c9159a922b9c3810e0ffedfc7f9d6781f5ff9cba7be7d6671a5a131b75e5b9bb2d1cf3b25e46d6b1723c97c15c2ee36d2cd533cc0f39871563876efbe4ad8be8b677db96a131d7a46d67ed9a1bdbb46dd3d2a6642d4f74a764cc33ac0a25ffcfed78df5c96c27ab26b37c3dc3a77ac8876ae53f78bb7e539f1ee7de7a4dde5e31cafd9ecd1e7b52357a4e8f3ff712ca7b9fc2e453299c2c4ff2f7754f38edd521ed55b5b6379aaa3ba2e6cf1c72f5aa16044d13e920e8987ec433678a4c6baa27302c4893613614c383101a104a617251611e36bb2c4df37e8d817dbc6561dcb5c915f493c92506245a2eb4cc3c1e9332d41179a7dd8f36e97d68752868a8cc7a3b39b434b66e528b2e92e2fb3331c5bb3795908898d89332226c442d324e23b75abbd6c865d8e3d74e74de5f0ffcb91f284e424a5a900a6a4a52d4a10249d419273b4a151bb289b88f1d0934268060912f4801af8b1e3e3ea61c4e3458042769474e4e48c80a3c48d9e3649367a6b58a42983e6cdcc916101001b3149301dbc28e112698b5c161c570a5971a3c2284591a31d94234fbec95e8246891812c6c64c465a227386c805b10204820f203d923b62e890c29182f16da4a8213523868c240c202f20b4b0c2424ec59c142d8a4c27184d889140a3b8b38f78e4d06e56d41965b76ba118072cf746325422a2839ba4b299b2e073ed47cb6c1650bd67b2500f08251f467890eba0242c34e84590d1e906da0136d8e027a80f0ddf933d460dd90cadde863c0c677810eeb6ec927505e8a4e690179071527005de9216b69a10dccedae4d836acb56ad93446b4274c3482cedeac4199ddd225631cf352a88292829cd88830257a262425e845605106c23f9873c0824d83a4ee00a624d2979c178e425d6e0c181571d91dd97aad8d264b0c8b31d3553bc74ace4a15042054c9184aa9648a140ba4622848024900c10a02b93907da4c8c06c4d0ec027f64ca4e112301b7420370687a445cee7048e3678b5c13124060d0d8f3d34d7cde0992d92364e704aec0da97bd10fb01810c4c8eab0dd6e3579da529d32319e3d8f06e671392879ecc35d922f770050e3da10425001420284450862440816aa14248a125e12a191cc35cd1edda10c656a566496ba327b45e0fddd6baf73ebe43c220bd549550aa8428075207f38c0c39f697e7963484fe7f034d855d19db6a59ded231117dbabc74dfab3bbf58ab08a8883db78b4be3858be0a3d82ec242b2baf8efce6edbeeb21976b15437ba36c32ed58d9259b170f5a5264a52c3689953e5fdeaade3591bc2ae5cedaeecdc9fa4e6b9d7fde4f33e74e5ebf3c95ca62dcdc8a8f13ba5c4a71a7a6808d5bcdab19a6b1e6de1ad5f57e6d744aebbabc9b2dcf0ffe3fc3f9cff7ff3ff484753b3ff06ddd927e857f7b4eb13f4037ce23d35ccd5d5dd6978b6303696f59cdaf26c694666b8a5526eb838855c5c4cb16860f17f71f1a1163f6af1632cfe8c19ff06bec0ffbf8cc52fb0b8986271c6e2ffe2a28c4515729fe4619a0abbb0bb6738966a2dc7ba8bcd31ace558b79c2cd14c57e7381aa6779213e0025a4e85da42988639479c79b42dd422d98e699de879eb31dd94f92cdd89bcaa5d2aecf6ee5a7577b54e34736bfbb8b4b3323129e33f5353a8a0cff42197796f65dec9deabd58da7b01e6fb74cbd0ace7defb9b30bebe1dd65dfeb758ef75dfd73369b7b86d2f8a58b6bf9f5eaca736f5afb467c43fa25a356ffaf7954c7b39efbfc62f794b79abf51b7c33cb0cbcb6ee573cfb2f97f241576e53910f079eddcbae159baafd6b8aed994f23696c2b1db657ec844c3c6c9fcaf3f657e4ddc56f9dd733c3f13b735ee2d715ba56e875d794ee44fde77348e89867d93f95fe2b65ae177434f1ccabc7340ce653c6977adcd6687b9613c379b7d76b914deefa66bf566febefb2f9ec27a59399e770b6fbe77fbbddb2ac77d6d76ff71ab3bc358b9da7715c6269f0f9e0bfe75130ad5f3d6bae5715da2d9bb9bcd679797ef2eeb6565516c2f3393aeb5676d6e656b6c2d576b738bb2a99db9ad4da75232c3b693cd71bb0ddff85ad6676c5c36bbd4640801ffbf5c2e27ccfc1d9b3797a97a8efbf4b2eb77536117317ea7f2d69cb0f9f243fe3ee3bece3b14b620e480d0d2b3fb8ff3e9b367f7b5f7fdd655a5f3be76d7aef7fd4a09114140c1772d7fa3bbbb7670ec7698cf89fcb9e7ddee995b9fdcbae5296f633e3629b3dd6d6c6a9bed6c8dcdcd8d0d6daae6a6d6d6963655736bcfd6a42d9a5a948d2d3a3d6b536bd1ccd45a261b5af4cc8c9bb9a5a97136661b1b33d1ec0382ffc7dbf3e0f49047c7e9d6b51a4a5dec88b22365ff50581d1a3b2020ecf394c6bdcd596379ca44c30ed6915ee5e7751a688d03391cf739a573dded1ce618f42cc5ca73ffff8f424621ffff915050069053c87f28e4ff3f14120af9ff1f05858442feff4721a390ff02fea7a604fc47bd14de837fdd193b736bdc3795cc7ac8c5c262992bc235d07776eea0719f7bdf5d375fb1b2cc6758afe56f0bef2a2cd8f2598eaf576ce01cf771291cf7256e3e995767bfec7cb5ded5fdb53016af6f0c33efd3a9dfd46fc6faf1369e5dabbb374bb73cc370ec76f77de3ba2be77671ec7cdf5dd7726ec7a9f006bc5ab11960bd16163494ee39b075a52e3610b0e5d76b3c07cab12c379b5c8ea54feb2187e3bea9ea4af4d67df761853a3b3a396dd83879ee7a4ceace7bee13de10e33adec6d2abdfbbe78d37bb8977b3cc0f39e0ec26deb989772de7522936707613efe810fcff5c1f2a284ca8f82f4cce8d7d97977352728c4ec4b82ecbff63b962e5ffab4c71fcff284f9afc3f93ff5ff2ff4afe3fc9ff23f9ff23ffdff8ff46febfc8ff13f9ff21ff2fe4ff83fc3f90fffff1ff3efebfc7fff3f8ff1dffafe3ff73fc3f8eff67fcff1bff6fe3ff6bfc3f8dff9f11e3ff61fcff8bff77f1cfe25fc5ffa7f8ffc51325fe9fc47f16f11ffbfff3bffcefbcfebf13fe7f0dff5fc4ffbbff5fa572e9fffe7ffe17fe7ff87f0fff1c7ef0ff05ff03ff1ff0ff37f83d9f86ffcff079509cfc7ff4936f53ddb55ac8f3cf15dd8ed5f13cf72da5f219d6c3fbea272dfc757959f6ee437e96b63423e3722c25b31ef211da4297f92187f5ecea8eadce7a8cc31c5fb3b9a6c614ec9dbfbabb1aed1aff3f86ff47269b815ee6d7584bdd995babb32b6fbfff474a3fd96c99674b3332327ee8ceaed595af13fe5f8d1cb37f280e6e6f5d5ef27953ddc32dc0cf0c6363a9867bce53fe3edb378e8224f5488a0a81b2b9b71a0e4e2a772c5054ce34d9f4e55dc3c1e9ea92535bdec1a95737f73757a7df7462eb8ef8ff169f640391956798975db795ffffe227d7dcc0659ccb73b4acf3f78da5711ae66f61dbda5bb5ef6ab3d9f9353b3fd3d6f2d476a825ff115c48a3f1ff87ef868689cf9dc34f99cfee53caafbd4cca0fd1fa50e3b7d9a4c67b68790f01c5ff177e92f9f8ba335640a433256b987bffccb624334bc3bd69dd84526117aae7beaff096767929f3d92d43e638d3f0aece5ae655aa5bd5dd95e379cb7c76ff5f40874f9e4d3df3faca663cd006ab326f37cf2b7bf3cf1cb4f2596feeeededcbcb95cf7bebbaed984f28af322d7924b57ed6c694666c5729957678efcb9b935393442d01963a1318fcaa13e53be789a42c6256d6976b6342393f9748a8d92194ae3379a956e2adf4bdcd6bea94f995f9f9c4f9fd9d9956357be3e13b7f58de3687676e57d7d669f6d1bcfdddd9b9bbbfb3e7be752e90ee43276de30d5ed33f60abb735ceacad767dfd49ee5864f4edd723cf7b92eb77a59991fc6520ee83c7453533b33437363fee9dded79db01b6a9adfde9ddb561791b4b9f1d3befb9c751e33d6afcf64d7db6bc63f7bcdbb8353566de9b940f76a97b8de7deb9dcb63b6d2d8f4be1184e74ad9dcf59ba2dcf893c6d0d7bb5eeb973ab3bb7bc639f7d5367d7eabecfbea9328f5ab1f09a1a53303bbf58a93b9dbaedb353e377beba5ccae5be3bbce579de73375b3bcbcbcadb95ba530ef36897b9d51aafa931f3aa7d579f33cce57dadb0f56f8de3375a9db9358e5fbac23b0f7a814f3e3fbf3d3a6da10dfbe1caff433f492146fbbad8e8daf2ec6cc9248ba7b04bc6df2ded2d87a96eefd579fff5ed25c504edf89d3eb36e6ba6e1e2f49e5fde723126628cdfc27cdeba8b5d5b988bc5898de9ea4c85f9aba7b1e6723c9de53d773719fea11ef5fd4311827aa1d6a0d0fef841f6719422874c80344045ec6c4dbfbde9b330fda675852951a03c31d371faea7fc52723c8f92e2fb1dd95a97b520b18f518037f0184a8c72eaa52912d3e39b21062f0e42d6a8f1db42c22436874994b8b2263833aa42c84dda71b63514bc634282417e5e8870c42d48c453b0d21149bc469d11575750cd37aa2162889594509224a0ad9746408022208a22c08492a31a408c79918522a4acb017b946442c8628c53d48019516c3cda2237848b12142330877b7b4d94d8251b41c9d924a4841e254decde0a416d71a2674e200842587af4811232a8514b1f1f60664d3b50297e60799844a2412020375053371a8e903a201297a081da83c169529624077383c2409d71e93326d0a908003859a0b02ca9092227f96104842392d3122166d2f8b8d188a00429e80f9e1131401a9f848620d7f0a0900584261f8d5876201d1fd502d33cf62884a381cce1e2838b1c1f84a431c3028998c559e848d68f166209240849051249643161d86246d221b1260112e41162861739610fd251cb75adb1a84526c8c1e78e31618088c3bf2434855e99e8467805717e9e156ba66c7045e17cfec554f9c3db683c4a7162f74806902239b38366d3847f1846fc2648c80ae2e02eedad02d069531245d162f53ff0c609261c128b405cffdbc8f88043820d812b2cff5f292eb82562da5180c57f94944446691ca38fe053a2447696245fea139c21729c3e6199c3258bc3a02d3e46e913101a61dc1488ff60b869f4e9441843536d0e2517a3429fa49d5e6891b4e20350d0e7931e14081080b83d471d3b9f96854024d150a86061809b4f56402e0c522387040a47349e32bda91241909f9d6d09e309908c294898c62cb832cce2098d17bbab8e1b4e84c471f4f404d393671c18b3891d4a3cdd6002488c912e86badc18e26906940911c255ec84981d9e3cf4e86b4103c7170982343c5d6013e61334ad8c59200b4f115e449f02de12196694f064408b16294ea07c5aec32777a346910261d7fce4492f07612204994298704cf3d96da4e5ff838be104c4497b000d1a95187a111386022b0e9e1ecd4228d1fbb095c75de7cd9eb64c8e2d10e203a6a2e58b0ebf477a58dba8982da151b6f9dd41ea519f89145c1d1d0a75c557a2a20a161c2aaf18f8b35ef422fef0aac0c20118afb4b904e4a4604b962e51c6c510d397aec5b0e6a57d8b8928006adcf2af08b4363dc8c447f6e1c22e0da8d1149ba1352f63cdd09ec2ff8d85c9a0b36b8a23a0db20a00528b164b60296b53bc8a551c4f7d88536444ccd910813084f54b4292093f90c33a05b3a7c9062a2b900a31e24a6207d01f15036a282ce963e187c88ee3959f1f147d8c853960b8c8511dcccfa0128115a6994f5205656928c5b9b167858a0186148be6fc286262ebed8ba12b567d2baee8c0119c15b55a2b331e2c6c1c2e59536247f8b1f458b5a2ce83722d4f884538183ceaea41c8a445113a625a20d468a1a8c0e240284a16500a85821768bce01639805206dae260cd2c872f7173ab7872264276051123253b17911ca98445d4c9c9c4c51a6426e7c3e19b3e449770b868ebba38a9fa6af4124f034b5c3c9b14d93244c7a15706128c349d4141720582e00c0259173159309b183b28c14831494a120f2b08d578a21a43e0489da53a42c408b50c82723472e6e54916622412200e3e6362b8440279da92e5c90cd6560d3e4d067d3ad24003170f51c54cfba3886750232d40f8b2bc5d7919fadaf2a5138e0e86568266ae061873d4c382568eb2b3392bc1277fd2fe101246b0e354e5244299f7a3745a396388cad14b0e1bb01e0b49db91e8858a3a535e81cab21c6e8949b83a0325d088903e034eec49b284c64a33b21b0283ee10965e91365733cfa82497a01c136e71be129b86e21ad5bda8ad3361161f419cf021010d92bdabee38c76a488f3756ac368e60515a0a403103a949d2c4dd0808546f31aeb8854704ab645c7045a7b40c58b163c10a3e6ca01ccca519b862d0a46038e4508e4388405aa234b123c9413b1c853151e106022d460a5d3036e86320d5c084a60d480306189e38195854d3bb1a82c8c7a61428e2d7fa830d92a7704499011010272a90089008a5c00cd004f91840f94223936d24e18a30482fcd972342580dac989161e68096292cb410906368462265161b6a16e0c46866102934b267c3db972e2716981c840e11b87be4e1863185a633584fa2b0a1f363e426d58878670f92874bd560b029a43bd811854507551ed2cee905f580115317b64037b00d5bf40869749195a6484e4da6347dc8ae3449a338e8101d2ac62f41dad6cc2911e98317118f5a5a60bdb2149eb18140c55631f6e14f8247161c659d39b176004e8d0b4e0c425a0722b0995105d52644dc52209107f6c38b37c005be44fce98462009427992a27f068a9d073a22588e28c690806c59b0e9fa81491765c5421fea0143658066484951b058fc8433a6011cab86002692f2c8ba3aa0c7a8444fad362846c6b51a3c0170a1c16c45625ca24a87a9446c6a684c06383400838f8310b720533a4f33a0c90f5c47113c8c6320b85be2d165b75140d6f5831815b1c018025187156ee14bac7410449169edec3a70a8dcca47346b5d1ee4e27f2e3f3dc383864834b034af0a609a90b2709d33d81d8f064b042a485074fd403598f1660578b638e16925d02393af64d91f1478e21286e20c560c35586aa282543953f677d6f7624b80e155c515b6c122380070d1e94748ae231054d1e255891a827bbbcb7bc159d86208e890ac48007c0d6a999804cae4e1974cc8f0168578ca6c602d8818790baa0031733909425258c3a845388548e80b2942937b688e0e852f015a909844552feb894c870e2465405d6882b1e1a79c190c1249399851fb2163525251b541e64a883048c8c4c999430c64b5d5f4c181260d742ced9a0375b5709b28cc1dae4639108226c7acaa8809302654421a78a027204a64a2612c8344f106078b0f2e525e253a1678a1b15d41af468dc43214ba72c186eb65c8183c00123a22858048139d389aace1d4c370ebc25ea8d6280c8d263adfd0203c0c389c4dd1b4971b2c3f94046536b8b5f9d65427403928c01ea0e55d8d95485814592d29a465d8200328684889364f395a74e9fb357311a2108454700851039d19282cd5377a3ce4119a560dd1417b02f55622e055a43a0a6853aa784b23ef77680f5e8300d1348f0d101217d22f27e28bed8bab30234c3822829a632c251637693112bb6ba799219351f68d0f810816f193d941c53bb24562d42254992125e7838f87d6d051ae44027d7c9101d23639c669039e1c30a4b229e10ea190b272808cde2374caae40d1d86545a94591b80e928610c9e0f745c2800ef0c21810340de86aa114c4915885c319db02d4ab4840f684247a6928d18199295029f8f348b3f3a60d520210e1c9962e0e0eb93a1af9365059f2998510991bbca6208088b7f52a8b6e88c7312ddd51b65210b4539ffc2041a307110c590510c3078ac73094bda014ed64c1a22f151fb8388d5ac1bbb01e28e7406d99d0f5768ac64523eaa89b96022d10fc90ce520443936a05d3dc6b2cda649578844f19333264b1612cb8c9d0831273395323cea09a6628e482ab543161d7c40150a400384812e0d06a95e0e089b619188441fe1658242468df040569fe3f2c5042b0c2419593a402b04f446b564708611404a581faecce8bb7162cfcc4b00c2bb365c1a41cac1e52e030ab32ca22c3f800c0b3c2191c13e451cf9d46113585596a1474d2c13bed09023449f4894ed7dd148a255c8684490b23b1a10b4c1a4418ad65545b650180f82c6fc41724d425680b0aa86daf2af0715ae4f86fac8a8906105049627888588f0040e2070212a5bdda04f5b03a0247aa16ad3448aa43fc01c43b4fcb012204806e573070c800f1d4b8775494a52ca0e025f89287b3ff4c42808b9cb1169abd13a60d0a6b292c0079bc4146f4861b548d8a6856beec368109a043a68cca525a78e648553ce107a9468089e27707f890b2e501e8f42af9143729a2439d942205879e21bf0e76ff0d086373c6c0cc0356845b2cd958e869ed8656e849d4c98a7658d0b10d7222a400f64aa5a9a7f339ac018bc429107668e0f89379a715347d2c84aa56436f280a35786874f8e8d98df031958062cd21c1072b237630a1c054e4e18a97384150522d1160df73623cf012f9e0cc589a41c922110cd211fd224556f3bda304250a68bacce8b050333e8146941f605d01fc538583286ec28b39044812136c2472c5ad10b545326ea38705221ff65aa1a50490a03deb5272ae00319911559ca7439e0604a8eb7ac2b066c25209c80ba84844e259ae1c48c0a312f9399d799104c6f0e595ddcd112bc6634a9b4f5e8f7a45422c9a0118340f064216984c6aaf1020a4b017469999048a28a2a911817ca969be9730aeb12a09ac73e5f73650b0e6f48b9fe401069061725b30eadb4084b30c991240432e0e1ced80a466c1588458cc8c2c8303a0453518a594b50e16b9332316f2ecd3149210d7e3c1ee4d9693dee51d39846e1c196bfb70b505434b255d519d4b62806c62f0d024e9fc008c1f204f3e2527aba347b308925c794e9cbd3d66ec0f86a2292cce00100174d50433facf8b274b442478ade10dba8d988beaa92716295cc589931009b4cf11c448db4166c755af08848224083fa98d95b81c071d29e55005d42d6002812551172adde81642649f248a52e5510a681644a741820918c902d5c43c274e8d284037ca3e3cc958dcff4e02a831906353b3af1c1f3a4fae7009a2615ca290946e824db60e135d05690dcd82484811c9c9b157d4a3170c8378aa4b672e4b872e3094e2d8f02b34e420e683956583ae5b54d5ba12aae860f2a6f5c72c942380c1045a993f81540890886c62cb939c4c90416e0a33e50ad239c187989c901d7a247004a3e93b0b0e021ea04a3900f27676c5104e8d2f125a3cb885e36671dd35348728481d5470bce440944843791b825a40d48562a3d2911769c29c1e8c0041668e01c9824c38b6e0a92174696767f961c6912c20344ccaaced0e2b61721cad006be472d73f8e4a0fa52a070cdd56b089739ae5941811e9d97256c340f96e80e0e5e3a89fd3141179585a9309114107d7eaad67402a3d5a6c5a922cb1a80d0c481420bea9c45b38acee8f99a42638aa4edd8b8b52111911b7dde1b5a33928c09eb7b8005c3fc258b891e24b90a8922ee254fd78db7703bb62030c90698e18202621dd66808c4c3b59a42d0a5d09603d9fa658a5b8145c417756e49d6785931b001c032d29ae69bb1576dcd96b64249ac036d389479cb0cc48054614005e896ad3080a29451cb16f2f364d1ee4e943790ac7c6c0da65158b32883a367a37a706042325190f28ce00b2686e006131fbf3730ae0fc82d020415d39c388281520e2d28f3ea2a082629bb28db8f14030ae7a46c9549feb9d2b14684c1534a9a802caa9829695c9c1e6d80b429c427122ee0197aca4ce82b1f11f84c2843c164d3c6210e24298045e51d97412dc6fca86455234502df8da929032463e408f0e983033d384177069de878b018b869a20472a585409b254a222e965552b9d3488195b2d0c88a3361bc2c7ab1a36b6f46959e172dd11f74e8acb9e167c917ac2448b07676e06020058b7d7b169747aaae1497fcd435d123c441414c1820356e5d9a5c1a3cdc0e38a1c100918702e61d3359cb2f77fcac797371a7c413ca08337755aa198f510a19911a5176da129c0087c8005e8e335ef3879156d18e4a82084cb0219125466ccea3e296d70b28857e92f8b013a5ea044681db260c19e838b272a22b7ba8e52b8a86d00d4cb2728389446cd68489795425bb2fa69b714aa3ac0c007444f2e2605ed825d7215c56144128cd1a65d97447ab5008af4955ae3c3cea35f13078a9ec4f95a24285cc4cb2cb6b6c36cabbcb41e30a589f23b05417ebdc87c0db33b54871cb9609be4844a08454b41346acea387acc61d5c67928c447d5a592274350ea2258e7927f6783fee09ce8b8f4e9ab419c0d10d2b8b61489d8e224d7688ca71e434e24721bc04ad00b18566cdec840635261b569b4094232cbfbfa81e3a6c228f1b98b213d2ee2fa82c18a8709b3040a9c39a6b070f1495e6d3a877e3a913130c2cf5ce38d3c2a724a060ad29c68811ca16405c977c1dae1198438311540f386fb228590296d0685fd95a1b3c6238ff2173a70b022c489f42b594cc092a5f1c3a313257f587470b1f85d03963472a2a949b0e7483ba092927f2c432e90ea4014194122cb9f001c7fffca476a3ac431a1a106274639a959eebfebca1d4b5a8f8984c8b00069fc5229114da046a81600c43060792cd4c4c6b575e8521ba71b8846a958a43320948c89e2a5d256f182d2900c5e53079b286481538702d6112b5f2aa23018bfb2bad411ba0cda28397b16b5a832c5c9ea415bdc3e886ecb6bf85454787123911c218bf294884acc7348eeb598107280c76608544a8bffaa2e5ab40880b1b00020f50f56e3118ca92a1000d934fe6fc575706ba4a1888f9dc5b73a0ba4e9109e0625a0fc2727202a03a34a6106e37f4bcf88429e582011c9bd95144a5c9851695efe9333288c854131eef8e74aaccbea219245ff5f9141ad1194c1d2e22721c519c027408e7f065c85ee0c7af4f77f45c52b510b0db957722804c501f7cfa08c95daf7f88f9546d8224fe3bff24c962dd0e27719569290f68f1506cd17e33f95d9104372efc5b503c97f56de61a27faac6a77eaf37fc3f0b0f8bff2a2a39ff5f2c16b54480c9fdd65bfdffffff5345c1a271e6751c538043260d692c7e1cc912ec534609031e476da8b015412e012000af0a8116227578b3e88410012d542c5896a0b26025e0308fbe724313ea23f44c28c062a367801d1b6180988abafef884f4d9d055c22f2f86152c589f9248db0d55872bdf58a931b86081a3a79aafaf3047d08061cd79418a92a38ea24b5c9630310c406d028339fcbd8308a31076c98de48030664628a380da0106b4d860f3222b424a2dd38b2b303ee008d4884a22a188104d8b3ac4440c289840a0770543858b90142d4c76080e4a6ab23141ca212cdf15ce1e0e185d5aa65cb99d590102a56a7c8304a465d103425b5c2f4e787dea92a5f77484495a473e80923ba6d0195347418d46b143355f8d0a185a79d9f3225e43e76c0acd0e22932607d46c25da20a6c18b1a3119e4d8f060fc83d32579c6f412c7d9b5d65735d149919902cd0a0e45b54eec41dd20282225f28c69b0b8b507882e70d26bb567855d1f058e1401026bcca24a04090397120256151514258455681418cee93176cdb0a5461b46509870d1d2423520cd262e340adbb3b8433cfedaaf418330101597c4b318381b8d4d2526aaf80eaf323836e14e2ce16521406002474bd709428470ce852ab43c595632392abec4a652d849496323cfc3f1cacbda21a1d2b3e42f804642b2187e910e9f86000e65312a50d2a98919c21f648e0c0854448c11af99aa0f4e7965801390d8e4fd50631d40559d713d5461819d78d0c49b67092908595053f8c0b4d4613363cc4b8ecb0701645d673a04a226c90333c025088c86ced4242a35698dc9a949809dbf1ceeb971a1eb00566211b6bf4b8c74e628b2c281a68090822eac346922a86109b89076d082828e90394a1b1684b0cdb910b078d252c6848e48af2205a04280f28c3550a722576dfac408c3008673e062304daf039c002171751c2b28211c52d3512990143c6a1ea42060a741c8150c6606d3240e7af8b8386ebdab1029b8d834c1c2c5ac6cc191083eb2423c6c719004604a0ee0092f170d97138e482d2b02580d30438aeaa5048d9aa11084c8107f3270850d9066d150824a7521b4342ab385879f64871d42ae37c2bc646070862513951714ab389399bd2b92100d39e2495f1a5c72b53503131310202a47560460e289da589f073047962ef8c023244621315e552a1037a4aa4a1d100170a8ccdad21273ec4c0691352d4955f694c6112bbe6001800bdc00762bc0ca402872e5d528f4043a8527a8f250526502889b3f2b87298afabc9fc276e10badc2bfd0c298b24749208c3849d92c89be66393f38287b70f05545f451d172e0a06acac9990b198f41e46cba1164f1d560560074e0129129966191d5912031803d51bcc4b878136dd333c2908f4b72ee74c23148d563962b94be40547642d320172114ef64bd29ffe6306ea04d21bc089960696b86d7812b253818b1e8d05cab22234d32e2884ac2002ef8a031b9a08922916c6d7595b0aa384984e3d327ae4531c55c8b014e495d20ea38d882e2d305077a1ae0388461d152f925aad295059f5e60d764d954d648522156188b495f3a3eb9816e48dc36255a5262708549d9a1b64f754ea60c3c2a0e6a5a51fa35f1f3889011197a020688d97bd352b94a824300c33e2f5e3e78796fe38bd9c300c1610635759ee45165ed79f1f8036c482262e3288c9dde9b037d8976f8f91d81570dc28830140421d7e700c9172b392f542e11155a0ca080e56f47d15005f287a84c52c507b4077baa50c11d58d0e04987518f1592489f1acd0181e5868f8e222e6bd4166cb599822291002c5d2836062511bc400126c1f816448aba1129ce10376a7ce838325b4dd08103d87547752b3e61824b8c3167cb2c5135110f464576da4f96f6ee38de819970b0c2c1974a10f44e5c98140801e160d514351c95b2e85993e20811a697c0961e5a40cc58ea0e16b0e820e288a517059458f822839665c1221d3c4e93610e73932043559bfe8b21690818e7d30703080a187d5a03c25ac7b86ec205400714c6001211fd2270c5049e195591164880a225c663a7890a4d1c1b4cb6343a7c9248c10a3f34a32beb304afe6b9bec08bca35638064a46c82b90455f211373b2d53666b494b5b981a07232adf4c141c248108a0e56e0563cd883a5e8422112151a98e80164e645835023395d496ea81d70f0879171901304485d89a49487dc5248a8d486cbc35aa10f2c2a6514d6738da02b16b84090ce50e2c4a7078f3a0697bce87113284187314a92dea84a34772815ed846904538461b6b2f88c1a4a885ce989c10c5b60c01a05ac30ced188046818f8313a7185ea4d812b446936a024d890a6544e2a2bd3402682942a8b7a28e40196b91a8c356dfaaa52b6d57564c1bc873a82cbf140262f8740340149d904022a917cc9282f4a58956552d2a648a19daa0c8d72aceeb81fb62c604ae0a945253d2d2f3d292e04515600c9b0a43c31411612028290bb2406157e15b6e809c0519e2647b8ee084260d5213ac8921246382836e6c4d83480f46dc5608464e1cbc277c56cc1c8cba33148c0da4051716437807a403161eac4908a8c2a40197028e993a54fdb8dc446b13abe2d5a78bcd614540daac2c332f888b6a3010430048556e0f8b1e78716744c512e2b66adaa2aa0d3fc04c3c88237066eaa1abc14d2a2a372c1668c0835750e3818a3228493c22f401f6125caee125fbc6114472d01ce54938a64f988cc307406c21281889e4931b2aab8c83a22e5088f8216a04702feae865e439a1089812786278b91ac456a94d07041952291196c9b3d12e4108225859180c74e9683e8a4aa3839555a7465a0626856e3b16bd1262a7914b0e8c3445af8e18e93952615951f3e4405aa0a20f2c4d5e180184769b07cec38026d43e866776a7cd42745c461175c964d174f6463144d14a8e080439a2a2593f7abaa481f1f8e36227ca98448620c2b4920c20f173ac4f8b04245ec8a001d2e31d831e5c8939336c74e45b82881c9a88255beb5e0f1147bf07ea9909347c796297a57339868da32e9c520e1410b055d9474e0c3e588d14b5b050387478e53c0e99b2b605200aefec7d1980f1e6dc64c5a949ba25d19d8c93b4fb8882111470512f40f0519aebd4c82089c111cf728f8d028b1355225796520c0842c3e684ce565ea6de208c1b1a2e120801147c4c4063eb0c90140c110335b542a985060602c00379204a01920479da4640212cb30351f3c91c9aa1362454204a255524fa62b972479ba7a59a5d013e4ee6aeb2a9908a6e5110008207440f2f7773c807970f69890c450ca0db2ab8142c80391aa7ecc7ef2a879b0972d311d0067b109a2d6891c577d971cc17cf0410143859ee3fc2ab2160489161f134cd0798a40f244c0932a0783f4122b2712a724218164c9932432b218057112c7eb0fd69e3d0f33fcac10bc5e8752044219121cc20868c4d2819e052fa8aa24eb088a239862cf0c26610458f3444b1688aba93d7514066d5832be07dc7638f042e3d290ac53298821c5b4170a0864a240750112bc88457631ce0bb55345b3e90b569c46329644f021280a43b6800a4bcd275d2b1049e9833be9b1db22d440080b9b40259dab9b0d02423409e0c69d1bf05fa11d2c0c083e71bc2d1bc4a0b941d32b84d5639047ce85b81fd243638b63e4ba0a73085152554c78011617f391830843f985c491ab32512b55440a0ed041c343049618570c0667600acfe83936d660bfa011826557487ebae202424945a6b7273bbe08faeb027315b767cb8d48c265469d4c8a802879b088cb066326461b0896c08f98da4f30562809844b88260e6b10713821718b536f0bacc66c3a4c8e32098aab01a5401bd050b5f5c84d07170a5d3ad830a3c3e104811f3c49b5159c0015b1b061fa2326a4c09481265674853651b7a0022e5d6541b6c990e06f2bb048530e501702339f0650715d8c4ac09cb4789c93c5a400a05211dd9b2459de54b10924a262ca9a3475349cb121e362c36b8171c28290872c973c2f4f6f664d0cc97d2dcac1a4eb4c2b025704136ddee6fc61ac0214d2644e112a596684b091015115b8b426d0e15033c0431f4ed60c786b565412f47556b5c6f622d20e0b3086e4c9b6933a50fd71440eca6289d312b528010d80b4b4b27a10427d88a68181a3e24b8caf3b7fbcbc48343223a959669199076e85290d1e4ba8ac3d139ed60bd3cb6003303acbcf8bac293998f8e010a1a046812296c8cb8ea2ae3602d6a035f673aec78e2cd108191e283d119ae3c401041f189eba208921ec1bc43a31848a043c5319c229196b24a501a3aeafba2cae0ccaac010912b44dc82362aacca1c8d115ce3045fa1856a785886ef1ea9212110862f8e9c0e90b331050832acd005b83c50d476715128900487447116122a558a2aca74d16477c231037b8d87027d255bf7383310e8958a03702444074684f0a971c3768735f862c1d9019e20d08509ea419148d61551c55e1d208a705910a8c10594d0283c1f4430184a1185013a40e0f09e22a4324e2c28e99d21723ba2a6976340249164242420dc3464b47608129244a14825a61df36c8289b427499e0868b0b8457e2568e359dcc60695a9b9e8dd18d9320dc01bb94edc41cd2e5cc27009689d894393a50a5c931eec291498a28eef8d960420ca5355a9908f9e2c8b8760073b363891fb21199c0d8a434a8b32288a963bcc47126c241ac52e1262d000813d234e2b1d360479b1406b4a428e6384939e35220011bb14c9e36df57892715893c2720b4d960614e3491a9b12a0118c31ad4be3b9fa8d284b5e90b2395358702deb58c031a00e039943d393014e09566ce8320926199a31ace0562a208504325c425308535a853252d678c3b32080dc9a2abcb0ba04b88183984ebb84736648517951d2e4e49cc38c2b12495f5748b4a4255010da39f431d1c911dccd810b202091ed6162d5aae9e90b2900188504db6e4d34db2a52053c1d9a0b322671b94675dbf94e3eecafcd0e5522e433997f1a01d0a6f1dcf6641ccf0cca4946560ca4a44b1bdbb5c8a6db9aca1b08c8d42c7f81b7561971b6e2bd7634fbd61ec5477cd0ddd1716d4ddd5507ee8befb79e5dc10aa5b78cfefd67d6bdeea77bb33cc11e39747f515db277079aa5b173bc27d352c63e9ca92cb3b4b0096d5e583d73a5797cbe60c6f446e75e7086e6e86bbf043e0f2c1ffbf920cd32fa1731ccb50dddd692cef174be532991db212ffbfbc8e41abf3e6edf309d57defc43b323c32aeff5f3afdfc0075369a8dea2d0868288df73ae7f274daa9fb9d8ee118fbfb5f8ab5fcd07dc7a6feabf39cb202882defabee5bb715205008b414e387eecbc3e6097077f5ccfb1c05c6ff9fb151dd5d3d4701f07fbf701c771d7799c3887e59aea1d9743eb3dc302e4e8fbd4de358febb7b4b8ce99e6252b12f65989effaf7b65580f65588b300c6106263c2e651e75757775558f89413954c3ae6ec3f4ec665f386ee18de5d2312e6f3dd5d3cbe934d62defb0bba9fbea56bbcc61c45867b92197f9611b57676e9563f7705779b4bbd6b243173b826b99c7570e3861c3d92b2768096f24244a8010e14d0412111e406803a1c42fb3510dfb2de1c369ace7cee7fd765e9d975d2372f8d972c5e7dc79f41acff1a146e470cbfb8eea2ef3393e8ce3aa14e6512aec52a9fb9dc63062dc76cda355a95b450cd37cdeb2c6b6b17ced666666677a495d72dd72aa1c93f1eaccadd8deb7cebef15ca5bad579ba75874275cb67e986b9e6d178d663bceb3991c35a6f2d732ad595e7b953db4dd5d979aae7feecfae60031c4f571a91c4fb3fbe56ddcdb7ece891cee9bf7b37d10e8617757b7322bcb83c4cf72c30710fe0de518716edbad3becea09b3f24194832aff596e08c7ed1b4b65a503e8f3765378a583b06f20a78193068bff0dcc5c18abd59666babb5acbb15227faff651b199e5370d6d34a5d6509c7ae34d61a9ed38b4e2df7ddedaed692e36a0783f44bdd3b97c6f2f5cae7aee7c01e956030a66e1b5bdfd79dfbecce30d71c2c0f4cebff2bd17fe2b67e39c9bedcd07df5988c8d3abf16e357c7f1fcfe4dbfccfedfeceb955e7fbc18971c9bb8ad7ae67daefa4b2aec25f74bafe4ffc773dbeeae44ba737957f5ba9cc461afec4aec92fb5f369bce36e619b62ba96440065ba7b7ce4675cb117bcbc7e6eebe7c76ab841a76f50cf3cee56b966b60f0c3828ce555270339ec082eeb786edf58aa39acc785e9399f6a2b56f3ea8c18bfbabb7cea5472918961a9567255bbebe49ac0e128b6cfdd4de47a2eee89c8e1b82c377c3ee39c6f9ce3b9ef1e6c36399f369b9df3a91ccfd23d7d66e777c3fcfaca82af8ccd72c3b81976b73c7738aee3d6dd37c39c3a97b8f99a4da71ee32d8c8de9b875c371ce3739c6eb3394c62f1d2c63a34fd8b5eeeaf5ddcfbd76867df7e153e6d7677f266e2b2c63399f3edff809bb56cea74f2aec1aeeb93f61d739c3d8d8ba5bbdd6edf114d68ba7b02bcb5c8e65f9ee59edbb9a0523ab7add5c9ecb6afba7c22daff6beab59c9aa86fde6b0baf0f76a8da53ffefb466c42b1aeff7d23ce61fdbd86e794587a4e7915e8653ebfee545f55f9ff575efd29ad2629adbafcff12aaa9b0cbe5b80efa6ea97b374b753ce359fd88fb9456b395d95257a5f3b64ee32a39d2fd5eb9dc5261aa6b259b535635fe3f6fe7d9b546b155794f95b13c3ac39c4b612ef32997f5bef0caaaffe59e77abf9ecf6980c8e6125959942a861df4ee807dd729789868de3d8770f1aca6d2c8dcb720d596e68d8b7d369d8f79ce51a9454784a494aa5e37f0329bf92cd31acb7ab63b8cf3bee5b423b1576e3d6ef95caa632d928e9e4ff97d997cf5bc64aa55bc7883ad19df62c378c627bc7eaeccb65cd0935050acd3ba75f1f050acbfdbe3bd9feff129127a3940bc62c709baf5c50a654e047a900c62ff7fbce2d39b6e55569d7f1ace55843b3d9b7d5d96d95b1520de56d5c37f340d80faafb8418e6576eb76cfbae52e15d95c25819db613eb675abb76cc5b2f286dda80ed39cbaad2e97af0a26fcff2b1330faffc15726e091206ec02b13b42911049ae31850772ebbd8115c762ea14fa8e65d502f79c7ea96b730b75a632997b975c32eb76e584bf9f5bd5a772297e3a91eeb3a3bf3e9ee3a0b6f3d63636eb867fdbe2ea29e77b5ef26863ebd3ec039c2a5cce7fd62bb543bf5120ac52a8abd1281137ec817a7f1cc0395089cefeb6a40c0a544f04b285467657ec875360aefbaa5a1bcad5c268363cdad71d7dc70f31df0f2cbebe655dd27709d7da356defb5c9413764edd573d9d7960b5efbc66d3c9db58fac67194f75dbdc639efa4d73d6fbb3def7686b171dd9403f619e6aed49d4eb17dcb77cda6f300f27f29f38edd56fd62bb53364045ecedd8d83de4f2b57d63cdabceb8f68d9506deffa5d8cc3b87633d75c39ccda6d340dbb2bdeabe1179d5a93490fc5fb64e65814473ca024eb874bf576d18c7b308b16633acb0ef67dc62fb073d5720fb9a57671e18f7bebb2e8eea4ee1b84ef7ad9d6f6f8931ddfb6e695c4544e4b072aa9372aa0f050a4b0ec72d198cd53c4a81c252d6d9778639bcad32ff1b7be5d40be5d4db323b75a5fcda79c7eab8c50622b69bcf1d76c70ca5bcaa248088001e250116ffcbe7538e79d5b9dc2d87a96ea092404c40eb97596e88c8e1adc5a0881c8686e976e67d560e10136be81cc78050ddc23b6eb15277867975c6ce25f216560ec07a6abc478d5fa500277caafba6eaec0bc7b2e672a05e76018bbfec5d2b05e4fdff52c3fcd0a5ea792ba530f1eadceabe11955255fa9c14a314542995f79f95c25b9e61ce65cd37782765f63fc666b68646f6a777a7944a723e554625fad7bc3a2ba31eff7f8918bfba6f0ccaa81fffffda2ac753995f753c57a9d818e67a8efb169551d065eb6acdab4e6594dcff328e67ddddbe3128a3c2962d87dd296f6141255426cef9b48e4b656cdcd7d49879f3bb7b9cf36dea1727a6c7ccd6cef2c2dea47c306d0d6bb676963773aabce73535a6e0ecc26edc9a1a53f04d09955c9665a5521dcfb0abf906ef34e296dbeaec122a9155f4fb6e2572c7ff3b5f8994fbffe51decc2b12befd7b5ba5d775777b7ead44aa4d62f997c83771ade9a637bd74392794c120510c987d5f6a9cf6cc924cbc2eeecca88ede672d42e6d0dcb3c7c369bfd79ed9e08791220e9098d986e7245b73fa7712c5ff5987e4eb91ce669439b940f76f73ad7ddeba6c2efd5ea7612fcff6b1f7422c6752d3794c62f1d7fa3bb85f935f16e8efbda37ce830561ae18cb7833ef7d0e468c61435890cf9bcb7556acd5855d3ec4f8e574d917f6eb2d8cc56b3962fcbe7373dc37c731207fa3fb75f7e18605e1d86df9dcb1bb9ad8b3f0e68b636797ffe23e40995bb11d8eeb6097eaca7eeda6bb620de3784fe6d9bd17f7b5bc2add1c70f7567a1778e7ce2f96afda771e32c33f52ef1f9987e11f89f78fbcb31b20e0ddd8117ccb7ccb776a6a6a6a6a6a6a69696969696969696969686868686868686868684c2693c96432994ce6d9d9d9d9d9d9d9d9d99919d38c69c634639a31cd98664c33a619d38ce9e6e6e6e6e6e6e6e6e6d6d6d6d6d6d6d6d6d6d6c6c6c6c6c6c6c6c6c6c6b6b6b6b6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a6a69696969696969696969686868686868686868686c66432994c2693c9649e9d9d9d9d9d9d9d999999999999999999999db9b9b9b9b9b9b9b9b9b9b5b5b5b5b5b5b5b5b5b5b1b1b1b1b1b1b1b1b1b1adadadadadadadadadada9a9a9a9a9a9a9a9a9a9a5a5a5a5a5a5a5a5a5a5a1a1a1a1a1a1a1a1a1a131994c2693c964329967676767676767676766676e6d6c6b6a6968cc33be77cf726cb5ea7d8764244d322f139c616e8563d93d84efdecd03b9fcd7369b5257e630a7bedbeececeafaeefee09e8070878f7bcdb13b4f3e37b7298e3dbbd9572981bc64efe62db98af2d8e535dbb568fc32e15beab83f4412c0cf9ed0409ffc80848084e1efdfd479fbdef3d95f90cbb6433bc61d7eacad2eeb65d5bfb46ec71de3ff2c1ff231d0d997364f68ce7e715fbfc47522993efbbad8171eca4835bf0ff482f6e9073e4347a6cc4a175e3411d8ce23ccc910aacdaa6b3a03596f1fe910890079a4d2e33d15a3d460e928cb4d872b90cd3501bfeef00ffdad4020315b3898887d8b9cb23ae316c3514e156a91e3a70201c147406026ef8ebe3dbd390210f03de9d5d1ddd5cd9926cec53050a626113244480f0c041834f1aeccbab8b01d7965616d6a72bab2a2ae5272408456ebecbcb78be6665e972b94c5bc3f6397efb1cbf818ad6fe5b9e68c7f5ba9fd7eb6e36b78cddcfe7b5379b6e676a6a4cb92322e277c8931b6d639e3dbbccaf2faf62db9867d843d87f2aec56e7a7ccaf33cca532ff6b639e09b63cd1c59bfa6248c3ff379b5acfd82bec6a4369babc7c760f593abbe7b5cf51150a12bb6f7457a59bcb3056b75ce633cc75f3ddb0cce729ec924d61f74160e529169ea3581482dc4c6ac1e8b111852309b037c7190dc5e1a3a1001e308aa1a06b6e8055e8f9822201050685a46e309ec0e324d42547de73020914bf0c721f069db0fad100e575449d602bf406e3b1434e447575720372a98a09383b1e4188d1d833f1037140950670064c48731892e1f261c144d99fe3943112a61299120c76e994d6944063208a9a3314da4a304ec5308ce3d454a243133a3cad17964a406801a788e2802709488607ac6c6adb23f1c50ed08a0a35f048b4883a0415038e0e89bf388cd49a3ef890e03a74d7e05287108a865a483118c38042d10adb5a89072f5724314306b44d4aac8857c0c22219210d456523a7a90cc76bb64fda1a03888a7c59268c462ce47884cbca09f6ca9c349e65df0655a198d154640930a07303c21232914e09b56b8610d444223a60608162b62491faa429e69cd4259139c06383a4994c889ef4e4d210150181f8d80472a6d1892a883aa25643c43025203ea39c649b565c11c3e21cce281be2e170929e0a486898b83a1c53069008c50de63006d590a3c7beb24367e01787c6381a879aee84943d4f77b08ba23a0db20a2012364b1c4f7d885364b08b4cf8811c562a3643123b80fea81cc05ef9f941d1c7bccd821058619af9249da36048b168ce8f2233960e1cc159516b9ec38ef063e9d16a3ef0a8ab07211317fd0e074251b28052fd48a02d0ed6cc72fa1b448c94ec4cd1d70699c9f970f8a643f5d5e8259e07e437194830d2741645f601b389b183520c393a86c0913a4b7664324fb210239102475cf264066bab469f116798697f14f1101a6163cb974e383a188ee090a3ec6cce6a70c4032711cabc1fe5f5518f85a4ed5074f52226e1ea0c14e795856664370446ddf5efba7526cce223081471a1213dde58b1dcc4554cdc8d804005172b46a7b40c58b123be63d0a46038e4304e0edae1288c8931988f5403139a362078c910443e36a540018fc80008881315086c01ca171a997c031ed0c08a1919661058e75cad439c586072103a649d3e89c286ce8f9195d960b029a43f783b413d60c4d485ed5da3e6cdc1f82548db9a396f6196c2333610a878279c39b176004ecd7012549b10714bc1100043188228ce9886600c03117f500a1b343314918811b2ad450d0322b03c4a23635332250285219dd7614017a127c2ca9d42f73888c00de49c516db4bbe342d18012bc69467267445a78f0443db8725d02393af651710d94a12a4ac960a52a00b5c526310278a81e012b12f564975735acaa319a1a0b60079e2a12461dc229c42aaa1b055f919a406044ed31e28a87465e31a89b920d2a0f32d8a18e7d316148809d8ba9a54d3e168920d236351305e4084c954cd31a223e157aa6b8312584e166cb153808a60eeadcc174e3001c770406808713899b77d9e257679912f11518582429ad69c4fbf2d4e973762bae25059ba7ee465d4b48cca5406b08d65a2a3d3a4cc3041a6cb37756806658125bbb3639a67649ac6a44aa27d020073a394f52255812f1845099d2eb0d1d86545a9491365100de194212472a80e9846d51a225513951210ebe3e197a3b519ec5101016ff247ab6373dd6b984250dc156d3ac1bbb01e2cec6f1a826e68289c40d82d29660c64e8498d319a824b543161d7c4041c5405ff4392e5f4cb002055c3238c3082025a8970084776db80cf044e40790618167a427962c438f9a58263c4fd048a255c8487ee65d55640b85f9f00c01284f100b11218a104f064049f442e526c42c40900ccae74e08b910051aad03066daa423b8b846d5ab8b0858d5347b2c229680a45c005cae351c85a984658f86dae7434f42c880000712da202fc0082078a3c30737c4a80d8cc461e70f4cc4054e0fb60290a44a22d1aee4399211902d11cf2f18106599d170b06687c18fce0c043a33d51011fc88a78e072c580ad0484131e54303df079c842d2088d55e3850e833a4ce990d8a1ae4c07056a1cf27048c221e6e066c841ea11a11c1a84400211b68b8466839a06d36430c3a06687a7411c831fa80623b8f104a796478160a46b9bb642d5054130822e001ff5816a2111dcc067121616bc4482ce437db4e04c944038afe84989b0e38c09a7092786ea0c2d6e7b119c545f0a14aeb97e05fab1848de6c1220d6ce217d81104c64da13145d29612380501b08e17a0114017300df037b051dcb0e37103d4ba81c207e416018224fe2afd91f993f1fc13fc6b00c48f91df162cbf147e7b7e7d83fa1c11f421c2f5d1b57d09f8f0f021e183f9da2af145c9ee8be9c6b117c70bbbe43a84c1de8f3de95e99864c1ad05469607ca2c1c39c0608703240caf025438b0c1b18284873a20d9241cf50d7b30242af841e9ede5e5e9f6c1e939d2723ca835b924700031d0c453054096140c3f384f788a7230bef8927b6e88ed21d99bb1850774eb53b8dc36e919d16bb453b0d767582eaa2d41dd6cdd521a0bb438784ce4ac74607d5f8d46fde701f785848a9e4cc2d592c62127106c60db90e72102e407a481fe8e53c99aff28dcff88b7f7de8ffbddc9bbdfee4ff2f78059fe011fc813750e0a79ec00f78012ff5510ff5c8ff87aa420d4215808a427e426a424a81fb472e4136dae9d2e565bbb90cb580c23fd40128a84d97ec48a1a19dc17117f1e4adccdf170bd76954a7cfff439375c27c9d227518ffff9a9debbc75a21eea38ff5f4c37c774732cacce599d30d88a7d63a9d61c76df96736922d71a2be5f234ee9b0abbafbbe5399157f5a6c6b28c6d377f3587e3576c0abb646515b41cebbedda7e7981aa6f9ecc2ee54773ec7d8111a76f5ce7243ddcc724331bc3333332c0832333333332c8830fdc6bc8da59a0a6f995fb7b473a803138563d026544bb98868ace1b9bbafdef2be6afeba55448de777d788e25f0ce6ef1391c3614f7957a5cfee2ea72faf1a00162791810171a8dfe565f66d398cddefb5bb767aff23a1fe1f8944fe23ffd3ff67fa7f4cff7fc9d2a7ad61dbb066cb3138869305aae55843a71825e1b0b567cca5d9f2ecbd62e719deae6cc5c2fcbaad5c0a73ec08de35bf6667440ecf2e8c7d53e5f59b1d0fd56f66a89e6137be6a2aec72f87fe81b0c6fe2a0500def4aff4fe9ff27e905f23da31bc72d7b7043a1cbcbeabcaf65d9b9cbdc9dba33cc5b57cf1d0ba8fb0c732b95775d9df755bfefdcff2bfa7fa966f3ff1385f9b76a03f66dcc33c158e61ee0b82f80236c163d90f7c23410f0c826edb1718d9c9a284b33ad2c06fa1ad595004c1474064395ac48569db1200f0e9162c9162971e0fbabee012b92668598350260e4c109244302cb1e4b5b1ae6ac9dbd525602070ed17a8891c064f5d624440d485132de021540243628d394346b6128aec310388c1d0755a05c341eb710bd1de90482cc84a601a4f8a68c82e4acba74ea6bf5c4788a12ae29014c90e2933a3ae5f96b7ae20c1231ad98f1049972b9884ec282c3c754054a64e838695080bb6af313033127d6192ca42a8052004c9bcc946700428cd027ca4280728323d12d0cc43e60b521422a583160d19f5a1c29c2ab2f54ec340152e3e2b481e9212eac392aa311e43cce35625e80f2a854e85308480ce4bca59073b38a3efda34776dab4e1c29233a34ebfac71c48374a001e50d0909a59b492d183d1a89b44890203867a73e365d24c0de1c67b4ae2851c84d60968566ac4743013c600c2314068aca89c7182f0a54cd0db00a3d5ffcd808712185f229030c2f0a0c0a49dd6044e104131e017fb85d822c27a12e39b29e4f5fa08e5256160dc14305c52f83dc074140f6214851656098c87af9d100e57540dd883ab0656448021e36b20abdc178ac902543a604ed95c003254f555727372097a870a942802b890faa47555f3b1e4188d1d8ebb0a5e4d20b8191169816e2802a0de00a0412f4970692178c405b55390cc970f9b0c0c5b7876d52863a8714c1fe1ca78c913051c0129bf4f5070c0f85ad04835d3a2535309460c20c9d4001c86965208a9a3314dade3d9c34971fd3bdbae4540cc338ce4c90a898718d65195dd7b69ad0e169bdb0c46768eb8c22882887c458b5805344714008255c30c4e181f588510049c3035636b569d89269c0052889631e09c065076845851a77916c5cb99f1a9f0e39b88a3a0415036e8e8d0335be32e0f9c4a82f1987915ad3c79e3c05e0ac08900512e300d7a1bb06973a8490802d53f128ac9213aaab16520cc6309c68418146754ce0252f4e946c6b251ebc9c4d104e035990690732982103da260506c0d1635ad8d60d2830ac021616c90867b491e4762610c312217bca464e53198ef19d0fdb5df0b22801d795b6c600a2e29e8c0a7114a0b02240b6c462346221c7239c85c10b716e9202c400409560afcc49a31927bb4ffc8a604efba36b50158a192d858e233f90ec09f223e0218b019d1b1096907488a4f4254124bf795425d4ae194250ab5e08e52e2f61838d5e3a60608162b664fe30a64b53993d10d0b29e34c59c93b830eaf12a8f42ac149da11ae0b141d24c26b92617328d259260a0bef4e4d21015f900e4120d2a750c110e225a4d20671a9da032e599a445a3078de6135551ab21629812226cf915195cf180b1058b72926d5a71b5f0e14a0f4873e82c1ed18a7338a36c480736586189649af009127588bc6fc9446b657e5d32d1a08a2e544c2c6c1a57d06950dd5d2b9fddf6e555399ecaf134e688899b8f0ac73261dc37c77d2d8c8df1e6b80fd693792bfb2172bc3876f6c57d2d1fb3a3d8ee66af6f1b5b5ba4892ef90565de45c540002a062996506edd70b319c7b054e67f33a7cadbb9abd7778e733ccef1e6b82fcb355cf91cf8f7ca82af2cc8adbb0f96b174899b4fc6d2c12e9f1c5703a9f0fbba7360cb399dbcab8187b1b56de7e6b82f76d661e3b9d83977b7f3d8ce8d6a01f4df09cbd86854072aab0a7854554e9eaaea0b59f55433a848fc3f57743b8f763ea28e4a09f57f48954c72f67c522d68f4dcb0dd540aae540aa073940ca912c018104695404aea943626369b57a97f2bd5012d2db7fb87daff50d03f447540eba3085019e864cfe9cbfbf33a9d79a72a106880d95315f8314555e0ec7bdc5b367ab5ee79d9351cbf516c3cd6f5d6dc508eb586798fab522d63e30e7ad93b76def2be5e37050ad738aeea69ac5b98f3361b7db1d32b369eb9d5a51ae0b8b4f048305a540364aa01d5ffef6a540314fc1c95801202f62c742e5f15a9a430fdbf4ee45b438da09242432555a5929af1dfad5858c3c1692b166e369b545189a2e2263c559493b7c3a38a7a97ad1bb5a38a1a8b5aa382aa4205d5fbde77d761399f5e37af36ef5a3996724038861367aa7743f558a83e8eea979c2aef6a5da2f393130913defebffd877a22e13c8531bbeeb95bdd59c05c221faf4c34f8ca4457602f21ebdd10797a25a22eaf4464e2958842bc1251da2b112978e5a147af3c94e79587acbcf250e22b0f71e8f4a89b9d607c27e73fa73e4f4ef3676757eace7dbf9cd3db73939ddf54dda409c6531388d74d4d66efbba59afe7573de9986fc7fa6aa6ece5b99490a931ca9db7714d38b49ea929dd7cdf93973aaf29212dd7c5eaa5e4ae364094d3c3f97afb444e375f7ccdb27e7534b205e37b332c78eb014f6af9b950a5ddd6aafc4f8af9bcf4a10be752965a15482925c961b3e9f7cde93f2fc4fba4e7ad34d991bca31e2733a8d27bd2437bad99f9276e866574a0afbff489474531909468ff4a79bf37e7e7825a44690b2405afcd7cd2a4869ef5ef72339af63389edb4de70892a3408b50e40cf016fa0f87fe5f400c0d563e58523ae0f0ffc83b8f30e0f1829866d3ff4775b8024611c0ead3a4ff977282e4c95f1598c70b393ef831c62012e6ffa32a0d10e28a631a2003fc3f720623303159c05b94ff47da8932d380a831c2cfff43eddd5d303463c28c4bff1f7575438e231f3fc2d0f9ff0141786042da697a92fb7fa842957094e0e48310dbff0b10022500a4da46042032a923ebffab0d20e7ffb35c83ccff6097afb75cafff6d580fe67b1d76f9b2563d0ecb583ac4b8afbb55272c63e9e644de17bbf306d4eb9de305cef1cb395eb5efbc3f9923c67f54d89de34199ff256efe5e5dd909bb7c86d2f8a5eb6ed5d9996882b13371f3f1c3bb56de881cb0dd512e4a4577fe0f5da79591a2e4ff43f9b9b03b7deb60aadb97ad8565df3aba5fdd37e29cb45767d98d6a786bb8ddd1ea8cc54ec510e337bb613db023ff47905168d6829c98a16adbd9d28c6c8e63998cbbf20cb52c74e59f808b571642f0cf80d01cf7ebe655180ba54139a846f3f9ecf3d30b04bc1b7cde619803f473063e9fcd4153827608e2cf15dd6e966896684640196856060a1108ee1f2a4fedcfabf413c90f0b9db8ad70ec32fac9d34da82a510ae018114a037fa3eefbee29ecfe4361d8f3b66bef00e7e26d678de78eade393870f99ff5f2e5dc3aec7b4a1d49d9147f84cfff750d24d2aec8eb5bc3bd873f8ff8183ad5e5fde9eb79da13496e53b43bf3ba78c107936e9b9f658e68af1acfbec46b56e799e3c3c6afead873c6eb1fd6fcbd88d07fabd0d8a8966669686c63c332b5b928d21d15e81d24e23a51d145015a028fcb7728cd8fbfeabcefbcf8aed8652dea6d603ffa1c4da4dd7a6c6fba66b371d5418a63a6c75c2feeb2080d22164e7ff7b0c8f61e990a163a57db93bd554186967029404e59c4d5011a020fc433df8877200d5400e7466b961e7ae720e843fd35060ff2f25674c7fb94e9343e375331abf51dde71798212dcea72e2f9f327f2e5b3e42eb7886e32e42c7f33fd4179497146390ff0ff1ca38ba55c2e97a251cab57c24940e0011c13ffcfcb7a60dca78403e1ffdf3d6fbc7fa80580ff500afea1124021803a006540e9e64bb4696b53a6cbcbf8cc7ac8db4cfdbf46521588426241fd2bf8ffc2579219fb9f5f171bb500c72e97af355eb0c9f21fbf819b4dcb44ebd4788fcb7f6cbcfe31cdb2f38eedf3b5f709af8bad53ae71b246c77fe7ee1cdbcdf11bb89c0ba131a213fa41f38e9df7b59537a2a17447975859f7b9bbefeb5a35ec6af99ac8f5188c95b78c9d83e3b7f75183e0ffe8fd4311404a9563acd2b04833bf9e77589abcb4b5345aff8068064093e75f373fe8972244b3e3ffc5b2dc300c0df4fff5bcb5ce7243bdadbc2aedcf269ab53365ce58317166879ef7cc5f6e7726c499c133ce3319ceb4fd8f69b130ddc7e257536158cf50bae7de6c369bd643eb213773c60c1533416c983161668419a99941337c7566dc0a75f3ddcfeeea31dde4d329d763bad937f539a69b7a4c3775f383be53967929c7ff975f49c60d992e641ae79de586583206c6341a13658c9287420f3514eaa797621428f4ae6f7479d41864d096b11b004aff48a87fe42449ff3ff550269091a69090fe918ff09c822d3794c67b2d6f6157da3960db0206d2f1bd812d9fb72bcffbca01db99cf3dde9b3bd6aee588710bdf8531f01fcbdcc39e5f6e67d70137b70ba4c22e2098333d305eff3f6ffd6e2cec266ebea53b77aeef1a703836dc5b4f5fde633b6b3ccf319d5eba5ac6ea9953b3dbda65cdb171564f2f03633b2dc722b6556f7dc56a985fe3a66177650d2366f5bc75dc75dccafc9023c6797ad9f2672c73c52797b152de6117aae12d1d8b65ae4821fbbe9bcb14a67aba811fe09d07dd3797e7d48077ceb93b400cfa8e4e3b0305f9f412e6d7584b09e0e288cbfab5d3cb58f76968d9999a1bf3acec7db157a8e63c502fb1f1e19e6ad89572f9daa731bcc702bb0b85eaad3bef58a8bc5bb753e1f8dd1a0ad57d3a8d79bb656e8da5babb744ba836a1755c9c1e6b9b7a2cf0cdea5603af9b0f4e73adb526a1b5e6af7bb5c6d2188642a15aefb9cfd8584fe3a5eeb30b639d57245d69b29c3041375bf739d6a75cd61c8efbea0cfb760672400d7d2d6fe3ba402b7760c1b9b8cfb06fc3be9d7e9dafe5757d77b13376f696f33e29bf0672ebee93f26b9501aaf8f87fdf5db774776cb8ad89ee74c6c6d1ad1163d8502fe5fd4a79abb3b3cc1de0b5a9f5eea04d2d3050b7834bd8dd550c7ad9a37bdeeddc6517cbdb370ee3d3cbdec212f472a9e1d8ad427b3c85e718d653578b8569dedf8da79750261a160ad5f36eb1b253f7fd42a1cbb9c7afe6d1c4198ea550e85818b4dab9cce7aa74e6536b77e15d95f2cea930a76e991ff2d77da5647395eabeba2fa5ee75ee8d4fe32dc6e530ad379f5e42e39c6fbd3abb88d6cde1b86fe934269bb1b18ea97a8ee1c4984e2fc96057efc1f8ef9dc2ae8ee138aa977aa9c7f2f4120a0dd4cb96f7cea5627dc2755bc374d7cb7edd7c6333f6fa6eb10ebb6132afc2ae7edf5d25d44bbdb4d3c34e31fcbffb4a223f5a3e425ba8f65de51ddbf78f74f4ffc8254c6ea8586462650265d281c91f130b4cdc1ab3fc35d66211c2cab45804adc722e8e635d6631174981eebba90b7b19489d5124daf9b6261f3d6d7589e61fe9467d86d2e595cbeef9c1289e392bcc4255df02693b992434afafcbf4edc56256a943cf97f1da775f3cea9e40b2a2a4996ff5ff228ac2cc2254989ff36498866b3d92ceb48185f3705911c22411e89d47c9255fbae921d91d27170bae5ef6e3613cdaa7de7194a79d550caab75330819040c620a220a02040807203e0c48f0530fa6ccfefff94a239afe3b2c63a3cffe7cdffd34e2a0e58ad9f77add867dcfcfb87dbeaf6bf87ccebc774eddd7e775f3ea73e61d0d84b4bbd621617473c85be7d8deddaa94cfd658ba8c62abb34b2d2b6bf6eb3c57f57cd5165a2e630fdd0ef3296ff54682fd6b1242a4cbcbebb6be2f96ba91020060471984c9bf5858ebee3fcef1963d9ef5d575f57bb56e8e08855eadd8e8cca96371a05e6ae8d59d3b775ff7bd76ace6885d43a1506d41ac82b620f3718ea72968b1abcba7cf300da7afeefc9cf96b41eceace61d2774b9f705acffc95633c5d56a6b91cc354776cee58190a85ea6536aac7c4aeeeac63384cb75cd1ed64d9172b93cd702c43a17aeb0ec75777d67bcf5128e7d327140ad5b2cbabb183ab3beb776367d93d74a0f98cbd5a6329143aa7ec2149e64b3332b21e833d98cbce65cdafb1b46bd8d5723c4bf9e10e94f2c3a7e1e688cde67373c29607f6d87937c77dd39707c64e4e85f9eb5609a72f0f9463bcce03e7b8afeb71aabc7920a76ec0c4dd6197cf6e1998b8f9b2899b4f2f6fd9fdfae6fa0edf5d7df7e1dcb50e457e1c6b7775ab1d8ee3c03876de256ebe652c7345b12cbcf5d40d9b771cedd76dd5d040bd74f5ccb92bcf305f56a59bbbd618d6bc63ddc4cda7979dbbee0b859271f02374ea25a26ee1cd0d79558e773c2ff9d2d563bd9d3577e78da8374724cb7243e99c5e76399ebe56dd6797c20ccf3db652b0d3d333ef5a5b63f97add563da7977a1a6b0733ef0ec43a77e1f8dab9aca5ae358663296fe16d95f9ac61b7ebec3b75f59253e18db8141b7bc37493eb65d2465b03282ae58b6fd0b94beddc4ddcbaf98faca3ac31458312a7f1e7ffb3dc90c3b15d9f8b5b6c600b98e51ada2cd7d0ba2d36306eb18180346c2cb3dcf0d937c7c62db62fa14f32e50c2edde4d578d62f404627a50c183212ff976ed763558dc8fbf4124623900635c8e0fbff961aefc5c834e777678d653c6e8debe68ee5036cf5607757ab5437af6f0c7b71ece45257feeb1b03e77888f15e0cacff2593cfefbba5309eecaa7ea35be6d7baab92168552793491b030414500815bde1099a8357dae983891e3edc12517483c3a69f8cc7bdc62fb93cf31fcb41e92295d445fcbf13486758b21835c24d07164cd668b42afc9de5abc8183f7b5eb7fa41964997f24997fe4987f2400fbda9b4d2aec4ab73c2b598c6111c6822623fb478a598129760666e9027bbf6eabde86d278afcf01f6f68df33a6fe3ba96c382ad5ddd9eb75db5efbcc0de7bef52f71a3b7bd4caf9f466ea69ac373f74f7faeafe5a2ec773e0ff43bd520504155a85d4bf6eea78d6d21455fe3fc50eed8704a3a54cf121c59b580fd354d81d7b5f2c060839fe915f14176d8851b151bdc37860fb7217afd543810945977ff944a5875d2da89bd478cfd960838006141e8eaff11c43454d453538539e9d9d2560738701d3409462a2787186f9a11ccbb2d28414a7126d2516951854820f89bc1202bcf590ff3f8a5796787bbbbb0d87dab06fa73bc31bde718bed521290b68c9d8b5b6c20dfe01d1122ffc821ff48211dbbc3fec12bffa7af54acc20d9fef96c6396c289a9d19be32aba5cc44b6fd65cb3bd6ca673d6b3cc3bbfaf77c4a4d2913c96c440e0b9862c2c0d8185c1c9c164b6cddb079caf79a80b2df3ce57b5a6b6d80844e6cdd27a7b6fc6928ddf2bcd73580c10f40f002fac0bd5578b66f1c8d1350019bf8ffbc8de12616281fca19aaec7266981f1ec62db6bf359b661d2bc74e0c7c83718b0dec18f458e09b1ce3bdefaeab6b360d349b9db74f98b7ad5b7dbad7fdbcf66673faf21e27f376f3bccedb988fb7b1f5eace6f9c61a2b88ae8eeeb58c7be52d8bdba33741aeb31e8c6ced20d9d33f0c6e7f8508f1998ddbfb1562fae4f8fe5bdb57a330f6cdde7cc7b9c336e508f698873bec93c2e6e4d8d69e0baf960d7fae4d60d23c6ee73ee71712634130dab49bc31d104671ec8b9eca493e3e9b3cbf1f4d9eab9c96aa0ffff2a992ae3ee5b5aad56c3febf4a7d9ce3436a23cc5b6ae2ff2fa97f543dcd236d369d696b58ab1c4f1b7f9a37f758aaa79a43e25d9ec3685dde16cf5c7f8ba9edb26ca15a8e35b5af35fb5ff2393ee41a946d52297dfc8f3a75bceda48d5bcae15faaffffa389aa44a389bfccca3397edf4d2196d5bf62c37a4c2d1a95de57fd967deb9a2bb5f2e47353cb7abffbfe4d12d2785f7d4afa94535b4cbff4313ffffb79443a153ff723c7db755cbf1930cec1a3e61dce978d6cfbc5ff60970084a8a6e6f39a7ca5b19e24e8845bdecbce5b2db6797579d21fe0a31f52997f558e1e317fef883e3c32cd75098c7adba70eab7bcaf20ba2c412c2eedf4dab071ceb73d6fbb6eddf2fe7b77347e31b46e961bb62ee7327573eabe3ea9b0fb4ab3522ecf3d96f6583af77c3eb332b66f2ecfcf56de885c7edacd3d96ee67e7596ef89479765fe30ce8313d36d67258d01af3359b4ec418eee0d86148070c1c3671d8e382039303921011a10fc2286182414cffbf5c4267de9fb28663a836dc73b3d9ba76d030acb585f7992613ebef86ce3cd00f1aa6a16267617ef1e632d7547857a5f246dc9ad3e925a7ead97df23d7577f593c3715f21b48d5d99ff359bd00fd9e8ded531de77f53a95f9d5303e84ddc12ed4c34d1d843137f837f3aee3b941adff5f32d17408cdd4f0aeceb3160c14cf5ab011763795cb8250780b9a4d5fee6cf49bca5fdef21e27b67686d563cda6941f369beddc9fd7de5b98b7eea1dbc639df3a3f7467984b61f739f7fd6667572c508f0d865161b7da77defbee3a2aec3a3f900c1c736bdc0319b1d440e82fe702a7b4ee6ef685fd00f32cf7bc5b40c61806acfe528e35d30968f6887cba01d30627595e9db5052e7344bda1fa1b7143d82f5f2efd83f45a751ccfcebf46cd9d7fd75f76312ec7d6b009f0fbeeba3faddf88ee3c755b3de7c76699dd88593dd63762dc171797b8ad7d44fae2be32be407c347e59a75b787bd05c0ef35b5e5da93bcbfb1ab7bc3a7379f3970abb5d6fb2addd965bad7b6e1a2269f0c3f64a0d4c346cc8b02983960c7086bd0c7a09d5644b98bf64891e3cc07eefbbeb7405ed4157d081617e50281f74acefa9abc7e4d8851afa41751fe3dd45d44be81994bb7a7eb1fcdd872e76c4728f3d3934fbbe1b1684659e97288f471e619e030c026068c4b08767094f115e103c3f3ce55d987f4d41eb0a9af74d378df9d47d759f5d2dc7d33dc6e733ac18542c5057d081d4f80df38386e959e655a9bc79d7cfbea17ac6c6596e8d03a16e0c7777d6d34de89347b3db0ad564cb96bf2f97c272acbb148ebb0b95e359baf13ab463dfab1e83f2bee9a0baf9b73cd3647a1a4f5da93b77776f40bb4b7677947601d809b1cb50b7e9b16e8cb2ee4a1d8aba5d6780ee119d11ba0c745b73687e09c7cd404db66c3797f5996efa95e969b22587fdb2b39b388d25e877c7d7581e8306266ebeeb754b973a10aab9ccab887a6c4caecebdefabe6b09f265bca64f1acaf829a6c09150b0cf3836ab2ecec26d6e9070faa7d57df774ba19a6c2916a6b3f3d5ca358f66379f5ef2b88aa8c5c274efdc95e3f929f3ea1cd5ed1b573b97ab3354932de1380bcfe9a5dbddf9c55ac9e0588f516177eb974be15d5795e3376e759d30af22c6cd256e3e3df626e583ef3e8ce5eb75cf69fd2cddf194cb33ccbbaba9f14bc6e53f394b72579e73791acf4f6b2c4fe5f2bee51720fd47797bc1c9520cc6b2e588bb3a572fb4cdb06bbda015976729d6c6735ce38eab66df173b85ea41e3e466dee7e274cbe120fd126e0cdcf5ff97bdc7af9eb1b186a9b03b66773763a33dae22c2edfd2f612c5cd45b956b76d66d6bc552e5ad97702ce5bdcbee1be3f24dee97629df3e9dbd4ffb23abb16c8fc7f3c87e936d0c2556eb91ccf9dcbb31ba6afdd1a075ad0fa775b2e4bf51814aab3518de85436e52c5b3eefc3964b61b7eb66236299b279fd5f42f112371f57e45c9e36e5c8b87ca56b6af1a81ba477abf2bfbb2bcf9dcb3a3bbb6ed5ff2534ae7de33cbf19c6c67583ed1b57ddda7ec9b17cb00d12b68ddbaa747ea8e7da0ea13d71f34175cb7bcbad1beee35c9e3e11392ce583eddc79fbff135ec9a6826d6c4dcfda8ab50f6b15d618fcff8657aa05a0d6d518a4a5f9ff57a6b178ac3c87e92be7869acff09637964a85ddea2c16b6a57aacefaa86797fdffd845dabcc67deea78d673ba49b684b97b75a55c9e3b6fa19a6cb95c4a67aec7fa589779745fb97cd51cb66a6c9c1d730df58e9d5ae6513d2606e558798686e92ec77a4c8fe92cbce7bdfb93bfd1fdd45a7667386d431a155aa1ff3bfd6009ddf3e1d63dbb11df9ddd889a0acfbbebad61770ecd065a1c5311330dd30993c6520c96b155a99ebe6ed4ed3dbe22c6ef0bbb87bbaae7187e35270cd3b0ee66677ac646e7bef9d4d59cf343772336a17135a1d5a8e46ee94864450b3a86201a9119010000a0006312403040281a0ec7e331c17c5d6e0a1400025fd4f044852e92265910a320838831c610030001c0100080119aa11a001d5287541dac9a8cab920bc7c43facd0ea8e396790b922d0e267c7aff724dfec64f15d668fe9e6a335b23a7d4c5209e8c07787107f319593d309fc16cee9e1a3aab14fcd668b5d9ba9b4d18765de6267c49eeb343cbb5cd0d0f67ddcc7c6f72a8aa723b389a0b622e69aa259c3beb5334d52eb231757c278c4f8d51a35943e65df215028d330ee8334ed78ba6a56fbd2140fd1b3da5cca07a7de3659602115082cf1019be5083a8ef06622fd468156e3de773394e3bebc73c4feec943472a6c849662e885f2adbf4e44fc21fe7aefc1b209db7004efe7c88677637b5d4948e1a14d17b56231e27cbce5c9598fb844a4de3a52c344596f55b83a3842fd1ffae5502390baac60514e22a8c215fc6a79999dc653a3a139e581af25d694cc84e86314217592bc39957a9b164097da9f654a2212e1bd91da19c99227801eeee39abc67f577aadfa0a7c906cbf5c67ab537036afab7c86ed6a3e7071f72de93a36a0e382e7052ec01cb09615b6027f74456d3c40d1805ee4701a7adba08483760eb50231b7201e7267f2fb3064e74c3da540ff6b228a017f101989a9b896e730729540748f514fad53845a61bbdfb60862ac4b91e6f41eccc6e3e7dca770c2717c5abc0b1843802787e08f914918160b88fe93bc3d20b092255d08426e8b5c2e47c4fa8aa702b9dc2269ffab2e55b225641d8cd219d02172a09ca2e041111d78c007a779c0989d769c4c151cc0d54d2572d127dad5f4ddc36258521331ed495c75a4f5b5cbba18a505427ea735acfb82ab03ac22161e9a1f7c350f882253dac577826c03ffc0d865f3a9bfb68fb50ef98fde9b625c522481506b265c2a46511b7d28824aa49a51666841f4f9b643719f4efa0cb0a0b67176479b6002908897927ac3d18721dd2d19b6ee0100a76f9c43a09de6f1257d31b2819bfacaf97fb69107619601efc67932ff110060094a0cb415f4662035eeb9966fffa1913a42ea2775beed72bc7c2d538ede454bed0e1f9882f1a5cc2f1c3a9621e70e2a1fc62879cec13503462ba90788990b2e840f1094833d9a12971c4049d67617fa85788259594451c4850ea9436f4d8c730ad13be2e5bcea211df5824097baf1963f9e5e0c681a35c48a4a9cc13fe3936e63fd0b22f0423df52cf641f7f7071ef0a26a245e1dd1c5791da88a60776b7106dbb1fc541dcb2c43bef0fb08e275735435eb7f1c49e752a5a807eb6c9924e4e59c0c6886dfdb9d64ae7628f2aaac0f9ee3fcaaf0c12742fb61f0aff0f8ce0dbe2af82f6a5044e8ffbab5ded6874ebbff48c1a7fd1568e497b4118cac5d48740f9b38929bef8ffc2b200e01b68a2c33002b43e33a31e33beda59ea3a4ec5e3be4cdcd889ec5c0cabe9493f6a4c2378c0962f3cff7cae7331b62ec669494be196ea371dcd328343d84905b4b3d22df3f3ecd87f65b30c3f29ffdd05bc656f1a889ab8e7b7755df207a623749c787dc1557f9f1268372cc30463ccfecfe1d13cb9adf80b995b7fcaf0a7aa077b167ea2e4468d00bf9d2efcdd5c24424001ef79893f2127c978b29e3a12a2df406793c3e51a6f9998a5ce48dac2b369f989204af5d06a4dfe029dbf6a01df46403e0b461136b687ecfbac31cffc2bfbf8783f992125df7fac085f4d90837c3fd9ee912b808f92f04fca80a35834e70b3b3af252053bbaccbb778105db01ac7efcdacc34ab9e5da2f810c97e3e9e880e241132c08e3b2c85e36bc9c059c9a4542da5fddc8d740277ca275dd0200060279433f5a909d8eeb9362527539eea58d10da9a740cbc6f88eb169ddc1bf8fe9bd2b5fe1aa1a7ea8a31bf1c9971c17336c3432252f057ddc2403ef6f1016b9573dfda5ffe8eb4f411fb3c507e2e8d244fd951dc3c19e7f3824e15f2e87f3b3b8a8a1e33f160de0e756607ee103955cdffc5ffb4bb85d9597524d95cded75df7556979615665e7750620e2de58b97d567c846aa81259723819563a0ff7421142c86289ed207a4f679e9e92289057e57d945ac10cbd4857fa79f15a645fc73e654e780a14f70b4b3a7fe38779d9e3ca4f0a9e4b23ca7d98a1f160f0662ec38ff1f1ac25ece65d1c938688ac6fbf2e3fe3bec10b3afb490e01a3a52136a60a723798595c6f22333c3c934d97f93d7cb38d39d08d4479f70f1d4d94e0fceaac2bd5b329d1aa4101928cb9ebe1859ce33bc1108ee1214998089833b2aea0424a046d3da5abcda04986a7273c030244c04c8f89672b8b658fcb03096ad993c3ad4f25bcec009f270507ff3235dc85926f9a3a605f71c8482e021f28db7fe295178f5cdeb16fdf62f20f26c494e9e38f8fc7009053f4d0769b71d89a76f5a84336c8773bea99d3b33e0dd46b8202e48e9954d1bd05e41d65cfd8b5777280d66936bebcdfc18de2d891be1f3d5e32e239fdbfa92addd8a5d3ac74067db5e8b47a27948d43d0be86b6ca075b81ba2e9f37bc3a2e93a19fbcd7a7d1df830ff5d1942ba723d15c919492689d06f7b3eb0c8db16cb4f7fbf16315251680bf260a9d97ab478054cbbd2203b75f36c4d340b98522aa8fcb0241ce86885517d1841717b1c19367eef2a2db9dffc537d518d760a0e38f4cedbe7af3a5ebc833ffe41678da0099d93d7c96687381f701c996e2760003eb9ffe77126317933db7f974d91b44817bf134d4ec8936849e9f43a262fcc7e5ad7fc3a21efb061eff177e8130b19c033bcc516603077255c37cf016c8672b6f19d9de14bcd0457ca65e0847c7fb8ff11e1411cd62388b7f9713c92e9babb3593622bd5b564756bfe9d7c57f3f2498853fa1dd3621e007db1e6f2eb1d545d94ade63cb00fb252c799abcf754f612d31a9ede551856bb4d0b396cd8dce9b3717d17fb7ea96d7e79d0a95d5d23d5c9b6d31ae1711c17bf04796dfc2f7dbdbbd1ab0cbe8c4a5b0ff4aa6fe7b31a4b866e0af77af4e987ebc995fd271f758dff807fff821853ce5c916b63abc4f59b021a63aaf3c7b18192a84a7c5396def728dfbc28dee458d4f744e894a97350035ca6466fdd07caafc69e9923746291e1e1ca38f22ab08ff8ea40507576524c90ff663a700d3a41def758de059c32f3448b228047619fad4f533a95e32e76f904fa0c72013dc2d626f68e08079be47cac66a300f6ed866385749707669b7d3f5d4eac3164a89edaac6eb8a2e0fa2ce53bcbac3460ac9333e43584bb77ed071cd0649461e96549a900bc158f83a14e90611c860f73d7346b63aef7e980cd9eaaaffad18bbaf25ccec879dba83fe4312d1b850844effed1680e3551c855b0e18cd37c899e28270a694372b42eda2f00c422c57ba9656ced25698c4056b5c95a2c7f84c8ba3ee6bdbb06df7ae88bc7327603fbdd606528ce2a551163329b94aa1ddff3885d18fd58257a49123a5c6268c690cc89572690796b3a14530c2af6403fb3562b3f800afc89b2c7f718a6e3659b54d746684d1013e12ebbf6ec2fd85f3b05cd68a296070f66ec82d7a58602f597798853fa2a57409c710949c69bd20b8894c96a6964260defc8d52fff6e7aafcc5d7f8d1e90fde2cdbf7fb956213f492ad446b53aa94ef480db55457c277ace98e89ac3ce14c5740f0559eb574ebcca2b05878f95d17de802891322ae8855ecc84ae8dbd4e32369d80518def75c20b9f212bf3cbcc10e37c7f393997632f4c911c29cd77613121b29b707393c14a59b7a47d98ccfe7c845da39c553e44db81a0efb38c04e05e0763b1dcb338ed1cf1baf3dc8e0f1665ad498e84723c1712e5e2eabd4067daac9bc15016751b5499378fdd3dd2e2022c09e0fb464770e7fa8bbf2e0c29d275ddd8234a2d740fe0f99413e4bddaa036080528f4e57784751d744034d10614fd0411e563d04b4b30b51a1c295f8ca2c93cd028c8e5e9235836952b90e9adedb8621ca2cd0a2063773043b9129130f0b8cdcdc42e8747de5462dd034883068ac833e7e1db6a282d909a6753d082bec345c2dd51962cd842439ceb8161abbab0398bc5bed913131ce213573e73c46c8dd928ee18fcb08f7c7e55343f8b0cc725a01fdfdd6a0b31d48698bebec9f0963c68efe7e8ba88bfa55f269aa25dcdbf1c63953faf42656f3ddc8e8595acdc58b604eebbab524d1e96febb3455371bad0d5f394f5a5847e4a1199e3a38eeb1525d80e58373c7faebce698dafe21c28189f80c48b649fbd09d3034c617bde99dcb2540125d1e70fb886d8ba24fc25da3173024dadcb2e89fcab3f65b52f7c74bded2fc26c9f9d7d534a7b8760727724aafc8a1ffc346f58761ea9dd1bebf24ecd4a4f677026fa2f5c2fd55f72f642d77b9206fd05b787534a2d21292863e3428f5a795f6e0069c30dd0206a6442495bbfed51d5b578983e780ffce00daa7443d2e6dbb9e479b9c451793f1ee57d69dd39a25ed5e5d424259ccce09068a3dfd9f709d70095e36d02f3eded919363bce2b9929f10c910608613ece31bf7db1a6359d8589b86800a0b1e788efca46ffafd3453c5a97429347acc18f647ff6f6cb5a28ba24d82873a0c841f13e3236eb87fd1093cf1b34613f57074126f2dbafa997569a0d0bd96d965feb39845855e37a1b8126ce66357ce1d7e6937ef27dcb4adbc496adb47906733dcbc4fce357f8bd746a5c03f0fe8decce0fba1cef96d68081bb9beb13e5bec57aa594898910cf740af08e7f0c8758b717aec5b6ba5a50f7c7e61db85ba06e508d0c870337e8b1240c3ef6dde1c38aaebeab4a6afc12815450f96f154089043b44d4de7cdcf18bdab89fd43613c3e51575c2b4fd608f1194fda4e6298d4cc78606d1e18a232f5221a4bfb14a0af70d4abfab87516c9a460ff24f4c9313249f78975fc68c46a34bf3540974d1055d23ebbc9be3ca1e1e45de970fa4f92c9ac15e2214af184f5ec0f2031c6ff07bf26da410fdc737a4f8e20dde4afe3171933ffc51fe409bcd3e89f49dfb64bb8391fd7f3daa62fbf1faba783e1e5a73ed54c1c2cc7703347d9c727fe8079647f607eabec688564c37f82ad7c7ce5cb620b8f65f0029848f0392028cb3da23f141be3e5d0a44c76ef5236b6788c60c2edcb5f6c185affdfbb3f37343e9241c3554d05a57f4eb1bb5bf66e6405d8bde9bf545d63c2ec5b765e89c22538249009796137d9beee7d5753dac230c691d36c8f65445b08c6bd0dc01a02a7e095d7c332a97c78a1c6e1ccda7107c615ff390bbaa3c583cd5bb46c73a2620f0c5dc8e507d94296f8de9ee6621a62f7ffb62333ae54f6ccf9395dabb2080edb20e6e7f94a41128158f3390d209c837c31af0a09471896bef67bd07e347933da5e820e307d3b5c488f444ba227062b50f717440fa7f1230580947e52df0a8661e62f4ab52f22dca68886be2105b1e22283d78929e176201bfb7f2d652b139215a00cd62295a946b6c2017d60c267f7ed0d7236ef73afb97ea7b74db8266f0033a104480391910e1c8712d7cc8bf2f323b1412874fe69893d95f46130e4e8af5893e3c7a222f7f54d8cfada1a616bcd92c524767efc6417b8edd383ee4d211a121b6972e170f46e145144ee79ac5704b8c48614a52501162967dd07c8b44281dc6ca762b1f362c5e7a5119bcae73366ff53355319dfccd73e9578639acecf2d667097f8060be8d50fef20e5ebb5e2b870220816a5ec14ab3fa00265668be25183d3c5cce2e3eaed1dbe9dfbfcc3c9f0175856c318007e2d3422d334179cfc1d26c343550d7e522677dc85e0ebd2f69ff47f6e1741c724198e75a72e2c41cf0ff72e2b027976cb3dd0baa4a5b009e2c9728394a3ad98b1169833cfc0291452a188155f7d44fe2ca2438f4ecb3191d5a0b62ab924d3278bb6c250f8f17657a7a02e757205ec2e0a19b3d09d15e6f120136cb7de5a04fcb4db27d00a1e8ae51ddc3ce6db453fbfad26ca245c79bf8771341266eb38645503f9ecd8aa08bdf9d10ab35ddf730bd98082ed8d292e7ab19d27d60eaac6fa2d9ef472407ef17fa36783c5b75fb97eb43565afa3c933c14b991ee8b10dc57384aea7b309561a9c2b0c395a13f49eabb32fe43b4f7a90f00ca5127197f4d6e699cc184b1d5122e36b2f18109080ae2333ef1c118613878edb3903fb4ec0eeaac395d61e2acd72bc9dfb34953db6cbd3c7c6dcd548fd2f1e5b46c6bfacae4ef3cc201abeefec4ceca834ae41ceff1e85b7ae0332f98c74ee8bb8db928a185ba54ae01f926188444582fca5c3f4e63160401587fa75d750bfbfb0d3457190811d4e684b396e6baf06a9c53c009ee3b6a1c0e1c563070cff2b68095ec58f768151ce4b1d6fa5679de74c0f0fc8fbfc780d4a5d742f0cb08c536a30afa5f5c0e3f03e2621fbc7a5f03c97bcdc76fb0477f79ca20338ef83a8ff23292823e24388a811f40e907dfc46ba0f8559e19c2cad786500ec4ec9300ac75eda3c7503e40be14bae7b023d189e625ae7cd5af163dd5407730dcfdff0f12527691b578a51885c6ad355bed7344cece05176e71bb21c0d76e3df989abfc68fefc007272bc595938881f3df7cb0c6268565cb245d76bfb0d0d47c2484991777e46518f2cfff5f1cefd810bbb3324dd6710b02b125872fae59dfa3dd4b9c4233394b00492d2557ae0da7c8b1a82abd8a9e207be6cbdd935af26b63ce1ebaf2fec6095ef58881afec44324d0ddaf981746e0cfc0ec243a061a102a41dfe9f5409b4e89b8016099a82a52674530be5be0c161d0438a350d97744d670468fec66a22e276ac2de82b5a030a5644223912c021e885160aecf908fc1d08e8f11f545dab9088cb747cda2bca9b52cb36537bcba52307283f0b92eafa9a3a3bca6f3c68014a0b4f0cbb7bab667086ebdac0faeae7f671cf4a79bbbc07832243ca6c35f0486a76144475228c9f1124b3d0dc5d6ce07f380098b637367eeb817bcb01f9f6a81e55fb7ff2a2fb100625208f4f2403cb9efe23d618af0afca2506f05c0adfc18a949d44b54fac1acd699b88b68c1a0188b4a2d1ff10820666efef5db044d0dcc2587c59c9205600b72be574cf53695cf388271d343ef053ac064a1d3fc604e015fbb6b88947d9f0ba40f5c991da8ff41eb32bd34c6e7452f8176d2dd900d1300df15c531c128af3e1c726bf0ba3b43110765912f9cbe24d49b3d9cc0ab0459e5fae904fd2b849854e443223a463acfc9f9f94e53441d061710be0bda15c90d63ab287e31f44e844bab7c26df4e7cc788a0650eff4c26f2b1b227e9bb06ff7015444809eb4a27d813f8b28b8ad2fc928713b7007f8e70219da565657eb0904ad63c945cfa41661ea33c18a7e1fad2b86f32a29ab28d00ecdac4ea7234779a73d2bb7863bb1cdedc1600e34bc0c6a122c91bda1f787d13bf697173d8e47725ab970426b3b633b93ffdb5833188d782e0f7400ea75e0013808ee2b717cb2f768fe46be16e78f073a68a98c362016858a93bf7ac9fcb0f98e215b3e2eb813efdc82978c1bd62a5ae04612e7127e389cfeca3bc23c83ff6e49dd4b6537c531cea9aae2efe9bedfbb4e54655aee63d93cb100d846b3e9e18fd28d13431e4b2a9b31854055b5f6ea69f222d2214765bcbe81662576f583236ad16ac3e1d3d34701233d84e0eca921f23de0b69949b4890e0681803cb2c64b676df9199b570048c47d0665b6f81ba345c0949aeb3de4cd6212390c3082346fa98dc5a983f1e248a3f25d2df8645451d784bc06403597eefac268b3eb721f3e6aff3b8a1a240f3d13be6de66445b7e7654074315ec3abb924273845f28e36ef005de90ca184e7ef44b2ed1073df361b25652a7eaba2a24abf342cba91dd6880524c150f31769d5cdca9a47e0d4469bfb0756038ccec6abab8c33468f47ac97623a7499c17bfdb004fd49823d806080cccc43ff122a495d6c5bf6a159fd986adbe9d519083a97acdcf4700416f7d2891d5f7b111acadeb86c884860d468302f3b6bc166a6aea81dc37f2de7dc54d9cd6a513bca06f66d6a26fd4d0fa94c0c7e56cbbaed12a7e10df8104634eea8955131b0b5a7a41aa0e046c592f6cebb021ab3fb0bf8bec136b35e036c18e3372d553de6fe1250d1923bc4ab5ed8b8d24038603315c35d3614a534db4526ac6c4e949365809c147392ca1de54f27c729d50971e784c2446552aba9564b70c9d2fb33a25428b74b79e1dcf634a7334e68430601ee9b4ba548b8e8139887fdb20261c33d559be7a715a89067f527240f36fbe5c9250c095d9d6a4ae084e4c70fac06acff6aac44cbd2d569104eec80837ec4a6c023fbbda0deee4dbcfa923d4dae7c40d0dcd4ad3885747dbe0d3a5630d9c3f248de11926bd4f09d4d8ba81afd4f78d7a0e18f867c2ba04bea89f036a106369936f9de48308226795445434d4a482f881c5319f1a21f888949071a8b7a29f8b1d4e30a9cc3ce3f08b1d1ad5349024d6f0fa8397ab9a05ba12519be9a4647db7f0d4969fd5e2b9c77c39a6936978fc3a663465bd6f02d4d7d44bd38f90f8c17bbf2f727d035d3aabcd2487d2b5444ab1f8045593211cc7c22a8eab5c1a140bd380b297cd4898a5448b9a2b07b33a9c741ea2ef43031f1ec784b7d555dd242b1c3a6f393cead45f2c5042aebd2f28a54dccad20321c20ea77ca88761f51d1bb0bfd5247b450ad671c73037e0640391318ada57e05ad9763bc5a361d8ed738599290f571d85edae9b80fa9e5e82d38f39d384677134a79cf5ff638ccc26da55991a0218aec7d8cde535d5a75ca5991ed885f7801e0628ec7290dc38ae294e7a0d64730e154fe09fcb9586a1aa8f314f5b21a32d9a88900772f52687649c038255625fe367901025453831493f063b188b9beef073f633b5ca6f4e2697260d5e786f136787af31db581d360e7826626b90b0ad7ff160264c7cdab5f938229c34126a681e3e067fd34f160a41290c88ec8c511def931d11af7b90eb1c76d5adc97ad24aab264bd0693880fac63544cdb7010a66eb52d1f30d15fb303569c87be50f99d6f947e57ed6739f32bf6874e894b128fbdddca6fbf6713c0aa2c7ac757de7accef4bda1ccd6de4b6fa4d00d1f56783133400fcadc3bd120f0ddd53d250df4eac2f8a27a54d346cab8af71a4f008703a5bf42900ccba38a37df680c8ad30b6cfcbbf83e3a4c2a5b4e72e3d103df604f2ff8ab68ad48dbf1352c19db80f1166cfcad186166f0ba96ee42af39703eac288d235a2ea285def7cd65b0ef5b41e791d48e27bbc721b8190cd1b2aa1588647d869db159b54674c907cc3a5e26d44cc50d7fa4fb886cd02b8fed8306ab7301c8c783025c2eb7b6533fd33eee54584320865764ebca925847533368c2f70e27979bbf416f59283c6cd00dcc919de8c7bc8161375e63d6b4b86db04b33ef7aa1c7f3a31a3e68bb600c2bacde06e8391d0b9df339f70c2cfae3d65e1da9623934adfb570546f84239bef893bca95608dca5aa49a05c971702b16b80eefb8105253e28231f19983ce38e01cd1c7b157255b3d9831cff0a70431861b0e5bd43fc537780e1be84343de7508143a106bd510437488a15fef8dd4a0fe0dee4531fd89ae391c75f6c8dc9934c02fbfcbb1d955e7e247266bc5bed69b4f20ef3b0e76bab4f3df88361dcbf93ed8ee996cabfd06c8d79e625f4690cf5f00820550346043ccf8b2dfe2712f23ba250124f65c3398ad49a3bad4add5ec6a08fb1fcd6a7b5cffd0809bc31b5693ca04cb61858e65cff0252164cb02b390683ac9690a2b3b029cb6ec22742ed011c62d89a1213bf524d6d886c5748c96ff291e5dc71e8e5b8a2eb791a76f34c6676e1767596bf16f54db83006add6e50df966e84749e64f7f2b88bb8b9529a7b16a1586cdd521afcad68f4e786f23a7cd4e01a01624c0ebec4a4e45ab44bb9de03926cb6f730231784a2d205f0a0967b4878de79d03ed25b344f34fa553f177f699ee5dcaa151c511d6d9382f1c7dc6757c390a4cdd9104d352293356a788f71ba4498f3093e2ba708dd985b8a805bec05cd1642b01bbc8bf68c067230625203c7d42c95c06b3152c998cea09ace75aa02b195cd0dd5f4b6b18f421c3b36cd96d19a5c0e72119f33f264132d998b8d9756d9616f65a46873e115da32e8600b6ae20b159e1d680f16236cad2710124391e8c1eefd301506d340fe1e69ffbc9f6df165f7d090932d1f72e6c4885157600c0194471f8cea07cbdfcee23181b6970f6bed60dd8b1dde7424c0730d53a4fe897b75313728f0e37a1f12310f5baff42130761fe2ab9df00411268fe3bf2e3f6fdf951e2c8c253a85e8b9699cf707e0ac624d9cde1ac62d6227823c3415718815f271813e20217abcf901504b7c967d2c5da70c1e95c8a82aaa48cf204e1f576a91823fd10ba67d7119d009070bacfb2a84846db7741b725897c76bf09084b300ec5d18f3bbd158dfdfd21c7f0d1841d297888b7139072fa3845360580ccfa56a255f87b5961ef720e45bfbf24449281080507b057e808f64e4c9a0039904b5c92a05057b8f2559c41a418651c18d798cfb0283a9e675c98aa28689d829d7c141ab422f7951584308e29f8e1fa9bf6026a9267ad1f441fc1543df87d9a87c16668df6766e27692c307c609858b9625021b74e854bd348a5865c480aee1da133535981091b14f11b38cf0158113a3274d314495a3eb3bfb171371725b7326ccd264cf7d36fb1b9f04663009922a46ff7597ec3af37aab2f83e1e9e00f848b036f4437cecc1a462cc33de8da3ea128fce028cb2cd040b1af404f2f12be401729b8de0a9499db7743cdb863af496ebf61d80bc166be7e38995277c70cfeb5262ba8313030022e378bbc0f3c4f2b7086541286099637df105aaa081a566ad53ffb0c4f375376a91905d8c40b258b45ec5f9bf0410b0bfa6435c7acfb2c7d559e99be91042f2e336d75a294603234c89ed93ddbbca934b6ef69e29fe4b9822a9925e79728d1949fcea14c473e113b653566be822e65b98d2c1b9a3b105d595f60e67254e2751b30d21ea250e8e769d1b7cbedfe94072e1c8b0a66cf355a46a55118b1a146ea12d451bb85d1c4c676c900908b6fa15388dfc580bea1f278ac820e8cdc09cd3f810ca1e8ada5ff3bb2ae411e7315ea20d92dd1b349c05c04ba100fa5a821eb7a11ced71ceaba2ebabcce003f7d9ee39d68dc07535e13e131a8a44efb9603098c9fa6984620b16884a6c3c8a8ac068684d06a204e23c25d1e1bfc3d8e55e484236e08154a3e2a42b2d78a110a7b73805ee05a916864809ea3dba600ea82985cf8378ac07169d4b06b0195293f87c4ac1d4e7d495bf86332f8dbc3b55c63aca18234bf4e284fa1ce2bc55365aaabb5f29fc1aa1e5c33b9c9f247a653b34f599780dc4c48592ba08061d31680e8fb0e66b1ac61b21d97ad9f2e005c3062ff59d601ec2dd2ce14b8ecf83ae1bb50fecacc3217018a720880113dcdfa82a8e519d72889c686920b1808112b26f415b918aef389aa786279b6131bd600c7ec478c6955f8250194a04423d70125e0813acc5716e2a42cdbf603a476ac814619c01ae82d97cea64db78e59efff8cd4c0eb9e631ad9adb0030d24ea6ef964524a8d17c13d06479f2c21465c053e13bdc140f6a5cfe28f04008b7a0b7e0b14cfd39b3fdf6b9b7d81a368175c98c3f3ae9bd8932c2598e2a599323e6ca0daad32cc484013e5e9a4c22e4a6f27352ed259cf40ff9edf5b75914ea57d3cb6d9397504fd053db95d516ebae9a13affc26147953570b044b9816d2e526d039620272b8e83f1055a543e29504b4c0be980561fcda954151d0b08ca00fc9737c70bcd6dd184a9de2f58969292344105d5ec1daf772306c74270fd7a32b1c2885b3605662bd18cd114f108259112cd90179880012475523d7bf3f3d862582c1b8de83f530f5e743c74893d21fd049ed38cb188414a7dacdabf288df042474d9f3000961ef3f4174bbb6603cca64a135b8a9a95b86e893334de4f20f25628fd86b69fba2cd05ad04748864ecae68d335d178e0a11048b5cc70f55d72b499f958bb6aa0a12cf1b26edbaebbf21cb331ff435481237bb8e1e26754a65b33607abeb51d82d191214fb7a44b1bd305ea3b68c8ce704d7e128f1d9f87c0db0cb38bb59b4c16788b1710a1c34cafa1697603733c27fe3772b1ebbd6aa9a975ff922113e116a0cd2c8be74a465cba37871812070ef54e170aa2b52d2fae5f23d6dc7d23c88c1b0f64eecab4d8603850f51c8fdec17724798196947c4ca8ba79d2235dee7cb99e4afc703ab2327da747f72fa6720b37df8333273a47d167ba3721e62f54df275c3f4523b096bf9a3d9f2b754fba8d125ad56f99b6057d61090d6276a37337d67019bdfdccfe821d9c1bf623861e2fb025d3b139f5f03cd329fb3fa70fadf650b13fb797ce567e46016eaff66755bb8ec44ab8ef31d36cee3fef81000210274d341fae37f69131367223ed11731da76af7b1a06c4f71b8b324edbf74e06a8d7cc9df0dafd7db617b2a6825ff1bb8c6068f478d3cfed00923834b88580e79340e4efc630861d75ab64fe71fb1eca50ba5909caf530f417d5d3dde73280c660511dc5900e5a88b4c548b83d7992a185b4b8432da1ee4b492b54cf26d6fa4dcd16b6992eb14e08cf8286b998fa1d8cb0d9105f0405f53481a78ec834ddb8455a93e67c5a3601b72ed6abce03472df64a8d350123facdbf86731231fc3019df17e33903d112edd08196fcf0bb188d5dbc131a8fc5fc0e3fb465e2a58ba49c0f8f2b7b878e9183257119f57a2be4e1783de54ee4914a6e759b4109cb0481b65416c7f766a5d0c9a971bc4078e4eed643b10157978aa578ba4605b8b23b92bcd3b1913623543803c69b2f8963f4c6f65cfa69f9e1b64b8535c2778242165272badeecff1bf6025f4f7514f5e27aac78ca24208de88b1330e2c888b8c82989480efaadf472a7e155b4a799448a13573f7dc0b6e4925f7927e21ee7eeeeddbc360208dbcae445c40089ea905b093c9461cc525261c438e583fbf25cf8afe69b9ac46441122037956bf51e3cf4889842b28a1dcc1d24a5902920848ccc0b9c3b95cd4a0142abda41348c0a8fcf7c25a919deac935cbedecee91e9c27db5b6e1d835fb668a0cb1ccd2da375c85d1661c286b4dddab4d92dbeebc6c5ef75e9016b0b7bbe4e3f7ea14b00d6a6391ad3d1adc863da58505089516900fbf1c8641e1e9e5bd5481120ab23b35100172ce01373a0dd8edc5c1004dd964f9b0783cb7adf7d3ed10dd81c841bc9038f048ae4dcae4f034d8554f76bc52a7c23dcef62b46ff10aa959d8a71c1ee9acfebe1bc38b0dd7ee0d9d3b9c96ed0dd0fe258ad8bb0f29173523ec8e70f7bfd71929ab585d8cbac69d299bac54d10f710b4a6b508b73801c7ba74e35ec57523d99920b488f3774338da3a17a43851f7e1859073104bd35e9b6bd06fef3fcba8d004f2041e185dc0bd66db0868ea0283ade86d92015119ad845aa38e92c50a368a5fc84c524b40d3c06c9ce1841cbcdc1071c2b5349c8b575a08ec1d5e7c8694d7af3d5d4e4302bb3f36d15087370f705a2bcae075605886ccb22c460b51ce290baf36247f04836cd60075dc789e07d81a6906007137981822799c73ac62edcea1339c21c5c68288b4a9d13923c12250a4aeca4a16c59896b1f98f773883a21d8c0df831d473d210c12f65a51beb5808ae331e426d142698068cbac31d64786790f34df2b0f2c498a4dbf5126a7120f5f8626840d03d89fa556edb7c2b4b16f20f970d8311904709a02d4d9bff17daaa28780c40bf70a97826b93b4cc8712caf57233ea98691398077867b6e23484cdccc8cb543809099e0b6e5581c7c0cb270cfb9f8dc31f8395d81090f13e281b861f4509d54adff3893b645f3f1fdb14df68b9e7a410d8bbf69131e82ceadb7521d2d398be0e70421834fa97530bb7c2d4ec3e32d39f0950f320d6fe4902d720d32cc5f4389468df0854180409ffa7600532d2db8189c788031b9dccb5e3c6afee30a2778e7dd9f8c4cc643010fc6322b1439505a00a149ac4e57e520fe382c4202afa00af856eda6233aa5b00ca8466d01bb0f0b3e7d1e0b9b8d3578a1af74e2676064fc78dac6255eac3839614d4e703e5d79da8acba2175805a961c3d66043af45ca69ccc2ef53e53745ebdb61b20fd23415cd08424ad9b4e35b2e1d18ae3f36072a8c8f68da5e532becca15359b47552d762340e7b7c7cca911a62d37d331f406b2812002d72a607adf771b65c52c874ecd4551f380035b2a44f3c41cd879a0c77b7d20d11f74fb6253ebd25babb5fafccc96098611d2862d3ee16a30ff2a9111e62ea0e8a5c94437321df5812d0df2b2d28de5631aa03629e9107cec4dbe8aa9367a475dc4ebbfd48ca5a0b9e4dc86bc0cf3b7e030e76cd2de1a197840ec3e7919e90947f78ae2f7e285466cf73f2922cfeab78e656458f01231d9ca4ccdc52d54d7b71bf8cb0427abe76e9d9e03f3a86b2c9e8172c819ad42d2f1e52305019da9432b15305d7b4e20c379d6ffcd453cd7b3600c290aa6ccf43b8281cec033d6e312adc45a1b43641e433df6829d30fa30d21bad0df41f3ed9004e6aae2344938887d9c2227e15439c1b1edd7a97d39978313ea3b70c6de0301bd581a2eec011339b63e19a39dc0b11c05db50f14951650f8ec802cad92eb95d9e1074aeb17a2f382544a2e3814c2e2df338842036d1bf1ca3e97d3b772ce00f9351e4ce58d5c048b101f580e8e9b2055ac97405fba92cb79bc1b0ea287e09d2d7ed120834d9c37fec507259c8e6ce993c0bf800d24a9d761a70d05bceb09956adecfe9e8f4cfe5e5059aa5c83e0ec688e073e91dd59bfc755e87168321d835fae41bcbba30ea06ebe0c6a059d0fdcd36f9794157d831e8fe835c216742acfb87c923a0ca791bb31d667896e1db005e9836d649fdfa8a2d1a6516f7c981f2f69449171a9a5c9fcfc1055c579c01a68ab758bd4f3736b7a16a9a90ce3fc485e390093543a0b72896f7b763e9ba8019523628d67b31a131ffc69d82c2438c058dce8ae615be3515830f384fb8a1d4251b8f1af7f72861e3e2dcae6fa4e7cd3c70f2615f61e31ed50a4a9957f28a52a32f43ea16157d042e57dc4b10663ba0a62cf767e9b5077b5fd1a1d37008990e8adc6aa4a136b20239c064cf214e11eb8ccdaeaffb278c1bc34016e0874821de0f89b9f031ec06278c166cfde546a0be18df82657760d2e34b57a18a8a34f23fcbd52f18c64a3d872528dc64ee8d9fc4a5d619d728df9e41491a96ebe009259f3d57da7ce330ff3556067ccfada10a9af569517aecda52766380e7c1e115682d5f9dd9f66f9d38d3830a90c26940abcefb8440556bcf368046f6bb1309b70cadac57ca49e153514cbd3f54ccf4507ea1f0f40d99cd4ac2eb16240f2586279f6acfb6f655475f0a046775e7e72f1535578291047086180ea888a0da72f69b5880089d38b37bc892bec84f7e6645c46fb89d96944e502ecbdab41dd64e1ec86def7cac6fc1269e1278c9b4fbd682dd4d4499ffaf92f5c5408067b3715ee392efe6d9dc5943ac3bc343b9a7691a0bf637e447f85385e034d19e2659392f1288dad5818df14b09e0c496f08e09898cc375d25b082be073672377c7dee13371726c655fb57c99bb53ee8674aaef9c41daf0b92d4adfd495fbd9833d697e46743f665a46d19bfbf827a6bd3e797633c882682b4c0c511c9e3c0a976d62b5fef47e4e56b7ac7fbf0697a0021bbc31ddf41d131da7b13d545ee45624349be76ce1f60958c23c08f6293f6083a7890b72b03a0008c45b87c77293c0de90fc9e47ac0d936540aa4240180207e5b7c9f8484aa0f5a0612d6bfa1562d967682b4c5459cea618e2a33476c9312292afe5cbf79a81677c5e62b051f05d71351eb9bade1df1fbe9cc3f22e52ffe4efea0396c3a9fe278a4f1323d2077f25cbf1fc9d679d7f6b46e0bebe0a11563f14873cfd4306c00b8bb493b21d765fd02125a16e30eef8e10bbd4300541d6132e6ee73f2ce645ea42857fbea38c48047fc7919756dda5a9ae339bc24c0cbd937cf3d5e89f105c710dbd047391906760b4d2cc492fde2839daa0ea2206f7552a9f8663cc69af7eeb75f1755d1e465488febe650abe931edf6989eeaeb760e48a827c84893a5409578d51c0488351ab3bfcca942eb314be6fbd0868e71ee25217be472bfe85284e76954a820ca1651f5287ba22e9ac456ddb227b3f90f9faa6e388e1322164ae81f3a4dc7cb196c3f5fe759d87918168b25640937bdedd57179b79fb3ecf450fab32d4ce1657f4b726bf14f7b1a8be3b386074d3da69e9ca1084f055faceb78033fbc6f3806bc346a4de320abf35cf6220ca10d38e1760ca8a64bbb0b19193d3ad2153d1e620f68aa6778b0d88ce58347e2ca50d3097a687c900cc1e265209994be9ad3ecfaa59441b6ddae52ce179ca7d95fcbc17773e6f897867b96cc68e51267ac5ec5cca405b66481468cf865b47bd880c022bb17353122d943496d7737ca53b5a7fa3015f4bff63377f4a671c5d5855752c6ad8762292801fe7d0befb4de07583ccfc871f2d65f3a6141fa2ae6ce00743087e9bf1786ae8db45f3ee1f8c69bcd44b153a205ab93c3b99bd25f852a465717850955df40fa6ce36d114bf6222a1dc32cfa7dcd508cba25ba40b9198c0cc08da7c0e2c6c4c30a44795a093a0dd07fd651131a7a07ca267ecad2114fbe8edb87fe61eea8f0512dfac1ee2e9531ed9a08ba8a27247b6cd19feb391d34278bc39275e3b527212ef1311399ce07ea1a5a5cccc45cbe37ad143f3fc189c5de6710c9a84cdb08c15086adfc7af0719dd84f0a37e49eedca1c71c96407ba61eb0492d694650bf9f6d37b00633fc6bc50fd99bdbc1114e680ad6537de58e83f5be8b0e000aa59407664f6ff7f63db3c11813cd9c73b15a8e4aee1562525af8612529ca6524b591869e49580bc3b2133884bdfc2c39ecee99f4fccbbe2dd83555baf572a3b2ea2914c06db31397e7f66aacbb36cd0460e1da40009e3cef8231a0ab8e92cf1353fe8f27c4891a3f8f02b32688fad6dff9e013e429c52717d292e051238236af394a70f5494a64b1be39f00288b058d79430e5e89f66b889576ea824a1c4023cd75d7c817f2e9e650bbfa0a9d44781bbfde3c02e7730ba7d0896ea2d111e08683bcfeb1bb3fc0457ab9065386cf3982b38c2d66c8c7c3f15aa619ee80db9997f33a47fd2b11c1f5ace41a775d92e6f7076612863cf38fa05541fdd70a3c3e76e42983d51714f59ec397befd0398406d99182d3cc83692e9d13368ba399818f0ff27d022271050493f50216cd4ae21db9bfe5f9c3d685974db01e761ddd76622a7dccfef5d8137012a2fda1ba50b6e60d5eaef31fd7d3b62049ffb92fc828ad2521b85e087cb4a16e3a8c4816b591881ef3557e825019d103e5e080ca45b18144a96d5ae156f1986b5d736bc368c56e5ece21bce141e50cfa2d63571932d9ddc3752aeebe9b1f48f23b6037875c8d850c2fafb7c2b96ee13cdd601461ddb398bfd084ee1f3c748769e286d5339336fc4f049c2ac6b81e5afce26ea89f648c0fd24b7bab5d5c2e41fbf44e875bdb04f049034037a7959a0b3a27142c036d1f9a9a6f458ef781c3038d3bcaeec19183db6246b362a453516721cd0ead7f462d151b7d4061ee5c7b456020a2622ffb6f364d82adbee2ce678e55208786195d82a3b15601f904f189af084a7524097905c05562a77c204d56b52c652b2b9ecde1b5df92e4da2cc92eedf1ed5de3d966da508104249964610571f0da87d352d98b0da3b8bd252b071bd37f8f568911360698e49400e959acce910ed9ac508d0cb3f43fb87ae371bff06e2fffe6ea9ff333c5fbdfd136743271f2333943c0086f72a526e4a606bf9934923658c9b087c1b400197604b51307cf2faeeadfaddd1a5938400db131fe52da1c6b4a28d01668eb508c9e61c656dd975ae99bf3f5bb3191b5914b3d02c61645ce675a5c105e9e299ee210c43676af895d7ed7744a1bbe36c96305f3254278335763555917c5735bbeeed6db9c39c2ce995f8a84403b3ded91522ec7b9876abf8b174b686991372cddc954a7dd5c46161e78f3b895015c547fe1d02141e6d7a525a231cd286c37ebca290bc0043fd6a2aef4ab199967391d25770b0a9691a7efc1794dbb7eb0c793b04634ff8ca9e9056f86f97b77faa129ae18c42f407e43281c7c45ef5480d3b7ce8afa661103520f0202ce3c3d6fdf675b78cfd55e302d0e58de3f851817a1d8819f6d3e6ad7268c970e68d3a23956b5c2032b47a3f358a2c4c97489fb6697e09096978e6fa6a7e2155ce53fb1c83c0550fe98e47860cd23348876b8be6c426f7cc09a6d185b4f1fa92e67b752dd94dc2828e7a191e423acd57ff89c1abc3c2957ce760821f2a77a4ba3a42fa8186267f512d6302e46425c615eac5170902f20edaf4e06006470aa5a19543ab5b614ac3f3bdfa532fefe7bfb3b0d1a2f93132181808ba193f3726882827390276223b91ef08acf0d6c6051a8815889bc8d2b86da7911b4035bda858235c831fad969f6731f7a98ae39aeabf2f257f5ec3ace4d25f58efb86a65ab51a3b22d098352a79a7fe4a3f8c24270d952703ac4e6f5609d905ffbbce9b66fcf16143c747045af49bc92b1165decd93d4940197e68e8dea16910529bf8e9884f33dc6111ddce4f9893c1156a908704516116f855357007fd4e807284795fd61bf7d82532754519618a8e57c5040c6c2bd6a7530e58fc9d5d883cba3d890fb1b32aa682e14576dbc54765b428dfc1e5827aa549200824083085130741fd18dd200d4f9186e3cd2ad8f0156240fa0202a1e0b0dc3010eca9413abcba0387501a4036677701e4c4349bcf14fddde1a7c0ddca421feee4ebaac886208e8d79ea4bfa4d8de10dca9e8c3657f1db5a769dee033e294e34a8349e3192bb4ec4bb16b557cbb4a24af26feb31bd6d6ea008c5ae9bf50479a9aebdf2c0f5a01878f43d86122123f1a718376909ce5bc195ec65d39dacc15616ded612504396cfc642ed3e227d7807cf9627c255f424730b9ec461af3d4440e9105fcd4dd82624d6f6a5111132e189de3f962b72768096c6878cfdc08cbb11cdc8f8ce5f0c3298327365e103a4e7d0da762e051d2984f0869405da73f357486963707ee5b931754be58b8daed2de5a9ddff0d2e842c491db1604bb1689093740a1ed86a6e14ded8cedc31b495914cf922a7d6ba8eab45dc22922683f93b020bb9f3a138c3625fab012396d6b9d222c3b7acfae119331a1d19c15fbecdd7bed885e6a04794f2dc9b91cef30af1b32839e99ed41b80a9a7ce7d9d36d143f72eadd3c81a173f04e0b721228901ad434efc6c9ea331ade016e73c54f54e33e3fb354188e6d1f9646cfa212b6247d4a67841c06cb027ba5cb404e7f64f46a4ccb5df09d049c3574fcafa618895299cbbed4f503650ef86799e4a8888fa91f018d2c4ef0133892d5c92b0ba1e00f697b064437c3f7c1765e7a2b11d2377ac467328eb4e77433398c584be57f33aecd3052038dd6e590c827e1dbe96d2a6fda8a104232552aa02f2d4232127776a13d60cc0efcdffff2c5c2ddfe2d25b8b1fb638cd84c1998c636e5f9f1166dbe8aa6abad280a61f56b4f4029f8e8cca04ece4df4e7e59b8930992d1097cc17fcc8e14e7db0d281d84974b2939e22608f53912b60e9573c44026c0e98796ee0bd621b530a6998f11fc89b26b0afda59c1d174b1613859919c62e943c4486b6efb1cbae38d82f2c082f0447d682bb51b1cf208a358f4a064437b03346e467ab066b2a0c60663a9cc3349d430cb98d34e7028eb92266d4d86e386e8766a19477c7a4dfdb800f82105465acda41122052c5eada56612ad20ec4410b1bc1fdf383a8957a6e4807410b1370a5b3f8ccf3ad572ceab3765fb8fab231836d2fa4da47358bad28f5502d57c14653e0022e7cf6ec24c57b2d50714f8b23a9e3d404bda205e8fd93e6297f4ecfd69b9800d83d98c72ff02a4d03e50bd2546bc99490c0a563448f357261854d117c14f81843fc5868bba9e118eccaa5016babd48651daf41cb5db3baaddd57ba0eb9e3e94725c1d66094a6d2c96fc33a04a803682bf1a9018608b5ad87b88929e7efa66917d2e3428ce9068f4d16d6d716956bc2d3aab2882d7ec36e0091934b3670e2a74d619aefd7fa839ed68a593ad8be58190d8633cdcd80892ef966309ca4fa2c5af52b2d1f93a08b2464ee536d301fc02567e4fa98f27778fe1b1ecc1ad1c2a13ce6e2b415a4aecf99c2230ff1b2ad9ecdd1f1db58c08927eaa18950c9615e5146c9a96545483853c5e968bed3916b9229ad6120f7cac746d831978b7e2197665b7598d2a5e39cc076a65806f2162b53115083a5fc92df8399051ba4fef2be1e52ef1f82afe5e395ca5e16a3252d04fdb628770605695fee7ee330a0e7978881d3687558294350cdf9f17bc0ecde27a2a0c5fb2085e385e3ee3fcc6d6fb58fef9a56f5c029f3b61111611dd9f47dfc6249154fed5d0adebfddfa3d9b03f75d51fa060843a74e0645b0c9e22280ad1e7d17580d6cbddb15f658041c3a0b8a7ad4009dbb15142fd2373fe73f4040d9bf8daa329b976602f9007e81e4831935765d45f391f40bb93f0473c0e41ac9b1a72a63a02392211d98bd9444701b07ca1d8fb398758478f84635a8d03382cc22281a196240ae32b7261935b2556701451c690b616f9cd64eb82d0896c0d37b8a2286c829c4131a1dd219a9bf5353b090dbba047e4255c2fba131bf16ba2464eae8543eb88f4b72e997eba463e6bab8198bd8e45281cad6f1c18c3603af093533744db13257ea8de8695c409fefff016b86c6ffae4c407f463694b3128e20e926a6d55d38f2b144721d67da9d1cc195e63e89a502a821ad6d6172a3b8aea7686131d9ad9b50210cb4c662d8bf199ba691dc7d92795e3208ae55e33f428c1e6cc45a41acae272b0bc287d1134af108d781d433aef1e7544dfc5d7faae543927c64c26fba5ef7fcece34f9cb0f06d641a9a11b872c461ecb8217fa4cbb20f1adc93f7870b00600ab32b5bee08138b197d2286476a265db0bcfda8b7a5f56a59b5d97f36a616cb6743132e84ea534b809561b5c80ca49f60c20bef25b733238228ff5332a2cf96c2779f815b994d5b12e53b1e86ee321be9b386a3b0e7ffe9d9efb6e3278c1f0af0216959ff5baa218ad4163212d0d81e4acf575abadbe28a6059cd9ce7d7a3c9704020b2fc34182fe0a6180fbc287fadba04727e8fa16b6f74ef4d717cf09fb4a702e408bac7ae701f40d4e906d99d476485cd85e2af1f30ef90d23b8d1ce36d7cc434559ba72f6d468d8c4da75383432ecfca16535b015537718c12e5bbf9746830307798d1434afbb4009086485835e98ebc17fb6f2f6afa0cf892990e93f1032d49a415a4b652877c87ce7f6b5ecf1d82c7952ff830870eafb2e6fa75033d4b5fb13e4abfacffcfb8d0cd4937e1b8e41d70be5b54a2f3807725ce446829be99262e049c8610da70b20f70022191afbcc12d91d37af1dbad6c63ed7964fa76d067c91dab156e860dbd32b3239f4732922e2a4229e1b5de8be14870705e9a06a3f8be0a837fca47df332f64e1b35669d9b397cd4e7a25ff1bf93fbdfd03f6ea76d418dc544e13405e80e2358fa0ef65a610e7e3a337ec3be962c294989e94028917344685538302b156d60b039df77bd6504f7fab5241666f2774ce8dad25a2469aeac8a78b5023b2f0e2be1f0c410ea4867043298d451197c2771bea83ddf8afa16cc9c3917eda05a7216797735d7fb8347dea9ef9494d4f3d22df89a8c85541ff562dceb48bb490a27ba30a7aba8fbc153206445b6f65c70bda6846f6d23f8b2464e0e49f19e6591058100676847f6e22fa1bb1defdb6accc435781df272fd50c01e85b57ab943d7f8295ab4b66f0e99e6cc9afd1d8fbfe4409f1db14da9faa3ef44732efa632fc4065fcbcde5ab58a9064f0a590f75eaeb89e50d0a8a5f20cc29642cd9e8b6f76bdd72b5d7faf8ba7a93912851ed25fa9287e56b8e06600026a1f363646753b0b652d3c3eebb85bfe4d6b85f4b0995a4699f682cb85d09a6ea7c7caf229e74c5305d2d6b565656bc7cb6e628042d30aabf3751e8babcdeceb377ebcdf0b00eda2feb4d928f53adbe95299a9477d68b24ac96da3cad209cdc2b3baa2a3b31b31455c9662f4a8ef47db02adb2ebf7cb9e7ebfe833c005c4da79bbbef1fd70a0548daf6b07a70f4ddbecfc5373833a7be08f3897d656dd1135bec77ca6b32cd4c4f4d21ab87415d0521401cfd8dd2bbdaba46dd4773b45e760c734361109b7ff721fcbaea5977c9f14567bf3c2272bcdb51073ecfe7572de91927e896d839d10f7474e29730c94cc3827307f88a2cdd787b2f1be6a0e3d321a98250146247bf2d9ea145657c17d70bf2d98a37d7cebae3fff964bbf1c11fd21136a75df76131f670ba796b48afff0ae058f07ba3b9be79e8de89ae0e2098ea6dd4c36d2a17388d2eb1d712fa587a7f22f10581a2051312c781fb7a9d5acb452a6836180d5f34e205e0502a859294d904856eb5138f9e4137c62e13e7ae96fbccd3122dd1c63e0a4c2d1d7225c5b028389af5e6ae1803cdbf857c24dbd7ff476d9fd74dc7de89c350845d995391e682effabfdf51547eb445acd8a9fd10997926d159e36c31e3e7ec85a5e7988bcb8cb7891735b51f2233cf243a6b9c2d66dc5ed759472c70481438db65787ebba7a4f26a835cb15bff213afb4cb2bbc6f972c6eff90b6bef3197d719ef932f6aeb3f44679f4976d7385fcef83d7f61ed3de6f23ae37df2456dfd87e8ec33c9ee1ae7cb19bfe72facbdc75c5e67bc4fbea8adff109dfd5d139738b7348d5b916d3a6bcb295b78d89eaeb5688dfb6afb512bae33317cd932a7c039ebec85885fe22c5170be8b38d1461c272a1bb2993e6f34b3c425cb8cc5d4cf312d5471b98320792bb6438a5b72983c6c9e5bec28e39c25940fb1972a3bba8924650b8663d5cd9918be6c9953e070a6e9a4eb454440887f3a71346b5cc42c5c921f4245088fac598cdf3423d986a87a6e80b6683d5e7e41c3ce4685946ef50f6b569fcf9863940966b398d955b6cbc1761a99113fa07f72bcabacd6b40551685c85ed41194c39905f903d3cc1fc6c9011ab24597715646d99e1593208f094e1f293341d546ca59b8f667ac28a867497bb2856417cd236c508ed1a143b8dcac4e38e91fe0bb28be7c235e360f36266aa73c1de7a53efb902568b5ce6630ccc1237ce9e1d361fb801dad089621828447f5c5c26846350efad9f7d055ada37ffdf63fac280c835ecdd4516266f37133d0ae4e500d1b5c75f0c6e7843e93ea8c4654e4adadff6211f14e09f4658bf9ca62b12eea2719476e73c64e65b6d7b2290fc943e9ab9e3ece8d7a6a3f44e51a4d17444e3a37d4a2506e050efcdfa16cef66b7646732777dcdcd4268437ffd20f96ad0fc15982faa2bf4e4a987b1cd37f576ef8e97ecad5652cd7aa3f07dcf08669c629da4d7a2263507b31c6c8af1afd8d9ed84f78bde9253de53c1b8a11221f778ad3f67a6c2f727b2ae05bda54d0fd1d677e903539a6ed676651c4ee58478eb6baca9f21df81bd407705c748853b142b24558056464c23bee8757e526712eb5b479f2dc456d5e3763d9f25018921de77aa54e6a400fd0e587918848f2fa7424fe001243afa73cacc079847db0ef88eec23f97d22eb532a763f7b1b873ca90ca12226729324b103a8d620999a3c71439b2858685ebcc51077f73383d67a4047d361b692832214e6e0c9cd35b8883641042d198f95df37c054aa9e8a412d65f627fc4cefae7e0f541969e2ef585ab6ff665f130778fe090594ffd402e42f1990d8aa86eb5f500e7d7e8d84a8f84556547dea82d1abc018fe4506a6377506a05fbd01fa97e640fc273c4efeab8f620552344990565508a99221db4204438940922280b5086c62e4588df4cb91763d52a52061aa48369124d834093ca2044d95004159722c4c0a84caa4dd14270d3d7dc2de50a24c9729f856a7a0572a90a50a4cad7226564ad54ab15c295caf30112c53a858d06a1604d182816ac1ca960bbaa5a17029ab5cdaa50b51ed324abc20562fd0e50b18fd0256c05c54306512a657c3f4153134e03d66bb90c152323f52a64ccbb42c660aa8198272664a3d8346d0c02b1a0894342844cd1b55d3baace9d735b5c28651653342da60aa6d40113758d50da8bc79d0374d02a72285d32e71c835ceb0c841bcca41cb1c04750ea0d0f9533a454b9d7e5aa746b143a376f6e50e06bd832178f02b1e5cc9f3ad797a8b9e0ed553903d0cba6792f041a87c70973e9852c0956e8de0d238ebac809960a426db23ef313d899592db1325fc3f48bc27bc9fb7d201dcad1cf4e3ed5e49fda2efd4ea3e86d890837ecfdccb85389078b09dd1a6a1c9a3b7c9596730a76313651a4128a9dd5a667aa0c8fe1c7b22ab25be09beaadc8f1a8377800083ac1452ab3b2309dd5b4bf09b58b0a6cd50d6cee90117e13dbd706e6fbbed2de5ff1422a1779477e88ffd4af115d1a9754ccb5dd1c7ffe6f1e0fdbe38dc84b2911a3885a738e90038c6d4209cdba3312ed83f74a1328a7690e9a0b37608a5c728e12611872c8ba35f511e853768efa2179be7d1ab463fc0bc5cd88b5952b5dd68bae0fd88e1de04349276c8f595f270896888a80fadaf4786c522af208a64b61a18ee870b00b0ff335fd5971070949a13876bb740762a858711eb65ab17b2ef2fcb4cc2b9382968b7728a01b88d8ca87f8639df142fb3669991712510bb867cf5358e135592014b40e81247bd277dd169d6c02216cebd1ba323b0e1e865c50b0de2ac0a4ba3f8c15cf19b704ffe3ffafc6c79d068249e38b28086a56ab737d25c1e14c0e80538053bd98434dbba49b78ad7d6d8afe91e2c5dcd7f05d69fe6400dca383afddbc453faa38ce4ae3e3252b91e616acee8adc4e35d7ea6e9679a3c4051f19291696ce6a84160aafee084aa5b29198e0f74aaaf334b52a2dc97ae13de18866f18c95027206f5e5db10be977224097a6abcc7bf9eebfff8b9d46f8777343f3438c1a2ffe8ddbdd0fb4541c96306dfc87ff7cb3fa8155e68aff1ef8d25cdb4b04978d1faf23b4dcf8a13b9625b77649422f5e79e43d6ab991de3166ca122f05bdc0cf9ab4ffd2e7a3350e297af4e3083c0a7bf04014e891a4ed50678b91db8b5783d4638a5cf1c7b9d18582e2bbafbdfa4d5426b4ee6ff838c4058541df7a10c04525b23f4caab500ae0d6219fac25a8d3b917d45dc03bd9fe3ba6cde5d50d8e5b8813c4e9eeab43d77fb032a2257b4cd8e6e4287019544124d9c56adbd99c180d40161a138256192af8e626ed4fcddda79da4cbc435a07d86f42a3f82169467ed89d7484666ed292b1f9dac70671a921323e3a91c602375c8bd92f099d41baedede930f9446071c9cfe737decfdc0628320994c223b5f3f789096e0e0ba6afef993e5b3b5553febadecf183f4eb4e1e21378cb8af9e641ace1ffeed468e6ffb2762cf4e396c788236eeabce0894eaa5ff1c6de68d7a99ef6302d3f1852f433f6260498c5a6eadad87486b1625b643d58de9f461a9f3898847f3bc8c558ea7941a0ea4eeaaaa0d92b8f84febb7b32342da9275187f5e806494716d03e4134e87252d046a2fe6466c1fac0fcbbf3e4f318594db722ce8c09d44158933a656de81a7eed42b6bcd55fc7330573a7f442f1a2eeee61ae99808f6a8c66da53c35e97c7f52b87ebfed7b90fc9fd5c1e18e7f2b22c64c4bc33ffc4a411967370e047b9b45dfc83f9d6a8a6dbbaa49ee479cfca6004654faac273dfeb3b82303e62b210a81a7457b22e5732619488b924c7880d2a4b9e06e7dc20f3276c4d1557dab29ee1cbdfb446260a76bd36df3236a3a88e5582c8e9b6dc916d20ce9c5b5d174ccc04398cc5ab8b9a6dc6898c5866e756de238197eed2dcea7f0cf0ae4595566cf1239439446377abae370305109e051f8910bd3e0a0f359c71ae34ef754f6b40476f58f8f579834e6af58bb16f20bebb3db96ef4dc820e23c6bbade70f0b25c2f478f8c5600fa455f7b865d59c4c4d59d6136482a519112cb1645e1dbe6879d74561245c45c97143f4df206143f7920dc573199196d64ab15152054d208e99762f40adef0d40eebbaa994cfafc1fbb1848ebee01b513aec6f1b615d809aa664f01984ca474e076d1b63dfa6c399ee937fd2e20be40135177c5c66b094145f4bf897cda5d1eef314cf6a87c8d5e272351f5122020eac9ebb452b909671ee2462c9c22583cd8159f0a602b75c0e455ea0b51e027fa1c9dd078109b8c58533af5c827454c1c294403b892c0500567009afd352db7335045944df5758c76593a971224f0c50b00fd11f9a460ab4715b43e91edf997dfeefc986afb94b4d68fa39f9ab50f9e52f14c6bf8a88d0984ccc09728ad731028d4f8f45e3a0acfdd3fcbcf6b048c80f45fd115d4f56f67e6a23bf1e0716887cb6498a87c217592ddc3045dfb17904b9d1a2404f5bac65faa48ac14385acbe4dd23ef435c0211cd98af79807ebbd49dc07f3d2c39b4fbb6c998e6f3ec8d351b5c9331842117e26d7f4041756adc87c6c8c890f6287780aac343176a8c177b83fcbf0e810deccf8ed883c5a075176139d27cf1c66f3acbddecf5be69c31c8eb9f01b742e8e33a052fa3c62d73992ee0971a9adddf788fe1d6a5a6fc4d3fce03a4efc5bfbd20d0fe1eb49f95727cf8ed36480ce3f227d08119f5c01e484bee832a86c1cabbe7463cbffbc886516255300de754cb47fc93eadbed2eec72e2c2fc4c48fb0b7e4d2cac7ec387ed8347b1fcede7bfca35c0bba64f0c7e7657f7fe7b3a9959a0a37e4a904a6c293dd9928af8a5f015463f1073d0c9e4bb1dd5e763db1377ab3ddbd2747be6914040cc9dc60bcb0c33b9afa3097d29fbff15e9798c8c1a4c7e210baabda0c963b5126b7777f0ad797338cf8b9268aead3169ffcc795c4f9e69ecf73120aa4bbaecf61dd12e6717ff7a4387dfac2899f689128ffecf1497e4e897cefee39bc23c130faeb9a1cd34d593ef7172f89e39f3f9cc8491591eedf1e87f4e598c6ffee926edfcdccca7b6e8820fa20cccffd17256450c38e6132b3b3fc4c19f9fee54148578a59c88fc5135c2f1d81092e14d9498f85c3927ee452d1fe1b62307d3346d3bff7ca21fed888a176cf3a95ed5b311be92f9db451fa2ea060ce647d90494ff0d31594c653b354a66b9fe1d8be7a9a7bf02fc4eaacf544604f7bc7fa08cb8d20f27305123bd747a17dd72934e6dede45446e2a695f9d8d69cc689d20df9cd8abd623c0f4db23dd8315a0cc71d83585779181fe34f3733e4dc6f90dfff087b69b70a81a87ee34f0883cbf286e5f06be21b75a849b72dd73192dea117ef9639752c67d2cff8bcc080d9fe72e9244597c69efd2b7616193e19cacd37d374ef4dbc12cbca2f17f9637bcdd85d3942d63f57ba9568f6ffae4c924f41ad3974cb011cd3fd1514fe9f96a36198afd2c3f02ee011d101eae8154c3701b77329ae536e0b79a1d3c5df44ff4803a7e3584cdb104468ddf14dbd3dea7b57fcbe6b3044aeba06f7e087536961a6a3327cc1f0b4aabc5d2bbe2ee8404c24f29eef7b207d3477ae9d54c6ec3adc47f59187b93e58a9279a7dead9df36ef90134910551de5836ab9914211af584984765e0246c0390424915a869b403cef6f62573ed5461a4e17601ca195354b0155424f64f4dc5eba9f9518efe6f712102af43e4836dd42228a8a60ddf1f6f593933b6ab532581dfd89c93ade261b299e91a0636ce55df49253285a1f3d4b4ba04888fa353a3feac13f745b29543f5c3483fc2e3aac9e3492e98d3b97da6be8418babe0128f1948f7b62586924b7193da3191a7ccfe7c8a79fa8497be2cfd653e7241d696165bc9cef14f786085b9371117a66afe8cc4a4ab9205f6c31586b28c28fb6b837176faf7d18e4dc9277c90d7ed9298b1c19724c27dd5d1d015cb5a2edba29fb34e9839dc6b0dd9427eee5b191b399a59eea2129f35b4a9faa5d490a7b403404d04611d8c31a4884262471d10d5828e7a0aa174b0348c6e0935e973a986136916975c275473cb5e0adc5de00189695fe24e38e8e7fa086ad66c939298ca4de805d0a7e043cadd07e0cb631e5c7b0e04c0bd32676dacdaaa7f4d4f7505ae4dc83e46a1ae73b6f8bfdf07e48f8c0d1ac076dc18ff6bd660b35ffad4b9e4de96cdba749a936c63518c84cd51cd30bbaf680851467c245170c076b49cdd923ad11c5b788bfecf0adf8d4dff9a1671bd52f75b93d36372a9e5b60686bba9b482674aff897dfeb8da4bd28442ee41fcca5e3a18291e31e61639515bb97d702bfbf9ea4fd36b143a0f86dd638f8707060d20089f17db857221597d3af2ec8c036f6ed80dcf3e81e0840592d886bc244881ee550417975ef59fcb0d65adfc2a9a3fc4ae8660d25fef21e3de0159a05c1c131a9ae28131bed6721004ab1cbffce8abb91c015b63084bc179eb61a91e4636fd8624493a47993b1fcaa3e57dd5cb4d2dea6219958db3e20584f276d32d1337fc59643d6520a25af5406bd74ada0e5bd6234b9b5361b319474792b767bc9b4b28d328c1f17ab106ca363dc6bb0b28fd2d5152f4108654fba6f5f3e06acab9fdbd2171cc693e9c687e3d5ac90ed31d4cf11753a60d226fef3c7a6b0efe25b4b2c1caac1e687260809bf2ff0745590b96abd30193965b82a4a6ae2ee90705dcdc978995a41256de91aeea7234b2bd4f46a3f84771e97a16192ed988efe290fec9790dcc23a54cd309c1251ff62f2681778fba6d4218cf8027f0af673fb93d7f9a84b449f757ade4fc1870f7436877c77cc9ad9feeac21efe9729287c92a704c0e1bbe6f09f21cb39716a5c9ddeaebd3889c91799a218fb37c65bcce5b6c54a9b10e9f368f17151ae91b610cf01e51fe007e7bcd4fdb37c6246fc7d0cbf87e1b7d60ac373c6d92630d81bcd3dd6f7ad32b38bb5209dad5f79746dd0bebcb9d3f8be881ee89d1cfb5f99e5ac6d0392e6bbcd7959598d7ef67234729cce3f27ff7e84d4e63d3aab2d4e20dd5df6c0ba65e00e10d91a7cf9b43bf23aa18270661d1cb6123712fb9cafb73a3b1f8a8b24f8e0d037ff996140c7fdaf8a8a753134c7a84e3643e48241822908b2451b4c72a6bd82337d7094d1a5f34d2f8a80064fd13c67f8015ed0c8b61da54bfe75c4e69236ec067ae457ebb0b9f9359fcac0cc7318f7df65c360f86ab9253e13abc0f924605fb315a5741500f78ad36416581d9bfafe97ffb6137c68fab68e9deacb110687e893b23b1d3d7946cf2e2d271683da6ef7fd6ab99a5ac978894f8c3139fc3afdecd1589e7cabc21e526ffa418aecd404456d81f99f17a6eb7c6e76f5c17987caf881352491146fe4574a0af21e1c1ce094bf327bd9a8596b8e9853c7ec13a3efd85ef4e193cb1df125367e63dfc2537b73a87b320ce1a366ff69b41e65b0d432d00206ae4047f7214886f1cf576d313553f413c8e2192cc123af2587717361f761268bff2cc5d3ebccd345c7e30e72de0e620e45e4de90c667887e3fab98447117a18361a8157ed05236b61349198a0a11e277dff4bcdd018f33f226f0e656e3df76517cffe879efcee30c2095720a5c091f9a982e8f17efe4cdcf04f711a080f8ca763e9439a78c41adfadb9269427c2ebeeebbd247557ad69401f4ed4a8380c3b89a73157f38bd0b398de361495de53900ece8bfbcdb474a17034b34ddbe08b7680821211cef1b0a778fc0fdf41632fb88d70886cfa29ec0faef05963f09877420a88e7d9b1c8f900b6ee6b4ad6c754053787a083e1e0aa6db0ac89bf4f333c40ffc5f1b21db259f56b2ddf17b260c5d446e0a1b8302f4fb643be26e93f7497cac41bcd0ce9b310c080467b8eb0df5d8fd5d61dfa672702301e9b6d5c5fa38a71b7be991e923d37924de4c0334ef15dfe229de6ca027f62bf855af3b5f8cb1dbbf7031202dd35ea25a8b7b6fc198ff808dbfefc82ff28c16e6f2d98bc1c8cb94de5491656f96e887ddb53140c7bb56daf43464ec11add8acc99299e12b6b6dfc1467fa582ddf842965e6615bb9e9d3ced847b4ba99264be660d1f5d09099119d73639939a3dbae28333a3a43d211188195e66e53ed21ed65202cdc0f6d604a33e4382d6fe28966fea1acd0b0d3c9c8235b747327cf4407b1de46a630c38ffb3d54a34054f603ae4d47c4133110c89aa403ffffffffffff0f1642886c6bbcb5c67923482629493a5eecb2eef52e534a29a5249376b988c4e3dbffff4f023b162b132913e7471b4ba14109f5e2e1a4acda896ebcc9a291f22b68fc1a291f83c45f23e54bcef12047149aef47afb7d2d7f9520a852671df265af4a64c3d3ea171e68bd21d6609d7757342d3121eb367a854a166a39ca4ace072413949616809399ad0b4afbf67d8e820538498d03c6ada5b97fe2ce773a697d0e47e5aa8e9b29343094d6ade61ab8ee23fab5566112595240e7024a359eb7954ea614646d35afbb2d25da44897091a974b0a505209df1da3c1b6fc1662cbd622a5de188d6a4b6a35740a0fb1e699be8cca10148c1048862804448d16a4c880bd491b32c0010c1cc568142dd427dbbffb396c6234ea57d2b3c8bdd942a9c3681a3bde47c9a86b9d05a2460b80e00006c8051cc2681ab142b599dcaefa98e95bc30473bf066b5afa347000e40c203000720690952131b85c525e0829a9a47d0d9e9d04b95c9e9d985c2e978b0bcee1b31313ddbb1c66c0118c26a1478fe9e9ffd5ef01c622bd4ea5ba6180e317cd49dcb3f62f19a166fa029bf738cfe9b5e7a2d3ab7cecff6c62c616f7a2496df9aff3f6c6184ac88b465daaba4d4de55af60a093876d12c62eae8e147ef839072c1e592514999cba5311885020e5d34ea58215cfc83902d7a213872d12474a8161df55b2ab5c745b38e3a7aae9c18a54784e316cd270f3126e2418cc7d1d9854d35b432257bf4b668d6a75c958cc854b64634502d1a4f7fbe3bbf35f54d468b465363ce5e7b57cb863b8b061dd36af46685b9ae99be931513342e9793159391941416ac47b1c1e5d279071cb26856a9aeb5ac77d4f5572c1a4d79582546ae9aaa18160d4a27f1e93eed38afb5af68bc293e6813d161748f40d468c1e5b29e8d754583da497fae3e2db322eb22e06845d3a816edb9b4fcf9dab3a2f95b28ddbeda665ded645a8d348030935f71a3b95c2e97cb2588108c1170aca2f15ba5f6a4b4cbd44aaa68eed12b6dd929a184cc52d1f0edf2ca6c5f78b80a150db7bc5ceaa453681bca53347cdbadf8aedaca73688ac6514b9b9bb916a14e578a667bb1eb6eb70913cb93e9b3000e5234eb17f22bf5c4cf775ee3248dcb658d1312c6dc1a2724d9068e5134fcbed2f27e3ccaf64e52083844d1b45fce3cd55f1fdbd24c5f281aee96987126b618b7e399be969e640507289ab4689115d37b619f659252148699fc39206ab4e07259393949f991143550486ac08b1995e402ef2042302a383ed12c27542dd9ae77e69740d468c1e5a21826a392321995e402185cd8139d689ee9b5c5994c97cf99130865f7e1398498e97ed42fb185d2b2634d7d65af8c60ee4ad2a7acd80085a406885148523288108c0d706ca27947add43a68bbdb55eb27e0d04473e9e4f96aa5ab9f39fb0a3832d12873b652334dcb297f2f17e498eb2de0c04493072da4faa4447b89c631db3997c950b7d5ba5c2e97c69c137058a261a731ed45d49e981d674e1c956896dff9ffc68598b527c4413b177050a239490fa2c5d6e8283e4ea2b93fddaa54e321f429a1249aceb392b5b370fd1cc422d1f8594b2d6c6be52fe54dc7800312cd7a3f8ddb9ad5cf0f5b843932e07844a3fe34cf692ae3642a0f810187239ac3f6b476126df641e5993e964e48de4828186d2e17f6282724cf86c95f2e3c051c8d68f6bc7a534e47253a6a8883644493cb59ea6cfa69db5a44f3c9d43da526628e4e524483ae96b64f8d31b5b3d3377024a2d9cf57552cfbb476eaf821a249cad8a23ebd8a99da4a0f2204e3068e433477d631f5dd76125a2b0dd12895fee862f6d7c83815a241b5fc77567b6a0bf9d918e0204493c84eaf938873cffa39144408068712700ca239a7a9d6c3b8b9feaf45418460928043108d5244aca556a4d2524d99be18287a209a7558b54ccc5239190a49ca391295d8c932695048523c8810cc101c80f0833a9799bdb11b5da2cbd3986a8639f89493332e9794474149296d5c524ed6e552051c7f68f8cfcf2a85be35a35f978b3be6ee707401871f1a3f57f9addf90a9d3ad0fcd795594e777b2fd9ee543b307655289c8ed7c7b683cfd34767afd2b3dac8706b176f74c9ceea816f3d0dca3557ef22c3baa77786818a245bce752b16feb64fa5800448d3480a8f4dda1c96485add9d0c196ce5e2ecc9843c16187a64f21c6ae8bf020ea94b256e2f520423020c05187e6eeb063880e8faaeaa1433a9ba9d92e2fb3a59ce94379630508db214082a81c02440d206a8700799437d4b85c5a8504a5646431e78208c1e008038e3974a63afb9e3d4f653e0a59429e52b92dd6a9c9a169869bd86aa9a8555b4314e08843839cad3adf88285165e315e08043d30e2bd74e7ee955f265f2241866a2b86f685a1fb4309b52e8b44eccf461de205137348c375953d46a7b9d66dc862671628ad3bffdd4f666fa56504e30e886a88ca4acb16c68905eba27ecb4d62dba4c1f866448c9b935349ced7c5a6329d3a21f7503738d111538970c31493534cc7dd973da6e6b255b206ab400881b0c8d354c520d2e97cb4505e5e43a88100cc39186e65f4f614366fd0747f070a00121478a98bb11d2bb43285915b53af9ea9c96d0221c6768ce59eb20ebcc74452765fa5430274c6f535654927198a13909935eda3d87a9cd43a2d2ca90929338cad0fc614c27b16748f9e7caf4b1c79090fc5232347c77bce5ba9e4a0a350e2204d3031c636898b3e4ea7b97dd7fb2cb8584e4d7e12042303bc02186a65dae5baba1b39022d450189aeb636da555e8d8fa58a68f2f654525c1d0b0e4d9ead73aaa3d624238bed07c6bca9457f2bd7bd2c5e185a6f30f6ec3666556a8993e156632e44475a1c173dd123b8989de3065faf60338b8d020b572ed9da2a4bc76319391364c869c98f88900c7169a578a9cebf35a9e2f3b38b4d09ce676a925bd3fd45067a149ec5cae620ab5fb6c35828566d719523d85ccab8d890ac7159abc6e3cd60795b13a1eb2098715cef1c35be479787c0765e2ff6108b13ca550a94c9f72a3948c64159a456ef69c56dab410198180830a0dd35b4dd749d854f251edec0f704ca1599f7fb7aa99e9fea54c5f1b6f92296f8394151bdc75ca8a0ac2218506b15b87d3bb9b9d767a84d3c0118506d3ae4fe80e51533e86e9021c50684eb257d57457f3a92a939392929385214925230817c7139aa6fe6ff5a17496af140e2734bbfa30cac76f6b55231215cc1d33f992cfa0a49435f6f01a47131ac795a7dbdd9f6bad61a60f7130a1497d56735fa4fb8af5327d6d0fc7129ac5f8aa2a51e5266a9fe93bd7c6090a866448096257010e25dcd993c8b74859f3acaadf5acdd6499cd65a656824a1693e8cdb5d63d7a7fd67fa764565240d8490d060db5bba48353276b69f0465881ae7084dfbd5f7a616b16ea632d3b736b8f395926684e62464682175bddcb67ca4080d626abe481bf3d737fc1594c452c0d20c2e179594770e2204b306119a94d6b6738ea354ee6e83929314165c2e974bca8a0a67de689ef7786a0d79b5d676993e551e392c1962e246c39fcd5f7dd243adea337dde568620154f5951c96ca3e14fdabb1029652ba196e92339196103c3524e302627884877066c34eb15b7bcb4bf49fdb74cdf411ed2ec257795c7162a6ce4c492212689569ad7b6b2ad6dcc176a3b259f92864a937425eea4cc15527e4361d818619844ccdd1a2623424069a434ad4e62d2fcc665660a83395971120ca139c78f3ff247a978a8a804280d3ab74bb184aabcb87145e531272b8b4e9a5ee7ec4e33a5a5aa12c58d37697831e5313b3dae165acf30272b98be2e19629223286990fea5bf3f6ba13d2a9d3413342e970e2204d3481a95b79c759e931af62b2134a835e5dd64c7d6fa837927fc29270b83d0a4629e8ff824ff221e4563a449fd7e1695a16c4ed9b00599462f57f31e44c658be5203080b6a00045bb046e3e7a4e663c4943aed60baa035bffaba1a273e7a904af78da7aba73c7dbc1f254a5951390d6b90b15a7d5c5df59d4b2427274a8308c1b860352815a59399dac15647993e0c62b6510dd3e6839afe1872a23b4c416aae35646788e149ac7d327d2a2b290905c37e05c3120aba1300a1d14f6d872ecfb74e2d337d2ca1e405d330becef5ab11a79f44993e64c10f1a4fad9ef5d96ceb12494a5923a1e0a5fc0a721f34cc50b66d9b90d1524a6d1021181df4a0596829ba36c54efbba99becd000f9ace5ce9e0b2459e8f472505bd4184607020a4619d88947b29ccf4adb8f1983586a867184e491954e99494596a831d6426b746b4c8dcf6327d8e3704b352d2bc053a684ecf52c9d24addba19733c4c0ece694508972fbbf7ee709f37cfc6999c9e216bca4330af929250f482e0a0d15c6aa9b6e449b5542bd387c9fbc00d9af59ce7c97e0d7573ca894a7b01359aa4ab5f25a6679bc25e1b649e4ea4b7ccbcba28afd96aa83cd79962744e3568185917aa659e3613cb443468104bb6488f4ab7ac796303cda0514784185b0931763831e4326812e59d5deada4299985a14a4e1677550f552dce95c634351c7a039dd2acff72da4a8a9792b4362e02b434a30e804693045888890e2f23d42e702187cebf77e5ac8b80fc7e00508b5d4789aae476d977a011ae7d14909d5afb60dd10b5c70e9494f1fd3bc5c845ad0b4f3add0e649b8aa5459d0a086cbd9bfab35e60879d3b47c6cf72bf928842c8215342cf5919f93521755f213119cd19cc516a7839ca9b175c5d8890a9aa5d842676d5acc161e7510a5a059cee7ee24e6ca4fcf993e12949211ccca90126f14346b0fba4aacad749b928ee0044dfe1f3b32c793ba2d451c81099ad687595b53a4585308332acd25684e6b649a8d979e5da9993c1bbf725272928272280212fcdf23b4fadbde8e30d3877292c2ce0523689d9e8e694acd142b94e9fb2143183119825119e11888a049eae829dc570adbad952125a851c7cd2e9b6ae668e165fad6b3813959c9f36fc799d4e77976cd240b838746378e9cfb6ca6e5eab4ab608308c12037c9ba0e4289744fc3fbcb6565c8c91b89e472411c440846edaae2ade67a6726ab36aaed57cdea90b2ec6f400e0e21412919c12d1962922b258d0d6d56fbd52a4ba7bbf955a6ef64c5640473c7be2a2a1b4c782b933a4295c731d3e79f7272464ac28152811e0711826974e3d838cdeab5f2d6c7a34755cbf4a5bc89c908068f574a5a7208f6d4b16f4e4c9bd666ae3144fd0a520897e33e46e79091790f51f283a0c1757f9ed6292ff57efd81c611f2c4dace3aafce38d3c74c120673c20e5b8d3480a4bc89091a07857820d74a6c670d512d642cd3d7c649ca1a988341079ae67e52f590c27fe7cff46172a059755c77fbac309137d3f7262798364e52d6f036520dd0191b383dad88a727d38f33227429618384e4d274eee19fc3d2791ff4993e4c5fd3400325272718129682c1fcc840a3d0afe5e7c6a990e3c9f461f24618881a2d0092022067005103881a6900598f03bef56ce4061182410303cd4a6b1d3debb2d5759be94b4999750e03a4f19556b77f9b4f364b99be941515206ab400c8e5b252d22e974f39592a09c8c12118df2042303eb840c379de0e772a3aa438337d40d4680190cbe502448d3480604c46302827290c356505250d0b34be38b5a7c3e920ddd5327d2b250d837e65242507bb52d2f2534e96061182391548798cca90140cc60114508ec004dc38696345021248191509440002bc488107e065545286020e7023954ca001873921c19c9034800125123003020b482b2a1a50804a0312e00004086125454272d20111963ec50107908001eed76840010e0204b8919292930d0c002d208094f424eb010138009c057e785b19128132ce8dcf60304b65a404b3e2c643c007624e4e5230185ec4e00b219128cc8fa4ac74a007f248c1c08e9293d53a10833921f022ca7a950fe438cc1b17c071180c06b3e2c663c062461810300736e02851496d5c441060f99264b2030173b845002c936082315260f1e6d5c43b21b880e0031ee800073650010a4c40021180c0031cd0000698b10005582c08b0582c1d000303bee0ba70831718d005236c018816b490056318e2091bb0582cc97082152c0668a6b0582c3812a1431201b04822197e48810503222740c109d462b150c0049eb0889ce0036db05872b0c162c9b1068b25871a2c961c694083c592e30c164b0e33582c39ca60b1e42083c592630c164b0e31e400c3170c2162820faccccb15c32252820d582e4000820844a05281cc4a0be5e484a40240f8951115129204040a240ae4f0c22d6c61b1948002164b8e2e582c39b860b1e4d882c592430b164b8e2c582c39b060b1e4b882c592c30a164b8e2a582c961d39a82042022b584448901121c15b2c961150c0031ec831052944c100507882139ac0c312039082199ef86100521000177310918305053e12e1062594a18311580a0004478804420522907082221290062a28e1c727fa800200881802050de0361431801d08c3120025f00205c6b8830f5470c0e203942e280c15cc807a5046231000812ffc0106c6b844901c5938818e53c4e00cf7410786600b1f1cc074e35586989ca8dc819dd8c182e2c6d74104318b05c58d271941415149ca42009176058e5a2861174958799595b7810d7000039454821931f915fcca090e44b60d16cb9de2a060b1a46045e5e40c37520c4c4662701610823584600b0731db48356068b8f1ccc462b1582eabb058184b2a23cce4e4574ed838490ca382c130968830f286c933ccc90a86b1c458c230964434906211d1c05b443470038b88065e6011d1c00a2c221a708b88063e6011d100052c221a48804544033b2c168b0f03f4108006726111d1402c2c221a40451921b08864e00116910ce0b08860601616110c70c22282014458443040078b0806b86011c1c0132c221878c3228281118b0806786011c180092c2218b00006126011c1400e8b08905c584480bcc22202041316112086b088006983450408162c2240dcb08800798b08101d58448090c02202c40316112017b0880031c32272816258442e700a8bc805286111b980212c2217b08345e40259b0885ca00816910bac6111b940108bc805d62272010b58442ea0c32262015458442c60098bc5f200060880000050000220500604101081062000030ea88088057a6011b1800b2c2216d08045c4026558442ab00b8b48054e6111a980250220015a584424500a8b88042461119100212c2212c88345440271b08848200d16110958c1222281362c2212788b8804d4b08848e00c8b8804d42222012008108019220a88401b2c2211d0824524024cb08844800d8b4804d6b08844a00716910834169108b845240219b08844000116110820c32202015d584418e0038b0803d2b08830e00416110670c022c2000858441860008b8819c9b08898a10b8b8819a4b0889851098b881985b0889861078b881966b0889851058b881945b088985162113103631131e305161133d8226286052c22669461115980302c220b98854564019bb0882c6010169105c8c122b2803258441660048bc8024e2c220b008245640134b0882c0059441670018b88029061115180292c220a788445440177b08828c00c168bc58c0514a000064880012650000660c08c031c2000024080034414b0038b88025c60115180092c220a488b88021860115180002c22093886452401b4b08824e012169104f4c122920037582c961f0020800008100011332c2207388645e400bdb0881ca0151691037cc22272004858440e20088bc801ec601139001a2c2207d08245e4004bb0881c800d8bc80148443650028b85bdca103430180a88c062c1e1891c2b168b65878ac562c191229281344432a0091c96b49256308315935f63e524c80dde7818ac9c0479228cd840058d945f39c1c1ca090e5498c91016989c8ca8a495b402951392335452dc4831483961c1af9192d2482b6905af7272c60c58c00215349805d818824805889012c989e50e4f3489c8e8b4765faacf62279a439d5c9b42a7e9cacd93953b4e347dfc512f5da929db864e56ce261a94f8358f1e62d79449302aaf32d2c6ca88426c4d34ac11e17a62f271dccdf4b131c2f23c130ddbe76e079ff9d23f3fb2d246322a8b89260f6bf80b7b5bb23a6d0b3b2ed1e0b985e80efaf36efa4c5f920c295114ecb04483d062aaca936127a4282555a279a5bece113af75a44398464480c10113b28d1acf25abdc85fd1a9d24c9f1aa2e29360447cfc9c3bccad8a77fabcb183ce7b42bc954a54128da63b9fc5732d5dfbf422d128f6e7a8d4526b3e7c560db141157640a2e97f47cb729df68d927a447338b93172e477c9fa006287231ac6ed1c231ec51a2b428ca5200a3b1ad1b467f70a1bf34383f9b08311cddad5b6ac713db6679f27103b16d1b8aebefab3b3feb484514354ce99ac31a2a2920235c40678778fd8a188e67c7fafc508e1fa84101016d400089ef7e9c38e44348feb937a748ae9598e2b2623375863440597cbe582291962d23b10d1a8563ec68df7db2ae78e4334cdbe1ab186874dfdc10c2204933b0cc1a7b1ff63cf52eaa6246dd78e42b057c968b9b1b58c30d3690721daf9daf154cf7b737575fd2daf2236d52c2fd3c77a8d354ed2403909f23b06d18b7d8888f224ebad27a2b222321e64e494e943c13807118249c10e4134aa0eaab6b0f931f9349acbe572d9118886999db576dcfe75b591524e56ce3dc290a0948c9c0344a3cb9f2cb5d6b8fd61bd5ca8b0e30f4d7bc4daaf3d08f9e2c5545266068db93776f8a1395fa8a1644bcf6ac4df8786a53c0d373154a82e1b1f5877771142aec8171d6f4567aed8b35d42dd17ecd843f3895662fcad94aa761683ecd043839d4e4aca339dc3ffcf4393899c1dd498d3eaf1c24393903a3f86aa3d2996f272c936ecb84373fcbc374bbaae7f69af6761871d9ac3e71aaafea632530a9961471d1adc86186ac85b2544eb910b3be8d0a0c5d3d3361b2db688d5b0630ecddfda8572e533ccc417440826b3430ecd51c999563e6397cbc53138b0b0230e8d7737a64eaac5d41fbc8c0a500b76c0a1692a9d4df58f5acb57c160322b236d20d660c71b9ac6962ac6aca163775266fa5c058ff1dcd028c4e63d0925769aa3b6a30dcde5398ee7d64a6c55433bd8d0305dce144ae8b44f65680d4d25c5b2d976c33e07e161871af0e42d9ed3e373349d393d4a281711a645da68d8918646614abcfe74a8797aed4043f3bfaea8a176d6a26abfe30c4dda5464e8b8155162e772b9606ea98c9428b3191a84b8e8d7e96346c45a630e093bcad02c2f74d89f75700f1d76d24cd0f02fec2043d372d761b7f87139f75412c919080c3bc6d0dc3e63be96ed355729df4833b85c2e17ccf90e31a42f3b226f3e9ba9ecaf7af8af9b37ae4cdfaf714892f2da6447189a759c92b2cd6e5c6c19f10e30348f145aef89391d857a3bbed02037b695292da638a51193110c86d348810a6490460b78c58de7cbf342b33e217c3eb6d6ba8356a695f9ece84293ff4bb9a3963a7bddf80c62de482929e9b2830b0d425588914aebb0b5d6766ca1698fde9b12d3f674fa5a68f6149dd55265479f53169a4d849a39ee36caf58c0555dc3ce838a2c38aeaa9a7bcb5d375fa164aa9511a3baed0b0d353ca1a1f1d84105aa13999d0bd72d2d4b5fcaad0343e67da9ab523a3b55468127db59658e3af95ecec9842c38e48bbb31db774d86270b9386687149af7736efea9936af49751492ec043184408068d1d5168905a3f44070fab5ddc1d5068104fe9276575d2adda1d4f6810eeb2cde5b71a9d7ea60fed704273522ef5837ed422958e0a4657524e54f07634a169ed8833976addd63926640713ce7232624cd53ea7cbac2d15db84997ab92ae53b96d0743296bef8dce2dadda18406ed42c5c56b47c6507eca0c6e0e3a92d1ec2fff9fa594d10f4a3a90d1b0c2e444ebfb87f41d8d63346b9d56ad1d865a71f1bf915283cb0519a369a7f1299ffc75dad8e3d24147319a748cd7d196bc95f2f72e319a83b7bad9637ac467d7301a6cff4ba9c529fbbcf9ee0aa35909e12774f8a8447a7a3518cdf2ebd48350c3b60aef1c06180d76a2748652fda585f2ac41c72f9ae59c78f38fff62ecbfbe685ea544a8d8523d6395aea0a3174d32773f5f2daf21a6769717cdfaa552cfaad5547a945c493999c12e9accb5ec68b5c3186a8bf570e0ba685a9ec3966a47e1fbb566cb74e4a2f95cacc7bb3dadf6b23752564c1a1b5c2eaa8a8b26f56b2afa39955413622799958fc1084a0af60e737b6ca41e74dca239ccd7d4a776dda7aba5cb458f8dcb05737a6c241e74d882d9defa7c7f56a904b39272a2b2d24652985e2d1aa4f2d6ef2446f9bdcee5a2c26cd0418ba6f9b2952ed3bad45e8ff2861a8930b7051db368369df3e4e8fca3bca1069ec3dc1b2b58061db26810e562acfad51b9dd462d19cecd3acb5a36c5bb9eb80459356592fc6cb3da5c3f98a4657f52c4eb748d5feb9a261b79dca0bcf7bcaa3328d79d4d10a849e77f4f8392711dd9e7622a72f4b4bf930cbf4ad4fc1a4491a615f72b772c2c608ca0ad1c18a06299472a1c514dfd1663292b95cd40b3a56d124af967e16b1c5be56f30974a8a2f16d2af79cb4d4d9390d64063598411a404e5652da41472a9a53578de7a9fb0951a2a259acd665aa861a233c9ce9f36b818e5334ebdaf9d267d654e374b95c2e6fac5c2ee7306fac201c7498a2399ef88cdbe9e36cd3e92ce82845d3f4e8a9cfb5dbf87948d1a493c94ea74eefe8f8306fa4acf8289a4d69dbb1af5f28ed375134c930a5b3c7f98cd0ab5034c8587ab7326f2825058a4613eb1d7e23d407657fa2d1453d76755a4b744b3dd1747fb274d6949c5b6276a261c6aecd90f3497a6b7570a259acd5a655f5cb8ddf27269b4864eb8d12627d28a9a309956b1ddef5075b113d13ebca8a9bdb8708dd0fe9f1da7bb5ad0f63bee3031d986856d36afa9f4d7f19ba448392774396baef17955219b292566cb050523028cd0d1d9668d4fae56c9f591fba4fc79fa0a3124dd3db962b75633a28d130c2f4bffa8a95d91b080b6a0044c7249a84e7132e9679c8fc98b49256b087d260a043124d6abebe1abb7695caee72614347241a86b62933968eb34f5630e89c157440a2c155b9ef6ad5f26dcb54d0f188e6f0ae5e8914577a6b6fe4884697d56aabbf988fce66fadc197434a2695587cd3d219638a9c58866afcff3a4a350ae7fb588861d5ed5884edb56c992229a6cf78a71dd6ae9af52229ac5e94e2fba3f5bbf14229adde4cf6f7fe49dcecf55741ca2793eaaa573dcaede9a2f678866e9eba2a644ffa598caf4ad714282f914140c33196978a9a310cd3ad47835fab67cd8a970434234e79ccdb4e8d9d11d07d1e07a4fedd93925eaf34cdf0a2e97cbc544872094116aa3d3680f35ebadb2427f574d6532e267fa7a03d1a81f3c29f5e062ac25c949cba303100d6ba590365e8cb542ff43837ca95fdab4feecb3f543a329196f63c6f766a47d68103f11a642fe7bef97e9337912cc7a36d02d06e317440886053af8d0e4b166e7b471b26e2afbe8d843a37b4e73d5bf9892b593e9232149777a6850436c9df38c355a2837d39757c2c6df051182711d79680e292e44758e971d111e9a86e7602f5c2de1229474dca159e4b996273519390982aea89c9c71ae75d8a1e15d87755db23ab8ee33ed5787268ffdbabfaac62cb952496bf8d2a151fb7b38dd9d3f9e466ba42499bcc13029e81a1d73680e6ac859da3cbc464f6d019243d39623ae6347b575cfcb41846080a0230e0d437750ae967b9ef941993ee372b9384a5941d10187a6391d768e6d1db509d9211d6f681629e64a7d43ceeeacca9451416e6870ddf246ab592a957ad73821694373eda96563a650f9915a71e3d9d034ef83e835f9d45acc364e48de487936f84ca0630d8d37f74ddb903933d54671e37d75a8a1c9a58bddba629f3f0b337df828021d69685653e8f82cc6d2caf3db3e05f3798b2961e347a0030dcd2a756c1331c612e2d36b724272c6e5a2020e220493749ca1b9e39b6e97eadf6fee970bca092b4187191a8690adba5ce44ebc2f43f39aeea4cdb47718b2f7127490a161ffe4b4bbeb7e2d5b2b29cfc6181add6eac47ad6f569e8a9aa0430c4d538b2df365c47ded970b6671304147181a7c65cc963aceb5ca970aabb00e303cb7526d194b01de62071182791d5f68ce1e74e9f9f2d3c1bc4cc9d8e0725919511d440866e9f04273949fe2856d537f2def42d35077a167bcd9122a171aa68bde1d61eaf93fbb85661b1eead4a6daf93dd4a1056ee5887f7de6e2f2a4230b4d67b7eec30ed1d5410d0b0d5a57bc99efbeaa9aba82235e6f3b233dee899c79dad90c9dcf740de59e151d5668f25132649c2d39d3938e2a34abddabd59079359488a8d0b81e6f7474a51e5bcca7d0acc5742839524dcf3f4ba1d9a49ebc7455375b8e51685a36e64a4a17b1fe3e2834cb955eaa740bdb2f7b42d378d6fd429bda6aea84a655aeb490533be7d74747139a46c618f3a294d079a54c1f064f07131acc46c7f87e38b7dddf6424b3520cfa033a96d0e4b2fd4345eed8be31d91859c1e59259194949978b0aca890e2534abc927a1df74327dbc7803377224a3795fc4cd7fb1835a4b6d6148d21d4b9101491a59494933b85c504a162fa271b9a87c0e643447e14a8690f14a860ecbf461de403959e74490e3184da34e79be0eae42a9a7628c668fe293eb2cd498bf6a8d2c46d38ea1c68a8cf41c2dcaf4adbc4a6b279827c2c81b2927251f03e612e42046c3944209d31fb40eb6d3da3839e372f126e4184636a514ca3fabcf5a65fadc7861a46db92b519e46ab2ed38769e40846d3e98a7a89df8e9b316034cbcfb383ae0931e4cb337dbf687c3f6f4f3a78d4f2545f34db309552eabccfd8ea45b3da6acd4fa86eb9dac68b86a574bc5d8cb5cda670170d43bfbde9dca27257aa8b469f356d6c2164c6f0542e1afd93f6beadce95af8a8b869d25d6e992e7725db76890dd42dd14e75aeda02d9afd868fbf5095afaf95e9eb5a347f9d8ee36ab4eb8ea24c1fd3a241db987d63f4b458e2cea249850e1e458da9955259a64f65d12073cce3dcd2ab3f6e99be8c45b3b7aced266527f590a7365460d1fcadd3ea51d526fd65a90d955734eaf1584ba7baad94ab337dec8ac63dff9266ffb6a26955e97beddcf1c478b1a2c93fb5d89f2562df9aafa279f785fa3831f2a54815cd31b49f4e43ec6ddda5a2c9d31e29efeee6a30865084345a3dc6fd51529c686b8993e8432849da269f5fd56dd1c132d3345b3ccafdc57f95832568a66f11e659e3efd3a89140de32527aecda392e25134e7925a4d9c4dbd1b8ba2b9dde5c50e2bf3c68e337d198a46752944eac87c4b11281aa6ddbef75439d3772843d8271ae54c7a943347d9f7999e6872b7b1a9470cb5e473d98986a1eb3ce728e6c7c79d9c68945d63de5c591f71130d6e6a787a7b5fa9a534d1f4af3d3f4fdf996856bad64efb5ccf4837337d8c9868fe7191a3f3daaa5277a66ff1124db373abcbc9ced9f596e953b444f3cd7a25dbc6edd3f44c5f62251a96126de3b5ea07add6327d88946852436e98d62e56ac6f12cdaa46aa1aaa55fd7c0e4aa24197bea5f5eb9c21eccbf4a148348dd1a3f4b38908f539993e8744c3abf1e1b7e5a8ee3066fafa11cdddc2443fe72bd37296e96347348ceb72a183ce91b1a94cdf36a239b4583732a6ee889411cdf3e96d099733fe5c44d37a27a9961ab1752f67fa5011cda9cce774892dd5da95e9bb44340cdbe97599926afb4721a2d167994ef255ce6ded993e7488e616b364aa96fdad7c94e97343347f7b9062ca0e53d45617a23907a5de3928f15332219ac49d0c294a64da6707d19c5c482d674a21bca58268529e93ce72c6e9b765201a746ca133748ff98801a2b97454d384ceb3f68add1f9a4fd469d3b9af930eb24cdfc9a80c41f103cbee5eec984296b8a2f20ca5644810320639fad0206e22634c5d395ba54af8d02844752ad141a6b013caf42d943d34abda6c356769f9fc7ca66f04a5644810f4d03444ef4837d5a3b3282543829087c6113baaa94b3f7b5ca54c9f63e6c04383bd2b3fd75fe56a0c337d2577682e35f68ceef92aa99f927397c30e4dfb3a941af356943a34b9aa71223e4c912363746890fb5e43df0c35d7db1c9a85d8ab85fd6a2da52cad24464292da73c8a1d9c5089dee6efe7ff464fade4039597168d6ba4afeccff28574b993e76b2f234071c1a758efb23af434d7998e94b496f681623ddc34609d1e195517143a3695331d418b1c5e59be923c9a8b4a161e80fe1eb315de8bbf2866243d3878e8a5db7639e9513933534e7e4b73e7d7ebe981f37d4d034ebc669f92dc683d2491a9a76844b2d74f08f4ac44c121a9a8597bed2362e5a4ca7327286065567da6cacecfc58337d437833348ca13e3eadfc4a575aa30ccd35fcdccdf387cfa2562143a318e3618eab31cd67b9c6181a3f9b5a43cc5fa92f276910e41043a3294f9ba6eab60a5bdae31c61689ef3b611b35489e2c683a179f4463c0def3cb5e624434abed07c77cbc4e5ca1efd37c6d21de6f042b31663cdd0e9ef7544ed42c329f71173c44e4ab8d070dbc64cff97b19d291514821c5b68d0f7f94adedfeb0e1b234c0b8d2367ebaaf7bc2a574354b2d0ac6bdb5fac501dcb21255868d6b2454de9c1b6103296fc92e30a7eb411f59cecc63eb87950314da99db4d2328456543024898d4724898d5717e4b042c397cce727adcba4eae4a842a388f1d285f098a1ecccf451a141c88e8f195b8ca1c634d3d7868a9e1a6283c3941317c24a2b2aeb256c7c0611821192630a0d52aa4e63991d6d7df8a161bc8ed861e9d5f135ed3e34c759e639b6b6112df34c1f1f1a546a315cd94da574be87460f35ed393caab1e9eaa1497d3e93616a3f52bb988706694375309362a6ef5c0c7ce0e1003eee50041f76e0203eeae0830e3ee6c06951319f4bde16663a053ee4908aa7cfd9af1929e7f5aa6e09dbd74a48f5b28f3834ed9cb62deaed3b8f0c0e4da3b35f8feabcfff51b1a6cf77e3dd9da25de91a094a0f1860a5454d20c2e1734f87043838865ba6ff443cb110c7cb4a1416c2db5ee0a353bcc930d0d6b860af93762c6aa84d7d0a8b49811da73efefda99beff94a6480d4dde7fe25b0971d2d3a7868f3434df1a11db41957cea5a050dcd59d85a2795f99d2bd9c9191ad59c8719a2e5e82462a6efa0199ac6be1d7f5a960d993a16f8284383ebfa0e636ce172753234871c152a2b4eb5d8aff1318646354e882ddd53993e3134dd12b24efede18cf6fe0230c0dbff26749293b0d9d261e181a5cb70cb5b54b8b18d24cdfb6c0c7179a5f281d5d48932e66c45e68d4dbd7f14ed69a7d7e179a4ecb942b6ea2f5ea918a0f2e348dfd31ea4a95aa25847c6ca1592b3fcf7d3ae6430bcdaaa6c8d4ba561f5968f251cb85eaec1bdaf3818526f12feb648eeb6857063eaed0303ebbf2256e8c8e7dee053eacd0ace4a6ec1c576d71a1a53252e2021f5568ba57b962e8bc3a88893f92b2a239f04185261bcbf3b41ed9d7696c0a8d3adb9acef82a3b6d3640ce00a2860f2934df081ddd31bdf3acdb47149a6ef7967f34d133dc1f694d0f881a2d4083052cb860c2e0030a8d523e64980cb9b7c227340a53e9a5a41667fa9cd0f09d6aecbab157d7c168321f4d68d66f429dd0d1c1c61277e083098d4297ff487de2e3e90c7c2ca151d9aa713931f7229f0a6645e524833149c193110c8a8a0f2534c9ee34c5f4171f2b6b99be736b988c708f64349de83f5535c6d8e539c86890d2b3a7f7d8aa708fd1b0a4ee6fad76ecd262648c86155f3f2374cec94b5d8c26b1c4d730ad468ca6956aae8bd6234ebdd6309a53c49c9987f56a8eba87302e180dbbcfd4ec6b2715b203a3494d8a692f433ee9ac1ebfc876ec438738cf751f231f96125be988a985985a263d7cd1dce7535266ad472f9ac55b48dde1e164ec7de4040798e305fb51efe7b67cc9dde8b18b86212eea4bc7866ccfca481bbf464a52e372f15551434a80b0a00640540f5ddc6944ad7b349173f2596cace942da96f969ca0a4a498f5c347779eb98b34e899a6da68f67d003174d4ac7ae8fb2a314deea1eb768769d5728713b7ac7f06cd1f82a4c7a7213aa4593f7e99ede53db42873d68d1e84168a144fd8c8753259b45b3be25dede85e989a87d55549c3f2588104c087ac8a24175c49a37c5c5cc1272e35d70b930373ed323164db24a09975176626e8445833e19b64a7bdcf1167b851e74bb88d1b622ba448891534a4cb5be85db74b9a241072555e9e75c626eeae2d7a315cdde29bd85fd97a8aef56045b3fee8a2ee233c47cf7baca24985f21c7555cf895baba2795e6b6cefa98a214d059eb71fdf66ab2faee32654959ab15a2db5ad45458397cbcc18e2e263ca0d861ea7687435e2866c3532b636149494077b98a269ca3e354bc957f3d797a2715cbea9b03d13ab56a468b8b17db598655a9d6747d1a4c5c9f90d595b8d188aa241bafe6d79366fa8fb72b95c30add279e8118a261d79af6294891b5b7f06100c1035d20072c6e572b282f246caf21ea068d26988d74a94dcf259fa44d3f7efce8ceca8bdd81377dc7d51d3b9efecd93cc78fd4a1a4125379a8138d3baa7e1f76fe0fb139d134decfd38d31546bf56ca269891d4227f5322f422cd337e404f386c2bc919a6858bae6c9fd2c76e9b4b602e4784833d17037bae2222b26fcf5f23064ea12ecfd54f16e2554e46709e4cbabe9bd08a176d4d3b6b1c6be5b622646a747251aedc3f850a566e3648b128dae3c7a107e4a93683a25634d9ac9090f4f0f4934cdb535b6e8932f5b87d7f9428f4834ea34863e51361f2ab637861e90681252d57397d25207b95f2e8f68d4594d992b235c27d55f2e793d1cd134ab377385abac6d1d4ac9c8e5723272b9989ca80401c38d6816a936d2ee3b86cf8811cdfb765a89217c54d74b7995ec1e8b68f630f94f27c4b0b1ce2029af92926680f70c15c14ef563427fb76c59f74844f3ba8e7ab529aff5f6cf21a2b945d59a35b4e719b23e68821e8768f85c5b0c71ad55adac287d0d2e17963e65a487211a768a701b2ae6a810a8fe245a08b5e54d5b5a2a8f3959c1a08c08414579d083108e2e59b9159da33e8bcb6799423cbd340f4299be7682a9c1af11121ba01ff41844739e9595df26634f67e509a2e97ed550326c57b6589b9ca8bc00bf47209a3caa254fffd6f2304278ac07201a75da4cfb50bab55e08a9e4dcf6f8431f3d3c673dcf5bcfbdfbe8add6af6a1d5563993ef643738eeb0adb2e659b4cf5a1e95b6d55bfd19f569e3df8d0b46a57bbde17f3afa3d8c9193df6d030ef4adeea9a17cb9599be93115ceca107cc03e2a1399abacc184a8b213ca7c71d6ad0c30e8d52deecce8f10565218d4a30e77e94187dd5b5c3fcbc7113222e21d564c152f4c8f52c21e73b81e726878f9be6ef639f4fcdd230e77493de0f0eb60babcb4fc8606f12d45897821eea7ece186a6ad54ec5ef11f964cad3634d9d4629fdbaa569d5f3634aad0d51ed5af9f52231c7aaca1e1b6aa35d95d534e5820849393341cddd0430d0dba5d4deb4e1e67cf2483379141102118357aa4a159cadb7a6d61ea1e68681ab184c90d3dea56ba4e6640924a46d6af20b33292034c8f3334cbd7e3b29eefc3f776b93cbb5c7a98a1c1d6d4c390b3d3be7aa747199a4e893d4bf564a77d940c4dfe1e468496668f3134a708f1b1b7a25fc55c0ccd72d54e9f4edc6db721157a84a1f1bf678aa12744bf18181a648ba953aa98d0e993bed068a74ddfce23e60b9bf6f042f34b9b29a4926a3d64099372823149f9be94f7203dbad0870e274a3f9787d3d1e995d9764fb5a774d4083db8d0b452f5578f32a596abb6d0b064f5a951b123f42bf5d0422f3a08cfb21f77478ab2717daaed4f6a75b2caacac241422f4c8429347ddb6d7646c08c9a7a0b4f7c042a3bab5ce4b09a1ebf3296dbc095f8f2b34ec9c4f9fa24ded16626625cd40332b0945df5841ed618506155a7a1a2b7d868bbefd0ad8e8518526197a95169e3b2e7b9437563079ee3da8d02c2f42d854315adf4a465256fc60d0630a0d337446fba7995acebd989c985c2e25434c50167a48a15968e1da5b0b91b3e40dc80cd20082507a44a161e58bcfe9428c6e6543a1f1ecd5d45aeb385be8e9090dda9316b3bae2dd73289dd09ca3da58fbb3a30a19f20d6942b3af10add50d314a479741e8c18466fbfcb245b8bf243d96d0e4ff362e72e2d692eb8a8a0aa187129ac66c155da75d98af2b194d43eb6842f687e55f23321a5f9527b157eb315afb206ea3c693f4b4716a49337d2529272c28493969c8184d23f3967ab5258f623449f5f2b39518a1a4d42246c3db8e37942ded22e7368c662deb67b8880d69532b8ccda3e8a7115a5e84dbe7dcf15f0b29845a301ae4ed94bef283cea6837800a351edbb84d99a2ff66c993e9511bf5f34b75243acb1c45a6a3cf545732bcf364a3dca3fa5ec45a38b0f7284d2526d39232f9a3f47d15aa8215fa987c72e9a4d8d18adfe3fd792eba269ade8539d9edb847b3c72d130f58c175388b156a8170f5c34fae77cd6a664c6f3768b26b1ba73b8b1b6725be237520e4eda504379d8a2e1cddf3be7953b25f748ca9c71b9f0391eb568d05abd34adf6ed18624c8b865b23dcd6c4fe78a7348b66b17492766a5cdbf2c8a2b9c38e6253cbfded8c63d12cf69ffa47f78deeda033c60d16852b69758a652a6cf2724187449456564c52495f81b2b2b9f82c243de40018f5734e8245d871d65aa4831dd0c0f5734b79a35d6999ea9b1b55ad11ceac30de14a979a5aca8ae620ccc4b0152dde21cb34266505e5dcafa49593145e45d38891a6b2c3dd1aaba68ae628759a4aa81726748526e0918ae6d635775c2ca1d253cc5dca1a51492ac04345a3d2d90fd23efaaf4c46d678759cc7291aec958ead7368fda9d5f246c0c3144d7f72a57956bd4a674565e4a00a7894a269c5f2acbc4faab5b4e7f02045e36dcf4166f4dd4eb174f896a6701021980ff01845a35053a673f73cbad845d17c4bdfcc730e2f2ef4a1d8eb45c9d92879f3b82aaf66ad3daa5f85aacb03144df639ec9b4f5b48b16f3c3ed13022a51aefa8839e982fe0e189a64f5b326cacbebf25e5d18986ef95f6f17316b5f27102ad3bd8d8aff6c5c49b7895d2524df5b177759826580fe92aa6fbd96e5494a74b6d6264c416faa7cc4c3488a996ba56e7697a0e85242531d1381fa26b9e4b79a1522eb844f3adf74db1c57a9d93259a932cb73f114a8bfd7c251a56f6c6fc5343bffe4b8994bdcc9be3a37581e780c7241afc864d19266bdd1629c99018f09044f38bfdca4c2ca5b5ec156f23d1a4c4eba01f656dcc218107249aa40d51eaf144d783148f47342cb166ec35a9f37db53c1cd1fc41c86a29ead494214dde4634eb5743ac7b9a871f8f11cdedff5a28d51d3f8bd8229ae6c76fb7d7b86b9b4f043c14d13032c5299b329488c6f11619a15da879db55021e88681ee1b7ffa2666c8cb0e6c51be8f2384423a36b6d31b7c2776608bf83885d0f5317db8f36aa5bce862b6563a21bef82946fe3248de55188a69731a26c8d95628b140f4234cbe9bdb56bb7f630ef80c7209a84d9d86aea271935a69fa22b43507808a2613d7908dd235a0cd7337d184ce3101413345452869cb1051e81e0d3f8dfcb9a5298a8c203107a88a97ecd8a8ae7cacbc74b31ee363cbeeefc81871f9ad576ab4e6a2821fb42970b061182c121061e7d6836b922bbb657d4522a1f9ad7d6d9ebe8f9a6fae41e500fcd216bac6f1b559d4d9b87e6e8b36acd982dbf539eb3020f3c34b810eab4d67b653364776829a5b41032cd472b91871d56bae6fecd6c46c85400e40c20290032833480701d1abdc61ca5e3a935b53a1d1ab6d99c891a2b4cb7d41c12578ff3ada33db9d7e9a729fbb31095ae3fb93ce4d0f8d294c74e23c6d6f93ce2d0b0528a8f2f6a8dd827e7018726f354dba5deccab9a3cded0a46de5f7890ca5660cddd05c1ffa5d0b7d72c6b697cbe582391e6db80b0f36347988ef966acfba25a6d6d0b0f5f553c53c795bac79a8a1713f7b687153ad33fde2918626b14e2ba5defc66ed78a0a159aedb586aeaf1f0b1924719a9c1e171864629a7a5a7b079ada319aca89c9c9192de64248dcbe5722961e33128ed8d95cbe549504a46549cc0c30ccd9f32bb3f0c31cc4c8ef1c3609c47191abf3f6a0f3e1e199ad453eeab1b9d31340d31c2773decef6ec0430ccdf949a77bbb1852c733f9450cc2230ceb7ed8a8cbcdd9d9e97878d269dfedd7f76298691b5c2e97cb6926f00043b33295296bd355e738fa4273e8ec27f7a7f59f4ef2f042e3ffbeaa7d724b2825e4d18566a162a6a9a9b48cfc8d07179a832c152f29d77576178f2d349b90d74aecf84f256d1e5a408cf81c45cbab9bdddad9785ffb3af5639ee39185e6d0526af1664a3cb0d034649daab67917fa221e57681abb43449fab1e15210f2b349ffad8f3363c8f872d8f2a34ba56b11f76aa7bd4ba5c8cc0830a4d4be91922fdf52c1b3d63cae36dca9b980c49e1123684f09842d3926636b6f63ab48cc6e512061e52681a3afe65ab881af3711e516856afb5ec519e52c7eaa1d06cb6726c6dace537a49ed0f8b955c452371d854b7938a151be8d90e5afd4de18f16842d3f0cea2aabb6b6b6a1e4c681c5b61525c4715ad6326cf4673b938e6782ca1619aeb919b0f0ff33f0f2534c8712163289b9381b8cf2aee35524577c7dbae3531ad4aca11436434e8d629d5e8cf0793af12761ca361b6d754a2f29516e93246d3dcd23d29e26608b19f01040d95548cd37399da887bf8103a4e62347da7f4f793396aff378ce690be62be986ac7a78f309a5544c5e928a24c9f0351a305402e97cb25180d4b8dd8a8faf4e66128d3c7f6dc312ed8018c865b42869c3071e2e593e9e31b8239594119b29e0dc45f346c77257e5c75eaac749513141becf045a316f2d32ef59fa5a492c45206d3c6490a3a19ece84593efef697b99627abe9f08231892937570063b78d1f4e186a7d4a3b4d92a189221252ba9242fb3924af4cff12e1a1dc66c4edff5c4837cace8707db19ee30ca32ba5381e1a8798bd2042306becd045938e8bfa485b4b0a17512e1ac4cdd1366e62ecfca8c545738c293bb5475bda64ed72b95c1c73bbb76812b14c948a1629364eb66814ba5d854e67a3fb692db4cf6974c8b87b3077db39ebac5ddee71b2d9afb54acf3ecf1b3fed410159d4573e9153b4d21fb64754e91457398f35f4fd967fa9024a382c18b45730eb1efd64b39b59660d1202b6ea6facef26cfb7e4573cb08f55a88e1ca6d9922821dae68d6f7f46208db4f61efc2563448951d8690766a4cb54f395634dd4b4f4bfd4fd63a55a60f08eb21403e6588ca09c902a27a08108ca3c9482241c1f3c18e553477184a7e89e88d9a35a77c1b2728eb3b54719741ec4845e3dcfcc7102647d78cc24e4a306fe00976a0a241bd6fcc10f6af56b599be3752bee4648d15939392735b821da7681c196eaf45e529bde4534abe06a66856f2cc55b9922fe58bb1a4a5686e254f8dd95353e87748d124462c17420ab12b672dd387e18bc18e5134ecbd505376e915add344d1289f7f3a4839694bfe50347ee975e53a8c7d9d45a0d04499c8d78bb459f7f89ea74f6a21dcfbdbe34f3499507bb590aeaf68963ab7a5f6205734678fe26ccbad15cd3795f6b231af6ccc58d1a8c68fc9307552cb6c158d374cd9d6e642d565aa681a6bf828ddd9cc5e4f45a3107244be32a5df744745d36b15314275763cf75334ca3e51eef99490e2ba299ad416a23ce8de0fe3f352347afade6bd565aa759c14cd36b5947253cd3bd3f1513468a56bcf6913d244c745d1a0869ad9765b7c9c5a289a4ea88f2e550c140de73f336d09dddda14f348b2e29f5a4d4dd3aee8966a5578bad1f7396bc3bd11c464c8de139dc2b31279a73df8f10e2a73ac49b682e293bbad22d45aca9269ab48ac7172f33d134f3dca42975ae366c4c34cb3217a2c6d7976858534d57b6e48c319db6449398aa83eb4fd7fab34a344c6d22b4fc52ea654689e4fdeda8c6b426d17c5328bdaa26ae77924473523b7ffcf3b46b53241a7ea687f5a7f6c48920d16423577d54f9231aa558ba540935edd4d8114d3ba80717917a95741bd12cefa532bb6d7d1299114dab5ebfbad2f1221a56edd31d76cb9ce958114dfbf61e64fe0a95b6443447cf3964fd8868fcdc3998ce2f2bde3a44f38a9151a76fdf92f51aa2614bb9eeb16cbe68f516a271fcc75be897108d62c9d36a9cd63a48e90ea2b9d545abeef593fdac201a6cde14c33f8b97f36c201a6d758a95e53a6f3c0b88861fb1b4b6ddf954b7fed0b0b7236b5da52c35e58726116aa42d551f9a76f254a1d7fcd794f8d0a83eec6961de39a6690fcd296f9887a5b30e3feba179f7f37ea71442959c87e674e9ff51f53c6dab78683491d3a6376adbbe7a87e65135b65ab2865655aa1d9a5b4ea652c2d43a34a839512a5edbdcd5d3a1e9f3b7e7f793aaf46b0ecda53dca979e6498921c1a658b4f2d4d290e4d334fc759b977fb263834ad987e2fb7dfd030428a894eb1f75da71b9a6c989a9aab10a2c5d986e675b171a97bb2a15989a9ed64cf9adabb5c43d3d84a4dcf3a7efeaea9a169f5cc5cbd3fabed4f43a38953520a9fa1a149cd1aa6cfc5998aeb0ccd5ab752b5d25f4b4f99a1c9d4e88da16fd4c9bd0c4d3adbd574ec6c267632e041edc63134e87cd471f3b69c52510c0dae6ecb116b5d5c0b310c0d4bc699cd07110c0d26845443fbea4e8f7da1c9f469f1357bb776cb0b0ddb3cffeaeff4d1545d68fa18d7354cc596622e34e9d2619ddfa71dbade42f3799cf526a5ffebac85e6a4a527a53ab700908566f5b25ffc7dd5ceeb01000bcd2bbf6ead8b16f6d203c0151a565e0df954d3cfa507002b34ad1d6a9514dfaf4f7a00a842a3567f9ed432b937eb01800a0db2547e50afc398420c00536850e21d64f9fb2c7f01400a4d7b8530b1f6f6e5260044a161ada1460bd942ae9003000a4d26735fdeced47c06c0139a65493f3f2573fbed0a00e084e6579fb9bae5938aad15004de896da9d570b1fd5d14cdf13e17fc81054ba07006002eeb6f369754545c61636d5bef9c2e63358492b36388879c36464e500b08426bd11fa25b2c3db5f00504283d436f5c77d6d0d1ffd4846d350b51bf17d9dd2761564348d25cfa5e994ae4f6c21952afc38467376a14b4e7a77c1a0a41fc6d0738c875b6be62ffc28c672a6183aae4a2df62631102ea3d3996817311b0f5a84974733adbfa4e77af06318cd9ec4d62ab5add2d941c26812f5ee69def2ffdfa9e14df8118c46a5b594239518f6f97a6034aba9d39aed2a955adad45f34cb1dd1c976cc3b7111d9174d62e908f1dae9213e7938f8d18b5d4f9b4e29724b9af4072ffa20c73bd43dea7bc979cff79cceb9db18fdd8459396bb37a27e4e22fcd045b30e2addbf93d02e6d7c841fb96856b14af58b7857db114962c20f5c34ebbcfa7594ab5bc7ca6ed1a82fce4fad0eaf79b62d9a4d472d665dabdf581931c28f5a34ece4e2a5abba4ec4cc6444959c2c3c35ee8d9511364292d838b8831fb438af8ffa9c3d6c164d729ff4ca50fb66d94ea67fc822b3fd641fc48d8dd69bf9fc0e63fc0b4996f02316cd49e972795acb1453cc61d11cc587281d3cf8e3158d3257eaeca25beb5475336505e5872b1ac5f8af9b96523f5ad1b0d76c99ebfa3f58d1dce17b555e2a88104c127eaca269d7c6a5ac3543dfce213f54d1a83d4c1b76a226e4472a1a869839b15aaff87042a868f6bf21e5998a0fd23f45b328d9f1f259ba49577f98626f11e2410839da5bb4d8cd4ffd2845d3dc166affec13aeeef48314cdfd5f9f3c9abe162e4c24fc1845f3894a912396dddea9fd1045b3e8701521e50cb175c97d3f42d134e527f1e0d9c492a91d3284c790a42143680e281a676c9d4fdba9b8ff3aa5b95c52ca9f911f9f681663be4df794f753eb1a78a2492935e42bb5863048053f3ad1a46d8a15b78654663a73a241aded8f7926556cd5d944a3ab185bd86ce129fabd5cd6c8e5a2f243138d22d25f57796859f7fa9189e6b44fe88aa858c26cf503138d5acd5642bb702567c33bfcb844931c4fb1d3ed1695a6648926a57372c68b133f63ac841f95687c11b6d3382dab948e9ee007259a6effd8ab6859f3ff249ac5bcb3d2c98658aed424d1e8bb6f5a4b8f32276f91681af94a67cff2e6636f906834575542bf96aa5d6f8f689693d2d3549e239ac4e5a5f69c275faa1bd1e4325dfe99ab16b9364634ee6ccfb9f3ac32216c8b68fe93932be35cecfd8a68d452ed3494baada48a25a2414da5f6ae8a17f512221a6e87f7996a8888930fd1ece94d2c1db66f88861ff1be62c50a61d22f44e3baf8d0b5934f886675b15f07a14246ecfc201ab69a3ac6adad225f1344b33c25d4d4d465b2fa4034ebbfd759a9f9f8ba0744b38da14e86a8b1a510fb43a354b5ed949491b2a6fcd05c2a4f8ef894b76eaa0f4d2bcede96ba2df62af1a1e15fbb4ba9c5b356a73d34e7e02fa5186bb874931e9a96ce99763fba6facf3d034ba86bd6eb1f6b1c643930bfd99af96776898a3b4161e860b31967668d4f95cab583bd594671d1a54a8d09f6c27932dd2a151edf82e4c7758d76f0e8d4a8db972d6934393aa7d7fd9e3757e1c1acce394921bad1e0487c6d737135a7d67ad73d81b9aa456a69329b5e58626719ebef66e6d681262691b4b0bed59c8d8d068b3f34c2f9b4f3fada1e1d653aa95e9390a911a9a65ab9442773a551d4a43e34ba1cfc51a6153cbd1d0e0e3d2cd76126be97a8646a59496f3fbd976ac6668d86a7efc209688ba65199ad5db1651e1a9652cc9d028a6dad69de6a9bd730c0dd28590efcef2598c626872b1834821c654b35d189aeb6f3ed89642c7e8c0d030d6b332f927422c9df58506a9478b1d67e454e82c2f34c827f9618b28a53f6775a1b947ecbf9d6fc8d8352e34e80a959f297ce6fa5b686e4f4a67acf52a674c0b8da61e3c8a57f3a9565968d29d94983d6badf913161add63a729c5aebf2dbf42a3d2e752ebfdca5db9151ab59ece52765b85c617dd3fa35fba16a242838ccc79bdaff4d62934bcef7cac4e0acd619acdce52ffe6d128340d9162cb3aa1fa018506716baf8bb0297ba3faf18466351ddb4344273428576a3ceaa927ad2634aa3d792f544731a169a6ee94a76f3f96d0382ba4905fe2db54ff43090d2744658cd2b5c6f4c968124a2a3d3e6abef619329acde4e94b3d275267c768d6214e4eeb303d4b256334e7b46349f1e2df75a8180db6e475d22a9656532746f30aa16abd52af6ff5309a6b6ff62b2dd656ab164683e8477df22a3c781c8c0635e49907adcba44781d1703e528c8b8b97d6a55f34cb53b353a68ea5a327f9a2f9d6a49c1099abcb937ad1e4f97af6e8d241a98d17cdade2c6aef5a2ddf5bb68d01bcbddbd3de7e0eba2c9c4d6bab55c8a7eb15c347a10cfb95b7d2b335c342c5321de3aec160d3b68bff1a257aa31658b26a94de59ebe25c49d6ad1b4e36eac38132d1a94685b3af7d5523d9a45838a8935f2a68cc85b164de222b5ab10fa3fdab168baa9d46b07fbb3358645d39e73551ec4d4a6f8150dfa6397b8986ab8902257348cf5276675f0f850a25634dd786c9b31225634ed9b26536ccdb6e9f255342a61a34e6fe8ece472553449d1a7dd66958a66db518c7ed33f4a8d1c15cdddb6444c5479ecdb4fd1344fd78921d67df0d84dd1287eed6e881f331fbd144ddb447c4a1d847e123a299ae3eb4f1e4b6d2bfb7c140db7c3e7d6f7bb0ecf45d1604b7dbe98e9ac5fc743d17c6389edcb4c39e3715034aa8cf7cdac6dd26c9f6858d7dbe63a75af4a79a2d9961653c48bafddaa4e340a1322fbd42d61fac489861942bd4b2fd9c29536d1a4b3f4301fc4cc4b4813cda954bbaa33174f79269ac5b4ac0fb1d4bcc831d130a63e35fce507f1f14b34cfc9f151f2d6f83cb7251ad4c8f5ac64a88e9dbb120d27af6247e4cebddb94681a5295c7d8b327d13ce3c5a8b23b91ba6c4934bcce7be3c977750e3b120d43b8eeb044bddadb35241ac49f9ca831d3e6bf7e44e3a97f4fb142b47dae1dd1a8f3d5a8f0991fadd68806b5defd945ac3446b31a2f193de57a743ef4da945344bf959ada94a114de3958c3d538db13e2911cd59099da4fe7fd4718488869be61e84f8d471f7219aa6c88e8cfd2db56d4334a96d620a9df6fe642e44a3ee2e53a9d37fa997104d3eda576d77214c5e1e44a318ffb7d5b982681817af9412655ac41a8826a9ef5a6b6543995401d1dc9d4da99bf88b52f90f8de32ac48b1f994a2cd90f0d63092974b42552c892fbd0f0394ba1941e317344e643a34c31c4d5e6dccce33d34ec30f9e0ba7352e8b01e9ae38de895a3321e3c9c87a617436fe59d50771b1e9a676cdb6aa6d81d1ac6ab912fa4a7eddeb243738e6a4891a26b6faa0ecd1e5cababf0545b488786a15367d79d14f7a43934afba2ef1a61f234272686e9b42e62ad336a2c7a1d983b86951c3610f59a2d4ba6f6850bab36c76a8b5d27643e32c692354d65b461b9ac6ecce796ca17654b70c3634a99d5bae66f77f2eb78c35346bb719abcb964e31dc32d4d03066f776c609d9b2db32d2d0e8f361de58f356aadb32d0d0acb59e974a8bf6999d2de30c0df2f4d9387537864ed332ccd0fcf24bfeb8d779d86b1965685a724fca7a69a2e66b1964685aa9ce4654667e8b69196368d6a6754e3b4cd739c4b40c3134d870a9960e193b5ca66584a139eeabf6dedb9d8f69196068fa30d46f55a55cada5657ca1596adba3769ab327b5b40c2f340d8f7366bad51af3a56574a1390bd5fb9d640a33212d830bcd763ae830b57c0bcda555c998992552e55a68d0da7c679bda42ed7016d037b2fff568b1d09cf3c956ecfeabd15ea14908d7afd3ac0ebbd50a0dfbd3bf533f553e5a85e68eaf3ea5eda8d0a04dfc0afd14eacf9c42b338db4ba1d1455799fc7f31538c42739aac9df7f376a91d149a65ac9d71b327348c58a5d36ecff4c909cde1bcbee7dec6434d68d03356ade1338518135a5d9f13671f2d63090ddaf64c9758b1d2ff3294d078e62962eea8dbe14f4693ebf018b33bc868f2bca2e58aff9d901da3f94e44ad5dab5b87cc188dfae12ef7eea6d45ac56892ed294c6731cd4f458cc64f37eee93b3ed4348c86b9adcad39752180dfa842977214b6c15ca60346769f3f68e88d75a94c068fefe382e6c7e988bf2174da2c3e7a7dda7eff2f445933ab1d30d93672f9ae43fb5089d44771093170debb4d025d65a22668fbb684edadbc6aafdeaf951174db23e9634e1e32763988ba6ffd299cfed2e3e86b8683efd533b9ec66abde32d9a6dff3d56ea1152cbd116cd32442badc56a31a61c6bd130e39338dde26163475a348dd69ea30a1362cb8eb368d8be7b4245b26816d96d4b0b6db7ec8e45f3e8ac4c99c99e8d1516cdff2b627a33524be52b9ae4a608db2ec76dae6894bad45afab6562e3dd88ae6342d3fcbe83464ac68121ef2697fcbed4e5b45c3efdca71d22f4faaf8aa65d19b374c4dabba7a27974d869d8f414792e5434dbfcde0f33dd734aa768f833a1f2e6bc101d99a279946d15617364c6ba144d7baa6de4dd855c97140d42ba6b512f37863a8aa6cf49eeb58b5613aa281aa4675b677becbc86a16832a97396d24bb8ca078a86b5f5bca83526a5d0b94f34a7a5768bfc0da1a6e68926215669116abf7eb14e34074f3bb9bf7bb831279ab6fad790d1e2d6f037d1dc3ad6ce612ad39dd744b390bf4ab8a73095b14c34aab1b2feb1ae86d4c244a3ffb99a2ab69475d5259a5379ace5a2750eb3259a84d80f62677925bb5489e6fba07376a48e5a744a349adce8e79152ae6a120de76a9558d9ca75aa9268d6fda8628d273d69249a3b8ab88f7479f24b4834e9db325687949bd5239ab3d61dccb3f00e1e3aa249f778caf99e554b8d689631e6f6fcf78e9611cd29d78614dd1d1f8b685275ed3b734dfaedf8504493f7ad293557a8d717cbf4e9f9f19188e6dc25ed76da6994ed88b73e10d1acdbdc74f49eed1ea261cb9753d73aeeabb1a68df0618846a5b6dde98f58033432650445452f103e0ad1205a0db1a6564369d13542347f4cff1ba14b7abc6b104dbabeb63dc96ae9fbfa1044e3afdaeaa44cd8fcd4aff808447356539458524ab52bcc49c33c448068d22fbdd63f097f97d71f9a66afdab6b1d5861c9206a894ac27a40249240e05038130180c08a45e963600a313003020242690c6e30179a20bcb071400065a524e542e2a24220b4423b150200c0443818030100aa2200681280602300cdc203a0bca05a11300883c6bfbb4a6ee857034efe9a43142b24a71144926c481f695e21b3d567b85cbbd6797fc0a5c0527f398128b6c202a712739a40f5c7a144527698bc469651f4eb41e9f7d171e8c1386fbd8fc4932c0413e529b3b092b56426e1d0158dcb68f60a4d888fa6b3126da18883eae466a24d24bfd28926256c993136ec7d9cab5e177e3b53816376672121629077df8b40b0a29c5fa28b70864247535a8b377b119761a9746a99152d6943e1cb083a188ca8a7942e1cc369e280e72308ec4ede2c21b36ac15fbe8a204814ed17c4ef41802a069d78857e358d85a2a7cacb629824fd7fc5034b033370a879368510c359037f1a565924f8cc136fb78876957846debf80ee5fd2a76187df8e182065a9b82d9d0778ecae1bfbe0cb9d710add9a04f0b601a04b24f58784a5fdc58ace237584c071c046952e7e01c3dc5bd86233c904cd5a1d28ffa88f52e16d0bc47c4aed3fa2dcd62081c4281ab41747f7a606d89097655542b2de8a02470c2b33cc03419e0eae22234d2801c0ffb0c7864729623029d97bbd724c083530631a052140fb37a0013749e85f2b04852a8c121e901f0f90a735d89946371bad37110206168f812d84342be9f419200e464b86d212ce0908e4edb225ca4aa72c2648e8fb111527ecb01b1026bdea6e0210272fc2a946fc728aed49ba40fb763ccd4ed5c8b6ea83805818921da15390c26462cc0e20001c22fe55986a78e6174b842241222ede1afa9d130926b65d927d0750e867194889b007d884710c01ce8a474d19ae04ef400bb8c25d8486e32d3c8c23afa6c0217b5a53af2cc911d8730c4303a5467e19a090010d09623203548fabb81686d4cd2cf2663a053fb3d54fd150fe0f51eb587df7668fb5d03d976dfb77251331c05a73be6bf83e2fe3e8eb62ee26f156261f07cefc713f8ceca32f2d4aaa2b0b214c0bdff492f8d54f8de6eb40205b2e45d482924f2d1d1c8fc969b958718087fb64401620e1c3123c6645774b28191ec2b809c138b5d3b321df37160a36310a220f607148ff31de1c356d599e58649f19f3874ff6277545ee2aa11f1e6324230d9a5e4fb20aafdf5dadc86cc04a5775e65933651bd474f8c60396719f28186be2dce1fd4d46256ffdcb2f9a3fb138333043881b54eacd48f8d05b5af39439d13066f0b22d0eef2c9b9b3356b1c2392d6ab5d7bcc178b37e8076904e933bc33cf1840c1314a8ef5dea61c4cb184084323ddf771b6ec8e03f1f2f9b059323ca9810ad1acac0f8abadeb6f267b06a042048673ff69c996240ea2fa32fab61eb4617a093b9e1fe4de8ad3ca4250a82bc4397680a2833864837184fac10b81c15e38ab7de549b1a29d5a21d1f45bf6bb721d245d5bb0497e012928bbc6623ce2d210079769bf41e350151f86ec269795ce7cf45ba6867fc38b80da798cc0c66d71a41baf687e296b8a8d83e0e83ab33d9a840185c2a52340e35944053ab3aa1a7f2eeddbd5497ec023c1d07e35e9cbee3f9645ff42b7f5e0c872648fbe2773e5c848b7946c7cdade9c32ae07e30bec1412a6164b29e1a4138b33345b419d0af0fdce1d18c1b43bb2ea8accd6d6c2329193e5e58a240f22fde19380e6ee7893a36e7e97abb68932172faac643ff8e7ee3a5c7e32ec914cab738f824bc276288b45a2e9eedfba93e0803c2d8ba31c29ec9f325391d46963a60eab7132931a2951a391044306d49df2499a58d5efd3fbc13f1957e2ba38bd837cafa69f78276525410a02c155972a089d964950c25c92aff5e5dd76fc37a0543007fcfa3f1907e34e9c6e46a60531392b2be2be884763472488f890044553297954cc85a357feb126dfc1b42a689460eea753da53145e436f32221d68b438895b9d026d2f9569380eed4c1bc4113219133feec33d7f47e4811cd3e9367923352c913dd8ef0ba7f832dd879752909abb9377e914871701f732693cac1c7634c2a2a473187847376cec2328cc697850ee989f0ca50a6ca269c38430522875ad16982afd4ebb0b705d5ed5a566662d6721484e6b94444128fd09e2b31c5fc12048aa222302a11f249ea0c9943aa634276a110b62fc29ed56bf025b10ed398ab5f28e807d90721ed4b9b94ed79b494f0877e074312c25c59ab04ffa64d072fa29701c98ce8cba36e62979b3e9298211482f2d0b93432abf1a031027b826ca66104465210ffde3fd7a24614fb22bfb02e1486d42983e4733bd487a5442e17bf32a4ff91f4e225eea85e08c7e3d3918121fce12bd898f2ada84056bf960cb144da9275f3197b3a15bd952db53387f07d4f0d411333843de0e2b19ac45bb5962542a68f344a9f08b5dd2665af08257350aac0e5c6d7acb57861dae89ab7c767ab93cbc72e0099f470c6eebfec444c788f0aec42d51d168a10a406d4031aec1c516b0482c72443fc4677d691f75152a3f1d171391870941b9606dc482a8ed5a8304600dca398d12ef10c271fc76423df59d8a3a959c3a50d513ef6a7d0c39570ab20bb3c336b02554b0e391fdf08a61fd675559506a02e22445239229913c15485860e8047233940efe5110e234490a644a723ef647fa4abb09957741a40813dc1e247acfd9dad45ae155797f53737b17b0717a7394c8a1abe0133bc99d01ff808f6858e1cd6105ebb8eb3f48752f57d5b1a511805e3c59a5ae3a9f29f62197462ed15912d64b213774808efa72d7aab6b369a209977cdd879b52478d1be9251dc24c51eaff139b0824c2a0173cb4a3a62140400aeacf481d438e5f37e29710c7b58472a7515d19a8c02174c2f8784c43e73d69b1fc6f8a0a9e4b285e7889c083442df25c95c7d55301e7031b3846bf4289a1a8b3f3200751e72ad8ef867a5f3c88505be0fa5fc8e51ba2b9faac2ece4434cbdf4ac916a702f239c3f8286d4d2b6c685c21945db11d06c325ddbbab3b0049c52f13f5c613a1509dfd6a7f8cf59ad21c0ce9ce4fc5efb4a6a628f114787fac4c9ed22317f2315b99a8edd3d4550174c2c52047d8f206f1ea4d42d206576b458f2dfad5b97ca35e187495dad6c668c11e138737be0c6e822d568ca4f26401ab34c088801b83c101736e4010ec2d5dbc127a6e6eb8ce85ce040d04071fe8abc16198da542a2997b218a52f67da2407e11e3168f673bc384749ab85a81bfde2d3653e02d3dace46d5345a8815468361207ad970514cc126fec4c042daac480c0b06876c4149016107b1f07cb9ec72367b000a8389536ee1d092feb37c2feb10143e1a130aae6e0988cd9604f1ae3a18b685bdffce8d514f0ef044abde864ec448b36926031f2de66421e03388e9970e30d31a491d2180da8728f9c360a728308e65208d7001d80dd1adc6f616cb7220dcc7ce8fd28231b9e26ead00019561ed5720f47d60da224d8e0ed92e100f3bd5e0ca6ae9dcb81e819155d804189c41c401064c6b6f3fa5a730a797bc34564d4ee9c26bebe016d458960a380ab67a8134e208594f01082f17264da821b448a00817ba945df490550b6a18c1df5a75ae70bc9fa1efef3a8d7ac90e2af9f5715335f4083f8859dcc58243bc1942636920d709481e0a33fc8596340412a44693580328ab6f8b3a7cce8e921f2c3b6b2353a2e1b992b3bdd0d077aa818696ed139f1e4024736c86a2c1c9b023eadaf5f5226b5c9402f055b214dce1d0ecde9c6ba7274bdcfb28e9066f5058bc93972b818bab4b7a1e177cec83a3050a0eda6f98ddbaf4873ab369f23727c6ca0f25a5294cb8d403de4d1caf1a00c6022c3503492bd9eb335850356323ec979531067a7eb9261cda88a51c67cbb3963235511fd3d445b24eb143a1f21093003c8c27dd7523b8ed3e8c8fb49c5b7500ee66ada9c6878ac08da2e47de5e12432e8839116335a838b6031e97bc6a119897029227168a0d74d07b99bac89764c1de2f36c981318d713888e51c706c88219fb80a24c2553cb63a945cd53e9e2ea7c0a02c738416b9d13bbb1055c3b2ebaf0cf45ad42cd6937db9892c5ea6a0121b3aa1b7e4035f2e8572b3af087bb80a1d9dc39087eea2eef69b7c0d27781d1b122f18dd9e6363bf982ac61b9078c275823f7dbf2d5fb93fc65d8e2cc5e7181ee4a72aec9126728e8325c69b5366e60d04c7c03ba8c61502f4fdcd96b98a93c8723d72e4d423d2a9504e8e267d5e86c2d72c25e51598251b4546e9e36ca32e0225172b58881a158c43341257e61700bf9c281f9027833406d0c6dbbe24b4277496627a7ee5060580abf72b0566b6543386280e7f75d842300753a785d284e03c423a2b1fa04cb7982563a350b58ad9eda6595bdb59750c058e06d75d801774d8c8bcc003186281f11ff350771d2aa2d3f0dde1ba0a961bd5ff4723117d3bd9b57eac2cbdaac663eb3e38fb9bbec84fca82cee5d12a8be7fe89ffb578fc5fc72edc221c4173da0720e86ee53d35a8ac990e864ce9f33ccf1cb998bc31c2ba4ad01d9d9d092bc2f7ec00612d33810a4d95a36d796980bf79ecaa47f2ca383c4736de93c82a811bcef38c15bc160691761b5ef063a76bd5c40504c53ef628788784440c16d65f260912f182cb63ed5070ee02ccaeae3ee41bed6a1e4787a05d2ea82f9b339027cf1abe1ebed2b7dfd2476c78a6c17461e4d39e3b620e29bc2011f2b24c72680b30ad9e33095fe3473b16f6afa83726ad2375d1974bfe0c026fa6ae3a553cdc54b27b935dff913ec0c64d200d4f40a37a8ae9c313e9e11954729006375a3a4ab4704696514646b23487994a032b08f86050f21b659215f5d634467e9e9a7e8a06be9075ccf448554da0e6a876cb1374f4cd768552553848e3b14c3ca563a3f3effde7de7c232838e5f34be272286dcba16cbf8962a7e5ae501393f0de9dbbe5e5741c93c65488644231b3b7872f1e05bdf2f4fb859345e4d0ab455144442b716c523e48dedb33ee11575545bf8d03d64208e150599820e9f235429447cfe84712c5e48105f2e617120257355d305600fcc2f7b80634816da99612e55c72f8e1f063ba6b810a26c1ee10d7b243808da0feb961a11b49963766034fc0485d8a35a0fc446ffed2a82a168260c8dadd12b6137b420dadd9d1e3724045de337ad99484a39567023764951e62f68bcb8c2b36b2d48e4375f78dc9943fce7abd1f710a40991f40bf081bd265e928a9b3b8fd583d5d6c8b9448ad49271889f3f371a1daa8c0d4aa8343ce94f3840922ea18a85ee97294339a05f75d12550b1f285783550a388e66d9c8e51fbd6a17f526c254f6c2fff329f27be458fa09325a324d217560dccc5278d9b9a050bd4adc2fa5804402fbc90a35e27e0bd6e21f1b847cc251dbf1a2fa386a7dd8d0eb191a9cfcd654c36935611cf16585b372bae0a267d317b9b6c59a018be3ef8289147d81aaa95296124961413689951f63614cb8f0343564f9447f88e1c4627554c16ddac4afa2564124de3bb2ec88a26f094bd5ec8bf5129c8c295421dc555478f06c6193a6712c726063c00f98ef49388e21a21b17721f782bf1c42435705363834686da3f8176bd59ec93bd8dbbbe9652d314e4ee83e5915b7cf50756c9fdea618bffaa22b3a184384d858897ec85782e891e2843a807c0caef5064879fb0304e5b0f1c96355a65b5b044ad1716e918333ee8ce4effecc68af77d8712408d2d4dc8dd3128befd24213dc18c4cdb92ce013ca81e13d9d18a80c1282449ccecaa2927b652bb3ad47400a1738edc35aa6560dd9d02e74fead14695b4bbb98806961b46aa114ae853f73643095631800e83301b4218d2e9b80e640274b75f69b1d4aab3d187a4b6dc8413e945adbe120c7d8d65eaa68f75f82924c42d030451fe4bd448594d7342a632c0d5893b763b802530f8c9f4b3e9c95097540ec3f6394ec4e235e13264b0cc795f6302d722467fd3253110906de5f147099f0bc7108874bc5acf767a8cbc94d258e85e8dc643b3b8f604a2801a7d8586424a1ea568a20136e5b1624e7840999b1b33c118743ed45196a922785a5f9ee1c363d5595da460c0240a1fe0ba5a2d9eef6ce02d074817535d4f2e2202581df99df2c77ec3869ccb24297bce9aa65b311410be277ac6d01007179e38b7aa41027317f216282b98f552677a9c32b979b35c705ec99d2e9982e3caa30524becd2ff641cbc303dcae20ddcba69d8a55f973af91932de470431df44cef14f2d7d7361af2ab7f8bb3f7f5c15a3dfdc60363b3fa8373050ba87b5093093c31249de4352c3229c9ac620e87acaaa41818641331aeb0b4c83d4a5a7f314d418a030a379cf4a90826fc130d50e86ac576d53ce57ab5d477e602512c2b1e7afe5846e1a417f4da0fa13207cef274d66da1401aa3e9b2da882123a4a563f5f3254da78278f61be9924fe7e5207142ad9ab5c798185ed19d639fd3732c515c6f497588c8e1025abc99276329530759120089030ed8f87f8be410cf5843b680f29b971e7833d9d5c0c3d6315485de85c69a69a049a8f1e3789ef2ddc1d4ba8f1e28de47e021450de27cb28289bd40df023211d08e61ff4a1a4ed9b683690260b989010a762256f4c1adb1c901c8cb01e8936a386ade449d0ad1ec689a49db42f4ef6a3169b02b0972ce4b09702b8572aac42ac983625f23137be351df397d0841a30ab3b500fc9b45ae9e036c4928cc4e24d897126b13600f238d2069a986eb748d58532a47844e06825418f104581b6f2408a8a5e881710aac71de38bf9f4bb28f64c0060e34e2c7f9e05eeb03ca18cf8e954d851a33685d4692a4210e38e058ec05d9647172f28aa26877298abf05ea6ce350e373a03965d983e71290b60b47d328c3a5f7d2516a0aa1c2981361092ad30ce21203ad03ca04e45a6e17aa8467f959205db5be6fccd3e61b597d52c89beec881f80c57b460d56dc4bb3dd14e07496b314f973f2b63ec6779fabc0f950c61318a0579dda85de4460499577bfd560d8302b4ed4c86688d1f7b17e03d31c2a0910357f6d0804199db58eb97611eb66e53bf3cac10e34d240c8d83a8a39280126a196f05758166579f51d91d3b15fde52d9ad02fb357651a8c96890c028fc16e1a41b3593aa0f05eb44560da9e609926c3cda8c1c071823af61ba8d5d995b1cdd5109667d300e87b184fae3ae46d2bb14ac50832361c4c480a058367b9a8ae653bbfd98a85fe46e0d08865561b5364fdd0d829ff6924b45ffeb6366313cb0fe90eeb243f7165b4a1551c0878a182ef6b0be3c8b62b0841106e17011d5411d99e07156b093e43762f81498bfa82b5fab574b4188a064faf54424c5555172bfeb12881dc19834403ea33c2a23ac68e0d056b09a7c431ca21108d69e44750ba25e1bcd822dcc9156e9381fdb62261b055f8ac244b54a2f18525f1519956e880d943d4b2d69b0e0b00f510ed937b905aa6efc4a144d5b568b32c89901af26a5e0a5692a2010f32f810a3a0322c44f06179610d45a084116596a1738752b07e945c8f000f91c73d2bd171c678cab6c8221a041dd8865b433143a3331753a1ab9998c0b074dfb77508a5b351b9b9ea8d4d79b3816f2a187731b2440aaea1d7266e51db8faa05ecdb3a752cbf53f01396b0037caf1ce3112822dbeed3e667ff987c3322ac1856f30b21c830fce9cdd6e63017be842765ceec0928bd3e9017452c5265f5c902b244b3b418340ee0a9c67e0c11ce4a90e81c4114258ce8d06bd040aeb5681fa28aa5dc7d4bf079dc4d1618b2974419808ee0da415466130d15060e0a2cd02dd7d35e0993b196ae176894d984fef5466b7fab082cadad4298b6db2299b64789c0faad6bc68e1eb615250e0d4df205b4b8de757851951e127a7239c7d48f6477580c0436bd2775030f5a7468dfa67b5738346a20fc536a1a2df2c2b295a611eef53a977c9df547283bc4347cd0344b167a2bafb9bfe65b2de80d257d16f0c8a722283be14347e92e5c33127ea269c0069f85947d734d70493155e922c6a51ab14b5770ade0c30c49175262a07c968506c7ca171588a58b2acea93c0d9148923e99259b2c6259f93ad6f2e5c0dbee6a4fd6eb374d9e3ba8dd80465b99c1ceb1f895e31543112ece7910fbad2153ce59b61ebd513fb52e22c631ed526d880f0a328bd97853e56426cb61c0467a198e8c947108452345f21ca23660a57e623806f9b9bc4a5970e54074100486a3af0ef42b2d3565cfdea222d6ff2790966c260e178ac2494c5619c401ac6742335ce4324984cb7f9656e98e8f3206e9bda895a7619c8713006115f2b495b5436e738449b37dfbd49bd16f1a074655c76dfb112bc44440d538146373535c4d5cb97abd822cd8528a9adac6f5d4bc852b731a571d99750fb9bfbd4b2550de399750ec031898b53d5d53f9388501c97be5e79ccc204e42b5ac6f4ad2d3b69ad3cbedb2db106e9f8af63823257c8d3cb005c2ff750a10929e32e015dd860e138fdee7d297ed971fbb37ddc858744a17fd420656a28c69842ac2428f7ab717f6a4835142c150f7ec5c5ac7c27dd7e385a295e9f5032a5558568f04be2ae29ad304a3d31d1fb7fc8b092fb0c01124fd29caa1a134d68c8e09b27cd55a81455bc782f8c45672cfe25dbf794a9e1535294d46dde06fc67b8e323e4a1ca3c49e710f692c09c912fda9a8943461661fc834373fd7122da3548b01bbc39a27bb786d76307ace854d5fb97113661c4af6b2310de4734e035b13b1247441493a84f4b3317956012159c689de361802e35bdb53b7487f0325c9b51066a10ce4920efc7c4e49632f36ccb81c2977de837113d37959efd2dffe33e9c3e20f386f6d0479a31162ffd28aee6b9f395c1b73630c1ffa357f54ff4efd0bf5fec806875e1c0b3f35b0e687da6f0805ca672330e21145e0ba105fd07d18af0c78ffe9e5e89ce691acc24cb6de2c466b1e18be46361a54ed73f987b50af0a7a263ee5fe0961115479a17b464340d98d3da3cf26ab10d60cc85b69eee45c166dc9d27674455da89778356a60b6609d0a7c33278658da46dae99ad1b21588eb4e04ad6870c5d0318bcd3c3017022d354ce23354dae4332efab2cf6ff75c2b899cd9480560069af515fd663a508a167f8c5049b9c5f0d4e491b4ed6a8b1e397a6dae545787fe19cadaba06d565bc1fc07191a91d1534b3d6d6fd33ef2c0417fb90be04a3215e7dd379e876f1f092506ba95690be84ebf8fc9fb98e7cec17170ccf4be7f28304973c5b6f7984bcd7084ceca084ba24f9ce9a6240a07216fdf30878263e2818184b6ee7d4196bd703356eea3ea3c27a7804d988616c67879ed031911badf5e2f265f57de426ff526b649f2b24b87806f30a493f45751ac0e089605337f176f16485ab118133b41522e9ba810267c18133c7e125639a5ba7b4360d556fefa378318c4e8f0972cfa0ab5dec5f887bf55784cbe3597d557854d76d1604a350ebd6ed87ea4db9c1d48e113338a54268b5deb55323f5c6a9a0ad103aed7a2456d3603591fd049fa22e9653aef920d868ca49a80dc40006f166f598fd49959231e1350ba469d180cf442753933ea5a568bb895a485cca41a8eeac118ccd3ea373dea85649aef19251f355c6c15b8f1c0450d00402b1b9c37f4ebfa26325dcc9a32a97ebd06129a3aa186a03bee08c70d7a49b50fe92ccd6eb804400d764a87e68a1fe4f9cb233508741dce0c2fd19a1efd22c0f70000733422d4bf203cd9f5695fb098010f277d50108e444c88e491c34113968c7616467747ac7710aaa0a46d2be58610663f83eb7c2cecbf916968f9405abd4f2165b2e1dd831a48acd98542b6cee92365f39c1d07cbd45dc1e2e389bf7cf2f3d4513b2730bca2f1747c2406ee0e48a6588fd27e1494515b80fd02ab3f7880044b9cb6689b103cf58945ee051549122556bf27d4fada794d8b38bf43dd20c2a564c4fae6ab05bedf852b162a5ccffd21c87b6c157449a705da45d8fa586528091a402198fbbb8c9745657ce8b5e5f44a98672d6939a4d76c5a5be8521df964659b7153b70c4e51296d14adf96729afa3a38bbb2d6e75d61d4ba4b574fceb4b9eb21c2e668cb1f9baa75d361741964864d8e91d2e951964a0e438701b55e7f68b252a4d1e931256fe5bf464a56c11d98cfec1176a87778e934b6edc3de7ff926a1bcffd78aa46f9d51af70248acce8a04a229880032e83d0ccdad49f5a382c8876611735947f47be5e486a53aaba12895c633b9551a90de7497705337d8c5f561769004924bbbcff8828cf52aa712b7c3e88e40ebd65916fe9de5deaf87203ba095539e07fa8bbb61220ab59d6a658d9b4bd43e37fc66059a19ca3002ff0a0cc655aaaad0503020d83f455d00a8c1cc4750f777177770174150c045033155b3cab52690aa7daae4b8bb4087c43514f5561c398191c8884d39d6afe62f6ddec7d02bf77172b35f39836059c11739aa0e7489d72c7b8fa2f78146d0fbf265ed1ebda31c5ec7c7cbb4e2bad6e63a5eef8f03114cb71836d287fd00f2048c1c7d9879cef1852529846f87617d38c1b57d911356388b0154f1beec78814d0045a152274c63aa351d45506235a236d03529621660ba0cd184a042d522167a8eca80e0e61af07a01f5ac5647d1e9b0b295566cb86f59392ee79c96dbdd86d8e393085349a718a9724c680f04236dad81abedc6f2e8543d32ee7ac10c4b70fcbd338be6fd093274dd112094314cabd85828a138817e125b86403d2c796cc5f8e9be5bc423973ccfa7dcf9a01f3b0cad8721e03a95e9dd2e647ecfa9663551ca59191135cad7d051d20590a618d2b1260446054755735cd627567f314022aedb2fa36a16df307eb60c50dcd1deed9d2ef7b00c41cec1f5abbc6b20e0c2420001489ddeb8e0a9bd2c422c8c394008520c2e462c85f222688e6d2aa0190013c2b8e6d6a033fb8e1562a0fd942e11b811399b6024126b689f404a659526a8c129921316ca9b90726230788665b695ed59c3ca06ca5c8abdbcb35f55babab33f5a35c92995af5f3b1ba0989f9047875245111c8e1203161e1724212adc8cbb3871a0b66e2f778f9e45e01f3c142a6da75941065ed82a3f378da460c83a41fae359ba7cf4f2a78a2d45490d0e7926438330f680b8cdb38a1d643fc2297fe4783d66a13fd4f98b0ff6fb66fbcaff32f9b9f9d6e45e6cb169cc1864d666146ff0c85192d4cd837e861a93ad13e6e80aa847f291716b6ff077f0f9340aec122cf362b7ad46d0bd14bc59d669b5b65ee4cbd03f9956b5e6948caeb8546a6329f833c91976d397c22fada9fff99d23207ad80b1573e3c27b12ce26e811a6d3c8e0fb815450b4ff1baf49af383a83cbd274e597b4135e28857487a87a690a2397679a6b0b7333d87212d2d8c0fe762ace76a6a707f9657b569d1d29ef0a52fe4e97bd1da917e33cc4bfef1ca5f67512667f26577f2c40fb93cc8a0db28383567b24ab812dca3a2be91324833a04592a7156c079f6d90e296aa66eb8386b847178a82654dd6eb41039511da2c36067536b4beaa4737db296c08b3d929a69c57630287a65897031241b9875bfeacd19e9c0fbe2caa6c88eef4e1edd06dad42decac508a8e27cb356ff1820bdb52fcf38bc70a31b72f027c9dd1f3c96addc44b62223f16b933324772dd3c220a2396c0a2619b6ea10b0bd99c6f431360e24a1009ccf81a30b8c786627dd2f10b19f338044073da59af4470da743948af0408bf78188739472785e689c8cbaa3e937dcf9a1e93f91d4721b2ba4f107ce7a504a5358a049ad9b075252be7597722c467f5b81224caa0c118e688e952ddd65059c13910742d55795fb1b7fd7beb67770481d54bef77020116662c76ed46304ac5e6f2187544bbe6058817e77129aafc2e924b9f58ec062b6cbd06763c4c418ae39694654579d099f033e86665e4f9cd136f3bee2636b0475652b4ba6ad3953d124d7bbba000e4741f06fce6e42fe61c8cd0e47659cd5dce75e0e527d2f9239ae9d3831a09b9638980036b64d7b421e75629614de288791caab9e2b7aff4b1a11a69349609505eadf6d92fc45b403de070b5aa6923771c4eeedeed7a7862badc0d06dfaaa3a9739e254ac726889a692d2c28fc53caecd94c23791efa952f1ded3a033cc0b8194f8e347f7317ab1971ec95e2ef47a71f3023defe025a4addad9fac249d82f307020ee05dac8ecc20d1c602bec02ba8e7408bfdffc06e16791a604c92106889238d55a9d471a468a6b78ca6a4258a98bdf948a573039acbc9424974f3196484750be9339b2c2642952ac5868fc4cf3a6e718173f65474c2b078230a45b2cfcb4bc5edefb90b1c32fb12c37c101e23972126bed34cf91c1b3bc03d6e81a68b79fc8fa998051bc93f08e00beaaf271f025340c49b9e917dca76140054a985f70982355a70ae5cc998b2b55d0106e061b67c3712d854d32c9e46ae9e909a60949283095e0963805145a8c878ee1900c13862d91c3b3a5c2246c322f4e40687f0bc062e5b0252163f7d38320a1b118cea607b7dfc7159145ca99c2754bf27940047e2cc73033a690aa02dc4c6ad3005160482c06b49c33879230a3ee04269a9c462687e5382a8f3d72db099b30fce581c731be199ba661986042251ebad8c0ae15886d7e0d25cea1625868bd7548ced501188fe2126c2f46fa255a9b977d0487b9526c3a73d01ede4c5d4879726ae7542fc18f5ebf669d8e2f4e203d6a38b94af9ea13b86c418f9430baa5999e84b97c843452fc106110b98e3cfb758eaa66bc4455d022edcc548dd60590f5b92079af58a4efc3d5346ba500c818c002d7c110b7cfa50a09c7a6419e1b153f34d81c86e8e64a41efb80729699e550011b780d6a12e2795d1a7aa4c236f54ebb1854d4bf82e9f30e61b42921f31630e1765047a676b9179d1060934d234222a48cfc0897500a4966cb85cb44660e5bdad3edf1fd3c8d722717a31107a3471841725f3eb34e4b5b55167188e68ce52161a339b2c8ce2b61437b1f8e35527050847b34633b4d7c5f12556e8367a4d5c1775f6006eb373f4bdf74c41680da408899b17595d3f5a0b87d49e8bf1fc3b720975c0d442e369d76d6835b4bcdace2edb520ab3a38442adb1f738640cb9710d079a42be618a20b521ec457be4a0d8451b90278f5c26abbbc8295bb21baa9800391024dd6f2cacfbbab4f0b5f0c61fc81156e77120a6b1ed901ee7b376a7bb30a3a393c5a1f5483fdd11ed275ecac344f9ea0429ce3e60925ee50768768ce6452eb7bcf430bc0af780b5029e8426078c23551ab266e0dd6e741089731275e2f2b7ac3c08693685c2d27a274e169fd9cb61530cff9511876080b347a8a995479e29b1802b13274a5fc9c9615f321d7d5e76bb36af59f06fe537a1e96817b92ccaa70d0c0175c59fb1413defa9c64c85a502e1e2a4b32120478cfd1d89dc4b30058ad2057968ff72e71f700c1f4062571083d5211b1a5c0f9e75d53d6ac4120a9b324d6cd6773da5bda074bdfdd249670c9745da86371aaa9338b4cc732907d60cc23ce9f9148940f630c7b2cbbd31c622073312445e9a8d862bc7112d49c6f81885e07aa846f105bfc496e894b455335708d205b423324c398376580a84f7f82ae915656ae7ac98544e3238a2449bd375d40c187492d971759dd17594e5f4e036006eac4b27ddc43db236b58716646fb33f7a48f841121fae2f8e2110dc5441d17fa1d0a0b44c55f8ca43c065b824b667bedd2e61e5a038dd2791521220c86aa0419fc257b49934cb31b7ac293c631baf9269a08adbd8826a3fb6c263879b6f2a9780b5c83c3a7d443b93fa44f45192f2198ea05882087f519690568c5c9e8d660fbac07de0481d241c5e09d8f2efc05651ad57bad9bf85a1834269ed82f10a330f8a6cd632cf789fbbb0c00f15f386208a8360121e88fcb59a1da6dac0966685d041828a8bf758d6b4fa4e9a063bbfd787f06ba1eae1877f84f27497517f0e486e37791101e836233208a63aa8c9d628d18fc7344fb0ecbccf82363876503913391b4f0dbd074f6fc7dd1d1c2cdb576a95fb74af895e34007f62570e36660fc12359f3cab470357239811dcca797af922a286eb8f631d5c9144c6da446de139463862a0918b2792d0c2ff226a66256a7ae640656d9d81217b1af13d5ba4e05b774eac4b5b4c99cc9d845b067dcdfb4c6617f3fd8078f2cc02bbc7b1662544b07998e6ec83fc79c653e9de9312e68c8b083bc8ae3663877cb643e0807fce579ee70c2429f495eaaac85194d3a39267da38a54c8229cec17d60a45488f6c55cd642b666b1ead0f991bc48058149db951df0d24a061094f3a537e9f71b4d2d74dac8e5f6d4d00b5d6e1e3ef40223790141be108238c11c5abbda1c74c0cd8ea80cb1008377d668cfd165b1e8e1bcabdd1eb003644538461639a0e265e1ad18952d1c9f4d8a46676346fcbf1de23ce21ac8f664bb184f4167b041faba7f8880910fc3d24a2917d59ef4a41d77043e26f04731585f7eb57532a5516096481866737220b5de05bf579fa79875bbabf8ee1092e99b48d42711b8089e6466074732fb11a91c77742085bc3cab0ff63e113c3cfce67cc0d84b1b364073a51652d124640f96d8403210bf0694efdd34b2bc624129482f8ee0bac0233962209392f67d9c4640fab117a3564243170d874d5272e8f23c0415533be1171ff042226b1a412f2ded9a03bb66abff727fc2ba9ae89207701bb7e58ca3ed0d97e9181097633c0ec01527f1b3358d7853d57a1e304858f077b0c0cb9d155a801a4122725ba7078e697d45284f16d3b2d9e9479c4b3975f89ab21fe58a6c9ef02fa5d86cb50eeeed1297ad43aa38c9c624690046bd7e275933e0c4786d233de80dfba9ca069cc42a5fc169a23d9ee059ba053d0ddb14630ad68d7ae10c8f28fa2af834115d6cd8a56283738eb4fc917b4af84db0569a3361998322bb86e38028c619613ce85212aa2d9a6e8f1a904be43ffe6b402541a5301f4dd36078b4fd929336d52e2a5bd7abbf8912e2175de0aeb21ade828848a0f1197e8003ee304c68707420674d19cfa4dcd387c73839c664d947b28fef5565570a548d2b0d9303c68953428997fa28b9478814c7cab9065f3d26bd1f34dedfe7a2303709d5e806ef1be32833e2c183a590da0fa3f4a9a4396ef16f9f7c5dc3902da85c8f485c11c1b1945d5ee45fb43209e476cb9ab06e8726d42523837cfcfdd9d39a098ea04ad68880d25a04739d20250a17b1c5efddc1e10b5f9b2bb2994cfcc980e11362362636f5488472fb88884b285551f67b8c6d07d43a793946f9434903cc2a497cc3f566a685ec3a592c235421a82de446fb2e1106e92502aa3c9baff256cd082005c43bdf55d2f9531a2efffe38d8cb306fadcaa006d8a709ae4742fcaddeace972a3654d44fd245fa79c7c93857d3fd73c31ee7c561247b2cfa27a6be635eb24d6d2c83885b625c407c19d6f12984dafa6f4731647c6db33c30e9f36231f3e00e0878747690174a180df5f4c9f7e0f1a72de39e0af24cbfc5e789999e115b9dba1a75c161a47eac45737b250638850c5173e9fa2232c4dfec05d76d4344653e04e0debd260b15b833a734fdf55ec7e06d883f84ffd6b71bae9a08db06c05c93df1e8ff777ad62f156fcab1d7ba4c1635360c6e46d96f3713234a701f8310b5b32336745484002ac1d7e414a3f0f75947ec854bf0964255961c02f1082540a521516785606d077d5a19137909e65216b08114e2de46368715b9f2a851a15fd77a2cfa92f48c0ca99403c10871d7fad9a9ef366c63bb04c3b11b624cb924f49f7e6c6caea2a895560e623e24f55ce025d1992a06c93acf252684a89193ca3f3d1d34546e2db808cf6c59b788e838e97c3db70b2bc194e9061e829fbe78e4f71b41081889b6389cbff69ce11824360038e07343a3ec5df25f1cf8a7e3903bf3388ffa287c47a820e04af31c89802381ef5d195349a0997fb536f6892f5d406353790a0a35822bdf69c8ffc48f9c0350d101924bc61a6da13e29789739399d25003ec57cfb17402e30dcd9743c0d59df6118b382e0c38efdc5150bc3fb4b9a5253f1717741da5fb0bf65529ef22461b6d770fad4c99662fde6b226f6aa25a9c2986da6b11fde121ae24712da456062d5dda9d440423f54ed3e9bb350a549b4d8dca597c32fd268453cbace37647af589af6b4b8f9cf1da8f3ec89c893224b4246579f5cc8c1678d96c8dd6d4e9018e9601c66461b5c9d0dd1ba5fbe9c0f18efac6a8667c841a720b7333b4330938c83f45216338644b6a15c2e748f599689fc69f17a6868986ac1655a4ca50e222724d25a69d3ae49f10e76dcf0d3b638fd0bed6f397cfaa4f7c61305014f73f9071f6f20255123e60a754e20496f24a8c6378dde991d9c6af521d17347e286bfdf1f6c3585bbe69fe27550cf12f3560332fadbaf12b20985e71551f44ffa4a8393d9de9b2074954bde897fff9cbccb7f1744b9e29f50eeec3fdc21de730cec2c28ee50151a5a527e6037d390dd3456eff2e5e96d7f7e7bbf77c44eda511331ae50a8d9ddb1f41cc9f59701a5758482ffd7e258cab9bdacc4b01f243006ef07ec4b099faeb7e4a10449dee683e99359df1cdfa7f76cc84ff402fb09f81c23cebf3b5a93bee452e662ef3a57f2f9201199f06dc47f79e33a40b1947f12f4bae152c6bfe658f22354fb2ffa1fcabb15ca8f6212296b79922574ae3714b76c5aff151ab356685548ca892d600bf84efa3b2c834b71bc7bf63029c2216438ff69f0fe7b755052a9e00465420ad5babcbf8cc26de1f7245dcab5425c8efbef3b09e26cc2ba4dc0558e60eaadc41020955c6707063912b8390fc8eb25195db698ad3d605b88d144d12ea843a1894da0afcfd9fb40aeb423a088c943fee42b3a0032a785b059a270f692e59e65458784a1c16a3aa816c3b0eba9a0931c8c56deb688ca74ac4f787833007494a192916510abd4403d866c8c812a779a1db8cdaa4a8bc314d3124ce21e1aa984b5a56b3f780b9bd23f87ea7b25867e8c52860e79bc711ce1e2cbce53492fbcaa16095c3a27bd24a2dcae99d900a9b5a1ecd168c19eeefd3e6a3d7e1905b85f82314f7387e14a2ec0ad18389be90edc8bf59e57edc49186ffaf3dbd328e66b84f7cc79026fd3d6f5ce1a10d035a94bf023ea0c40a0c3950b0a6d001f3ffffffffffffffffa37bdeb7d6de4934b5934c128f523d79b19e524a32c994c4e0300a40000000000000c02744ddab0240a20b040cdc0b1c0ce5932e3a37dee988dbbe945f9949cf34c2926bd4095a7b63d09011cfa806b5f6cd675944a3b45a4dad33b34811aac632254bc4251109b34956678848c92cdb234fd9a8ad0e71ba92f3e24db878cbdd10873741854d4257548893ec7cef0a4aca213a429cc582f898b970f2623843b900631047377d32ea68aa640186208ef719c369cb122fd1f15dd4e8df4163d3002310ce06d774c29ad22520cee561b24d476ca8372916c2c503421e701308d922c4444444c800e30f5f9f5e3cad67a8b11f2eb122739a2899c4fffbf09dbc245da59c0fc6cc26579fb694b4872ac93fa1f95e2fac650f4757200d47ab60a40c861eca685a2d9c9c122605e5219d4da2cfa5ecbdce50631878389ec9a6ac4d7ccd72a73b1853aca01ae52c7c56cc6d21c6436948dd7b71869a0d1ac9088e56c1881d8e5641c9716347b31d8eaddde96632cf08dbcb7074198c3a1c47fd268b9fe9ade2860d061d0edad7a473cbfb56253f87a3092b259c9a74790fc9e1f425f61a944851c25a33d4a000230e274108612559ae8a4d69381c6d2ce44689d224a9f143b608491108e18202217080f1865325b1fd4c921ebdca9c00c30da70cf2245182881525be6d38862635f264ee10215211911daf830da73b2587954cbd7127bd86f3ab87df5bbcdf20b321c050c3f9b2fcc8a0bfaba5ce349ca4a4b46f8ed2d260eea0a183060b38848b07eca0a1834607464644449288c837404464440b01030d07dbda0c33ea713109ce503bc3a94b59dcbdd39ad2bb657700c30c27494466c56ca7d5c73223848b078888e848c18d1b337800a30c072f194f448fca195626c3b9ee7aa45f0956d9c4d70630c670b44d7994a465369b3c6188e194d3d67aad2ac598eb1ac008c3316fba18364982e17449aa495e5134c9b833542d10829115c0f8c249d2d71694a75d12ba65040c2fd89762940a69eae6dda2c0e8c249496979f1842d680d8888306b0206174e2b2f9a1d7f5b4952cd502b9d80b1859378fbc9b759da6dd96c1330b47038134f108bb1d42549e665e158276e9d9850a2e9000d1c0bd802031a10711c39466e1230b070b0b9fcd927e5ab3cf5c88e3f81da8e7f008c2b1c2ff4efc99013dd75bce05330e2346aa02e708cb4a073600086154eaa62bd49395d9764a957c70b7e0266068051859349367bead66adb942e382222387450e17cf2dd999a18e428c93243ed5d4444444444c71621215c3c2064011c1011d9e2460bb8d82204b38b102e28901d60400afc460d06e4b8918cd4f04f38ac980e1a381a0550091853f875b5942659a3997101430a27c9c41c1923fc729369861a136044e1b479f3051371a2973a1191193bbee838018dc4c60dd72dc080c231fcdbc9dd2c3ee1b8323a8430b98ce13a279c36a5ebd1fa926ce7269c6b470999cfab11b30111110fd8e8e2060e15e880c184c3b897491363c92a1b2de13caa1af45bd0cd50abd117c2c5034276d050018d1a233376e0f8e402184a38a80c1f7715a219ea821b0c101149ef821be83409ce57267982de1133fa0c3545010c2434274bfb9e28a36753018d193a44be06ea1d2c78b77163a4468df6c2771b17b0e180d401e30899e49582a8f3901a443bbaa8800d0798d581e346066018e11856333e633ea94fde6014c1d47bb2ccb9eb897d000611ca8c4b31aa8a653061c298682d26d5899900c6104e395a445d9e65c55b30847050316af6b01bb9d84b108ee9b46212543cb1f22a42800184937035b2daa76249218e5881f18393524aca5c892e26dc890f0e279852d9f46edf35df033cbd4a100fce26c832257aa6517af70eceaf3bba6b4a8acdfdeae028fa949724683f29a63207a7bfd74d0d37d9ca0c0e8ec14af006c7cbdf7732c96a17a3363809a64bbaf45322b2a9c1c935c62a933ea9dc62f8829f408df61b1450e302830687138b9b3c5694c868593dbc98c5319a9ad425744f3cbc90c5f94ca9dd7893d2879ecd1d5ec4e25449bfa6335141e8ef688717b038ff09154e99bc1e2dad8e0e2f5e710e959270262dacbd484774d0d8102e1e2022a223053a7a470a743417f6c215c737990bf136b1417d368717ad38ccf5a864662d427fe546ea4247991c5eb0e214b6bbdb96f3447bd30bd0c85d7a1b1ca8d15b70c5e1c52a4e6a54b8fd8c23fc4fa48a93681d27b79f99623952ec012f527112757afcc4d4622a41a83897d4b57c7b139d417c8a5326f184a8cf555c3631c549aaf150a3a7a451d1a41447efff54b7a074a84c428a53582695f984c9284e92ece535394ac5882f8a9398ac62c526b192aca4509c7478c698842cd1bde4a03826494c3542a91ca643fe8973a95027e9d43dabd93d717015556b29f6adc977e2d416936cb994bcf94c9c38a852e937ea8e36713cb94354066d6a2b0669e258ae2544f98f87aca04c1cae35d63c3c8489931233cf42d4cdd8852e713e37f70b1a2c8e4ab725cefd3ee2e2681364c7aec4d133e9ab9a5f6b2f2525ce5d97a45c41959338576ffc50caa43d29c948e25cfaad35e5d0ff59f14524ce15b39cd8175b4f5eed0524cebdff95c52ab3d2ae178f38ee6ce890ffe57b5e39e085234eea345e6d5e448ed41b7154df137c5e6344232c48c1e6235e30e294b952ce29792a336811a7ac594d5a49be7b77cf5063410a46f0720420102f14718a13ccc4a0368a4ab92411c7b9d4574a698838097726aad56b65abfc10c7f22be194ea52df126488534c8212c4858b2b13ef421c649a39b1922f7c734a88c3986857e2d42671a2328893bc172e6b29c5c6762f0471aa13d39ce1b351be0fc4e9d5de92f44b4906a132436de4465a12bc00c459fbdc425878bea5247f385fbec7a86ce2644dcd38018d1c99bcf0c341765a9f9494eecc31f5e1ec3f9bd268e551738dfe1d3a8c8570f1802d4e608306ff0b3e9cb4492763fa95a4822ad9c3b952f613937eb15537d1c3a9e2adcae35bbcf4988783bcd097fd4db24932c1c34199a0b244649a7c71ba43f2850c0b23f3b7c3d1e6f3c49f1fb73cb50ee732bd299b6dbea52444878316cf78fa64790e27fb76d3fd1acbe198ca843a1354d684aee2702c7167ee65d4cbed84c359e76b73bec50cb598371c6336f49c947208d5dd704a32093debdfa2c45f2fda70ee36d13ced8b3137be60c3499e526a74f567f292e4c51a4e5ea932c74eacbf7cf2420d6c0e3942dc26a5e114432bfca9ff5989d070f27213524f9c9ce1248e9282fad19ae120ae4c7eadaeb9a56538859baa570ead1d91e114af9209e59aab2a338663d618cc9498a5928f6238a96c294bcc3776264bc270d0d327c696bc282e184e69479f58aaed32932f9c9224e4de89762aebef85530a4273c9c9ae397917cefeb5a1be76a34ce6c2712d44abc37ac664b770ce9bebf8505f0bc754a316be63164e39639a2033588b52c1c2d1cb74346c08f5f7ae7058ddd658d9044ba57a2b1c4dc553f16444d7fa2a1cf469b48af9a1ba4485b3796ff28b51827e0a478b99d2fe2d85e3a8c91d2146290ac7a0b969ac86c2d1e4937b2629e1a5ed279c5dadc5e48f0e19b44e38c624269354ded875a24d38bfed663115eb7f269caa24fd294aca567a2ee1a8f92431a805bd8f957012cb748f2c496fa4260927f79173dfb84973241c4cea6c8c3bf3625f3ac2f9fda494c496c551254638dd589013844a5b4aba08c7bfb09aab33774f4c8453d7dcebf9eb2f8670d0d2d992f792e871fd85100e1a2646adf8a674b6fe2208e793f2c768338b8baabf00c2c954449998a929c9d45ffce03cffba7da34d2fa6fec207274908b370fe967592fea2076ed027b4efc4f0e0fc1ba6d489af3168cd0ece97a4d55ad9643247d7c149b4dd99d9c5d474f11c1cd3659a3729c35aeafc050e0ea6e292892dcaa4dcfcc50d4e1acb04cd36aab299bfb0c141ff3bbee4c9c81dbda8c1d1c48d2797b2dceefb050d4eca36788f28d142ec591c846ffafc0dbae491cae2e87b7629c5a8ce28637138d7fa4a7ab3f5c6c0e26475a72eb9eb6f185f715e59d79149e59eff5c71dc93cd4bde9d92fba1569cb39265fff65871906b97352a88f86c6815a72a396536e6c620634815076d6d159a260932a6502a8ea7ad44db245f5049092ace2146eaa8d34f71fe13533eb163844c42a6389cb63e49374b8c192ac5612fceaca49b14c792fa617b49cea4d11ec5493fc45f9fa428ce26f58949ec4e51b509c5c992385ea7f45fce101407ebca1847cfc246ad3f71d8f6d2e956b6174f3c71184d624d2a353636eac431e8dccaad1222bee6c4295a978eab6eba6913c7bc97492e21c52eb69a385952f145c9a6aa2ceb402941fd9b8d9f7ee8101227416cae66bdacd4cac978c449e933b5e87941cd35198e38852b79c6d28555aa4d230eb3f26df2c36be62e8c3859daac95db3652bb5fc431a894443991615b1ba48863c5a81b849f9d88c3555d8c173363675c441ccbe784527fcb37661ee2ec276e52d2a53bffdf18e2240625f35cc7293529d6011985386dfdb8fbeac8a42d378430911a320661920c419c4a92a418a7344962be98401ca6c4e4d67ca10c40249fa8e96f497b32fe70d831a915ef559932cbf1a91f020f031a35da060d07d8b8c0d241861f8ef9dbd5d20421e44c18df20a30f277d32eeecf4ec72dcb25b830c3e1c355fad45134667b4b613838c3d9c2455f25f7fab49aab4890c3d9c6298d250257924909107465e555ccd9a934d1664e0e15c266fe9ba7c5f49509aa1a603197738c9baf4e1f22769ccef592004230088850c3b1cdc4dcc648d23dd94b00ec72c4bb7defb8d6949e870d4fdea3af73da5a23f074c6af6911cce69799994081d55eec6e1287f4236b4c62d792b1c8ef14ec924855d3899f30dc7cd34d9329398cd7e371cf385aa8b2c4d1bce7a7262d80693729d46061b0e32475cf80a3294b2dc1a0eaea56baaa4d5707093fc82fcb2d2709049ab0495449b3ecbd170fc740be2c454f20c2713d4ae43734e5a1c9920c30c87113dd155fac44da982b905196538867411992441bbc639a5166490e19cf33732e365b620ec11c818c34146571c5b37b94793c470f437137f5ad2c8595b4618ce5ed5974af84e4d72be32c0707ef1591342c6ae31253641c6170e639fb94cbac9ca95634c820c2f9c2ec6b9d49b517b1bb38804195d38e5b3d4f0fb279ab4b9156470e120f462b05693e4cb624d41c6160eef6396695e495282a763c70dbf10c8d0c2a94ede0cf39b63d3eb0d846c21222222623662692c230b27a927c465ca74b51bcac0c2e145b8c564623e0332ae70beb0b64b4a0c5629496285932549cc9e249a14839954e1f476f255c2ba5af74485535e78f338b1348573a8b749298927491bb9148eea7a5268d81e8553cc34ad53b2a9bf080ac7246993dbcd2d6a523fe130267e6f4fd0ee393be1b0bf7963103b59a9414d38ea5a9f6861329fcc20269ce65efb456687e88796704ce7a6a4c924ad84638eae18fe82ee93a54ec23984c60c4f0f1b6d1909a750df70b2e4f80827319ecc6b174dc692118ef1ab4c662df14d345a849306cd34f23526cb25c259cc4e4fca750f399a211c6444a949132b09d516219c24c9a4de8f192dad5c10ce9937d35d4503c2713458bc92f50f4ed262eb264b926c983e382649b42c8d16644d56327a701a111769e2c866a8e5b831b2e34f80f600193c38ac89965a4f79b5ae66ef367a870e1b11d880b10dc8d8c1415c2c995d4d598cf375709eb59a514bcaaffbcec1299dd226ac5c65e4b838382c65768373cd5bc8a5709126541b9c44937b5238cb96e48d91518383dc8b109b33952c655d1b64d0e064ba2f63255dcc174bd86671ec8a1d1951cbe220e6974f50a624a5e4ff8418b148410c581c342e6fbc7cc27466bfaf382649ff82ea6809799f09315c710cf262b4df34f56db1569c4bfae6e5280b6ab566c5c1468b1495cf2eefa863aca22e51cf4c34985820862a4ec9a4b7706ace35932a1527d104296329789cba77869a4520062a4e2699689b5c63859ab66388718a73db559e103ba2fe45539c64d226664d9b4b712e61c2c99599ab275a529c4bc9f4aba9cf512064a853b11993a23887a969c6520ddd3343711613c784553849dfc68e100314471bad955edbff642f8b7d4211ed3742a6db9b89274eaae451f9ca5722be9ba13652a34608170f0859c0e7b8917c176274223961ac949266ad185cc6e2322683189b38efcabe863c69a5c46a9a3869c9b0aad1197daeb24c9ceb2fd4ce5cec514a1e13e7d694cc2adeecd27d8953360d3fbfd25d252659e224b5092678ab49a25bbc1227539bbf59926ab6184489f369bd13a5c1fa4cda933868d17f1b7b72398821896349425b4c8ea9dc89492146244e52b9d96e1853971383c429d8051563d61b3b29da84188f380919f34aea660c471c64dd4a103e4ad6a4b636e29456d4c8b449b81c2b2106238eb9713e2273af6413b16011073993db2413d19e7115711479d9c2f2ed59ecba12714c1b4da624ba9f660c1187dfd095c9749612563ec441266d425eb0987dff33c4d9fa64f3507be9264abb15c428c4491455e2459c2629a8c90cb5111d34b2460c429c84fbea9f092768a673100751da647ddf8d31892888218853e877d6899041364c8138a8389bd32bcd712665869ad3d0d1a8d088018863c974490cd5ab9b2e660b10e30fa78a1b7a2d44a6288d247382187e385fd295cac4f92f7359c70b7e0231fa701e9dcd60b2ebd7c2c487739fd69c3dcb3a59718c3d9c3726499e99689224551f430fe76cab39ed98cd65b2187938c9ca9ef69665e7e22e3c1c84345549c8bc279f997c10e30e672bb93fb1c437ed7109420c3b9c94987a4965b024935c99a186a355a09f2e461d8e316d9c9c09723e3323222222a2e30731e870beeb7dd32796f2d27c0e2737e1aa4dc6d057f9c9e124eb9c058b390ec7cd9b5772eaf2b97970386aa96a72af37ada4bde130f2a40921b78ae186537fef9d3e194bdea4db70de64524b3a3166c349cc7f8732d19dbde0cf02211809801062ace168c266ced5e9d570caf8966a499dd27032153e74895542c3d164b7baf4519b0dfa198eb95f5decf25605cbcd705261c6bd4bc6892384ca701ecdd867aa4a64385ad68a2975d53429d9319c47aec805d55941e5530c076135db55d2b8c7c88461d315aaaa17346038b5cade59505a2be8bf70aadd1fcb6257a765f4c249a70619c6644c29895d38f9fa7b7ca63057ad70e124a3fbde54e813f5de16ce7f4ad78cbe58d5c6b4704c31a68a62a30e17740542b608b17181902d42920d1a1378418eef2203215b846c11f2829f40c81621397e868e8640c816218fe3053b4411230ba7a4fb849eebaad2a5c1c2616c93a45bb38493291ae30a854a52c5869fd42611910c430c2b9c2da677e93a2da73eb6408c2a9c24b9345a6b73492fda420c2a9ca470dd96c5c2b78530648b100b8470418190118b3185835fa5142f89f5970ecd50e38c2185d3690bba6a4b2cb1710ae6d881a30231a270d824597eeb1e3d9a84c2516b4d7b8e123da3824f38862a516d5288c990fa9a184e389d655db992bd7b54a5c468c2e1441bb171665e7db91383092899c744f35225c5ee85184b386b5e117511a14fac700a319470b428f294baf7294d271b7f820588888888c448c2f9cf921275f767ef5641dbe005c440c22937c97fed7256e62633d46ae4e8624401318e7032f1bcaae4b6dc78d9681c1b1011b1d138748888608e1d382410c308073d339b2dd7245d3a2bc2418d98b1df8b69ff471608c188086210e1b4b144bb48add358a31843384631dd7849cc7d5ad4361ac706d046e3d0816a81108c0c208610ce5ea57c63a38b32533abac871a3c408426a435ea3e64a5f01e11f1945f8f88353fb092a4e10be0f122fdf0ceba67dc1ebc1b9aec49767a8bc9ece0384559ec593dd7d31bc8383f4ee2b297b6792744807ee989812eb5f255fc9c161efc4d825a8b90ebfe0c0751191258b1b887183a3c9860825ff0513aff06b2027c4b0c1b1e2e41383eb3538a552cd4ddd6b42582e060d8e1d26d7276cb6cd93591c939e53db3ca356f7441627559af657f5ba299d62712ed9a52f5a0cb955c2e254328a4c65277b2ae6af3805ab92ef123d294ae48aa35bf28ca1df9634b6ad386985147d7d962499345668fac74f50a5559c2ca7fe8834a9e2189450820aa6c34a7d958aa3bff78cf725496df651919a51f28d92747f8ab309f1234fc7868f9d4c713ad3a9f91fbf7e265e8aa398665d86db9fd59a14c738f2627589e9284e9268860a95edea7711c579349b850e15faa289a13868d2f34a92897480e2b85f994abe5022f45e24c0f8c449cb764c327559a3c313a7cc224f14a5a43de9db4e1cb39e382658182bb760116070e264a3c24f66086d4ad847940a3036711899296f38a1476c10ba27c0d0c49b2bef79260ea35b62bf989c14af62e2a4e9bfb9c4b9efc29fa799cfbfb8a30b158cbc20c78ec2d12a284d806109be5d377d89cef695f8e2056d5d274af49b4345d343de5b7c12dfe9a8bfce25d186af28392657a97447225baf77f592d144c790305d3e794eda2c95ba3e22792b8b2899ed021f8538599f507949b02ce248f920c4b93257c3c50671b6b9689bad4e2b5a3a43adec4e10870bcdcae0e7fbb171204eb1d44ba612de07200e32d3ac994a49ece7ff8753ceaadb9f24d7a824f6c3492bba087126440851f6e12cb2c562ae4dc82832227cf0e1fc954d57d257f03af670b60cca4b12b3127cf664e3f57ce8e1a0c4d3cc2047dc2ca5c60d1fd9e18f0274230f57cb89f7ed2537e2021ac9191e4a61fd7232765b652405ff3894c6c71dceae159395a877e9c0871dcef65f7bb9a664c5b4c6021f7538871294f7698f0ea7aeac959b44e81c334f60e3468dcdc0c71c8ea1525e9a98ba5fb22a87c3563431c96bd3e5b2dc71e0230e2757f1d2a6a4584af2050e273fd9d4874af2d5c918668215f878c3f13206652965ab345a32432db9e1acb33195d09aa49ad0b8097cb4e1f833a34972593b2f3133d40a053ed860221f6b385905e997af94aee5ca46bb0e351cb4365c096abbced7d1003b097ca4e1f0a24a09211b027ca0e1301a9b2b6608cf70fe8c2a96af6287991f66c862256d79efb84cad9aab35e8a54a725a8683ac2da19212d4299959907e47bb8d2e727061838603444466ec781191397c90e1186d45b624255b755a43f818c3d1f26897d15bb79f8ae120efe28a988aa624619ea1c638f80843b1e288092aa735ead6163ec070d4b431c50c327debe52f9c32e9c6204373f9e7e785832659a29cb7de85f368ea763169ee4f88ae0337121b1100c2071772cd6e62e5bba0c44e473f20bd0e0e30123eb670b60f132fbca933158458f0a18563d2f623941c3726583a0b0725d43554ce0b429de007160e1b2e5ee9916e42a3e5e30a07dde4ef5ff237c6de3eac7012846513da2bbac82555e178c2a94d2928692a1cee5e5e2d2f870a1f4fe1982caac98b294a2d5e299c77edbc42a52cfa54340ae7d00d8fdd144b8cd0a070d82ba5f3b9264f38ae28f99498cff2e184938c25d132975251524ba3c688d6f868c2496813e49ddf5c8888a43fc1097a070a3e9870b260e2b66baa53e9921f4b3869dbcc277dffaee48a041f4a386a2cbf140b6771546ec647120e4a3578e80c2acbb5cdf181849374324cd054e3c8c7114ea52b93524acca1645f300f1f4638ee77b7c9b44dd1533443ad988d0b6c1d3e8a70b45452e9bc8653d7bf8e14dcb8010155387c10e124bcdd7647891654980ce194a653336c9e6eca96047c08e1741eb6feeb22d3581a8483c63d3944a99e9f253f80704a333d7ba6fe628f5006a4f0f18353b898db26684aa1692b0d846c11521908d922a43010b245485d20648b90b240c816215581902d428a02215b84d40442b60829098460800221691f3e38e8fb4d4254b0f5061f3d40088d964e46113ac4850f1e1c8412f59238a17592e87fece074b9d6a1f3257ce8e0248d5e5c3d59091f3938a7a5d7507692b8f1750d7ce0e06062af5bfda192d96c838f1b9c4cc9502254d238be275c74a1011a7cd8e05416ffdbe54b66a825adc1470d4ea7b29b385a424ecc79865a198e0f1a74416bbea049da4f6dd0382878cce2b0297ae6d87033061eb228268bd9563255a99c80860e8c457984bf7dcba9e3861b2ccea32c89337a4aac56d0e315c72a6192e96a56d711bae21846352855b5f9b4e59da38bf668c529e3494bbbf9466fee4ce7e8a25971bedc2da3f17a429fbb8ad3fc26e14b9e3b0b9b2b87f050c531be6ac919962415872f3579a39e5071924f3da119f6539cef36895696fb123437c529d58475c7c64e1971290e17bb375e3b298ea7a562e6db29c16e1cc571ec477c65a7c8fba2384fe72e798c2514c7982a8b6a053dbafc62c10d15bc066c5c20648b247880e294e9fc4da5d95df4cfe3138e3a259c642732cf7163870ee38953094d8b491aaf7374d11e9d3826f1a498bdc762b69213275d25d409fd91e119f5d8c4fea617444d5c26ce1a74dc9f8a96f342ff829f00103c3071b6f8aab61493328dd00cbd44276650d330d2e4233a6858e2ac2763359abc289e0ac1a312c7af604910278a38c1747f24f0a0c4d14b2e8abcaee9cc98c7240ea646da9ddc24df99a42078486271fd8b49a8d6ab2c23919464ddaf9b188423e642b878c00674706178f080c4b92a8ae5a6343f56a57cc44109b2d4da543e31ee88839079e4559eb0ca65f2353e8da42047abc08ee0d188536ca678c9dc4ad5ae1c395e44648b900d6cc0081e8cd845e0611a1ac54353cda59e247e83d0e3103c1471cad8a099612c96d259133c12711c3bd3cbda162962048207222c791ce274823a419ae95b2aa9e26188832c53db6ff92fc4295476d3cd52eeae3721ce17ced59224e5bd6e1ec431c6566da6252f3965419cbaba636d7cc6abe3401cae2f9de8ed4b52ce15104713bf82cef04d269afa87d3a6cbde6e8e52e266fc70522a88504264d887d368da5ad668fd2ee1c34157936cb65a96c5cb1ece7527c7bb8769feeaf4709033429985cfdebb968753d04b8df2ef5de6e3e17852c4434ecd858eef702c71bbc46865e1e80a9c023cec70ecf4167335195c4bdca30e2bf0a0c3d14b7a73d325a6b4f825e13187e3dd29b9eeda98f6dc196ae34699f16a1a2ce9060f39206627a925f9b49a688cd8b8a135520414101e71386e4ca5174284c359833429091532f644093ec1e30dc793246992b8ac7ab8e16c2aba623b65ed82471bce1645a8657d1b2542c98693f02da99458d859ce70c1630da7309fa6494c6e240b1e6a385a1277d7bfbcefd5d1451ad9431e6938698c9029a5a5d95c8f78a0e15ceba74399c8b827346738aa9925e9a4ec92aece196aec040f331c44f48ebbb988983420724cf028c3419b8dba8b19846c8b0cc714bc2f3364b0924c16801b788ce1a4aa929cf164136df2c6580c272d22941295d16c697a84e1b05bb225ba8f083f13309cd2eaef5a9c97dafb3cbe709235497f5d254e895c33d4d6031e5e38da65d50aaaa655d3b45d388812672d29d9444c6ce4e80271e9800717da30e927c5141b1c2861f0d8c2f932c759328b25584c3243ed6b20dde18f43878d08888888885c123cb470127a2dace512c362b602a95f03d138818d2e92e58047160eb2b474c931217f93504484ed055ecc0400081e5838e92d319558f25799b45de16449bddd9f344fb9a0133cac70f8b8787a44cc0917c22a1c5f34869a20176473572a9c8267dca0c9e434552722784ce1382aa55879f5a9de2552387506d96ce137456aa6e0118563924a455b999da494f2031e50380577d5bc6ab6fe27e60a1e4f387e95aa3b25ea5736b10b7838e124dac5f0d23ff92b7b028f26a0446f9a3121c18309c735157329d39448dd6fa48481c7124e95454b87d66a4c1f2ae1589b2b622d6f5e8a9784933a59fea2ab6b127234432d3d8d1a772cf04042623869f24ff8727586da7a1ce138626e82c88950d194d875e16184d3893ae5f99ab223ab8dd7f1398a707c95d3b5ab146b4a7486da888df6abe1418483eccc534a6eaa941914780ce174e28929b73d93000f219cc4ca1b4a1a2d5fea36267804e154faab79ba1777b471632d848b0784d8b8c0d91621b5c3c6abe06b9c100c5020440b1e404045b574da74b8862377a7038f1f9492267d61dc4bf66ce0e18363a5977051ba59c7ae1a81470fce9f3b9a646830a9feeff0e0c149977986d112446716cd50d37103478982c70e4e2ad4625251772c847ce44632569778e8e01c1a9784bd9614c1230779094ad21e7ae0e0207653566d25fd503952f0b8c1d974bde6d97cd2a5a8cfd02ed4c3066793ff2d9c9da6b013cf50fb1c38ce24e051838396ebad598a93c2fd11bb3878d0e0a035e3c5a04c7ebfa0a40c32667112c7bb2af4a45a0f71c48a95d141862c0e52d5d5aaee4244c62916c76452c9097f4ac5191716a70db3266833e51de27c05232e5c23c315c7f7b4cab964c205b765b4021317b194e3bbab464fdc8b494c29bc298315e76bcb923166d62a4e1aeb047df39b5cc5441507159a7694f2522a4e19c252c69c9864890815a76f3bcfba9211d2a4a7385b5e6ed7598c298e659f15456bbbd65b8a6312ef2441bb4fd81f9f1407d52063aa4aa2664d7d14e73eb7b51246564a7a248a9309269ba6cc3f9a451c8a53522768d17cb5b77d4171d2f795effb191b2ffdc46984b40f17a5278a31cfba4f113b71d2a025a2634574eb9c385c87c9167a4ae9504fc626b8913f25983af9fb1f29cc05199af8e46edc5da88d6564e21cea7fb342f8569e6560e2944bba75cb3ac1c74b2e7192f332bfe41435fd274b1c2d2ea4be95942e4fa61207254d28a9b22d85cf0b258ee9c3ef4f3699c441d76e6d7451a6b295244e23e7ae162a897ad346e2042118010012b440c4c9d7e416796e1fe2144f96cbed315ac4c78638d58e4a4d59fbf579210a6f110f5b8d2d214e318aecdd4ebfcd26661007bd50b254b8a494d526885b4dfeb293bbc4681188a3ba8511574a101027d14cfbb4c6e60fc7acf025e5a50e095af8e1aca38250ea5744a552d287c3c624c409aae384cc131f0e1b75c428133b43bdbe87c396e98963352a9e08e9e1187a5d7194181723e7e12432cb9cc628e3e154a6ab448d6b62e16477389eb9e5f59ee4b323b7c3b1a2dd495e7aaec3319364a29a8c129782960ea72caf7ddd597aad99c3c164f0ebaa37418bc5c8e16427ba756956b858827138e5327d6f7a4796c8050ee7ad386df924abe8e3bde1f4a132d2e49272c3b1329a3872d2a95e2d69c3f95793d46fb1b3e12475639027625e99ea351c36dbe7e5906945c8570dc73fb9e1849f0b1a4dd27092258925b9c2b5e68668386a6750e7d7612aec45d0e20ca76e8d997d3266d949fa2e6ab49a26686186b3c839f14c674982ceb90ca73d419e585f9a44a58e0c47ff52fb9b492c4b6adb008e2ed237404424fd8e1c37748ce0e8227d1211f9cfb1830b5a8ce1fca2041326c5b021e2d3420cc79b8b1547cfb7998adf6d418b301c53cdb87b755be5b360000cc71ffd57a7ed64eeed221001111115d01011d1e20be753c2af3bf4dcaa248d1eb4f0c2490c513d93b35e4168d185c35578599359eba406e5e0c2b18492eba9d14349ebe8b37226d0620ba7134488b9ecea881db4d0c249cc25c6f511b55baeb9418b2c68818553b24da35e94a4b2c77e8573c98cbd94b75be1192f93cba4b254e1787aa1225448f71e4b0b2a68ed559db151de4405f91534c84939fd4468318583a509a9a36ff194b0a5702e71714a87e69964b2e6b488c27994aa69926fd53a289ceae67cdd9424fb7a1a397694b105423032002d9e70104b26bb548995e1626c7c8dd3c2090793d4be7a7be33c66bb112d9a70bea043765c2ca52c8e987052b979df8d1542be9d8c6408b4588221bb9459543f59633ab45042254a8893aa4ef89b844cead8d83eeec87f62c705054254c082b3572fd00209c5d058efd898b276438b239cb3abdaec43fd041335c249c68b3157f810163e16e12cca5dcdd2c374c416dc48233b121a3a780b2d8870d2f29a45a94a72a5578b219ca4fd1167da7a219c84d16e7d5625c59b3f08070ddaac64b500c2c9042b1fcb369a0499baa1c3060e1abaabc50f4e772af8e758522726251f1c83cea41b5e6792d6b90767cb21c2d46f92cb6fc38393daf9655197d74f12eee05c66bd992ea5cb0aeae0209b3f64dc6cd874951c1cc429132d2e4d58f80d072735de9bdea61a2f59acc50d8e1a3bee24cf2ee9c4241b9c2c654eabdeeb059d23471b2d6a70bad0d1dcd896163438ac9f6f694c23674eaa4066713657139b1adc243517882c4e79356e56ba79bbdf589c5e848ac6bbfc93a75210589c6a6352fa7b2eb966f88a636e7ffdbb7cd925c628882bce23eb04ddd96816e2d46112a41526b2038415678d1f6292247a6752e9193a56714c6a5e95d46f03a28a5328a57cbc84b2924b16415271529209374a188b8d1c5decf81ca80010549c450919ffa4d94961c4a4c6eb38c541559b69f9cd4c71acb897fcc4e5849345a538c5562de1a4d801404871ba4adfca5c7186da8d4e363a070b3e078eb23400c8288e49fa9ee0b1da8c1d340e45711042687befc83f3002128a830c363bd6bd83e270caf4def334997909f20913a9128078e2d4e5bf96ce4c6e517227ce6ef91edefba2c26539710a99694f2f9b944f926413e70a37a3152e0553f335714c82d2b169849938a6f71296c47421f261e23c3a54a5cc1bf7822a5de228a336981c4a28a1546e895377dc9bba9a9272479538c5ef8d27b5a3c461e44e9059e3499c52304d41a530412471d2d89b49924d357b1d0590489cb49634714f09eb92c4af000289d36ad21a44ac789a9e1e71d0a0cb42539dfed2dd11074db9ef5ebd5431a3461c3bd52f6ed5263f1366c469eca4ced2a5459c4415b5bc8abd7b752ae22ceef376f3a721be49c451fe52a9cedcfd3b2002a90710441c63549242c9f3bd1495439c2b083d6aa795278d2c01208628c7cf568a95397e72e3460e0cec01a410e7cfa0b9bd9b84355d22c431a9f4bb49e61342c9d04e077134b959f4ca5a568c3e0be21c3ffab2ec665322ca348004e230dbf39de9ac4db6a0b101041027499b249abc9be5dc4ec800f28783bca44aacef34799ffd70f2b6b2ae9879394d5cc300d2877349625249de9899946de60b207c38ac5b7a956d6b90a152ba00b28753dae5d6b84c52a93a6980888888c81640f4703cd15225ab036d0b903c9cbe2da8b8ea922ea95317237701103c1c4bd04c8b794fb092cb14388d1d850120773865765167267bca26dd0cb594fa160062874a4b094a5d4a0b1af10501481d8e7f6a19c4c4719369bbc18291947a09004287e37a89795b9d3b25a640e670f0ac9dd5505a7bd33e43cd8c05a9080091c3f9d4ed9b123355a6fd4772ec7100240e675917397e4afb5c9ae700028783c75d12844e170e206f38c9f5554103881b0e276649c9376b4fb4b2660069c339b4abd795f667a8d55500840d67dd2f95f982b8886e33d4d670bc2496d2b6d1f44e4a99a1b6130051c3491451820ebd59199469402ec94951793eaec0167c300041c349d693df46c95e55b20440ce70cc273ba3798af292842ca0d1801a5d548046026286539069638ca93294e8538e6ec1e718c9d16f83460db4035286734929b89c98326688880cc7d0b395f1aae99ab90eb01340c6700a3209e91be56be34bc6002286a38813c32e93f49fad87e1205dafa4dd3249ec3dc17096afd60bf3dba1f25f387e8ae8d7a437cd2f8917ce5fc28ab87c325d38a909b5647521d4243109205c38690d25bcfdba2e34b85b50762cc45bb56b04102d9c642a297a45489313ea2c9cb2893aa12fb544cbdf16211008e18202212222098285f305e5aac14e5c3747902b9c37fa68142137c7ca5a5600b1c27136c54d5df6334a934c0d205538662555494af26540a870cc935ff3a64a9ac229dae91da12f449370221040a4706e39e9a624db364b41513810289cc41284ac33c1e5620ac8134e52cef32cd14ea593c47200e2046f94f01a73a9ac2915409a70b6184d4cd26b5432f164c249dc14d7e9a6335bdf251c77b7549f9884204a38e5cc199af5462049d053634eeb0eaf645916b32e409070b4cfd7ac97ba196a3d0039c231e499cc947537c2314e7f5c2e6572de49cd00a408a79b4ba29a205c229c2a45b59196a6219cfc7c84b898eaf3d20ae158b2f1e176e945ff2408c78b2aa64f7e19593905c249d87e5f6e93b236fee05c992ac9a1255555f43e3855a60b6abbe2c63e413d3866d428e29a2c2d849607e72c1d71e29894b47eb383f3df98d5c9ebe2b277a183f3695feed81042cc473938895f5d1ab33976e8c0c14946d3656f39f94777660720373889ff2529b53c4226750bd01ec70bb8c001880d8e49b6af45bf4a1e27cb00a406c7ed9a0bca5a101a9c4cb464b832612b2fc92c8e99cfd4594cc25e0972599c7297a4faba2122668dc5b12451515d4b5abd34ce5085c549ce2acfad98be177c0a0a8eaec02b4eba96a4f87ba15d83fce10ad3828f561c54dcacf52b31aec4102b0e3feaffca2f7cdc2aab38aa495a337de35b8867aa38c60b9a42ec86124de61fa938f60819848e6acab220541cd4efd72f43a8144cc9290e1a2f9ca638c9366234cf111d3d232dfdeb181111f9f4518ae3898e767b1132057f64870bdec6990e1defbe8015fc06783f48715093bf4e92fbc764468c7e8ce214ce64f4124c9f1fa2388ea91842eb9a18a36ba305376ca4c04617a1d87d3fc39e9429e6ee4171da78395a42b96b777f021bc5ccc7273cf1d18983fac6eed0ae59b7d4821b383660820f4ea4e06313cdc53416ea237c664d9ce6d74b92fcdedb3c9da12613a94b52c62e975127f58109c4e4859ed8cbb39a087c5ce2f81b462969276cdcf52d71d0f99b4dc6516d22dc4a1cc674863c352b258e162ad3a9d0fd256752b9127c4ce2ec6152c872d1af3c5f12a7b120ee3f74c5b8cf237110d24b2c558b29979e9038eacd5d5e13f2540ef111273532795ca98716fd1c715cfb8d76238e1b5353d61097d4786568f860c449b096f7dc78b790f6228ed14d4c31db795dac88c3fbdfe7570c25da728938be8d4aaa6c2f4e568d88c3675f705125baa6bd0cf838c4e99224cb872a1771328638a52ebb4cd7538deca81410e6125920120683c160280cc520f1ed5a00431308002030260e0583e1804814d70f1400054d402c5034301e2a20140b87e2d0400c0c86c10071280c0685016130201406a3780643aaed009502ce0d12e5003e02ad70e0062762b021df6243e15a426fa6385c12b9d7e08c3258697a6db86383cd1973657d0a838db0ff714a8a091119ee1101a202d801e08b01232e01cc08153422856111ba855e088c74fa230fb0a09cb84c9d03103a01a80a4c0c303b0011015c61ea6ebaa5c9713e3e7a5273b4bd0ec0ae5b8698f31d600f8051046c42402d0560e026ce568e80e417c686709de5a0b5095e0132308732453c48054b9632e67dffc25bb359ca5c365752512539420ef072997997d79b4221945720a7156d697d5446650e8bff9797b291e2d361268e7b43ba54406af4c23669a32371864232f8380148b9eeb1276b2b45016a74cd5ca5a1895c5c5ca17d8438b8757e629f51f489124675db45957498fc3d08e5140d2abc2083ba1ec38341533a7a0ce6a0f18f573982a98e0dfcced11e8912f108d965611e12cc7836a63c2da4e80c3659bd40721c261c28db0145638cc2dc7c1348638a283aa30bf5be4c04a8bf071a29b984a60ce4747cc794a308543816b21ec4b9b1515a616e5c64c7c5617e08af086b1e498105d12c0752a2f56aeb3130d23d1ddd8d41f52424f147d37af8bb99238861db799023a69fee43b0726488c0ae63629506e623fd0682e2df96f59e88935bbbb77591a10c807f25a0b64bf7fcf6351f98969701ae9966e0b164a1e434f71f741f4c468c2110ae55ec84a3c947843fe1d95a9eb88806366f75269cf08b8115599495709c33b3b639cb7e2beacdfd919f7e8b6032217b91ee82cc842c750582bb250b3bd61878855fd288d03991e8006131b3e274ea4c2c08f880061ac435ce10819ee17fb9357d674843c915248740abcb9b43e47833a012010c55cbed5d1dbe0ea0fdd82876f4b1e6e0d51d7f44c88463eec00298f0793f25b25d137ae51fbe8b8102ccbd4f12732d8712e7d41b6da570f90abe746a568609c2e4f67c4dc468f4ec2d89f53209322b283d530ab717c4d4b1b073b96a6fb70707a9d53bd37f550a622c4971d5dac3a4d2a9fdce6186e9c41d5ed9b1cc01b74d078464f42f8025b51a80a3a384a7a33599330cdb3d4e0465e5db16195a216e01990c01b5129fa1492eaa6299d29fb67463518a33fdba6a63baecb93cd011d0d3d83d4877daa4cd32d16f6584a3c9557529bace48204d0e2ec372aa2c6306ffc0b2c3f9baa11a83abc0af675574335cec1d940f30f49ea374eb6f5c30b634a30f254c38102d31ddcd57ce1c26ddad1c4c025c66b556e3f92dde1398b849b774f1e1b1f1de7a9e2b83cd2facdb91722a465e9cbff2efef03036d688a963879f93b0196bd9646559b2fd7dc306fab2cd49fddb9bf59a24405ad03c421237f13e021babb6a8bb60907c28f30d6465603ad517ddde0cfe15c005f763912b6fb01224815216686c2a91e87d239ed8ec6273140d3a80ddad4235a98d52e8ae0a64324a61e1f9c39aae2b2fc1eee9031c52fc10d7f638c3dc07ee8efa14c3dc38a544969a440a5f837508f5246c672474535f8fb68b1c2c3e405e30b59f6d4c8e8781de4e6355f19c0770d5afc3e293b2fe6510b6567052be3ba9906912de55546f038d0515ba0d38fc690012dc7b15cde1b91243dab8ab2f0401b87f5c4ac01d6582c313ba2433ffc2c441545b31c57540354371ba1f941d5f00e0c08f0f6bab0708b2c55a0492a0bdd05cd2c69374942f63abe76995a5f7292555a4ac605015125d9bf649aa1216e0e7b3ca02979ad307a9ce6726d346cf76fb1b781cc059fd3b045367aefeaf8be2c7db2660be8755cb273943051c90b6baca42956065f979f02a4e9290655d1e01815d0627e19c3aa380b2131d3d1a7cfc93ee3276cb6006a797394b67978b940d4117f286df704d9244fe5e4f4cfab291c9b61918bc914535fc63efa973e081f2dc83141cebd1c8f0d404da061a83a680f680daad0795803efa990833fdc421fd8404376f0230eefc66edc0d6e71ce285d1a8b13453eb0c2a9b15a04a355f14501e752dbeae9d4df42ab8d18481954cb611d4d1b0e3f5dc574d49654b3284cf3e2cc1b5547d2db7d5119575c17cd8ae261836bf659b4557c0f43a05e5b4fc9b1aa28563055702c56c1b44b71091a89045d1c04e5281a8d10ea92b259a23953a5d7c50258ca2f2995f77ec6ff304da571bd1ce7c9890a351abbc1dc8cf656a2681daed681712f6be843735ad537ec38ed97de71605e515c3dfd4984343643864dfd76fa6aedc7a4474242d447ee2d50b676a7fb8296c3640294b2047527d69f86691280d442b785a7fa5ef52379309b8f9452265022d18679a51337a6e8b32f852022704289032a9d2370da0ac5ded35a41d21a181110a62f90463fb0f8a82105fcb201016014ddb6479bdfda1bac792e562a7211afcd3efa532b2f62d36b00e341d3c46e407aebc27f8511d3d571d1b4b45a58757f00fe53e5490854f06442113e235bbda53002dccccbd43dee31c48b36edcc8ca9ed51347ecd711591bdd57e672bff7cbfdb10e5d6795784131f4a67222f5775f2d7fde7e1287b08428f508ce203908ad1a13842cdbbe619207d6ffd0173500fb62b71dcf8e42d21071e1b0366a3710a653ba7616ed7aea79d454a2cba0eb003a6738c8091e23dd0be2223f2f36eba4511ea619d25d2c974441a69a664016cee6f8c2df6daa8c168c18d468572789b5d8b679215a96b1017a66d34fdeb7de9621e24c5255578025b3202fd496ab147538fbea243fc51110ab2f81b3362c1806fad413510b4db1d94901172306edd305c416b5c1232142cc3173b40cc1f91a0e51d884c48e2265b90079167fb3932db74aff1d96db0e9b28e80cf77ec063958f80d108066cea7192431e8187d47b5316854ec40c716ffebf3da6c983742c034ed9010f8a9ff028983b74fedb61013e4165e09389954a51104dcccec245185b2475a6022fdd95fe5851f96590df456501bba0a5303a75ca271153695d5a3f402bfcbe83468ab083956bd4af56404117c03700c21ad461b59b99f621e01279855f714e4a8573e6e837270f0d8a084826290c28c07e26c50670889f2442b159987b32ab11d5576046d7539f92e913164d1a8da4c65a64bf2ef4ee42cfb8faa415499e9d72eab3e4f2404ec7682cf277ec6f951b4afa55c3054cfe772a46d34b24cb9d8a5e4267131ee61e0f3fe86b2f3a6295b49075608fcccf530e9d74c020292c76d674e7d3c08f282305fd11182e97d03d2015a705b96c769dd9276b13e89133413a44c0437d84c322213f27273b04d065a4d7f656f9593d16f7f82d108558b8200f0e44404474ef7c62c4d8a8f7d59fb67d345d9289a32f38398a48db89a6afa722a01e3001aceb76a32c768abb8bbff7a55c1584fb27661183f7f5def5875d54ddccf16322b6a736554e5c8faa64734944ee715fb477885eb6daab58f880a29e8e650caa3fa003c9cd8a29d423eb444399b37ca6db45823268daeadd18e1f950fc408a55d973b9ce33ba4f4c05d880a2c8a854e23c33e59729e22a7c53e54d3eaa287d5e4c94c254683455bdc3e59c9075553085b805c22aeb824f7886ccd59eabe7280e06fbd4ea767f9101b2abe8f989f53116c5f5fdc5ca1503362a048cec308426e0db2fd64b5a05d9215f0da2bfbed817667f7ab0948764e4d9b3d10ce685b8441b4fe6866655349875fe5a2cc3f8d1fbf7f09b94b8fe4a05520a7386e2e5236ce78f675a0e8a143e08bcc439958ae813331ef6781954ccb2910e02b9876f5d432100a010bf2cb899585e9a8321ccf8f1907ef010fba867c2b82870755761cc11cbf55b00609c1d6a3ba33530c4ae9dcccd1a1cf1908079f34eb5eb7ac4dfb1b6b8c099de857ae0a3bc47366a20094bcf4b74eab72abcc1f405b44c429a7c2e5d2dbf5b400677149aaba3f94bceda80451b7e8710a0a7ea2a1f6a5ebf34fc8f4e70b5175174b91c49c2bcf5d8c98bb85665d0d0eb4ba898fe1dd5df35f2414440440c82b04fc7b7211073e5f10c983a93f62b83d5f42a50eb9145e1c136493c8a96745d1b5630a6e5ece2ccda521bfd1b23cf7f26fca1c7a5aa7c6145bda55d2653134dc6c3fcebe58e54404438a980d91a2aafbd5c10de96106620dd90339566cc560a046a393086ac000071731947610f8881abef9feb93472ecb0b4097bd46146538745e9ea248185492d41693d5cb354ed2af0d6eb70ce27b1972492712c068334290685e6797a1cd1abb1f66463f72c51f6262d5a23cbb03d79fb052c6e505980ec5a93a7fdde12e726f10fe6b6755734156b39bd2dd90936c5fcc337df2c5cf42c0d874d93dfda56a8aea63575d12abbcfc2e93fb1461aa404e33f6a4187e184a2380e5d13a4a6abb7a4b74998c7c5f374449bbd1395dd5c43b8fd383da62bac384ff88cb6d3891462da80cbddbd9f6500d5954c5e860992e659b046fd01c122ef1488843738ea9b90c2270b3091766dfe3655d64ae3f3832f61fe6414194e9145917c8082269dcabb03b20e62f4b00f0f874731717b61360168f47e352512444bd1055dd03ac120224b23a13a31c4e6cf40a948270e2845df703710afa8b4543430ad9ea281f39b4712be0be5f9dc561692f62d017af9077b85fb172f0b331afae7d068be65d6ebc12cf8fec34c8efb46f6de3e733c72f2d07bb79292563670617588461578023f1802ca571b80a5e6c7ee4bef008f911fe2b5340d2537a1935a384e8a21c6a572a17ade244490c93331b009f261aa8089da642734f4845bd0a43ce72581b114e365a24b411d8a1cb0f0922cafcd60cec8c66ecb9056b0b2e59c79c6d45e553e839b82079a21b301b98af82e18d921c9258bdb501d42f3f6e7c5187a630595ddc02eeb23fb96adba53bf6681faf27811aedc30988d6676ca7c85c77b08c633137702ee9c34053d68bca807450a433ed3413998d932000cf9f3cf7c3bb8f1f22177f77c34a239df6a90e8483beffa499aea24ec638231cf6ff1c1f7f05267dda2b0309a6bb5d82d7d937f3dfc76d64d0d7609a4ff788a768c988381dbe835c89b5300bab8098cb94474c773941d8db5aa80e8b7d0640bb204818be2270660e848d898829769f9ec53528575222c61277617bb0fd40207b90dd6efadf1e47317bf844511854e35def52bc4b0724e31f68cbfab5f0e21c5311504ca841815aebffb830bf7cbcaf66690bcc295f3777d7a24689b67a49af5a0244ca5ea0c9e37bdeaadc8e1ef9b61e681c0f985d71cfd88e0ccd2763aa8422812c1e744705e79aae43905659e005405ce1d49334e8dc051a27ac83cb4143ed7c3718cc11e1ac2103019ab09e8a1b8a0ac8fd0dea583b633c63b58e07bc049b7cea77acc6f367bb16ecd5005c4583c4391d5ed2879d6c982c7f863560724727898083116c54c29ecd900219ae15ef068fed46441aad77a89018605e0875f44df17b82137632ace65f46c423e5c84fe29afcd27723ac0bb17c7929093c5b1a224793e29489f2269a450b9cd8a53088c86078c5895a25971efd652cb5bd864102bfac69dfb03185e796bc27685a06b03acba2420e7acf055b3a5d566db4241ef85d7e9a20e31d8fa19be453aba6680ec967995b6573fb6df5c59a64b5d802f4c1300515df40aabe60f337122608a0026bb9275a51cc1ec52709b36f8bd385211c202f772e3531bf47dd00a3b5e9a36d36d2da228e8e93a8a6a5a711d7b8292790be6033645455dbc09aafe4749091c6641101e445b65ea8c55b61aab384c6f324f41152093a12c91109b6b98e0a732f5487dcc7d68caa029925b0afd5bdce5e300cba836d244588dc8ac1864c611016350ad03a1c31ec8cc9b6afd0037452df5d54fb626cfc14792a43bb1b28d7efa0852491a40dba409093c92e1f4747017d87a82e3defa022a64a3ee9c22a04ac7d6d1429da1d9a05314643e7dacf32c2b668e5fe1a0b81454037d80c41e5dfd6c52b75ef360b994541b75e81f76dca069bd77fc9984ec46eafec2ac7b7e4a2a5f9000fa3ee8ff2171236b164ab2eaf90f4d859712948c3a1a7befb1c1c3230601dd037f3e6ffd1c5166a739233c310eccfc880dfed8edcdc5dd6d4bbe4d2128c1cfe3c3639f1cb9d27ddf507971f618cac81193f0a73b94700c8e3bf7f4ac9ab07c10085f5d3ac034f483a88aa800120067cc52c18c10b2d1971ac0aa0ad3d01766a66700bac404084225764a70e56bbd9e5c3c2880f58ab47f62be1d7e7fc3cf2d5e24b0e9950f7d2987631dd9acc42f15411498d579b852290be78644ea5181407028033a922e491bbb12e33a2e8c40109742cf5441ea4e92b951d0f799d221ad379f34fbbdd073e058dd2475277d6214f22b01b1dbbaeb79df1045fff14c8fd4e764269ea113dce7fe96d71ed05388859837721062857f92cbb9b3c2c11892ff9927b49c030d3ac70c4792f70de4d26b6e453293db404c5811916f263fc05f05a985a93533d94556ef72fcec618a0cd4292056546a7d0e548e706b3be232a23db760ff8fa12e96814b5041e0a7d14df8c652c0d05994d10428b18ddc2f3bcf459f83b80db2f97b11e77fdca62d37c8d49ec7da1c8856da4670d1f5778a3ff7411ff0de9cb256d6dfa66569d0d6729ca24b713582b763d48dabf59618faed8573255d89dd13def2ed7b9e01b4ff1f2ca7cde2a60929778a466f07bc5f7791f387b537204c6bedf8b92f11dac069b5065528f163925b5208e65ccec63e19185c1572230d6d42965f76110be6d5c12d05e7db7e70ae29529a773007e5881a4960f0ea897a3d89d9cb1d05f5637060e3c1a3b8a34b23995ce6e3d91021d30b4c450f15f19994ccd70246ed3c0e11ee63f176164a60c9312a4b00fe40b358e1c910b2df5a2036e64658ef6aaca2434c7e093d50036de1401e12811750e0b0774685ee6c680d7eb9929fe50822b2048c023e8eeae0e17f6517c58902eaba20221f4f36fa017809d470a936ea47dd3a7c7081466b2528f18cdb5c9c6749f355aba380b848e04176581fe22ddca447cd918ec84a6e8e45fc3b6dc8d9cd323d8c1b430fb7130aa9c119ca970b3eb2ab2b9332036b3e056194497bb88269566ec958b401e6c63ac117e62b5897500032941b7704da2abc25e61c0c232cf8941a2611de8586189a2c28f560a1cd02a72ea1dd02b17c9c9cbe8c0c3a1699ba3b5fdecc8d24c68f3598a08be0ecad3f6e9471ca44b86e94adfacae43d3513b1931066ebd88cd4912c7fb5c03bbfa430bc906986c337a34f4b61c298bc229daa63abaac9a19c845a81381ef774a84fe17b61ef92510466e31b48b4b93f1b0d945aa5d446532749e8101f44d0f766ffebcd06b6aa1f61884af03856e3ed5511689797f54005555f644edfcd685d8d61e0f786f78f49f77645839b9308200874d305fc04715381d77568289507542acf242aa9291f839f90c929c2b48c0a251f388655f654031d3455ae1582788217627985d33fdff958df6efcce11570352b1cdeb6b229895853b010340a0158d57315f0695d6468e905160ba02227589bf148ce4ceed456dc73bdac0476316f101710dc0e592d6b175a7ea736b3534ccc2ac5f5504826167135e5a42d2ea262df9c70383338a9c7c14c2c01ffd772f1c9246801b9923270243af5804bd6e617f707d2e63fe598a7a17ceb0186504977450804f1c7fffab4c11823d233222ed549d97f18c80835447799808691ba76292805f90b849b1024a12127ec633300ad0dd4154087505f21bcd7c2a61c8f54e2bf3622fe0fae005700fa0baa0571f22fa1c863634c386a870c825368434898848f42612b9a491aa22e3032522ca083e79a0f8d7cb6daad7a18ffb171f48c75e23dd87fa229418ff4d71f963caf47da54740dc109f418bc7ae18d8414d03b7c288e5a01e4dc06224872158109210b6808497d834515fe19100520914047c10f2d30d2eb4552759e36a0e0d680e10e70389664943de643a1b98f81731225bd098d0dc40dcfaf0b3831032a8c5fc31b7954223ea143ad93a1a5a30a34ba2cbece446f4385d3da226204b182a30c56cf6176fc06d7038378b04921a7401aaf86ced5308dc49d378de103246c5a2ba17b7f92d07f5598e0bdaf34e1d1bbb21ba105bd7355d9e6cb044a732892644e184f37635f630a0c626b08338e3aeda1b502d7c3fe2855b2bbcec71140929145e2c7d4b4e499e6e77e65be0d35b6f36388e6a752a1b16b265aa32f700b11a2982b9c2c66302225a67dcaec2e85831d7c25eaa009af0b3f13f6a65aa03a9e0cd7162e26b500f76a68d5f8dde61db99b52e197d11488396c258359e7b3538db3a8f1d77b1e5e650db129aca1e8a736a5f1d32fdf2bedec98c91cf094ae287faaec1076e82c0b44597305a062891dca11cbdaa9d45540c8ab9131959139239afe6b753e544a6d53417837659aa45edd258f75d3e251d1f4596a12a4aa4e357519c454eac68251e3414d4428e86b402c98bb1293cc7343d3ec4e2de2557da8de850c1bbeaf506a50fea01c5d8039971dc5d33acfd5c82504871baaa33ae057fa5ee765036327af816e9933a6de289072a3c9806fb5bf96836a522ee2c8e003714d678e9aeac1a0b231300e4c884b6474d72182195c81988e4dc5807daddbeccc8461b3e13209668e3847d6c91624146136137ac628b9810248ccf5025cd42c4f19ab0ce06381c4b305b3c4d46087cc4780dcfe82010d5e2dd409cef3800f814ebf822c2807b63625f6243fc5b41cd757fa3f6a580313392c452a8c403fe84141a00d74ed270305894311de153eda4c32222fbdd23c35e7cf6b6e1e75fd655981b68ba6ffde58aaa368fddac2df38b90b91eaaf3748bd8df581bc36115b6bfdad62d8253cf08ab8bd7bffcb2fa4fb3a8debf06632049f2d48ab3da53a3afc3e92401ebc499c11751511a1e1420525810021afd64c7201d8b9a94181c4282096c93c990c1ec5270e204be9476ceece75804ee44c619cb80bfc1d600d530889d55d165d3830d09dc8c3937734d6495570d8e8bdacc9ab386e5b1b5d706d6479160343f450dfbd56c6188cdc4e8224b89e1fa92510241235103c1012e0cfa90132c2b9fb40d605e7445251ade2dd491fa3334c7f25621bb0ad88a5c4e41a58386271e814cb9efa4b22ac361d9963e2d4a6a9d106d7245e5bfa6ce2d07147c002d9e800ccc3e5e80018b09c889a4bb408400f737865571ea76ec2e7738459d5fc05a6012cbdf3184af8dc65d681c968cc3dcc4eca4216759138164153c5cf50ac9c37da7390a84bd17d49eb2b6b4cf5b03107f556124d8f2e3642e6fcfa8d97e31c24f4420cb8aa0dc25d0309da61dc908345db5ee35ca645070c1875afe0184a761b030a0468c90392f3e1a16816d9f11c11489645aa073f23560d531099c10bb1af1e3ac2a00d3209df3a85b5538af9d8f0a504901bfb17f807705e0dfab67e2d8cb5c9351b2bbaafb5a5b4aa9f2feba1d545ae02c614cf4ca360e1a29bc2b7c394f8e00d4476a644140cec25779082e9f2e90f424b03648718ebb73297c5fac2de0519236cfa87a49c23d4358255ad177d65ad8e7bb8382a522cb4a16ed275f5a5dfd059d3e6a01f507a28c92053146f095df4d7f89af3346f868655b29475a3a3e70b0429a2b8c86c38c82a78dfabe8a6dcca549354934a4a19a77a18b11100ec1be21d8c347fce1ac0656528b3a2b48d65b468b0947ab0f5863e01076361f09914b5052f8a851908c45c5e3dfd439078c87c74f73d0a5e7e31b174dc4fe59937db5f803a79fd9e1e44e9c325f3ad8a6cfecf5410b4f2c1f601fe86f69f29b3a0842c4a9aa571fb7117786309e8d40070f75622a4878c05e614b663c5f41cd01c19ccb1afd5804f13eea441d5480d6e48f9fbe70693eb8cffe0ce4f9feffff3bcbd91446fa03881436d0c1c8d73e42834ff5890c9d2c32989bb5968da847d0a2150797784a4839d2e0f04de2755805ebd0435db96f838a770898ecb07461677c7c1019027340289bf5bd0414dec2fa9e6561005f06e5776b0c26c83576e5565352804aadb396edf58b1467333945cbc231449425b40f6613f2c539aa9d8de772e6aa498a506dd79a579b74adaa0d7ae0f1630fc8d10349db5c8d830de3568f07e93101c21e43809f3a1926378ac1dca22be52633f9c470066d09936c3e421c7a43d56fb24c53228c0199028835c57bec37c8ba5f71b61e152001fd8a12583cf160e224c066127e5f490c21f7b22902525b60b024780d09244d43584c63fe02c3d29e3246b7ee96a13ba2a5eef208aa2deb4357abee1075a1daec2e8f811f21a10b82ee2aba937c375438ecebae0cbb28f14ec8ee26de21eaaaa6eb44ecd62beb8a80faffe2db5a8c7077ccd017ac07ec54c981a916423a5efe5a8c98ac3be1e4106ea4216544666c9885f05df45fd556a1dbd5d1e40964904bb28ab202f5979a2174c3bc18feb84c4f0a3a45da1091e0b29d4d3f94587d945510f08945482e4be0a077ab9cfb2e32f8941588bd316224861a50a50924c05a77e02536d23d4fbc9adac2658abe7fc0798d16fa9377b7cb8ccd9a0bd4d3e12fa727ad8e145d80e66f3ac2b253165844909ac35e45ade571e4da6d70cd369a6954412aac98bc1b72ca887ce0d12578d34290c7cc53a7ceec496d0675a416988fed7ab6d0ed41120e9e89aa2e3e314c83109abc968140da486610fbf9cae8ae4717e4a97ed93e4ff0abb00da51103fa2923fe81f2c4a6e8e2452b8ec2727118ebd6cd29a5c086529c5d6aa1d16e2643724373aca6ed66126576f1b91a38d94926994cae8b60adabce04d278e6aec2891cb2168959ab420d94f9b63a07ff1ca36cba769ef463aef96d3c3e713ec2cc70da04ca6d9377613f6e0db02572fd582f838cfed383c7bfe6ac592e2eba999e7876194c29897f5b2fb828316d8d2d144f089d8e855826eea13c17f29761fccc12a63ac6b04f1394e3138357c9286d631e06e33f0602b09b5e3612f983426a081b1e1f895832ba08371afcf3606108d21ae8687037830d090dfcc617aaa2923ce46c0d733fb9189088e6cfe5c65ae8994e3ff6047d980663a05fe92bb6065e34a8d0607c0f36e7ff527264069b1464485e456fb41f49f8a634ccad510aa43a4a17eb68dce5be446e8f9e1a00e6e0e6be00f7c40ee60f2a951e58f3e2840919d1a0a0b18cd4a859dc08bb2d346d99b55304c008d0cc064cc202bcf31c04c8f86e6f39b8c122b26b8737079b3be1a39746834e91dfadde507c3bf7ead480659ad385f515b77ba01b2ab1a3a3f15b1be83855c70f40db227bd79cda987bd8a09c76fe5e7bd78c7a7c63d0d5ced26ab48d89e9a8257dfa5975759ce6c46b576585bb4fe189f9fdc4c8da8ee486d4c600a3ba3cac91f175f3e8d832a15d81aaf169750c5c9817773718edf78255ebd33f28a421898f05cf4b6201d4e5bc31c43ba3a170c9fda80578e12d18c186dd83c45f1048616a50f27f9b3ff8172c506664a1097f9a1ed4ca99e1f98b320645654f7c235d7e71a6bcc64c90c7193592a18b2ae3070c27114aec84956b164bace3b4427be5dd191a7bd12babc8e43d0dc2f2a4f2a53bea2c32eff32497634a8ecb94bc9661d2d6783490650c4af064d2fa82afcf01b57afd11378c6c545646f199ff1add190e6069b59e5e90a882970681adf7434f06dcbd4f3c8178bf16137c310ac6833cc1abb328bef1c2160e848625edee64d27c3c7624c46a784ae87185aa68966c62beeb88313f11524e4318558262eaf99e000665597c5f49fd1d6c681ec2b10f056635da8e89c824acd1b7c4e60544af36b479c742047adc7cd5b44c17a6abe5a8c5e5b864bb81731ee52e4ce21779548c48cb1bb55b0bcb53a4d5bc01f65402e714d5e588aca1107d3383f58087fb08780453e940e0505b71974526f25485d7434a542603972b9d16942d21de08b5fd8f418512cb07c72b9f0d42abc8582990aa64d343162cbef6c726d50458a8577911dd8c2be8df717ea5ff03a510e82aac03ed56279681d5de3aac54305f51d121ddf54f3821b96a98dd4879092410c3f221046e53e8dd4ef1c223bfd07529a82940214c4d6ebba94149f4da2360683ff2bbc60a75f0e7dc4bfd96384f641254ac7ed21716761c59896692e033c183a8b8a0d10857efb3665ceae3b00cf8c9071ff162528172fa88471304c65d292c1e30aec10ce21f09a91a96d3b54ea4607f6db60811a93db0156714e7501592efb1932051ab035bad09ace57731fb489f104b226a1bdbf44df1cef92f57ceb8b9621cad8eab280025f24c8a726b3f72e4d403433aad8f28b4fc2b3b4c1ed5c8acffe611fe8b4aba40095c0a5f29f11683f7f74294478432c2aa4403b4ce90730ab45df941e1b9c429affdbe95e1fcb8f86d697ab0a867885af570bf603eba3a4c71b6c7795f738dfa2abb7a81f4b148abbe7715ce5368ba84721a9aa05db821f806f8e896e2999b4610d173e1a6de253104c5d4cfd6d449a04b4a6f04c46147554f7ca88e8cd27b1d6339e595047aaf8bced32b5c045109a4ce5d75ccca44aaa923dbfc003356498be6e1f867d0e37a5597a3af6e49a7a56b0957ee393e22b1e1a83be400482bdf2a391e95aeb3c860bdc6a1a6c6b0f62c43f03c11dc7cb533cb162f133cc23e492ede887b9fa89788de62d9aa3b48d7aa793eb8cea5f8db4bedd9e770a63248a3e99b8e889a916545cac67330c388fb88ee9ec35d94b008c6ff86b5b3448097c765940436825b2660ce592b8e6c9fd21ee585a507ba615f13376369369461929f0a874502f2f1777d24b96a130c62e2b2071177f5446222b8cc883f850f86e0fb6140a90665745d3650d136891bba535094983e632d79d395b1d809d6a2e1d2c013c5ff79caf6f029231d5e06c67aeb699883af1a65f4dde2dea3699aa50abdd97d99e6bc9e7529c116d2d555c4a7ed458c0f0a8187ff82a706ed8704f336e07ed9749b24289901dc5600dcea1acef051f1833bdbc6230158360ac84fd77bfc3500f9337ea85f903461a4b18079a1351220b446720d8f626b9dc40ccfd7986be066faf048ba26ff817671fd7d9d83ed7c3fc3f1a779c8764889e463099be6d7161c40cad4cf1c80cb98f8b79abe66ed0898549f0c14bf7dc32476a886777f317701b1b5e9b15014cc8016eab43612ae10716f937fad1e945e292deb4232877390b872a4e0eea6e21421c7e88729172bbee8c4c1c0287fe36c4e2561654cf97e7a82f7ea409a86be3cfdb108c83e1bdaed640d883855473ea3d06746fc09d663701c83ff03040df1633e8e07f21c37797d0291493f769b6a1cf84570473642da42c5f1f330bdeddca7a087c0ef1c0995f0f6db0d129046072254886f6689d914cc5838b88dbd210a967f0c1c5f71c81a2a903fcf1b881bc68c14886b085f5803893826f71c213ca5e75870c6daf2a7f977b4e43522a300918b9f6034bd0f445811d6664c313f9318511927565062a33fa5f82f7621c69ce6893f1beb9f9362e389c533107d4924634098a19746765cf8dde42ad978c5bccb6792d4f8bf324279c6c297fdc5836e9b56c028d264be5457faec729641301f8c22e0247bec21735863380eeaa85c22e5134c65901d224506911bee428ed26aa37a4148ac76417c80a34dc235cf0b84794c8b06f130cc2956a2957b8f0b982664de77524ed15d9786e582bce7337cde95c4ae7a69e15791157b4ef9ca9141f99fb867b90ac0d8810d4dab58a66387343121e9a1ba1e56233062c5c714118cad1e598edb061c6f0fee22ed4af339497ce072aaf8e5ef5667ceb843e6189441555eb5f248956554ee035a72f8c92a72476c5a9ce5ec2a092bb1c0df64c77ed264784466055abeddbdf7681c587c2b1f90e4023bb39a42ae6a58846c949480f660013d08f0560bafe7016f44129ed0e0b060bd08889b7aa154af34355f3a024aa5ba59b0a4b570cf02d6bb856f6dc0ec15438ef41ca06f562189cdee8094b9ee4c00e91a8c53fa26f226baaeab44347427fc13d63e9a6bfd649bf3e86ab27037dcfbc0ada1534ea7e403f13a5999e80fdd3a63ab13b9736f4aaeebb71099737915b0b6474eab5472640a9a345d9e19a0fd003a01739c3bb68bc1769f6f5394463221f8d3558b37ebbb33532ad1809a9979378be6d8ec323a8d84721bd2e0043bd8f69cd6d2c247e07894b7515c7af8ade216e3843d8fde5b2dd89099afb48f5ab2a80929516901ae61ff73a743a037b89bbb2c726d74ac9b90192593c5b82f8bde044e814d6389e8bc7477d1229defb8e5cb302d2ca58201ea690e673530ae26e93cc3333cc3335c223dda8baa7eb7c1dbefbc0d3ba524e95eab904524feeaa39452a69452a6bdf35ff7fda4910606ff03cd95061d063a069cc37320924c508ca016ccf6e6b4701f446b064a11d4c29fdb471b975ef96fce40218242bf30fefa64fae93b91813284b47a133a87f00ef20e78f0c021823770948ccc8024470e316adca851e3468d1b356adca8a1d46e27c150ffbdaec6b03bef98fdc30418ca2cbb77d45e6bedb953eb30f9854ac9a0c477f22c5798f842a5eef1a23d6d2cd3989df4429d358d67997a410beffc2f366c18c90f1f3c4afe9714c384174a7d9775df8976a1ba975a732e67d1855aa3dbd8c966c985426ed0f206d141cfbae04221c30613cd361b32df42b51e64129d05a16599640b857ad7dab4c8d479cfd74225d48eee975e107a2e2d14f2fd71b39ed2cdcc422d7bbaacf1ccc573e6b250ba247336a697fef1d5b1508c929e2f69b9b8cc020bb5f092563fcf1a6fd72b94e9f5ec6ef69cf48dae50c9d1f299d7b65aa1102d8de7a3675628d6c589aeb77fd1245e85f23bccb5d83cb1f1655528fb4ccb7ea6d53da99c0ab5e630273dcb45eb9f50a190cfae353b15fd3c9d422d69ddddee5aa65098f87798749df145a5506dc947d10c5a7a7b1229d4225d90d3ca6428974ca3507f88ebf27831bae4220a65926f39eb8ad6cbb242a10c517234b9b841cf0b146af3d192df76b541087d42fd2feccf7e833ca1d220eac5fca7bdfced844a5e9679cde484427652325ff6a46773130a0fbd51d4b7a309469b964f99f6984ca85d8d7211262684161a4c285b1c97f3b88b07f17209b54b91e1aefbb584c29389d59854ec75de4aa8e54da7cc2531da56b4945046d1f2205f796e139dc924542f45bf7f6624a10cbdade7bb3599bf1b0965c7da9ff1dca4652d9050ec9b90395c50bbfe7a84f246cb16193e69b1398e50fccb1c4d848df4ac6d84f225a5858e255d9eeb18a116db578da359f6fc22941da6c33fc75411aa3fddedce4f2642216efa74d326d9629b88500b4a4c3e34895059f3106a19c37c897c398f2f43a8774e49fb2044bc0b62212684502b3f7f97b5b8214f888350cb7ced9da345b73514844acc83c92c1bf6c6e50281676f300184bac774d04a348eb6dee499fc415d72e3b3baf77ab93987c7c40f8affeed61ef7d647498f9cf4412dea3fe8b8d11cf048410e78a46099f0412db8e8a4d5637091cfed41adf1e59ab23964d4d383d2e5c9dacfa9d1fbe7412d4427d99a633c28cd657e7ae1c5b4e97407b509b9df7741ee7ad20eead88e9ae4beac9cd0709c63c1a40e0aa5f271367d7eb13d3ca18342e79149dce74bc4070f11fcc0640e0a353a26fdf682d82bad1c54624ce6f5b7a0274ce2a0989725691e34fbe9b0b95163d991674ce0a0bcadb9d9d63a9716d3e40dea2c7cb3b071b174368e85891b54b699265fc79a3a6983a699d53c45766ad09974133628d34ddf092dcb1cfbccc91a54c23c2bed596701c3440dca0cb6f9cbd6c42f4cd2a038219a63eb59e4dfc713b9434c4cd0a05c3b99eb593e4611933328755cd4eff89d731aa5c3c40c2a8daa3136297d2fc233c18d1a64d4b851638c1a374870a30c6a9f8dd1820cf731b86854989041715e9fbc754bd7ab510619356cd82899c2640c22376c22061b933080e10b5e3823470ea6c0a40b179870610b38d1421672e4e06ec0040b252c32b9c203265628610b4caa208109157a848457052653f0111191084ca4e0804914183081824803264fb0891372e4e01b4d60c264091898284164a487182d98c02409233dc4f8dec1630510982001039323a089117c44a4e449183029c2488f084c882081c910442800128c09083044467a88c13e7e881102f20b91911e62cc80051400f185c8fff81f2ed800482f783101905d38004417220f00c945034070f100905b882c00c4162120b50001a145024066a112a3e3ffc76c26b59185d23fc67b976c36c62c028985ba6368cc54b7553f0fc7391dfc20b0500679c105d377d1cb63f803e41540007185caa5179d972f4804a4152ad14a338396f48570c11c243ec430d73bcc205156a83366bda6aa23d3b9fa0577ed030f64154ad7320b9b74cc5a8eaea50ae56c52b2d3dd0baed94a8542cbd293d0ac41a850ebd72eeb31254cbb3ba750cf4bae9e43b469bbd7142a171dd1b272257b5e4aa1181d5bde96fc930c2d29542f3ebfa89fd5782d4300320ab401220a95bf5c97e4a7c690a60109855a068f6ebe2ddb23878f5c810d443200020ad5971edd6dbafbaf379f50b878e2c2672de30985d0727316b347134ad54e287b6330e92236cb0cca4c8070427d32fa565ccdb4ad7c08904da8e7d53b54a3f6abb7c68d1aeca3c407aac68d1a376adcd084724b87162d4ce5052d4b26542f9b36cf1e5bf3458f09b59c7e7fea647e16747f0995c96d6efd2174e8de0147132eebfec610320575109bfbe4b3982f5b5c0acadc2f89b08d9f2dc89c9028285dac494d5f62c5c40f05f5bcceb225976c5d96fb13d472fbbcbcc50cb92d4e504bca9547974fab09ea8ea37baf76f32fbb98a0965ecca63d7d5a82ba5ed64ee344b78994a0d4bff5acfb82f42c9e24a865d1d0ad3f8851db2f1254eede427eced733ae23285b4e235a7ee6f9701a412da8d75291257cfc22a8c5f821e2393266395422a864c809d398b3b98b65c810547f9a5c741d0c656e6bf12593bcc6163054a73cfe63c9d2e3a15f2847b3f862ee6c42c8ea0be5c86cfca85da2d9612f1472fb3667f01c3e5c78a174350f5aecfabb507666d2b9f7d33617a3e842e9b2f63cabf849f52c945ca8a3671de3bb693fad8f0b75362d8f7bce939ebb740bf5b81cb3b4e593932fb585ba444b328fd61e4b0bd64225aeb54b2f67145aa8836c99ef336db4157d166a17cfe1e4880b3ac659164af556117ad4e67f49140bb576c89cff66df6f82855a9616114fcacdb53baf508e9c7c394db7701a635ca1d6df565a87176499a8ad50aeb8f8e27b77da7e486185f25ebd73bb8e2ee9e8b20aa5cba25ce812bb3ffd52854acb3986b4d125cef35428435c868fcf302a54524b660f5b3aeb69594ea1d09266494d4cbf4b17a798421d43b3107b93d12c6e8ed7f139948ecff14c29855ad2b2922e5c9ebda0e54621853aadaa2b4d533b9b3d94512865b470fde13f7e4e140a1ddb5df3b2a6459e42a10ef52faf4ce892eb9a64030a2814233b3b2be5bad3bc3d03ca279441b4c3d87ce8b8a62342f18432f7290d0f9d94a96991503ab1cc195c635f1e2d9b709ce3046513aa094a26d49ee1be66949a8a67144ca8de25f55a96253529bae5120a7bf5955b8d9a3f9a2594e1b2dcb9d96428955029cfcfa347668f12668b8a499349aa78f0e8ea9e65b426e51c289350886b8c6dba2e8a2414fab39ca3b57a0bc4408984c2e59aadd7a1030305126a5d9ee509d7dd4267f947243c8bdee935fa8e5007595b93f19d456ebc11ca7b195ab6f85875f13d83c208f6a34b2f86eecc0d326cd83070a02c42a9e2ea62b66f7b59e20b288a50890c6e7b3a662cf4014a2294aec5e7fc7ff95e460b0511ea36e9dd525bff8feef4c6a01c42e527be31cbf28b398b2d144328372bcd2c9ff096b49c5208f508a5f36d7e7625646fa010421d4429577bde590b9fe9201462b4ebeebe4669291f4510ca183e8ed27ab3ac378f44eef8400984326e082d08f17a4028e365f26cc9ef3f28339732f14a6ad0f9e507d5be0bdae65ba66e1fd437e7d1b7cec30785984b533268ad3da87c35ebd2db2e3d2846cb397e5c109da1cd8342bed834d72f4b3397f1a02cbd2655c3c877506e97cbcd7e7f423fb683eace951435a6b5bcf1540785cd6bf948111d1473fad46a99ee7ed13407b5dc8ffddac2f64b84e4a0fa3c13b2d5b9aa26350e0af99dedb1139e544f3828a3b8d062e3786f50bb671099539b6531363728ff73fad1e2a7996164cca0b441e1225b6b87edce10286c504735efa059ba191db350d6a09ed9f33f213b6f3acf0b1435284b931675525cf0f6150624474903763bfacec3be1434283fbeace48b223297d0a42950cea0102b9b1dc45e9ad233091433a85c6ecb3a43f3ba1da09421296440ef87966aac8d320646cd68dc68268a18d461d3ee29d7497cf61e2961c81c1430283768b353ddfe996d51bea0be9199f6739f96955e50c77fb8135f736a5b47169433d49d5e16df2c91db9ee13877080c4a17942ddf6b2d54e6554ec60b0a1714b2b4b478de2d67dd725c50b6a00c66e21d4b6cf616142da8d5e692ff1bd4374c280b6a99d139bd7b8ecde552b0a056dfe28ed698de720c5d41a1940bdd7227cd59d896285650bee459bd36dd5641a537adba581f44ccf45850a8a0dad0fc9d657349bde6442edd3905650aead73af82b9d3f26b9798a14d4b2b071c783b750a2a01643e69897d594ba17a64041ad25e62fb27474255c03e5098ad3a72ea6799f988d13942d339ff6d6b059908d0c4a13949af59e0e4a5c508f09bdda97d94bafcb935ca38c147c82b204958b91a3f4c524e7c51bc7392d034509ca53b25dcb7c2d9dd2a1418d1b35540083ff31fc4b3e073eb88c595092a0ce1b6dddf36b4942509080164fa7efad9ee7a411921308ca1154ff513fc6163708fd251ce7cc08c711152d283e8bbe682556b4dcd2927e1f3e7874e20e16c48005356ed418a307bb186334a29205f5c97fcf32e6f9e072152119b161a38475f8e0b1d8b061860f33d0929004a18205950ebe9dd3683219f3e3383b5880f74364078fbc647450b982d2756f76299f793ac72b565066614ffe6b39291d4a247246a50a7b99f064e6a59d45b7b8152aa865a1e36525c7bcca1414fa844c276433d4c69b834774f0d861460e1e2df81f0321c9181529a8ec85da07995b3411518982d275e8ad17d54d69d5f80e1db8870a14d4b92e8b9e7bfff4e6d613d4e72f4c691da47fbaa413d432b368eaa2754d506ace4ab9bbbf98a096ea61339a5ccf9cd1ca1254b23ec8d2d94c68c8c92841f19be579f96e4c6f8e7e5492a0ceddb2cb8bdeb2ae222a1d0b2a485076e7d6db7f92a521af42e508aad3a037fbb499a45031825a37be2c5eda88ed178742a508eaec0ef31e833c1bfd22e1d1021c25233320a91041ad6bcaf565fef2f47e65080ad9b9651f932e25833c186affac673ed39ef9e6c050c77619efe33fbfcef62f542e69173f646e0cb7972f1432cba1edb29d33ebd50b857b9fd40eedd265dde28572b41621fe92d25a5dd22e94b9d1f4c6c7e41df4a40bf5ee67b1e9d746789c72a18cdd393f3d776c714cb8506c9f49fbaeef38d7dc423de2735e7e869db4d7164abf3b139ff5eb70736ba1b4efce2e7f86b4506696dd2c7e6b3963d0cd427d4aecfd7c7241632d0b8516cb057d9e947a51c642f51eee1f1a2c182d64bed6a39057a8e3ed77a668763166c815cab4d9754cd7ad509c27efbb972a2b1462a7466db45c85ea74899ad62caa506bfda646634be24279a9504ba77f27624abb162a541a466939ee08424eb121a658946cfbdc6be3f24b0721a55087f151324634b478a7a421a45076f62046cc87f7197b14aa19edf1c5b3a4f799a25089ae78777825efa531148a9169738f34dd711d50285c89d9f8fc70cff63ea13e77515d768d69882794f94e5c58bd7b536d857442fde2bcbc2764098f630827941de7c6e537d7833446c82694f93afb696b534334a13a51a39a75f4b4f58ea9434826d41ee7e4e998b36c141d136a49b618ee850e79216a2d845c4299f5e9683222738c39cb12ca175fdc460711b64194219550a76bcfb2f669a1845abff02cd86f9a8ea9194226a17af52c2ecbaa7a32bf5612aa171d2d444fe76eb4370889844a8817366ab9e9d977854042691ad38f72351d7e7a843ab35c234e6f1431878e0869845a8e9db32cc2bee5ec2747082354af3b1f7c3548710e218b508bf5a0a3e87ca7c5c48a42085184d23be713fdfe1ae33b7a8a0849844229d9ba75a8f510e2a58ccd420822d4a5334fe7b61afbbb6dd810b93e841c42d926e23547fb34bfbd770831845aa6b738b3a66943da85506939be3d260f19b4cb212b84104299e53fd5f56c4c1afa41a874b7cb92d9479bb6bc0a2182506f68d9e59d1097b6bf40a8e5c818be9469cb5dc21040285fe730a39af58349ed0b217f50e8e42d8f9ce66a10e207e599bdadff68e9835a987f59d0e2c36f895b10c207657ec887cf3422b4cedf10b207c5860f7bf9f3063b9317111485103d28ff3334c77a51a4ed233dc4286309a084903c284b28a12dba5c78504bf78f5135a4366cecf0f163edf0f163e919217750d6b91c7a46d7648bba1d942e9e63d36c6dd0aaa98352c4859617b7d241994e8e92299bfa9f732173506818572fd575ae0d217250bb6ce877f2a8f37687c441a1a3c9d688cb09818332cb0f0def1cb19984709cb311f206e57cef0b377f599b2b85b8e1284a8868528f416612259e1342daa04ef3ae5934996aee5adc10c206e5d868cd09a16e42c81a942f6b4b8934dd624513a206f5dc9c2895197f397a1a42d2a072f9a27806eda55f7e41835abb7831e3e8d0a6eee50ccad86c9d6494ed712d33a83cbec576ff974587caa06c49e7e83ac6c9a0aef19ca3e8c698ccfa1814ae53f7338d540c6a593a7dd1b463f6c63b0c0addab2d99463f29d20406b5ebbbe7d659505a76e80b2a2f3799e40bad17144aba8e3efb3a433deffb3a29a922e7d32ea846c968d0a0b49d742517d4aed5272da345e9af869010b20575cc9e65072dbc7d349316d46a1bda26ef2ca856e49deb205e32f9321ce7ee941082059538591a836efc70f37205f5964edb7dd1b56572d125156205e5a9d1b08f15aba0cc7acd99bbb4bae4da8121840a6a99333c28051ad8e3801d07140d27d0ff4b0626603610d938087409c90f1f0408c38cc581048441e2e3fb87f3f0d10301202019e9c10908e30e0008230c554008004042b26c0c20005cc26e83006170093b0f1f360c000001d040008f1e22220a004018200640008d2c208006164a9ee40a86783967b1f63139aca02c19f2b343f6df5bdc471594e9ee611fde367d290434a8a0346fd16cfe32261de5f8a1234b768c7880c6140c40430a3952e2230a8a779735a3d791121e8cf80f1191c48311ffa120a001851e3a9e902207a0e1841c29c981838445441040a3098a7779746d7217fa696582f27468b84f7a4ae5a3e3751c1dafc3d05882625d48ed38d9f1d8e8781d4b43092a2d8c8ad8d75aa7af9a04753cd982e9fda8d9793bde477a804a7698a0041fa081049550b761fced33cb791d41592aabaa2fc8d88ee010e191a364870948a022a0610495c7d3a22daba7ef70c27110de0f3c111fe9ef4192ae64c74892ec182939348a60468fd6f13a0a4083086a35aff9930de6f2f43ef81288d018c2ee735a6d52de193a3e78cd422518c6f8229a35eea30b172ac0c046ecbb6d7039b3243de09123078f050d955f9c59129dec375ba8f8e2f5cd515fcf449888e3dc3933547ac1467def7cdb5cfb15bdc20b7cf4b5cbf8ede2b4fab2307b33bd695b155d2c8b1abab532b7e1fc4a2e16674c9cd8cae7ecea2d155ce441a378cc9ea2b34d83a78b28f5f722b28387618eca2dd4c29b904967df72313e1c674b763c0f7e3b50b185f2e5adf5d8f23235b75aa835cba4937ad0ef2f3bb80789480f7e07aa5106193c5660c3860d1b44a8d042ddb28bd6cf8717ca5f2524dc3b7ac0c3f1505099853acb72f488cb3a9b651d1ce79e84478e1631c3474982819d8f5f233e9a64fd20b193855af6c57a31e78dff66c50269a74d48d96e39410516ea19ad934c37a2b5e4e57d7cc90e3c23545ea1f4ccf352f44e7b1557a8ffcc649e8fa915ea2c3b3ecf88dde7d362ac508b59bb25a51a27ec6611915c854ae8f4b2a6532e2224232222783c7c34eb1011d95385d2b5696baebb8ece3d15a83076d66de9836b659e421946c68f37225b0ba5941553a8f6854b4a976bfd2885a2f4b69ca7e765e448819551a8becc7ddf635611c522b397e8202242e7e8ad2733cc5bf6e5ced2ae84422d4ba66ca3b88cdfed028542970bda465f0c9b35e8134a1b15938fd13336ce154fdc2e6a5c9c9b0d7642392fa48c4c9ff39850fee08432aeb92ce86f67b5e182636413ca8c3db69dc5fa0e130f1eeb4250d1843273bd4e4a46f3472614deab5b9a5c780f2d1dc184eace6b5b79bb2473bc921192911ca4a17209f507dd601ec36759ae6611b1db0541c5120a91d95e0e1d5c695c9745732487a3520975e8bb12223d5e6c65e338676a94414685128a17b776b49f500f1fbc0f2a93508ceaeae824e7e183e9071549a84cedb7e831b6d89665e1386706f730a70219281d3c88845a5c919bc5968492eaa84042e9728876d1b3d8ce4a5879846a37be163d2bed72dab90815472866c64e636cd7082a8d381b1546285346dc66df3f93536511eaf02fc6f4e26ef3ef4b828a22d4e3f2e2cefddc4b9a5612a1704976b42c79dccef6f6cb6007dd233910a17c7d1b327d96e4b5b46350a30529a8710865796f5efdac45cfeb1b42a55bf4cd4c51afb55c2a844a34f36b47cd4953db0a21d43642ffa7a9f78e7919847265a3d80bfdb21db5201427b6fbcb4bba501105422d2679c94deb185a0e0142b175b39b5673fea0ce97c5d623f37e5009f56f41df464f171c5dc23e9a44e4b2d207e59f16a58570d992650407c962850fea4ef916644c19ade5e85250d9834aefeb67c9739c76414b0f289b71a1e5de9c1154f270c8bf9cd161262e78e09498772dc6f04a57bfc3f52eabcd96b3bcbc693b34a26535d7aa8323d645a3ff6912321d76e93fbb0ecd61a12d43788c1c3697d39f07376d1cf6e023f4c7ec49b60a87d665fdc54c325e73ee069537a846646fbbb360b7fea9b841b939082dcb87cf9f0c2b6d50aa8dcee4fff54974100c108e54d8a0d2f2619e650ccdea37e9490e5159837234a6c73e1def47fe227716515183b2b4e49cce27544983ba74e874eda0c5743b56d0a0f44fa67c564f5ef7e90ceabcbb2ede6eeecfccbb870f2454cca0965d4437468acb9d32a8fb73a77fddb10a1994af3dcbdff13254c6a04eb3e905a584ba6cc20589a1220695ab7cb8cb794dd7fd30a874a726175ab7af3c0606e596cb429c0bf9f7d1d385ca17d4257e35c6d6da8a17d46270615aceb75143e50ca59deeeba04f2f72ce50e9825aa8d3a62df92b9d25350e2a5c50e8b4a377f38bd95a8ccba86c412dc3bfba771dd495169f8c87b2a813786118a3280a82180822c450194f07f312402010181c9285029170449eacdb3e1300014b635161341489c4c1300c032906621804821084411006218618c5a455501d03be9eb1b07875cbfac0d47f9211446ccd7f8dffcf6b2ef800cf5008d18438a38ef1a369a41308efdf0c1ec6a74b6566a9b1f2e86200e01d126b128e21d10596531bac631e006c9960e7e193a433f67031b278b16d392a1014dd93c8c77aa4c72c02722d0b97edfe9e9462fa4cb833179be9eb47359c757d52366099c21c39a122793757d1392ed54031f33101bb99cba044011040fffbeb6ef5b81670fdf875be570add401803448e3bf92940b01731cbefed3a7a49fc84f21e26c9c9272c048e09a040ffab6cd8a5537840c8c5b8ada9a6b02518e4446ec9484f0818e233ed0876433718e030a7f1f53dc4c52a8b253a94dfb63193bec7b96a3824d8d2adb450c7c46af73ed7cbb9d108b72883df9da629de290ed0eb2de224d40bbe723c9e80087fd0aed33f5c8ff1c1a461c8ae438ef93b39608fe3b8013f6bc68597a7eb9c64f3dbc4712046dfc040cf0a287f82ca29408ee95149df0970a46776aad53d9a8e03524d8210f8a7a095302777b5c8705891512a4012ea52a7d8e62e9a73aa4f89a620ba6fcd227c714823a973d417905ad6b7303d794e4b57f08da6cf7e98c1b636ff7d799be9398e950bce77f5c2c0b2b225f7379b6e67f48e00507d07d158eb1ecd6a36fdb826d965582339753fb238dcfeaaf80dd611a94c2cfd21c6242138f6a8b9f3188eec2ec01c0d62066df36d0fa03789d7a058338969a9d30d51abf848c13843cd30e3e7cfc17831890480fdb3554779b05b88eaa1cd45eee8f5d8c1dbd9139092e39a69f5c58177c5b2474e46f6fb4e9b2ca9b73e142849da3c5e3228a2612cbf64b8165cc1d02e11b2471cf41d385e1bf0a52121c8b443530d58f905a10c896afd7bb9a5dc5becd4422463592f65e2764728b74b13b34424038bb5a33618d2f60f937bd1a105d8b5eeae9a2a304a5596306b292a0052b4893ef031c0eebfb3d374fe96b8964cb77374ab33e06e14db6da6c42315cb3d179c244d352c11600d71c25d5c4e54a1d1fe4a0dd1f0fc4dc18875b1eef0f380f06918658130670c47b07f53cb1ff58e720a21c4dabe92ed28db2460c8e5efbdc5b8debffe8a883b0071552542870327674c7f1d6801507c82207535c4fbe135aa39ee8851da95f3aecbe8357b32bbd3c2f996b58d3c487a2318dd1760dd09ed4512a2aedf81abb0ef8e8a6c3aff7fee7ca560d8a8784b68883888e2fc702d41beaba7ecc2a7b0127e51d72bdbd36a65c5fabff0f150e20f09d8125069262a031b8dd050e216432b28dae5f160e2f403cbc96a31da7965c07df66e5394e4b11371fe1b1fb11e595d6bba1a070870a95e78d94ba5896803fb641ba1805cdc6c0245e8b790995e5990bb8b6e13e175201f9605854811e76f2ac1caf7631d639fbe4be8c0e9c6efabf8879f51b8a8eb41dfa7cd92b81050f8b54fbf629ebd44ed2805b939b08b08ff70956ee4735ddc59fd0aaebe580e5d0c5f08247bba1e207ad05c757ecd5a66a300887d62711f504dc0120411c8b6278ec05d7807e27d69b876d0910ef470423a9f59a3fbccfc4e1896ad84f62d327533c654a89fd05bbd791325e21a4c3fd99048fa334a29e70861fab34f52eb87f4634ed8ffba433185f4bdc525a901aa351a002ac90239cc6639d119412ed06d2b85bd01c1f67d40139640666641bde45b4a869d1c752773a01e2c73ad84a8499ed7e5b3cae56224621b424cb30bb766ea9261325415775bd7e48e540393d421d83372f029b5565a8bb94c0e2197337d7338980595e6a16f9ae6d24770ceb593b55bc012aeeba5b89f93e4a489f52a2c7263760049058ed8d3512a70c3b641d2602f5e30cc5c918d450c77a11da1a34f5dc0f835aa87a15c908cdd9364384683f371d5889004671cf1197ea1d9928f85ffb88800eb8770f874ec185bb5753d6859ae423da459349c1c009b588906b97777c594212de8a21eaaf441881ba277a715078bf7a5c0af0710d672a884df8a5674a4388acda8203a9d5636343393e3b74aaa4b5575389b7be491c598982c6ccd082640aaa03c43041c8da4c9c8c9fb2d0151dcb9783d92eba988280f4b0c0324c095a8cd9213843d581d3e5e6fcb5bead59824595127cc3e880452026d73add1a0d4f42ed1cf43a8cd3190835ee76c2767a36de0b9ae81e4844e20d3d1d82d04dc154bacc28570d3803e1a7def9319109388a4440898120e9967768c9f9074c0086019cc2f47d2207326057e23bff22cd2e7e08446d14f0f6df41240bea86e6c2702b84b2e6dafca57943ec9c39cc2fba49985f553f66e513f9dfcdbca84fac48443a25a58083bc2e61cb725d159d88336890097c28e1251d4d343fbf6f4f2e8866ca4fe7cda6e4490b912fbe41c23885c1d36e826be2ed4863879ec1402ecf56718f1522cb82d54880fb5488ef13722cab668d499f5cb6c32caae19bd72312cf01242a55036ab2b9ad0956c818f999ac27d300c30d9d42aa861eb8361f2c2a8c18ca79cd533fd628c804d9ced0dc80fb4a833bb5b07ef1e00ec204a7e8ab22460713096f450d536087367ce8a3d924de98fb887b7d8c366c3a70442718137be282fc9aba54be27ae1aab454b0282dc9aba54be27a21abcd867fe4d5b02dfd3840b902094a080d490a9a6ee80757f921d6a8430cd048b62eadc2cd538028f3563d133a48297081eed180048cd240eb8234c1e3773f88e802479f90e254444f93666589b69acafe885b70dbca5ab72a689878afc35e0dd17ca05ac29ad96f0875e59c6b3cb9ec2315343425521b0223eadb00da4110a2135373e66ecbe34e33fc56029740ae41c7074ff1514ca48c17ce5ca8665cb779da754e814ba852478176cb268a452ea3cf15a62047f03636e86a0abd07da637790c7a5ed3fb0200f06da915918167d36a13761e9acc4b000fc3dee25ac06813c73c1185a878a1ce908d49193023a6292263ef080112956565b81de3e1fbffeb8a9c982de1effeb865fdbc087dd4732e675fcb06a1794084c4a9cc40551a11f9452f30ec1368404161c2c053bc25f54e988cafc7150e33681406620ca1d49da8111d7926d2cbd6a198f84949b2f71ac00aff5014a5cf2b3a4484b5001f2975a53b600008d108c2ac407862b73329943544e8b93cd69ecb51109971429d1de5cb5084f48940f639573d33952247a61af3fe2920635b93626028da5a1bc3f527aa45aac5ccd54a3d964c8caa00b915e3cef8e5ef08074fb25f99b260fce13ae83344a0b7f732a517dd8c8d168229a1d88f3860a1d16928cb15d6c1f24df8fc5d47f16350826a1f3eb18bf1f2a627a6b56026120aa4ea20e95d9941b61c3a444615899969ffb9d16a9eb05fcb7deb6317f09da635aec2d11b953f280ee7ff6fff76fdcb1f65b7711a99262e465c1bc16d134dfd9a5440ff79b547cdfa72925477991b310a70410f2c65743f973ee507b63570d8c813c21d8989018c7300acd7c6486e1d50a8393da762bf51f92a66a5ee679d48591355324d12d3a75349210cc412a674d52c31172bb0e27f31c531595e18167336a3ac5a62df02c797700a0110ef8b825cffbca5f779d0d500414082d91c59795d309f39571f4fd7025ee91565ada801f7a6b29ea4d986bcd3548a02f2b8d914a15a11e02275281f3cd02a9d4074d2521c463968857801796ac8e42750b6060403c84b22cdf33b9bef29841d4dbe0c3d7b5b09c118e49dbd19b15d5a9e45a380ff02dfac3cd2482f14839c2d586403d63361f5e9e30bc1f990080792e0744d69b0c4b78a77f74391032d94c2da8587337d616755ae9492955166bf1200620bc0a95452ac081a1cf2813be8ea79652438c8d6e5fe1f697e34c8847f5f4ab62257680c2a10063075b042a2a576d44d73987bd93247fe9ff90568fc969a25ebb09b8a15788802a6a23d2a2bbe520e9ab7eed826d99f723e3a5e519f699483aec68519a54ebc7ab94757d340ef1afa8863d37d309c12f70370e781448a765b1fe25d40a30a45adcdf285d15f40473632f02e851a0e4a1bf1494415e3ab5191cea6930127607aa1647df1565b095288233a5c20d1f54930ffa7a81eb83967ba108d6307067ebe0fc88d7a8e675a4dfdb4aa02237144de098622e47de168be96059345b4b6c226096da422ef82134ddd2c880ccd188f10aeb608d529f06be134afd81e6c9a628705f90767c772fdcac55bfdc0806118ff4196e3737dea9f337a1cb9e6e3d3b2431108df9ab467365ddb2249aeaf150cb6bb39b5c2334ef2cfea62c9d9d16684b7a97c05d95b79034dbcd393f9b5e823c041098ee8cabd590613708e24f2534124c5922e4a83c781c87511861f8ae0e0c11b0a9f0845868d02980ed010a73bf50d1ddcaf8c251f3f12dde8090662b15f12f0cb2b09c62b26b3a6208c91a5c0519c55ca5861acbae7665038bb94319686dab19e8f46f22048b0bda19110e338825dd8eabd1b61dec54745346105bdb0eca2a212457a055bfe53069148496e6804fc8ef1efe300f5096d477d991eaff58a76d0e412f12a882b4553a4d3bac128959476e41d0791c67cc1533c702398add25435ea272940cc999e428f65a0c3e9edec4be2a8e6dd48eafad479bae41c4135b72c83155e0942b1beff1f728e50651eb5a0f8017c850d0dbaa287aa68ceb93b72481b3d309ed3c1430090899a767293d462cbb37cdc80de8c6313ad48f38c3207b5c8e68750cc79974a041e739d6306ef6badb2a746036c0f185fd0ba182d82226385106587402261327f0b4efd89ee31105ddfd9eb47c8b6449ce35ce606b47117437b7f5c7294c2f856834eba192b0da7e39acf44066dba34be00f4484bf462c8523260891be3feec37628dab628f848165243109713cff8b92f4f131a9cece9dd8fb022511812c9e0b4fcf6ba5ae76ebf8bab90d066a1e56c90e9c4acad486c7e8a439ffc78259ee5683aef0e6d8c8883a8257152d39c6fd349e4d09e60f86269b86b67298e92a4ce396e83a429491321708e22c432619ea141d095127969c0034a7a2e247b902f7c7b30617a526c352e874503e3c00c810bfe80bf476298b703fe2e03a2e38f07f2cda40f7f07b16392d763be47463f0f40e17d2d01c53def315c9c243df1c6e949777b9722cbdce5111c776f576fa65e7eea1d9e2e1841cf780777ec1b58f6f7b29a3a558fdf4448be6030cd3af44e8ccdc95682571907779562689a3558e48e46fe822c7d3874c2806ec9c98dac4ca301e17df77eefcc29aa6c03bb8dcc1b52e99e95f37ab39ebe81739f190d6e37af17b99b936c4c60632852e3a999b86c0df9ccdb07b09b5caa4c0305d5aef36cb8161e3c68384d35aa8afde68aee242e91a76986a301e967c6c874bdcc0c4b05d51035afeb969425334831a82f2011dcd8f85f7b58b8b3cf631718d59e475b6a9a6bf6dabcab6e2277859e502cb46838aba4b663385a9ed7df56c8c96f143787cb28894189f1d32a14269d1f7740bd8bae9bda51d168bfa1bacc495405275c3403bc8e4de6144e2c1f5975da4bd700900e377ea5fc0a5d469887481825fa0f590d38d45e7aa688558f9081d10e35d0c0b22a6232ddfc67a563e537b6a31ab0d0ac2cad8c26d7e91eedf3b064bae76983bada901d8caa4604ffc988b83fb11c47d8677efcf3cf254f5004ff0f5fde7d19ae4ab21137947ec225e4f07007282bcc453352079304f8b7fd2b06ce93ccbf35314db1912e76477222ca70ce0ca06c8987947c141d17285ddb3c6a455c14c099505a101d877f94939b26bfed3ff1979b2e31c1ad6938dfd016667373d398ad6980417c190fb6f0def9316afc94ea65f5acf05608c9b0e5d817f0074defbf26c4a7ba0ce3a48605e328919eaf234d448579d1bb3ebaaa0b0c1bb81589a89b6381eeaa481c81afb57abef806d8c08e07cb2617fbed823498fdf2340d8f8b91b211d26e6d9500e97de8de4dea728280e92e9b399f93160c9f17902c530f17a01e064b10feb1deab1ff1469b4e079035ace2de78e52a7daaed2c34aa32dc528fafcaa253d4497ef854c57c75ba3df2f4faa08bae15d696901b686f8ad709548289a118a0dd722a8d0ed55f864cfaa81642b11e56c37624b7a919ad9e15f4b69b15adfcaf8aaf34cef93f9f422a92b4ab3a86ee790679ef30b489577efd6c9f6f08ebcb56db28e1d5b69f71d4f01a073566b65ad7630056d310dd4724c8b4983b7a1e984df0a36a0ce5cfcf6d25158c343d58f0e09abb8f048673b9137718c1e8049648488015f197750ab91a4d8861670323e435b3b2d215e25df0207074bb341d696ce56efc9e61cf84036f212d37dee76a8d5c416e4ad139c4d508037018ceecfb15e0e604d595225b3ba4f3eb306d2715515e93c1f65d0c709a64fb982ef3d6341368f5344a0c00928bf7e3d385480e94cf6fd95525858c88b4799f947b575cd96b11f09db7c40c4348f55bfd52da0d464f1995b622a6d0e112596ad1b16818d101d14bc17508af0cb409326e7aa2cae770a06bded3fc922c439cf86ac64d92f9e725098480ce536cb41c1f5c6a84360c13b8e3f0bf3d8babfc5885a071eb6820857038b9aaa30b6871e2433ee3cdb3fdda1127eaa486d471698a92132dcfdfcb8c5e165023cef5c81c39d002bdaf6a6b37ed70070b6a0704af2f04513aece88769c6f149997f19b0f63f666fad070483aad36a93a1f3f7d3d106609a03f6737625661e14a9c0ebf79c72693aeab2c30c1ce7c36d17f1b805a9bc720ec61e4fa02b633619ac52ce9b8ef73ff6b03ee1c3ba15ad0c48f345ee4846029ce890a941c0222e2cb813eb8d0e8292cd8a9b670ca85654063b14a74931fd78b0c27c13603a86a447932e871547fb45b977782b27a99fc0d29c74eafa73133e7f77bef86d70c2aad86c74603027a17e46092cafd7a29c384db180c13681492ee35d6081753be35c0095bc4f58eab882e4f170c9d34af31dfdbfea7a8590be52371b668f94bb90b79e2e30ac6337104ec2fa37db36f5c0c66971ba1e4cff2eb54408ce7eeda57e264417585cb895e49a1826c9e0ce8ac705ccf7a8168ff73e4018f2ddbb539108b44ed63d56e90c97a8f4e04a1a99ba44a532d458329e1354fe64ea046d402169b8787e871147c1bb0218a52b050a0b153b83aefd4b7109e4e4b20d43a448216a37b62b1b826bd1fcf549190357c52f56a1f2c744cd9b67ee46dfc01a6cf59123b9b1da27294f3fe771e386147875d418bfe70f151cf6baf7fd6f38f48a67c01d49838aa3e510870a07d8f7821c44264d131f1deaf4ed6782bf620ebf7b8a34285d7f9f883856516c093a64b93d3346494cd17ad4c2e2dc25edd2eb56be31d24144cab4b62be47e32e1ca3219243edb3cb575b8d0f760c72220e6e0ed8f1057622eeafd95a1aedbe7e771ddb1831dcf3a15de6f253b888079d3c5ecd00048e8262dc191970e450e353c43dc70a2040f674ae125896b13478f8abba78eeb6d878838b69237ff101177103de5e35f933675938801ae54efbc24808a5aae54fe16846f1a4eea1c3cb417067bb5d200ef6061bfc036f43c90241d7ae8689f876a839f07a7da14c9d0fc68f94bb45b7bc3d2b376c11d3db78c9d75b507b4616a487561783b298605690f85894237fd7b0f4573827b041f2c043fc0ffff50a1afd1d616ca490d8417e1fd2810004e5b5140f9854644d3d0215314441ced6a3ab1aceeb50e2adf9afad6216d14bef575c2c441f544553cd5210fc5ca83909a00bfff84d1a509814aa1cf8d6ecf2f4702c6d36aac65ce1442422136af45fb139db73965f0a2029e800ecf09ef23ef9594f64688ecd311c85c41a2ad32c04a45bc40f8a56987f68b80ac0bd35d9450c64784e452080054f187dff4184ed5b403db8b007f286df847c119ea32e6525629a30f655c5a8cded3ff98d289ad8ca6b8d4ac4ce5a608450cf44e8c8f1eb2b6579237ee454338f18b535d3125ab2d2bf38bebbce83f626eff3f0e9bd4ec503a72a88809a6274610564f09430d7ba8547687d4734c06d4f456c9ebadc1d8b32006769b0603ae19f052833c93e541a4678a4f77099540", diff --git a/pallets/emission0/tests/distribution.rs b/pallets/emission0/tests/distribution.rs index 072f8eb2..26170146 100644 --- a/pallets/emission0/tests/distribution.rs +++ b/pallets/emission0/tests/distribution.rs @@ -104,7 +104,7 @@ fn weights_are_filtered_and_normalized() { weights, vec![ (1, FixedU128::from_rational(1, 3)), - (2, FixedU128::from_rational(1, 3) * 2.into()) + (2, FixedU128::from_rational(2, 3)) ] ) }); diff --git a/xtask/src/run.rs b/xtask/src/run.rs index 52ea3997..af07bf6a 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -78,6 +78,8 @@ pub(super) fn run(mut r: flags::Run) { ops::key_insert_cmd(&path, &chain_spec, &account.suri, "aura"); ops::key_insert_cmd(&path, &chain_spec, &account.suri, "gran"); + dbg!(&chain_spec); + let _run = ops::run_node(&path, &chain_spec, &node, &r.bootnodes, r.isolated) .spawn() .unwrap() From a92625615431ccfc737b6d6101e575021dcf8547 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Thu, 29 May 2025 11:11:56 +0200 Subject: [PATCH 30/46] chore: bump spec version to 15 --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index ee41b9b0..ced0ff51 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -38,7 +38,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("torus-runtime"), impl_name: create_runtime_str!("torus-runtime"), authoring_version: 1, - spec_version: 14, + spec_version: 15, impl_version: 1, apis: apis::RUNTIME_API_VERSIONS, transaction_version: 1, From 87cb3d338c84c10328e4f2f7ca324bbb35edfb89 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 2 Jun 2025 14:54:38 +0200 Subject: [PATCH 31/46] refac(permission0): general pre-release tweaks (#103) This change serves more as a QoL update then everything. The previous ID generation could allow for duplicate IDs in very specific cases, and that is now handled. When the enforcement authorities change, all ongoing enforcement votes for that permission are wiped. We cover more cases of input validation. --- .vscode/settings.json | 2 +- Cargo.lock | 1 + Cargo.toml | 1 + pallets/faucet/Cargo.toml | 1 + pallets/governance/src/benchmarking.rs | 2 +- pallets/permission0/src/benchmarking.rs | 40 ++++--- pallets/permission0/src/ext/curator_impl.rs | 2 +- pallets/permission0/src/ext/emission_impl.rs | 22 ++-- pallets/permission0/src/lib.rs | 56 +++------ pallets/permission0/src/permission.rs | 81 +++++++++++-- .../permission0/src/permission/emission.rs | 108 +++++++++--------- pallets/permission0/tests/enforcement.rs | 21 ++-- pallets/torus0/src/benchmarking.rs | 8 +- runtime/src/configs.rs | 4 +- runtime/src/lib.rs | 2 +- xtask/src/generate_spec.rs | 21 +--- xtask/src/run.rs | 37 +----- 17 files changed, 212 insertions(+), 197 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 906ad355..7be748db 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,7 @@ "rust-analyzer.check.extraEnv": { "SKIP_WASM_BUILD": "1" }, - "rust-analyzer.cargo.features": ["runtime-benchmarks"], + "rust-analyzer.cargo.features": ["runtime-benchmarks", "testnet"], "coverage-gutters.coverageFileNames": ["target/cov.xml"], // Spell checker "cSpell.words": [ diff --git a/Cargo.lock b/Cargo.lock index 8758cf51..c37362a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8471,6 +8471,7 @@ dependencies = [ "pallet-torus0-api", "parity-scale-codec", "polkadot-sdk", + "rand 0.9.1", "scale-info", ] diff --git a/Cargo.toml b/Cargo.toml index ef0dd48a..a6a2ae35 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ num-traits = { version = "0.2.19", default-features = false, features = [ "libm", ] } bitflags = { version = "2.9.1", default-features = false } +rand = { version = "0.9.1", default-features = false } # Frontier / EVM fc-api = { git = "https://github.com/paritytech/frontier.git", rev = "b9b1c620c8b418bdeeadc79725f9cfa4703c0333" } diff --git a/pallets/faucet/Cargo.toml b/pallets/faucet/Cargo.toml index fa880fc2..98accedb 100644 --- a/pallets/faucet/Cargo.toml +++ b/pallets/faucet/Cargo.toml @@ -33,3 +33,4 @@ pallet-torus0.workspace = true pallet-emission0.workspace = true pallet-permission0.workspace = true pallet-governance-api.workspace = true +rand = { workspace = true, features = ["thread_rng"] } diff --git a/pallets/governance/src/benchmarking.rs b/pallets/governance/src/benchmarking.rs index 6513bd1d..b653a2d2 100644 --- a/pallets/governance/src/benchmarking.rs +++ b/pallets/governance/src/benchmarking.rs @@ -140,7 +140,7 @@ mod benchmarks { let params = proposal::GlobalParamsData { min_name_length: 2, - max_name_length: T::MaxAgentNameLengthConstraint::get() as u16 - 1, + max_name_length: (T::MaxAgentNameLengthConstraint::get() as u16).saturating_sub(1), max_allowed_agents: 1, min_weight_control_fee: 1, min_staking_fee: 1, diff --git a/pallets/permission0/src/benchmarking.rs b/pallets/permission0/src/benchmarking.rs index d2ad5703..f027958c 100644 --- a/pallets/permission0/src/benchmarking.rs +++ b/pallets/permission0/src/benchmarking.rs @@ -5,17 +5,28 @@ use polkadot_sdk::{ frame_benchmarking::{account, v2::*}, frame_system::RawOrigin, sp_runtime::Percent, - sp_std::vec, }; use crate::*; #[benchmarks] mod benchmarks { - use polkadot_sdk::sp_std::collections::btree_map::BTreeMap; + use polkadot_sdk::{ + sp_core::TryCollect, sp_std::collections::btree_map::BTreeMap, sp_std::vec, + }; use super::*; + macro_rules! bounded_btree_map { + ($ ( $key:expr => $value:expr ),* $(,)?) => { + { + TryCollect::<$crate::BoundedBTreeMap<_, _, _>>::try_collect( + vec![$(($key, $value)),*].into_iter() + ).unwrap() + } + }; + } + #[benchmark] fn grant_emission_permission() { let grantor: T::AccountId = account("Grantor", 0, 0); @@ -35,7 +46,7 @@ mod benchmarks { let stream_id: StreamId = [0; 32].into(); let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); - let targets = vec![(target, 100)]; + let targets = bounded_btree_map![target => 100]; let distribution = DistributionControl::Manual; let duration = PermissionDuration::Indefinite; let revocation = RevocationTerms::RevocableByGrantor; @@ -76,7 +87,7 @@ mod benchmarks { let stream_id: StreamId = [0; 32].into(); let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); - let targets = vec![(target, 100)]; + let targets = bounded_btree_map![target => 100]; let permission_id = ext::emission_impl::grant_emission_permission_impl::( grantor.clone(), grantee, @@ -116,7 +127,7 @@ mod benchmarks { let stream_id: StreamId = [0; 32].into(); let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); - let targets = vec![(target, 100)]; + let targets = bounded_btree_map![target => 100]; let permission_id = ext::emission_impl::grant_emission_permission_impl::( grantor.clone(), @@ -159,7 +170,7 @@ mod benchmarks { let stream_id: StreamId = [0; 32].into(); let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); - let targets = vec![(target, 100)]; + let targets = bounded_btree_map![target => 100]; let permission_id = ext::emission_impl::grant_emission_permission_impl::( grantor.clone(), @@ -201,7 +212,7 @@ mod benchmarks { let stream_id: StreamId = [0; 32].into(); let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); - let targets = vec![(target, 100)]; + let targets = bounded_btree_map![target => 100]; let controllers = vec![controller.clone()].try_into().unwrap(); let enforcement = EnforcementAuthority::ControlledBy { @@ -250,7 +261,7 @@ mod benchmarks { let stream_id: StreamId = [0; 32].into(); let streams = BTreeMap::from([(stream_id, Percent::from_percent(30))]); let allocation = EmissionAllocation::Streams(streams.try_into().unwrap()); - let targets = vec![(target, 100)]; + let targets = bounded_btree_map![target => 100]; let permission_id = ext::emission_impl::grant_emission_permission_impl::( grantor.clone(), @@ -266,16 +277,15 @@ mod benchmarks { .expect("failed to grant permission"); // Prepare new controllers - let controllers = vec![controller1, controller2]; + let controllers = vec![controller1, controller2].try_into().unwrap(); let required_votes = 1u32; - - #[extrinsic_call] - set_enforcement_authority( - RawOrigin::Signed(grantor), - permission_id, + let enforcement = EnforcementAuthority::ControlledBy { controllers, required_votes, - ) + }; + + #[extrinsic_call] + set_enforcement_authority(RawOrigin::Signed(grantor), permission_id, enforcement) } #[benchmark] diff --git a/pallets/permission0/src/ext/curator_impl.rs b/pallets/permission0/src/ext/curator_impl.rs index cfb0fa0b..277d9684 100644 --- a/pallets/permission0/src/ext/curator_impl.rs +++ b/pallets/permission0/src/ext/curator_impl.rs @@ -134,7 +134,7 @@ pub fn grant_curator_permission_impl( } let scope = PermissionScope::Curator(CuratorScope { flags, cooldown }); - let permission_id = generate_permission_id::(&grantor, &grantee, &scope); + let permission_id = generate_permission_id::(&grantor, &grantee, &scope)?; let contract = PermissionContract { grantor, diff --git a/pallets/permission0/src/ext/emission_impl.rs b/pallets/permission0/src/ext/emission_impl.rs index f968c6d8..f6ba1216 100644 --- a/pallets/permission0/src/ext/emission_impl.rs +++ b/pallets/permission0/src/ext/emission_impl.rs @@ -19,12 +19,11 @@ use polkadot_sdk::{ }, frame_system::{self, ensure_signed_or_root}, polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, - sp_core::Get, + sp_core::{Get, TryCollect}, sp_runtime::{ traits::{CheckedAdd, Saturating, Zero}, - DispatchError, Percent, Vec, + BoundedBTreeMap, DispatchError, Percent, Vec, }, - sp_std::collections::btree_map::BTreeMap, }; use pallet_torus0_api::Torus0Api; @@ -70,6 +69,11 @@ impl let revocation = super::translate_revocation_terms(revocation)?; let enforcement = super::translate_enforcement_authority(enforcement)?; + let targets = targets + .into_iter() + .try_collect() + .map_err(|_| crate::Error::::TooManyTargets)?; + grant_emission_permission_impl::( grantor, grantee, @@ -114,7 +118,7 @@ pub(crate) fn grant_emission_permission_impl( grantor: T::AccountId, grantee: T::AccountId, allocation: EmissionAllocation, - targets: Vec<(T::AccountId, u16)>, + targets: BoundedBTreeMap, distribution: DistributionControl, duration: PermissionDuration, revocation: RevocationTerms, @@ -134,7 +138,8 @@ pub(crate) fn grant_emission_permission_impl( ensure!(grantor != grantee, Error::::SelfPermissionNotAllowed); ensure!(!targets.is_empty(), Error::::NoTargetsSpecified); - for (target, _) in &targets { + for (target, weight) in &targets { + ensure!(*weight > 0, Error::::InvalidTargetWeight); ensure!( T::Torus::is_agent_registered(target), Error::::NotRegisteredAgent @@ -201,11 +206,6 @@ pub(crate) fn grant_emission_permission_impl( ); } - let target_map: BTreeMap<_, _> = targets.into_iter().collect(); - let targets = target_map - .try_into() - .map_err(|_| Error::::TooManyTargets)?; - let emission_scope = EmissionScope { allocation: allocation.clone(), distribution, @@ -215,7 +215,7 @@ pub(crate) fn grant_emission_permission_impl( let scope = PermissionScope::Emission(emission_scope); - let permission_id = generate_permission_id::(&grantor, &grantee, &scope); + let permission_id = generate_permission_id::(&grantor, &grantee, &scope)?; let contract = PermissionContract { grantor: grantor.clone(), diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs index 7092c22a..f3360ee4 100644 --- a/pallets/permission0/src/lib.rs +++ b/pallets/permission0/src/lib.rs @@ -221,12 +221,19 @@ pub mod pallet { pub enum Error { /// The agent is not registered NotRegisteredAgent, + /// Permissions can only be created through extrinsics + PermissionCreationOutsideExtrinsic, + /// A permission with the same exact parameters was + /// already created in the current block + DuplicatePermissionInBlock, /// Permission not found PermissionNotFound, /// Self-permission is not allowed SelfPermissionNotAllowed, /// Invalid percentage (out of range) InvalidPercentage, + /// Invalid emission weight set to target + InvalidTargetWeight, /// No targets specified NoTargetsSpecified, /// Invalid threshold @@ -296,7 +303,7 @@ pub mod pallet { origin: OriginFor, grantee: T::AccountId, allocation: EmissionAllocation, - targets: Vec<(T::AccountId, u16)>, + targets: BoundedBTreeMap, distribution: DistributionControl, duration: PermissionDuration, revocation: RevocationTerms, @@ -373,53 +380,18 @@ pub mod pallet { pub fn set_enforcement_authority( origin: OriginFor, permission_id: PermissionId, - controllers: Vec, - required_votes: u32, + enforcement: EnforcementAuthority, ) -> DispatchResult { let who = ensure_signed_or_root(origin)?; - let mut contract = + let contract = Permissions::::get(permission_id).ok_or(Error::::PermissionNotFound)?; - // Only grantor or root can set enforcement authority if let Some(who) = &who { ensure!(who == &contract.grantor, Error::::NotPermissionGrantor); } - ensure!( - !controllers.is_empty(), - Error::::InvalidNumberOfControllers - ); - ensure!(required_votes > 0, Error::::InvalidNumberOfControllers); - ensure!( - required_votes as usize <= controllers.len(), - Error::::InvalidNumberOfControllers - ); - - let controllers = controllers - .try_into() - .map_err(|_| Error::::TooManyControllers)?; - - contract.enforcement = EnforcementAuthority::ControlledBy { - controllers, - required_votes, - }; - - Permissions::::insert(permission_id, contract.clone()); - - if let EnforcementAuthority::ControlledBy { - controllers, - required_votes, - } = &contract.enforcement - { - >::deposit_event(Event::EnforcementAuthoritySet { - permission_id, - controllers_count: controllers.len() as u32, - required_votes: *required_votes, - }); - } - - Ok(()) + contract.update_enforcement(permission_id, enforcement) } /// Grant a permission for curator delegation @@ -469,7 +441,7 @@ fn update_permission_indices( grantee: &T::AccountId, permission_id: PermissionId, ) -> Result<(), DispatchError> { - // Update (grantor, grantee) -> permission_id mapping + // Update (grantor, grantee) -> [permission_id] mapping PermissionsByParticipants::::try_mutate( (grantor.clone(), grantee.clone()), |permissions| -> Result<(), DispatchError> { @@ -491,7 +463,7 @@ fn update_permission_indices( }, )?; - // Update grantor -> permission_id mapping + // Update grantor -> [permission_id] mapping PermissionsByGrantor::::try_mutate( grantor.clone(), |permissions| -> Result<(), DispatchError> { @@ -513,7 +485,7 @@ fn update_permission_indices( }, )?; - // Update grantee -> permission_id mapping + // Update grantee -> [permission_id] mapping PermissionsByGrantee::::try_mutate( grantee.clone(), |permissions| -> Result<(), DispatchError> { diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index c6b7084d..a9c3a6f4 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -9,15 +9,13 @@ use polkadot_sdk::{ sp_core::{H256, U256}, sp_runtime::{ traits::{BlakeTwo256, Hash}, - BoundedBTreeMap, BoundedVec, Percent, + BoundedBTreeMap, BoundedVec, DispatchError, Percent, }, sp_std::vec::Vec, }; use scale_info::TypeInfo; -use crate::{ - BalanceOf, Config, EnforcementTracking, Error, Event, Pallet, Permissions, RevocationTracking, -}; +use crate::*; pub use curator::{CuratorPermissions, CuratorScope}; pub use emission::{DistributionControl, EmissionAllocation, EmissionScope}; @@ -34,16 +32,26 @@ pub fn generate_permission_id( grantor: &T::AccountId, grantee: &T::AccountId, scope: &PermissionScope, -) -> PermissionId { +) -> Result { let mut data = grantor.encode(); data.extend(grantee.encode()); data.extend(scope.encode()); data.extend(>::block_number().encode()); - // Permission type as well in the future. + if !cfg!(debug_assertions) { + let extrinsic_index = >::extrinsic_index() + .ok_or(Error::::PermissionCreationOutsideExtrinsic)?; + data.extend(extrinsic_index.encode()); + } + + let id = BlakeTwo256::hash(&data); + ensure!( + !Permissions::::contains_key(id), + Error::::DuplicatePermissionInBlock + ); - BlakeTwo256::hash(&data) + Ok(id) } #[derive(Encode, Decode, CloneNoBound, TypeInfo, MaxEncodedLen, DebugNoBound)] @@ -132,6 +140,65 @@ impl PermissionContract { Ok(()) } + /// Updates the enforcement authority for this permission. + /// + /// When the enforcement authority changes, all ongoing enforcement + /// referendums for this permission are wiped. + pub fn update_enforcement( + mut self, + permission_id: H256, + enforcement: EnforcementAuthority, + ) -> DispatchResult { + let (controllers, required_votes) = match enforcement { + EnforcementAuthority::None => { + self.enforcement = EnforcementAuthority::None; + Permissions::::insert(permission_id, self); + + let _ = EnforcementTracking::::clear_prefix(permission_id, u32::MAX, None); + + Pallet::::deposit_event(Event::EnforcementAuthoritySet { + permission_id, + controllers_count: 0, + required_votes: 0, + }); + + return Ok(()); + } + EnforcementAuthority::ControlledBy { + controllers, + required_votes, + } => (controllers, required_votes), + }; + + ensure!( + !controllers.is_empty(), + Error::::InvalidNumberOfControllers + ); + ensure!(required_votes > 0, Error::::InvalidNumberOfControllers); + ensure!( + required_votes as usize <= controllers.len(), + Error::::InvalidNumberOfControllers + ); + + let event = Event::EnforcementAuthoritySet { + permission_id, + controllers_count: controllers.len() as u32, + required_votes, + }; + + self.enforcement = EnforcementAuthority::ControlledBy { + controllers, + required_votes, + }; + Permissions::::insert(permission_id, self); + + let _ = EnforcementTracking::::clear_prefix(permission_id, u32::MAX, None); + + >::deposit_event(event); + + Ok(()) + } + fn cleanup(self, permission_id: H256) { crate::remove_permission_from_indices::(&self.grantor, &self.grantee, permission_id); diff --git a/pallets/permission0/src/permission/emission.rs b/pallets/permission0/src/permission/emission.rs index 5a625b15..4ceb2d89 100644 --- a/pallets/permission0/src/permission/emission.rs +++ b/pallets/permission0/src/permission/emission.rs @@ -86,7 +86,7 @@ pub(crate) fn do_accumulate_emissions( } let streams = AccumulatedStreamAmounts::::iter_prefix((agent, stream)); - for (permission_id, balance) in streams { + for (permission_id, accumulated) in streams { let Some(contract) = Permissions::::get(permission_id) else { continue; }; @@ -121,11 +121,63 @@ pub(crate) fn do_accumulate_emissions( AccumulatedStreamAmounts::::set( (agent, stream, &permission_id), - Some(balance.saturating_add(delegated_amount)), + Some(accumulated.saturating_add(delegated_amount)), ); } } +pub(crate) fn do_auto_distribution( + emission_scope: &EmissionScope, + permission_id: H256, + current_block: BlockNumberFor, + contract: &PermissionContract, +) { + match emission_scope.distribution { + DistributionControl::Automatic(threshold) => { + let accumulated = match &emission_scope.allocation { + EmissionAllocation::Streams(streams) => streams + .keys() + .filter_map(|id| { + AccumulatedStreamAmounts::::get((&contract.grantor, id, permission_id)) + }) + .fold(BalanceOf::::zero(), |acc, e| acc.saturating_add(e)), // The Balance AST does not enforce the Sum trait + EmissionAllocation::FixedAmount(amount) => *amount, + }; + + if accumulated >= threshold { + do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); + } + } + + DistributionControl::AtBlock(target_block) if current_block > target_block => { + // As we only verify once every 10 blocks, we have to check if current block + // is GTE to the target block. To avoid, triggering on every block, + // we also verify that the last execution occurred before the target block + // (or haven't occurred at all) + if contract + .last_execution + .is_some_and(|last_execution| last_execution >= target_block) + { + return; + } + + do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); + } + + DistributionControl::Interval(interval) => { + let last_execution = contract.last_execution.unwrap_or(contract.created_at); + if current_block.saturating_sub(last_execution) < interval { + return; + } + + do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); + } + + // Manual distribution doesn't need auto-processing + _ => {} + } +} + #[derive(Clone, Copy, Debug)] pub(crate) enum DistributionReason { Automatic, @@ -277,55 +329,3 @@ fn do_distribute_to_targets( }); } } - -pub(crate) fn do_auto_distribution( - emission_scope: &EmissionScope, - permission_id: H256, - current_block: BlockNumberFor, - contract: &PermissionContract, -) { - match emission_scope.distribution { - DistributionControl::Automatic(threshold) => { - let accumulated = match &emission_scope.allocation { - EmissionAllocation::Streams(streams) => streams - .keys() - .filter_map(|id| { - AccumulatedStreamAmounts::::get((&contract.grantor, id, permission_id)) - }) - .fold(BalanceOf::::zero(), |acc, e| acc.saturating_add(e)), // The Balance AST does not enforce the Sum trait - EmissionAllocation::FixedAmount(amount) => *amount, - }; - - if accumulated >= threshold { - do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); - } - } - - DistributionControl::AtBlock(target_block) if current_block > target_block => { - // As we only verify once every 10 blocks, we have to check if current block - // is GTE to the target block. To avoid, triggering on every block, - // we also verify that the last execution occurred before the target block - // (or haven't occurred at all) - if contract - .last_execution - .is_some_and(|last_execution| last_execution >= target_block) - { - return; - } - - do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); - } - - DistributionControl::Interval(interval) => { - let last_execution = contract.last_execution.unwrap_or(contract.created_at); - if current_block.saturating_sub(last_execution) < interval { - return; - } - - do_distribute_emission::(permission_id, contract, DistributionReason::Automatic); - } - - // Manual distribution doesn't need auto-processing - _ => {} - } -} diff --git a/pallets/permission0/tests/enforcement.rs b/pallets/permission0/tests/enforcement.rs index ed03106d..9d062c42 100644 --- a/pallets/permission0/tests/enforcement.rs +++ b/pallets/permission0/tests/enforcement.rs @@ -3,9 +3,10 @@ use std::collections::BTreeMap; use pallet_permission0::permission::emission::StreamId; -use pallet_permission0::EnforcementReferendum; +use pallet_permission0::{EnforcementAuthority, EnforcementReferendum}; use pallet_permission0_api::{generate_root_stream_id, Permission0EmissionApi}; use polkadot_sdk::frame_support::{assert_err, traits::Currency}; +use polkadot_sdk::sp_core::bounded_vec; use polkadot_sdk::sp_runtime::Percent; use test_utils::*; @@ -51,8 +52,10 @@ fn set_enforcement_authority_by_grantor() { pallet_permission0::Pallet::::set_enforcement_authority( get_origin(grantee), permission_id, - vec![controller], - 1, + EnforcementAuthority::ControlledBy { + controllers: bounded_vec![controller], + required_votes: 1 + } ), pallet_permission0::Error::::NotPermissionGrantor ); @@ -61,8 +64,10 @@ fn set_enforcement_authority_by_grantor() { pallet_permission0::Pallet::::set_enforcement_authority( get_origin(controller), permission_id, - vec![controller], - 1, + EnforcementAuthority::ControlledBy { + controllers: bounded_vec![controller], + required_votes: 1 + } ), pallet_permission0::Error::::NotPermissionGrantor ); @@ -71,8 +76,10 @@ fn set_enforcement_authority_by_grantor() { pallet_permission0::Pallet::::set_enforcement_authority( get_origin(grantor), permission_id, - vec![controller], - 1, + EnforcementAuthority::ControlledBy { + controllers: bounded_vec![controller], + required_votes: 1 + } ) ); diff --git a/pallets/torus0/src/benchmarking.rs b/pallets/torus0/src/benchmarking.rs index e2e51d00..f4e66245 100644 --- a/pallets/torus0/src/benchmarking.rs +++ b/pallets/torus0/src/benchmarking.rs @@ -33,7 +33,7 @@ mod benchmarks { register_test_agent::(&agent, vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3]); - let _ = ::deposit_creating(&staker, amount * 2); + let _ = ::deposit_creating(&staker, amount.saturating_mul(2)); #[extrinsic_call] add_stake(RawOrigin::Signed(staker), agent, amount) @@ -47,7 +47,7 @@ mod benchmarks { register_test_agent::(&agent, vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3]); let amount = MinAllowedStake::::get(); - let _ = ::deposit_creating(&staker, amount * 2); + let _ = ::deposit_creating(&staker, amount.saturating_mul(2)); Pallet::::force_set_stake(&staker, &agent, amount).expect("failed to add stake"); #[extrinsic_call] @@ -64,7 +64,7 @@ mod benchmarks { register_test_agent::(&agent_b, vec![4, 5, 6], vec![4, 5, 6], vec![4, 5, 6]); let amount = MinAllowedStake::::get(); - let _ = ::deposit_creating(&staker, amount * 2); + let _ = ::deposit_creating(&staker, amount.saturating_mul(2)); Pallet::::force_set_stake(&staker, &agent_a, amount).expect("failed to add stake"); #[extrinsic_call] @@ -77,7 +77,7 @@ mod benchmarks { ::force_set_whitelisted(&agent); let burn = crate::Burn::::get(); - let _ = ::deposit_creating(&agent, burn * 2); + let _ = ::deposit_creating(&agent, burn.saturating_mul(2)); let name = vec![1, 2, 3]; let url = vec![1, 2, 3]; diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index 43183342..8cad1f9f 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -87,7 +87,7 @@ impl frame_system::Config for Runtime { // --- Balances --- -pub const EXISTENTIAL_DEPOSIT: u128 = 10_u128.pow(TOKEN_DECIMALS) / 10; +pub const EXISTENTIAL_DEPOSIT: u128 = as_tors(1) / 10; impl pallet_balances::Config for Runtime { /// The means of storing the balances of an account @@ -301,7 +301,7 @@ impl pallet_grandpa::Config for Runtime { // --- Torus --- const fn as_tors(val: u128) -> u128 { - val.saturating_add(10u128.pow(TOKEN_DECIMALS)) + val.saturating_mul(10u128.pow(TOKEN_DECIMALS)) } parameter_types! { diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index ced0ff51..c3d57f0b 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -38,7 +38,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("torus-runtime"), impl_name: create_runtime_str!("torus-runtime"), authoring_version: 1, - spec_version: 15, + spec_version: 16, impl_version: 1, apis: apis::RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/xtask/src/generate_spec.rs b/xtask/src/generate_spec.rs index 784357aa..b01c44f9 100644 --- a/xtask/src/generate_spec.rs +++ b/xtask/src/generate_spec.rs @@ -42,20 +42,15 @@ fn generate_replica_spec( out: Option, sudo: Option, ) { - // Create Replica command let replica_cmd = flags::Replica { output: out, sudo, api_url: gen_replica.api_url.clone(), }; - // Call the targetchain_spec function targetchain_spec(&replica_cmd); - - // The file is already written by targetchain_spec, no need to write again } -/// Function moved from build_spec.rs pub fn targetchain_spec(flags: &flags::Replica) -> Option { let spec = tokio::runtime::Builder::new_multi_thread() .enable_all() @@ -86,7 +81,6 @@ pub fn targetchain_spec(flags: &flags::Replica) -> Option { } } -/// Sets the sudo key in the genesis state fn sudo(genesis: &mut Value, sudo: Option<&String>) { let key = key_name(b"Sudo", b"Key"); @@ -261,18 +255,15 @@ fn generate_new_spec(gen_new: &flags::GenNew, cmd: &flags::GenerateSpec) { customize_spec(&mut json, cmd); let serialized = serde_json::to_string_pretty(&json).expect("failed to generate spec file"); + let Some(output_path) = &cmd.out else { + println!("{serialized}"); + return; + }; - match &cmd.out { - Some(output_path) => { - std::fs::write(output_path, serialized).expect("failed to write resulting spec file"); - } - None => { - println!("{serialized}"); - } - } + std::fs::write(output_path, serialized).expect("failed to write resulting spec file"); } -// Function to customize a spec file based on the provided flags +/// Function to customize a spec file based on the provided flags pub fn customize_spec(json: &mut Value, cmd: &flags::GenerateSpec) { let patch = &mut json["genesis"]["runtimeGenesis"]["patch"]; diff --git a/xtask/src/run.rs b/xtask/src/run.rs index af07bf6a..97fff6f4 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -86,7 +86,6 @@ pub(super) fn run(mut r: flags::Run) { .wait(); } -#[allow(dead_code)] pub mod ops { use std::{ ffi::OsStr, @@ -99,34 +98,12 @@ pub mod ops { #[macro_export] macro_rules! torus_node { ($($arg:expr),*) => {{ - let mut cmd = std::process::Command::new("cargo"); - cmd.args(["run", "--release", "--features", "testnet", "--package", "torus-node", "--"]); + let mut cmd = std::process::Command::new("./target/release/torus-node"); $(cmd.arg($arg);)* cmd }}; } - pub fn build_chain_spec(chain_spec: &str) -> Command { - torus_node!( - "build-spec", - "--raw", - "--chain", - chain_spec, - "--disable-default-bootnode" - ) - } - - pub fn key_generate() -> Command { - torus_node!( - "key", - "generate", - "--scheme", - "sr25519", - "--output-type", - "json" - ) - } - pub fn key_insert_cmd( base_path: &dyn AsRef, chain_spec: &dyn AsRef, @@ -154,18 +131,6 @@ pub mod ops { .expect("failed to run key insert"); } - pub fn key_inspect_cmd(suri: &str) -> Command { - torus_node!( - "key", - "inspect", - "--scheme", - "ed25519", - "--output-type", - "json", - suri - ) - } - pub fn key_inspect_node_cmd(key: &str) -> String { let mut child = torus_node!("key", "inspect-node-key") .stdin(Stdio::piped()) From 78a648160a1980c34a42e14ad23c004c3604e5fc Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 16 Jun 2025 14:01:10 +0200 Subject: [PATCH 32/46] feat(namespaces): initial impl (#105) This is the initial implementation for namespaces. Please look into https://github.com/renlabs-dev/torus-substrate/blob/feat/namespaces-initial-impl/docs/namespace.md. Closes CHAIN-97. --- Cargo.lock | 5 + Cargo.toml | 1 + docs/namespace.md | 152 +++++++++ pallets/emission0/src/benchmarking.rs | 9 + pallets/emission0/src/distribute.rs | 42 +-- pallets/emission0/src/ext.rs | 13 +- pallets/emission0/src/lib.rs | 23 +- pallets/emission0/src/weight_control.rs | 8 +- pallets/emission0/src/weights.rs | 52 +-- pallets/faucet/src/lib.rs | 9 +- pallets/faucet/tests/faucet.rs | 36 ++- pallets/governance/src/benchmarking.rs | 13 +- pallets/governance/src/lib.rs | 13 +- pallets/governance/src/migrations.rs | 162 +++++++++- pallets/governance/src/proposal.rs | 27 +- pallets/governance/src/weights.rs | 172 +++++----- pallets/governance/tests/proposal.rs | 121 +++---- pallets/governance/tests/roles.rs | 2 +- pallets/governance/tests/voting.rs | 38 +-- pallets/permission0/Cargo.toml | 1 + pallets/permission0/api/src/lib.rs | 10 +- pallets/permission0/src/ext.rs | 15 +- pallets/permission0/src/ext/curator_impl.rs | 41 ++- pallets/permission0/src/ext/emission_impl.rs | 15 +- pallets/permission0/src/ext/namespace_impl.rs | 88 +++++ pallets/permission0/src/lib.rs | 147 ++++----- pallets/permission0/src/migrations.rs | 18 ++ pallets/permission0/src/permission.rs | 13 + .../permission0/src/permission/emission.rs | 8 +- pallets/permission0/src/weights.rs | 88 ++--- pallets/permission0/tests/enforcement.rs | 36 +-- pallets/permission0/tests/fixed.rs | 40 +-- pallets/permission0/tests/lifetime.rs | 22 +- pallets/permission0/tests/stream.rs | 10 +- pallets/torus0/Cargo.toml | 5 + pallets/torus0/api/Cargo.toml | 4 +- pallets/torus0/api/src/lib.rs | 213 +++++++++++- pallets/torus0/src/agent.rs | 90 +----- pallets/torus0/src/lib.rs | 255 ++++++++++++--- pallets/torus0/src/migrations.rs | 18 ++ pallets/torus0/src/namespace.rs | 114 +++++++ pallets/torus0/src/weights.rs | 48 ++- pallets/torus0/tests/agent.rs | 164 +--------- pallets/torus0/tests/namespace.rs | 303 ++++++++++++++++++ runtime/src/configs.rs | 48 +-- runtime/src/lib.rs | 5 +- test-utils/src/lib.rs | 37 ++- testnet.json | 1 - 48 files changed, 1893 insertions(+), 862 deletions(-) create mode 100644 docs/namespace.md create mode 100644 pallets/permission0/src/ext/namespace_impl.rs create mode 100644 pallets/torus0/src/namespace.rs create mode 100644 pallets/torus0/tests/namespace.rs delete mode 100644 testnet.json diff --git a/Cargo.lock b/Cargo.lock index c37362a3..eecbcef5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8917,6 +8917,7 @@ name = "pallet-permission0" version = "0.1.0" dependencies = [ "bitflags 2.9.1", + "num-traits", "pallet-emission0-api", "pallet-permission0-api", "pallet-torus0-api", @@ -9435,8 +9436,10 @@ dependencies = [ name = "pallet-torus0" version = "0.1.0" dependencies = [ + "libm", "pallet-emission0-api", "pallet-governance-api", + "pallet-permission0-api", "pallet-torus0-api", "parity-scale-codec", "polkadot-sdk", @@ -9448,7 +9451,9 @@ dependencies = [ name = "pallet-torus0-api" version = "0.1.0" dependencies = [ + "parity-scale-codec", "polkadot-sdk", + "scale-info", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a6a2ae35..13f254ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,7 @@ num-traits = { version = "0.2.19", default-features = false, features = [ ] } bitflags = { version = "2.9.1", default-features = false } rand = { version = "0.9.1", default-features = false } +libm = { version = "0.2.15", default-features = false } # Frontier / EVM fc-api = { git = "https://github.com/paritytech/frontier.git", rev = "b9b1c620c8b418bdeeadc79725f9cfa4703c0333" } diff --git a/docs/namespace.md b/docs/namespace.md new file mode 100644 index 00000000..dd1afa1d --- /dev/null +++ b/docs/namespace.md @@ -0,0 +1,152 @@ +# Torus Namespaces: Integrating Off-chain Agent Capabilities with the Chain Permission System + +## Overview + +The namespace system provides a hierarchical tree naming structure for the Torus Protocol, enabling agents to organize and delegate access to their off-chain services. Think of it as a decentralized DNS where agents control their own namespace trees and can share branches with others through the permission system, delegating authority over APIs. + +An agent running a Twitter memory service might register agent.alice.memory.twitter, while another agent providing market data could own agent.bob.data.markets.crypto. These dot-separated paths create a natural hierarchy that mirrors how we think about organizing resources, with agents serving as the root nodes of their namespace trees. + +The system emerges from a practical need, as agents begin offering specialized off-chain services, they need a way to organize these services and delegate access to specific components. + +## Namespace Paths + +Every namespace follows a hierarchical dot-separated format with strict validation rules. Each segment can contain alphanumeric characters, hyphens, and underscores, with a maximum length of 63 characters per segment. + +```rust +pub struct NamespacePath { + inner: BoundedVec>, +} +``` + +The path validation ensures consistency across the network: + +- Maximum 255 bytes total length +- Maximum 10 segments (depth limitation) +- Each segment between 1-63 characters +- Valid characters: unicode alphanumerics, `-`, `_` + +This structure creates clear ownership: `agent.alice` owns all paths under that prefix, from `agent.alice.api` to `agent.alice.memory.twitter.v2`. The depth limitation prevents excessive nesting while still allowing meaningful organization. + +## Design Philosophy + +Initially, we considered complex tree structures like Patricia tries or custom prefix trees that would enable on-chain traversal. However, analyzing actual usage, we see that almost all operations are simple existence checks. + +When an off-chain service receives a request, it needs to verify that a namespace exists and check permissions. Both operations are direct lookups. The service already knows the exact path it's checking, there's no need for prefix searches or tree traversal on-chain. + +```rust +pub type Namespaces = StorageDoubleMap< + _, + Blake2_128Concat, + T::AccountId, + Blake2_128Concat, + NamespacePath, + NamespaceMetadata, +>; +``` + +By using a double map with the agent as the first key and the full path as the second, we achieve O(1) lookups for all common operations. Agent-level enumeration remains efficient, and the storage structure is straightforward to understand and maintain. + +## Economic Model + +The namespace pricing model balances accessibility with spam prevention through a simple yet effective fee structure. Rather than the sigmoid curve described in early designs, the implemented system uses a base fee that goes to the treasury plus a refundable deposit based on storage consumption. + +```rust +pub struct NamespacePricingConfig { + pub deposit_per_byte: BalanceOf, + pub base_fee: BalanceOf, + pub count_midpoint: u32, + pub fee_steepness: Percent, + pub max_fee_multiplier: u32, +} +``` + +Currently, the fee calculation returns a flat base fee, though the structure allows other pricing engines in the future. The deposit ensures that agents must lock tokens proportional to the storage they consume, which are returned when the namespace is deleted. + +This approach creates natural incentives. Agents think carefully about namespace creation since deposits are locked. The base fee contributes to the treasury, funding network development. Storage deposits scale linearly with path length, discouraging excessively long names. + +## Storage Architecture + +Each namespace stores minimal metadata: + +```rust +pub struct NamespaceMetadata { + pub created_at: BlockNumberFor, + pub deposit: BalanceOf, +} +``` + +This approach means each namespace consumes minimal storage. `deposit` tracks the locked amount for refunds. + +## Creating Namespaces + +When creating a deep path like `agent.alice.memory.twitter.v2`, the system automatically creates any missing intermediate namespaces. This saves users from manual step-by-step creation while ensuring the tree remains consistent. + +```rust +fn create_namespace(origin: OriginFor, path: Vec) -> DispatchResult; +``` + +> This extrinsic lives inside the Torus0 pallet. + +The algorithm determines which parent paths need creation by checking from the deepest level upward. It calculates the total fee and deposit required, processes payment atomically, then creates all namespaces in a single transaction. + +## Deletion Strategy + +The deletion process ensures that namespaces with active permission delegations cannot be deleted, preventing disruption to services depending on those paths. It automatically removes all child namespaces, maintaining tree consistency. All deposits are refunded to the owner, making deletion economically neutral beyond the initial fee. + +```rust +fn delete_namespace(origin: OriginFor, path: Vec) -> DispatchResult; +``` + +> This extrinsic lives inside the Torus0 pallet. + +## Permission Integration + +Namespaces gain their true power through integration with the permission system. An agent can delegate access to specific namespace paths or entire subtrees, enabling access control for off-chain services. + +```rust +pub struct NamespaceScope { + pub paths: BoundedBTreeSet, +} +``` + +The namespace permission scope contains a set of paths that the grantee can access. The permission system's existing infrastructure handles the complexity of duration, revocation terms, and enforcement authorities. This means namespace permissions can be temporary, require multi-signature revocation, or include third-party controllers. Read more in [permission0.md](permission0.md). + +This integration creates composition possibilities. An agent running a data aggregation service could delegate read access to `agent.alice.data.public` while keeping `agent.alice.data.private` restricted, or delegate the entire data scope: `agent.alice.data`. The delegation could be time-limited, revocable by designated arbiters, or controlled by enforcement authorities who verify off-chain conditions. + +## Practical Applications + +A memory service agent registers `agent.memory` and creates specialized sub-namespaces like `agent.memory.twitter`, `agent.memory.discord`, and `agent.memory.telegram`. Each represents a different data source with potentially different access requirements. The agent can delegate read access to `agent.memory.twitter` to analytics agents while keeping other sources private. + +A compute marketplace might use `agent.compute.gpu.nvidia.a100` to represent specific hardware resources. Delegating this namespace grants access to submit jobs to those specific GPUs. The hierarchical structure naturally represents the hardware taxonomy while permissions control access. + +API versioning is viable with paths like `agent.api.v1` and `agent.api.v2`. Services can maintain backward compatibility by keeping old namespaces active while encouraging migration to newer versions. Permissions can be time-limited to enforce deprecation schedules. + +Data feeds benefit from hierarchical organization: `agent.data.markets.crypto.btc.price` clearly indicates the data type and source. Subscribers can receive permissions for specific data points or entire categories, with granular control over access duration and revocation. + +## Implementation Trade-offs + +By optimizing for direct lookups, we sacrificed on-chain traversal capabilities. Services cannot efficiently query "all namespaces under `agent.alice.memory`" without iterating through all of Alice's namespaces. This pushes complexity to off-chain indexers, which can build specialized data structures for such queries. Also, we don't expect huge amounts of namespaces from the beginning, and the pricing mechanism should counter that problem to a certain degree. + +Storage efficiency took precedence over feature richness. Each namespace stores minimal metadata rather than extensive configuration. This keeps the on-chain footprint small but means additional features require off-chain coordination or separate storage. + +The flat fee structure, while simple, doesn't capture the true cost difference between shallow and deep namespaces. This may be refined in future versions as usage patterns emerge and economic requirements become clearer. + +## Future Evolution + +The namespace system's design anticipates future growth while maintaining backward compatibility. The versioned storage pattern allows seamless upgrades if requirements change. Several enhancements are possible without breaking existing namespaces: + +The pricing configuration structure already supports the sigmoid-based fee calculation described in the original design. As the network grows and usage patterns emerge, this more sophisticated pricing can be enabled to better balance accessibility with resource consumption. + +The metadata structure could be extended to include additional fields like expiration times, usage counters, or permission defaults. The storage migration system makes such upgrades straightforward. + +Off-chain indexing services will likely emerge to provide sophisticated query capabilities. These could offer GraphQL APIs for namespace exploration, real-time updates via WebSocket, and specialized search functionality. + +## Security Considerations + +We will need a anti-spam system to emerge in the near future. The current version will, however, allow curators to delete/toggle namespaces. + +The delegation check during deletion prevents a class of griefing attacks where namespace owners could disrupt dependent services. By requiring delegations to be revoked before deletion, services have warning and can negotiate continued access or migration paths. + +Path validation prevents injection attacks and ensures consistent parsing across different implementations. The character restrictions and length limits bound resource consumption while allowing meaningful names. + +The economic model creates natural spam resistance. The combination of base fees and storage deposits means namespace squatting has real costs. The treasury receives fees from creation, funding network development rather than enriching early adopters. diff --git a/pallets/emission0/src/benchmarking.rs b/pallets/emission0/src/benchmarking.rs index 76e9c19c..8f8a4b22 100644 --- a/pallets/emission0/src/benchmarking.rs +++ b/pallets/emission0/src/benchmarking.rs @@ -26,6 +26,9 @@ mod benchmarks { ::force_register_agent(&module_key2, vec![], vec![], vec![]) .expect("failed to register agent"); + ::force_set_whitelisted(&module_key); + ::force_set_whitelisted(&module_key2); + ::set_allocator(&module_key2); let _ = ::deposit_creating(&module_key2, ::min_validator_stake()); ::force_set_stake( @@ -51,6 +54,9 @@ mod benchmarks { ::force_register_agent(&module_key2, vec![], vec![], vec![]) .expect("failed to register agent"); + ::force_set_whitelisted(&module_key); + ::force_set_whitelisted(&module_key2); + ::set_allocator(&module_key2); #[extrinsic_call] @@ -67,6 +73,9 @@ mod benchmarks { ::force_register_agent(&module_key2, vec![], vec![], vec![]) .expect("failed to register agent"); + ::force_set_whitelisted(&module_key); + ::force_set_whitelisted(&module_key2); + ::set_allocator(&module_key); ::set_allocator(&module_key2); diff --git a/pallets/emission0/src/distribute.rs b/pallets/emission0/src/distribute.rs index 730165ca..1b0217d6 100644 --- a/pallets/emission0/src/distribute.rs +++ b/pallets/emission0/src/distribute.rs @@ -22,7 +22,7 @@ use polkadot_sdk::{ sp_tracing::{error, info}, }; -use crate::{BalanceOf, Config, ConsensusMember, IncentivesRatio, Weights}; +use crate::{BalanceOf, Config, ConsensusMember, IncentivesRatio, NegativeImbalanceOf, Weights}; mod math; @@ -115,7 +115,9 @@ impl ConsensusMemberInput { pub fn all_members() -> BTreeMap> { let min_validator_stake = ::min_validator_stake(); - let mut registered_agents: BTreeSet<_> = ::agent_ids().collect(); + let mut registered_agents: BTreeSet<_> = ::agent_ids() + .filter(::is_whitelisted) + .collect(); let mut consensus_members: BTreeMap<_, _> = crate::ConsensusMembers::::iter().collect(); let mut inputs: Vec<_> = crate::WeightControlDelegation::::iter() @@ -209,7 +211,8 @@ impl ConsensusMemberInput { .unwrap_or_default(); ConsensusMemberInput { - registered: ::is_agent_registered(&agent_id), + registered: ::is_agent_registered(&agent_id) + && ::is_whitelisted(&agent_id), agent_id, validator_permit, @@ -262,9 +265,7 @@ impl ConsensusMemberInput { } #[must_use] -fn linear_rewards( - mut emission: >::NegativeImbalance, -) -> >::NegativeImbalance { +fn linear_rewards(mut emission: NegativeImbalanceOf) -> NegativeImbalanceOf { let treasury_fee = ::treasury_emission_fee(); if !treasury_fee.is_zero() { let treasury_fee = treasury_fee.mul_floor(emission.peek()); @@ -365,18 +366,17 @@ fn linear_rewards( .zip(upscaled_incentives) .zip(upscaled_dividends) { - let add_stake = - |staker, mut amount: >::NegativeImbalance| { - ::accumulate_emissions( - &staker, - &pallet_permission0_api::generate_root_stream_id(&staker), - &mut amount, - ); - - let raw_amount = amount.peek(); - T::Currency::resolve_creating(&staker, amount); - let _ = ::stake_to(&staker, &input.agent_id, raw_amount); - }; + let add_stake = |staker, mut amount: NegativeImbalanceOf| { + ::accumulate_emissions( + &staker, + &pallet_permission0_api::generate_root_stream_id(&staker), + &mut amount, + ); + + let raw_amount = amount.peek(); + T::Currency::resolve_creating(&staker, amount); + let _ = ::stake_to(&staker, &input.agent_id, raw_amount); + }; if dividend.peek() != 0 { let fixed_dividend = dividend.peek(); @@ -417,12 +417,12 @@ fn linear_rewards( } struct Emissions { - dividends: Vec<>::NegativeImbalance>, - incentives: Vec<>::NegativeImbalance>, + dividends: Vec>, + incentives: Vec>, } fn compute_emissions( - emission: &mut >::NegativeImbalance, + emission: &mut NegativeImbalanceOf, stake: &[FixedU128], incentives: Vec, dividends: Vec, diff --git a/pallets/emission0/src/ext.rs b/pallets/emission0/src/ext.rs index 5c072c14..754c3f79 100644 --- a/pallets/emission0/src/ext.rs +++ b/pallets/emission0/src/ext.rs @@ -1,7 +1,10 @@ -use polkadot_sdk::frame_support::traits::Currency; +use polkadot_sdk::{frame_support::traits::Currency, frame_system}; -pub(super) type BalanceOf = <::Currency as Currency< - ::AccountId, ->>::Balance; +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; -pub(super) type AccountIdOf = ::AccountId; +pub type AccountIdOf = ::AccountId; + +pub type NegativeImbalanceOf = <::Currency as Currency< + ::AccountId, +>>::NegativeImbalance; diff --git a/pallets/emission0/src/lib.rs b/pallets/emission0/src/lib.rs index 9af04d5e..6b8e16eb 100644 --- a/pallets/emission0/src/lib.rs +++ b/pallets/emission0/src/lib.rs @@ -31,7 +31,7 @@ pub mod pallet { use frame::prelude::BlockNumberFor; use frame_system::ensure_signed; use pallet_governance_api::GovernanceApi; - use pallet_permission0_api::Permission0Api; + use pallet_permission0_api::{Permission0Api, Permission0EmissionApi}; use pallet_torus0_api::Torus0Api; use polkadot_sdk::sp_std; use weights::WeightInfo; @@ -94,21 +94,18 @@ pub mod pallet { type Currency: Currency + Send + Sync; - type Torus: Torus0Api< - Self::AccountId, - >::Balance, - >::NegativeImbalance, - >; + type Torus: Torus0Api>; type Governance: GovernanceApi; - type Permission0: Permission0Api< - Self::AccountId, - OriginFor, - BlockNumberFor, - crate::BalanceOf, - >::NegativeImbalance, - >; + type Permission0: Permission0Api> + + Permission0EmissionApi< + Self::AccountId, + OriginFor, + BlockNumberFor, + BalanceOf, + NegativeImbalanceOf, + >; type WeightInfo: WeightInfo; } diff --git a/pallets/emission0/src/weight_control.rs b/pallets/emission0/src/weight_control.rs index 40413dfd..da309ffd 100644 --- a/pallets/emission0/src/weight_control.rs +++ b/pallets/emission0/src/weight_control.rs @@ -24,7 +24,7 @@ pub fn set_weights( ); ensure!( - ::is_agent_registered(&acc_id), + ::is_agent_registered(&acc_id) && ::is_whitelisted(&acc_id), crate::Error::::AgentIsNotRegistered ); @@ -44,7 +44,7 @@ pub fn set_weights( ); ensure!( - ::is_agent_registered(target), + ::is_agent_registered(target) && ::is_whitelisted(target), crate::Error::::AgentIsNotRegistered ); } @@ -75,12 +75,12 @@ pub fn delegate_weight_control( ); ensure!( - ::is_agent_registered(&delegator), + ::is_agent_registered(&delegator) && ::is_whitelisted(&delegator), crate::Error::::AgentIsNotRegistered ); ensure!( - ::is_agent_registered(&delegatee), + ::is_agent_registered(&delegatee) && ::is_whitelisted(&delegatee), crate::Error::::AgentIsNotRegistered ); diff --git a/pallets/emission0/src/weights.rs b/pallets/emission0/src/weights.rs index 82393489..b1cbb4a1 100644 --- a/pallets/emission0/src/weights.rs +++ b/pallets/emission0/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_emission0` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-05-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-06-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `NicosiPoneXSMax.localdomain`, CPU: `` +//! HOSTNAME: `Luizs-MacBook-Pro.local`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -52,6 +52,8 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:2 w:0) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Governance::Whitelist` (r:2 w:0) + /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Torus0::StakedBy` (r:2 w:0) /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) /// Storage: `Torus0::MinValidatorStake` (r:1 w:0) @@ -60,26 +62,28 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Emission0::ConsensusMembers` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn set_weights() -> Weight { // Proof Size summary in bytes: - // Measured: `515` + // Measured: `610` // Estimated: `7654` - // Minimum execution time: 28_000_000 picoseconds. - Weight::from_parts(28_000_000, 7654) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Minimum execution time: 32_000_000 picoseconds. + Weight::from_parts(33_000_000, 7654) + .saturating_add(T::DbWeight::get().reads(10_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Torus0::Agents` (r:2 w:0) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Governance::Whitelist` (r:2 w:0) + /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Governance::Allocators` (r:1 w:0) /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Emission0::WeightControlDelegation` (r:0 w:1) /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn delegate_weight_control() -> Weight { // Proof Size summary in bytes: - // Measured: `230` + // Measured: `325` // Estimated: `7654` - // Minimum execution time: 16_000_000 picoseconds. - Weight::from_parts(17_000_000, 7654) - .saturating_add(T::DbWeight::get().reads(3_u64)) + // Minimum execution time: 21_000_000 picoseconds. + Weight::from_parts(22_000_000, 7654) + .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Governance::Allocators` (r:1 w:0) @@ -88,10 +92,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn regain_weight_control() -> Weight { // Proof Size summary in bytes: - // Measured: `299` + // Measured: `333` // Estimated: `3529` // Minimum execution time: 12_000_000 picoseconds. - Weight::from_parts(13_000_000, 3529) + Weight::from_parts(12_000_000, 3529) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -105,6 +109,8 @@ impl WeightInfo for () { /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:2 w:0) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Governance::Whitelist` (r:2 w:0) + /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Torus0::StakedBy` (r:2 w:0) /// Proof: `Torus0::StakedBy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) /// Storage: `Torus0::MinValidatorStake` (r:1 w:0) @@ -113,26 +119,28 @@ impl WeightInfo for () { /// Proof: `Emission0::ConsensusMembers` (`max_values`: None, `max_size`: Some(4294967295), added: 2474, mode: `MaxEncodedLen`) fn set_weights() -> Weight { // Proof Size summary in bytes: - // Measured: `515` + // Measured: `610` // Estimated: `7654` - // Minimum execution time: 28_000_000 picoseconds. - Weight::from_parts(28_000_000, 7654) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Minimum execution time: 32_000_000 picoseconds. + Weight::from_parts(33_000_000, 7654) + .saturating_add(RocksDbWeight::get().reads(10_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Torus0::Agents` (r:2 w:0) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) + /// Storage: `Governance::Whitelist` (r:2 w:0) + /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Governance::Allocators` (r:1 w:0) /// Proof: `Governance::Allocators` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Emission0::WeightControlDelegation` (r:0 w:1) /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn delegate_weight_control() -> Weight { // Proof Size summary in bytes: - // Measured: `230` + // Measured: `325` // Estimated: `7654` - // Minimum execution time: 16_000_000 picoseconds. - Weight::from_parts(17_000_000, 7654) - .saturating_add(RocksDbWeight::get().reads(3_u64)) + // Minimum execution time: 21_000_000 picoseconds. + Weight::from_parts(22_000_000, 7654) + .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Governance::Allocators` (r:1 w:0) @@ -141,10 +149,10 @@ impl WeightInfo for () { /// Proof: `Emission0::WeightControlDelegation` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn regain_weight_control() -> Weight { // Proof Size summary in bytes: - // Measured: `299` + // Measured: `333` // Estimated: `3529` // Minimum execution time: 12_000_000 picoseconds. - Weight::from_parts(13_000_000, 3529) + Weight::from_parts(12_000_000, 3529) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/pallets/faucet/src/lib.rs b/pallets/faucet/src/lib.rs index d173361d..4fa17372 100644 --- a/pallets/faucet/src/lib.rs +++ b/pallets/faucet/src/lib.rs @@ -76,10 +76,9 @@ pub mod pallet { const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); /// Configuration trait for the faucet pallet - #[pallet::config(with_default)] + #[pallet::config] pub trait Config: polkadot_sdk::frame_system::Config { /// The overarching event type - #[pallet::no_default_bounds] type RuntimeEvent: From> + IsType<::RuntimeEvent>; @@ -87,11 +86,7 @@ pub mod pallet { type Currency: Currency + Send + Sync; /// The Torus interface for accessing network functions - type Torus: Torus0Api< - Self::AccountId, - >::Balance, - >::NegativeImbalance, - >; + type Torus: Torus0Api>; } /// Implementation of the unsigned transaction validation for the faucet pallet diff --git a/pallets/faucet/tests/faucet.rs b/pallets/faucet/tests/faucet.rs index 1413e8de..1fef9d22 100644 --- a/pallets/faucet/tests/faucet.rs +++ b/pallets/faucet/tests/faucet.rs @@ -64,7 +64,7 @@ parameter_types! { } thread_local! { - static DEFAULT_MIN_BURN: RefCell = const { RefCell::new(to_nano(10)) }; + static DEFAULT_MIN_BURN: RefCell = const { RefCell::new(as_tors(10)) }; } pub struct MinBurnConfig; @@ -86,13 +86,20 @@ parameter_types! { pub const MaxLocks: u32 = 50; pub const MaxReserves: u32 = 50; pub const DefaultDividendsParticipationWeight: Percent = Percent::from_parts(40); + + pub DefaultNamespacePricingConfig: pallet_torus0::namespace::NamespacePricingConfig = pallet_torus0::namespace::NamespacePricingConfig { + base_fee: as_tors(5), + deposit_per_byte: as_tors(5), + + count_midpoint: 20, + fee_steepness: Percent::from_percent(20), + max_fee_multiplier: 5, + }; } impl pallet_torus0::Config for Test { type DefaultMinValidatorStake = ConstU128<50_000_000_000_000_000_000_000>; - type DefaultImmunityPeriod = ConstU16<0>; - type DefaultRewardInterval = ConstU16<100>; type DefaultMinNameLength = ConstU16<2>; @@ -101,8 +108,6 @@ impl pallet_torus0::Config for Test { type DefaultMaxAgentUrlLength = ConstU16<64>; - type DefaultMaxAllowedAgents = ConstU16<10_000>; - type DefaultMaxAllowedValidators = ConstU16<128>; type DefaultMaxRegistrationsPerBlock = ConstU16<10>; @@ -138,6 +143,8 @@ impl pallet_torus0::Config for Test { type DefaultDividendsParticipationWeight = DefaultDividendsParticipationWeight; + type DefaultNamespacePricingConfig = DefaultNamespacePricingConfig; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; @@ -145,13 +152,14 @@ impl pallet_torus0::Config for Test { type Governance = Governance; type Emission = Emission0; + type Permission0 = Permission0; type WeightInfo = pallet_torus0::weights::SubstrateWeight; } parameter_types! { - pub HalvingInterval: NonZeroU128 = NonZeroU128::new(to_nano(144_000_000)).unwrap(); - pub MaxSupply: NonZeroU128 = NonZeroU128::new(to_nano(144_000_000 * 4)).unwrap(); + pub HalvingInterval: NonZeroU128 = NonZeroU128::new(as_tors(144_000_000)).unwrap(); + pub MaxSupply: NonZeroU128 = NonZeroU128::new(as_tors(144_000_000 * 4)).unwrap(); pub const DefaultEmissionRecyclingPercentage: Percent = Percent::from_parts(70); pub const DefaultIncentivesRatio: Percent = Percent::from_parts(50); } @@ -163,7 +171,7 @@ impl pallet_emission0::Config for Test { type MaxSupply = MaxSupply; - type BlockEmission = ConstU128<{ (to_nano(250_000) - 1) / 10800 }>; + type BlockEmission = ConstU128<{ (as_tors(250_000) - 1) / 10800 }>; type DefaultEmissionRecyclingPercentage = DefaultEmissionRecyclingPercentage; @@ -200,17 +208,17 @@ impl pallet_governance::Config for Test { type DefaultTreasuryEmissionFee = DefaultTreasuryEmissionFee; - type DefaultProposalCost = ConstU128<{ to_nano(10_000) }>; + type DefaultProposalCost = ConstU128<{ as_tors(10_000) }>; type DefaultProposalExpiration = ConstU64<75_600>; - type DefaultAgentApplicationCost = ConstU128<{ to_nano(1_000) }>; + type DefaultAgentApplicationCost = ConstU128<{ as_tors(1_000) }>; type DefaultAgentApplicationExpiration = ConstU64<216_000>; type DefaultProposalRewardTreasuryAllocation = DefaultProposalRewardTreasuryAllocation; - type DefaultMaxProposalRewardTreasuryAllocation = ConstU128<{ to_nano(10_000) }>; + type DefaultMaxProposalRewardTreasuryAllocation = ConstU128<{ as_tors(10_000) }>; type DefaultProposalRewardInterval = ConstU64<75_600>; @@ -229,7 +237,7 @@ parameter_types! { pub const MaxStreamsPerPermission: u32 = 100; pub const MaxRevokersPerPermission: u32 = 10; pub const MaxControllersPerPermission: u32 = 10; - pub const MinAutoDistributionThreshold: u128 = to_nano(100); + pub const MinAutoDistributionThreshold: u128 = as_tors(100); } impl pallet_permission0::Config for Test { @@ -252,6 +260,8 @@ impl pallet_permission0::Config for Test { type MaxControllersPerPermission = MaxControllersPerPermission; type MinAutoDistributionThreshold = MinAutoDistributionThreshold; + + type MaxNamespacesPerPermission = ConstU32<0>; } impl pallet_balances::Config for Test { @@ -311,7 +321,7 @@ impl pallet_faucet::Config for Test { const TOKEN_DECIMALS: u32 = 18; -pub const fn to_nano(x: Balance) -> Balance { +pub const fn as_tors(x: Balance) -> Balance { x.saturating_mul((10 as Balance).pow(TOKEN_DECIMALS)) } diff --git a/pallets/governance/src/benchmarking.rs b/pallets/governance/src/benchmarking.rs index b653a2d2..014e89a7 100644 --- a/pallets/governance/src/benchmarking.rs +++ b/pallets/governance/src/benchmarking.rs @@ -123,11 +123,12 @@ mod benchmarks { fn penalize_agent() { let module_key: T::AccountId = account("ModuleKey", 0, 2); - as Torus0Api< - T::AccountId, - <::Currency as Currency>::Balance, - <::Currency as Currency>::NegativeImbalance, - >>::force_register_agent(&module_key, vec![], vec![], vec![]) + as Torus0Api>>::force_register_agent( + &module_key, + vec![], + vec![], + vec![], + ) .expect("failed to register agent"); #[extrinsic_call] @@ -141,10 +142,10 @@ mod benchmarks { let params = proposal::GlobalParamsData { min_name_length: 2, max_name_length: (T::MaxAgentNameLengthConstraint::get() as u16).saturating_sub(1), - max_allowed_agents: 1, min_weight_control_fee: 1, min_staking_fee: 1, dividends_participation_weight: Percent::zero(), + namespace_pricing_config: T::DefaultNamespacePricingConfig::get(), proposal_cost: 0, }; let data = vec![0]; diff --git a/pallets/governance/src/lib.rs b/pallets/governance/src/lib.rs index a705485a..01eb06c1 100644 --- a/pallets/governance/src/lib.rs +++ b/pallets/governance/src/lib.rs @@ -41,7 +41,7 @@ use crate::{ pub mod pallet { #![allow(clippy::too_many_arguments)] - const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(5); use pallet_permission0_api::{CuratorPermissions, Permission0Api, Permission0CuratorApi}; use proposal::GlobalParamsData; @@ -149,13 +149,8 @@ pub mod pallet { type Currency: Currency + Send + Sync; - type Permission0: Permission0Api< - Self::AccountId, - OriginFor, - BlockNumberFor, - crate::BalanceOf, - <::Currency as Currency>::NegativeImbalance, - >; + type Permission0: Permission0Api> + + Permission0CuratorApi, BlockNumberFor>; type WeightInfo: WeightInfo; } @@ -498,8 +493,6 @@ pub mod pallet { InvalidMinNameLength, /// Invalid maximum name length in proposal InvalidMaxNameLength, - /// Invalid maximum allowed agents in proposal - InvalidMaxAllowedAgents, /// Invalid maximum allowed weights in proposal InvalidMaxAllowedWeights, /// Invalid minimum weight control fee in proposal diff --git a/pallets/governance/src/migrations.rs b/pallets/governance/src/migrations.rs index 0d4d1b63..66add872 100644 --- a/pallets/governance/src/migrations.rs +++ b/pallets/governance/src/migrations.rs @@ -1,15 +1,22 @@ use polkadot_sdk::frame_support::{ - migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade, weights::Weight, + migrations::VersionedMigration, sp_runtime::traits::Get, traits::UncheckedOnRuntimeUpgrade, + weights::Weight, }; use crate::{Config, Pallet}; pub mod v3 { + use pallet_permission0_api::{CuratorPermissions, Permission0CuratorApi, PermissionDuration}; + use polkadot_sdk::{ + frame_system::RawOrigin, + sp_tracing::{info, warn}, + }; + use crate::proposal::{GlobalParamsData, ProposalData}; use super::*; - pub type Migration = VersionedMigration<2, 3, MigrateToV3, Pallet, W>; + pub type Migration = VersionedMigration<2, 5, MigrateToV3, Pallet, W>; pub struct MigrateToV3(core::marker::PhantomData); mod old_storage { @@ -73,6 +80,10 @@ pub mod v3 { #[storage_alias] pub type Proposals = StorageMap, Identity, ProposalId, Proposal>; + + #[storage_alias] + pub type Curators = + StorageMap, Identity, AccountIdOf, ()>; } impl UncheckedOnRuntimeUpgrade for MigrateToV3 { @@ -82,7 +93,6 @@ pub mod v3 { old_storage::ProposalData::GlobalParams(old_storage::GlobalParamsData { min_name_length, max_name_length, - max_allowed_agents, min_weight_control_fee, min_staking_fee, dividends_participation_weight, @@ -91,10 +101,11 @@ pub mod v3 { }) => ProposalData::GlobalParams(GlobalParamsData { min_name_length, max_name_length, - max_allowed_agents, min_weight_control_fee, min_staking_fee, dividends_participation_weight, + namespace_pricing_config: + ::DefaultNamespacePricingConfig::get(), proposal_cost, }), old_storage::ProposalData::GlobalCustom => ProposalData::GlobalCustom, @@ -126,6 +137,24 @@ pub mod v3 { crate::Proposals::::set(id, Some(new_proposal)); } + for (curator, _) in old_storage::Curators::::iter() { + let res = <::Permission0>::grant_curator_permission( + RawOrigin::Root.into(), + curator.clone(), + CuratorPermissions::all(), + None, + PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableByGrantor, + ); + + match res { + Ok(perm_id) => info!("migrated curator {curator:?} to permission0: {perm_id}"), + Err(err) => { + warn!("Could not migrate curator {curator:?} to permission0: {err:?}"); + } + } + } + Weight::zero() } } @@ -177,3 +206,128 @@ pub mod v4 { } } } + +pub mod v5 { + use crate::proposal::{GlobalParamsData, ProposalData}; + + use super::*; + + pub type Migration = VersionedMigration<4, 5, MigrateToV5, Pallet, W>; + pub struct MigrateToV5(core::marker::PhantomData); + + mod old_storage { + use codec::{Decode, Encode, MaxEncodedLen}; + use polkadot_sdk::{ + frame_support::{storage_alias, DebugNoBound, Identity}, + polkadot_sdk_frame::prelude::BlockNumberFor, + sp_core::ConstU32, + sp_runtime::{BoundedVec, Percent}, + }; + use scale_info::TypeInfo; + + use crate::{ + proposal::{ProposalId, ProposalStatus}, + AccountIdOf, BalanceOf, + }; + + #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen)] + #[scale_info(skip_type_params(T))] + pub struct Proposal { + pub id: ProposalId, + pub proposer: AccountIdOf, + pub expiration_block: BlockNumberFor, + pub data: ProposalData, + pub status: ProposalStatus, + pub metadata: BoundedVec>, + pub proposal_cost: BalanceOf, + pub creation_block: BlockNumberFor, + } + + #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] + #[scale_info(skip_type_params(T))] + pub enum ProposalData { + GlobalParams(GlobalParamsData), + GlobalCustom, + Emission { + recycling_percentage: Percent, + treasury_percentage: Percent, + incentives_ratio: Percent, + }, + TransferDaoTreasury { + account: AccountIdOf, + amount: BalanceOf, + }, + } + + #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] + #[scale_info(skip_type_params(T))] + pub struct GlobalParamsData { + pub min_name_length: u16, + pub max_name_length: u16, + pub max_allowed_agents: u16, + pub min_weight_control_fee: u8, + pub min_staking_fee: u8, + pub dividends_participation_weight: Percent, + pub proposal_cost: BalanceOf, + } + + #[storage_alias] + pub type Proposals = + StorageMap, Identity, ProposalId, Proposal>; + } + + impl UncheckedOnRuntimeUpgrade for MigrateToV5 { + fn on_runtime_upgrade() -> Weight { + for (id, proposal) in old_storage::Proposals::iter() { + let new_data = match proposal.data { + old_storage::ProposalData::GlobalParams(old_storage::GlobalParamsData { + min_name_length, + max_name_length, + min_weight_control_fee, + min_staking_fee, + dividends_participation_weight, + proposal_cost, + .. + }) => ProposalData::GlobalParams(GlobalParamsData { + min_name_length, + max_name_length, + min_weight_control_fee, + min_staking_fee, + dividends_participation_weight, + namespace_pricing_config: + ::DefaultNamespacePricingConfig::get(), + proposal_cost, + }), + old_storage::ProposalData::GlobalCustom => ProposalData::GlobalCustom, + old_storage::ProposalData::Emission { + recycling_percentage, + treasury_percentage, + incentives_ratio, + } => ProposalData::Emission { + recycling_percentage, + treasury_percentage, + incentives_ratio, + }, + old_storage::ProposalData::TransferDaoTreasury { account, amount } => { + ProposalData::TransferDaoTreasury { account, amount } + } + }; + + let new_proposal = crate::proposal::Proposal { + id: proposal.id, + proposer: proposal.proposer, + expiration_block: proposal.expiration_block, + data: new_data, + status: proposal.status, + metadata: proposal.metadata, + proposal_cost: proposal.proposal_cost, + creation_block: proposal.creation_block, + }; + + crate::Proposals::::set(id, Some(new_proposal)); + } + + Weight::zero() + } + } +} diff --git a/pallets/governance/src/proposal.rs b/pallets/governance/src/proposal.rs index 3ad2e355..1a44fd80 100644 --- a/pallets/governance/src/proposal.rs +++ b/pallets/governance/src/proposal.rs @@ -1,4 +1,5 @@ use codec::{Decode, Encode, MaxEncodedLen}; +use pallet_torus0::namespace::NamespacePricingConfig; use polkadot_sdk::{ frame_election_provider_support::Get, frame_support::{ @@ -97,16 +98,15 @@ impl Proposal { let GlobalParamsData { min_name_length, max_name_length, - max_allowed_agents, min_weight_control_fee, min_staking_fee, dividends_participation_weight, + namespace_pricing_config, proposal_cost, } = data; pallet_torus0::MinNameLength::::set(min_name_length); pallet_torus0::MaxNameLength::::set(max_name_length); - pallet_torus0::MaxAllowedAgents::::set(max_allowed_agents); pallet_torus0::DividendsParticipationWeight::::set( dividends_participation_weight, ); @@ -115,6 +115,7 @@ impl Proposal { Percent::from_percent(min_weight_control_fee); constraints.min_staking_fee = Percent::from_percent(min_staking_fee); }); + pallet_torus0::NamespacePricingConfig::::set(namespace_pricing_config); crate::GlobalGovernanceConfig::::mutate(|config| { config.proposal_cost = proposal_cost; }); @@ -230,28 +231,13 @@ pub enum ProposalStatus { pub struct GlobalParamsData { pub min_name_length: u16, pub max_name_length: u16, - pub max_allowed_agents: u16, pub min_weight_control_fee: u8, pub min_staking_fee: u8, pub dividends_participation_weight: Percent, + pub namespace_pricing_config: NamespacePricingConfig, pub proposal_cost: BalanceOf, } -impl Default for GlobalParamsData { - fn default() -> Self { - Self { - min_name_length: T::DefaultMinNameLength::get(), - max_name_length: T::DefaultMaxNameLength::get(), - max_allowed_agents: T::DefaultMaxAllowedAgents::get(), - min_weight_control_fee: T::DefaultMinWeightControlFee::get(), - min_staking_fee: T::DefaultMinStakingFee::get(), - dividends_participation_weight: - ::DefaultDividendsParticipationWeight::get(), - proposal_cost: T::DefaultProposalCost::get(), - } - } -} - impl GlobalParamsData { pub fn validate(&self) -> DispatchResult { ensure!( @@ -264,11 +250,6 @@ impl GlobalParamsData { crate::Error::::InvalidMaxNameLength ); - ensure!( - self.max_allowed_agents <= 50000, - crate::Error::::InvalidMaxAllowedAgents - ); - ensure!( self.min_weight_control_fee <= 100, crate::Error::::InvalidMinWeightControlFee diff --git a/pallets/governance/src/weights.rs b/pallets/governance/src/weights.rs index f511adbf..f27b1b82 100644 --- a/pallets/governance/src/weights.rs +++ b/pallets/governance/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_governance` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-05-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-06-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `NicosiPoneXSMax.localdomain`, CPU: `` +//! HOSTNAME: `Luizs-MacBook-Pro.local`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -77,12 +77,14 @@ impl WeightInfo for SubstrateWeight { // Measured: `62` // Estimated: `3497` // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(7_000_000, 3497) + Weight::from_parts(6_000_000, 3497) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) @@ -91,19 +93,19 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:0) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn add_to_whitelist() -> Weight { // Proof Size summary in bytes: // Measured: `91` - // Estimated: `6731` - // Minimum execution time: 28_000_000 picoseconds. - Weight::from_parts(29_000_000, 6731) - .saturating_add(T::DbWeight::get().reads(5_u64)) + // Estimated: `11000` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) @@ -114,15 +116,13 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:0) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn remove_from_whitelist() -> Weight { // Proof Size summary in bytes: // Measured: `116` - // Estimated: `6731` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(32_000_000, 6731) - .saturating_add(T::DbWeight::get().reads(6_u64)) + // Estimated: `11000` + // Minimum execution time: 33_000_000 picoseconds. + Weight::from_parts(34_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Governance::Whitelist` (r:1 w:0) @@ -139,13 +139,15 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `306` // Estimated: `6196` - // Minimum execution time: 57_000_000 picoseconds. - Weight::from_parts(59_000_000, 6196) + // Minimum execution time: 59_000_000 picoseconds. + Weight::from_parts(60_000_000, 6196) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) @@ -158,53 +160,51 @@ impl WeightInfo for SubstrateWeight { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Whitelist` (r:0 w:1) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn accept_application() -> Weight { // Proof Size summary in bytes: // Measured: `469` - // Estimated: `6731` - // Minimum execution time: 73_000_000 picoseconds. - Weight::from_parts(76_000_000, 6731) - .saturating_add(T::DbWeight::get().reads(7_u64)) + // Estimated: `11000` + // Minimum execution time: 77_000_000 picoseconds. + Weight::from_parts(78_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(8_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:1) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn deny_application() -> Weight { // Proof Size summary in bytes: // Measured: `175` - // Estimated: `6731` - // Minimum execution time: 28_000_000 picoseconds. - Weight::from_parts(30_000_000, 6731) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Estimated: `11000` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:1) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn penalize_agent() -> Weight { // Proof Size summary in bytes: // Measured: `160` - // Estimated: `6731` - // Minimum execution time: 24_000_000 picoseconds. - Weight::from_parts(26_000_000, 6731) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Estimated: `11000` + // Minimum execution time: 29_000_000 picoseconds. + Weight::from_parts(29_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) @@ -219,8 +219,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `205` // Estimated: `6196` - // Minimum execution time: 53_000_000 picoseconds. - Weight::from_parts(54_000_000, 6196) + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(55_000_000, 6196) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -236,8 +236,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `205` // Estimated: `6196` - // Minimum execution time: 51_000_000 picoseconds. - Weight::from_parts(53_000_000, 6196) + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(55_000_000, 6196) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -253,8 +253,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `204` // Estimated: `6196` - // Minimum execution time: 52_000_000 picoseconds. - Weight::from_parts(53_000_000, 6196) + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(54_000_000, 6196) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -303,7 +303,7 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `1484` - // Minimum execution time: 3_000_000 picoseconds. + // Minimum execution time: 4_000_000 picoseconds. Weight::from_parts(4_000_000, 1484) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -320,8 +320,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `204` // Estimated: `6196` - // Minimum execution time: 52_000_000 picoseconds. - Weight::from_parts(53_000_000, 6196) + // Minimum execution time: 53_000_000 picoseconds. + Weight::from_parts(55_000_000, 6196) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -347,12 +347,14 @@ impl WeightInfo for () { // Measured: `62` // Estimated: `3497` // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(7_000_000, 3497) + Weight::from_parts(6_000_000, 3497) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) @@ -361,19 +363,19 @@ impl WeightInfo for () { /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:0) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn add_to_whitelist() -> Weight { // Proof Size summary in bytes: // Measured: `91` - // Estimated: `6731` - // Minimum execution time: 28_000_000 picoseconds. - Weight::from_parts(29_000_000, 6731) - .saturating_add(RocksDbWeight::get().reads(5_u64)) + // Estimated: `11000` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) @@ -384,15 +386,13 @@ impl WeightInfo for () { /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:0) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn remove_from_whitelist() -> Weight { // Proof Size summary in bytes: // Measured: `116` - // Estimated: `6731` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(32_000_000, 6731) - .saturating_add(RocksDbWeight::get().reads(6_u64)) + // Estimated: `11000` + // Minimum execution time: 33_000_000 picoseconds. + Weight::from_parts(34_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Governance::Whitelist` (r:1 w:0) @@ -409,13 +409,15 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `306` // Estimated: `6196` - // Minimum execution time: 57_000_000 picoseconds. - Weight::from_parts(59_000_000, 6196) + // Minimum execution time: 59_000_000 picoseconds. + Weight::from_parts(60_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) @@ -428,53 +430,51 @@ impl WeightInfo for () { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Governance::Whitelist` (r:0 w:1) /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn accept_application() -> Weight { // Proof Size summary in bytes: // Measured: `469` - // Estimated: `6731` - // Minimum execution time: 73_000_000 picoseconds. - Weight::from_parts(76_000_000, 6731) - .saturating_add(RocksDbWeight::get().reads(7_u64)) + // Estimated: `11000` + // Minimum execution time: 77_000_000 picoseconds. + Weight::from_parts(78_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(8_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Governance::AgentApplications` (r:1 w:1) /// Proof: `Governance::AgentApplications` (`max_values`: None, `max_size`: Some(357), added: 2832, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn deny_application() -> Weight { // Proof Size summary in bytes: // Measured: `175` - // Estimated: `6731` - // Minimum execution time: 28_000_000 picoseconds. - Weight::from_parts(30_000_000, 6731) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + // Estimated: `11000` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:1) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn penalize_agent() -> Weight { // Proof Size summary in bytes: // Measured: `160` - // Estimated: `6731` - // Minimum execution time: 24_000_000 picoseconds. - Weight::from_parts(26_000_000, 6731) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + // Estimated: `11000` + // Minimum execution time: 29_000_000 picoseconds. + Weight::from_parts(29_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Governance::GlobalGovernanceConfig` (r:1 w:0) @@ -489,8 +489,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `205` // Estimated: `6196` - // Minimum execution time: 53_000_000 picoseconds. - Weight::from_parts(54_000_000, 6196) + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(55_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -506,8 +506,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `205` // Estimated: `6196` - // Minimum execution time: 51_000_000 picoseconds. - Weight::from_parts(53_000_000, 6196) + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(55_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -523,8 +523,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `204` // Estimated: `6196` - // Minimum execution time: 52_000_000 picoseconds. - Weight::from_parts(53_000_000, 6196) + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(54_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -573,7 +573,7 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6` // Estimated: `1484` - // Minimum execution time: 3_000_000 picoseconds. + // Minimum execution time: 4_000_000 picoseconds. Weight::from_parts(4_000_000, 1484) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) @@ -590,8 +590,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `204` // Estimated: `6196` - // Minimum execution time: 52_000_000 picoseconds. - Weight::from_parts(53_000_000, 6196) + // Minimum execution time: 53_000_000 picoseconds. + Weight::from_parts(55_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } diff --git a/pallets/governance/tests/proposal.rs b/pallets/governance/tests/proposal.rs index b3a22440..b3cd5f42 100644 --- a/pallets/governance/tests/proposal.rs +++ b/pallets/governance/tests/proposal.rs @@ -3,7 +3,7 @@ use pallet_governance::{ config::GovernanceConfiguration, proposal::{GlobalParamsData, ProposalStatus}, - DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, + Config, DaoTreasuryAddress, Error, GlobalGovernanceConfig, Proposals, }; use polkadot_sdk::{ frame_support::{assert_err, assert_ok, traits::Get}, @@ -11,10 +11,24 @@ use polkadot_sdk::{ sp_runtime::{BoundedBTreeSet, Percent}, }; use test_utils::{ - add_balance, get_balance, get_origin, new_test_ext, step_block, to_nano, zero_min_burn, + add_balance, as_tors, get_balance, get_origin, new_test_ext, step_block, zero_min_burn, AccountId, Test, }; +fn default_params() -> GlobalParamsData { + GlobalParamsData { + min_name_length: T::DefaultMinNameLength::get(), + max_name_length: T::DefaultMaxNameLength::get(), + min_weight_control_fee: T::DefaultMinWeightControlFee::get(), + min_staking_fee: T::DefaultMinStakingFee::get(), + dividends_participation_weight: + ::DefaultDividendsParticipationWeight::get(), + namespace_pricing_config: ::DefaultNamespacePricingConfig::get( + ), + proposal_cost: T::DefaultProposalCost::get(), + } +} + fn register(account: AccountId, _unused: u16, module: AccountId, stake: u128) { if get_balance(account) < stake { add_balance(account, stake); @@ -52,7 +66,7 @@ fn config(proposal_cost: u128, proposal_expiration: u64) { fn vote(account: u32, proposal_id: u64, agree: bool) { if pallet_torus0::stake::sum_staked_by::(&account) < 1 { - stake(account, account, to_nano(1)); + stake(account, account, as_tors(1)); } assert_ok!(pallet_governance::voting::add_vote::( @@ -74,7 +88,7 @@ fn global_governance_config_validates_parameters_correctly() { assert_err!( GlobalParamsData:: { min_name_length: 1, - ..GlobalParamsData::default() + ..default_params::() } .validate(), Error::::InvalidMinNameLength @@ -83,25 +97,16 @@ fn global_governance_config_validates_parameters_correctly() { assert_err!( GlobalParamsData:: { max_name_length: 300, - ..GlobalParamsData::default() + ..default_params::() } .validate(), Error::::InvalidMaxNameLength ); - assert_err!( - GlobalParamsData:: { - max_allowed_agents: 50001, - ..GlobalParamsData::default() - } - .validate(), - Error::::InvalidMaxAllowedAgents - ); - assert_err!( GlobalParamsData:: { min_weight_control_fee: 101, - ..GlobalParamsData::default() + ..default_params::() } .validate(), Error::::InvalidMinWeightControlFee @@ -110,7 +115,7 @@ fn global_governance_config_validates_parameters_correctly() { assert_err!( GlobalParamsData:: { min_staking_fee: 101, - ..GlobalParamsData::default() + ..default_params::() } .validate(), Error::::InvalidMinStakingFee @@ -123,12 +128,12 @@ fn global_proposal_validates_parameters() { new_test_ext().execute_with(|| { zero_min_burn(); const KEY: u32 = 0; - add_balance(KEY, to_nano(100_000)); + add_balance(KEY, as_tors(100_000)); assert_err!( pallet_governance::Pallet::::add_global_params_proposal( get_origin(KEY), - Default::default(), + default_params::(), b"".to_vec(), ), Error::::ProposalDataTooSmall @@ -137,7 +142,7 @@ fn global_proposal_validates_parameters() { assert_err!( pallet_governance::Pallet::::add_global_params_proposal( get_origin(KEY), - Default::default(), + default_params::(), b"1".repeat(257), ), Error::::ProposalDataTooLarge @@ -153,17 +158,17 @@ fn global_proposal_validates_parameters() { test(GlobalParamsData { min_name_length: 0, - ..Default::default() + ..default_params::() }) .expect_err("created proposal with invalid max name length"); test(GlobalParamsData { proposal_cost: 50_000_000_000_000_000_000_001, - ..Default::default() + ..default_params::() }) .expect_err("created proposal with invalid proposal cost"); - test(GlobalParamsData::default()).expect("failed to create proposal with valid parameters"); + test(default_params::()).expect("failed to create proposal with valid parameters"); }); } @@ -176,8 +181,8 @@ fn global_custom_proposal_is_accepted_correctly() { let key = 0; - register(FOR, 0, 0, to_nano(10)); - register(AGAINST, 0, 1, to_nano(5)); + register(FOR, 0, 0, as_tors(10)); + register(AGAINST, 0, 1, as_tors(5)); config(1, 100); @@ -198,8 +203,8 @@ fn global_custom_proposal_is_accepted_correctly() { Proposals::::get(0).unwrap().status, ProposalStatus::Accepted { block: 100, - stake_for: to_nano(10), - stake_against: to_nano(5), + stake_for: as_tors(10), + stake_against: as_tors(5), } ); @@ -209,8 +214,8 @@ fn global_custom_proposal_is_accepted_correctly() { Proposals::::get(0).unwrap().status, ProposalStatus::Accepted { block: 100, - stake_for: to_nano(10), - stake_against: to_nano(5), + stake_for: as_tors(10), + stake_against: as_tors(5), } ); }); @@ -225,8 +230,8 @@ fn global_proposal_is_refused_correctly() { let key = 0; - register(FOR, 0, 0, to_nano(5)); - register(AGAINST, 0, 1, to_nano(10)); + register(FOR, 0, 0, as_tors(5)); + register(AGAINST, 0, 1, as_tors(10)); config(1, 100); @@ -260,12 +265,12 @@ fn global_params_proposal_accepted() { zero_min_burn(); const KEY: u32 = 0; - register(KEY, 0, 0, to_nano(10)); + register(KEY, 0, 0, as_tors(10)); config(1, 100); let data = GlobalParamsData { proposal_cost: 69_420, - ..Default::default() + ..default_params::() }; add_balance(KEY, 1); @@ -294,15 +299,15 @@ fn global_proposals_counts_delegated_stake() { let origin = get_origin(0); - register(FOR, 0, FOR, to_nano(5)); - register(AGAINST, 0, AGAINST, to_nano(10)); + register(FOR, 0, FOR, as_tors(5)); + register(AGAINST, 0, AGAINST, as_tors(10)); - stake(FOR_DELEGATED, FOR, to_nano(10)); + stake(FOR_DELEGATED, FOR, as_tors(10)); delegate(FOR_DELEGATED); // AGAINST does not delegate voting power, so it doesn't matter // to who it stakes. - stake(AGAINST, FOR, to_nano(3)); + stake(AGAINST, FOR, as_tors(3)); pallet_governance::voting::disable_delegation::(AGAINST).unwrap(); config(1, 100); @@ -339,20 +344,20 @@ fn creates_treasury_transfer_proposal_and_transfers() { let origin = get_origin(0); pallet_governance::Pallet::::add_dao_treasury_transfer_proposal( origin.clone(), - to_nano(5), + as_tors(5), 0, vec![b'0'; 64], ) .expect_err("proposal should not be created when treasury does not have enough money"); - add_balance(DaoTreasuryAddress::::get(), to_nano(10)); - add_balance(0, to_nano(3)); + add_balance(DaoTreasuryAddress::::get(), as_tors(10)); + add_balance(0, as_tors(3)); register(0, 0, 0, 0); config(1, 100); pallet_governance::Pallet::::add_dao_treasury_transfer_proposal( origin, - to_nano(5), + as_tors(5), 0, vec![b'0'; 64], ) @@ -361,8 +366,8 @@ fn creates_treasury_transfer_proposal_and_transfers() { step_block(100); - assert_eq!(get_balance(DaoTreasuryAddress::::get()), to_nano(5)); - assert_eq!(get_balance(0), to_nano(8)); + assert_eq!(get_balance(DaoTreasuryAddress::::get()), as_tors(5)); + assert_eq!(get_balance(0), as_tors(8)); }); } @@ -377,10 +382,10 @@ fn creates_emission_proposal_and_it_runs_after_2_days() { config(1, default_proposal_expiration); let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1)); + add_balance(0, as_tors(2)); + register(0, 0, 0, as_tors(1)); let _ = pallet_governance::roles::penalize_agent::(RawOrigin::Root.into(), 0, 100); - pallet_torus0::TotalStake::::set(to_nano(10)); + pallet_torus0::TotalStake::::set(as_tors(10)); assert_ok!(pallet_governance::Pallet::::add_emission_proposal( origin.clone(), @@ -398,7 +403,7 @@ fn creates_emission_proposal_and_it_runs_after_2_days() { Proposals::::get(0).unwrap().status, ProposalStatus::Accepted { block: 21_600, - stake_for: to_nano(1), + stake_for: as_tors(1), stake_against: 0 } ); @@ -418,10 +423,10 @@ fn creates_emission_proposal_and_it_runs_before_expiration() { config(1, default_proposal_expiration); let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1) - min_stake); + add_balance(0, as_tors(2)); + register(0, 0, 0, as_tors(1) - min_stake); let _ = pallet_governance::roles::penalize_agent::(RawOrigin::Root.into(), 0, 100); - pallet_torus0::TotalStake::::set(to_nano(10)); + pallet_torus0::TotalStake::::set(as_tors(10)); assert_ok!(pallet_governance::Pallet::::add_emission_proposal( origin.clone(), @@ -443,13 +448,13 @@ fn creates_emission_proposal_and_it_runs_before_expiration() { ProposalStatus::Open { votes_for, votes_against: BoundedBTreeSet::new(), - stake_for: to_nano(1) - min_stake, + stake_for: as_tors(1) - min_stake, stake_against: 0 } ); stake(0, 0, min_stake); - pallet_torus0::TotalStake::::set(to_nano(10)); + pallet_torus0::TotalStake::::set(as_tors(10)); step_block(100); @@ -457,7 +462,7 @@ fn creates_emission_proposal_and_it_runs_before_expiration() { Proposals::::get(0).unwrap().status, ProposalStatus::Accepted { block: 21_700, - stake_for: to_nano(1), + stake_for: as_tors(1), stake_against: 0 } ); @@ -477,10 +482,10 @@ fn creates_emission_proposal_and_it_expires() { config(1, default_proposal_expiration); let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1) - min_stake); + add_balance(0, as_tors(2)); + register(0, 0, 0, as_tors(1) - min_stake); let _ = pallet_governance::roles::penalize_agent::(RawOrigin::Root.into(), 0, 100); - pallet_torus0::TotalStake::::set(to_nano(10)); + pallet_torus0::TotalStake::::set(as_tors(10)); assert_ok!(pallet_governance::Pallet::::add_emission_proposal( origin.clone(), @@ -519,7 +524,7 @@ fn rewards_wont_exceed_treasury() { zero_min_burn(); // Fill the governance address with 1 mil so we are not limited by the max // allocation - let amount = to_nano(1_000_000_000); + let amount = as_tors(1_000_000_000); let key = DaoTreasuryAddress::::get(); add_balance(key, amount); @@ -549,8 +554,8 @@ fn creates_emission_proposal_with_invalid_params_and_it_fails() { config(1, default_proposal_expiration); let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1) - min_stake); + add_balance(0, as_tors(2)); + register(0, 0, 0, as_tors(1) - min_stake); assert_err!( pallet_governance::Pallet::::add_emission_proposal( diff --git a/pallets/governance/tests/roles.rs b/pallets/governance/tests/roles.rs index d19228f9..3b335730 100644 --- a/pallets/governance/tests/roles.rs +++ b/pallets/governance/tests/roles.rs @@ -162,7 +162,7 @@ fn penalize_agent_successfully() { grant_curator_permission(curator_key, CuratorPermissions::PENALTY_CONTROL, None); - register(module_key, 0, module_key, to_nano(100)); + register(module_key, 0, module_key, as_tors(100)); Whitelist::::set(module_key, Some(())); diff --git a/pallets/governance/tests/voting.rs b/pallets/governance/tests/voting.rs index fb7ffe16..0fe511a9 100644 --- a/pallets/governance/tests/voting.rs +++ b/pallets/governance/tests/voting.rs @@ -10,7 +10,7 @@ use polkadot_sdk::{frame_support::assert_err, frame_system::RawOrigin}; use polkadot_sdk::{frame_support::assert_ok, sp_runtime::Percent}; use polkadot_sdk::{frame_support::traits::Get, sp_runtime::BoundedVec}; use test_utils::{ - add_balance, get_balance, get_origin, new_test_ext, step_block, to_nano, zero_min_burn, + add_balance, as_tors, get_balance, get_origin, new_test_ext, step_block, zero_min_burn, AccountId, Governance, Test, }; @@ -51,7 +51,7 @@ fn config(proposal_cost: u128, proposal_expiration: u64) { fn vote(account: u32, proposal_id: u64, agree: bool) { if pallet_torus0::stake::sum_staked_by::(&account) < 1 { - stake(account, account, to_nano(1)); + stake(account, account, as_tors(1)); } assert_ok!(pallet_governance::voting::add_vote::( @@ -83,8 +83,8 @@ fn removes_vote_correctly() { let key = 0; - register(FOR, 0, 0, to_nano(10)); - register(AGAINST, 0, 1, to_nano(5)); + register(FOR, 0, 0, as_tors(10)); + register(AGAINST, 0, 1, as_tors(5)); config(1, 100); @@ -105,8 +105,8 @@ fn removes_vote_correctly() { Proposals::::get(0).unwrap().status, ProposalStatus::Accepted { block: 100, - stake_for: to_nano(10), - stake_against: to_nano(5), + stake_for: as_tors(10), + stake_against: as_tors(5), } ); }); @@ -123,8 +123,8 @@ fn global_proposal_is_refused_correctly() { const FOR: u32 = 0; const AGAINST: u32 = 1; - register(FOR, 0, 0, to_nano(5)); - register(AGAINST, 0, 1, to_nano(10)); + register(FOR, 0, 0, as_tors(5)); + register(AGAINST, 0, 1, as_tors(10)); config(1, 100); @@ -168,8 +168,8 @@ fn adds_vote_correctly() { const FOR: u32 = 0; const AGAINST: u32 = 1; - register(FOR, 0, 0, to_nano(10)); - register(AGAINST, 0, 1, to_nano(10)); + register(FOR, 0, 0, as_tors(10)); + register(AGAINST, 0, 1, as_tors(10)); config(1, 100); @@ -214,15 +214,15 @@ fn ensures_proposal_exists() { config(1, 100); let origin = get_origin(0); - add_balance(0, to_nano(2)); - register(0, 0, 0, to_nano(1) - min_stake); + add_balance(0, as_tors(2)); + register(0, 0, 0, as_tors(1) - min_stake); if pallet_torus0::stake::sum_staked_by::(&MODULE) < 1 { - stake(MODULE, MODULE, to_nano(1)); + stake(MODULE, MODULE, as_tors(1)); } let _ = pallet_governance::roles::penalize_agent::(RawOrigin::Root.into(), 0, 100); - pallet_torus0::TotalStake::::set(to_nano(10)); + pallet_torus0::TotalStake::::set(as_tors(10)); assert_ok!(pallet_governance::Pallet::::add_emission_proposal( origin.clone(), @@ -262,8 +262,8 @@ fn creates_emission_proposal_with_invalid_params_and_it_fails() { config(1, default_proposal_expiration); let origin = get_origin(MODULE); - add_balance(MODULE, to_nano(2)); - register(MODULE, 0, MODULE, to_nano(1) - min_stake); + add_balance(MODULE, as_tors(2)); + register(MODULE, 0, MODULE, as_tors(1) - min_stake); assert_err!( pallet_governance::Pallet::::vote_proposal(origin.clone(), 0, true), @@ -289,7 +289,7 @@ fn ensures_proposal_is_open() { const MODULE: u32 = 0; - register(MODULE, 0, 0, to_nano(10)); + register(MODULE, 0, 0, as_tors(10)); config(1, 100); @@ -331,7 +331,7 @@ fn ensures_module_hasnt_voted() { const MODULE: u32 = 0; - register(MODULE, 0, 0, to_nano(10)); + register(MODULE, 0, 0, as_tors(10)); config(1, 100); @@ -362,7 +362,7 @@ fn ensures_module_has_voted() { const MODULE: u32 = 0; - register(MODULE, 0, 0, to_nano(10)); + register(MODULE, 0, 0, as_tors(10)); config(1, 100); diff --git a/pallets/permission0/Cargo.toml b/pallets/permission0/Cargo.toml index 60b60b8c..dc0ca06b 100644 --- a/pallets/permission0/Cargo.toml +++ b/pallets/permission0/Cargo.toml @@ -31,6 +31,7 @@ codec = { workspace = true, features = ["derive"] } scale-info = { workspace = true, features = ["derive"] } polkadot-sdk = { workspace = true, features = ["experimental", "runtime"] } bitflags = { workspace = true, default-features = false } +num-traits = { workspace = true } # Local dependencies pallet-permission0-api = { workspace = true, default-features = false } diff --git a/pallets/permission0/api/src/lib.rs b/pallets/permission0/api/src/lib.rs index 37bc378f..733b38f8 100644 --- a/pallets/permission0/api/src/lib.rs +++ b/pallets/permission0/api/src/lib.rs @@ -90,10 +90,7 @@ pub enum EnforcementAuthority { } /// The Permission0 API trait -pub trait Permission0Api: - Permission0EmissionApi - + Permission0CuratorApi -{ +pub trait Permission0Api { /// Check if a permission exists fn permission_exists(id: &PermissionId) -> bool; @@ -163,6 +160,11 @@ pub trait Permission0CuratorApi { fn get_curator_permission(grantee: &AccountId) -> Option; } +pub trait Permission0NamespacesApi { + /// Wether the given grantor is delegating a permission over the namespace. + fn is_delegating_namespace(grantor: &AccountId, path: &NamespacePath) -> bool; +} + polkadot_sdk::sp_api::decl_runtime_apis! { /// A set of helper functions for permission and streams /// queries. diff --git a/pallets/permission0/src/ext.rs b/pallets/permission0/src/ext.rs index 5daf8f42..d1a0477c 100644 --- a/pallets/permission0/src/ext.rs +++ b/pallets/permission0/src/ext.rs @@ -8,7 +8,7 @@ use pallet_permission0_api::{ PermissionDuration as ApiPermissionDuration, RevocationTerms as ApiRevocationTerms, }; use polkadot_sdk::{ - frame_support::{ensure, traits::Currency}, + frame_support::ensure, frame_system::ensure_signed_or_root, polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, sp_runtime::{DispatchError, DispatchResult}, @@ -16,17 +16,10 @@ use polkadot_sdk::{ pub mod curator_impl; pub mod emission_impl; +pub mod namespace_impl; /// Implementation of the Permission0Api trait to be used externally -impl - Permission0Api< - T::AccountId, - OriginFor, - BlockNumberFor, - crate::BalanceOf, - >::NegativeImbalance, - > for pallet::Pallet -{ +impl Permission0Api> for pallet::Pallet { fn permission_exists(id: &PermissionId) -> bool { Permissions::::contains_key(id) } @@ -152,6 +145,7 @@ pub(crate) fn execute_permission_impl( emission_impl::execute_permission_impl(permission_id, &contract, emission_scope) } PermissionScope::Curator(_) => curator_impl::execute_permission_impl::(permission_id), + PermissionScope::Namespace(_) => Ok(()), } } @@ -213,6 +207,7 @@ pub fn enforcement_execute_permission_impl( PermissionScope::Curator(_) => { return curator_impl::execute_permission_impl::(&permission_id); } + PermissionScope::Namespace(_) => return Ok(()), } EnforcementTracking::::remove(permission_id, EnforcementReferendum::Execution); diff --git a/pallets/permission0/src/ext/curator_impl.rs b/pallets/permission0/src/ext/curator_impl.rs index 277d9684..07469402 100644 --- a/pallets/permission0/src/ext/curator_impl.rs +++ b/pallets/permission0/src/ext/curator_impl.rs @@ -45,10 +45,7 @@ impl Permission0CuratorApi, BlockNumberFor return Ok(T::PalletId::get().into_account_truncating()); }; - let Some(permissions) = PermissionsByGrantee::::get(&grantee) else { - return Err(Error::::PermissionNotFound.into()); - }; - + let permissions = PermissionsByGrantee::::get(&grantee); let Some((_, contract)) = permissions.into_iter().find_map(|permission_id| { let contract = Permissions::::get(permission_id)?; @@ -85,17 +82,17 @@ impl Permission0CuratorApi, BlockNumberFor } fn get_curator_permission(grantee: &T::AccountId) -> Option { - let permissions = PermissionsByGrantee::::get(grantee)?; - - permissions.into_iter().find_map(|permission_id| { - let contract = Permissions::::get(permission_id)?; - - if matches!(&contract.scope, PermissionScope::Curator(_)) { - Some(permission_id) - } else { - None - } - }) + PermissionsByGrantee::::get(grantee) + .into_iter() + .find_map(|permission_id| { + let contract = Permissions::::get(permission_id)?; + + if matches!(&contract.scope, PermissionScope::Curator(_)) { + Some(permission_id) + } else { + None + } + }) } } @@ -121,15 +118,13 @@ pub fn grant_curator_permission_impl( // Once we move away from centralized chain management, a ROOT curator // will be appointed by the system. - if let Some(permissions) = PermissionsByGrantee::::get(&grantee) { - for perm in permissions { - let Some(contract) = Permissions::::get(perm) else { - continue; - }; + for perm in PermissionsByGrantee::::get(&grantee) { + let Some(contract) = Permissions::::get(perm) else { + continue; + }; - if matches!(&contract.scope, PermissionScope::Curator(_)) { - return Err(Error::::DuplicatePermission.into()); - } + if matches!(&contract.scope, PermissionScope::Curator(_)) { + return Err(Error::::DuplicatePermission.into()); } } diff --git a/pallets/permission0/src/ext/emission_impl.rs b/pallets/permission0/src/ext/emission_impl.rs index f6ba1216..2f208599 100644 --- a/pallets/permission0/src/ext/emission_impl.rs +++ b/pallets/permission0/src/ext/emission_impl.rs @@ -1,9 +1,6 @@ use crate::{ - generate_permission_id, get_total_allocated_percentage, pallet, permission::{emission::*, *}, - update_permission_indices, AccumulatedStreamAmounts, BalanceOf, Config, DistributionControl, - EmissionAllocation, EmissionScope, EnforcementTracking, Error, Event, Pallet, - PermissionContract, PermissionDuration, PermissionId, PermissionScope, Permissions, + *, }; use pallet_permission0_api::{ @@ -12,11 +9,7 @@ use pallet_permission0_api::{ PermissionDuration as ApiPermissionDuration, RevocationTerms as ApiRevocationTerms, StreamId, }; use polkadot_sdk::{ - frame_support::{ - dispatch::DispatchResult, - ensure, - traits::{Currency, ReservableCurrency}, - }, + frame_support::{dispatch::DispatchResult, ensure, traits::ReservableCurrency}, frame_system::{self, ensure_signed_or_root}, polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, sp_core::{Get, TryCollect}, @@ -34,7 +27,7 @@ impl OriginFor, BlockNumberFor, crate::BalanceOf, - >::NegativeImbalance, + NegativeImbalanceOf, > for pallet::Pallet { fn grant_emission_permission( @@ -90,7 +83,7 @@ impl fn accumulate_emissions( agent: &T::AccountId, stream: &StreamId, - amount: &mut >::NegativeImbalance, + amount: &mut NegativeImbalanceOf, ) { crate::permission::emission::do_accumulate_emissions::(agent, stream, amount); } diff --git a/pallets/permission0/src/ext/namespace_impl.rs b/pallets/permission0/src/ext/namespace_impl.rs new file mode 100644 index 00000000..48c7fbc8 --- /dev/null +++ b/pallets/permission0/src/ext/namespace_impl.rs @@ -0,0 +1,88 @@ +use crate::{ + generate_permission_id, permission::NamespaceScope, update_permission_indices, Config, Error, + Event, Pallet, PermissionContract, PermissionDuration, PermissionId, PermissionScope, + Permissions, PermissionsByGrantor, RevocationTerms, +}; +use pallet_permission0_api::Permission0NamespacesApi; +use pallet_torus0_api::{NamespacePath, NamespacePathInner, Torus0Api}; +use polkadot_sdk::{ + frame_support::ensure, + frame_system::{self, ensure_signed}, + polkadot_sdk_frame::prelude::OriginFor, + sp_runtime::{BoundedBTreeSet, DispatchError}, + sp_std::collections::btree_set::BTreeSet, +}; + +impl Permission0NamespacesApi for Pallet { + fn is_delegating_namespace(grantor: &T::AccountId, path: &NamespacePath) -> bool { + PermissionsByGrantor::::get(grantor).iter().any(|id| { + Permissions::::get(id) + .filter(|permission| { + if let PermissionScope::Namespace(scope) = &permission.scope { + for p in &scope.paths { + if p == path || path.is_parent_of(p) { + return true; + } + } + } + + false + }) + .is_some() + }) + } +} + +pub fn grant_namespace_permission_impl( + grantor: OriginFor, + grantee: T::AccountId, + paths: BoundedBTreeSet, + duration: PermissionDuration, + revocation: RevocationTerms, +) -> Result { + let grantor = ensure_signed(grantor)?; + + let paths = paths + .into_iter() + .map(|path| { + let path = NamespacePath::new(&path).map_err(|_| Error::::NamespacePathIsInvalid)?; + ensure!( + T::Torus::namespace_exists(&grantor, &path), + Error::::NamespaceDoesNotExist + ); + + Ok(path) + }) + .collect::, DispatchError>>()?; + let paths = paths + .try_into() + .map_err(|_| Error::::NamespacePathIsInvalid)?; + + let scope = PermissionScope::Namespace(NamespaceScope { paths }); + let permission_id = generate_permission_id::(&grantor, &grantee, &scope)?; + + let contract = PermissionContract { + grantor, + grantee, + scope, + duration, + revocation, + enforcement: crate::EnforcementAuthority::None, + last_execution: None, + execution_count: 0, + // Will change once we have a ROOT curator. + parent: None, + created_at: >::block_number(), + }; + + Permissions::::insert(permission_id, &contract); + update_permission_indices::(&contract.grantor, &contract.grantee, permission_id)?; + + >::deposit_event(Event::PermissionGranted { + grantor: contract.grantor, + grantee: contract.grantee, + permission_id, + }); + + Ok(permission_id) +} diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs index f3360ee4..c5cdadde 100644 --- a/pallets/permission0/src/lib.rs +++ b/pallets/permission0/src/lib.rs @@ -34,58 +34,52 @@ use polkadot_sdk::{ #[frame::pallet] pub mod pallet { + use pallet_torus0_api::NamespacePathInner; use polkadot_sdk::frame_support::PalletId; use super::*; - const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); /// Configure the pallet by specifying the parameters and types on which it depends. - #[pallet::config(with_default)] + #[pallet::config] pub trait Config: polkadot_sdk::frame_system::Config { - #[pallet::no_default_bounds] type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Permission0 pallet ID #[pallet::constant] - #[pallet::no_default_bounds] type PalletId: Get; type WeightInfo: WeightInfo; type Currency: ReservableCurrency; - type Torus: pallet_torus0_api::Torus0Api< - Self::AccountId, - >::Balance, - >::NegativeImbalance, - >; + type Torus: pallet_torus0_api::Torus0Api>; - /// Maximum number of targets per permission. - #[pallet::constant] - #[pallet::no_default_bounds] - type MaxTargetsPerPermission: Get; - - /// Maximum number of delegated streams per permission. + /// Maximum number of controllers per permission. #[pallet::constant] - #[pallet::no_default_bounds] - type MaxStreamsPerPermission: Get; + type MaxControllersPerPermission: Get; /// Maximum number of revokers. #[pallet::constant] - #[pallet::no_default_bounds] type MaxRevokersPerPermission: Get; - /// Maximum number of controllers per permission. + /// Maximum number of targets per permission. #[pallet::constant] - #[pallet::no_default_bounds] - type MaxControllersPerPermission: Get; + type MaxTargetsPerPermission: Get; + + /// Maximum number of delegated streams per permission. + #[pallet::constant] + type MaxStreamsPerPermission: Get; /// Minimum threshold for auto-distribution #[pallet::constant] - #[pallet::no_default_bounds] type MinAutoDistributionThreshold: Get>; + + /// Maximum number of namespaces a single permission can delegate. + #[pallet::constant] + type MaxNamespacesPerPermission: Get; } pub type BalanceOf = @@ -93,6 +87,10 @@ pub mod pallet { pub type AccountIdOf = ::AccountId; + pub type NegativeImbalanceOf = <::Currency as Currency< + ::AccountId, + >>::NegativeImbalance; + #[pallet::pallet] #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); @@ -108,17 +106,28 @@ pub mod pallet { Identity, (T::AccountId, T::AccountId), BoundedVec, + ValueQuery, >; /// Permissions granted by a specific account #[pallet::storage] - pub type PermissionsByGrantor = - StorageMap<_, Identity, T::AccountId, BoundedVec>; + pub type PermissionsByGrantor = StorageMap< + _, + Identity, + T::AccountId, + BoundedVec, + ValueQuery, + >; /// Permissions received by a specific account #[pallet::storage] - pub type PermissionsByGrantee = - StorageMap<_, Identity, T::AccountId, BoundedVec>; + pub type PermissionsByGrantee = StorageMap< + _, + Identity, + T::AccountId, + BoundedVec, + ValueQuery, + >; /// Revocations in progress and the voters #[pallet::storage] @@ -285,6 +294,12 @@ pub mod pallet { PermissionInCooldown, /// Curator flags provided are invalid. InvalidCuratorPermissions, + /// Tried granting unknown namespace. + NamespaceDoesNotExist, + /// Namespace path provided contains illegal character or is malformatted. + NamespacePathIsInvalid, + /// Exceeded amount of total namespaces allowed in a single permission. + TooManyNamespaces, } #[pallet::hooks] @@ -416,6 +431,23 @@ pub mod pallet { Ok(()) } + + /// Grant a permission over namespaces + #[pallet::call_index(7)] + #[pallet::weight(T::WeightInfo::grant_curator_permission())] + pub fn grant_namespace_permission( + origin: OriginFor, + grantee: T::AccountId, + paths: BoundedBTreeSet, + duration: PermissionDuration, + revocation: RevocationTerms, + ) -> DispatchResult { + ext::namespace_impl::grant_namespace_permission_impl::( + origin, grantee, paths, duration, revocation, + )?; + + Ok(()) + } } } @@ -445,20 +477,9 @@ fn update_permission_indices( PermissionsByParticipants::::try_mutate( (grantor.clone(), grantee.clone()), |permissions| -> Result<(), DispatchError> { - match permissions { - Some(ids) => { - ids.try_push(permission_id) - .map_err(|_| Error::::TooManyTargets)?; - } - None => { - let mut new_ids = - BoundedVec::::default(); - new_ids - .try_push(permission_id) - .map_err(|_| Error::::TooManyTargets)?; - *permissions = Some(new_ids); - } - } + permissions + .try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; Ok(()) }, )?; @@ -467,20 +488,9 @@ fn update_permission_indices( PermissionsByGrantor::::try_mutate( grantor.clone(), |permissions| -> Result<(), DispatchError> { - match permissions { - Some(ids) => { - ids.try_push(permission_id) - .map_err(|_| Error::::TooManyTargets)?; - } - None => { - let mut new_ids = - BoundedVec::::default(); - new_ids - .try_push(permission_id) - .map_err(|_| Error::::TooManyTargets)?; - *permissions = Some(new_ids); - } - } + permissions + .try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; Ok(()) }, )?; @@ -489,20 +499,9 @@ fn update_permission_indices( PermissionsByGrantee::::try_mutate( grantee.clone(), |permissions| -> Result<(), DispatchError> { - match permissions { - Some(ids) => { - ids.try_push(permission_id) - .map_err(|_| Error::::TooManyTargets)?; - } - None => { - let mut new_ids = - BoundedVec::::default(); - new_ids - .try_push(permission_id) - .map_err(|_| Error::::TooManyTargets)?; - *permissions = Some(new_ids); - } - } + permissions + .try_push(permission_id) + .map_err(|_| Error::::TooManyTargets)?; Ok(()) }, )?; @@ -517,20 +516,14 @@ fn remove_permission_from_indices( permission_id: PermissionId, ) { PermissionsByParticipants::::mutate((grantor.clone(), grantee.clone()), |permissions| { - if let Some(ids) = permissions { - ids.retain(|id| *id != permission_id); - } + permissions.retain(|id| *id != permission_id); }); PermissionsByGrantor::::mutate(grantor, |permissions| { - if let Some(ids) = permissions { - ids.retain(|id| *id != permission_id); - } + permissions.retain(|id| *id != permission_id); }); PermissionsByGrantee::::mutate(grantee, |permissions| { - if let Some(ids) = permissions { - ids.retain(|id| *id != permission_id); - } + permissions.retain(|id| *id != permission_id); }); } diff --git a/pallets/permission0/src/migrations.rs b/pallets/permission0/src/migrations.rs index 78a412e0..67f10238 100644 --- a/pallets/permission0/src/migrations.rs +++ b/pallets/permission0/src/migrations.rs @@ -15,3 +15,21 @@ pub mod v2 { } } } + +pub mod v3 { + use polkadot_sdk::{ + frame_support::{migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade}, + sp_weights::Weight, + }; + + use crate::{Config, Pallet}; + + pub type Migration = VersionedMigration<2, 3, MigrateToV3, Pallet, W>; + pub struct MigrateToV3(core::marker::PhantomData); + + impl UncheckedOnRuntimeUpgrade for MigrateToV3 { + fn on_runtime_upgrade() -> Weight { + Weight::zero() + } + } +} diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index a9c3a6f4..5effea8e 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -1,4 +1,5 @@ use codec::{Decode, Encode, MaxEncodedLen}; +use pallet_torus0_api::NamespacePath; use polkadot_sdk::{ frame_support::{ dispatch::DispatchResult, ensure, CloneNoBound, DebugNoBound, DefaultNoBound, EqNoBound, @@ -213,6 +214,9 @@ impl PermissionContract { PermissionScope::Curator(curator) => { curator.cleanup(permission_id, &self.last_execution, &self.grantor) } + PermissionScope::Namespace(_) => { + // No cleanup needed for namespace permissions + } } } } @@ -223,6 +227,15 @@ impl PermissionContract { pub enum PermissionScope { Emission(EmissionScope), Curator(CuratorScope), + Namespace(NamespaceScope), +} + +/// Scope for namespace permissions +#[derive(Encode, Decode, CloneNoBound, TypeInfo, MaxEncodedLen, DebugNoBound)] +#[scale_info(skip_type_params(T))] +pub struct NamespaceScope { + /// Set of namespace paths this permission grants access to + pub paths: BoundedBTreeSet, } #[derive( diff --git a/pallets/permission0/src/permission/emission.rs b/pallets/permission0/src/permission/emission.rs index 4ceb2d89..f1644b06 100644 --- a/pallets/permission0/src/permission/emission.rs +++ b/pallets/permission0/src/permission/emission.rs @@ -7,8 +7,6 @@ use polkadot_sdk::{ sp_runtime::traits::{Saturating, Zero}, }; -use crate::{AccumulatedStreamAmounts, Event, Pallet}; - use super::*; /// Type for stream ID @@ -76,7 +74,7 @@ pub enum DistributionControl { pub(crate) fn do_accumulate_emissions( agent: &T::AccountId, stream: &StreamId, - imbalance: &mut >::NegativeImbalance, + imbalance: &mut NegativeImbalanceOf, ) { let initial_balance = imbalance.peek(); let total_initial_amount = @@ -248,7 +246,7 @@ pub(crate) fn do_distribute_emission( WithdrawReasons::TRANSFER, ExistenceRequirement::KeepAlive, ) - .unwrap_or_else(|_| >::NegativeImbalance::zero()); + .unwrap_or_else(|_| NegativeImbalanceOf::::zero()); do_distribute_to_targets( &mut imbalance, @@ -271,7 +269,7 @@ pub(crate) fn do_distribute_emission( } fn do_distribute_to_targets( - imbalance: &mut <::Currency as Currency>::NegativeImbalance, + imbalance: &mut NegativeImbalanceOf, permission_id: PermissionId, contract: &PermissionContract, emission_scope: &EmissionScope, diff --git a/pallets/permission0/src/weights.rs b/pallets/permission0/src/weights.rs index 58ce0048..e7890eba 100644 --- a/pallets/permission0/src/weights.rs +++ b/pallets/permission0/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_permission0` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-05-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-06-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `NicosiPoneXSMax.localdomain`, CPU: `` +//! HOSTNAME: `Luizs-MacBook-Pro.local`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -54,21 +54,21 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) /// Storage: `Permission0::AccumulatedStreamAmounts` (r:1 w:1) /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn grant_emission_permission() -> Weight { // Proof Size summary in bytes: // Measured: `279` - // Estimated: `10986` - // Minimum execution time: 32_000_000 picoseconds. - Weight::from_parts(33_000_000, 10986) - .saturating_add(T::DbWeight::get().reads(7_u64)) + // Estimated: `11000` + // Minimum execution time: 35_000_000 picoseconds. + Weight::from_parts(36_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Permission0::Permissions` (r:1 w:1) @@ -87,8 +87,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `590` // Estimated: `11000` - // Minimum execution time: 30_000_000 picoseconds. - Weight::from_parts(30_000_000, 11000) + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(32_000_000, 11000) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -102,8 +102,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `546` // Estimated: `11000` - // Minimum execution time: 40_000_000 picoseconds. - Weight::from_parts(41_000_000, 11000) + // Minimum execution time: 41_000_000 picoseconds. + Weight::from_parts(42_000_000, 11000) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -116,7 +116,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `356` // Estimated: `11000` // Minimum execution time: 14_000_000 picoseconds. - Weight::from_parts(14_000_000, 11000) + Weight::from_parts(15_000_000, 11000) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -132,8 +132,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `583` // Estimated: `11000` - // Minimum execution time: 46_000_000 picoseconds. - Weight::from_parts(47_000_000, 11000) + // Minimum execution time: 47_000_000 picoseconds. + Weight::from_parts(48_000_000, 11000) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -143,26 +143,26 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `356` // Estimated: `11000` - // Minimum execution time: 13_000_000 picoseconds. - Weight::from_parts(14_000_000, 11000) + // Minimum execution time: 17_000_000 picoseconds. + Weight::from_parts(17_000_000, 11000) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn grant_curator_permission() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `6731` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(16_000_000, 6731) - .saturating_add(T::DbWeight::get().reads(3_u64)) + // Estimated: `11000` + // Minimum execution time: 18_000_000 picoseconds. + Weight::from_parts(19_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } } @@ -173,21 +173,21 @@ impl WeightInfo for () { /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) /// Storage: `Permission0::AccumulatedStreamAmounts` (r:1 w:1) /// Proof: `Permission0::AccumulatedStreamAmounts` (`max_values`: None, `max_size`: Some(112), added: 2587, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn grant_emission_permission() -> Weight { // Proof Size summary in bytes: // Measured: `279` - // Estimated: `10986` - // Minimum execution time: 32_000_000 picoseconds. - Weight::from_parts(33_000_000, 10986) - .saturating_add(RocksDbWeight::get().reads(7_u64)) + // Estimated: `11000` + // Minimum execution time: 35_000_000 picoseconds. + Weight::from_parts(36_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Permission0::Permissions` (r:1 w:1) @@ -206,8 +206,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `590` // Estimated: `11000` - // Minimum execution time: 30_000_000 picoseconds. - Weight::from_parts(30_000_000, 11000) + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(32_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -221,8 +221,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `546` // Estimated: `11000` - // Minimum execution time: 40_000_000 picoseconds. - Weight::from_parts(41_000_000, 11000) + // Minimum execution time: 41_000_000 picoseconds. + Weight::from_parts(42_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -235,7 +235,7 @@ impl WeightInfo for () { // Measured: `356` // Estimated: `11000` // Minimum execution time: 14_000_000 picoseconds. - Weight::from_parts(14_000_000, 11000) + Weight::from_parts(15_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -251,8 +251,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `583` // Estimated: `11000` - // Minimum execution time: 46_000_000 picoseconds. - Weight::from_parts(47_000_000, 11000) + // Minimum execution time: 47_000_000 picoseconds. + Weight::from_parts(48_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -262,26 +262,26 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `356` // Estimated: `11000` - // Minimum execution time: 13_000_000 picoseconds. - Weight::from_parts(14_000_000, 11000) + // Minimum execution time: 17_000_000 picoseconds. + Weight::from_parts(17_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) - /// Storage: `Permission0::Permissions` (r:0 w:1) - /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) fn grant_curator_permission() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `6731` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(16_000_000, 6731) - .saturating_add(RocksDbWeight::get().reads(3_u64)) + // Estimated: `11000` + // Minimum execution time: 18_000_000 picoseconds. + Weight::from_parts(19_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } } diff --git a/pallets/permission0/tests/enforcement.rs b/pallets/permission0/tests/enforcement.rs index 9d062c42..009ef704 100644 --- a/pallets/permission0/tests/enforcement.rs +++ b/pallets/permission0/tests/enforcement.rs @@ -35,12 +35,12 @@ fn set_enforcement_authority_by_grantor() { register_empty_agent(grantee); register_empty_agent(controller); - add_balance(grantor, to_nano(10) + 1); + add_balance(grantor, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(grantee, u16::MAX)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -111,7 +111,7 @@ fn toggle_accumulation_by_controller() { register_empty_agent(grantee); register_empty_agent(controller); - add_balance(grantor, to_nano(100) + 1); + add_balance(grantor, as_tors(100) + 1); let permission_id = assert_ok!(grant_emission_permission( grantor, @@ -127,7 +127,7 @@ fn toggle_accumulation_by_controller() { }, )); - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); assert_ok!( pallet_permission0::Pallet::::toggle_permission_accumulation( @@ -143,7 +143,7 @@ fn toggle_accumulation_by_controller() { } let balance_before = get_balance(grantee); - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); assert_eq!(get_balance(grantee), balance_before); @@ -155,7 +155,7 @@ fn toggle_accumulation_by_controller() { ) ); - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); assert_ok!(pallet_permission0::Pallet::::execute_permission( get_origin(grantor), @@ -180,12 +180,12 @@ fn unauthorized_account_cannot_toggle() { register_empty_agent(controller); register_empty_agent(unauthorized); - add_balance(grantor, to_nano(10) + 1); + add_balance(grantor, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( grantor, grantee, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(grantee, u16::MAX)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -227,7 +227,7 @@ fn enforcement_execute_permission() { register_empty_agent(grantee); register_empty_agent(controller); - add_balance(grantor, to_nano(100) + 1); + add_balance(grantor, as_tors(100) + 1); let permission_id = assert_ok!(grant_emission_permission( grantor, @@ -243,7 +243,7 @@ fn enforcement_execute_permission() { }, )); - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); let balance_before = get_balance(grantee); @@ -272,7 +272,7 @@ fn unauthorized_cannot_enforcement_execute() { register_empty_agent(controller); register_empty_agent(unauthorized); - add_balance(grantor, to_nano(100) + 1); + add_balance(grantor, as_tors(100) + 1); let permission_id = assert_ok!(grant_emission_permission( grantor, @@ -288,7 +288,7 @@ fn unauthorized_cannot_enforcement_execute() { }, )); - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); assert_err!( pallet_permission0::Pallet::::enforcement_execute_permission( @@ -316,7 +316,7 @@ fn multi_controller_voting() { register_empty_agent(controller2); register_empty_agent(controller3); - add_balance(grantor, to_nano(100) + 1); + add_balance(grantor, as_tors(100) + 1); let permission_id = assert_ok!(grant_emission_permission( grantor, @@ -332,7 +332,7 @@ fn multi_controller_voting() { }, )); - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); assert_ok!( pallet_permission0::Pallet::::toggle_permission_accumulation( @@ -360,7 +360,7 @@ fn multi_controller_voting() { assert!(!emission_scope.accumulating); } - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); assert_ok!( pallet_permission0::Pallet::::enforcement_execute_permission( @@ -392,7 +392,7 @@ fn multi_controller_voting() { ) ); - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); assert_ok!( pallet_permission0::Pallet::::enforcement_execute_permission( @@ -426,7 +426,7 @@ fn enforcement_cannot_execute_non_manual_distribution() { register_empty_agent(grantee); register_empty_agent(controller); - add_balance(grantor, to_nano(100) + 1); + add_balance(grantor, as_tors(100) + 1); let permission_id = assert_ok!(grant_emission_permission( grantor, @@ -444,7 +444,7 @@ fn enforcement_cannot_execute_non_manual_distribution() { }, )); - distribute_emission(grantor, to_nano(10)); + distribute_emission(grantor, as_tors(10)); assert_err!( pallet_permission0::Pallet::::enforcement_execute_permission( diff --git a/pallets/permission0/tests/fixed.rs b/pallets/permission0/tests/fixed.rs index dec03145..27c0bed2 100644 --- a/pallets/permission0/tests/fixed.rs +++ b/pallets/permission0/tests/fixed.rs @@ -15,7 +15,7 @@ fn fixed_fails_without_balance() { grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_0, u16::MAX)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -37,12 +37,12 @@ fn fixed_creates() { let agent_1 = 1; register_empty_agent(agent_1); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_0, u16::MAX)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -66,12 +66,12 @@ fn fixed_reserves() { let agent_1 = 1; register_empty_agent(agent_1); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_0, u16::MAX)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -83,7 +83,7 @@ fn fixed_reserves() { permission_id )); - assert_eq!(Balances::reserved_balance(agent_0), to_nano(10)); + assert_eq!(Balances::reserved_balance(agent_0), as_tors(10)); }); } @@ -100,12 +100,12 @@ fn fixed_manual_executes() { let agent_2 = 2; register_empty_agent(agent_2); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -122,8 +122,8 @@ fn fixed_manual_executes() { permission_id )); - assert_eq!(get_balance(agent_1), to_nano(5)); - assert_eq!(get_balance(agent_2), to_nano(5)); + assert_eq!(get_balance(agent_1), as_tors(5)); + assert_eq!(get_balance(agent_2), as_tors(5)); assert_eq!(get_balance(agent_0), 1); assert_ok!(Permission0::execute_permission( @@ -146,12 +146,12 @@ fn fixed_manual_executes_only_once() { let agent_2 = 2; register_empty_agent(agent_2); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -168,8 +168,8 @@ fn fixed_manual_executes_only_once() { permission_id )); - assert_eq!(get_balance(agent_1), to_nano(5)); - assert_eq!(get_balance(agent_2), to_nano(5)); + assert_eq!(get_balance(agent_1), as_tors(5)); + assert_eq!(get_balance(agent_2), as_tors(5)); assert_eq!(get_balance(agent_0), 1); assert_ok!(Permission0::execute_permission( @@ -177,8 +177,8 @@ fn fixed_manual_executes_only_once() { permission_id )); - assert_eq!(get_balance(agent_1), to_nano(5)); - assert_eq!(get_balance(agent_2), to_nano(5)); + assert_eq!(get_balance(agent_1), as_tors(5)); + assert_eq!(get_balance(agent_2), as_tors(5)); assert_eq!(get_balance(agent_0), 1); }); } @@ -196,12 +196,12 @@ fn fixed_at_block_executes() { let agent_2 = 2; register_empty_agent(agent_2); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let _ = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], pallet_permission0_api::DistributionControl::AtBlock(20), pallet_permission0_api::PermissionDuration::Indefinite, @@ -211,8 +211,8 @@ fn fixed_at_block_executes() { step_block(40); - assert_eq!(get_balance(agent_1), to_nano(5)); - assert_eq!(get_balance(agent_2), to_nano(5)); + assert_eq!(get_balance(agent_1), as_tors(5)); + assert_eq!(get_balance(agent_2), as_tors(5)); assert_eq!(get_balance(agent_0), 1); }); } diff --git a/pallets/permission0/tests/lifetime.rs b/pallets/permission0/tests/lifetime.rs index 05955413..c3293007 100644 --- a/pallets/permission0/tests/lifetime.rs +++ b/pallets/permission0/tests/lifetime.rs @@ -15,12 +15,12 @@ fn manual_cant_execute_when_expires() { let agent_2 = 2; register_empty_agent(agent_2); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::UntilBlock(1), @@ -50,12 +50,12 @@ fn irrevocable() { let agent_2 = 2; register_empty_agent(agent_2); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -94,12 +94,12 @@ fn revocable_by_grantor() { let agent_2 = 2; register_empty_agent(agent_2); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -132,12 +132,12 @@ fn revocable_after_block() { let agent_2 = 2; register_empty_agent(agent_2); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX / 2), (agent_2, u16::MAX / 2)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -169,13 +169,13 @@ fn revocable_by_arbiters() { let agent_1 = 1; register_empty_agent(agent_1); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let grant_invalid = |accounts: &[AccountId], required_votes| { grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX / 2)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, @@ -206,7 +206,7 @@ fn revocable_by_arbiters() { let permission_id = assert_ok!(grant_emission_permission( agent_0, agent_1, - pallet_permission0_api::EmissionAllocation::FixedAmount(to_nano(10)), + pallet_permission0_api::EmissionAllocation::FixedAmount(as_tors(10)), vec![(agent_1, u16::MAX)], pallet_permission0_api::DistributionControl::Manual, pallet_permission0_api::PermissionDuration::Indefinite, diff --git a/pallets/permission0/tests/stream.rs b/pallets/permission0/tests/stream.rs index ce3802ed..7d8be2fb 100644 --- a/pallets/permission0/tests/stream.rs +++ b/pallets/permission0/tests/stream.rs @@ -26,7 +26,7 @@ fn stream_fails_if_overflow() { let agent_1 = 1; register_empty_agent(agent_1); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let stream_id = generate_root_stream_id(&agent_0); @@ -75,7 +75,7 @@ fn stream_creates() { let agent_1 = 1; register_empty_agent(agent_1); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let stream_id = generate_root_stream_id(&agent_0); @@ -122,7 +122,7 @@ fn stream_manual_executes() { let agent_1 = 1; register_empty_agent(agent_1); - add_balance(agent_0, to_nano(10) + 1); + add_balance(agent_0, as_tors(10) + 1); let stream_id = generate_root_stream_id(&agent_0); @@ -142,7 +142,7 @@ fn stream_manual_executes() { AccumulatedStreamAmounts::::set( (agent_0, stream_id, permission_id), - Some(to_nano(10)), + Some(as_tors(10)), ); assert_ok!(Permission0::execute_permission( @@ -150,7 +150,7 @@ fn stream_manual_executes() { permission_id )); - assert_eq!(get_balance(agent_1), to_nano(10)); + assert_eq!(get_balance(agent_1), as_tors(10)); }); } diff --git a/pallets/torus0/Cargo.toml b/pallets/torus0/Cargo.toml index be37fdcd..595125d7 100644 --- a/pallets/torus0/Cargo.toml +++ b/pallets/torus0/Cargo.toml @@ -16,6 +16,9 @@ std = [ "polkadot-sdk/std", "scale-info/std", "pallet-torus0-api/std", + "pallet-emission0-api/std", + "pallet-governance-api/std", + "pallet-permission0-api/std", ] runtime-benchmarks = [ "polkadot-sdk/runtime-benchmarks", @@ -28,10 +31,12 @@ try-runtime = ["polkadot-sdk/try-runtime", "pallet-torus0-api/try-runtime"] codec = { workspace = true, features = ["derive"] } scale-info = { workspace = true, features = ["derive"] } polkadot-sdk = { workspace = true, features = ["experimental", "runtime"] } +libm.workspace = true pallet-torus0-api.workspace = true pallet-emission0-api.workspace = true pallet-governance-api.workspace = true +pallet-permission0-api.workspace = true [dev-dependencies] diff --git a/pallets/torus0/api/Cargo.toml b/pallets/torus0/api/Cargo.toml index 709cf0b3..ae6a5e62 100644 --- a/pallets/torus0/api/Cargo.toml +++ b/pallets/torus0/api/Cargo.toml @@ -11,9 +11,11 @@ workspace = true [features] default = ["std"] -std = ["polkadot-sdk/std"] +std = ["codec/std", "polkadot-sdk/std", "scale-info/std"] runtime-benchmarks = ["polkadot-sdk/runtime-benchmarks"] try-runtime = ["polkadot-sdk/try-runtime"] [dependencies] +codec = { workspace = true, features = ["derive"] } +scale-info = { workspace = true, features = ["derive"] } polkadot-sdk = { workspace = true, features = ["sp-runtime"] } diff --git a/pallets/torus0/api/src/lib.rs b/pallets/torus0/api/src/lib.rs index a721ab36..d06e311e 100644 --- a/pallets/torus0/api/src/lib.rs +++ b/pallets/torus0/api/src/lib.rs @@ -3,10 +3,18 @@ extern crate alloc; extern crate polkadot_sdk; -use polkadot_sdk::sp_runtime::Percent; +use core::str::FromStr; + +use codec::{Decode, Encode, MaxEncodedLen}; +use polkadot_sdk::{ + sp_core::ConstU32, + sp_runtime::{BoundedVec, Percent}, + sp_std::vec::Vec, +}; +use scale_info::TypeInfo; /// The Torus0 pallet API. -pub trait Torus0Api { +pub trait Torus0Api { /// Interval of blocks in which rewards are distributed. fn reward_interval() -> u16; @@ -25,6 +33,8 @@ pub trait Torus0Api { fn agent_ids() -> impl Iterator; fn is_agent_registered(agent: &AccountId) -> bool; + fn namespace_exists(agent: &AccountId, path: &NamespacePath) -> bool; + #[doc(hidden)] #[cfg(feature = "runtime-benchmarks")] fn force_register_agent( @@ -42,3 +52,202 @@ pub trait Torus0Api { amount: Balance, ) -> polkadot_sdk::frame_support::dispatch::DispatchResult; } + +/// Number of total bytes a namespace path can contain. +/// This might have to increase in the future, but is a good enough default value. +/// If it ends up being formalized, the length can be described as a u8. +pub const MAX_NAMESPACE_PATH_LENGTH: usize = 256; +/// Number of total bytes a segment can contain. +pub const MAX_SEGMENT_LENGTH: usize = 64; +/// Max number of segments in a path. +pub const MAX_NAMESPACE_SEGMENTS: usize = 10; + +pub const NAMESPACE_SEPARATOR: u8 = b'.'; + +pub type NamespacePathInner = BoundedVec>; + +#[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, TypeInfo, MaxEncodedLen, Debug)] +pub struct NamespacePath(NamespacePathInner); + +impl NamespacePath { + /// Create a new namespace path from bytes with validation + pub fn new(bytes: &[u8]) -> Result { + if bytes.is_empty() { + return Err("empty namespace path"); + } + + if bytes.len() > MAX_NAMESPACE_PATH_LENGTH { + return Err("path too long"); + } + + let segments: Vec<&[u8]> = bytes.split(|&b| b == NAMESPACE_SEPARATOR).collect(); + if segments.len() > MAX_NAMESPACE_SEGMENTS { + return Err("too many namespace segments"); + } + + for segment in &segments { + let segment = core::str::from_utf8(segment).map_err(|_| "path is invalid itf-8")?; + + let first = segment.chars().next().ok_or("empty namespace segment")?; + if !first.is_alphanumeric() { + return Err("namespace segment must start with alphanumeric character"); + } + + if segment.len() > MAX_SEGMENT_LENGTH { + return Err("namespace segment too long"); + } + + if segment + .chars() + .any(|c| !c.is_alphanumeric() && c != '-' && c != '_' && c != '+' && c != '=') + { + return Err("invalid character in namespace segment"); + } + } + + bytes + .to_vec() + .try_into() + .map(Self) + .map_err(|_| "Failed to create bounded vec") + } + + /// Converts this namespace into the inner bytes + pub fn into_inner(self) -> NamespacePathInner { + self.0 + } + + /// Get the underlying bytes + pub fn as_bytes(&self) -> &[u8] { + self.0.as_slice() + } + + /// Parse a namespace path into segments + pub fn segments(&self) -> Vec<&[u8]> { + self.as_bytes() + .split(|&b| b == NAMESPACE_SEPARATOR) + .collect() + } + + /// Get the parent path of this namespace + pub fn parent(&self) -> Option { + let bytes = self.as_bytes(); + + if let Some(last_dot) = bytes.iter().rposition(|&b| b == NAMESPACE_SEPARATOR) { + bytes.get(..last_dot)?.to_vec().try_into().ok().map(Self) + } else { + None + } + } + + /// Get the depth of this namespace (number of segments) + pub fn depth(&self) -> u32 { + self.segments().len() as u32 + } + + /// Check if this path is a parent of another path + pub fn is_parent_of(&self, child: &Self) -> bool { + let self_bytes = self.as_bytes(); + let child_bytes = child.as_bytes(); + + let Some(maybe_separator) = child_bytes.get(self_bytes.len()) else { + return false; + }; + + child_bytes.starts_with(self_bytes) && *maybe_separator == NAMESPACE_SEPARATOR + } + + /// Get all parent paths up to root + pub fn parents(&self) -> Vec { + let mut parents = Vec::new(); + let mut current = self.clone(); + + while let Some(parent) = current.parent() { + parents.push(parent.clone()); + current = parent; + } + + parents + } +} + +impl FromStr for NamespacePath { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + Self::new(s.as_bytes()) + } +} + +#[cfg(test)] +mod tests { + #![allow(clippy::indexing_slicing)] + + use super::*; + + #[test] + fn namespace_creation_validates_paths() { + assert!(NamespacePath::new(b"agent").is_ok()); + assert!(NamespacePath::new(b"agent.alice").is_ok()); + assert!(NamespacePath::new(b"agent.alice.memory").is_ok()); + assert!(NamespacePath::new(b"agent-1.alice_2.key=val+1").is_ok()); + + assert!(NamespacePath::new(b"").is_err()); + assert!(NamespacePath::new(b".agent").is_err()); + assert!(NamespacePath::new(b"agent.").is_err()); + assert!(NamespacePath::new(b"agent..alice").is_err()); + assert!(NamespacePath::new(b"agent.-alice").is_err()); + assert!(NamespacePath::new(b"agent.alice!").is_err()); + assert!(NamespacePath::new(b"agent.alice memory").is_err()); + } + + #[test] + fn namespace_segment_listing() { + let path = NamespacePath::new(b"agent.alice.memory").unwrap(); + let segments = path.segments(); + assert_eq!(segments.len(), 3); + assert_eq!(segments[0], b"agent"); + assert_eq!(segments[1], b"alice"); + assert_eq!(segments[2], b"memory"); + } + + #[test] + fn namespace_parent_returns_correctly() { + let path = NamespacePath::new(b"agent.alice.memory").unwrap(); + let parent = path.parent().unwrap(); + assert_eq!(parent.as_bytes(), b"agent.alice"); + + let root = NamespacePath::new(b"agent").unwrap(); + assert!(root.parent().is_none()); + } + + #[test] + fn namespace_depth_calculation() { + let path1 = NamespacePath::new(b"agent").unwrap(); + assert_eq!(path1.depth(), 1); + + let path2 = NamespacePath::new(b"agent.alice.memory.twitter").unwrap(); + assert_eq!(path2.depth(), 4); + } + + #[test] + fn test_is_parent_of() { + let parent = NamespacePath::new(b"agent.alice").unwrap(); + let child = NamespacePath::new(b"agent.alice.memory").unwrap(); + let other = NamespacePath::new(b"agent.bob").unwrap(); + + assert!(parent.is_parent_of(&child)); + assert!(!parent.is_parent_of(&other)); + assert!(!child.is_parent_of(&parent)); + } + + #[test] + fn test_parents() { + let path = NamespacePath::new(b"agent.alice.memory.twitter").unwrap(); + let parents = path.parents(); + assert_eq!(parents.len(), 3); + assert_eq!(parents[0].as_bytes(), b"agent.alice.memory"); + assert_eq!(parents[1].as_bytes(), b"agent.alice"); + assert_eq!(parents[2].as_bytes(), b"agent"); + } +} diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index ec79af19..725f72a0 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -11,7 +11,7 @@ use polkadot_sdk::{ }, polkadot_sdk_frame::prelude::BlockNumberFor, sp_runtime::{traits::Saturating, BoundedVec, DispatchError, Percent}, - sp_tracing::{debug, debug_span}, + sp_tracing::debug_span, }; use scale_info::{prelude::vec::Vec, TypeInfo}; @@ -56,11 +56,6 @@ pub fn register( let span = debug_span!("register", agent.key = ?agent_key); let _guard = span.enter(); - ensure!( - ::is_whitelisted(&agent_key), - crate::Error::::AgentKeyNotWhitelisted - ); - ensure!( !exists::(&agent_key), crate::Error::::AgentAlreadyRegistered @@ -77,24 +72,6 @@ pub fn register( crate::Error::::TooManyAgentRegistrationsThisInterval ); - let agents_count = crate::Agents::::iter().count(); - let max_allowed_agents = crate::MaxAllowedAgents::::get() as usize; - - if agents_count >= max_allowed_agents { - let slots_to_drop = agents_count.saturating_sub(max_allowed_agents); - debug!("network is full, unregistering {slots_to_drop} agent(s)"); - - for _ in 0..=slots_to_drop { - let Some(pruned_agent) = find_agent_to_prune::(PruningStrategy::LeastProductive) - else { - return Err(crate::Error::::MaxAllowedAgents.into()); - }; - - debug!("unregistering agent {pruned_agent:?}"); - unregister::(pruned_agent)?; - } - } - validate_agent_name::(&name[..])?; validate_agent_url::(&url[..])?; validate_agent_metadata::(&metadata[..])?; @@ -131,11 +108,7 @@ pub fn register( crate::Pallet::::deposit_event(crate::Event::::AgentRegistered(agent_key.clone())); if let Some(allocator) = ::get_allocators().next() { - if let Err(err) = ::delegate_weight_control(&agent_key, &allocator) { - polkadot_sdk::sp_tracing::error!( - "failed to delegate weight control for {agent_key:?} on {allocator:?}: {err:?}" - ); - } + let _ = ::delegate_weight_control(&agent_key, &allocator); } else { polkadot_sdk::sp_tracing::warn!("no allocators available to delegate to for {agent_key:?}"); } @@ -327,62 +300,3 @@ pub enum PruningStrategy { /// period. IgnoreImmunity, } - -/// Finds an agent to prune depending on the strategy defined. -/// -/// When search for least productive agent, agents that are older than the -/// immunity period will be ranked based on their emissions in the last -/// consensus run (epoch). Dividends are multiplied by the participation -/// factor defined by the network and and summed with incentives. The -/// to-be-pruned agent is the one with the lowest result, if multiple agents are -/// found, the algorithm chooses the oldest one. -#[doc(hidden)] -pub fn find_agent_to_prune(strategy: PruningStrategy) -> Option { - let current_block: u64 = >::block_number() - .try_into() - .ok() - .expect("blockchain will not exceed 2^64 blocks; QED."); - - let immunity_period = crate::ImmunityPeriod::::get() as u64; - let dividends_participation_weight = crate::DividendsParticipationWeight::::get(); - - let scores: Vec<_> = crate::Agents::::iter() - .filter(|(_, agent)| match strategy { - PruningStrategy::LeastProductive => { - let block_at_registration = agent - .registration_block - .try_into() - .ok() - .expect("blockchain will not exceed 2^64 blocks; QED."); - current_block.saturating_sub(block_at_registration) >= immunity_period - } - PruningStrategy::IgnoreImmunity => true, - }) - .map(|(id, agent)| { - let (dividends, incentives) = ::consensus_stats(&id) - .map(|stats| (stats.dividends, stats.incentives)) - .unwrap_or_default(); - - let efficiency_score = dividends_participation_weight - .mul_floor(dividends) - .saturating_add(incentives); - - (id, efficiency_score, agent.registration_block) - }) - .collect(); - - // Age is secondary to the emission. - scores - .iter() - // This is the usual scenario, that is why we check for oldest 0 emission to return early - .filter(|&(_, efficiency_score, _)| *efficiency_score == 0) - .min_by_key(|&(_, _, block_at_registration)| block_at_registration) - .or_else(|| { - scores - .iter() - .min_by(|&(_, score_a, block_a), &(_, score_b, block_b)| { - score_a.cmp(score_b).then_with(|| block_a.cmp(block_b)) - }) - }) - .map(|(id, _, _)| id.clone()) -} diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index 7eb2ff16..11c55c46 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -5,6 +5,7 @@ pub mod burn; mod ext; pub mod fee; pub mod migrations; +pub mod namespace; pub mod stake; pub mod benchmarking; @@ -15,6 +16,7 @@ use frame::{ arithmetic::Percent, prelude::{ensure_root, ensure_signed}, }; +use namespace::{NamespaceMetadata, NamespacePath}; pub use pallet::*; use polkadot_sdk::{ frame_support::{ @@ -32,11 +34,18 @@ use crate::{agent::Agent, burn::BurnConfiguration, fee::ValidatorFeeConstraints} #[frame::pallet] pub mod pallet { - const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); use frame::prelude::BlockNumberFor; use pallet_emission0_api::Emission0Api; use pallet_governance_api::GovernanceApi; + use pallet_permission0_api::Permission0NamespacesApi; + use pallet_torus0_api::NamespacePathInner; + use polkadot_sdk::{ + frame_support::traits::{ExistenceRequirement, ReservableCurrency}, + frame_system, + sp_runtime::traits::Zero, + }; use weights::WeightInfo; use super::*; @@ -62,11 +71,6 @@ pub mod pallet { pub type MinValidatorStake = StorageValue<_, BalanceOf, ValueQuery, T::DefaultMinValidatorStake>; - /// Number of blocks in which an agent is immune to pruning after - /// registration. - #[pallet::storage] - pub type ImmunityPeriod = StorageValue<_, u16, ValueQuery, T::DefaultImmunityPeriod>; - /// Number of blocks between emissions. #[pallet::storage] pub type RewardInterval = StorageValue<_, u16, ValueQuery, T::DefaultRewardInterval>; @@ -88,12 +92,6 @@ pub mod pallet { pub type MaxAgentUrlLength = StorageValue<_, u16, ValueQuery, T::DefaultMaxAgentUrlLength>; - /// Maximum number of agents registered at one time. Registering when this - /// number is met means new comers will cause pruning of old agents. - #[pallet::storage] - pub type MaxAllowedAgents = - StorageValue<_, u16, ValueQuery, T::DefaultMaxAllowedAgents>; - /// Number of agent registrations that happened this block. #[pallet::storage] pub type RegistrationsThisBlock = StorageValue<_, u16, ValueQuery>; @@ -144,6 +142,30 @@ pub mod pallet { pub type AgentUpdateCooldown = StorageValue<_, BlockNumberFor, ValueQuery, T::DefaultAgentUpdateCooldown>; + /// Namespace registry - maps (owner, path) to metadata + #[pallet::storage] + pub type Namespaces = StorageDoubleMap< + _, + Blake2_128Concat, + T::AccountId, + Blake2_128Concat, + NamespacePath, + NamespaceMetadata, + >; + + /// Count of namespaces registered per account + #[pallet::storage] + pub type NamespaceCount = + StorageMap<_, Blake2_128Concat, T::AccountId, u32, ValueQuery>; + + #[pallet::storage] + pub type NamespacePricingConfig = StorageValue< + _, + namespace::NamespacePricingConfig, + ValueQuery, + T::DefaultNamespacePricingConfig, + >; + #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(block_number: BlockNumberFor) -> Weight { @@ -160,18 +182,14 @@ pub mod pallet { } } - #[pallet::config(with_default)] + #[pallet::config] pub trait Config: polkadot_sdk::frame_system::Config { #[pallet::constant] type DefaultMaxAllowedValidators: Get; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultMinValidatorStake: Get>; - #[pallet::constant] - type DefaultImmunityPeriod: Get; - #[pallet::constant] type DefaultRewardInterval: Get; @@ -184,14 +202,10 @@ pub mod pallet { #[pallet::constant] type DefaultMaxAgentUrlLength: Get; - #[pallet::constant] - type DefaultMaxAllowedAgents: Get; - #[pallet::constant] type DefaultMaxRegistrationsPerBlock: Get; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultMinAllowedStake: Get>; #[pallet::constant] @@ -201,26 +215,21 @@ pub mod pallet { type DefaultMinWeightControlFee: Get; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultMinBurn: Get>; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultMaxBurn: Get>; #[pallet::constant] type DefaultAdjustmentAlpha: Get; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultTargetRegistrationsInterval: Get>; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultTargetRegistrationsPerInterval: Get; #[pallet::constant] - #[pallet::no_default_bounds] type DefaultMaxRegistrationsPerInterval: Get; /// The storage MaxNameLength should be constrained to be no more than @@ -242,18 +251,23 @@ pub mod pallet { /// Default Cooldown (in blocks) in which an agent needs to wait between each `update_agent` call. #[pallet::constant] - #[pallet::no_default_bounds] type DefaultAgentUpdateCooldown: Get>; - #[pallet::no_default_bounds] + #[pallet::constant] + type DefaultNamespacePricingConfig: Get>; + type RuntimeEvent: From> + IsType<::RuntimeEvent>; - type Currency: Currency + Send + Sync; + type Currency: Currency + + ReservableCurrency + + Send + + Sync; type Governance: GovernanceApi; type Emission: Emission0Api; + type Permission0: Permission0NamespacesApi; type WeightInfo: WeightInfo; } @@ -360,6 +374,141 @@ pub mod pallet { AgentUpdateCooldown::::set(new_cooldown); Ok(()) } + + /// Create a new namespace, automatically creating missing intermediate nodes + #[pallet::call_index(7)] + #[pallet::weight(Weight::default())] + pub fn create_namespace(origin: OriginFor, path: NamespacePathInner) -> DispatchResult { + let owner = ensure_signed(origin)?; + + ensure!( + Agents::::contains_key(&owner), + Error::::AgentDoesNotExist + ); + + let namespace_path = + NamespacePath::new(&path).map_err(|_| Error::::InvalidNamespacePath)?; + + ensure!( + !Namespaces::::contains_key(&owner, &namespace_path), + Error::::NamespaceAlreadyExists + ); + + let mut paths_to_create = namespace_path.parents(); + paths_to_create.insert(0, namespace_path.clone()); + + let mut missing_paths = paths_to_create.as_slice(); + for (i, segment) in paths_to_create.iter().skip(1).enumerate().rev() { + if !Namespaces::::contains_key(&owner, segment) { + missing_paths = paths_to_create + .get(..i.saturating_add(1)) + .unwrap_or(&paths_to_create); + break; + } + } + + let current_count = NamespaceCount::::get(&owner); + + let pricing_config = NamespacePricingConfig::::get(); + let mut total_fee = BalanceOf::::zero(); + let mut total_deposit = BalanceOf::::zero(); + + for (index, path) in missing_paths.iter().enumerate() { + let count = current_count.saturating_add(index as u32); + let fee = pricing_config.namespace_fee(count)?; + let deposit = pricing_config.namespace_deposit(path); + + total_fee = total_fee.saturating_add(fee); + total_deposit = total_deposit.saturating_add(deposit); + } + + T::Currency::reserve(&owner, total_deposit)?; + + ::Currency::transfer( + &owner, + &::Governance::dao_treasury_address(), + total_fee, + ExistenceRequirement::AllowDeath, + ) + .map_err(|_| crate::Error::::NotEnoughBalanceToRegisterAgent)?; + + let current_block = >::block_number(); + + for path in missing_paths.iter() { + let deposit = pricing_config.namespace_deposit(path); + + let metadata = NamespaceMetadata { + created_at: current_block, + deposit, + }; + + Namespaces::::insert(&owner, path, metadata); + } + + NamespaceCount::::mutate(&owner, |count| { + *count = count.saturating_add(missing_paths.len() as u32) + }); + + Self::deposit_event(Event::NamespaceCreated { + owner, + path: namespace_path, + deposit: total_deposit, + }); + + Ok(()) + } + + /// Delete a namespace and all its children + #[pallet::call_index(8)] + #[pallet::weight(Weight::default())] + pub fn delete_namespace(origin: OriginFor, path: Vec) -> DispatchResult { + let owner = ensure_signed(origin)?; + + let namespace_path = + NamespacePath::new(&path).map_err(|_| Error::::InvalidNamespacePath)?; + + ensure!( + Namespaces::::contains_key(&owner, &namespace_path), + Error::::NamespaceNotFound + ); + + ensure!( + !T::Permission0::is_delegating_namespace(&owner, &namespace_path), + Error::::NamespaceBeingDelegated + ); + + let mut total_deposit = BalanceOf::::zero(); + let namespaces_to_delete: Vec<_> = Namespaces::::iter_prefix(&owner) + .filter_map(|(path, metadata)| { + if path == namespace_path || namespace_path.is_parent_of(&path) { + Some((path, metadata.deposit)) + } else { + None + } + }) + .collect(); + + let deleted_count = namespaces_to_delete.len() as u32; + + for (path_to_delete, deposit) in namespaces_to_delete { + total_deposit = total_deposit.saturating_add(deposit); + Namespaces::::remove(&owner, &path_to_delete); + } + + NamespaceCount::::mutate(&owner, |count| { + *count = count.saturating_sub(deleted_count) + }); + + T::Currency::unreserve(&owner, total_deposit); + + Self::deposit_event(Event::NamespaceDeleted { + owner, + path: namespace_path, + deposit_released: total_deposit, + }); + + Ok(()) + } } #[pallet::event] @@ -380,6 +529,24 @@ pub mod pallet { /// Event created when the agent's updated information is added to the /// network AgentUpdated(AccountIdOf), + /// Namespace created + NamespaceCreated { + owner: T::AccountId, + path: NamespacePath, + deposit: BalanceOf, + }, + /// Namespace deleted + NamespaceDeleted { + owner: T::AccountId, + path: NamespacePath, + deposit_released: BalanceOf, + }, + /// Namespace transferred + NamespaceTransferred { + from: T::AccountId, + to: T::AccountId, + path: NamespacePath, + }, } #[pallet::error] @@ -419,9 +586,6 @@ pub mod pallet { NotEnoughStakeToRegister, /// The entity is still registered and cannot be modified. StillRegistered, - /// Attempted to set max allowed agents to a value less than the current - /// number of registered agents. - MaxAllowedAgents, /// Insufficient balance to transfer. NotEnoughBalanceToTransfer, /// The agent metadata is invalid. @@ -461,15 +625,28 @@ pub mod pallet { InvalidWeightControlFee, /// The agent already updated recently AgentUpdateOnCooldown, + /// Invalid namespace path + InvalidNamespacePath, + /// Namespace already exists + NamespaceAlreadyExists, + /// Namespace not found + NamespaceNotFound, + /// Parent namespace not found + ParentNamespaceNotFound, + /// Not the owner of the namespace + NotNamespaceOwner, + /// Cannot delete namespace with children + NamespaceHasChildren, + /// Namespace depth exceeded + NamespaceDepthExceeded, + /// The namespace is being delegated through a permission. Revoke that first. + NamespaceBeingDelegated, } } impl - pallet_torus0_api::Torus0Api< - T::AccountId, - >::Balance, - >::NegativeImbalance, - > for Pallet + pallet_torus0_api::Torus0Api>::Balance> + for Pallet { fn reward_interval() -> u16 { RewardInterval::::get() @@ -530,6 +707,10 @@ impl Agents::::contains_key(agent) } + fn namespace_exists(agent: &T::AccountId, path: &NamespacePath) -> bool { + Namespaces::::contains_key(agent, path) + } + #[cfg(feature = "runtime-benchmarks")] fn force_register_agent( id: &T::AccountId, diff --git a/pallets/torus0/src/migrations.rs b/pallets/torus0/src/migrations.rs index 1da8411c..d3437b7c 100644 --- a/pallets/torus0/src/migrations.rs +++ b/pallets/torus0/src/migrations.rs @@ -62,3 +62,21 @@ pub mod v3 { } } } + +pub mod v4 { + use polkadot_sdk::{ + frame_support::{migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade}, + sp_weights::Weight, + }; + + use crate::{Config, Pallet}; + + pub type Migration = VersionedMigration<3, 4, MigrateToV4, Pallet, W>; + pub struct MigrateToV4(core::marker::PhantomData); + + impl UncheckedOnRuntimeUpgrade for MigrateToV4 { + fn on_runtime_upgrade() -> Weight { + Weight::zero() + } + } +} diff --git a/pallets/torus0/src/namespace.rs b/pallets/torus0/src/namespace.rs new file mode 100644 index 00000000..44164a22 --- /dev/null +++ b/pallets/torus0/src/namespace.rs @@ -0,0 +1,114 @@ +use codec::{Decode, Encode, MaxEncodedLen}; +use polkadot_sdk::{ + frame_support::{CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound}, + frame_system::pallet_prelude::BlockNumberFor, + sp_runtime::{ + traits::{One, Saturating}, + FixedPointNumber, FixedU128, + }, +}; +use scale_info::TypeInfo; + +use crate::*; + +pub use pallet_torus0_api::{ + NamespacePath, MAX_NAMESPACE_PATH_LENGTH, MAX_NAMESPACE_SEGMENTS, MAX_SEGMENT_LENGTH, + NAMESPACE_SEPARATOR, +}; + +#[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo, MaxEncodedLen, DebugNoBound)] +#[scale_info(skip_type_params(T))] +pub struct NamespacePricingConfig { + /// Tokens held per byte inserted. + pub deposit_per_byte: BalanceOf, + /// Used as the base fee for the logistic function that + /// calculates the fees based on the amount of namespace entries + /// for a given agent. + pub base_fee: BalanceOf, + + /// The logistic function's midpoint. + /// The function is performed over the number of namespace entries + /// the agent has registered. The midpoint determines at how many + /// entries for that agent the price reaches it's mid-point. + pub count_midpoint: u32, + /// How steep the pricing increase is. + pub fee_steepness: Percent, + /// The maximum multiplier for the base fee. + pub max_fee_multiplier: u32, +} + +impl NamespacePricingConfig { + /// Calculate namespace cost using sigmoid pricing model. + pub fn namespace_fee( + &self, + account_namespace_count: u32, + ) -> Result, polkadot_sdk::sp_runtime::DispatchError> { + let Self { + base_fee, + count_midpoint, + fee_steepness, + max_fee_multiplier, + .. + } = self; + + let multiplier = { + let fee_steepness = fee_steepness.deconstruct() as f64 / 100.; + let position = (account_namespace_count as i64).saturating_sub(*count_midpoint as i64); + let adjusted = -fee_steepness * position as f64; + let exp = (libm::exp(adjusted) * FixedU128::DIV as f64) as u128; + + let max_fee_multiplier = FixedU128::from_u32(*max_fee_multiplier); + + FixedU128::one().saturating_add( + max_fee_multiplier.saturating_mul( + FixedU128::one() + .const_checked_div( + FixedU128::one().saturating_add(FixedU128::from_inner(exp)), + ) + .unwrap_or_default(), + ), + ) + }; + + let base_fee = FixedU128::from_inner(*base_fee); + Ok(base_fee.saturating_mul(multiplier).into_inner()) + } + + /// Calculates the deposit needed to register a namespace. + pub fn namespace_deposit(&self, path: &NamespacePath) -> BalanceOf { + self.deposit_per_byte + .saturating_mul((path.as_bytes().len() as u32).into()) + } + + /// The fee midpoint. + pub fn fee_midpoint(&self) -> BalanceOf { + self.base_fee.saturating_add( + FixedU128::from_u32(self.max_fee_multiplier) + .const_checked_div(FixedU128::from_u32(2)) + .unwrap_or_default() + .saturating_mul(FixedU128::from_inner(self.base_fee)) + .into_inner(), + ) + } + + /// The fee theoretical ceiling. + pub fn fee_ceiling(&self) -> BalanceOf { + self.base_fee.saturating_add( + FixedU128::from_u32(self.max_fee_multiplier) + .saturating_mul(FixedU128::from_inner(self.base_fee)) + .into_inner(), + ) + } +} + +/// Metadata stored for each namespace +#[derive( + Encode, Decode, CloneNoBound, PartialEqNoBound, EqNoBound, TypeInfo, MaxEncodedLen, DebugNoBound, +)] +#[scale_info(skip_type_params(T))] +pub struct NamespaceMetadata { + /// Block number when the namespace was created + pub created_at: BlockNumberFor, + /// Storage deposit paid for this namespace + pub deposit: BalanceOf, +} diff --git a/pallets/torus0/src/weights.rs b/pallets/torus0/src/weights.rs index 6f74b80d..d9695695 100644 --- a/pallets/torus0/src/weights.rs +++ b/pallets/torus0/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_torus0` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-05-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-06-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `NicosiPoneXSMax.localdomain`, CPU: `` +//! HOSTNAME: `Luizs-MacBook-Pro.local`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -87,7 +87,7 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `514` // Estimated: `4322` - // Minimum execution time: 34_000_000 picoseconds. + // Minimum execution time: 35_000_000 picoseconds. Weight::from_parts(35_000_000, 4322) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) @@ -108,14 +108,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `554` // Estimated: `7654` - // Minimum execution time: 54_000_000 picoseconds. + // Minimum execution time: 55_000_000 picoseconds. Weight::from_parts(56_000_000, 7654) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: `Governance::Whitelist` (r:1 w:0) - /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - /// Storage: `Torus0::Agents` (r:2 w:1) + /// Storage: `Torus0::Agents` (r:1 w:1) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) /// Storage: `Torus0::RegistrationsThisBlock` (r:1 w:1) /// Proof: `Torus0::RegistrationsThisBlock` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -125,8 +123,6 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Torus0::BurnConfig` (`max_values`: Some(1), `max_size`: Some(52), added: 547, mode: `MaxEncodedLen`) /// Storage: `Torus0::RegistrationsThisInterval` (r:1 w:1) /// Proof: `Torus0::RegistrationsThisInterval` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `Torus0::MaxAllowedAgents` (r:1 w:0) - /// Proof: `Torus0::MaxAllowedAgents` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `Torus0::MinNameLength` (r:1 w:0) /// Proof: `Torus0::MinNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `Torus0::MaxNameLength` (r:1 w:0) @@ -144,10 +140,10 @@ impl WeightInfo for SubstrateWeight { fn register_agent() -> Weight { // Proof Size summary in bytes: // Measured: `68` - // Estimated: `7654` - // Minimum execution time: 30_000_000 picoseconds. - Weight::from_parts(31_000_000, 7654) - .saturating_add(T::DbWeight::get().reads(15_u64)) + // Estimated: `4322` + // Minimum execution time: 25_000_000 picoseconds. + Weight::from_parts(26_000_000, 4322) + .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Torus0::Agents` (r:1 w:1) @@ -159,7 +155,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `94` // Estimated: `4322` // Minimum execution time: 11_000_000 picoseconds. - Weight::from_parts(13_000_000, 4322) + Weight::from_parts(12_000_000, 4322) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -191,7 +187,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `0` // Estimated: `0` // Minimum execution time: 2_000_000 picoseconds. - Weight::from_parts(3_000_000, 0) + Weight::from_parts(2_000_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } } @@ -235,7 +231,7 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `514` // Estimated: `4322` - // Minimum execution time: 34_000_000 picoseconds. + // Minimum execution time: 35_000_000 picoseconds. Weight::from_parts(35_000_000, 4322) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) @@ -256,14 +252,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `554` // Estimated: `7654` - // Minimum execution time: 54_000_000 picoseconds. + // Minimum execution time: 55_000_000 picoseconds. Weight::from_parts(56_000_000, 7654) .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: `Governance::Whitelist` (r:1 w:0) - /// Proof: `Governance::Whitelist` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `MaxEncodedLen`) - /// Storage: `Torus0::Agents` (r:2 w:1) + /// Storage: `Torus0::Agents` (r:1 w:1) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) /// Storage: `Torus0::RegistrationsThisBlock` (r:1 w:1) /// Proof: `Torus0::RegistrationsThisBlock` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -273,8 +267,6 @@ impl WeightInfo for () { /// Proof: `Torus0::BurnConfig` (`max_values`: Some(1), `max_size`: Some(52), added: 547, mode: `MaxEncodedLen`) /// Storage: `Torus0::RegistrationsThisInterval` (r:1 w:1) /// Proof: `Torus0::RegistrationsThisInterval` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `Torus0::MaxAllowedAgents` (r:1 w:0) - /// Proof: `Torus0::MaxAllowedAgents` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `Torus0::MinNameLength` (r:1 w:0) /// Proof: `Torus0::MinNameLength` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `Torus0::MaxNameLength` (r:1 w:0) @@ -292,10 +284,10 @@ impl WeightInfo for () { fn register_agent() -> Weight { // Proof Size summary in bytes: // Measured: `68` - // Estimated: `7654` - // Minimum execution time: 30_000_000 picoseconds. - Weight::from_parts(31_000_000, 7654) - .saturating_add(RocksDbWeight::get().reads(15_u64)) + // Estimated: `4322` + // Minimum execution time: 25_000_000 picoseconds. + Weight::from_parts(26_000_000, 4322) + .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Torus0::Agents` (r:1 w:1) @@ -307,7 +299,7 @@ impl WeightInfo for () { // Measured: `94` // Estimated: `4322` // Minimum execution time: 11_000_000 picoseconds. - Weight::from_parts(13_000_000, 4322) + Weight::from_parts(12_000_000, 4322) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -339,7 +331,7 @@ impl WeightInfo for () { // Measured: `0` // Estimated: `0` // Minimum execution time: 2_000_000 picoseconds. - Weight::from_parts(3_000_000, 0) + Weight::from_parts(2_000_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index 79012ee3..b0020c3f 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -1,11 +1,9 @@ use pallet_governance_api::GovernanceApi; -use pallet_torus0::{ - agent::Agent, AgentUpdateCooldown, Agents, Burn, Error, ImmunityPeriod, MaxAllowedAgents, -}; +use pallet_torus0::{agent::Agent, AgentUpdateCooldown, Agents, Burn, Error}; use polkadot_sdk::{frame_support::assert_err, sp_core::Get, sp_runtime::Percent}; use test_utils::{ assert_ok, clear_cooldown, get_balance, get_origin, - pallet_emission0::{ConsensusMembers, PendingEmission, WeightControlDelegation}, + pallet_emission0::{PendingEmission, WeightControlDelegation}, pallet_governance::{self, Allocators, DaoTreasuryAddress, TreasuryEmissionFee}, step_block, Governance, Test, }; @@ -40,6 +38,9 @@ fn register_correctly() { ); Allocators::::set(allocator_id, Some(())); + assert_ok!(pallet_governance::whitelist::add_to_whitelist::( + allocator_id + )); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent_id )); @@ -89,18 +90,17 @@ fn register_without_being_whitelisted() { let url = "idk://agent".as_bytes().to_vec(); let metadata = "idk://agent".as_bytes().to_vec(); - assert_err!( - pallet_torus0::agent::register::( - agent, - agent, - name.clone(), - url.clone(), - metadata.clone(), - ), - pallet_torus0::Error::::AgentKeyNotWhitelisted - ); + assert_ok!(pallet_torus0::agent::register::( + agent, + agent, + name.clone(), + url.clone(), + metadata.clone(), + )); - assert!(pallet_torus0::Agents::::get(agent).is_none()); + assert_eq!(WeightControlDelegation::::get(agent), None); + + assert!(pallet_torus0::Agents::::get(agent).is_some()); }); } @@ -114,10 +114,6 @@ fn register_without_enough_balance() { Burn::::set(100); - assert_ok!(pallet_governance::whitelist::add_to_whitelist::( - agent - )); - assert_err!( pallet_torus0::agent::register::( agent, @@ -279,35 +275,6 @@ fn register_fail_metadata_validation() { }); } -#[test] -fn register_more_than_max_allowed_agents() { - test_utils::new_test_ext().execute_with(|| { - let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); - - pallet_torus0::MaxAllowedAgents::::set(0); - - assert_ok!(pallet_governance::whitelist::add_to_whitelist::( - agent - )); - - assert_err!( - pallet_torus0::agent::register::( - agent, - agent, - name.clone(), - url.clone(), - metadata.clone(), - ), - pallet_torus0::Error::::MaxAllowedAgents, - ); - - assert!(pallet_torus0::Agents::::get(agent).is_none()); - }); -} - #[test] fn register_more_than_allowed_registrations_per_block() { test_utils::new_test_ext().execute_with(|| { @@ -593,107 +560,6 @@ fn update_with_zero_weight_control_fee() { }); } -#[test] -fn prunes_excess_agents() { - test_utils::new_test_ext().execute_with(|| { - let immunity_period = 10; - ImmunityPeriod::::set(immunity_period as u16); - - let current_block = immunity_period * 2; - step_block(current_block); - - let max_allowed_agents = 3u32; - MaxAllowedAgents::::set(max_allowed_agents as u16); - - const IMMUNE_KEY: u32 = 1; - const ZEROED_SCORE_KEY: u32 = 2; - const MAX_OLD_VALIDATOR_KEY: u32 = 3; - const MAX_VALIDATOR_KEY: u32 = 4; - const MIN_VALIDATOR_KEY: u32 = 5; - for key in 0..6 { - let registration_block = if key == IMMUNE_KEY { - current_block - } else { - key as u64 - }; - - Agents::::set( - key, - Some(Agent { - key, - name: Default::default(), - url: Default::default(), - metadata: Default::default(), - weight_penalty_factor: Default::default(), - registration_block, - fees: Default::default(), - last_update_block: registration_block, - }), - ); - - if ![IMMUNE_KEY, ZEROED_SCORE_KEY].contains(&key) { - ConsensusMembers::::mutate(key, |member| { - let member = member.get_or_insert_with(Default::default); - member.last_incentives = 40; - match key { - MIN_VALIDATOR_KEY => member.last_dividends = 100, - MAX_OLD_VALIDATOR_KEY | MAX_VALIDATOR_KEY => member.last_dividends = 200, - _ => {} - } - }) - } - } - - let agent_id = 6; - assert_ok!(pallet_governance::whitelist::add_to_whitelist::( - agent_id - )); - - assert_ok!(pallet_torus0::agent::register::( - agent_id, - agent_id, - b"agent".to_vec(), - b"idk://agent".to_vec(), - b"idk://agent".to_vec(), - )); - - let expected_keys = [IMMUNE_KEY, MAX_VALIDATOR_KEY, agent_id]; - assert_eq!(Agents::::iter().count(), expected_keys.len()); - - for expected_key in expected_keys { - assert!(Agents::::contains_key(expected_key)); - } - - let _ = Agents::::clear(u32::MAX, None); - MaxAllowedAgents::::set(1); - - Agents::::set( - 0, - Some(Agent { - key: 0, - name: Default::default(), - url: Default::default(), - metadata: Default::default(), - weight_penalty_factor: Default::default(), - registration_block: current_block, - fees: Default::default(), - last_update_block: current_block, - }), - ); - - assert_err!( - pallet_torus0::agent::register::( - agent_id, - agent_id, - b"agent".to_vec(), - b"idk://agent".to_vec(), - b"idk://agent".to_vec(), - ), - Error::::MaxAllowedAgents - ); - }); -} - #[test] fn fails_updating_whitout_waiting_cooldown() { test_utils::new_test_ext().execute_with(|| { diff --git a/pallets/torus0/tests/namespace.rs b/pallets/torus0/tests/namespace.rs new file mode 100644 index 00000000..63cf4cae --- /dev/null +++ b/pallets/torus0/tests/namespace.rs @@ -0,0 +1,303 @@ +use pallet_torus0::namespace::NamespacePricingConfig; +use polkadot_sdk::sp_runtime::Percent; +use test_utils::{as_tors, new_test_ext, Test}; + +#[test] +fn namespace_fee_at_midpoint() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: as_tors(1000), + count_midpoint: 10, + fee_steepness: Percent::from_percent(25), + max_fee_multiplier: 2, + }; + + let fee = config.namespace_fee(10).unwrap(); + assert_eq!(fee, as_tors(2000)); // 1000 + 1000 * 1 + }); +} + +#[test] +fn namespace_fee_below_midpoint() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 100, + }; + + let fee_5 = config.namespace_fee(5).unwrap(); + assert!(fee_5 < config.fee_midpoint()); + + let fee_0 = config.namespace_fee(0).unwrap(); + assert!(fee_0 < fee_5); + }); +} + +#[test] +fn namespace_fee_above_midpoint() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 2, + }; + + let fee_15 = config.namespace_fee(15).unwrap(); + dbg!(fee_15, config.fee_midpoint()); + assert!(fee_15 > config.fee_midpoint()); + + let fee_20 = config.namespace_fee(20).unwrap(); + assert!(fee_20 > fee_15); + assert!(fee_20 < config.fee_ceiling()); + }); +} + +#[test] +fn namespace_fee_steepness_effect() { + new_test_ext().execute_with(|| { + let config_low_steep = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(5), + max_fee_multiplier: 100, + }; + + let config_high_steep = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(20), + max_fee_multiplier: 100, + }; + + // Below midpoint: higher steepness = higher fee + let fee_low_5 = config_low_steep.namespace_fee(5).unwrap(); + let fee_high_5 = config_high_steep.namespace_fee(5).unwrap(); + assert!( + fee_high_5 < fee_low_5, + "higher steepness should result in lower fee below midpoint" + ); + + // Above midpoint: higher steepness = lower fee + let fee_low_15 = config_low_steep.namespace_fee(15).unwrap(); + let fee_high_15 = config_high_steep.namespace_fee(15).unwrap(); + assert!( + fee_high_15 > fee_low_15, + "higher steepness should result in higher fee above midpoint" + ); + }); +} + +#[test] +fn namespace_fee_zero_steepness() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(0), + max_fee_multiplier: 2, + }; + + let fee_0 = config.namespace_fee(0).unwrap(); + let fee_10 = config.namespace_fee(10).unwrap(); + let fee_20 = config.namespace_fee(20).unwrap(); + + // steepness is 0, so always expect midpoint + let expected = 1000 + 1000; + assert_eq!(fee_0, expected); + assert_eq!(fee_10, expected); + assert_eq!(fee_20, expected); + }); +} + +#[test] +fn namespace_fee_high_steepness() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(100), + max_fee_multiplier: 100, + }; + + let fee_9 = config.namespace_fee(9).unwrap(); + let fee_10 = config.namespace_fee(10).unwrap(); + let fee_11 = config.namespace_fee(11).unwrap(); + + assert!(fee_9 < fee_10); + assert!(fee_10 < fee_11); + + let diff_before = fee_10.saturating_sub(fee_9); + let diff_after = fee_11.saturating_sub(fee_10); + assert!(diff_before > 100, "steep curve is not steep"); + assert!(diff_after > 100, "steep curve is not steep"); + }); +} + +#[test] +fn namespace_fee_monotonic_increase() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 100, + }; + + let mut prev_fee = config.namespace_fee(0).unwrap(); + for count in 1..50 { + let current_fee = config.namespace_fee(count).unwrap(); + assert!( + current_fee >= prev_fee, + "fee should increase or stay same as count increases: {} > {} at count {}", + current_fee, + prev_fee, + count + ); + prev_fee = current_fee; + } + }); +} + +#[test] +fn namespace_fee_edge_cases() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 10, + }; + + let fee_1000 = config.namespace_fee(1000).unwrap(); + assert_eq!(fee_1000, config.fee_ceiling()); + + let fee_max = config.namespace_fee(u32::MAX).unwrap(); + assert_eq!(fee_max, config.fee_ceiling()); + }); +} + +#[test] +fn namespace_deposit_basic() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 100, + }; + + // Single character + let path_a = "a".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_a), 100); + + // 5 characters + let path_hello = "hello".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_hello), 500); + + // With dots (24 characters total) + let path_long = "very.long.namespace.path".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_long), 2400); + }); +} + +#[test] +fn namespace_deposit_with_separators() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 50, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 100, + }; + + // "a.b.c" = 5 bytes + let path_dots = "a.b.c".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_dots), 250); + + // "abc" = 3 bytes + let path_no_dots = "abc".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_no_dots), 150); + }); +} + +#[test] +fn namespace_deposit_different_rates() { + new_test_ext().execute_with(|| { + let config_low = NamespacePricingConfig:: { + deposit_per_byte: 10, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 100, + }; + + let config_high = NamespacePricingConfig:: { + deposit_per_byte: 1000, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 100, + }; + + let path = "test.namespace".parse().unwrap(); // 14 bytes + assert_eq!(config_low.namespace_deposit(&path), 140); + assert_eq!(config_high.namespace_deposit(&path), 14000); + }); +} + +#[test] +fn namespace_deposit_zero_rate() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 0, + base_fee: 1000, + count_midpoint: 10, + fee_steepness: Percent::from_percent(10), + max_fee_multiplier: 100, + }; + + let path = "free.namespace".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path), 0); + }); +} + +#[test] +fn namespace_fee_precision_handling() { + new_test_ext().execute_with(|| { + let config = NamespacePricingConfig:: { + deposit_per_byte: 100, + base_fee: as_tors(1), + count_midpoint: 100, + fee_steepness: Percent::from_percent(1), + max_fee_multiplier: 5, + }; + + let fee_99 = config.namespace_fee(99).unwrap(); + let fee_100 = config.namespace_fee(100).unwrap(); + let fee_101 = config.namespace_fee(101).unwrap(); + assert!(fee_99 < fee_100); + assert!(fee_100 < fee_101); + + let fee_0 = config.namespace_fee(0).unwrap(); + let fee_1 = config.namespace_fee(1).unwrap(); + let fee_2 = config.namespace_fee(2).unwrap(); + + assert!(fee_0 > as_tors(1)); + assert!(fee_1 > fee_0); + assert!(fee_2 > fee_1); + }); +} diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index 8cad1f9f..abd7f045 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -306,13 +306,23 @@ const fn as_tors(val: u128) -> u128 { parameter_types! { pub const DefaultDividendsParticipationWeight: Percent = Percent::from_parts(40); + + pub NamespaceBaseFee: Balance = as_tors(5); + pub NamespaceDepositPerByte: Balance = as_tors(1); + + pub DefaultNamespacePricingConfig: pallet_torus0::namespace::NamespacePricingConfig = pallet_torus0::namespace::NamespacePricingConfig { + base_fee: as_tors(5), + deposit_per_byte: as_tors(5), + + count_midpoint: 15, + fee_steepness: Percent::from_percent(25), + max_fee_multiplier: 3, + }; } impl pallet_torus0::Config for Runtime { type DefaultMinValidatorStake = ConstU128<{ as_tors(50_000) }>; - type DefaultImmunityPeriod = ConstU16<0>; - type DefaultRewardInterval = ConstU16<100>; type DefaultMinNameLength = ConstU16<2>; @@ -321,8 +331,6 @@ impl pallet_torus0::Config for Runtime { type DefaultMaxAgentUrlLength = ConstU16<64>; - type DefaultMaxAllowedAgents = ConstU16<10_000>; - type DefaultMaxAllowedValidators = ConstU16<128>; type DefaultMaxRegistrationsPerBlock = ConstU16<10>; @@ -334,15 +342,12 @@ impl pallet_torus0::Config for Runtime { type DefaultMinWeightControlFee = ConstU8<4>; type DefaultMinBurn = ConstU128<{ as_tors(10) }>; - type DefaultMaxBurn = ConstU128<{ as_tors(150) }>; type DefaultAdjustmentAlpha = ConstU64<{ u64::MAX / 2 }>; type DefaultTargetRegistrationsInterval = ConstU64<142>; - type DefaultTargetRegistrationsPerInterval = ConstU16<3>; - type DefaultMaxRegistrationsPerInterval = ConstU16<32>; type DefaultAgentUpdateCooldown = ConstU64<32_400>; // 3 days @@ -350,14 +355,14 @@ impl pallet_torus0::Config for Runtime { #[doc = " The storage MaxNameLength should be constrained to be no more than the value of this."] #[doc = " This is needed on agent::Agent to set the `name` field BoundedVec max length."] type MaxAgentNameLengthConstraint = ConstU32<256>; - #[doc = " This is needed on agent::Agent to set the `address` field BoundedVec max length."] type MaxAgentUrlLengthConstraint = ConstU32<256>; - type MaxAgentMetadataLengthConstraint = ConstU32<256>; type DefaultDividendsParticipationWeight = DefaultDividendsParticipationWeight; + type DefaultNamespacePricingConfig = DefaultNamespacePricingConfig; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; @@ -365,6 +370,7 @@ impl pallet_torus0::Config for Runtime { type Governance = Governance; type Emission = Emission0; + type Permission0 = Permission0; type WeightInfo = pallet_torus0::weights::SubstrateWeight; } @@ -380,7 +386,6 @@ impl pallet_governance::Config for Runtime { type PalletId = GovernancePalletId; type MinApplicationDataLength = ConstU32<2>; - type MaxApplicationDataLength = ConstU32<256>; type ApplicationExpiration = ConstU64<2000>; @@ -390,17 +395,13 @@ impl pallet_governance::Config for Runtime { type DefaultTreasuryEmissionFee = DefaultTreasuryEmissionFee; type DefaultProposalCost = ConstU128<{ as_tors(10_000) }>; - type DefaultProposalExpiration = ConstU64<75_600>; type DefaultAgentApplicationCost = ConstU128<{ as_tors(100) }>; - type DefaultAgentApplicationExpiration = ConstU64<216_000>; type DefaultProposalRewardTreasuryAllocation = DefaultProposalRewardTreasuryAllocation; - type DefaultMaxProposalRewardTreasuryAllocation = ConstU128<{ as_tors(10_000) }>; - type DefaultProposalRewardInterval = ConstU64<75_600>; type RuntimeEvent = RuntimeEvent; @@ -445,11 +446,15 @@ impl pallet_emission0::Config for Runtime { parameter_types! { pub const PermissionPalletId: PalletId = PalletId(*b"torusper"); + + pub const MaxControllersPerPermission: u32 = 10; + pub const MaxRevokersPerPermission: u32 = 10; + pub const MaxTargetsPerPermission: u32 = 100; pub const MaxStreamsPerPermission: u32 = 100; - pub const MaxRevokersPerPermission: u32 = 10; - pub const MaxControllersPerPermission: u32 = 10; pub const MinAutoDistributionThreshold: u128 = as_tors(100); + + pub const MaxNamespacesPerPermission: u32 = 16; } impl pallet_permission0::Config for Runtime { @@ -463,15 +468,14 @@ impl pallet_permission0::Config for Runtime { type PalletId = PermissionPalletId; - type MaxTargetsPerPermission = MaxTargetsPerPermission; - - type MaxStreamsPerPermission = MaxStreamsPerPermission; - - type MaxRevokersPerPermission = MaxRevokersPerPermission; - type MaxControllersPerPermission = MaxControllersPerPermission; + type MaxRevokersPerPermission = MaxRevokersPerPermission; + type MaxTargetsPerPermission = MaxTargetsPerPermission; + type MaxStreamsPerPermission = MaxStreamsPerPermission; type MinAutoDistributionThreshold = MinAutoDistributionThreshold; + + type MaxNamespacesPerPermission = MaxNamespacesPerPermission; } impl pallet_faucet::Config for Runtime { diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index c3d57f0b..e1e6493d 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -38,7 +38,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("torus-runtime"), impl_name: create_runtime_str!("torus-runtime"), authoring_version: 1, - spec_version: 16, + spec_version: 18, impl_version: 1, apis: apis::RUNTIME_API_VERSIONS, transaction_version: 1, @@ -86,9 +86,12 @@ pub type SignedPayload = sp_runtime::generic::SignedPayload, pallet_governance::migrations::v4::Migration, + pallet_governance::migrations::v5::Migration, pallet_permission0::migrations::v2::Migration, + pallet_permission0::migrations::v3::Migration, pallet_emission0::migrations::v2::Migration, pallet_torus0::migrations::v3::Migration, + pallet_torus0::migrations::v4::Migration, ); /// Executive: handles dispatch to the various modules. diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 3d132091..bc315dbe 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -70,7 +70,7 @@ parameter_types! { } thread_local! { - static DEFAULT_MIN_BURN: RefCell = const { RefCell::new(to_nano(10)) }; + static DEFAULT_MIN_BURN: RefCell = const { RefCell::new(as_tors(10)) }; } pub struct MinBurnConfig; @@ -92,13 +92,20 @@ parameter_types! { pub const MaxLocks: u32 = 50; pub const MaxReserves: u32 = 50; pub const DefaultDividendsParticipationWeight: Percent = Percent::from_parts(40); + + pub DefaultNamespacePricingConfig: pallet_torus0::namespace::NamespacePricingConfig = pallet_torus0::namespace::NamespacePricingConfig { + base_fee: as_tors(5), + deposit_per_byte: as_tors(5), + + count_midpoint: 20, + fee_steepness: Percent::from_percent(20), + max_fee_multiplier: 5, + }; } impl pallet_torus0::Config for Test { type DefaultMinValidatorStake = ConstU128<50_000_000_000_000_000_000_000>; - type DefaultImmunityPeriod = ConstU16<0>; - type DefaultRewardInterval = ConstU16<100>; type DefaultMinNameLength = ConstU16<2>; @@ -107,8 +114,6 @@ impl pallet_torus0::Config for Test { type DefaultMaxAgentUrlLength = ConstU16<64>; - type DefaultMaxAllowedAgents = ConstU16<10_000>; - type DefaultMaxAllowedValidators = ConstU16<128>; type DefaultMaxRegistrationsPerBlock = ConstU16<10>; @@ -144,6 +149,8 @@ impl pallet_torus0::Config for Test { type DefaultDividendsParticipationWeight = DefaultDividendsParticipationWeight; + type DefaultNamespacePricingConfig = DefaultNamespacePricingConfig; + type RuntimeEvent = RuntimeEvent; type Currency = Balances; @@ -151,13 +158,14 @@ impl pallet_torus0::Config for Test { type Governance = Governance; type Emission = Emission0; + type Permission0 = Permission0; type WeightInfo = pallet_torus0::weights::SubstrateWeight; } parameter_types! { - pub HalvingInterval: NonZeroU128 = NonZeroU128::new(to_nano(144_000_000)).unwrap(); - pub MaxSupply: NonZeroU128 = NonZeroU128::new(to_nano(144_000_000 * 4)).unwrap(); + pub HalvingInterval: NonZeroU128 = NonZeroU128::new(as_tors(144_000_000)).unwrap(); + pub MaxSupply: NonZeroU128 = NonZeroU128::new(as_tors(144_000_000 * 4)).unwrap(); pub const DefaultEmissionRecyclingPercentage: Percent = Percent::from_parts(70); pub const DefaultIncentivesRatio: Percent = Percent::from_parts(50); } @@ -169,7 +177,7 @@ impl pallet_emission0::Config for Test { type MaxSupply = MaxSupply; - type BlockEmission = ConstU128<{ (to_nano(250_000) - 1) / 10800 }>; + type BlockEmission = ConstU128<{ (as_tors(250_000) - 1) / 10800 }>; type DefaultEmissionRecyclingPercentage = DefaultEmissionRecyclingPercentage; @@ -206,17 +214,17 @@ impl pallet_governance::Config for Test { type DefaultTreasuryEmissionFee = DefaultTreasuryEmissionFee; - type DefaultProposalCost = ConstU128<{ to_nano(10_000) }>; + type DefaultProposalCost = ConstU128<{ as_tors(10_000) }>; type DefaultProposalExpiration = ConstU64<75_600>; - type DefaultAgentApplicationCost = ConstU128<{ to_nano(1_000) }>; + type DefaultAgentApplicationCost = ConstU128<{ as_tors(1_000) }>; type DefaultAgentApplicationExpiration = ConstU64<216_000>; type DefaultProposalRewardTreasuryAllocation = DefaultProposalRewardTreasuryAllocation; - type DefaultMaxProposalRewardTreasuryAllocation = ConstU128<{ to_nano(10_000) }>; + type DefaultMaxProposalRewardTreasuryAllocation = ConstU128<{ as_tors(10_000) }>; type DefaultProposalRewardInterval = ConstU64<75_600>; @@ -234,7 +242,7 @@ parameter_types! { pub const MaxStreamsPerPermission: u32 = 100; pub const MaxRevokersPerPermission: u32 = 10; pub const MaxControllersPerPermission: u32 = 10; - pub const MinAutoDistributionThreshold: u128 = to_nano(100); + pub const MinAutoDistributionThreshold: u128 = as_tors(100); } impl pallet_permission0::Config for Test { @@ -257,6 +265,8 @@ impl pallet_permission0::Config for Test { type MaxControllersPerPermission = MaxControllersPerPermission; type MinAutoDistributionThreshold = MinAutoDistributionThreshold; + + type MaxNamespacesPerPermission = ConstU32<0>; } impl pallet_balances::Config for Test { @@ -319,7 +329,7 @@ impl pallet_faucet::Config for Test { const TOKEN_DECIMALS: u32 = 18; -pub const fn to_nano(x: Balance) -> Balance { +pub const fn as_tors(x: Balance) -> Balance { x.saturating_mul((10 as Balance).pow(TOKEN_DECIMALS)) } @@ -395,6 +405,7 @@ pub fn get_balance(key: AccountId) -> Balance { } pub fn register_empty_agent(key: AccountId) { + pallet_governance::Whitelist::::insert(key, ()); pallet_torus0::Agents::::set( key, Some(pallet_torus0::agent::Agent { diff --git a/testnet.json b/testnet.json deleted file mode 100644 index f150318a..00000000 --- a/testnet.json +++ /dev/null @@ -1 +0,0 @@ -{"bootNodes":["/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWPWGWUYaisZyTdGiPskyUBSQrZzoHieKmWfBxTn8HLBBn"],"chainType":"Development","codeSubstitutes":{},"genesis":{"runtimeGenesis":{"code":"0x52bc537646db8e0528b52ffd0058d4d704fe5406bb13521060c928e9e230f8194ad73b216ba2c5e2d25b21c161787d0e1d76f7cfebaaa7ece99e177f43a35fc07b769a2d46d8361c1a037895524f92d0bb5a351f8deddae4a9c1bfe07f6ca43542082184ecbdb7dc32241557120713bc2d5784bb563fd95ae42857934eaa90fb914daf69cb91ea67d4a46f5e94abb76bde075bfbae90ad7edb9908e95d20dab5fb44cdd3bcf8e548552836e486d073de471fbf9c1179da455582d6be97cc937d0fb922b04c6f7517c8a77d5eabbb3fb0c70c5eb540e62defa346189c6f688f3d554aaf5204fcbfdf893d55ac57a939fd3e48eca9c2afb2e3a4ef4fb1a74a7c9522e06dbedfd85365474de178e4f12a315cfbfe8a3d5576aae8f88eef6d624f959a9aaa79a9f41da697bcd73c555353a69cef78aae6db4baf126beabaded554772b3e156beaaa45c0a7aefbb8e9dcf75deca992d55476e66b3b6aaade92e1349cadef788abfa3a6e67c5753d9bba7765c7b15791e354543731c35158fd514764f7bcabb5653313ea5fde6335df7ada6e67c5653b1a67a3c7b17df3db5bdaba939f3d4bcce6778aafb0c354543f31c3595e396751f3545e3e339ac1c9fe129eb33d4940f2cfa780acba9459c666a6ae63972fc6626478e7a19b2ec3e7a649996615e8e1d35a6d8598c6535f1d272cc923737be76984a7c795617bbcccaa1cdad6647cde5954c33c3b0a875560ed3d6d560db0e93c51767256fe68833c78e78d110804ee392a7bd06d30c190d34ccecd022a6a3f3145f4707aba9a93f75d74f5b0002f054f60004c0b3acd2eb75b6ec3af3747acafb8986d355cad1bd3e003b4c0fc06b78aae635e8e83ca55d67069dd7f0143669a041f35e7f9a397e621a68a021004f590f404dd1408329be861966e8f1d4f61ed8eb757cbc870c35355ce7a91dd7399d00f0196aea741966b8ce53d96578aaab399f99e11dafa7a1478fcbe0c3c76fde4386f778caf41ed769f88fa74aff0177705ec353a5d700732e430dfff154cd6578eabace0907a71e47e7384f79c7814f69c7f90c373797c1474df5a8a91e97e1373e7ef3d4f61bf8d4fc0c3f3dd5fd040140c353d669a82900d0f05a5300b80f1f3f3d155f9fc2fea3a6021080e7d4d44d4ddd7c66e63835c583c76f6a0ae73333bf792ac76f6a8ac7cd793cb5559fd581cf790d326c38dea3a678d4148ff7f8b6bd3e95bdd6140e195e9fd2ea93d581c7f11a9ecaaa94d581afa1a602508b803ada67a8a92c3b4d4dd15c9be1da5358bd80565399769c9acabe61df9ef2ea0eab038ff3548e9ac3eac09f6a8a861c07404dd59aaa9fc17b4e4dc9f0d79ada2b50f14216659c58630547288f0b229060c217d460a20a17a82ade7d76d4cbaba9d7d7d45d1df818ea469dbd8f1e3b8e53533736e751534640d0c1195fc0c880065b0001b5c3c8052510e3082cc2f0029827503b9e32559b1d3565534fa5daad0ebc8e7a459d7dcd53b1feb03af0353595a3160151554ca7a9a9d2676a113ba82af1386aca447aa9a68ca4d012062d52b4c1461a5940c51d838c0e6270840bdac0c20ba82af1a5a7ba1a6475e04b3545aa41acbab33af05cb5e19a6475e0b79ad26a11275415faaca610d0832bb07003369c40a60628ac167154951888c0851d0c410c2b5f380355856f3d75d5d3eac05b3545eb4ed4d9a766fdeac0cbda459dfdbe480702c1c2421374bbaa5245ef6a8830fd959abf5ff4ae8620d35a894fdfd5fcefea59d6e1ef35c865a083dfd5105eacd3b3f5f98f7a179ff89727f9c4d6b799fe5895426e5e83d383cddcbc16e13269631e7abe641ecbdbd6f6d4d15fd72e0f36e4ae4a79a3def6e5c1d62047cf5c0edbf497b7ad518f083ec0a8e92127f4d335fd7243363ec1593fa39e17bdbc4ff6174f14dbfa7243e67d58d3962b62d54fb675ec97f7bdaf53effbbe8ffef0e493d2d7974fd77d22e609a55afef23e9c8ed7e06679dbd4932da727145b7eb921b24a3e456ff9047f41b9026da769e3930d9fe067ef6a8855d3ecd034c90dc1d1166ae9f6f09b4d697d2fe7757a8d7a1b9fe62fafe3d33c9c9fbf7acacf6bd28b9fc7611e26f2f053c21b098a97a252a954cd550b3644cbd151582dda6259e77a63847f9d7f5522d8b05af586086cf99b9f4b8896872dfbea2d4241f1db9f517ff2f13e4cbd6dae1f1f5ece1a74c9fc84b6cc036169a5565ae6d9965fe6e1cf6bcc0d89d7e0949f8fd7e626bd4ff67e7acbc53abde553bcc65bf4169a7e9420834fdb7c1e3f4b885920db5adca207bf1ccb7a2d3744f2299ecb619b8d18320bb4ada183df6b0b806eb9196d73be37bc641efe7e99277ecf9eb6a7aee313fc7245605f7c82f7619deea369f878d8dfd5f036ecc1a6611e781ce6e1c36b70636f7b39be0f4360af8ebf3ad61b23f2f1b27e950836df87b53d75dbdbcb15316aae395042d865082efd5dbdefb847a2b60455f47e631ed87b1be6d9de6fced6a0f7ca6004e101b45dd2edaa0457b4fdba5d9540d5db36ccf39d9acf3fc59e783e0ef74014bf639e5d09a16a3e0df3f012535820db3e1c3d2a5b36e6d9f33787e113da2ee9f8dfd5f11df37ceff8f8c71e2a5be2e5e34fb187ca964f76bcac568eda323b9e867b18157f31cfae545d3a7e639ed8f1cb3cfb78c93cf0f19b136bd04eaf0c45d008f20fdaf6e67c5df335f808ff6dcd10428f7bd55128c7dbc53c1fec154243b75faec8f2691fab0f6bbc414f92e928384a5adca0179b8b42b7301d6523ad9021a86aa105343c7fb9235205b99f4ed5f01bf36cf397fb81aa86f7e1cde11ad4f5ca60c490bf6811fe8b313e28fab011843968daaee947892ef8b42df9b45f6ec8f269efc38ba365a083df954ad57badb47d31cfc787dff3d09144c78fffe0259ff61af42e3eed03d0c186cd87df2f7784abe4133f08d68b4ffbe5d33e7acb27aecb2778c8f135b8450f367bdbd0bbf8b4678eaf45b84c927c82f7611ff6611f666fe313bc114388a5a60b525c2084ac864ccd1a356ed468a1060c355fd021448d176acad4bc51c3464d1b3a543561a8e9424d1a18a801a3e6093568d488514346cd183561d480a9f9a2268c8e12d44ca1464c4d193552a83103aaa0260a3550a889a284a5d4821c62e448428e2f72746192220712a8133432ba16744c9086405a9598e85cd02161aa420e1fc82a7090d139d1614163841c69e01883660559401304ac0a38542435261268b0e4d8220718a42ee4d062660b336c4c1ee4e002871b38c080e30b5a143429e4204313a39981830d1c58a829410e357080a15330a1618a028d0b4c583089315dc1342647142632dd18a6354c5898885073c441c141c1d402d31226264c586818a62336226c58d030512a83c482ee4b0e28ba2d3a2e3a353a314c6998a66092424746074607852e4c07a663026582dea00ba36b42e784ae8c8e0c0e35a80b7294916798b2501b743b20f1a05b425e412ba30485ee8b0acc1b502c28151c634856d09ed05dd1098142a1a64a294bd4027ee994e8b090ce2061817405121a5b979a13d464a1060b890c490b138b1c4dc8e104a8450e256c57c8b1842e899a2a7060b826705ecc23cc24e400430a424d0b48352021414a82a403520e4838a09102890b3606871768d0205921552111a16b8234a65bd50c5143651e91bea8114262e1a64023c6d4c5a4048e0a334b8d8a2b83238313830383eb82e3828b01c7c496c6c6c6b6c65684ed08a6334c614c56e8bc20a5b15db121615b755d984c20a3c0be80b12167400243e240e6204718581739aeb09900ae60ab62a282e9042633b0364c6a6859d0c8604dc831c6d603930b38354a4c804a30dd60d2a0c4021a1498b8c8374a2b9865689ab05dc9c1042d4c578492171a2e28164845c891855c82c688d21626284a3730c1a084840e09242c362b4c514834640b4c4ed414819db11d5112c3f402d313251cd03061e301c90739bc287d2921a141c114031c426c2ba043d04481060a252e39be989ac8e1c554044a050e0b34616811b834b02e606b6064302d6059c0a68089c1a48041012b0353030b83818179c1b2a02bcc0c0c0dcc0ad815b028605f6048b06e60d9c0da625161d5c0a2812584a5a265e81b340cd40d6b0a4b0a4b8b25032b06160aac27ac17584e584d5845584716119615cb051613560b2c2cd612961256121612160bac1558475857e816e81ab40a940c4d839e41b540bd40af40d9a052a063a815e817140cda043a05a501ad0195017d01d50115029d01dd429fa030a0515028e812d409da0455822601af502480680b601250090fd0135023280ae697b9c5ecc1d4625a31b3985c4c2eb306930a0a664231b5cc26e613f20b118b5c43b251a3062d81fc81fc22ad903d903cc09e209d905aa414920ad984a4816442262195c0bc20572059208f884b88595055742236115d1099e02fc4164c37b80dee027381b7c06cf01aac05ce02936135180b9c06a3c167f015d80a3c86abc054e029b01896029bc151e0300c052e839fc064f0182c0687c160180cfe82bde02ed809dc04e682bf3013780bd682b3e025b0123809ec8591c047602370172e0263c144e0150f8185c041e02b1808fc03f6015bc13d601ef00eb80ad601e78071c05cf8066c03dec254f014ac856bc034e019b00c580a8e8263c0306028380b3fc12f6027b809760133c12d602f30165e8295e02418096601af808fe02bac024e01a3808d805a8055c030a013e01460162015330cb00af008900ab0cb2cc25402340215028e8149985e20122013a0173883f9065c02628155a01050f5011fe00b34f00308763802011d1ee0809f1c8a10b9a1010c40b5cf1005240007210708d2c35300203b36fc80485c86eacd1868b0176630c038024151e201244f9400fd80048906a30f4d809020c9800099d1420f444340519a3861c0ce4c16043043c68726404fd458a221274f9e000105c910d012264f9610310122044888968460091324509480000b1b04d1921e96104151c204288d1d022262b2e40348d058264c947833672c14a2274b807a001a02c0cc15acb05080a000418099310b44a40468a8872a2c13264a7ae03143852552f299292cce8c98255232c38c1416a88725434f90405102821866ccd81e964051e2011966a2b03e2c41b2e4493360070948200440000d01fd4034c4c74c9885021402254d90dccc40618980a0000d3d41420404821d33652c1091122228487c60b204080f40590205a80950111e334fd89921830913253d3061a2840163fc40048226404cc45820a00f2071428484e807102c011281ce4c180b85c9122544403e200102fa000d3360d6c9079a2c4112c41010104248963c69a22640210842c90e9f0163817a68e2a409122548963c69a01e9a3881005113209cf4d043f798f9623fe0c4c9d013244f96fc006508a889089c200902288886192fd607a026205802a50910487a701265091042404888869c3c011a4242b424041e00024a90992ed68725488880a00c01d1c38e192780e0890f4d940c15f131d3041f9cf400e4430c335c2c9420808290408112049091264e9640810234016fe6cb42015a42b464c8c90f444028999961c23671b28448c910103e202172c2040a92254f5ac910109d63668b1501122748963ce921a0a021271668b244c90f3d7ce00347bc192d168848890f4b98288982040808202022c0830f40200081121e6a98c962a104f500f4430f4b5828444d8086807e68b2e4334a68b2e403373349d81e964069b26488480a109220983c79a204c910900f4c9600810aeac1091314ce8c9785c2630609ab0409cecc11360448941029f1410911900ea619238c600913254b889634599263a6cb06f5e084890790001101d1039014201c3345d821270cd8160231f18012a226407c0009510f40434b7c68b20409921d06207dc14a021655af91b62b95aaa151dc416714330af8045a9266ce9999191a9a4933e79c219172e498a1a14cca2864beb28e47a40c69bc28bd688c5d2777ec883ad84866c94c29cb65969125cb857b5d1cc7f4ba2ec9922f19a5a669944a8d3247969c941c77650d2b7721dcdda5cbf28a72ce8dd2a53f1e2025ff90a4125fbc6379878c914a235c8374408c946eb6bb7b9922b6cb8be928edae8e0dc0ee620158ded5c1cc9ae4289725cb8dbb1633dc12535e665ec8cb54cad2967e74a2d4913b98996f4a39e458a694a5a6699a66d238878b1061a652520a29bd4cac31d3b9413a299da1b424590e595eb81af34597194248e705a18dc4c1c1c1a193e9642a374967bca194c6128977b70192323333435ede654997176ecbbc10f28901a8938430b2949437c29574e1b60f4b9672296bbb13724ce9456266e6dddda59794525e7bed755166ba5bb3cc5c5353c32c214b96242691f8da8b594ac9576429294b5e8e1042664a29536ad19083213395bb5d37830fb8bb000074d147970332efd2956c515e4b4a8d9735130014c02b174a4a4d94e172bc225fec832fbea45cb94ba78c2b97e9d2e5e5d534b91446c994442261175c2bb2a54949ad8b25336566c97293526e525e9499e9527a2d95f4dab82bafb8cc9c00045c71572ea5d86448e5729c74424829c526a594db3897ee45a9c6cc1d534a2577497a518ef9e21970a8e19552ca4959f2b5f1a2947797972ea5522ea554524ae56419e9ae84bc57dc852bd9c6460833e7ec52cabc1bc748c30c595e97d4685846c951464dc6ebdadd785129a36479b1bc34c992d26b9932d576af8d70215d9ee18851ba7c31c757d498212723b364c93c37c81a73dc788e2b35ed5a29a54d64de0370105e29e5ee6e64be38f22599725c8c1ba994944a8e1c3772e4dd6b37ee2e2fcbc89252bacbcbbc2c372ecb5d9652f65c71520a3dba4b290fa597016490e18257a4744e139d515accbbf5865a008ecabd2eee925232a594d249bd49a7890074523900bac3d615279431461963d4a284314649a9d6d1c974f98abc164b3a97d674a1c60b71663988212721000a01bd81a78714272220f2a1e407283e8294f4d00350108f0108701c0418c00f5094fc708c095014202648a42809410c3940e08409121034590202103861b20386c0c702010d7d00c9901322253d3861c244c99012222834e880b2e33c827a50e201264c9c0c05c0062540433c7a000521219202d4c407100876e0804204658914208ba80725509a2819224242b4240421707212c01260c90780869e5425404c7ab8d1e14313a0274f942001028192212744507aec0042b084a809104335c8078880e851da014801fa0109519325434f90f40065490870801039713284c407a021201f869c20e1310001901000284809130f20015a32441400020ccde00310142840434f42e0a4879e6c09300414c5490f4043489440f1a10720240308e23100019ef40004e5470c417c60c910501419a234018a3c7600489a3859026508280a1220222543404d804080e4000330800108e003101227444f8218ea01099114a019a234018a5e46853745631223586474159592ac51a6195916d3222c651433a3a222a3a2a298a4081615ed95a4086e92352aeaac246b64545464644493ac1134324a19c994d195c4081641a322a3580493ac5191112c3232322ae2246b54c431c91615151519cd246b545464249318c12298c408161515c1245b64c446561223489314add14cb29bc408c6246b6464642493ac91112731824630c91ac12410982880bb0b430045c9065528d59f16b5e58a70f583cd7d3b7344328ef3b6bf5c11ec6cf5568330cc081fcbb6b1ed6b7a2b3d69c4416985b639df0e5fb1078b73ce8979a92d33cea8a52630cf708570048ec43921f79359f7e16ba38efcf4e4991bc296f7a3c1d23c7bf31a5d21b18740e163d730ccb3893af299d7451dd9b5bcc50d99bfb29b9fcfe889e6cf6806cd75e84d6f54bf1de06ad8867953b6f08bb26399912cbb362cd5ed2a4b988e4426901dab53b067a7c0a2b0ba85cf49808805a0b27a8a3af21a77249eebb7c375221680c28e3d8b98916c4bbcc6dc8fa937f6e629f763ea780ddbd8eb9a6f04af158265a6b70b046e91f451a067d5481b5c21dbcbf7611d36d09f063a3e1a49beb85cdabe48ac1f6c2e87eddd1fb1874a762a5be235ccdb15b3c6db86514dee01923b123b3ef316c5da5ceee8002315f4756467c940c0a7af47ce0897daba0627e92bbac2e5e0d3d7992bd2a4858a7a8ba1ad8d3907183dd11747c4284b0b258124d25794c583d4bab6ecaa98b7280ddb326f5198b728e67ef8b47ed957d44e9069fa0ef3be5adc628d9c90142a251042d543cb277ac9275abfc8dc1129143b285a15089b26b2691a0f83e08552fdc58697de8d912f88e6539e5a70224c135d90a0c3b45dd2c1377109b8e08a251d844cb4d13007f27059f40cbd2b26a2e88865c7ea0e14c0751f3eeab26399971dc2a0cbeacd0fab541d5fa4523576839179ac7e393a8a6c26d86f72d8c62a51fbb0c671c36020372936f2fa3047ea7068bfaee1f0204a630209de34d371745dc7dc0e38ae491cd7268e120ed24d1d89542291bc2040ca74cc97cebeccc35ddbf7dae55d441df6ebeaec1adc360f366c18789b47c3a7ec4074d8afcf6f6bdf6efdeb3abbc6dc03b42ff700adfa400164f7e1cd43009fb25b5e103e65d782c49e06b04ef62c4867413afb720de05366d3d9bfedd219f3dc6867c288de15132ae85db5608a1bad0a39603b07d8b1615ff2ba2eed9174d81c8954dab4fa15b57602ac10ed59f6c71e88ca7e8a3d33cfbe0371d89e5d9bf1206adbdc6801f4ae5a90455fd1022ae4b679dff61b4ec3f119ef863379379cc924b91d66aed14d9bb9666dda4c3783c3546fb652a92b5d9b9b56f28200cf9c03e47598590dda2f348b4b636d8ac6b68e79e29088798c79924fd7893aebf4f13bd086eb3ff874fdc4a7ebd7b553ecb98175ae5fdfd5dfa92f224e37f0e93a14ddfcf5ef86beaef12645dc300f36c3de16c0a063d36b90238ca4cfa86f7e62678f9d9dbd9bd6bc1bfecd7678b3552d470b4071df550ba0e85db5204b6359fd8a1abb0fd71582fdfa157b4abfdec51e88ba6e137b4cbf7e8843f6eb9ac983a8ccfb44a045676fc19506d2bbc212a6b17c895be67dd96fb48b208b16c1121af3a0c0d6d2dde4dd6887284695bc1bad46e02add0a44957e2d723b98aecd0df364436ec80ea66b74c3246092c0a248266f882dd306f7ce1b02a24af526ab42a532ade5e80614f7214a6fa0ac4014772a974aa522d521ac3228ee9adc308f7b392590f382000f391d3a1de2358d264f30dab6f5fd421c60431cf81f49632f281eb612b2e09bf95d61f1d2bbc29284e65ff563b2b5756a79b24fcc434f8fc50a2c4860a1b2041b728b96171b8779e8cf3c949ec606e2c0dc0fb7a4b4e92d1d665bbc4698ae572c4145c7d0bb5ac28856c28df67a574a88b1b2734e416c83037b42ce085f1e8779bef81a746d4b90e9a9c54d7a1fa7433cd720bebce474e0d81df3c41a44bf3d574b64a1db06e7dcccc977f1f3d73ce47ef81136ad40744dd4411cb8e799d321eab0d3bb40603c622703dd6a50c269a2f29083d7187a5b126132d0491bcbb2893d54b6c09e88e2ef15cdcd87d344ebb6f5ae92e862878980491c6d18780dbdab24aef492e00a75f2da421974bb42a28da6e76b87ed0249e40abec89ef07b814826f60dbdfcb7d3f34198e75b2f39ccf91d724e3d7f81534f1a7a3e49eca1b225fbfc0ff3599d4700f74cd4fc0ef3ec8a055c7afe06e6993dff63fec43c0c2184399423b25d685c207121fd42a105342f907822da0b3b8779846099869f437b226a0489500c0dbf9ed0021a2e10c811a15c116b839c0398bdcff23e12f4f5546aca94a658fdf85b14eb57d4b47ef41bff193de07b1fbebc203e95dc0fd76f4ac76fd3fac1660ffecce3dd38801f9933128d405a8dd8308ff5791ccdf276b582299a7a93d60f86a1a9038c86d0f08dfd6179b0a9b79fa7e186b0ccfed8f7720f301a42b36a7ffcb0100dcf71325684b64f3a7900b4f51c76902b38926dfdf3d735ff75fdbd2dfa6fc1b4f524ccf30569ebd683d8b435435bf7b9dafa75eb395c396ddd07ee8928eb17e8a2ad6f8079ac262013cd1eb70df3ecea082c0c3792846099de77cc136f9d8679e42d6bc94422b46dd2c9c7d51147fd5df31bf3e4cc2057dae8f843b4e9f8087b242a7647eef81e2b043e4609686bcda0dbc3f371200ef06afec69e659dafebfdd7b511ad03dd52d3c6279a187b7663fd8e244a3e7a3c7428f9dd183fb4d3b10a955a8bdcf35b7a1b75bc2768107a1de876b7c4f5b6427677f77cdefff0162d466fa9e95ad0f2bf6586671602d68e4fb3d2d0b2d2440f36129a945eedf9e528aca2f9d72111783e1f720f60867063ee01fcebda3ae97675258a26fd3ad4e016b9215b0dd2ce3df33e7ea97ed94bd74aa5d2e591ae91bc9b1fa95275e9b263732f77a45375897404aabac40fda5edaeab47ef129ee3491eac627fa8f1f743dfb777db90f3b897bc0bf8c44ba0f6b922b32af2ffc75dd87236724fb15445a20f1a50512552d1748bc4027554274e99fec4f36e9256f4868c9a8544d84a3bb136ddd7d8b4344b4b7a1ed44b4bb2f67044997ce4d7ae709c5d0a56f9ed002e0562a95eaee0f92a7c98dbd2ffbc6db214764c92052bb74c8fd40285a0896e9cf48882e55666f9bf3becd83d7bc7d10fcf6b50d979aacdaf189561b3ef16b4f12b488d03ad0c9ded515273ad0cdded5152cbb4064d08460efad6bebbda021d7bb82e289a6f120ce02e11688f58b4fd6197a43b06e0bc47a916d1ea2a39f874374f2f19279b6ad732b6408dfbaf56d85b0f5cdb1a2a0317bdb97f5db5a5e8bdbe423813526d564c5344f79927576ac7e457d7d3922d8bfab8398649dd5269936993f27f37dd83a7b0c6d90d724bcf82479958231438cecaab97e3ecdd7b0f95df5ae5230a6772e119aabe4939496f7c9a6dec764eb79aedb561968f3b3639eeb476abc4d4f4a1f9e493a3ee5dbf06957931b3d769f083d1a1b3ec18e029bce2a04cb74765a83a80ef451d68fa8a526a6b5c7e65eee27837df3b35b5c69edb3e598d62a431b26e48da48536cc283d261ba4413b9dd1e925e9e069f89479d631ef3ae484aec65920fbab6e95179f9847d62dae2443fb998fdef7333fbf5c91f8791fbeacfbf0757aebcc0d89f5336a1acfa6d3a61705f6e54581f193630d8a97bf7488979717bd47ebf0f3f1baae5ff5b30e85b6e6c89423473ee4cb6bec59d72057846f5de30d72d6a1c5e32749c7c7bafbe39abf68b5bccf7a508c4ff848920f76bceaee8fc811998ff5ba4f84b768dd2637442b2d0d9fa0ac1785f30a1adce522910368da67d4f0a51f7aca3ddb8e3dcb3c1acf864f1af5a2c08e027bdb78e1b224c1fa0542bdad06d1c3ed8e79b05bdfecf3f2db7d582bc1d6961bb2d4d4f129fb4e6f87dc10583fa386de073b881e9eb96cab342b04f65ef3605bde17c8be639e9dde635ec7a7ab2d68841e56adb47d1ef6724338707dab36950662f5336aec9b07bdc3fbc4cdfbb22158563fd9d9b5432ff2077bfbe700a321f4ee8fad7e9927b465de36c43ca1d8f1eb822ebeeb2824dbd2a8f7cdc35fde0dac42b0ad5a430369cbc3e1d37edec882d40afce67c3b7088fc8f485abf37fdc5f5238abd7cc24ec33cd9e36d324dab9f76ec9ae569b71eaf691e6c6d3be4249fb06bdef6e66990174612dcb6bce5d3b735fcc9e6074ed7b07e344248bd6dccbb16e011cd8695864f4ceb27c5fbaede6ba9e994c3a778ebe793557dd827ae27bd0fb6102c53a64c99fe8c7a4f3da2d87be85d7cdabaf189bfdcacdd46f39c93f4b67198e71dff6385c436cae03442cb40b7a7e9b4cdd1ba08911c434d4d0d8f1b9c1e3b6a6aa0131d1492aab805e48608b1dc30d30a4a8625e6da16e200c790d17b8619c441aa7a17878536e458211b869e0d662b848564bd5f48467f5cbfa2e67f5bc72df467d4120c2debc7350a37088660c3779d69c371cd08953a8a2c7dbb8222061d6583386cc78fdbe286c0223a788b6f713f54c51159321a5e5b0b4208af08a16408e989047f4a056d5e69f9e96da00b9aa7a1bfb90db5e96d0369d91b2d150ebf5b69a56205088afe6806052f0f8d601e9a96e7a1c388ee63d2f33bfdd1f4b75388c0a2a8d04368049fe429d07dd08829b47c6adf459d2d34d183277ac0258c4a85a287d7a8b728e8a9640d52108312c02008282a5680a0e08f6650d0a3628551d68f148082a7de910250a92d3cc0a776883af2f04b6a0b0fd6694df9441d79aba6b6f0400f6bea51479ed69d8d3adfd5dfae56f0df7e592e1091042d698841832834e12daf43896e51464964118417bc80086072b0066a51fb6f8787ab54286804f3d0d0f2f04aaf0c456cc42c5da05920eae4480198c6e95da5e08ad64afc5d21433b1dffcdfa1969259effe24fd6b30a45a1f94fd6afa8e57247564c4febf45f517ff1d0aa4d680d62b25b5ce959e9e953f43203bbc515d4a5e5bad664b7b8c2414c564cd3cb7fb427ad4d564ccb7fb24902a8ac5a562d538a6c00030b1bc0c002d64f4ac77bfbe5326003185868b984629932ad45d5030552209145c5538a560c0afbfe23cd90e5065e54f2c98a692d2a1bc0c0424513406575a9768b2b5909560c0aabaa1583da7f5bcfefe2b06bc3b72b23d86822d85a543565e060082ba854a8ad538aaeaadacffac9fa3de978f8e5783045a10c19bc4145a542ad0e33cdf7e122369a4c69708230fd5dcde7c7333f32ff3ac197e66f412730a267efca0454f49a22b0bb5dac9d118439747142fef4be20fef2094208b130a5c64307125da752a9542839bd3804769d8475a3300196ae93679ecfbaaea16e5726389a985c3ecdc8e910047f9d6b10fc8d91ecfcec5c89605f971eec8b7960fde4adcf33f7039f7147e4ad5fcb3c7b5d5ed293b7660dba5eafc7eb540ac5d05347129d3c7cd07531f793d5205ab17a55cdda36e619824dc46d5df269de87a5077b639ef8eeaa93fe83bfae416fe353fce54960fb931dab9457fc160fe525e525bcac37d6b7893eacadba35fcb5c98e4f33a8db55116df4d5bb2a824c6b57e48ec07fd7ad2ff7237fd528d3f282e469bd30c8f1993b220feb072fbf9c10ec59373eed2535021abb2b65bdeae644291a91d516b0df52ddcea271dc0974cb39c0a8a53482b0011abc063d22b02fe8c13682500620c009bd4f1e7e7a3746a6fc8453ceb347219db37ef1b2069d60d23929a5944e4a4f27fcf48260d581441724689011b5e53d730f30eaa0dd7f7cb81d5c6933d2e97dd7e7a917749d3e7a37466ad0f5f8edb8512f1e7a1ad3796d42eb44b3e13569fda3e7c3cb7938042eacdf75ae51665bf7616d6ed0b366f4bef8ab06cdf32d4a278c6b68cb3cf2507adfbc3cf46e8cc0d3d31a340fbfadb13724d4a3e98966f3691610b78d7984ac8ec24dcf57907579d50fde3a3784699ab99f5d7df3568d329b5e9becd12f57449e21ac5ffcac419227e42b4768f4ae8eb2f4576af91a7a57475ce4d4a817974f70f9f4c9e653ef336aae178f392137247e7ab079dc93f33e7c31cf0d11d8f3b35e0d4fbded201d48cc2a54d40c650dea8ab035745bcbd64a72c2f87839e910be0f2ff3dc7025c28f8ff4f09279bef9a078794a7f310fd3ad7dd887bd683b814e2b1db9211f6004ebc5277979ad8400a1a29697875fd8b22e9fa007b4656d7ba5b631cf8d9158a64cc707117183204ad6f15088eed11ba110daa523892e9e2f1f2faf4919a5077bb9781f8ed2db36821048bb364fdb9c6f571d4fc49818e30e023a7e661d8f00e6918fc721024c4779314f10bf639df8fdba8edf685a3ec94b3ec17f5d5f6e92793e3e4acabadc33e1a7b7ac03aff126e1ca4a16bdbfb86751bb1c11beacd7c63cbc2b660e43eb5d59592845b72b23c434547d733ea86abed603b7f536d04115f7ae8c08d3b0e199330255bdf583aa8ed7961b22bf5e14d97be9fd74bd8fde67d4f1bb426e7eb296ff168c961fda6959854abdffb64c7ff17c9f18bdedf596b7f5e0111d3cec6503ec2127f48e5f4ea8eb5871a0aa5706a308b909595a9ef66c17950ab557699279e8f743f45edb1542baa6196d2779bb40b6fa694384b8e9b5fa716b87dfbcafa837d8a40f4a516b97cfbe2b043b698190eaa73d9e3be6ed02e1eab73d6e434fc82a53a6cc1b2dbf799f1111a879db9917246b14d8f43fdcf4913322cff5336afeb676e87db0e12347849e74cdbbf991a7df865c91edbb40e07da20f6f9e102cd3d749de0d57c43a563fd8d833ef839d5da3de079b9ebbe48ec8c328ba5d59e1d2f2f4da6a015c74818a91152d4db841833168a0822c0800a6891e3b08430dd6b0220c239400a7641eab07a2e63b1b9cd78f494e5f976a74179fa407d6f002062618e20a6480013507d0738ab1444f1ca839bfb1c788062b27a8100209617cb142cd7a61a1fbe4371806c8db43bf6f00f740d50376e09efdec824c9b7a574e70a3972b127b760b28d8411a6f8c31c389154a8ef1a54c164a78a10466a0a4fc9967575ea85a3e877b3a94fc0fee912859a7e8bead07aa689867734eac03bff05c6911ddb6f422092faef4975385b6391fab9abf70684a6f08be1b8a0b049ee86a5e20f043f242b04c0f1109593d8108c1321d253614a31e12826d347dd3e9c10502af05c29f1eb640f8d0d396e8ea6c81f0b137ba6361e8e0e3211bcc038f9a0fdb8038c0e62c7afb8a3d8bbafabb6c9aff3d5656a9405be619c25ffed50cf972c8ac9219b277f5723032c31f68bb42e25cc29623b228010ad2a0026ab5b0c10b8ec0c28b23c01803b5b7611e1b7a55bddfa177a552f9e4107b2ed47e7d881edd3a48834e3e46ef6212a463993265da6859b558562d0a82da32eb8d11d9f2725e7e5619e3e640ca300d6d6740038b13ac90df2ecd3a54d1fcd8842e9a1fb3638fdc03e6e5a3f4e24e6ba59d865b16338b3b12b3c778c811c91e350f3ebbb80a5c9f72d529dab54dce086f90abc0756a05a2ae4fb10251947e0abdc55de0fa94eb02d7ad43a145d1f129ca3501898e8ff3d9a9e9a6536f88ebf4d32bca50f3bb42acd35a94a1e80e47180af3b6082da03fa3ee600cbaec56ac6fd1aeca50f3f2a56f37814a6b5e93acb56fde4f46bae488c0e3d8fe79414cb46fe71e39225e13eddc71789f519be04b42b14c9907c05aaa4074fd49958ae4dd681c17597c11c3c5159dd3bbe2020b174773d3bc1b12c7719cb569de8d46f26e348ebb0f4fcee28c70e7024c5bb40e71d594112aab56ac43d4e43c2d47d656b5fbf4ac293a6f1da3b568ced3a78aaed37a7414fd558f8e9ad5cad10250558c50f3f3168d5a0da280d1fc8d268bba2bd54999f546fb9c87b0de68d3284b3337241ece5937ea5c4594af3134ee5e740194a902dc8b6818c7b74fe18ee3cbf180e35b4ded3847bfdc05b8e3f036ecfb0ba4a6a066e0815126b9f13045c7b74f315dc797e341c7b7eac3dc054cd7711f6642978e6742151d3f391e76bcf4cde34ef2a6ec38e993cb000f1e769ce6dadc9ef31489c7b99adaf18de42dcac69bb29dc773bc293cbee334de94d4f61dff36886e574c88a2a7d724fbc97a9ee69a06b90c904ef3ce9b427af7929722bd74939722ddf4e532b083c64b75cff9e665d7ac6da6b60ca44ae79eea6ef3e578d8711e35653a57f2a6f0f894fa29de53455362388ed33c657ae99d97fa533cea53f5de6dbc29a9d476eea91c2fd594cd53359ff9a272bc29a91477530ae73ecea8c9f1407ae993bb80e93b6aca08d55d879782a8ae4e8f07d27ca94e31bd74cdda225781ed3cea14eea45b1cad3cecf894eddd717829eea45a3445c7732eb0d521787c7b578b3254e99c5794a14cbb4266fd765acb11e95b2dca50dbe94b5e7793c741541178534d6de7aa15d2b7d01ac464de3a7de93eacd56fa7ad67f58344e0e32dafc93c8543f078a9a6206a863a2575f3548fa770eee339dfbc21783ce73abc94cd755ca328c8d2bbc5158a822c4db530a2978b8621e876450431fdd9b4bcfcd74922742104262021a6b7e8628b28be18c1842ebe74f1a5892d9068a3b518a385172dacd0a289d6b66d7a37573582353decacad31bd62ac314d574cd30450594933b6a89ade6ada1a699bdecdfce5ddccfad3f4585fbddc8f0d6060a1dab89f04505935dde20ae93935055129196a8afbf6a76a3d3acd535e2d8ae1db5f8b62b0b2c57ae9342568781f3d3c1caf883bcd6f6a51779aaeab455c3d3aaafb761e5eca08b54368011df42db4e1db1516aa861065e31d1d95ba524f1d1d5544fa76d37578a99a5a44aa4394689eca518b709ca61e1dc57da61e1d65aa4538ead151a46f758852dda8f3ed8a086d34ac4472b9685843d06dd1dfd4c2a599ec97be5196c638096ce7dec51eae1e7127552b5c1d620128d2c69ecb5f9c04b89bdec51e533d22bdab5648750b3d77798b7b805107cd1a64550a18a14a8c225d1675570aaa549d945dddcc936ee528d2e9bf274debcdac3c74f05f928e3d5c9dc27dbbfc057180d506da002f4fb90c5cc57d7be478d84eaa29d23712b7f130bab80b438b595a628f7599cc8d3437a6f4d7f52cbb4e9d5d1e7ce66da79e45af65dea4de5edec711e19e3d7ad7a55d23799f47c4cd4cb0c3ecd0bb320bd376831e77ccbb89f5d31e3dabfb47c4dc9153c7facd6b5f8e872e7af35aecbca3a34c5f5680a9a68a4a5f3640f6d4b201e2bbc74beec8a9e11e7ada378fdf798b2a795bb66bd0e3eae65d9987714468e613338f3deb2362c81dd1f9e14f1d4674304b2fccb2315d81515b44f271d647ef4b0d45b91e4f244fffc923a7fe8a7a7e52846238320feb07e3ca4a6bcbe433b2220d3d87c41ae5aa96371f39233474acd3fbf8300b9f2e534dcf9c111afa8b97f789f4db4b23a78e321baa3a8689524e19a510aa10b90563035d9094d1831de5b5e845f17ebc9bafa7e78cf2bc1d87c44f1e68b0898eb7f4aeaef8417396ded50f98e853efca074ae826ba8845ef8a07470dbbf4aeaae8d23f7a573a404348e887072370e9afc81b2a12f407250c2e442fe88f48a56252467f44575442fd114d7165a83f2233bef45ee86704fd0171c4aaf7424532322f78a3f745322dc2b4d0962913a6f73f418620d3ab52f54a956acbf4bea11434a179cb835283f870573ac8a23f6f082e9079a2ab85b64cf3b38cebee8f39a1b7d7bc8f7e52794e076434976546e4b973cc11b9be1d7adb338f3b7346b043f871850b043efbe67ddc51ae168a6fa87a7f791f6c230bb215b4ebd7c75fd91c19d6ef3e5128d51784105e08075eb32c08eb47c42d04dd687a693d4ad74ca44a88fef842961b4294e92857f3b1e8698795bded63ae7ca18b4a0984e8a128b4b147b11a8a5163f2fc0959647a9e888562d37af303571dcf183c7df4a270cb6bccdffee063f17b55f60e3fcc928d1d3233d70ffb1e623aa4faaa41fcbd5589ec77b6ac41f1b106edb9eee105a91504e065c7080ffc6d6808a4e169b807e6200ab843ea5de560081cb4410123147f4a7c95588958008acf450cafc102ec00f64bd2a4f436d005c9d3d05f4fa36c562d1757819502eafafc7ad7a757011bc0204219d45e4e2d538aaa6ab7b8f2a57ad64ffec33ade274a8f86a5a1bfd0a011ddf6a11164056810051d1bd1c1e6cbf7b0001e3c669c81c300200d98f7c036607eb90f30a08b10444f18d53660d6210cb165cac421c4ba51e704ddc6a758c39e3d21d8292e824630c2138c69f9ecda3201d3f25814f2140756f4c228a668790e075e5a5ee3bea7b1c179ce8979e8e525866dc7b6edd7b609a55ad3eec3da76490bba31627ddeb2ac6395d341b332928565dfc6b24ae43a766cfbe5c1c69623921d0b826d6519c61d91cf6ad0fc270f853b228f6d0fa297af1ffd56b1b7514f8f7be619b566043b77ecdc56f2a8b705719745b0973c2a54a85029ddcaee0020373d4459d91dc0179b5688f2898bd2bcedcf68d391828e7b7ce47eb4d3fa71d7ea8dc6d51bad1ab94e7f9d3ebb755941970ef1b22eac7ef4da350da3de0d5689cc6bd76ae64d225a5076ad7eb03faad55d2058158265b047ad7ed9e9374fbb4f9c1e84b0b5d2c69e4509d17bd20ad9b92108028aa051c6da163426d3f1ec21e92e828eb6a93fabe33b4c9369c086d92f513ad9a6fe4a1bc6478bdf9cef5ab57cf49074dfc5454a27fbbb542d7fa9fabbb85c0bb0e9b9b313643e877b1835cf258a9ebc8da08a9e60f4ce208af69aaf958460436884065e9a2302bff789ecdd189960347cf482f81f14a38697425ba64c995e3eada41725474b3ebdf9138c865e941cbd7c8af5cdf5e37f3ff0f144e063fd200fc9665889b4de13693d832e4dc44357c3c34a24db88748206bd12461868e9a2e331baeaf9651e889dbbc00d5b21f4da2177241e3be47280d023c2767a07a318ef307704fb073b081edbbe61ccdf2a3a3e7242109eb3cbb84c0fb95fe7ce5fe6ff79f1bce6e7b66df1626dc73de871dc8d16363a1efbcd392d623a3e72db72dbf64dbbe679dce691368dc7b59b1e3efe53eae1a304b9dc701c77cde3eec337a48bbbf9f59b1b6ca60777d1e3e6e6e6e6c6ebd1d11eaf790f2a98a7c7e7359a186e621b373168dccc2699070be271ec3bfdf138f33866241ec371a3e61eb77a70d7714305f3dc7cdee28668da869365efa179433f9a8f6ba5ff70dfaef9a85aa97e5c7673739c9b6b47b8e9b79ea69bcb1bee36e7aec9861bdce17db0797cb9233acd9d87b763878d0e6f62e1d37c8d17d9e093c9fb528dc3fb529df7a548de9782130bf3c0d846cfc3c80677d198b7ad410eab373ff14134075a61b5a898dc39eecbf1f0c39bded52a0653509902092d516841420b156ddb96dbb67bdb8f1d7b4d7ddb7a6edc356e835430cff63cc7dd87b70dbb4efa7512e9f31a8944c2481ab661da90d27db81bfac1be61db967d3b861ddb320d7adf6c62bb6bace409c18d44e20ecf5548059fe67f4fca5fef1daa7ecfdb0ebd0d62f7b6d06f104e6e08ad44b0974fd88f4ec34aafe013d658fd44d0d8b56505a8ae5d1c3df43e290d7fcfca51538abcffaa48c61948a850af54ac1cf57b8ba21feceda7ff66139b563f781df3e233ef93d25f4e8753d6319e5ec13cd7e7379be8f9cbe32f7c9a904b4ff84477fe02b94c5845cfee908a2be09f92e3c1fb1f391efe54fdabf7ba5187ae6ef8b486b6300a315996963cbebf200ed6bbe8781edec77d73ee3c7418d1dd7ca73fb8d33bbddccd009a07d0cbf130a2a3dfe98fbb3be48ef0f8c7bdc1267280de05d21d7a5bfd8c9808f58c1a7a37e7bc8fc7f9dc63882186182247e4d4317c391e62b816b71862b80f974a3e3c1f3eeec3c7991be283e3344d93a20bcea1d683746d8378f4ae8680466b3cb61ddd8b74376ae875de07cf9d7a1ffc762ea2b1d16944e5214b25ed256e8876cedb2e79dbdacd0639781c0d721098b0e6304fca70aee338d78183838393e1bc470f1c9cfbf07170702e9c7a6324866b8f41d334120946c1c3fb60dfdcf271ed3ebe9dc6f97773bec61189bf818df32ba2d16372477474bcc775bcc7c73de88c469a57483d7a683d7af4f048588f47ee884ef7a837466c4ebacd49d770bc21d93827491a8d56a1914824eecbe9009b5ea493ea8d911de7bee3dc35ced38ee35d0db3308f96a30714a3a6de678191df3cd89ca6f5f084606b874d8fe36dc367da6f3c1ef7893cbced1d9ed5059fe46d3cca854ff23a32ef4b795f0af3be547ff38a91536bf5c648cdb9d7d4ab0d3ec9731566c911fbb3c0b4fcd5860586c6834f74dc5617cc036915331e7ca2834db9300ff7cd2b6398c764c2b063639807bb0fb357abc7cc0dc1ce5d9807966ae9a597be5c06aa07bd9216ab77749457e3563f1845971eb921a5436fdbe46d972a77e1933ccca25d97775d1e5e157a153ebb145534102a54744fef4a0a3664c046f3f4ae6470051b8d03c64bf7e85d453145478125066eb48663b3bc0f6adab65c57bf547787ded735bce71d1d55eb06bd9af25e94a1960dd075d7b4cdf316053d79d8416ddbae6b9e7a37f0db467d63a43b7d912ea241bfcb8d4e351c02ef132f586f8c64e79e9dabd3083ec9ecf2da47c49d71444e4334480fb7433ed14ac4cdfdbbdcd0eec31a3777d27735fde60dfd6ceffe83e35b37f4d3ddf49fd2bb6ff5a3c751b7fac936d54f08f6f6ae7e250e7a9b9002606742b0b38c7247743aab3746b05fc76a1c9335c13c57121dccd2f2dfe506ccc227798d07b4d209412b56ac7430c8fa3ac0e889ee8b68347b91d0a255cbd15129ae228b1650a85045720c1198c00235258894112ae744eca0aceca0b6c04f239827a2c13cb09be8ed2f9269f6d2f29c850c718c0cec851520c307a368793845e52ef51c052ba0422cbdfd5d2d2fb51c1de57d5bded0ea9d1b2ac0b38102809f1e8ffd013f391dba8e971c0ff5de23c7c3bd33178145c950bba8030fb9082caad62bea40af6ed481cfb2f4ca50248d7af04e151ef08999de150ca8e85565bd2b185069d524b3ab28e63c60968e8cdeae638cd13a7b6c6d9665e938230a2896bcbd43842eb8c5186364726ae6d172fd23e29e444e3cb0870da1f7e1f92190d1a78e718387922d6fd90070ce0ab3cc2dd5f2ec5dded15118b65d47474d055c3575bdc8fab20158bad1ecedaf23b1e59628bc2b28aa6822168a3dab50d4e806b330cfc6233a1d2bccc20de12a645d0d5f148d266754562b4155b70d196e3b4429a1e4609621f372a712b4fd7e7fad901961bc1ee9e37f304f7c908bc6c7481fe32937b1941ed2dfc8c3e6be912ea09f1ea4555e0b645b2641dbcfcb1542bf9f2b04f60d7c9a57a2773e9c9e8fdf06551dffdb7af6649f47c00af902b93eff8379b0cf67deb2cef51ceeb958e7fa6e7a7e5759c8f4fcc63d34ac737dfe6685c09ea71e6c0df37062ef0a0a16b405c5117d5dbf7e633d36f78df55d416144ef0a0a15340d5671f874cd05423dd89b336bd0ae6213da5253772259438e5b3dc9f088665db3b821dbe571a75f8ff38810b9b8a0ebdbbb82e2a8e702a144f8d7d7e36bdec5c7b06b1ef6e58aec077bebc71dbbc65b3fd8fbed1a6f9c97f5352d5e07d2b77e570b0d715ce5864a0f82b25fa640c2045daacb27ae7e7bed179512a8da276aeb6d933c0d6e2ca5b7ef5e0669da377cfaf64b4cddc82fea36b12795dd265e92c3aeb9611efc353d2d5e694da6a0b58982d6a811ad592768ed32416bd8516b1911ad69565adbaab4c651698d34446ba5ad04ade1d8382dc32eab44a78c0c174747baf9e9da3aa9adfa5974b953e6a5baa8c39f72451dbe4dd461594f7c62ba058dab373dae8be37a6e26ed1bcba25b06e7a6cccd55ea7494b9294361d442db1c20669c9e702f6cb4c0c1083824e0ba68f3473fba1f05f201e9bd01b60787d561ba3ba7d36f63d3751b2f9fc30aa1f37485340e2b64612c42737c39faa394c6fac1366a1fc66181f00241000edb65b3d82e968c15b36834dfda9e5dba4260f3b7d4aca3f98ba19986661b9a39bed17d38341fbed1c17fb4f9db2434cc61819401c55066cab4ca18e12d218b4e1a279d1c237784678c31f2296c093fb9905de44a6221bb7c3df92864356b51caefc26bda7a50cc57d4f3dbfdf4d88361a00dcbf7a4f4b2914fb4d66378e9c909e514ac5b9655b72f743978592fcddfb1acfae534ef6018864133223704b33ab93a70ebc9ced732cfca515baec74b29310cc32ecff230efb31e2da36642d3b34233a45c8176beaefaa38d8e0f8faeabeb6c6cfed313edacd58f4cdf70faf11c1b9c8ea6b3efd6d925f7645fb99d3d7be486643f70cf76be0fcc137bba73ffd60be9df7ee929fd5b30cdfc1dd82311c03cdb9ee0b9f27fbc74b221556df3aec5c80dd12eefbba1af63de07bd22dbda99cbe1fdd934a6d59b1cb6b517d9d6aa8e143456bfcba8b3eb16c6e486e6134dc355c6544c18364c17e846f75d7d6d45b6e16fe0737eecd4221b04013e0d609e9b99c30ae1e66bc805ad1eec10f3967596b54003c34033a01828e6688d305ac8a27785ec0d03f8a193e3e1ecf84cbd1f269bebc7e486bd6ccbb2fab28a3ad2198fc8b337a52757d0067ee486cc8beb9e79e0e34a915da4ecc2279652c86ab9317c5c3ed57b81104228e70f51276e1f0d0d34634e18069a01c54c08cd80500c34034208cd80643ace39db906c44328c061c03c340317c9250cc4208c52c0fd6fdbb4ab7eac7f164b74e56fd6848c7dead0e563f49e3651ed78dab4c689af7dbd24008e19886d08c4944f7fde87826a2fb2e3074fe107be0eada311de12a6af5bb2ecb8335f0a0120b241ec659bf0e82e9782ea253a221151d370c1403cd90643426a9208c1aaad634b8edc618e94f3fd945de3a22b7dd1ea892d7d6d1d8e03ca7ad1f6d7d37b4252d2c6417e6a1b7d8f089921b42e9991b429927d69552ca3da2b54fb46abcd2d3f2e4ad681a7a5759b8d26980e91dbd2b3486d05adc2618d945fcc25958557ae193945576d97edd92fdc52a3f3922b0a175b5d5d9bc2dab7e7cedbb3d3b6ef3dd1e1ed7f1dd9e9be7f86e0f4e8fe3f86e8f8f773ebc5d9d1edeae0e8eb7ab73e3edeaf0f076757678bb3a56e56c74d46f6beb35f5bb72d48fa6add3d4afdbfae1b4f599fad9e0a85f4e5b37d5ef5dfd7eb485d5ef86d69144c795c90dcddbb9aa9db92241f4b2b9066ddaa39ccd579723b369f5d2b1568bad746ca59b5f0e0c8531d33655ece12cdff575a67f36dfe329cbf5eb33f5bb70d4afbb6eaa9f4d57bf52fd4e176781672c9079ce833c5820f30c06fbdcc1aed5ef843dabdf6d60fd3aec144ccff35137ef133fc883aa23892e5af54bb575e9d5798905b4415e5ad3a25528f69c911ad5f08c117628b5ac5b5696c131500c34c3c6c68686c6c686069a01cd8066401b6295473012504c984db36098eb8263f8d8575208cd806298073212188514be8400cfc76b40103ec993baeb944e3ae9a493de2752d39cf3d818c8a61ab4d8cd8038980e210e66c65183288e6b70638ce693ed836136a40ecaa60ccfd3f4ebd483f5933d82a61d3ca2c2aa86d755dd68583ffebc4f64da264a696394bac1d00d554f58829c5113cd157a157a41c0d0fdd8b9e18a9c82612099fe20a5340cc4811e836320f355e907c5f447941d9afe61621a9a2a466fc2308c3ff831a1e97913c498328461981976f5bb48558366401cbeebea3a9a0eb28ed1d0b4651dabd00c68c3761f869eb679d7356f7bf68c56fd764c4f9b75e3876d63c98ce00ba22d0aafa4a011904a10f39a476f137b82d834761b9a1d7305893d3cac5c327a1e836640332e4aa119d775551aecd73f26349dfdba2ceb3a34e3baa0188b42334a70c7152b7a2383450d327d9d39482f2fcf6e7b56cbeaf7733d7b76c81db99e65a7f7893e9c491d49749ff412e72557243bad41d6e5637605d9399d7e1b9b786167aec8f5a0ac7e107247b6be1e243befec9c4ebf8dcd7eddd6c89755afcf959ec402da10eb2e9989861a5f7aa777a5469666a36563814cafb2a06a03f4aec878693253b4564327bbb484ab965d690571808d6d3438393f6ee879e985e7b36d6bcecb2e930dea496e88a5dde635a739e9dcb75b5e8a4ff29807551ea412b921b34ae193fcacd899adc9d6646bb235579b93ce534bab4174251610078dc7d9621e35e89af5e9313d8ffac9567d4104c9b29b4e9d1dc73bfb8c4d67cff1d5917dc764ecec59f5932368b6ac312c264c5bc7f818196dd50f9eb6e67d525a289671a3fb2341d3a6b3a124c3fa64f249327afe93617adafcbb6afe7534ff6c48ffbecbc3430712dd37c58d6672035f41dbaaecd5697952bcd07d8b46cb33f913e6b12e4fc43cb2e5a7f7751d392505c2fed21fffe27e6267b07e46d3fbe40ae2609d7ed24b7f4442b13fd8590d9a177704ab1f373cf64f7669cece5f9766cdfa75759d8dcdff9d5afe3bed34a59f37f494cca48f04b3e9cfb420df87e58a2b026f65deec091275e477d4efb2a9dfa5a37e5d4dfdba1cf5b3a1a99fcd4cfd4eaadf715453dd6af7ebf4d9bf1b3aab1f931bfaba0ed7bbfb7077adf3b05fdef6bce2c80a2e5364c1726504f1f26643082184b05e7164059729b260b932822f88be2819be020d16c36470179c057709426e9d375ff2ac07893d524efab7c3fd3b6dffaefdb3c982c89e4c6e68f88f8f7afee28e6c0d2f25f6c02e5687994acf93eab7e346cf73f53bb1d1f35bfd8e46cf6bf5b311f375fd6d1b908c9ea76db484f523411fbb666dcb3c93afabeb3e9bb6feefc4b37bfa76dae25b95c90d1d849d62b7fe31b9a1b35bd927656412e47e665fd8251610876dec183704ebd23f5ad32ab18036cc0a75c09c2670e1ba82b411e439df5b426be393945ce83e9a96e75f36321e5e42c855cb75d5a22db4de18697a3edd2224a53f6b4ac80536ba20418eb87ad8021a539ca183358c5410c5155680440fb220e20b94750434acb06840c5133b10230b5856657441c66d0b3b1b0dce194f9cd18410308d2c52e6b89193c6d56af0645b108cf10c23aee0064f8d5b20d737f3682eafc318fba7158ee206b3ac36b1ac7979791e43a53f9b1e89e2db50a18de6e39c2e2ab78bde8735fac9fdc8d3fa49c90db1eac5a72b18d11a6fd6e9e7696d627d1e7297077b7a72634eee0e06a90b820409d2d70555419ae430c9c9692977d524075a51660749c93a3ebc5dff88665fc7ae5dde46a67b5f6fc95714c82c3880cf133f58220924dc8802118c8ef0810c6c70e5054b94c00946e000f7e00515c01083219461c50a3f7451832770513101cc11a8edb281d9f169299d44b3e927b5d9e12229adf292d3e3a612728cd68444d827d29b9f79fa4999d626fc482315baf43ce4243fbe090fe128a78c3ed0ea724568956b7d4f77814c4fd3214806cd2ab78b42e8850f866045164008c216ac6ad92a58f9cc7ddb8f05c2f7614884eedb6c54bcdd35b3acaa2197aa774c4005392d0b0ccca202181d7b5754e8220762b860673eb645683e02703a2974693e0d164118d3a45e2cae70a3b592499efec369febea3b1c1b17eac5f2b22dae8e80dc1a6a787deae8e8c684861c795952ca0c73cd6e3af183719649dfef222f4f8d4d95c57f0805c74511e3e6edc0a998f53084a29e7a473ce39e59453468e81c6603afa787959978b4e7ecf2354d4cc2dbfad10d8f2dc0ab9aa106c1e7a0b754d24fbb27e5df523924d0f055aaf201c4a299d74d22991a06dced7f1eee1371e7af2e213c72845a55209d13b8882aae7aae3c3449d48790a3ec58701f3c5cbca0a2e53b43145163259b08cc17225cc957804261e45952aeac4f754915ca24e3c87993de8c10289f76213ad883ad18a6885e4d2f1e3301dcf6056883cf36964ca5e98c7a6e3a517ab97b9b2b4ec92d1c16fdc85b0ee02615884c5fe65cc1dd16a8769c7b48cb32ccba280466f1934ea81f6235beda6185dd0fc76eddfd65b8dbb32466cc3300cc3b20d4a618bd697655946b32ccb34206c9ac846bbc70db313c9de0592fd99194df47b57517063d5b0614f810bac373fd7bf79101ae969ed5ab6751c119a0f424ebbb66d43ae2fb64232c815c98a741b34a3fbfe9c8e79b02c3b4744fb877df9246ba7794346aac6ded939ce484f638fde871d9eb922d83f6cb70856bbcc83aa8eded7318d07d1e83e9ae69f79b2f37398073bffc43cd7f93f56083c1fc80ab1ce1700c4819eb7f8587fe0b76fd5a8b5e87d45b683985c6f72fd5a31abd678db3c78cd83875ce669f52bb2fde43af626d7b147efbae4866097dc90eccb15e1868717b740e0a9478236cc8ac3a7fdb606494dd04118256c10c60a0ec2a8b0de551814f834600d278ab0e2852e3060228a2f0d187871c69724cac88205185a906070e1ca42068679051bc078034c116c2aa34d6a5857f0f0a32514d3d14b263f780ae971147c5afabd6113ba8fa9e83ddc550f156d8c21841b6b2c91821e40418611a6108327c0708508130c2da26581b1ba1080830c08b3470acc06d1894b2281a5805e972afb71011237d04217ac78230928abf4461a44a8e1822d50e9c1aeb29081618ae1be708229099965ddf0831b7c9145eb7a5750d8a269ef0a0a5e66b0b8fa935e649696688ce193947225556156bd314b2f47559895fc92057eacea25d35d40808215ad9520a510422a573c6685ccf335fa78a660ae5c398a3d55a41c4115544991f2e4c90f3f244972810becb0430e39f8f80409b2b313754ebf8d4dd7cdb97c8a5e98322e1e7cb1faebba99edf159486f3a1c7a1d32c9b96ee0130cc22778cb43400e3a6b8b1b1a1e6ee9acde55193f6878838ef6aecaa8a2bf5dedcae684793f6c683a9c9caeb3394784fe4e17c7367c1ae063f3ad97fe425e97cc301946174a6140c106061d136048cb923e3644509c808b1850a8800a1694a50337bec00321b674f9c11b0b60c216c61832471784c0c28c2da020a38c2dbc70833136e0810eba34a1801f6861182143c01520cc294d72f68491c4658388a37755c695d21533b27841a30b3680220a3498a1054fc88206527831c65102c270020b43063496b56254a0822068a10a326a5041040b369062084758420a4a20208c2b130c20cc304e306d7c7838c20bae20c6124558c3063642a041126250c597212081031b14cc174c3e366020715d60cec08480e16582610259660b604e00e6064dc0e2cb69cb1827986065064970e187a94c16e64b0c3637dbe373612b196c72706c8e93f35db7b181605c954990b68e63a325b3893d59f5893af016fdc69e2056f00526ca984212552883b2b4f0c2962a08914411b62083b20ef0c5173590f56312a4af3760573e7c82578f4d90b6566d1d87086de54059d655573d59a4604511a0d0851254a0ac1648418a378c88820b156a80b22a8ecdd59877c3ce716c725807feb3e95dd9347c0e3e363fd13ca1bf9d2f17d32ae8bc943252cbb236cbeb62cf0f329858c10b6a20052b4881b2de314f4f5bb7b1415bcfb15e80c611c250840a8c386201cacae1938c5c7378896ec02be450fa042c68d3e7a811844f5c9e2084fe767665c2225da04131c2747c323afe7e57f3acbaf8154217a38430c647494617cf7b351403cc172f2b2bb84c91859370a30d3268b010ac0ab35a839f702406a594d2301dfd07b7d052524a34a9ac900c307cda288491f2b4e2b2b37d69230c5bc1658a67b9b07457e2d155317ea73eada2ce7ec9c28b2e76342f78cc13aeb0820b1550458455962bb40510c2dd0f7e4208293d858f5587111dfc7624034c6f6b316e6d1805eac43b4ac8834e3e4ad8049ff68a1161a0c8b2ef5d292b64d5e482b63c6c982674bb1a834cd0feea6f6b94d85a82b0ce54a850390a82b27e744259a7726483b27e74a1ac53a162e5420d516a43a5b2410d61b9a152a1ac53b172420d11df50a1ac5b0982b220c482049ff664c6804ef4c226162ea15b7825da40db9c6f7e693e3cac1d7344b60645e98b4fdcc3dff5753d9f4defe50e3a69059f5664ac18c325cc1460b27cc1e2e5caeac80a2eb1a7ca547169630a3259c660893afc9e2a324cd4e1c72b5187df5345aec8441d3e7f2261226181f0c1cccffad97c91f5eba497a8c3df4aa6bdac90d5614417040f8feaf402bf74988fc9341feea08b150cf3d83417f1a5bfce0b844207cf9f5fb668cb43b70db77e49beb7a46fc91ed1ec1946073fc174f00b648c8ea6bf8d07877bae52a98440514aeb47245b4e28489c8ea6f230d2c186f22b6bf715c2bc8531b2343cea39bf45b43c6a0855ab03a5ac0e7cb23af087d5814956075e6075e00eab0373581de8b33a30c8eac09dd581a7d5815f1d68b33ab05b1d78ad0edcd581df1f78e47db3328147dd041e35b32777d0412f7cdaf754e12f51670f5552bc4879b27af283153f24e192e402535c6087d85385b3449dfd0e51675f85b1449d7d0e51677baaf095a8b34751671f24ea2caba2ce7e27ea2c6c23eaec4f8f3d552099a8b37fd4593826eaec6da2cec23051675f0582893afb2bea2cfc12756689c1ac908f2fe5238359207b78d4fcc12fbd378a90a240ebd9d5f9661a1e6ecfb6a5edd90133af1d1d5bc3259a2ddfc17f71c58b32f08caeb3813ba7de0d7c8247636ca9c1115d50a20918a0e8185aace0e588235452e0004579c0406103e30958fdacca2448d3df8085eedbe91d3e41eb3ebc137b360ac697a6c7611eab2918304d2d14a556859462613bb14e4ee76d7cb2611df8cf0a5d909d2354cfa2e071b847a272f4ae9e308326f5ae9e90058b6716b6010eae001337f0c20b26288106120c30031ccb0455113ff8c209455021c6094c5888b842084528a3451a6fdcf08511641426be0843832e8c21c5d16e1946f822075a9071040c0a60c5c483216200842ace08a221a8e409d50a84919e2449c710a2a191260109431540304024140a87c37928abb20f148011a2ac48509cc9a3518ee428ca20848c0100180200000000664868ab002f008972fd08d20c68684d3a868844691c69fa08a9a78d85644c1cb8638bee82511627b9777b72d36af3cd82318434571c83e5325882310496c6bfa39aa45280d49eb43809e53f680c3dbeced9fc6bf343e8d05ce272d5256fc0b830caa2b4d7921c7fdb2953f643986683d3da9866dc0bce3a59e387150ad8c930ad543c7e12b42c6f25d0930f099a1650e75640d22c8558f20338973c2ef247bb38c430608676121bf5d6008aa6407bdd2c4b6d16617205e9a6cbdfe9e60661d8f35c0ad2a7d66aa256815600079927e038253e5ced6e53d1dd2982d596c7b00117245f591780491841dc79a03dd55660684e271c0d9cffb377bc6a287915cbdd4da562a5635e36effce215421c548249693c9efa077b3be19a7e23ea5651bdfa09125c1ee85b8ff688ad823b9db05510b0ea83a860d04a1478f51b36d4fb540bfba02089bab5629668fa6964779e603536ebce01305a5285d03e577db1c8e2adc3de0741998c9dab63cb68245e2417c5dc195e85b560fda81490ed048cf59862ed70348b34574213fa57ecb0fd878c3c27a1b8588c6dbfd0ff6c0d83b48e9d4e3efec17e287cddbc21a039d6e5c366777ae7f0b7236793f1997ebef6790df6d7fa104f89ee0a0da3e9235ef40c9e8e671469cb503ec84159a01efd77a0543cc584a1249ce56ab5e078b1ca2310a2a9b39c5f30bc0eba03fd2c5a97b3ac1e11ae6281855e0aa7fb60b5f5627030d2903cc75cf5de2ff5e0719c542a6a162be36741395f56f9722784242f37ca01f32aaabd7dc6b889330691fc1c0f973c085bec70eb780ebddf548fd61c2eac9ee18e8a5a36408afa4311ed54cf92d84df4f713ff1ae87db5d01b06289af7bbff203f1af17ea0bf460d4e2681ebaed2749c6711022e67934249d5e2e68fb8aceb361615a3179db964b6e5467daa1f28d88454acd06506c8da31c950ba6515178cfbcfd2837345b99c3c87babade68e9b1614574868af22196fd259ba504f3af42fbd94d74a43f9531a3ac8b1245e358450d6c52bda7ebe7376a8ed69f0bc7b0a2121e0189d1ab10362b5cb640ccda5e88706735c83f6995045447c558497172445fee61949c9a1ff057a24c5d1d1bc64d8cd0381c9fc6bbc59700acf442e75e9f8f0bf67ebd531704bbd3e2f7fd1e544d49a5e11e39416e69d6f05aa56a90eb6b8c0dd632828823b23ad58619b4104ad82c305967b522c7f0da11df1df2d450194d3e82f92ce0ad430e46bb330c5a908a82bdde23c03f99fb346c29c55526b7139f66362cefa3b71d7ae2365d6417a04e46df4ac492c269ad0e459a03ef6e1cf05e5791c29e35570ca9a335279782e821fc2cb2550f582aaf642c62418985a534f6e0f104dace5834e923efc69ee36f653a754c2f3375e2498d4d5e677f2f4897c30d917187af64fd0cb147ba260755f088c51eefb4ae6f448b5d4e27dd59a2334aaa3ae5966a2f832d3cabb9c1cd676614cdfe1c10c0a9069242fd6a3daac430af3baafbddf1373afea06c5dda231230bc0a570516e60619a5694b47fb4108eceb0ff0cd73e52f469d166d7ae0b1cc549054330a0a857bcadd6ae6c90e521f0de8c5175db71b92b32204a2eb403a2e0c1191f98b565c314b947d42b5e75cb2ba88bb92de7acef9afd7dd56e33a5cfafaea654a4e73b6a6cb3b7f14d32769c4a3f36e7484a7c97f1058f94ddc5e67f1b40d416b41ac4e33499c8bad0fe675dfc48e9a1ab413038f28470eab8463b765ca00894d8d941af8f6358970430517800621170d0616c498bd5bbcb0b830e22cbb9a3772b0e269298a1c6f65d93ecf9d30b718b16456b5bd6bb9f0cd624943674b84705a385c8e0219886fa88095ddd046b9beed670e287000a78647a20d158091dcfee6dfcc2a25299108d0eb051ef1af9ac2a26429e4127a2831661484a2653a6dfbb7ea86252e65e362195e7c76ff6495c31bec7e08233b08b7309a01cab9b3d19ab4b5835ab9f0e858e98963fc2db092c1c02ed24798212952693b2c50c5669d0ec4683fe776bb8e8b60092c83ae335c82f7d01daa02aaa0a360964a1cd16e38f2159c5cb83ad1b788b02fc3c2b6e23180cf425fc4d66b4def4b4ed9b7cdf1cb1b39168aaf0287e502c1d19f6b12a527a3b8fe2e7df78032f48e82dc13d62eebf7d416f44c13a8a8827eb68d184ab5962cc1a60663b165fd76110371eb7e76656e29fc8041936550091f01da907c805d2ce95d8258ef7ae614a7cfa1d7faac9045a4f49c294a1eee28ab6686ba34c80918774ed9dfb1384e15fb20a88b5f816547ae66bbf9fc004cfda0a29b2c18e94e7e1566c071b6e41d16ffcc35566b1f30daa6f86fd8f30814c552aa6de781bc6f47b26e91fec9c0b8d1ec9d348a631ba26d9ffa115d573367b153dbcd7d597f0ef4b725f43b7fd9f5609ef0745a490d038c8acad673e24bbfc24bc365519ef24f4194263c14399d1a09d3acb9266a2cbad373a9c8b0f6ab07fe834eb0a63ca7fb2810136bc21d1ad54662fd5348a04f7331f01679cc1c59618eead02b24e2646d08c9488a379df80c29cfed71d9e32e2ff255d74f747ac8ca10d1d9413eea018ae91cd04af2866944550263e43185354c84e5c0d83112e5b0ca2bca9f45ce3fe2e9bbd6290cc0052dab0f9a9abc95a27612c73169e1d6174884ac4e0130d100aea71e49342895207eeec1ad4a5b142843380debd1cacfa34ee8e882ba2bb959cce8b97a7f0ad7e7562ccec89e1d418d66640f26b20c54fcff7e7e0a3b8d3950f46b9267904bd8949fdd19535f1cd56bd8c4876bf3da84335bcdc0b16bfe0de9f3f8042e1d9fa8e303413d20f41032244b9b32f7314779d7058d85501a7204aff0c9736fb27169c8ef575de14db8aaf76988dc74ce987ca40dc1db750fb838a5af0d60652882aa43d7863d832db140941ca7a118bfef7ea2e9b1e1c4f9ed34d930b1264c2db45f3511c602019a00153e04ea9d88f2219ff8b47712b1c7576f56cdec3b32bb5aa1a5a595da8372a2f3e9ec049b64795f89fa30df0ebb2e315b92b314e72fbd4c0e2f032e32625e10e266e52a2df122b749360c5e7c3401c2dbff03371df3c637074e85583a9f20901739a56115fd54c911b2cd8a74ea3bc9c592b04e61352ec913671c51fe2eebdceb209544703e385bce42081e856f4a6d43152b2fad04dec5d1f2a151c73515019abd49027921c3d656d64a05543577d7f838a05a886a8f257e3981896b50191dc354cd061c99280b6d8faed2fde9732b47c381f86a2dad229fe61ebeb57a22152c4822c29ef62152477466515d98c64cd1bf21e4a320c45f88e00e6c2d45530731883e4feac1a76e7e6d65668cd719d25bf8ef408fa893e77806e57e4bbb8c826dd3c3d3dfeece67cfcdc8f41748c67125bc5d1c41b55375a044fc0ecc00ecde322c8aba25f20bb78d6ece0ff71335a7a981f028e4914556f71b634fa1ed0233421d9be7116ff68125c82bb978d0757085e0c1c084b49deb2ee0b1f28c9dbf8e8ad9de3ff8d42284e5dd209447b6ed406f894fd186ffe1ef570d1d19f34fab442aa2870b0049f557862ff526d6996847bfac2a06491aa67d2a7ffbbd40435c4ca5422052e48161dcea4359905b28dd0170e30c9df8db67d0d33a234d2fe010403fa7b019867d23543a05b1ea0e0d018131a88a595ae5dba037a46a84813a24e2446fe12211ec1381682207823d789a08001e88a072fccc3a0ea2d50c19c1d69a3ba2143c9931344e31bc42a83c3b762f429ae351bc4d2642ce3f9ed0aba084a92477d0c2731c960b07515e020c8872eb3ab74c106a082bbfa19025796760e04f7f241560f878b1c187406039b1f11598ccc4d3d407a487ab3f420f62036dbf1d843b37a843c1ca4d09173ceee578544089dc17d3682f2cd1d4a482b88ac9f9ab445fabdbb560c3bef247195412ccca125783297a04c0cd1208d1a4d9839e720b8da7732ca1f5d84fee5c5eaba46ef334976dbfec59ba53181cf819c212f12334711ed673727defb1f008e617ae2babf97173e90e55a8d7a2372556a1d5ced794706fb6e0f3b34505751cd66860c75e9137b00e08e52dd6a029af4d66d610c61a9f35204c8dcdf6d6b054e5025f9ead135ae777a8c6453eb2587e8e9d03dddc48535181172ece036f270968edac49ceb97ccc9fa00e8a75f91357055de22322b1cad105c6cb0938605a9076164a2277801c14df05a8a1eca4115d1621f8e222ad5f63d789e09bd48d1166a4a1294d128bd6046eb8c31626a60439a565b9ed0f9491af22fd7e7eaecac6e6db6d684155f8187ca4171419138e3768b1d8a0b5d82ed0fe0204496eadb098a212475b36da3ab4d3ec360e30d653e10ce1d4add39df1114f14eb8fd28545607fe885e69ba9ff84dd87aafbf04dbb6c739e27bb1e5cd7d197e2e638ddf93002b9b5c513c6fecd58dbfdd2410720d6bce3d4d4859b742e285596eaed0f1ce49d7f1a2e5245aa0d48e503e892e96b747a76a46cc62fe9a1735c661815aa38310e7b7f62352ae8114e47e0cd4c9159b532c1cdb2acf84d3460b80fed364c8fe2dc1a42b1b4b56293c72d3bebb0a6c7fccbd223dce0f2e49a83d0ff9ac3f78e30ceb36765f48850c6178b68c508be4ee9a5ee95a6ed80e1ae4953a20832883142ef4368b33eac966d8daf7f51653a799811cee61e802afb059a831fa025e3be4e0cd25611522730992fae088f4360ca3b8a724bc0d2baa6584e04c6c336332ee117b06771d9461f01974d2f8971fd5dba54890afc5c57987c1765810c05550308c4613ef68e628205a8e6b8f1940baefbb89cfdd120072302b64e024ad2f1ac7e286223c8dd6e9f72e2ca01947ca9570425b86d4bfffb64da47638634d9a390da254f24e3895055db114f5f174019c9bc53b76d4bf4bd7362e8b73015a1920c8852e37c3b404bb93043ccf342b4e26de27199d6254848dcb1956a415348a99d03ffd2b048aa6dbf5752762805b01466873d30792c76c6a32882a467609e19f3d1675c33d2e4afceb28b150ba18ec0c206ed89941a10eed90656bfe23a7b493d5afa0cd8ba0793287cfac282d698c4f368ba72fbade4842c483d2831ba1b5f6fd2ad70357630f03e974a8fe54c5e00e7f7909f0181b57d84994f06041e0eff279f1400bb1bd04944a443a97fd492335aa1b598aa258fb00c5fd02d91eb5445372af6d653fee12a69e8786260ad956b87da731f3e55644d416076f2810746d829e1579e49245bd798409a5885ca1b8b10ecf3636ad85f4e08f6fa44276f39c25e15e8befd68242df9197c3976591770c60378cd4767b9da8f3d0ef5b268eedc86dabd1f43857ae2cb4e895161e3a3ef415c451e2fa528838858244ba9ba811fcd4b5f7ce8a890fe7c381a8138a52ebc612633b4b9708922022c0aeaa3a6164f6306b5247a4a8c6a3bb4330c99bc03ad5e7896a7853d2ff68da2ffd41280f3d6c7f9d2517632137f3a7eb4d67400da9769fb5579fe087fd6512f3f17db50807b4057ae03118501decbf2f758f31eeb389747b1ca2ab1c6c2180b180681e05f63d538ed3c90313e6e6a5b8662ce8c87db48779bc80742a30ff21d96bf03cb77dd03f50998c899b32e81c362e36822e30f2a98ecb88388a056e6e7a1b8f39294f990bb9d153130345adc730d6112a255bb3f5e9c0fd7e6c9c5453585c18c94fea51f4a6bd173aa944c3039609d07a25afaa9cd5c860599ecbeb408faf346a12aad781ae4632f34a7123eafb30dc52c19da445e5fff7c5b74914ed69ebd81c8121dca43e37f22d4ef5282417f65ca6607cdd6afa89862ad5386d14a2384f159590b49b50bbbe05c16d20ccae46680cc38d7a849d37e2ef0c2427ef86199907a19d02df538609950ddcd1d751052cd894e2e42dc4d8a8dc554e07a76dc5fcc7933145193801fe0fbcbfd3a1fc9a0bb6659e10a5f8056b5050369eb111a58c9ca1ae94ffe4b8359fd6dbad9e3d60a1f107f29cfadb448c58d9cac8dac6e0fa7b832b11c246122ba3878f76c9a3b06929427e259e7b7fa896f8eb233a85887d581d853ace450045abcaddba6b9587d107dc7c5fbd087def2d31c9be8c705b2f43ee4f1c098e66ae46212f494a02ba2dd6d50c6c19f95456c87c2e83bcd0b19e2c394ce70ba4f7170300c6193ac92933bd3e807828aa5cf85cb4bb809a698ada5d48a42fd74bbc7d828201d3afc10d80294186c99db053505a36d53121c688b6639c0d40a72dd896fd3cea4dd4fd54a1b35d0f9235140c4b3a2682aa3e36a3f44a2e2eda3fa4c6466bd9918d961c38d3460fdaea0b486c02e6c38be480c7a188058cab0821aee85d84ab4cb4028e7c01188faaac0b421bfdc4850ddc7e6d9d726ad8805974981a8568942f427eb0cb30419a401db2cec07c10f7611d5733e2892bd03ab8f1791fa61e1f20119e09513379f87928287f952445bb77a32dd3f8cba53da027ed0b1a37cf8fa8ed8ea998f1833a13a47607db62054071aa7d5394d769234d8cfaeab928ffc5c4e2d9a736259edcc0395fff38456fb0bec9ca0093d05333de806d99a385de62154a12dc5241130d9b519eb86a7cfee3e1c1e4a93b7b8f236d5721a0313f7d1b665716d2cf33b762a6542188a6399b2b3cef9787a4971f17dd2fb9d2308d69513ec191450924244718027e65d9ac5099aca85cfb676885c5019e62321a142c12dd844829c87d1749adc6bf7f635254d150a3eabe5567b6e4c35c8238fc4c9572a7ac4adad88aa6edd59d681e4c974111b368a71843bcbfcfd4e82b3ec6a8be4ed727a5bab9fc6289d8ec081cf0054fafe696c722d5b582988458ab66f78d97e2f74d9ccb64b43c397589845bb6a753ef1277166a2ab0b78f1287e4901e3270eef80b47083056dd62c4739c431c536826bb6cbfbf452226316078b840fc8640d5c7e2e0ef56717d684037aedb4e102fc11202e5ad6660d286b79bb25d466a25222e33074324ec01ca945812e7ca0de10ec3502bd22ec2582bd40d02bc2ec457818fd4e96f39f1749969d12ee2f06c2bd89b1fb84c8d6ce16ea42d0c13dbb5806b9d03ef1407972c41180e1b425151fa79adf406b5244552310eb6a1855d3b7152e9aa9da84a61e17c15b252e146b762c4f481fcf5cb812a27e14fc3532677bbda76d46e9353733af215749a2cdcd03de310d64359c5d030e2c3c0d283d910c4805b78a45d9db8843e83d913f5757fb1a917fb15204d1648ad4d6275bd85a81faf26a603d198e6f970c2b8875d9883de97b79954b9bc264ea3fb6f98a453bd90c23da26f5e783c2931bfa16bdc1fda03d476c4d440088b1f9cbd1111e4850bca67cb609f0a3f166a204cbe75848a9bc9da81bfff23ebace4bcf06b61d4f092e1466a4ae76e96853b738c67be334a7b95f3f34a157d2040efd8da8504cd20c99bdfd989c14e0089832005e1cfac353a183568806da294af8ec6467465ded84c7906b8f7f0325435f77c39e63e874a597e442ff33f767790d2b0a3cf049e7fa5fc9e839a603f6bbdc43b21e2a535a371fe63bece890a24e353320af4d0b8b92e20cae6ef1162743f2ee350d537fa1c6ac022dd1160af9da53fe120670b1b8f6495178e4a07fbd99ae22f9d46b97ca4f9b1eba5974dbff180ab1d65ba115d49d9acf61602e9c31fb05be02dd597e099bccbaf314af225eff07f07c96b5877699a0538c1d46307c788d8fb84dd612838c8160a5c3e952c316883d14143bcb54cbb81f6412ad52d40e3b023d0b604134e30994d57ca9d398206396f9c116694361a01f2059efc61bde0a61883c78e2429bc1d5de6f265b054111788b7e51d096fd94404c390d718c6c940f99fff08df3407240cc1dec9ab2f713c8fa6a16d25b9d0656cf25e40890aca1ef09160e6da60ad7732d33b7ad13335ee1a9509fa0116170a86056c5272e2d7898fc836c7be37d40c4b45fe8bf14fc44f4a4ec09e30ec71fc6c382a67e1a74f341e8c4b6856a7eaf5fbbde7050262c2d8065369f7b518d38ba537d7392b3258f12d72dab90a1c098580c0a41c582370a62ff2b785f0a37cf60204c72a76251cf57303251e8a74ef415acfba98a7df070f3b6332daa446fd6236afa104a736d85761593e4b6daba3b84a85e2c87bec53d9cdc7a468081925daad1fc078b3ccc4a2079bc19046b375541ae8e8a61d12520fe063187e7b2c208d4115449eb1ff715914c6f25443fba843492b7c7e0a7c9681cfdddc93dce1248743a60d005fb8bde7e118589457f17883db94f16ff5c75d931dc2f12dc2da73f09740af94022d4e7cc08d4c8162de392b6eb0eca6932ba83b8aad1f540548b77be118bce2ee889c0a448cc92a77b530206bec3aa771d14226ec92310c157a21fbb60e920b33ce34c4be7d324d08764ac9fac9615700445b978ae08147b952fffc3d9958260cf39f3c737b42610acec5a7f6599ef6c297192cbf877ea5b56d09cdda12662201e401a8282a51711d34782e5681f9d9c3b8e56686c42c2443d77e7e62bc970fa440acd182362eebadba88c522cdff14f30f0c37e2371ad097b63a2ea31860096c1847976682a3da4310ca5ff8c22ebd4dd590bf2125e278425939222f8ef8bc462a838d017829c4f08a0b3943bb618ff5790af7de59e575197a4bb20546e45a0e8a788d0aaf3b956347048ffa56f6a20527005f468f0e8a230ad53a3fa006833a9bd521d752111b61784f91f400998eaf4dca9c2dce887e6943f2a7b1681317bd68295d16779ad8e7b41622d93be3f0ecbd3e3031d3fb8dd61a952fe9baddbdbb459ec56fcfb78612004a81dea20390dc1c02325e02b1ef131dba5580100c2d6822883ad9bf0b9e62f5d43fec234c7db9cd15e47bf1ed2da24de654f1ad0524581072b27e80f15a542cccaa1d0074b83e20524abc8197d64a785e3abdc45d682106144085b662855804fc82f7bf4ff8810b1968caf7cf3d9085d5ecf31ae2499d38a519947af2418720f74ab73b429a071c68ee0c70785efc33ae3022b0e18dc948a47a0bf7d8898f74abd0b7ecc361e37db75812eb7a93500e8f553fab805f1b1bd3e18c49ebd9ab8157240cd22bc1fc11f26f85b33ef7d563410cab55631a1ae56ba7d16a1c0d5679d2319cfcd4487d5c447d41bbbbc1f451d0f767cac9310eacca19c93deac6871a234017ae997755d28c1b09fdd632553ef49602a92bc432af51b45266b49114053d25de9a91a45e281eeb225f25024c51cb22e8c8e11f9a48297c7180b6c6c46c6c70c0e70fc6ce6c64606335e3ef6d14e421127bbf27934397a78b0238db036c28422a956437a9f3717a2b4582c84214514e3b949f4f57918d0e79978fb8d17fa8d78b60a59d28e928f6450ead762312045bf9f2a12e2623d0dfbfc68388803474773bf222601b100684a392519ceaa786117007d85919f3fbe88f20711a4193b26b833729d9fbde472d259fc928deb10927adafb3d697f361482cd91f2a25e1533f7015e57c5e234452851cdb61f981ccadc468f34c10972b4082024e54a6510444476f22b43922c9527f783d7c426ac026da7da4c8081f4b93d1954bb1ba3c39099672be777a6dbdde8ae653c9321c10a3c541b1982262ef830bb9cb3f11041cc32f24188227be7839a3878b26c74b1c27765173d87c207ec07c957ccaa416f7dc227955af862481accca522cdf2cd2b4a5568f03a6b81437bbb1bcc91b5632cb1a2e844092159eb7098ddaa4fb826a2f2baf4300cea9eb263d2111485904d85438840d604f4246d31e83426c9bd338fd2656446cd43157537c66013d1a35a551462b580e0903e2d4fef8f3c8fad60e2084ef6ed334f966d3bf46e8ae8e06c784871a1bb4781b9bfe211b403350766a92a1b7a9feaeae6d3446212728fe3b4fde4eb84e6b7eab4075b1dbad8faa3f7b3b9c814447a030a9db674ffb475012c7ccee5e0489045c62db972aa93ab053881b425382574253ffea6957609fbba618f45c0123180303afcdf8ae5104d91a1f21e1373dceeba8311db60c5add9ceffa1f14ce6f649a61be39ee3adba54a1005eb2c6776ade57e09593d35f52c4d8db3d45c1b4090a6e4711bc5b1cbf55335c211384338eedc0094f5d3801287d9c0088d70eae49d84efaac8002177e62490e13c91e16631960405763bc731c4452008a30f11c7804200978eebffdf0b47104c62a55eb7906691b5b6296fd503fe12c37399dcac2da23bb7f4ca75cc96351994dd4915ebc8030850bf4845bd79beb25559f90b7df660697b16a2753278195a366c7b86de056b228fe6fef050085fd47677a8ac6de36f60f65272b7a8b21a065de799030b3c62e21f191501d3572ba9e82bf4fcd815f41a3d157d877b70195092789d703636a27f4e9112fd6fdcbf8c1b5e31df88011f70d235c4fb95c61e74f15e54f2ac46448ed6dfb3c96b32f490775096ebe1114c263e979737501f8833dd3c89ebf35e14d7841efda13cd6cc30f3013fcd3c748ac9103d4a86bba9b63a5d67dab60edb300872e9531836d1e0fce6568c988eb3145b87e69f6f3d693185fccd7de6811fb42fc7afbcd4c1ea73111a37d107443bdd7ea87ee3d5f3880af8b8f83ee339a9620d4a71be470e0d6ddea37fc3d47fa4a17b4eb8639e96a9ac5e97031964de6b0b7da4ac3c80a82724284f51a9e6586f7c5fb11b1a6baf6c9e8351b86a3fc27779ac8b822409f8b28ebdae4956e37cafc2b7c25c811b2785117e310f175a347a61025ab227b07433f4fdee303100a73ae50d98ca716f06b30294669e530e0d724dbf16ec7523beff1a435f3f3972732ceb52eb576c3889f737dbc04779d6c02c621b7daad6356bfc7065723d2693565753a49f1216dcdfbaeacc7a4cff52570b8557b3ae5a5291592ec944e258f6e6ea4190b45c789fa13b174fc0a6742bee2811b76ae3575517e81657ca624ca7a00e731341d03c2d7b3b59193cc8df5f96199a0e1bfd3a051c02a84d1fbe10e4edde60c04cef415c584338760d9decc2488c71fd3572e62e406837625f49042e291052c7d275df73d097a81e8ff858c644ca4305b8c0f5b38b82951705da62ad9739ed8bdb62c82d7289049fbfebc131c84e590684ebc77fe2d84ce30ba4f6d80b9aa94813c430859ce633e673296dba9cd7212818db5a3489e316c9a3bf11d099886b9c6c38599642eb8608f48adf42e0c2b55f452c7ae4dcd9682eb8961028682dfc45403507c14b52475c9251db3708c590262f9b2ec4038bad2dc1ca837e913180e2c6d4f4c78e6d03f2cdb89bf20d5e4696e54c6855e1c11f870ea4bac9a82da8f2325df4694463c45259accf511415c2d63e9b06141543611bb2c2b51c82e6858172474c71dc3d934668325548299f5fe976dd6ca5deb130d7cbeb2d4e6a3fe608fbc5425d64fd09094a02be500d87aa0cd4aa5879359363258eacd274ad51b99587e12a5bba261bafb4e4ab4c033658c2b2316245c9b1b1545c5db494bb6c5d7be409dfa57d88b77f7c0a0ad36e053b3c1a02b0f8402924f3eaac98993d2f19e842d57727923aa41c158504a766c86f2c83af85b588a419eec8c1b457247d365091206d12a5f0f6758dd981d04d96c21352e9a0e1530325eba0f8d230cee283f641dc8fae26d8c3f1a2033667c3552ab58a816143368709c4eb0778397ec657db12e05fdf510a324df97efc9858e2260b5039a66f4b27a0aef0cf8519d1fb2898991ebea4376c96fac4ff3b17ea136442bed9ec59613f170fc03c0dfe9838a544e165689abb6582ef4fa029ab5df1bb34c64379447761c19e261c6b31f45f802e8de3841a23e31fdad2e2b7a59a8cd1aa4a66efa5b2a0372ccb37a040c4f27706dab7618d4cb1220d8a2e80ef18deb4312257902f80943fb8991eb705f0340fdd6eda44c4bb33f1867af834fc37f8f20070b0f4048ab28c0d1800d722d0be89826a39544af4870b82994ff1a19b0828057881c34a3418fd0862cf8ec97b946a651a399f091c5e37172c10faf905cf6c58b02709d635e381ae09d2ed168e4686fa53e5bb59e30f16cb8f878260795543372848e705b3da25061ff8b28b4b0ebeff5f4098f5c3d0ae41287ab21263e924bf8dd61aec99648a1f1cfa6e1d55f590c2f44e426fa9d695ad866cebb8e479f8eaf84d4be40ea9220551a9cb6058dc5938b5ea0cd96c7225e57ff473375f9b316d13d78cc52224bf29c4836df344b761dbe9e9b32e8f6087fe2cca4a7b3ebe2b26f3b28ff123466304b1790b8d08346ffcef94c8ded83ac03a7b7a00a2582f20a182cf1dbb8e1458374d084bb40616b66881ab680740f4bddc59cad121a0854805484008d2fe07edfffd823ccd010ca16f31a790d7950efd20cd95894859cbecf66ab5abc43c0e3e316574349d67d0269cd46b5c9726b3ba91831295e26fb662ea7115db5aff580f4ad626474d6ae1505c69d98d3201982b6b87f247494d955cb904c2180d77bcb7d2b37c143fde9d50a0eaed247d57c65da96e62ab3ee1add587a2bf9ed87b2bc55f32fd5fef7d7bea1f7862f0d70e5567d9c0329498f287e311f9b89353c2b50ac6de5cd1aed313628c8f2c8b1275ea56d7849f6cd05e1f7092cc04e847cf69fd0348bc70865c470562f385b9cfdb74d1ca48cd1f22b6e3bb2878acf6b0a74d2686b0072286569e10a6314609a3c6afc99c54669bcc7b2204408e84595623f8391f0c48da685f942248d85b47faeaee3d49abbea7c36468fdafd038452c318d105f47ea828ec2311b05fd4a437e5b69d65399dde72a61632aa97be03a5153a2058deaeb71e3457140eb3883a9382c7c66cd303bc69055005b57a9a6b1ce7d70985fbc0d4b05a28486db80c0e4db97f956da799c8d60e4bd8427f46db2a133928d50858ae4e21b5fd3606b5d29b4ae6ff62d76eca800be936668df4480fe5548da9afb9bf33d590bb4afdb161054da4ea7845ae89ec84aa39351157eea673954807dd0811a5e40c1491660ae8e21aba625a8c9f51f26be8f6a0f445b5ab4c58b5deea7cf3698842cbeb46cfd00eb59339a136314d3ae01ded16e468f2b6079cd46386d5502c01145a1868be228d4bd8f3f745f54dd1870c0d97c0134e6c982cd8df97f21fa208c41d559091931a67ab3ff2b2024d25c5a72f53252c3ed46fb377616ae5b7a3922bf2d9bac39e2d29d21073e8fff9c2add6de1fbb333e0202822a1bc9fc4cba24d6f9c693d75972e51ce4afe9ca3d7990568542e6254991fd2e18bbf7fb5da2aae4a2d740a34645e976c41e087e095036530133f71ca9e5060cf50170472bc3c08d6441da7926f4bdf55ffec12b8962ba484fb63322d618738cb3320a6a12d94b77ce791aa182046127342ad90b7292ccb1f94f3d8a35051b93d7c0e339a158bbc1389d163f9f7b61b135c2b2816d7d91b7881b65e539ba7440df765a2b98fe9a5953e34439b1b3d1c46e75a93c7e6f7d1e7490264392b1b0dc090771a5923236e60b08b220bc5a9fb4596f4a36df78fdabf68980649075cbdc2645961af2204d1913bf27091594b288ddc103112b02440120fb3e40ba09622157e9a0d4d0291e87dbc1e098247edcd8968b7d7030dad0a60c1757d8964493f58a89e5abb9de1f4041e1131b5b043d4ee86519f11e32975557ee88b00e55e5b4dc3d9a1cf218bbbc05fdb9021b09e75b45e60afab815f76f5fb23d9fd6ce56b540274d68f1785c21ef02f39489c17a74a3e7b6910a70df45be1910b84c01ed4e1ec3b41989b53b923d67b05d3a3750af871b90b3c470e1d0111f4dabd8bec1536fd2d40f2f9ce5e8d5c8e7662acc91d6987e000a857cbd4c3f9c8ab21454fe4eb943042eb149940414592c6eb7ff95408193941bbdb607e438d8de3abb43ef9775bbc11b91e34ac520d71ba12cc2be1251a9528bd5dbd91f1c343ed9e42f9b3709e16217085c923ee0e91d1220a5782901099bd1526d4f0ae5723bb2f9d75760cbab43ec6b10e6940042fbd61f4ab64e109dfc890cfa021b0a567a5f5ded92320116f9355efa3b9585f5bf5e2075b6ae59d203b24f6ee98fefdc4d00be86c1f0c58c8f89f6014edb9827fa4591cb460a743be36f001b0d47efcce8abef50cb0478070a7caab15dc631bb0f9fccd000bd71ee57d44afc70e33988846c31cf4e97eafd28f5f8402f03aa56cde9d9facc765aed0f5ebc10b20fdb367a9fa43fa5f55558040f94b2f38d153201102bc1fe20431fd854f097c715f3c69bc53c225c602cdf276e0ed37ecfc4b81c76b9ff6aa44fd1737644b2a330f6f8f0611e9c5f98b58dc782502dd053f1f2b141669a1ce1971b8c856325cac8943fb956d968ff7f4c92d2e6cccd23a15e26ef13971086a3229028880580fd896150bea49e439554f514b92e4b46ca9452feb14c9a8a7897c6b07d8495d90a5a855e0efed9023e22415f3a7001dcd979cf10615e1ddea905d5aaaa393058f52946ddc18d62ee65ad7cd7f9b984df0f7ff98331808241641756581063cad78fe4db169eca19d08f95e4d344559046a470aaacba0a604aaa2af1a0ec527bdcbe4ab2b4a7805679e5ce86f334a825c64ab2b7e66f23b5b130b5ae7315401f8d1ad4949099147c81400e3a7dde74098b72522e539e43ac084d06bc78dfbbc5a9c66d07c4bccd30bf3f3218f8e37d9839446ed687bfe448ef340396aa34724903bb66308bdd4290b0dc13b967a6e82e3cd1861cbb8d3249e8e5f25a64560fd308a994720fa7ad13b3e716db1495ea3d2c4482448cee3176b29865156f8b2906cf1298a45fa2c413b24543915f3ca522d70a88f8878363bc2f1303bb5832fdcbf116ff5109fd203f4fdeb3b587b57e70592512ee1ab1f5078e739f15214364fbbdab424c2677534b2d030a1a7324f4c7191c03a6c47589be595d1e95f19d480482de282abda552be68fae45346f4e6f803e35117fe42cde2307d16856e6a47b7d47395a95fa1109bdeb4f4c8690afb088f3d68d12add815d986f64d664449752ad393fabba8be222f9bc9300a6be4bcdb4fa2c6755ce6c715a6d09a039786297eb90d62c6fd55680dbffa5bce8be03dbec8dddcb348cb5129abf40f64435951d6bbba2de8a5dc3e6c7bfe827f31fd25e179a62d1f312a699164e1e15fcb1e3849095295eaabfe4758d9b4719db0afcc006ea6b9a78855f8e68e2df052e19ffbcdf587ed0a2f4ed05bae2a79d9194e30e7b5193e49d428a5ff3cc82bdc655e6de4b0ee2755d44d6d5e74451d8d58c35961323791f3938b696b9a1e2ff40c149c87067c6684832ab0d50cbd2ec55f7c22b29e7cd0a49df9d42725f7f7ce26b055a05996de247f929821539ff313539de0168e7365b09aa5cfe311034706b62611032c5eb9ceceb26186b5a4fe971c9e637ceafef2444a2aa03a10f55f730ba6103cb300e50c2b7bb9cc4bc8d1df007ad0ec4114a8e69db5a5b9fa33fd90d1ffaaf95956f1523383fdc0ed4795b2a6b9ea10190849190791a467c7623acc72afbc3c596b3cb5456d9d3254ca23a323cd7a03c804f36360272c3826362d4cec009e2015221fe6a00c03e82b200df2b10ca75ea12a2e8bdd8a6d53aae4e989f03557cd8f97273c12e5940c05ab6931cbbdc1ada48870ff06b4ea832957341d453247c4ff80948208e01199b315b0be238fb397c5d8546c223890681e26e336c4b28ad27cce4d40618b0e734219eac0fe58b5196151b27c1d1adfb84052743c17656b6de6959e3a78902adfc408095afc81b980560c0ee4590e84275293d1a5414d61cbdc6ea8df524c5e988bde94cc3311b48aa8b5088ed35c2f584a0c2d27d5fbcbc829a31d2e9c4028bf5e6756b43af771c88d062e021d67ddca7e1dd011c46a61b4d9685ee52bbd51481e889c20b9818da932e599e9e29a1ec40038d8f813b87a6f020f365e4e855dc10450e22c54746888a0e62a19d3ce51640cb88b7cc6a2f83a6d5da8004164f35d89e615aae99384a5e1b34c17140a3d23f80832ba4d325998ad0ad2e9858bc8c85b9d8270e4cdbb52d054d697c81e0716cc457f98599a696dd8393b61a14393f7208f3d15fd46ef36a688190ad0f2a5608a7426c5c86d202c1e347b87a9f4f1d71b1bc4c082dc332cbeff8d51b0971c19ff8e6bbeca1a66ae0c4e8630b9c5dc976b99a5c82a69d7077b4192580ff98e86f5deeaab59f4dd8de83d4faa1fe6fc3b9f0cf250b03c15a76c7927997b0250dea3df3beeb08939bfc92c0ec9f04f688a34a7260a99140943bd958fa1c7231926a73b4985bbabec85267e0314a43ee5f47e13bd58e180c5b9062eef97e1bbba31b3e3a8c2ebb7226082ada3dd4ccd6c737a28932adc3d0b5fb003d5199d77790e8a5cc3818be7a43c77ae97952089b76d08b1a38b53712bc1b3fd22f9c25aed8c2f75592edb8e69d3cc43501cfca66132e90989e2e0dc35b3aff951ccee4a6363ebf0632a63ae97fb9fc1e5cf64a736926f9da422d209bb36c25906812760ff9c99add365fd3e571e65b1007353e5f6ebe77ea3a26f97017074640eb99f58fd0452f2f3b3238fcbbcdb785e4330e5100af8e365c61417fe10b946d814d8d63f842c21360e318b369c7d2d087bb9c04cbae7a3055d75a970b16a56e5ccbcf6d28229c849daa53f993d24fdb93f77e06d8caf54e76cb41003e744ba3bd0765783db2420903647a214a4d052510da5e4987674d8b7c8e44814a4ce43ab2992d802d99a99e938fcf39a07a2bd26db1ec4b345ef18727635a41aaed1682530fb8f0ea335683ca74dfc25aea10a393ecba6ad1be2d3822bfbb2a8df0e9b36581f32c24c4579a74cdfcedb6324dd4b68974dcc7404913bb52129ff1740861084fa1ef85a47592e9d1ce8946b1dc56e2090f0ea823985d30a8b9e94d8aefddc4d81b15d7234e3422bf74b4ac6aad0f241c2eb3cf7f3377774ff4b0cec0502305fb00cfd5f0ac1cb5815351733a548cbc74bb462b6c16098b9754b2f29ea6151e21847042f81b23d5d540bca7317c265cb6ae4227e5252a3b03d1d00a2918d0503a2452ffcdaf116a2f8ff824fb61a04c1be9df069813b5d40d75583b3dcb152ad795dd71e68ea7826a382524e31ccbb36a6eb92978de050ccca7df61e5a341452b64f369075dc801d6826470469f47a32544a7a0f8485e7aea9c2555df6beafbfef18312151d002d4eee36f6e7118dd8760dcb0b4a8dcd73be29a2b37d7b1b845972905faad5a349233648a20aee661060adc331b5b9db7b81044a91d0823a6c089633d3dcb8255da03dab57297f2226c4905114eff2d8b6f55cc4ddb496c8b7c8396e27ea0a7b9e1035c6d8e3e13f5e2b177d0373cc39746d9dc08b2542b708367901b8e3607a94adc921ab34aa462f304a28f541c7634659292c12f524c672e4cdfd9d2f49019e2cdb8ef056e8ab42f62c06d795eb40312401ff5d58ef3dc0ee975bc5a88a68dd79bb14ba6fe6ba4cf03419b6edd6b3bcbdb124a8e67b0ea3dee67fb3d511d11bdb7dc3ddecab2e4fba9287fb81504333558595984a094fdfe979f35b749978b10b839b9bb829ba46b5c3942626c342bcfab01f23f1101abfd09babdc4364d1f446314952aaf1394a896a54a06d63b7d5a97a7b69d208014477ec50442b1736f5265995a9182473bd12c1ded30f657aee1220a9c747c9f02fe01f1090bdef3de81338d0202163c2bf3588987ec62ae1a4180d0332cc842b65cb7dd3f5b3b5db6aa2ed7efc88f8cceb8d7eca06f685493309d204a9e45f5b1b341e3a7e446280aa291401c3b4a9e245bd277e4f78462176bc2c6f33157211b915628b9a4b34151e20cd6e5ef4c979d76c880b8e998ef3b99ec47f7660aefba1df7784622faab315c83118a886df7846a921fc6ba09a2dd113b5a988e229543340b468b9085c0e44e90d5cc373cd93e293ca3e7180f66e54b12bb8a4e03bf822c12f4a080093898d53d2308b8c4ba16d057afcecb2b635669c59351a364ceedef9d2a89f213cf41b9014ae6cae7456649e18c9db7195fb62bbacebf6c575355c3c64408f9c4d82f036a743e1784401cb82417b3202d4dfdb736955ca545f2895f19b7e4476728133cab8911a89b4a02310e58f839ba8706a7e530bb02212d4ba2e395445235208a051c3d5b7299fe1c583c9688b94c507baae38f05f8cf18a104ef771a7f4738d40243a6bb447b51acb3cb1386b2f6de9f181618b182ff7ce916bfb0fa984438ad4711eb0539c0f4c269072bf3ff2fda986e434e60cdb949c144f94b58aa7c5895f9cb78fbd130c55530423eee1eac3b26b62b1e9ec8f755b1e8dd409394e7d1e158da33fbefefb8436a9193fac042d2903b4c95513cf45ecc560400885a1942a6cc564e81bda5d9d6f0950d0c14b00ade6a485b5875218f4b104ed50f61c3ef5c7b5c04f84fa350cfb981cbdc076fe626fbdcf295d3347c8fec5239a589923a1e567145eabb31c967e0d4cb0f1398f37c2c5ec72b5674535e98b972fefe6472bad6e68be15e456dea5fb00deff50dac9fad1710b7fc7434712784259297fab8bc8d4188b5719a9f856008414a59254a1fadf2a21358334da5f582da73abaa6757f314b941745a21b74e1ea71168c59e4f5c5ad0defe5160c5f658e5bb9d970f6ac2f1da2c9625ad83c048cde90bd44c70592aa34adc7b8010713ff91e7cb4d8dda2b3dba61e2b840609a99c9ad4c1444e30c84dfe5ededeea84f9398119c6a7c9f1593cc96236e058034a05c9f99ec2fe4f77d88584bbf2226e8295932eea5547ab3dd64691ba409fbe86f0443432d3d7507a1f610d5938ab0c24844a4e29ac5436d43ffe90b81613a6d7a2f1fbf04e8f107543af75747ddd81adb7f0399e3935258051c3be59fe83d68ed448d029ce8f28668f6b1f243b08ca6e0c5b134b1ae5564cb5b3df06f689b3b9cc52d8173692b52598544304666a25a2cea16eb0fec89282038afaf5c0f677e18af2741993df8ae695b6505f44293830338999dc7faf1bd992fdeafb8206440f48c968b3117595aaff050e54852b13558ce57aaf4c3a813eee8444a854ba761fd96397a0bbe047cdbc2c9cee80d86c1ae79a566ab97abcbc3693ab6e66736a1f49a5ceb31d41bf7ec437e0745da067208583a5598300d4a82b3125f444e1d7b0f9686eea6281ba89cbc98e99e07a7a15b6e6e2037abd81f354c30a9733e0ff61ed4f3e260b9d96816968df554bdb657991f578c689fb927c75bdd2da373fe0cdf111e2013b57272bcd8c4aef94e2ec1c04df8a605e822bf293b99cabd5c4433c21582a31c4f186920ee31ed52c23f8f2352bd8f3091948d236c634002fa26ca47a6f29a8f4960c58ec139ec5d0e4a8986f5c007e12affa7f0a24629982ef0394758f8fe2056bc06991581a8b60b96739cf8a206d2059a8e6c4443cb88e457828a06f9410bdcdb26e85f43d46aa836882440f789b68a182ec9ac2a689e6a93b2fd077a13bb631bd9b92469398601691a18f9d5881c997565ae3229d73e6859ee12fd0cb1d08732ac0a4e5e807e7bffce276f1458f5c457fb47658796f9c1d47a71781167100a9257d0f84968e7531168679098a9edd1c2a42b6368d1de1323bc527b1adacb49a5331cdd4a405b203ca1d7dc459a463ae63348140b91220959180a8ed4a00d914a13f573306a6846ee91ce0c05547e0ae1139ae2f89b9ae022eeefb4f5d4572377fe1d589562bae1a9e56b8cc94bbb7be97ec1c5e8f512b154451bbceff0d9a6111dfbfe836758d8c73cf9b6cfe6c4abd7ae9e082843bb225baf6712802c8a29a346dd8b639c9658395311f0bb96c7de5ce88991169c4b2e3866072b951f929ccfa1834516010097fa2239670526cf7860034a71e3ca8ec88c35275fc2900a212d14d646e3cf3ad143dbae21f518bba9853d177a2ad49e7c4a762201e126a8673e1eb70fe566762ec09123dd5a028a797993ce3673888fafb53129bb9195c49e7a2a5ee4140f6b48706ecabf0900c3abb2d21187478f246b025614a1c05cd34eaaf3f01ae69003184d43460046eb0c26a0c97f73d00bc659e30976cb04917d3a924b0e8415219f4202f8019b3d147df9ad768f712124dd04d2aa490c8dd1be03d524f5a3c2cf4ff5063978070a502a2e8f3bc273d18d91b1c3df3d27498e63250f8f75d2898f43b3b4ec897c57256d99d885ad925fe18693a918091cefc132d3f47a059c5753754112425fd89affd127742330e85f94790fd6ba82c6f1fe40d4bfbd3870542f6e9be846b17541e09b75bbe25fd76e8b76f5b798c08f6de9d86f780043b2ca3f23fe0e3c4200e93aabe3135256849d56e1fdbfa463652c77b1ef46d8a7705a5a30187d6b18edc60109c2c3872b4ed954201ce204607a28dd5669d6d84acee6357ec44c4fd7824cd42602e3c73fd7fd014412b2d2b367750db790f6af7d84195eb8d7d8ab1c1eb28f388647e03f4597f46ba96c0193e87ab27b799f298bbafc078b113d65d1f16f992fcc02b245f8f0820aa6500a04932aaa8267142b7b5eb965ff553eb13763d368b678e871ed62889629095fa706d5dda03bd858f8aa1c1d5cb718a1167cd7d329c1f2c08097eddf6fde3f069ad316404af266b1a02694d307ce0ddd2482fb0253a64e355bfb601f75c9799acd83da26b3933803b0c3f7f226f813769053a0299df5ce4ef3673997ef06e4df70396c3f013ead8ca6373df4c5861cf557dc4809a8eb342092e74956c3fa298db8764b8960753a05d99d0435fa94adaae03d3a2fe20eed9bcb35f5036b0a755fb80d16d6967eafa25d47122f2a136008b6449b969dd3f84327db526fd88850e4b016a28ed3aaa1034b7f30bcd2b35ed1558c8ec0ce3905f2b7051333b42bda0b114202d8311ea4dcfae40e045e344428467fe143ea830b28201a9350b4643ab8d2017dc34b09ed8196c5de6cc2d2bb228e5769e0972d95fd36c6f5f9a3c760b6cc53e4deb7b32008856842b380b259a98d186e9bb4b27b9b26dc2719c4dddc2a9000ac3580ab6e79486d2da7573615f45716dabcd18293e4cd568600d687452a551d6b3bd642adb5795d0a06655819a031ec728292071db86c9072d20e098e12d03b26d00b23d16539149f1fd3ac44b571818574c921bc93c006d882eabafc565a8db2c99a1d265d2adfae485ccb5889722c21aa7b48199c9c1f86726f5971e62d16e87804c35e548b771aa6afd84f3adfe02b6fe4c81b0d7d00966bd12af7414561b3752521c5b8fa7508dbe84e4b40eecdd8bcd8fd7b818c7a94e09656ca552e6e72a8fd398c42965ed0683b260428d38f5dc60031dbf6fd3b65d9bf99071738fb049ad6fad6440c5e8aaef09a43ad3dc307f17d90363411ba49e5b56d38a0f20a08bbe1b94ce2ea78b81ba3c3a2741bd3cd226b04390071b334d154a0dc047dd4fa64eb99f12558e3a3ed5fbc185c34886f4cd1ce761af1937165dd5ababd970a0498fc3c294b1500df2cac4679111231450653209b7d1207dd2e6f4cf2916784fa8c3f281bca7e5de61752f4838fd6f19cff0cc86b6e9914107552cd6476acc475d659d1860e0b7141f3929958ddd2a12f52384e21e6c53f39886a952359fb1f0ab1425abb09f63147d922fb17d5d427a3a31bc08e8a7d1e3a4117316896fc1d87ff31db3c17d56f7bedbb9603b3ce409d967190ad8ab5c04715b24bf4adbd788815ea8b55b2c6a68d38caa990e99872c365e9850973a839c5de4ec045339eeb7e043eac229015997809e7322fe53710602cdc69a7a1a398285ec7a238d6953f84b2e69d3f1aa7585f5484b6cdbcff348fbfa610acde2f16ea8143fb829d938cf409ab60c651448fcba018a526e48169856c7044d91964055bfaac381decb4ae388e3ff772c162e68d5e42120ed2b0b6c68d102e0808508aca3b632b31f5c283bceb992e804390db3b2bc010974aec6d119d98d8402aaccec48c26a386c8cb4a6466a1e44846d7dc3c3ea2a163ae2e9fe119a74d7984da429d6ca8ebda4ed95c239bc21851f0c10b89f108974cc05a276982289a85942906be56b22b7b79544047ab2927de0d351e2226d4d7841525a1e16438a08fa092a5acba8f0846bd21c456acf888948b80c59779560af7c28bf9983e8809072d5d71485b4bb185f2c631a57cf1c9cd1962949fab89befaa8f0ca475195f21bae4455c1b60a123ddcdfd4edb86183779a9c25cda418ec5c0eb3665bf7b8b7ec090099f039e74c487259837d7795a21999076b3468850e43689294dcf91a385cde1860692988c55c263f512106142b5f60f0adcbc6c01d79fc848317c59e6bf02c6ec8037313a07019b4be27323c93e3e3fff8a2ef32a19061b9b0eac9a43dd5ebd981a09fb922f0cb63c9330380adf575c1ab7805926ced78bd2b8006870ac7b18ac1389d356c0ae26f796dc710c79110780507f01ce6dd19ba9de917e5a1d8c668f0867b9f0467d16114017a1b5080da06f2cc0985b8ed95df8344e7bfebdce514900c4e844699031846345a21db41a47259ad58d657bd678a4f8162a6b60b269e378b94928b6539a690887802b2b48e7a151351f0cde24d1ba6bf19c8fe72b7330cadc60dc5799f92fcb1adc698817fde93a813718faa7ccea85807e648557067fd430b48cd3db372b5424e6d6ca4d2a6af38d27b66cfc1fd7775beea831f599e17c235f9a2916c2022fe3ee88d60e98e62f4c5a9553ea3a0864252735cfbd100ea2584cd173d4dda314c1371866dd15a87227cc8e3101b9f85a82144b4866248c20740cd2782c021d2b806a4660ca11a50b114cfd512109f8f90e21299875e3dea9d6d49f5ef60be723c6d98d47377a561db65815a1a997d1e1519f9913f7caf0b362426a7ab3da28db167fef370ff28ff1e57328d9cdc4878146fe23e3a33a08c28eda61234ad5e086c1c20144adbe8fcc556f77a08cb58b327a683fe1ff20858e4b7f1fbe28ce1323a4fe257a9445c5e8f56ade47cc0fad36fd4201e43740b99942c3af6c18487bfe0c42712f20cc0391ca6687bdfecabf6bb666187c88030b058cd8d43141657a3a84a7bd78453f6b9b2ec033b9e844fd53eeebdf5174d77bd8347bc69c2380639e81657b363741c3ddb7bafd32b261566efd741a5ea420ea9838a0f0065a5299d4733a4db17a095eafb78f3b47ade4b0be8bd75f8312e061cb2101e799251a5c18641efcdc2e2c144ac4a4603ed2962f5080cb3a7518605a2c11c87f10e0a5e54206c83aa6723b91a435f41006c9950a561171ade34c7dea37e5a4c4d5f6468467c3043b2ecb9b9313c3889f4da5e530b60328360a57a5979b659f8c233ecc746b35d36418d1934b0376e8e624245ffd36bccb6ef01ab7cb0ba886ba9ca9a2c937d143b954d094f69e017e527ed3e69a4d93129ecf259d7540281e7dd0b00aba3e854d39ca37240f1a18426b06492936410996242dcd392445b9cb0d3a3bf202c6bfa1f31dca7eaa6bc2a27f6e24feed63b651223ef9cdacb5223aa7370b528bf6f643b3bb17d1c89428cd85bf197515ce8d9b2d97b89b6dc3ad7adeaafbcb5897d5fcf94dcfea88c8c8595c965acc706fa810928246ac0bf3896c41f13ad648354f48c9f03a9ac36930d210a5ded1ad96e3d62d82038881f672914b09eeb551cf50077c174678044d4f7d30d482915d30b0415a18b78753185cd443ad933798934f59051152438dec7b67b52f1c0ed5fa14cc7dda9b0a9beb9d430ff82d576f9ba5458520bdde0b620db1f291feb8840109ae50eb304ca51120a5765f51a62b13167121544556c301b049972db513284e06d967cbbc9d561db57b7cf20fe20ad4d7e77d6d4bd9425cb9adda4f3a66977d33793569b3fc8b496867b85d43836cfdae36fd619e46da9c3b088e750aa62fa9e90a51f324b5014955f5b333742dff1eb7058c718d76439a46985f37d7b8822c024cccdece096aea44f10c8c9b499725f6c274109b4d82429ad654150d5dd5c39103fa2c0b67bee8d776a90d113e6c8478f4e02e3df7c60d7709bbe254da2bcc956f521bbf22fa07923a0c823656bd75a82fa9b6f139dff3fd9f9b0c30cf8b32556d34d3bfcfa89a436d8d90a5c0d9207343aff04a567f5f2364ff1ca22d88b7f58ff26124cc52e24fbf3fda7bb3065ec5dbb3ec0aee3f7fde01d7c23db25cb6616291b8aa1ed9713fe023cecf74569f9e62f753de56c042ed19a57cb3f330724c798eda7fe58bdf1845a604823111f9fcdb132a534d7a5f5d7c5483c58ff62178d01875bc3b93c2883abc3fb027c36aa0a5ed87b0bd930ca820187798c0989502128badcec3b11c40d4fb6d66171302d30a7465825198c4d738ed7169141b1a0285f0ed7bc5d0a2d2054a207a967cd510a38fa62134bb7954ce0dc8a446b53c0d3c1a12eeaf0444593fe0e9471184a2e1f82af9c0306cb90886966f191ae551a97bc91d34740707a1802bf46e04aba2740c3180e21c1c1e7d7e120f8b8e6ff160807aa9e9798566d3e331dbcdf63ce3431b26eedf76bd25cad2c05c16bcf7277246b2fb20054a74128d90211ed2143024adbf20eff12857449acbaced8c94602214d88a09c1ffe8106382bb5982a050088914ef5d8c52b75c8bdbc926bd860d2c8d6e8b339faafd4c5e6003b7a6ee681c4f60fd375ad7af2f4da3ffa29b9cb8f51f28e0b118e82afbd09276484c4f48874b928622d28e10cf4589a427482ace0bc8553156273eaee1eee3de5d54ecc225e216721286d5d6c7bb8cb87c583787c45031b907b5e917f03b1261d98463fd437298e37e7b5977c4ef3eeac8fd1c402f6110dfe88f6cef30107cb68e3f78f79c6c9fbff4cb48ff01465a3e20895a1c4ee049f51d41faa57883abaad40103b67d2d2ceed1349b6c823d775b17b1e4181b313bfa029640d660e969e30630ea280fbd6c0a3e46cf1242b71cf26c76989a9fa1af11bc8e76df221cea84dc72ec62ffc0e697a140712a5d291331b2ea824cd2516dd17911a8801139577c67ed970855e6b8c22e10c3da07b50577d3988b3b8752c272220e6d218c2c1d997a0783bd5cc0cc143ead85223adb076287b90bf781a96e322c2f9101709c782d183933b961eaa4dc442231758febc7e5b803e12876016262766fd5144ebfe337ff027e61c0285bc519914e85e850fc2a14991e33842d65aac607ee69a58e483e4508436979e5cc0887a6d6987a23977bb48a3b12991c42a1d8de43e6a34392d54ca5e9e42eacdc118927862ce81daf9999d150dc02536e74b8cb56f047a653213a147e0a8f4c070c650b9952f3879bb45c899f9ce3892108107389d3f8a9fe61b6f99e1598864e88e75cb8c95acd2cef894ff75de6dbf2bf2b23634458341d06fde4e3872c6adf7f5a2676ac70b2e44cc8b14bedfb870b185d7905b86561c2c766c5eaea75983daee6c971b415e8717a0d1971018dc0db8052e481b66d1ae9e5d58344010e883a6965d44e5d9af0b762eecf30b869441290b5c42ed8b1e3dd13fc5482147159b1f45528a72df24ee68006846a9d294bc9ed12545bcaa118d681b86b628c3daec9de8ca726c3f0df287724c1b0d68b8ab3745e01eafb39e372bab8dde12a9e8ca9f75a2e6c5e786411eebb12bb4bd59924f2e5af9557087c0a146eb7e2d2d294a61628ad33993c2c0ab9836ab1b2fad71aaaabfeb7d307b5572f14139c72b2fa978984ad925ed49afcf2a6e17187d1fea6ec8693e06967fefd2ec2d0e2ce443728eb16961b47926deb096d3cb50eb064b2ee9fd6e9e2c1f13cebeb9d11be2f0fa67a541ebbffc4b28bb9cb361c4c265fcca7ace748d42ea1e1de621f2a11e47530f0f19a9c3791468cac42cf3c9b9746b43186acbaac00a23d335e0593e3578a852f27f27bdea55e60f43d4eb3269ba9862be7e3aa3314177c0226e92862c34675d1c4c758ae764dc56b2ad592ce7e7f96fadeea8a04cdbe2bf57e74ac96f582733d3d563df014b2bfb8bfd8f3c462e1fbf24cf6ce6005048bea0fcf641acaeb458f4ba918b329d076db74810406753999953696fa3305d4f8161046af9c5568323e111c589f3ea9cfb87745d8aad4bc41b5320b13bbbce43315c1393bb467fbed1127783df4e13ce5de2de0e3a9b255d981f78600fe6c0df036d26a954f72e8acad47f3979ceb5131ccf236e1eaf505d7df492c33ccb892df07d10c7f57c64421238fb7e2329f98bc075076f9749369bd3cb8fa18f725e88403d298921dccd20c368ddfb818c36a943db0850597c19559258b334a66c44340aaa0433653728f7d6a679892b05e834460fe73706d9486979fdb8140ee0e0437649a1566f5c5bffe6f23ac158a54daeb827664ccb332deda8acc35fd675d73430b01c002b55209821b71a1b6a0d28a7aeca38dace4ae85b42b8919ea29022902a05551a46a47f240caeac8bdf2f6de61396df8e560d731e9358278307dca7c73efa0877dffe2218fcd331f4edd1c97e159450072652e65fd928a6eb85e138008f0ce6cab8c2ee655bb9c03942181adc42628df2e1125a104f1cc75b23fb6960dd5b380c04dbcc0557b8e8a73a3dec6e418c068a0d78fb2759061737662a7b72e5012fe966babda14b403eae5c257be234b29791072e3866c18488727bb5e4ed2645e214ccd7ba2f096a3aff6e4047f2604bbad6d1045f2a0362e8f3b8e08ed29fed62648fb663284503e273a5288aa1e5996d265a1f8afb638a040ce27d51671864b40af6ca20e2997c1b64eca91f1805e432eee716469d326f5915721811fda5b6894b4aa0546c3e11f2311821c3ccc19dd92b7b1b9053fe4ee0d9acb5ebf9bdfb753b79c6f1e27b94a39db2a2ef9e44f8a7473d08338122093931bdf2e629b7595a9b0a2bede947e1ef23b3b122da6478dd83de55f567634de3415f1b6928b3d9d597e8a0e6a8d8e812071cc52cad6bc16c2a040a45c015b826ae50481f47f1ffc68106e34b958a8f95917ce311de7a497ecef90383101f8e1bec209a52f9a3c30f2f5a5ec74d24dedfd06677d13a04101bd1b8c6595c89a183b2c15110323ee7046b9261b3b88430be7b06675fdf7812c9ac26eb80e457b069936343e2450e49d1e3e85d0be06735e84c044aa777c3c2c9dc5c9b7610e1911f78807a9260bf85a02ef3eb3d7506e5b4f3a2c8fdec063c03528a9c603a231843328cd18c24f79da5dcca395c78126c0d45ca9017cfc5cb6d856119d7d09353e794d01aacda1b3c7b391edc4e69cb3174fdc781feafc4201c42ec0f2f4582ba54ba51584cbc74ab56de794c35bcda40eba674807fe6d17604c5ef146f4ed3b068cfef2fbe84778ff258bb90f3018fa8454d462e04b9cfeef74768c750241eb4cd6c89e1f97e9241d0cec22d6d986b4f61ea0dca639a17c4598fc5845ef95e8e3f85768afaf1584b75cf247a62e14857eb97ca7a90e8ed1d243f2fc66502779ec41c3b79da9e207b017dc0218a25498de7108663401d56f1dad5ade66b46208919e909a9d17c622e1a357dc6a03fa36379e55305c15351d9981aae6ebbd7bef38eedebbf7b91c19a86a59dab9f365d6d57ba24d4a7c726a8e3bd3e7410d32ccf8fe63100501d94c53f4a56e07514f1cccc3d901c33633bc81a608f65bdb6e424b7a49db7bcbbd03dd09f9099609f355f5ab291c9036d0a279c8448b26137db8b8fe833b1b683edc8abfe738cf8424d5ba83844bcb8d279880696204256082a29e6002a6891194808999ec0834212f0449d5e7c42018dc793b0191a6bb3865c7243bf7de7befbd9fcfe7f3f97c3e1e8fc7e3f1783c34f6f67073b901811c704bc21e7b5f4e088c57ca7effb1c7b46fb758088cf7b967c33f3c3fb643ef72352e1f5c8adee71b2ec5d2e7433c1fbcc9d0838330c0839e1b19fb7bfbe1a0672796b5e7508a364ec673d3d87643924a309ef6d96e09c6db5cb6dfdb887d3818cf61b7c22245966297ca649d598a79eee560bc0f07e37938186fe3603c2a332266ba652f6df2acb5d65a6b2d965d6b81346ee02cc971b9418107e090c08d1b2e0fc071430214d8b95d9c6cbc5ce97e88b571e34adb8758fcc3c6b871329e4f94d10ea5e872325a75a1f7f97c3e9fcfe7e3b99b9661b66a9b633f9fcfe7f3f97c3c1e8fc7e3f1783eb7e5860b12db517cc84cb79fd00dffb0871ee81666408e50f052e451fef990a70b7f3d64c34118e0d99ffcfbe069883de8d8092a5bf888d5119b7816631f0e7a9e9024a560140c3ac19fcfe7f3f97c3e9ebbd5961bb702c160aac64ef415d25f4853525252525252524ef35024cfcf249ea34ddec5a5e8dd7fb8128cf7b94de162dca2702595a3dc460c852ba5bc8472959317cf4f7029c5e5e41e5c02e227b7295ca9a67a8d0b08c4799ec2d55487d94bca63e0d29ff217d03db824e3a05b199ecb3810310ec455b892cce73f5ce53073f9bca5cf0db9f75c0637e43ec681e086dcff70156ec83d10b73f70a51f3e44e550ce6bd56370a5181fa252e5ec1eaee4f910150ca528f370322af7dc02c1c9c83894a21f3819199b8c0c1c84019ecaa1147d3e64ce8c9839c31f101cf434fc0307bd181cf43c1cf480e0a0072529088c7b82841e230800fe4390003cf4430cae4a5149e687caa1173d0d1f6638221472bd95dbb74abb3644e531c338621315aea6bee29ca072ad87d63acc7454de0571d03b49e1a07739e87dbe9a6f88870f998f781e99e4000020c4d1c3a0ef4c870ccff3140e7a281cf44e7480e27dcce72707b9c4c49cfcfe734a29a5275c8577bb0706eb9b031aea1592a8dfea148c577f71b04a51c55d28a2288a921d8508112224262626264810fb2d88f52cc8750dd6ad25ac3658db0d34d5298aa230c3116ab9f88614cdd75a6badb5deca85a0887a03a8cf1b417d5e02d4e73d8a9a4da5b070860d7acae578a3458aa604bc0618d152a9ee4260010ce010078b35c49926f4dd8409254af0f11081124c2851828f87089498a96cb021481ac2e2d558966559966559c770e8baaeebbaaeeb7a0e7b980c338a5574e4c830ac44b0214852a1875eac10426837ca35d143c704ae63d7a1e5b0c74e391d1acef076ed50c786358c61cb0ac26ab79ac476b124777798c9f33356eaad32c39efddadf6fd6b76b5c8c1018efbaf620d9b15f2ec8bdfdc605d96e5de38268bf827cee81f12c07e35d5c0906c6bbb0935b8b2bc178d663e662bd04e361301e7698b99cb474b7c24229fe6467ea43e62a57d80999e93f78c810e9598f26efab7e4f857b3c91293ea2438667e118ab614dd3344dd3b40d7717020b60007f8705f00108014f1686360604eb155a96d5f6722ba59a976dc37ef13df9c525ac54f3b2fd04974a18beb7f8e20f895e093b90fb9363f6dbeff6fbedd5bf7aebbf908cc18df98b3439d9c3953e2d1f970f8639d9355cfa3cc33ba428bb07974cda3f38ce4453864b508a70b29f7c473b760fe4738bfd83271cfb0fe67ce08e66cae20cf44e41a217692e9424e9d14e388cb3dce56af63e1cf4322ee64812f42afc558a732afe42f31e0e7a31490e8e3a52342312ebd37a4c836559961573a24ec87237a621e64436c439b40553b5878b2de814241eb2c8f07407239925c3d31d9064dbd65a6badb5d7755dd7755d96655996655928282828282828281285ebd38593e72db7c4864b4c4c0c76fbeb169673abd35d3b799eac6642b1b85206f783a7084fd0334912f46466dac8bbdb94e7a3c9e3f1783c1e8f47e6f3f97c3e9fcf67e6e4e4e4e4e4e4e44358bc93cf472392040281402010e843583cd0e7238d2441af0b611886611886b5dc7091f348c8f91d9204bd6e85257ff0b4923f78ea5038e8814eb896b93f2ed72d3343516d92a296514107695343d12d90a60c86f6c70b6d732da7dde2b61d263b5db449cbae966958088c976d9a668234a68d58c4b1893792747123b191a40df74c1249d2701b394952869b468a7024097aa13b4f9770bf2893b323d3024f2bef2eac4c769ad4c10e79d8691b2d0c345996655996659aa6699aa669dbb66ddbb66df7de7befbd978b26993caf7133d1085dc26d815ffd6e86129ea0a771d0bb2441afce8c839ea6699aa669dab66ddbb66ddb7cbdf7de7befddb4ec8634b0c30322a0a930b4b119e05cd7755dd775611886611886599665599665c51929a25122448bfcc524793e9e1e93f4082a191293e7e3153d8a373dc2a5e85d314b22fbf678714260bc88448ae6314e853efb864b3514bb6838e6baf50c0b81f1228d4a0ee859f8479c91a279e85df88775e80981f12c1c8dc0680369cc7b3205f7833aa738f33dcf7969baf32c2befa291381373105f1061106710672a18da190b2c134f2ce17e8739f08471d0b31cf42e0e7a2d9204bd1b9c3ce1923c5956decd5f499aaf92b48313c1e733a0811d91b66dc3fd8ffad08fcf3d70b316f703fb51f382ddbacacb7d76e8c178d88ffbecf6e24a4260bcedf61857aa9900f6eb352fdb6b5eb6db5fdc8fed167b3057b72b61b5691cc415df0b86b6b5c2cedb9a17945b2fd5bca43c54aa7901e2b9f652cd0b8c9fbc04e47aa95402629f1d0886611886611fc2e261bfafaf215c02954e0e3a0c0c4b352f9f5b4fc147c1f79640b8748257708b144d17299ad65a6badb5f6d0cbfe5dd3344dd334ed43583ceddff560e8dd7f2b39c359966559967d088b97cd0b43efe27befbdf7de4dcbb80b4519d0c00e0f88608714cd5b4e890c6860870744302f0c6dec0cf6baaeebbaae0f61f1aed75748aabf90e4f1783c1e8fe743583ccfeb439054a1f0204d0462fc7ae9de96eceff56b71f71757aa99af79b1ac9af997cfaf6b5c0cca539e713127071de362b2187becf6d6b87870297a9edb885dae867e0b6ddbb66ddbf6212cde9682023af9bcdc7b70e9e2eaf321209986a0a8dee22e14d56bdc330ee32c87a165599665591fc2e259b84ad16c09471276f5f3302a004221eae72b48aaa0a87e7e83436c9046c55f8541a11e51241893c9649a31994c423c18ea8ec7cd5000403418daf60d16f66866f8796b86a72e746a7cad524a295b4e4a55d5ba2c96691ecd032194a4523c112b3be67e44641608e1a456ad8fb788648b03411a201bf133eb618496e18fb819e2cf014f984c377bc26432b940c88def9836dd88bf1a29b8f49d2411d1a23e1659b490db31b78999bf5a718f988fcce8914ac52c147f44e478f92a4917666951ff941bdec892d2be94b22fa97ca496729f3c0c29ae84f33db998e561648c775032448a4d52f4b22cc6656fae8917ec192e1d7ec32c96c39e71a59a7ecd8bb535d8768b4bd9378d63b1c72c0bb3da2d5cc2aee16ee5e2ac5b6b65bf70c93ec3c7b8eeba5555d685bdc225cb9d72157d854bd5694571895a5ce542d554afb8544dee859ec225faee79b27046b5aeeaf07196ac8ea5da32f6f5f6e2a01785252491320a4a6092e5b1aaa50c46cd4ce1af653029c24e505c4d855ecf6e2fe69ce1c50caaaa66f44133f50830a0499326558c68903333314e8125d7e72aa59c21225990f561a322065b08a182c913f8104513bc4025990119646e86d0832cc8a1494b0454114593207c610a2eba60c215ac0adce00b6f401284269c81055fc49c38b8210c36d0a1820b96a0046ba60c7c381205175dc8811b9a3426e3052c5c41872f941421c9e98a71031650a1041e6ca10a347c21e11b88d08215b0000c5ed0c1144a0883e747146080c3112514e1c2177d80b2080b66608739bc200b499802113c9a04253155d8023031434d1db6d8c11759c817f461a50a851a26cb79fa2823577d72dffc8d79594949497c8a6350f8883d621d6613b03eadcc5eac5f945531296a6863b05bb74a5270459625911d21e3178f4917dcafe6d6b42c4796237af62d1d257764eb51ac6d3f1a007b7c318a8fd8eaf9859966365cae534a2dfee1f9bdbdb81fd8af6bd98b7d9625619f1dfeb0cf6e2dee8776eb1857b2ae6fd7ae6fcf38ec1a57aa998075ec352fd6b17fb81fd6b1bb71d18475e6827dcb92c86e7ddbb224ae6b8fd9cbfd715dc31957e3621b062653535e990dea51525c7dc5dde8ee3daaf8ab300f79201966ea0bef3ac51f014c96f8c87598bfd00442d5852dc58414450b3f21a38cc54593144517298a5809298adf818414559de5c1867a04e5edd1bc32d1c46427430861e5c1bb50110fff3853241ae911459daa3c009a215b8ff9fb607490ad4361ca14f61901c7902d0c61101f7db50e438a4b29aa7a857557513034ca27c85b195a59599122f9983920e6e98048d55094f5d65aa5484e49a5467f438915497261912424483b9670fb382e92143d792424097a3a30a6b8c74a48128c49de45e2c8db7a48a3dfc1213acb5729e50c05040b6774ef86b0330c85ee9d009cb8143deaf09234a9451dcad7ea42603cea16a7824b3511bb5438469e4efc831e7a15fe31278b2451537677c3536c69061bb3dd9ce81199641f32f765936c371e9d83eae88e99114db2dd20acf5dea69fcf41f1c4a1431a1048c37437122a9d2c3f25d65fdc23d8e391ec91c7bcac979cca11d4f1116de223d7532045fe6aae2a25416872752c7389f13c66bbfdf5798cca54a9df7e5bc68f8dd98bbd15922239710f978b2b7eb9aee112f60bc3db98d501a5a8bb4352d4330784598efaee99060b7b4467a64e95a8e046890a9264ea7549a64e4f9df298af24eebaa3de0f80fcd7ef7050afd583e81115a975ea97853f184a714771417417bf19d9c23ca8d7f3a03e23081c6f951e916a3b4c1bd523f7f53b151cd4eb2be6d1a77010588faa69bf8a3f984a7e14c628aeb349b708b45092ec55fad595241579ea9705331b2e162ec524a85fa51a897bb8d4c62ff5169782c8f07ed443af9eca517ffdc255f50b57ead77350bf6032cc2456d161fd7a0eeb170e4951d6b7b8ebcdbd58b7de595fbed85bb814b2384471d6af178aa2d6750a97ae14c95fd85a556551afb8045fa857b854a5489ec2558a7abe5bf241490c15d993a1929815640b09603759816275d982eebe37f4aebf225f50511c08ebc6728a1a44f4e8fb0a8b12130f727f56e10747600312e260052bccc16b2fdc8421670e4f28031eaaf09090bf822b335462a229839d7088be703e9415b62066b4683e66ebf14848d2f5f81d92648f3d9e0949f23cfe0949ba8fd9a356af71db2bf7b25dbbcc6266a3da8cfb7c7b4dfdd867b8b4ddde7eb8524d7d8d4b4d3dcc5eac7b7029bbc5bd5cd78c19966559966559d685afebbaaeebba2cc630cb0a034830170e0a72ae69a3d14e59290733599aeb64fdc8a9a68a863a512039d3246168bab0b04755869fd4959d5ec2917dc49f0c0a7f3032add4ab631c8434a068cb31be5240f5485f71100a41f1d792ab5b4ec22e3ee3aacd8818e32f1c6fe15ae1cfeab68369a3d14e59290733599a4b8b93a5c58f9c0a065345439d28909c69925ac0d0b4162d3862f682853368eaad6455c191f5ea15245daf0ea1026244214030b855452fae82a2aa4ad216a3faacf0b7237f940f9abf1879368e9c523695212ecb2b81c21ca7c71a225630bea4439f4b01fda3656c214327b66549c25b8158c3941305b3433f6c4163a06443d013d018141029daa44c405595355452068c4d564f540158439da9b504150057b0a4c993a5e58415e2c2b513455f4ae8532f125c310506176c0e4a9e2795f56153b480e1846ac546807508850bd909460c149a35918134205228ad8776722d7c6b29ab8d89ed732ddc9eb922b81e2378da54c1213c21f0dccf0e15ef07041f2a92a0b79de450289aff42dbc912271492a0a78170625c100f507605caa9ca503e940a8e209684141b20b4940fa4547b058c4853eb06a3aa245502c67545682604491e0879560f00104d230b4300a81d00c008e659a310801d20f2170a000702903facba51c9c160a8c051edae6e4005a36e62e0e41870847587692006d6233a841f3489f21fa002b028c43c96811fb47903c44a4a9607022a408b42681800428b0a90d50faacbc8130bf5881e469697315f55927ef25b9eef0cc773f598e1d89165648a79c8d33cbf48536399cce467c9c494e9e594524a4a650c1cea8ecb127fcf3ce4e9e7558eb8dd490cd3317ec156488224ebf51455b15c2b562745f195bb14c93550525214f5212c1e856b64773402a4f1d5c722dde12318666195abf08391df4d2f6ec542362ad45528fa58c4ca36468e6698e1884662bd8d55c55555555555555044a56856185ba5b2251262cf9595957c447b3c2422fbd42cedb298665996655996755dd7755dd765adb5d65a8b611886611816654003d41596cbaab552b4a93a583843891d1b6022768d1a3267c7dcf1c5fdfc91ed71bb368b6535f2869560e2892ccbb22ccbb27bd0db2069d3a86afbd7f49f8c3c3184a20f46aeff606448e393b1711b14d5571cc5695c054519b743097b99a8ae416868172e8c02138c44810945f2ca12172a5101926cdd625989239829361fea91b54257482b14478cd04af56ae50be56fa5fecee79cfd8bf9b2a719fee8b15ff8cb1c609dde7ed76f584e0587c5e3c2473eb7300420b42ccbc25fad708deee6250b9e61fe564897857e6e3bcbc18409662f317a669e5f91a40f6669b9e1f1783c1e8fc7736f3ed4adb068dc0110b0426200bd4c558e5ccca149739cb965ad3852519d09aaa230c57aa0424e39e5ac6e379ae5b8a7e152f434ea58775704287ce4fe76775dec270751dfee51c98ef294c3ac87f50cf778d9eec1a51aeadb29dca31ec32f9f5f5cd2fea1c2250597a287823917102e45ef046fdc87839e5b5de32e1455dfaa073263d87d541b124748a3bab5a4b277a233760b5b4638350869546fe9253db29674d7167f301717a2a2bbbeb545772123dd3517f9d36e72e350112adccf5a92fbdf894dee6c2d696b89b5458f2a7cbb8b5877941d9cc0c51a7284d6e3ab6c698123618c4db5beb97258aeb8cfc2f9ac2c723f41970065f918a241e92b050b67780121bd841042380f65a4264c6374ba8b90542b8433ba56c2fd2016b95fc40d08f4a88e6835fa96a0547d77b9679d75ee74d15dfc3c8583014d249e4c2ace3c59da40649fcef8d13c379984ebc4a434b0dbecd98779ceec886e20b109ea9d1dd1a6dcb8091f370b314bb9676e09cc08bb89829c1d41735f66129899ba131d5bc2a94118fc031be316918b9cee20d4c246c4895e7407bba3eceeeeee1e4072cfd8316dea0ec62eba8371a73b08bb83f20d39b96b7750d67a2f08494d43456b52d1039a2233b3487775a6bb3aafe8ae5a965ed7755db7b0eb9a587457e7a9bb6a4577d5a6bbdab1b53e75571f85fbf58926d7faaf4fb9be693227279e3974c74a297fbbc32878ca71e649bdb91e4032ed1133951200e509fa6234d6a49014cd265d9f57c9fd300cd4dd8d16c9872cfcdd8a252856b808245ce98495a656e80a287f4be4f908ca134fec82e694d1a449131fd4099a6777916ac1c219d68889c17a43a42a05790c7f218bbf7b51f8ab6e51fcedc8f4884faad6aa56d8099aa94c32713ac99d6f91b3dba669a2d0346d3301e95d2c6415a6a0a2699a66e2583b594e2eba9bf85b62eee43eec9c3c5f9ac9f343811479f6e43e6b49863d6235c9efdfad3cdd6f6689b19dfc5d5396ef2ea870235533cc289a6136e9631786dce425e64e9e58e5889e380473274f6b67cad89b2cff45263837f994e16312247dea9bb84492a097a3b393e1a50a2efd8c948d1d618c2da56cca554b194173dfb6a41557294d6c4aab96304a39b5d837dd45aa5254a8d61e5594524a89002b8a4e8a6774477514eb3207cce88ebabdb00a0b415294af6257d5d4acd7eb55077557eb2b1cf2d4c2ef8e7a8c501faef5c662858295be344f511456d19e1dbb8a8eedf6bd22491baeb170df501a97711857515914ac8d1d2d8d119bf2764a3cbb6b236896a799115a8e9162b3094bc1485153939192d5acd78529acbb18a1d935c61823116e553515016aaa1c21f3bccc123f4291fc47849525c494522a4fdd62d15d3c7d7dcab1524155951c02567900ccf25bc4186bbd3714fabbee5bc99045e588cef3f33e87fdc5be3d07f62d7b7d8eec7556cf415f1d266bdfb8eb95b35e7114573fb917ea54752b07e355f5d42b1caa5e6b552bbe2cd7a5e1d257ba6a3de3aa631c75cbcd5b1cfde45eac535c82998dd918e560bc8c83f1ac8bd25794b2504ae98a14c54e8aa28d524a29a594a76eaa0fb64a5289faec389bab38b83de79c73ce2ae79c73ce49af4df8c5c811241f6d674950ff519a3fe2e6891dd0990b7598bda4527aa2144dd44bd54bd66b03993240ea0c10cc0807e47602fa340794bac41bb1432d5ba20da4d1578ab40069b467294ac3c53d983c5b2b1ddc5077d1aa3bb897c5037bf5e04648e30f75d607f7abb588cc46cb8d1f5c0c401afdac07f5a8052f2229d52351b91d52446f638f98b580342aaed4b4af12b58034fa2ab3629513a471b1caa9d463ebc12a57929c3dc12a5752e92105241ed402d2805440e2d56b91d1439dac12e95b640c35a4d1b71fac7220cf8230cac55ce11011d2006195a39e45c12a273d9b827241f2e4d3117a526068d0c3aa60b1967136284f2a8f5c7a89e47e2010cd1e92a258c27e1fad8e18238c1912da6bdf0ef5a394b27568ef5658b21cd06be902a441dd4eed2b418690465fe37e6cc7a58bb5e630d915a35455adcb6299b6dd0ca3ae650aabc8269cbc2d401a52e6e0ca7f5049ff8bb96f1bc6d6be11642871166d94875fcdb485a26a8b66635b270eaefc577b0ac9822945ed110687e84f221da4316fab8c05c535c40ac162b22058ed115627ec6bb9677437dfc4a4c76276215cec7d1a29c951b7d5c26afcab94d5722a3aecb303915e7619cb03923dc3359f1130f79091e59da059e223f731d381a2d9cee4336ebbe45eb26fb833791bd93db71af7f9e75a8d7c8d0b0a2e450f0504facbc9517069fbc9e5dd8e71d08376565b76b77cd90c833daa6e7457e196227070e96dd55825b16a6215c52a8b2ba20838040669545855b1cac2aa0bab2c5661589561d50906e24eb80f17f270574af98c6b912279006436e0117b8cfb51b257f3dc8a2bee2483dd5998aa556660bb1e4aacbb38299df3ddc52a319cd14c90b267327c774739050ba4886205130e31218d78782232500c11121344059b9661f25a968da515b61b86ba83bf51954edd458aa8c3c72e3f575555a9e42ebf5be9e6e04db69d2521ca02a44155aecb11565515b37886998d9803699c7a0b20a86edbddd2a59abeb0ca7c7da96e710948e7c10b129b7835f1d52956e9d35fbfa8c63d5cac3a71e7c1a3aa87d3dd6e985975ec7ab52ceb7a4582e1528c33bfe6b4d527cecd7ccca2474be20e49b22e0bfbb4381597f81ab35ae79c93a2734e95a8054843fe66957eb4c911499673ce39e79c735293ce1b9973ce39736453422e7aab9eaaaaaa9e42425914472355a491e9ec8e1b9c9b2c96c41d9254f5fb2e486015a7e2525ffda28e591c536ff50de9f5573a2524c9462749ee13d4b9b9e1721365a468c6084dadb756d9340e968a3d671771e397790a972e6fe28b2f4552ba48d2bc3c129707a3a7440a9b3c800c9544d18352f464a4571202e399609e9ebcce5ca6a9c6539b260e41263c5863cf2ce4e43e5c011c7244a2240a2a723ff6a04736f5d64545defa5489a7af92a0af4e5ca926e21e2e168e38eec1e45138228949a468469161770d85dba7a897a237dfb7ded5bbdf1497a2e7522d951a23608631c57d4b3cdd549c1b97c09c1d4ae4448a8b345cb491a22452d4f7fa5dc71c1a0658ba14c9522745dc8f1b52244f7f7831b3416dc067a7310b4843e6cc29f461c420c6b61bec119c1d230e600b58847043bf209abac854864a88c8414281d30255a67c0d162284c09324726f864a8894217ff712c9e273899cb01b4447440938f309146d29820811b43cf147f11233f29c51100902911c588c48116b8944615d448254ab99d8da826face0da0c95c8c4410c27151636ea6429113c33d4c2034c5694ca18b1b43aada84c14d9171a6575415b33430d286ba880625c38540cbaa12e088886fc75a72e62d393007ace98530c137f12c7a03ea92ee439ff988bf8e0a9a5bb183348091458c873fe70081ca3c8fd4212d768517c732bddd90c9540719a6d00816040521155468e528abbc48c48448b4c1358865c0a09128a4b335402854dfe626e95a1122880903f508ea71841acd42d432550d4205f192a8162267f41d8c0f66d98c7ddb11042d80d218410f63f0821840d61ff831042d810f63f0821840d2186dd0da1ec2bce629992520dd69c98ecc3fd82c854102b3dda4ebd468fb4534bb05027a247d7a957d5352ee340dd559fdcedaeaa7eb9508baaee2ac6e00c0af380a776020e0e4efea2e90ed1144dd1848373eb92b3b0ebf5aa5e2bf6880718971c0c960ac0213ed94b8f2e047a64df875d4497d2792ef1b72237fc1d84a51a2a10e88df27e8c39392845da1c49ea2acb0e8e1a723fc824f7ad3fd123edfd528fb2774d390cfc419d140e857be94e1ec421d19dfc095781eee43fdc0e4843dec315d19dfce55aba93df388dcb38acbb1b10e7b235585222d5024b552cf207bd9075b8d5eb3fe8056402996459412c6e76ec256767fcfe0bb1348b54c3fde016b95fbd023b7a24b1f795e8917c7f891e5def6f5c0d2e088e456af8ab39b37e1d4ad2b5aac5ea7788c51233b4965bb017c54d7b6ac8ad6efdc3a821b7deaa3214aaba4ed67ce18f254b8bc3f03c712189121b23966559d6ec992ceb993ed526818ebdaaf0e7e35fb4225b0a7f3e644f21d353f48cf596e9297a866a2960cf9c2c2eca587fcc6c5cf4473c3fa91f0e6b51750f577d468f285c1df99c72474eb0ccbdcf41dc6d113d262f4c71f33bb9cb5089cd4d2e02922298b28d4c0640864a8630876c25467b306924156d24660a7791eeaab74c8fa4a070cf7457d97f3d434f594c61d029fc693ff9971d7e4edde33975503de54366ebfd7b0f075bb4fd84832dba9f0fb9e1cfc7ccd6e9bfaa611f3357d87dc85c616f0ce367ae300f0c57d3c7ccf6d387ccf1d01ee22fdaf414510116e6615f59cc239ee68ae22a4e5c245718533d4514e27a775d77a15c9da22b4ae4b9813c631f6684f2a7440e41284fcc8372c0f55cde525cf5eb9672d43f1757bba33e2394290758a72e2ebee2e2a5c505e1e1aa144950adf77e35f74c4fa1b54708107ba43ea93ef53e0f0ad76e0cb7ff6159d62ce5e9e763e6f87829d4cac28425c61863aceaa7858a9214870917e26c1cf95e22df393d82279d9c2cdf70e8d195e57bc70d59bebb6812f5e4db0b2a4f4ce5f83622df34f28da447f10959be6db4c8f26d458f6692255734a96241698e4e7402132f7a743ba6a59833476885294e60c04212b070853778126e610c3ed8e28b2358e080099e8c4e381d018b1ef50d12b268d2a68594399e09f927e4a3a94735649064f928458f66968f33459a5479f2918aee932b869086138e4c8c8eb78031cc600b4a5a80052b80c193bfd1a3784596772992e55f7ae4c9f248f820cb57a049d293df80ad21a57cc834ba590e6126cbcf0802e77e35a2e90e557051a7a8d9a92183845511372010ea4e6ee1ce0c95549193bf1a4454b1c5c42c5ab85f8dae06ccf88b916b1563e8df1a39c68c1554f185fc754c78e2566b660f57a36386e7f9e564a257b280e7b991a2d824d85be4782564649263344d397f6259c9392d49027172bc2145f17546d61bbae95c60d48939918b9b1b9c25191e891c9df810bc59813748644c92613cec3c5cf4228d1139c3820c1f6524fe5a26c71e511f55b3331b94fb9ee9f60f947d31f207ca324696ffeead671c8c1868d7360edb3898b51b38b06718beaa75716d6a9855dc31ddc5a82345f115072306978add0593eee2294a8beee2e31248a916382ec9370d07c16eab51390242296478980c67d8fa6ccd4a557abd8210c7e8ceba756abe3b799279c80a7f15c257990d08a2551599d87f52f29035420a9ba408cef7881445e12cc9b999f2e6ca9b1b0f6f9344462452be3ecfef56aa1bfe82b764a4c9f0154719288297df7ce339e5e7e5794c5c053874076feb5727feeae76d9da01c3328534432fc85bf6aa5008a208e387a81558e989f0ac54f64eb9b12c3e47bf546030bbb7b0af137e7f3949179cc860d7b34fb998a7d060be168cecb1abf3e1ccd295b3669a280e6d144ccb0a5e1ab116eac3e3a3340a620b69c94aaaa75590ccbb2cc06fde442c3e669de485276ca5f9d4824c99a9932925473a64dce9cc9c9d18183d491a47aaa3435344d97c96927947397d0e0549bdc2699e4a34c524692684e8e9cc9c9691d49a2a71b49a23452d43fed9c4e348d434303495466097cc61d8ae41b89244d9d9691a4794aa26313a2e92e4b243255dd9a91a10b7f575ad64ceec31d95b3a4e8aef1b464308aad182b26f7316e5a0145f40a2c72cdc9c9c9c96d45a628c8e23a9d4ea759040570b02a4da5a9349546765192a2565335555335492d4a5554a65cfda34cb294450e45d11c8ae65034275a9129902ce869ced3e9148b0081c3a4a1349486d2742185a4324d652695815a645a858e24854253079e5a6e42a179f31db76cae3e216221f46e489245bade87ff5632b45b8845bb2b1956abbd17430cbfe3e486a731d8e48e5e8903de0cafbf2a65c3df649a244bd8658a44968fa23a9fa8d933513ddb50b58e176d6a99be41d3a05d90e19b08dce991eca24793498faa9cfcc91dba051c82bac95fe8095394e947324035e418870c8f842451362c74270477be500e419c9091cc083a438d501a8a64ee4c26d44465268e245136367389cdccb199369244cdcccc2433f334336f727fce4812dd994626cd4492fbd446ee4812c5a137f44493e0c81d1cb983237768b7eca6282ae200081ae48c44208df91500c1036563634345227902c943c33674e3e0e0e0745718d5317267e0db2449347af0878f5bc41c49f21c3eeac021be80435c877a8874c8f0b10d11276a519df2d73654cc9149b2d6f2a6f27095144da27474a4111d1a1d24146563c3c4469aa44cee378e245175c9cdd1c97d8983bddf369244433a17fb27978442f7b6925ca15061957cc2fd2a191c32b27dcce9adb50cc71cac5a4a6f2f2e6608695895d24a4692aa225d15c95dc9e43e2c22995019a9a8a0aa2255118aa2a83ea8a0aa1f70830ca836cc80b28212281105b28c50344f5925a0b2232a95d998c2d4c959c28da774747474727f47ae2a8a437120c4c30ab204e58ac2188034e6211a7090e5236543d95036944d6e7806981c50335545cd54d44c45cde4864a60a0f04c9deed08742f742ba939ba3f077812ccf650b8392243d283559d1682d803640a1699a060a14abe0886e9050983b73870e523ebee525778a9253ca4863c4c21133c28e464a69cc228e949ab774f68cf42d3d7b34634662e18c2f4493fb767ad1232e7a94f2f8a9d32394c74f38f408f4f8b9d3a393c7cf2e7af479fc64d223cfe3a9a947f7f134a647f4114f2f20e87e6636a818e5afb515bd92d2cf89c7f3f1a01c663652ded2767b8c5b8d31c618a57cdc648c707a91c2d5a370d641dcf5130efb87b3f770d5294efbe5b6534e4e9ddcef6fea6897b2bad5524a296bbd8c55cc151f818165eec138847104c6ade43e99e44a6bc3dae2b372721f06776205779264e34eacd08eb0454ddb5ad3b4d634b96d9ba665275674d7afb89324dd61f8c4c68a2b6fa3ac1ea110b3143b8a822c4f739ebca8a42a5a0aa39a744ad18c00020000d315002028140c87c4a2d160a0c8d13e14000d7faa4056529ecaa3490e83308a318618620831000000080200190568b5027f422c579c563022eab783bb6fdd973a804b396c87e9234450ab2661e9ba633df6097518f869ea41b8ebe0d5b0904a396c4da672f4b56a1c5bf8656b2e342e04b6f94f1d8970aa66a23ab0a25a2a92f7b5d244e78a790c1e78e04ba486f1259fd015841ee1b30fc667c39eaede93d544a30e52ee86a7c85e6011e435d0b54c79a90ac549506ccc4a9fce4a1dd5e44675e7ca9a90770ff1874f7cb26e465d66d3d4858ba963947ee6a93c40c0265a71cd7407e1053935eb3df2fb5aba767ed6bba27f4aaf3832f71d17eeca905b9aa526ce53bb6fea9c6056749463bc19d6894afac8bc72d54649c59ab62b3fe7e73ec4f689a96a2b758d1659355aa7a32884a8d0abee7a1064d6f998d6d57f279972613c6bfb9dd7ba593c5ec4da2267d2689a64f414a96d4b43794fad54ba0a1fc0351bb2b8e194090040057829d498c03cdc33e3d29afcc56a328763ca4a0246ddad1b5c04dd0a570fd08e3436738e54b019570566c881debcb6bfe4c084d4a642190aa76982890567ed685f22ef921eba22341cabe5143e187e780a70cc46912eb72a6ada92a7b469e41c9025a31daaf9ac6ca8cb03ca548f526b7d996a0d1397b9eb67c73459f0dea6ec443d7930603ec605e1f76dea0f629385120d2317589cfbd3a90b1d4ad3c3ce3989d39f446d381a54a2f12a0e2ef12b100be0b5a1891dd522a49b8aa8624d6395f0f578ef4d2dced2fbee41752478d276b3771068356c62752d099ff164182f8710720a4c311e9935d8ff2f026c31a20de4b0f2e743559294af80b60839921fa0695dca9ab0fed372d524092cdc8803e23d98afb13009e66ff7d15c81889ccf02c71b05a562afaa73f9123300a31bc0ee75090c05f88599c781f1b7cb1ce3a67ae63b375483d9585d78005d726ea0e80c4a6d061220d1415da1dc8fc5fb86a7c1ff4a19fc4085f92fd69fd80cbc066ae71aacbd12e2d04e843a24251c0371799c1f007198fa559afc7098869f7aa8963b7d38a0fb4f708a2c4ae14391c24562c968775299ca793814a37105956cba488d5023500f27d189ce0e854cb736fb07b6aade1d13d9f9e7937a79898a0059166c822d06b4d86c6044f2ffe25244533bac6be9411a6619099459d28869534e6fbf264f602adec3a7147ff03d037cf94e81bde08d5f0480fd0afbbac028f20f79bc0e63a3b7836f43526226f1093bf81c02fa775d67cd9b99414c9d60c4dcd4c66a15af04c024cf7d585f88e2aadb824297b90e818a7514da1975ed65c568442ac3515cce098a5d3c5f7f745d321cd4f322dc182c3559b38c3801949dceb17024c3e10462899feaddd93fa3c5e1045d274c6927ea65d00780da76419fdede75cd1ed6db9f2c68b1b8b137f094fa52ddbea0833029c5522423a5a3b9bd08700cceb19f34cd41f7a52a70fa3f400020d8ac8da8d1dcd8c8a1a0ce702a4603bb8473e472ba184c17a9153e3248e2216ebc8a09eb536f2e10c7b358cec1c4d1d0b043644ef8a13b2444f582916ccb1a8b4443d6eb84eb550ee1c099d25f067858ce2f03b4d6bf596bf9a02ac02eb32a46857c3c2c36686c2a576003de72606fc2cf560ddc0bcf330be316017111d009dfed2d49b745c5bdbc70ff71f10ab60a39eca569a3eef7555bc130d88bcfb21d6b2dcc91a1b17142f3e84309e2d53011fffc4e67d76692a08fd55b1dbf97469430d7ddbdbc26396f9734f772d4ed8e8acb5dce3b042782953bfe9c12c4a133b9eaa093bc8f5b7497f28d99dd36cfeecbd11ad9723d3de2812dc63665240e27f2f31453f132918fefeb6c05c9426d5092a4702acda3d33f1f1622747248742922bd96ecb9ededcf7e567e4093abfc1c80b519e83fdbc3cfe6d09c6835d14a2ceb25fb356384ce091f113aaabfd2878a9e592c436aeaf7afcd72999bfbcc219b31c9bda84ff017beff682eb36ea46ec7eb87516c52a30e954d0c71d1f3f31ed46cb72af765b7a97e82486ba32dce08c125e288bed170fc4c1fed5916b9ee0168d36533d6319ee1823aa8e8a4d36cb0639530d6de60523730c124586f304ee9a974ac442aed9c0a5242643c115e50784f3b3e9967c159fc799a6ddd6d49abf7070129ad085913700d716668e33cee588987eef7bd54878f8a139ee8c013aa84ac85a0ee67ba31c172be6ec7c1c9e2e921e2c8f23194cd9eb519a6fb70122ecbe3c279731fabcdd83d038a21eca6cf2f7c7b77ddc40faedab1b4e7c7c1b5e4c273ee377fa80e11adedd3a69547efc91608064d9279c335926e858f3357f0d81dbda7b80f18cc63293469b48a3c2fa171b330b1265c19b452b9ee54f0895de71ce9cccfa0a256879be96ed06722529cdb384eb8f69ca8944e2da3dd1365f41c7f1048046a1671400d082f764e0b9e1877ac8fcab28f3f0fdedb9f1954b8f741b54c7135af3cc8320b463c6b34c3e9b9e2207aadf935d54e2386fb6f6acc717760f4d455067c1079d31c43fe2255a0712b096d1ce6d23f7fc71430e8e1eb67baa0de1030edeafd494107de136c86b72fba54e2dd4b96cabfcac33102e1e0563997e1f0f4b303e6b35003036cee9bf06ee7b512529f3c7c4002f1f86a9426649b5bcd3dc08ffd302acedd91597c05ccb23524338989b5b2fc80b19994baa2b4da05d409ff583711079f549c940cac94a6692d7170aaa0dc1804124a1b3dddf3f11ef66ba6c6e15b6a35cb998964ce262db5826c6550b11cfaf91ff2cb63b93b109f24f8d8b3c4aa67f56fbc231ea11c5faff240c86bb04fea0927994055181af5960e0aa98e4c54e38de26652d9430ead24e12edec5028a3b9f0def6248520b985dccca5b27c9be5e8df72f6dbb8f914899a83491322a281f5fc2ea87a41c5ca508f5307aea69d12deb32441ec2301ee5f8cdd832b994e876164d8dcae5992e7aec156e239f15607e7b2cb9658986f585e5cce18300e2556f311b7549799b23acf7160d80958f98baac9ae109acf8c20417a3835b756dc5adc035c297d17ba35096d5273d4c665e289d9776cb98003703603a49e07c0bb083a7a7741503dec257546fc5d26c6eb24ffcc035a094da3c05f9ef4e24420b1da57c2ecc70d78d086ccddea3374fbcb6b417b6e9b908d3a9b02114127da5b43d453e2637418e7b90aa4c55330b441e0b6c9ade9aecd61a161483cd0e411064877c4ec0eda430479644a51712c37f978bf1866e9f0ba472d579b7d9d3aad8c88681f3636d89b6832029b00f5c05fb55c4f68ebacee0e452f9703014a7ae91ba83d72a413562d7e2586c0e6030dd3e0b57f784d708cd41d91c119d68500c29021b61bbd5f09259c457af8eac876fc86ae855180b3716ca6177e79087de82560fdbc27f097e63d52bd47c886b4e079448609a6339958e9db801145529c2155136230064daec73975adb3290c3eb6cd07cd60758acf40489c11642c6ffdebc5eec223b5c282847574e9f74c469646a991600693829df7b53971a0c7986cbe80950ed5575f9d0bd8b9c8213f2c2b400ef63a86a5a4820512c4536c95dfa6144b0d29a62190152a0a4af83def4f3ea3c5afd3df9758e6080e94a83971557d9d9c53faafeed717c16bc079b1311157b972e96dc8b5a8b04f3d0c6a101141bb3ecc14102246cfafa35c77e6b0ae6b79f1bb72172123b9455940f448db9abc339b167e200ad6606d372fe2dbd11236a3c1d3a67c13349b6c258baa70933f430bff17ac290b4efdb30679949b4a624554351bfc1c741f4c3b58f77924792bb69cd41e8fabba500ed7e89560daee2d654cbbaa98535e5594b4ba253ff3c8963fe9eb08564218af40cad4f941fc6bbfe855091eab6779dabe028bef39e0146fd24a6bdf3616b9d426a2bf1b5e3c01fa914beac2c59996664cd92217b642c603eb216dddac8d93739acf3275da2e33066b7bdbba394cbe4f5ed8cf5bbfe6aca62e9ab008dff1cc34f1bbcb08ad2cc306a11e79d2e15dd0298dc3a8803d54b1064afaee11b505cd1108888011a1a104509c8c72542a090c666257edad8009e2333e44970649973b91c31a1a9a947fbd435067c99f5509e803038a2024e4193e0dd013e3220fd231b9b66845d97b35ebc3034b95ce167e83addcfccc768d78d19581c9b8c115cee252382ac07585ca1a7c620a8827fbd8e7ff03631ead4a82cda984f51ceac4cec4bce72c13617444d0912360485db4b30f4c3fa6200f395c15e1a993bd59e3834e3b9f468a5bc4bd3aca5524da32aa5f0113f27eae49965d45308e6d314de1b17da5b057a2101cd4501bd2ab3ded84683133b42e8414a3d7fb0282e26ffcd7007f9ba084c81b463629ed98352ad24d6054ae6f14fcf65cb9a182870af84f43b8b4b931d6c371113983449ae7569032aa713e49267399f684f5e1ce34cef266a2b3ccbe7dc10c57a9618129771687b34d2969f4afae974bc080bb1562a0d45fe5c13133acb5acc26cf90453aa2b9274d1604cb626884c02ef152424480c85e784beea0455d68c8ab8fec1272d5a6c308b3a41d5972d1b9b6b6645ef6b98c8c86f04fb5fd31ebd43062ff6bb6824f41c0e8eb4549b2924a947a743ab5ea4a27d823473d851f68b3e150c27ad499e2af3378ddad240696e4159ee1b8cd40043ce58cf16983b72ce8894c0ff67ac8a18afbc8187fa93f90f1a7e00c38619d3267cee4cc1fcf17b44baa6a5f5dd885418f0e1fbd802272efa8de60bbba168072dcaeb05118c9368ccc4b25170f93894d4e0e961f7e49af34ffb57e767b46146811a4eb8045ec92382a9653f12b22e31f11997d342a932772f3b5a0e4078ac09d8ffb2238430d94e6e4c7b09ecf38414ef1971e6561dcb47821dca07172b603dd4c0c52f1f744d6b689e0639b03909f6c5935e4e4057982fbb2e93337c9d1449869cf48a8e1cc8e9c32511fca84e685ec7e0f209b99e251091afbcb7e76c9ad9e1eef25243dbe8dd748bf074423d105a8edcf01abf48c9d3f54bab0991cceda60b5541f21e209339bbeebca59e502f3f8cbb5b141c8cbf7160555dd5b6f9affdf116b63e2be6c55eac457618428929c427cf1d2a724e79e69cd0d2113ea20a165af5bde2a7c3bcaad982ead5e9df62fdf65be3c8ad91bc08eb3ed6e22b3d1f982509882f520ebd0595c1083b4471b54ceff69f3248d8d6719d06c9930f22fd1fb146837c160151bb767d9f2fbb1345da9056f2ab212d0e05a818d858b9295e7079c2fca545988820351732a2c3d01f90c67408ddd047a7d8e6aaee4cc253bd2af9ec3429a0fe3ba4aa5a62a1d6c093b188e3da56d6c3773c79d0850943a40a1984b65cd4a44df2981473922c0f5537c3b57c72a9648f2c09b96024ada5f698fa4a3adad8e6f397c09931c4ef4b03897b30561be4e170ef1e16178eb42983be100351e3ec1b527c7e1d79ac9ebcbb3beca2c9fc145ccfd125889c707c441004145848d437a83914234cc601c3e21b52e316939c5101167d9918e4a3b2b6b00bd23015293518f9e083f62007b6561803272a991e6b7760020709cd3eafe1ae392dedc7178990deb12047b1ff7d671b6a25b4b9abadcd9877b1e5ecb8071aeb35429ed1fb600526f0e44758ec8258dc0954d89b302968efae3a73a07a7ec8d2dee51c47867b499e772d6c9c87a33628decf6dcb46ed613a29c54fc432adf97321c868776130776cd2c0e2482d6f20ce61e050e9b4bf6a3c4c995c7dea927f117e115c4c29da26996fac3b11e59547a241a7ea13bdad86fba57e06bc56994f08328507975f11aef33a57ca1de6a38a60a53163aa6d48fcff0e9058d71feb1c0ffed8f35813518ee6dc3fe6aa78c66f24f0bbf34560709cbbdd54fd44aa7997f3d69555327b5dc3a75fe0984365c55fc866fd25804f30953120fd1814c12b7bbff43b994a18f74b67699867eb0a049e578082fc0692826040e6b29b393bc646e15a5789fad9509f0bb43142bb243e7dc4e102c55ae0b7a06102701573a43ea9c7a4a875bec9b55db1abb0deee0c68b38fa15b3f69bf6bc29e5544d0668c7f7dafc3f7e459499004e9acbb7d1c6532561c69023bc4ed5c2a92d1a083f922de678cf5d520cdf511321d9b87446c3a428493898aaaa5359813f28f8cf39737deaef2ffdbd19b7099e0f98093aead437262ae50c914d793d36d5ab4c12760d3af605fe1b87641beeb0844a601a9575e2aa999f39fdb0a37d531aa03cbce1b22bf29df011429d13395155a5d8a6b8c425ca11193e895ab45ffd360f97a0b2dc01d5848ff49967b3389fe6c6670fc4ff1a89e33a558bf1fb91c58fe4730c3b2bc10b63da6310fc3a09f1eabed8808d5adbabc0f3d44fe596b604a713b9912e9ac30fac36fb8f390b350b41fab8e905dc42cb246b564c04719a8b4cc03ce676727377dbee8881656b633b1fcb6e86aaa158bef4dfa46f06f00985cd9957cd14ba5b62d9bbd2e1eda61c6410089069f0396495e594cef0f76e384fe82d04d8aabcecc0862e05d7f88018af3e96dac573904349c6f4ef3f812e784ef156c77bb8238ac40689f52a5595288725f5a069e5be95b86727bf380e60d933660e77d3ae626c852c5c579f2db5e1b9232b70309041adb4ee2e8445b3b1315ebc0b03271941e5ca084aac7b7a17a4c7784652ef1839bbea9a1e94704b6e5cdbefedaae8771e24ae64baf1970c8b81bf7cbd85f0c0df3de039e54f47f975fc3d0560388250a31fa3033dd96d1cee2bda97eef41d28cff4d400d39f14c02212705408816e02837f41cf500f9ea3088ef8dc0c0622ec5df4feb152a0f60e81acd542778dcb3fab1d95518bd70103f9f61164fccac26daa5271def8f4bd2d78f781b0ab2a1951efee7d6944d23ea8f24f5541a4d993725c807521f498350af4c01ab91224f8d32372e51f487873550973ceb63b085d20d223b64f502a531017920f989af22319b5d56aee9d2745a70f7fbe5321195761e653a809d064b4930e8a2d00394061375a1033324c8565b6343273e916a22e25edd8d0022368d0716919eb719a7b1461f13a7b9f8081e205e866022b55eb3ab6297042bfc0f553adc30db917beb54c1d2958385d310b8f7f0ad751fb64867728fccf34e041b9ea7d161c06fd7bd539dd4088ff7a7dc8cfe4d4a4b8e3dc35594ccdc07f5a0868d96d04bf70ab492ff9853d2e5b0497d9fba92930ba806b1be4f8888311b249bd2703fa8d07e9575efa27775254a1aeea421cbca62f52b058b48003220da5942ae16ff6b9f88e09b20b85cc0dad3ef8c0bb353553afb7e2ca33c3c38abb370c3aae4bc600dd4e922c4eb480d9665bb91409f9c22dfc2c2665463b76017777e8580bd585ce2cacb112535831b7dbb1605e992134fbc8fe2d5b2d09ba2d14fa3d98ec9d128f67fb8708903e98d76fb2b775858807fc16355404400e1585fd9a3c983ab7c06c866f561fe4f8edc269647c925942b3d95701882ec04613d35c7fc92a827c749cd0464292acfff724c406f3d6ff6e69518c475a287b5561cea8056ead7861d95df1b8ecfec5e1931e912b6157b877f34e02847099f57aebeffd04b979676a5d03dc644644ff8c3eefc16a492ed9c257885c291e6d745dcb84aac6756435d54233f85bc455df53e015cbd5f1283c694b8b60acc03e6eec9cc695d4baf280bae136537647637712180e563279e76dd6be89a96f62abbe47e2b46aeed3c7fa5574520023e6d59ca8985e91e98249f8af09dda21a812eebb8303fd1134083aa39281686e0e15ff0fde70f31331a11cd95be14cc6b05def82851d7d4e52975c6c0b5459aefda3bb6aa23a448fceeb324283b4729379eb0e74de79a074a5ccd7944e0c866257bfdd01cf410403a209ff0dc143843ddb79a4b913ce15229bcdbc50feaab56a569e8cdfebd74e42895b4ce60cb27979b3467cdc5d8a26045f1e469bccfacc47111f1e881f02bb09339c0f816ab8ec5fd2698fd49b593f3cb5a52b690ca836f413eb242c43eea249666559e2d491657a41a0204239c382f15f47847ac37980bd80ba6bda19cad26089768a5e91dc528307b4cec92eca5c8be2e2c57d66bab83412603cac8e4a05127743915500581a931fa7efd8b72196cbff2d7fb75be65548802e6a72ccaf626878ea7fde277efceb701d5947c28d059a983563bc01ea08bd111129d5c960640f4d3bfa1d06cda0383c98503358c5f783069988f4d6cbf342eaf5aa7ef5c8e851be12cae4aea324e7494ad946089928ae48c88b6a265e2c0354d13d8b50fb681a94234f7a1b53b671440a7fa69c5cc3f937517dd548d7f4434619de08b81029652d2b33e6125cca6501338ddcf36292ea0c0ad407b317ec82b70800c19c93ce74853219aedcce218c223d642921b8a560a58828d6b5c060384e581ad07b5e862f11f4b0e3a9e59b82906f6e7655006391407376b1973652dc225cd27af38f7f7fe01efca79d46601e5b14fbf1227166315a889e9a785300a91fc9091f044b83e2570308b90828465a07b7ae2efb1ccffd94ce9f6a22ddea2d5f5fdcf2b029194924cda6a3cbcb870d59a358568498d0ee8ee2ae88331caf5a5e1d24c76ad2514e536621e89b9cd37a80cccc64fbdbb441f078c25be5c3b8f9c561231ff02a12735843afc64a95a19887cfb0bde122e53ead0e487861c3952496d1a72557e996c8ee85d89805c0a513de95ce4a120649f371088e57389c78773ff3e018367b1b2487a78ac019711347ceaa93b21b93243780ed5b3942125246ca2993f173e86a839841dafdcb59546f16cfdd804b04f1e8305f10d0bad203d0273b1e64f476c1dc59d2fa1a661c10576b85126bfc7081516f103f38baa2c879a1d8c32615c885a012440ad54c793ceae1228955d2941869e022824d3b200b919d27e34468ad1d426c78eafbfd9e69e29fcf88133ec0bfaade13732f30301979f033dcf682d4497307b8b84c81982fbfaf2d14e1beb91c83bbbcb19a9d4fb77128a0ac45cc804ad07f906ce12e5160d1051d36f4f0935b4e40fd3c176222416e3010871188c9c1aae1984be02aefae755cbd2198a77c652b8235bdc245076dddebf86438528c2c60291586398234c9a54901794d39c57e7fb299a1c3eb417df618438d9dc5f3392210c4ba3e47c3d09ff49687d0f1e58acfbd535b1f0387a08a48aacb6532b8a8775da90a204b6c66951787b1c12bbebd2f3ae04d7108161c0a6baaa14c0298be068a9f3abf76032c8112a0c2c1825b4fa4d30a028e8a03415d6ea06757bc88a934b7ab1262d2e5aeac1bd60ad11ee0f40a2268988b7b8a56f2f114cd4ec74fb05126f01024c5c18610ddaa1a7b2c791bf5802ec873fe0f526883c0a8412525ec7839c9422ec30c1322c9ada5424730aa3aaaa56da3dc16cc9b7db0c04315a81f1a6800497167c170a488605f49d9c656d0ce63f3f1362bdb973ccb0a063f56b03a5b30f84ba4fb4a205658818746077ce9f056591f7a9d36613d5770bf61de82d7a07ada54973998fb07476ba527ab1473cb3b2fa5bb9ffea29a1d2d995e6857c048e904d86d219f9b77f3cb58bc66f8f3525ebcdb4a7adbcfcce208db9d99bd0cbdf93baba7ebb5d041baf695987b4be7a194ab8d12b7450b4c8367fc9a0a3f0addd1df514503cb8aa18075fe067283080e0783a0e15a07158238e0cd5109e233a5a993b3f82040e46c31dddcd68470122a08f13855c8a6cccd11ca5a223165b2dbd4169261f3743a0d61650f1fce62af4246f8f06326bce092a0787ef67e7c076abb459aed2e1d3c69aa6c41aacdc35852a57777d87d0d1291f44b029d330123d83a9c17e87fe27189a3444f79db1361f349b1d9dbda7e0788008d7a021a3694763de9cf5c5d035c3926a74852e6025158626189925b6e3cc75f621ba1409f5f5f7f5ebed5ce02a718582c15ab011180f81a99d1491656045279685516574a16e54d8d870dda944ffb1b03df664dd16afe89c064083094b696c1d80819671a03b55289c4848564531679e03f7964f586e0fcbf6d0fa0130f3c9822c51c9c8473a4732743685ad47a12d32bee5d77a9f4369ad4a8edd0bf2e22fc247340f617c3c2b2f7ddda6dc3d622c8faca04604e60272e03dc54a9b50e73527c79e0080740eff38ae89c696084e1db472e5503130f32081a2f24616d56f011b5fc15e0ff0ddb844d83e87fd7fd4dd302ca0a55b2610e0adae28d104b94a114224c408a21d8152efc46c8073a0bce02c6b603602d372f694960728b76e0f86ae5f5ed982a7e195cc3d6bc78e2fc0dcc08a051a2524a8681fa12a12074d5c508363614e8f9fea8d904d5d2f5cd4c3a5eb156fcfbea893f612ae5506852e0bfca5e7d4d5d3a210aef5e613105eccc015e3842b3c0274ac8da29b1305ce383d2061148c2a2266f82a4037a4a78fe9a2c7d7acd30ac273066eb130ee29d2860643e9d7a8b82f4a6418ba3ac8597ec69b2d19e8231f9983d4a790cc8893bb09e88e959479f3be3b41484c2e030d2f39e9f052817caaf46b4a5f8b760359b486e734dd500e7df9acb6bb1c63f0863105ffcfdecd19a35b8b0b900d4a9704ecdfae9e74772d8adfc04d608c608c070d803b991ed195ac89682417c6d3d800b315e0d0f839b9c8f31fcbca18e0b1ebd2e4851cd37096b89050eff1cbc934dbfa07b1eed589474903dda049f6cc169b6cb57afc9cbd4d50d8549e99770b4476bf6e288d892e0db6a88bd5ed291b720409dac5d936e9417903d9cfc11b90fd2c11f285025c86025865ca19efc78a565b31f327268c3f7018dbdeb9a79abac3cb30ef491fa14ac316487444dff54b2b903e7774ad56adac943ab222a72faf9048bef1cb3aad978903f8f94c46a275df23477104cc0154f07b307ef5838000de9380661ff05d6121c8374d50b10366c50a035f708d564102778c9fa34a9f49a9d4c63b6d373c68ca42dac43f8162b72b5a3f4a784c57105379950a23e65f6dc8e35e8a292d2c999bb26a71efc16558211cd6e93865f4ed48b5726dc7528d1e0b04d786a90bf9facf454dc30d8ae384d44f4f547fafa402a1ed52d09e08068c0896e3a856342651172a56c1f9fb848c53308d3dfa70e1123ac767690d7a70c52e3ce429c8e27cfb6e03cf6d6e1d7a6c1cf274d5a2dd23bba39501cead48d8b70fe1745c3f57a73d1912a98dd963bca65cefb6af62ec7b82df8bbe3591b07f1cacd4d8632e2a02501b9d01e5e5eac89246b90c8ac52a58974447ef29078aa3fa78a0ec021aa2366ae7b3ba059d49e99d71ed9d8d8d2adf1903f20f312cfdbda68cfe178a7583118e2c5351e03a86dbaff92220431d390f69518a0e40384bd2032353b5719618a68edb8f2e7d9742aee33fd1145ed97b8461bb21a27ef1e0052d89c963c38934e6dd7b8b2f3778bc09fd60ef96201eece3571ab6bc647c4c5624d3b38f899684811d7f0038fe9d0674e5a1a0937683cea6e8615136cd23f62a5ddd0e1094f7d858027ae0c5f0c9d7813f0258070572afb38db362f40eed3bd890792142aeed4aaf01cbfea983f102a6f01c3698017fd144d8e7fddf480072e2bc86747213129e7843501c62ace82866f37f3e4ae16434ed0f83ae6ac34c54874d0fe6697d92a7f41854d999338c819edc598fa9e491371c1bc37e61f41e37e4d61b22fc1f739b94f74767281e9a6a17e55a451c3cd6e4d5a3f784328bee990254ff421cc6953d2f4bbc20198dac4ab0a18162b818ba63a20228591a0fdfff5e4769321b7be34d1a4b48cbf3f2c1c3b6d912e40760b8bcd8b560cac33fcfef3c76c9e78292c00146a86ba1d1352cc103e4ad54f79884b1666356542747f3f31ba0373659015a38b7a007aff395c14523fdb6994ae2279bf72573f34529c4a8a62ff5128e1418bba8420dc59056de421100474b367f4eea2887ad69232d4bf74f25b0d8912688094d368e7735655de529fa2d8353ca8f91d5cb916a2a70a4a841e98d231a859910601971e198d2204458eca1f65105ce0a33b60af902798182ca637876ee87164b92d7e3fddbaa93a2efb744634e5c28dc0b752e256f618b0c8ff0b0214ad6f89330d14e102f8d9fd7aa836fc7538450538bbcac18813016e343fa2c72db67a031ada99fdd1360f8384680efc2365d43219e782c4b61a813421240f4956968fe6a7b7aff69dfe7324b762ea29e5ded8458aba7c48f2ab473e7243f4575aec5841dc125425d293555e6cc1503f890d56d207483f5a5b22f36af6ac3fe5089081c3aeeefef42f7940f223ede16a24ce16ce74da82e762c82b3dfdee379eb9f975e23fd3699ded741c935b12d08769d5a2be2d4fddfbce1b1f41995cdd5de87b56fd24f5dd02eb354462514e0f9e923acdc19b83660bca6baef12ac148b03c46ed5929ed396833d921a241d7ae2aa016bc7006331f332b955ac826f9e997530d94d8feef70535b884c2f568dfe4fd9c7edd85f8d5afd843b5fa77e2c55b5bffe4727613718f5b3eb672e8ee71b7558f3fa34491b517d5a3c66dd9fc74d6f6a001547a8f64b9f3777fd52c791264bdc6e48911f1d970b55fe01e3375a680abdc15640ad9aeefed914bcf97e0dbb7abf1f127bdf2a8f6053c0828ffbdf639629e17af978ed10efe3c84039c751ab253233a546d7c2dbd144f8d4d8d3ac2edc64b2f8fa7adfbe5be32c9458743fcb98c99bbaf5704959cb927359fc23c3abd2d5be834c09c2620a65f48555d70a5c81707677daddb97986c2f02b93696d0d40939ad6558e4bd9ee727ecb590c5c837487c716854c5f98edeea486d68cb243c330fde204dc864477f848a3977d694e6627e50838ab89999391b7d21554a825bf0b1657fe50857bbfb12c48f4527858d6b707c424ec0c022440c40631e2fa4479ac7700264d5313b5b04532f26893386444c132e8464a6c0b6ab20e87acc112bb2f87b974ec052828341a25568d54eaa5ace18ca0eb217e69b929582ae78366fc1546d20e7cb886bdfb5f28431ee1bd495595170bdd19b9df57176a28dd0997f6556268df21be1417cc0cfdaa331dff3b98152b5e29a7264ba8c831706ffa2cf6fbc536116293a4979abb1c3103ee6cebf78919e5c760554b2a203646138a2e2c3879050a3b07dee140959132c3606650b455e57bec74d75ecfca85b1793f35d6506e4df508331f4f359d2862b90e94aebcc26cc6aa51f56bfe4dd7b718e918b94c1d9b9be28743a129d31a21b5804607d8816e02a13c64583002e65e00a8b461bcfb2720d02fa9100ab4f43fd869a6ebe03a6dd6bfb42a9c2cefc5b9f13040af0c9781e2d07e3978c46b65fb405528eceba40600f8d7f5fd85de4b18a59f9beaa6e6d2c048886b597aa1710804c24eb5ca3c23fa4ee70998ff8a9f49f473c47eb9d0076ecd96041321c5bc44bccb39001a04cd10106e6a96d23c9fb64459ec72045e8d8b8c721ae5d0560f98c9ade1bd2ed54d631631c7293e21aba9eafbb590f368a4ad1d0c957f71df4f53ab780881b408ec5f8585b021a9501eba61978d411ed703ec1287e93869c3f0d7980b0dccf070431251829a1a298b020c6d4e8eebd16952a28d6c3a5e6116b49b70fceccb0d6713f658201a9bab1f863baeebb27ed0a9e0ce68a0eceb9c924127a69e492c0111e4957135dba449347f35bdf6f24edfb34540144a0f3d9d04ea861abe90f426363629b2faba9aa29783195d97773d89adcfd02c864acc337bebb45163daacc57471db7a4501225ecea6736054b21941b5baf5a6d9d72f2808fada3b6f0fe66e3d581a8a9b41d516154bed9cb115ed1bfcc5d6c02937816d9cf14e26b8a62affb785bbd1f3729ddd00300d8b6048d91435aa5bab57f4efb67a7abc8e10c71e1432fe55740351c719c5568b8dec2549133b23e01a1bc5ec9869adb5698e041cc21688b5067a6c4081aa45dac417611432fa8ed0d2a36e188d7cabfa65d058c866b30f2026df92d32c131ed99b363d4c4d3cf7c57479c2197b678156557746a77175c7bca56ecf25e3d6ec13ec652f2fe6355b2dda113d9a67dd9e8906b527a5d5f6cc7b1fc28ecb396e975f1a2631e8a3b9a124216ed46c49a1a5615c99ca71c10813eb070342a5e3a63012188483ae0e7027df4d844566ca9e7c34ca7e973c8bd7c0d16b2a2e873084aea31af7d25ee30b9d7801c72d073181098e290871fbe9d0dc440dcb863d388098cc28d1a7f23860f66493492d29f00f41015b1f0ee921e9ed592e40a5c909e962e935b037d93406ea32a68378578027163089a32eb82ae2f62980d10ea09bc182f26be4c10651fc0c035ae285b8b38a6aa824e4dc0704fc0c57c31f07582d865c0da6dc86ca0dbd22b072e77dab6c2ed75ec00d0d9b7139919f11a8b69ca4044f35cb22d7516287a2a49e290bd9c1d688c93316af4d44961a4d993eb212c7312437fc5657cbe41b230609e657bf2ad50bc8a4adc30c4af0e3f313b161a9190634f5457751c03d4e083eaab6481566008c7c6312cb570bd3fde1f22dd2377c1b37fda4d2791f3b3f8b0d06bef958694da068b46a02eed206abf39568f7ec097c8b18f42a4484d8d226ef6de77ce614991be6f7b7ab04389dc2fb916f629a973f66a6b259f18ec274c709f597b41c5f461250a0ab037747ac7218b78db2d1837fa3af33680abe5c046065a495443aa680f9d4fccb03e710e280e81f2ea088a427521f972396e51abe1d7c98d1c63884d57a463ea152fae09683c4b26725c432ef4c2b07b0b3253ca01e175783265ecac693f5faebe3a349cb1b9a06368f919540d8756ff84c38e3b3275fb0984f57ddc31aceaec58db151e8c3804c9e8cae62f6a591c80496de121c48b1e062b47eaa703393935d94324cdbe839eb908707a6cbe2fa8363f715dde5837a7b88b3cd1c6c9a93d8a5f1208d66ba72017e7c6715f70268121d4bc0bfd6eb53f3224332055aa066d159aa50f825a0790aef02d99a79cf5f375d6f96790de2bc4624d95cec9eacc5d102645ebc8127e92251c271103cb99c6707d6a59cb03b17afebe44361fb3f64ed45d03d6ce912a16ef080294034a4b40e6f7fe68ef6a46503ce0d6f89dcc154d4c09ae16cf5f28d7741191a5f76825aed95451b24e5473acbc30cbf5c80f0e889459251af7c0467d69178b61dc42c45abdabfe4a4b34b891597c20b0bfc85a4d8c7b78e11a7a10e7ac824723f0bf956c98bee8394c3dc04436aeb6e25989963b22f9d778c68ae04be864b075551a48b22375b3cd5de0a10632ec278c4c5017d04c2a7d8c984c300787eca6bb39a1ed2ed1ec685b222c98a8714daa554d4a2f8de8b0fa80ae273eb02e3eb6240cea7a152ac7dbbe4fa3779e0fb28cc7a9d69cfbb003dd7e284929a29a7bfcecabfcab6ba060cb7e486d1ce437fa8be7944846ef8eacb8fe1c3c967f7c40e038e7d8c9cdf4034bd915c923a17ea0549c03cc9c70ada408ffe4a3edd00c4d7c2ea1833ef61ec1e5e1d213e4b8c1589bd405d354a60b2b7d7e233ec201b68992aa85367abbe09c40e190155c1a14e044ef36f567278bdec04bc164d03c0f2c5d0564740d480dae1212cba0198226443be175eef2d9f0ea0f2b9c88965b9c3cae1bc28ba04f57013d23ed8dc607a3408546465d1e261d115b5664cb48e334bdc0b7ffb2d4c87973cfee30ca94ff3b5b6194866e412a2a091fed43e70ee91741d48fdfe104adea631d7568f8bef41529d3ca2b8e77bbd6a94fdff440602c4fa127fafcddc945d1053f8f53630bf9e0228fc945aca7ddd209009554b1c8110d7d607375f7aca385f8cc6c50113f1ec6f1495469b95b6156ac51ada9841dfa273c5d87ae242239634345209f69827f033b89c03c868efa3ba593b06d06a1a98f842b4e3259c9de91f79d38497d2ee912dd63e54254efc5fb1ad1380a4a931e47de8387f71a49f60410bba248f70950e977b6e040c01750718d65880f024f3d68fadfa995678d382764bcb92f2e8e977940987970e6acb15d6b83f70d2132eaa9279472eedc1368f94aa1d30c40b6f1655583a9410a2b0d9bc897166d43a8fe327ca4db27e935b994d8b079b1f1b0a5267da48beac9baa72a814908ebd4d226d476b6fa9d214b13a608cbca490ce2110c247ed213700e37508e2945ca571511df90bc6d00f15c24791e11e7aeee7dddc4d13dc96df1d82f7c61f6d19859546f82972623da0889c0ea4503bd7fa1d1882261535d2ba657f3f7b5b14142d075992a72ac23421c535420aebfa3d2107136a2096385541b63b51227973019edb1977070a17f18f0ad5e4092516f929c432303317cf9d5502e0a54efea05e048530e8879ce701263dfb878a456fb3891b6e3f9112dffc3571f444b8a70d708de918015e27154fc522d8dbeb22649f982c3224f4ef90455a7cdb68e7dc8d94fa67b0640c6f3719fb576040ef8e852b27bc807bf78543dc5018603851694a394bb57208b26ee89cd05d4db11d8f1c73ca36aeb5b3721111d71db9cc470f327f8761cdca6fc2da4281da987e329e4046843f4d457ebab9674375f8482fccc478152a7dc14d85de145d1da579048275b462ecb823c294e6590d637982ef480eb82c071aae5423d5c065e92208e368b586985cb89032e2949edd08cb12e4671280330f013d421bbaddf4673bb5730d83563595b9360683fd10b228e979fc0752b8f06a46c94df105b8d0dfa0e2f365ac8d9ec9470734e55c77620500cee666f4454554f567438a691aa3780b0c43009af0a9f037aafc432680fed14096127e02f3ff68d882316b18475f081d4d9150340c42c6a4f86c80a81883a57985abc9bd8c90023385128fc002c6c16ccfc8abf79d1464eeecb662a3ee534d2eb1f2b3c2671adcd385db3a7e0315bfecc5413712db56653e926f3a25bce784bbc10c598720b1ba80e70d59a20d4c5d3d8e7e3b2b463ba40e8e2f43b29aa8ded264b7a9376e9cdc797d6bba995ea29cd256f1b5b42cfa696f63e6d95de6c6c89de3559d29bb44b6f3e96d27a6cb2546f99c64a796f2732a8d45b622278496efee3accbcefe49c2db695ba07a151586902a4e1d898871d95a5599e45ea11307869b40831959e0eaafc035960640426d5d4088ad83b82ad6d662f7555ab5bea4ce6a2cceac3ac54a594f799e6e10c1985771b03c773ca0d623b8db6985096e95cc12372173c9dbca24c9379551d24d52e692ac37257353965fe0a2e37ab0ef0f4af75a7d1238be542eac4c9950af622da1375897d45b5693acb7c55292454fb3da28477085de61554a04ab2756e68c4cadbfbe0a227e35cc31b9785737a2eba4e52a4b1aab33e29fa4a5f8e951b46e6519ac46a80550a144c3c30097aabd342675562fa097ad08295799e4a6b1d1ec0abd2ca59b73967aad24fa7957dd1606f8a6bb4fa8187bce54c06b9da4284a251b5900968d4106e151afbd7761913313e5f9c4e673ca0870d4cb3a7a2db01884505b1ef839ce19d3f48cba5eb040297c17a0511da217a345d45ca3766b8c9b2324379f3b449fa5cb5f0dce8832d9d0ae3caeaaa25f6b4d20a2f0fed19957e6d3c531141e80004fb674b2843dbcc775337eb97a18526b28159374441fc3b5db62ec95f16909f27c1368d00bdb3be3b1fd71441fd301ad4de7a0a07ddc433e830aeb5446b428154d5c0523461a515972fda31133aaaa38d7ca813a0ec7e8e35c816a00a2ae6c0c367578076a27b7afd93b3a1eab915785a20c27c38c3e44c17e134f153b377cca0786bc8bb4643ec5f753826f4e6da6b1a9891ca38ff7a5a20dd548598164241387748da629e00a37a361fb92fa1e5641839e99723e49278444bcb9c08c7538429f3ca724a0c34761324557b05dc60949809dc811a626aac301fb34158816a86825d0341b3de850ca1b0382497f38c713b889c2fd6745f8cc92c5a34896c88721d3838258b71b874e7d5e038c9879521eb795011ba67cb539f618f6320997f170476e3e35519bfa55dde134c162a5eee3c2ac1cde8070279a01291b0ec4c89c6f88be7bbecd068873923d76e8ba547c77418d867deeb5196a18eb47984e87b863b5955255dcb96ec91d68b6abcb8f9859762989bdaaa685c1ed6340bfb9834890e5569a16842d5e29c9b398c63d585ef210c5e696da408f46fbeaecdd58da118196cf0d5cf5746a6e378b0ea85110fb06f13e9dd0e394cfdd410f7a5e4f1130a903f848747d9b0a7d883180cbdbafbf29939f9f0afc5ddc768c3f6e83a0fa3e231e47517ddeb65b7015812e0a7c5f8a7449c111e4544cbc515cfaa0d1ef56da521dd0a270dfabbb47b3450f2e68f88565624d693fa3fca50e65d424c75123ed602287e8635b5bb202ad0510482e537de981aee931c6248735c111fbd8dd9062ea49715656c1b6e1bb1937fa68459a45e3ec9fd1e5eb104c8086e1d9b4fd87b6ce0407309ff888b58ffe9facf70d997cbcb5f22419fc8136387679409fa518b2a4ce8fb4a3f13e5e2fc4bf1d8821455c26ca0ce19d1de654e827ed0b736ce95dde285cfb1bb0dc38278f90a9c34a260a538fde838c03361594b1b1ba1659812bfb44556dfba01ccbfeb60fe16826174576cbe22ea10e0eb4ceada760fc0cc4ec1ce30803990c2e3d003671ab082f6fe18cf0af50a9da6e56059032c6d3ce725738fbb3cbd1c9fa5d3b71a01b6eecccfe462102c3ddec4b01ffc2e11b8d029a4cecf88fe2ef0dffc58ba3c307fe777e7e943e265ffb08ab1adc5306b44bf8dd05cc0c2c1395497e4c61364dff9cf1c1eb8215ff812f0f3190c3947692650da1747b101cba099095224139e703812125805ddbb0e45efef386667ec5b8b80b706684f00ba4f80f4160276eca0d441c13357c829a0c74fe8414116a4c0321e7867620203c71243bfbe8ee87e68f3e81fbd7e156eb07ff83a54527de74c955bfaabeafa7bb3e2d0b775de815e2c23b57565b5cbed75e280c5b4d27e3056dbc4605ca42ae4d31859412ba64eb1e4f9b686d3c825287f0abf3926c7dbca510010ed1487e5a5ad4c7783c02492116a66b738c3e7e3c2ac53e92888e7f7731f50d977c2f32b1a1bc33825e7b9d1aac375f2f00958223c5d34f30f04d851e7eda37d1b89efca98bf53034691949ee5af039f6928835f6a172b651ee4b523963ddcc53ace84399efa4ffd238a84f36e431600e8190265177ef039a310e8640e2507934822f86ac63c2dce51b8568574c2c5f105e1b2476495e59449b8f30cfac21c3528003942cdea00fa9c376c6faffa98e3ed5073ace63aae59a7bacf7b7afc4479f5c18279d40fa0845741ce7afb197695cb3312c237a243a2e3f70da7749058c01058180bc0fa055b0c4fa7f26a9fdab92912a963f9d7e30004ec1601a474536b7e4a5ff57570d64f7618e647f52fda028ea2993372c00fef25adfb01d0e6541f626f2512d407c81e8f015c3c8d32ec32e17d9d3587b897a2824d1b6bb8af499330693ed309d858bab2eeb8ae11aa08a7ae38d504e3fd723e1c6113fd87a8f1d5f912928f9283b7a4994023c482f19ef906151e3bd0241741887c1f81420956badc34392cc9ac0ec0bc856284abe1e3432680125bb6e9dbcfdb0954f6cda2e7cba8325799f9350bf4ab8a87f6302db7b48163ec62c28a41d7635c6acd2a5b54316aec05e166e54afe9c53781b2d0add1024066b134857cd0dac137cdb2598c2e986c2dfb2afa22050aaf3d2389870ae41dc8192d251e0ccbde824acb4b9bf3587f8436813a25c68b6b26d3df2e0ba81ce8eb7ce73aaf115c410843730181684390ad08adb56ea63025293e33e825dfb1146a3def460232cda237da8e53a94bcbb8848ec34044fd4920ed46eaabb1fe2ca54fc81331f3f67ea1e7ff1745c69fdabcd64f4286ad1a9d119a14a4f1b8f4df7ff33f659570f13eebfc34a603f641cad8820a883595f9251c4c0dff2c85204af1b4f21e52d2146dcb9e4ac42e29bb3f2a05f03326a9dfe2ead00e34277958bda9055ccff8a7289458c482c5bd326702b410e9840e33ee9465b2643df9a8a2d1e81dd2aec8b9f39646908657860ee5cb80d7a61f948685e83c82cd7c27661e2d3837d280661e5712970303a9f850b7be54c91fe505e841d4d45b74a51ff283e264d203d34a1050d46288ed5d08b30b3239e46219f359f9a8a11588fc4917fb186633cc3624611be4c5358792e6a88d0d87044b2ce58514c77274265e8d619e7b68cf28ef9ebc7a822d6dfb3573ea79e95229a3a84d4091151f8b3df3f553be0da9d62e646560a99a9c7983ad8049c37138ded03c7dd0419a90177ac94098edae0b6482e9810a94c0666467de050ddf8a970ba15202abbaf822992ff0358cc80c15a86f813765923061221aa96e7a5024ff76c07cfb3e37a7e2d642cfb1475aa4b10dd5f3c6725f8ac28eb7e546cf493f52bb2fd4a2314602e4194634845e52d0c0c6040113a102b935aacb1f40e91525ff8c7eaa7b98908f4d5bd484b48d1ce70f12f54391d1295fad9b46b58b1c51a30cc546198ec1b3a21a6b5e292f7a33b58f598202a576fb6035bff6a80a5ddaeba3179fb55f9928435555b858fdf8eda14dc829ab2d1693e30dfe817d4ee248a439208353014338bcfd230016a760a5300119ab20cfb94d31a8deaeaa27d4ea7bdce6175b3df33e13730e75854f69b2ac21e51cd5778b7900d8e16335757c5a91285e8bd14c5cf226fc8382bc930abe74a0e064b74a04c6b020ca6324deb19968c257d543d18cec037aae5b0b43c3b103fe860eb378ae4bdc2c601ce557021c83101d8c97cfcfb6e3ae0bc78e142dbbf9fab019b38d69c02f3e32dabd6df41da1eb097a79e4b0039687bc0cb5e5e51efbb5a8f2cc64266ab6742a3c5791b8a0300ca776129bff583a143ac0bd6d79872f7d58102f880ae9e119626b682f6146aa0e2b7101dd685f378f5e9bd1dc0849b4b2474c573fb2554126740de9f0803c331fb4fa0d2d4dac26e21cfee828e596d311f338b410e92bcfb0ca731e569090780efe935439e7f42ad48cac5e0d22fdbe03c3285af9f00ac50437dda6c2c463a16dacae6e12cf889870dca0775ef9324eb645f830614e9daffc7354017603cc0b79a6b430e4885cded5e07f359888532c2f7be9daab707faf2e1ab8483dc9b6620fcc7b8e30ddd7875939b0973d0df505a2e02d370aab0e77162f00b5ce10f7d004106a0210a1015edd48d3ffa09fe8c2cd426fabb7f46250b370352be6701f7ba2617e969775655e2129a81bb5f146070e1c7d480914a29678701cf1f8af9e78341f4cb821a4448171938c7bbe38c84525c8bb1728044540eba808a87d0c0ec324feef320039e017d30535a02ce231f2805c3e1eef6ff94271e5a01b888aa3dd8f4717f42060c2a7fb5787785359bfb22e41d089f85f5c8a572a480dec9dd0ff361be44ff49dc67b9d4b58649c537758914409be19ca9c573a423f2d047028409d00804ccd8c68909e52c3bb7593228550c60832241d45e5cd26a103272077c58a5b617679af7c1bed03f3afff74730b60b71daf7bcc58942723b47da33ab33b65e54a2ff07507c1de21437123c4c2e3c4397cec7ff4ae38dab383f7576cb16e1c2d27826515535cba9ee3b4f83862cf463cb1478c42d2883b171200ad53ed76effdda87a6d5720d228093135ef98397efdcdd33f54084160b4d13e1ac9fc563d4be97f9c956c2fcfa5b2d7ffc28233377627e5d94c6da55487de32a1af76a961678b62c36f7f808553e722dbe4729957d2b9baa29810edf3b889bcf2049040cb4e11dedfd5905524df64156459749ae54451c3396e6ad6e0e0a97cdc22de0f8b39531d01efea095df8c1f38ff7b70a68eafd7b0096226043d7f9f13cc9e740a1d7b9f1d9af3f859b3fb7923b8a4ae538d478057084db9cfe9ce93a3f8ec10ff5bab29c44e3a087049a5f24e82f6bb85e2f97a884851d20ec8a74391897c10892024f41b0897ad3430d8ed00eef04750bd3d4654f0f48d2e929818c93730800bb60fb411a3060e0590ac7fceb34a842a2df5aa26b205bb148cba143e0b310d6d853fe745c1b5e16cb569c9de5a226933d3c731375b81122ac4d1fb745b846b9871f8c0464bf507816901c5938ec7a25e41ac4a1ae10cb8326b561d637828e5e12fbe5cfdc82eb7a6cd7f43437cf5a0832a43b64e33174438846f215a879544ac0ed457ce7b43fa40356998caf7b204945ddb2f10df3900e850af046895a5cde03140047f010b529d584268cebc91ee815122c92cad2f864f624aa176eaecb6bc6fd97cf2dbbcb86d073abea00060b8b3b5d171287454328e5db64ad6ce3cc39615c417b39323ac718516b9b32753415c2510b64bf6a6ae5825ccf83d43eb41f43c4c61929e10284005a06c838ee0eaffaa3cb76968c7786830ca86d3a1af9d405eaf433176187406064828c57a889252fa43b418e0f35a98d258e27f6085539d28cc01aa5e01bc72577591c324f15a0d96cc9c616acce28cf0357461f56cd3b6d323438fdeaedfbfcdb81f287a8f42779f0e31b4fc01bbfa381c85f84b019bb96ce4ff2dda424a6ae4ffab75eae2d99f2e42729dadaff1ca04af24e33307cd57721046e92a38861055aaca5ae4910e35faa8e78a6112dcc2ede2355074909e64953795652cdf2354808498864b59731bcecb5c02c83bd1e1d212fda773f0e90607ffa973ea6bd38bdc28683dc9619f82703ae91b650388c675ff9c20c60a26edbf2c24b3523bf3394c18007003aeb2a1a007c0e1836906e992a57cd7fd58470cf0c9f27e5c90fa1d5d5f581bd3fb62fdff475146a1b7dcb7fb05e3325ff54a5acd084a2e1a868e41ab33fb9e2c136545f1e98f5b865dab830153aa96734e883fa000432f2d9314e83ed9a6740083d019695df392dd8f8853dbe2a0fdba85c3a90ed379a07fe71de824e1b112c8e2339feba7a82b82715c27540ea103ccb96b038d70091702743b5d1cc91139084a21b8ead7fd42acbfd6f81a5121f838d38f828e80d34a2b40cd002356f4ec2c4f6344a2f85e808938220a86a3279bd9476bf98acb4cdd3e9aad400db3dcd8eff1006b15c688386ef40dfab3c8055ba1ec4e7efe86b4a01c434668d0fd7132f705172b6fff553c1004ddb8b09cdb8a84cbb1f31a23701f16bb59cd2876158516e3777abcb70129320cf36faada19e1437992df0eb6ae3bbeb8e1a6cc7933b20d58380893417c340a85bb34f970c0b60c9cbe04bc9a86498fd647462c8f82c9305597a00036844e909d256d799869d0598949fb50b010665e2a7e840634e8cf9def0c8e4604fccbcfd70c4e43944153dc35eb49f91177e4ec8bf26ee2f26e7cf03caa9ca73528acc9cca2e203d58fc09802ffc391bbc4dab99bbe2ccad2ad7f1b256e812c592d1d97a7b5af18a59a02c029e88b49aeaa25fd0e5a5122eee0ebc808dfde91e8f868258411a8f34415a56c9ba2d18d3083d1c8e6a5ec8f1360d25ada04ff2ce04d775c09d758cd9037b3173c26de956ff82f7528c9b3a9a441309b715d396c26d9c1c542f3d80535d9e694594523ea8010b8192b7e7c525e9b8664f3afdad842b729e7b701707df13f4c792b7b5cdcb0caa6ef5a29780a0e684032cf6eb65506bab267aa8cfce2dc472152abf819be57f4fc0ea9bcd0135a4aec6388dad2d729d21487580984596e2b22353bdadac0a6bf3d4444229b3de9bcb65f13188e1ed2d1fe1e9ac834ca7969d5679c8ff5c4207cc300e2d01f96a85298f2e8d1b91e55c73c9ac48869e53189d2e9eb5c4eae9c1df1611028c3f66d2484c62dbbbb602f64821e1e482d1b93d2f3c20ad64906155e5814026454daeac5edb6cf6fa465ccf3ca1dd5e874d6a54081f92066cab37caa484758177eecbe134158e226cadcb7e89ae2f00a0ca4763be959bdb724348e3d24d1ed3d8c212bd697e32555ebaca452a4a01479206667725f7060e5ed3d5d05fac645115c1ba20dd16942cd2f5506fd59991afc211cd912e94b90fb5867b5cf3f1141e078ff9a1e1802acbebc4c6f34d0295d22f141885ae841ac0f6be86360f3a5249f573c7f442e7f77b27fecbddcf3e9fb425d650c0a05e97a0188a469721010c109650038b63f91999f691b069a7a4a3df3320d65fbba6ed243d478f9ffad20cc02c83efc6c74a6872aa562178035e11676cca50f17889f8ad3e7fe692ef4be735de0690e56d575f0a1800026f577a9110f38d6961731fe5790c317bd41d3561d01c22b102864e37e20ea06226de3d61307c5e9341c4f0098591a88e1ff23c1acf8562c737d43553ae77318655fd5d8f88b209cf74517d41e3b6a99dc6b59dde62fec6ce920786a61ae32ff5c7de91b7582c9147913ad0386c1d029ffd519838d8274b17928b458956cfcb8ce39c751b94c21c6536c3727142920dcdfd053a789e2b05ea32ae376c8f990257c5b65bca4c548bcae82b80a847f0a0acb956f42f2e367a11e579ced77ac50c020ee0e1391b5a8a4e48058aff5ff01cd15280b04367b6efb195983b9ce587caad2ad3eb7b635afc5ac672cd729926d89521b020c0f65adce4817038967a18fc968e28434a61dda6e9704da795549ca8778d72584e36b6f805f00e8fd44ba20915c1d07ed406e2a721b8e1f6674ebf909894d185de5d63ea966ed19acef0c20828a58c7881ac67157223027fb949fc4af6376ea0ba16b7d39cd578623cce6750864931f2ce30e70530344406e4b92412a9f7892de096d51de9dd74021b38fbf224275007e0a5a8ee3f208b7f70ac5c887e5b7a6ab3e16a4ef5c348d78c9ff410f9fb1cf989ec997b56ce0c4f800b0de8c0d98cdc62b80c39065b6f8882c06068c5c8b60ff4dd37d45b5564cee8f4e14cd31a20c1951ac83de467f2fd8674685a8b33c5e768b67ef0497bd2e0789335b5417e1b13a3aeab97a0b826620f0941a1e826cfd32cc50f2a40c2c39b4e48e599538c6f19e35663a2f2265a54a4fccf530dfcacb08ccba5d00e9f3b14b72750e76f40afddd2ccfba03c6fe225607a6ca93356c6cf9ef98e9f98566113d9ffb0ba4ebf1482eb21bfed7ca48545f8c729dc3d99efcd1b19c2ae948c2bed8d278ff98e0f59ac2c21fe4dcc39f207f1def6bc622daaf03bc26f21c5a405a995d1c26e60a61e8b7dde58cf334016ea0780116178d6f05415ca40ae119b7ba9e0eee1c2e4898574c43c0391223e7bb1080c3fb62b96b51dcaa663551a2a493a6000d721c78688baf4e4d7b4253088f4950c098480a62b318349b048e13847b0c58209c19251d554d34628923563080c57390640e04b8bc3c6353e34596aa58a652dae844a1d2603fa5071a151cd8ac030a340149aa2a17418b876e62717cf181ea1cd4fa626f86a19b1942adb5465a238410b2c9de7bcbbd03220c9a0c2f0caa09451602142a84257037d388f844084e84f0a4629f22ba48e20956a8104209412a0e1c7184248aae6802c50baa6944fcd9322472c20a7a04279e80399104cd09a2ca6548e40413b1a91096080106d3889c9792467b510a6579987f13cf13c44d120107591ee6b0068cb63b41f76d9b17d39e4b86444ec820cf0c899c7841fe62cea0c5cf52a7e1b4874329c544a667754daa621d88a84092e771b48d1c82d7b1430d199e47db5c05df438b0cef81b6e97e7e7ed4a082444ebc90e17f744d97e179ba061219814a860fd2359de1e34fd79be3822a3787054537870557e04094614c4186277215939982ae3324324212f28743ce714116ed65e8f52156725d78967292b8d21ecca70c8988b083fcd90ce31121222224d140676711731e1143e961cee281d0e488774839fe3bd2a57262921cffc129647b2034d9e29e992386337e1ee9ecbf79ed7529afd75a73bd40ea796adec055e34e8cb11fed562d87a3cf13f3cc7209118e484d4e2d7edacb8857f2363e9e66ec9fccb562f88b9fd78e23232bd76bf7a3bf56f13b324754d758fc4adece0ed54d0ce1e7e272e82bde56f2f2f4aee616b94a853963aec44c134c139860167109e9b4e674f85e3277f97e5f4ac05a9c3ae19ced90bb580432b2f6ed12d5a713047cb28653a552c76de77eea60073b144ea1bed2de1dd5c937773feefdd3fd38fcf9c850feddb5ee6e251c2fe97e2f99740db6bd4cdf3ebb66bb1feaa71d793ba7236f375dbbdf4bd64e9ab55d87fae974497f39fd62c1dd57dbb977dbb96f9b092b79394e77f9f482b973187fdb33bddf06718a3bb57c749cde2ef7d3ed1a0e776eb9a8abf392475731a9bfae6b5276cf3c813af9ed13a8eb5ff9dbbe0debbce48a7be22847b69fadaefefaccb9d93e1205412847099c4ea7eea5ee19ecbad349d3b4eea5d3e904f3e97ed472dd673ae9f0ee44ee917b3cc9c46537bebb9d9dce596bb9a74e18023ed9da9facb66959774bf8a3922808411751108e785d0373e47c36eca2699db9fbe9e8fe7979ebfebd0b413c9df4ef256f1cc77d3b8d8e1d75778644985dee573acb5bee4ecc26d365b92e497425dc87a5fb92b7528ec9be47463e59fb7599dbced9134ea1b8a3b89fb8adc39f8fdcbd4da5c36fa59bbdbb24fc8db0ce4bbe30a6b8afecb773f6dbeda6d9b80ea5ccb0c4a2ab8fefb62944571ffb97a6d4a7346838eceb6fe8e53d9ca21807cce6658411e2d47578fa9b1d7b86e1f652f69db2d6a6ae0b374ecdafe0ebebfd52f5104aa6c9a98a71c05c4feb29c5513c789a0ca1347ec9e24432e71c22494bc9558eaedd52e92b69a5bb75df6ef712909861b824d1adb6b3682597bff8855b7ebd391d58bee1eda553e9543ae194a9c5f493e9a71386edc1f6ae92cb5d0eb9ed38ed72966ff7f3a143e957cb4fef9191596ebab6ebb071aa0543c027b3e0eb3acbafeb2cdee9b0bdeda6d3fd7ce4eb3872bb2f879c044e2cf763b90b7649a263c13a2f797b8ae5a55f78c329169c73bae9a79b7862465d8b9be98fdc4e081a907962fe0090984fa7970e399c2ea1ae1d02b9be1d853f13ee893d316fddbf99b94338f3755fa3e0c5fd4a877fb95f09dbae6404ad3359f5c421a9b3606026da997cda7b621e5d63f96cb1e054ceb3e9cfa697ce13732ac7747bd3ed47319f4cf8f3c9a69758eee7a3a6fb87caa5c3ae41dd8585e5a552e92d1ecbbbcb72d83630dec2f2ee306c2e1d47b2dccf87e92cd7585626dc13f3e9307f3a2ff9f4d2b5de4ea7736f2ec7fe74ed744dd7b4e620e0a3c9cd746366b9df4b2e998ed3a7dbf984bf984f371d755dce725bdeddef2577971cea2b96b71cc5f296b3bc057517dc1d479e6ee7ee7eddb34f4e87cea69f6ee38039d5f2d5e92c6f399de5275c3a0b2e1d855fda2b1da74fd7944d39f626bcd21ebf0eebbc64ed249c438b99bb30e3c8edfa687c3e722a070ee50bafbe9eebf13c17ee8979f59c0b9163eafec0382b071898496c29a8de92a01dd57931de8c9828502fdfccb1e5a49c8d49925d88c7a1bd18afebba6c7b14079cf6628c5e0c8d9930a7698fdee7bbc91042085f68b4476fdaa3c7698a3b8c6243177f4188b1d0c5673ce8ee5e6afee964fa23d38f27536889e85ef2cc34edf55b07ccd268afef235ef70687f666e478bbaeebbabc6559f6ad6db46719760d8339036a99bea6599cca3133fdcc14a7e87df2dbabd2c5c3b6b712e962dac391327d43318f2b74f1f148cd42cbb49b3c632c0eb93f1ce416ddf59ef0ca9eeb85372e561364d08250a68fc915077193e7d61e1539a4c58679696fce9817ee36b8711bb7ddd95ed5b4cc6b6fd60b63a794d28ad9799af666cf19219d734e2ed21b504aa916d60a8450d6193bd0d0e078804de28a2efe835332941225c337144dbb8283038c02be6713295c489945d07866861888f6e0b7fdbb5eb5476c1f1ff197ca893c3367b7389583ddde1ec3be6ddbb66d58c7c5c1ae45d51d2e7b598c23666dce07b4072bad98a6bd38a33d78ca03eca28bceb0669a658ccf1627151c19de8c015e9d9b0c21ec361c3803519452da0191e9bc0c4317af139329a59b8d334369a58ba7313138dcd42e3c411ee67006b61318451a6014386ebed03a375ad801d660cd08d25eb4f92165220d0d1c701e80e362c14ea4d15e7cbfa87b8cfc8c0e25339c6119d6d9b27d0c4d92cfeb0af81d6d03048e1d7448b1d1d132d7e163bc193434600d0d47ca5c3452e6d269eff2d1deb545be4ec70065951547a0f6aed265b7d2962f5885ca154dae54bf2211d4f87a14ea9a0ccff66a124a27fdb759e1eac638533252679d8ff6ba8707381a6cbb95880e9ce9d3489bc844cb5cbf2415ba2f1e91afeb31a86bbe2d1e118f740d123e74bac6fefa8faec17e9da76b3e9e2b32a1fd8a4ce44bc33a504adeb63b737667c622ea3d236251321c58e3079c89a6432b472761ddb4391d9ea6864231dd9881e89a07e09036343c3cd03232c3320adc55ca382c6fba3073177779c00707d30419b490ad4e4cb65887e6015d338346dabce0444f23bd8c6ecc33ba06f51709bbd3f5d132f2f37a600add07b3c8f212f6e55955b2fd0f9e205d735dde033eba86bbbccecc90e330c6f5b840ec682f1e3329a18415e8dc648b79b41775d41dbaae56623c58c31e7e46d7c41b9b1b29336d3c293329175db6437b38da5b43f7c129799e8ea1fb20d6af18be01731fe94fec81f690744daaabb55df64579733365071d3bfab5310cf3ccdcefc7c0990b5389743f6c9652e83e7825cf225df39dd535f1f3f10708c70e3a7674cda703ade47a5ab3cfec8ad35e58041458c83a308a5cb1ed98aea952c4d0c5538149fb4f4a29a9c528a59aa4d2da19bf980c5fe90b0d3803db063a5b9c62d2474a298510c2b681105d3f0712e5f8b8839a9bab945e094e5725171ef2a262129748e5a0962491e327ee8939fe67ca84af8fb556482fade44217515cf8c261ae586bcc0700ced0c9ea3c2f679e916be63f29a5d71e949ffcbc7c011153059d983c5f638f8381ced340f9183803ff437aa18b973c33cf292ff1755dd7ebc763edd46ca04d08db084dcaabd6a0ab5e17fea016f9d3f1f2652d16642d66915c570bae4b5eb75b10c406ad08847da45eb5693c85b10f6f1fa1939e205e9b87f0ab39bf98631a34d835f53efde10bc3d9fb7ecfad69d7fe590d7ffdfef59dd832374ee588f4dd2331deb2d84a34a8918278c9aba7aa7c95d72e9fcd8853d85732757da53dfeca307cbdf058ac43f9bb4e14ca12f7f860316a417b0a7e358ffd219038656f9faa5f517a798a61882186ddefc72bb5d0c90b7d13eb402a59e21e990f63161afee02390789e99923a3ed9e7a67226cd33778698a63d18d3decc3296a51a3a78e5c8e580752847ec4d5a2f0bef071f4fca5f912c3418d3bd064aca1fa568e846f13627b7a9d1ac62d7869a13a3b66f8bd6e66fbe9bdbcc1ab4a32f484ee120e56f66086b7ab4d7513ab1cc4217ef93332cfa30120add0793fbdefcd460ba06be8ba020e2747de96cfef892b5d4b6c567f1f39135edf8d37efabe52da57f1d935ec82822e95139f3deac0f628b52f597e2f328b4e9e05d5351f6c42c65d17ddf7f79dd07e444ad648563c2d5e255bfce978799e56a21f38c9312822e91620110fd06fce06c5f3480ba29432a8bda652369edd45e8a179252786b5ed26c718e38ffcd160a7d9d25fd7e7d61ed036abe83a8a85f21f84f4f07105e7e544cdcff6aca6f59060e822a593524a290c6c824ad64810423863c3c0fed9dbc7af2cfe7826131806c918cdfa08867d0884b7a77d443c00b5017117b90e25f06b4e22206891ebbc7d44c679fb0885f45ef437609ed28ac601b764ba3b433289924827bd442a95482552e9cedb92c52dd44dba8674d229f6f964521312e9526cb1fb6167b9bddf97fd93c7783aafb26d89c21639b61c02e5f84d0c426160826e92cb69790bb557a5e8b66b796252cb71ba9bcc6f25f34eec226f3062c000008ccf1b0300316e2f69af1ec675c1dd84cbb17847b6216bf64e6cb5e271b1c79e336f47b7f883011383447a37c230909cd1b1e7701f61d84bcf317d9c3591603e2f8c8f768664976bd125c6dd89d9e54be1d5f67897ad97740d8cbbbcbeda7918305c60b890ee72928bcbc5b0d76b2d77b92da3c9ca96a7bfce2b9ef8a572a47220c7f27997db72fa0b8cfa0bdede6ff97c0bf592265dd3725b0ef3b472235d98a7cb85d9b6b4e02f6616fca1f06abbfc09afb66748e4787b0d5e1ba5e82cee89723aa1834453a6e4af8ba624c95f0be57a98a744b181438d05148e9872440a4ae478b8619c0edc7bf4eb7eb6723ad88f8e23e1eddd30fe4c9f9c0ed94bd7ec55f26bf6da59b7d11da73b6327fd16b9eaac2257dd1eb386c898f6bf959f57fb852aecc22ce332b1d6c4e528e1d5f5787bc15fdd258d2e4f47018bfaa6d2455d03899e1094ebfb8aaea9827b6296cf84e0213b4fcc52e2944d59eda62ccea1bfb29bcaf12d28ad1be4ece39c9c0d8b299d82458e2b6c853d7e3e1a760b2fe56cd8f374beb478d11a18c355899c900591142d2a0cfb59af37c51eefe793631feb43ce064fe7beed49e7ec29ad7484908372343f6e5e7476ad11e6eb30ced6e6ec9e91cecb099a4c8ee8356e34aa735e35ab132bd1b64cc3b22bc9f626d4abf9ce30cbbaebd573c2eb9a738b5b9e47e89a62d349175bd6ebd96f64d82767f7ab9fb773d60963062d0ae25cd1779eb5ce3a23ad15c34cda50023353989b5ebb3981ea9985abd64c512fa86ab3536a69a6493aa51ccd6b9cb59db5ed69977f89b7c6486945a15eae7ad5ae9456d9299acaa1fdfa0d2d7bc51fcb27d3fbb12ece06add9a5174ee5d0dbdfa0b6bb28a5956e14725b7bf2c22276e715f33563c7d8b3e145735d1ab0bd8be6c26e54ecd7fd581f76ed199661d76f60d7a6c13fceafa391dfcc5f972d56c2fdc24a360ec39669dc499b0de31923d6160b1a8ca1b1c618638c9bacf48af1b7bba8f6e474a2eb7fdd856daf98566b9c118b5adb64275c691998f313805a66833552f1f0a53dd939d1c57fdd95cd6a6faa1e661f1bd6fe06877fe18fe593eb959c8dfa795d9eb6f846862db6dd9ebce1a46b1be32f5a69add549176f9fd2eeebc296daa0d760ac508ee6e923ac31afbe9ace78d5d81b9cd15a5342835eb77d666cfb7ce4b073efe9cc1d4be5c4638fa36f1bf6d19cc7304e8a938cfd08c77d2b9eced8b947eedeb8ae63d8afec7d2cc6eebece61f7b30fc1e9f4184f594c22a5bc17865dcb9eb33dc3ab0dd318a3e939dd4ba4e78ccedd84575d096327e1d5883ede596bec52c4d040c40424444b48a23577fbc849a0a773c430723911cb6bf17e2cee7e3e99e3aebc763fd6671f9f0871a4fb89104572cfb89a978d6cb232779871c7911c7dbc5fbda63d27d6ac22bece71f88b16db3e9bb96717484ef6d3734c2f612039d9bbe7903efa09af4c255caa5965eff08a84617bdc4718da73306f74f274a6d81429179ab084094dc008852638c9fd395a65e7e9edd82196619eced7f5fed5d947ff78e614ba9967de7e3deec82eba585d87d7b3cbd379c3abebf5a3fbd9d36ba5af4aefde89f9ea8ba7e564e5ad391bdb8aa767cc40727a7b636ffc9dbe314fe7ecd36aefbb5deceec43cc24072b08f9ed31d1b8d468d7d843f0e77d3634372cdea4e3ce4725c55d0e0e105226ed0a756fcedf4104a35787bec145ed65fd6e29e98e7e9a4f2b2d603a18187325fd9842ecbf0dfa4c9325b2dce2a68d3085d3cdc4a5d7ba996cf57c54e6db2d3d3cfa0699bedf4376dc3d98c4e8f039e7e746dc3862dd3d7ac4c5bdc5519258bfc6d99aa88a2fc64fa0e2686b60934d8541c9121518644535091359206a50d8c18741e3e06491b98c3d606701987a9c377373da40d3e7778cf72d4e179489b93005e7af198c30791362ebfe1f0370617e006f88cb7dc1b702be68607e0a62b00dc9211c0bd8f2ec62d03ccbce5dbbdb81500fc7bec0e00b7665a3ee3f6cac02d6f0027c0af9bc22d7c1ff37a63e0560a06b7064080cb1cc66dc5788b081927528216399e45c6615eb191192a00bcbb2d19d8480154add165c03c75edb660b0111655cb1e061b19a9fe18b805e3dd5fdc96963acb51b79562798c936e8b051b91aad6cbbb18273dbb2d2262602333aa96e9314e6f8b848d3040d5da2e43c34660542ded304f612328558b3ef5d36d15c000d8c80b550b3bcc67b011ab6ac9a73e6fab051b31a95a2def66602351d562798c17001ba9aa16e932ee725b04c04652aa567d4a061b8951b55ebcbb00ce79d80849d5e22ee303c0466e54adeb3017003692a95aa7c778e9b66e38112d1f5500b09101a85af3a9636c4446d57279875bf846a22a7bdf16112d1f550c36d20055abbb0c19cf708be52dd45ba7b74a37fd066cc446d5ca0e8371abbe45df9a6ff5e5617eb19156b54a8ff1df563f855b32704b7b2b7b0b7bebbabd91a84a1d00b7857a0cdc32125530b8d5bd457a6bf4d676ee29dc82f1d68bb75ede6ab9cb71248cfbe27ad7e506b991e5a22e8d94813f5d93d025ddd1ed2165e0b9bbc16b37bbd8f571e3055f2fbd38a40cfcbc3fa40cbcbc31e8c6a1bbe279193213ed1234f8f6a0ec28b98fda7ee85e3c0f87aeb1ed41a22408c12d1cc9fd0b094972ff2777ee2c851619662805957c800c89a4f0411ecafd8a8426b95f2b97a35f3b57897b489ebf74e84f5289298e9f708794ebbf0bd6208ac249ee99b94a99b5c8d15fb773c57001518b26391e48cc52a0ad508b5ceb4d3d4e8d92eb7520c1723d0f1ce47a20dae685aade03f5c21790624a131aa8000b5448a1aa1ca0e203235c81093cb8220aaa4a45ae436cc8b51219c9f5a4aa954ed92d1912459183fc7952ae683493f2892792c0605104656badd5b04ba307342cb6d6467144b6d6ded0c02106dd28432228da30a365a6ec181c385b19320dc36c030fe68cb91213adf4cf8f2249a050d1a22848c70b0d0e29416024c314534cc103101398e8020a4810a28917356ca108456330c314464c317960ed8d951b68e70ca250eefe1124fec4224ec89dfbf148442222a171611c1c3aaac8fd1d5da3e53e0f203cd04bd8ee092a72f71f55ddf886c68c96f13a181a741f1c7ac00e385064d10d45147297211114524ce105a603355882085b5882c4056220c0166cb002083cd0c10b8000450a15ee7c9204cc883ae444b611616691cac941f7c1a299830e462ca59c415226c623b49b528abb081834299d6c7971da7be28920d825d868094ab9b0022556087521e48222aa39063350c107314072040aac24614805dcd00c464b3cc186d190114b542876d006eda3ffbe7e8410421c4a29bdd1a4f4a494f22ff7a39d94c9329419723ffc00875435461d5206ae7a645632827a2c6bbdf50f3be2cf8f6a071c52558c43caf490e8439bee809421d1932b9376137237e0169ac0e208141c4831451190f0c416f27ca20a8b0a9290f224065730220b5ca82611142d80c28824683066d6a0096973bda15cfd731575112aaa267af8f81185e24f6c128bd81eed596953e7a36a5e1d42ae4fecd1cb43a67c10a27d621a15546971ab3674d4e3743c3d6b089df4f4dad53ecf1a723dbb36f1902b9b4fd24b3a014554301ca54899166a2f3efe0491324d7f79291fe6318d945152f1a54c7792169232fd6ed25d91103dc9224322a2a13c9321d19323e46e026b7470667e5e23cdf7bc41f775933cffd93c85d00f491b21f545d286aec14a921fd9447f5e0a499b247348da40d58422254fecf63a66f190faeb5d246d286631f1218a210853fca8ecafb386d4d3db0b0fa1108a1529d28ab481471050c40da4346942dac4a2a01c1415c99fa0f90355928a2c3293cc22934aece902cdc21a512309e5b813b9fb506ffa04a06a3b0f16e95a1cba7ec5266293f6a209472956faa78463911654aa94381f3d38aebbf6114ecdfba84a384892283439fc23281689407680f8607fdd877aee1380aad281f0606d3ceab509d0eef4f23b407c48f98065c70e55a303d131c29d9489ff21e5c3e8a69bb010eda34315cb4775036618d449a44c7ce912d1dd54df4755a10a08fbe85ae47ce0a1f1d87890708f704ade47c5e1f791ecea48498b5feac591328d7762a6f151dd4899f821231fd9970e629e6d0f6d52a39327963c010339bd5f8f4f2461d2a09bbc2769e45ce20928660fba6f8b914f3ce9774f5efe841317c0d90327436b907309229d852a3842935c2b0dea084b72adb5d649e4860c898e60e44afe62e617e08c52e4c9853ce7ec42b6191239b1853402eb2c427d820084365c41c4022378e148090656d8c0c5d00958808328aab0599837465c1744c3132e982068882c52e0037c02190c0d010590196e105d96772c9677a6cd3b7de59df853f30e1ca279e733ef7432efd8ce3bb327662b74319aee1724afb263dd3593e9eec42e7aacd0edc4dc39649c6edfdd2f483e9dde744deeee9946a6910977d72ce18f954f98e77e9d4dd7fa76b827ee74ee9b6efac69e1e7f7a2c75a7cf53099fba78baf1f6615f93913b77dd9c25abe14cd371686fdee469ba4a5aaeb55c16ea38ade1dccce380e3661463cb1d8285a5e538b2e532dd1fd1144d27d371a4e964aa5bcbe92614cb65127f8a3368aeed859b57e8e43f6fd62efdf33c6973d3c5dfe0d087a3b737f126bb2f66d2712437e7159d7cecc6ec75c91967a9513440c3cf198e40c31134044d88ea0ee3c96396522ab1db8855f12175ba46527a29ada49452fa1f5393c7a0c43a59f31173c48cd1548e2ba3b4330cfb64273a0934765db6dea08ff7c9f7477bf33a3ec650f413a46b209118aec8452eecc274acb5d8c791acbd7f68cde5587c5dd931cc460cebf8881b4cee9dd84537969867e6ecdd51c74751d1cc3dbae67aa7d3de6c00e9f3dde52165e67d481b120ed243c787cee6d1e01e989c5de37101c1a34a151f51c74751118fab08081e55aaf8a852343a7675e03eba1cb6edfde89acb27469c611d1fb347d7681ab68adab567d8a63deb01840432bcc278c04edfa36b80e81aed5776b1f833946726b978edce9961db5ec6f017af28d90ed975cd686f9a2109b6659aaeb930ce250d8d96d1d932f619330adde7656f56d1d15bacf3c57c9d6f48be0e24668b757cbeaecb7328c7f0b4bddf908ce12099a73386dd2f061f4798c7bca05eb6a0b2c512669e5da7e36362d1c1cc13ad0461c51ffa0ef562334edbaec11eff69961efb42e09373163f3cb1787b334cc931191299a1492e831611afece957f6b0bd4f8e077b1a840a9db4c2039df1d9b558866518662fad7114349286c6c775d3b457cf5d7a79a9cbeda38b8b0b15818c0c6447bbfc4e76201a0e814fd62eb597afb47fb1bff5cba5a91cfa78fab8a25232766c28d3d326654892bf975c61003181f17a9cce09b91e072ad7d7c7d432fce45a062a197bcb356c9395eb5f1797837ba4dc758d057f31b31c75bf9951bf2e901cdc2d3a8cbab52ccb344d7b79f75dae692eda0beea398e8bc60b9262f8ce7c84725303afec58bfbb9dcfebe7c088cf929297255ea39f2d95f32fc294961d6101897a8f7355d5e28bbc34ec0e782793ab3fcf4c9e940cf72c9e5c0de823f7a16960b33eada9f4cb774e7e7b33364277278956fbae6db8ee8b4437c43a33d99698679309a5a25aa83da096c775d13b3dcae12566e2257615a58d102c84a9b4c86226438d20519e2fa10d781602780c85595f5a31ec88ee4e9f28f7a203d5d8e38ceefc88f49fd8c5d51f30a1dfd9c3dad206959c6d339d886bffa0c7f9de12cdb30909c3a7ae55e475af6ac5f2595525e0af18429fbd7a5c371f3414fd8b627cc2774cb2e221888b200821052619b21fff272fbf5e66439fe94360e22cbf16f4fce686f5e6697ecaeb5bbebfc75e32f1b7166d97c3627e426f5aeeec103081ff533dfb03d29bdaa48dab5fec83256615e5e563a59c6701059a6f157ed98d3d7ae3dc35eb3ab6d9ca773c6e9e02030901dc9d365dad3e18f9523d69eb4c1e1cdf0b24bc3e1d1c81b8d61655dd835a369acedabf6551b87f664ecad6b7777edfae73a21138e641e3ce440d33533ba265227562ca91b67438bb7feba39fd7814ddae4b6172c43c6f26f628387df322afc81ac6f95c47754d8cdd8583e8d3d3edf1a2680f207844e970eca0833be436ce7b8179b93aed4979ccb3795ea1fb6e8a5a6ad76fc4788a030c4f577c837e629fac41efc91048647aeef2c4ccfd46dae09037f5835070c809a5bbfec1a2584329866de0903638701b7763a618a73d99a33e88cac3757aebe3adf441d04f2b90e41622b71547646d6ef1de80f5d253dc13f317314f7ccc3d71fe6fef060828dc489bd1a5cd08e72aa8b40ccc12e72aaab407b3e578c821cf5b2bae105df19323e6e91ae715791ad2fad515f307fa323224410789acc8221765c9a365a44f8eb847d7440a040f8bbf8945bcaaa91ccf3dd9fb3dabd843030216f1c8c13086bf03e9f3c45f98a77900d1a3de27677747468edd3e19c34a46a4771fbdc33fa4fa1116c2e403761ea7b16d32a1ab8f3f7662173222a7838c4cf107fa9a8df4b53e0899571f9857c593a76f64b9fbda20ac11391b31420f0d555cc16e2197737d2776d1b333dfffe89c622b9d37043e99a7ef93e3dd91917b6e328b1cb138533e796225196631990054fd689888d8858a493f3b4e675708930f10a12a26f6cef9e7eeea4904a6b5c3cc7e7b335ece2aa4641aa22aa0e49989aa4092e563ba463e476a52be4a59dfdebcc43c8d63dad342f76d796a797e1ed53541bc869c324a2d14fd4c01a8b38cbe1bb3d63ecbe615e71bf374a684bbc604bef1c7bafa7e36bbd0522149d112ec4286b4b6e11f225771af38920b9231d64aa79ffdc241f4afab5f71107d203c5daecf9ee19e2e5ff8c32a4ff776a1aaef574f1ff157e7b4216dd72464ac52d2cbacd1dbe51b1d7eb92f36228d47b5177346b5d75fd77553daf416229476b617750031f1011f86a00c9321511648e4c9e254544e2cf48def8e3d95d0d5cf2829beb5a1689b658781dd4e4dc35239bf30566eec9a762f0cc32eace22f86faa062d1f940a1ba0f63db060e4dfb4d2828c11eb3c79bb1322d7255966d587d1d620f3b01f191de1d4c667a26f157a531832036ec513c4ed79e42b429a5dd932aa1a3ef09a59bff66aeb4d64ae99c120b4a6bc039e79c3973ce39678d11c21a3dbab0937e5d72362e5c3f228dae570dbb1ff7ecbaf51989749eceb5564a29a518c6ba56a5f37ca5cbeb62d88a3bc93ee73a66f1eac2d7e5b10b9ba28c51fb7c8d75546b4d968293f660feb62c05265a06e6eb7e18cb73503f6d2b1486ed9df0097f335f1b6e4c3a76e333a9c96e27dae85eba3c9dbb2a7f5d1bddc95ddccc236e725996ca9165d9f6acb1bb7586531abe315fef93a52025cf5f39a29c32bb1876fb36c65fdd3086765ae4fa254e9a8857daabb1c992f622135c88e2c811edd5afe0941c478f5c8e8455ca512301672a176651d7491a49f3c4ee9f2b3a7216452e7471c809e5722c8e45ba8b1c51c4ca8bfc761129f3ff42296371076941766af3520c3715cc3a21332ca6ec3f34144568288a9429294bc2a91ca46bbf41ba867db2763ffbd2499c0dfb283f56363509a76e58dc4d6494298d05ac918522da5b800b6827f100f5f532c3fe919a09277101f4482cfefa08f6f4360ee0019a94bf0e8a4d7494283d254a4b8951a67cb1895c9b88926b7b310a38538b302cbaa87b1ea1fbba28685a2ceca1c45d447bde2e6aaf5a27baaf83304adaba48d6886d317f1d14ad58d9a91c52ca365d5e8db3616a24a91ba4db6deb5c1b8beecfde8295be5fb772bd0dfbd35e2551c102d698afb7d72589ec1ae9b6bc262dc9dac61637109ca9f18a12704628a8a8888aae8b221409255a89577eba46bebe81600dfb291f3349ca4cd2b26bd895cf3e2586e5c863cfece5ad9cddb2af3ccdb25bcc5ae9c88c7df2e020649e18c88ee4e9f24a47e6c641c80c84a7cbddd3e589692684bb0929bbbde449f745285572fd1655a44d0705550942129424284848282828895010134d960809dd04f1288222c8daa0ae41d235348912b006bda9f938ede7b4b7839024c1a28b19daf7eb9b0ad7a46f2f6102ce08794558141505c523da8b45229298241e8931c8daa84444624a0b0941115ad2a4adb457af4d2574f64e7aa8bb9db457ff759468a5a88b749116ea28edd53799a2fb3a4868ce5662e246a2ab93aee92386baa68b7494ae6924154707b13287bafa2eaa2f3e2c8e5134d1042c9ae101d18306167931368d72e4014c03ce5426600dfbda4152a6be0ae57a0d497bf530c9ed2025748ddd6057c9df41d2e6b885e484d2b590b4e9a296a9af330bdd6773c5a1bd9a3b487692ae81b9314e7bb56baf3ed549daab4f42f7dd54f999dd3291ed474a649847514022cfdb280069d766ad16e5e80170a662149c8150ea2751f7bd548945eabf9b5cffcd27bacfcbb5da67b6a8aff170dde26ff41e3d1b5dfb77937d46d1ad7866141df6af2997338f613895038f3ea3e8ec1ba7725c23fcc99c5d7e497b2d8471a1b3f676931b16432974334fa1c8e5d8d3534ca9b41f518a2de6e96ed24bb0d0c1dcf2af859a48d1c963a9c35c939c0d2dc21ae548723af415d86d2aa7bff8d7455d0467eae1ed2bdaa3d2582001f5977f5d9449a4f91c78cc748b6170da5e08e77c4e36e747cf919fd9c41fa4f09a2eac64baa993f084704212a4254eca9b28bd4e47a77424e167142866018b272d70f28405420d73118db60b865a1065891ec84951306d94984f5e20240f318da428883f35892579cbf0491249f2173364051d3a576a44f7c1a24b99796bbbeee5e5f78a0ee0c301300b6ea13ac021e7838f11aa03602865e065b14cdbb811a92b994e289616979717305230310020e317df101300011ca763110f58650004f8002e733f9f2cf3c8d990b94680690003bc00f78b7986c60e597ec6fd629e71cd00f706cc06b8263702dc19875c04603600f60c600003e8cc995b801917e6025c9f2caf0e8d4c8001bceff79207701c297351edc17bf743e501e08e46dbb05cce440940968f21809be14c3f00570567fa31d70170a67fc37d009ce9e36b03cef4efd501cef47f6fc099be8c8b03003707cef4635c08c0993ecccd717780337d18970738d37f71230067fa2f570270a6ef7275c0997ecbed01cef459ee04e04c1f75290067faa7bb03cef44db70270a65fba3ec0997e772d0067faa4cb03cef447f70270a6cfdd1fe04c7fbb18b840c0997e763370350067faf66ea0079c6919a14c1fb3a5dc2ff28d518670a60bd018130dbb22b4b1f11fb7c307a978c93550da883feebaae1a58a3d6e4b65103673ac70e39608d686d600dac11610e3009d448f7412a729f1aa9a13245aca9f15ab4d65a7bdd2f7ea8f8497db20e2a4f1ce943637c423bf26405483c5141164f50c0c49313043584ddddf20521be3ebaf8d3416597243a0e6bdf7066f14ac3598661db90b280b2a093d7a893fc0c9fa4e08a0ec019f937e9dffcb60b7f3a5606cbb1d9422d7400ce10e9e43fa8852cf1b6c4dc82128144de72f62db297e1932351f291259926c32729b8929fa4208a0aaec809c8f0890a94c84f54004485a83559cd56e5f1a713933336644748a1b443b5375fa7708222b213a8e0c230aa3d8b9568bf3a68650a5014a145166158420855250313a620c10994290455a1aa522883c6860c76550156e8c48052a25dd1f5fabcd2c1ae683e390289395157ba6e5e513802c88832644b53e70e1e7dd1ebcd686f76d1d90c9f1851244795113f520666995fda93894f4c2045a6193e31c150a66916703167cc95182eacbdb17293aad77410615998866118865dd3300dbbc6c18643b006dafd3a43203d0011e1d322e23a88b0acee47c338a93ada8e3d7b1157696f6598c855d98188649aa61de38ebdc85519667d3b8bc3d947dab103a13a017d1ac871c7fe3d3787375c440e2aed0d5558cfcc2bfafbd98be27bf5d4810647608224266832c4802257a57400b5ec8bb82a7bcbe222725011b90acbb2635996dd6ab7ac0cb3589ac5521480aa56767ba82272d58645edd9b75bec9bbd959ac5ac94d7b69c226b24fa75793e201ea01f3fd3d0412993c248dcb3a7306d7b4bcbb40db3b4b37adbb667a3672f72958659c72c263bb473678d70a6bd49dbb303a138ccd2faa3fef6d1b37fff08672e2de8b66f18aa3228652694328d7b66b6f58a74cab63d8968971569d8c214a4087a520531a8200c9e4841c4128490459320a8e021d660ccd768e8be975335d8d0b022bf83071038bae6b3380fd88146d7ecc8df748d866189a5748c5e01a81add87ff60b747e649c2a91e481fbd02a4fb700c6729eed8531be9a6b897521c09a7b697521b4ef5d07df40a741fdd8712e93f32067b9ee36d972f78633c43f7c5cc903838b89e3974a1454745ebea038a6559ad9bb66d1ba594524ae975d14a352a6bbd6ac3885db6565bafcb115dc5df0f6babb5027b66dbf44a16630beaa7636761399d4e94c5e52c2f72d509b34898c57261399db674271d884627809ec85528cceaa40cfd09b3582ed4492fbd3b549dfe75280cdf74a83a611c692add22725061f893f1eabce4ebf0b26db1fb6d199bd925098e1b5d0de6eb45c544b395a48484876c2a268dc4da39c3d08dce1d4a190d5b29337500d90ccfa98db46eb248da48c3557bc9f419366fa7366ffd84b976edcbc2d9653dc1b0e5e82343d28188f0f9f9214208131da643d5d69802504544eb74d259a573e74a38d52c072a7255f752aab10ea0d6e8455c457a6b84895c353a1091ab4898c562b283f41111290a4015e93eaaa82a220715112d1f550bf5d28b5c35c2ac4b99ba63f4ee2c14ae3b501f9d85f4d281501d668d300b75c2d04765c24572d830fe784e3af7d2bfe773b8881c54a5973094322e2de83a5c440e2ad26d3d9432f650c5612b018ad32f19ceebda752c66e9afeb724477e1ef47be0e3366af7731333d1ca262d0e00834b8eae013a02b7297e113a02c72aabee5032bd601d492dfde92e7de825d60b8881c54adfe2c220755bc666f8cb7e5b341157785702c26dba1ea0250d59a071abd7bbc40588c380524d543e9f13f9c2e9fea81f4f81da4c71dda2566c96b875caa87d249ffa1d49d30d4ec2dbeddecb7ed76b3d66eb7dfb1dd6ed6d208c1a1b1dbb17f349b141d43a56f376121a56fd7bacbf251b198ec309dc32cee269caaddb1cb62623ab691befd87d24d4fedc0bee11ddb4d9825bf412ed503090bf92165e84dffa1847b6cf2ddb97f904a0b7ee20fd422d3bb9ca083aa78214c76908e5d48278474ec1a77594c4ae7a08a853da51a5dd6e8a98a81a47ae88efd07d24b4ff5c01dfb0eee182b9e7bc53bb097304b1efb10958f0a7236523d74e7bea3c31c1632247e74ee3b4814ff44f92f1ed111af71374a9132f4f2462a3726a192042836199232f4d8051ab249b06ff42e46ba0befc02ef2aa6ef42e405d7da492a992140b0ea9462071aa5e5e883c548d20e254c514b8c469c8f500554056088b492604bb101693094055bc3d546157bb42e2a16abb2d1f1d40f631fb76b16b16f05165b8881c54455cd58f97c85545aeeaa8856ccd05ad859d5526ae624f193e19220af9f3d400e98cb272c185941b44e108454578a1044898b0821d3021055cc882ea094f88b8e2852cc327435011844c9f1091c51322aac0a183470f2859de033e6695193383060e5164799c07c01a31cf2a4f8620c23755ba8f8607875a327c32c412f9caf0c9104a44b1f6c6ca4d17ecdce476b543ed3852ab9addae6178b5f5062f7b81e4d8d23b8b81e4d8d266390cda4b0ea1d6d8d9ed855eecb4a9ad55627d2d66b34cfbf58327c7bef69efa20395eefa99a26b5ac2f1936b06bfbf1e3690c8bf1c2ab3ee56a5f9823b6f58abf84c08629f9578af23c8c77c5c3d81e2fa5cd6cb665b7da63c4b4ed5a1753343cadbdbc3dda2f791eec51cab831d36e7fc35d7bb36b6f766137fa18ed65a5cd4b0643fbc7d35a760f33bfea5f7ded3efbe2ed6db4d1b697e1940e78b6473718d8673e7667dbdaa7b140b0da6a7bc5387c5d202c2143804038c3437f69bf765879fba6e16fbbf66b47e66d47468670263b8ed4b00b2396c741c86fedc5771b8ab0eb82f9e269f9fa2064b7c5790495534e2979da67c6b8028dc20e32edd6a15e60768264f96f48a63b5796f88b0f814f96f4380d57f23c484c64ced1e135ee30b867594d65a9d447e752a99bcaa918f75ab315c61da7677c2af5ec3585ab9669cfb4ca69374676b5fb654fbdd6cad3365278c68881bf9a71114586994ec931d72b4059935bbd9ccb49b7059b4ad627bff88b7f2fe788d46085480d404ae4ec2e5790c82feef2c9a56a4dcdecc55197292d7581e4d4c7784eea3506fe62bcd6f75318b6977a0a7f15672f07c0b57a57303030678991c24072623cf51c188f914abde539a40f468cc768c15f8ca7f00763f4612ecc00b81663ccf6e4572e7ff1170f814f561273d25f5c7bc35931af6ff92af514fe86e4d461626e91ab6262bcc855318f81bfd98018ccea2164c80dd9639ef5bfd25b0e73573b3295935d3ecb6eba3ccca9989bdd70996887512fffa2babc5cc8e5b8e0cf27bb3c8bc1ac3fe6da8ddc0f43649c89f61b30ebfe86e3c81b2eeb86b3885c15737c1873250178cc1532e40f00fef9631e83819868242eb6c8316bd727c75c1613d299688f5cce76d26f68b9765bb8c022432e73b9d849d75bf015723191ab8e996c872a96bbda1982baabec309fee4e5c5d972fdd55872f2c3bcc1c774d72322eec0464873c9d57b2d25493d860a54a1ab2d0501acd0c2fcbcc85d0479325f64a2ba5953e625409e91a93d1ceccf1d6fb59d930880b26328db70625b2fc8c9bb9852e7bb5f1bacd2c74dd18a63d49c3a3d279f9dbc4a2cbf08e8c9cbd621bf59fe7c949a59b975d232bcdf0072ac66acdb60ea571d124732154697716a9966d90cb2af7d1490d18e11fee244c7a7dd6836da38fa759dc6552b3ac3ec6fac641d4f7743966dfec9b65a362ecba24d1594dbb5aa41542ef7a66bffd86f5c9598655ce463679fa7ab537e687b2e1cee1cc8550c5998b26349b9f4ae8a494589e527b65bce255a384503a2821b6514a38b5a984ceca46bdf4ec96b26b9066674e9face8d2d0041aa26065930c00e49d1923ef344cde893fa9bc038760e49dbfc83bdd4bdeb12e7967b6e49d66c93bf1079577e0d029efdc9477ba52deb15dde99a4bcd3a3bc137fb8bc0387b6bc732def04a7b1a8b44cf5c4b11e650cd18c00020004000314002020140c89c4a2c1704c2ecbd20f14800ba9b04a62214ac420c7510a19638c21c410030000400460643468007bea28b882eaaad5478cd97e578d97cd07e276c9915128bd82ed31464fc9631bd46bfb8853a04014b9990cdafe384ac64999290e1a2267154765dec7a1cc839c20b6a182e3d0c103123a52d3f222df21b6a3cc3e6cf0540792a62bc686a6c040e7a74a1cb560f3ab3add31b2153e514b061f422ce22828c14c2884c495352392e197ca6232e64124b70318d2e27b134ae9b54e4651d98e8fad08649fa0efe33fee8cf8a51a3aa917bce5f30f791a60a0c0d4ee815a00948ef8c4ab52f67897ddf7fce009bb4d4f978f97cdd779e979b9f99e2f1f2ff7efd3d2e372f7395b3c5e1df97aa42fdd9c43148d62686d4467f2a13d376efc9ab6c8b09883902bda12d0686d6903a12541b8b88e142081e23c538061fc634e6548653a0cd70a593ee2c0b9ff1fd2c1b48dd47a83b48f77edb3bd91973718828e2a2eb5de102e1454567ad3a8f29434d20d86469f477eeebbffedb5feeb31ec0d309f027b1a6ea4277fdb2c3a6aea990bab0c4c36c66edfa077a57ef5ee0ca16e8939ed2b271a2c8271ee1c50702ffbc0b1ac1ed04fa7718b3d3b4916a7595e2ec4d31a6a8ef3b224bc121f81a78113d5da5c58b9198ca2e207b5614699c750bb0b66dbfb2d35a403cfae95ac056d2df4e4408bf60beeca9e3f3a1564df8e3d68f46a1eb8e713737f666453db00240586713d8ba93c7d9dc7697d2a84a4c83356a7a17038fae7b9699078b66f66e419fd718b15fd20acd8de1ec232b98a46083d9f39d282de2b3ccff34dce24a2e49fb58e152e40435666013be4545cdfe9a56378f8c65d330b103000e33d44a8ebbcfad15980bfbe582bb1caadc80da976191c0fec31a8906f4c664e6400cb537909cc27dfb58dc324839447c255b0af4348a77ee826816390561f23ee8a9b04479d3e8a93f0603320036792f2352a37794a50259d08217f98904ff095b56a179a01a1e52801ac820db66916b4e44e5cb94970adb54c970fd27b6637095a0ab44f9de70daa03927a01881e67c8f3e4433b9881e0b85c007d69409a1a857243a1985b81fac8a4eda1b13d0d7469f80377467fd0be746ba09800f3fd40ff82a7dd6209430da847ec6d0afb3174cc5077ed2e7001bd442680ff189f62724881f8ebeb7cfd149673ffe04150c2310bc6f6a3accdc6ea0782de64c7fe2dc5647c78ca456b1795fc1133035ae728582fe49d1a311311035e8aace20a0ee93a9c56495dc5eb5e29ca758e4231df09924cf8bcd9803c64031410f9583e17cd1f02400aaed60a29f559c0c1601df6e670381f24758a573fb1950528a0d0ea5362dfd55fb9a327ade810447f09bc0c7a27a64e57f203e62a6fe7e1d18ceb198ece32f92ececbedd18f401d808e28c8c8c093b3f6f9318060f44a70eca3e3fa9149ebee479d3f2bb5c267b1b8a8b1c49c990e4224815148c133caa59d300d48113779941b99a0585533d31706f51a388d84c7c52b9d4dab216bdfe71edf884921ec0f952a82b0421ee485840ddbf6ea020bd98ed580435a671f11f9fc487b717ea2144671c8f5abbc6a2c411d26356aad573abb6917512bb41d5b3a440d763087807559926d4dd9c722a1eece1f8645090d04036765fb0e45f3b44358ecb24b11c77bd3e7f6191b99e28e0b1964661213d167156174335620dd7dbfa40a8d02a841a3777caa6f331b3ccdf5aaa2b358074bf8606b4423f09b04152512e284738443855a33a332af68253566b5ecf741db44456a463924b0a0d7c4c00414b48746092dd63830534a9a606e32bcd59354098a6e844c9162f19fa1b7b92f06c672cc449d0a116bb24fd0c12a6d07079b21c38923e02c6348c2bc10992a46f380feeff18ad7351a083194cd05571100c39ce7eb05867ce70eccba5c177038e31ee100c89ba1ab8e977dcf4f43ef55f8e2ed280ff69f98b893091539b2cd24ad1e56348c28ea5680dc8acdfb5217dff653b692c6e24fe0d79cab8c74f604d299704c79ad0acdf33a9e842df8b4988856964caaea702bf66f4318e380d0d656c43a69b86d79d69c8291e26a8d1fdb1c4057474e71c52dcf476bad094d255bc12c2b1234657672ff5ca2a2866108375dbbd610b5dc50a0b163a88b7d3e285c16c29c1479b25f4728bd22fb1e9edd001f014846174022275fe4797060aabb280b000fd8dd620790e1803c091100e8cb3852c58d1d0698618809a4ee4eecbfab3348980095490b0e522d7d26c548aa427b92e43dce3e93d5056e66f9e9f83be32bdfc6340262a6d2a92c5e74ee99f167e1bc9748b1d8ddf0eee463bd2ccaa7127546b610dc305040885563f7c0748c0449507b61b239d85b8a70c184b77181ff00d0048de1d7b2ae8c0a9e18e271e305124bed12ddea0743698b68939803af6a30e82ac1efb8d4b046df6796323ad41d8e9b13551772913eb8e32f6f91cb6d0557b78bc554970ff6c1551df9cdc48d1a40436c9b2bba4ed06cd7faeadd94f679c687fcea052967960376e771736a7f079df31c19f2a0a7edab02efb83976670fe4b3476d3a9a832568b05e802f11ac951d86893298d73609942783a7f813d1c12d816e89863ab6c5833a84d3d92b11444b5bcd6d9c304f93d0a225cc1c6bc2f8481cbe81435c650853744d685c1a7b2c04876dc510065b0bb8be4ec00f05af0384ccc72383fb39c298ed1e329867572bae45aa4ab10885b85c3704c0a0a61a3219bbca38a0b17fcf4e77168e6084ab1d338dfac2c6efa66ebab8d53712d35fd33907f0a6a7582f8b40df3801f7a5cdf01b8fc5aa1a7fe1ffffff2ec51fbd77d1478b6bc30919c18309cfb22be12ac8d0543f4a0474dc0646a4bb4ae0a245f7868cd06f0633c2ee0cda9bb914d30cf0d4320494b6346811e1a53461b4874de9e5faf6df1f4b40957b27ea90247a97c18fb91e9de11ced3d0eaa32a482d290cc2707514fdd5a14339fa9b4a877acdff4c4b162605ded0b414c3f7061ebbbfe95f83dfb022ef63a5c6572fad64b825863993dc6417485e6d32f43cc16e1cc0ce05aaf91316129c6c0084e3237217d4f612129a1eda24452d83cafad778867e0e9a8f0ae8c1a8f9778b5dd24627a81c608b80d957f608787642f173b58eb992fdbda04643e9e7a97a7a1ee25a4f1fabf5993ec645fc49ce2c95f645031fc4fb4d2cb3cc6ae4f3cbc01c69a6cbb04e5404f4aca7de67e3e2349abd58267f9326d347816775f249bc7792533f9a9fc25929adeb4bc9a87e0fa26910d1f21aead9bd269e0df3d8ac72517c00f70b6089b9ea94bffb7e648530d28b2511d08a0ba83256292e5814d096de0c0e2673d1acfedcaf0d5b135d59643785f1e04485a570ccca82a3a32349698418f75582908af7b74a6f7cd9a0d906ec9b02d63ddd2dd6cf57c4b664be5f6e9be3351478290cb0742126ad94464e1f4b7ae036c0b0567a2a93d31fd285446b8bca19332f44239f2dbd64c4f8caa68b507e0d799438c5264fdff6bc531ddcd7bd803f21c43c2a660b68bcccbbd918e749e82e67a89974644bbaab6c58b9d115cf79ffd872859bd7c3a57193efd5ba2be0011ca9dff229a32f46bbec78f610e7d46a0b6923507cee38464fd94b88faa84bc094f731025cc48e722772183525a14c947618e0eb877768d513ebcc008b6a3e500a13c5600c2ff0e98baa1c57936e4158a55e0e41384162e2162417e51fddd03596c2bacae1d2745057575931824d163606542231b4e534945bdd071f5d96f06222d1d566cf3924b3e5dd525ae4f7b2938185fd7323a89c468e9841f69aab16b62f860dd6db87c8b74ecdd159edc6244dd3db92398f88190db8e88da4bf7104a93e0dd4f4743338ce229c5847a10f7a2016c9c30a7dc1912a554fac87410fa208db83b2d01e4e116eee8d6f51686136ac50e8d75a5db5d09c4e6308d6d6b5b6455f5160bdd89b08a01460976f5e434142c617852b7be808ac745f830862cf2ec966ccded129ac6a7236446b54fe47e14c836422cefb3b5df4af1838dfc0c7f8ab255a70f4f3e8d2af776e486098f1e9728e914f631a0aaa000700fe4b71adb9a30410637a94899a8167cba8c22639c22751614e6c7f30cfadf88ee9f95837251bd04213f06e4d0e6356e28d54c8622b6652e7c4deb83a08c181fb0319cc59004ffd2ccb714c0c049d82534f3fd8f745b48bd905e025f08876254c15d4904bc7865313f7f7a773b236ece04f9a46a81350b0e6ca3528366448f41539580a27bc858c77a07a51b5160db2b1649e77f084b30eedd51394302b852a4c63620f1312a55e77fee657e780bfe41e04075396e74addc98058e8801f95676e676fe41c58650c75e762459790040e4c1d2ef5ebeefd300d387371cde60d1ffa3898c7b5307c9288f85b177ec8d0a623d7ea133d091b6db5fe285b6b6d965ebd95650122623648b1f7d279e1618bfef9eb3633d7ffbce32b6e69d808664579089077d78ccb05077179bd61c2f9b9d0f2a0c9bb1152e46702f1e9c1812529bbe313a4e11e3f652c5908fb6abaf11c35dc40a61b3045d98b0f46347b975619aad1709bdc6d8bc97ea2ca07b4b4f554dd0b0433caa26acf62ecd5e92d98df3fd2c1604aae960826e4c7b1a192cc59e0a3f0339961ba72adc82ab054cf22f39ca3805b0a0c412b7f4774462094a403096c55350358752990538125d2d8dca72899a96b998b95a9a3c39ee296e529df2508323c2527c744b462cbbc81b278e3b49a50cff45aaecb6e4d870914a73d03360fd3e4ca099587b68849c251ceedcdce2f0c49d55a58fbaec5e97ed987951d55b51b5ca5d3daca6700e380c4e87dc5569955cf8f073f2c73416b538aa080f684aff477a0635392afc3cf7c36a54001097483a638da51ade84a3cae59ccb39573698528e79bf4a2ae5e241fbd0a0f88457ed8a5e8a75bb0dad28e38a3ce8129dd938b0a19ebd704ce46a20142c6f796c370cd36b1e0d73df665c16d03e380fbdcd69ffcdcbd5c4be19e59812d04f69c9955269facfa8b0724d4584417b20eefb099fb86d00c7c07d548240b28e5fd6b1be4c615b490ccb410d36e3c4e9edbc4a0ed8508a3311e2e94c113e4be694e018aac34761aa115739105fcadfe55605ec739114549aa57d824cf11009bfb25e2685b085c9204b6e46c58aef98129bc7fd0bc1210b78ea803938079acb45c38b0bcb39db47ce1877f55ef320d5516f7641a28ecaba1b3786d95522151bb9e72a4ae9f5adbbc7cf3a76ab50cbb0f8d87dea02af58fd576e0192494878443d8f7e50022de8a0156e5c7adb05f7a79fa5401eb14312f5818ebcfd595cfb4694194204954ba7fe405bfe010e88003045ba8426367060e6499e0c18de29a02b32a3b88a6aa623c38ad50c73e0d6fcec2e1f9c02c2b91f11c0a9b6b0104e014277f10d8fcdd513ea1b5950391f2420cba207cbe8e62ac1f50256119e94c566fb43d3774fc2488609179ddf32b139a0346a246bb8f622f4c3f7f9531a5e9e90e4acfed4e82b83fa5e58be813524affe8b0e5ce857c6f220da22d412f0d7bfdd51ec2d73e8b06ba6e4b97e4d1f726051aee18af9cad91cd6fb2e5720eace7d812c53b3bfe805aaf63eb9ef5e5e4b51a095da81cd2b4f79c29d5abbec6609f274d856e367e5e3b3d505a6a10e3bb5511ead001b277e08cb8f5c36cec3867844143112447654768ce9218e0468bd20b52717e1b8b659ab73509b8d2eb77463fba8e95d8b60a02fb9724cff5a03a9f3b09a63c54b4430b2c9d93bd9452900e48e08d8aa4945c3ecea5d3f1dc83fb95d7df03b153a45ba2493cf238854efc69aadc9d474e9417d9b3fc6caf01752d4d347934040e417d76658350a63dffce410f229db4d125b64e5d3cae0300ecdd1b39c2ce479df7b738068a71e542e3fae4dc5c47727cbe3f394b55f7456790f2e5fc0ced15fda25de0c2ac6c3206bd59b003a33e7fcbb2e2c21cf045e45197327d9a3b5204b5048088b4193a1f5b1f1adc1f8adabfa6b7ee9e7c18b85c29e2993a2ef0356093f34f4c04c60b4a746b5d30b39ac5798829cebc7305685379b462a13f48c5205b8622c1b708c68cce4709dfa5e422eed962974cdb9e2f329e778c3560fdda14c1f892bba2f1cb2b6f5141d6b19cc274d69f10ad2dbb74512196b4206db41dd055502080065058419bdcb951364e09c47ffa5d0c55e7f33deb855df885fa44a573dcd6bf088d90058bc56e1b50dd98c9c471932ef77bec588d5004c0e758575a15239ace16ff5d57aeffa261db76a1113bf7a245bacecc439ae561114ee37ced91c9abb6ec34fba8f0e06d277b616ea227dfa248e6df17d49a0fb189e2a5e21fad5389da5034adbdae1a1fbe17405fc1f652313d30285b54cbdf6406b085d4e49ab25972e6b923037ba095fc0c8ce7e1a584c34a22258eb5188a146d1e15539e12c9e2f3f141dd8e7c0ae338645739b4efb4aadf6f180807f92d1acfc3a1f38d5b3f647067608f95564f1c8487eed3852be85501f6eae341916691d398284b7d0ffc913199a15676acd39d6a10d5bf3a99b826f7b8a22339cb137615bbfa2a2703f3962e21a71334d9a4ca625f2bf00f32a7762266e4b25b108a719b280691010b5eda7946cb139f8f8e231b86be8394655022d9373c94a148965ddd257b282cbcc37132f261ce2061744b607b76e7e0056690a1326e44ea727d2a1cbca066329c4db1342b8fbf76f0778ef2aebbc1372c1bb116717cc68dca0dcbc6baa22fed6e010cbe1747e96e85c59e95154ec8d8c72ec1a7821178dfc04a8d4513e6b2a47f1a01b6363b03a8d6c7e36dd226dcb93a2e32f391914b2c3de7b76d14a9c22870c5729e4d161c0ec7253f1db63528d5be9778e87756854944da3d21b987701b85bc8e8cb7900e5c889ffc7a1bec3f3a69bf12365923a15c9bfcd48a8fed864f5158dc01f62a71eb12b3c7e86bc88369b624f8fc9924ffd0c8a19ac9e8400933337e2e03648d0ca8605f5e5b08d7f3b58b5bcb718f17eb89972aa40ea5866a31e149e35869410f0e6251946a40a9ee6a51a4dadd570ce7b130930f158b00a6a829ddda25126f344476f68610d2e34eede285159b100283984923fc3f3ffb4544e69f086745ea3c715a32e5ed87e1b95dad729a03f33e65e49269946b27025072218a472d1d478ba4592a5f6be7cbac9c3b53f25820d388001bebd83698391bc4e3c759421717c0320d5cae4c024717df754bb27ca6a85728177224d73f1943e49b56b4c3314100a6d963e91889d795a81af6f690b6a578bd7576e8c85cf30468ec6c886fde779cb58f57b8f773922bd772a9d3af137af03cddd6ecc945cfda7a31d3ce8e992fa67bdee9749a44a361d81a743d2622fd0ca0d006031a838f12f6e449c5326ae3f866a7db2611ac719416cf264b4ef45983cb9685bbe13487981ace22728ab708f915e8c9914de2505bd6b710d1ce4e46d29b1ff680817d7e7b282baa194111f348c4897e4029e80c7f65dceb01caa69dc7e186baedc27597489b17e33035e4ffef342720e29f9405176218818376c44d37d41c2c753b37a4dd4cfec1f8d90aabbcb91608d44e6f7662947939ada173efc448a17d164bd4c50102058ac454be5223f529fb29a28eb5a2254055e18458d1a22fbd39954a61969aaea1491659c5050ea440e7fa613e2f770d34f1b17cf766473f783780bc716e069e1fc81d150275a0405930a4f093c2ec8f78f9c43d611d7b6f16ba481aeccf904fdb54bfbe2d49eb9fcb671acab6d3b216096549f831a50aa1725d0716cf570aab006b22816a49933b44436e11d50199f3aef504ed4342d9e533b14617eabc6db3ade0892acd43f53e4d1bac05d10dafa334fdb201cd0ad084419860697cfb28effda1882d1893c13e76769399a0cfdb3738524ce023159a7db6739116c67f1a540cb1f1febccb1b881d0dea090353fbd27455a33acc647edbe78e0cf9319b69626a51f213eef1f4a9d92de2c74a7dcb346445887a751959120cae3c3166c1a9bb8fd6b481721830c2e958ef234d16cdb6811ab81ca8d27089d6117e51927db0980bc2e57f1a11cf5f8c74ccec1b5ad7af36ea42f247b6d2ba372b56489750f503531a6b7493252a6a24040372a23f4228d69252256684fec7e829d7d977c7f4e90bbc5f88afdd1016b7c43a7a4f4d3bd832623f4ea7fc2d7af1e2b174958fcf2a84a8876f2bf0cff830202ff362ffd4a9e9bedb8de6e1af7569a6c5bf3b81468223ed9e951525732248c4aa8f25dc2087f7686a33ebc7aaf79a17eb65aad889013c0329d149e1e88627946ac4165a994266f9c9de3cc0bde1926838b0bfb130372402a51d8538eb6235079b06e959cf844cd7a70537cb1b9c27ac93f796f56c87444d7f95d90fa7040f1b3d5be6e87c9c52ce29517d9b188c5cdc3429322becc6952a47e3392b8b8907596159630d23a4f9227388859888735775823fd89ecf45f309f6f2d2697467af8e11f0b14c69e88853f2d6534cff7968a5be92a35e64310460540e543e2484e61cbd56f764bc9140f8e934b48248d32464943171af81ca75b2c7d36dd210616c980891ec24b48a264461e036b4b03642270dc96f6c83a06f73e9a21ece51e52752b88ba5420d618fe9c047519357fd76e6fa274a5b2743110f34e36c35cb70db155d41595e3341e1a4662685ed9e1603f351b6c47d0418fa53b0d1c9108d490ec15ec66bd3a5d681678e2098d5ed3d8f04acc820be79cc79109263cfcfb77f5ff781c97963d11cc35008a7905a7f94eb90cc1aac55c80a94bac244726168e89f74c27918f6fbcc439f262c163f77681e956e326e2a945624dca083f86405b566172d3bdd92676c426987599abdd63906c84b887f61cb6b839712b12072b9711e25c24eb0713cb343defec0cf3166bf03136c6ce259e71f09f374745d125202e05cb6a54da5c3bc05e1434004809595a39017006f2d83f363bbd7947eadd5e2e43e3738c987fc8f9766d5f16b5760b601c569a5e72fa0b35752ee4bd7daa1f412273ce059a74477494ecad495d7c2a56a5c2f0c3325a10c14f3ad3ee950913b7e23a3fdf82554db67a87a4e64b85b61e9847cdf0263c421d0681bcc5f9ba0e0b917af474c0a4a74fc091584a9cbbdc51a95c123f0ca6eda8def82311d1a688b46b9d7b7ac32d1ed1cc4e7dbb9ad03b0ac52c9ca324a960c9eb507bc6801e5c5c94c89459b7c628258d260e633157b916a80e606f9a761e14d108b7857477745558e783a75a2455577e6d859f13028d8b80a831968fb0c48d0c41811caf656c9ce2d3e0ecb4a461905c11dc1c75e9408ddbc162902b8b60d21411816fa0bb5c265246d6b702a4a9c663beffff07f9b2d59d2591d47f7d2c14dc550f158b31f197d545712734dcba5649672bd3d5b8912c1663858ce9601930362d959c57089b3cdc0577c0de5f6bdfc2cf69645832ff80426923dbd91334207dca1cf3021454cefd01592cf3ee30eb81e11dfd4ec6dcfabb8e2b2fed5a9aaa2c8b33fa7d5bf8ad1d75c264fb06198084340f87528e3a6041ac488f5f9ecad71fe1679539b93f599b4de658880c15e93caba0f624114240ae4679e44a26ed2db28e4768c503a2b33474071c28953b228d1f2ac120c710fc3acbbf821b173c53b4f606649bc405a1e97386f0fd311674567c30048de3c288a6a68fc2a753130878c95ca4e9e7a2f4c1c0d96fc676bd45465e2cb93521d58548559f2110f2af2471915bb859809df3d22319b468afd2a0243c9599e332ed4f7823486ab0b6dc5501f58fbc1d83068292f58eb4262271df99d898d660ef7b96ba0a924108813b7b38d3e60af55bb19e67594a290b63a1a05c7308aa2c5346ef849da58ad4818fffd58af92f4651912b81a290804328f963befd431269b01cc6d082a8bc1b923327038193aab021ce03e294876a4f3eb275c828edc4c5f8e22a9342b61e60d983b8da34cd713ee96ab1f36d78028843f863e1b6021673d8fee2ab1a1448a3c164a89300cd23e09d92e4603d627979b9fc47b7ac76f7abb7420329094d0354f364ac9afa3dccd9e31c79253cb2cd50ef7b520b1608da9843b66e47fb8eb378e4d25d60599485380c6cffab40bf70ce48a03c5040c97b19e04ba5dee29b10b13ee1d8af9202900f52f03eae91761e61e89de1bae8b3f8a789ebfb31a118fba6bc1fd2de2192b042d04b289ecb4b3e5eb366c5dbc29410127b9d28ef66df94fb255b6e2941366cc9c6822f05c176e56a911b705647e458af7d3a7df61d183d8fad4562168044518548eabd081fe0d86c514ee2a125b413f6e9c9938bb3c0db210d1ac2f20026f67da36b7998215e2f0602ded0b8b58dd388c10b4a39e98c1b17dcf05c1f2ed4d83564d07071730c6078453e9bec4433207563ca726b66e5f58b7823f461dc2f549618a4ca49b442346bff668d99cbda53e5e6113d81b251004285f371f48170510ee3570fdc85bd20097d597dfd0ed4cfa3986e9dd5e1d6485fe1780743ec96b81386ff5dd6ffc30de4d3703524f355f8f00499029f57c05fa4ab703e6ea92b3ae9cf9c45238fd29c00400d674abf4af3c5d830a529ce46db994ec73ac3f0ee94674fcee85d50bc64b158ca7a2d5d3ee74c06846046a00750f4ceed365ac34eefcd18ac223bc0b3796ffdb508cd7fc0e3afa352843e41a32b515503de1d9031d31689b25d1ea433b45fea743007febe059f2353c0d29bc67043d9b146ff28ae927707025cc294a69f26596c6e2b4262ae540cd3c551ed54905512290da2c2b47f0a0ce5b9bc6b3548ca7f1e4923b068c2daed763c0ddb4203899e1f6ba12dc5eac769da7411dc702f3d4a4dc965d7e2f2cbf03e78af03ba41b9a88be5ac9c360261457055691cb045cf98e3909c4f1ca9d00508784ca6e611e1298cb8c7b2471372ad898b34acddd60eaf04654a7886b606ff67c1756619a373613b37e4a68bd3bbf1821f3afb1ee9161876c0cfd94e45c332d066d3d11f811e204d17b13e324a802bf2a9fb5b0c3d7a4e4bb378fa72c972ea98b7e7b18fc24658dcde242dd86ace641ac53c801afd6ba18b0c44cae5e618a3b96dcb43a0d8a46f7855063e563d5ca5e153c883d6d2d8a81ebef742200807b728ec8ae44859996a913aa70a1b86b4ee19efd0ac13c922b3d3ef9846da2c92a3adedfeb2fe1e2c44e42f209d44baffad7820c5aa37eb0822bef96f87744bc46fa0f9f09286bdd90085d3122994c4dec850ad60ca1558e2e2417c8a1cb096e306fcb6715d8f625cf45c11c26f7277ba11ea42a77f0b0cc45244957c19a27a8fe020d73990a746a1efe3931e948e53fac7a5675e297794c425c0badc0de3dfd11fbcde851735bdb7dc20fec2df9ce977f187557b9833d7ab4e41c3244232592f68c45a46c2c9e8cc0b26006a75ca23ffdbce86f8f200a3cbf665a90ea782c7ddcda9a321c048dbb6e49ba5d0c41b4d15e301875d5b91d4c35737d65f5f51a464af491ec7e07ce4230f62009fb2e2da9eaca928178b1ad05205c6c162b0835402d2e42c3795fc9dfbe2b6b3cb639572e8d014aa0a53b652993f67160050f8e2c77bd3176cc92b43e1882232551ccd007c7adcc6bbbc8e399082e538bf4a61ab45275d45636986f2742ef0e03b2c61370532f3afa8823100fa924645c16071d604e6237677096512cd6b861ff7bc9c50bcc2f51fbb2266e69538ba0f8b91da4a7fb0ca5d4fdceee012936f26b4ea0875b17f873fe506f00b1054a668b3d0d4ad184b2e0760e3644664fd68ef93c8c174c7ad03aaa2fb569bf2995b52dc615cf516ae2d74120db04a512085455253999c66a9519e8c23f00fd5f1162b4ff03212b64446ea1b1d8bba878225995ee741adc0f1ef941b8073503a0941c9ef3e3385892879b1bf89db5980724df67e83e7bc1a8daeb0f1ed4ce895c3b2f0fed768553924d2856a2b73f37519da5190040c554f54379d67b0766411335581c5782ff42c4302d5f59254f5059a740f9682ef9df971f4c6258f962a491f763d872700d0820b5ac3d20e7d4867cb307bc523f9bcc091da8f6812248ad64aab34898ab1f5506658efb69cd981cdb76fa92e503798462a9b8746c4f2f246ef4ed93f9015bb6ea55cb185a335a2165939a0a78b111dddb2a819a9a942e22bd6e5cc48c156dedada9f15b91b82a02219873741cb2a9afb69149dc3b34e0e2d10d6345e98c746293fb86248f7be17e87df528dec791419f2b526c0b39cd4e8d90ce950b7f02a761fa8a1944973a6c9acd65b2906bd0ee01b7cda51a9af1647ab0669a43e44621c112a0b9822d4b1087958dca810671633c4d46a5116273fc11ad1378cc695f17dd709eaa97155289308a7e5cef6f90ed624ebc8012bc89e02ed3506dde3566345cb0335b0db03f4c01f69935ae18d62c99a82d001ae81f8f6cd1ed824214a683ad12873740f45e5d46bd0ac736108f1e38cd4be4fcc0767a069a6182ce0b41b1accde07f5d8fc796c1ad76b0188ff7000576a4568ff51353a3cd408af151b3c5509cdf6abd903afe18a43e22ebbaabec8f901764a9035524daf5d219d18d762676aad9c4c77e62e06f764bf5588538c798a16dad5535e86f008089abb8dd0ba502b3a69f8c9ab25120a851c59f8a24387a89541c14a9adf9c7399e16ee6ea417125a7c7d503501cb6aa053749e0f7d3015081e53a1c30c13880ab96624aa038d79144518782820e4b8894720b3eeb81b540c590033b17287a0c7039f0cc772e7f7f858506e9146d6e6833f5b7fdb1d439501bb62fdff04b797b5cad3439013c97af80c21d05fc3d1d3080b3f642d68aea05fd09b2c669b892b7300725489e1b734b289454762b10025ebca8ba2a4c59a30bf76b54cf1d526c02d733381bb2b82bc69f6f719b0dd5c233dbcce11580a80badc20929ce607760d50d82ceb119f30bbc1cdee4557eb1b8bfda4de19660e91e58d34d8bf8799912800a505182c064c2daa932f461fdca1fce1a36ba47dbbde057083c23f26b1154ad07e8cc1d1615f525c02799aec50624564d15d2d8808b28247c0fa15fd31bd6c3b51368dee8cf12b983e4baa3f6d04e98dbe2b51f14e61d7f0b3db98698c886516fe48fefe8afb0e6c5d9b398ff1f28a69d3e20123b8e96ec58eb563bb28cbf2da69abd4c821999a0fc75e46085a0ceb59289e45373ad464670a204b62ec8d9591c9f3559b2ff690ca1f96c98fe16019b6f351813eec79a4fda4bdc050f69ee4e1ccfaeb756fa79c7df548ec703d8b99e68ad21a22d7a76840b5bd5cbd27ec238a142c8aa74ef1387d66990f753cd4a64fffd843a149dfe4ca82d69d10339925a307c699c65421880a784fdcf661730f99f5dd661bb87cb5ff42e802c93f7c61f00dc835bbca86359ccfdc13d9fc3437e3ac1662d5b8e19b58bcab2c44fd59daa805ad69cfa3b7012a031cd9ff547f5605c536092595168b04143c88c99eb4b7f15a3e26d41c297e17d4fe7900eb6718ddf1683d55a78398ff355bc0ae53400932ae980729af3f94cc089177e780d711e5fb13e24984cbe54ebcc5b6a68ac836d0cd087736904502a3f7a1def8e2056f8232e199dd7680810f9c179168ac1dee6018d1078bcbeea6fe7d61c5ca8bb8931f76aaa22ec1cc43b5e90fbde082f36739cbd23a0ab650a9213a4490ac6efd831559fcb19e9444609531fec6f303ce0e221da03611d401760d5d8244e326432b11891b9b67fd9ad69d08286e1ba2e5db8bf9d935095bd20922e20d9143221ccb28c482407e0cd5b00e408f25c23289767c9c663019ad97f7cfc93a516cb1d0902b43530e425027b55bede05a8ac9cdd516108d4a07dab27b3b1839006c7407aa30005e02690570b99c5af1c19ea1fb0379f3658df2dfcb90dc4406f36a1efa3ea0c67d2924360f1b9335530f7218c10b81d2b4d64881bee711d5c7c8a2a09a5777a5d7fe5786aec2962e18e7eb7d9dfd0fdac81f0678ec9f2f43102adb88f78909340f03b5417a6ea4678813c02bac0fe5fcad008a6306491780764e1c9bc8aa2e9b67941c2390e58d83658464b7cc88c32f795c545da676a1eedd74b6f8cc41314705baf1de1f02800a80fe9b1cf4276469f8055622961f0362f932cdb849dddab0f5c631c958e12ea2c29afe85c716506a04026c2f85abd473acc16f766886c18f11b5c623be7d06e1c0905607a8a58f5d65ac720aa9255fe8e2e0ea0ce4c343e71ac47f10a2565b8a005690706ffe7615a6d02fc8314b65a067e367ebf60bd030817d07c97ec53ac1291c874bc37149c25490da0ec06360c36e335d6f50e25796fe8cc03d9da6ada9844ff8f11a6d34ecf454cbbd8fc7284d8710a19649e3d72ff83b18a968e6675c1215a3d34d1d2da2e1ab852f61fb63f04fc155ab715a18993dac49e985f8edb4aaa51e6b750550e28146e4ad0765363287b5f6a26b0ae189c1728a00a71825b273fa0df5565c98cc07a93f41fe8db998aad1970322f0fe9607893b533a99cae3aac7445f88e0e6c14959f2b318c68599964ab1cdd55df216467a94247413a886f162c98e695d187f3083e3fed7a72b633dfd6122f7eb87022df8ef043a793d5869cae6839c70c6e9a58e77d2b2db760c727b0871e42f6cbe3c18f695a7dc79a5500ce93244454791e5688820b104f4a61f2a925977b4e74f9304d4ee6b5f514c5fcb4c7df08d175febc234ac97dd55ac80a9e50c0abe29363dd0db6002591d3b200fe32409750c72cc2424609266c544e892629b24ca2bf1d0c684bad90f515a1e50bdcca419606cbab2022f6068be06931a9a2235caadc9f09bdb7a02fb7482ace97111c32dd80b802c0b3a670673351479a4b5d050a8dab69fe74d5101ed49877b598762b243bce171ced846136ff23f0753e8130d3f68fdf1e1bb297a08a47cd03264e93cdf9bd2089bd0cecd1ce6d95903b3b2b9a85357088e122c2a51addffa5fa00799afd3862a2073797bbd6bdad7a5d552dc36cfffba703257e9d13f4124f447073e27bf760b37c40d3628786f7b49dee2d7293de3041e43b640ca1dd4a8e9a12e6f28c1419d7d19b6079be05bd46794ea0a77f4112edc40987563d427d419f3c2d7e257c61766deac4fdd22f7e2add2d96ff94629ede9ff5133e2efeb9ccebe124db55736cdf4adf4cc9f4917d5ff82642ba7bd311590ac3edc7bab6fd9a79600abdfe8a4b04ffcf93d5d813e9353bfd5bdd65a64c88556bfe6f485b6703aafba5b389a85ca158607faaf31b845757112e40752d49944049a0a68695868a98f41f7e3b33f90dd7835795d66497f41e51e0d83d3ca1950a5b317df4140827959f21a4f497513d0d350efb48edd43a9af5f82afc5d21a64f3046bbd0a4d2fb47eadb8f435d8905c00a4a4e54199831d1f9550540e768fd3ac027c96ef7d13d5dc5eeaac1a00febf8ac30af8b8c39f43e7c35060c66ee128a8eb33bdfd05bc6648b50a8eaf00f62bbeec6b076bf8150f35dcad0a5ed630dd77807cc54b91501716a515bf49e1a890f72bf412927ab21144bfc1e5c28d238e941fc4d1f4010a114a80bd26413a9543ffebee493238a7231de71bef1f58e281cd5aea1f6ce562ace003dcb01a50c3e528a392c1f4db6574492b16a8d730f5e5c56cd35de4356a4e0cae446616772adfe15b3d4f14e45171a515b7f9e2769a94718d20143382edd0482c1882535db7324a5ce7bbdbba170f06f9e7a8c94e9ee852fe0d778c5c2971e3c2c97eea7f0f2c689c028eece628aabbd2cb142683ccfc064fa235b96d6b92ccd1a95bb492e17c9bf6bc39dc61e42fca675754d3e6ab05148f1044b5f2eef98b932e5f023f9e42cd647c9da9e300424bf3e1435c493b405b85b07af784d24d6f109104c13c079d6cfbb2b461052c28114f6e767e83d6a846b9f6db214645fc9d7f83fa5a170f2b8823f12869e0216ec6fb19164a27ffca69a372252a3b279cd5961beab8ab88889dbd13d609cacbca97bb2170fb8a3fcc9dd82164ab4cba561bddbe86a749000af14bdb24de860a135d9a2dfdd2874d0ab1b23445830671a4d30ad19e620aa3ab6220c62840d607a6dca3a8fac096d5b3a922f1fa8ff965dc3683c6531417223e86a0ce1d21543307d1479f52882bf23560b2e74509bfc49e33d5c09927ba4635721228a3db2dc71ea6f2044e2a5b6c000cef4957cea22e05a26bd5f33958cf0be89fecb2d1d0cd2d157898214424f488be9159c0467d6a434df9253c7ce664296cc97cd614ab0f397277ff954431d6e5ac99a7d437e7f58e76e0e8fe689973d8ce8767cd6d69be800bdc6c4c062426a96d977a24e40d218c653ba598f387ad1af7de054b1ae89ba3fbbb70571ca22cd693e7f4c2c4b3491a62c09d958eb1973cdc0663462d84a4c58145a030f9eafdead93636ccd212b918b8c868176f429fd51cac705ca814af6aa0e71402b5c7b61270296628fb8b60ce3c763362bbe87d12bfcc4d70bd61aa843519b80eb407c2007466b316f9ab01aea4eac43f710ae8c993dfc633359ca0796d58e327ed36a94481823fa5beca7302b42d8ce81290c1f5a623315973cf4af05e61e2454b5b5310bbc72b6c306af5b7e6f3f806f5bb79735a1fd80126736ac3d53e52a91d741523fae7f7d29ed1ed7eae00368d3eb672cc4a6c22e64a1d8d55c3fd0e4225212fd485b818110b3808f812a3016514193876216f1ab10e81d5fdc510404a4884e594c04d5d1f92bc60f0cdf730d263a0f30755caf8ffa1301c7e6fa660cf42137c2b9d97b542ab98409d613fbbcef17bb9bccdfdabc1a1e5cdc5065e317629894b81843bb38d8f63ee21fe338ac94a33918982f773108e85799c5cb329eeb1a414b996880737c57bb872f3ae6b20ebadc31cffc0484244080686fce07c68d5f27e0c431dc7fa7af9134abb7e298cdb99d9537090ebe9b8c440fb2a23fc08d2f26fa3a3906e1f75f69e85eb66f0e8de02a7b4280d1d2db612f7ca6f7173f8297bc8d1841303f874e7b8ebdb3719c36e1d95732456f97715cd493b221c5e2a8ed5a00f328939c876d67533e208282e9fdf13ad5e5388f7df1660a647b7b3a6f94c711cab0fbb3f3b265025a55dd077e4a02cd4ca958fc40c9a4061146ab400e3204bf966ea2497d711f25a5850537c88cd8edd6b9b4d0bb6684e41191c7391024d204c0bfc253972acf96e6c95ec842ee201b1e9d8fdff188b9cc5b667dfc4afc7730958c0ecba9b8a8bc00762d41a4a62c7dc040fc0393651f26a81beadb2f06dea0c38ae6736d768288fe407b610d54094a6dabae50003cd592963fd7b6dbc4656b2b42d9b844ac7a8144333c95442eb6992881e5bdafd3d6b17f543178e5ae1656e1b0c2586c15aeb765a0d8caf619ff9476cefd272889a80f4f7cd1db6f83d6a90cb081e292914fd7987c49612b678857c09e1183f464cee98315f174cbbad7db9faf799142b990af11d31bc170dbf8ed0e587488e7bfe653a8f354e217643abc5deffc5f273a1638fad7378077d5c3b48ee0f7914a2471bf7012457b037a180e9917740c5b1856546ebf54d809f0f039b7a3689861de6e850536d4823220b652907aad5025e6967d2b17e1ce1ebada4c2676ce4a7c267e510a910223871183fcf7323b50904cdb70be4fd182d9468f62b11971ca52cdfe62188474a87027ced6f4abc03193ee46f2c9fdd3e2c339c60007410d724e8a259e5211654902d00a1f1914fd034f8b7c085dedc795fb741d4e4eac63bc61ffed02a66402f8ce60d04e83b1c36b606c4dc0ac5eb59ad74f85a2903cc75dbfcb0a529f83bbea740d692de2ac87b00eb9b625dab217033e607e42ff72854844204cde482f3b2045381479f540f04b5a808d32834e12697354229487d04546047887f51b9df0a70c6b6a2bb37dd9aa10c15b2fa59b07f711b724cb62e883e97e2649814ca497a4e8c020d26f5fb7e72168feac570bfbb342e9ada23bd20d5505bf4e97d02b1eb70cffd5c3b037051d4924bc984e6c01a2af5fcf8cc5ac825a2eed4574a4c821543d6e8acf00fbd4a5f0bf001995c86c5971a0c94c20b4db125854a42a8583bbc498f2c2e817a5393c3b56daa3f926139f22a569f3bdd55e0fb5cb70fb9b69dfe86be23db699246f586627d5143bc12c7f7de9aacb23e793f50f93e3bc81e8dca471bfcbccf3afdafc8f4557dedeac49f0fc0e847e36d1b7f4b1b920be7b14427d792ae8720a2eb8f339ee44f79b0cc931c602465a21444963368240e1f9a86566843d5c31cfcc7a81294a959cafa0e318534a94cf940d3bea3b9cee1897842162dd1adaa354cdd29ef73cecf1b66ea143cab0599509bddeee08602184acdc612b12e2f914c9ded8e21cd01a07b84baff97011e74dd4bd44008301d49256790ca86d264644ccebcd0f80e08280bfa9e0d79628eaf066035e766d04c44469038db4f9184f7395df6bd24ceb1f77cd83bd37cf0ea9ef21bd5e03a0fb2009daf1756b11868393b4bee58defb10d3bf0e72cbc9138a96439581e4a7636be0dc082be056089d5bc28580ebb13bac53ad48618798b1a6b23e6eb384e669a988d318789e1ce86ca40c05321855d78f0188fb9c2ff221cb2e5947a6e9ab179ee1d310e250bd969625fdd79d084f74d696c048ad18394ad8a30f9f2df4d05c61cabc1dd65580f8942f0d02c60486280a60a26af8806cb5101e9d1e4843215d7e5fc76a3d4990eb3e287620bd8428b8a667b2bc148936a91a25cb27f54f769d402ef5589a588c8f220f6257cbe2da40a198311643bd7041c7929ad141f8f019fc56f8a6f55249a279d689bcbee603c4d1a3da8fb340140bc650f803b844c257922142d12620cb50a3215869a21d8a4341084106427bf02e871df9b451a8049491ba9a6abe6dec4a40394366de317a31b502fede6d4c2fe298cf3fd7ca3019f953762bed1faed84147364091123655ec7c5cb2f667300d77737497a32c9a6b2fbedf255b5b7d0b4ade2554433478b95fc829f90e8922b2579d224ade2b8355370cc954acc87e140737ddbbbd1239c1e7723b41596e075f0c798f4ff604c703a44bd8b26b2122e2040a6c7b7fe552aa7967a1892e4efd05865dd279d7495cae78db3b897c9e0174abcb1d94431b95b0076c21ba2b3dc4426bd318951db40655bcb85d741c0258172ed2f1e69f5b2502e40f08529aa8842c295e8ea23fd5fd1390a95bc629ed3544c54b377e4823414d09f0ec19ac6d0a67a65cbddd222918178d68d24110c9852428db069a30f80830db3c9ef92a33b11090fdeb0934f0b5950884220309c7f237c245a3592fc0e43fff774828ee9942b5c258d2e3cc64ab9863900ec65d643dfdfbc319cbba31ae3a58c50723fcdd9207333b41144e825c8972929c187b69f380a965a232dda2817eec18fb8686dc125042fe6b406314046bf1c0730147ecda04471d8373ae4b1284a86ca7bd9b3c3be2eea887305c1121c473f10654dd62472d295b5e9fa2700e61c619d1aa149dc05138ca508f11ba44ea503a88207d2a0f0a2148e8e79ee1c32c6d1efa04b1f169f9e35fd80f6e4d332828f2f5fb02e4c9a936b35a1ea83f4591ea1bf8ceea517b8b0e64f0face44db11162a3bc466ce812fd5cc2628b6f95b3d4a9d648be9357fc96c0560d35da44492982ae0c78f284d2dbd93e17778c0490eea85468bde034484030786a6b9d6373cfa185825d30b54de2a61e86e2f60909511bf0c851d004588753cfa990ac44983121bc862189aa13c9bfc29c59de1d9889ab57ae2449b8f654fa282ad1b1f38be8093abaf11702ffe9a7e6369d236b13d70939b965263e971d414314926fe0896e7f39231f24ec6268b6b7dd2b93920bd0b36722be0e6c4c75eefbe81d869ffbd6059e30376e22f948c988a6dd300b3732e02e9bc3f822113d4a14b23bc11b7c53fa1c85d4d8ab6f9dc396a7f4624878e1009a994edb9b86b7cc4948eb1362325e65cb5818dd91e8d75d6c0b73ee9443f826a0a03f3d55077ab58aa28215b599981012e1fd8b0ab95814dff4366747fa4b2ccdcad4e5c0cf4b0a2e9fe869c859b965f7e520805d5aeb6848acd4f970d6e5e4207dcb9e16bec53ff8100f454491633071c8bbb41116e3b970b9433d160dcfe1e531974acb9b8cd17a91362925ac8f517118528f9a9f1896fecb29c3b1195b795fea8985290f135ef9195cb4af13e553f25950d0d67c2166ef08d580b683c3935619a3360450f19c028e0637e560e913d092c2fa2f8c43cb23fe7129a9316c070d253c9c7f9387827afaf8aaa95cf3f5189b7ae2cfc9eea21a6d8092da8c28af01c409da02ec7f87c1b2105f65c99fc48ec98e087474d1adc0c2c7836e5e5663633047f107d79e40267fbf5a04ff03ebf5a06bbbc197f347f3d0d44144a30a75e7285d817b6af52d9f3553017a8c146c8aab5125be811014d95888618e034b4c4e8eacff475e8d10fef373b8f751192e731e0b47dad109ffc24733f74c0a1aa1315ccfd6d8c1b206bb5f1272c79a03b1e465ec565ab95ac2ddb3c0ab6c7c7058973b203a7b7f3d8cdb10f22f8e4df1a127f6955c0091a5392f76a6eea1668ae88c6c5c16a1ee2a1854b3a2b58920ad4e6afa21e74da54634b64ec010521b45cbf8a0378bdd4326ad32fb1222496ddcc8a6c60c0de11c008ed87f5780acc390d1abee4da14b6c5287439dd7404323097fa96135721e6ccbd58a15c4143bb326ee4cf54ee0fc0c5f8c8a3df7a0afb217f4dba43c9338424e53898ed7f3a43cc18455c5b15e2099f659caae91d2072707322f82bce2d781e344d285f362bc1a40e2df7ff5228e0d1d4c69dea20cf65df1c53dab9ad72f231ae8d891e67b36178aeffa31fd18328228652783c4d14c26aeb2a78f6242d969169b70e866d47cd135f29ccaf6a35d475af54b236202bf0609c8a295cfe10f6badada22f5953c4fef64f1200628528b9c8c1719b319144ae93de26fc22afe4e84983cdc6954b4efa7d118df2ef909a3f735e5a94372de49eefab5194d53a439e2c9d232ace389122d0292b7837e5187920cb47fbb43729d89b0458e6c2215da47eef5023766a97530071ebe91db3f067540d876a027070cfdd2483f9c9c7a08abbf203804758f28b0a741872539059abd2419157541a8399bf3f237e3104339c29ab7e8cb230bd91fa3e6de76a01c077a84073720f92c89d555996b45c68346c4e3e10f2c0625d47324099742e4682a1ee7bb95676489b3804e0c043a07258ac58f5bdbd55bd4748836935777a6f6fa28e51f0466d481e3fd7567ec328bf41626377123d07a65d84073a81181215134838768b07b3c9165fcf9e19cebaceb8f279a67a73b3d944a75bcefa4d47a504173cfd1ab17525d0931213c4064111ef43a5e3826f204781d3e40c62ba20b04f27c88256e17c35f185425785cb078e8317a87b11539851360f4a161ce2ad13130e9d7687f213f1330fe88f3386736f5adc784d96a2404d989b83f4a3fb7879de754eb148909da928cca9f7c0422fdf0229f97914ff5f6480563a157e34ac701e6b928e601a05e7ac496866ea855f1f94eb0511eba693165f327f7d8d6c8ad6eebcc20f3542cf11bcfa87fd918e266217f72ec19cab124fd33a95bc8a223376051a09961b8c640fc240bb6c91b82cd690c4144be3a48cbe26e0e517ea24a7d0bef20a97a6dd121209450b7c39abc7c347154aed86ea5da0693966efa7cb9b7b1ae214551e4a4c289542e052d42aacc9ab233a16c3fcf4f10eb5e328a1d43a012b6139c1cf6f15f958d658da9d6c334cc84af07c2549438fb0571b35ec8d06f038c0c191be86936d26bef0cca2b5a5f83e2f6dd4956339cf9fc5c9930714c30dcdc6e3f489615466ec2efc94ae426ad47f9a362e1af627adfa5dc06bfd695206c05d21e04a214452e7ebc849d930189fde95aad1169326c5721cb34eadcc4964762712e1b72fafa2ea0c393d6e22a79464bf4b09ad3385a0f27327a8c76414fdf018394add6cc1f77978f6976d65e4886f22a3b8c516ba8a26b6fc98805d1982452e8f0bf1a54a725159562c558237b9fcc32020943ec14296e586c870d5c27258fe3c2de8200a352286cfc1432dee17e9616f49a9ab3cde91def7347804cc4145b8c0c11dfe00a1f0f6f3d6bca53f043c1615e2d412c696e84ee8de11112818b6b60c73b216c37c041805d2fc85d2d35b23e83d68f42fd53044584571ff1f31680962c8b2538cd1c61b661d4f71cc1e3e7deddff918ab479ff05e8527270a78f7cceb19727dcf5d7355405e2ceacef31efe7a7050895946bad0dedef17203166b2e51cff64773b6dcc2637d5112adbb7016de104e60fe943b9ca96b7cea344e3a60ca29787243090566c8a73ce1df78fb463c7874ace24d73fd4f29500bf56dee4d192d4b878ea82700b36c7c517fa5ddd0f097edb1804000bb49e140662988732856b5b42e334ec4ab9869cf80e8d24f460192806653adaa8e2d76105148eb2166c2450622529f767e16fa9968af45990cb0a3c603446017a568db57cff8b220359fff968cc30a823e1048e0b1a61bf43f89cc58eed942fb79430257fc82b602095ae9adfcbbb1aa16d2cea2b43713ac9d8cd18d590377f0c3c01b558c67f2876facd2fba7e82fa3b8d65ae280ba008cec09ef4da63e4bfdd1e26add0371d75501e353f3c3f6e7e326bd7543c831403e7d5f947fae1e34545197b925f9a6856c31e6d928156c935dac39383195484b33ed0aaf6758cb55abf6a50b333768c4de45cfd1d4180d966b25f193ef26f1fbd1a21222ab347c7bd570c4476fbffc0195671fcad1e6fd8a58a77ca77c8aeb2a6ba087e69f5625398a6c446fbeaef1278a8668258767da5ff43c24d85a2bc684b0d5c365fb0ec81171cb11f3cb4a9cde0a75faea84376594220351e9617cad8aa73e577a016a4b00994d8853981ac91431c9ba5e51513fc1801fd1c10d14515e9a02aeab607e5dba506ac322ddecf98cb1080b419c2fddb751735e810a3fa036fab0d46b33d5afda0b584fe2e23070ff95337e2a1bb90a1dcbcb063956ca87f1b0b41a79eba42730d5e0c53e980f5930af84a60ef93643a036ab17f4eca006857631370ffcc16ee399690734b44c0f73a44366334079bab14d5e67d4d83f7dbbc60e3dfebc35c38820c9dc7c4437c2042c1c895d6b4a1b7f5cddb6b5e890d7faa43bcdb1bf9b86f271fb52e7d37e5f8bfe545a374476fa9d0534af4d8526000ea68c3fd7e3ad4b8dfa42ed5b1b78f11e5fb3d49bdaa510fc6562070af7d5891646ab09f42f443133f10137f97a6776a6af61f4cfad1c35ab6d7b2e5b5e1bbb5624f23882239f509d0e89feb3eb6b8c07d0d065ea718b59906a5ae636928375418abe96833ef9bebbcdaaedd2dd78cb68b4d262a5dd3be57354d696b5785d4779b52bcb6ec221bd5fb00536d17a3a6ffca7553dc2f4dda932c75c5127d88b58906da5f0e24fa50f81b10ea4d8f0ad10d6b4d8be1cb8eb2fa0c4fbc113194d4c59e304f234a1600b8597639bda184ba75a59a248c7a2f34c4740ef1a55b1235d63babbe4e7239b898a82eebb43417b56e104b74bf87f5ce6a8826a83aff8b55c9a3404fc2ded1c2b9d55db829e979178a256786cea2648920823fbce332bc04a83dab9a07b9d521143317874b37d640771323aa434624a85c1096c38483a1c03862bba98df8aa5c3c19128f09158440de9226a8645b038d924aa09c3f71d40421fab88b285e4489b8da2c65b90ed5f6ee4437e9e1fd39d30c2aa7097a5fc4552e0faf0dcc79067d2500881973aca0447176c03ec6510e99398ea5a6d31076ae627e236deeebf5c0ad566c2e3418bb812468cc316df054652c98733167e88b0d9c215809777669466d29cdf869f2f3d0cc6017736bd3c9a74a1594ee44a5a5fc63a2d51a95b1e6120737bfac93b6d3f3acd5768770aa68b676932d1e83c506ab000adef304401a66dd7c2d817b2be95324a740c709b6ca191b26c0a5586c388926da9b9a803649b226b173e6ad16d4ac06c433949a30e958303500c45422a6cd044284f5200e4d3115b7a1f4e68e0ea97903e7507c41dc015c3da911739140ac4a5ccdff3f04ed284e6e9a88352b5b76a3cb66503e15d2c54cdcd6685234f10d5a9e1916f81d6861c2a60225166215a5b75c8d1bff5cc4aca4ad64e086f530fd35128f60b71ff8c4947bad63def1fe5c23fb79359611a85e60bde316807ba385277dfe4eebfd65bf20441891a7f186f09019c2790ab9fffa7bbdf3096bef0fd8328428bb858abccce099055c5e853bb9f18022c6917c2e97b83b87b6f4908ff5c51208558780c84adecb79c542e6e402918835e3e1819f486e8b2cd2f34009976172d6d5d0ea622e417a354d6cb16a548cd3f3f1d04dd4de934f1910b886265580bf01e23658d5fb5347d6acd2d6f172d9e84ed321ad1134281249a47a096f382243c193ae62816765125af6721ec96fc0786c9eab1b7a8209b153bf1030dcbfcb029f8a6bd40a21522764c606c91195d4c01936ce538b1b8c23dc6a9cd7224ad92a4ea0a953672ee1927797840e7cbb84f3df57ea3200f9a1c3d71e574c46e10f8b95a5e2c09ac29788fc25090208f6cbb9b563352cc70b7042183cf121501470689092dbb3834da9257f3a4e13f6ebf80400a970cdf025b7f2203784fbf2582e9ec6d34e3ffab1ed2d6f3af52a622489533b0c4090ea9477a52d0e87adbf6d14664bf800beeb8577bdaede1a0a70303334619c803006998ce406a89f780567b20c8b0e9554219771d0100307eaa8fe19f0559fd73a13655612b512514412f65b42d1cb3ebc2b74be8c2c3d54563c5921b16a64404aa9b44fd3bbcde0896f8e3fa569dbac9f775d3cb120196b3e10627e357a26159c9fa847b84659a928d60f7349940274018ef320b2cd9869065514adae9793d02ac841b639f5bc62e3236eb6d2b42e7714862350fa789464257c8131ef97e6623ef434ec386ab8c0359126280846f5c27c64d8fd5b589354581325ac090833877b03419683d0c707e855fc32ab738eafa5e64623b2527b63525e3428f0452a5d727c2391bd3b9f15819819e558e7b93447a4ccb8c4a95be5a0c6c4f37ccf237437349250fc2ee1ce8eeb3af314b07fae2d13ba0e44479735dbeb65aaad08ad5c2ea1e8c5fe143de4311c139def2937bc028af47cdedff9fc157545532656071a49cd26aa58fdd6c652b184cab07bd1f2c7fbd6cdbf2a7c3af5d5adc92ee2725c30882706621f161c3275cb49cca002ba941b709e255e7a6baf49ed384794243a13928a9f4baf61e00cb52d474db16e2d637df5b2c8b177eb19b32645511ace6765e66e9caf4032c8d7c7f18b718eed99a2c231567c4b32b3734f03852adc700cc1a1b1e69221c13eeb9152b8404d27b07b6630453d11e85c5d13dc3da6e7a0558da8272c0a00058fded6d13c887d41391040d3f15fd14f405f04a14d904c19c731ee5586272fa664bad8312cb984c651e4aae117084799b20cb229d867d3c7fa4d0c613f860a0103b95d44f6c60820847ed0fc839f181faa0f904c78e8c8a883a8cac3b11707709e88472b748769505cf5d4903564f06dae4139b692cf0ba430c7b7075bec7354c137fa58fc69eab5a2e6f99082b02a06be94947b3848ecdd3967dc0187bb5ab5d9c45b0fa05e8ce3f6a79efc99fe5c26d6d263180f3c86ce89ee3ee7e9cd36b7677e7f66bf13d76dc8787004cb40e326e62e1e8093392084b9550d3847c9b6200cf0b4cc65780c6cd62d9f7ac1565272d6a356c3fcf0c353b160900895931f2b270532b0b8668cd3f37e217901a642c292c5369efd606275296e0c80e01ab8a7bbb62250f27c78e9df0dc22c96a1afce0aba42d14c89eb952c843bd10adb11191c7a402c2ce241dfcf91321b35a9827d71cfdff0bc898d545607503cb47e128abb388be4b425dd1430f7acf756fab7700c9bb518b70da852e3566a65e384d1c8724c274ee908d81950956091e10937ec0aa24ed12abd42c55b7a849a8d8d9a744acbf77c759fd3c82224998587ca719ef03ac5cf27a5ee091f39424ae00d3166776c0002d8dc091b3decb03e612301b46434456cef8f9c4b251b6491e4c79f0f3d1a87ba0e9d2ba46d70b5c0ba541da369a7dbc69a8e82ea5c6824c0dea7129ce90d8426d0fbaff793dd1dfaf3e20e5dbf2eda85363c2d15af83485c3f635696d63547276604391ee6e967b60dac458653ca7a16c2b93b41959c1fc110ee6dadf94d172d2998630837c5b758c4698c6e3d286655b8e40ffce226e84cb4b34c6edc909a570af5098fd82ab090b9d85401d815984762b1ffd179e316e82f2b5d1ef804d167feee30a2fce298583f8d7527256b7918c9197814a80b5eb95dddbb4f5191d964c7381ec7b33fce08e19dd989576722d2c05d9dd35547b83b7fafceaaf7baf9ee9a627f91965753b4f32d6afc7f48e8aed3de3aa1a88aab59570ae57f5d22f025e1693531ec00a807b57851d4da11dca30274b66097e21408e02ce6e983e91e31862ea820629425729c04dadca361bdf29eaf2c3627bf1b29ff1fbda6707bdd54832b82b046dc26ea1a1076c671d51a6441130240c8fdd57a9bcb7a844f9e405306aca935cf46723f6863acaf71673e5fce62718d6becf04dee0da5b039b2ab180b0b630d0ba9a60a6659bd63a9fe9000168f6ba8711808e1a161d7c82c0e1c5d7b7d76bfb01d5a4fb66ce888356416b15263a0ba08ce12c4c72c9e04d85ba0496f7635ed845a52e00a29f61159af1c29913e5f034321dac79e84d7a09a503581e52601e60024a4c37e9854297fd5debddc8e9ef94225baf5da8c214a4218c9dca6f287522f66d3c089df9c1ab84bc2132058778fa87c9f153f9197f31b1257ca43abf2a7157b546fd4334127049cda47bda0c2a02c65779852e06eed2c0fdeb3d4d4e915ff3875cef77e8003836311862766264761c98988979811b8e1f1f3e154c757197fe9930cd1543fbc4ee57d49dbd6783cdc9ea29609a789bb94ce7daa5ea4364dfba4849b718f57df07a371ac547c9e32fb193e1252f512ae1544b0589726d2a25d90d36f3ae380eda7ff255aebfc7fdc1ea40b3d4cf57d7fe463b6a3a3be2062ca449acf3f8984959aa3544da29e552139abd2aa957c012e65bc95ce490a3ad7e05c0af9321c32fd9e85c1c3e2f5b5010a8984037a402a8fba8954f054cf757df0c181edcf1c6e85760408d7e8aec69996fb4dd09a4041eb59aceaa4776637802191658f013d8d0bc0ac59ec780a3ac3d1a3e3b843290ec79a6e0ee86573f38db2bd77592f27859a5c2a06c0e66634d6aea55c45b7da7d4a43633f86f46a7dacdffeea80bc192ee1c88520b816488252848b74a5df3af89a43be9b58c3c186d0108fc27d96ab1b94d39fbbe717dac95c25f1d7500b05a35a30ca4d4828c057be470e333e780363358521efac25ffbd94b33ef99591a2e491abcca2b7e4c214bebb1436a2a0f0f3956d7194a0ca134987730297340304e2a2bd82fecea0b417194f4790f5165ddf5068a19c7e1014a259da393dce6995cb3f0c8863cc4214ab12c00a2850cc379551feea282fc510852e210dbff24c8e5065dae9c594ae8c2c825e3b7483d8f328a36164c2f4b6d73952e82d375589620138b7cbb058f40235130ae396eebb6cc165a5cf8d2c7f8eb562c15db3cbc118f750958a60b46df97460f8fe9c1bb26de64ff90f3129b088711c4085ed1c7c61795a14511583e759d1c9dd71efe0de3f8cf0c60555606b7b393e8ff9d62225f1e525bd88935be98213272f62a6177534330974cf065eab0ffd42f4d9c1938119e69ddeb2d1b76279d6ed646a751746f7cc5f5e79255ba906cc0379604d52e569ad09c64cfe21fd8e8c771c6417d9fdf1318464b5f64bd961bdf45ac757aa10fbe58ec1cce3dee386f7f4b45d7606df1ad1b3893a65eae5971385ed31e0f48d89402bf8f5f7d151bf97a82059218f1c31f3dd3f5bedaf54c7dbb36a608b4bbc6d42401bd4b68b842511edb11a1da20e8d2ac75ecce8c7062493c6c3f85f502465d59104b5d2ca1df5e45504a45d0fe8f50a742822bcc7e5a38a7d382d67aa09c53af4d7dfb5c6197f708711dc39b77896563b890cc1e33bebe86d7c883de9e830cf6921e2038c6388b92f85d287c9760aac848c27de7c86b0a174fbfb97e367c61cc281e269b38f8b3ad037988bc8d3b73f59cee82381566786bc83fd9d7f7ebbfb98b4b8be3b86dd34d0e9875e94c4fa4005111125dd5b290c0be0e34cdb13220bc006a26f4e1dadb227152e4d78ed845531ecbe3099280b33629be36be93012766e27c1f16e8a0dcea05836b83eae893180160418f4f08cb32012d07d0b394a821255b36e5fbc5b85b211a5fca53176bd9d81ff0bb9aa98cf5da39adf14fdd7e76e106bf15cb408b61592bf9aaac3ea5f8d70fd167fbf82dd9d7ff848a13faf4b25bb079a135ee2d5573475f6f938a23843a0e2c3e7724b88e24eb2393fc3a57f8345c74b83d4bdee825a55633261cbbfa6ef03447b132542b8d83db046993913799a89095394beece819f807d541ff13742496e208691a0f29f8e25baf76af218425a8dc9f413f7081f4a6b17978f966a0c57669ff66f3d7e61daf30b21765ec3f82f80bf265acceee6cfefbc425f6ea95199a25bf2a1035738d7ae91df5b892e5da12ed0e95181793f019e2429a917b4444f36e1475dbb6a0821df00e547845732205c8f45c9079bb4a73b6c43888eddffb60d82fa9a9f39ef97f77f2f87edea271428a4d6d9438e3d1de807743e32cac4d6851305091c4556d14a838f39ceaa168ea581e9a5e2aae109487b484a17b4b292fa70029bcea00bac2f080febfa66e24da052b3d76a2449d4a348db56a24d73f5209daa8385935f5454be9ec3bad7c423dc821a62201eecb5c48c42c9deebb0be6ddad800930096727a1debda2f349b477bf472d5e3fadf6b4bee5067dfee6c482822965bdfca682efe7d6899b591c5146a45e624292fc3fe5bb8415c37de50052e22e4ed6530891ce6869410c8801b108c97085074f7a798c26672908c4ddf5fd1453916122cc561cedc71ca7b347224858fef547ec2958bdaefafcf108005e9da11aa8a5f2f061daa7b99ebc3ae116eaec98965f0b8ce5664660b19781153873f74c1898d91c63c01109cc4622134a57eb8196ed1f1e058973c3e58db766abefc30b17150d145eca3934e11eaea7ededbebd000fe1b3048fa41b9039a1cb2aac3e6fc1e6fa048a3cc6fde5d00aa93a42137401523b0fae027a313630c87081f799100e4961a456f220df07200dc808e7bde7a7877031a08eec893b02a4b9ec74d66dde5f11ff645a0cf65999c69003badc57316cec31a45858dcf51b01e672984b38f2545793f41ec0cb4c55d1772ccce0ceba7bd9817c633f7eaed8e535b0620174af0d488ebdc6bd9ceca1513a4504e8e8261c1206cd14d6953517727d552c3d9820e6338d42a4bcf484eacf044cc576899bc127f3670f78ba17637b56b40871ae2a3dc31d81f22f0a9a4e561508834d1cb7614f48b538d66a6834443615f72f6b0c8168d982d01570fd99834602c65b87a27a004483218ff65e008d59ce9046d7f732c981e19c1933b014b26eec8b6148e97fa541164bd946a78cab97e3da10c6d87f21ea0d3e9b3c39181ad8894ff908a0c96ae50561dafbd828a0fd214e64adc10f6884815ca924ca9dd74707df5f32f07664134ebe80c6dc8bc554b4c130406834670b7bebd00049ddaebd836b544bae3596788d042598b103afc82f6e509c15c31174332b55b8dd152dd3c6e94c52155eb6c9fc43895d3e0b45e8e2c2e19cca1a7ed00bb9a1c2e5eedff8bb75862690d2a0d77fd5b4fd586d5b85f41bc60c1541c3917f35eafbd7ad176ce9f561de0117911d7dbe9d333d48025115edbba81fa82d07ff6a7b86f7cc8b666839de67c619b1e95fd551ec5dc03a37d61ee0cbe8d0a47615d21eae526d10e864d8e5000660bf5d87515548ddb12a57f419ad5cba065d56d527bd9729c1a3d8d42ac0c5a996f958b85bb81215feedc69705683c2f3d45c41ffc1f935dc559cb94144b0eb635001afb27637d2856154a57a940f67285ad7192dc6121c082ee0d847d44960dffa12114b9c2642480d84190d95f949c45331ef7521d3f644fc1bdca9cd40f5ee6da1819eb3f5b217a791b5d289bd3f3bfab9738b973bb015cb23e033a1edcc69d4cbe2bd3c7d721eaaa8709d00d796f732cee6cd670b452d03550bd191e3bf58e7dd22e3c9ba10d7e806a6586a86b5222aab709893ffa136086dab0668a993f517a29e63243fceaef846126dc8e6df2640887fa71fa42a5abd2292cf9230d25a895ce72e5d27744bb2632c9fc761f0084afa33ce893dad5027de717e12da857a3ace808a86f66e7baf62c5f46cab32d74a5efc96e80ee824e3cb8660bd497e666f39bed4d7c0d54290f17aeac8a4d5d914337e379e7009e0226730b91c7370672dac1809efa90e8ca89311a106e387bec1d1dc7d09a3580b546fdd73019964b2596aaf5cb0ca47e171512104162442982771ab2a6ab67e572d403699d620dc12b3408bee2218c437b030a00d4e885fd3373b4ab7282e350b1d1559447f3c04045c01c89324f77fca87a345fcc28bf1c71d10087a08be9eded6801d0dee0c26569fcf4b9daf818ce2f9f090c54a31b2ef652ee11d04916866119f40569f46b4b7aa103fcabb53b5055dd6346d2946f97b22e8113db3619a3042fa9bf3a9aa33ffc3ad0ca63fa818445cdfe1ec46781a24e222680f6d4b3e1cb586de1c9aa11dfd1f3884840268d46e10c4eb91a039e66b6ccfb3634bddd8bc06713275ff1b547c01fa1d49de8594c24ec1826e8e9f898330e3d967ed96daf8ebe921ceb4c397501e9b436fa2fb6abf7277886cda0f6d52995aee470080d0345e125b91fc318ae06c7a87c75ab0aaa3daef1ae3a7d8c545e629ca99ac37ab23a5c5ac5a518601ffc4269a869357a506b627f056b5257e1b8be808200ec615fd9c21ef948c19888e846fb89d00c713d3ab694eea86d89c4654164176b3d7c32503ae29e4e120f5519f696da411cb5db2b817d55db0bb5d64e1e46cbb10a6762d95dc16c000b5b01cfea1e13934e502e77316abb243ca6581fae9e2b3d1840e301365af9c36ca88de5beb5a9ffd22911860b6e2bcbf45e8989342945dfe720fb395e9020a2470b8a5fb84573cd908290adb2ed0c30c9ca2a495c54e53f2f52f93fcebfb9496c05e76eb7dfa548d3db553c57a840803c044c681bf836ef76c04149a4d4176912d65f2e0746646c2a257cdbdef4e68626fa2d568af51a071287bfb87e985e6c0f101b53acfa0bfcfc052a02736b1d2d511b1366094d899f1f9b6fd5d178db3429772e779b167866edf19bc08a67f843fe304f144231402232f212910e2306d9be155df87c27870206ed649bc3ce5cd257bf58219c6138e1df33ad0569dc66577705da52effca9f6e6b5a67f71e80d5a96cada943a7c3a6e6544769d726d4d48b56ab815cd6228016acd82ce7fb74652b58ad144f9ea79ead59460d61f98e2ae85824b2626f7e542ddb0ea4d0172a9a1a7dd1ad3bc0b1f5224ee0ce88925e3a908e5114ec608e3ee52294d68881c696eeef84f9972590ab448f84232c71bd76bf220d8aa31841bdecf119a56f2da444b326a8addc3bf289387561f2e768e41d88726c751f2cb8ec00fade4043758ff0c1361601190b085742cf33f5eb35629f328f0100780a391606b72c42a55d1133a1865f3353baca0461a544f2664560eb404bd2d5b4f5e2da5b66cd3739aa4eedcf27d82293dbca9422a459e92cf47b2dc6328504d2eb4932a84cb167a34d55074c1cdffd7357f10850c604ae8f929d6b467d040c49a784cb14fbe08cbfe1c435acda87d7e489b52512652aff79486781ed8a816879d71a0e0e7df27ff1c27ea108a0692f68e2887e3d108edf8d1d2da0c4518e7d3608cc0c4b2c8678849e1ad12876528764db336b78aae08e65a4b812b5f40796fd32650b95b3f96f1213b9de0364a98a27497cff377ab166c4aeac7656752a9723ebbf24afb2055edc4803308358023e211e1cc068c9778028edb13c05448ba72c9877dc714996b84cba46b65a51727b66cb1201f43e1cc0c32e8e4d6ce066a80e4b0ca2dbf6bf45f7278488c58a9c37a10c4a8231a5986bd8df0323ec25a52894bf9d10c988f0bf95542bc94d61f480120a6bff0d94e5fc882633aeebd6d3104eda3b0aaf942430e533754f5581f587d5ee1ba707dce609911798c0ddd40164645017848195815d2f1352f047d52711044e8d04f21ff57c729d176a89906f4ef78cea5a37bce22123f2365672f4ba141da59921527493795f9f96cff56e086047897a34589138d73b594d0cd930a0607176de663d29b6f50fe1cd02761426ae54b6a8692df9ed309222d7537c5009bd13ae575546ff505e9a1243f0af3545d4cc2f435f3a7b5b8fa3839da7a93c37e62305eab016658cd59d5a51bba4ed0439a7dfe86623922b27005f3a424a47a01b67b0f971b44a9a0aae698a6b8b7fb01ed49f3164cae4749c491c7985b3e9f1ed0eada2436710015966429007cf4f2daf2acb8fb63742a6cc58d83bf76a83f7db58df88c3d804d24f447357cca7e8ff6b75e33da8b9e06758af88fb82bd04adb1de2f480bdfc3cbad20010be8cf8737faf3f5609263982e7569381af543c8cd1fd3aa46b4edb8390f60917654ad9a0e0226abfe3795266d4db5cfa34196d9a4597a51429d92170bb94ff9edf6bace2e9066d98850643c03ac936cd1c00c125fd17804e45b0a4718357f93a08597b5dbf4834ab29ebcce105ffbdfd91cecf746596925036f7c4f91935b0176128aa474ff6481be04a688f5c0fc9e47c1d14e06e270ac528db189f4b03635a0413f20ec5c46e2e8660e2598dc8162767ef78bcf8551843dcd8d45450b511085c69632b0a2e2e12f112aa45372c4f6351fa1c4630464a8f5d35e80fa18bdd25345d5fcf5b36b17f446d74e83692033463fa1fa5bcfab2b8c0ef080ca1d0f13681dc8aaa0d6725e1b1837d054b5e671188b2bf21cdebbea20921fcff240c8c7c4980d3a349379a400a75228faaf9686af7047a88718b7081cb7c2676f04a9a41db753f31b2c94478756c097b6509b5944663e884be04211c3050881bf0f3f7bd64e640c1e436b812fadfceae523cded2310c5d3b74b26dd06c6db1baae404c96f6436d575afa8c0e0ab52a1180146751ee4b32579ce721f87fc823406264fc337b05c660a06431cf0179522ebf14858d2e565ab5d68ad91592af6e425d7d77e4213fcfb96551d38fd91ccab39397345f636fab84626bef1436588f3d1395876156fea6f6c8f4f4a2fecfd2fb75b43f6154ceb11dc89a498d7dbc9603e522a055e51eca6983f046f23c94e426e3e7f514463eff705e65cda30a9a5a1faee1f83e5fc804e590f389fc1e17f3c82793b9ed368f9cb0aa8392189bc3f7636bf2c1a8eeee6b8d317fc92ecc2a4b7d1e788fe89e9366ca3e7707bd292b811d5933951bee22effad21ab49539756786fa218a61e1aa15c6f8aefa96c089476af13d285b39fc4916d93145a7706e9e23329036ff4c9a6b3da13e3887c137842c8de4b093ae3ec858f8d0408618cc48bd458f731b4d4af04d49f43fea93a4a0a3080a9dbcd8864d1e0959a87929c50cf010041847c83c043e622b7dfbd8c25b5ce4986acc7139d1005b19809b96d9f094763d44384216ed20fa32e62ab33e2ef595e308e6bd219e64dd95c8e720ecea4a424a5ffb872fab59de6ecdf9bc3e2dc04361bc3bcb28e14d641236831309771830705a428ce4fdc6ffe07ec37fe87ef33f74bff91fbce7066ff52804c27a370e46c60d52b9be341cb473d9371b3e4aecb596b7f3dff939a4743aed8cb79a72a4d979c0f936935377f76f83d3f068a21373bb7dea94aa36270be6f0957fa9a0fb12d4f9b68a5520cf1ab1082a564baaf948a63df216595b866be7976c15e0e7124138244604aa14842ce1faf9b4b26b6e10ad94ad91574f5e7349a2cdf07dafbd92502ff7a0eddd4c4bb4fbb16c84a8d89b49018514ad114be09f49978860df35ed604bfe4dcc3f38779144e4c302d2846b0d949cfe8495a1784df751269463399de7ca306c899c3f8f61a6c2fde46ded1669ec4d5aeea2fd582b16f4cfab3701e755a139c64b63903d3c470f5a66118970f98362636d9b14c67d19fa361942d7c205d000e3bdcb8c4ea0e1adb2ce0e9650dcdff3ed3ef24014aadac054ec65a0f90a1d1ded376d3f56a8392ede696a26c50bd9e028891a53d496bb10a8a5681a1f687adf98a16072965186265685b3616b3d433a534d63f7907385645103710fb4a6093c0c4e0ab01c29ca574c0239c131e1d81533b9bf892d407cd5087c3046172be2a7374ed14b38969da25e223e7c492f615378aaf1e45fa18077a84b73ec2e2fa1be114b71bcc452bc22ccbffcdf5bb5eec834e2784781322184809424134d437cb08109ebed11df2fc8308209103eb952a6332fb188f1510e923550a2ec6c9c59deb1fec98c98fbe83aed782fccda97509e544082ca7d2a2970e129a1d928be2ed60ea0815e5b6c4f7cb64045ac69ecb7868f64729e520a68098f57d9c9873e9afe4822a5abf768242698aa910eaa942aefe23ba6f24a1335356dbc91d9dc0c23dd4d10b52bc5686713f2d249c7bbeda84d2657232b1fd6c5617ed65dd97108b1b7256c9d0c3a2c93b8c65715102bd9a72d96465c89a817a67b92a39bf9bfdc8052607ee7a5c5bae0f84aa0b3f96d3aaa4ee106e424e0de7a1e11634f606ec1ce66f71ce4cf17dabf139120a2b38c4df74a80f8817d9986a5f8d09f21639f9d6766cf3571d23ff892eccb4f98305b88c0eae212006f83554bf10e40ada5e59d71362ddba848c0b85c8e28f76240aac0933e241ed9c666900b78606470c85082e552c0e5ea01cf1b4ac8f9df614eb5ba177841d34336cb540c0aab24648c824d56084a6aec64426216416db0c4e1dadc7d2f6d7b4980feffde3706c051c285fcdee5f1526a8648f6b8cd9f358400312d5106a149f9937edce36fe99722402019a1fc9505c45fa83c384d8961b2c886e2792aed2d20347091008a6c3ceb538938aa5b873c56d1cab63456f3c80199ea64f15af63156c3248a07e4b004de0fc4b50c55205e55493ab969384b8b73fe350c6d51ee4d9abab0b1a32d8d8ec8afb9fe64660d3876bbce94b2762410061a9ff260096249021e53f7ddf06a9fd7bf49ee3c35966f660cb53175741d2d698d1042c8de7befbdf70ec50c8d0c600c2b3e2b5dd00e0e0a751c97a370abe52e40285c7f4e3fa8969f545a32dcca848aa014417141dd6508d7232747503f694115a1704d624a5201d36f624bcb514b0bae469a910a10956bdd63652a5dd00e8e8aca7150285c9150285c975c4b5a125109c25151c13d2a2ab826c9985c939aa5bb436ac5d6c7fad4155ca39201a5e056cacfe9d9fe9cb04c8a504a0ab645509e6d911494ac3474e4e4d91e69f9cb1858b425313ddb242d8f92318f956d5debc9986c8f326c8d648cacd6a825e6ec922cc376898c79b64b5836a94b4d8c83daa4967fac6c932e503f00fc48f1c4488026640f26d3a3792fc7a150ff6a25f37393704528a31fad96c850a0240a4481acb54dbb6b34a4c82709ed194a3a8224b4a40890a4f111c0a7d1edec3a39c19e67bd9d655baaa594a27a917aa14ab5c82127299ca9642a5d5d5b5aa6110af62c8b5252c751a9522d278f1d4b8ece6bc2dd9ebb45b12fddbe74fd74ee5a0cef900d371b5767a73f92e668c8910f44eaa13d3d439286002101092d894243f32816c5a158046184798e4001788e4203788e43abe758148fe2514b3c6a8948b247f64424d973af4b7bdd64d1657acd708ef6f8eb8479c8552707d0c9007412a69345648c3c003a29248fc82199649343eced1db24d3fe9728e768a7748f9f9f3237464a8a594974503b8bc3492342f97974792467579b94422491a39a78fa47171f93944d204e0f2998baee5e24170b89ce5302c07c0598edfd2b55a1e84e5dd5f0c40d5f9b01ce6a9aea5f36139ee7e179da90b40e7033b0567db29bf8901e81e8bfea583e900d03d1983bbae7b978279d4a6a738e7e46fa8e5104933efe53814ea5fad0250d37987c4b1f2e200f87fbd1ce6587717cf8ebaeadc59b00f973f56eaf8367b241822698208e02daf4992417a372b999a2d3a4fa3693495cc25372e5e5429d48b95ff49483fbcbcdc854af597679914c63124848c91f915b56022de514fcb53cf0f0985e1901ea0966738e4058642402f8e62292a827fe1a27be9545daa6be9be02e2b1564e2e80ce081f582e018838cbc000e018077179872d0ee2f217b8e4426fc2415c9ee270a6e75c5270a678876c14cca3f60926e28249b0f26924691e8bc3f972269c51d3a884f36a1ab5fccaa6c92192e66238731cce2814ceff6a85b38c4c9443228d34d248238d2da7dd6cc1355c0f2a0e7d2565668d8ca14729310044dea4537059d39028010849129ce0914111ba70832d18010b5f688235c7d0138912846ecd16408ab490b4041096a054204142919efd9020418b29b2f757d43c0db3fccb320f8e2d7b1b90843f3206fbfb10a567f9a6e8fca668791c14091c119206e3280e4993fd62b7cf6f49bfbf29fa611621dc2b6a244840c163a164ccd3f02dba51b2e1bd7ba37c3c1032f2c01f318e604ed469b59f16b76aadf6f43827b7cf86b2975af41ea774fa5a9f1d27e5f5da0a3cb23f39390a864327b8652fdcba99769c7bfa52e9a67a72d35352bea272c2ad94d28585b8a6a39cd073b865c22d0db7b297ae0db7b4ecbad456ecb16aadd7b59595c203a3cd22939f9a29e53ee871308854296eddb7e4ed71b2d3fa791ceef5d810f60d43240cb7e6bd3dcef6794a8f1d07e5f49990ca6b3d77c121dcaa17b72c6eb5e6b3e3d8cf6fb8b5bd8461512b08877be928b88572157cc22d14dc2ae1d676b110322608e73ebbc5f6a59f600e7f62b8d5c29e7dc3385a4138b77563311197b0e7c248434350324742b027ff165908c4a267517c2f461d59cc15fdb12abe4314bf895f44e181f11a913d497375907539d423e623c32e08ebf0de7bd6c7c4c17e6900eb7c60f8f2d10ac2b99773fab830c7d9565005e4e771e4e76de743be623abb1f17c619644fd2d83fd6e550bf38d6de0bdd905d2ea3785892864ef977947decb6b8c98838f715b75028196371e42b6ed5cba0cb5ee296c59c8c09ba1e341f74fd6d38f254c6e0c84fdcbaf8c21f3546d9c3d3f7723fa8bbe264724d10961d526e3664431bb2a1bc91b083cdd219e103cb87eaaa2416a49525a84b9f174fa53044ddbb82396eb6e9998cabf4adbb5d2ea2efcaf3c91fe481c908c80a8a7f32863bf72c762911efe0b41c751c98b3fca1ee02d3825b13c3a2dfec28cf52b2a73c7b4a5f8ff058e527cf102987fef58fa6b72c5dd0c43b382c77394ecb598276705267798b0bf6c1825b2c4fddc78eda2e47c787264dea801de5d8df63a5b0a7e0d2b5b8c948d5c0ce4376cec9aae16683b6e9a8480889c22d22648c3c0b467d48d2a05830ec9131f270888c91fff33bea9e1f127e863d2b7f2c0048960e75d8e1b01c855b2f67f94ad7e261ad1c6ea90aa0ce720ca0f0350081522efe582bf23792a5f301855ee010147a39cb51f8076d9e8638570dbc9c832b3768430c6fba8679c8ceab06803ceea0918c91ef3a782463e42fffd2b9e89e8c81451d0fd9996b08f10e197f7e7e7e5a1e2249d4e5cae5a38fa4495d3e0e91342e4f75add48318e1030ed5515d0bf5202c77f195aeb5f2202cd807cb1febc587161f96af743e2c7791ea7c58feb243ba74a91913fbb0e0a08873e2df50affcb16091a48947648cfcbd1c473b1eb58df081d572973f9c3aea2f2d9f16ec43f5c762b98b5f9427c88bb73cef9047debb8c478622cd64213992d4f271093109d52e697cfcb97ce5ef2849d372d4514f3d732e58e6373246dee5a867191a3c19b38259eee307cb5b700fcb57be7297fc8a50dda531fbe22cfb9e762f3a237c60a9fe248d0b1c447517aa3aeaf1c80b0ea23acb319c2fbc43f6c53c6a474c448549903abd5c3cd2f2a90ef3a88dc22cf7bae0a216ec84a69f388708eaf3d91b6af87288908025d2d8f3861ad59100d59180e5d9ec604fc30d070bbe32067ea859302763204bb7f2d9c59e7e1b8e15d963e2498928a3133cc4798b91e6675d1b990420f47f47dd0f09127ae065847340f2c491daddf8a94d4dcebf999dd81a25c2a4e13406ecc08e97564a25d0ecc17c36f4c57887d4c6bcbcc439722faefad9f048187d901cc1897ba118e4d07c0ae0689ecfc1dc7cab4c5fe96643da3041d31af212c913459a9ea7b3a9c5adc6a4936ab46e13804d7ae215dc21be6ed408173baf569001af236cfbc823b6b5f8bd1879be626e4221a19443e0a4941478b7e16f439cb21121de017bc22760c18812235330420d62108ce0822b082efd9018d9a26f3f2446b208fa01931f9c61e83d58ff60f69cd2f074075cbe7dba94092edf192cc35c2116c3daa54d70f95ece8922f15e2441412ae421aeb24ccbd424c598d73ce04afd903891d4f93a81546b071363b81d7059a646e63ed66439610427843abfbea008904cdf9e28f803600c48c0c2134198c11998b0e00ca8a0420a58f086381c2104d62aced0348432dd847b6b926a4ec082e7debd4e9bb84010b2b6872a8480b0c00620401062d12f343dea4853244078c266b38618dc400e3460c318a460517c7bc04525d02273c23081a13e803909c9e18a22a860084710a106463f4330c3188edce004d00b10ca18298e0d926c50861b24a19e54377882e680cba7868f5a8c813fc57783246e3005c5c184610233e7844978bfdf4b937461928c995be0e216b821b3c89078640b5c7c86b675d4b4d5e1435b1f800491ac20fb2017eb3a4c92346f26590c915e8c2fe9bc7a36f6f314679d9b8e37740bdc7dd5b9e9201e9595c411b962259124ae5eb39218923179c522847b4ee8376f2c429acfde8b484892e619198248493d634f148a3e516846a1f78f11d0d154c38b313f4f6ad40008f429d2f319aaa1e7e564c00c828e2c2ee05ef44392841411d3b82f661ef61c251da18c8abca2222814c7d5e8e9d82387d0366429201e8bf5603ad85d195353f49075623d560a671ab1e07b240be21fd87fc043dc0a02e2b18cb02c781fc982388501f877567d8675290c401676c8c29cd0c1d321882bac6bf968c2c27e8aab5616a5acafc7ba209215345f05eef6eb4da6cbae74f26c4a2728cf6643d1529e8d96929d9e4d76c2549e0da672ad3c9b6be5c588d7592e966723ed65f75e0cfbdaf26c6a0b757936d465a69ecd4c49d5b391aaf8f26ce2cbb379362e5e8c085f0fd85fbc18f1f157bc187e900537f9fa83443c1c82463a0a0989ab2825f489ab68e4f2925e12449240480248bfe887e4e70a480324e2eaf511114e277ea86817fd90d4a0a83353f6626c4518ffa294dd0662c0cd200b16701076961722078cce01a3e9371057420ce160f46c798a73281622aee0632bb280636284a14b8c910822e20a9e2a91bd02702fa96fdb931a347022ae5e5fe031e0026f072ef47b7e5ce888f29872525961793c117106f5f81d71a6e5f1582abbdaf692e9f112c011674e1e8ff36c5c542f77f1f892709e8d0eec1d97c7140484c8a1faeb0cfb05febdbfa8529d4b87f362bcb7743b3a22e2ea9da5cb1157ef2bdd1071f5aed27d20aede4f9d1071f59e82d29d7438e2ea9deb241057efa6aed46ddd4d0f1d0f30562eba2b631eae18e3549c71c832243848c4e381d110422cc406e2ea5dd1ef1985014763c0d5bc18b755adb4053060d016d01e8a8217bdea475403a0b637410db3af38d7b0af3784ea276e986116f413e7d41b963e52cc32032e7e5eebdedd31ab111af6391767d837b4b6b6e2fb3965172514443518424483a39fbe443328aa277fbf99bd4660167106a331e3cc7df73f8d5f766b7d4ab79231b57eeb6ae2aa12fd08b502fa11d520a92d46c5559df7da6bafbdf65e2befbd2fda6bafb5713f61d675cfbada17c3a6cdb25c828642f05748f401d2d73ecb2eeeadf633187be20c767b6f634fdbe708a4ed76fb6971489a94d3edfc518dda9076455dc1d5ae34646c1531e7169de1afad86ecedc263f7188659d8b9ddac959e4dcfbea46156c23b6236e1cc7e3ebb8746529e3dbb850d678ca56c023a6b64d1fe371143a1b8b2443530824bfa7656ed76cc62d88673aedf631aac02320005053e43949770cef5ec10c26728f028a59b9ed23d1993fdd43d19a37dcb503aecd9c93b92a24b1ded2b89510930da38244dbc7d109246de1e26b1508ab6cfd048b3cc80c3be7530495cd99fba20648c7d4a8743c6d8123ca43675b0a84b4f8a25472440e9ec4fba7bae7b456dea60922e75b3b72ec328fa2569fbccc22ab067f6d8afa491c75eb709dc6738437caf5f8742b00a0c834bae7b71dde28a0b32fa0793238c117856c42c21855804ef8a08afc3676380a67ff414e2b913ef336c1e2fbabe2d0257cb083c2b5aca2e479e3eab5a7d9ea73f3a654376bdec9bf318f09408f5c579da18a0b33c0b129c7ca6bf1aed8e82d0d9854508572f4329203f062ed3e7994d4d76f512ef60a787cfe691a129cef387937ab1b0c38e2dad08c262419f155e50fb6d41d416e8c0f6db8268001028eeacc289abdf16c40e5c7002d66f0b422a41830cb27e5b100100124214b42d88be30c5d66f0be2a5053c404207a5b803206d980214a67e5b102b611882114bb87e5b10d00a219ca107493469c2c24efa6d4118418fc91d1bb3ebe9533368ebc026291c46401676dab3752a901dfb8e0e9ebe27a2cdc8b94c2f75d8b7ce847bb0ad8495886cbf91a51c22d996613775d9b7ae74da6daf9d8e8caa33238788e9af73f0682219e63ac358a663b807ab1ddca1af00771b934713c19ebd0d03b8d483b1361c4409f7602cee19eec158998d037426b23d078f124d04dbb8ce748901cef40cf7bc2b58a5df444d66d9447c7c60617fcfe601484ce1c5789d1f031e804492b7c3c3b0ae853d053cac20ea23e886bd7c09c7082bcb70486d6e37ec8348401252b030fc4302652842125294a108495481859da7df46238708f6d7394cd0447a280b5b11e2c96cdf70ebe6157199339d0e9d79a4748e37851e4cd1f639f2f62d22f05192ce904031d415efb0215b9e074ae7984b9cd0550787e6437be932701891021e5690a07a1e16f6b9ddf0a16b357570ebe0908c2995700b1665474358d111041af20c81e8e35956c049ace30db5ce6b92c323a573bc3042178660ba09b7624f2c15e91c7b360c24b2b03f568ec43be62bcea1c1d3f23c4e9dc3024ca4a0e51f923300c5947c0f293af7a0427746405676ac0b1259194ec967b4dba9115b1e88c7caae636ad2f2598c0c3c1676223e3cb0b0679d11b649932698090fe846152259fc0e4f5f0de10f1bcf8a96d0c60e5c7042938691e6e01902524b2c82472b0c6998fdc825b8a275644e8e678521dd6a4824839ede01bb62229e1586f4949848ebfd87a9a848137a5836be6f1ae07a7a7a8a32eec5f727371aa7b88210c29ee64e4ba8340c33db315bbe3e33c0609feff395ba548dd2e74b9f334adf36fa9c973d9bd7b66b356297b4cfd94d9b39bbf852178f75392fe7fd3d171624b878381fe3277e9f9b8c78e33de29cf7777aafad21fbbef74e0fb5aeb3d7ba8c61a755b626e3dc60cfecda1fced8e96f24865d5d0dd952a795130f4fd0a9896bc4d740757eb0c7ce01d2f87b2fc307df93f02fc2f71e8ef2c536c889c19ecf79efd9f71e8d000f0ce804ecf2dd66bcf762c0e962e3be8e7a81cbe836e3c695c4af46cd7d78be87afc5c112b2e8ae1f12251875f670389b4523a01f92261c69244d60d290828183cf99fed5802fe21c4a718eaf87104f9cf3e26ace4f9cf38e79c80e419d786787074ad6a16767c7ed1d4530bddf2b638e4ac61833d3fbe3501c8a59ebc7049bf9a744138a748c7e489890d4599c363b70a8b71b120914427a5ee61ead039b4cea050ebea62bce9938df448bb3a6a9f28ed971a3510f6126024f2e6ea1473e4dfea73833a918263ec5d50ac37836461c94f0a8b89273087539e57cb1a75590697126f7c8589eb39f649961afcfb6beb8ca519eb99ffc6d2dbfcf28385fef414f700f4ce5f9e5282ffdb1e01ed8cc2797cf3db056c1f9e5c27096ef41b10aaf03429ce17bdc897b607d3de53ab0cbda59c7bd0ef8f95c2f9f590e710fac559ee131dc039b3a54ae43e21e589ec7ee5570c62ece575e0796558eba8e954b1ddb75dc9b32f68b7b60bd82738ae9a6e01e980ed4b7aec267946b97566969ab2bdb4a69bba984afb372d3f3e9d833c63db0dcdda4b37d856e360b464883197eb22af45edb46b71416a995eaeb5da9f0b29909bf87ed562a1a86e8d086ce3af0ffbc1de5790563cfddb713ca74aa3645c5a2ae73ab83ca4cd759f976babf0eeaddf376fa6cfa7c46c9e7bfd350d731ddea9cae63dabaeb6cb48a279868a2f38e0eea3a2bef9e1f5b9eb7fa6cea8ed24ea5527631d972ff1eb67b0ffb9bbed1eea89b4ca8f8bc5d65e5f4b9336d5f31e11e589bbe7d25bbe91bcedbca4f375df0a767a6e7936fcff62b194d010b6a5086cef35947c974eddc598ef2949fb43c9bfe227b5195529b4621d672b5fbf2d351d5d6148ac23db0d409f7c05c707629c114a69083153aebd8d1c1d32e7e3a4a7ba13aa9bf3c9f7e3da3cee272f2ece2a5a654a94a5115059e54d779415d47751d97bbb84eeaa797eba07ef27cfa7d56a53ca75eaef2ec62bacee905a5d2522e45246911072528eae2e239f5724cf5f8ecc2bea8b414addbc945e32d995c5c2e299467d42f4b09b5634f3b2f5bea3b3a785af513cea8fa062cb8b0c48e8bab9e4f6f79465da6aea2d25c601d3c9d3a2ab59db26bb2c068d2acc9a2b4a49c5c99cbb797eb5c17d741fd545177b94eea2acfaa53ec59a628152b6843129d777474f0f4e92a1d979f707ec1d9c57b5c2f3f3d435cf356f02ed79172790fdb59c7a99e9e53b0cc5bc1abaec3c551cff4a96714dcc35bc1bbc82f38abdec3847a8f92eaf42c9f721da9bbe09cf21e5b671d279c5d74a05c47cae9f93e751da8a3e09c7a8fabb38ed375b83ce5b91ee5d905f7c0dae5f619857b607db2a7f7b89d75b85c070aea29cf289fd791ba0bce28ef413beb48c179e53db4ce3a50d781827b608df216acbd15bc8eed3d4c9d75a45cc7ca519e4d67c17705f7c0ba7415cc9d700fac537036bd47a9b30e149cb3f7c83a9fe0f756f099c3cfa4a374ed3a4a78e21e586bf8e2f956f0d731ea17ffade02d86792bf88a553cbc153ebdd55bc1470ce3f174b00073c84216902821c9dfeb69896f703d277e6f4226b4f01d4eef1ccda45fe0def33be7d9968fbf94524a297d901a6ece393fe77c901a56adb5fef1d97c437d5f97438404f5b1648572468a515326c649c407231c210a1c086191a4051986621011192cf99183164a2862852b6e204109493c11c4080d3db0e2088f1358c860880a985cf1449124bc2005a59fec872409425adefaf7b89234151fd19329a580b1671510c21b640f265fa096d7a7e5ef90eb13671e122400b5fc1512677ee2cc8b2a9796a3fe3620348b6d5c29253b103eae3f56cb84efca4dcddf63d409a55dd771b45fb8d58257abeb3299704dcd75a25dd7714cbf704bbbe9baf00f2f897653d00e8ea6699a8683d09e9146af3da35dd00ece751de7e5176ed1bf5c171ee2d1201c4a7b28c5453c5aa3ea5a4138a9bb40f8025f8ef3e22f20d00b863f27f8f3e2e227172f2f181691311205164179f102b7e0911378e4c445d10b8649648c34c12426950a1eb97081a191068d549a4aa5c22d1544825085a3ea815025e3d2b582705cde12a34aa5ea82768ee3e22adc7ab90b20158e3fa71fd5cb4f2e2f4245508aa0b850dd451c8a474e8e9cbca862910a47979778f4f282a39166e4a2b944a4e8d2e3e282638e2eab96ae1584d3d282a54cad3c68e7e50548fe9c7e52aa9f5a544245508aa0bca4fe2287e491932327aa942c4a61d9a25249950a4b23cda8456b9148b2a5a7a5054b9767d992a1ba56100e0a85e7747171e982765477c1add455402e78fe9c7e5c523fa1524245508aa0a85cae9a43f3c8c9919394cb2c72c113959a47a9149e469a114a434da489ea41a1f06c799e28144bd70ac26161c194b6b4b474413bc749bd05b75c9e026ac1f4e7f4d3e2f2138b4bc5ad2a5404a5084aaae5a9214c8f9c1c397169a1452d98b2b8b8d02317174c8d342316966b2c2c2c2cb8c54291284b100e0b4b0f0b0ba6a8679ac4226372322606e1a8a8e0ea2363e403b9081a70fbe176c5f637f26aa9f3193b36569c79260025a4f213c916174211d4eb008570f9d4bcec94d441a724be000fabfe1115dda01f51d14f57c1e5d5ebde7681d7040e153381e22b0bf0ea0f07bf8ad147b7208f94310ad97b5785b877193ab4fc8a09150d63e0032176a66aaadefef5fc9b106e533e9e0e6979a19659d56497fd166152440afdb2ecb26e35b25b9caf3da5d64a6bed29b5943e0c6245bd5d3bd46289e24d5ed3346dab6189947ed9b8fac21947bf8dc80f8c15743d07d6d76d5b9c716c37ae2b3474fd7615679e1a585f1a05a86f8ba58b73b0df7c1d628f70c35e4fb61a92d28d524aefb10d883f7183206cc10a26400188f55ecc856d356e6b1b8dbbdd09dccbec76f330be6ca3a169708b40c470be3ac3b712e12011ee35fd27e4e1827da90bc57693000f14915e6fb58f1ffdb61b5c4f5f3c57f61d55c787d6bea3b68eedf76298b4abf3a2b10c639887a76656c310f80ded5e5cbc18908b2be802eeea471454d412e31957a52364ef5d1d0237af161f2fdfa57c2fbe280dc03d088d88f4f423e24192ce4f0d1d4fd38f8807463cc8c8749c43107e7a760fb187a00dc499dc43471c421dff8138f3def143f4109fd0008742c9a1a3cc1c0d9a3588834f220b3aa2ea4714a444d00a9c98034c3f2227b800a31f911340e0a11f1110e070ea4704042b1cd08f08083c00c2112949672829d18a90948c2c91e2821fa0a0c50c2e53a4fa11f9c0489f50fd887ca044bb542838f83c512c2b2aa7149496125dc27ba79a3b898a4461fae38ce9b00812a6cb9bb004d2f45891269a9e2b62a4e54df5a66ebbed72b6dbf76240aecba6973eb71b526e334cc72c8aa9bb8e627abdb6999e55cd6ef5a61cee39d76d4a87d265d34d8f9b0cee37d274734c7f7dd265d3330e679e36d5d07e5dfbf54bbb3775f4a838734b3fc9ebf4d7c539a82d4e2132a85179d0123e47e2bbc1b7032c541ef0e0a7730592497071857a330cd0f0ef2f6656d8d5f849e5299d73d68ae921cd45b4ac74ca2837896718c0467c9d973933077ec67889247b8fa8892574a91fd10eaad05964038a0df18a8ef14634fda9cb45b4dc34c0451cd7d031362145475b9b60d21477b06569621929856cbea7da887830447b31e243e2814f7b800709024fc6c834c9e01f0c2c4111372248d30ea656033a65d0f523dac1903ec515ec8876e0734b72b8342d3026aee813ecb07e444b18f549538392bb69f06a11c55d807cfc5da5a1882cc07b66ca824303133e271abc6768a225b2b8ef842b592732b9da9974069c18561af2b01e424a31dd99cfd111d7704449107ae20704053d7d23b3cca4010efe112d71a4df0c0374ad94ce29658c709b01279e6180b651712e8246dd6618a0236c0a9f6c095b4e0ae709320e70f37180c32ad26a13d5f2ba3c272b1990b4e08828ec800e438258971a5e40061e38810654a0010c2cecba1d2763ea0c8bb5b88a11fa605ea80ba3a24c042293619ad5348c7a774628dcabd667ad2bf64bca0cbbaea531be21d3609c819a867dba817b588661ace0320cb79253c31905cfd16b9a56a303a2037cce920e909f47a960e6ad704985db8653a5a730206f3a10f226ccd3259cc240bce940c49bced35ad711d1d83713f61db3af2ad4951b9a70c81e4ce668debd34eccf662a780b6bc700bc18f031dad0997575cac0c7b8aa300b3470f019b55b77630c7df61b59bb4ce3b40cdb311bc3273aa1942d315795641ee0e0391dd8100e2df1d34b24d1704762ede10da2807b4439d8a26d3fa22584faf1db493fa22574d0a7b89a444b0c7949444bf4c8402c5a120121f1204361e4e81a387a9877481ee24a9e6ae24aa681cba896345a4cc29085f65acbc595b5a7b8b25a702895b5d65adb4386ec4116708f0848a81f910e7c1a01fd8874f0d38f33f59443c5d549a39f740ddc8bab8ac4e5371522ce7c6008c800d8f444ec2822ceb84007407a5ef650213b948431a014d5f014cad066dbee5e36f410f1ad8934108831b2d6219c4c4d0f3870a2a874e2775483c89823de0bbbfebad7d85561a57788b88aef75c2fcd1cf4ee747c3b78a1f7831e271c49504e20a0271157f13072efe541570af09882b0c383804a39022ce3c212371e6085c426da2898e7342211d04a2459a227ae22ace177045d60b8f8ab64fd998b72bb751b4cd8191be3e737045dbcbdbd739e5fce1a6e7db6ed87a6d76693588e87b21a456efe976c3de6e3ab051b28ba7612fb51743e2f9d28b91d52c53f9ec52543ebbd36597bd17e362bbddb83e717cdd68d8a7fc76293fe972ae9fdcd4e5eba66f5d4ae5af371477549752f9f6d77253398afc7b3150a82ecf976e3ab6ddb0cff39765e52c2b2995a76c6cdcb9bf4dbebee5f7f72add8c2e63bf4fe950ba9c93bf7b9cb5df969f7439f71ce6e2eabebed4d5c0c415bd50b8876d86fdc5aab8aa9d8c0be8295a26228e08a54c8d4c8c0c110e9a20524208c36021621eb6e0646a50cffa11e1c00892ecc18800d59943715506dcedfcdb99e37a9e2869d8ad290001fdc04c013503081ea594cea4379128a5b4d65adf63ede227d28403145a429444144bb280424b966091458d6217c3f9defb7046a1eeaaafccabb5cad4394fc9c049ed946d32324d3b8d788da7b5eeeada6a4a2914d97b0f4bf9ee155f4b9c73c0d41594811157eff1bd190653a494de53fa2a6917a9a41149ca698336dc3b93e66b8308603a67669a96653731af9afed10d3bed28fda129049a6e3f362cfb8dab4cab2280e91cfb6a4f3b98bef97d2f762fa667e0320c18323ce4b8b64eebde5f0c1a31387f51ac6971ce81d391215f753a80e1a018c2dfc80e0a171e1df47b9df1c4d0afa6808bfd886ee0d3f06ff3f1634e1930b75233dee7ec9b18df5bbd5884212ad59bb283a1dde3abb875ab907abb2a22ae54506bda6937af3aaea6bdb596e2501c50485e61c131c9869c4ef6523e23f98ce43392cf483ea38ef119aaa6670f5102a8679c6e3bbacd8042b24ce71c3cf4fc8dd4aeeb52caff689a21d54276f053fec6671113099b48b6b1c3eb14fbbdeeefe53814ea55a6f31f63e2abac52caed1bfe51c30a9af2b365cbc7553c4e9c7101a7c555bc140ef75e91bd157708031363e26fa761c1ddc38813af324cc7cc621ad5bed6409fb88289ab18e34d9489abc803ed4e1747d8f2b5a3f17a03710595e8175759a6237d71c69585b35361c1498c82405409d98b33d3da397f2b843a808169ab353d3545a99ad2bf384371b6aff81463e263bed94bcf4c9d96953afaac44b7ee1d47350d9fe20a5234a866d84fdbbdaeb31239c13f605841125f539445f4dea965189dbf373de34cbfcf4cddfc354dae7b6d9adc09d5a9a48d0bdf19f532be4649a70fd404a51243f6e4506bec28dd89a9fbe5b0dc62667d3469d224c90e3a24df5043de3ed3baebaa244d7f2d69f9948debf2a54b221b186552bbbad773bb9eb3dda2fcbd1827271d4a97af73f9badd6464c76e0fdf8b91511e3f8f42b71bf456758a33d7f593ed275daa5efb6bd3af6c5336e84ba72fe1547dca463dd15b1c464096cf7b07c8574ab7699d2a07c39cc5272d4a2ccc20e20a1e07475cc599d8ddc49b2ecfcbe4cccf98f8264220ae6e20f0438d6753e3c59899f66c5ecb672e3584e839f1844bb8d795cee06918f8dacdd2b321b241524f7aedd9e8d06dc6d4e08d793f5bf6bbb735600fb5d825f6ebb2df51fbfacef51db5b1173a3e347c31ecdf16017ad3db8cf9d28b01258d0167c49617ac36e06105e33028d5e906023d64b10592165ad04b5731c6186394d1420b2de00ed506483d9b02f544a9b5d6fab9050f3273a3211f2b529cb140ddd9aca60665e26ee92f25d84f5cd187ad5c766a0119c07298ad3c8301a33a659f99ca331e64ba059f3ca3b22ccbb22cb3c172d2e515159832048d311ec20b2275de112d9499eb0bca4324e210210d9fc967d4a721ced7551b93523ef38933971699fa747da642e251348a47eaa3913883a15c5890304195b0a80c5c3d6ddad5965d2641cb9f0ebbd937eb32d732b68ab82e269de1b71ab2639d594006d4dbb945e71d5147768ec4b61bd9c92b52e44a480d0f034675aa99dbed730e1eb24c6f3847fee4b61e2931a2a2488a2451b4cd3db43db97ced4a78c379369487f5047e66017790b7e7babcea5c93515b973979ea52ba0c8d5ade12dd68a4904aaac121640cfde5369c39d4bfea0c0542082184282594c7ed106e786a81f20ca5bbae71a6d27669d7ab04b221c4cf97437171890a65243bc2994af5dbad5289ab966c594824a4100984c916f55a677f640cfd0a55a2d548d7ac3bc5558dab7a53041263ea9de8fa139c574d745522a390e8fa12ce5c14d2f5a7e9a716bf9e594d9b5a5cdcd025afbf4b5eb8e62bfb85b34cd76338e75ecf70c6b44041d202ee50f18b2ba802576558d25acf270962103a808a17d6100758840160d8840b70e8c2dce1f2424ff60ac0c9dfce4c42bc5b2be59c73ce49a5844c60d21a38f8bcfa21ce88a0a6659db92e576de111ed3276f92929862bea645d24add2ce5b2254bcc3b6bc15e2e8f36a528804b388ab1989e192228a45f60ac0d55fca1121dbc0e5b945911c99cc2d269338f31a0ec99821f9926aded0aae6bf791a81cbf34748cbcf26e216316611575232914913c8b39987b4c21c352d8f868ab2fc894671454554f262c8df2e16c5958c403e4243456a7e5643ce49f91f0924ce30913dd2471b0267ef238f449cb171495cc9fbc4992824ce441caf9043e2cc85e351ec795774963ff227ce046979991467ea115798421a5a5eae81cb2fa9a5bc8cfd7579189c941c57632cfdba2f5d58042e4fa038238297d43971fe2891c5ebe678495717e32d11b83c8b4c11bca4deb015e2aee779c4489cb9ae177122ce082d8948d0082ab9e2c5d822ae9298c49551525c6d1157b0c618639481611264a2c4288bb8824bec11b8bcd3a3411316ad2422640c6c437619a392861227d2e0c41f24cd0f568867230f57abe6e685902c8028229e4ddd0ee37d881c71c6b65e0c78f964b813ce0f12c0819234325b0701adfb000c8e063cea2a5bfbf54b4736765dcbba1c35392e3c840c7c44456b84938933d63e089cb8821b883138ba1f3a094c374839a7b53407edea7befbdf76a10713571e26a9ece7779847cbd12c32084d05a6b2df6491fcad69ab5ac43c59829a57645b90378f496748eb4d65a6bad7d4baecf0be7b7a4afd397d447387b6cbbeb94d2a3b8860c420821ac104208218410c20a8d643b8818e20335fdde0e22b24c0f910307475cd11b51f192e004816387edf9c8c3764efc7bec26ec347984212c33e0862081c39ee190aed710f88298d4f2f6092ec39eaeb0a7a787e705ccbd2e787851a150299cec5e171eb2f7ee490d1a5c719728d1b06d135ce61ac248a4215c8244c39f7496b8a0dfcc5e8c10420821341980837f301a21e3c012213e70b4838d52b1a84c8c89308ac065547cbd4ad554c53b501567e6e30e5a5c45555c45eb82789855a414560a5f749c27dc677c65c5384f52f4a746357c2b29631353c0ce3c329f2a4ed1bf211f21298a77604bd48498087c244306ffd38f880c547436f523c315fdb61a15b770ef2643713c2c2bdcfbab990af76676e28004457954f6e20c4cc1137910e310893885fb0f08693214eecd6c9ee2aa3ea3ec0bb83a5fec7660cf4bd811f1b9b4f884a39f4232bb04c7592638139792cd805d3ac936ee4d986b81388d2b8233f3927b36afa62ad669da3791834e645986714082209e7175a302e2676cb49dbdb40fbead068dd83c154225a6398de0a03cc1ac749341611a321d5cf64eb9d6f95aed11b36eb5d614ed896fdfc437a9f394b6fc61dc01e26b83336e35a68d564f6cab2127606d864f62a1bdb8b22ee0b2a6712794eae29e82ec5aeeaf943d189c2745bd6e9e528a2b97aaf8360a388a6f15350b3840bf550c0f14cf096f280a9e9e91a7bb7ea896937bf53b6c386dcce08933e6639c40bc7cdd6c7000d7e83a673e5ec658a277ab311f31876150ebb4215f27b596d21a14e744cb02ce277b30408268735aec2896dd496b7c3acd3787d6d11ec149144a521a91e8c4b087757e670c7b3130300b84cb30b0968721c3434d0f72099913fa61c1a41f11164b6803f423c2428ace5e0cc9c59504e24a1e475cc9db1470f949d1f2396b193730bb1dd89148fd4da41d119fb388b028d215472e1e1e0ed90cd89093071204555e762fc7e1c70109a25101f25608170f911091210a8bad8538c7e21cd0a7e9adb5873d451031841041e0f8e1a646667514677f65cccb41876c0fae286afb8a737dc45a5503379f536fa9b53863fb9a53ffea09b2399968fa0c6e568b2bd4ec5c2010ee115921a4b3d6d7b3798f9e54bcc48353545145156feb37f4b6ee763268dc051ac13d222b94746ca43ec59515593c4c83242c5851d4f9b6154af47bd68fc88a274879f523b262096aa8620b6c0c4bc690d4368d3d9b5ad65d79b9fde84dd3e0b3775b85dfb09c7bed19d5ee33f6f9ed70bb61b3e19c4d7a89aaf0e91935986ff6fb5e0c98b231ef55c54fdcb667356c3ac39eef8cfbb81dcbbee3b60e6c82dd4bfbf76c7272d874864560d33bd877dc7e2f8694cf3aec66f7c5b8323ca44ca085c390150393232356e084153adf0e8312fdc2200529c3b004ed0c62c8a21f5118a8e8ac6a1a862b5ab58a0eb8a787111df0184365e8dd547145ff83b3181535397093e3247d95894f64efbd77802fbc7ab3ce5ad211932315bc610556a0e08e2189280c4774d68f280c3d4dc050d4b75fcbd75771453fa22a8a14a01f5115473a7b05e0627d2f894fc7cbd4748c2a886058d2f16e34ee7d30eaff8e5f6df5f466c13d2225423adbf3809d65d7e71745e624f0c37caedd4d4d1729ae895f60d2f3b12796b9825b357ef8a6872a6a4d0f6fa879c4d6814cfad9ecf0b84dbfa3b68c5de521c53aafc60c8ae00eaf6f620be4c5c55719fb8624908c79431048d2c82319235f738ab3cc6ae27c0c08a86b724dd111ce2b88943ff1d11194472d7958f159fe3c1b979e8e3fdd0a8258febc18f271485191ed397b3af6c016ec61ddecb05d53f1b027efb05d718e8c88755e9388338f0a0ec0491ad8c3927168f82987fe21ce3c000c5078ab24cfc6ce3c000c5278ab273fe330c50ce01083242c7994a4f9258dfc4ad2c8d7481af99b790486acbe53fae02663beb67a5a7a810e0ddfd30f137da1c7be4b4863907e5b8d6b444f3ce5d0d111f7e024f20215445d188324f2821c6418b8a9c518947e445e58d2b31f9117aee83cfb880a865b935473effdc217a8e009ca420f62d08419844189250000873a0821431b9a708525299802c588085ae882909112a800d285219317b4609484910cdca08537a405254a52acc085235b88a20ab6b3d188b696880b49da9a58d616596100fd88b89045d77e445c280393572b3c1f0e06534c71857a05aea6e69eeb5a41386abdba2020785846c8a72a50b10fc440aa0215fb08c2c14eefc307b22a8e0f0c0309e203abde07b2e8d5415616e19b71da0b878cb9879d1032e65e764bfac20d07901b19735fa9202363ae9c9733e2ec3e1e5e895b13b79e8cf113cae000521fcc85511e6577ca0ceb7c743e827030fc648cbde93e6207b1cf78ec17c6d12e710b9622e63819637fd3b3f893b370f1f0d971e0b3ecf017c641a1300e885b3232c6fee42cf804b76e648c3dc44fc67011b72e63ec65a7bdd46db81594aac03c769c79bdc57dfec238f21a6ec12132c65e6238b6158403b147dc823d7848c4ad56104e3cc4aded110b2163ec5ba53f19738f2293f2c78a57f96359687f231f4ba56b05a5743e321f413819864032c61ebb0f161a70180ac9186bcfd202aefa680501f11e0bcb50a8edbca9932f758fb56932700021da8291ce5e7cb14484fe26661d8e7a0c4016fd4d94d11691c2bd354935550a73c23081a953d0ac158a2dfd88a818d2760549b53ec15a6b6f2d91169ca84988b29085befa1151d1d3196648be217b309ca4b1b0b350a40bd032521ab85e8f736fef27c6b92e7c19b383537f718b03421ed6c7b2ab96d276ad201c3b6ff193312cfb7ad9d33ed68d6ed6c01d0f219450ce5892914840222d2841a485236a1459fc80230821d2d0b5d4d5c2e0a1073274ad87408d02477405255dafaa51e0a142e186e80a53b4a91fd115863aaf647005a12226fa9d6c3359fc494ba22450d132461a5a89c0c5cb05c8cf0725d40264003c242242142d2103e09f26771e34807c31e0771e3440dc390215bd03f68344a08283515e4e18c064135e2dbe763036192bb803d4264a75c5291fadb5d6cec89de20aca532218894f86429a44cb679ecef4a6763b42340fade5a13cd7032fec5777f0b09d174b5dc158612c15a5ca2a77e2b4ed3035bf34657898a7321a1767e0a9df26e3c9185fd7c3c98df38ffe61082bde99df8115f5b43c1deae9896db61a2570cf0d6d6f6c349e927923be5b0d99d4935f921e79a4a77564524f4b6c0377887f5b0ddc21be2a817b170db207432390a6903b45cebe9c791b91202242139a364d15a5a2a9893192871f9ca474abb1c9b8f85e17b66598a66db7b483e929e1b48b3bcf9386b2c9a0b822818bda61a88af64a9b0c0abb158c88c10b42782d84b04e48714a9903f7f6f7f7de1873e6e973eeac313979b5f87a7b95c4789bc6cdae46e0e8e9df165deb8c2370b02dd49064704e1ca105b28c6631429813877045cb1b6732093ac7f3904da404d786e3c246f0f40c010df101828213f4b08c00f29404a106473ca18a351c51c2ba0ea4d50135c0610e74a84313288e58d75b3f9a40210635c0610e7468c24a0186814f144cc0c0270a2658d7df8b89f509eefd569953b14e119dd3b4c69bd2392720e594526e3620ceada9d36a4bab58c3112534220c7ca26062652bdd663c25b8257e2fc6fcdc244073e865fcdc66cc6d066e1a3fe3a44bc8669cc9a19773ce2150d1f174085174bc94b59331cfc0ea755a4d6fc4d7539c0323fc8c7b6d17a88ba884cc15c5b11c650cd18c000000015314002028180e89c462a150341e6af33e14000c9bb64a624897685192e320848c31c40060080000000080c0ccb40a09f0cf58d1cf6d1f7a7da6b7d46037b457faddf45ffa52c17abfc8cad2c16f5c68659fe01b8da4878995a582dc68816a795149ef7dba0b38a365151882f524633825898c008999207d81529b8c4cfcff4b939bdb729de5fa9b2217eed1fb30a6d14883810ede47fa40416c19895caa610544c67385b4783b0cbbade41825672e5674b863518c0d006849c1b8553744402d2468c4b92f41a57eb4246c0c014275fc3eb630607b49baf889a378436a1c630eab37271b25485b7ba3a8b4462be9a506a298c90aba981ccdf6b9217c111e972003e78aaf55a96cad5160bb07e83a59d54e28c89f2b7fa5c465cfffd5eb53fbb5cf50326831137af7eee8206bd8b5d00711517f9e2cdf9cb8e1b7abbce637ec356010f6c35791173b8b5788bdb9b892c204792f10cf790e96b752ef03eb70e0fb777124f2c47bf7050f9240fc229b4cdca699cdaf12fa9e897c565f61cf7e4cfe9db29c051602b0d7c074ff1ac962347025a019a4c58b2a1f005bd65e25d36bfe3f1cf40a1c8174363381805b7c36f34461a7387a3905fda36a791a2c6dba9e95c7e046e176991e56d62b77202543e791572d253912bc1df583560b6db72b56e4c5098d759eb34d13f14fbf30b515981c219ccb822f0af7bae260fd42b09803b4a0e1e9d9915715c9a1d9d0366dde9f30c58d91592311ad5a12f9b5ce92342c09d9d0b6d3473e799698c276a47aa98cc26592bddcf02f8dcb439278c4264c16026365e475e6dabaf825f6f214f8f4c93a98e30a08ff69b04dd7b614555eaccddee92a98530d4b813a491cdabd6418ea2621727b84acc1dbf3460efe1acc18011c9104e707767ec71b971ea1c480a83d369f3a213099e2ffe1b308617a78fca0eee3aa29152d517df51df08d178bb456293204ce098ead6f08a44b9ffc7f1b5a4c84ebbda65033c0d659008ed7c134e3a6ec0d637d16c0d4b485611b70280ccccfd2fe844c7f05dbe42c09772718c3a7b3af1dd61853bb2d9634fd5a0d381ace9cb5c8b406a6ecfef24986bf7e12de9a1b51209efd459fe61ed0e20d7ee12ab0ac85da9ea15c617abeeda82a1303a487d51ef3f0ad794aa7dafcdfe6760d50ff523accf71b821f0651601e6675951fccadf17cfc28819ce3b4d524400df6a0793c8148136b07a5cf4e7407c07f073f40232501def7fbdf1ea5c2bde1fd714807f8edc4136e187a5312cba287f2af2bbbc880fa43c3d44e56d4f10a7cf1a3bf147e3ffdeadbdbb144e66df47822521c584e8e805698b1330ada77c826c4ed087ae0d3862f7c3c45f032d7767974011174067ed67bf2356ce018cb8448cbc6db61eed10d9cd496744ef05fb838b3453d5acb36e50a71dbf91c5decf6923f6e7be28fb28f2f59d1cecbad96f62f44f10ada3865406c93c41770210987043abf6192c3b51a776b9437ba764802555d4f4eb6fddf534ee076aec95093fcccb6de39adee58291a628456005e5131134522b28fcbbc9024a1a204764707862269c68ff62112cba2e0e5527df9e6bd0c4a363cd62375b2f5d443b5f0ff6c992a20e81398089d27cf29112f820ba8c52df4bdfb355e4507bc66a74fb38a71264a6896a745c93210c53753e10b1880352859437e5f33d881500e1219af4f6615600f6c8f531cc5f7d4592de40b9104857039c8ecea4a596c40e9f57f4ab379894ad82f204884746540cec139c510f4c2ffe1042fadf02d5a1805e3d2990c9392ead6b7da67cc5d5561c6d4de366c4b9a1f62d6f652a72d22fb449b904bcd3816f3f7159963167dcb7da99e9195863605b6ef613b3ae649a88b6a216c35f47796a6bbb2865d5c059487ed438dc725bd2a2fd76d150639f09a7bf9b79bf5683422e57e257d8156466a37367af00a710c38f3b14854535f33004d23eef3ba38354c2d64181a8c3c59efa048eee8b91c935f3b0d1f160a127dd69a9f917423c521df697888f124168b9c6ae1dcee5b5bb7ec9ecc2f5880759ed882bd097fab9abf5c4c583663de10ae0408b75b4497aef3ffa1115498f6410c4ad017a34b5a417e7c64638c39f6f676baf81354be3ff7823584c997f212ce4552eecab3eb296bb8f8333416ceba187c2a153c7f86353ef085e1509226a9291f68c47ba725e7048d60314e59aa1fe2d78284bccd1aaa5dfab423feebededa0b059dbc973ab4d24e41f6e1365afeaed9ff38320d4b930b6a4685cd6781c44b8c4b30245c3ac0d6fcd03a1aed0fbcfe8715c6ed7bcab3009e51e4e7c856db13008cffceb19ae37922af83f8ef08e83ef8daad4c33e0e068b70d4048f664a354d456eb4c632a45de70bfbaa4971d0addda4a020a993af09dec3612c1481c99ad43f0854f204f871f39380b76c1a130753b80b68cc9edbfd98448b84bd2183c7e1f6360955353f71ba7b638e40bd62ddd9863b35c778f1cfb94b508400d6de746027fc2624815e5cabb0e62099b14187f989c0de1045731581c822111d90a539b5b8884f72a2041e9c873cd6ae29d05ebe529fcfcf74ffe32dab3af52d2f5e44509e6d137bc031c4fbe3b70b9522e165b02119f3b89788e984c9440d5c264e20487097b71786e0da8b510bb3d30687092d50631076c2124f9927b5577813923ec7364002cc19739566947ab7c1b34e3c7091e6a370b45382eed1b1485fbb9ec28595455ec4edb7385d148b08636bb1c9011eb07a837523a600698838f27b827ea324c08103d72a34cf452e7b4395222cadb119acf9f486672b59f5458f8ea0c563ed39cddd12f6bc411f6b47bc7686b6ff237011f0085dc9214933b60b5cfe5774878ca3562927d87fae78b6ca22321296cc4229c09c5e89f5569b969390a359a593341c7efb30c96ac626ab7a2a82929b6b9319ebdb30c44f493207e3aa4160828442fe8ab930e2fc86ebb5a32675c0974bfff077f4323988748debe60506e60739d44160b41c8bd1e85e700cb29274739a08c36f27cb1951c7a5741173954a7950cd2561ffc58a57a5aff2a29d8e83380732061eafd57e8d19a7f91fd8402c4e57dbc534cff53d228e890c24b547286709c662fda48a66d500c116ba1f7296db88a738dd801dce2b91e009ad5d7b7dc643f939f92b1995fc6451ea873052ea1ad028a8c520fea420ce02a754b32b6ed5cb5a0b044ed5fd4525d1b2b9355fc78e22b18ff7a1598e6c055c0feca76085f2e472798d1cd2a2999a4202b019d8c2c33208ff1089dcbeb5509eead0877d085851cb595611694af8dfb2679c4ab3e1fefef8e02a3335663d996a1f24164279816ea037cb82ed324af58af08c0df2af97312caf2a3e11b628074f50aa8f2d607d46c5cda1bf61742d1770492ed814669c9972e6d53910df4bed385e09525793fbe39fd048afbd62a6072030a825766834767c0b0f46bb00d3099a97ecdb2b785391a8ed4d37860c901bbe8c391c999fc124158ab216976698a6c9930aa9b6ab2408037370dbd296f9033da522270d124248a5e3edb89254ad139a01df01a8a82113ceee718e91c4440ebe5611eb7a80732a6b173211b9612ef00a010fd0e318d9519fb67a997df48f56679b94452544a836a72ae84d45b98efca23c0ca65f11972aef2b8228adb5d1bc9c6a38cd7c022a27f6c84c3cf5d5df3ff123bbb27534e25114a2b113f2aeb953821a6754375de228de89b3baa0155886394d304a11d23340d266e1478a0da542374793241383f23c9323523d391372ab98c45a601e994e153e1f10b93817c63a15b2d27f2b446c2f784f010583adb1261462124b9a6bcb1aab52ae7fff84c8e4b72efe131b070816a38e546ae603f86f830eb12f4fd3ee542d8d3aec49e7d131a6b03de91d09038b49321ebaca2e5e34fea6d56f4263165d5655b3b66d81a626467d9b37eb7eae6270da2d52dd8acbdd910bba52e41c283e95e87200b4d271cf7b4cea0ab0299b8a5b6c408fc2976c72a4e54e5ff12e856494f208c606df9e86d8551a1b6c0a9098b95d576c953c6a4cd60222c7d0c1a78a8840eee8f304b0a3b5a8609e2c52930d2fc0ebd253e134a31a15bb3ce825b308699e47d50fe60449cf40aa0eb42b73509843ba1cf63ecbe1e60b04e2cb368a22fc12bfc5c063b7d05a2e1fea38171b11f6579e6c4f7bac2417516ad09e920d207b190a059295270161308c4c3fb4b0e4c65f424e0bcdd6b34447c0c0f40a7e1eb1c5e4b5244e9eaacbc2dced2232aa2d30242a5cbebf46a4bdc301c95c7abb016fe205d8f4e538064b775428525959d2d7178de2570f69bc97bd9d7d4c572145183a26c172236fe6b8f4a323c98bc91485de2fb56c279c30eb196dc276a574d8759286bbad6dc2c4fd7a95f657fc9a633060854448ca9590e22f33acd8e0840fa252573c82e23b9cf0c63a00890e4d4860e3e68cc8c77ce3c516f29660215805215b866bb46611ad8f6f21ea122488f529ca9e241339188fef969512d255c30a9da9270df4ad690087b834495dd801f2213aabbd04c3c9a20f6cc9bba6f112258c21546a214d8d21e59ee10129a9626f0c45ff2c978e5e3fb9b1a34e2442153d254637a486e468d3ce81cdfea8463eca572f737a3db84fbf7057626110b60ea8fbb399d7996cfef9d61d9148d5685b9a6cbe8c24285990708c7d37d1d67a3fa1313e289fccc4e56f803e695fcc40f9d5cd861f88f072b236f290dc91b517ca816bb571a701568ead016624a0c424f080022e9d14ba3540f8629c4d4e69d902e775cff1910e1ee75ee0b75c773861a1005e05850dab6cb7532e36ff63a0b3838ecad867ec0e8001e4ef03f5f8d131e33d673d593e4d55ca0f9052c7185fc5ffb6359f54fb3a4555f0fd1a81ea58ec1ff3b821b2733a75046c7349eaa83897bafa334a338fa908d2e21f438ba5e8f1c20e4553353572f608d663b1d5d3ce0fc65494bada212b69e772a9abe1c638a6f11e0b9eb4da2829317f647d5d165e55ea68fae9124062516881d55c56c13b3de400df003b21340c58d580402efc44ae2ea990109b321c6742340811876073ad6b56c2c048b34082a0b784f979517c5fd2370e94960b079076c403aa0f9144660569ec7eb9347e3490eb389a8951c0120e61edbeef6ead808a053c86509f22db0681cc0aa970914fe878ae2d08d31554d0936e2b83a973493458f1e68372858caa736ed049faab4d21fc6f40bcf309491e5c0bbc667361e79f8c865973444c1d498e39f4e1d953e22c3d81fc8bde99375b04756ece053911fc3f53e87e840ce49fd6b66098202fce3417d68a6382d8455573120a89d34e472856ffa3bebfc56ba0c2b46920b0b78d02a36823326e2e7e05a813e610933a191a9c1b6e5ea89b0b97a9588faad8ae05153b9f45f3e32cf4adfe2a702ae4f20ef3f81842906cd7056fc7e225fe4188c82627eb85c6acb161faebe97f8e6c68806ecc78bdd9d3666ba71a59c35c120fb6542c4219dfb77db1c21835a7cd03fc2627e4721a78ed25df72ee286dd6e5b46d91665a18fe724179abc283e562fea19ccb69c733369b7f1ca0d67aa1284d008cf338efa4ebc346ea7d85d8f00b6637ac8b29b67a7d6fdf49e1148e7ee6d2e0a9b6f3d89a0ef9a458a3de42fc447eb0b8b5b5cbc7f3652ea7e98d020da9a4af7da983120880e9d00559d9715f2993829393d2ca98597c6a55262fa7e8b7e042c9e1783c42f59aa0ffa4501164398b6b7022d461337ff53af05117717786380fda5a90e04b33759e1513502345fcd1cb114085b149568657724de26d4872739434252784864622186a075ab7c0b52afed865605912acacff9f7cd9e09461a292b864cba1e87eafb4b0cf10ebc4c8adb530da9e7c4df1b78c5dd3cd8101fdbe1f69fe0215d80a1b0867af5fba2cc0b35accd848b40077f2f65aa1d1024ffe187816d3acbdcd601015be2b049c2b8f3d803a024c56f84d8ee9a804ac0c06e82b211bb5ccbc43b9c81bb98257efe8963669e22f978cd9100409a3322e736040521d23f1eaff65c4d893705289cddcc7d3276be50b71ae17fb0a2cfced0c38fc71e93acfa5416550042d27d710ea41e82f6974ff21258cbb959447237460a7b5bb609061af958617f9187fcd7cf920647383cd3ec3054f31870b4a333881e82db3f4c85871543a70db2777a6c3b240b9f5f6df241a1edc795be9f4b52826d68ab0282550a2a2cf504a55e668d3cdac240724c3e137d9bbf6d9178c464661ed3df0a26699a0262bc0e0b148140105723c5e282e2681f3fb38a924e79b624d0a16b35d02acf93f1416e79a358f910989f3747835c0495e18ed7138e42b25b082c1abebd3581518951602fd7d3e1198a9083b83e505dd46ec9be78cae35195a546f1ccef5234b762d77733b9d628a815bf2c3bda2df6dd4ed3d6e90b472a47f6d8fbe277e86878e7b84313843f7b3f1f66485ce1567f3b889b84f259eed893ed8f29f9be13d743ca85f54361adfa48795582d7a6e787263f7bd4829a7f462d736bfe678dd67b94c53f77370864e65d752b01caf74224aeffff4e116d014e977ec59b6212f805afdacde4ea86df5b23175b4944a81169b60309950fc1fa98c507eba2abffdb9694218307345a925c905aef0db38cd47f685cc50cd0b758ec7a51cfdd2d6188c699c35aafd8772490ef22bb08e43964f781cdaf0dbe9ab13aa01e1e12bd4157b59975f9dd56d29f7b509e1a07ddf232bd708b1f453e08e70bfa11f97980d3ed1e43e16fb1af012235f83178abbf1ee4fe596a65aee38d749b4e94ab00fa487c775d8d358d0c6394536050b87c2d6de5b0634273b0d003e02fa7993984105825ffb15d6a7331c11952dd335eb0baa20720f95d93e928324040742aded41bee275ae2a441241053b68df55b10cf45c64e9a84fa63c2a369e1795ad99763e6f61f5b7a6fbc4b78ffeba87bb950c53468a9bb0238d44ff716fb130e39ed892e16e5c23eea29b436841c73d6dd4e2ae3f2378fa0b3938dd2743a02fe5220005c902f549f817c16591655c6b20b80bec2c697b5fedbabf0350590dbac9b92f72b7e3e1b84e5474830b66c6765bb8d4d29016298360f1babd305a4aee37b39d69e02676d5cc4d009d790bafd97973f88cf1f91d2ffae83e5df826bd12f2dc29a8d23ab21f474411b1167041fa38f216eba9dedd1adc539e04c29efc3b594a11f533581c72f36b05d1fc81071fa2e71ea4a141045bec08ff16749d708fe44073d6af9f7525c6b9df238bf1e527bd51a2bdf64af7e93a1fa24fedab1ff141d4c00f5d8efd8f7664fae4151d814f6ced66c1fd4d396f2968414c730c954cc4062cb29915af0a1dc1b1c0e0c706a930cfc20c243307fd7c915aa7668a41ef11bff7355fae5559e7acaf780addee6fb199301b2d056bb7b42869761a006e091b2b24a2a2674c07ee998d683a7f8b2e7d4943fce0155c7279c83fbee1825e860f97fd223d24e0630f66f5f2a5c74d9a3a0ae7cd7fc0c773f6849dca41ce180e0f76a136a8eff928701aa3bc72b317f2502aa86ec41628bdf25a7808dcbde7e34d84f988abfcf731fa976040fb7e8406686c01ede7d6d1472f211e720248b014518467bab0b0ca649136d2d362810f0925b3dc3fc5290c01a00f22f5dc47501ed4b4c9d45d96149ef90945657ae2912908267178e9a97cf8ab15c224c70d0d2b3a3edc5e440020b8004a8639d2b40c6248ab1f42a44961206fe79efdc300d724e17e29d2fdabb67ce187a14faa7d8a06555cc4be7c42498f9a2a82be3a1d700e7fb873f546156a3c971d397a75772b73c51f37f0a8f9dc4669bf7170149dd04445af97e9357f54dad57f2d6a4b27e91a1206d24bf21d70a629462ff5e50259e3b058b904b0a4744f880f6e2657e2de91cfbff927c5decee59737dae6dfd5c7ba4c37cbd414c96e7b772b9c37d2b2951c5101653feba37249bf4c27a45b0f8e0348f86fc3801800a34b0dad2e32481f324e6a18737f0e8342da2c93a705e9eebffa5f80031305b31b5d9e7173ffa3fe6f652e1ba2da63c88be5b01b464793589a63f01b7304d7cf0c1bb68f778f93718c68c7497e7ed22cca7ca0442fc6d77cd30d122db75e8bf2d1e57b23f0c4a543af2dfe9942b843d726eedb2cfa41b819c33e6119dda5b9ac37860341a5c1d1b7999b60fbd4a5f3b1402e47a201daaaafb72f3cbb17241781a860e995f5c10cee2770cce6d12ecb26e38d4021812417354fdd1c65da5ee88d647e95cb8a2b0b0ba0cb63244d623875a1ab9334724c0fd0c0e8f535015dbd181ee250e263b4d1214da85653d6f0b6314f1f18d4e242ce03f320674cdfdc89c261a06d1c89fa25a07e9b219b40d9184395acfc8d8185fb1e314429de20e87a4ac3ce071aec3e6caba007a72930f36587d7cc4df1c56d2f6f380d077c9e6be3aec18027125d2d31627a613b2ab586b60af5f7f46ec1c41555ed1df18abecfaad92116702a65739e333b7874e226961776c9773427f38d86a05793b751e3ecfe39193a3cd36502eb7df4856ea3d85a9fa12e112a87b02fb6aef4efb75a4aba9d8ec5b828abb9086453726a2e282066288635f88d7375bf83f52b4f285dac67b180f3ebcac5e2dab36f0acd4b0d85ecd4b23922c3698a81ae7c83fe09aac9ca078106b26ec8aba279242a394cb0ca2f6a1049a1a5f11def1521742cd2e831f9e66c9b68333d2b6c711ba80270d2fbec7ad5504b4e86f22d5fecbbdc2bf16b082bcc1a8dd24b35bff9709fb2db833800d93844f8a43ce6631470e7bbde390f63b4c6f26b6c3b46876ba007bc7550978b292a8c6d21d65d3024b0ab57efd6660f47cecb722adaf77f66b15eb0012dc24965aa2d8a8db0592057ac8375ae5addb5f7cca546c81e8cf1dec553909bfab8b402fd9d54a4bab749b244d514c169aa5492eab2cbc34794a414801ac40e8cba2f6fd940bf347abb0fde52219a64b6f7a2cf8fbc975490a572cffd6e5364880d2b8d760cc325772c535441d005680f595c83377b1f4803b983538d2522d6ebf55ccc17a22665c1162e34edbc4a80f265df8b8d226273f4e806d3e84245616aecc804d7b389c6e0045c308ca2bee89089d7ff0af760b15f0cf8ea9e85c800b910174c868d92ed3c161382c15d736dafc270ff46c7ddb8a1948f6640dcce94997a283e05a1d431fda886b8e5e86b551dcca7f44b68b69c549241f37e2bc0a145fa3cac44123017621c3f7d2cd6eb518dcb675aed0ce6630653d5fd18fb5f7d52b02107a67d90db670000049c26409dfee0b3c34f80fd413ea94fe6a42e5dafe41333fc94c12cfeb7cdc706631c1f9a0fff2459fbc2f6c5724b7c8e7eeb7526b5d00257257ed00898a808511216043b92788fd68d3e617d89aca287de73c6475135d6e0b4a69df3416cb0fa7daf7eb00698048b160a30c15532e4af99d1f032dc51d4d63ca70da21a503ec0a79bfce781f768e8a10541d0175567b4a18e1477d691736edae402a5250e15b77725d9e1e8ee6fbc127d398115f6a3b7dafe91fec4a4a8577ea37775d77b1687e061bf6d8d335bc7f36bf2c3101830d371c34024437018f3526de414b53f266bc62c2ee6c8ae030459daa50b7c11bd8b723089f905b6451cd2f4b3acc3bd44a31f9c84a08eb82990d9176fc1e90e87eef0d8ec460baa196faa294372d2909e20641387249d3e433aa6c13d64799f1857eaba2c708833f30c43777023431eae6919182d5b3f082ad478844fd3ed9d839d43528805a280eef01e3131bc9c618b83575b9fcd52adf0ab0a8d110f89aa69949885a4b8c6fd68f762412bd04f0c873ee5b7a6677877bece387d2669c761994d87f548d49d52bc99d2f82f380589ff23137ea9281ca1fa4001e0f48c9a0ee4632da525fd28893b3463d545a21be9fadeaafd66958be904fabdc085b737cd5a3bacaa9e2ab4f807ec13b053467413e2de3516449e83427f838b578147bb4b5cd2452a6f64c8125f0eb7ce53e7f52833eaf6cf35719af0731de95702245fb8cb7c5e233aaeb63a2a05d6ab2f807b1e00814fe8caebfe7d9a7630eb1f404d9dfc477d9bb0532c968279415ccb18b8326b2d1b2e62303715a6067bd34fc37b5cfe9f86f4c9a05e587e7c63ef8f2f896fc7bbd9126713b5abea6f477f83a4379f1787660f03be610c4f0b5ec3574f380a03ea7d79138cf2b92d680a10419407f0693a72709aa67de2b30f04ef6a032dccde8bb81f9778d58789aef2a71ab860562aa969cf7a0d35dd55f6cef15dabdf590f7580f9d4fc6a26ea4d227b7e0a0ab20596a6c2be09137517906703062c500e52a046fdebc9db9d3dc1f3c2e039c5d355d2ed545004303c653f3bc0036607850be20604e218a37078a133bf057cb542a401b9fb473af854816152349211416c671faf2b8b9677be1dc212200a4d91281ad2aca8d8c17437e1f4cdd85e21024083af530b840296313ddb33f167c296ecf5c0921b29d4d6ff5ebd1aabd2be112db0f1509fdc724a716dcdbb979b5f19700af93b74bebd7e2ba323871c7621a8d30f91be5da4d94f6680d707ea0c3fd95b4174ea1c175de75073da1a149ba7a5aa7c80044d7bd8993c9cdf49b83b1688cbc0d375ca4d44229bfeb625acc0420eaff64ac3ae2f2f78bf74ce8f65bea371093d45a7b75471a4de4562736546d41d0e081ed555c86da8977ac6df713881e8010f5bfc80a0e6d34891864540d024c08ddeb12679ed0880ca5f26d3dca12f3b92a67b468cc617977270a9a051e50304d8618e5c1b9da001789d696984cbb2675c63e8179ef98c53390a9edcbf51a01ef80b2d8d6bf43d08eb58216d9d397181858c9173ead6510096e1a06031a4ee63fff0201fd2a2d41cf08c8bede58d334b1032b66da13220b9d11ba4663b6c472ae7138e4ddd3d29184454da5490709df5541774f9440ffc6fe1054ffe71e068705bd762697658854c67d30a51fcde6803116e1b8ab59b817d2451a3d3d4441bf98a743fb8c67b9abcac3b53560102892409fc665005a873262c059d24c4a490a2ae74062209dfe6f2c8eb4ce7628d31adc13124d9e5b51d3f223b4a8a9bc16df9f977ec872d265ad915f8177965ad7f87100ee59479a07bb0937eb73e7a4b507e1a6ab32261e2b9a3a9aff1d0dc625feb9b8515c77b50d4bdb297fee7d6f0eb89b729cdea01a55dc73f8a5bc4c8c0c721eb60d49ccfa9f5b22b2590708506fa8408ad00c7f89fcaf168f12ac3324533d41c185ca0b1137de6cb8ff84a324290d95353254c79f32c53222a7ddf5319f31c9928a05e76d3d936119f3e27310064014ca77980095ae9e337a726d749eb2845c8c37cf46768ba66f41a919a0b8f739c6d85bdd6b3fc8ad26c46e7b1f66e39db274d9890dc2fc5c6499b02e433cfaa3d825355147b28cc8a14a1e1b00ab281006ba4fbbf64f2a2b6b0ffcc5002a69c6086bd2ad4bb7f00eb8818a1df1837b757fe788fb95e5477e343dd10bc8d11b3acc55fb4403a467e553b279e01cda56c9b7c2eeb9cac2eeafd4fc4cdb635982402268655f43dca0d86877439e3d4bcf887511c86f5b83ccc868db0775f4d24ca22ebb668eaf7c5dc87f909ae239474166dec0762284e0c69c8d4d1436fe8dd825b56e0a4df2a90915ae7871723fa3f156330edea4273e78a6a89cd43c3791876cf57bfeac44132cdc1f3e2520c82203b98563280a272904279a3c40be9841ec4c4ed4cce424fa0ac21c5481ae583c0b00f2ac17e1b0f8e5008645d9996263f81dcdcb1881d1c24533f5862610a4ae4f614c1c184959788f5c4f3f77a96f1fd9d959af76b31b10fb63e5caab3d29ef1c029673938d537d69e1ffea59c2d11ce646e14c9d3d0b47b2d441642cbfda46e14e9cec39f284378beb582b95f417c0f8be5b770670362c59ec6315b229b6c1de1cd31147a77fe8a5f56563a4e678bbcda640d24a58c83a5b01255c536b899e776634be62a99b66c8f2c4302e6da936e27d27e02023b807f1127aa5a6e3574b0aef256a2c584a28af8d6ea71204e412f9c886fb56bdf26eeb0cfd1dbe5395caeae60e6601e8dd37f1220ff546df7496fd949d981528a6d83551bc17e85942c8170ef0e6f75124a9f8c26f5508bdb795650a8d7057aadc0adb852d9065fee38e30183f76014997045c8397895636d29eb43ad1d5a1505cf6819699ab7bf0d4dd16e1024448e5ee520d1f900d62344beda6c5a1aa2eff19937b6f3e98610636c8130313184ec84d3ae5233bb8371da5246d6d6f60ae48a0b41a90d467ebfc92f898321c6f0c6ef8cefa7ad5870293e1f7fee6d4f4b748006ce0b8ade080497b5a708436e5cb259a63da67eb514205f53a2ea539ce2029becf8612945952cb174451419945238e3ef85f6fe6d8e0752276615064e5f06c37628e07f2fa89effceee8cdc3aa953440d042808165c2b15e25b076ad160b31715f42e2d4bc111cc935995226cfb2742af290c43181e87df8e330b894c09f48c895c443a20fc242574eb1c6045811420649917303c9ad3e75e4eb3a2bb855244fa34d399de5de8f4aead9c793d76b8c62a8a3d5288d03e40beb524f40dd977c5aad68cd94775496008e145847f60ea8cfe5072f1db989e16b96a0e664b333e7022deb557ab087f5114c1b8cd391930b2528a55875b76dc2aaa9e680b7d4c3799a6152de00a35668b5699f66fbb121cf93b255b7079c22cb59e9e311fe457f3b0efc007a28514f1b612a69334f336bb2223e287ba6f89fad0aac8cb5dce1f203db3c20fbd5b8fe7e9ac203a68b3fb89f5fea60e4ef0cb05e59703e9e4a73cdf344572d9e7a1854fd8206622cd706ab1ff313c45b7cac6ed8a8a0e607c5149b3ee933e54b4f47e6a4a13c7b483a0cfbdfca6b98f03d65f663ddd1055f10d7aad5bb6c6dd3bf2339b394c332043ae9be06f2a00c1446154b544303c4047f1f8359540da1f1424b362f6350b6bc6a093cbeba7ee4fe8ae1efaf63c911309b411f07b6e62abfa148726124808f469336fb2a3fa1ec5f7398132b839116470cb3e545abb2d793090d11e0aff981f5b159b8bebd8e853c1c88ddc1d69a8deb9e9eb4254dd1233f5a67a4e6383f865cb47160c371edfaae07c3b2e4932bf4a3d0c4a2a27c85a738e158e562064a3a3bcff88257caa500d5e155a2d68060f85c8f924bfbfcaa878b8ce445371982981a193e57628198dc514aabe0fcfa91bb163462bf23ac2b45cc00d0bf689908368df9b3b587ed0701d5c44d089aa50ae10974b57e57f342f084ed85d70b30177a8fb6ebdc6cf824e5ee97c3811d9296251efbdce43544be88f19544bbc422f9aba56765247bdc7e1a4e509c725a5483ea3b18ffcca6251023549fe70d7812236fa9a021a83b768b43ab0366daa39f6c8dab535c686a3712bec834104b6511dd4352d319bb544905da515fb881dcfc2282d6032131ceb081c7f7983cdb5d1a16aa5de932cfa6ba83a113af50d87d85afbb06bb588a795f39b21021ffd1f7e8c52e68535adcee0e485076ad94952679923889b3835dc8578affdba48d3086021f6394f36d9b8701e6472cee7ac4b7f2b1052f531f89390a8ea15c947e99cc167e200b59dde8fdde764612757e417553ebd57344f4307dd556c0be5bc1a62b9f922697860fe325f1367a787ea12cdb914463aa3f5ec987e935e52547303873dabfba33818b94ca6a451953b48ee697b833f115a3513a8455d2143c704103414beef3787f54d72f30a7309fb4daee109f2ecc95a8d1a29967514d8d845cf0c235e86345488bd012fe0165cbacca39904162a86623bbf6e3539a7bb6bf35ebba7f72ef6d3076c24bc9f037e92030cb8bf4692df57a4dc8b8efe68f464a3cf820b8ba929009ca97f0b2c6798463db2e58240ffd1bb52238c3b3324f3758aecd7352f274ac4ca093812869c65d677cbb597355b05421f1527f0ebba35542a588b7774804b43a76907e40b7b3f9dfc4f0bb62dd243319fef6eca1c374ee8075e6e68a634772fa4cca94e6d7ce77aba8946efc163c6984995a32896aee4a5aca24557547a967e5d852313f1202061fa1e26377fbf586fc2be2b754537a083955e457f3cd6245002390583cd3b35945eba8e1d3a63295048bccba4e11830a071270b700e6a06bd37390fdd49deb2f155ba62336580488f36a962bade026438c1fa6d36fde7c74726e9ba160f3869e1d8c147a28ae7018ec8d21dc23987fb3aa33817dbd6b73af90e0285b1392e20e961d9efa58684a2ad6e1a9ee6cbea83f728f5bfed73b5a3c43e020e4a3184a13f8866535f85bf934cb72210d54ccc43300986c8483d986db85397dece84b35436aac91b06c41df430bbab98cbc921759a264119add75127648bdec7a60d993fa2f677241a958b830ea97b5d76cb127234b1d9ad66fc29a909ee9bf1c528c5a13919b1273b4be6d7271a61b5a1288d3fbeaa299c3acfa5be48ad8381aa21a2854a1b3785557839dd35a59a5b0db74144aa951868c81e762010d6477fea07f2e55c55abd033f1d498dc5d8b189b69b2bcd20e85d921034d7faaccc9880cfd3cca7f205d29f1cfeab7bcd842ae0ffcdf2f1c7a742e075ea7cb0eb6ab1c35bf35b5e8862e13a5eb8580e601123e4b49136c0b2b8e6dec42c228aa3d698a0d8d7e5463ebf029c936e0d4f611af4100ea26e42a8acb9643ed5a23ef12944156f5fef0751943b8ab7d945c08b2f09d57f1494d1909132dc15cd1ae51a30dc170e94758aeaeca67745de1d4b00fbd49570457fb15ed1222ac5842187e650615cbd9d87c2eb6547920589fd25733abc7c14e0e95411d61aa68dba5fca4c3710d8b5f3291fa6d2008045c081150a67b5b5d7cd76fcc43d0ca332a307c4ec796b419059e4ec0a8530d9053b993c3d4c6f882b6bdb67ad0083d8679664b11dfa0ea6de1f77b8c67f42f633e2688d2601783b748897755e1dec2561e765d3016f149c81fbb4c399a413f6708f3aa17d973e05a0351a07b58bd7a20cb22263c3420aa63de60994c9dabaecab8c274dbd9541b2759b6e7e8fa5f8dac263d08339bc384e21b709a0be46ad9aa8eb34f5b81d9e64c225d001879ca0d9257ccad18873beb2d64ea1f154b2ed76bf2becfc5bf84960b71e52027a9f2d64cd8ccc846f3eff5d724dec726dbd7ff17f4c0935a20941a6a379a8b4ba0fd149698f2eb57f6e603f2a1cd885153ddef9dde3f15cf66de483a13e105320ca07810236072791eb1e9cc2290a335c98fb658e3b6e59baf155dc89ed15e63c260468f6fcfe6f6de2724b2a783876f360b26f3be500c1e4ee0014678ac50030118c4d6df1ad7ca2888e08d715eb33d2374bf63fd24996ed6c37902d574dbf22e15031fc4b9802d7c76f1d9893fc384fd616b70189fd18bea8bce1762ead302c2856a094793c24dd03b4c1b6008a2c3e1b1e9ca3bab465009033ae6295c28a5024a5bbcd6dc0a8adf8f73334498d516dbb210bad3c44b26bb4bb14d552e39eadf96bf86023441925b83e1a7aa8e2df6f87c53402314eb5d09e9ce25407b8a708cac81eb6d0eef2abdb73b32da19db8e0a53701ba82c930a7e56ed52f5854fe709d4268f9efad604f4046704afd6703667927ede128dcc210919f69073f26d34aaa6ad5d38763952e6401e7217a735b362dcd1995041bc7010ff61ef59c10319401c9944695c6f9ddca9bc48620a73420aa0080cd082ca6cb1e4ec89f3420289c654c0da0f799c0306f409d02b18ba615e20e2eab92bcf7a504d0a84c615ac10936bde7d7d82393299d0a171e69f7ea8ad8bcc74f7ad94cd6c81046b76475caf1bc2da9bf625f0116b050fbaf357a8ea193eeac676911f7842583fc64b168d371faf19ab0d27277795cf666089642096f4ca7d073816cf67c9daedbe4e0854ad73a893432d73228c3dff6ba6070c2af62e2ad0063431105f5d3253e92997e5ec99cc01063a2757016fd8d1e384ebf80afaabd59848a542fb42352b57c98b405749f43ec1c05a10247f137b1d6900c598abd0e1f6bb52cb46e73cddf5b4719ca48129706c32861008e0318661c0d1085bde189aef809ee38dec731107b76542e33c21150f845a1b821beaa31d5d575d21a2194d20c1a4062f762b765b60b713e96e965da0f04b95f645a2122163b326a5ef97457c449c31c9ea8ba601228b579783755de02c1080fe92e9a14fd089cf63d24eb113716d3d546ca2ef4186a0717feb6524a829e0b9e1945fc860be7e1deb0b26ff22e102d6490490f5d90805b6427e9769ffcabf91f5694568412ca80ca407d27741834a2b3512e687f340b2756fbcc7f30fb4824cca3c9042178cccbedf828e1816240604025fafed31394a72f550bbacbf870b115d30338b3aa8e155e14e89507c1b4fcdea306ff1dcefefcbe54a21953868f610e40177531126aa136914933c5ced501059c6d03db3cfb21d05904f9dc9593667ea5c6d1473731114023972d5fab833d4a65a2b6ef5808ce3a739059954030e0908c3168d201515dd0c7a0437b22052bedcd78196d45d1f0f7eed64bd45c0656a118c2dca65e8bca4c364f9d1e8aabf3f5e900943ce95b50d28855bdc3c5c452fadd7b22fc24e31d2f52e0d4fce85d4abcc8e01ae5c49441f9e211c639e388ec09f66775dc03a73d6c4cce59642265298e89145997a2dcd13367647ad6c4be74faf915a067c9cd06f5914473984f85a0c359b5ce3aa8d35b43b8b1541720201efb66c0d6e0ab1be89b3d73af136f7fa2afeca18a0a7279740f0e09949273373c73b6fc5abe7fcf1ad3029906f4355c3e78be2a128a95b7e882f05795d7ccc9eb3e0d379b2ae468532e799b7c2577822aca93ace8b2e5641745ea7c534f880bfd0b53a32834a401a4b28e0615af656db6cacefc232124e4eea6134436c75f60081ac963671e84ae2ddd06f15197408f8d25b6e5605e3eb4e65aba3e3ff0f38684a7680d53ee795983f421315102897713173920e63d19a22d8c13a989f5fb53ad25ff81f6388ce627f2e9820a6bea24f15e3eaa3e50612a8ce9ab3185ce546521a3b011a2baaa9124bc5522b4d04442a095d3770dd12faab2adf6dd45c7ef1e2d4f2ae146f07db52cdb84c6680ed2fb9eeecca395dd9fb46eae59b6015b31023ef90234983b1f0e3e63d01ac37f8f4b3f7b49638bdac31ad49728850cb0d2a6f76d4d0e016b058fc62668d12c519af404d317d6395a2aabb8b500d61c697dedb492c2d39d590b0a31c613172c1017d85daa8e45168e9eac095316f7ec07cdbec685fec1aaf572c8a618e06431cb8e78c1d6a2579a2886044dbbd947e5fcb571b5f95753a82a0441b12c0a62a64151bb8dae21a8d1cc4a6a156a1f69c6adaa77941da1f198356ad0625218da11d8f92e5aebcee567d58b6bccb7d902f280d15f3725c19290e28dc8628f57ab7648a4490f082640b21ca675c2a560f9f0b5a7d4df2afed03cdfa1435f61687ee7136d3a98fa027edfa56de69196d07d9d6165a39d1e1a4c528fb4a4ac4a1d5db66b7676dd26ed994ff773faaaf8e03e43bb3178542b67fb3c11426760ee41866b94078ceaf5309a666122895ceafcd6e4b8a0ab107406032684325846ffc04b09862b0dc1c31db16ba4e5b78583cc77696f53540c66451a0d7c9385305bb248d32de6259bbd629fc41949a474e5417565c5de913abaf7853df15ad2a6f085696bb2963be71dbe14050d6780ef454c6337846c0e1b3ddce8cfbc372b04f2fcd734d2c3881ac1af267b1f48cbece9cd132b8d91c99302b52fa657442061b80274b6c12c0ff0a9915049f33a2ba3b8da70f6925f9296f9d51b68ecac74025b58ea14b2ae29182c99b0d0e9424d55bca2b811e5577ffd611c5ff6fff9fabd35169fbe3cceb4b6ce48ef6993afb20b4bbe89ba2bc2c2fee2a35fb7b54a79270fc9d0bc2eb98af4cdcce9d3050200e9a220b8827fd243e79819c4e337383487bf4c911fe279d830040f1286ff51e15116ff1875454d7ce69b70dbb870f54073b18b329f927e4ebac5c13c69ddc253a8125260e1a1d6ed1c3ba58fffeffc71ba77dddaa3754c6f8027cbba3ccfb53e062982944585a54863d0d41399f258325c79ed502fa683b4bd22bc1397c49c2406bb11b5a058fc828aa0371d1d01b4525088c1436f36f0e316fe33faa0cf49242449c0975f050a492199a5be42b3ba8f592df06a5b9b44eee21ca0b118b9b83205c70d2520ce7948d70c040a9df19354276c08c0182411659af571ce25717095043887210bd28a6114a8c05d71ef1a61bfc01c75cc91a0729775537cb22e407833645fb342219724c0ccc9d74c1872671d6cb5b822ed64c0cf9e74abb902046f6c6a4b7ee15ddc5074f2c162e3d1b8eb3972a958a52859ccdfbcebd7d56c4ead559889ae10f1b24eb4e96807fdba0a70d14e33f0474c778e223a1f0940f122bc97caf81bba5caf44352d34b0d75a7aa09117e159b00fc562be8991703d20ed20ceb3cc879622b070688959d610e50f1d68b36c0c4d0d303f4556a106a8740f22fd8bdb3835268751ca2f971c34d93caee2e471b39c0c64c1a87f250903b4200eabf8bcc100b0a7361ea55ef84cb8d66a60888238d6da33627eecbe049339d703c6e9cbd46b59459342748dd8cc97489aa810afab49281ce7a343945ca2a8b131dd3a490630aa4978b2bef3d9765fbe4fb5df17baa776c0674dc78c74a0f789fa981df98e74bec145a7468c8c704fc1d4211428c159a828a401ce20fca625478aefa441c4c764d0ad974d6c546352010eab6a04d7389427e5e3a92fc1e48eb2cc25c1c5d78ce66fd187b4bb330af4c0042a78c6a6fb92741d2f218996b49100ca6b07a233e862670b82698c71907c8f57284910d5095cf3fa4ef019303f68e8c9a3554f56557a1ead8c78a5ad454d1340aed1dd3c4804b7f057c5d8c780c03ae1a1a6ba79ad03db1abe97015598b0df43a8c4425a45674da7591316d9858268121bf0cda95761fb05df8aaafe89a2b9105573a2f41c28cb3e0835be59808fecb51de509ca861f0bfe4aa33da1175729251d099a693682c3348f549f9e2572bf0cb69d011ec2e7ef1c04a531612ceaf685abce4888229ed657d05c328fd0b38464d0aa0e975d4d4ff0239b5c488c82536018362bfe5775aafa51fe4f0fa4bc96a13248fb4df6b40620330ac6c28e55171c323638d28969135eb19963ce3313baf355803b2d95308ccf8af47e9cf3cd0393325ac7cbc0d65929210662903012f37fa8ceb1ed574509cb0c46f2cd1a811559217869cda83092341b3091066227573a827aa7f30daa74bce4654afa8dc34443563f9a0e8ceaaf43d2ad68cccd3d4185fc719728c2d84f4b994366551bd26024318f20d3b0de7262fe4cf8691f17068c4f8353501e7914a7bd8bb5f085eb82c0d7106ecc719dad8614bb585537b823db392de93c20c252e7dc731ac44bf6d380f8554ae554f2b5580494733e580bed0877bd3afc48492edf8bb548b1713e12cd995b66ea3843f56d3190952af7168fc998bcf2030d503a6bf1bc86ceaad72e897017a9900005319e67dd0d229507fc3f30860730eb740891ccfa5b1d5a90ce87f0ebed97d90acf9c6e9a2c7548547ca15c74189794ae2307f9a4574c4724b1f9f771c61b43bda6a5e09ff3b258b6a6656bc818aec66fdbd1ad539ef19a0b63c37d3f11642649bf57c3cf292174221c164c5ab73102e9b19a2b102d01d9efbf0f63e0b9324eda4596cc46832f1a192b28261eb3685b38c98ace9482e5759fb7ebf61c34e015f35c4f938c379ca5ff8483239a7f653dfec2b6b53c88fb7d8192a19c0839ada63ba809b66e85e41cd7326efc10c4b33946307ad89c7016166cec6da6565035d7c4a2dea24895ceeecb251c5474780b490c8559a511925003fd1d57a55271c6ecdefc1d3c5a6e0a8a9917cd862a96beaee35191935226701d1fa617071aed75815cab0adbc3ca29145828ee985428b3d4872c13e3dc16084ac68006fe4ea1b72f521fc1b6b92c5888cdc071e4d84a6c5264c8b6435c92e0712baea292e282851dc186e9b712bc5914efe25ce9658fbe89bab2e1a09a64f6af185a51d11205ea2661037b97821128561b276f6a34a11a94c985405887e8f2f2db9024afa19b656d8908844e26e24c448825352e9e8aa37c142a17e78df6a39104de6f28382b09e726a127f5bcd93d4492d99ee4de6a207831c5c56ba385422b999f1aa3497e88d06fb502d5c2efbf76e38c644fea60c28d6ec2b4ea1d28cd89f1f2a088689bab4d20638c2840be658effe1297122f35d29e5a4a4d9671aa548f639ac319aca4ca18f0308a04256e8fbf8c2c0ec698809b9cbd7326aad73f2fb106cd1d80cf121b13e0dad98befb34b4d189725e57241f6d22b72a97d73cbe84e5b41b267996c534e2da8488c4412a3d1c1b1921c48720a7c18ed13a52456864661fc413db20c42fdd26658808d49ecc4d6c0ef757ae6b1341970dc03320627e7110a97d6e2684911b9ac08cf2f5624d4119b87daff9030e6a80c1a5e65ac17ac046d4c363a7275b2e3fd17e251c8fca69814954b5824938bab51db0f0502d59c9fba2a9188b8030418d1fa10a1ce18aa60bb276e09db1f51436b15d82aeebe3a2cc5e12ad9e5768762e91b371ec96cbd9167d5dd75b40a4c4a309ed24fbe5e7e423b5e90c911a9a25a528a3f3a511e203097cc7064b176a21d66429924b68064cb71b6a8692bd3e54f18626a54f433ac94ead8afacd03de902956b8065e88924e13d158c4445f72901f4575c38723df5597ba1a0543008f3309cc1cb39141904e31df8d908d13f146ad05fd1c31824c6e1ab487126933321e49941f8f65da5309c4578a2d30fca7dbc7f9426657672029fdbf945508b39fc6227a68ca524bdb1242a9c5d2d40094a8c6ab440ee1d836c06ca5e102123636c9f3302e6ca79a5bcbcc859edf4a6384836285113dba9242c79de920b62c64b1f723e705a772e5749d5dbbe631bb9458a1bf58576d802a109fa4071593346eb348568fc05707ede9a3f1cbd8f82526b91898b7440bc1ca6ad5314fc6ef360d831a790c8022693054a85be9b250417d3027b403d25f7d81777faa4fd2ad7371a45dd42f338540d121038db140629aeac7c06c199473406081581157c00c009fb387bfc03606052810ca39ea307e7a2fb255af5a33c5d84883472b916ea63b0819bf802cd25e678eb3a893baf260e5b1210c3637001b54fa40230121b206009416801a5ef88319a70b62fae5c8b270cb80dd7811650563a646e97ce60b25ef479085adc2d0f410a049f8e0398341b06590074f45a07073cba8a7f1328b578bf4e4ca22b05ac3789dff307b9b52e4632197e322867c5de20284747c338275211e554eeff681686d2233aa0458656e6ef31e033aa16a8b4a40ab01c2a9a3ec15a4615176527f63f15a08cce61525525b586382bfb890abb3f7e3eaf5ee997f30690fe5945138e20a00ecb29d3dc86fa1abba8671ba52ccec772be985eb5849405d4e5fcd0b8ad6d32dff8d9f74907b15ad186e97e0ab144e18bc7c25aae843221e17c97d209d774947fe496301bb5f0d00eb442b0c840f10e3cbd1600f346823bf912d9ba43a4db812b72db0d626d22a91223404721947107d1711508efa440887799d5ac414f2766f3e97475ba7b1d8d18e9e0423205dc67acc188e515ab9a4cee60ee630ab5a75b21202f44f88f5e7451842a85c1183c11a243a8ba395c695da132b7e74fbc2eb6691f42e382f401f04112417f5dfa5f9088900a931d69964b4c9a000e6b13252f67a4aa0d67a8aac82f443cab95f543fcb321fe732775186bd4332394879d125eb89296c09e3fabca0b8e968c01ebf44ca18df19e81f12c8ec628596a54bc768ab093dc0b12b77f38d3078a6e9ff26d510b78af9740f4ec5a9555215c49966801b61779120672433c373b875d1e4ac02b1f65081f111068868d9445f4d9984000ef984b5b2f0842ac5c584842c79c6751508035107e41fc31743c54520b15f9e3ebe99de25ae0ea014de74ce119558a05db276458392d58f426499e4b68f300df3808b99e16f12608f5f91853be3a61d0c5a54d20218820d80e1394a1336a426636f11966450bd688a853aac2dafd14667a3ae9d4bcc76b384d4d944e90e52f44b97c57114be8a5dfd1139d4955285398561e2cea5969f964a34352c8efb7f2a2a7388db9bd47ad8867fb0f6209c2f1ee47709e75ee34601c4a9b8253d8799c2c540658a1d3ba44d64bb86cd1c3aecfc605fe5930b54732eeeec573501528b7075643457ea530ed08d4cdfe7327b47c9db12c40193a96dcf3a9656f1a558fa130bc5bd35877970d1ad4f0b6a9ca00c9c0ee32e50cc0b5b7d76dc265775350d831a6a2efdc8cbd6c6dfb6d05713ad3b02a696b03215c1129e147ea831f26a2e8b18defb41bc09c0a24ffd6c223040d65dc4f42488f23637dd496b6eda66d4aa80da9bd4b9e033b870be5513580a81e05362dd38d0c2d76b22b043df15ce4c659d840779970aa65b5be0e7c09689a90b6fd5c3ff0b3251478472953a2aa140567fb5a165fa61c8b311b9c8dc00c1d4f9a78b62d66b6b4bcf6d6edcf2e60e604d0ff5d697bd388378e0f84966c4567a3ed36a3d9375be65f1aa06838fb119cd60f8d5f6dd2ef62a335410ab023076d35d485044db1d1ed8c1da23e955bb65ab0b8fb3c962f86513dc93ff98e9569b7d450c34323e0250aca4697a6a3e38077ca0aeff4239982d0a869a4a1d06c5fe12daff95f5b7f78ada8304083cf05551599c84c0538d45b1e37e459101b25e0c8f619371fc0371464f933cf540866ad1d99f988dffb4ceb485439d6da8e953a218c0f754109a56789e368c182fd165b9e7a03a9f776d2a9d6c6de7bdb388df76ad038e9162a9dfbd8af0abcc2e5892afe0d1476a0a088228a38e8181e8546acd720aa1074be10c6f08babeb04f1b855372476a8d35da9a09852973e18c52a77d93b13f05376e13ed640199289dfd6ea3644fcd504778abb12860d17aad66a5bddd5127cf81c485ff9ae594ca55b4b55352fddb5718013e8c1bf4c5bedb21820145fccf61bfb1a0b3124589858080b0230f95afdb8579f18eb25ffcd77b25bbd52c634a5e4af54941f3c585f95496553d1113a1161d1fb2ef69fb419d3d14bd2cde77c831153567f670f8fb0ae2ab85370ef7d29fdb4149b2a3657c9e3c3880a3a9a64682d1e3e950c141403e1247e82bf22ac0573faa7cc4521426a85a9f2d8aa1a780d23e487480ea79dc440cd82ceccce3145f01130979af398c01ee543d415bc9121b1ca9100ed4e6c0e38666612c91ad1ab27cca88808116d8fbdb4f182f83b67ae1278abe1bc865b350455113de3d1fb300a0fd38f7e4ac513324dddb23c2a27b327b807c7c3381fda4fd4bc51b3375bf95823d8f67540150b72b48a885e3ac595453c98927a69876ff0aa05e019b4aa758e61d9adf4e9f2cd5113bad5f83cc6f2a3ab87ce8cdafce9194029152a0404538bdb84333b4e3d0100c95964d517b3a62f4624d9002276ef2c19de1bc8fd504da227e14680fa37aa34312807ae8b4cfab27f05d5e7c79f530d74db7f88cc47cd21a4c99a40b771326989ad3bcbe3aec9734c6f6bc4875e488410bf93e3b5ff606244d03bdab600c62a3bea938728801fe5490c76b3b382afd131879ca65f35ce051aff9d3494024c1e6ba96977f393837e643aaf651ae51ed902c2d91c139189ecfd787948439608c0ec167ad06734b03d766ee79438ddaa1ea9b5c0ce3c0e9f04c2eaa0656c1c9f66d2739a91b7a45e828b745a3562f9b657d4a17b9b9826e5833233d043b3978b8ac08d971197b6433d6cc07b05239262e80f69d9f1559611ee1a746798c790d279171f347d597f2c9424da5ae6e1f44836ddee0014d6cbac0c118c8d82e7b202f7524b7b40610ffcca2debe12994fb42626c4dbe786ec95882c2930890b14eb5ed423a7965aa880217f79548e99d9b22364fac14472bda7d24f312b131d5604324f8efea418c38f32b4a7d026705e26834cfdeb4fe482321e1f57e40be29536a828f0b489714c53407889151aee052474a87a106e14fb4c329fa5da241a6699e9c361d3811cef424dffb5828da1ddd31441f9aca2c4104dcc1cf0c430c9c0e61f9790bc1b5e0f811e4f5fd5bf8bcc78728929153e578fa9678689c315f013cb9bad5ef0061806fe5aa262d70427b7348f022d8823f829cb031ea3a4000c234937b9374ac8fab12a884e8e7baf30b95451aee51b388659fee4c9bf63cd62095dd8d24648e4bf0f09c91f56b5c150356809b6c2dafbf1a8eb9a1c486650714f051e54c922f6962f58c356be900036a69d717bd9469525a58df624168bdc0493aa7bf1d4abd9d25a43376ba9237517a6e4f161d97a4131fa60efa0d5046e2fce7f89b4c75931a216f571a6a2a39a23a3065169f59c63d35f697dd4ab49009335c6101951f03a168e24885f562dac6c4028f04e099ce57b19aa02d92c045e26a88be129f59f7b431e394362d86d940a701d6ca6561268c6b08da4f58369b9453c6ca4f829e5f2900f3627f5e496092fc066f1e9556a130530be38417c4092eacc63865a8fdc2d05a9fc02f2b9f032d9c33e714c5d007877ba648beb542f8f0a3b7ed620275526eb8ae5f74cca6d4e802db6eba4021536beeab4fa5204e9e703765ca453a97a73e8197d2bfb558319062d85d9a61a7f69294938211c0363d2af28781b73a046d092deeaa6eeb1e9c788e79075881c21815c919cc1b7159a84384a49ca2cf2270c1cc62ad000ea2b9ce8c59c251e2ce09585996bc6c2661677c7c597646d18c1b1babbd8d8c1272d82db68fc4aa11ee8da2fed32a9ac2433294cce4006ce91b385d37a5cb8f291d7e85aae70f8e9098296d51c915ad6978616ee10b817d4b3f1aaf2fff51dac39f8ff9272b5db4888a99146d14aa9f080aae54c124287df9ba3fb68774707f44e6ccb91ec6a997f043782d0b7fa31e1173923360009450ff4b718aaa66dd3afe40b14a653852ee7c06f5d317e63aaec41acc9e46907de9a5b98a5daf997bcc79c13da4c5636824a5fe19d6c700a4344669083090645793bf414afad245724d5885e9cef1ca5c5e355c3c9f898ea93c4d8987c8460d59e2f926dd1e4cbc165f5292f4205e4f407d29a398d4b8f2c3062c93abc64ff18bf7d123a5d65588022156d6150b900e24dca4d789223ae48928ee455fd864b015249163e369eb8b48c8b50ae6990f4a37621c68558bb58682a7a89bf548e7caf6e567d31c1663f29e988dfdf300382271b6d90e751ac78ea0dd8e2170c2940608c4b7201e2f2c9248265a3b49a8027c9382c7d88d226bdc0e7873f4275f9a7949a92501a837262ca297741cb042a53513f5e92da3ad4bf2031c8285621ba61cbf144764fce695fd88b8221c339e0222345a675057c61539e4d71a571a594f1698f71b4091ec879a2306431a513b6be4ba63190304098a8d82ad518a2ce9b85a6897b5e8762f50a855d20623e568e2a168d90aa7aa2331a8fc7451d6bb827355acf2a113657310bf9b016b3988278e679148a69e7b625a038cbd257451dc102443fb47042cc2be6caa4de39249e511132d67ad0e50c6e4dc390a0a946ce7382f3879597afe28c9b6a78893f649950dbd8163ecac535b70c977b97d8c2518acd3368003ac560892e74fb3f9654daa010a0d09051c6e8999f18593327ce6b6cecbcc094a4ac6aab67c595feaf9d97051fa29f8b01479b43234502007c3b1c154aa926e9d9a941f64d2a3391c1f27d81e1848bf9253a5101ebf09d5dcb47f9f86214a7feaf759707a35276865f1e3e347b2456ca7b40c2810e3517b903ad9a7dedf572bc2878dbd875823e1e2d30fbb3f1670497af00c5f4279f90701423c574b19477b1e3337b9da2b8bfec92b44e63b04af3bbf099c4cd504397a49bad45f482e55b232165d8c569e2ebf83008f2141686e2bac482e854d237ef4e510264a2903df92868280c07074bcb447daca3ee770f643eba75c418cb7ca4f10f20fca6e489ecfa1a01b9268a39d9fc9ef429c836118a2af222949d0fa0858af7a28c868567e1c47c1c540c3c2ff7560dab5479ac5a0e15377173e8bcb2b3d260bfdefa9c7034b3c29dc7a9f039a4a140b95182b7c4a8378f6a7d553f5241abcb4ffbc717f4bbe48161220741b06df1298d976464797a18c48dcd144f338a8c3ad9b7d8003a14f5195d325bdff8139dfa0f32e5eace54b20237bffa5057b00c902122b8b6d3484cbb11bd095bd420858d3fb828a00fe71bdf2d58c5a67785f03d6693d2a01029a0376e106e2c60f22958b8597f1f608c87b83d801368f7176ea4aa5546449c2f2bae0eaacdc868915c40f5b56accba51877c4eaab5c7e9aa9be2a412862c2366d45b237f20602c399b18e5e11df5f79b4ed7be9e3ab6acad0686421be5f9c09011ea2e72523829652fde3db8424e32f56457bc649cf64ac3341f27a9c3116400b876cc2df158ff5e6ed5fd58d8aa6bd17ea09aed6780b6abc320d1ef702268490da236518eefa8113a230898c9dbdcaa1ffe3ac30bacc84018b3a14a83b431ac423eac264564223019520f05f7e4712f495a034f4345249badabfc1dab213728701aef29b40cbe18f8bc4b78594b0291d36883c15554fbb4a11e7e3f11fee140783bd33c6ea437d0e146372f0fd470481e657159f2e878bd33c07c82a1bd1b705047505e9377d4123f47a3680206f853f416f42dc198a04e5a8b44ff842381d4e7079b914d0d1f504913f2ee17cbd46254bfe0a2d845fa80e480f7984dc5c7ed251cd38848276eb35e5193cf7271d569c0f13e46fe37709308cafc32a3d89dea2c5538e12139d99d2f705cbcd06998fae83f6096247c1531c5b090d2ea2bc37404b12648af9e3fc11714d8dfcd6b6fb99ad648721e6579cf426eb83ebd694de8c8296db29c04e52cd4d654f5c5bdaa5d65888d48ad4ec9d37260e7a9a007f2d56937f8905031c3ac9c488c56a2a1f4fe110798e61f3a209b02e91ecc1503d2d662936ddf97ef67cebc7acd8d299e01a949f4fa7f6e4093834e74030e57843722ef78423b36d6312b7ba8261abec2c91a3b2ef024fb6b0925c5ab6aea24be10d23c39981bcde303eed9cb4c6a3a653648ff688d276ff435512775951c89c5da58e690cc77db7516bcb3f0a44e7c68fd3ef5e339b5641ee2ff215d8e90956a1f3165bb346739e0dd778feb4bc66c53b667201266ca473bfa8263c322759313eae8075c30ff65fb641616fdfa008358551c7c82ba3b0087043d06efa687e3c563b4861017c6da196985d505e4274bef7a0dd1dda02ca6fc87eb47993a9bbbd8575ff866f774bd74e5a3c5d627600bcc85ffa06063820935e87ad877ab14e536a208608779787c619a370adc2335a5f776398adc9a0b32a8337296a1caefae5401a792850df9294efacc58539620c84c34f11eb547cbbabcb943c328183b0d00dd0e00c6ddd4cc6542b81c601d1688e6b6820e48d81b4c3b22d5a86803a49aea4210f02ac28451859b0a1bfa600b8508c7d9211233f0c96c71068a0acbff82f8e459939e911f94d4094b513982d42e5576ff75ebb4760d8d108ac26e3e80b7653b792a86247f42b91552d25c8001384e561cd3388dd12ed154bc4bc71cc099cf0ecec0ab68eee4c124649526069b745d5cbfce008c1188b09521a1bb8d41bd3d2f092aa524c978b428230c31b90e19e1cfed68ed00bac8bba69807f3e8247c340c548d954b5a52ec3b5a84cc6973df60e24d1974a541cc63b943d3d2b3c4b998bf60244cd41e156df91490578c7b1d39cca173f1f2ab0f6b1f1fb0374e5081b3e642bc502c9c2933f84cdd246a78c4fa0d4d9b41a8acb0596d1acb9540da0067abbc3c92ba828ee782126f51c29524c30146ff48a4c44476321bfd963f222bcdecb9e7ae4d70a8792b546b417c4b5381928b95a297a012a1bd4b0e4fe230a137434099736c544707b884a7a7199cb3e4268ff67c9de52189ad21086f37b4696249a6da85d6212800729153efdfbef554bc80aa52f2405a42e3aa606ac748e929449d6f861468b4a14f0dd2d4df57e47d229120da55f7b24b3d55469dc973c4c46348f47b727cffc55e144b22248ec05a8e6241da55a2d852f4de58c56d8b62d7538025e72c31e754c66b397ae512c1e1394470ca5f724c62925836635c2687e616741b676754a210620e571eea3f56f41c1e629435645a9aa06129d1fe47f18da16c110907de466a9f80811cc8a86505702c9349f7e929f26071331bdf1d3f6fc57375608b1ecec883d165d7587a7565b4ae16c2a90960f25ead82735e1b14208ca04265fd89b13cc8b6d4aa423b6603d18c938ea97268a30fe25e266b9622210a5240fa0ba2ca1cd4bc5a5cd25258ce7a64a61931b9897246c7621f35125a41c5781d85f5ed990d808f40d2a1a805e4ef1ac70a121353cfbd344f70afe292b43c35ec06a2f7952eada52a8445737a437914de5059130392e0aec43c49d56c3f72310a57cac354bd1f76f421484c9179b2c8f694a8504dfb37b004e9bf2ff54045601a4d0e5f5a8136650302d5441a5cbdec09408279b60b7f1ad86cee2baf29e6a1b242682ca344066e0d5d3715cb0d420ce8dcbb5e04244277384b5aa32aa8b311ef9d68acf0681993f420b162ccd1b4abd0a2e4b63706e11eea1703086702cd0535fffc393694ec9f6002213956fb88c35f5a65c47e0fa84036e941bf8ede30bcab19a752aa0b47f8987434cc8c9a1b43d3bfdf65058e66392626b3981c6411ebe62b3ef0e75c51b6c97611d76183c55609d33e57d0947887323972e0b3beef3c602f14e9e185af23934a628664615e4a57de4ec129486511ab09c4fe59762255bc0d3db931e2b3b14dbb30ae64c604d7dc3889dc7e108fc360d62b102cb33b7ac8c6ba87566736437bbe05380998b4c2451aa325f233697eee9cfba20c1a619090903b7e526344cd1bb24be89e84dd00ed65166187db93cb7521b69dd4854de4b91e0659e2de60dc430ec8a7b9d4fb754e8dd6beca5fefa53a7050103ceaa894195c4f1341abcecf80a5633d70e584cc2dfeb9bc71f434b90868883f6dc5c00cadc08a927a1c3c88799f66f32b0bb9596e099c1d6981bee11855a426b96828318703a18e86909308678a3328c7fd840fc44d0f3c11d9d8f84852a46e0d0124422b913b74db4f2891a127d7e3b41db72f9b1435982168519180470d3df020e16da369d67ea823fddc256dd063e372abe736922ed688d1e9f828c2e8352bc4bc681de98b361c8dfb240c76b80f8e52af6a5af65becee2aaa8d73a1f8c8459b60c493b02a545f092399afcb708c19064f59dd9c29824072c339dc576d595c97631aeb9c1a7a9199b080b218ddfb2a2c784945ee1b521d23e075eaf34b8ff5e679634cc5c5d13040ee84dae082445abee58bddf05b3f7718b76a035b9f480d1081288b235997b62acf936f8116fc0412118bd6427af2c84aa0385421ab67cee93ff18d9f5b46c1dccfc9cd9ac0b42266770841c87c838123930aa25aed1c8ca65fe03ef7236db78b065324ac06c013d4d674f71c14c226fc8a1d6a09d0eb544401fe68df020e24a588b91bf99d2645dfaaabfe8b812040fe2db7f5d160db48eb77cc440f83ff5a66f24c5fdf3779352ef40369ba3dd76338458bd92ea400c664d947d3ee09111b1cfb03e7eb25805cd69754ae9f8d09bf8296965394ef9c742285ba625fe48a631b2497fa325b5bc5c7fd04f953866403169b50ddaec8b68df09fb583dc8ec6b07fecf7b24b8f215ecb79ab0305a9db717c5ddc49b9437ab5261dd800478b037a764dc19b844c14f03e606be526c5ea78b7065d45b08589763d53d3ea29c77450f55b88fe0785d6b802fa160908f258c9c8502be6bcbec32fcd183149ca55c21e3e4390f4cc624d890eec3d28c806fb9979d1e53237f2fb4e24b2aecb4ba3934cf35833d1389252c660b9bbbc86d9fda5e9a9a42ccf964024232a7b4475d870ce9ddb622bb5299f39125fa233562300a27f03f9765631c214d11342a0da60fe54b1563959360df19d57dfff088220b150d90e12b3e14cc5d0d131626f57c5f489e36d65424a632860046de28059ac04e9623dba6c821825e01f76f3b53a941864045f7e23382143f63a3582350c9b750927f4f2d263afc46b704e370fa37285dfcdc51fe62fc227de05104971d7478ab2ea0b0697bcf8d9bce879ee25f17f6dfdacb7bd2e5844b80ca81770a8a3340c24912b6ddce9e7100515fbede707362dd9c17352dacad4661e1f9704394b9810c141f6144b237b5f3dc799266db89e56cf0510fcb3982e927f91de7a2c16eb648775233007710ea8c159f7c62ec7d6701222ac5aba2c2400b6cf51291e3301a52a2677b9c196857f9574698306467cfa7294548dbfe3c4b2778a765cbb39690e650dfd74949f01bc62e6a56114cad192e0c399fe714a021d916d22fd054aa798aa8696ad59ca6924e4082032a8d322b1c36151b23725581941cb72af807405cd1569ec815a67b0c69128e565ca035b85b41810ec6d97d7d7aea686da4023967a46976b87296f04b01e116405e8eb7d8e9c288d977fdbf443728fe2b00a1ba0f25d509cda0c09cc88fe42cbba243ac0ac10b0ccd1079a6e228560d43d2da150057f8aa35aa40c4359e55c2403d2c0b1fccc987039be7c5aaf73ec868f7ec9f41edfd11c46c22714293b0df24bc95758f123503b24f5f61a258b4d011e0526667ca343c1714a4365a422c9077c2a02b6036a0a2994d09972123d30e8f17893842aeb619be92495a38c5456a06841828092145a18606fede74f0ad3fbf2413e9bb4637d78db54b816104c4aa166f72a7f24affe246284bdc8436ed139b3c425aa3b24417b65d75fbdc7b426a646bbc46e78c64486b6b9177312a4ad453e1dc0a8140585a0e0840863f10c85b1f9b9fbb9ec7065414af3835beaba2cc368e0145208f3d2c5262b1e314318be795265a2a1de9d63bac443e9561f6e87b9d1aa49cee4d4b15ca22e061082aa8e617a8dba9ec4a965e53a524e5953f05148c7bbeb668e22315b6153d492985d2c87b9aa478d6fa86781c29b54c1aa39366c539884e9e78502bccd6b749263c20316ec1f08f27954444632d17a1ec2942c475bb54878334c78888885809aa073502add1bc6e8732c5ad48a086fd42b426aef9be24c7bd108b08c10f678f6c5bf245581e5b69064242e71387fe520084f3c6ddc4b74ddf18faa8fbe00aea7d49f335f7dd8aab4d7abf7cb08e3c4754564b113a0bc6abecf77971d3caa3d5599ac4c4236c2e94e554d72b2a1363f0020587e5c979d341d0a4bbb46f9a284cf3afccdc7bb0e9ce9ea3816850556eb30d15e725374a0d0ba2619c429f15cc345044334290e182b9151f6dd5ba20217a672303a01b2b0bef485c84b0eae4740e775a380c5532746608d23ea6aee60a61c499c58b72c11d28d158f7ae38c0e7bc9f1f229056ded3d47984e5e9d5577cabd4a2f62576ef6576fb05ebb564824768bb73f7ff00190f2397a65e027425dc2ec067361dddee037455557c8f6c101a1c0b81ea580baef588fdeeefc157ac420b72f8c94401ec385f1552546ee27501af002bc406a47dbdca52ddeaa91bd8e01f858110f39f8bc1856a4c03c1ff1900b177155412fd810072d9b001c12f5942f0575cf0059197eaf05fb572efc8831e697edc4ed45385f2eb448be08c4a0b0aa32e54d82a8daba4bfe997de7abf4649d43fca7d50ab8c90d070e7e9e3181c74e3f7b1d0d12eda560a4bcd865b375d63823e7e7b0468a33a82500ab4159c9d6f948a66ef9761c1513590bccfdf29acac2de787b925783b7604188c6c2d037ae9e9a2e67ccf0b029ac7948479a88696d94f79060833f97fa99d09526c939a399452c2a75f792714db5f5a938a2d852a5322a4c800bda10819c942cefce8137ce19317d4b32f6c922a17de8006ad582f5d502c70b158aeeb7300b59f8bb54f9d55844e8ded6929328deabc2436d02787f143c5dd45d42f4a0220164b7a003a455eb467eac609f3f9344dfd1f62d01b4cfd03f6f0761405812a3a9ae6f55a32a3eec8b86224d474b97c853a152dd814ee8916c23ef261336c18059074acd2afb6a24428e489cf9daaada20db9be51f24f49881a2be64a21814a3c2247125e30716bbfd22d7605c9dd964cf16223b030ee720487e856b639cea30155c29825eaeced353d2bc5c0427c48fd535e4dc2765529ab6201bbe251a894521876d21be9ccb3719b3545f1b88ff1579b8b53b663eac0e598403f5bd8e119ca004df2869f1f5ee772f4aa80f9e1cf555ec91103bb0d249318fea1cc5b620598732b393d1a5d1362bbdce1b3bff3d2378ecfbb7fdc953e6689273f06d0224c2fd79e496a568aaab8c229c688b73ad56f48016cc7a9e821accf1b846fade248c8ef9b16f1fced8e1a528670a099f4e44e0402269b592540592380af1d239e3236a7689f3fa8ccfbbe080f6379ad3b436034abf7e915cda02f852b1375dc2390351f433ff399813434994875af652eb1b717f1a5325f04bbd7e904e923452156a34d5bc017c5a0828441242db47e01e6043409eeaad2de74ce100df8d60c1e8f930b0b65eb60ee00b580a896de4158950162b01603c88ee23263459f5cf0a37b22b25e65f468921587c0148b9ee748bf8a2224124b538c1299a1ea4dff5122ce2e4530dffb51d8297277bdbc0759be8fd70e62b50cc69421625f7c2ea1b1fa4aea341b70d0ea73b46da10036ec50f30e8aca65640e8adfbf1a8dfa3256f0a0524583eb3cdb441a8e6c409e352806d940635d3ae6264c436543506e41a1473515d96aa2da3c2224c007aaa6694bba6945aa61db7c7f1d2108ac9d5399b2bf60dc8d51bccffb8812ba98562f141ecb85e3576e647cff58646d5426ec0856bbc1c2e92b11ba210c0b66ee44532dade8afc6012d69f92b0ac7ce2752087f9a2f23e37e25c0682e0564c9044705d8b6cb52d07a9801b7ee64a463a631ab39475952e5371671cfd8785a40ee56c4cd0261ad2348fef8849a2513e90c9b55af2c3ec81bd9c2b58460b16481e70f35d1bb7613f4e783ed2da31b430a79b0e4cb82ec48370c38da910fcf85a3f8b330f00764ce0135e26e2f7c400bad3173a81ca55f379d69ebc0b42d3560be47f4fbe0994573947947758c9aee88a1a3b976eb9063bbe085b171e5d10e26252b43b7c5938b985ae868ce5cdaccc5c158c0a89d03404a724febe63473922d654945ce3236ecadeb4afae49b0b5645c65880fca678fab6042088a72a3ca76fd04a984d089676c09545994cd9fde5c995372ba1993d81f293a56689ac1540e25db55089b6686bfcd5673f2d84d2938540a7813adb54e241462f3a49ef5a6a5318eaede9bf00386322d3fae38f3c4505fbb59aed7de0fd102ddcb1b8548726db7bd33e53bc79e9644ce396c245c6766cec00afc754787088c9d089d998891e821b1576a27ced0c8fd8581f89d319207c4d8758c4b5efbe6ec4a433726be27f0de4810bc98318458f4ac2cd2a07cafaa3c7f41c88eee4fb9a30b58f495a4b8b18c957bfd854e0f9b70b02bc29deaaaf013035bf1107d51be67dffda60c2242e58f8a846a21b9564525d59806b51cc7caffb35b88f9bbeb81ff451dade9a241f5110bd5ce75bed3322f9d67a7d5e3858e197a8bb613fc28216173830dae611947bb8ecdff354337e7a999eb008387049dc82c781b01519195b54856664809e396eb1506eece1cef00f7aee4dc9ed0c95a5c3f5f0c052a2b7700e4057266c0c468648404e05428385313e2ef075d7e98c8dac973c494f20cc080e82429bc386c4ca6e4714abd2984402cfcf70b3c2bbac54560895112a202544d1253a3f3d139f6183262d58ee63cefc43ac10d1e6584006af2b5304cebe5198b0f111d119f49b18f8b0bbe9627ab22bd12ff06f00d3fc867d52750e1f3232fb2d7222391c75a3a614b99737aa0b97ad0c30c8287bb8d1187e2e05f0fd96e66a7541c109a1cc06d19843619bbd3f9c077ecc96f767b5354692702fe18826e069b7b726b6e8ecd91b9a19db628fe8d7a1cf09d70725d19ff5ebe75fd9c5a44bb350fb641e028c325cb3b0aa59b8db2a4466f8505491df28d50f895083c61a60ca1a7391568e9577e3655e1f1e8c89201719726e36f990c336099146608c8cc45b971fa15b1c854d2b276b6c35399e7f82fd7b2acfc5f19402d255f89c89fd0e7c5d5a2fb83d35d40f0c25a79fc9c287311331a762ac44ef7139665cde093d438df8910f2c48abd1ea16097a8c26f32a967a051a80016a7da77bc2be92d20c203c8589324b6596ffd716dfbbbecb2031a20e06c54e93ba67a0dc0b441c5f60660cd253b4f59b1cbbb2261f9ded8a4e4091ec13ceca8d87577d9f8b50522db16bac858bc3495937c184437e330a1d35861511403818aaae143094012b54609c941ce8fb69a190a7c24bab4b22cbf9286e9e26dbe20beb92dc9b301a4500956e97a83a88da899ee92bf550033dbfdbec10e15a90f7d33cd04371246b4aae293dd188e4478a28d5af326500452284598fc9d899bbf265ce655490749178366a453043ff3b9f5573a17efac6861ccb0cdfcb99c10837246b3597eb44928d1ad202dbe26b34032ddcb7047951498ffe594c708be340ff65ca34fbec40865136bc93f258f8580f6731813b61e1c6872c596b0fbfb963a1d201d26730264366d763d8445495aab319a6f2cf52cc3d4e712bfa6a165ec2d1e0bcca08b03fbbe2ae4a73427cbb10859c6ba7049b8c5b61253e22b5afb303f3370f9855258a79387d6d218a1481c114037f886f06553b8f2e86a7e9e9ccd35b8fdd1a649f42662d21fdd1969dc8c55c984e3c1cb2193e06d909807ad867fece788e074630a2bce70c93fe115713af78587c2cf0b733e10dd188bfb77fa8b7ab056b4d3e329cb3928d233db732a09732ec9c949e58112597689cc5de03163078107b743bc2803b51993a48c8e55852dec8de411cbffc4bf0999f24de699dd6ed59dccbc34cf149a6c654d87c01e1660f6f2cf121b6460e8cc74fb26026827894fc7001e6fdf9e9bf8e951903432ebf4b05ade836b9ffa543eef13737637493686cb4e50db580c2bd2f1eea3388d00b465bb460abcb3feac52868bc07931cfa091b3bd354090781e39d1fb0c87d9417a305f1f38618e1718adc6d4e20d5e589e52a082c5dc8b527800a018f6dee2d9f38ec61a411bd032595036b48a6776e4476efd0987f40e0a0e93bc708089965411e87ed5debd8b891cba1cfe4be94886e94401388edcfc42502fc9d7ba756c37bfa001b65724a991aba6dac30514c8eaaaee8aa1f5246c6563373879a971fb65c00f4e2a6215319ce1f36305b566c289acc0d8e66c2486f2711f06cea38a8c23a3defd0c669b40dc651ae052d845af2a87d242802604f7c7abb3352342b80774112d7d822e39e6641a0ce13205065f4d0055c4109af03383edfeec179130fadd8da39491f1936e3545dfc4922831cec9112ce38af18fdb45ecfa7d3ed29593addb5b47cb338c3d26ca6c182d44e33a18350809690bec0122137aeb7447da69552cc0401ead00ee5fed2e1662447649d17370f78f3e3e9fc7c58766e8c7563b0680b9e110ba11b36ff5bd84db94c41d63da2c833529f5df382177b9f3752ed5212fa414d6c642bc10caceaea72c7c13fc2949a1c2b08bb20bb15546c470c84e18abb89f2c1bac764ac65b680dd0a924f8a7513db54bd06bd5751933b0f71363bbda9130bb2f7e288c16edd7cf89eee3cbdd2ffb0f47a2626f28661c7825e42dcf0c1f27f37f44a063c6d01ea3451465740ce58cf0183319c1e86437850972c5e524b6d6ab09c452cc18b0b4c305a65d3bef54d47d7097727c0b6427666fd899275ee0486c33d20c7c89e9bafcd32aa7b08151a6ab536425afc3ed6ae148f92bd534a294929530a5704390446047a32fc4dafe5707fddc4ddd81b0743cb0aeb3d5a3b870dde8cea2c30e68cf81a8acd5662258fa6c7c84b76a9c05d9767030e508d078e09717565f3488ae390c1bb58f456a8d7e081b2d96f782f1b0f2fa5e3ec919073aea990f1135d7dc50d171a1b8da93321f1a9a8f1611ac187ee4470b2bb95113fb61adbe978d8cea665d6a7c0389016f7ab0a21b56f2cf52724ae36f4fce951395b76336176c9a867cbde269b4362eb34ccf2c074683955014a71114b5b0fe96aa8c3f8d972396675333caa2e89f3ec317b2a73466cfccf8c7381ed1e5a4a5576523d67690789b70d85f8e93a39dc07ddcc76d225b7df3368ef678e3fb1f514664bb04da5d585aaaaa4b68f25ee86b432d4937e627238cfdc0cbf994b6ea9e7c6daeb3273fc8c0dcc6ccf000bd482aada4d2996a5ce442a31b47ffcecc8c1939bf9924b72ab27bfb1b799736b6c5cc96c7381751a2dceac9292725b8281b4e186381acb7f72b03c677bd17012712fbc45dc4a37f2eb3e781c45dc8f8f8fbc5b3bcdec23fdc79c88ddff4ec1857d8fa253705b1f45516389188bf4ff2eb13fe31024c4186315638c315e715a081c7f148e598e8d2ce72c4e7366390a9b73aa6ab128dba3e809f6c2ab2a5154cd3967feb5f62a6a92a70275729af6ff14de12e44db758249ba6ff168b2b7288a2c234afc39ca2f8e6906cbc97039104bdc1390a592c1285e1478762281dae012eaa62df6f7450a7dc74a6dcda6e55f2016a82a2a84e161fcde0a328ea3f408d2058b199a82fb1aa10f771f27c6409976383ff4e396b7ec95d2ad9917fa7def47ef0dfa937b88f24a6759d0c8b1041c35462855cd5f1e6c871f6c8e048f183e878696c00d5805f73ce39f72f4f86a33448bb7cb7ab002cd8ef8e611fb72c0dedc2652fdc727597456f029012c224e6f49d731ead8861800e29beb89e0e4093617ae016182a8411f0eeddf581c586f62ae03c0eae8d1e3ed70c2f2f2077fe78c520e3e1f3e35be289a4322d74d0513d4d75c9dd1f552fb8bd753bb089fbc42953f78c0d97b84e1cb59b23031524c0c8cad148b8e6dad970100115fba1bc71fad585fd907a1b62419048890b324a218767848024be71c9a88425d78a09035db60c4fbc75c3b0ccae7adab8e00a62f20b9af116f4624e3e1f3a32ea74884fac73fb82b7060ebc6ad8282501876c851a4bf3ca28cacd4ca8023ab71d39812d353dd70f0c03062108a0e2827de29d1c5637223a6ed37f70b7fa058058d260c02ca5c9801ab32001251ccac01b1a3729ae9b1da00c900bf8eae98dc502dcf5da38ecef32cb301fbe6d237050a00795eea2a59827fb9c9759edb7afbca9691b91288060bc29cad089a88211c4504c1a901819568d8a63765a1acb626a51d3e277cc46e2f0ab29ea30b5639e2880448ee8567132931af78d041e76ea602a2b014d16d80dffbdd0a1c1032adc777714b568a0e88da0c0332e16d6ba796b4b2b6d58796f60ac1584ab1782796097010c69dc35f4c6d175c5e19ffb6503cfe01e1c1b5caebb7e26c2c2153b816300d07471f0c84d536e4d3b70434a2a3389f7519f5523c6d17cb2d763aebda22010c0cd9f1a711307e6d238a375bfec4222bbd4a82ec92fc297d1dda6b4c0083b7cb960aa8da856abc65b67aa7eb61816512f4e3485d040c599c2cbc993e2d4ff36b3cdfafa5f66db84125e5fcc0067b6491f1d8146d1bb5c99fa942625c04f7d0a04f8539f0aa11e407eea5322d4c365b684f8a94f8f5218288a7adc5f35ee8f3dba85a1de2ea4faa780e6c6ea6ec526092e0154302c425f7a4b2b689619931a148ab299399fb575ad294eaa5ad3156028a50a23700f082538e084153ff515c000c831ed79a9e7a9675396113f65b2f880808053982b2e3fe45fa60adf479af496c9d2c25ca1d1eaf657f55cf5acea89372f13f73eea550bbc6de9a4e8c178d1754447c03079a415c5b005a1584c15bc0ea90ae10788d87b8c717c0c250562a8876767994246e886aac646d45d5b224977c5813435a1c76d1155e276dffb0c846fb19b4aa8a57456515a5595a1354d7956a6cacc93cd13c2e112b6bf43fe46a1e4ef4d265c730485563dd8c482fccb4c81ea4936f82f33e5c54712b90e36ffcb4c61e1c36ace6d84f9c35d96404499292a15548ec5ea7fa79e7ebf84148568b4ebe8de9ef5f1f7deeb7ea2fdbdbdbf9ce42e7d89072510bd49e08f8fecb0c56435b6a79e59ebfa848ad37aec6d69833e4680ae8c6acf7509913f5d7c64c9f28415677b1e7d24fbc1c7beb348f1b98ba709e2902529298125fae788a74be01bc948d0c8796a72433881c9e5807a13ee91c45b01a10f7a10c7eb4b4aba2f2929f1a809093712b7d7ebdf3e6b3276fdaa4a444dd861f1a6271b4d51082f8aae1e35c13e430690eb1701a353815e5f8610ffabd20041a0104e49743916638c31c618638c31c62b91dac35475f837ec61196089f782da6ff42b231ba7f26c86da94f3b86bfced89cbbf3d09ea4175639640264ac6ced5924ca68f05daa849759887691eaa2ac6aa4712912417ca98727f510f5b6fbdd37f91c38f6a9f6e8ca6fb227571fdb9c87e612ad41849fc24151e80c3bc5380811f05614003f035c11e5f939cfa9f8bab11e7ec6e9d40818bf2c103e4dd71b73070820820dcad0a68e0040ca01e86440f3a7c40fc770ad0c74fff9d0254fb6363c32d2e2ea3e922d567c84861b16908f1229e1a9bdd07f8d267005366f6bee4f8d2daae41b6cfbafad10d1d1a9b07134f42ea452aba0b9fe4884df72782f7fdad40fdd87774306c5c8f4777faea4d38baa67695d36e73c15710f1113f29387bca2fa6dff8b5b0f0e357767c865b4771d665806db3ac1a54fd04949852de0a4e7762c7e9ecb0be99177d2e3d00390d3cfee2ec2d697b8758da564f158799c16d62ecbfa3fe1284b4b3f77ed450fd50f612cf0ea4271387a3078f1ddb2e470cabae6259b7b4972d789b82aa67dbb889e30bb1c3a7a2e4239ae3593efa50d90baf9c2b9b1afcaea90725f516433c8589cd47426b0fa66c8f6597f5f1675d17d1b6c5cc4ce898c2fac1f47a9a7bb1574403a422671977899edcffc1ad896a4dec2bff25d8c9faea2b01b844a580b52f2932a522116ca8d91e1fe79bc74e725804a88643e9ac84b36f04473a48227a34932e6537e48748c5062b48a95536f74552829c0ba5a0b619a53a406dc20e26afd5a9f735266a653e4df590fbd382e9ed45d98a1e30c83c60d5dcb1c5c3e5e493d28498eba9d3027ada41f7e682260a6fa859a5c4dc0bf061c5963737764662aced441c88e4de8aa23e221a291cede267e6515e8a263508192c5c6dad970a4d9358cb48cd5d8f524d8b87dfde3fd82839cf977973c6bc514b6bb019fd9e063db91f6074d093fb919cbd18541f812399bac01b395a3aae8d2533185d514f5d2e61307fc22406f5b23149796d65af8d23671717cbda0edc518b68a75aece83104d573d46030584498b5154844eb189f1ea322d5ba2e2369adb48736f4986cf02f68421b969edcdf83d9e7a5a6e64b097aedcc48993d49ab5a23a8e38bc32c7dfd6c22eae765d805181f3e49316a98bad6946536f88e6e927b43342148c110af194d18984e55213162bc29d1906852ed1d738d5c889da3a7120c2f1be1097f493f3d7660b1c0eada2b4e20c7cd87da0c97ba32c09d51c0143db3b8669ec79ce3672ab99f0d207ac048bc44d5e12cd1a1ce0b5c3f2fa57ef624a887219329c44681de1518a00d1bb6e6317b9ea2085750eca4352955665418e170abceeb8ac60c322eadbd2daa37b59fe76e5cf36bd954c1937c1bdaf0290a899a8ee0603f318a8468b0960c2f58206ac050f41d1891fc77e0d1e288d107c073e07391c4d866306ee08ddefb5ddc606c3507dec4f3e289b145b33ff1c26289b12df17e030f52d4c088562802c0d86a1f007f41b1a8c1d89e5ce0b9cfa0d88ef896f9d2f63bd0e0871e1c35d0e049bc48b1d500e235f80c3e98c1f81272dce0478c6d065ec46f9fc1138bedd007fd85a127f121243ec40f8d2fe9b1c5c08bf85e6c492a7892101ff46ab10d117a0dc1a0cf30d25ec08d2f191c5bee3378d4f8c28fed487b32f424fe8210afc167e38b85637b8117f1188aad89f165e4d8663f1200e34bc9b1257a110f00bf165b0b9ec4ebd56bf01c689fc1b3c5b664c4a7de63f022dd7b5ff4b8d86ec07a12e3cb08c756c46b30b6ddd8b2beade05b0bbe1dfa0bfe051f35f8a2f105e5d8769fc1d866f02ff8e88d2df62deadbd4b7d9ab7e43b11d31b6c656fb76fb96fb36a841b1bde0498ced0806df62e0db0c3cd1bfe06306632bf4edea5b10df8a74506cc1f26740c400c305c30b162ab0222120ab30d8f9d6b9e8d5a2034ca0733d08dc8213940f699f5b3eea552416ea8900eab530fb5439e2a369ea737a3d5265267bfedee99a8bb86985823c2035621cba8854b31002a8c7201148f948105f4d016f5d0ea94f8dc86bc44dcc7543c0ff0e37510fc8d46ba110638cf10950b4c7477dce1ef5cca4d737f997993c62bafcfded55988f9bff013a9f20fd2a0b7eaaa6378414d214bd21a4805e0edca397c30d21057c39708f2f87ed53b89703f7f772d87eb3c05fcf71f3076e3271974a89cd2e26e869a3765f3acb19c8006c40c1b8d1755646f3032e4a457b66ddac39fdd0699df6de9382f90ee2d1e178424ae6348f9acf8749e833250322c7c9ec0745584b1dd7511bb96a220510154b09ea16b81540bb9f32137b6c4c6e76575d3ae4c078bcc02458aea5adb828d1a24a8f39226f4d00cf8b8c2b2c1e40404d0c18f2da4a5c81445461aa222026861ad3a46a215feaa7d2a202cae80e6845de9a191c88959d97ad137dcd26259e428443c0a32a62b6ed55d5e0f5a8931ba1c44ed389aa862bc6f3be55ada63844e8c9c549e2384c2cce92e83770402b3b918325a5ade898a9d2acaac2d06cb082ee7678d49d9f0da99c5ac6b58507d64248ccce65c3007cf6788c72d66ab8e531be3515ba319abd2c09e58975f0319dfb2104d0baaacb74f31d0ca67beb750724f39c49e85255fc9c53941d82acec1f06fb5aa6959b6054d036994507eba04917aecebf544f503a681d94d7cf545060bdb955288fdaf4d2166e99e4af730f06e992d0934bc7c4e9962c5d9348b7e54df864e86e7ee6ebb9e09776e586a41c4a530be1640533e7b46344e05f6ab3151423423fdc84c514fd9cd51abd63adcc1865cb67dd8ac15e6b1d0c3e7bf2532867ad01109aca535152581f8c0f96732962a9674e4967e165450b855a6bad832f4a74a5529ea9abd6641c63cca383ee2418b6e70cab723d6ddff9b52f1971d4de830e60317b41396e4e303d8f7a84a7142f34433445caa3f649723acb654cc12dd696e2183a6bce2bdf5a85d65a0783269085e5ac6a12983fad2ad47a4d792e48d45a56036455b5d659cbbc4050e2a8789ce8546568284baaa19cbf174b4176476de28bee2927a763e54cf374d05feb60704ea9e768f49c8e9e039a23f27349261d72e69b2f843af439c46a42590ad33039748304738606140b2bb89b57d66715f3e3d49484bdd42d83a6c256b7f3c2d65aeb5c7321c0f7d46a5b371a679c1109092660ca80f2f0e06efce517764a466f533c88dee85274302246441475a623a7cd5aeb9c458c2c880483bb0ff06c8d4a0983b626f3da8ea0d082dedc9880844f38442edba2e6c66fa6c789201e402d9b28117c347d4c47ddf6357f6a1309069bccd2ad9f68bed63b488bc049d5826925c79e131b9dd6c8094d319aafac34a74df0c333ace77c975ceddd48881b1d7123184650c43ad6e79c73ef39423ce788f396618e25ef3da577fe7bef9d73223ef4e4a670254b43d4f14026441d7e2e4a02219b683351b7d3166a0b92a4d1ab083032713b65732e7c3873383f1419adc11073391183eac86969699ac8fbd666aa079eca9696af46e9c59a8fab10d89c95d0c94a69b5f83167eec44c43d0170e15e724514763078b133d9647cc900db6e060ecd2705e3c299b9da60b2f1305f3e77c9b39c7b64a5b26156d49cd457c69d85d5055600ab8e531abfd7cc4f7f3d11fbf577e46586f267446cc98025931136a76e1a4402a4adbf31d70d201287317e2aeaf8b68538ac5d079a1a78256f7936106944a17d00a9fa0dd02a49e3149bcfcbc26cf825eab27e69c73d6290f06dd98d0938e00a8a48a9bf24166c8289a00a0680013190000c070140792204b72c6e47a14800642d66c78503830786c148b03814030080683c260201008823008023114c5d028c68021fec261dd800760964e9eb4f53f7ec868456a5e912ceeefc519bc5dc1af32f9fd07c24da5f40410abd5788f2202531268755e0337da1308e73dc028dfcae2be3707c2652f175f4217e6190df6faa0c186b0e4f08b1cd793342d5258a1083751378a0012c72af944eabad97b6df7cb2a40c943ff17b0ec958d709f88586f3ea0748a0272c3dec87746abcd8877f82266c65a42b49ac1c714f064a95a8698d7eff88da7c66d9e60d2d9bdde4d12aa02ec67e2ef1eca47aacf358f82c9443ecda39706aa37381ff717f8f5dd3733dc1c26bde6ee83104fa23abb2f1d8bc53834dc78a100c329dcc2bcaa9d54fdd9e196d1abc3f554733ad0136287e37515abd77e14e6fa4c2f16a49fc65ac03ba455833eb940b64fc703487728f0447ec5772e3cecae33263dcc55611a344a31a7de5920428e8121d36ec634682a5e802469fae16086c010fa02f5158e63f23b4ab6ae2e255a3e95b315015a052db1a54cfb772fdfd87c712b8c541f4cb69d1b8d51fb15291cfff8b7bbc752468a0dc33f71ca8f1da13713312d46db1fa0062308f4d04680cb0cbea3b60971c2d69546f1909942ec1484408805bdc46a088823ca9077299f643f1616e1293a8b253c4cd39c3c8a5bb524ab41a2ae7d5315887b2abfcd26378178515d7f8e7a054a24782308345f69685862b8e75ef6095ee2fe91d72d6787d078d9273213d36cb12b335663d9bbf8dcd8cf88a40666262722dfc279089a925dcd6dfdb0f491b634bf4451de0350f1877d1983d7bfb67b1f3e5ec8cfe5137f00b02566dcae47e025b7610bd46f4ffc71460aec599c0be004c88ead3102df76d9ac4a74b380fad186c5c17081b4dfb987af691c5493b467b5d24faa62b1f6a7acf3ed92abdf6b17736ad41a17aa290edf21a3a94284cea69f459a16ba5d116671748f2df5a9a743879df3a4ff76925a027ba7e02447d1a81a576d242f4b2022b87512331c5908b6178bbe1b6dc16858d34dc99e73c2286a5a5b2fe64331bd64d3772eb02a77068ba60a28fa7699eec4b16675b256cacd742debe82c4393b48836528120a462956587898e33555f925fc878bd85f3b82601bbc3838230fb37319275b57a654cc7f05671533422870c4901a02b50ac49de9bc70f6d11e5817c28bc9d7beb6d2859f85a2011c9b9d1178abb9b033a035d3ab63d7ef221f0daf3a61677608e6d03dc5f2a4df2b6e501689e26e4aea640b34b8c88672aec035d62fa5ef1b92478b9ed1c5b188898bb0dbf3b911efe6df982c8d3320b50f8df1807a8377cac0db800e4f8f77e033280a2d15a9f0fdf0ab860b3fafca30f350374d6759d01dda2cb5b38b965fbf27763bd8b6287cda75dccff532c8e33d29d25abc8b3e53975e1c17442e44024c653fa1e196ff6a8aa285b610b5fc0bebf426a4ea1c4ee86d3f4d0a038a672c446235621458214c0f3de8d0f497a0cde0460114abe5b2a0b4cf91219c2e3a06511c691e64060b734ae095467de1018a89845d994ef77f203e142ef3d5fa4bfc655eab18f710ea7d5fbc055387db0a110c74f4628abc40eb34c0fa181f0616b94640d95938b13a7fe63d8e34bc7ad03c9df7c381956070746414c95f647e2b5c5036cc7fc55e51abaf92feae905c793a8fd63c85568e0165a43524d36af3e763d79baaa6c807f249aaf4ce279c293fb10c14bb88933e05f426211962f77a26fa2757666c3c01b3559ed9b200da2a467f9514187ab2930f18ab6703aaf6e73effdb20af43c69f503ee8507720bae004a5656d73966c8207be59de893046d887b018e97b7f4ea81e31956c8e3b9438327d2fd691e9576f60b342d72d8abb62aec509594a87bc7ade87fbee33bb05ad8685aa1593fb0fd6db7bc9bcf905b4eb74921584e45100a3011f0057577461828bf2ba8ca183ccada234fc3f3c0493f0d3075a49684b3f748a1982a0b8f51a6ba679a481fc9b31806f850ed86f7669399c60833347e29ca62704c3a7f2869444c5d6f38c9b09a4caddf9e9e98869f926018d11be6a485c3d9d946f001a16bc2647bf9d327fdf8ae0209600f826c69902ced8383d5a6f10a923d0b40bc110bf36403d97a5277695aaf5cac54b97a8097aa1cd4661856c9e5212984d396a43c85511679a969a8b433a481584b8bbc09dde8b7c81ad59861b7c893b915db5a356610063dc1db709201d2f2b9d79fae17de2ecb99726b9b8652320df378dca00542f79718ebad16f9fa34cbf44aa1ba4e7ca27d94a0f0bd1d6b8ae15c7652ee6fbb255f243bf4bd58d227bc13ec9fe26b84477dddc697ea4b3f893617866790837f49a5629d51af65fc4f1e57ddce544d0842019eac3126f8982f740513be376f9cf1c2cf68430a5802adb90cc9d7b463e05a04a85b129fee9ab098cee3f7b1213126c7b68ce262f4e1e038400063b76c4c0a253409f7f718530b9cb2314b05106ebac952072bf39f10392575f98ac033a6f7934fee62659619e62a693b6684a96b9e226c11e991bd57109117010e6c986528f26111e62e6ac0ea97fd12f2e255137f8c035609e1c6ba8eb2829d58452459fc9b03f21265d6f1199c87febc3a6708fd08a20ee7edd46dd1dfcd1ec73d82617ffad93f6ab423c290d5ca858e757f740167bd14b0308d20a555db2f881fbecf20107100652acb7059b07243a5a65bde2e078a16ca1baded919ddbc623d1c90bfcccc5daf370eef09b50a24d93f7f2a3c0b68f45acc7e3a1658466bfdcdd1837bf76ea1cdd717afad4ae836d8c98e4a0a0a31569f5d9cf0c537e41170865c2ba60084129ef4c3ad0c32251d7c072e2142cf108f7d477fe1bb5a3ced73cc5608b470d502b23387f4886e88cdfe004d6a2f552f316ebf644982802b968bcdd6430038dd1390607c2fc6dd18241bdb310840d429b982bd2a0752d3c403f565b6bdeb849ca03db159ebd74f5f9a874d0cb8a2776194ff2a0895305cdaf2689e37c67cb7d41bd58093c21bf737b12131a17a36a152b4747c0dc98d8756876f6e89e1ca962d94bf96915f0c2c48c0801cc18004f0391a10987965966f82198535609b62f23e7327168e23b609a73752d6937a988174c2f66e1d94814e8d723193e702881de294a314a12b8a249166ac6b69a23fc96992346ed845a83117931488424fdce064439d9920e7e33e6784a70191295bdcdc872ed546ffee4aa1662efe5c2237779c01a12b8e2ac6f50f3e81ef29a07b158b764ee4272a42216287fcfd029229628a80e4fd9e89c3c19b678d9abcc72206948e97eb6c2c7896fc1e71ddb4b5567c931845f0aeae52d0a14c6136ffb0c180ddcecb9ec14ea1e669c16c4156951a0404208ac6dec9def17f42f44cdb0d94ac24f2a686ab4bb557bc72df0a13a85e31ed30538d8ec843ac107c9665378068d554948ee6e6d14bc8abc525df512e537b4bfbdb9ea8994e93c31b8f46cfcbc6163d3c940361039dc5b9463ff1b2ea52fe822a3179c3ca1138d9a2681e02bc71682b6c0623bbee24b64cb433ef6524663726cc5a07e3c5d033df2f728cf71f1a4e4d841664b62e061366d766c318f150b2218e21bb1aac0163c8802729ab409c3f73acbb71e6748cc777168889d1995a9802f63ca38261480c400c0219e404b53026fc2a3c5e2f08f1bc6b64445f7a08a2c29825430c199660e9c48db7466b0e391170242e91636918e0c5004489e188fc62c6befc20b321640f7aaea7da1c00f13d04b2407ecf3353d93000715dfdfba0bd25df9a51804ec3298337a540a8c592520d606320a4b248b6874c9f5c95e0468dd8b11364d3425052af893795104208004276ed8a1390a673b9d375142f3a956c08156f5869bb875c8d0b35f63d96ca2ec1488517a6a6e61ea439bb01129b083946a4b728b8def7f230828c9ec5cf91b8f994ecb41103c49538e65c0ad3ae2c2967b95528f5cbb504279c228af7a15fa5932807c03d9ca7563970ff9fb87bd1728760fb73fb37fd90911c13e1857e14ce3552ef351eed0d5d8cd62577662ef23ff2ab9bfc61e68f52acbe628c1474cfb1f5ee5505eaf92a9ae5e858bdbfbb177af425f51dd96fc47b37a154aafed3c57d87041d8931d33f0e1f72a34fa3155f1fbedab642630e6637915024b27f6f52a3451f0abf85d062bb16505812af4fce7abb87b0e4d62ad68b70a511ff476c19a316a63a192cbecc52d657140afe2202acadafcffb057f16f18535276b0337f393d0f0cf70a9d6f885ab19434016c4872530a003f82b670cb129c236e875ee52583c1ca2aa1e3434842b86509531de026735682bf222bac6c2d25f18d52e4ce56fb2071a6ec1f5b161ad1fe140db3899ac1e79e46f1fc901eca03534bec1f334bef333f25ec3a7cd4424f50f3a7900da0d449b7abfe87e3bb8ce299aacabe9012333299f494647365eacb4006b5c88d6bca7d52ad6990f590de2e41de72d5284e73889456345aff7374c9725fcb276829dae83088420d1c6dcdd3146a9daa1c2d2cd5ddc0fb274daf66f775c93a8f450988d475b905808579fecb36c26fbb0c537162bb603ad559761b50ce7a6aface280c1de22e9113e02d078ef5b2a01cfa8466ad99aa891ab410c6a3329fec463c56476503d8be6d830e76b477a38366a968378d7ee102634265e5d56f7a4e4fb4263cca4ced1eb7d9cf18ac7b1a104a526feacee95e172c3dffbd4d8dfdb0b76a9681e87a16d6789e1dc45afe50798c9c7cc59847ab010445a593a3f3ace4a4adf9088527922136bb07dedb5e120d4a2a541671a16c84c51268cd0c466004608c4d602b1eaad6baaa213e529a6bfce6a0a42130bfe3883688ac1b4c57aaf6fc11848f5a2a1ef3cb4496318248cecfd8ca327c1182aa67dea5ed8a471f990121c941b0bbbec2f68167e9ca998fc95852e003b70dd2704505ffd0c6d2139c52bf131b2d7901d66e9f64493e78c2e30f96c42c886e8744583110d66603c2e6590b7d38ae9aa9f046244eb1298ed9ffbd03c2061e5b6fd0543f0a7a2048565550c86639bf898cbd12bc680aad5740a8044b0d12542d03a88210162c6c1fcd1f8450e6f9b742fb3686ba7cc35dc1c864169ca46097ba41a8865d8964bd313f176791630b73fc2a5f287eb43e957063d58239ddb1a4e0578d0251796970eb99e67583ee4c08b1086bf57fb1d11146bac38bf51156567edaf39577dd3e3314e991dd56be81f08e9de26d21e5b453bfff7cbc2d0021881e0cbb143d41181950d913b165179bd98b5fe56d450c74730256f4e54c92b9119ce602e1f3b64ab2cbad8b2a0029f4b6eebfb53d88e76dd18b5d899c2d372cb7a2fd9a91cfab601e7c9c2d92224809ab86320ef44ef63ec7a0eec96137d4ae13fe4fcdb151ff6063d7314466407132ddb2de4940b14bfd45bbdb99c77c75d96849c5dc90c1ec588dbd498d46de1607a44503b2fbe4ca5b2a2b1ffc57081111614a166207a967ece1feab56ec74e7019146254b7ffe7d5ba553f274d136fccc8614b0d5bc93cadf75db07e6b9ac4ade8b01a52cf8860c3fbda32b3f43215c6d8f36cb8b89588e907c7c23c376cefb36f94cc5a7259289d7d1d4295bebf8e2371d3fb437b22af48212e8182b280d9607dd9f324b1abac288ec791997926d01cc64e3e2ce621f4834f746cf0aeb6460f80bbb87015a2226a68c8578862ecf392d0bcf861a954d5ca82bfc05efee7a8f5913ae6fc13cd0e2d75efef65872a1b4161d09c1a3bc3326aff499a7b952908bed1191006485afeef0a5c048af4f7c5084c2085c4e85815e45abb39d4389645f00550b2db9ff95128cdb68b1bb7f8804e52e8cee67d0c07f56aae52b18ee9efc36feaf9202d60b38183a715f76b4de9724a227e00bd74ba0407123cd89916aecad3ebe3d4e27191dde29ddb8ad95400ceca354bb908070a918eb2c278636b89951ac7a1eab6afe4414a1160eddc1f7d85fda946cfa78b44b334a7a5954cf193a48b72136d088707898bd9b47fe335356095ba4060a94dc4cf461931120cba6162af9bf6aaf2c354e8e35ea274dbd112c5aed1739cd42991b52fcbd2180353eb31e96a0b159a0357605b5856ec1eda93af6458d295919a7299fdb58c3263c24b58ee5c42232de060d1ecacc37e609c2cbd6749d3410b86daee728111a7603590387060d26932dc51ff4fd19a29e3774cf15ff4adaf5007f07d16515fd8451093f1752408c5e3935bffb099a8b4b68dc5cb3fbe5abfe79f535879976c517ceeaa2e803e3d8abc5394d8212067cefff73125a4cda1fe42d07089735feaae3f03c220ed8fb42ab5df1d77ff737e21ecceaf77a897e36ada8ccb5555ba380c2231501c493f1fedcda483dc10b6f57c1a139fdd8cde69a0ad0c4ef0964ad28a20d834b5589051b08eb79aa19d6a0a8c9709b32e6fdc302773ff68250718cc520d1a6aa8a7b3972285b2d1b2f3137f9f2304e6ffb2241688f5c2cc61ede5172c6e86877977d4940c4abb99fa18289fa0e39e94f1319234a689bd763573040292f2bc7edae4ce6edaab1a36693bc0c66b83d189871d42bd227343b9e4d194053bcd1c166b3f74476deab7dd5ac69d015f9c4a81f076577f52375dfe549c01d2868ea32faa46912bd10c11b8443be77a0d2f83eaa964d8ef8026223e11e25adc702c8054b15b57e8e097dd7dc64dfc5824c24d29364e2f28cf88a375ffec97b48ffec89ebec8f58bab02e8c805d346ece2c924ef222bc421604bc0576131e86be13bfc198acd61a8b233166bf0bba9d0bfab283a52f116303c2571f25792e3a4a75ac41e1afb7b50bbdc1ee8f4a35e28a5c201383282f6c7ee172bd520a62eb28159ff97fca2c35a1c2209b240414879ab93d19da72e5cb423fddb9f9f7289d6dd156cd52598f19913145557bb03f918b7e0c6b15ad56555929a9f831bb25f944c88d34f36575c4f5503af7d1e4d57414c30984697baa1626b5867cf893c6dadad444d6d3d2af34e2986335a661379148c5f5c7d4addd06b6dc8b65f6baa515124dadf5a1238439e6b130666d4dc659ed991674f4de00c8e28a6afc9f8eb78ca986ec3352c30a42725eddb9c4743a6800b7042028ea2ee832bd45ed0ddde2cad4e0e632a9ef054a780513770b5be9a608d1909ef73b048267fb5bebeca97c216ac3d069508f7e0a4e7b2ee0fb86df4d5f8f77bc7302db9808026d29654d3b96dcf1f96e0692381bd1fbdaf68d8c317b09d7cba1f5676069d2c0d10398da36573273f04cb44773dd722e2fb8fa1e8d431cfb0e472d6c04f318fee3746a03852190ae36d32c48cd1812035ce37a49ecc734b10a71aa92892c380d9aadc084682ad087c59abae515421fe362bf5cac613e0d9699b11b53f2ac19e3a38299a803fca0c05f3efdbf080a1e64f8cede418d389f2c89839de244ef074f59dd260983dc925db9b751913e60868e42db39b964c3c75ac6cd5e25b5bca2d93f2e2bc027bfe7118c7cc1beaeb2d22c53133191af890c57a4696b9d14fbd18b3de93204db8c38be982f520133e9e0d39f378fd2365f0d7218201f32d24ddcb55a404d998d0b59da8feb8afdb6dac90f49b2aa8de995e4821fffb16ccc7fe5fd3dd30c975857e58f6a63990587b2bf5a8df60cfcfa7bfcf5fc3f4498e96eaca33d4a1c987574cd74197a618fa40326eb201b879679c6a5d7fd8b7901d339447d2d5b475becabe196e91a1341eb15fbe75e4277de4fc34ea0a3b326e4a21a80fcce909806b157b002c1893836bb4de9c1be8cc10a8bdd1da46b34a07b469ef4c87b9eb5a8a968c6eea8d2219bca4910dc9bd1b23ff5b2915b6a2eea5411974e68143382ef4a4fbcd474c49bbc600c25d8870f5adc7ca052e5054eb78e233c4405e4a70d3ee1acf54e68b26abf4903d3050229fc67e7f3ee912b761eb40100395d1e58263c25565377ecd5628aff4068697c87e4cbe1d1c99539028efe54fd9ab9e484c116affe406d981953f9fb69a36f884b3bfc73b123bd9325bd8eb2302da7f33a410341c1c41df09d601f2f3b1f0c298be0fa2c09d3d0e1d7d72e0ce0fd8c6c23d7b620560906fced1bb6f59da7968357cc0766d26a18f4115ed98b77fa29f70843e3ff8a7b1b25c8616ae33e27fd3232521eaa0f486e7e2df7ea1a46dfa90363991fbb414ca8bff263049bb677395ea8786fbed8371772b1bf7dc465783bb415c61a05baeb63464795d912d308da9fa024a45926ae9353543a78f6b706112d8f949525b4457f2913c09da13918969bc948aa36a3f34a22b4a907e19bd6e6114acd35ea92258b739349046e60f756501ca94911d6087a3504621872420dec2a6fae1343ad0838c18014feb5ba5a9141b2ebed1dcf28088691b8ffd2c7878de387cd3c28230a9daca219c4894d75a9bfc0683db89291d62c67af0fc293500a997dc9d85aff06217f3b3e93fe824f0242a67de47db11196fb1efe1b062fa1ea860a16f7a3b4f335989287734ea06e50952cfa16533c5c89ace8bbd12592bfcaba7d7900571cedf36cc73fc14ca4ad5bc5d1563c5c5144ef0687d30f8d85d5c365004c94436b6654cf95dbdf7431210761356cbfdbb48b0f5ec0607afccd975df6f9fbc10face855e189107ac1407203037a086acb00af37a99b0ac2d45b21a8f8182e069eb6b97bc7785bb01ddb3ef715f36c5069531bc48c693f88f9fe4148417a117771fdb1951448cdd31fea9f7dd04b14c1b2acafd867eebffb82d26cda0fdf2f83c1de4abc537463e9537e761f2ba5028f915842989aa32f56492162bcd2d852df93bcb4c4fdd996c890f6f6c55e7230a5aefff63fba74a0b7c01fb6520269e9ab44602dc32586c28df6b7562a78d853a585f4f6fbef281960acef935d622861c695128a0cd5f7ee03a9b450aa469508e6eb8d12c46ccbfacb7d67970eb817e567bdd420c3a4be2825038d05efcb2cd1a8667d7e43093767dfae8fd4e7fbdc471b5ae3c9ba6592012bfbb29ff667f699fae717ee1bf5b3fa8cffea8f7ec37e5e9ff5af2b150cdb516aaadc17ea9201631b5a4238d4564b079bd9f4b72591d960587a24da498f8df6d1fad5950a38336a29a1bdf4eb1b3c4dfda90b2632241dd44b40823649102b5c4b0c65c68da584564df715fe6a4a0bbda5b512815ee6293174a6b41fdbcf64a9c0ae885f32302ac225063f6c885242d53af72ffa8f961ec029f172d4f2432f728c259d1e44e4cffa7546aed5298f290995a0729997a45ff705537ac05be9fb3b7d5e125757df8bdbc02d4d0a9a21b4bbd0592a681a4e25854a715e89c05284970c848cee8ba684d0b5514b1ca0597f7d03b2099a9df08faa90fff4ef7ebeef62696264cbf643fdd83fec6bfdc69e76611d80f3124676bb78a10a0af871ff5e950a3ec361c90168bd5322b02ac3258542161d300ddd5e7b9f486ce50a563b61a2a6257bf7adfd404a0e3a4b5c4aacbb2ff8a77dadcf5d89a1f1b2f8dbfeba4a05237bb474d05b5a2a1128656e09a18df12a15ccad3e960c30e5f3527f8b329e8973242b2724f5db272b7e1365ad9bcb87c1dd9ae04e8875346d9ec143923a9b62fa420f9f8751eccf8c48454309c4c4f0c93b25ca422a8b1fe657a2ad83521ea617551d8b0b15bb54888e5691521ff1b7643bce22425c0e5bbb55a3eea74844e5c4a56ccd725a501743d2bcea1c88b0b25eea3858bf6b485816efecb3ddea21fd6f9f0edb5109015a6ebfdc4b046961575220661c950a3c46a4d2422b75fac55a3240ede993a5e46062c62f1d1029cccf5e2902044beab7fec24a084dd6fc71ff8912c476e3fc22940a8c9529a5066794e937ffd01f6269a1ab78ff8d4a0a1cafb23ff59f2e21cc5874a58f5b0cef5f58322032a4cf7e89a38496ea77fbe8fe411ff7377edf1ffc477d6cbf98a582c7eaaa745053fe2b119c15eed24258c56da58ef715efa7fabcbeb65202d165facdfed01fa2d4e1fbe2fc02ffe9dfec5bfdd17fc952c14df9253185fc7ebfac4ffc699ffb1242b7d17e6dff7f49014195e7d201c672fda296105ab5514921a329fa222f49a86ebcf92d3af15f346b7d7a3484341b59e001356094f07954b795a020669929dcfe025a1d266c5e40121aa70de93820484288adee67c836d0e008cfe288d5071892b0383467d964cdeb56848936e12964ed199e5c959bc9c0a27ccf832bb4fe9033e61438fbcf6bacd325613f05fd9cf416ce27be92565f60c06f6b939610914422bb7b73cb8a073606390631c66e860769a43ceab88cba4879d471998642e56c0467c660d869e9b05635aa593489be17765661f4c7458dbc00f4f3a251280f6d4297502534a7f3ea8fbcfbf18ac7441de8363e64d34f46eae36b8b2f1b5f9bbe3d424377acafcdf83c686b51055fea2fb147ec9118a3bec642ad72cda53348c69494948f82e2d9f5b7d964d7ed5ed4bdf77ee520607fbb9ebefaf3a05d1d668fd89cecda23de92a144c9def6fd213bb5618f15415b23a26ff5e700fa5602f4adf6f75a9b2dd12ea52cc817ffe4531be5db018158d0b6a633f9599257966402d153c54e4f153519acc7ca6bf75c61652b60c39e2b9aec9e2b8c64ad2deb0a3896d0af513585fe67a5ecfa368ac7b01077fd8c4bc11f6649b2d6cd60d2923cb9235f288ca6e5124fd1d17f77f3f8cb53f4ddf328155b5b6db5d5566badfcaebbbbadee5edddda5f557dd75da5aa5b5af4cc74af19f28dbbe7dc5ecb5addceeb520b914e88e2fff9abd76fd2f8bb2ebcf20a4afefc2beb556f2c4a8ada7a9bb7ec891285a719822e93c5c68b2bff8957380dcf2adb52fff4c27d2b0efd912896dd6e23edac7349eb5767cf9527f3ba2fcee71dce4e3d0f96b8c6441be50ffcac92ed2faee994e8c51ff7229b87fb1c6beeed63ee2cf92685af7316a2dee389db4a83dd6348d8bad5dafb6e2a909c2e94feeb46070edfadaceae7feb8c014dd89c32573c2f4889a2b98bba1489f5b3db8a225bf2a53ef6a4122dcafe1cb62bfd082463ae11f8529f7e96e4033b4b7295ecfa9cfe72ceaeafd12c49a42121d0d6be1d1068e3afd0a1e3d7a043df71b25176b5af2c09ce5a599218a34ad7e65f439ca2a3411d4a6499f04c8b64a351feb85adc252f6e482581709d10d06628cb58f4528a43d1b4348857b6b3a8699912315b7b7efc6499a6d92a35ea44d36eb4004669f73cd4eee2175b12231f4055cb6896b9cb864d733ca3e1ce2c4b818e7c8117862978a0a2ca0f1dc4508434010ee812dc0a2d2c6020821f277892a4d64a2990a95d9b753f59b6d5df6c1d62b2ea9800e19ecc28838eac4287bca8c53588ca3337abb964e8369b538dca04f9c3d222510002e09168c31e9c9f487497a8b5564d6ba928bdb7e6665bcf5c800d144c3449820511223fa032820592850d56e070848910f80e0108107d67c39e1b86ec5a7da7d6ba821deaa9d65aeb0899ca09a408c20b807800a5090e8b18ac6470b2438d14259862a4830f18760a5eddd0c0061c6870250ab9aaf2c3932053b040820a580c7c685476a8b8a8bca8fc5001a202a312bbd9b45363390f0e5ca429261081642b15c2658c376c310e09a2468a5db06d83b087861cd8aee123d41fc1564a2989fa44243f41e81319dcc0840a23aa3c51728524811430e8d1a40705248831c9e1861fe08d185ad049511120273c34d8811334c4b0138310184ac9e14688212d48011549f88f0a2e00884b4809747a72002267e041144d28d1e37a220726aac8004586526b352da6136bc57662aed82bf61303a2321aa59452edda1a648f235b0c41c2830f7a66986188145558603954a999618a150970a2acc1ab93812bd9b1c1cc6448a844a5a446c90a5579004f60d58c2044b6012d72c04407d611408464888209172e648012031d2439f45461baf183752fe0e4099d1130d1a14108398220a0a0e005423a58f100b48308a740f2c408847872c50e6a10030f4610d42308273e5554f12187d70d3462c8082b2539c576329aa0e65aa088122ff861e20a226aa8a912434b07b298810f6cd8c18924b288354ca921a886a11aacd470a5a6b26a297d6283936a03947aed085acc12c0b2bba639e1a2379c786525e4a644ad3d4efc6c72bb412684678b25968052c3501229822c625134f121072440373ee04087b26c8d85524d67c39e9ca25dab4e111f2fea0379c1ae9524a4073b4bc81b428820014424a5c80a542f1154d142c90f491801a3e8b00383222766b8214886a08a12423630812248890e3bc4bee71545111f5460a58a0c1224044ee102276670c565454e944e624a29b5199459b66d1dcd376a80e60946a8ba9b65d90e3b7707d7dde17577f8b997a8534968aa50c4a02082a26848355433b41a620de1fc8064f5e466861a1c21850d2a81c8a21f480d90e2832a9a6831c492277a28d260463b1b419e2b549bd2d983366da5949e284f3c42e788d6b6755d0b6a51e98420d4d02aa3a6dde80187de5b7fe0b45677d66cb98ad00d3788bdb280018d0ba6f0b103207a90e247fa58014fd6b302235eb48e6444e08c665957290dc24817840e174a155420840ad60e604e7890aa1f40098009092482a842a80808092d6a0e514e111215929afa99b45158792d0b62d894052418f21fd8fcc008cdf9546b3de55a2bd530aea753b50154c1b69aa0cd4a18c0ea125cd715d97ab88008131134f1030c09932da46001e0de0479f97842d503cf8c416be3f11b3e8ab45a6badda56a1402022a0a21ca8725093037084908e0c4288d0196283165185e5b3240729e0890561092ba32940b2164bb44a4b3c4140cc9227a84c41d282a1272870c5131c9b206e7c90831f405f01104543af1f3d14b9e2c3101f6e2080164350412403286c5030c38559b68475afad3d96bc5c3db0a96205ac880d9a050f1c931d238a0041886748073164f728e4e78610a09a6fa6594ab56b99e0b0e94691b844501192c14d900c98cc000830323264a452ffb4d2979492ba28cf1d8a491ab4ef5397a430e9ee8e625118f589342e2c68d79faa3a6b769d2c9b918cdae5aea5a783d4441c285906a9c9ac741e97f23895b23fa9b95317e5a151f627ab75fada1f8d539feed2d796f7a3feb68f234d433f4ea38a32d17f1efb1c766f8e35e2a665a53bde4b7d9cf2c4182e357579aaca989b51ffa9940c93fe64ec92fe64f6075df425ebbdf7de5befbd77d33e24fdfd4742719a86ee4d931ec71851a44cfb4c715c2a1c1858ab9a9d968ea6dab5524c378aa3c28181b5aad969e954176ce2b85e983bb33575807e5e24af7ef6ee47978c81110885437d54300d832f2a191355d487fa1411c918dd54f85e14d634746b95baa88fa6d117f5213ac502f8807b342b58087ab32c0bb2d6873c46bf664fb37b3d17722117e2c193dbac64ede9b13d37d6b61b7dc885e0e55288ee30265959e56e544caa1e05725460e36e508dc353f349a64a2badb4525c6b36e459e6429106a6271a638ca748638c990bd1fa23ed496eaa95d20cd75b87784d100f92aa5d29ae3b93aaa752456fee3e10c0360da5d53ded64ce394bdb95cec383228d6a85a4c13cc88748d1632ee438cbe494534ea759ac2ee441b6d2bfa5bce787daf33117638c9c0bc518dcdfdfa84b52974737ce4e4bc7852acc05f4f37221aece4ddf85c5539bf4334d333a937da50f85220d78e37acc561752bd28a28232f02184274013b0941f19199927f73fed2bb63c104208219c4f9ea89ed850d59ed155224dd78c14090f03f562f24013b6af3fa53c912f15ce27f367521596b9e3e1a9a88a5e0cc2a1e07bd3b1092c81be8ca42f4d0f25cb430965088fabe7c237efadb7de7ae3762f9e5230b655847717f7baf8ab3ffcf7bffaf7bad033f8a30bbff7de8b3f7eb17a584531c635ce1f69dfbd6be17459211adaf7618c78c6becea18a69d5d8051ad0dfc1024d665d37c638a75c192374451af7f194723909d8f9339f441af25dbbf367fb63fd558cb5f8d88416e2de2aa514638aa38cd8a31bdf5a7f5e492ba59452fa9ad39f8cf983f157bc616d3e8126c84ffb2f73fd4d9e5de24af6495a56e710d004f995882643c0122acb5730d42288888025d428cef3c22479977e96e934993904cfb673be6009b57ea6f547b47e476bd0aeaf4dd9753e7962ed4f766baa876c2465c4d45a23ac2c7b7717f72bd554d3b02db3cfe6cdbc99ab9b18436a5ab3da75d4cdd7bef067dc1785f2d8341261322684e80ee7cd64394c365f9ef9973e7fe651c053f5af97c3ab80a7ea87e045957ca98ff2b0e56e588d23cb6c66339bd91c2ecbece36f1a89f326d2e0dead8b8d31ba7cfc186374b1316a8f31628bddcb9179df0bdb93b637b160fc5966f17df76098ab699335f19d253bfbb99a36b7b533cbd58d5b99fd6f2e09e1edcb1d19837a1bec30efecfafbc08eaee869f77000914f5061058799fb4ae7e142ccd99fff966573e530fef8a74da4913d9e466cb41b2781cf3e1a9f3798b5fdf1e3c75a562c2b961567216014d69fdf9b337e88bd2c8b59b48931ec3b97426cf1e25c79cafedf93feae49679246ed3a59fbfabcb1d8665996e1bf9fd99b4863e43f1db647eeee9c9e19a1b4c77adec418231aba2fd63cb8a9cbd5dac1d969e9c0a069d9faec72b53cba519edcc1d969e9c0f0bdb0b5fa0373bd5c403faf17469efdcecbfe650c0ef952bfa2e6b6ef42b6b6752912827d94a7a3b2cfe90f656ffd79731363d8bf8f6db6659ea6fd5cdd9f37f74e9696cd9bb82ab9d783d6ba5234ed35edbe7d8b833d972256c7e6ec8b357a5732877cf14745f18f013252a97f20a08f86ce98e1417185df3f078eabb8c2faa3a1da0301c9b747ec1187d923b1558bb052f61cd16e64751c467b1c142bae82d85c9143a015190475255bd9d58776adf117ea713bcc1eb1390e73a56cf7b945ae7ed5a4f390b2d68f2e373d13b57aefbdf7c67aefbdf7de7aefd59fdf7befbdf1e56fd1bdf8d3fa5eb8f4352ffe788abef4a294b9bd5eedbec5b92fe771ed5b5ff3d79aecab3f29b7ba236aa789c3685faf6db2eb7fd6b5eb479cab0361dcb1717777776ac43ddd8aaf19e4a8735bdabdaf49e72171646b7f6e71228dfbd1eab8b49ab439f648a4b1e9cfe66cff7bef7bbc28548cf7e68c42fd53c05fe8c7ba79bc57fa5b9c0f4ad10ef394149b53b54ae957efbdf7deabbdfdbb3d3e126974f7a25098eeed3f1ada6d7a066f8f638c310fbf7ef6b49107e5773b1664a73f4d3fd7e92fb636fdedadcfa9bfed3fff4d6bd734736b9ae999a8ed4b0b5de885a7248cd467abe7db9ff100ddf325cae4247f24ec1a9e929f7db1359d651f4a7bfd45bebf64fabbf7cb357ee4efaaf21198eacc1c89e34624cb5353da70ddc7afff71d2e6cb7ec3da4fe941587fb794ebb7dcfc2e5ece397fcd39973efec9f3d2d779fc2d8b6fe7cef44cd65fdca5cff4e63b4f49a4a467f26779675a12b956b2f6c5f56b78a53264a44d8c316ed246f2f82c6535aa2422579288b4e19144a40d75b9724944da481e498452a792488c313faa3c75339d5d336e29d3e8d1b38ed7dc9f839974497f6f6da775c89858235fe4df8c82555de3355ee335f563cdbd1955e33318c081b9bf2b6d249116c95970e8a6d77d0b727773853f3e7498c8d5d8507bdb36fc62bdec4369ff7358296a31c7b86d1f638c5b1763ec62ecbace1463d272d35a6924317ecd69adb5d3fe0ed8b6d6da15b6ad5264ec0fc7b6510332b6d5331805fcdae39cf7faee3573c997687a69f2a0bfd82fe58e4b21e244d546d223fd9b97d55a2bb6bf4597bbdc7228682fc307d633b6bcb7ea2803cb5ed2014318180f9167ead32ddfb74d4b69df4e7829a594ce187d6ed86ad6ca5817b2d6ba3b757777e9943a75ac25ce280873e60234216699fec67dfc6d338ddadbcf217f7b28335b3bfddd5db3ec2127efac2fef5fedabbdf7deb73ac312a436495b4a29a394e14238231d3084f149a22d27bd328ba4158ec853dc90a73417f394e56257d3f8f6235fb6532977ef62d3d5ca1f161329fb10b2477910beb8782d1ec6353b33e90faf76f625f983593bd31f8dddf0479ac66eab751c8e9f41bbe9cffbf3c3aa3d9f83d77243db6e9c90aba40a9ac78d389068cfaa8188b367a69efae7165bf245524ae9c6c53ad6e73476db9f1f56edfae19a5d3fbcc2ac8df262abc5e384381817c4c138212ec6c138212ec60571304e888b752c4e8883714231c6bcf1b503dd880948962d2ec60911993c3bc11086eda1a2d533c509a892a92373268ea7e634e2a939f564796a92ea7f244de3dbc4ba2ebee2ca42d21ff721bc089fe9efbe7816fd650054d29358be925e842bc267ff226f524622fd0b4f04cf85474343f0207c21b17c7d94e7e291f44733b7ad23fd8c6fe9cfbde9198d3ec9f4246d4d6f4d3fdfa467e8d31d279d2c2abc7aac00d55a29a534933128fb99e56e1c3474de505bebbc897aaee6cd64cd9bb99a28cfc5c321635c5eb2e80f65d2248d4f7018ece2411bf8b29848913a35b1d4d71e6fcf451b90bb71bf86b76816fda54efade78e96541fecd19857aacbfd7f497da1f24dad2568b42f63ab87cc491f7e68c42fd7f2929ff84153c25e7cdcfc959b6e83ada755d473b1722913c88e456462492c3b8f720ce87482312c7b9900bb990902bab5d800d7bb208ea1e7b9476b4eb3aec414a3bfa1dd62dc81de7df8fdad7f01e7bfb2ee79c71eee68aa46bc80e3f8def4eb72037e96bf84cf7db9372d6fa8b2e388ec471da6333c398e32892bacf23fde56edefc86359c597f3be668b1f01876980761b782b11527c243d863197e0fc23e84b1c730c65ab675a38c7f84f1c8eb3cced3f4d76373a1d3665b4058626db511083957b018da08d8b0078b9d299d079c2b28bf86e4b1e1cb7a5f7f11851efbc6a9731c67c76984b5630db7ab398dcc16247cd8525b5a5a3c948b4dac9e8b4ddd5efbaf85e5ebcf58fdc5a05c7e7e8bc992ac6d41b9b4742e8ffa5329b7bc7d172d1f42cba35af4c7a269a8cba9d370d3347363ad9d3616cf70801e83f64ae751a3fc0aab155b3d96790c6f6f9ff3b8bfdfe57b3b6ec35a966917722117ca9c3ec142070b158c449b001bf61415edec046cd85314647f794be7017fae2203b67d285b889bc22fb26ed8b71eca532c7ffaefee9baffeb0dd5e868c61d19fc34eda6359c69cde59deb6b898f4774b9a9451f65d3c085f5a3c085f58bc9307e18b1de9abddeaefba14c9dce65224db14be1e33da7fd97cf9dfcbab67e257bde92ffed425b73e640e5f196a9af6f6a98bf25c1a85beaef69946ff658c0e944c9691c299d6340dd57448ff1a1a2c7b0c73b9a80ff5a12eeaa3da292222e5a22222278ac550a84ca3c4e8902fd4630a2e25a43ef45514a594234e9aae17733c45a3925b6fbdf5babcd135a73e91c6f652badc7bffea8fe52f4affd7522fc6f75eff8d45cbaf3aee50c6c804fed1668992ed39b126c6e46041c6ace02f4d7c880816644b39c08e1f245a409472e98f128fd151c443e4b1cc02a1c948c01fe0b35f92bde6274c867c913e24fecbe6c788e7eceaeea326ee8292e4809b9c9d0187f9e29e3106d944823048fe602cae1ce6f35506a484b158ec05bec43fc0029c5024f98b384a62149e264b70702a0df98b4031c863a007f178c5a395ed0f3d0e6dff08e4b0d4f3f86629a5a4f565a552ca92ceca59d9471ad986108841d8534f9b8cb50ae4e001da39640c093380f0a4ee449c0415e4c600195a638c53c6f8929191e1fc43e58d849293fcf9ca777cb54aa556ab158cadacce80af50b1d5f61e93fe9cba3444264146c55a762ddcbaafc776e9193c964a90e3cfe9ca5f6cc52bff2854cef7ae50f3a57460301d3a3eb66034c89fab5cf58f42e930c06394578d0d663853ad0834756ca5fc1f85f21294fc41980e8f747fe0e3b1a54ec112e2fb8f3b67048636b28c915707120d19255f6c9068c8d1318065a40137fc0c5d743de42ffe9e36a00df8f961a4a009d1a9e640dcdfc6dd98dbde6009f2b79afc6dd03dba0b73e069eebeef81bba1e6004dde1e7d4f3a7d4ae97eeb430851274fbdc85828431851f6c0521fc0863e22b061e30d7d80dc50831b3e08811247f898810b56d2068795344012205809f2a3a789cfe9c5cb863e437ad8dd863e4048b03f183c2c547cfb93cfad14e503046ba336f4f971c5866233c5e625adbb3f0b95fc6da7ad52cfbf8d45c8670435db7ffafb0ca9d9db863e3fa0d81f0c24fe1403c35984e0bbbffba73cc61e481b7eefbdf7e2c022d7eb0708c6c2d169edd4ac58c001048bb9206364c097f832d79551ef42963471f1e88081a3d3da71b9a0aa59b172c08870b85ea8bfd9059c4af9c34ca76ab80b9f2afa6e69a7e5301f842d7198efeeb09aecb85c3c0ef345d8cb61dc5b9f2292893bd06a6f516fd57c32bb49e4d9f15df7957f504035dbe32ab270605107d68aaea2ebf29f0b9459db4998c1025f22007614c08e3ae626039a20034bf0879f8003401a0b8031fce1bfa3d0edd491fc399164b5a41187f9fcbd46c668efd9fb3b918c89317f894f743dbe4722f912bd25affc7a6cf9635d041f9b43edddeed92c7bc845c08bf60dda3db6fd193d6e741fee2894ff7b6a868c4f1655c9979731a397932395de9650dbb5277910be68dd67cf758ce6cd5c4d9b79832307053c256be8d860305812f32609b9b985225fbe8c703b8c79179c7acc53917e71bedcac6368bf280187c53d1de0355498de099e7a7f918ff5a5fa43e120868790b7e142310151d358750b1204fbeb8183ec72cf4bb404f69b8c1932384e6f7a8ed34c3926231cc7719ac9c49df27f26963f9146a8e74c26d34f1bd33773708bc954fa69c399505fc35b4c8f42955a9ed32d2652f616ae85452bb57cdc699193cb3bf245bafc97376a47ada43f546987db71d15f6ed11feaf4dae39277f23e120b11798664e495674851c5a23de9e31087d1b06964338b7b168ff4399ff4c7e979135bf825c67198518e49c761b292253bae293c3b4d4ad326c6c82352d6f8ad371a7573d579db9d41448efb9b316f54984666c8d0aeeba2e40ff542fdbf4891b0e39ac2b3d364de603d6dbab9ea300bb6a6e60d8e1f586602678ae5cb8d0881cef4a4cf592391722e594bb24f22bd964b7ac6bea9b3da4b2e8599d39b46dce6f2396f79cb5bdef2d7909985449a3b6f5f2ad590339185f42eef822a7d2e69bd8dbe6b61299d5e4391de45e7a8235b248b24fd667aed71f64cde373a3dae1b2e220ed9f0107966f4349eb41f3d0f87d1b697cf820b0e43e254416a4a7ff246df7526fd9574c4d9e2ca86e530ddcb8f46628ec3d8ac3d28c6e85a90b1d3db5b8fdbb62ca4ec48c3863d40e0d9db2d22c7fd41295667c061620574606087dc3036227f325f7c80fd2172fce2feac6e416eb1450d3fc161a284d1b4c7b4c70a1cf9c5287149d47118d863056b4bce85620c8d5b90967e5a077a6c9b218523158625eff4a32f7927dbd518f431c8064eb1fadb412363cc9123e6e872e4c8d1c52648b4685a91443e14f7fc1c111683baff6210d7e9aaebe9bffcf3eb8feae8593ce82f23fdc1295b963125ee497ff2ea8e6ddf27edd8b66f4fe21e67fddc5bba63db74dbdd63fdc129d2d2eee7731d37a99da31a9b78c8a9f0e3ded39e4f533b3200b7f8769cb6d533f46fd6996502a53f3de4f4c55efe4e9bb3234f0796c7917af6e455ef6efe4269f727cff49c573d7af24a5f3deead4759bc202cd85ec8db60017e9377face1bf9966f6c62e42415644231877e61e019d95a0b51b07ac603145a195ac6870f12906ac282aec0828a604156604144b0a0214f59ab3de6291b3df35bb71afef0afbf542d47399ecca844ed181631642435000063160000380c0c06c382c134cf9310283f14000f669c425e5038930684d12047611844310831c018000c0006184494535446006e7032e846a0a857e806481c5d61993aa8fee1bc8a2206582a35cc2713279bb65bc39a752552552404c1bfee9195948895ad038b2252fdebc204a04e3c3be99901050f520cb5b7338dfab5abe20b38a85036e56a244a658db8cf2450e68c5d5b117902d4d04d7b74d6ce18fe18758433bebf885e468d344fa61252393969177e871ad0dc3d3c0d17b3c5c8a6b94bd3fd66211c4ad91f653c4c4616b8ecdc3ca263437349132f5f6bb66ea059725afcc6dd8714e2a1a28397a5121dd8c148735c90e334034f19c18334e6168314d153f6bfed88d07184dfa6f21bcbaa46195aace20d5b0a26a41f70258f999b025ac85988f7476cac8436e8c024b08f23ea7f947939760224ae778e7aea2c181c615487cf92882145902a5928ec2f9fa606bb7962031bf2c961ed996f821ba2b8c1204e2273ab918283859bf17b2b41e6bb239d2bd1f67f94fcf7407851e6bb24a93a90070e0136c289edb26aa2816ae89a39aa7574145bc8396201690435e41608a8409a03ef0931cbd4ff68924d4de559a38c8a9d04641b830a01ad6fe56305bbb43628e0475b21664c31477d24e0610fa67af2e1650068b01b3b94e385cde60f466a9e24781fa883af4ce3509acadb897cb0a8b60e52a00a4098e8d84a7879ae5fc46a22366c95f05cd0fae09f1c1890f335886196bb62bc7d9b40cd44f099347e119c4b03d316b4571f20f73316b481da4f4c80025e711b5925e4b1814f07df75867c3a482928da94f5446f4aee385f9bc2094717f19f69eec20368aaa627f626a113923558f167a818df978a8d9e44efd54955a2b929a1a10298aa77bad9a519d0bd9fd0ace821c1bcc3259182b4404575fc4070395a190ddee45322958577e7fabe2b7b0ca6af798c8628d2ea5fca2b523095094343c702e4413ed3c4d51cae7c75ea017713383042be6851a96b4af639c319038a063715c06388b90fee965c8332f6fd849cbcffadf770c494cb634d924817b094f1fe4449b613eca1c323cf5b89490f4a7b647fa9c325168421ed8ffdf1e6fd991712d4972b86425bd9b3889bbb53d69722ad8635bae10c4a8c1e7f3dec6660cda00ffe2501310aba78e8acca8db49e56ec2ac362df23e4364dd8cc89188681cf43f8502521bca0ccde5d42dcfafa01426130a66b3fc944fd7cf9a023a8b74a786d6a30fa1779a0eb921292fe47b674015d5df145eb8a723b93346286c1da1bb080ccbd9f64f64ac95b6a4d2c9bbc8e2dd1db9789876236d6790a5d94bd485244fd2a002dbd0f934b6e7b8dce12d42267c1ba2b8f2edb64ecb74ebe7c1b427bfb8668a1da07a7b39ccf0e27c7b2f81a313bfc7a17594d59449663914676458e4291ff926b404e9f44778464c324d00f7f42db85f1477ec6c8b8e2f5244a45378c5bfa10a40789626baa4a9f9a7ada0f3c1ddecb8659837969adb10d111c5b5dd329e2fef5426173c714115c02019c14107742756a0c852186da92658a1b5cd16e10ba1ebaf03d76bdcb7c3fcbd64568cecaeffb273748d4b2ad5bba103b4ebae65106ea52150587d158dab1595b80b21f7a88014953ba111446254b92e4df93e03e8a3bf195ff28393411a984a904eb805e7a9dda70a9501a8c0eb882dd45a206d187e88c1cdccb2805b7befe545019b40a900e6eafa0ba7fcb826df0e5a76d1f7b23a7ac0e9da956c880fa6528c86e443b54b1b7308cb6f81c8c384ea7459b21d93c2ccb814ae5629c3b73f1ec2b62ffb693a3bafc1834095eb3c962d388fd5f895a4da795de4e0e8ff2c07712edfb80407fcadb2d5c0d81fe01f95c7b32c3100e92d476539a46d6248bb9ea7f6451a712f35699c891bb7a771ee9f22763921a3d191b2aa3c24c85e75e4a26c263ed437031127fdf152411d585465ea1776b9acf153b41842ba6b8181827a377ac1725ca76b7725fd020bfbca446449cdc92f97c21026d59bd279a4a6f36cc18b4f4f086e1c713ae2f6e0c4d20ff1f016b0d91053fd7a0bc676d756e47c19e72380b5aadf28c4544d0fb3016c6f9cc728b06401bb311e3a5324ffee5dabef47ca22246430b6810d1ddbe0fb8e72caf74a67b290f0ecdf7917313245135aca9bb5bfb3383dbd0dad984dc6cda5223612668344badfac42e9632129aa86ec328a58edb5e9e0bfb1f380e5b1a18ec125b778ede72cccf526aff832494fc52509547fbf1d8cf9f5bce473cc5462c166f50a289c5d38f8d6984a0b871a3cc45f0ff8d602a90c04dce2540e44088a99204568f610697ae058c9148aa0c240c4649a2d074d7194f227c08628449a51264f940611359aca50325948e64e350ea49abfb6ebc0152aa105feecdf3c13aaf854ef20978b2c87c70bff435d93a9932898d60c9c3c4295d1fb450e3124b0f212e560ecfd79db92315fb065cd097a81dd8a0b124a76fdd373b9c207050285e08556394ea756ef3c887661de3b56cc2a95282d598c49303f1280b364c24d90e2aced416c9deda278987a516890c79f178a8e93dd758626bd8651e8f3dcc4cef5119596d178fe130acdc9f055fe12d42c92cc209b810ff30dcb1be146e28142dcae8f2f8b30db103320b9146b88dbd94055705aeb5906270e3b1946c804f0e98b5937755c4081f4d80351db647d52f15b8428fbdf81232bad9f06a3223c86177a0c14373879f46ad3ed354c218d093dced6c720949b8d05f918083d3d3fd07e479c40eb5977b9b896a1c0ca10ba9dc39de023f35bf66a8965785fec616eaa6601fca234674046245159ecb6d378f48e4e71ecacc45c7d858177d077f32449db1e80a911bc12328c2cd21dac6ad6c26a9c4d910e2251c9ecdb2b09e02723cebea1269e853c7adb2b1ae18198d69cd002d6b96e3fbd2f68e5822ee418af8f04d9ec839c68ac39e4e76b4fcf8c2c4fd830f09fa863b0a3b604134cc86c59ebf27ae16db107b4f3bf6a2ae4ee8e9facaf7d2fa661f8d5450c7504cffdc813decbb9cb3ad4ede4a2da812f301266cd3425de4962df76f1374f3c8e7083196b8af93f7b3ae4ea0c95568664553a72d4dad5a24259896c86de9ed508aac8f866e793bc54f2fcdab80783b01a3f2bc38783b480a7e148200610ddd7f090eff7a952ce992a5728e8261a7bff536c65898ea92edaad4705ff13c663e47f56c2231f097e8dfea9266680da521435dffe52c86c66acbf46438289ab81ef8df7af8d33c0c756ee5c7d1f8b72ab081c26041fc3c9d5229b1c7b7e3b2c6e42943e0cfac16485f8a4d95788e5c4092592f020fcd15a6d7b22ba8ff054fad4fa9278ea3909c25d47cfd6275b67c317b129fc10373673e8b89c47818db2490b9d3a7e40474444915fdd72ca7ba00e247bd2649e3b65d0d602a193c00d078603d0a67dcb9d0a1e08567273130be23b170c66922ea5d0d2bb55126838c0d97e7b4014573d7b4087143ec2eeecc6b3cf6da410bcf5ae10f9c62478c380254013bcdf8eee9c264f901d08b15e0c50fe9fe08cc35dfea6d839882b42ae095898eb10af63cedd14fc9ca3b1377d9b192be22d81d4221728ce47b7055b709b10f324da7f60e9f0c2b5fae3cb7ad198828cd3e42e493385ea9de78f9786bb87a16eb8db98088d7a27bb36aa671ba53e768cb21c0bd0cdda1c0ee2b9402ac71670d5b3dd44738cbb9a9bb0f071ee2cfdb61004c27d43897cd25ab526008840cb419c4b02344ee8dc98915d1a030e92e1e480906a06a368808c2842caa30db5031469bba164549ae03f71eef70b9918394d905b88d263f0a8a22a53b56830cb3fb9378433ffd1eb88230fdb6b7f99b001f04548340de166f947976f34f2aba3d8fbaa05dc14be985a28482d651d1bd0c02bf9dbd01755cfbefe1cbe01284e4f825dc22bcea04b7c09a7c05330e16c1df4453c6d906d33570739c1900371ac14e43df41b8c03c39ce112e43caa943f9716044767fd397089d5d1e20aabd7c40c9ef31eff5407870138e5d77eb133916ccc2e851786a39832c0ec090f94ef714dd68a1c59d20cb874e1a5636d92df956d8273407c17ee6293163cb3517f2bb1241689012a4d37e46384781205409e1f909ec2e83c890c78e8292dc7a13644014253cf2fd3daf8452d7c93dc857f41a784c953cfa1d4c6288515e16a584e1167668405dcf90b0fa8b054052f9f6bf24357edbf8e0259794af05cc50dd7dc6d76f06873ff6df173acb021c8413c6a2265050fcaea055be6f9fc1c5af3e569eb2be2abc2a9eb8b4dd03e70a2a2f7777f306705a5d8685b649db0c7154ed139c876b36bef44c0c27fc3a7682618593e4b86af8600d577a9c0f741b964ceaa9cc8d7e03b76270b80b373f9fc85144013ad3aa6f0ae165ea2e1d9b9d4855389d0833b2f97804c2ba6eb04e3341e66bc0faa65cacfbf41acbe82a5011a62c18357f345fefce4f9cb277a51b61a42b5afb68e546e8cfe2ec68dfed11ff46e04b343d6f3efbd4b4194a094608e22984363b93be8b97b6dbb6f64c570e62d5829f42dbc0da8ad1b4251049b3f83eb5c556ea990f31a343cc5863dd43d0051e1b681f71922fe1455283c06100673b754e8eb4d7c95819d709b90e7a14aa5339f073ef7dd3497077bef1dfa525ad46c1297a57fd2c495aae2f07abdc90bcffc978968cd4cfe93a2e305415fe818b6bb86d269fb8cf6b6a9ae25a5a84137945d3bcde353806352b06ce8895e2697a819fd8844ad21a8c14e387f371ead1a696a39acc7b82388ac1efbcac7cc94bf4d7a1b5001566e1a748f9f65e7b6d6cd5bebb181cd69d124e3402c07e398a0e1bc14120202591254a240b28ceebe56788c450a8820aaae5c123615d2968bf73b55cd9e189df5727252ce21eda67ce38334d035780d722c0c0c0c8f75db184f95172ecf45d7c9a087ee6388bf4ef79dbc49ad5f10ea7275c6068039dda8a9dbd0b8088463b1c4c6540de09c3bda4f9bab068be18d7a8d60153743c4236313a0d8e9bc95b4502af4d81c8c445b7dc27e82461058b0bce4b628198487ea47be64cadbbc7c9af3c0d73daf373a180eebfb76d4279ee805081a488d78a981b3ba14ff53a9d921622c48faebd99de26ab77554d4f745831b81e72b61df5b502ed62d70298ce8018aa868791955ddfbe7f4b844454287714724a74f87d4c458b833c807eec7ccdc94f8868491faf53ba87eaf5d72dfc11b73c033d307bafeadc91e67cdd99d2534386e13aa8b0971164492ceac8f7580fc639675d4baa9c27cc2a02516a1ea5b3755adc980c2dd8b2e8bb5ea70a108cc4c44fd0bfa27f4ff22d1971935b402d5054d25a98625ca3c8d432d05622f1bea87d4a31d71612eb10e239d0177f3bd35a46c23ac0e5f19fbc61310530e64cc1bf5969542e51a028fd25149ee2329018c33fb4b50bed5df8e67d19202367321dc46d4f6d1932658f0f699d331e1068cb1bebc21822beb30316d90413e49a02f11a695797cd7edcd9be5c69cef2e6ac4f91725803aabcf158a8d3cf3e72a388767fd870a24aeabb52da31a5f14d45a4472f44a2a1951cb12f1a5888c6197254b02825d0b8baa2b14feae4eac5b7e4e97c722e7081f824d85259ee04af9afe797752d569d345c1f60ce3eedc08d2a76ec52b58c44d2e7e5a855f281537d174a63e0a30799a3b8bcee0284ec9667f878b3687d3b76d5b8f2cd849544f0ca21a0fd4025340fc0a2397479ff389d539bb49e1a2f7cf102a2ef21c3cff0248a70722dc742cf5723d688c1f0cc8d60c9bf55c6bbb187a9173274c4236ad89840dcfdd33dd882cd44167b4cb2e8712c6a1ce8e1f796664c8944f1e909079774be6ca7769a08a6b28853f3c1f569e27c93477e6c0fcfc8eec4d237c577245606621d28623c5b38cf0840dc0c224d3a3c42230369b69b4203129c00dde8af967b1099e3394e70445d9937b7a4a911a03fe52a28264c10446c1a2278bf7bfc3bff0d582cd05c5e12dc2745baf9ef128a6182f22c2f74abef7ac23d05d9aec603cf2a81f40f15ec73cd22bc5550584a566a47a15427f4b0ad7a652b5c1a9fab95e8e4303bb28a3976e684bcfb24f12ed1e23ca109040e7e4d410daf4e09c6a8029215c923bed9bdd0deae640ebc7aeb3d138371412ed9cba81858ab851ccf51a31595cbde20093b65facfc980a956062de1c28943676ab0b82e0dd0a41601244444b63dfe00041665e59aaf43b482bb24a1bcfa99fcef3e19d7bc64e7f11774be79e55912320806a666c255dd49958ee754a91f499d4c907ec1cac3d811595509cf5ec12df929e39517d97b5eb0e17b6e6077f486141f502f3a8435a7d0b9ec81eea98c407b84f70b4cc2a0263bd20cd3a1d3e082f27cd7a858745120b0863e5049a632a19200cfd5bb7900cba9a1c97f8c735f858d9e55522b00a3acac5781759635f5e2d86796f2b0a9416b2ae557ac6835601c0a639b02acd18f3f42b2a36b7a332648f49b8fc789c96af40faac75e6b6a30d8c62be98a85fb75a5789d5853b54ef9190bea2bc4572a488313ca20f32a08b9887a338d9c22576bb22e827f7f301510380091146a752e76b3d7ad9f698813bf2803d40683979fd3dc90edffaee3fceb646e61213f48c1b04ed2873a92280a2c5e95e3fe0414b389970a000da7501359739ca0f96ed848839b9746014b9a4b53155cdef4a81dcbb62e673b6fdbae6f441bceb3e3cbe3b43686ad1bf56845b1e81cb0531237f65919380fc4098ca42182a544013dbac60b4993b4cd1918dddf00f41037c4118a0a792c9b2c8f04d752c3f417ca79f793f76adc0f3fd02d48f2e9a3e3a1415f0142c384bdc3501cc9b934ba1611d7c084022bf8ccc06f57a1d64e84ab93634994587bbaca2fe0868041524924bf8e9dd9ad203f1071c223c07630f8428f305bba0fddc4b926cc7e9de4c4f4954b4c918263d2527b85afc06612cb3518609b1e2b64c68cfd1bc057b5d050f0e941878037ffcbf162926d910f658f3f96355a1ed5d291686714eca60508ff071414470dc32870a5882452187dc1688372fa2bc9f520ec5d7a488089b1709bf3f9d2e8339510d9abe7cb2aa36dbeb6eb780518e64ec04c261b2e5a0bdb8632e48186f47c262cc916509e42799b99cd892fe900071483c97bf1beea332d1c2478cb95a205c8960885131f2800b9acb12af767a42fc31816146c5482e3f139ff98414022c09f333f551d974b8ca28a5eb14b247e4bac521146c67fa87f4ce673eb192d288e371ee39fa52a40a74d808155f42392be11d9580ee715ad4578e8577b641ebe9e4fb633af5e731cf6d4470ec91b344563c089f85221f54c00e351990c2f1004a04be0db1e12dc68c2590f8ac37950df7df9553b4bb2d00e1615f48203e4c96472d2ca6116fc849f6273c8635c62a892d16df4af3f4520325c2db54c860ab58d3ea898988880c1f260dcd5fc26167d8031c33cd2eebda362ead21e1d7e31f428ec37c2e1527a7982989230f7a336ec693b0a36adf3531be10e45e4ca533b82fcef8f7faddc88d70dd459c3e956e4b46a36cfa4ee720628eae1028c443ed0eb0c71217b8866a39a56e589730b22a13e57d3af6906092c2ff936320dd1d9dac3166da7edd92b5230e0404e8e0070cd90b7e2b910ce38c03b2b5b854556c930fb180d0d9ce75af7956e3b2a7e86ab54cb7e7fc15b5b817d0b1522c1e6bb9e40fd23957feea8f988e6c84d35f49c54868d0a9b9d9a74f692ecdc4a83ceea346b1c4a225405227558c03be11152fca28318b47a0165a59d713642b9fa6dce49cce6930daf7664488893cee5fd94af5fafb6f61418d8d93c461e1aeb1d11b0b2e53072a17d5688198723e29da6ddbbe980fb6efb4334f9315ebc699f887e5a4322a5a5a4e105d54fa7685af8fefa7706a50670b317cfaf10035c12e1f98554122fa005b755d494f647d1618810680c514f41b40a214549f10acd36a2c282afdb7c3e8db7c1aab6aab67e9d4614add74a3755946e42db76ba4ea65bf4e79b890ebed82aac15c67e26c3208e406c22a009855057cd9dbad4a93f02642d440790f89a14e7ad344eba2f70661b08c162a4cae7761d758efc4a34593994d4971d6aa346ba3c5ac4c732e10720552cd3b3b369ca7419925407212abb364b5dcedb427993988f05f96cd95f52e904c17d4f209c0a77e955159ec669d2958f0097bdede1889de3544ba02cfb777d99631b97dfde64205db19e742497185afd7dc59d46db5b6606c9261c2de19f7cdd4aa4da21ffa2475fab1d785e34f17763e6278ec50e1157180361792e7485076a66714bd63652eea3c480132b374cc5946c42c23a695c11f376ba2b72641396c605614906eede2251235e8bef1ed9086d3c8ac9a4ad1022e4463b69f372ce0c552894335250ee21de3a89e97b69b47c17c9a3d60421ce7f1642779a23b884093dab9e98297f3b55fa3ed8b559dd921e20b5de6727dc4108734167d32491dc6a7c6fdd819ae62631f757191a96a2d9ad79c15c41094e92050ca3c85cc035c02b9074ca5c1e16223758361d50c5b251843856a1769456c8ba6f55f0a39fffca0169576b666e47019f96c8df02b6249da085684634ac5a9bb977a46a81cb52188f506ab0e1c60cca933617111eca3de0691a80407b8cf45f5cf1dedda5df0f311255231d926a8b50031861d145c7331ebe5e2c58a434129d2225b44ac478462fd0fe815f621e1d15cd9bec8b0418a18bf978ecc49ecb0b8009c4881fa7ce1e0bdd0e0182d3397553d42c0c3e522fae5d81557d3341bb980a7058bdca634edf0701430040bb6daa55f669daed77c28ed79e506b0381dc21b69d6cd81d4ed599b26d042cdec16eb9ac8f73f170c99c1b5a36c573100dd2d59d2e1a7f091e3fb789e10670a5fe9103c06a8bc511838dc53396509e4b835d0c5481de474d4b44e7db2f0c09c99cf6222628a6da6fcd425a0f05a0a5e879d67cd85816191bf0d79d7e9425388b44e874b703cfcf99a4cf5308e6d3755ebc2c0488a3727a9ff6243886351f1d89009150226b0ac76ef652c95b7b1350462def04ca14d1d66b1fa48aac572b1da830a9049212f64ac8daf41c0feee2922e42068cc6056742d24c09afdd883cb1fafa574e9c8a344ed27fffe4e886f95050ab744074e89024b80999d17cb136867683454d96a3245ba965e0f49660fb881783747b71af0d51244a10571ca5de8bfb5cf2e0ba1ff166cc885ac57419fac9ac42c77ef3ab2095b48c55b88e564466fcdecd8246c294c2c4ef51faa90da63dd9ef35cedc155fe57065cb8e54191679aaab0f5f462a49c38a353980a335b0394d12852383600fb5ace6516b18ae89a59d3b099351389ea4ca860728f86915a4326be0d47296d44f09bc78f33e1dccec4384f811ffa1e272402b711e2546120f813d084b4b8aa7d080af5f2d6d65791d1bfe040b0a26edb71b537a70fa4c2b071850053c77d3ae24007b43150cadfad9a16613e1cd14af93ba1a73e6cd615ec0047c8f45d6832a8587ff76c85eee934358bc1cb5e3254b80fb64a10864a1527c53681d798c56a8d3a076150d86728f483a221638780d196888a165000416babe5e406b0636930fc68c08c11c0268af80d4b0d9255ff7c7c44a2da30dea6eba83cd43b74b78c8cb482e672e8860c80b37321c8a2d281ea627675101c3038ffb01e831ab380545e3381fd494af616ef76cf00526ad1fee0bf6d90b9287f144e6820ac1bfefcff1ad9ff973bed40e1422de924cf5b049c4bc4602145783537fe91622ef6b72791dc3d12566710d59da14283c4bb40ee4a46271a347ee02fd9bdc704b8e31d0850fea0184e38fbab287517435e04aa889db625826fc850bad6d48a6cd2ed32fa0307559c197c5ac203e70a1f8fc8625985c302a412d1db5e051374ee79e0328b6c2db92d11727434ddab94d59082c5ea7046bd809de4dbc1a6c79ed0ddd809048ff110c39fb48bf0b50871210ce06df8dd156b5fea84563d9463ec1a3c88a05744e2e73b2d2df9826cbd2eb87702812c209a90fa9315c4aee08452159fe08ba83030b75c3ac7e89f9ffc5daebc1f6076e1b95a89bd4c4226b4626328fdff9b5cae39174b443c30956a78ffb7cf6024c0912a835986c7c05c75144262b58baf898ea832afb33f9c9dcd37715fb24e42a700008401d126567f222b88efc589f167d1bef1a38879d6f061f2bc326bc180b57bd8210c16eb2c533cfdeb77d1f0ce7b45b77b583c162c7653cb4470687bed62612cdd6ea85131848f44c0ffe33580462e805818cd7d9b2adadf00d872422076ad1639913c5cc5072078f93031b1091d47a1a8a85b858cc168db95c25957b0fccc4bff16681d9a5678b025c5e12898186193494717248112879e9452a844bd20bf8200255cfbd91c76776b594697ab8647bb7f3a662c0917dcac08a8d6377ad76a6cf3936ce4b93618a8ee3d66ab4e8fe47c54bc7c7fb356c3523c2e64a63e115e47647fac8bc1772895ab76bcf47a95da2ad1f2ba8db028de509aa355a86ce38766a14efc833bdd50e2519fed3e983aff5cf6ee2105a974e165261dd53c629b0f7444db14f7c48f39e68ddfe319fcb8c514a45dd65d83b8ab7e54def38273189c357b7bd333d0b06a06f0c36d8a9a67c8954b38f17d0e151a0f52b23c6a81b0d657d53b417d41665783aa4197c9eb321a03727c28a1d1ea42228da47a85dadd5561a64d711b4973fdf1102981cc0a489b5cae6f6fc8e0c97da73d55cd7c880351b649919fbccf96e732f26632939526a7e33f40a252016572bf6c1b7d6e363304c5946dbd4e8e92e3d9010906f186667ccbd5120db3ed059d50ff054bda0ef22b49f597ce506ab7a0a4e85e13c5197d5b59628f028385e9be85f45059ef4ef591290a99d69c6a474e7cbc6d7ecf3b3b2bcc31e3e163d973eb6ca8ffcfc9ab0dd1db2c0a21e3f22f5a8fe649d679f311f76f9ddcce7a241cf4aff01dcf2a8a501683ae4aefec0006947f8a9162ff3a072c6bb3b0fada02f25dd8d5101f236fd90ad9f772c22a4fde38ccb385ed857ace94983c7b8329a6cc1e7180756328a268a67982e503f0241e5f4138164c8b8d0782da2f039246fd3102faccb92f54112772b52c7b9e4e701d4584865baea1007e385c01ad0d694d25b013164d115a90f6245ef390a9510532347913766c214c0dc94b22330164ef9d2ef160572742542bc387aa0b5bb2e125ab0283f12001c51d71cd65ebd04afc28a70aec1d66ed43de729874314773d90a6146b993e255ac43a30aea519bbc4750c8a667403ca664437006e4e64ebe9f185af4d58f866fda4346b41e85f1506c1843828fccb5f57ed5ddea59fc818cf6e3535c57ce26ec20eb36ca0ff57931a01d84028be81fb2bb80b0ffc4149813e604d391fa319b9521a0898aea33da14d0da71b72cf4e8b29a9d4623088df8b01a440f41e920fb9cefc669eb2f6e663a742ddcb5211bc688a12bde27875ba0aae3679e6f7585a9eec3fb1f1e4a0cdf1684aec1369748e6ebe5c9f7d1303ee84898a7a557c710e3ecec0057b5efef4233982eab5d9b86a01f81f71445d3140851c9d41eccf9482a3d4fe8d60a474efbf256901530d0a0c39dfdf8c68ea334f239875dbc8bfbedf00baa93496bb6db6fdf2c8602f91b715196b6eb2d3d8702c4ba2c7591355a498a5159d39705ade5b29cd0ba583883a1bcd8bf85af6d44a8785ea69db1af6951882aa596df59ec64856ccfefaa2bf42560e61d026f6583a2a903ade6a1627991e0ce6ee38c573500d853291b64cdc412888d60e1dc43d981ecfda5759cc4e015497ccb729d4c8ad8994a5cc20e8ab2854878f0f3086f035c572411a8240f8c0e3433b0978b24a66121e2d0681816a834af7860091ab478cbb5ab91b1d7912ebe8d09e6ef5064bc7c6291a7c54c1fd5a92f50e9b23930bf1779b2136922546f16ba646098c839f608412057bcb58853db2a24fbd4d8a6c2f94aac462ba12d53226225b3b881c77ce9373df006a9ee7bc05c783c0ed12af85badafda2cd90e9a2473b7d46f3469c5a73fe98612c747ea17228dbfb151daf91f316d319311f2181d444f386285e078593d4229e59fe3a832841512568e42b8f7972ae558ea7da2fe9f1ca1b8e2e9eb3cd8f745770d8aeda58286864cc557cd735e661de2237d4accb6a4bba34bad1092b95e28b29d8bcdb9af388c527ca2089210cf7b6ac5beaa03b433c6315d9b9d7234c6c7ea9e63359f63c088e4a89132cd04dc8dee3c306f9a6eea897f4f4f780c50e2f303cd82bdf012268289144f8678c465f4a1b3e39033c43a2db4a918ed310b6224c5a86b805191c1b5f1a79160969edada912631584da92b7c6d6c442dcc388a08d4784497888aa1c388acd4d97318b7fb2b1d1104218dc502ed54e530ee98ef0ec7cbd7fe7ecfb8fd9a19f7ee85818a4875bfd050eaca2bb8520b4328eec824e414b07a87b0efd60763201f683142ee2ebc43051fec3eb4a0a659ee7b58a66ba0695121ba91eae8a4778d64372c95c99ae6aa47e9c4ffd062f590fc7d5c40af49e6392ff41ae51bee23d1f9963c2161ad3219ebe9ee865bf7d74a85b8c40334990c9ec149aedc9f3626ce6bd04e8e680a186d51879c865b84c65f7c4098e5e2c8ae30b9cbe520ca0e517286f4ba4fdb8f6c507a2f190d6eac93d99a74e682b0464c5c9be99bf5ba66940b357669c9007b27f19fb831ed86cd5cda9643b03d688e2ef62e13f10a841073974986e8b177c3d11bee275c34caadf272ec66f1c968805c8abd575bdff5d660dc4f6b0d2f6ecbec6b6a3c555edb1ae6b36f11be99bf4321042a924ea9cdd0da8e997c693f6eb1b7c5e9525594583ac351aed353db9c52fa8b6322f3dc85fc960f5561f652622394ffd7fd4809e01d0510b66e1b607ed0938cc46ad41d81473ec9bcd2d440e3df6aad2b9ace36f71b6e4d94459f484f71cd0f81df355643a1541692e928ef3711fc71fce73ffa210f872a17c2151c8ca42d34104c2b29e80f9fbc3538cf21ed502dadf712c1e1550739b54509dc7ec43b54e9307ae18c6e8198857888529fbd2360f17feaf8de2110cbeb3ecbf42eb975af18b7d23b4fd10715133adec8ca15a9c1b0f8b498bce0dbdf737774daa42523d88a813be0450672ec5d8a886a4e15e7cbd808f67ad3e775ee56480ea7cb6ba1731514ce9488b886be8c77d7f59bba0f10c7a5dcec986f61d652b0a8c4aee0191b4b97f5adca5c8b85ba3b03e0067e7b1cac59672d7204b764e6a69a78ef4811e18b0010d44ee80db3aa1b45880378983cee6f97c57772bcad94e5bc7cae5cb9c61b7bb15cc45ab6dbc83d0ef26fb2e978b89155bc10fe981584219a1bd6fd341fadd86ea6f8ba96a5c6f3ba079a55111d2e18b78aef1e69477331e2fc1ae92cce2400b50c2f9a7326afe213e745b2f3b539d4e22870fbc356ddec3c16b3d01ba3bfd98fdf187890002b38464c2516685e2a472c9ede7e7e42e10edeb9f112fa72b578265a9538eb427aa5900283e190028115bff54fc785d2e8e9a816c606bcb3e73c9b8b55990dfe1358d4229d91050e1d72c0d483063e19bf6582b2e662bd6ffe7cae21235a8d68fdfb34f84939a9c04b4f6041676928585041bbba08d56a89ea71c7f7caf5ef13f6fbb7d3f30d0f2a07795e8af3212d95ebccf2182bffa3ecb7c3c6692b6db1a373095689e98bb61ad6ab59040301e0b8f680bcf279ce7cfaf95164fa4635638709d34b3f94e0b8b495fd4fe93d52eb38d705c166fdbc93aa0fe6225a5b84a443143e5bf9fd08a802632414936466a0f3205b0f5a2985cc988190b138e6002d3a94f3069b380ee05797e06c1af4253233da24d838da5d4ab74ef7cc589b3aebd0024757417cc21a5d485cefc1b51d1e4cce4249731cf2bc8d0428f71087f25c346a366c9db41fd7725b6da58f318e29ac7c8525f8a348fc80fd3c7c4d42a7425cf21965b2015c241f88ec1c2b26c942417d38afd1d816c9f41982c7fd31bc3124cfc9d34cafd452946be9245cd24267ce081f06f8c602e11e28793f68b6a14cdf2a7727b578dd5298cb16fb8c66d262b69ac89d8e0219cbdf02b5e7738def7f88a7b08a2c106f0426e1fbd9a1adecbb01a848f713ffee5b81c06f3146f22cd03f2f9feb88207c7a5c12e06114ad6c13d4c7df72b73e7a5868e713f2f7b345cf4009dbc6c92713526ffe104672db672470b54a223e4329f721c3b86ed9091322e82ba7fa8b3308f654452cebf9da88cbf937575e30c4c642fce6de9a391b627e4f91a7c64294a5a045256a76bd15c02013028acbcd50ce87c6f0f166df0cc5c5b32c07214aeadcc7409962ed28a6ceee71db333a0545f0b6eea9196585a2b188b4a68cdd51ffcaf1a0380de9a8308ed8b93935c72ea60abd066ee7dba4c4983eb78a5a9dafc3970a744b511e2d8cbe045e355de1c22e7b95c0f48be2854bc51ce2b038bf6ffcf327368ad482b202fc91ba5e28d75aad2a21bf50ac8ea3ebd536860a96c04e05bc4b87019bd4061a5466a51ab9555c0c353f2626290a9716e40019a90e843c85d28f156b56f2e01d78252507722794476ce552a86a74e34b27e0c1edecf583aa9b10c515fad8674a1d73565a57399faf558d2154867b11fc6e8ea7d259e4d1b059f987ba0bd7cf38d4b586173c2c9b7e42aca21c6bf824bf51dd077fae7c67c28d520e3d30feefd5fe4bdaf44bad80a5eceb3d474259572e854df2c19c5babc3d73910af4223a2780306662fcc6d4d37b2f5aec5947600469c08140c76eca2fd44c2319e268f0670f4106c76c631a0811cc1a53367428f50c4406bed7603473733c4a0b8ec598462c5c0a795fa55a9f5575c72e9ba0baeb2bda18008de5c30407d3493dd66f35c80c3aa98d6b4dfdecd16b9224b98a7a99858c60b5af8e1724e4c89c48248cb9bf83aa01e5856334ea4fdfaf82381add6400887f20bf78df0ea9668b8af0e9c239276704b9550fc11a70dc5dd3297c4a262e52e0ae6fd5241668bf716838507c17efdc87947d1745db290f5751fab5d17e0ef5f461e6b198b341958059582d0a10288951bcdd36be709dd62a0b65b83a89c8a955b042a709684726913e6a11095fadd290dc920e07c6a66adcf662c952bff509d316cfa7d91eee118951db0729401b478df29101b9a3dca79c893400ca1dc1cb41e5722442986501ccec4cbcd63a9e99d2ddcc32a694b07d1d69d18d0298acd9a7d72a52d20dd5357ebafe084d223df8d3f22f228634484d2bb62d8160fb9cd82fda70940b22165d9cb6a9342888261f52a5027af05164098bf9d20a5c9084651eff9a20e19dddad3d473f31137a581241454f02d6904526ed6ec1c627a9f44ec53d8c1c5fea98f8482c50cf813c715665d803d864aa07b61ffc5514b4942a1886e2286592ea27b546798077896c0bb6d8cf5b9a3c1d530bcf5d2861dff4528804f7ac44623f0863d006a4cf8d7ebe94b208651638588b6950181c3f29fa5eb4bd0a7caa5bf1663d8b458a99013a174435e08d8034134e81c6439ffbd57c9a805f4c9fc308dddfec73c9f0e4c1f394528bfa9d7c44c3581d206ab26fb4a5bcc2cec9e5c9bd37a73345643335b8ca12c8378076270b5611e7a0dd4af164239d15c2c554e00026b695fd677ed8dc85b0401d56dc8dcf3a867fe281b5acc88ba2d4f0a81289cec914c630e475481c348c0b1a8427f07ab4221db19d1a781e217f181c2992df2f258776f13f3c1cc32122302867ee555c0b5149099450f91d4ac16066f931918264370ef0471c05f33c990c6e617d33b54484e919ea3f2d665f2b829a0d0a862de44d5cb73c908da7a535d80a049673de4d313681e2d6cf991c95a030db8ccf6cf2791ad27a4e908508fc6f44dfaa8370e2c6b6877539ce5cc1c6fdb5a2aaf169c9e1dddf202282c2ad1665705d95bcebea880115c00c597a0f3bcf1cd902e8ed84aa647c0d0dac9de4e8d6016c271b3fa4010d0b446447436223f74dd10e7195d6fae33f240d751eba52a468afdeeff89925a1910fb2199eda47734cc8b7833ffc40a9ae63ac0325632d565f819065d54d759be57918d12430098cb5e147180686ecbe1d645d596df725de801dde121f0522d495c56d2beaffa13c1dcea2e71698eb57045ff3157560d1e697238329a5bdd8cd25e56a684cce9250450c47d56def43022aa4a5fca5ef4cf6d704c3b50d1ac19e7f2fe0b584da858f8f6ba1be82c781de717089f1ddeb59755efdfa3b01555397a9ba7a6999921264bdfccacc79173227ca35365f7b789ca00b550032bcfbc2e800c85097dddf58523234c084c429700b4e07584497cfa672ba54357664e3a9741675ffef14018d2901e093c45345b15afdd75414e07f011795a648a248ae089043a441d7a4a45e9a00b60f51dd40862c5f7a855258108ba600615b88a03c17857b23645a8dd9542dc5f2c74b5fe22bb70f30cd249ff1658be35f57aac40b71e1d5005c212042248cf1ff10690c359e1e4c25320a96030834f88d76642fe3b6cb07d4f84bd1bf1cad09c5b7c6a37ac8653069695a6016ccc00da8c7d54d906fa00e50081d07f783328ca415b83d9841485249131a2a6a3b63e36e380d18e6edfa548dbc34b9f1a04a41940bd35500b688b6e0f276bb9704b8a7c67f5b5eb6f7f61851c6e7b00a47b0428afd1afa17db894e03cc0ffe6326f16c86731d83e30d7173ba9dc3aa20301ea58d392f7bd8b1855e5da2326505a7eff66081bc910750296a0cfb87e0515161822085039a79696ab64d9e0d67dc504220be8f4c8e2473e239b63743711e390e4127d003a246ac46a3d311a76d131b7968b900e1f25ead761418f90b09830bed89e1bdd4d5643232cc8db490d5b171590b7dcff5d95a66764bd0816584151abc02b8b203203fc830572dbddd816c1ddb3ebb136006869bfdb247a8608b45b9371b1c61f01a3a3be85099a9cccb883000d7202f9bea43afd29b7f4b0848cb756e179a8bcc0ca617a127cc7c21f9251a02b54772155a80c36b5db120c52caa597093000c2a53234801326faf0ce493bf0899b17d5b39c59390064034daad91611630a87fd1e97282419d474360015a2b68fb9a5f00db482091073d37ea4d0026e66bb2badcf7f05cbee09077e17e9842474e584252ea067545de8c1cc2a26961c176ed53ab2b0c082d61fc5fdf31840e7d7a931e2a319acd137f351b6188abda5fa920a1a5eb54099dd50a5cdfcd6212be6ec1901df3bf389a27683d0177e2e2095fc1b69efd42665e594028ab26b80a4b97c5b77e17993df735c77791b4ee022b9720d70ac0cdd08d57d69af1fdcdc19e266263b4f6562d56af1541708ea3939c91b156d0b73ae5537b25e1aedbdde014fb27c82dc802654fbf6cba0b52bb55d1688586ff723e9da60d8257b79440ef1d4d5ed67c5fc25513afe51474239d1460e19bcdc46adc4cc5bc94a2c462a1a47d311837be392b54e569a6018a19d08c84de687d2191da7c6885247c7bbeb17933809c406e3cef45decd871355ecb720cb6772d332af771a5f80ac8952f9655588404f834316ff76edd4c06ca8b17d6e6d447d07d76a5c2a3524bc6b0f4cd5dd06d824fea2380cebaffee3a38295c94cc7881a2258904dcbc8c33e9b7604121563d30424085aa4b0831958b96f150c5b1bc2e7a60a4037e1bb930342612186a491df4d0189ef8d4c662b7624f028ca717f178957d5dc73a00a04e761184b771f2f10e85dc2baab5b2f8f922a7e9e217d87a656d40552e5f1f46eb318265d3ca3a30b1b6e97a7582d774fa6cdabc9af7eda7a3c79056a2761174b449bb88980b681721e5c2fe35a1be86d3aad9ec22dd57d1e2fcafaf5f96255d52cf83b094cc8fbbd5a104a7bd4c3be6dcb6ea826ad04e77750e50fed29d36520282864c620d49d5761745391bffb1710928668c4efaa6bff93e53cccab6f05671a26512b08c8dd1da53d8b9aa8b3fab9e15122af5025cd24a9e59fbd40eb3bc13832ffb33f978d2a4721a8bd93425d0dafa6c8e20037ce3b580c5e035276f5a521720cdd885dd7c9cfb6dc2b044e8a290ba00ccf0560a5882c0eee2e29623de24f9092b19c0bb5017203cbcdb37db1180dae14d6ff8affe23415d350f9a6f519c13cf1510db643710c120dd1b800eb081109466b2719bbb6d9b18f806920c69b789ac674e2a6395a0016250fa003266869b76d38c04b16a980e9bbaf594bf3a9f4157224c975b684c3958490d969c2be501a00aa18b696fd389da4b821ea77af7c94944fc5a9cc5e314b9c70734cf6d673646bad9737d63172eb22703be7dd2059fc24542ec06aa7e2f94c01cfb64ce6cc2bc115b4cfda258777011075951a47f076f7b246a0dad6b28ffaf5fc5aa6214e870de161226e757d425aea388b5a76bb80e8726c9b1f9402e05e80d1b702c2717ccd36539ed4403e8a0f40e207501cfa5bc822d484b729042fb6dd0ec02d3240bf6b26e05c9c5ccae90880cb9d56ce4e8d03dd7b6245f45e2076ea92a2822104d225eb1d931cec0bb1c6b3704e7fda57d466016155d44d41800e064eaae11b18579c97b9b5e68fdf7b043bc36113bc8046c8a1900a0758f816d282cb2851bbead59bc0af3b90c75c9a74c4e6bebb6cc2e1d3dd49feddb185ac51b62a3435f950d75f5ccd494a97e0ebf03079c4dc1069a0220991bca6233cd7e26e49dd4788ed821d55268511e6833dfa894bfe5bf7ba585a52ea2921c255d5c57e2e8f253af3edc538ed3b338c73ed57a7d4cb14f1a758c843cf7d601d0dac4d86fe899d8f3eb96540c697642e1fc0496670bac1d26c5b637bd46e642e0dc8897f0f1b6747199a425b28d6982bab040a5ef0e367b12804db82d914b7b5b34ac6b331dd245a94af90c35919217d2cb5ff764249b18f4e86446d5f1404a00c6ab686595cdecde8c52a446333b4cf674ec5f58b9e88f4c19b573d7b02df5d8ef4d6019c82829e6b62155cac7800f06d9948cbe96c91befbcb9e62eeab30221844446eae9b2367136ca43e65d9adf44a1b6fcb834d7b32d915316d8928a55f99db6f5bedccd9acd4bcbb97a2b35152099a62691c4f437246229ab1d4ee490416e3debd6f91a4fc8893dde5a5ea9faba79a93bdb0ee7e4c96c2b96101b8b88089ae4e5b172a9f888b45adf66db458297b7438b365025bda6f779bbbd7453fec061616f674d423f69fcae43a4f1cdb204a1c443a242ca201d3a32e54fd4871ef45ebb69cb5f8094dd9ff22abb76006de72357c194baea1e757a44b6befd4a0f5ba59d4051ff953e141dca31ebbcf84a7f6386954c64b6ef16916f86311d92657b4cfcc08abf4b33a945c63be1c5adbb729153ce58a6864304a06b57d2107ba06bd2c23cfab36b14c6fa2212bdfa31c8f640557ef6996417275e660967255b020c5c24a1231381c0c4086862f456a4e7b7c0fc74edf812ddac9ca677baf3194287f924e5c715d7f70ebb1e212a835cacb32e24e03bca0f1735b8cec9571609a79b7fd58df8438af00ea3e1879b1fee75279e2259dce6c7eaf5b15062736abed55e8d89356308ee57a5d0c876345871b48ef9bc90848a4c6ca95e6a768d7060e81fe6c78fe11be91c227fcaf7fcf887af9f3415add3fe58ec1f386c5b84e99d0423b7c87e6957464c7abee388b414c8455ac17236f8343692edee10319b04ab68988ea8c310a1aa8a6854efa86def15a538613be3bc030bcfcf2d685796ad38188d2d351dc238b2b1e5c189d495ee875babc7c7a26a30f6691f39a63bf581612330496ddc48abba640ff13b7a59f603ab5306cca406e40db94c8f4fa711386183cb2e7231a8a45a6f0e750c08a17f78ba4a79b6ec0cb3143a342e5f6023fbeca60a792dbef73bfd27445a328214a09567ce2d4292995a25c54d20701af867db1893744351ee91c5ed08551bb590ed9cac684048dc0b011529736edefcdb507e14c9a5c683a99e8b2f812a655c493f0c0e53f4b9d155ad79d40f6a172d88bf88e4862da01759573e8e621259ba809ed4cdd8564d05baf9b1d705f42964f4fafed511461da699f0cd02b88a7a162617d027381bfdc20de0d94fbd90e083d8333ffeb30d71ec0ea7d74bb6647845d4ada9449a0ea0cf637553b7ab6350b4daa2ebfa619815ad1780e9e10bf9340ecdc85b9ec7e159b54f90ba2b75ae17dafeaa65352ccad1c4c59325f34bc4516bcd0d96f42bae6f0299cc8b712d86917282945077e3fbe202e785702b00b7f40a533add6ef797d997519f7c9116be4896ebc82a9aff972e8c9c440d3ace2a40ef87eb5cf043c17af9b8cfac130790de7001e3bf198634625c7a7128618a51796e476ac8fea08b133f10310d91975c5c399daee2da2fa223ce583b7a10b7f54f0eb0e34c6229cc8fa4b48fe2ccd2c809f7ff02916c46011e1ae063e73ede881d1a5f9ce6657f1c2a56e67338b00920e3bc5f12b11d59c0449bcc1d3950a72a25892a1ad57deaca4a533cf006945276d18bac5287f5d5cce670120c4584acace53377daec30c6bd37a90ebb43508914ff9a0587c6f066752c5c3635959d0c3683194c183d3531443d5d8457b7dd13957a69add8bfa6faf8569739cac05d031f2227a7b73a34431bf635718cbbba307d6496f5d0f818d2609d06ce4d1153ab396f89ac13c570656d25684821776faaf6c5d4cbab86a989a9bbd2a308e639df6347722997d65138ad706c92ba79a857367082c45cca71ab44fb74b82a4440b88ac28d6822d188fa9e4268280e9a24172cabfeaa229e8ebd5a53a9e7f16cc1e07632927460efda576929f55665155ce711d937b10edf43672eb1bee13be022472591d64734b68f468b7c733d4ece04688250527e1b80cfebfca09f9db8697a4da41123acf3fc92df7552d223446860b21cb4cda39d39d262eb3a55becd3f2aed87890ccdba4e1efeef1516aeae0b55d89c88e44a956ec007339fc5f9154b0f8b7a1e5823b7e11866b8b5f5bef91af2f499e6e632c46d8da98840662835bc1cb10e1401bf3d2ce7c786895d4bedd15985fef5576356bcf1d5d1ffa96868a46ef1cf095cecbc8eaaa5f8e86fa7103a17ef6144828c32ee42814e7bbcf8c51122152881ee60f175e2bbc1fc0b5808a009ebe3667daca4a96c55aabc3eef1d52d7228cf6fe551e310e0ff962faa208cee41b36af0e2ed6b7fa0262cf8d9222a35bbd07595f376989f660f92922b12acac16f1c5247a5a466a5e397b5d9d4f01fcac588c4f5fc370adb4823cde5bef29129915bb7d3a5ffddfd8c95d579f1a30ba433679346697c8b4cca9f31214b5d3d23c9c7986a3c10e98977f31e0aa446a69119c663aa9990316f077ef840aaae413548d596a927a2b3960c115ef26aba294a0776a0988f5023b77f1e4b168e5985254ae8f562286bc3301e03956dc8dfdd10ca2bd36578ab0acdb5ee041b083d047caf43668242caa8deaf6740b42af3013b1a32bb8be047e5af92eecb0798c05d691e210212c59f3fa0308079fdef6b8952f7b87174652b3ac3242c15f56754476e15c77d25dee74119a528f44516d7317c08b9355f057d8704dcd07b427878ee0a81f23fb5a73d5fa7263c7d7a178b2bed5f3af545d857e07643b9a77f2c266df86358b3d7bbd4ffed841f73d95f2086c9f75c6616793a5f8a83256058658e68a467910f1cb4e18444b54a3372c6c00b36803e85f806183fa5419c82ddc24693814cb1ec0598ca0c676ed6f8aa025d38fe084c42b5f3dc574a55f25093ea8a5f9d0019921fca400f94e1e4305d7397cae9af709dd8541d263eb52b19b2b9b76010b5c48f6c7a03a3dd86c6b52de4c4a912fb0519dcdf58785d146745d9e83748c74be0d97735a9469317608893a4c0452e8651a60114dbdc542bd0d2a037544ed07c7712a99ff8dc6845f98ed458c5706b5c6308a48294f582a85580119d45482b0eb8b6e4c7d0ea7ae19fe9dcb8a868d8de2ccf1aa105241456e06260e1a27defe53e31eee8f19c0f21bcf42ac855c779f346ec148836d318cbc3ed719208c3cc0b3d09f2bc56738ca777b1af4960fae6570d8086cad2a7cb7cc30a90d2f939838fe36f770296ad763e720f5d86d773ea60f7969b768244f0542241511b93f0ab55369b6fcd2ac4f66ae5880f8e1c5b42edc9c972b6ea632707c6b7b6597b667182d3e463ea54eb79b570fdb8d751b340eb316ffd508c133a4aa0df5742cfde7bc51138afa0fec2915da986c1ab86a85190cefde3acd55f392ec92b1087ee49c635cf1068032482c2406ef100b5249b4b86721e46799926c6df0fed699016097f9f5f51f055033752c999fa686a562ad5ff332f6b30fafe99e89d21a643ef6be1195f460f7f8c5c3fd4b09e4d247969a9564ccd44cc595c1364d067b6ff924b6058ae369f252a53f232d671f41b6c4ac971374cfdd410fc224812240284eee142424b2f29601be1df6433c5eabd580177e4ad8bbae953fd260afcb37fed308940563964a6f4ae88ce3d0fd8016a1d24d166e9ff99f45fb1831ff877d666a433c3a107d98eb28c169790138dc8b87684a9a31dda33f0671b68ed3a20331019f6dc0eeecd18733da09c1af4c3517b3ad8e9bc853f117bd5053961492c81c066ef745aa369af86835440e6844a180e53c364a5f4e0d04c0b9f8652caf693a42acd78783805017a48e7863f64a574e0a042e7be51fb1977e17915e94d87391811f2f34cb50d8c98ee24629c3a9415739a36408e4aa11c2573f9c2dcb373728ea1c4f0e639ee2ac7b5fb040643b57bce7f9db305c0863e7efb0540e5ed7c2a55eaef6649f8b47e0c8b4c7d58eb4b5f2c4e5f4a3f04ca797ecff8fa3f26de28e572e24259a6dd667ce86d3fab99bbe2aa7479cce74b022411a57f8f5af9124467f1b9e251db5f51d4bfc94fe7364d09aeb4941e468dc05f5e0267550874e7e3cfb14f7d9302aa4ce15403a5be046fa8a2226379ddced3f8a8f09a5742fc1f38d46ef651d493d09560ccd8fc49f995a9dcf1a25027a5718e51f0937de834383971c0e1885742ec1701f29ec6425d41c7ccbdf54adc283942c36dc9339c346ae7a692e5812c12b7bdf15431f4575c6d31ea28700eaaba27581e7730ac20b273ae6ec844a4b48682b36242a6bf766b55da97ba5967d841bc23c50d803af70991240fc7c877a7533161ca8bf82c788aa0ed4f6307baa634e49ab6b31cf72805629fb06de1c9992a748c9cf3a15af3b34e7b9c8da5a87872cbd690cd986beadb9d327ebe2c00c3a3bb854668a90aeb61ed13673ff562b3e23ad1d489bdbc75fc9929c2beff5eeb11d65283964688a75c9f8793bf0ecf30131be1d3927b886fa58365fe0e813ede9932b14c83533978be7e3ba6e0a2db6e981e8498efec3f660f8ee90122b42d4f5d51c19cf1aaa43055e2f4b871f33d87f53e78aa2f306c3b876fa6701042480259993235390c0163e48871feac989655806b8622af6c62b0d2003b4361b44028ea0a776bf55790b52e79394906b0e1aac2b0f551cbc2d92ed614650521df15e338a5de213128c36f544633fda3d54668191f401bea6a7cc136f5530c709b4ab52ad528dc6c3af40b5caebe446c5ed7fc14bfeb1fb5c93808410000640d092f39b3266ef51a145d3dbd382d7d24654ef345772fefb8098eada8054122ca700033d023d61d3b5d496425e8658929e689376d8946686f9c5b71c9062fe501bc7a08ddd57675173158029ea9bb8b056126d6a59b1c513e99d9caa55018c044af783ec221867a795c402a020abce79a57a05cf116907028c36934a2f56553df168158e513ff8f869d30ec58b9a08e3efcef7293df50527967ee3b50c5ee043cb65f72bf70e1f26a2ef2429600edc741c90a0b1bcc10de7daf1b9c74756404ebd787b56a3cb13ca0c960853bcab212bd718a7360edbf194dd83bb8ef0b6a6c0aaad8e913c5616675ff3da136816e7532329d689aff77af15f0d59086031a09356c709906d65eafb2f12fe83c678b56c41f9f781a52611583ff09546106917d65682a6706892245920da225a2dbb33f3860d105c484404795053a04b594a59e084e5d4fd941fd1858817e275090fb4053821e7f39ff7da9fb4e82061fb5ff316e414a072a0b6289c3d4388c24df0fd7d434a2aad30ccdc17e6b5edc56f9804e741683ba2adc5f0d90a36c3c3be006509015f22120b6d305cdfc8262e9c6a7642651338209aa9af571bbd355109f01bd1015c69be2c5083e14a8428208273f8f4b2db9fe87f5b62c9b800a1755524a6170aa5ee7cc17c39a4c2385efa09fe17cc26736f5364aec75cf13a3209c9b31dcfd7adb50c10982abb0f4be03207f3d2995c1b23045d11a2c62039a670b63f41b6c00a24a12cd25e91f290349c0140ac9e8937dabcce21c2090bccd6786ef8d3dbbe2593d25460a89d469033f615d72a1a17dbdc7a42bea75adc0d1ab484fb4025f57a2de6c34b712567a1dc86de07e734211f3b45122dedcad729548e9258ce4b615f1ca52f4124ed9703bc4e4f6d18ead78a8d5aad24196c41dde38c900ea6b44128618871b048a946ccadfba955fca52481368858e27f6ff4af29de950c5c517df93f0989988a3cea728476a83516fecb7e2a577675c8e03624cda6773eebddc72bc5262cd61d6317d47ab09afd5f9d3d8cd42d084940f5344062f942ddf578cf92e9a819562c74a41d70b83b6365db4db11941338f83ad9083164320c67348c4b8f1e4c7b0832986f126fa02d3a92ef31b8a5d0c8a39afe54bc600095f774ce4a57752c0719130a2fdcf130a8d56a9cb89fcc99ba5a34bc9298d1bb34f451246a508a76c0ca99eca30ddbaa2499a6b256e68937c213e7bd5eb3be7e2526b113ec3701fc3b047ab76bbf5a2092aa9a74b9f2483f83c68eeb08c0ee9d57832f8efde2bf2eb7e250af8de2f7de81b38ef4df735d771f0193078c78154cddb93a8c4391f97557616d00073198e83cfbd79cfeeb25441c24af60a2dad65a42a41142c8de5bee1de70b210c800bb218463b5b9e110fd593bb8efbc124f556bbea8f1c4fb08c47ae97fdc8f53cde33ac6efd30857ecd2da9c7a92f1ce590e40827dca0e2c30f104f1c91c3173bb0c1075694f5afa6b47b8e24d074abf6fc94f72e3b607a1816e06e0b1e1ca111870ec0084246892d6400e2098837ae7497c471c9134989534ed9002f65fa57ea06f8f945638373b1d838d2877bf71eef3e32e870f738affb29b9512c42f3b66d1b6d0a87951a094dc7dcd495fbabe9ea2ec4e10c9b40d32d3a96809ae54955f0e14a9f92a112d8bee7de4706fb4b8a3aa4cffd468a45689e65575e128739969618b3de6ff5bb6b0d88862c48342b9422d1aa649abf198a39df59d0a14f84e104122b4ce288a3fc725aafae0dd38065608eec05037c9a164f15522b0c3ced502b157ea0d2d487334820dd6af5144961e6daba2c24386c02cf3009cfcf83e3595b5f7584efe76758e729fd5bf42f7a1a7a1bfa2b7b6d1ff2ca171cb7aea7a7280682640ff85953e094b7ff0ce5e4ed36951b8bf4e4bee3cc1328527bc82b37d95154774f34ed6aefc6cd1c5a78fb3a9cd9058d0a3494460c2ca34454895221226a2217b77d5e45027597f8b825b3a6baa60ce83d117e50b49093110ad4b09ce6a930204e4ba903008fedc232c0324a74a567642d9a8d86868626876736cd273aa3a1d9688894285175f5a9d16d9102cb6872f3d0d0e04a5367c76d530712242ba6e44fb5e5a46669cb51b457596bc99868fff03daae3ed98ec51fda7fc4f694918627825c3f8b2d72d67b97a388af739d5b55d1286580aa7bab69f528c158de05e6c320748f5a29c90eca1e577f03f652cf5f04b8d333196ba2a7523b3a61a4d99ed2bb1fbc4a28b337a66ebbabad433dd30119866b3d911284ae4edf5a861e250de5ea55c29b7d7293d33b718a387bcbd2af54c4bde5ea9f4ccdc428ca0bcbd326def38235b88019485c8dbe9ec2ee5ed41e4ed36bc5101082b232dad6892b7df337a4684bcfd9435bc9989e155a4a8434befb4f41e3e27f570fc09c95babae8d665105fa8954ab9263e86c6f52902e2b1112983651a7eda7dcdeb3a605d5a16dab44b5b6bd266daf4adbafd136cbed2a25dd5ade6e8b44fad467b9856fb98eea29d227e553144b5d458af4b314525ddb7d543cddda66b955a2edd5687b3dda5e6baa4a548dc24ad4ad6d75fcbeac12e500ad4891e29e595367fa4f991a95447ad57fca9ea5bc3d957a784ac6c2abc89e5a237bb6a72a9125f194b15f4d197b90fc6c25cadb2f53edd0c90743cff2fc8105ab3061e3c499355cbebf375261dfaff7fb3b9b5837186790656318dd8b265f72e22b30f8f0ef41fda93efdbd4d7fa3389f2222cea7fe53f6cceff31fd95334c9d8f714d9c343e6a0489c6e7df4456886613565e8bb9f661463e0bf83e44776a318fb8e4291b3f65775cdce4add4ff7dd0257d8b9fc51907b1d5f234d757158b0ac45692aac92223dcaa6c29a14292906015faf131e45fa903e453ef5204eadd932f79a355de63e1724b85561a277d4abc2448f14837c575d277514e9837aeaaa54575ddc7d52ff48d1238bd0923bc8067e96b55a13f68324071d4cb1855192175994dc5f133642134e9a4012c30932844aee341336938684e0c610909041900c4aee3613f6335322891d3c81e2022daa945c8a9c2d7009aea44fd1769fead32dd43732d60f49d1fb7a14b7871b2906015f1f0bdf62907af0b17ec81d1c4124f0f641e9d6ab358648308dd22dee1d498fbac53d6c02d76a5f2cbef9e3d59396d0b3d92f51231e3f37f0cc9d67bdc901f248f1bee792dff712efbfff9434e225c520a87b8f5d32e6fd237b3c12ab6480f194b95f4d992bd1ae481ced6aefc6751eea03c3940aaf5a5c5e409849040ca561d96b76bffaf57ad5ea94a3823142dfb3ae8c306bb6933065e8efa88098cb03a697551a8bfb027f3abc293bbe27adea7a4d19fa4fac21155eed388facb55a5292acd25ab3ba78a8bac0b2f95469404b86e841c9538f15132ca346d4a81a194d1a547db45805f80166092e971085546629816595d67118b35ae98c9e35f55d57692b9d65ca508eec9a346529f73f112c4c16ac595369349ac581d25da37495d2754a4cd0a8c388a4b5995aa9d1e81b88adc40596559a52a5518c592c5aab5b00e851049655a6ca5499684142433f441803cb2c1111111151df2a5926db1480710a2cb34ed6c93a5927eb649d8486888c0400002558768feed13dba47f7e81ee5fe65ba4dd7e93e0d200054b06c9bcd66b3d98cc8683bda5ae0aba563c22a6dd61c26ac3b775905a20a4d998eacb476f5bbae80d20e304ba8410c204421952b8d0558b6256d495bd296b4256d49b9bf396d4fdc8ca3bdb8b4ac60708ccc66331fb23d986596a441dda26f7141b76bd25015353803ee0ece806fe509adc032eff554e986de650996b572ad6d25d7b7959e69522c4273d7adfa46b7840337c6e8a20d368c6c984a4330f1c4c60c4f34214559b777776c14ea0ced300587807388b134069230d460228e1d504421441543d850050f65fd0c7358e1114c95e8d2844d30948ad6600287245cc850d653a609fb71828518532c2186164b63b4931658b02c6f991ecf1a9ce9597731c2f333cc01aa240dc2009e359d3465e8e93f150ce00f9975ca54b4f37da567ac6da78da993e89bbee99bbee99bbead58c9f4fd446f27bea450a634dcb99fa1ced6f9eb51466bb9299e32b36bd545e98c9e0ad1a65deb5eaa4ddff496de526a9932b54b9976cd3add27749600f6aa2f527b1e91922874a6330df39cea4da83fa11ea761b3569f531feb1955aedf7192eb5fa0b659150654f456ae40640b81d9ad1eef26aa40ca66fec91548aeaf07524f42bd09f527d4773330cd66659dcd66b95a6a83c49873ce39e79c940ca70c51f66620c34835a49a509edff244aa25d58e80becef3478b1ca2814acf885d06dffa0ff91e7c03eff008b927b2a217b7969dee346cacf1bc702fa4610228ef89c0a6d27d8f2adf5320a07c4f693468eb571ff2e561e125d6d267f9a2a9c9ba75ef7debfe754f736f736dfa7321c294bbe7d39d8379f71f6af4ba518c71efcebd1b3d7272431c133f649c536e993cb1c8c28a5c8366cd4d9a321d44d61e60e0c0b2667aed2a4d980e26652469e2850f66104dd8fc8114248288228b92357c28fb344ca1f3b7069e5d87318b2563ba58dccfc20ca960a84e81fbd366950072bf0e2965982d27920a9272ff4ae9196ac31d9beae27468aa8beb1aeef4d2eb78863addfac81e5675b54eabba389d57177733765be6e8450ee692d433537aa67f951a2680b27f977a6622255192fbf78c8ea3ecdf2a3d3391685041eedfa69e51f5cc445232cbfdebd4bf4f0d9b65a5337fb569ada9ea1d85ba478631cf6be566751c7731e6bdfb4f891a8be83b528c75471d45f6ccfa53fe945f531bd120a69aa2991dcd2c4897b78604b6b31a21b820aa0555d84fd9b74276a8c25248627011342bfb96a8c266eda8c2ee1b4f43b3d96c76a4a465191da24377a95ea60a2bc0186dd4c06856f66f5385fd5c11479f4bea73b25b63e29672df1661d9ad55d84dc2f8d69c30ab4325f859568372d7a07e15ead7a1099b2fd8a10548536c1083184029fb9568c27e7ef8e2063afc00871f08f154f6ed78a574ab3665fa41c0f495c453665e766b9cd3d6ab261fedca438417b0099681951a81c15aa5c940286d7a7a1e600f10ec01c7d0b01f40b26c3699a0840420d982b709a3201e663acce8cc8b26fad4b55a422809544c787abaad7a021d816e5b18338d26199d0d71b57e80b2a68bfe5d0bbf6638eda28f35928c0e35d1a7eab2d233176316eb6f6d74889650ffb4c4a9a9555f5ddd8b863ed11166b3edb38dce5a55d817c62c167d026252d2e4f46437b26b24244c59468d7a46d64e72cfb2a71642c892fb148a18b3e576261bd99382d2c8c5086a8ff3449ae18a3ca7cd2d2f84707af20228e060b28037669061072596942146497f85151ea03cf141065a0cb01967d4a08724acc07244499f62c2cff478c278847ca0c11220a4414589929e356126d0c10f3b28e5608aa02c25fd27ece7092fc20843c9164c8270a3a46f4d98112082c88110393031c550490fe20051a55d33e30061a55b33bbec8071873b2c6365abc51161105169e2830d5a94f6255402cf52865f39d0aef6821b4bd491ca5d4b0d5846999cf44ccb7ce47e37a7b4141f93c72cc13547a0059823d0d30069184e9bb035d117607a19e5a8135d8302813251261fb06c3a51a61c7f8f5184f318ebc5715661f5f6462a8c56ed85cc9a2ddb1399359cb5ff63aa9fec29eade53af7a47c6521781ec691fa3ea3dc6d4798cb314c759ee1867a9639631341473ea678e11cd666587df31be5cc7e872d6d8f29871f51c233e37b2304b202097af0ed472fc3b8a39aab3304b552a070808c9cb81805c0eb4baea402d07c24ffdcc66a9b1e565bc6a74195f66a91a67f93313f202123681ed77804b606a53f0f2e3758b0abef9e3c3b4b666cd56a3cadee9eb5d8af03c0d7380e8bd4e31e9db349e4f42cb22f13ed6bdaca438ef5364efd3efee53b49131eef43eddfb1e294e52bc64907ef758bf236775c5e8b9fb70e4acae8346e0beed16a2a929470d355628c38a953ad414356bed70700b13583697fafdd4afd58e8e647389287b493b3b750805254b161a0f78306ba30d3ab4831de494c1c44304b007c84304b00708bec01bf04eabf55a5fde88abab6d685e34af97d744c1cf0cdc9fb7836c68bf85ddeca6bd66c040054a413c29d1441494bf4983c013896896bf4985c0138989d3cf07caec6d08766bdaf195bb7196ac59335fa64ced9729536372ad307384d965576998422adb2953df4206c6b91d9f592d1064bd7c30336019ce785ad00b6f6c1fec99d07e86ac0ada7a4ba93d77ee85450ffed8b99addeaba15471c4a51fe511458ed246badd64be9806967b93967a6b5b5decaacb516776b82db25471998adb5dd1030d76aef1b9fd576d58375ef68fec0fa39e78a874a82ddaab54ebc92e26bb0eb674154f6b85103d98ed976ddb86eda9a2bb891b60b51c81185edbccd090f758d509ffdc0f96efbf4f2f66a82396b68fe72db49beb4ab55b9ff92238af04381a949ceaf8b59b9ad7e4678952752126b7c4f306a074c9cd103a424c2f85a80bb3c91928001ca0638cc1329892838c0a8272812d324987c76762d386a57f71161559e484908a1ccc0384fa4246849ccbed9e12533c83296151dcbaab80d656df8e2bdbd00515e3761044659794544df1354f7048ac9c739f1e42d51226e5010754b66e085a289c314082adbc46ceb30ad814b7dd13c49ea5eaf8a458f06bb0e3b71e4c4094e24b56bb298e4de91bb4990bdf28bc6a88a9195faaab0ae33121242aa93a0127ee24af74496f0a643220835fe3806bb0eb36e9e48473865d95b70509b95a39bf781b667bad601b62d5410989527d2ec06d411f86a00e10c213047c61578250595832980c0605113fc1d815a8263f2d4220e15d880bb3cb58863868f079cca538b2160c9b257ae016f796a31841fcc0e85239aa837f268568549037718e90852b679221db1822c63d5ae179f8c66fa0f57d726a35ea6f55fa6f9bbcf9f057bb4b936abba9ca64c0b74362be9582bd95597ad9ed7dd5e75f271cacc73b46fbb7ba5444a074cbbe6523a60bacd39e79c4df66d78d37faeb7d6d6dab556cb62d1aefbddddfda96076b05202d3570ab3033c51a9396526c8430d4de1d5d9cd769cdd6c6edc01b9ecf6dd5e2fdb366b7f70f5dbb6d56f21d86ec16e236520f7996536f776a416e07a6e725d07aa20b3f9ca60f2258780d992cfdc103e253d43bb879ea113e9081d72bf87e81954eef710514d92fb2da5937a067cdfdcb49eb2208c2ff76d2aece70934ac0c418826577e8043397b6045c8061564f1340333ca7e4ecf542230f75de0a97d2143883c91fb31f44c8ace60b9a3424b888ee4ce03b8220658664c145501a324e20236a080a2c40d38e85076658273777a46cf3035e172ff484184134d9441040e31002afbd4a9c22460830ba220230d3268f0a2ecaa44ee9f052b000bf024842b907c61058d2b658b2103a02294663a50034a12ddb5a12732d8a404c1213332f845068d58228353326804960cfe47cff0c8e0bba360a6592977b9956dfe42b0550201f2772fbcf91ae3a11a66c68c3a2abc418137e0990444952ceb5a115764ef371eecc3e2542b3bcc9d91b973e10dd7c2546e1d01f26501937c7fc39b3b67ee6c366b10d6b58e081d90d0a4944322f054ca9666da511ada4da69927d8530a28612061832ea894c144025f1421861b528420a568c91132ac563398354dc414b9be864a68546ed0010c296578c08d37ac3c61c48466032496e80087b9832402885c2f0609bd294b06b9128124b70cd144aed7818d38f281e618c38c5c1f13ded499293abc208a1fa8000bd20384dc50e2055210d2b0a11eb1248a1d5e28192b4892eb61c29b1adb7181a7be03316b01598a2c986aa0023286c8828bb2b23106176470f1c312295d94d5885c6bbd1767c50376a167e8776ca67715de546bdf12de58fa431830c8fd4e88249080b8e23ce41946eeb784aae43e9029ca3e093444e41903a420d6c863e43e4ecf4c242190b24b78d34a63e4fe093600d11995fd01895c8f5daae0260f6ce4be252a310b726f81d4430e729f0794b2ffa315449e5de4f6a14a7640eea7c29ba661b14e408403cd0c2f6a3f68b2b2c408204421a34a931b8692e061f3bcc02c1ea83021d787e14d7599820716f0c87db06dc8fd1392d028aacb62873372fd17ded420ec700318b9ef8537ed860e3ac87ddb85376dc40c41db54d201885cbb977c9c1f9a19496890e4c91430aa4c20485981129619baf021a91661040d663e0b030766b532a534084b2673fd7540123304d1ea9a92eb2d2b690951ee9fd078c7051e5236840b2c03c1979a3c63805c835890d9c03290c5e33954a9c9dd87e3a3f41d434d9a35db0c29072a7922e52094659d13192907a2ce28d30be91931cf0fe919b17f6fc526594cb81229751d9e9568bae8bbcfa7579e737e887c9fbab5cdc89b4509dc238222caee3828bb43e9d6ccf439c2c0a2fdfc3af08dae2a8d754a4d6a039fbe1bc5fe53855d37a68bfec8ac864c371d829e2a6c96b31a3465c299089a7852058a22bc4062c30a60b0d1c5d30f5868559423abba6a92ec3ec12853d06c363b52a9d0d7a58681f4b50a7db5529dea959e99483818651a667a3b6b1858d2db4a8f32a5df66b446a352826020c4c5501799be23a253323d673443a6ef8e80327dad8a4c9f1425d3732cc8f49b52b74144a6ef36fefa8bab714975284acfd4926ab55aad96a4b4546baac2a69653536a72eaa006ea19590b35ad839a466b1a6d5a1bf50c1f05bb859e95b4a48fb901cfb2bb6b56994e3add3952eccf9c8e14b7a04d88de277b646b36c92ad925cb749dee534dda8236a16da89b75b4a14c3ba14cbba04c9ff2ac4ee919a50adb664b2c7cd6d337a24c2f6bd1a54c29a54ff7a95bb42665fa9a5495ea127d65ea620634e362d6748f23b833085c91d294d0e8bf3a8e60c8ac0281ca349b654b8a34a8872ab9c759250749111a42889ed67a46a443dd5ad22df08d217a7a44894a6a749f32a5bf4fdb6ca3d16f41b433da5a004a306f95e716234c57fdb435e708eed32fcb6c9e29209ca866cd6bcad4d7e3093bc074d5ebd0d1d282cab21164a95c574d302a93238434e011727dce0e4fbd902773d6f4517fc2b6cf09dbc886d2aefe2567bb649fcc25372d59b366b44ad5d54648607a224666b42021224a29d949add44bf6c8d6ec52eeeea3ae4d5817c5072966c48124861365bf93262c02603c9941098c2c51b451f6bf0fcbd1ac69172658d646b3c6de3c916e8892691b4d99a66123cb7485f8e67ceb1dfd9cf3489334684003491b475c006b218aa30626357050a2a29cff287de34706b38ec1377fc8ae51ee589df50c25450bbe81fb1f165c67b3c6d61a262c67bafa35f45d6bc3e84bcc26237010534987dc16b041eecfa983dc20981498b04fd73c6ee3073dd1c85d2f5e9adce22551e87cbb6154084c5389110c2cb51802500fca7e5d42e4e486a1dcaf47fd6b2b4e8575b8ba6886c87d9b15e47e7804bf9bd18248e8999c595369342c4257b366667a70356b68ae2c74b9dda6ebb89a3234d683c3f5e4fca7a43dabe354ca5389d6681255a24b948936f553cf842a8c5eda0daab33b7485c82ed6d5205dfe1ad9fea87cac4cc39b976ecdf9f125d7f06656a04c1b851aa6d04d7aaf4d4d4bad4d893553d2766bd2b1cb37bca1bfdfd674dbb66d7229190af29c32f3b549e729bd0f55ba35f34fa6f915f69ab3bee60c7090ed4a0520a4e48954a54996bdf23cce9c73de66c2660ea0c0e2881c38c1b1c4ac9cc799300b5439230b1a13496a8852ce4fa59ac5ec145d35c1f493be33cd1406d4539899923138e030cfa41f9ce4d9349bcdcaa7d96c56a6c2c900da55d304daab4cbdde9b0d48bdbe9b35ab26b8f63ffbd1a679eb689d0a9dbf7f3c7a467633f89a51607d9851240b3f2b303ab2c60f484564d8a09cd3151e3586a30c8502aa350e0151f8d1adfa1c53c8c0ec05e3cf8ca75bd589a44db98660509e004801fef1ba65866ff68ccdddfc41a6b73dd3426770ee53fa17093d8325537a1b9c1c6b850c2152cbf431f4cc97e98dcc6841af215a339d02894c8d2aa574ca5117d9bbf5ceb2b735a6dc795db62f28398e934208ac9959255b06e42b8515f94a51de7baf1447f2bd3308b8b156a984a224d7bf40c141ae4bb9fe2da022d7ffa86f451194eb8120110514d90428a2e46ea6ecd1ee061cf23ca69f5db8c619d9debe631dd32eec4238287d8245b6d99eebdea8f509274b3c4146b692ed37566a66ad135c646b9d78ca1606a5b5465864db037b216059f732c37a931bb2bdcda2b407f10b8fff68016162876c4f42cfd024d99ec6049b1356c8715244b68f6951da2660d80f2132836c3352933480642755b2ed4113cab6668be46405760e1dc9f67489452a2223db69869151b6a7507a667291919a7823dba97463492f82b8b8b88bdcaf333d43c5c8164bb63fe186d27e859ea9b7cfb1dfa1d9766db99865ad3389dc1dfe98f8ecbbeed7be0f8fd7249e1d2137e3ac725a503d759d96e3eba89e3a5691222a09276787a7c75774bc4d2709e1c1c9993533af6e777cfcb645041d3667856e250d718ba4d0b2c7e9161e7bbc655cfd232d471f63ea228caa8f63d1c759d61ade783560d92bdbd0eb78f040adbe8930fa8857ddc7e8531413afba0f8fa78e9304268160789c9cd80ecf0b4388c46024fcc283383dd0802409492f9c2418bc5f1499d3a3c74aa745ef3efe53f618f157f73c32d6721f648ff896f7f84ff9cd5e7997cda40ff59e9e91bdbceff38ed330d12927b6c3f3c29096a729997e28efb57a0f3108be8fc7f07d903d45a8f7207b7890a2f7fad4f15164ace52bb2472445af3ef5beea2d30d731be3c667439abeb525761dc921a67a9ca2c2e75ac7a4b4c8e6ae4214267b8e9899672c1a12121e9a57aea40abe3f2b51a73785237a99550ddf284ad3637ecb47b264049ba1297aacf83f602d15ea5ea4970b9ba7541b2c3b34aadae7a6a458a28515cdae111428486394628162344767866b420d50e1acced77782a2ca563966387c705275d47d4a9461e4f8de27b80e0c8c22c75bc4705bbd10601ab06d464eb79dc01a6cceb55e49222ea02425a58c2c1ced2bd6c2eedf0bc2084480c3d33205ad0bd27ecd87f4cf0bb5108fe6ab562c2e4cece94b19ee755504491393cc477ef310201b1bee34031d771d38d31145652beb8e4094ef0fdc78387e8bd7cf40891601a1296441ea34fd1bde0d6adbee3b1d577d4afee91317c1d644fab2e8ea9ef1857d731e2dfb1aa1eab57fd92b17e8a35ba3c666cf9f7d1558e137888cc829a684276059c6ed94ba14c5eb7246db51ba0e2d1aeedf547deceaa3015f9aaafb0d676ec6284c5bb89177fd5b2e27115298a77a34154880e759803249e8748f3c6e33d6ed3df9ce52c39aad2f10de69b8f6fa96ff81beb5b8e6f5fe0ee0c1e176e4ecc97685c0f24f5aa23e9a7ee437c6ae4711f3b8edf0301ddb74f0a9bb4266f9f14e7eeb29945de6e0d9804dd08430c5366ebd1fd2345ef356bbe6f3fc084d11aa6e77de4147867bb0b3cdb5fe89998bc5d88134adb288a46a9746b3bea556194d66db429b3ddfbdb0386eea247da748f1d07621d1f27a7c2b060224a1bda4e83664d97b79a0b2761aba40979fbb77282af0b0d8ba15ddbb72c55b6cba6151452398629b37de5047796cd2b79cb45c420e27b5c87c77dfcf6d0adcd470f24b88768213147e491a3faccb1944f3f75714cdda75ef58f8230d85caf7a0bfdd4778cb3e45cde723cce72053386cf31beac8e3bccb130cb1872a341231daaaeed2d2335a2b5595dc6595de1b8515ab7361e17bab56de510d72e627cf3c737e7ed96ea8ec0e27de799651db5e1abc04f89c5f5b7664d2ad3032c20d3935f08033c6d72782a0ce867d6a2c1a930eef43bf3dda22df247b762b04da45bf4b735917e05fa9d9e357a9a443f893a100a167340f0a2ceb79a97bd1f9bf3393da8b580d0bfe869e84d68d8e94fa0c7e99955a65f01c8f6246a926953a213e9167ded0e84ba4781d9c2b9e078c749a9117572dba834be39dfcde379d6fcccdfecf03c6b7eda7cf3c787e2f1b1555d17cbadd9f2fd5bdc58df5da7fb1de953e453b2f2e58e7a857d0faf03820f41d207fc478adcbd2cd6fdef5bf7af4bb6aaeb76ebb296e0eef548bc599222f7fa9f52e4484b43a6e18d9853e9d8b4eef5b1ee95ec29e2ce9131ef4df6f4bddbb4c875a3c86d4bba75ef754289ba759718dd35bef9c30e31525d5d8555ee8e33539a1022b3e6cbdc8d54583dd7e7382e051e759def29d2a7fe3b8af4298a5552b41f296e4d8a961483f4eb753e9f129c98db0e121183a452e141d2077c08cef2e153a4b8b15a2c9034424488bd4f7d7fa7b14a8adb414bc65024197b55977d5d11ef674944bca49032cb15d0d2129a96677dbf0552f45a409162478add63f5df634538ee428818a1334b4be0f2bcd89141eabfb750df421f45ee54178744cf3a32be3b614049ba520544a329554fd2952956996a95a99709034a4253ae4eebca97cf87b301f3733240b632814653ae2e73c9f396d5f2794a3279a1392db7e91a0f4ece934789b06e6f83b35361e18eebd86c70c813ba55eb610bbaad91555d2d63110bb38c196759af1afb312f5bcba4b52e06a6ae23622396f63bf62ed8bf206488918ea98926519a546140802401a140ec9d32d6b6709f61118e14b9cf1ccb53c6aac6920225793969026429aa00d9e422a3489bdaf77d36382be4ecb8f0829021448c7c28d4c17f36dd52d22dfb31e9d331676442ebca7e6aa4e124af9286cb266b772572644ead0d04241e1f68c7c37fac5993caf6a9f7a8faca09ae59c6cab6e53babb79062b71373b16bb94eea2daafbd4a7aea3eaab3e4b7184618d2ed731e6f8c7c2cb838457cd32f4721c080806e8e540e1558f19c5ed2d9fe5eae2f61b8e3b428cc08c339c72d109affa1d755241525f913e453ef8a92f84e1a6e394d0a06ed9733875154dea9615b7dba74671236dba6543aa44a7d4681275f2da054b9d95148370ffaeb36dffb6fb7ccff92e8a3aa87f341c618080fd4dac5b34d3a628d0bc43b96fa877a358ffddbb0eea1de9d3bdc8c7fbf759ceb21b51e3eb1b6d88040f11d2ad2ad3c916f1cd701603e9d6763bbe469aeadaf0563798fdf6d65fb3a661f52c3ac34fdbc6b404c7dce57d590b49ea314712de258614ef63fe53baa41ef358ea3135dff0b60b109ed545535ddbe7e65374efe3f298532e874f3d169222f7f092311752e448314848c6c2d787640c1278e6db715c77336bbccfdf59f37d82ef095d0e92b1d47b629e225ffe8d3473f91b3b27fcccb19bef3df6a97f644f7df82e7323cd5cf759bec48e6cbdb8708d698823d79a92a1208b629096a71e6b798a14bdd8eaa2173ee631648feafbcd95862210a019756fdcf2e7a13e312775168abcfbd8a7ae13923e6210fb98c7ec6348f17bcc6719ab173f520cf2f298ebbc3c86f4f161fde53a2e87390ce9137397cfb21b5134e42f06862210380c37e0c51cd6455127e628708ca15bdbbfd148b7b6a35eee729b8e19c5ee309f256b143b520cc27a8eebc41c86f48179cc73903e453198c7dc27c7599fa50b4ccc4b0e16cc384b2e87b7e9edafd1a6bab6afc69cb1ba5ab6d6b66db6673a31887dea31fb142976b17ab1238bd08cbbb5dda6439ab7b75e3436f6f5e00fd778f6cd1fdde73f95e85284652c1e179160213d88b490baea3af5dda3499fa29818eb51ad05d9c042ec89d81bb9ef30875e32c7c7cc3dfe8530c0aa985b1db7301596aab01cb7ac1d17d22d4b64481351b86b8ba430333dea96bd10ae8e453ddee32c7d3c35f6788fb4fc688ecf82e116b8eb15e5ae8c3ad111776b889ee9000c89f6b4872eedb5a74f76896c7f5b1516ebb0452195633651607a1b7e9f61918f143dfaa1be8b281285ce28f0421a46674a335ba41988b2bd9186c5947622cd92c8f614a8d528ed445aa2876c57d92241b124c3668d0e35f88537332c92020a1c85740b4ab7ec51a92c64cad8874f70b705a6a761c7c22cebbf1d6112a62b27d866186c96b5320ca247e6f8e8f1fb3a0201e978cc5f613c2edefef33106329b67cbe69cf321d8bad61c7cf3c7b7cd52afbbdb293d475aba9dbec910d06e072cb3b9b6cd94c681411ab616676dc7cd7b2f08e670efb577b3d6debb61f1d281f8e5e588db791ec781f7bba87b43ef73049024f3bdcdc0573b7f7fddd42b7c81af4b6e28723e6ff6dc76b9addbb64b4e5be525bf70f7f264ea42a698fbac81a49452d4272d813bea258e113a05dded23071a5e40e68d7ce33a514acecda906a73a4b61b1b6abfc6044f7ad6e8054564a94be006d4782d6821bd762651824248831867103db0e2400194dc818c21a01cb2e71efbdf7de6b4f41dc75f69786fbdbd40ec4db24a309194d86802300ed17777614d449473a1c25c1f4b0e486a0a3a33bfbc21bee5edab71bae9bbdf7de6b618ed8976e9d9083094cefcb25e7cc1ddef4b76b375b82ab34c37d0b9c1596a27929140ac519e99ee950d4feb9e3744c49038abcb57ec911b4b2ad59c06dabadb618350448de72d86a8731ebadd6cb142f1d88ad8d39e24a134080d80026280716a3eddab796e33e30b495e4c9a10abfe73cae1b69ae69bc50c991038c0d2a317ac82af5156e86c17a94ed73dc807b49b6b48cbbce565b89721db2aceaaab7afb40afb6ec959ab47302a6075ddc6aab42cab491fb9b5d000d3ba2de51a810ec4bd441080ea513d9adccc896ffe90a926992308cb6e50a643b89734518e1c30256543b8bb714b5c12cc0d5c12b71406b61dd87594062878c0257149d9768baa8668a8f5c382c83639a78cb5736b813032a46049dcadfaf212a270334c162f1d88ad4d401053d2c8435e5eb2adc9e84f5e7283cf66d9244515261d0224ffe48f8e32f1759988bd2c16a199c97d67549ee4fc56e8d6bc4dd5b94267db428823c7604951059ced53d99ed0b467db6cf1526b6d2246e88c46b7ca711cf7bda25ebdd7eeb57e28afab9bddb66d499ebfd4499eb7e4bc4d2f51607a4b97746b7ea85bf3ab37eabdb75611bc9188113aa3b4ea9aef68adb592f77addedf1844dd8766b737678845417f95d4a7b8003df1d708e1d30cd1349061ee41a046ca1f00196cd9a932ceb3617602e4f24a22432d82f53a65557f0241ac241c782af03989e9c304a199527d2153ec8b22e5f51cb57a471055387e40220983cb1705243bae209a9466ba3f0f37e4931d6c3fde2ff942dff295ffe53e6f84fc9fa4fb9e33f258fff943dfe53a640d437528c6defb6ff94aaff94abff942e3f65cc7f4a1dff29451511a6e731b2c41147d931b6ac60d9333d6ba489195f45e01c230ecc6803845fc69d172b70cb2884e7082c9b4c4646222a2ab06c3aa5c254487377874316d6508c1a353c4d245a968c4307d29860199dd120aa3202cb68101da244d5458fa1e07fdbf861712ac18b27b5f28eb3a4533a8896d0a774ca74d18ecae8145a49197e4247a0a7537ad633b20e829d52a14bf40c5a853635ec459de895890494a5816a07d1b7d01326323d95b2d527b404fb181c2815aad42d4aa7748b025128999e42a151da48c78fed940f689d2511837504a886c614af3af10066e98a0bd02063b35a50a103098b232cb45882a4c51066a0524a3250693952a50c347250b7b1735903e338926630042a49664c41c3a9a5862408486a40e3490039249138283da191a5853514a3060edd2c49941c32a461e5070e880d17a01b7620831547ce20c2b6cc585b3c19f2c116508cf0787a46c6ead7e811a49792fe049c1ca31c19e90851a677e18586d11f4d327dcb0986e9f3a6cc8d0c8a32a3e66036d1cec93ecd963c91d0c8423b1c2ef78325e2f773e68954c5882c7b96cd8d24eb84c933a906b5ff43fae6c46338356d4c3d335f308650aedfaaf48c93359a355bd394a9af5e90a8438af664acd1785ac2092833021495cd3dd6eff92192c3a364c3349562a8773d61ac07944d27d1f6d8dd75388f14ad8f68b7a7bc75f157755594d73dfc4756b2a7766feca1de5d07e513fa80b2570bde451b8ea2fd46d551a3b891393f25a546ab191d0a321a9a056155cae5e539fe93ba8c1ae15327d431d94399aaab5225a79e1e5aab854ad46973aa2e31a7fba24e78233299e1e40a1b43f84531d5b973dc538f714fcdb863b2a7673d14d4332e68a8e575a65a31e1a7c816b2a72545f6b4904d32adb0d3c6b4398d2e613385299014b7d57f4a7c599dbdbc1fbea728e672ee3d3407942de05fc89e9783b1f020d9f34276481a914968d9426e4c9fac8d7eca595db7a248712373807ecacda995be872f8a81f52832867a48f6d4a06a34b41a37a66a49a6ed0975590dfa6475e823c598775427e6786761969e779f9acef6f4430f88202269362b7d5064adf5a4007ceadd0f55a92ad55a483255262535cea842a50a253e2900c959e85414032aaa08e248d1922ad8201b248a3a2aef4c3cb23a55577d3da3073d7ceb02cf926b2a6709c3228a19ecc04a6d96b28d893b2db9a1211bf491dc67b9395557157568d99dda5975d5cf12e5dd921bd3d6545df5323bcbf5d6c81ed99a4dea6e2fbbb891db938ca36d7788c8a8c27ecafa7b746bf537695baaf5db1337abe7685d537de7543d5aaedecc92b2ee29d78d2957cff60e2bf5db3d25bbf1ac5dbb7bcad01e70dfcaacedaeeec8302eb7a53af1753d336773733b55e1dabfe476e79d3f3605ddfd43135180b0046f3dc8010f704703541219ac81bd2f3e27784b72c25d6d0877473b60cf092bf0b6441278434206438011a5871ea2dc70845be0c0020846ec4008a36c5003199481bb3c91aa00038506e6f244aa22a98a1ab783aafb28aa4bbd48a84207ef6b378c422a86e082128210488553ca8383e9a3a20ad8794260425141868a7b43c8a3828b6f83c3a8a3028a989b6588a34289d0bac1b4b5543768970a1e5c1a0e3bc51060e88be68da576cd8e4ee194c25994da35bb299a68dae507d4eb21b04de3870bb0d8850e7845850f306e42840c2b5003e78032c22e79221dc95205a7f2443ae2031c7019deacf514b5dcff41833403d1938f05f3e2d2dd2dab6e5cab2ad75a6badb5ca6aad3504bbfb63a1badbebb8d94d2a915bdfeeb6b5ebecbd97c65adbb4bbd65a6b676dbf1be6c5a525470a48199faced36bfeabc697f02fb967c6d9da89a69e37a5b203847186c8ee166b05be34f4e817314e77ff22451de1782a91c5105da4d42b77a1c73675578238e94ccb1e4ccb1164cbe1977ab76a5b3ded49853d03fdd9e950fd5516bdf59dbcd4f52841c821ac39d9fd65a3b673761d65a9cad2a87601bef3d9d32f32d33c8acb5d66e95bb7d57606e9901d34f6bad9dd5432df9e68fafabdd26ca1b292d644267b8c254ef7ab503a6210a9dab8802cdf5fb38b0979aa97dc071d7fb7aa9adec28e54c25ef5bb2823ae3f3bebb6405d5c4846a2b2447521429eb4991a043cc22264cf55691d40965e26452275060276158ab51a123f43b06ad7abd0f55a3c249e1a8dc1a154e2989a372ef87f26a5438a5248ecaedb89b0a6fbea7c2143a839f7d6464454d3df8a138a2287484a6e788a2744e7290d972a926ea285d1fb551d7515418ec502a950a77500bb512b5837a890d0d0d4d07f50086a894d741bda4877a890aa354aaf0c65e15a640d3b3bf1c5901f23c93bd6b96d04a98aeb4fe9e1d37824f3d83672b7ca1596042903d98ecfda361a8c2982f97b24f15865b49f8a6b17a16b692dc1a5079ff708a9c212abcf1fe7d2890e94a951c28f063bae2d474c52357e02abcf1be0a53e8dc7dfea03c720db2eaf8b3fb6034a9baba047a061da1cfa4abae1db037dee9cd7026f5cc6ab660a6e49065ab020c38d2a1912ea1432455d86aba36eea352ee73977596d13372931948852a8cb9e99d37d59174ca6cf7c29bfbaf0585a29fd300a4f8ea859065965ab2eb16685540c0f35d9e485314e5ae706499bdad87d92105ac0a3faf1a7f74bbbc0325e9ca24b80c5fdf0a9f0497f8f52f9e97cfb23629b600dee53a2d7f215d4252ecde428a6293e52c2b134fbd907a22f546ea699843c3a63922f87a1e21442a2c7cadd5d21369793d0da2433c15b6e3f5428c50daa9506d9e6e55212f3401e516a9e7b92f2378178ac5b128fc8e0da766226591ebbf8fd6201ef14a8b107769cfea9b564f9b2a6c853985aeb080294333656a2dd2f748b1dbc094a9e1c801eaaac73cc81ee98928d4779e21f544ea8dd4f7d453a0baaaa74154a87e5e130f75d2ad7a1413d5e94844758c1fe24af24c99ca719d037ee65838cbedbb2f77c931a6ce5aad5abe127330d631ce72953acc81805e6c3a8790eaaa5f8d46aaabde65a4b4910a8d2de3cb980aa3cca8b42b76d6991c658acd88000000001315002028140e87c442b160344ef524ee0114800b86ac46664e160bc42cc9611432c628420021c0000010019919a9cd00704c125299a93602a09eedecc4aa6756412c0aa17baa6c97f0b2ef085558e94f3f19814becc041aa4a3403c8a889803003e58b71ed41509c83c74d2f0791f38f767e2bf167dec602f752bcd17fe5dc402b5855647276b509a8a6fd41ab6a2654bc23f23c09a9c4e1130ba76926a6a98c14504fc75a5e7d34ff44654f57dbc19db7ad80aecc256445b9759f24ca34979d95297dbcd31e98ea2344938e676a3042db3c9ca96fb8f212350aa8ca5e82b45e4bb23a6df4dcc693e03b4f300d5a166e17679a104f5b2c49b083009e8da2825b47985381ff3348e125d8f81696197618b3f18b187044ff47e05a585a656722c1af706ccaf02bb87acf5e8b9d7c508b13bb1931cfe6b98fc23d5c76a9ec5f3b0103b0eccd6c8f71b9d6f6fa8059d2cfd81d5ee21909385121d56397b0e55ef2a0e03119aff8162f5055adfb288d92e267589d6b45cc874b96e394d018e7ee79c3944ec444a150e6cf85ac47d1b820d5734dc2e6e442804c2e22a71c4b761e8abf4f7b6085826ba970b8bcfe80ad4a78947b12087eda22ad8822bb893f98a2e6858c4a44575f390aedce143d2b9905ae91d11c95b30eb31ac263c60144b6a4054543c2abd0d80ccd5806d34ab164705a082e88b2046ad0c213090bf5e6ee9f8a3de5649e13d49aa19244e18bd0bf4f0f704324a3090ed1516a40793b93c61a5760046af82e3672d932bcf67a25b03c316193d556fbc94f7623fa7ad53d8417efca5da617245718df4b53d32129bfe154c9bf0e19bc47d381cfb651f7639ff31893a6a51e9e2ecec62522c51ebc5f77af14355a4df5e82e64a8dc517c6a7ce514d9ab72497d2f93e0f01849ba529b360546901d9959c9bba8f2cfae4894c7c39e17df185e04f5bbd39203bad7421415b9979bbb6d9647cf1fea14322abdc9ac57c7fd334b89c758c9d948d5669029a62fbe760b333887e67e39a51403a453c4779698b919105e6175bc115660cf61c171d23c2a4440173d3b45100e447e7c0a799eeabd92fc9388ea6718b21420f24021865901ec361e7391f511c347490a058ea90e82f64822360fd043fe395200e5afd8f20014f762e628812b582999fe387dff41c0fa28e11eb79e643994dbd0e0fb0c3a198fd72045ed90fc8dc6964fd62aab37141ca148311afcec2ba35a603620a9e15d0fc9e5174fa025ca81c504e3db5b0737fd39290fd135ca9dd4792d10e7f4f57b84cc8dc7a05cc79ab74ece1edffb4eea353a22013e85e3ae3002ff81d3a02c06047d1589d1b04bd526c3ba4e9c61c93705fab746b4dbd84732dcdc7ad624042b25548decd203635f90cda63cf87709f8a6d859e0dd4d2873672384d0b4f6fa660cd637e94a32134d1f261cb7707c8febf3d418d24c9ef9a6255604468ddae0900f1e3646cec2236adb0146f0ecc984eb0b4201e265d89c9c4bd105b92ba3f857d827d115e7fbaab7e03214031019c80f71e8a42bac685b6b36fae7d9b9da28b1e4870357a64114c1c76c223f23f891035413d4c1105dc2dadc1d0441863fd6255c5838fe69bd2f4d3839ad632304690686cfbcad00f835765a8d3bd5a3bc5f5891df44497affdb97752243e49986a5ac182169d7314e4b227b213c9a393ae48557cb8ab3626152e62bfc096d1e87d292ef13ed77229941320245b1cde38387dfe97e1c7629c91554e6d4d111fb36fae5ac48eab6573c0ad39f9e534eb02249fca3017f2a13141125358b5dbb038109603623b9347c41fe4c89180e5dc130cdee583a667d6842b9ae08839adafeedc1dc44425cb100df83ef07e4bff1ed2a02dbf757b34e145401447512433d882eb89085a0595a6c5f8bd6ee7f88b26c31bfe0bffe33dc6444a4ee3bbb9aaf20901c7adf1090997ff964227178992db94e3cac98ecf4e13e418c5d2c372db45bd0e90a98487d4aa262f3c4d11d5db8fab2a951ea839e8ec4ff3b7671131ec0908a71d4066f9e7ceafef5b239e10cbbb69b0d017daa46c4a842f1ce54909c27b01aa8850db89dbca0c8b307ac052a57b059a7ac9b6c43b013fdc540d1f36bf3c45f02e8b07af5c1127003c0665c4878c6ac168f61c7b43b9e5346913d197a7a2d7a843c1be5f4e6d539d4159a6a889c5c49d8b95d5e2fe851e0b5d06b963712f6d9f66d4b2301470066eeeee8f1539b6486f305841d6dd83c5cd6ca08b3412ae28bb9c7f12e3a2f36823225d2e56f5e8ac272640eda6def53c230d75b53800ec67cf4a1e7f364cdec60e4c93fb4bbd12333aac5c66727287d070ee68c93bae51ba27c4d612407c27bef8ffb176225f7a9f71b196ec125f94f7dd1adc620820f5e42d64624ae2b7b5b847b27982842231fdd1a32757390d421b8f7efb1d603d75107d944f79abf81b05bb61a5da0c62d22609b5bc018743519529d41e81c29c6fdb6cc54c4070925d94424486478401d63e463809b2b400b2b4e98da334abe2534d4f30e1c3082e9a4afd81a9f7c9d635ae8a0b943404c2490cdb06ed184edbbfb47b37fe838d97d2da9de939e0035f3f62fdfccedaf5676eeb3b4cacd3bfbc5fbf30180178f18fb129a8fdc1a8c6075693ed262ee0736b15ce1686186ab97d0375d1e676ca9aad25cf61a9ec5b44c4f678297ea255984538af5dcf089f2a4b4d3186ecd117e9924d4f93051e9f3d8a1a58dd436b475b8f2d6950315ddda7de7dd291242126a58a624797fedbeb09ad6c450e71e23a10de1ca08b04ab6b11ae1d48d812ca503ca2494689ea5e5f46c49a7d07f3a48f1881438ca4c51e9e390b4c16c9080189c921d55b3c05081f2082f518195d05a4f14b686bab202f6381276ede9060029d4c82717abc466818b5de9c0c48d14b73b9e01a4a96ae443f7be64d358c923c7e3d1d3cf401fafbc53c9289af3162ec385b63680553c97725fb5fd78223b4ef9912cae65278b671b5391396677cb82e5b406ff8ac40ff5a54b97ee56359c31750fcd8da907e66441a9a15e8100e0f9b4ec743691347366e1a876a9c25375153bf61bb151d6907408e793c75f53cca5a04df100c0010905f9db72b16462345dd4ab678398692e1c86fd308c1656ebbecb65a5970b2035d10faa77eb2e09db01475649576ec22e00c5f6268b8f0ad4593444255395cbb04f5292952beadf865c93ed90edfc1a58035ed8c7b336c27f88347d3876945241a295fd8699b95f9fc482e370e2a06f4b4c5ff5b25cece32393a63f3a73f195595ccc8f1aac73aa2dee18d2d4f0122c416559ea3217901a6e71c3174eeb68f2e6d4b01ce186879738d73b4a82ee1822de9ee0687b1bf71bbdd4eaa61b18084763d71ae908f3bed99d10de15d0b393086aeb5c1b24a7128d914446f79def9f6735098bb3361846bdb3087f5e5f4537b72b65342c203166d870c00c82176f4222389ada2655b498991e226e388b8459637b06137354df06d8e7a674b5bc7826c42ed8f3e42d22f7b1ae3f05fb06ff0211f1cc430725e80517d76cf4bacb75f2624834bacd80786db5e49a8db5bb4145abc802d2a50cf0fcbe561a271c45a74b239e307b0c476a94ec712de1be70cd4355e93a75b085c9d802b3c3c4cef08ceb75548b33be3c9fa5683034d4a2ab0cecabd6491cea74e4a54ace7375d480988ef3e104791923512fb01c03c50ea4acccc6ccdcd515f68793cbdfe64af32932c9c82e821c863a16bc3c8fba1e3d4be6a447069dbae984fc14f7ba7f098013d358ad776bc9eeaaba431194bd66b47a0dd771b7e9dbe5aa396db7f4dad5d20efc200a16601f7298c605a2650e4a3ff54a33f10bab24a4099fa0f4f4b3c665e6e6348dd91e04c756978f67cd18452cd2f520242296ec92f8744b2b096305eac70da2c35575d77cb270e5a135ec24b17da7c8b271650ee785cd5b8a23112b5084312dc2a440402bf77e4fb696635c69acf620a2b450b6346b6f33f1785c7f18c8147828e4c39585505fa0804cb7268e56492e44aef33f4f6164147142c54931bb45e7c155953109e6b00eacc4863839a2c73ac445fad38fb96869a0cec3c487500da6fa37ab65893c2aa8ef74ff6ff14ad8dbeef132258dbafae4569b72613f3007b9aba396a8d177fa6c6905f9b4403822a984824cf38789600f8ee5e3cda6c2191d30e323f590dc3cb061b7e2b087fb5f8a082709ea817f7d0443f69103686b48224618ef44f29e4c3e72fc88bfc3c9c3719cd8ef36e8e3137d4221a705dd39a29eae78a28f3faf51ccbbaf2410d193fd5591ac38a5c01fb2fbdcb874b1e02e427f12ce39c50945ccb86ad13fef298ae44911f54c8097ed583f638b2b8247237c3a75cdd3f077d9489389006b7fc95d9b8ee0ab67d4898489b63e76946b03bfa78f3e9e9da3285c3a6e992075e0140ce8397a4ac1c051dd70a02c00784f3bad047a9c9d3f16ef09cf74fe6a2f8645837a12330a7cd146eb2171d74ef179b990624a1edac812aae723be13ddec44d881ed2b6bbf134fe7eec20301506d97171115ce53e635d2143544f579f8680b3e1284a5890169048d1c91400b89b4d5ce64648da4f466d873cb608955c8dce46118d8c190126b9c45558dc330424167c958e9888dbb84d2921de04b94a2fbb0e28c1d2ffdf533436cc842e13a148714584842c9404db1fb284b807a0e101e6f1cb9566d52c8cf641e854469fddddf0b59f9d561a54de37e744de415d2cc866881373c92c99f839129e84215d16d4c25e428e176b31e0452a357e7a21786c04d350bc5b508d00632148e06ced3a980cf9d68a04b61c7414a0f9c73ef01ee60191740e2b31a86f79f01e8b0e5ed2b144f0e55eab30594afcc68938477f413419dba03a88c4b4377b2db43a6e6ce27ecdf78d7c3bcc44bc8388166bcf25b2f28388e1166b0e989454091b21fffbfb310de9d1de0b49064833e9fe0c08a680701d31beacbe54bc896ba5cb9f9fbda5bbc2418d3c3e77db40f6d3509d099b0d11fcabcd4077fe93fc555a08f73005d179f5d8b262e6074aab329b6d6e7b623a0c0dbc079f753ce1b0da376d894c8b7dfb37e24255e92ed2f7c77e96366cc19db2d2110379ce844e84be22ee3c71bd9f9c0e15f3c6c37893e742838d69d05ea619037c5e72ae3705b7aadc7f680cb2bbc26c8c426c029d4cc50eb249fe4b4be3e2e30ca45859ce1dce6fbfd0427d3ab6f0b889c4d337fc43e5ed52ed9ba036946fb34e0d05553905d17cc50ce37439c15e4e332ed30200a405db148a612997977ae58b78ca9c5f7ffbc3a04df37859e39459d78b57f4bafb234dbc3252057c6f207338cb70792f47f753248aa4ba659c5f01204e852b11583527a2ac0a412ec71091f7e55d0fd11610f253120b048d31170a5ba29e70b4ad86a1a728bb92235a1fc6dd78fe363dd7f46b0e16a79f300e1df05fe43dc0c344336fe3b5d17911912c0dc742e0c5e00865d22b99f507d61872085882eb0a1b1f2642ffecb7db6faf8e2dd2f108029fd1b15899a22a6686b465166c8c459042bfeafec11e3c58c880d1424290fc46da0abc95b642a9cce1b5e1b23d977d228ca702028e249e6069d6498a365b90198da88a8bab0c0c9598dec903ff0a42964b91de26b1088b680284500a83d69fe54446147e0a6c6e946d74c92a63cc691b7878b6bbf7ae25a6cb4d70393d24c2116845467756b52fc6a33490242bcb01911ad81f41d997d15534c9b7dfc85a17317dd5b6b91ffbba38bbd8fe7b5238fc087cddc5fc59090e7d12546c6843160249fb638b8ca9eb487b97c0be64b45176d305a73246795206782def7814bc46a63700e19a07ca9be8147ba238ef8f8c9df522d0d20ba1e679f7a651f88c607f7037fc1f23f61cecd1107aeee7e284b60993ae2283b968040ad38e5a2d4e55db6e5bc52f9cfc11ab7af9f20d18ba83559fd054b44f7a81d0b9ee2b3d3c12dddb5b3cd7ba22d4a124366e4d831eacfdd0f1bc5ff604272d6fd3881aa3dba6163d8a98e066682be1ca6f2472c2ff7a2c752aa5b6e475b6c170eb67beb0d6657da1ae294f8f84cd83e23bc347f396eb0b33e7437df74a53679de7d6bf99a8cf54eac517dc0afa1a8ede650b92b4454dc780de29c81103cca069a32530e476abbd77530914ce698565523a27ef2c8272af35d53ba157e4e3ba17c6af523ed7a1fafa7c1df2c69c19ea00c28f1beb4752919dd8ff229533224bf649ba55c6a7ecfd74a092df851b238049d7685ec83e5f85f463cbdccd05519615270ca14f6ca9f11c85cc929fabe809ec2b24087bf7e4fa7b83c83106f4956462af6925db0be65cb6a786a751fc7b07f42310ce1e9a35636a9bcbc85265120c738c20d42e573ac7773e002617fa46b7863c73956f2bf4fd8d6d3f1096967893fb59f403d7c2ca8acb0048cd4fd141b03579ce1439d84255782b079861cdff18e21efa9f2af0bf5442cdea1f0e840a2dd02fd588909c513f6af70f5fe485fba1d7da312eedcdff5794099bd1183a291089e38744519aa2c33dda56c28ce97133b6a4ce33dbd99d5010d0c958bde53c62c97632dbabfea254d7077af849e3b4afe6fa5c5b9ab97c86dffa7fb5f1708d8dc64a6c45c392d84af142b672ca68b7ca8647ea8662a4014c0a4e80ab87978b0f3d3dbb749954b6f2421dd77164b5a5aae1efe9e4ee0879e50317c5a34413031a2083054df7b11f99c833f20a85914d1825c31448bc3197a42dbbfa233508cd7d1260c28709fa557354e02682387f3917ffdf571cc312a2557a933ebdf50643b8e20e72823d1feae62da291f096f65a6d2976f24a4733b92c38818f7743778df3b7ee185863374438652e44bbd508d07d293ce120c5f1f0e3dc240a92253fe8b9356027a72947451af19ac8d804a5c08f7bc9ab7e2b56b87e1aaa55002cb79e9cbf31c5e9cd151c8c1190d9eed56ffc3697da32d9f4e388f66e8aee2dcc32cc70aa9eef668b65381fd23410155e5f2232ead1e11154b72ffc06ef03953d26cfc92a3f84713572bc1fb1c74ab8937825613543d479bd158ecfd6dc2e19625962c377462720d0ed20a05f673d5a84f0700c98472ebb41c158c1c670757aac691195e9d99a75e6ab16dfa3f0c8944336e96c37517e12537e2dcd16f54a2061e6d3fcda6846e3d406a9313c12adcce229f751ffaf8b06698c016de3dcb752f05d9c4da25c4d2a9a4b9f3b0964a20750fb088d0df25166753a31b81c28fd8c0c43e256a1c9d744e4196be4f4c93e2a4dfc18ef00493e1aa500436dbcd1c2658d8ec12381ddb1cb50250fd9b4e189c1b9be04f24e64855b24aecd80082d812fe02718c691fbc2cab3deba8b5ec33a01fab62446c299c751b795064ef2a06e77e16a4885c3135231a0def04b75e2b4889a520f1a08cf5134ed26bbb0947a8ce2668b0534ab6fccb3ce6417748bd2c240a1e7947037db1552ed038433900b7495e7d1f0305f3ecaa0dd515310c75ff7882edb46e6b1fbbc028a06ebe496350c50dcb64e06086caefd77459eb2080e234dc567020c9eda5807d6aa8b7208f8e2b3a5e08a3d7a1d6889a501b08281ef5147471e5bce7406001f5ffea844115255b7925f14d9830f3953c65138d3e7c8ca184fc536cb52365a21f85f78eadfbe328d604ebc00533b3ae4d50f6c9381bbf28bb530e860b7a3b86115fb2b1d7252e4b95f5f4c456ac33a4dfdcdd53f69d0958b202d749dda32addd3d2dcbbc3e4e09783a0780b70ae6a39c494250593050ac4903b858752c447cbc0eb27427a2f2ac1ed0a77caa8f0fc13fb16d6ec3e9127ac9e1fd8a014afd27ac2aa1a3e8a87f479d5d3516e6f7ccd22c230cba6d1fff5276c450242cc1a0d8d757dac4b086229dbadffdcb084aff57024e909381adc707bd8d00da2c57e04478da46b6af0ecae20185af404ba2ee7e5fc5bbd273019b0143c8a3b351c9e6ef1017c3b1d7f6fc9348ebccf20a22d9d3e7c57941bdf80a06d51142b9eea67c24c88d5b0ead9923633cc669756f143e176d7956a194c8bbe605557c8fb506eb19ba269d1fbbfceb5232e6c716cd49de32801868dcdde689c45f78425be329a805dada6d008b7b3210fa8d0cdd5cd4c15440eec4daea408de546d81ceede9c84384bee2301d8185adf4af6ff2bc6d2d6b2ed2ea171793292bf979040b5d5a51fcc2be3d7061d81d50373d8b3a056f0bb7fc66aac2fae095f48acc795a75f7fc4781907461706cecc30d0d7d3b7893e90642c28da0f465a5c1a57a25f09509c190816ef1dde4899be69d9321027a2d20250a45599cf2ffda7e94f97d1a86885006ef18a1e9a521ea2c253d8240a1faba69a4f6deef41e49b34495f8d3274b0a66aa0133a6156078e8dd572f04e0bd43b623d0a0fb4f84f5a3badd52141d1b93902d3106924b171554745d2a69a544c968d3f64a8ad0adf68433deb9a3f0a53ccf345a508c4b3a990841912900b90f6789ec09d28d3b614d8974a849c8b7685a3a1bc33c09cb0cd9722e4a467c71173d727216a4006a3b201e35060a0b833ecba070e7fcc0ac458930387e33b3ea1044248c7f169b0afbf30b78780aef1694be2acf29d6c694bf406a8a8005be6de806e561f1e8e05ee693c34f6ff6aa0558c4286b5c122d8602516df136012444f5c82b85d41f524edfd4f66ce4637cb81b176a301a7271f2493e1bab64427290a8d29519d377f47aab187af3e8ecd15d76decc33da6c288a3ce43da6a2ab3b2b4ea672125982317a41eaa0815c5991e5da38f5c41a083b14951a26e37cc03133d9857265c014221e5598b163c3333a808778285369837342022d258de98fe218160e28a59736a3d57acd22cd33d5e77c76c8f1b7b81d3bf2fc66d9be4c2633ba445a1f910bce2b4999cb35505b7f0c96ddc10deb3f2e5ab23956c3615e78849a60b392612103b3443b9d0e6c115ca70b60dac0f34118c24d9c930bf3451cf6cb3e20266591a9ae9b72cb5bb25f80512157b352bd76a05c96e97f0d82dd64f8e84c9dc0cb19e8e4f46037eda423ac3257a83f444e0b1e0b23fad23d5ad831585740db2d434bc28bee6fb579b4e859522b840588cc7e488425b7fe6c4d940c0c6763b2706cf2ff261ff56facd1231ce8c6109040b99c138880dd6588685288259503674f2d0f1669b04dde044b8154b61367e6cba8abe2ce89d19607a1d9e55931e97ade0b3888d2bfe313b836d7bba65bb35169e196666c02f3ffe18a304dcdb0b2cd4d96949aa27cb2fa0af56f0557a3c8c113e66768625636654a7c50118988c79c9613be81c8fb86cd6fdb146008779e47c0090b52807217b9742b9d0425fbcc3e361d1c9c06f78d0166e35f7da50d33900a9644b011d4e2ebf768e22f2e06c4562fa6f0ec75671f73c65a1b19a3f69550c7b1b6eb2f9791f0183214a8bbbbd4bc84e5e55e0d855a85cb31098a5ee045bc8983038275238313a837dc78402c2a0e824bbe32aa7a52a2d9dba959f38025f1c1a180dd84ab911882a34bcbfca509dfad038b5b507ca13a5c260a01e5dadaf08e16077fc7a815bfa3ac65b59421ecb42a3b62c6ce1f254e0ae9a8d1b9602dfc1343d629aa28275f26935c5d40a5c458b3a7777be9b7f9b0b5bca3412b946be0c7c2b1a75b254301d9e95c91dab87f6a11d2318d24eeb9409384ef2ecadf6a2659a78881b5fe69cc670d3eaa84889c7cbccaa77045719974bcd404a25ad8543af3889585550b830005fc3e9ad6ebac7a6953d83cd6af8c8cb8c1affa8669e00b25aaf5d1795613fd1852894f0669720bca19587f01f82273d42ca5aa8d805046bc96f5af047f20ba8a981b826dc98a6319eb1eb6b5577aca3eb050fbdcad4ef1ec9eb171b31e4e806933f9f675657ffcd47e85e6156fc8a3085c74efd7eca1f6354d4ea968288ffdcf4814722a6e891311c6b8733a055a2ae91684e1dd19c868afb6bd73f9263367b8962002b3d87a508f34b42a2a75cfdc1efabca2e6098f90e10250d1ec315db436820b711942a6685cd4bb743d3db676f18ac7d5463a4fe5066f0cfb15341ddb13f7d6be121745cc85720e291cbe54a2a17ad064c9dd60ceeb39fa4c947b13ed3c61809f6db8f0fea3395d5ce681bc503b2fab86a6b1b23376ab7d9555a5bebc9c6c1e4223a4ea3a6baea7f4f879fc18280116aff76653f738d49f244de7da62c6557d536caba13e91b010ebe2783320ea412690da791d6c3059f5730f1232225fc43e4a6e3cb62a09a11fa6bf2b9617e66b4286402366d10a5bcb2c78e161b161001c77c52124d419ac03655c0da84ca540d5ab97ff8885a7dea7b0d23ef5d35c06b57054c92130be08d6c889b2a73b08a305e77a38022187c22a8a0e693a10ddb4202452365618f0e674e6df04328873664e91b38f1754cd2bcd3fa6ccdc0aaf0832f334649fc5b78344c2fbd6b35d7e7aa7a390721f976b2a8ce764e1950df928cc856f574561e112527060457201b9f5db040918d7b3be4942aa0289999431c98e2b026793742ef4bc8e1b38fd9456423e10378476818b828240ec81c338c88f524f55a66d6637206c98157e2d1b05f84e9276752d2af29ed76c0938c43461621d74b4f5ff5f1299554b9a4b9d1d458c04eb3d8d405be868ed50748b845dd8c59bb44018afe3983ed79eca2f2eda3b3550fe942cfa1e380d3d7999818ba77d63525ddeaf0277716e6289fee5868e46ff97f40d0251c94c9bd183f2a1adfdecfde7b9a5ff301964710f757992b4753e4787de33e8d858805655a5e792924e0488c0bf283d22980b2ea0f204a7edda38af9fb591fc03ffdd63a705a83e122ffecb852042dbc2be10c6b04b55b1ab35b770405b2be2715322a7c0eeb7999beb31f09cd2873733752af9fc17e70f3284cd7815a0c2cd1dbad650cb7fa90e75d74a5cac9c2922141105e0594b0286a5cd957750916d4240fe5fb3f2a477db047b51273b1ffb863e2cd51c0d194a89512d562f772fc3dc6abe26725ad522ea10dedbb03c540a5fe16ea8aabd39b238678ecd5a625bdc0992021655d45b9b1d1da8f267629067f91c80ecec17de58c6fe35169007eeec81d6391091c484da9260b9e4277bcc320436a5bc07f99eea070bbaaf94475016296d815de2a9ee9468e34c0a5ea512b2c872743145d653a49519bda66707e47da659174440a4010bcaf3d8e174472117c131d79500c228d9224d2b2189cf4bae6da7300ba88015117630bbc462fd59a632e8b692e47613a034a4cf8486f5f3643404e6c4b2ad46a62690f08ce48003491859ce54e802129a0588daec89c7228252d268dd985e82049a431e12e6a8da686101cac3f666b083c3d22e0a0eeee2144021a7b4fe4f53fd12f72c187ab72e10c3d24e00eaff1c0bd92e40602ef59b9242ef8df4e28535ff09d505610a9bd5553057cbf15e25e7cb127acd70ccac70f602549f1c72b12c7dc434fd004c01bc755ef7cacceff3921964ea81b6fd0f9e66f073668448624302eb676df1b9779424843379ddf415ebdb5143721e5df18f6cba86ee47f1b24623e6b945e42738344c0d0297abe52a398b26d09ab26083a5151016c48a9820c88ab75576decf53ccaf2aeac37c404476c9d8f048c9e67bb1e118d8403e52f59014ea059b37b89ac89fd1d8fd9532870177a3493753b1b31a5f2f971520909ccee6d35da7772ea630b3c6a3015d85bee31c57161a9ffeea5cfe9fd69642a5ca9ad1cdb387b7386a052e19c9b8900da88c7b466bad08a60ea75d741a9d1b4ef155b8cb1fdc97692b386491eae0944e06af035c016fa837dbfb54876f866e3693e87b654d96ee94fd7a6bed6c00985356fd812a8946e39500e537abcf2dd6d3d94ac472436e8ebd6a5ac0d4aede81f2a1625835c373b6d9105917b7e064dd33cdf1daaf5e09b1bfb80e051acb628dfb5d06e8f461da9530a7d7a2d7a85ce568126f1fc6706bd800bb97b2c230182c880b13a2df269e956512a8210584e83eb671706513d8db76516c149297ba3ff3dd9794f6b7e0402e3a1314be3a2823124d12e2ec3f23108c84d74ebe2f45d5266892bbecd5cc00d745d2c947fe699e0ccacb4d4fc465200cb92351277887d2af7cdea2083201e541a3fd07bd4f0c215eb74c4086439c075c4c7a58c0c31ed33a39c11cc0b1c5251204a5a4ef7a876c4cf64fc3c91d00a2f37a7847db0fc7b1bb68f5b36076a3e18f01f49686b77a58b69a79a0cb99fa566de3e86dc6d0187d7e362591c50a7b901ee7e28ecb50800ac8c81b338bf880f4655253a96630cf3e0dc79e5338861082c4570372a05dafec429987643c19bb1efc4bdbb1aef86e19184edd2d07b0c73d33fec2e8453d59fb54fef37412123e02316378ba7dac32d874033f143c0be2d44ef7699b250409222680272b8b61138e1005d6db8c654112c7de763c0b2c92a4a6c551b90b91cf501e60e0cc0524047f0149af89db536a8b2b43a12739bc73d6d8ef3eda5193000fb631135cfbef8dfa25288ade7a0ea60c6d6203c9886e66f7519dc58555209a449d5dfa0aa0d109e71127fe5491556378324da07272b8104012cc1c9250af11ba08e5e68dcb1bf6515eda4cacab49bc4201aa60cc0ffcaf77db1058910c11678c94742ea20b13ed86d3dbd3c55ba54505e377dbbfac24fcacddeaa2532050464317b7b75977ca2803c99fad68eab137ce75ac933c734f6424e554b17b8af0a92b68af37e0a9ea3c2b6362dc9a0f4d5c28f1f0434019a932c8b554faee03eee0e82a1157a40610816203c5d0f96163a8f48e9c401fb3e06d886a62bda206da3545708748754b8038a88382ac4ede97f648f9ae9ccfc40c693fad34873f66f4fb20337a9a0a5608903311a87c40d2be1b9660241d88561c5f73902f0dedf5b2b859d76cb7996460b681d063b6ca09c7c084250483d5df0e747862d71e1f1b476b4cec9b007d1106d61dea61eea0cf61ab3f7108bad3ee71148462a45f0f50ee951caeeea399644dde1abcf07c0522824f2a00eadb1947ac51e6e4213a3ab14f85f82719e78813926fec1978a11df1ab07324e5edb1878675a5e320c797f2b0177bfcfd1eb2ce9ce1e308490cc60918b091a56d091f7ee650df4de29d7a058ead875216e460a6f9cdc49ef1705af7700fe707315bdf0b9f879ae676b840a168bea31e71dad9d6eb781c8834b15f211c8ee4e0895e801f766a63078902829a3a084996f1a4414d4de2713b4e6a95d6c2b19b24587452832f7288a8c30ad2e329876629c46a9379d4a22a6e9dd784ec472d459c04735132ca5a36c02e3ff52655d07d71e3137f0ab9f80264b9211610f6d9839316c09aaed6f1535b16da913fd315a3008e8fb32f79f7809c710b73b6c119c3aac7855583535c9d59c567613dd55dc66aa580ad18d896b873d34975776cf26773cba20c8ba834f2199240ec67c3f80a72713e065dca7fc2eb9080688dd0afcb38008eddb3f634d4bb80b0564a0154d1b34b5791d70a50537b71f13d18520a31b25581eab40aa3461b89201f5529d1b7cf4992039f3fe79b52962bca7534e59a4159fe98fb4c9d1624b34db25389af617f00a80fcbcf84f7b31381cb4dc3ec7b92890278cb83546814ca0214356e6285b7fcee8f38980d05484766089be92f201aad60f0fa27900d609413d57936de9ac6a784737865206339210d8c4a9b0bfe39df85b7c956fb793ccb94db7be34051588fa78dd93ef0b97d2b339e003cc89891e28856dc258c6780b19c4a5e501b004cbc97103bd73492a7e6faa61f4c3e2893fe2b0bca9a0849b067d3acd19349014d7bc52f9266884c05e93cb3e4eb25e02b24468f8b0f55d68be9e72d5858b62e4bd6352f3868edff6513bb6c545e596fa95a9645385f9159e54dfc9461b5b168cc9a9b6c4873044b4ff4808284ebf7180431c984c273f457e02fb7f4e9a21039412bcab1fc6bf6204db5cf9e25bffeebe0316015224edd5c49e12c3ba18659399f6127b7f775dacf317c81c0512ddad795c487a82888ac87252309d0d9e1b0fff74712ab1d188ccdb6fa4b0bd5b080249d65ce274eff2fdc409fd07882c9f99e1b667638376c476aaf362be075833346e97525857f1e1dab0a35e5df23bf339908260f9344822eeccd0e464bd15dfbd3f230eaa84f60e7be23f9f867e7e2b056c87ee4a08a9926cf9a96f9c229a93116e9a0495a1fe5e31e4def85065e4c09577ff51c9589e4bc657a0ce8cc412baa2472b2704589a956112c0a51e2a260061a4c3330d016e5c14594bb8880a032c6e445d852ad8b063e17d96ad5cb125c04df45bc0d4b4ce622958480f71464c1ba59f38e972275df3c457d13d1590535c1ca25dbb24a53f5d9d1fc8fc58c40bc8513eabc9d560a345407f693571f141408d11042f01121fe089d9584a62921278799954ce84f78cc822a2178fbd213c58dd97584f869c0653ae780285b4fd8f03cfa32e13d3ed10c9b41d13452ea43402ee7c77c606374dc880f69924378d85b161bff5725cadff9f662957bd79951609b185cc7fa40d9934cdf09809b5ca896419e7acb590e7c00faa053b6796bb180d55a865ddf26a9d705c68e9cb60fec5eabe1483a415150387b9047178bb2ce475bd2546837f943559c7b34233534809fe42112062d7b358dbcb98d62a50813ef7db7a0fd6448ed020f69683811649b72c8aae82195087fe6d14f153e2ad7c782fee67823af07c0a120b87541cc4972b3e6d5ea9bbda3739968945db56f0687afe147500c11fbd0b6968ce681ffd81dcbb4543f19a9ee1167ce16e9b0d40798e944e39800898c8ccd2111bce4c7a6180085ac45e0ee20342e49108660cb7f6c4240a010c69cb882fcc98a57d80087f76afc90355cfa1213d0fa621a4f1442d6b2f18d901fc9e8e3fd61ef3d9acbd593dd775df282ceb5f9cb680c5f0e466cee210be034043f2a5f33c4e52f0062431d7942883d1b7f5022860562f980cf8fb889c9a9b426c590a884ee5f23438694132d5bb773d86ae8959996e3f9c3d943d26c37c232086692bd1a7b58a8e22d529b3c500556f85f5bfecb61a7564b4ae7983169fd94985b64d1f1d95315176b720ed882c8de75b4eeebde612a9a4424077fb73b66cc4e7a3ffae3acc3129c08b518172632105f349940d9e7b722496008508e1f6db63399f38b97ee05481e1c848af3aad31b07a8438b6bc982fe6be3e94559140673598205c6cdd2459fb3a618d47ddb2e73806c39fd65cdbb68765fc210bf2ce67741be1b2920a1c6cf29a19b5128efc3a43e255efa40a45e1b013d64ac02d05180c7166523618405f857fc7e29a229129efa9754fadc88c61f4eb91694a90750526eb47989377128a36ce51b6020676bb1a220ef1444d984a7a57b9b5914a34ae896f0cc2739ad358f91d708d8cb07c318d35671378bf7f6fc21db25e9b072a94f671166f7a88ae0471b563f7811a12ad8458cf91404e3fed738ba02c0e017c37b421e25ff5fda65c8837920ee3b4c2f363b77e23b32c1a2c142120d05455462d23c2c5304f6be57d2777f6888b3bf96e2e8ced1a6e6e7491051bf0018bc9fc8f9ff8cb4ec3224d80491ba5502b365c030d49ce579266cea1c618792d3d4c6e9cbfd0cf695a8534ffa195e511f8c78a76b23bdb7a6668f1486b7e69155d60d377677b9e922d395c9d9bb7d5ef96fef523617f27591c32cd5437c43cd528f9ae9476ae640726a86ea750a5140450708872c92821130faf0e060d7a88bf47b24837388dbf939affea947959b222745cc21a36b8e7740353b64b7f69b0047d1c3697335fb98cf76c6640e908af263a08801c3032a305c76e88df278ee69c24d81b947285e751716f4c0fd3a5626492bcec7985ea68541756602cae6b44a46bd4d64725e7e9fed14c3610530b31ce18d08913e1410fa666993b6a929ea80276ee1c9d6d5b1445a035752b5b095f5142616242a6229b2b9e438649c045e78a24eea22da24298e9f1a65da408e18142a8a24104e38b4c46313d0e8ae01805a3eb6ae22c62d8a10c187f9052aa34d091fbad620b248f314fd258fd2d9efcfd52e52bc0dd44a7c2feb58d9a1dc249f538bf90068c77228a6fba301e811530ae219d5b11a3370ed9d61de4070959ab7fc52911c5eedf4a8c554d39026c6c2b0db21af15bd433b03452ea539800ea8551bb6b16a08ba666fa0e03b5d9a37894468e67e3f63cccb53aea1161fc4918a583b30ff90e9e180db5853c9fcd0dbe0b84ac2d3c7704e8c33d6332272842dbd67c1d9cccf6ae80fef7be368ffd70668dcbd25f9d15b2986143c69009782d18745968e6144a1c334df996d1ebbf927c0854ec1bddeef9d9e97687210babd967c423f7fed7632f38b61e78f619a239c0589be8e2c18e7da6a2b63623a843768be10cd22fc1a0ca0eb7d7e32becf9a27162b02b914fa87527c034bfbfb7bb0136214c5db6fa5d7d83b167cfc5a7d405f10529c137a4cf748b6aca141428d5757c58a884b5a286a9bed96307d59506d018c5555122adc92abb3440b906318a2b02598521cf9d1fd7de54feb185dc1ef2c03f92b4432162ccb2c58aeca511464e58473b24eebf40ee3a9fd3ae65c86e4e3475d387534af3ba8dcf4fafd5bccb5ce4481dfc110240fae8292b2baaa7de4ad18ba228b84ec54ee9271153554f28a7139ace50fb7d5e9d5c1b6bb0173492a6195fe99e1a6762922f7e98b74a3c60dc7f1204f6ffdcdd8d4e28f3e487d039f5737a60df8e41c4efaf6fbb012a842dae4da2841771994232a7d9ae7708e7c0a5e180d85179427dca46e841725ce37bcc4e05782be74529831ac67c01da7fdc2c18517b5d15c33952bfa5800697ab2099a113abe278d14a095423e1504f7a33b1dcdd1727ae21732e45973e2c05bfb596ca71bc87f9b35d2154a3338d0fface80c65ac830039d27fed3e26bcae7aa0f1acd3a02ab3dabf838e0fd29b37371cc58754cff6d8af810b3ffb40ba998e6e5c3355fce40bb96feae473b31afc536c0ea52a19668aff1db400a13cd1ca23ad1936591dffca3ae6f9aa88655c3d2f3b1880ce1ef950b8ec4ada00e3092328ffcee5ca50a332d05070eea1255523825f1ebe8cd29933fba240c4a8cc7aeadca34ecd874944ff7c98228208b7b975d7c2635cab542be57954d52f4c1c3102c383b1b15010dde4a15a26e8b3bbd160325b422ef85cb0b617b295854bf1f92d6e2dd866e4c2c0e8d482fc52bd8d5d434416b6cbb2b8197848b74e857a3226f9442552b70cbd7fe16c77d904378d006d6e412ff80d0bde06e247d7a1c8ae82acb2fadbe7935a8264205b37d46b02e18b35cb3ce3dba5670304da620f7eabac27a77b8f7f1b9884c9077a112974b14634e4aab566ef62966d90be34fabbbfa147001400071fb9e456da63d384ad55cf529914eb98c0d545ea664fc707fc2c960f9dc151f967a27078f8bf240c6031548a4d3e059289837c10ec99a4ea8a877c0bbaf58047296d060ac451a0b6c2c40d800cc4765ec3899c9dc03900a610c97cc1b51e44969e86f2d3b33472e9d79024d557fda368b14c101092d17bb98ccd145689fe9cf8f7bf34cd70eb0f02abec04da1ea435611ef59b7e6fad91b32839c4dbf94c9f5886f0db178c289a2613bbd67b4ed968b2c1d64c9e3702edd2e01673b3ffc860f5d0861dfa51d4cefcf6b40f827a93827bc8fa05149a4d7123b4d5e7e8985e63702dfa0e7722c6ff837750bb9799296c20d6e6bd2fe848b057a268b64801daa4570e1f289ab5137c5be34331c062b7533e72ce191f2ee6976a1c17cedd3fd08000b4b9e0278df54e21402c5b05e96a892c1ad8a94487695b39b8bd84ba369283f6fa474f87146aba9c5ea0ae1496d4ca75f15262606efba8782bf7ba61010d2288a6870c3cb03eab0fb5e253977697a59a423828b57bd4b8c21e119bede8c58d112dde21391dcb83b16b235b34d88ad29194e1b83752cd9d535c0ff4b5ca0cd5b348dc58e9bf14dc0c7c6ecce1d561032321be9add87e660884ef5972061d04c39736ba5478f85c696ad284ae1d99cc112a6521a12235b0cab35ba83aeef14efe1ba8e8ba0c00284034b2160559635bfa2bdda14c3882423b13fd33a5fdff200e770d2003aabe4bebc9b46ab2fa25a11fa383c0d8454dbb8e41dc6731d16c88476c5f6be7bec48833411667feae612456a28c7b3e26f4bd23a819f23a0e51b208c46498e1669ec6688f4b51ec84aff6adb88bbfcdf04e137e29e3bcaa8369a6d1cbb4e9d9ef00c4367959cd2902d753cee70c514b0ae2dc055e5947e57128138b5af3a38407291aa0d8826011e0a4e59d50daa67d6b2adfcb362710f81fd7f5808ed684c0d4e4c3445415dbf00ca4e446aa238b208cac293aa2f77a1e26dec0ba6b67f467482538222a0566168915ae32ea8cf988ab630911d2b11d9bf530bcb7b8c1f8bde9d1cdbfc0d9caec6b38db18e4c0bd777a81231b0c686e622df52adefa310d92564d1fda1a1c9f74e797d124f1350c48de225d5b6393e119c5c84392a6582e607f5369249ce2df15d1d1386f934366afffb6e061c9a8550a614610001712eb71d69bed464315a10e8b42dfd08ea387c503715c52312b8b4ace620812a388b8f9324790e5aa7aad03ca47e0b9c1498f9462ef416bff28c600c6114f6e81178bab6478471115654cda36ada83307f62a245afad7ab58d2003fea3eabda1d4487ea8d5a51c750c3a7acb70dc8165e82a93bc03cbe15fa6bd1c641953461157f22f7a88a869a408e381702c2030c91a011f66eaa83c456ec8b9ca3178253458b6b1c22e09afd8207833e8899ba55a719c6caa3b8be78d33ecf1bb397d9fe9cc95d7a6624d26979122eb860713c694987956602b059712d6adaed559a1896106f60a4422e015b0aa64d6c4b8022faf06be837afa7bc09e2fc728dabf1bcad2db65641ab76237c98c231e2cbe268a9599e41b8ac925bbbfd7350c309c79e8e64be96e47481a6769fb374b1b60b1685b6034ca4b96da4d465e67adb33ed06c95a152c0e6fa3fb65d80743c94a7c240ced47290d312f0da158dcd5012adf4a9161fab778d7c305811faf73ed12795b4865188d7708d3ead85bb7079bc1a07c4b35d014eb5c4453e519aebeec940a19ce45f43c3f38b42c73388a1c5b5bf34390fcabfc1e28b8ffad4a0df71cbd596d07650510b6ebba40c4f4fe00c8a63d500aaa10dbc177ef6dbc0c660aa455c0a26d04af78b2ba9e62aea4b5affdaec2035cfaf54fc53772573da1f1893627b551d61104bbc575718422152f9895327c4f03ea142434a532b030e0706b6262490ed5d20b92ae9d49341da42bbbd80607e3c2f675f096ac9958539eaae3337e251b74471f1afefb5bd8c12615b80b8ca49bfa6e142a1ef3a2065ffdc8236b368e1ea1f4a07cc3267dd261ceac4fe138314774d1d4fc18bb0394852954115b47d600792dc1f394f0ec3caf768e17acf8bc582232aa2d17b24de6feb220643a8469a37b4dbeca6fbe4c34b267c6365b41c9e29905bbc5eff4e286cd448a9fb6e281d0a83660aa264f8089611ce5475cf2119f57a8251a87f87cf50bf1ceecdeccd4928403a124ee04c668ff6893953a11070ccd0e7f46d04fc49cb363ffc5e9961cc0566ac03fa081389cf5d7e7f411bc73cc3737196037d24c25151ace140ba50bd18041bc125ac83d47db555d2846dd2d71f26e9e81627460f57a307df316abaa4e727d4e18a3919f4393a3d0f3a1e041dde48d36e2d51f491a1f37216b18d421729202ba56ecedfd46e97643dec6e2eed00db493ed083d1489d4d1ad1c7eb39680683a03d15347f05169fcd6a2482c104d512c74bb99c27dac5ec8ba91067e3e266ad0f98d9ba5f15da97a327963e6a3cb45be0180d88ee6fb0c0b94e0a1bcc9ad0113fa05fb8f687b30fec67673ac64547f6a0dfbc544f68931b333a05463f8da92a8e67dbadec92b5e8c47b65d586f8da178bcce6b7c850383cfe4c067801f4de19f48f884929eb0c33e62c6a054b49d89e87bb9692828620a03d020715229c2b61e436b667b88ec511f81d7c56f0372d1955bf36a5606a5820b30f4dd031c9bde0c53e72d3d932d3e4aa2ea4dfcd32311c00d96f17468c5aac8381e282a86b1e95bc9eef82dc31618e13a81529033e6e6b88819b41c9080faacc13d23d6701ff2f204f6c10be5619e219936b237e60ca34bd111c88d0b14421426717ae5e96b38985ce65979fe7528333d76f429406e7edba30593e86d43e74679b925ad79ec31da1c424393e15b62af3d7728978c2adc8ae81209d1fb97dc48c72d4394ea6efb7d27c02c035cc1d026d1962ce2dd56d00a86a66da60062058f9dd169052ab637f6bfb1b1b0672bba4024741fe11f6494cf643ef3d846e8782192669e38c52b1324322e8388884797ee26cf23b1a6df7a9b168e271c204778354c934f59061ba73d8fe01dddbed9ebacb47998a4f3b0363f621a62cb4c08cc9dfcc345d40bd7840a9e72945ea00002504a88c9e720d001f86af2be9a897ef9e6da36183ad575d03d40affa38cd0602fa01bf7ba484d264c23c6965e8a5cd46aca38ab3e21ddc889464f05e5f9eae3939406db8e12ae5bd19f716a47a0e440df06035dc6e158df899907e00c7849a886460065874eb71f03204292b84a97fe0bdf09bc1f8309941110891f610ca8727315e977688bcbe77a814a0a0efd8f5240ea653fcc036b5bc03837ead3e14efc9df9f8237fd601eaa0b78c1db9c1c5a6b20d29dc240f82f194448be551ab803ed21e4c6508cd814647ea61ae8a50eb3d28a34f44f524876e388f0b6fec3a6c5063e2c47ff1cdd5930215f449e6535750f8137c09479f09341a099447cba433056c00e9c66c3edb06a2284665ebd1ed810b9db14ee7440aed4bd4aeb2a047baf252d66aba28e9d0502421e6102de764f197ad865cc150e48b3f1b1d6b31b87e0984c31653585a7585250b2542278cb991ff16577aaa8f5afb10de7c7f2afa6cac1dbf60e222a32c0ae3c71a3513ff9705165c1a339ca6823d265c1096eb412d45e413d55af6e08d044546dac241ff2b4b0cd16171b92ca35db429ef8fae3edf4fb819f0de721427e03191295b99a46297bdbda82372e54d859905c1f96931a72c53ef19a331316e68fed4797dbc597459a6ebc96bb183386fbf16a6c45911f558773ba2460ac8114f12c4c356bc6647f639be681391de3d59578efe4133790ceaa0612d0b868a90f967c8af915ff1c976392548b2a574074874a2ff982905711f14816f07c55144188258ebe77c46831e50f7106dffa8a4e6d6199ca0761250b6af4b410bb1bb383ef534ce00f972404e513e5bee3c6271e7ed0dc3e9a357752ac8801dce1b9dfbff02cb449339433478bc2ef90e3d3cae627fcb7b89f9a117ba3bf6bc0107fbe40354d0ef74f6376db7446c8608d5c17838f16929c4f56f7cf8fae57766933bb1791e98cd4034bb461e25323e634d032df40afcdb6676a806c2e90856ad69eb42cec66bb8d1af1fe6e87b6f8f0910200593610d7683e0b8f0bf6e230d558b31c3023282d3d1ac0101e79416599e19e7451a07e743232efa16264d28f5484a743076f190ffd1f7ba517774a702c700ad8cce113c375443eb7495a9ead7f8681811c01a306a1ccbee3e0bc435978d0f72c25ae07c4d899cf2782f41e441ce176e515772a95c40809c02935d3f3fbe5efe0cda3a2dc95e294873b6725104641649a56ead5935620205e50a543e107342b200d1bae28a444a69979c664258ddc5192c3890b840e45dc785c80bdde5d45e2cffd3a1d9ee1addb0106762e941422c63b7cac282d31bb62c19ef2725aa1754340b3995ee02bee7d43953dbb3b44fbb51939abbd405eed793afd910adedfc10ca9ddbe4b0e7bf8e13324f51d3102126d06757c90600a6502ffdf62bf2ccd5ff424459beb719b7e17b8218b9e7dc9e748e7e172922414899b29be1a1e7b4cfc57c986411dc1828c6f9c97e031ee61dd8c0c2008a6c1f5144762b32cbc566546918548cfd439aed2668f9dac4ea9c51851e546469e680c4f43da3fde61e7243436950279e0b45aa4467a69bc39b6c403373377f02ede6c4d09a5921015a6b9ef01240f3ca31a03d525eda4c1bfbae939153f368d1209f4d6199d14ec12586e0028ddfbae8c8cffb0052e59ccfe9eb1cb6896aa05325466778ba3aa293f42eda50107a2397f3b40a47040e0bb83916f3e6b2e4c76f0729544558487e4e9f1d12ce57eb90ca98e6f4691ef9c05740e9f909e0c6f5db7fcb0a03ecb7104f4ded971ec1f6cde0ffaa9dc469f7b1e38c3275e2118a1cb87f3fbf10932689c133a3b97198d0b87df51b6d743379657847447a76897eb7f6e930fe32aed4198c685ab387e3e344176c00442c433211c1cf12a1462ca94868122d0ef07723a790d10e0448d835bcb2c14303dac6843c5e7bdf6fbdcf83f88e5c6d0f5da01ee77d6926fb89b322f46172ecdf2ddb9a127a7829adaf90038d978d97efe6d6fbe5531637ed64dc6c43f7c33297d1ad120df9b85c36ce88b3aec1aeb05bdc9c49ecad8e07064fd42fa39f61efb2a29163b9ed68f1995b063e1ec5329107ed85e76e6a195d1522379f2c58fd61c8f86e643d2b3c8754506e061508be0bc51deb2a66c1ad41e4b6d932340579158872bae153042a05e81d4eabcfc2f38e3c792c365ebcfbc1cf2eb4d768cf96430fbef6a466db797b70230b3b9f773337379a39b15912835e97b8670cc2e864439378b3b6647808315890ad84408c71f58aa4d73c26917d75ed8210e866779e0de13201087c6598fdad10e079ab82f85c8fcec9265e221d73ebb83be9db102042d88f5588217812c3cd3ae2055251a082433e26c78b68d856bd28f97a43de5034bdc9ea3f5538aa3b00d918f20dd1c778b0de0c13d0f08f0dd59492394480098ac2504bcae7caa7d649e5973276963d89964f92d16fb3d545f36021e6a073dd55ffbd26a81961876c3b86e5943d5cc990442112839824e884c3c3cf8790771947ec6729e3f15da2938a07015e7b3ae2d1aa3932218327f8bfcd98135e2570022ce15c02bac24fdd0a4b99e2f9e3ba1208d8a6b765dced296ae3ff456a420c0e08f9c3c00aaec463c3d837fd2fcacf8a3a17d3f71a174b2d0f1e0a83487388d83b4fafc1392ba6c1d21553ac0d55e91e6282462f2cd0fd354599c61eb1ac12e3dc3784c2afd0ff8cc6975a2574ed67e60a781872cb84c5a07a3c020e38d8283ba61624eb1decdf4d1157ee421a22b8630afda3af35a7b97a5ef9226af6190e18e980b8bd9b3acb55e76c78ed057473b2369249951e428745bce954bc8f6d97df6356f18b0177c1bf08dadc71fa6a892947dad292cd221a32833caf837bf699a0f5ffbf412474a29f47a44a046721c602edc438c7b373c6b293dfb5b6c227479ea46ea19c06edd3a25908a600c97ec07934eeb673546cbd5393eb6eb7a6c1d21925d3f4db5e9432cf1eb264dee48e68bc9d1e4f29005128261e7d435cfb06f79973af00c473b3ed7c2a80d9986bb9127290bf857fe6cc5ad812cb9d687a8396612fe209ca2bf407eb6ca306aae10ded6992181a83ad0d5831f3119258232f85d33ffea9cd9833614f4e2613951cb078c397e1802654f0cf159a012457b5934ead187bd55794306bf84195270730ba6dccbc87237375cc6b6abfc58feea512f24d7f0717764ea9770c0f4765d258c65b6ad33bfc2a91e91ec09d6b5b997ebeee5c6af11447de73b5803fbf6ade77aa7404596ebc270ff753443f7b5ce7ef873d0f7ffd5f8a1883313dd5bcada2a6b83842212470914598fe2729ac794bb6d7966b78c02dacd6eeb4f52b75380088b8641d29cf9f47f375cef876658b320205bf4ec290c55f25100b17bc2b8628edb6b2c105cf124d0c5320cec623ec1b0bc4e96561d25b6903360984cc963b0698449baa8cf282949ef7b66d614058e6b6288a9af61623297d97a12f4714a2dfc932f2a7b62a1c4c506d4d62f4c35c475f923ff0b4a25dd2af446af78e82633483d4b66991a8c276717e06d56abac4e8e791ad828d40e640fa8ff7b53ccfd27a3f48d1c8492cadfed37dc6210929bafac981751e1b25a48b4bab59d5f1d6eb865762f0bcc47042e6bff7f8cdcc6458845948968b6e29b4a2426d8d5cdb820bff5a6b29615506ae92df902863bcc11820e5595a9173991abd4cc4e922a2318d741c97c519573ead215ecfcb04e34f768d9242dfb727392fb4fb41b55bdcadad53ca4c5be8b61a26cd29a364cd45dd85bd392e7681466b88c6d9e603346351df15a0b12ccbb5684962ad8e61a1ad2b36e83114bcd5639ce11337fb6e73477b6516852154b7181b0926a89f3e7f3496847d8a9da6ed755316378fa591a62d890d9cd02617f1b1e12e7b7829ac2b054238ae97c52a72fdec422e509a2d64ffb28960c0ca04cd94d9a020024e95e0207ac98ff78fd6fe0a85fa71e90763d92ef4b8ae20bef4234dbd90c4e621f7cf6103d179dfea9e28f11d801249cf0e965b5abf37c14f04273c922679797a2c0829f4feec4f3eee4687514a0597e0097f1115c5bd630e03dd0f4211d72b823151cc4d637abce05131cda6005cb861b9971ff520e68c30ae2a91b75f2e0a06de58f6f6cb8451251ea925db8915a44156787470d2e364ad4a38c7461a07c2052c10406421f874b6e8425a9b104470a21ab5dc20605d07e128d3806f4e03d95a23a4628eca8811220384c9231217c79e15d7ea698aba93bceec66bf17e8827b7d51b46efbd085952ec1b148a2965ddf9f4f233478595a77648beb4183394b702401cc49290f28a265afa74488e3058cabdb1a2aba728242ed949c5e7246bb719591eb27a16eeca2a8227ffd1c091010b18db2addb61c4a912260514f0c29b243aeb9b79ba443bd0106d3bc0c5ef1c5f83a90bbb1a5388bed4bad3741d132c6cbed5ab415823e9fc5f8db123e740087f741fe5a28491d0a6f55ac5544bf30b54bef2efecdbb0c0d4bdf1b31fd05a5aaa669bd0cbf901225607773e84f8f80c18df2909599e227d6d18a629f7c0cc86d2c4aa78e735b0572bd5a911baf3ede280ae125248938817712626c988e5f17a01edbeacad7979c559dadb2f605446c213a992cb8feacb66ba8313f6960557fcb73832455005c06e2501c32fca16ededb17eefccf0b2bb5259471b4e9b0c6f819d70906191cc61c639f2bef7eccb96309243a24492f3c440353be4c7f931a4ec584e871139e951b6ae8eaaf80615bcbee06e430077d9f6b536b7317b241a9c9871049dd116a5b2f1118a9040dea310df563c29b20431c4206a6d5c1194d8b89e76ddf5d2c1a2360a0a08783f705bea7777b2f4b2dbc35e18c35ca1a49819a9a95f4ca8df6f0d441de01a0a0149e54737d7e7d281c5c21e2988d67b82b546f2418aa49f9c12fbff23a95c74fec669f2172c862a94cc52fb9f561f605de699a1aa695d674d349fb6910afebe13005d948d1cf843358843d5c38358fc2d06b8d9deb814758e0f38d844de3ec7890e4d41c968f446a957c8941293ef3f1b22222af514c183d5fb65c8ac6fa62b87d489da36ee9f6bf54b2049867e1a2f8490f4915e6314d9017fd04e8df2e4d8292ce96ea8b355383573c3e73b7dc5d81666456582b29439f514557500c1bdc7dc13348f0ba6d7fb4a722a6ea7a5a475db884c3e7eb79524515bb7fc39d83f2b4bfc34b1305c8df2a182752ee372f2d5044fecff3fbf383e32b69c22d617a535947393f76d41c10ae8e53ec4e75092adc1ee085593cacf1fb4ffc893c26c3dd6217df10e8f17b24a005d76a0d1b17b7cd955fbf383c833d137fcf678edff44285785f1c8e204f9417d3c2754ec8e03d51916d4d367c2a03846356ab1d6ef7126148a5109076b55f564633f84c923f3cfa8f61a7e4d569081d24f8c0443c9cff019cce3daf4df153e9c45083546427b2f5d9da552c625694a45147bc6bbe9dcd2bb9ce0b149eb6309e2874c6f9ec40c615bf6f66b546eb2d2e3469ad082e8a350b7d48c038aa0848b82898865607d32c5597c15cd1578713cbe40bf892f547f4ae1ed7616a093464a9bc711d6baa3945e2e39b6288665bafec0b12fc14e0c9d00b08f142f3ec09ca4e27f1267866e608bc81b29560562b8e50a567e89944eda9c1c0192cb3c490d64a62198486b6711e431a3a8cdb1848036591264b78716a6ffe2a379c3412ee656cb40a5eef861b6db78e923734998e7e80591446440d019785dbca7508fb6bde65762874680e150d1cf1454d065af3f68db82e794deb61918726a54ffa08bd6b1f14487c0ee44a95c552d8568178375e61c9900bbb94281693dece44b307149bd080738371f279929b569d15524b1cef3c2534c1baf9e7cf14daf417a181336675082b92efbe13b99032b80fc6f82a1dc3b7260e83eb85a4ae00d65e7c734f10b23179db7e15c08d0afb3160119989e80a0e666aceb5946aee812a208ea3dc1b57362ece41127741b7b35e607875a97691a69a4ff72e2ab8fe5e0441186a9e81adc822b1bf2886d7cefa11771b9c007efa6f9eae2c249d5fec8105c53ab0c49ec1c3ed8b8c353440becdb982d8315fa007613727921f1a503f6b5f8f569447acfbbbf425e06171ad7397a76efb1c8b1276a78d11b2583b91ffe01580e7af22ca539f421dc551c7d3774389c29b0e8c238058ddf71dd722942a8c6c53ab430ffdeb48e37aa6156b6933ebba4d8d2144f734ab77b3bdc560a6cd8ebfb2671ed7156003a01e7a470c6f3eb7f93793c8350b5a86685f40351deb7219990d00a29ea75cff346aede654e84369e88109c0de9f5b6c645383631d8f39a2d2eb015541c48a8ce10aa516ac823a67bd576dfb26456e76ffc827cf18a16451771305fb99891cf174a8b59c47e1cd1baf4ee9302b655e899bc6f02ffa68320d9b0a019b50f4a745f53e33c4ef5b2aade2368260d40d98cab47a1189307d321f1543329b933d2e1b6a847c6294f80a4c5049a0d128f47db497b8223f8c0514733861702afec625c1e7e1582b2bc12d9beb6b50ba8fdf578d1157d6f710d2d1a94ab7f2d16622207620c3f0e66cdc23be46fd46b855a95fb1fd561355424ee0bd7608635b1d9dca8eab11000fb55fa287c7d367310d5b2010331a1323bb8917f34adc45a2d580055bda7433b102006874843e02fbb286cf4400be9c1cc4e1de4402000202eddc9511558a7f5c7be7d0b85777fc16203c86467a7180474bc1f6e213d50fbf7907584352b2393c605de15bbcf083b1b8e18bdb45e66f11825238d27cbfdd3d6d3c76d90927128701aa3571b3a514213981dd576782a40a84075b8bda9e0a061203bb4d128a9a3e3eee0a64a245f20a846be68d7b9991e523e5c31264ddbec6979a52a6fa9ef1d72c4466944bf7156825422dc8a5dffbbc6462c2e182bafc61423278c72190eba032e1a9f15dac0827af14bb0b5c5494bf80d094b634694c339df4a79f7eda694993a634694d379df43f3d3bd3de541a2c877c23899afc54117b59167d28d50c0105ffc94d26bd2808028cd28461e7f791c01d448329707c569d5c92ad007e9f050c4d4daa21ec7e868a18b4cb7eff50254d3b6e2cb321a3bf39e72fa50ac27c1d3d7b265b0d74086ff05e3ee27eb254fdd2420ab55c1d791a80075f9a44ba0a103a4efb4e62472fd46d163f32934cb58d8f115fc5d71d53d9acefd1b62e17013186a56f4158e4ae1ee7474721e4327f262269a465edf25164872856fd0becff9cb820934d48c594c6a5ae91c1e0848ee1c7b207fe97157a0d454312c50acd1771d22342ce1a3abf1adbe5d9f2ba5836cbfadae9740d24775fab90ffa619799af389dae8e4ba8bf853f75abe65ae896049c40bce1512bfcb2c2e215159c9ab5a4d9cad4ecc5503e16cde7dc75e7668e53d6f3d873e792abb7d6fd8fb4750f41d9bdf1e743bb100296afca03c80ab4933097194bd6fba7f086040ee2f5988fbee19584d4e3fe1dc5a6ac12bc5ec891d5c0508471646f707720171b4f5f0f8ef257796e30102ddb8857984d501808cc3dbc202b0fc09a9d72b6795719374d74d86e5fcd06510cd7218eaf80a98505b697168e762ccc244b3e8122847af2bf15aa5135b42539877133d73cf22b0be9a0894eb9f8f546e0ba7ad2314f728df200e4b240cb0f7b31a0674911d8b72feb62053d1b95ebaf65d3a723657b8055b59da1ecfdae2a14b8aedec6372244ca19f2309d6af8e44447535278d7fc6c235f500f58ec52e9ae7ed83955ddce11628a000cf2d1eba7031cd3a829553594fec120bfd9c657a960f7d5845b0723739f7824631b765b9e76b83f34ed1964235ccce9e191562e955b44fc4ea360894145b02cc0ce48f2fdcede6d2b80fb235b9267fd27258b3544a5d866a55b77e5098f1bd11d4d174b42e5ac4425da9593939c49fb722f1977feebfacbec9afe2065d4103bb41b2412971d7b2882440e842aaa713b475ae2effae2986365412e1105ffd4d9488a0104e3b8681638bb5b486a75fc887b0b3e1fd182d1a2b648768497055f8b960393d3551b203eeaedd0aeed7648685e671bf985ae05ae0bed7a413d1a4b6d243fe8cb32de48701548b42dc20f71b32a2e5f9fc213571b6125a6d85c85ab417cbce6350223e194d19e36f08c20d931fbc783c5c9d821aa96d168243acd2c5841b39e7dd1993744e2227060dabe587d616a99664c33e253c8626b2598243c864310dc2a7282ed24fa4c2994486065d56c6034fc131372e65dc836c57242f211f57ed44b487cfb9e237d841394c482575a562908bbc2ecb0719b9f324f67d88abd3ec47c07e9227a754ceef459ee3618924c98a8e94cb8aea213b51ec5c83254da4bdba91ce9230c3b812c138211394646a873128e23b0a6a47de6843bf2c53d0e4bfc854c22863da5ae3fb4fc136cc01ac62c29785c49eb8a415264fd174afb30e7888b05c5ce3276c172ce15fe100d583c7ac5c96e58dc7ca2989c0b009072fe1eb71d8ee89086f16fba62b5c2df170d176949e7f0ab97b2585adf069ebf59bdbe86846501ef0d8d2a7862968acf7236bb8cfca6c2484e16b488f5be89914e1bb9fcb1870723c40c7349e954b1e511ebb63f80403a519d3357bc7584ee41c84fccf048963a80e993bdf6c8a8506c6af414ad1e2aec458c55eda14d2902283f556938f5bd77c90140846d94157eee4b5f8ac9a0d14a280b1ede1b8a2fd2bdb1e8aa8dac406525ec89ddf7af692abd0c1070f05458931ecdc3a3d6e342a26979118ad53fb1f2a3ce76b7bacc262b72d596bc4d4e6cd9048345b36311d37bc9f8e246c0619fea78e83514911335a5d468cb6129139ebace263d0498f319522ddd3aee551b68a6d32648393f4ec840eeca38b2d64edc079bd34e5764c9cae9418ff4fad86327d8e3af7887eada2d39da115ba3d0eaebcf38e8fd96059c48b5f1188bded2e6a0cc1676e092298ef7b495544ae3992fa2988d0f6da6045675d25f4072c6af6919262c63d4a5e41a3b1334d7c0e074ba4cb8815c57a004485c9cd10339ca503d9d46ec3cda32c57fc90fd94aec787faf38764abf11b0c1006250b4a70d192d81302a20bd2349945b1ec6e6ce6eb10d54ee2243a69b3f714a7b6fa068189037cc04af8db244e9a2b0ddb582bb591b1b3c6fa0552d903d64707b60f5eb401a2466ae6ecbeb8f22e1af1f2a32c17a48bd2180f1c5126005929e21de6e36463c6649ffaaccd1800bd38553443cae9500411af56497b32e719d10b4875f3acb5531073b8e5617f47aebf1ea9b64bb7adc3bea75b15497f4ae5f3ef9d73025b6fb6db98460465d2863f6868057b5a43533865c215595849574fd0b5f2146c7e505dc5fefe0f22449b044fa18b286a97e6959b730a09a6e97af9cdebeb1daf2431abef513ea0fd51eff4bf3567e8da3b1ca3c0decac7f5c64de3201bc4b88a71d1aaa15dd6f389c7ec9d0cde61bf04864ceb663c276b781299f76e8e679cacdd6efd749f309490759860f460edfc4ca7db67566796de792ed2f120cada2b28339b2473a474430b9b0d9611e0a066969dfb7dd90e69dd848ef48a04b73bf368e42a862562529d6af0101feabac15da153ecc8edaea721b3dc6837b4cdd93cb52f1c817ce994ff77ddbf02bc0f52a5202edcafa483949c129720169eb82016738f9e511e49f4d929e772d4b247b4dace794a720262a1fef208a25e7da92deafd6aa2b66f222c5c9ecd0928404d61017629a1d0589e894b15bc00d9ed4baa0028f44fca86ff5c966b9fddc068647093dbca558de27be9c06c087bd86cb05e90e0e8379d6979e843750c757fb788e1527081b47d48d9823f426e1820c189efd7b29f411af941fd4c11768b2644a90465e1503c778a4f7d9a9e05e99d0bf130360e9d0c728cad4a25b3654e6452c48e87f5b26e21f5626d14825f45000756afeebe510d32c988d1dd75db1453b8e8bf7cdf67fcd018b645b3cee83fb6c1383d6fff8fcf126f7cef256c775020f59b3b75d914829f862a6ad16cd429767c70c0a15a4b7b38341cb844afd521823067455687a3d1b688f86be211c18a42f2293baaec90f2c9a27c38bee057db2c764a667f2f2593214006ea5f69752b04f257b1803e94fcd682b00bd5d2a71c79defbe44262f420bdb8dd866f884c255c5b6ac1e6b74e9512a592c5c30ce9901c841cf38c051ee12a2710bf27b901149703ca3a6027461c53a910df67663b01955c9f0732012b55cf7c5cddac461628348c8486874ac87e67bf562b17047597d014d45778cfd74559101e74044517a82c04cece3d0beb38b8f225c47c4139a3cc3c82f2dc8110ffd4c5042b76b2d128a196ce742ba1f16a71f745dc46ec620dc48124a551383824b4f8d49e78d284ff0409f679cfc84d448e831edf51bc645437396d10a7b4f128e7984509d3e96344fae2b44667ed74cf7804826a964eace8f3ff580d40986e023d771c5dfe5175fca09da9e531657bd6fb801d866e6c5fc969ccbf9b9ad8f30a9c34d393bf7fcf863a417045fe8b3198500eac09b6eb00be0a1561c59afeb43f637913dc42c35848a50fd6470e1916cd2d47b205a45f60dbee06028a47e8e09e38f87afd46a7198b82b914b802820bc2c8fc05557af08c00a573e6eb48064da7a94d309a88c6178f88b729cea5324babdc0c87ae0942ccf89e9b5bbe3cff77afac1f6ca8bc507312d5479d82f4c27cd52d9cc19da14db9748b9277b85605a5a0b353387988a3002dc9f55a76381551a64711ebf50687c2166491ec11131fa5da29d02061d39a454f34e9977a0ad560f57ad3999622045292b635a5b82bdb535f178695d1b2e6b9fef1b454e6da1f6057d0c564d9880efb735e2cfe323b1cbfb3a79997a520273b3ffd1a014ed16761e0508e968223d8c50ad646fa1da8c9bf1108a0f910cf439e5e1395b9d075d0bc347d61324a8180166c35ce836fe2d0182abb32cd2432e54e9349a3aec09ebff22e962fdf7f9c797863e23de3b3d175359288ce1c03fd48e0a5ccdaceb496f7b06aa9b6d303190674ccc2b1bbff57c2dfb8afd56272b6c179068b70805621867c6628344ee7a642f85928348b23724dc5a0a6acd22da22a6c102df6187c6b7ec3b5bd94d6658836faab0b1362a129c5121cd70aff980a0f4073dadd23a5a3f0e3deece338ad8f2b9e3f6843efe404144e033a7b96835920903a930e2ba8e1253003bc0fa178c2fa9ea17e0bed3027203c6f56a17ddbf3b6afe802bd7203e7e01ee99455c9cd758a420d06a376f718c0bee427fe84d0066adf4ed3116cd84b50006188001f1291bd37217b6f29539229cd071508a108aecbdce4b8867292d284eb990318743e39319fd888b211dd727d62b93ea530148f13ca14e79313b62d6c83f5a00c9bcf30ee7dfc30c148f7a17b29ccdf583f9f3a3697588a0244c73e997394144ed77f4e7de1456a05b586cd889102a3caaa5b2c2ecaedc6f27d883f4c68d2397ca1a18cf89158f2e7687232fda349279d744efe231b3966bfd74e3bc79c94a7cf59e493ddfa9c816bba687ecefcac3fa7ebe7ac23cffc2077da9a19178dcd37e8b168c4a9449c11a78d386b44d758dad658da7fbea2b6e997d9608061424f139e5801dc92c1e0001bf5fb9bc0462ea6538bc7a465da743571c236f918c6b0ed2b6558f7b5c226921cdbb7121eadefac0dc39f9b3897665b995bc789848e334968434bce1c600cec9c4e95069feea449d38d292f544d7a8d17162a9cf1d831abaa7eb87f8b61933441580e82b00198b316f2ffc146aeebef6d808d5acfd33dbd2bd88b0297c66c46fa60a3960e146699cbd37dbd2b7497f5ad71f210f3506b0c028fd89ff9cf258e31c0891517a8800b2eac64e1984f1761f040db32c60d66c83ca904771e1d3da309c2b6bc966873670b96f5dd9773ea35bb2c108926083befcd9d206bfc1e6ebcb1a349e0b1e363ed60adfb147974f40c877f8d0e76824ab68e2f10083bbffc6ade0f4c7c611886f6458d14d998b3c5faeeb96f75a2256f8760fe3f7c2e4d70d1fa61062e35b0a874b161a3820b9956975718eb038bca46692de238ae7294a824e2b2e5964f61203b92bc4c2925a3b84459bd3b4b8756971c3c369159c86bf92def63aeb5761edbc66d7c169a7f51e871bb99e86e24ee37659aff1cc0c20515258a20c2c90719a7f10212524c3943062e2990cd0f391604092f5a80c51552c8480117b21bb42b966cc1830c429890cdd973a2e1b1c758d675dda53d652dcc39023b1de02f1e494dd69184267b4efea426fbdbbdbd7decf6f61f4b4e4cea4e72ea1c8f24ffa36eefee1c3b96d0dc79b8b70fafee2be5b13df39c93e79c73524a67cc702d6c60e3685a29f6eb4024966a800c2a220a8f6cf43378f4ded6a38426fd374a7f9ca00290391b328b5826ba715eba21ead31e2de425dc7cf1ffe1a58ddbef216b04c58f5988937cf4dcd93169557021ee931ad624346c8e3646261e913772834475ac0122b1fd4e5d6f659e2ecf591215c5ba19bf7df5b011cf22a2eb4e9d15c6191efbd4f182e1789a7383ffbcddf6e2414b8ea31ce5283752cafde8553189521e0de39e3e0994dbb89a44396ae4c846c3e8b66ddb46b95669c034f49dbebbd749dda9775bb43b3159615879cd396777f7eccebe66ccf85bdbd0a0b5a3e7ee9eb38e5db6a857fc69f4496832a97b7e12a5490da3fedc258d007429755a69c783f3b1e79563c7d3ba9b694ee53da45daeb8a5e56410a1a8a8a863d2e2585d11c762710f0467c91d8da8eb1cc8dc064eaeff6c362343e669fc709dbb6e832597d57145e40e3528b25d21771b79b890e328d16a75f191a77e5fef2b85035569b5d65a6bad5589ebca96b5d6269506c64bc13b8557a1bbdb364e1ef206e37190379dd61258dffca1f27b45975dcf5e420f1f615964ab4af287d41c9db845402efa6eef6ddbf67d431ed2e9c0dd7e8af5c78ce812752069b2e912bdb9c2fea0b48a29470902a5fb1c61686d50094d59a05f73258cb1aad5acaaca58f110d0882d27d5a46a589d5e4ae8996bc152375fd82178e47079cfcfdcdbec6deb6d768323ccdb7d500bb77b6f7c96c8a349dfd1a4d7be4f0a91d3cb422d0f78b0d1f6624ba423b0988bc22c73b7918887e8036e2d7fdc6a9768532f3ca7470d9b48e612396724d10745473676f02021a9c79ccda5a9c4c35cda21ef8f9a2db6e4abeb0fa48705ee886986e9e721fab58974d7591bb214e77021bb040dc2865f74f431191279ec8885688e1d3c1ad631295226e9b7c84cd2e7f284ef6edb330a2c5cc6e2068bc905499f2c6a181193b47b66891d7783e8a2c00279b76d4401c8b51785136ee5264d70d189cc421ded589646e729e74569d2a1be6ca7276b1015896023c70e1e49d309aa9ffa4a4329ddf22fbd1f852dbba99bba096d5a168f8a7e6973b49b3647279375527617e5c2dfb7e3260b2c7a86d041cf709e6641972f9d4de7a4b3295797f029f37ab2401d343dd9a98b7988be8cffc873db578ee33850076b71b9ae76d49588ed68a111278999174b3d4e6459276389ccd6c36ec9b30811e29a127201db512b9adc7e7df7f6d9edeeeeeeeeeeb3dddddf7a8e1c7f7d7c0535cc475ee2c2abdd2c2aa2455f04a363779da5af5184a2499d6e4547e5df391ab145470d2b3f609a8da6527ef00178396a0b995b06dd7e0dd9a0fa6bfda326fbebd875d65acb429dc34693fd977b5cfa47361a36a71fe5786ac4d20fba5f4b684f4ab9c8e0b6b5827a541c6196b9cec31df48fe065cae830d99b8f3a3cd43fc10754af7e2b74d7c9d405568f46070e456eedb9fdd4bec4e8282cac6ab3bf3d3d5cebe9b93d3c1a56726d474f1059e38318d1918da8da9d4f428fd78f28a6ee1177feab15f43d946301f85235831aec10668a0bd9fc8f636ca58626c050a16111c249367fcea895e7df3c1b0bb38bdb9fd4b197f5f7a8ddeea829b6dcee2829b4dbdd3cdb9fdc36e2f6db277d394a8a93cbdc01ad2313aea7c9fed0bbbbbbeb3e70774f2fb1dad29d51609eee1cf969a2c2d4ee1ce77b57043f9ae424af8a5fb9bdddb6f1d5242d7be8d65b0efaf391807e7c7a787674c21c9c9b974d0d8d9d71819fd762751c0ff1100f390ff15033f191bbbf783edffd5b98b05040280989baeedeaf26bda8f0c469d420e5298993349eb8d468c208134e64c1320498286c88b19666b3190eb2fe1d5264fd494da9253906e60025f327ba1ca35668327fee60327f0f38a66355c41141d40002c7680b64526c92e819a5614e27bc0a4020800317247630220a932e32eff282ab2f421819c3899acca35c779bebe3f7c19d248fd085b4cca63b73cc3076fd498f852005313c4d3555254146e6647a20020d264b387c3184cca1605d1fed57844c81de32ec39275757486ba66b6386476bad20782024d2266e7bff6c3ae3eefd5364a3fae3edc943b47a0b3e435d4ed5e57ca1fd5e33e4bed7142f9c735153a8b8e55735a5cafda4504ba3de894054f4bd7aa63cdd32480b6f5160de45dd8d258b102fb8828b1860b08204161f76588209289e98dab8bcbad184a2dbdd55d2a86ab2051a4c6396645d860c67c8804315283380e24ebcb03131434f181e85417314f677cd8490af0bb2c4195c282162040d4c61644d822cc2ccf085175148cac8daa16ed31f086083a18ec2d9dd512c7175bbdb25eb7e4551d12eebeefa15c5f5845dd09de194233afca8293a4c8941098f9f835e1d0a138ac7c043504d4269a91c2355a4624974bb886b0a5b76def952129e7b344faccfe5cff9c680506c593499d8886f05bfd69f60d848a97a5f7f2af95a0b43a7262c78ef5ae24c4df2b43c91a77b30072899579bca754d61c12db674a66b1d85793b2176564dab7955bf67344facce9d646ed9c2658d1d19556c64c546f656d7d799af7f6d9e659586c6be8db5f65130f334230f37a2302fc7321a5b86fd9a6cadb32a083befcc85c9aa78ba110162be78ba828c990bcdaa0667b05f9da9be37d577278ed96c210303143818a14318597d7fe258901c94e060650a31b0d06e20abcf2028c696b15bbfc5bfcc5571602cb15d636c44bffad6ac2bdd0faa26fbaa4a2a0a14949414549426a7264b2814f8446b58fd99f7f957577dd5579d4469e93a5992525052144a6a1bbbaf3c469b9a9aa638bba9999a78c8699ed89d2796e796b4a9c96314ca9be66c6a72753563a3af8ecd047543862dfb0a6a56595df5f530ec18cba579627b6e499bc0c6c243fe4e608fc143febe44eaeaeaeaca95aeae8352782d6ff425aff952cd8b34e91feb4e6762a3ad3a3dfd752b8f0591f9fb1504be079f84efc1ef1e5b0f8e3ccd82f7416456eccab05f93e531c41bbf1eac1019636c5999ba6e6ee121a67d49e44b976b5e6e59997c69a3daa636da46d530dea6288d52d1294aa53255ab7ab529fdb04961a35aeb375a514934f325c934d2259f21491711915b7d2275aa3af090bf27522817f28de631b7da62d866db9086d10f436badfcb71e361d36155cffba7122956ad2e9167a061b4d3a06ed8282a94c948a5271abca54992a5375aa4cdc12d73354509aeb39a9bbc646dff5ef2a366af953930ed5a47bd0369334e9b77f8a7429ca32926dfa6f736c2441eed8453c9a2776c76374c9c99f1ab6cd744f1215cd9e4d27876ad8fca2a2b1240a6dfd4a5ba9496f24ad4323918488fea1079a271687878ad060836e3faceb6cd7ba9fb6ae782c9a207356c00bc30250aff1efe008f3f6db166e77e3b7f5685d0c9b7cd56cf9d5e7a0da4313363250a2c3174a0c0106125824e12289174b658c91010d9a2898f009a3cb184e4881c50b4a506828496207214c5c51060dca349d74058d4051a625822491c1111b5cf0618b2a3403e890040b15152ecc400b369a1384cb1e5cfe52e872a973b96485a1b55d479622373a0d50821c7962c8104a5678f8a186326368b0430d523f443941511dc982d682197c6115d68a2862450a95a82a6cd0351f3ec6dcf2b32a3fab69e5c555c49694999c94765d2bc2ebd1c3de1a86dfd1a6152592d0f0e2ea8914331031728f20820919188c01a2cc557daf6b18ed9a9cc1d6df6a2f9da0ca2c17b32e549fc3a0186c696fb51556e3d67f31b6ec6eedc4ae0472bb4b7fca38a882918404a68628f105195fba68e12e66c0441055fc00c31252baf0267fdd08de74e2840a8a134e5ad24c244945924bf32793c7e692169a3d9adcf9938aa422a9c8bb91e494cd9f734279a141355f587f6652eb7b4d472b83f5f10399a4b17dcd2b73c5f101ae3fc46a740de71a6ce4ba6d84dd6e59c36328288772a8a323a07842799a4e9c4c284c4fb1d93499a6aca3cdbcc7df639277e04886e18fac4ff29887f643f2bbbb5ba1c726c88d80a2adb717e6a49a9af2c20a98e27efea49a1d579975270472f06023ef82c174bce5760afcd5e392b03895b03ab1ebee6e8e726d1362566ee2b944ea630528bdacf53c5901ada39e5fbbefac0dc37f2f47c7a6151a0f12e627f59826cc3f4185a63b1f48c778d6dc06f23891cce69c2149c31c3ebee6779db6319ec73e63a8b5d65ab7f2ebf840f5cbed691797670c93f9963f8cbcf3b6f9030f75dbc6c3856adde6d1b66d9b8f1e4db2b3b3734558a0bfdc3d10a5dec2c1ad0db9163133f3c6bc6dccbcf106449de16d1c157d50830c1a6bbcb0f3cb20a74e9d3aa5cccccccc4ca790dd184bde9e3da79dd3bbb7938848eb072fba4595bfbf4b111c0e4d3d2f435def6fb621777bf78ce26f986af2bbf5bb5d93f3882965a69429e57f4a436aa758cacf9385e60761f94b9a82203a4b088ab295474798abab42df1f3c34df471e1d0ce6fae8e3fd991989832ecde5a82d33687581322d0cb6b49426094b5efadc306850892129d0db75d6f65233f5d2edebedd44fd818ac8dc1d250b1e49ddfd47bde39e79c444da530133d833eda36d9b396ddec6c65ab13ecd7555b69f5cefea82634d973498c2dbf632ba634c22793c89f4de34d8b3ca9878f1f27a8c0829d4a4bd499ca51377def58c725905bbb1a4d864dc3267a8319427dbdedab200e2e8b4b060e34e8e2066f01e5ce175304163c7cb1c1164a34d9f285ad20c155ae30952b6ce5e90b1a773a00e76e631924892f20c8d08195168bc562b15a9cabd4d103085f988a95212a481adc18c3dcf93b2fd05819c15c0a3ae075b7b10cc1144d95cbea581d8bc8559ed0c46581383c30ee7c8f3d573902da1d411a33503688067450e5e2e8aad0d1b75c410956c7025d6509cc684047c50571d41d6ef8d39def791f27faf55a9ed76ab5bc56cbf35aad96e7795ecbeb2d5ce56dc0a674e73bd880960b3a42b87323818758cf89933b607d273a77c0ea59c0cd657d59e4acb124ba1fe092b8795b63094df68bb1dc98c25fd66f5ff2147719c451808b02972173278e72bc2c8efa2c73535861bbad57a1ef5cc0bd5eeddb8d3c76e4286267ff146b90c16a17941499a7cb523748830097a5c814b9e2d6c4328834b3024b9fbf87146b1081fc85e5a82f4b6e59f42bcc5b7e403249e4efb1183629f6e5a7a3fda82f48aefb18c463d3317cddd4f00a6d507339ea8a215ec678e9c24b94972b515ea0361069db38ce4b92282f4df7c547bc10b9af2627cf0ef8bb838cd8b2bb5f0d9a29763e0d949d48958dbcd67b4c5ca04735cea949630ffcf640cff31e7c702c39ccf546264a2f737d904bdfabd888c7aff75df3984b0a97d84e623711fb89879a3e9d599ff9acf5fe93e5332014983f674db6ed26ade42e5868d22565fb85e5f6f7b8bb5327ea449d58a8df9d6e535a77d5df2520834c0dbc584165c58a8c9e318513515071832b1e6494d6c58c199a821612460c4d44f3d7ca24a64a19386871c3121b786148152c18b3c41259bd72eb9359b6500ae123d21c84a1030d0aab2e65c490d11a5c589205cd89530c56a86ea8b512c5ba48a182ad08aeb5d627eb134d284514a94e50b327e0821ad090410c9ca24011800a8438630ca85a9722bc4a13dd6c369bc1c0501ee332d54b971994bc9b08ce4243194e51c22cf181e6a4065d6000c6851882e0c1a97421523f31b6fcbaeb82a41a9e8421c4195a84b942a45151820c1861b61832a58c2e4aacd68ae4052796787002cc0e57e068e2ca124f74391203337c8a30489a886f75f443a34b9f0481cb1656abf5aa0deb5aad566b2cbb916ce6c6b2dbc6d2d6b10ce9ab63d667342b4a69102856a401460a3360400391204da6a87892015515281d5c0a9726381f32fa3e7e501eb20e32b36e453ffc808b0cbe9ee1eea91a7290d5dfd1d309adb576f5bbf0498f6d80091adc0085911d9ab881acdaf0a285185f9c78612546565dea562e33dccadd4ae90d195bbe6ef744e998924029a54fd227a255c0e8db9882c606a6d4dd917cdf1c4bb29fb31df7f239991b6df557932690f69502bd26907fc46336eafed933476b08da0db6860925ac1052b6ec10b545c9086baf8e589717ad2936cc528405a31062679e4c31f18ea0cae1099512d58c3b4b75cbb076e96cd77507e83e2d617888da0a9a01b444e1d3c1152b0fb400c153002a25222d38bc86a43ac892c64e0da95a01b28809098065284b959c013c51230b122f212a5404c8f28217998569005968080520459550961918002d3412cb988f83282b0160116383a60280a50a17009e38c082c4384510961e42d10a250060b1c1f5529c462c42809e9012693570fd4c49f2b42e5a3e556a401d2d4b4ecf94aa1f1a1122cf950f0d89cfced4ac8726c446272a09cf152d7a4229a076ae68a9c9c162a57325091d1c2aaac2eeca0b6e6e3e20222a42a235e574578ee0bca8a870d2b0b1a982e9460cb0660aaad7b7169a28a690a2f06263ad3c4163af34d55849a29bb1b2446325069fab0a9ab5d2034acd108df9f9beaeb351965c1d181b0f894a53152d2ea4285555a0b0525560e08324d554a586171214332a645e484e24a1a2850e9296272a547490b0cca820618394e58aca0e4048535053c8e000a90ad3942c6a90a860b256d0de7edd07221015958f9403abbb2863d8d874eda5200a985b12754044a172cb8ea88b62448eed88ba8ec203ce4c47eb5a65d8d7e5a8283340614132de0bece8a54586dd79a2f582dd69f27e80028720a0508a4119deccda2d5a32d89aa915d89b2698583b44cb89b53c783b3c51c32d3bafc813436e49d4a272e28c5b765630b16c18154512554cddf2a1584cdee7b558dddddd7573776fdddd6d2fd7eeee9eddddedd6dda9777777777777d7eeeeeecf6b813388b71de2d930cf9a06798827cd7577cbcccccc1b0f752057f401a594d63a5a4a79fc3aa6de7dfad3ff0413a4ecfc560d1efa30ec3a4ae947e9f310ffd87d2f90a3d4b7996a298dd7b4cdc7fedf2dadcf0bb39dd68d436243cbfbc01a583eb6a380fbae8e2d5ceffbf12db98e5c66b98c5c160f6dad155ae264a18d35f3c399cba21890f0d2d13d78803879fb0fd4f1b7d28480a6c865beba3f3c0604c8d8ff8140a4d8e96fe3b4061b4d19ba970dbfb9cd6dc6c20744c48078e97b36cf46315cae220f6d938501f175a3542fbdc1810127e7e31fe4564f70e9fb517b392f8443745cd849018f909eef47c326c7beef3e4f6c89eff97c3f1ac6efe1b06eb8b16b1c17bacecece92b4ab540d03c1cb5a6e70e7d30a50d1320487225890e4886c22014614a9265c78c2031797a2eb645436f542d84336c5829052a62923ee7c393d359609a3cd9a94bb73e7cfaac6d2b0d94abd3495c59d36777e3375533b4169288fd99e2ae3ceefa986e974adad1a36a6af7ce64a541cb9f3bd882f7912676a629fa080b853f45ac33a58955bf9d5943b05309f2af97cba349534cc63f2d86c726a18475141833b9f3a69d800ee7cfa44690d9ba2541eb3b44ac99d4fc16898cf9d4fade8d54c095c4a52991ac651552071e7d7250de3b9f36b5375aa4f15aa6151ba4a79ac93cdaf348f51d96caac95c0f8248ae0efc0f4402bfef3d10e9b3deb740246f761c83c93a8efb0d44e2eceb6e2c66cee8a5651cb1258c238290f2658c8ceabaa68b090290534a165d5ae586e50541d84067fd4106568b7221a3c4753e25e502a519a8fb873d75fd497f22f772dd639025b91b8148756ef3454328412c91c113972f2c1843481a4d96dcc0440cce6ea1ba642ee392fc6cb0d3632eafc5fa3a6eab1ff5afa7ab6b5bb794bc12baba7e78803b5a9dd5f2c0ef392cb2acb1243b3af670a1bf77ba64b0f3995de0c745782af9901eb55aad8fa0a0a0280b944be27150e9b5399d3cd6b23f697ed6fc1cbbebac0dc3ffdb2411d1f5fadcd16c48b352e18ff9c4628d8eeeb29e4f702a9fe22becf7f7ed8ad2b05a43f3fd5df31838d30e6b4a2928ea7ca25005684416eb74a0469c24b8a00e9685c13a1427ce1ad1abe84ea243b950bf15b91130235a16dade256ee2276e275887f2984fd17ccabdf46fa0d3b2705a4747e6fc6743d14489240b11f1e89c37de78236f4d9a1d90ce6b5d7b5d78f57a33fc1e7bbd3c9f9f67a8bb8b79a82f8ff305eebdd9e431977221ee3ba9a71a54959415cdaf2ec774c65c910b71e18f0cb0d1f34f366af0f99d8d6a9edf460e251d92cb1d945c84639d7b8063ef425cceebe6f9775e67e6f93dcfe78ce56d5cc76a791fe86a91b55caff2d894713bfe7977237995c75ec6bd5bf9d58c8a67c71d049da6a64511ee0ca8a3afcdd7892d1b71cafcf3f1f96c7a2678634e10e905e2f85b6f7a7a7a7a7a7a7a7a6c6c6c6c6c6c6c6c7c7c7c7c7c7c7c7c7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e8080808080808080fe817e98ae7d1f1b0fbcb1ddafb369813ab6a5244c3e3e3e3e3e3e3e4fa448e603557b1a9b7e7e7e7e7e7e7e9e4891ecc709080808080808e88914c980ba7fa01ffb3e3622ad026fd0fbd9d8f484762c69464ad38137faa8e67329a73995d7667ee5556ef57d1d088ee50622855f27b2de469c3217a274a92aabab9aa46975a9a9eaac2a7d3e5f0b504d6baa1af046bddf37adb3b496b6a2b168a14603eaa8f70bc3300cc330d4d1d1d1d1d1d1d181aa3d8db4aaa7a7a7a7a7a7e78914c97a9e7beae49c8f8f4d8feb79762c78c3efe7deedf873bf23723aa26521ff500c59c85d633933ce803afcd2aaa3c33a3a3a3acdd5bd75aa4e8bc5d2993a9b8eced499530a57a983f52d91f59ec8d7dbf97a3e9f9f8f1bf64d96c87225ae64ba1277f216b81257e24a9c0727271fc29980af4275000471b0098004853cd7d754305963a8001d107930c6b51e635995d5e52893c78624f1d8108eeb9ef3b8f73a7186876c088ea038ad7bf0d58836643a11bc3dc65dde63da6b554ead5c88fb1b915e15a9f51857ea327a8cf798ee316d8673ef307499cbbdbf440e0491da003c1f4bbcf11d2b0e00443f7847404bb4dff77d1f6c9cdf176b89f6b6c8df57d4b64ad1e7897d3bd1757544ca03e7c042dcf388f4083717dc58b010f739625bc142dcd388ad8549ee6bc4cec243dc836263e121ee5b6c1a0f713f23a6409974370515eca5dffa1b71488bc11e704fa4930d1942e465b4c83c00f7448864d4087bc03d556a04705f54c47d8f54aa498e52b17acda85433b910d74e6607dcccb33af0eb532929a9cbbd8d196284ffacb104eac632478946a9d6d58ce5cced31355ac6e59e66acd9b1c6dc81fbf788dc933ff7e46379d471a16803de98f7fb666a2733a3733e96e0e8e4725f03428def881f4bf4c6d88c19d34a658c1933c68c566a18ca7821cc106642f87c3e15c3b02afe995b3af85fda4b95ccd7f825ce2da912ce658fdd8c33239321b502c340b3cbe570cf3e964db3e86b03228920828d7b0200f0b1c49aef033f67f2fbbef25380d1c71269ae274e10ec40900441702c83cc6ee9af42bd017180b3366b2dc485a9d5b29835f0f18bcbfd0b44fa16d01267ee4ded350ef9709e7b2a068ec8b1903379743b017c2cf1bb37e2909eb7d9791e9dd0894d0fcf8e4ee8e4eb727040cf035f37e03b917ad24e6608dd39f99c1cf149497d5f4e299ab8dc7fdd0d8ea08ebe411f2dd24204f85862ebce884cc277894c943ee839f81d71c8f800781e7188f83a7f230e01faff9738c4e77f1e471c62f3379f237aa0288279678e804af37ae2bca1b8b3b3b3b3b3b3f3448a643bcf010f0f0fcf07f1f0f0f03c00c2300c7f0cc3307c1d1d1d1d9d1775747474fe717070701e08070707e77f72727272de27272727e76f6e6e6e6edee6e6e6e6e65f628ff87abdde8599cf75c596b4d697fb1b10c73736ada736eea9d2f3ec749d4e285a16ea3e47a4552ec43d8e486b2ec43d15838dbee79ed6c234cd8261aee79e72c1318e85da99ecffc4191eea7f89210bf5df883608d3eddee3e03d368bb410e7b19be77e1a61a315ec2c3243f85ede388bcc22f308c76e1ee7998cc02f270f77cce1fb1b718685be7f891c0b7d637974bbf105eae82b0bc015101300b9e2ba7b8239c37481011e033e4f9cb7c321c607077c8811d30133b8b7d1ddad0ca33430c93d3fa982eb23556a92fb1669111ee2dea68c55badcd31a1bf1e5fe9dfb08b0d10a96c70ca147264aa48cb356021c9b61a17eaeb99cdb63d9e3962ad42ef735808f859480eb75625f0f071658e4f85a9c652ebd3906f8724024fa2c32ae7780afc569755f975e2fb6a4c80520f860d443085f8be9015f8b4cc50d41f8147043706e89c0d789f41ab538c75c1d70562181afc5055c3101a92f1490c28b5f8f025f8b3ed756e06bb1e7d2247d2df2dc1a7072e1a1fa9e053e4fe4db2247dd4ee4995d78a83e8eafc57983db127926d5e5ebc96c642c93f5c86432594d9783a7068dec25f3c49c9c1cd956a7ac04aec5fa0965403220998ecc4726a3deb29f65b8ca15eeb7e8ed44eeda703641be9e4fd4e071106d980dc3963c55005b92533982b2c4a6acaf4872fb6b047d00660875b2116b86d03dff3663df7b5fba702efbdcaf736e49e6dcb2e36ea0e096419840b9d3855c154600411717c4c151563740c00244a1a5905060276642ae0adb6351bbad0f9f14a8444c998b72d4a1a11100000000f315002020100a064442b1489ce7b1aaf514000e6ea0426a501acdc34916c3308aa1186388318410020030c0106648e86a06081dd0217e0d308a8ce9011070b792b4a9ef3d2148ef928f8f219dc6d7ae0be4de457ab73265ead635e264495ea904ef45eb6c2f73a2819e3289ce5d7598308279ccd8388fc541ebbbcd508bf5b7b77bc71f905524c1b0f2b6b558f4c64356228360b905b723d0aa9ddfaf6156d0a16dbeeebf6dee04b0f8a9a0d1ed61f61b909079a54c5790b4dcfe4a4f4ef4e6c833e75c09e5b02840ab76f9aea697c0663be0bb2aa02b8e43a5818db4fcd66f715e6e0d554c8a03fc8f07edbbf9ef8f3ffeebb7df1ffff896db7eb3d887ec195bdbf9736fff598d4a08b1e8c04b4c75eb70c07be32a357ed97faa1a9e5b508b660e46d8a4574b9554110915a7a4bad7e673d6aa6b0cd40a6e5efe605dcf5ea66d671a529695f501f12514f328f2bd811e10f3df599665b01d2acc15118fd0fa1c064603468a37cf23782c191fc00ca82b38bd82c2e928a176b50e724270161b506d32be44959886e1a38505594d1ce781a14408b468cf0a0405c2566cb1a86f7a38779f99cd8eacdfb827d9eab082654d53936b0a76219b7ea9994cdc58e373613ab59da46790eafe6c5a96e811fdf0d11c17316cb1c06a7434c48d994baa4bac08320c88e651d306eff3491ff2307fdd709e93e4a44bc4d34e9e3a7d5b5a2ae934d020ef69a836455c3177c73e077898e18bbdbfaf2ef06ff0e62b95459f880b0738c57b6329c611dd0be9e79c5e8daa1ba2c443f7b7ae621e54aa1edab00cad862dd9cda7cb26847c3b300b62a6329bf1a39176d5e2f02b641c12fbe429bba95304d7659305b49aa39c61dda8559e318d600776922b6e8c39b46ad84b61a0edd2c7931564059b63094331d859dab331b119d00b788f23eded7a82027f983fb269e7c550cf1843a258b0b1552b593bf9eac13be1facc9cfd3f8fed17565a778042ae256727720e2163447f55e7665184392b556d27f9250e81783b04efc2c418ab93968498a8a271e0576b138eb72283ece1a5833c80cd431b90ae06b95c229b002dd571de2f10c54121ef972851041d31b78d8e9609e23732e13dde93c46e6d984373967376f890bf46ab0f818f402e614300733ca5353d960f803bbd90df6718b25132a6f1a2969d46494fb6ab2004aa3af4eb5742bd06f4c0f7a893cdf19d728b86a9d7a46027c865cd0117a5c34ba8135d8cbc50370f4246d2be1781423af2f9579dc9b0389166788eba9c162da951537df5d5ab450d5097bd55095d1cad696b6e1c648783c5004178915a0bbf01d1a53c0673870b84b3971d9fce0e057cb0712a703ac542aaed5c549ea0e728dfb8069c4336244d0958db7645b51efce4ce1150175e2140915e7d522af75ebadcffacb4ea005c75441f28531ad1a23894792f89bb96b94098dbfdba56a260a2d0d959ced147c76d02768073abf1392326cb39e02f7c3fa6b1731720fca38dfb88c2d09c99bd38e0ddc2fd62018616c47a10f4dd9567c706a05a316a3180bb9c6901c1cd19e92d1088fabbd86d6a76ed35485e0f8343cdc4a999612cbbf65c8cd2dc008559e8ecfc331fd92f1af70007cb2f21bed0e17ee2db726985d7cf558db52d67f5500ef9b96ea9d5c790f4dd58b7c5b25f22cfa97a6fc3b2a3be9cc2f2b22710989ab9a046269cef45b5670be6552a5cecc9880c132bf4a4f25971a76744adc7dd18c59ef081e6cb249dcefea728740fc6dc6ce5bbf5c9e4cdf81b6b2a05aa4de594198a55323979269f38918f7c666e5263e11e8b8819f65373e4e225515f3fa576b15d1b00efa06efa2f31cd568aeafd339f7b7680c38813189b97795d5c2b7102136be6f1f9f172ed86f8e0b4f3adbd93b1a22a53498d9a8f5779fc67b515e3c9de9986d113512f927f1b11d9f55ecd738d0df9eeebc660f8ef3b5b8522ccc27d7f0a734ebb80e147e33d4fbf98529a7294c937906d92e35e319904d690eb2a907bd26d0697881fabd533cdf1c3a262104b697737fe1c740e7ee94baa4bbee8031d5fc86d4ba8c9d1d682591207e6df2a4243fc3977cbdf05393361130a590ee4894cf6a333408be8e50c1c062a41e415cb4d2ef0d50c287a86648265a87b77c1e809c45f0f32abdb6072e4937bc9b393f1411b1c868396940a23c824179db9606beb72843d9f78a8d97d23366111a1df62615ee1466c224484ace1be1c5c06bb98f7f07832441308223761d144c956f329e010f83873fe2175c34ee8ae9be7437cb43b9442a2dd57099db09739bcf4540d58c85a2748ac2d80b9f03d303d3d9709f3af2e0b0e415310d2f89b0a2788f042f4c30c75437eccc28ffa25e4d0ea1e2212ce71e11e5a603cc7eb5208aa1d872a1823131e74e8855455c4cde0542cfbbbd761df6027136c541ea7a22faf7f181f819503f7e7d71a75a8ce6ab68c5a6cf75e63f499149089e11ff8a5f6bab1a866dcf0d4d9bbd78d1575b3c207f685c38e72e20d6ee7d139e787d7bf3e918fbad193dffc605b066f20baa0fce1e56688c430934dcff76ca892e99f23836c27749a4ad7dd06816d80ad447d2c06a71666a51427c86855e5ec98c46077022c90dc538b8da0bdeca7dff333b27082c59d7e704206d0ca26ff85330a024560dba515742b6c04677edb38b57ba636f1fcb6906c92ebe820ffed6aee5fc6d8ce5e040536bfcb538a10510f35ca227295eff45463c876fd91c304e28a17d0a8b4f771827df0f10135ce2061405edf24844608eb080beb7dce4b57776438d6ee7c70c794c8ac96221389deedb6d19d1a34be2f29bb6a603258bf80bde29040609417f6861acca4aa83b7fa9e7a3261df0cf60c3079dbaaf1f362611755a07ecb7ba0697e93c42c1258d214ff753e8fc732a56841fc01a06c4bbed342802c94658cef13d9711d53309a1262e8860945fdca4c3b42f17d63f3e8b4b0704e4cd807380a5f5e8e05d8b7ef18c6335e1a84930f8515773526b1d46ed63e2460228aebeb3755adb904f8a1e4d894bce55b8272d15c0c94dcc8ddc07f03f005065e0a822c4d28ec820fb1e606dc4181527973f7cd3ee1d146c54d53ce9c18870341ff8267edff8295a5f7dcd84709e900edf8256acbe85ea6003845adeedf90dd3d641261970ce3cea42957b4d7eb10652fc1998f72097105d1b15b6d09ea1c1d027968fe4bdc0716c8d35d0e72bd08c15e1023968d5568b024639995f003c90756d6bd51125772606be47d7c11a87aafa59e6835673c5ce72932c6f0862bfa9a24def44bb4d719cd4cce3f4ea13a0b242af0e41992708c2490f7c281cd3fd6ea8a80847970ff41f82fb3e3d27fcfc49830b3c01599228a51fbf218edb93f5ebf81f3830230d5946f27c829dbe89577a478271d1d943cafaa9617abe58670cc491c7561ead3fe684de97f4cd2e12a6de8ed4dd8f4d0c854f814617643827a3745787421ae2ee1ef0f2a767e5ac3a150fb79755d29001a8b19f0963870877e7f50b5b953ce0e4505e7ea6b4500c8f885ce2aa0347a56569845718aa6b3bfa46d1cea9c7130479bc9ca7ec6bad16190878347f307a0610f15e7175ca4c2513c0ba560c4a53ca9f8de6114e7032f78d2ddfe4457196827202ed86fb4283efaf52ead112fd8e1c0392ed1a1f7f020ff915e4e66a50b5720aed7633bec0eba96293b73eaa1ac65385d0ecadcf7e7496b789d84bad0af21529f459c6df9c9905fe509499233101a824da36505f195bb93ed520747ea90c8a2c56ba8f3d1efa7330b93ce82a0176cd8067aaaf419334dd1f7cf658b097cd3464a434367e08e180841fa23462aab6c2b447b6fa84365b99bffcb16aa08bc7e0ea7e5564121a3fe8eb0391febccab1be7831c6c6b6132342c636d5dfd34f2e18781c3419772492a52260ffbb4a5cf082c3c1d4d7442661851f2e399e4e0be094527f98215a13a534f1faf90bf7e635299777d2274ff43496051b8894083ad325a039b060b49ab84f89791e6adaa4d000a68481c93135d30d49f14c4cc9104ffa807b7524a4dc0f5e3ecf9df439d5ca87ea767c83fce7101ff1259b18c2a893a2ff8e033a50505cfac4f883ed15a228d72f74ec06f4d165928aac4dde4d7bd70a49f73366b71523f9120223c2470f96c8ea9603b376e0cfd83db216e0a04e7b4098c3e394d84da3ee70572f9e0ec8258b8576d68a92c3f9728ff5a32d9f9128b3dae0af3d860f443f1a9f71786a3df455a8b188308e02b327f67f6c722146eba7138a2d0e924515c2e7265f5435e760d6e3fb56662139aeb02e0e3b3275890452b626ea817702ffa4da5a954b811c0238c5546add8486401966e301d17a0075033397c849fa5f2497c42547de4298b0a2c51a94c4e6da15fbf9a10d447cc86f4d3d2a26a425927fe36c0260b5879f367beb065c8f0df82e0fe85d0e5aca81b1fa2379ac98da0fb9a9cf334a8aec5ad2c554e01df36f3ea3555d7ae26df0f0440e858686b941120756bf5bcf193e4003d3762050d1fd7e961f4388a86ddefa17b3df41faf85073ee2303dfea517ad57082fa927aea11573c3e7679be0f09e7aeccf59323a20886a779afe1ce0e98aca1bced0bff327ef47b5a0778d3eef6c9b2a61cd91ef350fdc555643db1fbcddfa568b41a36b1dc5fa09a876112256f7f0fff07aadf1d125870bdfa8bd0f7d724bc56820e1fdad8dcb7c4a8d14e4e7ce92ef54749d92bab9d050d57145708e0a0ae4dfd8f11617304ba0c54dc289f476d8e9c0dc53cf4c231a3853a588e8b19a5c49266f081bed6212bcaafd87a494e1276ce5140e8837a6bb18732034e36eb516e98889198bcbca4ff52aa04d6162a3f944eb904a56075f6094ca483480d49eb4edfcc59779fb9d78827ee197bc0099e7261e9058eaa459d4b944b6397dbf49f66cdd8460a32ce2d97554b918774aa001b91a5edc9c3e74b303e69588807c2859d55572196abe8178678dc385e89d4d34792659b2d1ae7e435a332fcde967f7cfe94f72ffd2b83daaf867ac9f3f0c56f9c3b551523059cb780fbdca4df0067e8a84b3fd04277e8182a16290c0e93ef62f351ccee345e84de0f0e3fc95e51f08563dbe7c9057f5e4e7ca8330f904d1f08cb13272daaea22108dcb47d89ef1d9ed7cdd9714f1e335c5d8ba4608b66e0bf3585b73590dab0825feabbfc8acb5a0cb8818ba5cce2296f09cbe86846357f8b0abe5c91b2cb4ff380c13da33e9a2ff0871f6269281376bf08285134d56bd644b23776de7175b0afd07510ddedc5547c4ae56e812fcec01fe242833276cb9cf45897df613b130ff5b50acadb8b354fa9f4750e409e8782afe003868360afe883266a79614e1b62b8114c0ac00c33158f994323b72c7bb44d0c3800a287fdeae05013a2ad8c93eb2158c9d15966f886e8e4ecbf4c36bcc0343dbecfb694278ffb51500f8ff7f91e83afd2c3f6137f88b3e80284f482d0d754ab5fa62d87583ab321c02c3815d21e9d7a02908896285caa80213e79cba84d02661b0d1e4dfe00d9366c981911a2fc145f1b4f7c2fb685a861b7794baf26a4d17c8f8083a3b673c8a092050d57a08bf87278a381de2252861422434436c2e1b125fb1982e9def1d7fd8c074e80bfee3dc1697f0c8184079693e9085dd1c64987e8fd019c774cd2e444ee13793cb45a87adb2905be1a74a47dbeb2647f96629474f16000de0d7d6b326e2606317ad4caf490bd9cb9e1a5b35340261592cbe59c140f2c74a1354ce879ce8c5699bacd8b626480b2a3c0c3189cda9d19499e6a5ca703e045e7182e8bdb53ee44515ed48987dd94ab08cdd39e211c74af92474d1311e8e34cfaa1bcf54f83b8bcd53a5e9d7abbfac1a8cc911ead9d780c46b38613adde82659fc666a0371f388d1cc8298ce73cb80e2f58987782ad68584976b014f1ec88e575e7c534127a7b04078f658173958e722f850fa3347c63209e05a5ed5ba913a19ba73818701fac558871fc52a974e77339cff86afa59e48658085094dee6c11698a14ec07a3b48532825b612013c93920650e93dd4d29901f62c97364843cc1d5023f4325dbd5981ac80045925d5d951cfd431064568ef4ee2afbcb7f10b53b1cc37d243d8362e169de45068b61b01f56b1a6903f247546d807c0e0855dfb4a35417a329229135946bb3236c2613d30d97c74efead6125d5c2ecc3c10659143d661f0d15f86b415824103c8dfd29b0bdff7dcb5948567c66a149c3bf10d125070d0eb17416d80cdeacef25656b854f50decfeb047fb9981c8fc60aa0e6a9cad74513689987a0af1736cddadc491c1756e04a90a1567e92469e3f6f287a31c61816b0cb2b9c40de695f23cbcb4828ea993e839a16727b2e1bcb6a964fa2ad0da708c4b1ac351175370b923563be52a83ad6e6631051535d7c71b8522a42642fd1d3dd387e28b065d03bafed04a039024cbc23651aa02e584216dcb4b1a91d14d37251197381013ea81d377ab846897bc39317fd56638029b69ffd87f54fc01deb950c950532708a18054079f00c4da2fa3c83132d5db35fc3b2dbb57d5c7ab7d62ae0f0a6ab84bca0328dadb4ccc38d09703985c6015fd9f4128fb6c19be529c1505c8911c44d26c278ee0296359f9197eb102e9b65681718965864631afcdd86497384771d1d1277ab305b99045e6bb79c785ec2aa15f488f54c4baea3b18286327c3c585911502b46ce9edcce3b3275f702c835ec7b014536a9e2aa53e40c2ee8822cfa52fa7c86d0261636c744b0f96216b09867a6837e821f9606657134ce7f29bd812e77545972e8be7da99957efaa3fb4c34e19deeccd7d57c36fd6aa643c1a25ea4490bb4859325b279aa039186c48160f2c848ad4019ff3914e5980c73c65745a25f9528f8dbe17b30d3cd2c6beeb7759e84c0a180e79c337edc65e70ca4790aa31d209f876440ce075d32c2377255a12c6443ddb7df7b8305be58c553bcc16d17c4b976b4dbd0f07444500c7082e57b9f5e6b8438450e65d31102ed252e721f24303612b50406a69e704bf05481f3809f632f9405c276e2bfb248d84efc5796499b841f92cedac9f47bd2597ba7dd498ef0ea3abd7439613aff9a6bc69ea45f73cdda93f46bae797b9afc9a146f4fd35f93e2ed9bef3e1f84573dbed92e528af4f26d0bd1e0f7a4683b1afe9ec416edfc275709fb92fee42a695f960bf99f1a1d153ffaaa3c7fc2bcf45cc5cbba861a5ffd55921ec353375e724f1014864acecd99a22cc935db5613ff924b4e81208a32e3de5a38232a01ca1e4aa1e93745a99ccca2a555d709fb097ef1c7a7b3317b9632891fa91442edaac6a75e1abdccd8cc235b9755667be27f96ae5c6bf22df8d7e476063a8ce5873198d61733e742821ce67ff548c5d61b50b00cd9db275087a85ae69e027421f4fb075a48fafdc07608fabe801622b70f700f81bb27d085d0ef1fec43d2f703342168fbdaf80a69ac6d631e8182d5b82554dcd5e276241b15d161507fae6b54081b2c48fe17c042d5fef733af94f7737821a7595e00e70f9ea2506280cef9d5040211f1147790f8ffcfdaab3928c02955b531d0f46d1d2df347fece90f6b4012f8e7e5f3aabb0b2427830c497a728c286931fbc64836cb75bff172c4b52ff94027351feb54a84a375c97aa5c372d4a07e8e1aee4fd608e08f67b898bd2c73a0dc930da182b401ba5fad54da33289f559ec0422bfcb359b5c61a982379fb8eec8668a71ab0d3005e6caf7bf3afc86972eb7654aaf26bf54eabc66fd5d1d5d9c2232a8c5af7b0913391b51d978c8909b8b48c8b8ff31f4aff611559f3d3d4c6302d6778479326c05025b6ff5a405f23bb07c3431e12c3d59ecbe2dd62e79756181e28542a34f2eeee25372b657c29ab265de3fc3bcf9c4508e79a74e6f5f9c93b35caeb8edae4ff4f6e1b5f1069a4eef5b1505cf09a5c404a7b07f98ea5388d0596c706bd14c04cb642364cf2c5570df3fd83abf1c2d3a565fdfd5cf7831e20c4dbfe692de64290f93f603f8d4aa7dea163cca5d10f59267b9d779122db90106c8d7c8a39fcc75d193a59a36cf54d7d094f934f8c8f283493c14533512e7d6fc31eb8f0af271cea6b2ae0bad6065b0d5e762786ee3ad03b3eea06a984c014212c94a287f82aac527f11b6d4ac32b99a8a61632e48513eb92e38f24bdb69c896b88b399e891e9d892b6d66e76e665abd9965eb5bad31660c61d3d42e30782ac0e97ed1402bcf44d57e0f8e4003aa6ebd9c2441b684199710721cb940149ccf29bba1e54bd581826288c2b629db0e459fb0fedd2f9340807a326979127033ed6a985307ffc787607487fc027f0366cc838ee5bab3d01db821263db7b22cd9d2d4c95cfd9e2b7a6bad4c982e85173ae6abb9bcfdb658a2a55db42da594e524e46185da9fb4bc45fab5f7c7c85927a4f5ca5644d0f26082d343119d19a96efb9206cafc5b0750a920eb0a0f61df05492956dc595f8343e53e349028a48240df1f8b4aa80ce049690812040febbd85fccc77c115a6f3042a2dfb7c5b96563aceb3f10f6027e72878b4080f3d5e3631fca313884e9cc5b20489cebd51a48423933f7c6a8085256749421ec5444072db4b53712f6988f0482d8627c5bb7b465f69a2944a214b055205218c6332b88f63c76b4e4775e5b5b45f2fd2a62dafe84e889fe775a0a273350f89e60f6737979708370d5d6a760fbbb23dd12ffb733b50e3410be263396385649c20fb47024d8406d27578cda8da9fd015c592d3aa65b2cf937d0f3c1e54d4f9dfe33e80838db498be18d48c1490314c062bd17432632e3298b4706166d213d5d463ab8e894f89c1ada16dd9f82eb01b254a570f8956b5711a8bf4cd3ac62af95336301e9c91c95321743305db5edbfd680765d5ca3c68d759b26d14a6c47b6d5d802e8f48a1e295b913d2e4b2d3c1e2664cffccea44ccbe1c30ee364f26c04dc06d8dad07fe74005195ca0372ad46a0cf5169983320f7845868bb5cc6f5eb3e56457ef4af042caf58d3ee1a6af9c2dc9e6eadf11e17e42b0415b79c7bbe20008e2b788c4fe9ddd74b0c56b6cca8208f9030247b2b144578d354b766054d96ba9cb0d235cd55050828c0b6ff533b8df0f1ebef40d2e894ada65754468ed6da65b18d4e59d664a754728acda2812ba0330c808ea62648533b2074fc7d003a1ec9b6aa3df97e4ff9664af9232e761cdd71e6455876ccac3910bf4c24785e13dd2b9f6a131afc614d275c42a1327bb0ca516c13b2096dd5ef001ef588a7d0b92ffeaa48a9a810c1d63539cc426f27f446892b0cb69f545bd08d6e07c7f92acabb95c6f91f5796f7ee3e44076f913defbc76385af7e1ad6f9516c27c5e863bf080f8a3c594d095164eb87066c6a3d4292798ee4bb8ec7306efbc6a1e116bdf7ee4aa3773f40eaa1e93e5ad85f7c1f455fa63a2c2034974f370a68fd102c570136c657cc47cea7a903de47aee03109a367b5baa434a1ba422991ea37f8e919608d83a63d4cbe7abcabf68b6c788a0dbdf1a7c62c15d15e4f11e1f144c3db033011f2a8ea6d727d5198e3af4492f1ba2f999a30cdd8580fe09f9241ede0db6537b2a0102e743c0f7badf4f49b18ea860621d1c36671d88aec0a7733ad293fceccaddd8e157a06523830069a81ef3c1290c519046dd3db139c9d02f880ff24fe8b7709036ab9afb1343d0de54de4d29484469f76b4c498f840c8ee8c969a6735e8ca34c989294588c81475bf425af6cffdc3c31644dc6d212bd59f367e1aaf3fb9ca48380bf2c949cfed3a0f3ac883095ee7124cff4619e35d5867260bf1960a0ab01bcab5c3b67794894d74861df6e225a033084d77098c500024a27743d78ae6b01e494b6f5da8330329deb449d4cdaeeee774e21f425a1409de9abb0747cb69e673da2d0251bdc419748bab054012da320e4963ef732b67144767e6ac8a2ded9509fd7d1ae54e6738efed705fc980c956db464378295f7d1772cc2adee4b3bd8091d00e4caf029275e17d32493e9b6a1aff8293a3095cceb167602dd26dff030deb3723afab908f805b47d1ff66d88afc9dd83ca079c1b5450d8ed94f536489e75f8990857a20925c6d361ff4d70e9d2a6008b9707b7271d2794653abd04c65bc61ce94d8e037a5506ddd025e1c9603a221429f81521634665a17f950dc8424c07122a2f534fb44ad05ba322316981db295712a7623c58e6d8783b50f3862a45adea460e75e4afed4201600bfd5efeb8027eb20447bd38e0994b2a75acb64a71f517ce0695a7aea40f38b17123c5a241c45ecd91465f9029e4b165d2abcd176894865c8ad9ae5a4ce4cd960bcd446c7d1599d89a1e7eaa7913e17074d7523da6f8d0b113d32f06950b616abdb6552eff035fdb2dbe6eba41b724536f3216fa669c981e9e228483c7eb307505a241a538ab6167b2ce73ed41e58dfe5ba438e03a175530b1d91787b0812774e1776e7e36a16e28d2b0bcd8b33f222816a743c33f1f73950c9385860c090171dc075cd523d6516a92db43cc16f76ae79acc33ac31ae07f2ec3496467c76762ed14652200c5a498ae2241e942246b6fa9c2a815669068e34453de94b3a894061918c0a5365bc42e8a6c0299e1b68297e4ef715b8b6ee94192b889a362d6343026d28769b97f524feb8d666bc1ae0e43d414f097f44f2f5fd5b4395fdd4a7fe9d0e0ee948d09d6bf79419b5dc977856936f8d147c7b7b30a2227287d982d9609bb0afe963b50ba03728aeea6a3a3295f697aa37d374ff4e7e882846d52b0bd8632cdbba99d049e31336b62e193fe043bcc5f71f1e4042a8d57668ce5843051ddcd216277d28f42b48fd6698a1ceb634e2bf9511cfe22128f084f2ef16dcad1118f34a6549d7f40ad96f635254a402f7d0816e8356225e39024eda68813d4c11a0c1520b198e7e1327afde0640c4731ce8e5a222010c0ebfc16178c476400eefb0cb5533f4808a3cd970894d2aeee8486b2708d9cd447fbaa4b8434d7f84dcd2993e7cf93dc9a26d0f9e509ce1ee151b9ea9ffbefa4ff5b481f701599c10500a8627b17a3baa48049ee65925d873c321f99f5644daa5b91563acb77947adc9e3d1620bfa9230db721ca1ec668311ec6cf6796d8365fc2ce6961ebe37de2ef759fba7b96b997b531b549b8d426d87d8550f531779537ff31b34a7d620a381504bd2176c56965c0c98e00064eec95869e963b283ed2cf1c13140b1e7843e9c9fbec7a786d9068afa043cf6a3fd76f1278744909d80c9d4a40f863375d4c33946aadcbfa18349fff668488572d17f0475eb9dfef30d25327e83d70e2904b79ccc0f92edb6c810e64f76dc147ad6688df7074f03bf318ae8db376646ba005ca7f6fa4d6badeb78546b3d1038a43f9c2f5bb06e6886325631a2dc087730589e9ad138209d187308fb3e5e0f670d85fdc0a7ea588311ce8e70d220428b2144cee35a6ed2fe1ec7110dac69781bb910063087dee6976e5e5977199c5e6737dcd33965588ebfe7277760922b7f0bf8a8371faea680812201f5ebef80654acede7740b0fd461b96b07794ff3d9e295846a6e9c46a17167937f2528e05ebed2063fa8e26f8afa7e1bebfb06be42e64eee4c7cad1f7eafd4af83d7f1b3459a60b68cd5b7b9a0297b5a779533da3bb7784eebec4cc514dc6177104236b4d2611d4723f9c0413848daa223daf9442b24e801d705020342bef9746aba60aef056e26c753ab4a51aabc8d5dc108f75dc3578754305afb3deddd5cccc39682ce18477aaba43555bf212954b547b1019ef701dba70a7552a5530730acda6f386e2d191b6b48283f71ccfbb6c0aaa5baa0ed00d579900edc20d648b519068cf980597c24199ca05fa891335efedf93569c477536a97d4d31ef2a67b97f083834099774215d1ad971b24f312a4314e23b45a35e77ec344b6659f26cf7bdce9f00cc1152a217a9ab79acc7a144e00beb71e01a1d640d3c923b7cf575e88f9cc01f9b140a45d7225e2767a4dbc77b07618515a584eed09b1372fcff7b31b631605c42721a3db8d227b8f470d3edbd4c11aeab77fb524fc8a7e2820b0ca02d0f5c431cab52ee2eb13e2c06a8864a0c6a705063be17a92e65c0358adfb7c32ef8acb94a0a768ffa982e178a97c90cc6f02170fe49bd4a982a349106ec147a18c4e19c33bdfd6acd1b8a7cf3973b4856dc21677afa2daba1eb039078013ef75549af003d34eec7da68e77673288a6c76426eb1602527550248f0aab6bf8cbc537b2e29d710ae8a2b97f6f4c4519a8a78518e337707e6f4d3f982956afabaeb8194e62d14eb6ae3f275a0088c8f9c2b6f52cbdbae58f01cebe03e12ca457dac3e57fd3c93c060d34c07932fb7d200b13d98959a3b2859c13917d673d15ad89f8821d2006becb7a7987ac0d78f575a206fe190573a595f153e3ea73dc8f98214751f2a454b4a633ada3cf5af3e48477d843e01f92814de4cb9491b419edba8d918074ed9d21533e3552121a229d70cd4a6e094f8d57dece81ac392ec08557dfe82ec01e99539d0a8d113aa2c549e3a834ab9135018d67aeae4bbaecd9b027f1d41c7434342c52ecb841806d4d5145ba5328a32c1f180d78ace0192545d9beb7306337994c815f9e60a1ec0d2c0425921f9e77d90a03bde08d9150f7b2c5eae38d867f0f15802543d2cec22cb54648dc7bad5a21af7a78a72896dc8935c53a1ba8ad3984cb19ed40ad653c89003b0d31cbae9da686d58e4d2ee3b4408242dfd5ff6849c0ba66bd3258045b2d1ace8d3105994b3b8c34cce4a97b4ed541a2541f3b2a69469d05c2a1c3e06e810a07860dd46f61824b7df02c39ae77a4a62237ebaa280a3fb666229b4cdd7c33e57bc87dd3dfa3ebdd9b222518299e29c6aab019fa527da94f72c0618a0712389e1e2b794ade91c1bbc276a9825f66078e833d1ec17ad7d250530316152aa92ab7016982a566e7652f6fb390aaaa7fffa2efe705408011ef50882bcbbe408c8641a53cd46cb4e86535469c796ad54942c4aca0ef57b655a9222b0bd7a7ee8ef09bddf1eba09c2b580773b503e99ae3ced1613e867a15cc94ae90ecbfea6c311317dfcec606307c82a30d03b11567a3b1a3d8d2697b61149752e2bfa723e38bfe19862338d2d2a062e58baee923d8bca28d66f06af5a659bdb6df2cdcd9b79acdf10b825309359c9829a1e60a3767ad077b7c6c91f746664a4bdd3a58a2f2615c2a01e0f03ecddf2e3b10b474229f1d89da2a13eb7481981e63577a0dafba0bf20369b3bffcdba446e56efe0b2f5a7a0b9ac2eb7f6532541b8a71a0ae150dfaff0e481f284e0d7812e199c034273e8d556684056be40464e932c23bf36a8b8facbee3532d3d45a587a6998ebfcea2fc8c4ac0b48e7997758bdb781f4f8d4ad7900c8e936e84a24fdc2c7db490a85b915271004130a00217dc7d9abe63e37dabee2a23fad95b66678d62e8124cb554bfdc91df0155449cf0fb09b522260bb9dd5c5d6ebabb5cfe448e5aae183ca6baf1a3bcb4934c1047e6c42484747483405653578e5f38df6f88c47bbcb123c4ddbc046a57d367aa40fb027e23c00a9209e11953582e7506770b31386d2b473c6100d333b8b8ce8bb351ce6d8a1f7258809ceaa1d5e4c20a8632559f1eae9ac431d52614309225b204771bee8c70c411128005959173e7681deeeb2abcb4520825e55a120f07bf6ab1dd180e2765e39434823c8a1c4fbf178fd9982c641273829c7a4b5be95b9c5290260aed6cc05d02d53c883fd39d62e2013a1a16381fb2a6b4ba2a71b5d894048a3de1f7614893a547031b74591c9d295a9da9a1205c1df0a63dfceabb67aeffce72ae66e99e6243a4f2b0cb76988377c20bdbd124fc2d781aa7d9f380882c645b7f24aa695079ef4f2b8bbd04143c105e81c88e40a52739df210c3e00c090816080dfac4d212d113122a2d7d59fbc10f10524fa442a4deb161840acc33a56bb154413964f1ce9692af5bba6877e8ea25b4add7969e709f23f491d040fafac8e016fb3f7266a14b800e86c713fc9c4284bf188f49daae0345a2f6704fe4292ec1ef9c4f83591cfdd785e163b983fdb563c16f8e7192bb50ec6880a077e221483d91923d66282fb27d1cbba6b9751045554d041ddd68492e6d15e8256b17af61ba6b2702fec186dbb652926768cf5754bed48d86532faf024b4c334dce86ef1a3351280746d88243a76575d0c46add43036c93c5b4b5c7b392d3c8ff47c9c7f41c031dd0a983c053e8212113bc0fd9d03cf04578565e473c566a14caa5b2f5ea13cf0daf03eb479a5eea7647ccf2dca908d6d0379ee5fd2053800ff3e54d426428e8039ea44e8d396651b2871110339ca7a61c424aa87777d4a0b88632f196035617481ca74a83d29948aaf6331a33bd35e846dd392c0a31944836cb6d54bb4a2e74dba41464725cdc1096fd386ab7e98aa8bee7373998404ac9029ace8ae296a2b287a2e2b470513a00013a641f86e25ca15ece7cc72d33fc7ed26bb56ccf9718574922c014634d941f076b53e7fd442ac25e46158a5fdc75a0be5a1a7cbeda9d1648c4fced51fa9900831e220d47b867e99f8abd9c3fea438a004e790bc6fddf9ad846d0b520287f8e3fe797554bac1eb6bcc362c5ca2bff698b9f85b9474c274f976544201fb3df018c9ae1dca1033481c142a054d0c90d667cac9823c0ec579b2f6c4b86bbd9f2540220028a2cbca9d8b5807a25b93b172538737f9017b8b31b13c6298e7eff340f50f9cf203d1171c787a667ea0498c6af521c1ff443ccbc4e22b682c1c805d6a4b24f92b1a5a34a853e7afd8efc940d59c7827719b2e65b31cae807cdde1b60c27c5616ac5a656991991ff4392063f43a10ba00d83ad4a95c2cd42fc5410e9e9e26ff5d637de292d853acb6f77b3b0a8dee32775d9a7eae0ea8f86d257448936864a858c7994e040f87b8aa0082ad5978a0de1081393a6d49f37fd2412c227bfbc9db9ad70dd986e8a103590a051c1a616848147e2b56ef8e7338a011b2629be52bec995a44a677bedf75113137a138e940a2b3aead3b4f26dfd8587f6996ba43fa7f6ba651c512f18c781cb0508835b474fc64f5699052365ea9e473c6bb4fdbb001cb836d555ebb903bc1521d876a845db05df8447bada158284bc1cedc1ba23ca7eec0c8aa88b28ab4801221410d42aaa10c9fadecef2bae689c4d3777971f61d898fc3dabe3cbd719af0f459ade3a5be08284c57ed58390d1f834ae9646c3f2c39febd810e1a32d8e901678f7b82573dfc330380e175c668feb64d71982e592881df9362c8295922b7fb195cd2b899f1a96185a0107a70a1d9dd23232267a146277ef24719938481853bc2ddd34164b0f4c3735771829701b7374fd296dd88d69f655541ca36340ed18a78ae5d9ec2f4df2a7527cfc3632b988c32676dc1a26358379daf986925a6d329e68a68a186952851a989d3abf113480d398caac4d3b10734e56ad82eb4d8278ab9f1739bde31ce7254bea9e7f42b4684bb752c5042c0de68a33f1ba5fa94d208df024416a4b4c0339ad3efd45578fc88d9ea44dfe69b2343f59b68edb8d9335e48d635edeedc04776b6d8b35d278953a0bb5cb4f79ebb6985388606e5fdd1388238bcfe139d06dd9e3b2d34a6e7cd8f79652f4e7d1fdfdff7b41f134be095ba32f9664065454112ef16e048e37994fc6f6f3892349dd21e74a1e9a2e9396820d970a05768405680464f2368fea16189c3b189f9329cd54398498712837674068f6ac7d0008ef3a30fac5a43241c084dec4d0a07f47803cb6cfac8aa7a096c227fa6c7dad46b97e74c377568a44e84d755ae9d20818a69711c003b8c950aed5b2bf5cdeea63a8d879bfd303f71219ce082e070b4a9612b6a1e677aaa49c67f4526f0e6abf6a9ab777785f21eb7179b54bd3a9a4e63e666df46f9f02b3692d103916a523f900140e33ed6c5845c6ff964d621f4020f25698fc24c485a1d51ca3f997d765a4a9d6a329719c1f0209d33c7177ac627967fc83987d78dd81c85a9817dc8f9cc6bb409fc140adedce223f2e442ea4fd1beb347e2f161e42f59c7411af3a68a54260608f7f60e1323af1ef8f3ea00180ea51af4c167c6e3df24a1efb36bc96b96f643f166fdf4dc12400495d2fd6aabeee868957c64113cc908f83b383bfdc1fe65cc05f86d47af989b82d1eea6e0fee0b2e35a31775f26decdd588f663a98004b39ec941f71169fb8df41185d16499b6ee56bac1119222c997c3fb11b3b412a6f9d218c5468249588d852cc447f48d9dfce8960bd81a18c4404e52bb84dd8b4640eda2235f1961d23d1b3fac495197d5a4a7ae714133b99c509141e85cb0c0de27b9e379575d2d0c7dac7a14c82e28668ba4e43291aa8728da2d5b50516b35dd09116f5967854bbfa5f80251feb51b638b5e33e6e198ecf9279d107e4a329799e6ab7c576094c474ccda5c54b0e3e52b4c6f7fcff92c39234a89380c9942ea43fa8110bcea52b49a7860dedc620ff9b472b2dd68b29c9d4ee19733b11199ac6762c3cea70ffb21cea1c20d3934daef24e9b2ed2dc8ed98234b0129764cfbee47b9bb21fd8fb49439c8a15f2099fe88f151e93d2c3f58bdc2ddb32fdeb210a20528d6c7e7a4aaa52fa000e263874cd18025cfa9e7a747646c0ac1332826faede05cd73241e9110e65ed396632a5b5ab0d6567fa94bb03fa8521f7e90a18062b040996131af2c1c6429e0854a9f75c53c16706fbcf7d7d9379cec68e6f07c92c501cf1818094c923a95e4e916e8c2ffdc89dfbac77fe1f19460a70787a034732dc1bec561e93332c579114d0e2c2ae5fc9fe1c2800a8e4238ad863fb5ab72719ad7b1618b596ac6edcd5074660cb49e74a7412174105415a789dd9b30f94ee9cf47f27b0184c34f6467eda705e19d81dcff0bf6523020d411efa438d8e556729a00bab0e84b536e8ce2ba9b3f3eef1f28910772f84883c2d59578c24baccf00a172e17afbdde6799149a187fc89d26f5b6df74fade6f724ef137e9e4ecd3a2dbb882ce3cdd0e5ce4b436d89c7e955d7c565d15066f9925fd84172767998773369ccd766faf4edf8c0f326ea1df07e8a1e1279ba76ca33821357981db1963f0b4988a516c84d51832911b43d862c81610aa4c0f397640498d14913d6064fb93c17269a068b86310808df328457ab1f9eaab23fcb10794a381ee600f2b77ba6400838d48caa26e4b90bd1aa9ae566e9b57f30ad4a2688fe414412dada63ec6ffa7c89097adbfe021d47887a6ce75da9241a4292679e3efbf2284e019f1bf78b366befd44f4ffbd67ef0329c429f345d7223a108f72b539ad0131a2934fbc452b8aa3c9a38d3b29e16120027352040c94c63dce5497e95a5f97cbcc037bb2807d8805afb301c256a3608c29dae129078de9ae41acb181df18de2f9c4e80ffb54171c8b8f5db1f12400c1e45a604c9bf990a2b0a2ecdc7d99a428e8b560e36b8d2eb6ec47972ac03ea12683a8223b83f93b6adb3b90bbae56ea606b3a8d3df8e9e44a3ccc41dc28f2508148f10b686482d47a1859f9876430b56640ea152132ec78fbc99e8fccf5afa2ca040a4522aa2e310671f256a9a03f7b9d9a2dc25910ebfcc4be837a95e24a6dce5235beac8918a5950256722182d58b45d0711f9dc52c0cb9ff515a336611aabbba3d7f5e86102d234b7e3f054fc876bfea09918dbe5ec1f8d630cacc24a9adf0f7dd551443b5c4a96a3e9485b234b88d8cbb3891ecc9b563f50e33e3b942c5aeaf966a24ddac5544697620624016eb029ce86ee90685c94cd64839331503462b823a184b2e33f1e1736465fa841e4e6a6454a803983e5c7cdab38c78dcb4a2a44504b1b371d4b2570b8e8db4c8a3dc0b9df853d546a79ad448d4c1e1c61d3b74d00122eaeb047fdf4703ed8df321aef1db298052e097acf46315a68b2b2bd4b9e7cebc8e7ccbde2315314536e6ccc6d1552f7d79610e6dc7bd6c4e15692d3ec2f84f0707673eb306dd88c5fa981003201a5527843e1f1c972e737187ba0d4728047d484a1f2f8c8e3ca6d03b640639d32636d382852f373c90884873fe0e91454cdabda06b84da6bebfbee8491cd4df6c55b37612f28c980adbca700a95156226e83a48a345a3c72aa7c685fbbb76606995b23f7823f5672fa0ddcc04a4bb862c6ffd6a32d0570f282e615c001964a0298048357bc2a3318a664422ee8cbd5e8f50bcc9e24bd0bd6fb7fe94f57e3f41f4e9b4e1dc54357bc0592111f3e98267b4b0aaf410c089f4ad0c046294678bd2af58a02cbf7fdcbd94657fbb054d68402df96f9664f32d1adfac60bb32ef234f2d141b1df0d7965673dc44f2cd946409902c5c546050434023c50b07d21bda84b2a101a088708155dfd5dd83d7389b05773b7c7a1525cbf85d255c7381d0ed1075acb85c338ae828ca32753119e7393eec76f0d92a9663a1eee9b63a93dcbf898f5e40d2ed38b40c88440ddafc7ce74624c32258e440c53245ed64b2d2b3055b714297e62c19467cc66e6796ba9d2ae9e25d3b54f7e89cf0030e6544ca42564b32068ec29e2f8ec88055226b23b087c27f17d9e305957e2ff955861fed434b74c25901bc8e1f7d781a0a547a141fd84f9ec756c90116ec40163251380e5ae5f26decc20bda7c0f9cc13b04454ce4125ff73509db338cffe2d4698635ba177993223fbb0d6b8aeb18bef74b067b4af0f38360ed0fe6c50d83108639c9f9c44b091c334cbd8372f7c10cb9d80e38e7583d52ec29ca3130ccccc47267c501458cde8185d2fb0157d63dc7c23178fea0d2438cce17e83ddea22702b7fdd2494e10582a52d6f92e42e145f52da57e3d0525ed189b3d4d58f87ccad6e433d411712d2717b27d9854ebdab5573c54343924fa4dbbcade3249fb8406e0032b030bb5d8fe62534c5688175a4e1fb3688d6025bad5fae5211e73ad6869c0a0c636854b1a64ca6814f5153c1dcaf0f74acab4a8007fb2566a7c80720695519060286ebecf9f4313dab3480434f4a228c6bf967596108223186536a2bbd502ade055bc0d366e7765365042af4f55b060a2a59a44f3325c957c5964388ec8d1ac30cc51e0a11f418d38caf5a87803107c0c28ec4997e0db9af18a74213adc56cd0334d36d9a8a075767ab855d2e83d9ae3b1ca0515fc724088b6189dcbb540c0d738519d62d1d91a0ca331a259cb87dcf5ffed1ba881e65f7429d12a395b9780c80ca8c0f8d18a2858273610de73190bb04b0080dddbc73ead03a1d407a565808bf0429cba2e86e6c9504c3a0195d4de29c49d0154410ad527ddbcf2dfb175516ba5226139842d5a8a7589f5717aa9ef6d086ac40d3d7c4b0aa369cd8e08cfb4df84f09c5fd41c3b1f11430b5e9e4cda403f59c2a5ff853680dfad2a9652ad1c0ec769f9446f8b8d99f9a948360b5019f6d331e5f2921ca6783290d3cc7d28862473557563cedf1515d47a418167a157075607e75c0300681a750f45294703fa15257f3f09f3536f8040dbe26b75642c9f216ae10fce1b63fde273b782484119355b4b33ff35bbf4c4f34074d3fd42db1de179a7ea120845d357a627377d052f16185649f835a6900cf9de2e99977bcf4547b5021db5d6bb49e2a9162b9483ecaee7febfb7037a7cd4924e568bcbdbfc6719c951c37db7354ea38a73b35868cbf72b135a588f8f181d47603bbf1bb1fe79ec32db0df8e72e08c01cc3f5da0f23cddfd67c22e11511a7f2af8e0f2e788b77f0a001883eff7d4fcb74b17b7644ccc7693edd5394d0ea8f4761092c40e16848d73fc97de4edf42497f90ae1e6ef4d4f2707b93f481be9d178c785c78d19c402f22a678039c251d318342e12c48a4eafb8dc4457fd695418ab3fe3ba58c98aa3e9ddaefc17fedbf81a07433844d490f5879294c1f9bb4c7b8f1da616d979f02aa5600004976b2bff211a4e0f804c8fa720dba3f6664e4d73792591498c50711ed9a1d3357b57ef841638bc7a4e54b6f414160194dfe5775ead6c835dbc0791094cd8e8030f6184edcb59ac07898a8edc636fa10b4b28a6c289914fafdbc7d3d61274735d8d289cfb6bce00d36585db27314b85a06207b9c15ad10ca7d827fb18e4aa8918d5ebc6125e1f736dd4a36e8931016200c70f3e40a0ee69c4660f750a5a35409e9ea66de02ef4ebf33501c585357c9f8f175717b12f1aa517485d1802dd37205377dd2096d955b766ffb646951d6c330572a9d2adf79ddf8db0dfebe36fd901469cda04f7967d1b0029df4d0e9b323656ddb9a1677b8b12438097eac03e26881981ad5c2f0d9a5d0f55c2951fc3252f90416008daa4d8f4ec3a5691e2030d34ba1f8d78d0e4c14dae17936ce7a0cd944340efdd3cea625cd9a74d1d9ea74c59c14b118061ca802e3a1f0ed83d7b6125b84f394e277003438beb53094349ac5cf0ca739dee37491c4de8150021b8b500ad52418f261d81addae9fc0e56b35f78b45cca78439ff1466c25804d62e40a1dd7d31bcd99eb7406d2bc655db133d9e0d5cbcd7b2dba8eab78cc417f3a82c0e8bd3821854d67b2d87b4ff407702cfae0369b6c7a9be75cfeb1449c2cb9d3b184eec2681870045aaf86beeaee7f47e092c064cdb01c0d7b4bc68afc3a27a8ab1716035d1d79b0afa20bf41b2c1a8b69560b18f846d045b94f623b4a41198a3b56fb422b02d0c3c452766fb2f35265360b75db0032f25852385d00b8e8dff60eaff706ae616a019ac8d4132d8c280e551647af96223d9b2106404efdb6a1bc4a6452cc0b5ac7d7a138a2775b588abf90a22b764158d8a2ddf90d8457239fbbd8224c2671526a87ccf8775c519766519a7ad3d3e0d7283f4953074187f00f34a9a107e1d54a5357c4c4dd0051489b081ac7719bb7e1bc7df078311d642635ac8c68e6d9068114459686854636e401a8eb3c0925d1a70c818e94bd3f9070ae5caa698b6f9bc149ff2e506b4c0bd373fbf2dbbb90d02dceed399f89e3a8c8a3dec2dc44c9a1111b5ece8a41c63db8e63221058e11c4bf9295b44c448661596eeb93525c782fa921bd63748125d471a7a1596eac07ee2319f3327f4ccbf7a74f261a3579766275cbdd012d93559ff99301b8a6e2c8f4ae45e7248ac6122b9e6d602bfaccf79c153eccbfacd41d792651e09c13e1c8996aa0136dffd90b53108e80a2c38cb38e341e9a96bb67bb17497e00193bc106186df501ec791d5266ffa876cbc6dd0cbf0c0e5ba8a0d8724c6ca067ece0480a3ad645abda8a749d966efce4b8a0ecfd803439d4bcf8d72a979bb94e2f6ef0fca9544315bf59d2f39cf653ac4448e8198e761550c3246461542a63d66a5bfd85a9d296e305cc9d119cec3a08dc0ab1d04993bd677f8ba4d10a5dbffb1ea6d553e5e8ba68c984c13c2c8b1a0f857a89e4226f25cf3bf8b3d0557db8622f427a9f2e9075f4bce0580ed4406ed24bf044920ca2e82739b1b7c80f1bf33772a76f8c179cb2407ac8667a67808e2013f7ff54f9c3201b8fc74cf2f5b82ea5fed93b5a73287d6c753f722a9b041edc3cf8c04a3dda5b9d1a4937bb46d6ecb7cab6aed153a9865ab801681c1112627791618adca89b6b4392a070ab492ea68e79d09aa2f5f0bb76faa34ebd351627caeda92948534291eb84685903c65d314b565b5894b3b1c7c6aceb246d3874697b230404981c68e00b21a37659db1382dfd5b40e5bae4f4f59204e08151444f6356ef4932acc74e54034b9c0bda59c81a4b906fe58accc15f041e28fbcb73cb803a5a7f5e86256648623a36ebefbd4694da1a248b4a9230932ffe1a0695cf908d49b33102364790891f839eb265b7abf8186acdd0cd4dc1ada43bcd851a7812c407fc8a0993177ded30cdb47b47c9f69951c3a2c66ef4a4eecb61220ac3e898c3a4bc3aed3a57c1b7cf312975e56f15de30d003fc279c74745b52fcb3e3ce4c09ca41a7867ab4b8771deb1e1ab329e2fc84410787e5601e9d208ebeffdc538bcf7dc4757a765a8fbb6bcf2623500cdb9e6288126495a0f4fe18d2c5c6121a788c52e22269be803c4f2046e494764b209e621be07d7970bf86b1be8d539e163804227e9dd6bd8306a997ce8db3c122bc0adbb0b62f8c71014c25854677badccca4fc1a717658a934bc0f005e682a19c358b72c9c48c4ea02bf28eb1a2018ff9f24670b34d6d730da33ead8b18d40dd7e247a747ece8cc24348ac8a02f9b3ca316a329064c368c530fde8db9b9e281777f4d1e66b360e2ade295db45232e8ac75b611eae7ddeccf569577a125c22cb18d901200f68d6016e8e43cce63f09e23f3746b780c790a380652778ae7a88ea13376dfc8f13fa17599eea3c83bc54721fa2a8ea5337f0c501a091d25820fa2cf48364173979622fa3c831419e3b84c8948f7bf149d9f9c1dcc04fcd067b399e21d08f42f088a78bebb354fbf1564e4e0cf623edc5a48477bb8939e6ee96d9391c71222366763e49080fc660c6b3477f9431680591f55297fac75213820a8c37c9e8485929d4a4fb7a5c915728bd9af3eae3f2e2f3b8b0f47cdcca3d5c38722086152d88cb60a954dbdc0e95c4f8237d548239cb1285c6e00eb4cd1baad9b70f0c1fc5b4254d92af267d833de127265cc05c688521fef7651e1d1278d968ebda5752aed2553e8b4da9d46db7c98f32658589742fc4934f11f209154ed403880ae38bcb2711f72fc6228f39a0d447210e348fd98e07f1548fbe94ef430e911347ed1bea707b23d471791cf76ed51968df5d2442fe6ea258d2421efffd190639ea35224fb9dda1dce6951764b999b02c59988926cc08f82d0a03a0ee7b9743eb0ab93f0cf9b2fb4ccfc403817b5d698bb0f8918ecfd947d5009eb1f876046a1382d0fee2b23ffb3161fe11eec12bec3cfc2e02b8ca1fe9eee00ca38a50859311ec00f955ace4a55e87a191dad490bf07540c18a20263bf07e3668d4f62b085b18fef8a6ba54a53fe75c2635718d3b4304ba7a82381636f5111d82f76389795585fbf394ca059d28615a1877e7627f1aa60b7b20f6f0da317707a56864789d9f9b618a40eb2e81daff7a4734717597f9ffd2027606f993240c9d448530c0194251d00947b4527a5d348e97619d1e0146e669b4b96a4a022e452b1567fede2fe36fd196fa0bd9941289da93007e935f56b340e154a03925ca809f36215bd6439bbcd59a18a0ff6ec1280ba3971dc06de59f3b74bab18f89fb8203b71fae2515013ebfe1d1653a307a3b1de22337eb8a742e6f68989d032807fb7b5a6105fee4c7fb3ac5212f8dbafee357b1d754dab49e0dc1221f24c053900c415d5c7e18baa8bf618fd45ed82fee694a25fd1b9c84a352485635b5efc0679eac68b20daf80bf6163987a56a7e6f5df7a67fb6013f79ad9f518aa5ceb0e23076858a58b3f9887ea3a69a720472bd4989b9d6af7efe4be157b0e72788dfcb95a2ab19885f4ce07ced665c4cea8fc87301deb89ce549c614265a30cce50d3f7eee1db1b7c8819a0f032621b6ae1cfcc658a8f761ca84ad2e910f9a596130eaed007cd0627dea4762029c2a704490ad7b43c97c5b854a5e935fc51e5c7124fa56b1df16988ca8665d3db162a1e180ccd051b39e8fbd76e58babca3bc08f0bf24134867f861b8ec67780818ac3cdaa997c421928d2889b95519325691820b94c44d1d1fde1927e9a1ba8a30c6f1ea2c5b4384c63ca06f3384930132d02a8d8b14ff6875817d7eaf652f96736b87c8705f8606f89279e19bd5916aa2f2c9e3428be90ae63538229bc3ff09ecdfbb860ac6dc5f1396e9b4a122d67efc53b99e39cd9918278b03725caf61d0848a457c1a9380e1212e36f2b307830db27109fe3c06720334ed6b912d7f75b3a067a426ffee1cfe1b7d62f1e4cb1e83696b9a782a1218420c7dac783eacdffab8a546e4b8835304e0a654803b245819b7f66782002e25b0a56af830561b136e67576ffd354fe88247d2d9fc7ce9ceeb06a674b58d585acb0352ebbc4d5bbdcb8d53f6861f3c77ee89c88e6b22c287daea5a6ab2aeecfd44222a05009d849f9bbcab4aee52aa6716db8c419e0dc23883c39a5a15efa94c4ef380b2570466a714dc5120caef26721ae16af71315d75b11f77f2cb4c8cfc4c908069e33f0fe063844b5cb59f54fce401f0f5b636c12e578546ce23bd63ea4ec13085b1313cb9b9020191e6de31bf2d79398fd1df084f9e5f1b4265bd32cb72985b10ab2960e461257258937ab37f5fcc0fa00f8dc524b8aa4fc48528bb136d713d8e74392ba487ca422e90206e41a93982a3a0144fd26f32ff2e038cf642889c4c07f9faaeb0dd1fe1eb42be632450c54d115e4cc5ad54e3c3bb39acbee2ca70ba40004cb2907e609fd8d058a32b68105658ce7e3d23c4c0944c5528c35658cfa4f74ccbfbe512b8d1baca85fc056fcd0771cea585821c11363a666139b2ca7a90966752cfdf969bdbfe01d4d4956165a34e892d6607ab5a0c08a79d854ed7b8e3850a242fbfddc3985c0d87310e9167b92e8d450a000897bfe774a076c267a60c26b0590f37059a27cc624ce0d5d1e643cdd9bceea7680985067a7ce4ae4c1ba7888f4f8fcba5c384976b3a0e4d92bfdcc09e799d253b206f9e4e8a1772f94af48d6a60aae198379d08f0fbfb85a516d316b6e6008d1c99d25972eae357a877be85070adb61148907660b2d2c0043df0a8eba3c154d1cd742e2b1a66b40146d539c1c0b1aa64225bc20486e019e83b4985a3a0fa8f8d6efab3ade28cdaffd243dbff92dcf5c7d90003cc65bf3f51f8fb5966e39090f83de0fbc2dca1bddd1b2aa5d5853880d335dd050d7bf3b902a48cfb4c34467cf55e7ac8deb62820750d88a476d14df5686d42783e5f09a998e18a7361651539457572a1e6318f949b36f8acc231545003c7c294009ec64c9a2d428266da86fb31aaaa86e87a82259cb7bade9685702bd7ded1f32e3becf3595f0ae90d232fc7795077440eaed658c85654160ba8b96521acde2dabe815903385c86cce09b57c42c3736872a6d712f3269d30280756676e9348fe060257315dc51d01860c3644f1d739fc7f57c7cec730f71a1ba1b3f5cf3b4e5c8137dfa38266cfc30df5b0990d46d5c3d7aca670816984f504848b9bdd4a0b9fcacfe49a5672e445a4bf270782c56c82a70f8b1c15fe7f381df0b6ec725dc0e94008107ffc8723caa0be863d19cd78d341cd4c81fd76a33ee13bebaa8582d40551634802769270b4b6533d561b0e85b6df7d4eaf2032638af47f5d32ed26e67e26605b4d9f655cf1c5344d2f0004d587b94ac472d7d588ffb1894bb95ca6c5b81cfcbc322eeb975b5001e413023bd2b11456c045c3f17521ec57cf717bafbdb3615e43011d6d4260a088d9d18c2b6ac6e6961848301e899229aaa9d9de04e0e9190e3de3caf603eee7017f1aa25270fef22888a66d81bdfe1509b046c414a03eca32fa883238dfdc05db37d3b9703231f4c10820c0c6b5a1978c3ecb378e1182c29cb9a9956ae5ab827d779cdbcc58d50330049490eced5211f840be8336e3f16ba3b31de6aa4c1e0e57aff7f39898a810ce18a9e894240fc2a03f709fed43281ad2cce5002a133d9ec9a38cc52b06e374b68fc676d87d0c1df542177713773aa950cb81ea4174544640a3914f5cbc74d029ab4d6ce2cb0ad1327411fb64fe3ea1dbd2165c05296021758959414b5b46617a687b6a81996deb7925cc3c3081f2e644091a2eafe5340385742bcd4ce4abb84c33b0a919275633a6d09a2102829300ef5944b55191ddcbba9b6cd0b0126380b90e8b4dc3f60dc38478bf3f8db3daf4d71d33e634385258a70e2a9584985786c7c8d1eb274a0484b62d835b934e0c978498eea587dccdd4408f33c006a1361e0ed523348565202b7bb427b08063e790c74c8829d0a919d856a0c5061baba451c11cf9e24377a584fd0ad33c858dfd208934018161950ee40bf14d00adc88c24df0ed8b40a88137e6b232749cb938176369997148e30627aee461bb6075dc9851971cd3414d4972963d334a5ecb62009bd298a03dc8432ea062abed7ea4222001e9ecf0482edfbf578ff9247e4131d33fadef161806a8900b4c54631fd1d976fa54d6ac29ecd32af4c0792c99c07ecba80b6c2353ad5590e1fc0c79ea8c7b04f15032f7457b5a2106e1c1a08572c1223d4561c45a69ae0bb2baab5fbd87bab73bb8a74c8018e745da6006f852aebdb05849599a200b27a0a7317f359c0a5cdc23be32339e15eaf5ceedeb186e132549b2b332f8cd7ed19f6cbdcc82b12a9bff7b5071491254ca93ea8abdab97019cc6b96521e6ce0be0ba48c04dac3d3bf5b3014da380712a57bf8b04ed5be93341fd26c2e9bba4df3d58daff8d8347cb955dee18f95321e457a3be233fd0af9c8db1cb3e7f0be7da2db0b10dfba8ace5d53c11c78c9b53cdcfe2059e2f4d810d38850a8898890902d654a5206e60b190cd90ba74c7f3365faae75ca024e7aa2973c94bd87f5bbb0fcb0c48e9a3d5217afc3ec109f1049f20b570081a304123af8c20452d4808a2c45d8a8b87042d2f7a680bf080bc0f0410821484c3061062b31a2e0a045051444f880a4ffd9e0cfd40952183555a6b8e0440620881e92a889228a28b8c0c2044438e1851354e8b0aa411250a0822592b4e00829248ce3b85abdabb5d69a833b67398ee36e380e2c41e568fc0bc7d9ffbc3fc735f795e3368efb7a03ea51f3f150fd9afaf2dce7b919cf7df712529246e850e01961a9827e7cfee55f441c5efec3719c4704f5a8a98179193131a19f6484d343d8e55dc5711cd7790e7cce39e79c3b714f632fe124332ee3322ee32c6739cb596e72cfd1ccbdbb5e2e9cdf64ce5199e3388ee338ee3bdc83dcc6fd9c3d6e9cc6699cc6711c47d3de775ee7754fd3b7ebdb3df75dc7711cc7711cc7711cc7711cc7711cc7711cc7711cf7cf859d33d8d65f06cbddc3ac685e7d4dd3344dcb66b2e7b01e3bbf92d3a3bb7a6c310257d7c4d13d8d2c18349d20229561bea57b9ae7c55fbfa6bca672f75e887becbeab28ee3b14ca3b10d4a3c6e53d5f84c42ddf7d35d50e267428b08cb05449fc2f21e8c7cbb77c8b8843cbbf88200b745f849cf407a8ee5b426be3a1eee7e70393f869ba2a811b0b1613a45c84cc810220a05424d2551dd97dc7dc8ac35a64bf7bbfd2a2edef0ab3bc95bbf7ee7b75721a73544b3849bff1948f5cbeeb9ad579cabbee1d8cee9de4a3baf250e7ca6951e7bbf797c7668ef931755deda1962077df7d218df5d8bd0d29961ebbdfc226f5d83d8c1298eb4091a63f1c82ecbf7c11d21382ac4b08b25d5dddef6e773b56eeba2ea688cfc5fbbccf7b9ac6e1c743d6fbee3b2fa49962314794a4a242764f73668e29ba352628412e6917b97b191f512527b2fb191fc14c21bba7f1510054644776df038813b22b91dd0bf111fd018aec7e0825f9080164f7b4e42347a24476744989ec3a4c764f513e7271915dc70ad93d4df9c88322bb1cb27b2c64f794e5232124528944769794bbf7f408934aa02291ddd768919348b9ebb6ced34627d690c18c50dfe6f05cb5706911bbf306956184b7053886270798be8c23b2e0ba4d1cf437d89116d9b1420815d9d12780a8e24544bbd2848bcc613aa1040ba820ebdb9088b60432074f0cc82afa0fb64801aa12e1044fbc6c1459e0a015840e362ad286324e48221801891469c31a3d90ddd4ae0fa1031669c3491e00c91054e49c467081ab3302391fd3175a8a172768c2f36ce8c2921e62640d27d9cd4e133cbfbffb94d0c00b3207ce0bd0b321113a86142e3207184c2e9082b45f4322740732871985b46213d7e10a1399430b6128c1223dad801a4ed28644a8112c48640e32355588d03308030c2431b286f5072ac8cec5b32191f9448a45e6e03a909e5600a51eda451249289135eca220676684d326dc50c181c9d8a1bbcbcf5d45132a606253c5bbc33b0a68ee405aeb9cf6ad75c00cf57fae43c9a06024478b5c450e04a93a32ab6949b21fa0e0a28a6ced65c2f4e80b34cfa72f346d41266592819414d8800857c8fe193800a4734efe5a2938b3c54260fa36135959a0492f7d16a015c8c8ece9f78323b32682ade8ea90eeeeae944469e891969edc5ab472571702f280fb3b4ae02fd205c01f892621cfefe1a30a70818412182629ad199013062c1a0c41074300c10ad2a7c8455c50858925a05c60686143ce29306105477ca1e409218820e78fff892142891c38c149148480842cb2822738811383292a1003879cad3c9f5ee95967f051911f8c70819431aab8408b28a40884200509264d18638b21908e843c7fc87c4a9a4f4bf3a9cd7c6a9a47c89306267878f2830e6e807002399f10853196a0a48a2649483742ce400d882046122c8880a1c85984948323a07ce02127085790d3a7e4f93487b6ea0b465d79d3becee4eded5f2d0c32e3ae2a3a95568ff45f76803d28a0f03ccfc332737cb9dfc3c1f1bc56cb2b3d57eef748fd5ea9dfb3e9f74cfddea9df43b5a8adc8fdde4dbf97eaf7542df22072bfb76a51bf87d389315f70efba2ed6222c5d4e8fdcbb8ee523f7ce3b527f57eaef6c5ad459e4feced4df9dfa3b548bdc48eeef6efabb547fa7eaef56fd1d4e8b3230c0e0388ec3327374581a8b95dccfb17ce4adccb9723f47eae74afd9c4d3f67eae74efd1caa45dc4d3f97eae7542dea22e47e6ed5cfe16c4a50c2b66ddb8665e6d872ffe6726d2e52ff56eadf6c5ae43ce4fecdd4bf9dfa37548bba8adcbfddf46fa9fe4dd522ff21f76fab16f56f382d7ae2897befbd58668e9bfbef6a7557a4fe5beabf362dea3072ff35f5df53ff45b5c86ffa6faaffaa5ae43ee4febb6a51ffc5d1c4982ff40a7a059aa6c5342c338796fbb59c1ef592255672bf7673a369aedcaf91fab552bf66d3a24e42eed74cfddaa95f43f56b37fd5aaa5f53f56bab16f56b382d1263bed046da4896dc9fe564563abb92619939b2dc9fb17cd4a556ee2fb9727f46eacf4afd994d8bfa8bdc9f99fab3537f86eacf6efab3547fa66a514fd19fe1b4a836d14496dcaa1816fbe489b5ab955db954ab7e8bd32297dcd465634dfdf6d4cd45eeb724faa52de5fe2ac67c810a4185a8b5562c33471dd1241da2df5f593ea2a75a56576391fbaba9bfdef4d7548b7c88dc5f572deaaf382d1263bed081d902fd9e5b64c9fdee31c73273e4f428881577968f86c43ce6dd312c3347bfdbf4bbc98fe47ebfe9f754fbaadf711c00c54a2b3785512c3307b599fd8d63c3864bc8102233c7eca7a5ee2baa553fc569d196ab9551ed10edeefff47fffd82fd33fd355fa65685196fbc120e0d27180804b6f050197be040a5cfa4da6ff6d81cbc692e97f2f5cba10d8f3032e7b95e97b9280cb5e92e97ba6c0a00c3038052ec1162ee92ad3f798c0254d92e97b3200a1e0725ac9f4c11f6090090663804b1c05e327f011fc03c961610eba69a3b44828c1b9d1d71fe733a1340c2e64fc798a0216a9d527809d62326e4475d950588c54ba558935f52af74dafac0a583334ec6649682968d112c6ae7b84cde7479999fc333299dd3cac032e6f111d3b61695637ab390feb60c2654341c4933cdf4f4c2e2bcb9477e6a3f2eeb3bc4477f3b2028c6dc708ecf762fcf97ca3501ef224706951feb6c91c35aa454c2c4e76fb4476bb83ecd6061d237079b3778b5e8f8df2567d0b0c7096cb5ecdacc5d32e1ff9155d2ce4d24b2ce4b26bb7d7e1edb19b2ac9251f4dec24d7b740f6832335cad2848802a67f9f48016701832e70949c18087e81a36401254f0974d307ce2c0ffad9cf1e6bb099587a960a1866a6604a5b353fa7386fa669e2ada186a6bd18014c33cd59a9655a46b7e818813fdd8492656e78fd3d20c479cee9d4ddeda723fb7286d65aeba44db74e19825ae7b766e79c73ce1c66b2d72cd3c4f9c935b491bb3969f51bb98633d96bf52994f5e9a0586aadd597a0ffe9e8d1e38452233b80a6c7796bbfe792e6405e0f75f33b47e0d2ab25915cc52cd3eedd368e9bd1e1422733274debf834cd036ed97f327fadd6b781664f8f13739f0e0fc605b8f472e77d9d4f87078220483b508737b78d72fd595ea24522389054cca1bba5089a67eda268512a5b54faac9d219e32e19606d87ea58010b8ac23ec25e9eacf6ed2feec6e13d2e00f054c8aec3ea70869268e233dce3cff08255e0b0f23b078a98a4093b226eee8d16942075031bfa588fa3e551f0f0e7039559d20ecd338608776b57bb52fef67af79dd8fc0fb96dcd1bacd0fb475a04dece1893ea68aecc4c9d95c6fd8796e347790602b963217c4f9a2f0be2a1d6804a6ef73ce398b80e9cfebeea1a2814e32af06158ce22d492aad5e124cdf9db39fe525ac480407126b55ba11d4e76c07119d4eef6e9b3840367f6cf4385fc6469ea20b3493953befa6d7a673669ddd2d77768a3478bef214875c8f06204f1187f97337b9ed725cd775dda2901ee75317c61d9d4c45182ace5dd7c4684e8fb3bf69912f4f91b6e612fe1e25e0f266d006b8bcd97382cb9ba7e75b2b0dbb06f1282b153f3dce20defc641a9d57d3b63b71ccbfb99b1d9d5d07e4a323eb6779892a12c181f4969c4317e9e680e8a68db2e9478ee18c6de28969cc1ccdd93698a1fe86d2a19e509ee0a6d33b74e2689126b67b2d0f8ed72ef680213d7e5c54cbd1175884cdae2997d7c92b6230f0a7dd560532127bc84385e6238d9cff3f7219bc19395d1e0d364bcec7f883c127b87b97086f533ebaf19cc5e0fc7e86e10072ba95747b4e0e18364a3ce7a524c73d478912254b7cf5f2625d3687668791027e69c1fa4a6be2b06264c0d08f81e9aa075305c73ccccb780bf3513fe910ed27edb239366253ba632f2fd087c6d3f7232d9af1f4dd0614d6e8f1e56984367a7cf919e1d8e3cbf7a7e3536344d00b8c087a51c9a03a6aec880cf17b7c117924b1d101c3057e791e496c5e44dade7911792431f138628af55ac29717c3027c0242013c00c2d023200cc01f201c5f2624c087618d0e42c2d701cc92254b167200dfcdcc1f455bfcd0a7a616426b80d0de78883e8ed0de08a787bea7f7a3df97db7fe82c2f40e82e0fd12740e82f0fd10f851e0beb00c2e9210104209c1ee2ec5b1fbdd5a995646355d5644b966523ac69b2c2f70a61c7bd59ed75d4959dd44eaa7112a5dd7263ba8bc7115858fd65c3601465afac4057392f1ba3f5e9d8630d1b3d76155c5a58a6ef1c70796fb5a8b42e0b6b51e92492d7b4a8749675f9688519058c2b575a445b240514f89da7f829ad61a3c71e3b99086a1e4450e141444be491a486032d721e9e791c61e5e371446c7e00cf2860e06431cf285758df638b590b8f24353d4e1b86e4b248be3c8e3882ca11ae1ea110824aee7042318493cce3089826e00945929adccda6ee1d1e498e4c1c33f338e2092e9d954f3e02c0d3afa81631119f7e4dd529668e96a75fc1009f864fff299d99919119ff43cdcbd195d30e16579e3beae1ef90668a72ead4a98b201e9e696eb1cc21e31500c28a12c39a0aab6ae2a00f86d5071307fd30ac1f6e5fbefdfe6268508762e974e814189a43ad5018bd42ea5847d578dad5c96da1a51ebf067f4aea91ba28d223ceea9c556b582d2a2318fa6e0586d4a292370b4f9f7aed3aa5c525fe697a76a8237eff4bfc3f7d2294c8873ec57af6bde5537aa4653d0d7156599bc8f43767d55c7ec842a8c2af10d634a1af4258c34999d6f4d32333c7cc7e45a62fe48621a27ed1bb3b66b5cb5f2c0fd1a71fa7e2567244d915422ca18bdc5f3b237d8a803a0454f4ec2b138bf63cdddd5db528bd8097a689f356c7c1955417378a1d541f74dd2fe8ae13719d20a1e40271b32405b9ddffca29f7db688fa2a68b896ff9d95eab7536ad0e30edda965594556b33b1ce2a4509a8f62115616880e9c461df9fba5722353b05dcddfecce9e6a4d3fb67fb9c13b4d9ddbdc53a71d06f2cbadaa309a29f8e1d4ae04933f17a0d6bb00c3d7261c784e2f914c10656b0c85e8e5e2ec76675d34697817e68a01f1b0e9926ce6c9f89403c641fb4c1fe57fbfbf4db4411f443f34f877f3f3ede9f0fed3391884cad7666c6676664667ca47de8e7237b4dc421e90bc84c9cf1d074eda0b3dd34490e55a60d4e03dc824ec1b6a3578afc6083cfe9b3a5e5678b3843cdaa4f1a804e4981cc8de8a943f6d5a2512c83786a30e812e98b2a9102d36b9f3e9939a87d6bb10d20a0d9d2275b9e7e3f366035215a5a5a5ac419b22f06306f4f3f1bc28cbf3f1bae11198b376c4f73f64500cc9b58e660933990daf8a8c9b689d414d26c7ffc7c64e4ba6d3d5a7bbbcaea7cf7bd7f3abeef3a9c7bc7719d10e4448fe33e8699391187172cd2e9de69fc2b3d995ae99106e9910c203ec291abc592ed95dc6acdcf1383047bb6f7b00c929de604f164fa1ad1ea1eceac7d9607ecc2545edd6219c4d3c9a8c1d9cf2f86d963d6756ec595c76f657f1b3299767dc4fdc01e8291dc17213ff17a88eae8d17d7ffd7577d33c2e04fde0403fbcfffe1371f87e92d9f7c3fb4f14628387c4b2cc13413eb8f7fe47f7de7b220edf77f7d331f3f5f0fe47f7dc6b9f8fef3991c88edfb6af87f71f0e7039593d7e4c1cf27bfbfd285203f2fbd9795e13b0ffbbd69133f8e8ebfefbbe7e9e08c443748690a6fba17eb3f3834624f264e7ebf763036467ce2fc49ff03d2528e1795f0c1d6f7e3148b0a7f4f4dba7f1a63961104f6e523d20dc0f1a91c8b44272efdf8f2244905ce78b816620fd156872ec6a484d5a7332e8a60d4a6f50b5094f50e2ad0304bff32e1c8841b0f5f4d301bad4ef8446e0f2a2bcbc2e96b845bc3eebac13451b7c508bcbf7911695176c69019fb67a34bd60b9688e0e729d41d619c50a2cd72bc81ac58b54aedfa4aec9c9f5bbd4363d72b27e8b0be856e4faf8e5ebfbbf8855804fd3fe3c8eb0526b051f146fe400b7c0bf17e3cfe77f1ca74c2ee9cae5ab8b58ce1c8aa5452e3fbf49fef9b8fc9c2e3249c623ef351f2cf84a76015d5c5e5382be40b3cbcc2e4f3f1d2e8ff2d1bd5826d7f70a76427c44a798a1fa55ccd816b93e7502f584d44a5b1347053f23704951255df9ad8fca75da70a04541687af4f29562c9f3ebcbf488b666ea8b485ff5868d5cdec832beac91cb1b323ed723b65e4412289672fdaa2d6979eebdb02cf22edfb93c18962e64f07158d2dcf29d4b18c3cc2edfdf8e995d3e1717172c96e0735f24b784dfcf2f06f03b38880bf9133525680b4d2a3d9c48b1f438adf4687e6ed8e81a5efb04b607091bd20ccd1df1a5d7899bf952d2a272b64c3408b96108a9e608cc09c80cf395390d34bc68982f2660dd91550988cd8e1edbd6d23263461886420738c0021630270e20ad232dd234da030d426e2042aab1d10090960666d0402b0920add315cd81d474615e0f7f6ad8186fc8ccd4b95ad55b676b5fcc3927b783e64003ab92a6622bd694962bc70a4cdf2ca5e2c06ab55aad561d44db1c99a145b454ce184dd1d284a14ce84d8b6054432869c268899668899668c9c3de1dc265fdd0e1ff498ee3d5b84de3808c322eccd03840861e3eb84df3b6d7ee1752b20bafcf25a687eed7a0699bbd1ab87794716186c60132f4f0016486ab7977ef97bfef97f8befc7c37b4fbdad53c2fba71dcfaee90f5901d379ba1b917e3fb74dc3157445a54de1d3d7c009981034184dc90f9956187d757861e32cc150dc26da6e8b2a662ca1ad523fac30d89442a413b49b5aa719a35a3386149ee6fd77633938fb8efeefb67142738b13af06df9685f6657f4682d0e82a145fd3ea23da8b0e7f3366ec0e486c5b296358a6abe84d728af51a8d293de2fe1bd37bd0e65da675ae9b5171cecd6742e5d746ef0fca9b9b0803b3f3f2f76c954f9d46817115a59f79d02c7222105751620b1048bc415f67e3e7de506fdb8ffd35770d0ddfd19af04712506b9946169547454485728f77e17ba2043debe308699bf09ccfc899f08da31f3f731ccfc893148b0279741bcb07b1aa7692e880bf96632f43877f4d817fb8c279777aafc0829241ea25479657f3b67ca91861135c286c601647f0f2ab9df4715168c6846e10227f70bb17e7fdbfacb9652fb582ddb25b625bcd1f6b4ab4d3f1b61b8614d9372666142d6c29a26552cbd25e4199225a203a3f8a810bcfb59e9c023b6ea41723d4bc0f4277883ac825458cf06f5825078f59060fa3d3bb4b9c59208a59912ba304f1fe48e72a1a4b778f9076abec14ea0f6586be04b9b524cddc54bbd8b2d98d4d945ee6ed3796ba7bf8adc651714808963be98a713b9bbb07c43f74667d53c1abe4cf9868640fd80cd41c6ec05c1359d5d8747976d76b12432df07b988530b84e6752ca0f48a2c5694ce1c5f0c124c670e9be7fb1743360521b880429e739c73a474e6f04ced178304d3ecb3c0ec220753c8c0053158c10b0b724e28d0a0d545163fccc0092bc84eab9a36a9d53cc39d1287dcef822b4a1d14e0d2853c55806b0a3a4af0b482cb31cfbf4ac07059238b1440019738cf2b7af00257318b22bc05352d7946c9a26687ee0336d02cdd5a963148998a1d16b8bcb4a7bbf705ba69c3db01065580f35cadaee43973786e1d70a6b4cb027f2e1f7402973f270d7d5a6954f162082e745082ea414d0a08add20ca65051031221a4000a4bc042a5071af0a20a4a8b1630b9e20a927ef5172130cd9d181864010661803f557039abc8d36fd00d81371c17ce8ca003e6a8e878c08e4567e465027c613de01aeb92e0b2784113474046c43a15a88ac08ec518f8be8ee00b7301ae3114c6c117490704d68cb0f19e384dcdfb60cfe3c1dee767643c4f0d2da4e8a19b36343c5f269db4cb2596a1057704ec421238330209735484811d8b29f00fb8085809be4858981302e6bec051ae0022777946d14206b91c592ca09452ef8f2902f7897ecdb5674ff1f314fb9493f3ca652d6b44c1024b6e185490f1e5f9d65a9b696fb5ccd65a2ba594fa886edee2333aa36e04f5e4596badb5ba775bdaaaaeff13a2ffb37156bf27080cb281e64b12a124f6108bd572bd3a8629a5747e0fa0afbd871ef054ae81be26aeb2bf8b15b8fce43e75a84c9f0b580a18fffd02abf0351ef4a55d59d4dd304565fc15d4774a8b70f7a94700c07f519709fe7b83ffa6f0df27f82f14ec19ffc569d18cd20457c67f592dea32fedbea1147e2efce5fd5e545c6354df0db1825e18f79fc59096549f833932d4dfc19ca47354d6c1332a648c818d3f46aa3b5d4c2796f796051f452b18af65bc4f272a2275afb3122e8c70a1ff32b7cccb758de4e74b194718c8803c8078d8f791ade22c53c8da72182aae8ae1e43f88938cb43331eaaad1ef1af10827e8031bf43256344904fd26f3ae6210cb2c024df43b89b404eb25b1ec2e124abcb47f665631dc28f5df83d43e0528365fc167f7daac134fc1af6c72d8fdfb2eea9ebaa526951b93191b1ebc55dc1d2a52333878de3b9a46f30149c3a85d44d20631ebfab6aab45e0e36f56b7fa05ebd88cc7ef259b99c37b8cdf4f18cf8cdf575e44c6f85d88c9001adfca9895f1af104e920ba910260ef03be56d3275a0909235420b2b42aef0204eec51a3c2d7f822240b6fa5b10d968caf64acc20a2c88ddf2d00aa10a61c33c84bf46d82f0f61568ff8edeb645f3e8a794c82c249de938f68eb9e5af7445b5d7b2e1a5faa90e74f1a5fb2f0f9f9fdcffff1a329c10d89443242ceef21a492f38700f1199301347e7ee75a0e306dc59ce338b1bc31fbb2af987dc5f0ab5858b34f700bffc5b8fce0ce7a1863fcf4d3d1e33fd80293bc5f0cd7e7630fe6691ac4bd8ca7f9e5033a609efbeed530e145f5885f467897f4889f0b1ff022de538ff8bd27600beb11bf47b4567ac49e17b86c56b36244d00f8b43b73c84dffe24f1d3af5913077e2f5c22e669843046c0f6e9971b13e427a4f4c31ef29e92dff590f74b7c9fb0c91e3d24cc1cdce3a728c718637cf10bf111e8e58b90edf2107efc22f6a8b945483c490ccbf8b320ccf8263e3e4d40158889797922f8635e441f313f4324327a087f8cb8c343f83f628c117892315f8e3122e8a59cc9f88a0d9248f122da4033901ef10c1ec2183fe803bc85b7c7adc7ade569adb3bbafb5d65a73c8ddd7b09cc99376e2ed115ffcd33571e0074918fcce7fef3d775ffbec4d197f695f193fbea78cbf4dada4452e8fbf4f2e614c112e2e5df72d1ece6cb7c06f5f3307cdf85d429aad1332b660641cd6eeb158c376a380228471021de01f5ef2270e97e16302bb93ee18c0ac2b2755a6f3ab40a703049e4f4f2a264af9f6cd948cdd26c900cfbf138776ab58bb94bf08dcfa95d45374b4d6ea9d306a2d2bcdfed6ce39e7ec8481e9d739e79cb5d65a6b673ecc39e7f4fab9b7e75de5ec96dd3a71b8fbd5b68cb35df5fceb0e9dd3db4cfe30475498ada9152c02a6350cd2a75c6b8cfefc273617ad5868081304a66e1f566bac45dad39c0aeb10acac58f27c181cd42bb11e2b8c075b6ba3d263c31eb04d81f1016c73b518dd36437441c2e941109290a248922d86900a42175e3c5122bb8b2dbce87aa8840863055af440450932865304144e4c41c210c8b61286d7caaa5ca184ec892baec8ae58822a53e800e644184a90b39582214471c4134e40a8a01f23914252426ea9000a57322de5cc26d7d2d6e4fb154bdfed7e85f5e83ef7b7fbdbf92b05cbb4d6ba84c97c2eac240ff9cac43ab5aac94faf5ce27c034bc5da4b2bb761b55e8e82c53cb57296dbb4dcd42c1b1f75aa75c342adaa69561b53897375195170fd9967aeaf39695119a44f39fb1b2dd5a27a7f7e3a281671791f70c51a4460f3fd39eb8d8fb49b5adb06f8c67a1c19e14837a818ea043b995e261b974da955ba24d625c55631980af64abd5c37ae16aac53a8d8c6cda0dc7c3ccf1014aca1c0f13477d53b6dac4525365235bc9433795eb7dae3473843147700df76949e44a1347fd7223e5eacaa57693eb6ba8edb52f065acaf7ab0d70668492584686ac543e3222446584869491196e8c00419d7c64a4c7c9e423233b4c363e32426353f29191999225f9c8888c25c57c64648cc17c64e4612f1f19f9bc8c6057cb47466eabb27c64a4b23c54bf6e61796d666ad1273be5fa34320f1798b301617033e79ca616e092d26e2e4856e4f99d8439a2240f4d317318218a3cbf9f98231a3cd4ac39ea2133736c3f2b2993726d52ae6dfbe91298192c2191e8e52123dfefb449bbe3e29cb686f66988a2480d64e4ecbb4c9c59400c3ddccb991dd97f8ef6fde3e1c99906eae783b14cbeb9553a2a37874e315fb0b305d7a8c8f3696be6b05f7fb6cc1fe27396d4e6f3e56ccdf872ba687c395fa02fa74a4689b30a35ee767f7694dead3ef154bf3ce4fe0f12cbff949f1962e91323961f0c23965846e97ac4f2e21717b1fc3c0d6db9a86addd6adb56ea23ba1384e2cb55d4b144785d7ebf5ea7bab0ab5ab1152b257bdb21f8fd0cb6a7c3a50a7d3c94934f6b98203a356288e95ec4f5b4132a538ae6a798204a357680cf422cfa75dcc17bed982ff37a98b4ee9f9148a9599a33e7d425573d55b577e7777776fd53a168ff5e87e4df8f441ade80d6d3d2d7d4e9f0fc6d7f5fab452fe34e6a2eac39e8f1c7df72b3dfab7c4ae3ca073add656b7ab3e4501973074424a3ac93f1f8cefd78c4798b3ef366fabb4bb33278efb9d7092ae56abe59fbfb999c1ab08438ffe8dea25250c4b32afefc9f6696c7a321583e4fafd30d090ba0667e043c709f807bc03fec10aafee4bac134abb5629a42352484ab2a7c777f76a2dcbf2606d9665302924d20ce236312712595e40296df72c3bd86e0ad9f684cb0513eebddbb68d0165caf747196306dd184a78631cf17934ca183b74c4080314c30b2c8615d9d3e2d1508c29d9d323c59df99d3cb513508a44539ac42ea1b4bbb3b0b2b83ccb0eaa9767942c33c89e9aa4b392e74b21c5f2146fe899002ebab7c8d2ddfd4a52c5892cbad00108af5656240655ba60410baa9472aadccc52110699191cd008f0808b243cd1c4111dfce00242d8220a0d86400de104a416b9ffc3a892fb6dcca80290679430a28491caa50dd27bd6fb7ceeedb8eddeb0daf77a6cc7d6566b2d919c3d138fbb8be5bdf7bdef9e3e9e23eeb7a7d40bafd85513bdebc933534a1b6bed40e8e6ac798a64a0612541ca347b9ea3c17596cc85130a89e3b830c80d1ddc14797ecb18f45e91e366f29daa3c656ae69e3e17deca71cf8994e338aede79afe6a961c3734ca5d289834da6b03cbf9383679086650f7b324b6ddba85c741e1193c026cfb7615961d906a9b07bdf33b1c4c1d5a73c1f2c8216d62b47e0bad5ed2da9c7b96dbf05a9b07c455b733331489fb226d6588ff3ad97ad58add0b4db6859c77ced5a1a943567decc31b31755ada37352ef6436bc5160df86d7fa74af47fcb3468ff8b345f1d816226aad14f07c0a1f4b33aa515a3f5a463f9f8f95ab8935f8167adb76ef985bdc32f78f8fde8f406fe542cfb92f6be6be8ad5bdadb6cca0f52bf51ec353ab66b34cd334cdeff41ade60a77b17d9bcf7e2396dadd5e26ced7580a8bf569a8cd6273a67823bea79aec2702297b56b0dea4f2772d9c9cd422e270bc8b4df4db0de45b5626d159b7161b52dec7dd94d8bcb65713b2cbc9cfb5d713b565cb08a8b5db785092e4b785182878a0c2a6092a0c5e41a96730a6d860664d2c866161509641be022d5a82cc0482a38185b21d7f003cd429ee1674f838fecbc17888f34eca1f99978044f27f2cc65a7bbd24d1b6546cab4a31e15421b07ca1738b4d57128ab16942f4cad56cbf59282afd1364dea52025458354eb7ab525fd8e078ea094eca5d0a291c1c9c2935c7009d4e384448a579d64a5b304a76573b36d5756ce7ad8da76f5932536ebccc8b403d0e30aad9e1491c7f809983e208675a01fd07085d6805f4df08655a01fd32e18d56407f7d28807892a98d70b63b099d4987507fcaf46d0cd1baf9fd0c6d84a38eae8a3c92a86865526f98b488eaa051785255aa5aab6ae5090040586dc27a12c3d05b2ba8c04248bf46383d441f01614d93d2c20c10d63479318bccfa7ac0dfba61e36142603d61370881d55c8979c9497e3a4d98901b60b11a2f0dd95ab8ad8573e2a7254e4e5f4c71e2c4c993261ae657fb9b7d4859b4e5216b6364d59a4a72165dcdc8f438bae0020c9d1b2d72991bb58e366ae4d2591f2bbf42c3609839e67b8feaa93f532cfcd441d980d249d236a0b807bb809ed025b4118e58fc1e5de49104d511419e04e4a62af248824a7242f14882ea717aad8ebaa180eb00bfbfb72cc9a27c6480a72d3c957198c77c94803fc0d3af251f21e0298ea7011e32c5c0c8f8193c1f8f07d26ab55e5c6854aa16906bcf9d5037a921fd3edd817c5643806cb965e3bfe5f57abd5ef835c1ce90582c06fbac782f2059d6ca5a323a153c163c1a7cc4cd3ba978465f93aef2a4acd635b590fe4b4b403cd47fbd006419731c355535cc0e5ee2155fafee5edce5735f059aa4aa280c89c562f7eb76a71d922d8f0be483adb5742556280f18a2a2f1b6ef1f0f4fbe3ff6385e16e688be3cd47fdfbe8c0f40b619c8f5d59af8b235e42a23d7efdeda884360c19d3ca5f8b0c4131f92c801fef294e2c310597cf8a1843d4f293e947c20f540a5086011360fd5b94dd0e890a898e06c4a49e0205a3d08611393d2830982b8b91284cdcb0b0296042436381d1bd40e4024301a7440c0a494509c4dab63289d5a0a0f6078b04881b53ca5f0f0845cca703ce02c4f293c5871017e3d816f9e527870c5c0434b0a0f48a498604aae794ae1c187faa27927968e0eb12f0ab8bc9e1aa447c29d74061a3870e9cc4ccfdc26fed94c9ee1c1049f30f0136668e61876e06286669ea0aa85a0fadacfdca02a3ee0861efb89e42c1cf2044c83c8811efbd62ff1c7355d2cb14b07dd7c1b3ea0a35f87bf8e1824781ce7f5603bba1ea00a68cffd8fec3b1187eeb317413d384e04f55f1c3811d4da4f92d2170264085d2d59a2c70c425ed4e9921d0aa0cf04558e99524a6910be21e0e951504a61c8d4854cdff1c704cff7c69e17b857d04d1bde0b8b5ee0100301ffa8897f3b8d2f08b8bf65e81d93ca9c627bc8f0d900b7b7cbbfa054045520fbed7f58fb9b08eab16d2288be86c32682e8ffd8361cee73939c4b7c66687c1453a50a12397f0796d1421a0ff567e138ba9056401f113f19f408830bb4ab12ddb43143293370e559c34c692e316e296111445f04b9e87d3176151d297fdff77ddff78151ab1776e1bdf7f3f976e5f2865a4d5589113549b5a9a6293fe79cf5deabddbfc1690e7501a101905aadadb556fb84184bca205e9e3427cbb28cbeacb5d405c486fd3688ced31901979e5a39cf7be8f7e33933a569ce8a5a587abaf4644ac53248e64aeeabf61f1b8304df5c06c9f6adc7e371022e3daf456503725f21601510ba169545a6833b949e9bfacc41356fa17aad5ad5b4cc890e7cfa2db2993b8ddba0e590fd2dfd0e3b87b650dfdb55ab38299df4f6eb45b1033f0a4cc0729d53fc79837d59c922c795056da1d3a4dc9032fd5e5e9de0eaba9bcc746bb0c46e12d8ea492a474ba2d9f488513d626b4ddeb238536d363eb2a5ccc482b132532c33c15aacccc4ca4cac542ac54a75dd5f162b6b5171e5bceea9c16e6997ef5cb2cce59e40b18595d18ad3227a513729d5aa7bed71d76179adac703451a3725d38dd3d751d8b76f784d37583dd60b7742d5dd7b5b4b4b4b4b4b4b484da0bc74a8f38a7471cc38f6f8ca66cabd56a75a096ada6456566ea5a5ababfac1615d7cbca9518968db4955abacb4ea90cc5ba81a55aaa9b15abd5245796984d81dd3589c402592c6b7f856f4975aa4bdd54522dbd62304bb2d68a2067b5c677d2c74c3eba2c8c9df4886f2ecb47f7247a8ec0a56d65fca9986d592ad6956a513fe9eecd4c5914fef8b313c4885993391a3243f87166848cb110795f662f88c11e8e897d9ec03bc8f8e78cd900a6b2354ca8a56a534d55495d72e324a5c269b9ac5cc1e2a59725c59ce4366ef213ea26a55ab13a2ed87c22971deb4113b1944aa55265a7cca4a44734959952191355b6c4495e7293dbc43253ce4e2c1f35e96256c634687c667cded7b1b64fd4d4a43e51af4f3ecab25376ca4eb1582c464d99899a482652934a366dca4cad29acec942961a552b1540ce6a418136259582c162b954a65fcd4e4250f9d62b1184a8625d32326a39a810656cc15eb76d282dbf39c148b7989a5ca4c31960acacac5a5678e9973e79ab14295c1d7fa6ab7efc56d93c19809402a3d82ad1ec12b19fcaee304ec3f593d828ecaa0920c9a7a04352819bcd223e89ec1b4528f60654295cc518d7908d452d6c6436076ba301fd5d70d4ba695415606539f99f246ad3733479741fbe0dfd47d7255505ae40fd2bfdc9c22c738a6088cf1e677bbe22539d85deaf73a01582c526649f02f75262da2a40ff8b7746daee9c2fc45815d622e2c2f4e06df437d5e0567c068aa1ec16d63d223d8f792ba6fe8a5242620e7def190721cf734dde1ae87f7bbbedfedd7bbbfa1fb779d63f7ceaf87dd63776dd523f8954906b186d32308a547107b08fceb21f0f117b8c6839ec697b6655336655336d5dd9c169536d65d07fe4ddd27e05f15f87705fec501ff4e01ffb6c0bf545ce0df17f81dd731f03312f85989de505606df943ac1809fa1ac294b55f03315133208b62e756bea581ed8d41563f5c18b3f261f5511f44385afafc2d7fa300f5e530661441c403e663ccc4fd25d24989ff13344908bfeea31043e1177168cab47b0d6dfa1925504f94d8fe04fd2531e02bf08397a08fcf710e86ac5ee8d87c09fb10c82497a04afcdbdf1d12575087cd0458f11b8b4a90c7efdd29a5aa40cbe4dd9272dd21e7cf02df856498bf0839c8d7984c0a58d5930a66df9084614755f663d64302b4106712b835f4f35a745e5d6830cbe600ebe63a9699b2433c7cca0eae4a3c9a453e05715ce944ae505f3e0fbaababad5ae8675ac4533e6c1f7928f3e0f7a3347f7e0fbc9513729f09de52ac8a02791c1f7134c06cc785706c1adf3ad62e5534723a42408a460115285076d628f9a1a0f8a61691b03b32319cc6a325803a482d82e0fa910768db04160ab4730e62398073f23d10827796f7c445d179794c98c19311faff3be5af38cae493ef22df3918d7908fc7b31d8f211b64fb00bfc7b3176307381602c83d65a6b656cef71f9800e19bfbdc8086faa47f03de175d223f89b8b786fbc27e0ec45b4587a045bddda583e8211413f2a0e5de9d7ad7009989f01537b40c684947e3ebe8711b187baa79fce8ba14c9839b6079fde80a083e0531308ba7c11b25f2017b147cd052739639f6fe223e6611e06e667bc0f989f211269e2f24460441f30ff1189c878087c18b187874055b760be94c93022c8a59c2a17d106f069f010086a17f775efb877777777aee3b87bc19687c0d7c4013e48c2dd6f0e7e6963304ae0fbe5bdc9e0f7a997b4a8e5412ea68816eef177b885a398136f6ce69833d7fb6da354376d94d62683b367cfda0c283de9c2001711e4c3e565bc0c9188cb1721339b2359a67dd7cfb22ccb322deb0edda64730498fe008927a049fa66da63d4c1ce0d3d20e34f03bfa65211562e2001f487fdfcbbe8c9f5f05eccb101bf643c67b7e7e1590f11eb1631ed27ad478bfc3255f3eeb47260eed69fa0b2bcb43e0dbb0ca08abcba39809007f0719b20e611e00fc0ac55400f85e685f1e023f035f860eb026d2243d825fd68fda4c1ce0cbe80106df573ef21efc1e7cbfb9295506df8f3438fbe4a30ada073d4906c186c51a6c01e76c530641f041d09541f0292c83ef24079f824f4f145597cc1cdc835f4de057f06b09d45f84f43cf802bebbbce5a31a42404222abcd2b83b00c7e4581ef2670926089415fdef9b520837eca2008be0bf831e0eff011c6e3282333033e7804d38701df03b6809e6fe2e3e55ddec5e565bc0f9797211269829fc874172cfa70798f48c4457c0f81ff22babc8b08c23f49108b36803fe321f0cbcfa009a4a60cfeb4018a35581bbc02fc2e7f7ddbb6af5d53bc032e3352c65fbf1ef665025c6a5332c6e971e5032eb59c8cbfeb3801d79f2afc03aedfe11d70a999327efc032eb52319977ac4a5e624e3cf727ac49f0d3cb42c5966e6fab218b5e9518551251a6a89257928b3b92e1f55d74995f189b5caf857aa8c3f331f5a2ac55e425652c072792387446e90f734732c6911f8de6f37d7498beae3bfa939475a8733d75d8e624f07861be52847b3b73d4db788e51d5bea46ebb65502b058a4cc92f8375a1fbf46e3926ee9daf8a8a649ccbca68a672eb5b0bc4f32fecf94f17fdff9441bd634c9448d498ff89d906984315a18e446d66e7ac49e5816c91e88045f25dd427dd360d49d8654302874a31acc47f6af9216510f7692bbee6bd5724b111bb4dc953974b4b657c3ed3b2c29fdedfd6bb8bd87d4455bd0b16d1dfd286240c9f4b38166ae69d31c1ab741cbdd5c48b396ea11bf0d6b9a9457092c73610c3353ed498f5873d2aca8dca844ecd755550b15aa11490000003315003028140c088442b14818e6a92ce90014800d82944e70561909e42cc9719042c618630c01020202000023a469031dd19040d030078c1b69f8b3178d0661811910d740039604f0fa75db77dc2951a0bcda4432cbe74bd9e0c5751fc6014d647173086541003a6431389b447b0ec892775638d1f0d0feab865548d17372758128a4a90cc06e573a51380514a84302247bfc7bcea662e9be0b0547fc0043ed854a116213fbc05020ac56235a132a54ee1bf63eb7bd28e001b3d5795dbceee41a1468fc46bce21b5f9a04b021797fe049669f28d228c8675344a7e4046cca9967f680710a2a76be104edda869fdd8b696991d93cd2653e1908546af5d5e9413ab2715d4cc21ca9aca9fbe7e5565ea0f6d7a823740d6bd0342839105d33f39d30c87a09e1fecaf47a75bd8fe5549e1ccdc690e306453b49aae4c7934b4fc26f083e06dd002072e34b38ed662c207cba501d41a7194560749b5cf4bbdc53f59cb560c45c86a5ab6a4f696797066a3b3afc6c0f1e2174abbc48d17ba7cf3816dee9c5ca2b093c9d8856a0c709e7b4a73ee3e3db612b819a204c853d96c71aebbd80c5fec22024b787e24286a4645db0be0698005ae5881779a268299bb8349defb4a261f21c7d862e6e6e725c1701e0d4b26067a1f88ecda8c2f3c0a0f14a9886f6020ddf30925d710a423150039cd97deee44e4cefcc69d607309e1e37b3f83bfaf423970e4ba1fd4bea415ee71d61b8e6e8e5132589aeacf50e8b7225ee19fa48337e60d1c359a24516ca9f4531a5690a7d73d620c1183762b6a7bcaf2cf8d4d7b8dc34d07c7adcdf837815bac2e1316628e1d2df1d380ac80b0c4343c86f6584ca78b456a8d1800307c9321c32057e29aad23697beb4476ecbbd175bf4af9d1947cc906faacecd24b68a035461db27a20c88eded6454ddec83f0fb5393510ddc066804ad1edcafbfc51e83b3b96dfb4f05b735a363db1cf0c03b5c6e89e51ea36823fb459e875a02a2e64e27b53ddde47bc9f1f3a8fc86d7f39e1086d4893b7d4e6e9bf3ab8256a1e076c83cf8931e9d404f063b0f4a4ad0960c990a4408ce10ff9c5f25d86a9610c858f86d722e21dc0cf516a4eeee08f33a5266d270e4b16c59a643469f481a59b0a5537e86316632130dd1670fa2a25f5dc13c1d6cbd4335a675084adc6a4941bc9482ef759a5ee731aafa5a3c5b5a54a504f383e8d839fe9a5a9f4c4d4ae0b20ca82cb0f4ace5fb2f4ca5d40849322351740a03ccb54627cf8e2bfe9a09a298a070da0d4eeb786279368fe43d0bbb18fef63afac9feb44e2c76cc94d5c74f5d6fcd7b3387fda6af2b0bd93236bdcb91913acbf36351db640dc8ec6ae97330605b1c878a73c110b0027b27609ec13c7e36e63ed19a1ff1cb102f0dbd11bd5a8a7a2ca361e84803a74ca216114ee42d5f078a28fce7a7101cce832c62f1174e1a8fbe437754dca86078f34247f97dff995fefc642269d87416d297ff9f5885ae37830777bc8652b9a8a56e667bbee918ac88ec4c76a7bb2663c99001070b3ed7ed5f2b2fd67367514e9c0a234949fcdedf42772a687780dfdc853943009da5730456add42e3e8768e675e613b1cfb601cc650155f5a24d6448724fd08f26483a8ffc0c9bf2484e62be618346b44f2c4392928bf6067d46a78943adb85140816e18902a3b45cfcdacb08f1faf43d2ddcb9bbec819fd10debd31f4601914ebd919b60e0b44a79ef30bcef32cfee317ccfb1620d7c651338aca8854ff3e11355d1a26573ef5d41c2774d68d8df617f8074ef13c9a5ee8702013bbd748c9465f79d29e852998166fb05e188e9ab4252323a85053b9763c5d5989de4da361f3d96814c7fd97ad893b72d6fe4bf503e7e19e9ff34261f25d4d46afd8c6f3e5f6467d7f836e30393b49d4f1888db02cb6543adbc99591938f4e02e3d92e5426b4336aca1acd593f1527596049621a6197b182f262c7257d51f38fe4d9e40336ef973d32719730fc240a96497aae8e20e3ce3b778e95e7cc1348a97c20fc98c504fb0595164e9502e9073daf3b94f9ca8278062e5c110021bf0e09cdc544c88362bc19435b4e558020af2e4518fd48c65cbdd0feb73e96967838883cb981733988f487553d3c9c7e260e0bee1f460f71e0846f82d0311e7d63b3a2ca50a51d11b192c9d52a4f220a7483fd3eec7bd734cfa8f5d7e48c22019910260c56d16949f16ecb1985f48c46903348e7f99618f4d340b927d7503c0d2324e761766a5626bc7a19078bace3fea27ccc71159df35b31b8ce8c1e0a0a6e51ec744883899968a99f977a4179282ae5908d3d95007ce10247e8ceb00494a3d19adeefaa5699c1ab8610fd35a62e6e527c392a0078c5456143c1ec308674cd06e3d6749169ff8c732cdf462bbfa87d45f4e09b21dae0102edf5b51786b454f1f1e72e6522d3601e2e8f447c0ddd7277e1a2cd454cb90fbb0ec4cd06436c3b6d03e8c3b52d8ea843747ea1fc307b071dab7c0b8cec1e165d5d8e91e8c770e4b92c04fd7789125e8620e0f02ba10dd96ffb9f857d88b9a2df10a0bf6ef013f49d7bcaea418e5951455b2376f77f7d191a6784c2cb16f8190d6ed926dd8874ad507d139b980a228d28dff3f255dd053e266a11f3627b26a00a2e0a444fc50971120a837c09d74e0d88ab8c1f08a1fb9eb9cee0eae68f77ad12cfac08e882d3bcb3843dcde38a706a11dd192d8787906562f6f445da9fee40f8265ffc19983435b20a673c175bd76eca49bb09eb69cd7d4b8b04d10a56395fd0c506617981521e63f7f410cf666d04b902a46cd77c640752cc8382b4f02af551108e82116b2625696b1a052ed86210d8fe47d8ae5c4c3e0d39fc81df6140a4ccba655214f98f4770568c94353dd6266fcdbb62b6463bbf697e46127bc612cf59144d842b198986c10b4cd171a24b6437839d5bf1243553901488e523b3626a9da9595c2657dd03dc1908af4275bd5ae4a6405d596aaf66d2d3d94999a1b724141980db43f0619bdacd12bc4f45f19a8b22cffd4a8103f1a172501959bac0a660dcf580dd443e70fd558291df11f044aa9c7e81960da957b055abe228f875538edf53890ff6cf373ab60b5edcc0f806c945039f002c15d53f31be0205c1716d796c1e6cab1d3786b59fac641fa78100af4fe886bc4901b0b9c42d99dde9b28166c796c341804fa848219809b8bc6ac8ce02efba34c8c313b5a9b3ccf1748e6927b980ffc42acd834fe50c359b48bebb274486d173bd068a79446febd37ad86f901312edf417ea619f6d6804da7c38835cc00eb62505ee5e2cc9e02fe46117e2414f0512a7c3321171d5f659c935f88027932ee70a07464bdbb68bc17b1a83f72b271bc2131ca7a870a1cebde103de414e4c2bc9b618ef60bb465e07b98fa3f30839b6072a8cfd39083b198e26703d74d55c7f2e2bbe917b65fe077bb2868374f1e9bdcb71ef409a46fa3be8591abac751626f1c2da870e050917bcaf3ca071b4d000cb4ea654fc568deaa81737e5362cacb1cc34d6d96564e4509097d6ab12e3be75995072ffbf14ccc914ff29ae053ae2b18a2ccdf734f88ce87112a92e931b984ee5be7536ec9316fb4618065f4bb1ca297d0a23ad2ba288823b0a0ce3dfafdf76be446373d5b397a4e9c40418af70d6c2929439b42f599f135f612ddb303fb288376efb8a372d97477c1ff70b9340ff6f062609dd84894ff12e30cfe5f1649ecaf14afa72aec577cd47d3f9402d9aab8a34187a95a80fa3736a04de8bb83920c34d6bf383c947b8117c5983ab368886c92b6bd9205144e0073ea5e5455c9dc43c00143082370558901633fa8a1da5105b84ae841ed526750bdf471aa3abca57accd22bb264d0484ed59c27a54ded6bf4adff827eb9df1931132fce02f80590020afebcd5734e402c6b95dd526d8d98327718a4e8a36336e97d790358007fc34320f1e66a8d31a8ac69d21bd404d02543e547d0e9d9b681d3c4d6c5f8021287efb67c7899ec857d0f39fc19abbb3de865e8035e5806af75c9106cc0ba99e79010a6f38fcf68c6db44a333dc1247a43d2f0e43126b404e7a7cfd96d2434689213ee9933a75528a80a27569305193dd74af3c5602638f9c8536e3eb980cd4ad4f208448c21f6f4ab33be2655e605483288ce580171624c673c2d3f166030d4826498a1f345c09c5a43a50003e3e03bbca389923a3cc9ca54ff9ddd8de8b229825c3ea626103e1a3522a207f549219b02a402e263c43fedfbbb6337ff952305a81dc54d6ba0eeed87cd461f7fee9159660d46d571138ca1df2422fe8e021897b64bfad92a486451fa0aa485023cd9e62ace58020789098373569febeb86728828c018cca226960f9701467b00c8542999d4e8b358d241f54c959628f68d4501de75e143f98a0f9c393e08a9b34800bb780f12ddf6f1f0e9814e936b30c0ba028a340ecbb6f9cbeb1b55d1e1ccf89cbad3d6bae9f07e51cd38f439c0fc829ff9c1201ad66daf7bf1871915776d9030b89ab4bf231377e0e68dd1b8bd878f9f759a034c1edd345acba0051993bc2fd2ebb1b100c4fe6b97cbb33011cf444c52e002f262201ed176550b9639b099430f8ba08e98b62846ecbe4092ea4f6464460de88253f8050f108f718078f937b7d2282aae70fe860e902200ceb42f0354b8a03d728f0b51af9ad7bc1d4038fb60d4605fcd624965b8fbb75337995257241fd3b7f13cc083774757daebcb91b15ee2cf82ea73d4bbc9a55af87d93d341fa8d600973e6c23ce39c37af5f6965194952e420dd98d9cfd099cd9c9be5e5f54273a02928b40cdf5f6440f1eb25039cf0faab58a5d14618eb56d29fa28d66276b6e4f8e8aaf209a0d96a6377ef40b6978e89ceb8bec049bce2cf514aac1780bd10af744c5d1337200b83b7f20571ebd8b977a3416ec69c1261d1ecc859ae10e1cad424d3b925d3c584a577dfdeee699af05b1c932cce482da3628ae6034907a5b7f13483be4da57c15fa595a4d9a99b0db1082303bee2eea9f83ca41ed18d7a3a19b7f88a71928f7e30564c3f57443de7e489d44321fee10025d4a3247a4f67264c97bd8b64252d881dd423b1a7bda0015efb58a8bf3fe848e89d795c5f423452dc20fbc84ea4ba8c1ef3d3c85c96294ee89192d81875715d71db60bd13aff5e5d1bbe4215564a150d8dd887ce98342337598b316abca93d2da0650c10ef86bf67468187cf85ce2b58090e718c7061f9eb45b863740f56e2341e003b92b07e5519a82e8bc6ac1c7373151aa5a2fc2d8e083fbcaff48f8baded2f4fe36418c203c0c4e4978361cfd2d6733482b8a86504268de2aa3435c7257cb83f208b127dc8f314ed1970745a500a3388afc0063ff8763e0e541e1a79a5babdb839fac4fd31129e49a29299785c6573362b40f09c3f23033ade60b5fff27787a136d5d1e0e6e7d08dd7b5b3aab2ad1a0603945d7b8270d4b65f8e54161cc7d1fa8327f4c6185a287374c3c6b3cde5a1ebfdedc79e530bdae720babd4a52e2c58efa0f07f662a433a6d0e004bc74c319042e2f2585578e5657685e3f2400613106052c42c8fbb7628d8229b82c91e425df1cf4da3e48d7c6cd58a765618f3917a3235e18c25494a1efde86af620fc76eec1078ec7c2a7092f373d59cb83b756ed5320f857e87f7c795ce94109a55d4b19a86bcc00d61ec3eb52194c7c70c2eedf5b7270cff2f0e52193126a9930b68a17dc7c2a1fe440bc179996c75a98afc1dbdbe0ef25ba3c3e40c926c2d35058cb434a5b0b9bf1d7bf9a5e177c7910fdba4958bd3cd6cb73d052ee811956a5e93147cbc3b3d03d280e42332d0a7e2cc8f674b74bc2aa581e4e194acc9e048aeb8da94cd3814bb93c7833a825c9b2ecd6e9ab8b42abb47eb5d8e0082dd8d24aa5bed4310250050c4187072d448a4756c2468bf8b1402cad9ea77a53e5ffc3555b6d1cd14b1afb6104f4e271f86f2cd0e5835fec6742f5468b10c6b5788cf79b72b10fe7c053385d0a8ad6de0f5dfef08b47b9786ee52740d2150dde49cd9ec2a646388955d1cf23663e3be7b1c3b45eaf8f5d3f32def64e1d0f397e1a05bd7814f19c2bdbc1ec91b6e890158dcf2c771e6e336160684e0ebb48f76af2ae7af013e50dc1879fd2e16f321063d12426ff5e329b67eed3b55c33e94db02f0d5218c5c3b4fda4933cee1ac738a3f3e041977a0d0f1e776d1b53276d753092d84a31d86f31c58db5a0ad9314327dae2b055058a85e980dace684fef32260a5d1b3682b3f4a7cd4c11e90028d1c20d8a0466833355786417627a5d0d971a4eea7926cbcd4cd854e3b438da0b1fbe3c5ae03a5f87859a244ae4f267fab440ac9cf5c7650d12f5fa14fe3a65c971fafecaca1674d791dfb2d1b24677142700ea03f4c50e48b52e577e1fdf83bbb70dc181a73b6f9117351587621f02b9f6405751c8073d44ea66e329b40411d78d2b343f338d00646888756b53ce2d024485165a0ca85fcd462eadcc30511ff1884b38bef2478bbe80dc6586bfc7160b9482f7a2db6da435d2b79ada3813107940531537b14f1406fac5fb85656b48a5d5c304be3fc2d388b5396d845ac93e49b0a0817ae2a0afb78d621945ddc5d0dc2b45cb840349f5194b245f2c8053810ecc2f98dd078eb569601102ea2e0c0d2695e64c08d6f4f87f447b2c1db5cf0b5e8411cbbb83e7290a54de2c1e4421e8a50bd9d9da968324a1090056b41b23a365a2962bcde2d1649448e84a75a64e6ad646cabb87467cc779fa638ac427763a98737bd9f7b20ad59733496089cebfc324db3265e0b114b07eea0defed5592d448dcc98730e7b53207b1d6de4982d9bd47a9a7153cb44950725ac16f48d4915efc9d89d2c6bb1157af5ac65ed45401ea25a8879b5d638ad88e79fd75958bda8c3f0562d9cbf01219f13282d7803d17cb5603381a21da80248570bdf44d0dd88256ac2a036d832c33d5025856161f2be3d562df2e723e3f61566224347be4a9a03ab85e09bc47d22bd831b1c7fa57442fdf0c17dd5a2d4b58954181aac004cf96ddfc276c57a15da547dbc301dd83d79d5427896da9da144371ec786ca45ecca40f25f34ff3f7e50a0a9c53d1ab4d91763b9c4994ef4d6c49ba30f92673eaf61aea5132009358c925356702540c323672d2047af3f72d17da3ba5244403883c91168394b8b6a8b233c2ee75c236c15125778615083e4e42e22db9436f8d2743dd44ede8f974ec2744d4faba822cc43ac89fd39999ee0e86ee5002b2d6e5eca6832b510802d442d782b58d06bd22090c2a5ab1f61eeae3785b6097eb6c4f81295b4a81994ed23106f8cdc9ecb2fc610e748fe01fea32bb162a4a1de82e6814cb08c30ba3eea0b8b4a3d1736a0bd2e043917c2c4a6242e8b55475f02258906a0c80a3fb968e6f95e1b98dbf52250b11f3034d8f91046c0875960c26a027670fed63c1a67cf108b8b021fe19a379b048168e41ae628f9914bfb872ed19d74fcf5e49b54b45af34055a86a66618cbb00578596633db238b9f17ffc3ccd33288f74307ebf343739b3940416a5d3de988351b74063f7396fcafcdb144d8cdfacb5e496c56c4ee32c8803f23a9460de81ca22f35f8c1fe4f01ac991d34fcb590f3ce5ffbf696c846bdeaf62f55124ec798c9dec259863461118db7712223b54b0a0ce0faf02e882b8081ec8cd4bc8423c1047d2e26b364a0107bd10226585523c6486bc4608fb2f899a1218f0f84bf10b858bb05a6cd930f3a447e55b99f25d02b3b8bd86276223600dbe1992c6fcc6e3be695fa36911a88d9f3b3cda159cb04465322ff96cb1d509ed7e92518d033c1742b9b5f28b10afda1ea8ca374793342ba7f22c481a11643c55ec0c5a3e3a2ae2ef81ca797f96ea6e7f245fac4b684e68b61c4477000e41c2b707e8ec40fc14a981305455d38c05b6e68adce0ca0f12e8228f1a91e81276a44bbede150c36771bf86fc64385df7656ac3f869e3b4ab144b5095ace93659f43f6f1c94be93412d00c480368625371100a7195208755ef7be2196c89104fc5af487bc56185d883175024fd340de6bbb06d6f5a0839248e423865faa2debb36b3a5ef465903c87ba3f3374a2af9e47109fae971b087200b56c5608040900ae3728f07166478cf4659c33107746e672e1cab5b17b6132a2c8db7374d70feaa50e03b37b3ebfeb7da6fd6bbfbded27faaaa68b31bbba301f3255c68c7bce87dcb6a58d6f3dfd0552bda2ea7de503edd2ca0ec4c3fa46b65498f66d3c813fcfbf6df5795c6d85bb3e24d4010dc0730e9a4ccc1ce3bd1b4213b00d9fd8a7ecbedcd708a2f964f6f0cdc651de7e686e6b050ab10d32000e47d6d7951aa972305abba30ed4a40366677d8d97a210f5982d4e95a5d3de046bc0fb2905da9f25954bbd3b333ba4da41d7eeff77aca61b5a89de2a734030da81e79d3d995fa19dfbc45e9f80d2e7b94d112cd0b36a6ffa8d70533eb2f153cce58c1c6adee1f47f2fd26d45251d698528d6717c2cf69a0e92073b66654fa8399bdac2ea648dc81e9447679117be8e28b70ea1fce9d745085e1749030e82069b9766766b21cb78e733023b9b5b8b48cb3cf7295e84ce18917231dcb13733413259f9c56329dc59a73c5b57f9afddd9c2e7647a309361d1b193a176dfce46be876f6a3a0ab70c7bcb5388395abf0d707656b6cde0fc52b5cd2e160a653093e3e35f39b35b58138901e41f7e5643c270a8f5fd8ea2bf1b5a06000e6e0fea7b87f406eb97cb13ca320a2898994a890c754ea517dd500ba31c51b8c378761e5c81bf2c3a16d06e3edc2185d515237eaa8044094603c84f1462c362b8949bc8223829d1ca8ea47762b62e0183313ab9781d7e03df622855d62761d078e940dd9c853eb97e0c4391d1585991e6cf52584be40403d3cf2d741be642404d50ff37c54fd80db7a2cdd8c00f95b855447c748d4f5c225385cb2d622a114e8a45c244048037180ce029377b2a7d54beaa9a5805579470ede5cc46b5a7d63fa75c8225a4011b06c61ef1a2c8404e12f14a6543151ed06fe6a72c67d53b912a93b43b0e486428dc6e291ed7427388e985deff84df2eb6ce90e6d00216d0593aa63f2f15a1820691a6e320998d304c1016304c72c070d6200b74148fdf01557848d724b4bdcbca27d41b3fd570306b8836489883968a657443ca0034e1d4754acaee92f132c20e852f54518bbd7a853479ab5d9db67e49843319365f938433b6c5b6e8d7b1044ed1182182df31bcb88d1761febcf4c2d20241ad0bc8916adac899bc9d064fb0a8f14d69a49552744dfbbc8cf44d809b9a728c9b3af233079776bc08b09def98960062f842991e6f31d4c9e6d5fe365a05fd572df50fdb6b3c2ffe27d932ae271d899575d34da9c4b7a1bc8c5b1b02c90a0a00ace42a2ab6d2c47742268487773f41ae47e8a26ff2091fdc9b3cba9f132bc2112fe5e87db95775f0f94b92cbd348fc313d37295149401e26181ce8db80d199dbec08c91e3735da2887ba2a61a259482b3d3d23e201669f838266ecff8009b1f0ee96e443fabafde585bf48399e64804108b5b765f9ace088186867e6688493a10bc8bb3863415280be6ae9022a516d4a798f4d1327e88025d57d5ece3600fa34197bcd201afc2cbf9dfe507b33830260229ffe4eeda36610bb2b9e8411d657fb01ce54480cc82266f50be40abec26fe53cd34ea40c8c40da3f7ccb0f9560a09996da92262348257eaa48482b86c5010ab4e4428988070468b2e7d22b421a519690614c090311730897c892b7adc6fc5297bc41a2656c3b9a8a45299fe2fd4b8a52c5f79810804de5b20a48bca92bb86719841da0b426898a8ddeb52fea6cae61ea69681e45d70de95a41042abb475393084cd585b57c8857d0ea9f84f4cbc9f5f7682686f97eae19e2d045e151f4aff3c49d69d42eb9a2bef525fed4252974b54b4df6e677be49671f3100561e5e7062e908e08ef0ad207ad49d6b85585b4c4379d4220215fbc2888e2366d44ed2bd4775599e659a7119e4335ce598c65424090e711ff82acde216cb418edd6c41fc220d21fb07507babd05c31d47254bf08b3647973974822711196f9041950cd6c7dda007a09b26102ba3e4cb9dd696b92b1b49710f0b5c5086b23df775d320733f0399268569206b8cbfcdb8840599607f181d1715b3d5d5442ebbc13653e6188f083ef4d9efc63f8e1386a1fb45eda1eff1d5f89bf044c9492bfc868e9004514903e987c228fa360f514d732a9d9aa10f799907cc9822cbbfc43c6992ba54b71394fc7d43d40fbb1388f68953e0e8a1a0e8488e1de502c578b8eba70a3d8a6345ced60702da5be5d2d69685bc834004d346b7111024b0f6bc0d31aba085a53fb4dd00a046f608c2bd806780661d32a202145d48bcfa5d70a79f1820f23b8a9c9798448c8d4178b8f325a96abf063e1a288dce52bd1e82940209f70abdfa193808bba2144830c1310d571353885c096eb1aeba86128545c6dc96660dc20790d7d0994d44cfa7ddbd8cf5048ced2e019158c0c63e235c70bc47c2650b58451ee65922dab32348c165abf6bd1ff2474f31c234b127d8ff0f14c6ebcb7cb9e8ba7508e2adb53528b1be2238099b346c5fd8cb5a119e85322f236dc8e3912480f0b015651f87e9c04df1405f1eb228460ef4a1d0f434d94171b2828723b4f52d332096343b9f10c4a7380bb009090527d72298646df8f94a69160ec13b52ad232d624471055b8ecb72b52bb5422f01b2f2b423b05f58de41c6934419688268da0e0e686f5399cb7a73b37d9c99f65111f0f5079e7ac3d9eae65b5c8695a862c116f7e2f833e8803cd1adffaa3cada1dccb4df718c02758784753a284ada8c84007ffacccba8cc0a8b64547fceef230d4045b95820c40c584aa16bdd62bada04e69e33bc9cae1a942c0f054c301036fc294ebfa91fae812063763004452fe25002ee0227b642cada3d3f8c4f40c8969e8e485bebb8a1ef2947aa0fa4480a5114edf73ac8360d990f5428b2af87f0bff2cc162d5da73dde9d14bfb6d05e732fb69d2dd881b706a5065cf17b3a7a14b8d57eed39c9e567fe39b7cd0b1e10a8ecd39dbddcfebb65a6957ff6963273841284feb3004c458d482759addc6c8b52366e866d8fa05138d57d9185862a972ed54b49d8ab249150511ba2d71665e1a10a3d2510078ac645ef4c44fdecd200240c76d92c949329dea8c53957122b39d261339fc1f085f8db60951f712b863f91d6ba55ecdcc3d1bf20998f5d6aa96ac64b5ee4ff4bb0eb55d2893816d8dc3dc400000129fcdde183d918080c7ff1429855bf18faba0082d5c6cbc9c09628be9ba896604ffebd2d99d5274ce7679e5bc906d66a56fb43d6d4c384dd48de9c0d18c1a84ffbc5a8803959558435e02a3091d335b32242322182a4e1834736c8c12b11c0d280cabbea6e32d5e4afb7486fd2e435e409007e98712c51333c4c866435d934b74c0b8122d9a6c76a4baae8049a3da8ac3c9131b04c3b14e40e403d31133b24b175f2c25275b591a251fded6cc2bb53411c77e7dc62fa3bc81ddb16592028734eb51cc4e83f8e09ebb009f0865c099013931bfab9419bb15ea7306b40de454627df7e83992677541ccd27a9d3932679a5f1205f91d0c1d7e60cfb280e8f3fed2b889b3e9ace03fa9c298d96d6d133cbab2430270c0505a67166caf3ebf8bdd8c7c3bb562d7f204dba6d4d21157a1cd59e6f9250eeed8b1763dc4632e361973735b80fd2e198284315eee04235e927aefcbaf2c34d59e22317ae92998e9e174d41090b62569118eac47dd64d21fbba5fc4bd37e668b194c2864a6e9de13ecac39017ef09718567b11ce4ef239dd0c4c93c5f95019060947ab807b9706837ec0ece6975439d75007ac5244e41c489ec886e40f9330600f24631de1da60716c6159b44d1bd555e299534ace66da40179bba5e491215f0ac0e720be97c743902f600ff1936d26125f6c6643bdde396e6e8f212cbb8d92ef6ddc706a07ea08f326a5da672b7c1776abe92a09d0380aab3b9fb3e2957ded98580a5e02bda05ce5198d4cdc5504a2a9800ea8fdb7089b948146749949826b9848d2f8d8759b2e009848f217a41e907125e0b261ca205763aa011306abb9d7aa2e581de51fa14caa237c254959247ca9f8a3c7826e1db4aad03ae12974b2cceabe20d7077e1dc1e733e05e1a9aad9a5e6bb501aaa7e19f6754897d9acb3d6779427512f06e7648c9578143eb064efc359d77bea4da0bc8e9a3816b52493570d3d7b8c760b4e0d7241d5b0ed4b8ab5783a22adaa2e8ce19175c39da10d846b7cf3e092feefb8696af557b31ebc1902ef922fe309b2cb76aec315a6962be68aae68517f9da7ac899f54064be5a100921ae563dda88362edcef69134d4897ea32270e2a95ede0c2a1c42c1ed58962857e131cf858a059ee3b87d872093282876e1e74916d628e468f79016468fbcf40e0b765ddfe3bfbbb38b33de94e5eb9801212c2fc05551a5023d7eaab85931ad84dfc84ca2f3bfaef6c745ec545285a3cf5af215e185f419db2319151d3743ef644988a4d62775094e157a6a550327c7b2acc4516a32b26257c95a4e61858533912974e8cdd5caac3db32d163522c5c80ac2550d75f459031c65b4f403be2362f2159279a32a326328f54416732a224bd08fd284660663483991499ce8dfb364a3eb92b144c223c695fed442c329aea3a70da613b9599180ee40ce2a4c19538c83531a685d243378f03074cad381e82c980bca56a74b6beba4dfddea5384f4c845baa4a8b4100458e041e88977888e45890d41538bda38e5fec69c39ac33ad0f5a747958eb99279ba8a12ec8e7de3f2485524622b3130af5ca2330a48c79bff0441720514166fd258c981d69008d94bfc643c22163aa8b3a868e9468e9eb9cc4a2d46e71663473aeb67929a499696e6d56db90929cdf7cfd38d05c9e8d4a0852a38e46210f0c626326d9f986a69cc313a78207021d1e272d599ac6070fe0fd32ddd1f05ab48ecef2ff555321ceaa03bf6b2f9b614bacddebf76c97802618aeabf97825115103615f599569a088b20e1293f1bd7e7c7ff3f238ff215314b05711880abb3aa39bf82e1a97ae9e1861d77af1d06a2be5e24c81d481397eba8edc4cb5cbe07756a20a894abc10ab62d4af91493d228cceede45dfcca16067a470005d8b138a8c74ab9b37377c406153f6cbb504ab60f1ea8fad28273e226d82450277596e4a36847678d68ae006f3f77e45c5bf33a2950b3bf9b933ffdc8cfdd347b6b188908d5ff7fb2f3df0c25a898a7a980e30ecd8f2c0f8f37eb06516e80043e8bb40db40495e049123fb3ef94684810b9116f449f81db1bc4351b3f682d3a1fccb0fa36b230a33c0e07228dcad707e8f1f685e5516b9dfed51fafca3e6040bcfa7e5dbfa6fefdc14be5f76e4d02191394928c8764eee2aef58b8c11207adbfba1898f3ba45f2605a8e0a986f6eae8bd9ada3555e8842508ce79a6beddf9c7a21db953ea8873b770b350b8659da6a6d576dad3dba24b93c5f5f5be9f5bd05d7f11e8218f9571a60bd99bac02088d5ca1bfb7a540f36c2d7ca42e8143f12a8c6b22f4dc0bcb6cc6c36818f8ff490ec6a94522ed717188ae894c445fac28e73ea5167eb3996a58eae66a9a2a03477f619afc7cdd9371f53d968ae249c0308b3421a1d94c8b0e48fc645c90173d6d59833b8ff7501c2449b75090705ac181ea0f0e78aaeb61d179e6117280f12768e8a9e117bd50b6eecd8a4ea584630ef8d6782f3af7f92b03508c276d51e6d0d833622ad27ae0260fc3246974a06eb9f201f9e11b920b435234f036cab1465ccb0916f6c054c909aba152d2d8d97a1825c7e52f8a55e42d43b360ce6f655547fbdd863e6fb926c726e416dee9aabe8efc6ccc46e57aefe3a7b7448baa46e85d3982eaeeee15b218f30f935dff33916ce9cbac3922a5233baa047c9cad72ab7610d295ed13f809dcadc43211bc7cbbf25b63d1e1406cae3220c25b9e59a03d0b2b3d02367f8ad7ded92f03035a67099436fd0c64bb119c6a843cd2b1dd7ffa0ad782ce0d3841db415068e20e5561edd78ec192579162761a1fcd39740298dbf72b01be32d7a1a91f7f8225ea7a36ae90f43b72a734c6428c127a5c7322dbaee4e8eb1921fb06f367222752e65c45613d793fa77fce834815778df1d4ce30c6639d67320fa965927cb0911138b0117493c3a8004f95d0fc28d798caf2513ab17e83562f26bb4b90b445a17d14cb955486eb97e1a40c0c7f0b886a225e4dd3cd22f8be3812e611cf2f87a4ad38099d194e6576276a1f50f21bca1614ecc22afb4119b10156af7782d82696955eec8c8d050d670c82ab9fd3a14d13db1becc5b38dfe72fd69586ee0363e815606e7d5b0bc4dbc2074cc23eccebe22dea85260a59708c81705fdd0997f9fd27c4c65f7408b2091e3b0186b15dce80816b5805fe93cf560216d55d7709e227612c276255e12cf70c55076f74afc746860dbeb11352d2f48608be22d87ab4f7529acf69da04ac8ca8ba92954f61e2da359f9652d826a29b598bd212f5effc7fe2320f884ac150db61765f0a34f1e9e0ed6cb34fb59b9978e9eb94fb77d20314b36a938348389769aa58bd5f2ec8b406e092091cb9f1dd6974188f9d72ad43ecce036b94fec0c6dcbbe90f31eea2d0ebe76b6d8210e1d7304b3ab1d0842a51d5b2fd88bd2fff4d733aa2e8bb44b6a9621ae7cd15ea778d328ea723b9e79da030e71037c84180533458138dbdec06b3e8f9740461d8f9d3026349b8c071c377ac27b96c032057d215e836302d31c4286ec0f5da2609c0dff149a5b3fa820a52917b0b6a2716a6f7ea0cdfc33ee3f4ede616e974a16a864a57d2969ae8c534e2d21680154c915d7aad718a72154990875158967f563b8f4127cdc27d4bb9f524371df5771e1ed11b34b95e3f1e675e27eac7a0bd8f61c7f2c72c737562d1134b132cd6e7f5876fcb7be2d9a6f52b989adb1b70f654ac17593554c549496c7eb8499b1ac4a4613175d200f3a528ba659b8d80fc677cc7b74927f6ba12d8e708f55a2624026e21e1e48052ce251cc92a0fdfc55340f282c4341f24b62669a8d321b62b8ced93979562c4d06ce5389b6d7570e40f8c1591b302a63e93e9fabf200bab31aaea1fa9a71a651be1b9ff0fa5cb3403d6bf0b0fcb1224909b7c508deefd1845d1ee88611e431429f4f30f94b3d993512a4dfc0ce13259cbc48d817b67a02560af56d141a5cb9583bd27426ac55737238f36610334300adf505354734c5cf2dcbf657b40a6eab45f0300b18d837496ed385038371f68e1a155e16329c7dadb4b27bce4912c13032133a817958f62a4c5761cc3c8fdbf3c9a48bec16a8cde38657da10aec101c562f6a763ebdfe1fda7c962131b07b9838a990f2025599142e70eb965fe5dacdaf18618577186be401fae21b38aacf1a91878249d6f9fc6643a393a3ca0eaaf4d9777bb9479e801f2ec70cdebd067c3876f4c8854b6ce03ce188292365ad9ce656db0460f64510062ea1ceaea87430e9c00a5392dced09336866c9cb4fca2075765eebaf328784a1d9b209671acda7211f8dfd85731aab70a5c14633bdf84d4cdc9299098475da246dbee1d1557ce852b54cc6a283ee0628b57e4750955eb7412fa36f7424589e148e80b64e3c379eec1879ccc7d0c11a640883a1c43b62894f6a01c9119c9ab4f3a5c3198e17b6022b296e1b3ce7849c28ee5f9481aaf6b86e417fb03308a794234186f85dcd9eef763d59b83097331674a5e3bddaf23dd66fc5135a90e8cc2a3647c052debd8568fa9b3894809b927e0d467a1a8d6afb48ac2297ac7168072ce3933227b526978d31ffd07a511d99474ad0dff6974249d9502ced1653ff71697f33e34a8d99670bd508e5acbcf62aa0b3cfcb93078bf246314acf1d68be633d81212c39c110557880b6d09f406607033c0e529cd8d25239437d908133e6de081710c08ce48d34e31b75a13e77e699f535fe6d16e2a4515ba35e08d2ded6a7b262d41271cb03331396198c9d2fe32f1aaa6442cec01804196bee5bf072490204388d20a98f2605f22babe6864f75bdd276426d01b1aa024a4fd0918020bed0d3191cacff6385a0d5fec9d0388181fc8a80286623109fcc4364e7e9b5710710204c626862eb44926d2fe09937a18e9616269636f0ac69806dbce2a36ad500276d283cdbb6bd2c3f1344ea779c9cd4bba56924993d9fe32d3427c2007d5b097f38e2525d75897643fd6cf46c1480af4020f0c5372a3858af2cbb9604d4fa09f5ad37094c42adab3d935b4f4f5424ceb0079168bc1083ce4a64b31ebd3714f4291bac89134850442e7d4494e4767e954dcf8d0d408d771d6a929de972cc167a1ce577ff547d0080ddbc01aaf9be1856a2f41b04e80b29125aa8d3163219a320252ad14355960627ed5c43ef666add3a8da9ce572104ea8d6ac66eaed960418030bab68490f8c1b9f65395b99aa430f6c83dc2eec9bac1a2e753e96a728eb22959db84d70010cbe98bcc605160ceb48b57d3a2ccded66a99e1ae52133521eeddb52d7eed90c4dbcc0f11a15cace067414f039b2f488bfe09f4f573dc1957b64fe643b2dbdd8fd963e36c895df4d24d1123169cdc453e2e7580865d28ab2d3b168445115b5c7ce52a5dfbe0344e947972d86ecd236d8dffb574e7fc9794b06590ae5f1eb6b2aa4e7b9ca59bb83e55882df5c9a8fcc530d15ad35c7729e462f379ea38ecdcd6de4c80c31692c078ee3a5eda01617a22c9e0652e61895da32e37de85a37af85ca4d796c9f5a12da4204d85a1f4b606319867f35b103b4b13dcf126aa4529ee53bc2cc8eb25f7ce49d81049fb839621d75c8b40f41bf50184a833c84433404f3e07b8a6526984394015153c8d23baba112c43c4513ebc2c90a8bf812507a8595113d0c672dfaeb563b46aa10345a941a7ea06fa413b7ed2da3b6e7da88d112223a8c2953517a941cf9146972cc4b638396b3ebb3106acce58b84d1fe8cb17cdbb1aab6d0b2fce160dba7e5d34f8590bbe5c189b0c834c47c20114aaf8ef9570b62c9a6f6c6cfa7a879dee94e59232a9067f4f99ce4734ce7eecc86befb7c6834c2f9c08958ca011b15ee075fa70807fac8596a7f483d1602e00469e39a81958e11043708ea371638e1843ce170867d4702323f8494dc06e0e0d7af549e73828acd49c872d8596320d88b2d53a929c5b5e40c1f104e993da3e92457174c81fac7b09545e2805537ba6caf7828949d822e88e89c3fa6d0e5c83428f5d772519e4a187a04b758387716858b3d12a2a7bd208308f3c49d254408ccba36fa3f01254f8085f68a0c63acd1402826e74050ce664c43171c930c37e4175044bd5758caa04f6ca4b24627b684f5de2943a5ef784389983b72774a9d06252c0fa792b11f2fc3b97abb0814517510baa9ccf842a8a297d40c295658aba8e0fb3f420810f718b4ed69b45b2fe49ca42070318544486120006a9d40957a2323042d8f9ca9c08ada3b384d4f2c55bdeed455df7cd45502ce9dbab2955282572135baba6be4d0e948cbd07afc8ab59e4544b2505d94c6349c4c20994532a7315c93e9aeb0454b5d4e3a6737c4071216b160b0bb11dada0fefadcf5d4d1a0f2638a21103b510495c55f66e72645e6cc4ddfae2460c0bd9512e601a191e3685cff16f46dc1c05436bbfb525b043f9461523b3f2d5ecff4987a67f55fb83ccf081eecc66ad0791897f4253a69af5a16220df733e6b5076dcf77d7b5ff6f90fab341c930edacf1e4a0345b5b40a64b49fad96f0eef40bc6d1f542fd3421f65b821ed434a9755171a85609c634fe63faf7efe88000e6a60dbff8c4c0e116073e62df03d3e69d81121c928d84361d9a88df885784305ab9c10b8c935cbba9d88070600d0397b4c23df3b5ac24034ad107bcf71d864154a6ca0a1b8dca53d0c96a9191d413863e0194dab3b4fe16836081389559c5d244f2ffc9c814081af39fd2e72748ffa47f8a1abbc9b34e9a7e2845e6ff1bfa79f6bfdd83c18a6b074a1182eff996ab840dc115bd7e3e572e7bc82f20fbb1416e846743404fc116d9b3feb305a2b46a7b3ff99e2dff424f49a13a1db4427c3eb793e3b4461d7acf279ca89b6eb228387c5ce766cfad5dfc890c1eb75d50d8612265b59c47a30fd682dceb5270f12bc59c9bec64340a7250c496dacf6f1a800adf3ed1d59b74ffc16a3808bb65344b069a6436807839c31f4606e8adbbd728de1a6ec51b3cc04f6f583c315f3c91b156161170e4458d8af31b82e3e1ada1e777561d375c70bcf600318fef76fe8e9f26dfdacaf97654e547e27e3ee23c8cbdc11496c9b2573f6a1bb88761bf3b4df64f39a0f02c41ac88fcdced1a6248d21762b85ab959702b25e0064497aed4a6c77088aa455fe81b7bd33260c59f4c1559a55a1a22c445e3749ca296985f310d041618d3cad912b70c39813a829e7a8f004191db117870fce92e2dd0c5942e63229c653ba4c3343d29a84feef7084a5ae869c3c78e3814df09362901af2df3bb7e198d14b7a85376c99e96c66a690a925212239f26e97b71396c00c30e6ce676d7cb3b3ebe9a299bf15c91bc6748b96b61753a857a25e3475e402909154ee214862f12e565ff4b152e46f285bb4dcf1a7883ca16e573fbbed992d201ab93340ecbe87581911d92e7e283f77155de6884e2a22b5a9159ff86966a4353df3bbd0ffc9584983467ba2a0d8cefbaadf62c64a7536f66767d43a1c499238a91286c947d5282315734ac94b05d5bf51951e3505caf305c65b681a7caed26ab5cbd403654fb969953aab9efe18ce0d2cc40f1a95b69bf2e36ec95853cd9452a6949e5d7a2d3a5f05912e71dde762f40780ff3e98d01c1d3199ccb6c727fc34b479618c68d74d7065815e7caec95b0e95ad544fcda3bae57cd1b17b465ade804fe19682af7cab505f1b248c80de1815968745a344c49b7d67b0d0f8eb3435eef3e700982688dc4381d9fd1a59b6b4772582faff6f89da65e55246086c91ad2e496263b10be5662e08cf17a08a3c32e1ad03a48865529c36361d36a2604358aba5b25979251dd8063e628e92bd0519d86821033aa8e9cce8e4fabe7104090ead175438382a575e6f9380d277d91f32c526524027c23278eef978b83588f35752bf2c0f3e3a639c3fbd723fd013199f032cef1abcc9f55494ee9a2986422ab27675dea7172fff3d6e25686285800e9b3d3c7fcfb09c361efd12517fea2b04cdfc2bfb5ee11ef4b4bdb28810f0af5d9fad2e5aac2687be30e25b7a5adbfebcb7ab0a715a5c9637fde97225817f45634be02f480757ef7e60469eac8eec58fe48a9de2a8fd186705a04a9d19e7c29d9f847326ea7692131cc16c036da908c7fd442166d52c169c48208a053ec15f6cabd648e250649093c3239e1f75c3d6713890bb96aa66a57e254b5726abf44d8e02316b4ec39b6c41ceb73c9414359d50379229a4982737b2fcced5877ce800b81d8e8ba8b74eccecfdf3ca5308c5c6416c9e183a66be1417cd29347fa0086f090c3af069587653b8d7d4b058b06a7210460a728a25f0ceb4600d081af85cb34f9c7a8845a1c76474f41c74e460c44c2e78ff7f52625d84f2b99734fc5bbc1c2148a82db2ff17fda98f29d8c726f30177fe10d70f1c442451b9de4547f48917718a2e57b700d8ac1a6a3b15694c84c4c61b991ecc8cfc4e47cabdca9b0541d8c86b612586ada22ea19ad09ab4e60e16fbee54007ef21d6a9c1949fa2be85d1f87a88b39a0c058b12215d4a05c967e2868b2642e3580e64464d304770b42cf470f780b18a4ef5e05191c55fcdb4f1870dac423ac052b0b369e3c3314e94fc422fe133fe397e603786f6adaa5a4d7ee52425549c388ab6c8456712bb308a3059cef3467f502059e2e81f83c8953cf46185f4127f1c0762e0b58205d2eccd2e969ba0a671c890efc6640bb5b02df328a1afdced2a88978b417ca390c2a8683efbaed834dd1955c0bb972435a5cf9185b0ea204348bc22611c4370bdb3f01df8ac417266075d8daa7d08dbbfef9c95b48c40ba273fe94cf4046cfd7a24596d50e2f9c5cb2976a2b601323901dd69836e56a632a966e38bb4a25d93e4b911124c4389e5a403b47105b6c0b25210ee8a9bc1cf38c888ad3f1d5d5d1d41d80dbd1a6369eb57050aafbb25b1da859665b2c4272f747021c039be5fe483cdca29cc9dbeff10ba2c02e1358dda7d750229144ba242fa498020f37148f3e36c445b4dd19b0d7448c736a724161812cf06252dec1f0513144f5c92938d920c90d2a28e8969696115775328f13f4019b8c008fa3d2e0258b623aaf06fbfe3ed050c531cc488ba99530d3b067f1415bb85ba3ec255f26e726ad8a5a71aa0db04d2c3e398ecadc67a3b18a4cfd9e30388b777d8e9a3ab4809200252480276bf989030b2c9d860dd3915c274e39947ee360e9c8d3626d7851d06466e4d95344ec1fa9f630884036624d8dcf64074da4c902790e165bcf83990dd0def00547a3962bade01171d6c40910ba19cbd91fd4ccbc0e2a0848beee4c0eab6b2f57a07dd53aa26618ce948b123318cce2e52d8baf09ef92ab050064d7e5e6a439f6d46296f4a0caac18fab3c26758cfae75cf25432f07420b018aaf3eb23792587de21baafcecb16495b70827c6f61a330864cbaac158aaffdd8025209943f095eb280a6fa84e3716a28270612c7366c590a872b744c59b9610d0d26507deb0058d8f4324aff80108968b4e186efdcc8df470b142d7e36b8a84024d70e8159f724b2267839e8879b5c6448a8c973cdb3f682c0ece6aa798f793ef8f3c91eaf1adf3b9196bb53c05033deebf264ff0f51b7dfbf410c49147a7d08c214a7e0304b495eca4313b356166e69907083e34dd326f7ca4808c0fb97241337691bbf893abf60bb7564e34462a992a9089c8e5453e201ffafd452856386783239ec208e448190d290f52282f26ad92a47c8735475b32389d481a86cb8d97b8c0f20343b83c32e97a7f60fea6b3ef68f2ccc5b9868650145e2e8c61e82fd52cb4627b078c0fd402fd983c132d9011bf3a3b325f8baa0207ccacc6d841c435a61723c36b1a07e4850861ce9da593c2485998b2df3fd24b64416d437d9924b8830f0a2f7b6bb80d189868f7d38932b823017db82c857b7739dea8c15a194008057f91480468e9ea33cb5e1bf3fb41fa9c92ebde5e018bce676fc4aa9e6c87fdea14a64d4b5c0b2f692ef09f8e7a0b834871a000b285785834adf2355aa46e375f7148fd7206317ed08bfa7003c3a7db45302e1c33ff32ca336cbb72f95406bca76717260164142e55d5f4fddab1dd1962693862b4a1ec8733e0a334cc516133699653a0657f034c48ff4af81d472921321b58f4bfbc6e47a59d0af108a8a136f9d50ff2b8b92954a2c72e8826d50dafd310cb2cec769ccdff18441c87966585e36d425608c235a60e9552c6ee4feaa98ed2e6759b69f2521a147c55d046989b8a31c57aabdc19e4c5a99d1d115a35a1e666047c4a22880a96d0779c168f68192c587fb028789c418a7aabf9ea305e52f02fd041fe9ef6c6de0303a8b981fd4dfc75eee0e7f8ba5f2664afcc1bdcf8bdf3e5eb2bbb0e66f3a468a25f1145f61982dd4b189f511c303ed96510cd5ae11d415867844cac062e99c85c27e58a97626d854c52d51c57409566fdaa804e30d73a97cc78647933adf5e7c4d4ae64cbed20ad9d7247c3890243f28bf034e6557c2a642963855d3278ebb660359fbf0b5796b84c2ef34856a6f675cbb6de86071b01a22c2e3f1bbfdf0057936d4668d48ca31d34a8afe9a5614fffee7fd3ff10e10803fe0de191fdd90e7c6160a64519b39cd396cafbf8e0796bdc3223e7bbe5559a86b34a7344e96ef96783d62973d987f0690b9157842090767785350a406ac54c489b90bbaf2e41cc25c405574c5415b99b1d49976fe8a30c74a71f6d6ce1e38be3a929f44687958be4a6392ea97e09c2bb5105ff73f0a3557671324233473db6c64d1470ac58a53d783ebdcebf628ff069233365d263cbbb7a29f3ea0eca2535efd8fbadf306a6f2899cea09f1a2cb178d1b9463dbe1a9693cc7708f9b3b3e5899bd2795faccacd99d9996c3bea24704566b2ccc514f2c96037ca2f5e88f731e894d6b640a337aa5503c328bf8ca3130a9f7432573cf6fca1663f16802aeb643c7d79c5ca7482ced74f3fe336cfb7904d7708f9e1a63a513d4986078316d852720f2b744c5571d7d81c14864ca7b331aafc933eda8d5e61bdf6aa705f9f202be29c5091a27d65dc5147050d955c8d5bbe56b00b0a67eb0551f8cc22cafc84516bbd80b03c361b6aa3ac200d39b4d5e4ed1b50703cf0bd06a2342cc300c308b8c8919189719b6d435ea2f5ac278d6a322d5c3b33ba75e53a217eb4ea04282130ceb62a8670d75a0a6860a83dc759c17e1ac024bba76f361082c7f8fdb69cc5adc6741700574202c8adcd3912cc3f6f05a6a298903e5997971e12ce8f837484349c383d68c88ef12578c0aba8da0d32cd9f803a1a60e7fd2e0af9844ca6064a36952513307066ba60af844a9c37401925ba73a9f8099aa91e24e1e4e3178de96142e1e331ab50153122ca6afa95ea84887073195dc6bab22a18042ae93324b599e1857b9d90436f78caadbe139f4cce9716d8ad1599480e6007d23faf4f111697f7d8b6bfbea8b9009798349a9ccc3bca231da4a1b5230c607dc982fbf5468f84a7a3dbd978ea8da31d7db04392d8dc393378cafa6ec0a91f7052f132473c41dd21b61d289777e9f9022d118e688ddf968a2fd29037acb5b9ea5b12ead4f2cb097ce1106c6f58e5ebf3742fea8de283f0bbd5346c8409566edcee3e3b10026e10d3695d85d281fd61ea422729282b63d21b392f83ad2cdcde69cd889479a73c8c99ba75bdf69bdc93aa3771baf4426c3784933dd89b4425a928bc0de0acdabdfa3ddb08bd04483b019a5de68586fdfa7502fb2f295bfbef2c892b88e4787239b1669afc4872836b3bf8ca4930405f3f6466b82277c81ffefbf8cc8ee161460ecd2e47c6cb75fa90c8354ac61fa9b41d185276a654912329a2689b552b2df093bb9f1d9a765ada9cfbf87495f550be3d11a06adbf3f6ee21b2f106a0f141e3521e65bcd904015c346dd0602308af43629d618a8d4bea08f288e5aa6a670319866479668f46ef99a8331a20786c5437940094a31aeea2734724c7fc0d965c8a14af17916724fe38e0d5c5ab5b42023cda747c208a5882078d726613551a001fb6f3734d38d2e3f38cd737bc0dc6b16ab82d4f85eca488598b025617ce2f4ec47c5851c60925fd70828921a7a6f18f6d0fb0eefb3bc9f918a93730399c3fa7ba70df055f65576dcfb8821e942fd0089dab890df4081779cfc1d64c995d26c9aad45c2b49a204ee812a74b5c62635a1eaa5c61ea873cd1aadc7418d7172b811d9fb709afd8ec61f6150215146fab0d578653de2adeded48ff5028f33e86ee676b1f3675e535844dd0c930fdbc1c75c797bb61bd0323d47ef87c3758dcad8a8123949cf76ddcb02f752d88e51b54b77cb017f0f115be11ad943bac4f606384a208f16e66907945c628ccbdd7e8223c080266b2c5db1fbd0db5d5b1554554670c05bac3e738a872aa6f8ae9eea9bbf2ca852bf50876e4bdd8247fe282c8b061cb44287208ab2e94c3f43c41e62a2ba447500bc3e7efc54369c254842a8112b11d31709df2e6e1e42753888b3fd2764e7d1402cc91327b75058c07ed8461c93dafddfc4bcf8c56d5b5f4e89ae0d90dde032e396801fce6f5c760185d8e1aacd9bec535159c4bf44aedb603d15e6b291983f36a3d3d362ee6863247e9a9df483111e3ef02c72fb722a19073f91c1d77442f526732d89033e831c47514f6c1207f724870a44a98784992817667868832b8fdd46f6721f9a755cca46c433054fc257ec0bf7d9465842f905a4e2bacafcd251de7cc054a67bb35eb839bbc5d36f3eb645f673872510865cfc1c7d9d70ebc77f50b384cdda115d2d511fa04df2135d7b8962584e36e33810a0681058d4474f00a2de04a2f2504308730a6e5b2c919a22d7f1c203b5da2eaa50d53d66096a74098a3141d59837d51a832698df358226a0d6b9fc1357a3fa64d905c05fd003c2ee6d7a615c442befb623e769e6178eb2c416440b0649d3fe66914cfe73c47c1774d93060984a834caa34066523825a2d256a40dd3dab8380d6ae88812bd85f30423b0bfc850cdce80a2eac397b68222606a07f01d5d9ad7f34ae72a0a165673955c4039faf002b2513bd5824ac65967c971169e377767d575dd7bf7472742c86c87a2c590ae529eb7d2cc2e8590ae3317dd0a4a45ff97803dbc99c3f3ef638082c56da22a506a4aa98790dd7bccb891da41b1f0cef7bd8e84cf464a90638f0b5a7d5a70c6022332af9868d4b8495ec009d667e5ec7544c5809b9cee77f45bf3cfdd08d189c187a6a0cbc194cbd8142d3fda1db6f1ac43868a84d1fb2ce6fa1a50b0433490123643da22e944741e1c13728bfd7dc83198b0116f783fe2d075e234020d0653cfc13be26f068cb88a037076e4c001867a441aaa1792d905671910111e8283e08188530b17470ccda60514ac718abcc70c1d5d9febd40cf0abdf5d85c7b5768f9f4b8d52038697d8b04548d17d48dd4c7d2a14ccbc31bbf8f8ef9ac9b931972acc3f16a4ad36f1c2b8ae83f3a04973dd300eb5daa11e1480fa7327628ea91b2decc63ce947f8cc56cc4345286fe6ae6c3f2900cce4457f9caf01efce8b2638667e2475b77d1941bcc2e81f2740db04220100315ca3abe777e1fb835b0e7408f69f32bc0e8e4ff54ab18a4ffd2dfe538ef079e0b5a98007433770253fa86ca5e0c66fccc85fa0e020365789c2436139f0886e60020c04cad4dd1680530d0830d36b7d7500b6dfa097b9e9961a3acf1b431c357042259866d9eb93c6b069c7625eee838c3d4ccd5288bee9b83064e301ec06a809b4377d852a6fd2bd7b5860c5c9eb9e698efc491b00ebb6ec8809a25a8ca5b826fd22ff3ae09aa9bf8a3036b411aa40dfb364041abc09116201801449081582f0b97186545439dde6203173d5ddc8523cddcc59591345b678737631dc2197de3e44356f2b5856582ed97e140a4686de5e598c55b4326faf0398a2007f7b40f99620701eddb079cba878a13368071864220ac9574d292d27e00964ff548e163ba21b065dd67b9a0e30b9de91ea1c083e9970af4ef991fb7c3177834fb50601fb9a407cb1746e9fc3d18c32b4e0284d219af789e02891ccfb87936bc9b07b097ba480060ccab0d5f0018db578698f67f51086c37e7e7bd39deb1c3326f23d51077b717bbc948639fc1ba19803b15bb446d41e32ffbfd34c9cebdfdd9adf49dbbdf6185928cb104e009abe36050f465b10f05a12d5431474976007092542cc8817732d1823543800235895a8e2aee055c85e0aa70b8415330d38af5e94e2b41d68bd52061fb2e33e3a36647e0bf94f360a060c318960194648b6bc638be138ab00e922e9491eb9532383f54ee5b0ef80f66944803be7532c944ad83c3859783562973a0a6255faf24622d0e4b6f4d113026884121141ade26ac4add899400688014a1d040f432bd1f85882b8519434312e3fd645feb766fa14bff213b598f61bc710e4ad2dd5d02993e14428f3fca589197d852d9b2f8a93b2d90e35c56e7fb2fa609bfbd9d8ce42913ab11532623deb5cb14c990a867df8f63e1034de221188bcc3428f2c655351ebe02e6d0e4b32e21c3bb7a6e75979d05bcac27f7b6e00c568a8c70f25b76168d49b68d3c41ac9604be42bac5952f24f1baf09d80fdcde65f76e0f236f2ee48061094c061e4c1345b9b5e655482752ff2baf2da397628ca24cc72ff00ec36cd6b1f4c54faf153fa84f76e3834f0af85177f232cc2720548c10b4c7d20de3c390e7602cfacdff7a405f6f3c3d494250417249894cb4ee1f02ff69222e01ceeadb6165c0d3ab22c2e6faec3225c06cbbc8900039d3498504f0ab98b942518bd44504be4a681412bfcaaea86516e8d27eb0cbc99ab10193900f03abeb27ee68744e55a5ce68d3749ebd3b408e78d55b20a5e780015064bf663bf850a8824c513d654c47d4e7bae63b67d45e1e2da24758715b37002e1d44fafb206ccb6231958004a01514fbea5af171844fdee72f2c955ace12e7461736724625a72c3dad9bb47e85b1c10f84cc1219e885a38f2a9b2464e9a0774de4cf0fb4a980e4c7b8528e8597312596e38ac481716a81ba8e9c9648e7facf8ed92f84eb6061800f1aae2300a804aa23d1f12beedb0286d3dd64361c948a4df06334412714093b016b509bae5f0a04fe2e8cfc427418cbaf215b3c3609ba37dab56433ccd5b62ff4be85ca415a163c0c740cb551dcb6c405c326d9441e2fddaa0aa09f0b5d4aabd977a7bc1d4eecde6836454853206164b73e06b9475019d6911f96d549b97b018880b315ec3ca0c2c43a790331730a484597e5b12b255c50afd22018408d9b842380f1c29a7bde83442ba8121842fab3bce3578908256d90a55ab63a0a0747051309c3cf5d93be770e1d0f0f9246abe12f827d35290529826fd4f33a28c420587d096e981328a000ea25bfbfc13949a5aaddd9b35500864e3d1dee4272df9866b77701aba973e0d203dc068fb533eb92214de55b2003565b29bbd86ad4c73b64aee343178e91e824b0b56f15e63d1b79ea2c409aafb2622b564c45dc459a1943bc932bcefda4eb69ed6d342fa8c1a0c5dd297a421c247d385639ac335b610fe28c5c8f14608503c594b20e9f99edddf8c4dcadc3f760a1442017bd1c2c4c4b686af31c35aa7d67c225273597bacd9558528260934fd3714924bb3e00fe7c1813ff40095b8222fdea8bfcf300e0e74dfdf3829a734b797334ab84a10704f9cf8ae0d1daf194fe21322775352c8904697ee2de9b2a6a4f4c87fd44cfffcf2a52e838392dafd9f8a37cb5e7789f9467c367ab42e3fbab47abfbd80c73ac4f65819404f71c68c88d67a688701dd4f97116678f425a2f42b8105af654c987b35339ac5b65c6101c972d497ccb7951163106107c09007a065f15fa1868f4a2d891c48d23945652445a905de0879a4e5587d935ca027d9910d73f770f34e6731d39e205467c930b0213bcb22b3b55ca9251cc7e8a07cba1354e4b781159d31be2861944b81616ce6849e76002f4e5d6b46f0f07d03e772bd0349d0919f1aa40152f60e796ef8916e0e1b1992b4c01d57e324983bb339d3020870f45300558b7a96faef140cd1ffd0b3a6639c618376aa59c869256790fea77ccc4a2030cdd641e59b00768123d88d0d3183be5b06b9bb3e5dbdb31d3fba17c16d58eb79f86dc74e247d7f3d01115df6b0c5194427473cf59a146bad4f7884afa89e4f6d4d46f906841cca3868a06de9c7f1b3ef0f8d8b090d0ca6ddc239dd700cddace5c9107e3245fa1eb678ca279205b348e66e7d817486bb3adb35e3abe6f9371dd35d14c20a022fcd111e2b4f4bf14c0d04be4a442334861b9e258985159f07e8a48a36bbc529700c61843c17c2d5f18e160511debe7762a49fb0bd58c5d136f1f7c2a50e07ce2196f42eaca2dd19b01ba9437a4ace0a883916e0a591368a463ae97ced6cf7eecf3853277a3114ed369be85129fdc8676acd08cee288f8787705f95355d827993efe76ad5fa4762c9807567a33948be274a69683e2a387ae79486cf0c24a61c70d3e370f4e5b4da9cf9198d98bf05833635ae55ae181979645403771630b50318a919f460c06d1d848eb08e22967a6d4c7fe8b3c5840b29102d0cfb4c98c09a984ef481796c16563a84c098bfca61e6fd30cf14d87470f0f21357c083e5d272a0ae248850c0f70f549afb5c521ccb8758924bb4cb827be3707ac9e87f0d558f42ec56be403bf1dfeafff92ece188f30424ef272b56d29526b79633a3bb3d122c690c1cb5801e791eb63f35240223b6ced2a0ad00b8479362104a8de5df95aa1a190fcadf565a6e425a2cb79768413732ba90204862ab3eb4bfeccc50542f85426a6ffdb2a6c9f31987731285dd7c8d02b4f8adbb50973e7e987d784bd8058df4be0e7edf9e6f514991529d3420ba3958f75c232547fdaae294ce875442ebfbacfa6f58a3c3d9eb2121389353868485f0a41aaa0a8332ec4a4e7f0386c345a1654b6c2c78dafd469c06eda3fca327e84fe1fed6048b7798598944972ac91f50ccb3932eb43597d6cab632b2026533bbc00ac3fe4cd8f14f4f137782526c75eee02ab63b882e2457761d98ed4c859dd8bd4d40f7d6e0f4eaa2fadb21334b81b0113caa353564884a2c1cc9a2a0ac803b51bc5ee3fb9cbc050d2c8f848c715eb7ba0d7b750f1268f62af2635d637a23d13ee20848332cbd6193a264db4a2c5f9222b592f44a4dd1a378c8e3d8cae26ae0ee000073c66ace3540aac04ad66be821ff8b924d5929abb2ee8687aa614b7f88e9dc1468b775bad224204ab1e4cb2256805d426a10d8cde09df3e42ab7c483b0693f232a448288d12d05c85aeb558ad6974f01e13aa4b864dadb81aa3263dd91fc3c2041c2594f56511b9f7fab868b1f1cf8da68fb09c309d36de8f707cde6faa10b7282a5a8356e5b93d5f49315ce7c0f98b671d2e9f73052eb0ff666f43a7cc2ee16404ea034abc1b9a6dc9de3ae4a97c9fb266cb9453550851fa004c3682ae2ae0a69d6f5d9fb36cfa8edd006d3d035fa9394e3a4d9651174b8f27936b7f3e9c2e9bf1128e1661524ad8a64246b2b7bac3e88dddb9a3af1ff782584234059f1b0c3903859880af8d7ca6737e485f88940116a87fcaeb5c9ed295d9985981a43b4733475a45dc3e2c67cbc4018632e505604268a070609a586cf318e2849095e96914fc331207efab821f8ad107237ac42b129082198dbb9051080e1872d4254c0e3f84875d214e5c755804dd8cac824502d106ad972723d11f92f65168433aea0d628e7e00cbba7358d6470c6f87576c75e417cfe8b712f90bd88780000c8d2ea1554b91a1a56d0ad1f4a1d9fc41d03faf0a2cd6ac73e913b272b4e0bdb733191abd83e35a14966eca2b85715a891d0fe51757d3601c3b12d4d59e59ffe27d26109c195102a1d130c565f87d314e847f0517136d9b3b2146d3ac86e18b5c4286f48457b097baf4b205ef80ceedfa25199f8e62700437482d6e414d8b880f222482014a7bb8891b5a94a33ba2eb11436a642ebcbd501ef7da7e1f323d660509dfafb11ae4f7c1dcd0726464562c4c52db7569d4fbad9448a89e5e2b47a6588beda4e93b92da705900e77e3216269f086b66515f2c6ff48017fa9454aec2630356ad3a7c255541ba462613794f59933f442c83dd348eda12133b4610376a8e90796415918428d49c73f3aff463ff4060f99109a28772ed94ecbb620811fd1ed226c9b1a1563943d1647db4e22bca7f38cc27ec3923b7aabef4a2e9635469cde0cf7d64d038e5d32eefb821ea47402ff615fb0ebdc163b0901cd2035330016d7ad87df3c20d67f2c367c9ad383fe4a823e04efb48fb3c1ad5a84cac988f4aff73933399b1c9a5055ee97fd4288fd0522e966c64ca71c8f52e779a6bf0e42552b035293fb0f096ab2ba23f37edd0372f96e41e83957b2940badb3704d4b493494c9b2ef3b58415561088ecd00f1786226f02a60d45f3ba009407c594aed7ed89f9a1c24c39b788d634dfb76bbbec9efa800b82cf44f4ebcfec958f129cef31cbd54df14cf59123f949af32857ead1977fb9a1edadb400da62cf6736214386d94a8e9cbebdfba3c1e125f79f1c4762e652556a21d1e69b32bd792a73b5827b4fef03025830b91d49d8b29d23e9a794c7e3013dd2f5e52a891bd1856bf922f425ab40e6eb500bf0d1ef7c8db23ce5d2192247a78a7188e308840622050b3d35a11ad80b80976f8fa580e3370f64d86f1c36e12f1eff538bb4825889009d199fedb293972d71522916aaa7fa5c7d421ce589b486069f83cde84d2f33430a53fa696ed316b534b8bd4452dd0dbb023a52542f0aa1a724c26b7e53764e3233f0d8677fd1528bfbfa245efb3abbd046c15152d7d66f999e90b4724312a87a15ec287199de21498e463ea0acbf07a82a6177f63fca7ed8d599cf1869818989c1525ef274095c0b4fa4ac72ee3d0dd9105c22c49dd6a99433c50e12396cc2cb72e463b7ecd0a3804e1cd32e262861269ca6a1d301f0993d4714b079ea79ebe4d43e011d3a99b6e928722e3ca9a1ad243be5acba6b0121493858c6ad2e83d24ef99557431d033d3e5b2fe77bf2cf5353a92006466abb19dd07726e506d62a2344d841b0832ce35b34053deb7120a67dab8e9e7a25baff759bd004598d629c146266145b9d2835e2b0de42eb06649281085501428e21f0e455822743b35e9ae37540b982c4a80a79b5e7d4b70c9772236594fcbe89941e4dfca69cfb331cc1946b03e6599e5a6f0f5c2a600b6491aa4f2ccf07e41a65e6d7cb08b1c262ef03f69060cc184ac8c0c65d8d015e55a84bd84685507e4175620a664b3b6a94f03cb3c04368efd11444a58877f834c8900f0e9892bfa88a9867c04be908f0a4558abf3f868b42aa5f6e44ee6322beea4cfe296e40a399b9557c9ba0660020a301bc9981e74dd4e72935b63d951255a0d5027099cfe54b03e1350ac651f020ad79f2cca5e582c8a75c5a2dcaf2390452f4925c76efb2e1a48014451e4757ee274a5d0c5f8cf083322a39fc414c7aaa6fb2c658f7b768e70cf0e3437901bd24e1f37fa172784af5ab6009f8765fb1a82a4b491466ca51f98db3b6fed7ba4181a41c6907af391ed27037fc74f0feff74a17ac1a7059afaada68caf3662c733a4ffcd772a69777b276f283e43a369d365af2485d2885d89cddb6f20abf48d7a8bc48628da334ce7c0296f2f2c947b6a9e02ca707e532c2f4f4cf9168e7448e4d45541f176c7c7acc06f518955a2191851bf7106291a8da543367701dc267fd56d91ae156112bd856a1806d15f82992152b9a911578666405c2b2382bbece638b108a6642fc269341f028de29a326cc5c4f8988ffba9bdd66bc233797bae3eea8613b92d0388e0e5ef28dce15dfe880df8deb940295b8ce4f12d88c4a7fa8fba3f3049f038dee81bc45f241352a41b341281952eed8053ae2e009d4c6e1db1a7d7f3a61b37400ad0ba0d874040c7836217b53217a540d88be355dceb96a12596e6a2c718146c5ebf393c66d93c838a48c1ddd95bb96c5cac169b9f9a9112f0750340a1178ab0ec6e6e554ecd48128eb381507111ae9961fc920d401839e47f2f974c067e791ec111f6ffcd8f0c69943daf66984399ad20eb9470eac2db4e9eb8e90e854a74415260f99a772eadf40b47e40205d2884ed7e6903c894d7ee9543fa474e44ffc899707664ffde0ee965173682ed96d17a2e1cefdec2490d5288e9a8a352f35338491cffdc4a1216af20a7082b78479f1592ad125f9b31ca89abf3fc107c9ed6208c65623447cc92ded8cdffeefdbafe500ec364583f3afda2e965870bc138e4c9e130e9752c1e873dcb04b7fd1fa47560053aabec1ca04fd22297be11908d44bf384860f70b52cf510ca6de6166579c2795ceb61f6d8274808a3280467a162ebf27153a2730b8969657d424f9639bcd60c83ced85df15e15fe06738c5ab3a1e71b1aaba00cf0a4ade9ba0e383d44699269b1c5be6e4ffd0823a90173a91edf565f004d91c6436064009003910fe0f7184e3471bdf920edef580f6f0450b7ab5b6bed8cb8433b69176dd7fdd7341f3b0a3c852f4b8fd3f6d0fc8eed5ca9350962cc6a052cc55423c4a274924d822a30e62121dedd543a44d71b884642928b3486749480bb00a383551f0793c065c47155f3a93fe4d5c3e30d7e228495e3837bf977980e7d010c283e9b1a50b1eda23077c032ad689d91bcf9b4b249e3dd05af2743b89db3287d8dac582150a08e4e73a7545d9c4dbd08a9ba21e03c212bd4a380992c555e2c34185d8482f47936de26a90a459ee8a2befae2699ad1bf5236b9314d7f0d598740bc20a90753ba5a4cd8f1427b21a28777fe8c60e1c806d5e2c0034873a54eed5718e28005327d25dba434b07f8239f68c78d5b63d24e94aeeeab1d425b9a905e52879012409e5eb32c2d39425b8ecc91ac7482e87e8afbcc5ac1f022b66340dc0ea94c5e99596331493f220c35b2cd9a0c85bb7b297148429044d643dd180c880eb1b42019928dd0cf4ca10ebd71ca1e503e69e8a1f79cc914122b0309d8101739a1cdd224e6a9f2c00da85427638ebdacc265434c61210012c55381953664dc9d0614ab44229a35edb6954e8a3197ce86945fd044df366191b6d4e8c72d9763779f9e717a0eccd104e746c4c76d573fe93f3fc16146e5f85385158127fa7dd9862b5e149a1a2f2c3ac54ca3c9f73ea7264dd2add936260dcd507b2dcce6178b33011b880f560d28b4457f32929ab75952b613ca2ece5c9cbaa40d41e10b01ac440a5f5a5dda2081a60d725035cccde7641f885a6f7772211567287dd416b5418e2605ad16f8872a4479b3db6dc5ae02b82b3fc93337b615b07e5906f97cc8f981f4959165ee16a75d9c5e1c7c249c1ebcf614c4eff7900528f2ce4ba3303c270d7c1e18a89a2743f1303dc05bf1c4938fddb1ae1d9a5130775c54b12274e459e94c75758bfe831800f32ee5ebd05c172a5bc3605a74991f9b38e7c2b21b19ce6756581cc2b041144cd371ac15290c8ea80d65ca1c42119d70670df410817171b1e85f484df9d5a3d46c737258c458039fd06b58b8f1db0e46b25a6415138d4fcac525211cecf69b3244d5a5afde336c56e3661e02fd5b28c99897aa3f9efe1f4226561e2db798368c90140086a73e021ea2f6ddca0eeb69fa5f5e5fc1843e17962426f68ef0762f0f281f211bc75aec079527853a4408049ab57a7a0767aaae3dab2a78ae3ca7e1911e79886bdfa23baa4babfd5cc4c150231fe8f6b02a59082743cce0e8d47f355f83675a6ccc90c065a948d1cc72b294f62f9a44efa91fdc7f0c57092ea69a67e8139a415fa69d8be84ec9b9100a0dd930d117475bf2542bc396c7d31f94a3cd1f0ef20a3b60e64e3d5255a9fa7cd5b1ed8d46cca673e753e9fde9745ef176299148cd52e487c397954d141da8a130919b9a5ac0e4979433c32ab9f9900da31e2c8248a8eca4f80accd6afedc78c86f6cd60149f60604ec915c7ff501de3827982c22d8c881aa9266ceca702b9d42147cb01778a0133a07d802cc52f7dbc4d1769c909038a5091988be9e25f45a22000107736ec0c820f8ff0e8368ec0d1478b90bee9e0c1aa1c15586ad67a9b8a91298a9c15474d2dabacfe78acb5dc9c81ef4db0cccb086a3cf61c230937e281cfde03577f96c95ab2cabced5a8bb4bc0113a72bbbcd0c0d73bdf1ceb62c36c7585899c7968cd2647676dbfc8f0002a142e5c6cd1a4c8a62176d8ac8a942909b9d385c49ad52eb8a521a7e97e2ac7e0927172a6999818d41e8ed297b705d0e449a7bc48e5e215813209b76d1bc2425327af2df238e1bd84ae393b38b5502f44893ba479bddb39fe135d9c14ca9fde4cd3f70030d7dd87e2dfa38583a19d837752dcc6aa1d5b382c936529d5078c15ac41f49a2fa88cfa3d7ecb3826ca1230dd99492326ecd03b04440c89c0548343951b550b384c03da6fa7a419129f31c80834b7e7d87220792524abf40ac835929484bddeee6b7c1c4c57dea9249ddb36b67680151abcfeff1fe320a7b16231ae0ab2096cb630c5070a453ad43885ff6357196b8251f320f52a6cab8a08062806ed19be8c9424c515cb3bcfb6b54a3c99e7d6d2dc7317271cb182a5c9bb9fec6a411447b7ed4ff4c9476f74dc9a06ee42f28eedbfc6bcfe384e4d9c51a84f2d8105827cf887af537a7108b7f0fab458bc3f779ccc2edd9110fc56e7c9b9eabd859362365659a5060fe65b2642a734ccc27eddc244a70cd003b11616b9d07fdebdd638294563931f3a530af79b312543ae0037ad3050746c17743dc817301eb0202c6210817a33fb03173a77b9c683105d18cd532612112ba208bdcc949f01dbb384597f0e4cf8b0804dfb7deb076da5a2f0ac2e00f76930b3ac3cb8fc90e59b766ae537e61c70c11768b92b7c0d6c921432e1150ea3c040c02def37604b6f7d9dea296dab2838f2fba1394157a91f3c517dd00c09e362c702875210700d6b5ff46c7eeb1058eded4f70155632128572652f272ae243bfa346fae64d04bc944255c896a2baa7eca163826fab81e3ae3a2b3eb8a27275bc68a88a97528bb34eb61c3d98feddb905df481d88097a8ed93503f4df26a883ce6eb9d25f61e744307a643fe4fd732439fc0703e1460d6d4aa7c44b12b21b9b7adff7cbf5ce3a2280eac229d8b16aafdac49f87a1e1cf99af2968ba981c1149deaefc79109e8b82962c86637154e170e714bbbbb2917d923d76a361a80b110d083aa0a083e0c8fb9f404fa2e9087eec7cb15d0b4f28989926e605b5c263ea093e48e4b4f1ca77f79bd7790bd90aa75c5a597787c78569279a88038dff76187d7a4cc60c0c4523529df9e1ad88684982c4dfca400e1fdaf80e33051530780ca15e4955122e2442b9713accca09f879900282be5785fce2d44f2775187fce897868a634af3a4aaf5df5b7f3eeccde5dd490f6c28718801afb9a596bd0dde051fb234fd4347b50584b35784b124a8eaf638c23853160489b58203576382b97ccf724dd94ac37dc9a5ad3b99545ac458b2817ecb273c5ac9340dda5da5055df229d5d5287344b52fa2657630ccce80d153504a14621c2bd9ffdb9010f64928c43a17a81c9494544982106a43c5d5c3b272954e1b448902e452791013221ca26e98fd9e544e0044762a8d5ac298d3eeb56501389cd87c57b00209482fb5e81d25ccab1196c4ead80df7c41df4e81d873ebc537574aeca9158f3359aa99e9d4e43fe44c6887a747f021db855d7085d022025de868f1e54637d2f2b49c1a6807ccedcdcdb9f3a9c2416bff1b2b77bc89cd240558d0aff5282c7d9112d28de128187f09a88596e19e1c64dbbecd40a39d1f96e5e4df8a000861d1f7284bb8c71315a1f4f163d19738442e243e9ad8d227c2ad72591d52e01a49dd7d397b1e46a2084a60f8565545d4d8e2a7a24eaf46acce57d32ae04aca803faa03e865820d0424a0702ffb4290bae70309447bd18138e261486c9b174b8460a83360ecabf257be077b6b8530e27933d4506fbe668b52295b04831b8b5aa07ea00bae534492ebe91b1e57b155d7006df3649c8de726fb9a59429c91463089a08f807f486c8f6ff94d03d4e9b05e594ef4f823eba47bcc8c1e9037c4df1dfbf598e4bc3395d0a8fae5c5de87d2b345d983d3cbad1fb60b74293675919f6db320c8353dcfeee228547f7487c875f91c0a39b75396cb0f068b57a48e111c31785b2688d146e810c1801018f6a45a9bbfff3709c6f76f5ac223c3c628821e6d7482e9aa8e0be5f872712c528d188938f6d6f57bfe2e1bcafc8e5fe5b71ffd31042c84c3c1cd776b5922cd6fd56457878c8b0dfb6bd561b9c509ac6d8eed990e8e450addc869fa63a3a70f5afb3795f06eef6df6f3b2ed4d9b60eebaedfdaea3f033a3aaa355a6c1bb533b0dfbf536a254e1befa90d8e3666b59252bb53bdeca7f2f9ab1c9b7777e67dfffd6def8b4f7fe55542cf3efb94c8acfb5e65869d8fadb93c573ecf6d0c43c273e9c38a75dd7d30086a796a6a52725a5af3c4d4df8fdbab365305bf3362df4f029e2bbd23f09922bdea2bb21848df4ee354bf42fe37726b6541f8d58f1df62b96cdf233a244be19f6e329a6e8784675c8dc376958f80ebbbb9b1f2cfca650e2503fff6e0c440e05e8d98da819ac4eb318c20d4678ebec09794a54f4e630009d43a15ba166b071ca322a9088e3c4719c74f4cfde14d115748f281a2cfcd82c8e528a5a53f2f9a5bb9cde4977397b323333bbcb195daeaeefb8defdb835953a63f9214c3579aac93ddb22cbfee9def0e7cd023d262d68c1e67e6899bd86605bdc118cc01ed84637ca05e99b7d53890da162dab1ce8bdc283ad11023dd5d6eda80976dfc957ff044c8f27a3811fb0dec03821ef7d0f070fb1d0dcbdb80e70da3f4b04ebb956e2922ac6f9da5335808e49d37a4d904502d940c164e6de3afd289e634c001cad5b916e2d024cb947a87a917ab5d76153d5523acbcec2a2a63452333e56ca9ccbbd02972b2db0e6b58a9a829d3416395b3a57cb33cee2a02a345233146648cca4451c4fd78362b452fb8dfa686b571d955a4c3ad43365e7615e170bf6d53b1745476db36558e9ccbae16c8d0992c3c452c31b8d1090b317ad46177031b1a836c5b01c2f227712292a47f09fbd82d64041d91c41a2955b00fa741c61047f0700412972e5afd2cf7a12c26da043d22cc03c564e17f3c451458c585f0a95d0d45cae63a13d75d3678b9fedb14ad1b9e5c8fe2fa8f4b6973fe0b506afd70d85a184a202b473998a2832086d4a06995608beba90c3584cef86207d797ae3b8f5ff77834c515c06d18dc6e088f4811e208a32a3b1425d1f235967cb8e2f9cc1859aa38a9e2843444cb861af6d3d161570d45b7bb23126dbe06a195ad444b975d34b4b909b8ec22820221b75116b27ffbbf9fd55f380b2cbb6850736b6f599a7081afbd0d27fbd7dffaaffcdf19b2907e591ffecc1e3ef635ebe8a5dd46773443e812c5cce3d2ce5e6c76fd3d2613e3414fc6ac8494c464320b7a02c6832669d4b8665072c910460d3451b0edb9bb3b46ff52bb299564db618451ca5afdbb938dc6a30c55769108b67ec5e291d128167524f2a2d79f75dc62ef8fa8ae2843975d385cb95f8f0b9fc95c76e1d0e5baa218dd6f8b2d17519b0b2fa764f9722bc7c87edb15e2421f12812c5ce71becdfad8a1f5e6aa80841c92284275b5c3105cd176d9ab4206b46ff492fe43e4be6adc06a518f0b65a017b650a2014b16362469d182af629f0c80c1a284142f2d3071430b7e0ef6e1a73432e8020dd2152c6068c1d7611f26629c41030928c860518527aed1c20b4f2b68b2419115486176280324650a24bcacf1828a2120d04cc9f12272174f6c89a1ca1a65acb1e2870d2cb0504693295abcd0c48574e44242ea77cf7171600ff8a897ab09191c170b686ce09261cb85386a5cf82a88d3ddecd32f80e1e50b0e9e98d282afb10f37f11ae34b125ad288a28b56100b4db7bb1b4d3775533be55059e7ebd7857c6b6f904b791fd04d713d2891a8afd5b93bb9d4acdeb696629e9f37eebbe3e73a1906f6e8df36a9c475f6b9eb26608f7efb3fcdfcdc59eee452dbffe9eeec6f25a4bc21cde27e5232d88f9d5240d23dfcf0060e5c6b91667128348bfb9f8610fe929c87df44f0dbc8c6ab1e051baffa7e95ea3df098e0bc4af54c72de868dcefa8ed3a6c57eec544428c7c38138fa815a2cdfe1fe074feb7d876313468c87e2c24ed8da8e7282e69c93a8836413e174f068430a924194daf915e674411c44edaa89b8c55c0acd82d5836d9e9c782ec4e10046731b4711a195ef702f647d877b8a03051b140474b3e078ec94024ece635f847750fd9099f561655e381e99db1eff92bb69dc6748cdfa7115b0bbb59675d13a7eca5f3fd3027b68df1eb6d42c8d3e771aa5dd5d86d4aca6dd65481f900ad8a551d36817bb8fd5c02e42f876bf6e62c0388ee3388e1373331714a1cbbaec8aa1ccad5c02cbae18c05cffac724f9be5471deebc920525be2873bd6f5ef9298877fbda0d5d155277fbda546e751f6e8d536e953cdc3a371caec609f16efdca3256afb576adb0d63a6badb56220a03ea02bb73ebba0e470b50ee866df28d411f91ff6dcd7c9ff653f519c90ec3d2382f23ea0cb791f7ff61917849990c2a83ef39542aafc78247bff23f2b9fbb2ecfb231781ecdd84ccfbf8b51fefcf3e3f01507b31c60a272fb9e7781282cd132c74818246abff87fb700da0a45165073b3871c17d720c11c512951b28b1254deb880bce18eae18b166b34b5fab9bb4d8fa7b174bb88cf88e2e4c50b15670c41860e30d00453510db65cf1f2323119bd616072c17045f7eb7e3a17ea002716a3cf4683d54b59a854d1bbd9a38cddad32e2764b9410a44fbcea55af6268b42d8141434449b01831772fa26518a5de4795248f9679c31d2c7eca2c602485244528cf8f9f218fb991cba832167ef34d9b9b3616fe84445892254170c83d62ee1e311faa9c10046043426666c95e8c53c21873f0e00edba3ccb44cab1b676f707254366eac3e00e183102233351951bb5a4283ec10245a3971d312666262b2c08f9212f556bfa2d4dade03dd6964025deeff71ef2244022345c4066c5f767121726189a159e0c824f23c136e03b426c09f7d40378bf623b6348f674383c948b182c58aa7258a28434a0f6a08f1d0c20f5638d1fa15b00f08780788bc108c0b5f04117e8e918ddef7173e64923d370f4128dd2321c3462dc9c962411002ee8936f872a5890b1f478d55535ff3ba7bfa4717e3bb53aa75ef3bf1698742b3e853cca2792bb05a5cdab340b3e0673cd09de7e369ee895da20118c830420718ba500383167c48c43e405dd670410c4e51aa2052d30ae25edccf8961d8cf67ee047f2e4177cb9aeb6387d3edbbb18b092b412d1b4e3e4828214707bb3d7318d83ee705fba8ae9ab1460908db31efd4e955aebccdee537126dc2a04fbe66bd8b4f7fb0fc945a26adb3d5b0efa77f820a1bf04e945e5f11db6d8b4296cbeecee220d8b73d9b565091defb28b86251a20dc120447f1821e6a588206355881458f7e050505b1600362e9f2030c31fc8003991fbc5040961faac882c6f5f7e1c44d6961bafe10706971bafe285889a1c7c6f54fe128091068aebf92ee31c00d0207a1211dae3f84e2ec0a228ceb0f8bdce50229ae2d52aea3a0960b6313b60dcee5ff6892f651c0131ba87ce18405165bb4fc97b40f673183d394264d40e1c498964717ae3fd462e6fac32dfeb00bf4874a7009c2137098f2859a304b7049233ef941a8ed0762c081175ad0505186152df7b1e2480c443a310ffaf48964741f7e8b73331fa8957aee519cf3fd391ef6e43b1fbb1be23bf3eba4d4b19f14a34d389df51dfa379daa89e502e9a52f9b28cb6ad9b7ba73b261028b57506b6ede0e3882dff9eca9e008f04e9e5427d758cdfb56a88eebd86fbe88efd0b7fd5c3fbda14cb8a0601f45b9f698bc279b9e5bd449929611dfa1cfadf670cc24cda24b7c8752fab2c989be5c435f3e5131585e2d6ee14081fb7ecec39ea86cf21dfad18a8d47f46352a41f25fd1ce9d2974f3388fe1ca28f39d1c7d6d0a14b832ec5b850ea1da1b25152e09566f511f380ab49bb22cf04a8556937bb1f1cfdd903b598e0680f870426fdcc63c2e3bdeff8641efedce2967cf9fdb1b3ccc3bfb9c5138b85dfed4bd4be8185975d58b65cf8587cb8fc2d44bbf07b5469ec17e1a3d0d85415f68bfeec11bb9f76dd43b2e3b6960fc98e8b295587fe40d77138e0a3c3175ef5aa57bd989a965448494a5a727a4a0bf1131b1c22a3a3aea175e817727ac8a6501cff3363ccaf039b92a3f46835b4bd1acc8353d183689ac5750c34bcd89c32fa70c9ddb3b0ac94f40389e7686524598c7b9009835362527271f9b16986dd61197f1d91c5f3434a299d5ade210596949494a3c5171926a5fbb5911bf9916bf1270ff221e8051ca3999adaa99394922493bf7cc995562b6b8da011a735127211c6e5ff914f9269c564b4fa712dcf136bb562a23999163936b4e97ece0497ba3fc9e43e933659a7db2fb0cf4c4aaae14eaad41f8dfae991d572bb5bd2203b749b8928f52d574856cbd16a652dd3ed2a83185fafd78b939292601b4929e5646262624a4a4a4a92da7477ed3d62dc093a2eeae1d2376f8f73e36d6fbd5445b97fe52ab7d5d9663e7993cd16ac9b4fb3cd6433d9242525311313135307313837c90549e9400c7cf1d2d2ebf57a25252519191919c927f9249f98989898302ce8a6052003d61be4b6f7aee270f7edb0db4d90ecbda3d42967b99fdee257b6cf59ef6b66b61d5feefc61a7c20a17857aae53015ed4fff48c8dca82f33fed38affaac3d3fe784b19151a8992d9afb7597dbfc3d04b9898c2e2ff1434e02de92368a2cecbfe97a4b2335ab5b0bca0c0bfb515d43e9205307cb34ab09a2814ecdeacfe9e01adf790a6a96378e477da7536328f6aa443411d683cbae2b66dc8fe7892b60ac68642b191520cc26a2290915115a5c57a4745d8cd4d03144509a1b43208d517561b2a2c4cd104ebdc374356653c366b1d1afae39d81b975d4f88cad87ad9f5a485fb6d9b4a4765b7d51825a1caccddd75d9e73f28c1e3d9fd373d2f0c3208679237443d8c3eb8d4627d8d6da39a96c71e1471a5bb04455a0dccc879720c24a1739f8d06588272ab0c60e9c309931250a30b1054b54650b6e8c9db08a185b9092fc495fda2d185de871727fd259bbacf8e035155083b0abe070316c4c0f2ed797a32c9cb0b4e6538b83ca18d1f20ca84ca1405780a0a20820bccc113068590d52282cb4cd23268bd2ca0d34c82a697880f12374e7a1832c75db56c0681ae3087ee5c6efedc9d2111935c41e01de182f9ba08dadbbfb1066d484b1c20508258c00fa428324285c784115173445a12af6660af85793819f13d22654b9791feba3776294ae565c99995f7a1409ebf233e3f0e7fb95b136a3e2820733888a21cd3c6156ac62094df385790959204926b8a6f68c51ef30f5b269c1468b36475baa192333d4eabcdd28a576f59c51e5c16e975d422cc0c0e6b8ec72c28566c6e65c7639199335b5ae276084a8fed2658c537ab161153565dd27e39d9b1b4bf0307ec3768610d5c6c2ef1eef5e729f3284baf0a98d3fa0e06c9228d783a6a0a0a0a139a7305deca5f8e162622ed60319177be2623e80b95814173b7ae162bfa37bb88b3d8d5a2ee5b9f14e0e6b4d8a802ba744914b377ec71bd77f0cda03836ec4a08c225a0aa360eed0cc0f39c03086539b25d21891041550347183972bd4884e628c9a9457b786fdb6eed1ae11530d7478c10e3a2cbd0ed75f670735d7a970f190c40f19ae3f09fe2548a97245b8fe940b82e50c946f2b6e1b6531c0ebf66356258326437c91c31a2a3bb480ba24bdd024065b307db141132c6ab8107572d812a4bd0ae41e51d4b8fd0e21874103931331b0a186354a2da02f4d723085ca0b4a52b858a0e274fd4b20d3620c70fbe11016638625ba38e30b319ad8410c2273dd05908608307ac042c50d572c14f65bad5c51b45c1d940d2af3537ecb4ff92dff8a9f1750051b1a927c7e7c90b1d8634ffb7dfc94505ff3beffcb7de5de78467f4c4af8f18d5cc7de1ff38eeb1ded7b43797c8f0f3dedb5d734eea34aa4d67d7f311cd8ecb19e8fa7b8ed99474231288102a2e1ca1736147911e3420d7a88230ac72c4d2f52605da6cf98b9a1482cdd9bdb4fcb7c39836daa1c4848b9f5b20b8924eea733c3d4976c0925f4ba7b24bbbb8ca8206c7c671fc93bfd1c67c3bfff0be1fac33701ccfea7334aad5dbd9c187dcc9b37328f18d4aeda9a2e415996650f7429cd2875212a8e0a30815f202981170338741cb598e8386ad5cf1e5ed661610c30a27c69c3430e2eac29e185170c8ecef0820b3088a461ca42092d4532f0a1d548ac91c351145e5c4a08b59a4d60d94584104f9788a6cb2e228eee675d4420dd1bee1122c41ac8e2db7f8347e0260602471022041bd883ef67e3040ca2a1de03dd0d2eb9f05d42acb9b5370cfa631dd0859d12bfd3835bc01e4ce6f260ed4544228f46484917cc8531c6086384114e2faafbf4ef76dabe8aefba218410c64821d28530420821845136ec26d88f7d71d814b12b9816ec08ab825dc1ae44a268148b22519468c43529c138270e4d967652d34e61c22c85914a512e614b10b02dd84c0bb69421e5c030c2ff6017ef53e23c04bfc8707cc51717dd14d98b9ca89bdc06d87951b3baf3a266c1c85db38e10fe6c9e308ec8e6d5b7da77d3c7ff94f4bdf94caef8c6fbe02552afa45fe30f1fcd7212de47cafb28e739dfdebe568371413a0dec411fcd9cfdd3e8d2ce0659cc6ba76649ca367eee759ae9fd74f4c90565800e90306a5588c397249d4661b1ab15f3e89fd8631e931ba1324ead293b1c28cc972f3d26358cd64461b1b15911b254e2210a534b76358c96770bc1c3c340da29d5ef949340d6ff506cf947d7e238fc9bacd88fe7484b3f4cea87dd4d3c1ee4b4460ec9a0a7a6147c073efc2e96086a79c792087646541985f72c84ff79b1a1a7824cc4ff6237bc4f038daa1c5b6b8891efc7b51c2a85b3fa71e3317b7747faaa006c3109416b7be62aa0d3dafea79f63f70f2b611bc356d6728ba58e6d33e35029cc52c7b69971a8148410c218e79cb08715b6802f4018563863524a297ce1ca5f21074f4f4f4f1853529c5472fd743e6a0f3177585328cefb58b71a9d7699d99c738d2623f8228a173938e165477276258d69586e961173cef946f865d2e43360805e07788b1e6e7c9f46731a4da369e4c3933fd12725806470e3bb64eaee4a0e748e6a014011b5875d96c1cc61577ffec6357c6ec3a86d224f69d90dc57ac255aaf3a466f9df74bee44ccd6a563b1a0fe348dec5c128f9cbc978196f6a963bf98ebf91642f8586fda2501cea1e2844938d1accdc510f6c805274b9590c21844160cf19197b0270db8e9eddde0d3b24cc74db3df5d5bb239e4a7947fcf9ceee2ed3e29e655ef6b3e3ff8050ddf71febf2fc98deb66465777723991bfd90a80860638cf1c78ddf8d356cf89fcdf9ce0fbb0f06991ec60fb320600f769eb383d009e79ccfcda2455c7e99c69c73cec99509e374d9c504d2f5b9ec6242e94ac9527a1403d6c584d1fde2fd582cf719bab015df1edd68999999d3889106281b48e6202ca5940d3733f13929a5940da59452cea0ca573e0b9140774efe13f8957f64fa438e8876fda5f447735d3eb3473e81dff9476463ff4d15a0470246d350bbfdb73d9e72ce391d624d2a3fb777c773e1fc3ab1f918ff00ee91896129d84701680526a8a7d64b79424f78b4523f94d342f15c2de716114a3d8afb8f2bc77195db3a6ebbe1b6dffe4bb1d3b679b10a3de1d1da7e28a7c5bdd0936ea17e6801aded53ddd0025a282616d8fe539bc78485fac15a5adafe6326d68fedbb281f7e395af7719b0f094f3bbbbb43941a953f3abb5321f431ef635d33723edbb0c1c223f355f7084fa08982c6654e8f048ce6aa30bd2cda7fec7d2bdc1bb4b4ffe9cf3aed6757811e5628b18356e6d3c5c58676cd0b6229885ad967ff31b9d3fb5875b34e7521c71eca052b1f9b125edadf58dc6f3e33539e73dea005f36855c438a58cd1891b7f3e4ff7c8ccbc514881cc3955d6eee86e4ec8111530d89d7635ef483fdf9f9e1388fe8fd3f78e3fc7aa573ee7ec0e84140f56a759f1bf59f189b0f07e22dc28c28d9fcdacbbb3eea74ffde1f3f307a90ce774c782b07b0be139e79c52627362734a19372afc317247d9b365d8f81fbcde336f20c41738b0c1b23f0e512e7f8c4f9088529b1036026166f64048f1b0e37ef369f74c292384afeade3d9a178d9a953d7cc905d1bcd8ac8c1b00f3f0ff6914b27a85fd06f0f9b8fe0360207c636bd9c78cc628b28b4e66700699db5d9ec1194877298b945b53b19d680ead4cf6cbb9fd390c84ef26a177f3b1a8447a9391bd4726eea77dec1d316843a9b5abd53f8b95c1a1eb9fc4194dfb60ed789d2fc7ddfe537ddbdd3ef6f67189300ca47f03410aedc3bdff681ffafe7193757ea13ce361e69def1d55b91ae3e7e366afd56ddbbcd5d5e2d5bc2ffbf8d318d51e8b5149eb99830a02c65b92fd36126efc213c1eabf7e95c8e5a576d198cccad8f89c982c0962217a4dad56f3aacf6e132a439a76f1b26e66e18b6d14c75a99705017b482d979ba0882d761f4a1fd5315c81b1dfea4a29ebcb2aeb1049c295b2b55ad5fadbb793fbc4df88bae99d0bb2cd1d52a2e47c897a2953325551db8c461886711cc771b4fbe0f715e8c628dd8f637306492352f4295d29d96fb564046bf221ed7d24ac56d6663d59d38ef6d1e06b9ee51db8fa7cb046dd3fc6986559f6b403ea3491ddb9a317354c5dc23d25ad279aa5ac8337abda43cdfb5ae96acf5f2f65d5fbfa75b5ff6eaee7f1d55ef3564dd86f15ff334269d3102761a97eadab157737d5974ace05a95ab7a373b44efb50bbf9b8d1cba45cca5ed607ba5a9775dfa751a04b3b25f2623f2ea537ad54be5f3ba5b0eeee91d2e0767752f418dd3dbac7e8ee3146f7d80fd09c386084db1eb552999ff25bfe153fff50fb02da2ba6dba7ba0c83ee5ce23bd3046ed30161eb18da2897baf16c0e4e776444f442d4acdbbe6e1df7db0da7b2aa8a59214b6b16afd65a83d40efb74eefc25d304f1d647824cb04cfb783fbf69601fa8656a3f533f1faae91e1c3f1f4efb33c7cf876d7a8881dcfcfc7e814700c0cfef18b827849faf9425c9871c16d0fd07c95824fbc10a0296c2f99fb639ffd3b4e39bc385b6f1ddb66cdbfa56d4c6a536ce6f4dd520a80d4b6d1aea06e70a1c2e68c72acf818d0debec997a6303e1eb6ac33abe9aad3836af13e202c2074acc4a5a58490b2b790eb8332f312ebfaeb8b5cf400f9e612e071b83e309b1675e4bb7e7731dbc8da67bb69fdf4eeda3e3e7572b64553aba7a2367b34e362057b36d553dfb85ab00efeaeb6abbe9bade740008a1956cfcea3f7b6d04c0b3c13c5ce09fae1f80d1375bdd362f8bf75d37f4adeebf137af2adce1bfa96e741b874f364857112802defebb6d9ae7e8e0cd54286835e762dc1048adb525d7d1c5513aa39b031a80d84aefe071d7c55ae86b0d5ce72f192e2e6747c79bbd1c19b7135e3aa676160e9e3747c71702ac07ba3c7601ef33dd86ad76c9a35d7a0922c7cbd0dce84be33c9d2ffb64b55cdf23aa959d8aae3aee3d677dcbad1f1f5a0f33e7ab9ad76504cc717ebfa7e9027fb7552f7359a3bbf9b66278149dddcd8b2aebe8e4e884bf64fbea5e3e190cfa7d4cef73af8ea1dec56564176141493665ee654803bb8ec454e079f803de6e374504cce76d35934965d476cb9ec7a295d792be484f4b5deab77e643a7d59adb2e70ed3a48a677e67fc78d800f96b973e9c9520a07c5b5d04e59f373b44d284a1d1d7c3502e6ab38b8d4504cb3e6df3899988acbbc9b26967e2b39c13ce6671c5c621ef36d17738651ad560c64c53ce043cbc5b24b8a2bf7731aee3481d3b81a1657fbfad4760f0c42e7d72e47b366f6d9ab60addea782ab7918d599de11ffa003f05459e773a5dbcf3918e87403070c8b6a9ad522d866ea9e0f2ec12507739b68cbedefeb605edd526e7f11d190509ba7283121fb91701b4557cc2656316dd838a959d3ac32107b789b3be1c6c5bc4f0590c9e9724d5fecab8981c020ff9e324a589b2f43975d5e966e8fcb2e2f4c37499015b2fc91709ba5f34b9ad5499434ab95246916ca8bfdb8cdc76b92748f1218f4c37d78c8ea61907b12968aa572b740217c5d5108b9a2284a83d3a589218e70d005c90b52a4810a7c2d288514524821851490b4cffc5593657a15b13f787828e599dd92de694f89075c2c5cadac7d390f0f0f8f91d5cadae82dc77c44b26d3007a4c2cead59aadbf3c5d434a4ff5b6134c678dbdb22c5bccfdeca823745f68baad7e66b19e6314e7f24aa2bbd249b6fbef9e6bdef40da04b42a6b639583cddca9420c0abae12a910faf7327dcb8d2fb5410dfe5f4c0399aa11de94625d1dbf0558ee841e4c86a5cf935466963a7b25307f5a9e04a8f8ad91c61fbc3183d46e603a03e15747b01adefb4336442bece378f0f2963f75302a6e460409082fc2ae4570af58e7fad75832d6e4ddac15b3b265cb05f416bd5db95237273e7631c8673e7a41ad5ea9050b33ca87bacbd72c6a87dc591573e9366b9097d95744b922c3f04e3dd924e097b0047e8a01bd8aa5efffac1263bfb02cb3f8700a281c0c925cd52d24d0ec86a9749b3fc9734cbadd88fd95c7f66d23df0f2b8f295748f9516c71008f012179afc40d3cac8b40fd47c706695e307093fb8c061060e3240b0dd1339fe8cf3b34c0df5103813e83423760e8ec87cec37dfea86fa3630b9e620e79cec501f10963be58d0b416cbb0746efe826db89b8cb35bab923d0fe30baa79aa2ea9ea892d605d604b2c33c6982f7438e48fc39e76c189b2302e5432e02b45fca1aaabd12e9abb0f9cc72fe76647e04a684b04b659d1a85923842fbeaf302dcaa5e0bb4e7d64fd7f9c39c1dbcb5b3efec21678208377b0e95009617c01f08abbd094ce2afa0b5b4579d2027a07df4be2237ab28adfb8a5cfad2aa2817a9df748a0bf283dd9cfb2bfdb0e6cc87117241a0ec56abab7538faabf30c4c10e1ce8fd3e384f05c8ac94865a8f6071bb1d8f8904e6859b0c5ce2f82c50e911c47ecb3d71ec3b0dfb820189532c3718221f1b17f009f00053a2ee61da15f1f89c69d80ddfa182784d310a1831808701a227480e2d2af1a91ec3122daa59ee6a9fa62dcf0a3cc11c93cfb14bbac238ba809c0d1bf03e61b470f00add101f3aad0c722eac618a715fad843ee0140d70bf0311347345d257ee777172b4067c494d102184b472560dfdc03b80e94807511777a47e69f607a28d071843369a06e97a253398eb27bb8af3548ad4fff311c0ea84fbf7a368b3d522d167b8432f7554f7bef9870bf82d6f2577df5b913e4457d7313d0a1e5cf9c053e30b23f582cb6c2df8ed40d9b9c03b48bf2bcafc8ddea671811ead9c73c958d45fc5665b92863fb43e8f2044ae462f2378edd4afac7ce1e59c8394013c27331cc611852fec671843f5ff2636fa9d818dd392298674fc8e45b2a56c297b4fb2b14d230b2a33e0adc291f5a2aaaf7261b33bc6c150b1f632eae099ee368bb870be2b47138c093ce11911fdf52b1d89f9015a1df373e15e17ed8c7192c1422c20c4c602e2ee6b91735be85d2b31ba9d3978f31f3c85ea3af6194e5c757358bff4aa4b09b04dfbaf4d3a0d6ece610965d460cdd4f87f504c8efeb0580900904726f33fdef4dc0683261bc3fe98e3378b1a2bf6871fb630c68a84118471c65f13a2ac28c154e5d544943859a3883eb0b984b2fbbbe7469a2c93c1ca3a6c230851933bc08c2891169b4808ed00853540495971352b45806285cc5972486942073c40bc468c09728ced0a10c2894b0214239330576a60658371603a248a8f4ad364539e914d108000000056315000020100c874322914820cf5455b60714000d7a9e446c4c9649844996e3308c6210320611438001061832423343c302d36fd0014907841320fa0dbd9e30b3d42eab1d8f9252acf535d14eada3ab0d49d61f1d4cafabffbd1ffe9c8a1fbfe5c79f53e9fd0dc087c1dafe4672f5f9967473df20d3dd338a620b05e96505e41ed97e468efe58c617634bbd6cf59c74364577d1b4f0d367d42c780dd94801ddcc534eaf47cd7dc02460da9f4de39a01f3a60b33b6c49b4504c09eac4bafe249392752b59cd5a505077f4059d4283af05d68aa6435432825a5585ba59b8694c11e3644b4c92d28dfb21263d687a6c2a2c6b4e9989e555f8521fa6217f0f387504f9a6b36a4b4e07b9c8c109eccb6d914037d78b318b4493d59dc2d48d99b2cf03448a23a0beca49274527b8ad9f05f56b0470916f2631ecd662132585132f185a9e1524a666305125d13c5dcc4b47eb1294cc081c96471f2a3a4ae1bb08338a33ebab31167490351679e437f19445ea003e4af0a5fb8201d2a599b3204fa23cc05dd3d513f7118c843116c030f775b0bd12284275c5a1a0a17c0d0e831bad1e238c3f2e9f896afcea14661cd24f1639b88ca71506c53a0ac2970de1f8601bda2e846cbb432eb78cff038ca1d2e5ec9bcf3da3da532bc1ecd9d1116488bdf5cbe1a1bd256eed0496bd1f37408d1d81fec1f9220c7833f05dad89db00e574a27145b219d4ab1b15524949908b337da0ef6809fea3cad6c718f26e64480f27f1ae46859a8f5f703fb1a9e7f9b054ae1bf4e52e927ed473d01ac203e326068250a6937258f94779ccef51651707743574cd4d4a02e4fd194e812140ec2e1a523ce6b9f4af3dcf5542ab794638eb3fda8d18c9a6b26df6ef3d0204f2bb240c2c721234b60388749524c2515e44e32daa529058f410705cd484725ae70285d3e51564a7175ad25a77a1095850b86718e65b0e3987cf1d712b076aaacf15527d311ac43421a8a98f9cea8af0842475bfae1364af9645b73dc44e338108ace5df3444246f391af2c6731bb1ef6bcc1948fb037e43a84357fd8bf47004f2210c30be5e9c88350ef98541921849111535f744c3ae84f17406aa645430e6e2a341364dae1df5c29f889867e401cda50b500ad8444b21cdacb531b69398fc4cfc2e815c18484cc8e679cc02e01be061efb2f787b0b192ca185847e0e52523019d4d136a8a9bf017d568a9418b23798da2d762b63a41b208bf5ab421aeffbcffa5f3cbaa2a6a95072554ad03f5aa59bde190a067a50d47344af64b47bd4d063871734a8ff1fa1d5ddf4b8f06c54df62ad82c196d5549068aaaa5016156ac13ea29d8e6fb7a965640d4f3b49d10b0c450b4a67a4154e2f6b3a6a85a2e414450d7ed9a0b84361018563f6387341fc6c5a1964738224e6b79d97c7609d3e231aba7b240ce0b66d608489fde360394454e295d762517cd0b742e4b25c58b0e2ac90e2e5986db4bb2384206d383b90a5c2db6f49efb72434c1f1739553aa19c18ee680ddbaa9468d3ecf82574b60df247f2bfd1b9f340574d24d59a475be2c6faf5e22a3f113509cd491d4076ed16a2a3462d359c3a34634d0dc8f197f5527e6edd3d83938fd7b86afe97f313d0385316cf4e3d9234da123be9ce42b6aa7683982de5f49a0c00bf0431dbe8e33b8ac5659b21828cb571aa456f63ceba0184a8157e29ece9c033e037951f743208a76439070cb5a7f10e89d072ba29864b621b5529ea2296e1cf1c96f90fb29263c7b430914767a068190a4aaadc6510f604e10a36c311861053500c91237b48652d2a8f7a33e4fe14a07cc719c1ed7bcfea0ae9990d38b15dc04b20d73254739f2b5d5006458c51173ee0012b83a9bbb37d5341205ac514c6384d6f0e3701d0b922894e8753b29f1f572135355d96f11585fbdfcf131b9276a747e499ba0930ee727de488feb87d1027733dbda40e27699102eff080332127beda3542278974cdb8ed872a987e672ae350c88c4d5512f420c9fe2aac72e5c453b5c55aa7bcd878587a9812d2d7970f418d6f2ab292d45548522c634ff340168c6571d5203b2c90b9066f01c53b46349d3aae28cc1360047f65d61e977a413446241553393f5d6b23e294356b89f1fa72466cbb0dd683d295ce2a2ad325a2c4a606bb8936c18346e7b4218e5387e9e5126c7fb3dfa27228ab46bb2fcead298e81145b3a52e66884d8d3bce01da6d734ee9f58e8ac598bf0fe7f8c199276a966edc3a06fdc0f2da8505aab5225d40cee5cf24ab31629b41e93bda8a87e0a48a6d6bcfc78e111b189cdfbdea969c6358e20721a2dd03948a4c51418acfa245f412342fc3b1979cc0241f2207d64621850f541aa27f9666dc5da82b3cd1c99435e0c738252e23e11444dd1c60f9e848e329d74db269710b4ccf8afc863de4796ac40dc1daa4fe0a79f661da094381e7ffd595e8ba083c4ad15fddaea41db81f924df7e66fd0d771a57ad49d473141034fd6d07429157c1a09ab7f06f6d6a644505af59f520868b23c3da08861eab269af3a039d5045bcfe83bdf91fac4c93f826b4845213256143d3076fdfe013c6db39e071bd22bf3351edb857e4bf30fc103eaf45dfe041161b5509e70e07800d524a7abd0ae5e89f59e5274762bbb4b3c2cc6be618fce08375a395e6955d75a542e15a377391d10e0edde7af80407b58d49a0c2bae3a14675c1916c93e15146873bc284ae033ed733826d1a5270898e530d243046a3cdb99bbebd1b2e935ef04ba2114d57d01dccc764517986c82cc0ed0f7c6393ecb6aeb03eda8a23ec4baeb2ec8825f647bcbfb5f5203be45cff91880c67523d421f5e7dcd2245d382eb6ca955639db9f79dfacc1e20ce4626b0023a0b6301e6fe72c845a9cf3f3915e449dd7f535fc435e7f1220736bfa41ab0da2655f28eb553c1c97321823cb5227a9c90e208b7c40c2f321da047687784645764a436a93c888875074b8e0ec870d772573ad91a53e820baf2aa650198df74cee4df6f1154c06065112149aec57c8af0442d895d10ee9797a8c09024986c4cd2d6dde720faccd930dab07cde86aae3b63753f708840b83b7672a64a9cd9bc97910b3f455ffc263a399df20ad77f475bcffc69b3c6b10b325db545329646ac316e99116181435263a39dd409d301235f3546df4e73ef916eb16c0a9b1f0b9b28d1605d0a35716019abe7cb441c472322c6d205fdfde56b18e882f8597fba2126f6b1d117e9ccfd7db85d4e24fe06f8ba1ef04d87b1b966f3491e9f3dfef7ae364928e1d1fd3d4b44408c54e36f0e3b79f8a85567e96200d1024f81868de26f3d9e40cdc30421577118275d06da77d9601ad6d963fd4b251c6cb3867d4a875de25e63350fae9ea25d19554b1d8356bd64d182f001b957beea815c7297bd23fe67d321add0482af0b427f318297c989528fa88e45741fba609a6517c25c2cbda75b7b5ea690d63765e6d48ce7131e97347aa57116445c7b3148766a647fc7eeb856680068f4bdd45f6eb6e3f29272cb132997f44eb46c9469c98f04ce75dd1e93615a35363a41d010216b4b47afcc806fce3e2ab15a0598b1e7acf7bc4d097cc24d760213e2dacd01b20741b5e8a8e71235f59b324ed14b79cc50d9c930227403e31d90a0fd25dd192ed48578da478d22166c1fdb19a62b3aa0d5a85e0849617db46a75ffb658bc4ddeb24c1f272950a34b954fa08544b6667fc862fdd159448652fc5e95f6971d5824f1c8d6f16e3e60802da209b500680365a5212e13c10f3e1f727acc7bad541b60a1738e031dffb04f3234b1c2784a6286ba0429c369d9697461ed4505e2016ac8dbb03a31c70598300f708624021024ee123d5022e89050f4271728ab6dbaa16b9be94dfe3f6a91882a88e2d727e9139d30f88c46ecf6441abab07774989e810cd59b920b511b3fb92f5439fd64d4e7a96af68f42c41193e688aa291d69e46419039c564e7f5153bbecdee27fb04e11c9992072cf3112a9e3b312363337ef1a34291fbf3ae6f1a3e2d83062deabe5098dab65762dca133c5c2ee80bec04a658cdc283bbc172c7910d76297998a48e692196e791302fb7e5b95b4ba4ae61a21dd01a5fd2ad28ca97546d2cd6100dc1d1a18e9ce89073d3ee98e2f049a61d5ba1941712d601cf0b418de668a07b0492b265d315ded11411240d7057654f9977025f631e409b97271506174b883e5a7f6d29c08a83754b904d1ba861c86cca44f2d6d0a43928895dee2165dc221c604e8a5d5b4b00bd13b43e9f0e35eb2862890a0bcab352a4879268918eaf9c5c2413a0cb7787f66b42c26ed642fa1ee7331eda7163313f8e0ff72e99e1a595f400749b8bf514705aa829c4d13c14e04022ac5cf8c33351ca201e8a3571fbadd41d29cc2b6be87e17e26ee7f3ec6dcaa5cc1bb3ed12954fd3fc7853888218345ddb239ae60815bc60a97312c2790acd7dc25a11c35ee944b87dcf27e26577b346a579e583493838d5ccf6e9acd8312a99adcf2b8ee03238f03a69a366456fc6a28402aa768cec389ed063d9505358c23a82009897a205053e09ab0c29abb85f42d66d59f832c5770ac132ed5a5af2acc3ffb2cef39b91dee9b5e4feb883292b40b3675a2976161e5f0fca479052c223701e0820e29b9a2155c66cd26e1256c9171e8752a7fbb89c34146a750843760b2dc802146cb0be219995fb0b38867c021949498f297f9d0b886bd536f177107d7b7c8498554b3c7f426188d2f12cf04b2fa1a0dd28dfc08ceac472a89c85d410fe872aab3528b44a6efd8e2a71800849204ef06ed195c078f6b79736f45d6eb2c658032727f4dd1ddadf3add52cc95866307fd543663b5d20f57eba423952258e4a691885f3ba7729cfd20d8322386566f768af7e19697c704efbcbe627321be9bed6824f91d87302766a356b27a224ec24875388550a4436ecaa69baec5573f1fd79dea071ca8bcb553d8cf0d3b84a68ca24035b5939f9e8860ddfef93f9b2bae05e8be2e7c6411496825624cb6d8b3048107c18dc09c61bd78e9187ff495459588fab20b8e2af8bfb77fc8b8b0eb29a42ed421d0e7e3e41ee9265f91caf6e7c996485100fd7fdb9fdf6093782ec397ed9c631f94224ba81f0cbd33d56b5e46055a4e07e310d4c5b91e1285d64acdd77aeb17ad375a01e87e9afa04e3786abb7d3923846fb422cdd2090e91e97a10a9c8752d3bd01f257d2de6f7f4dc381ea397afe6cca3f02f8bdafc7fd7ae23ce528cab18dfee8f9ee386eb7a0789369e892c295ac40b37eefb1ed0d0838520340519cd1df50d50b632222f3e0f11e597a8b8e82d06c65223094dcae22ea46ec8afd2090ff618401d6bbed7455a9aacce102682a1c41cba6cd12bc775048605991a946f6cebf8ffb801bd139da30b32126df3d0f299020f5eb519d7b8f6dfde13f036c326dd9f4d0674e3bca034340a4a0b8be6e88bc2338a3bf3d2f76e9be2fc408a5f34251989f5025883fcd2c929a0f4d5a7dee32d075c05bdb58d79e8c95a2cffb0ca529c2b11891dc04f82d6fa9fe7263dc5efc5b5cceba1ecba68d4a7c7282a6a194419ecc450cd378277018a4d0556a3ce7512e4793b52e2cd9f5cfab4b708cd5dd51909ed97792f5e5b6a8e3e000d4570851c7864f340f5c8b9a685044a6cde8e7e861d7b52885392f438c32ba1dbaaa2cfb2a047b1478e55c0e85eaf92104045903d01e6731d4b8f422937fdab6887eeb261e8b930991c1c5b956b759cb44d63764c39546ed7a8b99a82273a147ae4483a63f08d56e852bb8eedf3a36c0a11e7a1049191ce66739840c3ed16f66109188f06fb23b9344977a8c9c4cb6d035c8b455426a5a73620c4b1d0049a8f578a006fa24ce4b6c24dd832f03ed6797310d242fa7e14ae46a8ea95eda89997a8465e833a2ad820ce686b6efe6dd458c24ebd9078d56969a8aeaa87745fa7055a711489838f8863935958fccd13c1b0d8d07b34b25c44115150ef5582a7b48934dfa959a280694a71f1af10f7493361b275d066fdfeddcf886a469fec11aa89cee924d87e43485224a8945682783848ae51fdfe4ff41b2d46a79db4c5607fb7ea54b6c8aaeb41805bc1e66760b5b4d88be96248ff455146841e002e0ad788731f3dd8f8a86a960228b14fa5e61be3ec8070baed84919faf5377f5a4d3ea70655f4710d7cc010782055160b291e52f2cb48e1aa4a50f8f9daaf5c8f6286f42a503839461e9f47d05f4b9e948fe24b0366e5eff9a5788e3fa33892b3dbd509a09c2e8d04556a1bc55d9798ff49e735ad886c009b5813b1f25c30ab08fc45fcbade83dd809e6921e88f448be65161bac93aa9b828dcc5d0b216ca684cd033dca44113885d484ff8fcb942ad4a8b6b7a8e9342bfbda2604f35a12f25cc6bba003c41db424fbb4e184fa91002b2967371603b395c61bb4e5b82147c6537d249e55817361b73ff3493fc3886072b7c8be7716bf746989a949083ed57f406fd20abd1b8a0616f6455cf4f9f5d632c6fa490dec1212a21dd03b1103023255bf3f87c503844d08c0cf1591a0257e7208488cac7f2f57100c2791327fe02d106a4fbe7e04af80dce774654030a5c60e12fa9774479688e52ea357e3f61a9eaede1dff2173f6359768fe2ea81279f44abb1470ed205e58a9262c9c763823e5339e4fc7d3d9aff510b0733c06f64ef6fd1d12d95b87a53842153c8144a138ca2958b4bd924a46b701d70d70dc29df7a51914b0ede7a374a7f1a2e6b4941b526c92127a0b3103e7896ca86a63ad2d0384b76513b528b69f0671ab8bc279272991053e8f0b81dd5b9094ec7901b390f614077030c24efd61733b75bf9c8913931a22494a70c6df5076e60d6ae9b5ca81b85784658798234d69501b02a55d504ca4b1ea19d47cc78c783603f255fd8811cda84598f63ec2a6901c8cbf67771912daf12abf685e8093d3dc9bd017f2d1355e86b78ff5a476aa58da2e6d03a32fe2c6fdc062964f7f8f3ec39b6d79343ccf5c401b48e0054eb705de68543751d864167379cdc02e43b5e48423d46280a46225522ea63f0760e0429ae2f6fefd71088ed922d1c9068dce4b86ced8ccffed504720d7e58798c26ea988741165ede62c2be5b9a6077de3b562c784cf8eada256fef183497ce92b1180428933c75e842c814d721a54f1102b07170913dd667b95efecf38d858cc6d007b03808b3e0ad284b6fd698f4b0e83ca90b497386469bae66bdb0fb1a60b6827f15ebef812dd6329552134017cfd1430df0844a88cf428255336de9a2481f0cc8b1e5c074b8ef9a6461a8b4ac448ac4afc54cd8f0474af04e3f620b490dbd08a3961c974a8f8a29fa9ea854ac85edab771ae051468618ce09759a029c1cb384956d4e31d79737de84e9ddd639b1ffa8d6a673d2e70ea37641d16cf7d1e01bd2416a821ee0ae86479f55aefed315bff05f27354ab59df0bfc514db4ada8159dba88154f04e70e50c82f409be9172042eb91d9a51af8293b4a32868eb4b8b89b343d875e179a19f89fd10569a52291536641158b0cbf14c4f3739ac8abbb89890e7ce07696f16a53d22a2707db80cde6ef8a4889fd886104e1bd587431eaed92adbe8135b3986cb4f2fe9381b74039d426794022ab9e2b3d0739ffaf06f9a18ce98e3c594757212300ce471130c4c1da3cc099dd15de20423f809eb44b45b1eec813f17343414ecfa6a64d5759fd7d7c4c7f75fe23074e718139a7add93eb3116986a692d8adc4a5f47e8b65a8229e5a3413c7ba223c2498541917454dbc9ee0aee704e129e608146d34024848ffec5392bd88cc40cc5a8d106632c278f5d0f357ebef60f74d78b652495bb707dda7f3e773ef2c520ec61822f76244fa72f7e837332a38979728e43a00eee94e5338493f995dd56667114afde5c3ef8fc6cdb0d00590737892528e513959e5328de5bc435bf0eeef0c71f9c545a65d6119b345828d013d4ed224ec3b76119d338154c47cc57d44d6e80352b5de74090a88aaa137f6b3a5ce0aa8d4ac73b504a4d1361044e1be3f4ba7bfd798dcb8ec56f562c508eb024ad2a928a6dbc4785ca22291338d1480a2beeafc8e564c66b9bf5be50a640313f1651584a330377b73c72c73dc6407ac82431ccd6c8b3a953829e3ed3b25f311b674dbfcec6e1be308e495876e3afee2ea8ce6eb042a848a910493656dd31891a7bb566479560f551dab0ea6c9d096f8c7968201e356bee9fa68e14659a63d3fe503db0d7537543df84ae0b68bdeec6446264a26bf02b3e38a994caac2316699455d7d0d880b1d213a6acebc30aa27e8c2eaffd13eb75e3f2b9a5657862bc164501516eb94439694b5853e8e6a4123673405635aff179c178c812022308baabcf983dc1ec0e9426c2599e42026de556b198a0685801484d5a28c02d8d5582b98e1b15dc1e650d2def53fcc668cc4832c4a5f3eb6cc814f7a4f6c23d73f92f7372bd1e4a9b81faea2f8a5bef9fd96a44ca0085a6c9ad9a833326c559f5ca9f3590dbab78784abb561ee870fe17fdd708bd5bf52f9405a99faf51d93161732b81fb62d032849b44b5085531c6d00ca5a80bb56086b851e250dc0ddebbd067d034e904dc17ef794059fe17cd89c5247102ff683e614340f71bd32db19884de7bba403aa02f14ac38af62f5279a561b3aec98acc6730e262bb877f61489aa9cd460010d9cda28418c69b1080c43c5108f0380e3baa6a772706592ab4eb45eee5c8afc2be477f6d44faaf46d49901f06d834d6b6cad2274fb45ac6fd94961ed69fed9302cb5036a349c104c6b9c61a6a03aba3fae5758361ad04c6bab50594990e9d6664ae5e8e436047b3496054fa42369786f55041dfea4202ac0cd8ea522b116121c4bd5b088d1969d13341312fc36b670b692a8f89fbd03db2625470e48e87d81f961188ff7fb2678183ad67fa0fc17c32f34783233dc8d8eeb85946eb2035d8662dcee322b77237f5c729a9234821b48e2417d56fad52291f407e3bd07676af5f031e095efe0cd21945892eb911ed0f7acd7c52f6d70fea169b66d47ab72ef7376d3f09d9928f3e8e56b2b665b4beeef0d7b54b722bdf9e09010df483e0eafef4227fb526e82c7a9188129064c8cf59dc3a04ca70f1d4f74fc774fb2a842ea67c89da82118e408a15aef6729dbacd2f9b3a160e6bb8931b4b9839b55496f0a9b1f01702208ae277aa047dc9b4dc76370590c6626f6340ddebfb8dbc7163a492fb80bf44b6ec7b5560d990ecfa479015447dbeeb97563dce2642088d16da3fa2690569e9b314052a6df9e6bfff10b5d47a3fcb4ffd8785deb771d07d1ee8e5ac1068c5e6143ab1a8dcc9b0cd03ecc294eddb8ab0426b57c588d2ecd7cc16cec0aba5f9c775ef6102c575e1d7213761e3a9ff94d1b3ec310abe862885eb0b911f39c3abde4363883356b11688daab0a25d0d0836108517758d5f1c520a01f3183c8b858c8a56741f3bc583f3f4250c285ebd5cd2d631e199c290c521cd170949a0ad635867acfe4e2519ce6140e628bfd8efa26825390dee3b0dc9caf7907e917effed753ea2b5f576541d4c20f3f4e025f24ad721bd5b6d4726b1af37d2ffae7071a717d37568f3ce5cf0aa8bac07427216cc3a644470d8b75cb397cc0f50b87f669ba0130dd3ff01c16fa05d8f8d3096540684bbc66c282a6bcda61a78878d1fd326fa8c3045eef470fe53786c96879ffe30f6f09f2e0feb3811e1acbd4fce74b65e64b7c505eccee0ae13b9f0da15904dedab1ce07bec10b2bbd9a4fe707970cbab5624d10cd892d39939dafde3c120a13eafe757e74ff72e222a77feaf7bcdb6c9d77cdad7ad426a2ec94586400c0e7c0db73e7a382818c6aac6e00193939ad0b5488e14831ab281ae8e5a0a9d57cfb5a5cef202206c90d712277d69128982dfc9423712a6716f80328b826dc2ae61307c05eeeca60ff25b8dbe047b01ccf4e98456973fef9c8427bd3b2b0e0bc37ec50257ea7db2c57ae893c0d6ac3f4b4f3b12e89856c7b2a1e92ce0a3ca15852c57144d4ab58f9b9a9aa3a2673fdc34dabd40b930d626a8f8b2a160887fa3dc7f55b5507cd425eb6f2b5a5ee3b1539dbc2149bc4e9727aa6dfa68212995379c5a2aaf5f9f16a9a8b0a628d932e2c9e4e1027358d8b79048a8345318467aa0755161094c3c06017c8c7854a019aac544b3ee86629f11547202c71959b81ce87d81120fb8861a8f9306709aca794b05a2a520aa148613d67673e9a5f39b1ab61f15a5b0ac30382e957f0e1aabee2b42f5815829007dff876e3b06391c1642563c22443f2101c6225f5e143277595ad0e1a4475d6435ce5c4e9957c3cff5be4ea34337ad28b51ef0a08e2d48834d499ef86c4fbafefd7839f76f5ff04ccacbddb15bf7f7e650327202a3cc72af5acc4082fac940db0b3feccf7f2b90c874088d70a06a497281db7f90613d8cdac16a6bad099366e55bb56b931e3d7230aa484eb15a3d92a0028e5ec3aa9bac9d9cc2e25741b938098a357a7b9a4dad161e14d6d1b1b53ef009abcdc02f799695dab7a4babdfa0113165b60e0b03c42a150d962fa28b37eb9dbaa19f80f414271bd6f56cbbd129132571653da39ea9c6cb3d01729551f6e43fdc0abe6f7e4838e96908e5f93d477adb3dd5bbf5bf9dee222d703c2ffe415b4550dc16474669a977919bb78cb40cb2c5e4daf8713e98c8877804bf4b12faef1de4b1945de7c7d1e408c39bb52bba6d725a11c1643d9251ba5b015c61e56397fabf137cd604d0cdd707645d2f697ce31cedd069b110a8af71841a682261e47b4533f139d9ab78e38da61986a703510e9fadf90ffa4a17517ff552ca15f154f4340b02307ed2d09d6d40c1be97b32b153728e2108936e02978a25a4f77d4868bf1b09076e71804cce2801cf88aad88111046f87fbdad0d920f649a25bbe628f5092d241d5f31249fcf810dff9eaf6302fffb5d4e58ee8f77990a2fda81c00d186243beed5b8d32b38062e0b9919c707bfdbde3273d2a80535e6814a604d87be884435923440c995933e249efcf74368ecc6994651d3598ba8592b315d25038c63bbee6c15c71420007298afd843db05930ff0853f49b66f42c6e9984508a5efeedd73d1d5d485db9da836677ddd84fc643306338a9f6c8e648a283577b3cc703f65a564fe47cf5c24d93941f73fc3698c35d02f62abd7b5c1aa12532dca5b41da203e56db0512787258ce2262e69906ff3c993c3f007c9acb46afc0389b3f2b184fe30b1706c47f9f07f1f2ab800d42b558c684f603d0301d2d1923c148e70fe922ed7647c5336fb7475a3ac86ed55d634ff2a91c476a23a7a88f1e17f3c646412ae922ed51a02357756102765b9c576fc4c01b0d1648a8eb077794a72aedef30e3f5524efc3dd362bbd7289d75986dc7334466251635d1eb3e107211a7064d190feb5a64c45be8fa9b62f95e9ca0721c558b5293407487a955f356157da9ede2cabaf8ee399138c11b64cbac46e16e6427c237d1bce9161b53907974a26fb62a88064424da6550acea24228dfd734d43c10dcdecc9fc241455b32206b789880a77c99400ba13a154b550f06711e1ac4e45ce43a25782c3a9fec725de5a668349a861783f5ab3d7d3426420ebdd5eff4dcd4bac7d4656be18e1d6b0bde640c1ade8abbe533b02de9610944479ab870ad346beb16542b9f20bd61540541c8397467e753523cba093a43f87c43bfe07054d5b41c0d513f1e7fc98e00c1a056b6763741ee87425a7c5871ee9748deceadc9718775d8ba11f548b4c00e5010f251b5e7aa2670398d43aaa99e96802a1ae742e7d22a4a30385d46d9e5cb3999beada599c62f4ab8e8166ba6c6b3aadb40f9f2b53a2bed07bdb37abc1525d9cd42d21bfc87ecba2cee825adfa85713ee8f9e189acba70255f9f0fb62fff6652035f0afd4d3308972d242ec385f5c297e12f3a6a6d9dadfe37fc03582291ab9d37e7330f2c80b120ec0aa58ac754c8fff4b713162765372a9de6ad28091a124e09c2a2cb38e02864a13673f1f9ed814313c2c2afa701a9d21b378feef12cafe910f70027100d19abbc10ed5b6045558d910697b8862c99e0baca043ec14761e77756e03af26317bd31c18a0113f73bb47e986dc21b6b3a86c914c9ff1288f98571922ccced2f61a810c85578374671b9ef36d9c801febc063d71511a50a4848f60c0089f1a97d8fb4b391bb5c2f3b461c4acfd28c289572f51101d0330faa2c76a9d6479faf9ee3d953bc0ba6c053633deda13efbf63e2c0228a0a7cb3e2e10f94c2aa8d8004c8aa08db89aae18c82ce757564b87c12e8fb2ae66badc61b8d0bc5f54f6eef7f60ab4e4d8ab61d62e93adcfb6678b01da028cb1a651b2cda0e893e9cf19bd1eb3974396058c572a20cc24d202bba5d043f1a36d1c2b09856e270575f081f9505ae2655f309cf57b02c71994156e9b50ab3a64ccb608135b43fcd9d74170072f626d67bb70218c823b580e80c048463676f522f3f07faaf1b130245c8fc027e995282d715e30387360a8a0cba2b3667c00fdd349564cbbb64561ba07570737c7aa56a601b9ae1b20fce8e8842278e1747de09ae029e20a9bb2f9f7cc5d41553cc116e77025010867b4a5498c4ba9aac7540f1d5af2894373ce4a4f6f4cfca6d2d04eae836228389b17850b025a4386a6f450f0d83988d18d2eb9519b0b915a06f3c660375647d12ce9dfe8c3bea662209bae5d90983d405807597801fec030dcef5d9e043f96e38069a5f0773de0c900631a3894f981ab0d78ac73860d5ee29c21c7e094dec9bf35641b8781bc236f0b121472d9f264368826ab3652561f9eb992ef20809c725790cc771e05192234b85f0425331eb2ce0ca98606fe87aadcfe8da5102515a76051a3e22ecad3daa5dcb242c38dd415112a4461c245f6c77130179ad87eb0ec0e17c642c7402f4ccc2e9551290a9e4171b8c15ca19ef2394d9378e317a0c789fe818c00a03bea6cfa80f0034efb5a88269e45e5519d9cfbcf121a0a243a94c05021515eac132ee9491a6558f6c930180e6401639238b69638fcf5ec8b341f95b7da6e7a1f55b8c7ec037d25a118b1a6736bac78627013192b9ed2b246a99680fbb4f09f52e509df3d4431841c7e1a2a8d2ed5b1a6676c178f6a7641408cfad7fa2a49e0e5a23e345e33c3a235a3aa37e1f8bc5ac1c2549d454541aa7a5c8f725837db1eacd30ef8f75f1d62228d6b9975cf9ba19d4b78979ed0cebd176421df08bf33294a272821ebd0bb9b0d6e06bf40f80d013844e6087547f9b4e7b8e9bb328ae1f136762b2ceb02ed428981b1b751f500b43c8e4c46154aefd1a4437aa8f6b706557eff43fb9c66b435c1da9a79cccb0759926d4e43d3d1169510e69216bb0819a155d5f008357f5a92c405a6ec16070254507fa15cbdbc3487e1133ec23dca3ccf612ba603f14c5475417bf563f117b2f2c252622ff222b8ec3f660244922a5429f1d57fce093407ac2280d64a4a6bdfd39f7234d65f3c4ba0906d20cab69329e3b1ccd9ec2ed6afabda08b15183777fa1b2e69aa6254af491739ffd1365bf94e524018ca47820eb17f9bd03a80ccd8870748b9ebc899cf7a94efae65612e70668dd42729befb0fe10c107277fafafb7b8560a26df1c31c84c6491e9f343e6f4e49fd61810905f7b36b1c0d8daa7c06d2ec0c2914d2233dae603e85d1e633ca16a27f753efb96d057c94dae03fd010591708064a22fc0c49e66063b30aaf96cc55565299b47097dcfdde6215787b9b05473b35cebbd3856349b6e49e6264157d78f01a15aec04f46b95740f19d4f5da311c196e801c49bee98bbd9eaac0f193e2fe81d74a04b067c185eac0b14780ba0308577b2b79480c2c512081908ab582716d2da5c4e7b6c63875fc3cbb7e67ecc4ef1d6808bc42fa2f9d8f36a32c3c3e4e611054712dbd4de64632310329ca46d57e96e0841e1eeaac77d7f6d35671069c56ead0dec908b05d4ef308044c3d432f393df117cdad4ad3fea7f647e80f0aa78c578721a61346cf17c227598a0952ca03e097a5182e4daf8534d8c2fc84e7bb0164790a62b3cc33dcf8b45bf5d04f4c55cb7ffdefe004a418a4badf60a89522a45f17c278f1db25955a06ba72c7f93ca8bf16dabf76191c60a9f782a17f4fab3be9c392e69f479702bf34f88fc11da1b6717aa308e0b2c0b158fbcae5b9053e467320233053719f04abb028bda997285b4be89bdfc6a06b6c93c14dab12a893c426364aa4291c523174cdf5a96307c6931869c6bade5172c91e4fe68d992557a7f5c02736cbeb0d5b4775dbc52b37cab9a36521dde327709d27e69043b2f129d98f34038972116ce5088ae4a2321014cdb48e8107ded7cb66aa0f4b580cdf6d2a7a2790a44d871db3fbb7a3a476b03b9665aad4eb2a73febd0ed4e6d9564d06a971f9091b0484e97babc5a4e07f2ff395f72ecbc6185626796e6a6d9a4dd69652059162dae0c413686822852fcbf2f3d9c91ac9c97b46e52f020598957a496e3c2d7d27ac8e53007ab2ccb1eb10f2ff33a81f55361d79fdb901e4b4e26d85492413dde5a32125c78538eb02ebfe443499736d5c1c4492c19638d66463c0e12923748a8f6cbbcd619552d105907a6bc885aa43605ed7a7cc89eaec8d4cb1e0deb33bd9634c6e9da5ac568210ea52759149772963e844ca4b2e656028db0aec4f7e718a8f1f8dee8b9fc03b81d64b60357c6b00653b8777ed34fb1c6e8f2fb5e1053f2110c86758d1d43379c6898d63eb730e52737175b05e08af9a706f484b969a77db84f0c7f0ef7a567e250c5d30dc3fe052da9b9006d2b44739c4c14820c7e5432b6705ee808097408af2102ec7ad641d886f44f19e7e3c7a2603eed655ef76b03802e298b44079d1537856f9a17dbb2e62df3cab6acc1ceabefaa06e5a2bfec8ddc716f82d3d83cd6e96de7ac3f0dd3daff75785033a87b33e04965ca1a0c684491682cc00e40888ec155bf42370748eb9b22a1334461d6c40bced0aef4ac5dd92398a94a96884289c4897bc0de5fbd4390d03df2eeb5efc16ca420509d0e8795bd289a0308c08abaa772dbfe2e711362cbb4aea97afd15a6926603ec157714e8e4b41c604d64e6cd3311ae3519a1f1bce240e9e14c950b7cfb0644d865bdad95c53635332e2587498740b2b56a0478a745d532b7e0dbf75f1608c0d508b39fe9997736ee6eddf842829c3d21c8504143a92f74236f22bbc84b168c9c8fdb005bc02400b77f8a5d7fbf9cd2580876e6085e0d2b96f70dd8c24b8e38e89f60947bd7179223595eec2ce0f92dc3fe426119dabd5ce97e3faee06cef157a7aa9b68b6e4eb83aa8eef62985c34bec24b46f8d3f85a3e8d69dc9d9884b623dc861e205df3a9e396ea6f992065de4775dadb105a81f0bb0d324f94a25012740e514514201d1a616258cbbc0c4bc454d4d57b9c12bdc0370ea2ad701a19106b939ce057fd5cb5a99a03d5edbf646de9959167b31431925738f3042288991d034231ce04347b67516e383c9e1c6cae992e83be32e8766a0f5b8394dce11c95438549d75796c8cd194655a6da7a5fd7c04feb1d948917f6e4e200d202114ec19e1a59c4910d92bc193baaf312ab6065be198ad02507c00cb1226fccc784484097e5b97c6dde0687f8b48e29b82904814119bed32975e49d2655da554ac43d61c14f09cf38a8d7524ff091daab1f376fa32c13127cd5629072edb3599cf8977cbb222e5bd3b84075f206f9fbdd13e728d06dfef5ed20d6f491fdc17f9275d7199ec90213800d01a0c8db243fdacacb73d5b281269ee94a6e2c8fe419a7d2596789019e21903708e0dcd15b7185b22c9453db9dcadd7acfd54029d22e48c4d2032ef6cbd6400787b2481f3b9f8ffe616af591147858f407410da074592688d3a048e04444e9c4e3a3af316336ec83fa7ed0a3ec7eab2cbcb75eecf23cccd6174c2f60db4f5136a2bd8253e47227d2dd01be8185d9ca1a628166babc1caad2cac2e08888ab795cbe3e90cff76d7d256b6ee18930422e26b30034a14c5fa3a037f6e2b189394e866f62c1860f8242b8f884f8ee54a88130424ae5aa07e8d52fb1c54b7d65d0eff77fdef986fe5342f2031ede01b44fd8bd14519baf4e33f0010c976f80e0d3e9208d3cc48cfa27240fb19cb9b655ea1aa9b658ca10ea333b5aa9878cbb6b18e40a181da106ab2fc4d4cb6ad658d1c32287e71d229b2427a276329741b1cd3e77fef43ad712b1b829fd59db79c24b3b02e3fb52a1b1cba85c02160d24edecda4f327931abd58b720a409e7dc9ef58e23b2fb1a449d6ea6b445633d3b25eca49b7d45ef98b16725d2f5d2a34b9b999fd9a9931624f7baebb3b7e245b66b4f863e6fd902f5889f5171825fb2fb26967bfbeb1839050a15d506a00f692f9eda650be0b8c3a0d1281f05017a845410464ab77e64a251c1fecf8ff112a4640751fdc94f30817c19c8f18ee2516b31791b246c3642896fd7b190976a2920a030bc5a88f3e3e671cb3b4ec6229d2398fdac587197312daf01a34ffd399f5bf5e7aabd36fde05feeeb331116bc95143bc6802a42c974fd946b9e6752092b063514b61a9badd90a5654ba35dbbbae6120dcb30692550e704db1502f55fa02a87c52d83deaf94c27a524e5f6f50041edd2cd682422e534b6326d7d2c3ab9996c4bd7d298be7f93e24b30099e6866285c635115d9deed2f5e16289d2990a86eeba4b1568be8980a540a383902e87b9a39b459bd5c48489cdb829bd6ec2d221a9933c7b12c61420b06daf0d2d8e6f8d85a82fadc07513f94697104af1f525e25de90b0bed770d26a39cfc5a99f092d2014d53f7114df7672b43ce418269dac9d5c7ba9c532f4c608c294576abd82834dc8a826bb56b84e44d9c6842766e1982f7e52e0d161d218b0b7160e5ae7faaa13877910712d5f7fcb6adbd3457f7e993a33329aaa62986aa4843d85775c4466f5296e08a6505a11b2db872796b9115a1995661d70d476158178c173180296c39e89f6abbd33462c5dd33834c36d5321ae3abbebe9b68597b98d1159f4eff21b8de7615b2a618e02219147c33b5c7c001cb358307f5c9e0c8ea943cee1f3140c39877cf8877c2534094eb9e90c8bba17df0086bff7a720784b1581ac4bb7649c8a6e737e4d127c62d94bac1db0540a1587742a0531d0b82395a92969afb4ec722da8ae293751d3f3b94034da46fbb42f7db3cc34f6408c535f6d829826045dbd004f6f6a1c93f6894bcd6bd3ef97a5857cc64c3e30847ab6cf40a3172369a0cef3358143fc1fe8c1d3c85c3b8dcb691a9525e90684365f9b8c9c87e92cb81a73f7d7337e3d82fd02848ab0f3a397db896e24b20242354460dc4fc1b72b450067af9622de8e897aa9e0ca40a6a9ba0e3f6336041a69821aad4d270588072d35ae6d3d7d548c87065100698c5bf4a608d1c7caf117959dd0a2d00d0297b433b8005d4f55611dfced4ea2383badf36fa27901c309095a400cd9d9feba30e47c18bd2c7c5670d7c9c09d081a9cc5a8a4247b8eebb2054de17c1cded9cd958d7da039d2ce8f2f58895a859347f24e32809c5e30e7512116a2c4643c48d18e6437434ec5d3289426bedaaa83b3778d5b7526529934bcb18947dcb35d14b7648aca3c7a941b595b832ed7d48eaaa2766802cd0ef3f00ad698352ef64189aa2b1fe335818e293530204190d54902327a687dd0c443ccd481f7897769641c9909bac71e898e160ffad596d6d804e419ce4867e6406aad38ac875bc5d44e269e7d0473d2e3786ac5098f39b14bb507728548c97fa50abe3e6ac579a70baa5c0ae16db6d2f479104389e2fe5838f509468d2420e45ee6aed1044e4786bd3233ceef5c08ba85138c87a7dbf42d2ccab29146de4cdc83087254ffc56b96edc3db4f7b7d5b3b5b42d07b460cf4a17c4558083e6ecb59dc28b95154378bef58393799346a57ba5a94caa0be80bba85ddc215455b3ca163d05adc457f65a33328d33a5a8f039b0677522858a8db9b3dc3b2b66a10d9fa061c5412adc217bde1179607f3d646a6684cc4154f34188ceef29c111d71b38979ed8ef391fd32063561146b06fcfec9e99eb020f251e3d94bc27b41dea9522c7361d9a56a96f787a4295d07f940387c40e10448386a9ef661712b2622ecf3592ac9d2af90f81e27b2973590d946b1888962e297c12c077317a206972b529559d3f1ecc2eb4cefe37641b55758e7a669a27444bc370aa13b434a358122120809d8b3729a0d8edbbcc29b4b7158ed1ba50175286c48d047c16c09d0ba250df953f922c60a0ab751d648418913d4ae3929caa8bada60b94ccae6374481dc4b570788987fed6422f46b18fddaf4f6b92d15f895f69ca89ec9d8b572209d3d2f97d90780d27cbc9d0c088025a10aa7bcb81b91cf0ee9632e8964d56b65099cc9372bcb49daa21ac44994a61adc360b8decd9c0cd928094f0099344255f6b75a1e11f60751ea55f8aaccaed980fadc3c1a82704ee8e755a304e397d4d2582d77607c28424b1909c2ac8eca049067ac84f528714d6759b1cc8d048aa68b73ff40ccb46b87a4c0d8178032e84f4e4db1000bee774aeca04ac4aa6427ac696260b438d1b0059e5280aeaa2a549ae094a66bb8eb38da6a25858467b83e61fc0f03fdea3fdb5dc3874999caa0217b1733fec1d160a6e5a6b2a19d601fc36149b897a00ec8a1cbd891680024beecf9ef61fe5b01e1837342c12778abbe4dc3863b6b83d66a89ada05fc3a285938f69b689cc7b169e6f8bbca6041e7f94e703b440db1187e44425dcd9deefec712a30b604d92147f1a6506727dbb1df06a0d625d2a2f86bf697c31f355dd069e407701fd04a8b920e0df1465d33ba5c0062db144ec3b84af98f6de32b5058e55a7e740523e8b26d7c65ca63a6c371a4287b4158613d1c74074cff8644efa8f146117c957dc07ae55ad00f05a74926db206f010ca66fb8bfed949d8a0ffe10e8c5829dfe93bec2854d78f591559b8dc10bf7f94c0f71dc73b2ae53d35320498e7f2cb90a0b39f3b07405020c43293d90ef05032f4d1e65b8992b2563272b128c4e29d5cf5d81b0d415a24ecb568a15c5a5b0c17cc03c78dd1f55c7ef8e3811fed2ebe6b3e8372c8f2df3268c64d375d685d7f938706db10a7c6e337914ac2e95e8c13d862570f8a8995b2c61f74460b905d92896131ef5ee0dc4a383417ed0915ed02b9719f9db833c3512d153ab47bd447390f5a1f5529bfac54eeccc8897c372890a8aca5999eb63c36d537f08c4108849a1ca6f876f73396d059e8ddbe73bd77b3e4b943c3cb320152f79fa08dd2fe2f5aaf8a0c679b505c447fd1f32335afb0f197f2db9028bbe1321e972e997a986f5f69b02dd20491dc104d5b19c6a588175d4edf0392d2c882703b0454b4df07a181f2d83feb6c95cdaa0260ed0a3e08511ccd0e03fbf9d6a0e804e2ca540bbec8a661ec65bad23ff24c2d01a92b5d666f850e9c91f07a2e5d7dcd0adacb9ad5b6de75a8488209c98162d4e8c0bfd34552cd0f0548673bd128b45b99a08b6651bedc194064ca8cc68a3e41e104305380ecad3fa8e5545e88d416146794fd0d76bf583e90ed6e5b4c47581bdcb1bb9d41e148ecde310be6c0d3af772dd6d705437862ed980cad4bc4b20bb9ac0724848fa1be947cc805fa7cf2d80f35f6a1659b692ed7083b5d91b7b95f9b6b5c79680a3295c6df126dcdcd7bfddb3349a5f98763d83a885f836473b41fea3045c97dde17c5b15fc34c7d2dc37ffacccfb7793dcee1fdb87aa5eb15d30f05a3f2f016698ecb406476dcb3a25a5714c01fe32a69bdad0b7609e72f2af52db88401e2840b93d66aa32ead258c8d00a6b1ff40f19557b0e7a9a9d5149c31ff4d58f7446d7b7f7ebf51fd6be3f8be41aba247f406c82821c8e9eab9526a9b1c6966a5f7ec27b03daa4e75421e87d989d026893a04f724c11a199047d92674a082d4b1f1492c8227449a898942e5aac5fde566ac07c5bf3094beba1cf0054b131214a4b52a78920b2ddf556acc8b4b2ba00be15510771d2190ddd0078dcfaa7fe4fda966ce9e622cf6eb2f564ed7e9a7dd0679425ffb1c48a43cecc69c9b383e7dba3598eab2a81fa2e1fce482e48dd897abd7ac0b6426dd70948485bc8ce8a1dc77c22381370cd7c36dceb0302340b378e4dae41b91a420d882685e85288616bf879c31429222deb9b8942685128f7340bccfe8676a023c00820a6225cf6af0d953441f2d53b0a7f87740a27780910983a77c13cda4b2d75a9f634d4cfba831f48c6eab7eb70a8467f1ff1998d3e04615aa0d4809219ef2f1103ca49e68bf4b093e9e9eec97f26502778f1aa182bb7533fcac516340f3030acd88d424ad7dfbac6a307ec88ac04dfc3f070a5635cabba18239ced0c3827562a77f478c1928049282eecbccd2698f05ffb0c3e6eff15334f84bb8a9f2fbacf2a9b66401581e9e243f2699c2f89ada868f66293ddedfc002c9ff378864c0f74eca699cfc7a7f3d89d50b22ac9231c216e05093326594d385c278a974916e8544cbd3fa58787a909167ae7edbd91d33653fc884b4deaf4bcb0eb9fd6da5f7704fd6430718c6f66a1fd1bf4e0b69d1a837ea5f07710d8f030ee2add5907af6876f6b78915ba385e9ee26492cb02ce530c43e85cf233160d9b0c3a06858ddcdd55163c0cfc5380fd98ebd95c210ba11d0b41dbd28a934e3203a935db800fa5b9dadaeb5a2fc3a37b85051bf362b2263d3c41ce0d69cc2b28e789627525ef56b3861b2c61f8ac1fbc7c0b8cc6cdf528a4613b6872360557a6a50dd642902f96293da5848be63cac93df66223fec56de7933574886a98093609a2d17b6e895d7e858006b4339fecd6380b1d00689e72033dde68a999c435b4e12f7511a50079e8141f5874fc3d49a987bfbb4d22f30402a4857a5a0663cfb20df04164ed08dcd5ae69bd52604a8d393092dacb251f3920ee6207e257b30c7c5d0ebe702a077c53bae7bf9e4a4e0ac28145deb18e4e21b0540541d2d66f5a5e646b6653d1cd16aa2a7aa9115b808c44952c2758db29007f2cb24d8f577ee91a94e534823864e5049d7a19b69f01faef3c3706b8599d1a4fb0b0512bb5d4daf1a5f2a3c9ecb4b287bcc72c3e27eb3640fd20a0bbed1a4a90b8ba0e086369a64726003b8a3410b92a2d9bd851a881946e98c46b31884178dfb439741991d9e125708eb80b8667c5b78853a7c5589690839bc0cd04164fa07d717a789d4110ed114b579c6462c6c74871540f364c884a8af141b1c339746a40a8bd19ffd3e1610a5f97e9932f66391747297053ad8f5048b261a59c61899d95e897513ae316437e28ff88971b25b59fb242551a86f282c719215d1f64a2fd9c7963d04d4182510dc0d587cd25c7c618a918a5c3991642ebaf87036e7a3f61a2c39a7af651748443e4474d6cf7244eaf01167ca39755ec54db5115d8d3a79caa01b962fe72875968c6000ffb0d6d19cdf67032d1e85e60860c40ae37540caa23ba11c4ea168e6e9e00dfb1774917756ae89cf86b9c64a40e38031afd185b071d390dab1eaaf06e6957ef97b2e13a58283c1587670a2a5c0c35a1a8cf2e416759528451c61485369c8bb6b943255bdda04f18a72c09f490c4660d58ba5e2ba044717412418b12047e0636847a105bcb4f59be5b7a214c16e7c8d952cda331c155612c6e92b11a822a690abe3b4b0d83c7f7ec3bd749260890f9375a6e046e41516597f1f2a454771ef7b3e49128d8992bc4b3566b9814275057c202982d2c64deae9ac8a3567fbe4b8c08f70396ad452115b6cfa9e7bd5ecb21bf63ee466664020bcde60c55318e47b5824c7aa803df13986d727e6fd5044ccd187a66e5c0603e19136a0504cfac38faf9b787cc7599fdd042686681b9b48c28a25ea976d9af8f64659fee996bc0870ed8cc5d8a2f49e5cbdddb29b13d5808ebb66b842dcd98d2f6ec497e4e2399d081c591b218954476783af0bfc0d81d6e455e1449742cfcc4686ca2ce8e7ed85148b0c6229391dd7109b3dc50f0a882fc86d7a5bace4e6bf0f446de237b0c0a3e6a0721fb83ddb20ee0788344e4656ff7ae9f3eabe473f2424b09bbfaccf34db6913aeb2663d3b4f2c7f2b68f213004ff73cac72305702501a17228095c1c4a57d5efd705d09205943c5a14e28b502fda2634368f5b45fee676300aa37e885b6f965dd044e99bac952dd57f859dd0d3b6c21dc9ccb5b73ab1d31cf361a3bbfb01b45ba41125afb49367b30897cd9e6cf57c99de988a9933c71fd459e5885eb90866e09524956b90dc33393950ffc966339085f2a646ca74a0977aa93f40cd343c0fb33270b4787ed70c5487a8e239bc485a53602c637c4aeb9d95ca3c7abdfec9ba45c8be9cb75b772bdcefae53b7e81807761d7ba03e74dc712a870133d2386d5d2b56a7986ef8ce0aac6a67b72041dd99e772057d2fcbb9fba9cc4d36340c751f96ff20cadd6105d9d2b29381772417172be3fcea3f833bafc7fc16ea456e37d8e91343a5656af553c59be08ca643b51508947e6c177eadc0f1caf75c2749db9883c7973f1d0164f8df624a5f6f8bdc5b2c74c4b33fc4b50b673c63e85f3e4c4821d19a247bb808b017c90fd8a478c110c086214401c7b44809e0b7b78d455258834d75f6918704572a4e002fb65642c0736b35d237a1f862ad98e4e700ce6625e69151c88ff4a19439f383b80acf2aa57ed5100765d05d3e2ca89381c7e30346b7b6700be609f0d9e80521b7368dd400859d7eb53f6db1dd75fb1ce19fa0327c89b8ab6f58c5a7e39cf14f97c2784c0d25de905bd829d83526f107ace4300e329020fdc18ea84885f7ce43df6df8edb53895fb8f126d0f88f8bcd4509bc4397ef13a7d51834c9857bce6e993d15d5dd89cfb0e3d4708e8c2076267c7afee34303970ac3f057890cd1e96a02aacbb4f799c3150f683ab2c68de87fc6344c2ecf53975dc7086f0f520ae5793c3d69e354d34b6b92d449c3cca6bf21d4c9a98af2222cbaefa4d612612157c083a6505a1dc01acdc1ca5724860e6d9a0476dc02587207c3487a0561135b66f0e1f00880ed3781c82b256790c85aa827e5ce9e0972b011a23f6414cfac0103b34b8740bc9618dcb8b843fe2c1ba56e463000549b82d94244104a3f6ea71d4b050eeff382776301767ce8a455403b24eab22fa2d0bc57d74c3e6996b70ab9058301cb4099e03657c5756de1e77192e18004877d82dbf2ce590ff5ffc776d08abd5672c361c5fdd7d25d6297a38d2d74da8a45aa39d64f48051a064882eb659863adc6dfe8b3afd6b1164ad3247bf3dc3c9fe565a54c176bed47eec263c7124617bc91d5b2785c8e6b6ac544546be7613d1d79698608d97b5bfd0d0573ca1535c358fa06dd3a36f63db1f64001050f42f201f69d760fc911d323b0615dc66bf52b880e387f476b93d50f99d3936516244891a8adb04256e46d1f9bca4c7889575c32770d78157f520d6b3cf5d1c94b6b889c0c4a05f05b6bbf9239093d2cd36547e21ea064a905f22d5c996fb88c5a0f995e0d75c332434a50a8e1d4de4b47a8474f62c8037de04fed2e177783350677d088f84e3a90d8e8f5e353bb6cc5e819939f83942b928cadad787c7095513603e661dd3bf1e9f4b219cb00399614cd7434ddd01284e4600d064d0ab8d35400c7cb514fd73aaa2e9bbbcf64400c9d953a1d0c8c361b80212e73c22aa54c15237192afebc16c6b37906ebed14a14c462aceb54a8169a9ce442b39cba244130ca6948066d85b72aa9bc6b87a30279f6d8a46a59b3cb1fb149f801d33809cc0e02e5b950ae67ad9afe2d283a9d397fcafd5e3e04f3273749089fe9ef605b5b743ad49d0dbd3339afd8948199115c5a62ca346ad280b5b047215294da36aa9779f07c5bd58ac01b41484a1c86f2af1822bb22e47721368321ee750e3365f7b5fd7d67da3bd33164ef87a157afdda2bd3859abf6be36f9bef50d43f8b0badebbbe62778d30b460310362484e031d31a3a1f34277ad912c9129925d53ce585718fdd36ae0a6a4b264e4d500e50bc8f9ed83a91b988ba7b12037131918483088eac2e92dd55e96c6a25421d24f852c965eb4a8d6ae50e12c5b63ef93d7d33d6366ca12cf0d80d36c70aaca822c6524f8ad24322f33e8d4ba7b529a66efc4cfad0bb3f23e4c598a6ffb94e26b8bd019b8de77a0b6c8e0d67316648ad00fc11d79d7e32ee5f70a5ef5a17b38659e9102d01abc44b64fc108aef7bfb47da0bce04150326e39506f13b258dd5b8ab0c0d42bb541f7fe4b2e53fbe1fd173289a0e51630d43e8265c4ae0fa0666681b0e0ae7dc084e65fdc20ba72371ef8e5e95e1a8c17edcb10684ca368d4431827554295158e592451c919e1ac90a6a06cf1f417f941314cc0dcd99a42386b9e72e8d8fd06ed049e330876fa32d3de79cb7e170704eea271e6bb215167e413e7e2ec8b99171a0a846302330eb180a932c8c5cfd0c99eb564b5bb22c9807c655083fae54ba6d8141d7eab7b0813fad962b018701378eee10e579e6651e2fc7930ee6b511895dd969b0a219fddcfa7276e6751822e48f67665eb11832b0f69231c717a1775e25f2160822a76e7c0edd7f924dd2492747c5034aeef92943ceb258071ba7d4f81332c4a5eeb2990a4887156025466838adfe4b0f09d5e57977d2be911b80c2699b71cba344a5661f7e2dc1abc5db5fff59d34d42f02e2434d21d4a15aedf42afc4b3e7b9093c6a438a2008e7c0d6a0752a8ffec4958b99a612c00758167c8194c825edf60b2a6885e28d04f13cad8359a5411f3f10883f9ee9d23283d8e9c7b4b71dd1adbedc9d503a6eb70654cb134b7895deeda037a73779838d517c0e133821e9ecb77eacfedddff6941ade5936db3e47e10ce1ec3c122e26e070d0319244835a7c536949d2e84068da7ee73d305483f0e9b6ac507780bd7de26d6c679a5516c327dc5470f47a823b0c19f354ed3061124504bf2079c3bbca9058690147dd7201b7087b35f39dcf47340013fa6b067ece3d622f3cee40ffd2e7199035cb9a1892135f739ab93f596c1093e1103e8c4dd79a73fe3b6fe71705f4a6daa230c9080025bdb03e54f12d4c804be0aad791aa4f98cfc3e5f45b363851b310a340a60327abc01166c92f31947f8d1c730d95ae587897028199de5b77c759894cd781f117252dee825d53b6e456852ab08da26ea6013717954da601744058f22b1da0811a4e4779cfb0b32bdf8919ab5ef34d097ab82164f2ddc6ab8dbce184f13b0e6a91b42f7268563ca828a9ef3c6b309d345e8f14820c7bba22807305aa07ada241ed6035963495d44bfa92ac4c5a5835ab861ca0693713f7624bed63b7e6ebbeb70a7bc8ccbb21101d0778fcdc398a4449eed83adf3d2612f53ff8d4cd959cfb1b35068e554828b1b703fe08872a98cd6239d57ef2b615bdaf9bca9522ae22a26b1404a00a8007aa8d24caa7f2e957d2dbeb7bc5f9c9a3fe0fd7e4e5a2675cae4d73401b84a6f77f2b776b7b67efad47582b1934705d09b05b39e943d46ae06d548c272e8cf787a381dd10915b36505a14dd43c2d746394f00082dc9941423bb31ca186129fdefe9e96138d4aca6e2737794978a1ba7265a466090c6fa142927668e7f91cb6680133a181ac9aff8c8852389fafd4c7796c5f581debbb1bbda53bcff0f4821dc6b5c1e963d4a2b3291cb1efccca23c1b6e5d60e99d1e2f96328154c0d607b941f23c986b110c2bf75f01f4ab32f76a6e36d88db0434adba403a54ca6826690c4a75d6b989524a190d69ad0191c14dd071e447052bb6142ecb67f304b5bde6eb15221bdde97d11a2a119e8eb588983bfa9ed28f81e8043d02842712e8ec521b3c9818c367dd90119fed8c93e0a4c72d9b4ba716515dcd630e074aa6b7a7ac5fd204ad308f55328ca32fffb94b0e570f50e1f6c3f7d0a5d34e47addc6a7089dc6616429d4d295be1ca6627d4d7efd9495b87a47614807fafe48b4f67436d4f229e4d54025c0a80b11488e2d4e03fe35cd24c4a6a9cb11216d3115b0660309623e03291953f6066a7b2cfed3c44344f4f24e383cad5f11e105abac08ba14871f37ebff3fba51c2998e3852d13713278d5ba741b436c936db8753222846eb3c1571dc513c04624a4db46999f5ac461345280cd94e69d8ea487c4d873ea1b6d21699d2e6318e9218014cb21187842f3c4e491530e420d310a73f511c948dbde994d8b5475ec2536e118f4ebc590ac1fdbe0c8ad75852e19fde2d50ede6fe7904dd53c865c11e086b71083a05e52609e34ce29cd9236772eed0cbe90dbc987306d26256e0af7292321d32aaa68820281d2c8fc451c4f623e60e638b583be52da67e5e05e94aefa88395a381e2cfdd2539538e7f822508203a9add6a107a624c15684b8fa83c378ae7dfd8e78c81a461569a9478970d4eb4e89416027bbb04aebf7017659afc777d1e8bc481215ad74fe9b882c4377afcdb361616cb83850ad26aa040771d43bd7e3502588bdcf45a32c844eddddf3f874a39cc3be80db68af3bc80baadd8b81e131ba69294bb24954a2368cdda33c1878797a58be3eab929129b09e169ce5df009e45fdebaef8109bc8d683b622915f040eb24ff41328ddb584caee4d6b48585b1e4113a71231d1a5f8e1647a542d409757d43b385076c7ff2e09ce4efea3c99f62454544aaa4f2d1453d0f8409a7850db638f19b81bbffe502e0d743b2a11fa4bf438ce7a4949bfd0b5b70eb82d13754bb18234150f41210a89a7de4d4e6289aacb113c021f61a8bbdb85f4869bc0e69d63d794512cfbb92c89bab4505e6380b9e790f31fcb115a8ce9e0fc7202995b678276cd1f029aa06e666983e9ff8829fc83feba7c9e496bc1c928414768e7a0deeb8cdf3250b7142b48a3b2ec2034725ad1d3faf80ad1b24ec13dad7dbc62b4810ccf90160d4e6c11440c96455ad21450389fe4da95c1056b1bbbc22723266f1bfe9915e12be958a380cea474494e128d6df5e7e06be44dd55b2240f32b6a3c33bdcad824a5bcffcb32840b69eb1e5b9f1d7cd2d3f7a80280e44a42dac72910ac768346219a324e26a1920e6d140290ebb393e2b0523c08a36cc8215a14e6871588ad611ae3a2d8239431c1210e2df903f76bbd3840771f9f2b68d26716e058c5ffc1a2075460d77087df3b5808a4627ddb94e91442fc407bcb4eb392c8068b87083c2120219ab4daa24bf69dd0242c1a17c6ed92b98a63d59cf56e475ea60ba85885caf288988bc234679cf26170848180be21f495f7eabcd72d9738900a86fdf09061b6d15f5fad8fa1889bdf5a9c1b03f22221f50cede33122d221223744e4fa10a1bbc570eced70b3c83e6d899d0359af7cddbc810c5bf1ad2317f20617c2c4f5c8cb7af00e72ac0c1f66133e017cb260a42f2d7fcb8bbc81ef9e60c7bc39877dd218c1fc005a133e2136302c57bd7bc2c11c756db57209e6a914d9c211dc8f0e4a8238b298199fee803d011d91be15ff1c1af2ed6546d32981b2cbf83d9682489564ca5b6deaf075b23face397a09b940ebe4982218e53253087d53595ed3d9194cf8fd95409ba258a323adf225e8c18fe040986c7c716515a5517c3e8d277c45dd6b88e64c7564b72eadf306a971d5930c1b7dab5d7d87ba6fd0d1804a0b2e68b18be05919feae6f7ad03d9a5665cb5688ac73b50125c9440562665e554a04c344fab8fa0f9405dd05c92291c11c8a97f6bcdcc828ffc9f3f4f4e74baf7f8670b3e3a350ff10865224bbaca1fd37783ca5a478a75ce4bde4a82206839e375e4e84b16a1ad549f6fdea2ca51dffb9c377812aa786270fd970a550574f6130144cba4edbd9d65c46c464d2899c4fa03339051e1e70ff21aeb7f961fee6dc21ea2c11a5ce7948624a975ae87155839569390d500aaf8127f487716e348d0dbac368196ef6b572ab029810666326f210f48372e25cc46bedca3f98ab8bd01ae7da674a51ea49c1464394dfb0278a7899d05a18285fba35e9a6a36af2871e5464719e873261b496e70afcd6f5f0ed21c176d0610103a2182e9b8e2b53f05a6eda4fc0c2d9d1b5da50f16ffd6829b562b82881831147fa772e95acc76a4bddf898784c612a50ca0f2042816eca4085ac36b6b6bc85134df3dc11884b77a49bb5b489d037c53fc340aedfbd3a32833944aa936b6fd21ca06b56443b49e5786313c1017a245dedc5ec45b0008999371c975bc453368c41e286d371a750b5f128864a9d5254fb7fa1e4180d25656a0d74c0eab00befb210665c51eec3a15193b9b083f93e9b72bd560158131c344918211610a3165ee49783867a50e8b428a9e926f48a4c013e73307237f2576ee1e0d5872203c7eb233e3d59c68bd6cb9225d228eaf7314f974768b164f21c091d46abb9b3bb5ba420359f52db8ff323c18cbc482551ea525c9914405bcdf244a2d81f17ffb606d9ffee1c15be5e75d5b45fdbd0b7ca1e0cac8949dc5c16a374c8147a3acdce657b8baf90b6610a682344b52a708fff35a810e7505ae1b3722b684e2bff6da13ca1c8f7276b71d049d5c292b18d8b4eb0164445c75108fe09a551385a31f10186648a75c459400ff71023fb4051a00ab6a0924122fa26fbff0e30aa327e5ea2bd1aaf8b6fcbf120d3bea0897fe3fdf3e43860a8986e66cfd883d28cbbffed31ec81a93122b86c642591d6c849ea013f95317c408cca1a4bac5a2507cfbcc6296e32f2e9c93805e569179a52ccbe917eab38ca69b313490147a575ecf7738ab2e3b83ba44159eb52d3d69a35f6f3427f17720208b7fdead432cc416ab512ce266ef060a661dd19cd5006d361614b3341a634818d307571818fd7a789833acc435803c1f12c58e577607de12a5b5771ac68fcfc94807f30e1e20fe5cb32a56818953ceb16614ffc3d4f1533acb692095a64bcd8630e0ed081058dd4f444cfc2f35999626c350f84a7f9fa56d853d72e8d785930d7549bb6de3d94039fe6ca6bc97d89d1a23d9862f2c0144a45ce3f8fa5fd68598249289efc31c9c68726b1c971651279b29f89ac6cd69c29828e1ac3662f3a5da8288e2c85b4db627ee36fecf8e4ec273245fbc2732170bbf306365f7841bee75029471ad4770b587c501b65447be5db93fc8c75286b7b403dd86e7a2c17dad858c08c8546882f8949a86163558c9cac7c06fc412b20fc10b2c2321ff906e871efa5eb4efcd9bd62a60d6b636eb9bb270c2006a2af8a9fd045c0f97c1d98ed78f78be2a366c89f6fb87cde11816fe4e41be443b8e96d285cc2962e47b818672aa35c4e05bdba82ab5540cfa415b1b689a3be9adbc0723082eba2711792d10df3ff9d482e6724630df1cc6daf571fee6b11f4d4cbbddb03e67ac304256287610e3bc37a1e23f3409b5e10c977b832a042b5fb2d495175f1fb0dfce58866fa9aa379f4895abff7bd6e509b2bbd2ccde7064eeb6303113b5bc82de8c472851d8de3041c38beadeccde07266d216b64b21df0499aadca2a024380b71cd0c05db9a781cfb32f81cb9d4787c93c003dc136af3526b3b3d4edd0fc45fb1e6846434bc8eba140561f2c8470fa6d3e51d750b3405cfe3baf2cb32123bee442857ad98aaf4540a10957bd5f87bed8994480c95ae393a8f28a31c368fb028c96303f00f40248e7049d5e4439529e4bfa7efff6438f8208afce2263c1d8257f4136b275b28c5a585098401082230403f3617d6ffc7cb379968080c0075147500fcba7c63d714bafad3316af92775f2ff911e91b55e90bb5a737a090f483ee4cedb543f9bb771079f20cc9f1a6d8e7318562cd9ab75721d7710ee7140560bf5b9c12035a30047bf2278c9a7de6698b9e696f375dc850a53a47caf14206ba350f9bd07773f5fec36b667789aa141fb077b130f30a35a8dd86535c3963048bbe3061d6b4199aefbc4ee583f2a85e173eb9fdc9696b3dbc97eb1d8be86323198686c6da2003c0ce3c913ce14560056c763f21154e0ecc302d6934d5735a3db90110816c8612401373cda7e92963d24ded0ee806cb52b171cbbc1ef98fea965ff1e3bd20fc50b78a1cf9d0646803d23e5618d7543aed82e8f718d4e60baddc38c5c0d8719db8bd456fca9259b00b5f6400f5fcf3ec70063369beabcbb005149304eac58bc05920542a937431ee5d29c497fbc41e4b6e13fb28c15f75b0e6343fada727fdc079e94e1c900b4b7b7e6cbd0484e6d005a489cabcc445f9b0383845a84e0e9b2b5b23be64584722b497d3d7b2000184766b84904636217b6fb977ed0b250c900bb1a79c4d1a7f8cf03c55d799b332735cc7a93ae8ad6ecc2a9e775b30b46a66913732dcb8a4c01d3539fb4b8643034bf60f1b62529d50caea41cfc78dec3d7ade6386de016e640f7f1dc84fdedbc357cb10c9064d4a8e903997ce7a374847406bb1fc834b57e6582be652f78ba9bfdc985937be7ae5c9379ea2423442e6b22e7b3947bbd4d5de4dcf0bb9c56d8b7146a68e2359d7fb8d5b5777768b052495210fd6378ef3eeac55ebbccb3af47abcdc98b9ceabd8c6c0722f282d071d58156b9e0764c33c545cbb35bd1e1567545896b3b4cd0a40472290ccf52d5f5ec47841c20b0b59ec0103e60c983260b6aa5d213f742bbbf62d3b5773aa7fa3dec05f64c1abc1c3ac0368f7aedd7be5c929163aef7e3c40b47b1e8ee1be7ae32c6dc39dd3324d6a3d352dbba98fe7055bad598db1d61871a4be0e642ff5cef5372e0fda61c691ab0b73ca4b80c671dcab05030cda94c6507eaed7c63b49664fcad9b955b7dd957a2d12cc58e9ea1463e46d2647e61cab43752eb7bee5c6255c0588eada686549dbd4a37ee120623d6f08778fe3ba991b6138e6ffff9fcbe88b17859208bd54ef86089b39d7753237c23a1b184a178731f7c9f2621092209543f9922c94774384c94c2a48af86cef351c3500d600b66085bf59cd7c57a8e85ae4e61c65c79ca7341c2d64baf870b12b69e534155ec99fa62b9f36a68161c95a05cb930cf5c0893b910a672bf9a723f8bead1454a5f2fc9192c5262553aaea5abd709d4ad4fddb87494dd93919179911b98ccb9eb848c8c8ccc31c618638cf1efbdf7de7b5fe4e6ffffbfc80decefae133f87b170bfc285b92b55b06da4f403a5a5a515a56e398962dba85b2d65f07dcc2c8b355262e1ae7061ee8b4b123c549886bfb8b47136a8489261e6c1422ca630ca3932c4628aa41c3deed5ebc161207705a386ad57ca9e3d3ae9d761d97b2963ca99d30fa81795c2c8eef2e293bf5e83c58638f484ec41f1b47401a0308ff2aa653767d5680f92e46fe620f7a41d84a485fa65dfb3e94cab5ddd40dd6a245c932562eba15783aac97e33314a4f744124025dfd18433c1275f4bf09e7fc8b3c8a31a8de8f25883629277bbb89087cf5113fd2d5a4837c34142ad8790ddb19d81975a4202e0169fa7d047ccd2460ff2401fb1348b37164a751b73a499e454ae6bfae682679a26d587273a84681f4f0a7e51ed266deee512f7510a4819953a342ce1e67cc30cb3c423dc91f2e4a29a594524ad94bcdd44df233497e2a4929e5679d4ed2881a1b29ad06ed6a4dc95a7bedcfbc4ecbc2711dcaf37103a737ef0037d4902d185a5a68b7f3eed0cf6f77277b3dd71da2ce1d87ed1ddea1982577b6a35647adb4ed94488762967cf6bbb361fa7a1dfa2aa54bf2c0b20b614adae3927cb11ab36ea8a7d7a9cfbee1d80efdf60c738fed10e9d06fdfe181cd0b6135f7474e4d7a96a73168ceec14efd06772271b12b3843026ada81bb29d33efce46bf8362dd901df507d06f6f2fc78748761466f589d06f98d538161949977608abb771c85e31fdcef6ec38d0a38ec23b95abdbad3eb07a79340dc2222d32c9da616bf34cb1ab151c9cd9210ac1019e1e877ec43b718788351bd6b7fecc235fac895937c0d3ebc0d318117d865933961d62d68c4537f3e604b94a104a1750d7848d454afa157fa0ab2808bae45522b05ffcc94ec0cbee39457331cef903e66ec623f963c93d678fd9498ece679ac7b232b2f13e6edc905d9eb2a7d1540269074f64efe73817919a983133add62c7a3500494229ea80b956616bccb4985d3b0a07c91e9fc5ac6a59ad31ab356a118907469912120f8c907830f443beac943bf420048898b437355049baa42a8b3dd6269142473530b610142de409dd4eea26dd923d91290a4521a66622df42424242ddd3d3537f804c3f00116b9b4e8a2ccb329511dbaa39bb5be320841088200d2807f98a47d225e3b95379c474235ff6b28749bbe4574bab95b5b2898a887cb5d09164229398e4ab8f1a251f23925214ee581eb540218f8e5ae8a8498ca3669247e123bc5a4d0985c87e5109942c2f8f8e8e8ea4d09c4253680a5d2b5d114725dd9248d82f2a8931c6255eab90a838b565929c106652521548494f6459a6691a52920f52d2912724a427b453521390908c9090c040425a927326b151589724a49452080e4661bfd52a37f47a3ca06b2cbd02a9c7dae42d98600be6cf2e4117cc790b25fc45dcb164982193a6026907483244d2810f920e8eb4c4403b9ce1561d17518f5e0f945c5996cfe65a6bad155e9be99676ad125a8f54d3a8865794ae60208f98a98dc2c2b3ac502bc80385574cf2a723d3c36d3bea9aa6c10b67b7a8f6faacbe1ea250f8eb40d5600d09a26d428c61ab3d1c67a1b0b0761bf562deb66ddbb6438fe3366ca3902b9898799af699ee19b645363edb2c12b8d96d3766eb633f7874051532e4b673dcc6dd993abd1e43b2d3d0af0eb7da950db16958eedf2bb633b0dcdbab451c65ed061f45d800ba360db7bedd19ee5f97b97f7fddd1adec429aec3b76dcc456bb322c8632cc5cbd33ddb2695819ba75214d7619727619da86d6ae72a1247f908bfa1a6f7763e69a703662ed6aecbc9835e65ab56829855996b1f88081524a57dd1cbdd933592bfe3a90354c8dc0f5ccb909da302c134843fd5e7d3535bf914964f91924249f2c2d8b9c47f2fc4d2fcd3997e479f4031897b81a9b04dbaa485bf8e46e0b70110807b36d81e5924001242d982069e124c7cf6ea9851092164599a55b1189e3816d9707767a39100f20333db7ddc7ac0f0a80b0210a500084d52d4e8a136bb49ba39afe7663a6f252cc813ba473f07cd0896f1c8bf51be7600540984fc79677924a5a04dd86b52c5afc64264ff95bc1c098210f3576701c0c521690f688f125fa58b8450e84323c853485a55b19c2998e3ce8a28b0c8c2ec10b8e606145162d504a41012a43a4254db2f8c9318b9e1cb97e97c03ec7d8011a34110512212698a8028ca220a719789183348cc086ee6a556b77772f899994f338ad35a51d3399d1f9eca6e4385334cb1b7312e0062184526a339b74ce29676d2c3a0ed6ec15db4c6632932c3f505b6b561f63b78cab36d77a148bed6ad66acd50cb58407c9819ff38858293d8d2db758bbee7bb2eea8859c6d2524a6959badc1652d992ab92a32b9eae70bac209255b5cc1c4154a784c991545c8f2535aa1469641c88112108e5cb07494064c8d1182d5e6c16d0bb639439e2c8092271141f29c1477520a58370e94e416426e2b88c85d85f90214c4217ea694addc4b8690bba70e28a490c22340fea081ceef59662fcc32385fa59c4b8a50290211645a888004dc0c8bed56dc9621d212a022b1a76a683085b146144840852d60cd44119a688086135d7c01eb6982a26d0a99553fd9b4eddab686a6699a264411604c2d8a60428bd675157b66154e1c0e15729f861f394196f874b9ab40421544c85fcd5605175f73332713b42a3c39822205a721f4a00751480110a08052c4096609862812885055649a50d56e30b54a0227381fba2773479d8b40f2c5e25ecf0343b138ccba41fb761d0eeb6caf38b653ef7dc32c2ee67d677bea1a66717848cc3cb07adf2dd4b3db922ed4b58b8645dd645411fb43beb4efd4cfa358f0d9e76b670b72c30dea9c7677bcd7cfbb43a4e3bd7e2775d60ddb537f40bd47647bea44eabd7b97058f235d2816c437dd421dc2ba266cccac8ed561d60ddbe771d83ef10e918e7cfdcefc761ceabd7b7847be7e37393e3e36e5a9544e0a75235da8ab5c1ce942a16e2f0a15d42dd43b1c8fdc641410eb86f9ed41e4ab07614e6851680577892c0bc36257b1bbbb4e61bd0c91aaf0d95185ac596c4681ed3244a2a28c6ca920631eb12859185a2b160beda35d9dcb10890a25e4afa59429117b726f1b2e4297b665ad031006617266adf336c0f461e8efe8dff471fa34f47ff475b459bbcfd25ff5cc1ba60a0b5d56c83681a84cb3498cc1a18127063f10220a3220e3092e2043e789e88c2cca58c2620912282191291dd9bae7104a30b04a53b07e68ec3e4c6c2abca856361547a019aede4a6588440517542ca95970f15cbc40e41a5580dddd848bdc5b38e5ae2136e148eecb2e830970094bfab35f46133c02159e3c0189007d3005ec0117b94f042fbe58624827f508917ff00ed0922501bea8810045e4be0e1f6859966599a6a53e202d2000115ab400f6c0077dd997d2f3f14224c50718099225cbee39dbf3c18991514ab3eeee775f5342449043b4a7e81f146898fb7687c46c4cdca9cc5b14cada91c6c4d358dc634e8407f64f0ecf22482389c0358e8dcc002322f37f3ee64e211ad86799e363213ac84e3fa8d44314ca9dccf187c43c8da20ef9d89327155187ecb0c684cb5d14a32c38ee5d770ef52f2e614391c414e41951a003a874ffc1a3185ab35295a44b7adab5f9639d7b285d1afe78848260ca94d2ad3b45d2363105b1c55dc6253277940eb84bee2bf8bbe1ae82bf1acee2ef92c543865190b94f0f64eeac1b62feebc460eec73a1743c99d472873a74259d6faed9c0d282cc4690ad436dff605be32312f72d8a3d0e7b7bd872894b3793fda33b5588c48e78fc1b1981fc77e285d31a13cbf73a4cd3fc70c89e5fa79bf2994652e84e15f088bb91016bd04cc5c4fef1099ebb7ab1d754b6a4cec57879ad421a324a3222547454c94d4279664613feda922a9423f6d33b10f9883da86f5444ff5691b0ad436136b49aa36d4ad28d5881624fb69494bb2bcd694448cb6f9b4a2ecd4369f06e40d415eb5c4f3c2aaa690a74e6d336f40e5a93c35034eba045d4cec478178848822ca912e8a90245d41f275a4040c4ad75187060b16f6a34b77e73b443b31ef77423606b3e663de3f8e795f2706c7887462fa3a7ffc718ca80727761ef3f81511d87b63eefc9d4d7fcc1f83e7d36cea47c9a23f90469e255322ba277bf98ffe6479ba244f99e469137cc12348d1c40cd24823042c8002264f9de0ab9f2cd5a00814f8200104d806d3df8f141018c2044a4d1c2184223b00811a3e204214211851a1440a2548989890651567b584324a4084822649925006aca1a024066510e1c0690a360002ed22ab15b583da4517754c8e68426e2b2619c6181dc37842cd0d4e184eb94fc38f9c4903a62e43a43090b0448c4687ffd3ca0932f599986e72a81d837a7a8a6e9e6a9c5a4d50291e654f3fde8d45d12888a46f158b82504269bfb9a9a9f9fe03a1f01784d38f295434858484921a72416a08a9b1a481f124ca5114a7a904212a0ca501d43d499a82111458042324221ce5ce8850146794b225b63176c725e015193e1e651ee08473ce196bdbc45afb68068a219c9102c12b321656a8e0153704a809402bd37faefcdd0c6fa4cc9632f3cc28b1e020e4e141d8712808b7aa657466086dbaeeee5b4823bb3b6e2c80b0080821148146e9d48896b23862e98a8d061b3a2e1df56b5a0c2ad24025c51e14d21084e09434ea891030d1b73c3454a5944e6d9341892529762cd1a0ae245e8ac20af19a30a42519e4af457bb6259e1ea0286a203943899e2a40a4186821f48315147106114aa2f022018aace08a7410ab0c3537610cc112208c2e727fa6db668814c61659cb10298c1c1cc980889e25002925cd200a51124730010c24bc200808d08b234404c188294031a40409174f40598208219c408859834983f9a494e5147cb2c43fb4dc32fc108cc810a90ba50c79902152174c59762727fe649ed8e24ee698a395afa2e60642f95b0901287f750533c3cae91e18ea56beee4f856dd7ae4f911bd8f69f0a43a1b65b85b0a4760fd40b20dbcc291b5f9e05714ebdc40a80b08ae111381b52588824849efc5527454e9e204bbf20acde9f0a73a2fe93357c40481e7ee8bc926de6942dd7582386863ec40cd75803a6f19087f087ce4e68871e0e33c0340ca5eb8819227ac851d4d5895bca0652b2a4948280fa80c240b62c39da51af07eb86eedc71e8300ef02e44d821f0693b6cca3c301e5857ec83babd3e2e3e76087cca3fc80c03a0fdb335f0647a1cb9aaf79b0710c084d24b6d98039db598655956e9ed11ef43fd0f35c72c83a16a764823bde2c9277f3587218adc0d6b2904b59250a6353536d000bbd58a434996b64155d875afdd39d9c1a3224d32f43878f4132543d46bf47ac01a2aee78407dc3b55b47450465e859951a33d3ae065aa8b99e4e68c36459b338c17e32c86023094bff49ac8136ca3cd0d76e4508bb8d4c2138285f44d3c3e18768c84de6e10799e55b990766ee8bf4dbf5d95e8468c84dfe410620eb0b9b52bb3a71c311ba28ed6fb94fa47d5e1f804cd8a21108cdfd6e48531273a0b3b6f5c036ec53c4c2200c800066ac9f83fa767f1ae6535fa4c25038c200f423d189341c334fd6328a37279c3d145b4234984023080d24d02032e7a4dbd6e43d6559a6a1504d504f6add38ee0c25944977860bce38c119453c2fa55299e17446cfb466809182640611525252545454cc60628613afe3505b4da1d0e03afe83e15bc5f8c22174d3040bd6a74128f77f74108ee4be4e908cc6150c723f9553b9696c26b80306f89aa9ff8f57dd92484a3e791ec8c4306fd5dc340c6c3ff620e3eab9c9551e9aaa72015d590ce3e68b9c75913354ad286f2baa3fe42bfeacb2ec2729ea00eac89eba9107b0953dfec8ccf3ced12666d8ad62cb82a72df2b69191bbd4b91b619226bbfbd9764eeb2a1655e4ac26814493b9c35129267579fb1793b60de370b7b377bfc8453ec2a161769a945d45ddaee21d62126cdaa10754b77171247f313aa59a9cbc28624e5d1f22cebb3e3f87a9cec5ae769cb5760cfb4286590461285708d3f1361d950f3aa97b3876e9ca9ec20a80b0564ada1b2752f7bcabbcc78888b67bd84a57f65abda736fce5e0c86fe525e06a1c0e0d2814aae3bc7aed7217e688040b06163cc82a2168d2f311f30d39a8cd8e6175ba9505c9b22b6c905ab5f6b473dcb50d07c9d1f9d1ad1e373c416debb6731708cedceb9d9e8f17b8ac6675eb148783742bcbd139c3fe8037409aecd9937ed8c0694af2079fb06d113aa5906a16768d9ac5165318d5300551b56b7091440821a0cc4cc8716fcf476cafd69a65d29bd1abd72281935d0f39f3c45def9b97d263ebbf73db338d625194e3f4b873dcd538138891bb6b2e4868e7b8dc69ab6ec94e6b651de7f9788f5dad56301de70333f2a7a3d6ec35282f9c006956d3ccc85f8f404a699d28eda0c1762a1bee472b6b32c840c30ff9dac16298a4ba4ea49c4bf90e32f56f9572bb67d2d93dd2351b4a7b2d944a0302a8c86c245fe873a8f98c064a9a119729894b5109f26806f0c0527034e2b82ee56a5e0d45dd6aeed74261b94b11c4d96b9e8f99356c872c7c42596b6d0b06d5bf1667551ca7e270fc894af107310840282054f763e34fb7e4cf8f11dd92fcf508529f397719bad5a76105b3e276fc207651e4c3ec1dafd843c38e1b198b41441e9564618a519354b69450f21767907572606050e59a18509f97d026fbd4589cc050d35d2d191600f6834e363226e4871e341063a073e3de999b39f225446614a542dd6ad48d5087f64c887c699ad450cfdef53994f6f92f0aa1a8f60c7294c3da45512c3d209d331c83e2911623ec178522d004020bf901a65bad5d18ba65af0fd107c5805e0ea4e92b758c5a2cf290fa48d3342753a39fe7e6f54effb1d0f282a93cff2cbe2290843186385300954ffcf55093b5c71f237c344c81b4cf6ba3b074a9fbb7e2ba0787ba91e1464545e5c68874566e7155b9bda772239c5775ed4627ec556eca7f0eb3673d40e5f63a2b4f59b9877554bcabe09ce8838eca57704c05fff06ca74409b317c254aa430f01f7ce75a761d53d1f2fe4283ba5e116caa0e75d0b85eb72d0c1f39e793dbccfcfae5bdbc6418eeb24ca4b80a6ea54b7a30744fb7c0bd5e446828455fd655b9512f28393e779a75e0f6f871e34ed834d9a26278ed4d7016ddbde29dd4601d4a102d8eac7a56e89c31d64868d4addcaa2125559f244fe3a072cab5ec1ac34aadde8d394d2292fe59c1b9634860248d367c12bf618d19a96699aa6652b17c4cd466e4cf207bf88721eceedce5c1b7e409a3e0c5beb9bc933300440c29b99ddc04deef07ad42c613f98a40dd9d8c95b22f84546d5409351e7b4ce52ba5d3b2f8bdcb64a67c5407e7c3079466e5b8d71db36fc7540fa30af0f336f4f26f5a92b98159d55caae5a96235b4fffd56412cf68537a07b8d1e5298dd0d394855a22f68b3edafbc5f27e0492da2ac66b596cdc2195e4cf27f6c0a052c2b70327c6b0f23e2cdaa8bc5f03e491f26e282d00e7bf958d0f015bdd82738831c41e0c218dfdb7b281bf1a0248d36a58339c9e5b7a74e5c69ea8a3af726308622c02692c56e16f95e230bd338f4fdd6a28b9656c8a501e7b2e0c2cf7a65d7d7a77744b0848d3d77ab44fcb1f3cea81347d1876c800434d4f1a5ba5b9237a7276ce4261a30d39f22593bd8359e12cc4fcf0f0377d0ea57132e64627e9cae2d191a6c523548a8b499688cd3e73aedecde56ba02a933d16d5c02169a0cca56d5a9ebd87aa1398672b34c53cfbb38b371411ab8ade10171a7374947a871e9a2410018790a6615688d9343f9de6e7d33ced99575d56f6e903251827c3ac2112a35bb3a95bb3de1ab1dba1379f661390539e513efad34c4c6c1bc172dc194dd309f2b079a63e4f7b9eedfd6c52e1149e4ed23565606356e5b904ec29cfcf4985a46bde1381fd9cefa5f9669aefa6f9769aaf190aa16558b59ecd0a0eceac54968eca595ecf82634415eba47c05c7589ef2d8ca55ce0383e73a2e27a35eef57b372285d5cdf0f3ef55093675d597979696979cce5abdf3894ae1885868a8c5e6e383dc59e96557dd767f59b7ca16ee30ab9a11b7eeeee4320eadd131081723daa2657fce5e41e6a724d9ddab0f1d8ca5bced9b842a44bbee542e98a31564d757a61f71596d95d968a65b83b8e76c808401eb0a264c8f2b5cad02dd95cac32e52c8fa97ce53852e5425865b997f22917c2529e0a6cd7dab56a4fb597046e3ae9d64445a12ecf4b20c883049047d0f4aab0874caadb40d2c5d4a5486155324cc9f05cd6a5486155199ed3ba1429ec4a869ff32d45d86e92b536e5f878ef7e54495839c27ab7f7e99e8235c5de947dca71a44da5acaca7021b838e746b1ad1adf9e384eade789e0761aa9b235dd3891f1e84a5b6b09ffc9147fad54ded9a9f97426d238df2bc4c0279fca024923c8f425114a547b553b7262aca1fba3585746b6ebd7137de7ae8d1ec5bdda15b53871cba352f7fe44fb7663bb518b2c852a0ee0476ce988264dfd1f8c4d1ebca5cec5611ce140c8118f987ce3890464ec1c1992f2bcaf2519eb80c8fca46ecb7caf2d6889d6faf4a61ed9c41b348064da13e929911dd92d94fb7a49c4134850adb483a287bcd46d225554d5035c1c64ffa79bf3e92e57d98334be2937d98f9eb2333d3356cf6845764fb5f96242b923d8f88893a204d4e901c76a881db96fa74c02ff5e9c829a710b090bf99218fce767b55cf058998bf17f20b90a68f00f8b242f0c2ebb1cfdf0bb96f435fa71f01f85a71528ac11127c0228d1f585f07f8824f528c71842264d1c51127607d9d1c182000bafa42b05e80d134fd2034913848ea31a20a4994cbf04e108342d89ae7a68f9927fee40b0ff232c39cc9cf9e9907296db7da73b29fc623be1b4a1580aaf084c704279db6d1404de681bb77a83a7c900f401eda0f1b723c0079a09eba100d08fc43b79cb29bd32dfaab9c080fcc3eabd8622333c088d8a71c4503fb9c928374d1a3de434dde72ec17006116e7e4205d3a415a8e7cf049a6a714461f6b9baf079c51cf4eff83764a5f33173d1486dabcea0f9039352c94eab25018f5148e11a1b04eea16c7ec53af146c6f718c68bb133b35d2456f4f9fd5ab3c2505e3481785d285c216437a1c99ddef9f867be0aeba1096b201051beb570eedfa699b699469762dbb96653a748b6678876e512fc86643e885401e19945c377a1893dc38d42dfa6a05a4a1104a4673f07eec0e58876e510a67e8d62827b0493b71d2d1c9928c514ad88449be22ac75d8a18772747aa08f359d10cad7434d2831baa3cce09efae5f318df43f1f11ed70da07fda88066a9bd8af086b579076c52f4627d1495c8a3f373f393e2e8945413bf4d036484c10ca31ab5acf56b5cc044c72494600a9e9095293910998e6819880a95b309b80c9044d09a02a43b01f74e282807ea42b4e61bf085454245ff011c26c1c42aeb1068ca8316b48cc104aeea823c6f82e8a3dcb15160821313219b1df4d8e3828220e746e26b4608d1bf8404909a8008330a23e40e5d19907f9888478796fdcee2932c5a6e8045f3c2378c11a6988610414a12260f1f109be7892600a82135a801184273780b16e380ef2091533c061a8255d30d4d1b09169eb140b38e881329494c124bb853cb81391ef3a9e7b7789f0c0babe10d6dd9d2e46d48f5b5f9f7a633cb088633eb06eb0ef3f40e5f2ac1b54efeba8dea84b1c9347d9abfe008b5578c7aa60888abf8c5cace7b8472ec6c83d5e877be462c43b3835917bfd57c329e51cd973df51bd3e05efd873a9947738d63d05b3e88380f1c052af374694f2caa9cefd01f62967dd50cf5da79eabdc5338bc2344bab2a7fc0116e7c075ff20534fec91ae1d221d55f714bca3eab931ef2c6a294da554b7f4b17e778a75ea2d8e49d60da977d749e19dd85d478523907465a97bd99fc29fcb11f6dd73fa5c77e3514fe6ae4f5462f281d275f4f85727af696316bd10b6edd473b1eb47223cb0eda8bb7389f0c06a7c1fa7b93ef41ac003db70df06f2b94b09ec10b846e6811e167168d81f6b85b05a128dd39ed127bad5e3865634278c3627ccb31556384ed315aed42d992d29597264bf2c28cbaf1cd98f46c9f2dbeb0aa64f50ca0f409a2ce6e7e83663fe98cb5789bf5a393ca58a136c76ea53a40606c30b67cd6bd886c3ac89ab9293bad40390f78ab019ae3d5a946e492a83aa5497aae784cdfe55a50ff0c0ee7acc755c8fb9777d621d171ef3181cfb5d380facb573778876647eaf6203ed2969a8562d29a913aa4ef215f3cbd727f99289f9bd0ec6aced3806b3361c3b788748073fe63b31221d1cc738463424ae9151776227fee0c040dccb162e739c9338ae497c2abbcfbcf50f3ecdb4700c8a3f3197c1d128e80038cdbf3814938c62b08ed7644ef2d502ce512b8ecc0963283327ef357727e67fbd5f8759906c761d387ee72e4a008006c7a6b8f4d65793e79c5ccc95aea72636e698cb1c1fc7bff834319432f81ee7e5742b6341b29cd6432b6bb8070c17460168df0b174601cc67b7fbfd6f52ce8fa41d7278823327466df3f5ef7f575fddff1c0e8c8f83cc71c81ccbc8c8dc9b1a88d34746bf486496e5eb12e461b374e1f2b549be5c97d79eb2bcf624537be42be6f738fc3278c7851d221d17fe7fc7f5989843d86155caf171dd8524485cb8ae9bf5cc1ab29faca75b13725cc7711db7c9a5b689595ea34cdd924cf449b72414bad42dc99357b2a32c7bd236df0f5145e5a56d3eee2a461c699b20249950dbd8cb6749dae6dbae1a2a52d236d3a86de692b6e99834a14b6d837ad684ba1a9076648976b5208d49b7a47dca3f0d2845d5a93e6f8ab5c7e9cea66c7696615f9efaa72d49a96cf05be5954f91c34eafcae74d3d0b22bffc6548cc2f29eee5389d536ecd9c777a61863f0f8c1e668fc9607c1cbbf43c304aaf12b232bf47d953cc71b14b914752ceba1f4f66bdbd1eac8d5eedba2061cfc253ce5d9ecc029625883a52bea550a114bc43b4238359f432ff7fed50be762e96f9af73ffebdcc7fc3ab1d331cfe8657eff35904c177591743dc9a2b0ead04b807d8534b497364ae94667a65df39864f7ac3bccf45168cad11bd21ded4e6997ba31c3d4ca53d7e52daf367ce8e13de538cddafaa8955aa99998547dd44acdb4b59355d9bb1313f3f81d99376671bf8fd75ee54b06b3b88b595c7c0c667138c787c8bd91c3624ea4759f98cc63313131bf397eff7398cc21ccc8612d5ce430191c933db88598c772e08b63443af73138765b45e6313dc7f1ff934032d8c80cb098c7085d2c5f8ee31a9901f6e33b84909947af870a5679b935cf9cb377e5db5d6ddc8439f5c754a56ec96d93479bc5e96dab4b4e7850952edf3d75bda7dc98b92d635252ca3ea92444463ec9a61bf37bed325736c5fcbf5836c5fc31a8981bfb636262509f21e695073fa62d00c2862022f398fb98cbe018918ecc318ec95c7c9f21787a623ec40e51cef1cf0cb0183c6b861e2a7bcdd0abb449b7e46758638d352a6601b12f3d3d3d9ded3a6b2d75d22d4995a0605f4ebf02d68cba250f833525b449969f4fb02bffe8d174b247599e75a9926e4921f74ea031ec1f43fff2c758cad5c46ee887c4f2cbb9d83dc7bcdc2132bf1c7a3d5e305dd22d498dc8b02b5ff9ea29b7ffa8922cff75912eb54b7e7b773f9bbb961ed88f0e2db50d3d0dddfad1adeeb57bccadf941cb35a4de9d7a3578dfce712a8efb9cf30b226b1ca547dd2f6a5ef6e941893a660f4a338aa7d744355436e7b38b1a12bbbbfa76edeb5d39eab6702ef7526e9fbadfead3eb61e3f66a43da13dd925ff9bc2b1723ec847975e801e9bc72e3aee4e8ad605ead7ce52d4ad8952f558124bb3c61922ed807cc2c872c97a766b44d0ba6476c60160ba6407905d3201a456585a550dae67bb2a42de10290e7e1cc1b37a730936441397e5e0649339008799d923077e6b6ba35a553eaf28d6422f9a4d17c62e93561f174e909944fd3482e691bef9449128aaa3c24790a39fdb4d3ec9e479cba05b3d3538c9fd87392449dbc40a911d4c7a33ef4877e74c9f36853db7cd309ed4fa61ce7d38c3299e0d27cd23dd453a9fad5f26f3ee5c804a1b81c3eb272568fb95f3e450ecbf1d5e3e712e4a1245fadc7e758b9dc9a1ec000bcec27036af1ee34438ca41c3f4a651075213af5cc28b4c708192491b4cdcae3a510cbe3e590f5de7967f1563c0ce448146f8ac1f29ca24c319ed0c48be21dc891289ee74549c2a79d742775937ed1279d0b2ccc3e3f33b0fb4f1acda11c2e8fe17071e1d573b8e0188ce188aeacd33d3db7abc3af3e7318cb3a84ad5697d5c78197d53807d6c257388ec30b61ab16bec28de42bc75dfed596ff5bdde770a955ce15463d756752b7e25d684d27391efe85996b640618cc57b82d5c79bfd4512bd47ba849dd1e6af2ca39ee68a66250a59ade4ccd296174e5130557645e994ab325c97e1428ce4fd67c44d2360df444db349e47ba158f245911c102600eafc3faea5c7b0de081c13c7af32b8819c003833954c0cb85b009245f8d242e752bb6932649f59608bb9d0544ca35d6c8937559f3f02d87b9acf9d55d245d8af1c05aee72615af0cf0c309843d8bc2b0c714ce6acc7f0610e830f73ca449fbcc0de73418e2f6be21d200d7e0a0dec4c9e398ee3cb7ce638c878428652a640f2e5f2783a245f308f391e4f85e4abe531c79d30771e45a31c556158f8d53f0a84a47b4e81beb2d29d52ad3ca5c25389a863e538d2839e0f9e3ce15d5d077ef5f9d5ea2d8fb51c9e073687e42bd6a115c4ac54ea5ceac2ac529d8585454accf201b33c4f9ef7cbe136244ef755ddbb3cd946ea7eadb47296db42dd8ab891b870b55a2b3d20cd8198e7ea02b91caee089ac5a803896e33108e15b566ff9cf0c2c87cb5bc042708c4807c2c7566fc131229d96431c73c1b105af5a0ea1534b8fcb575fc47159f33862111898eb33b7851b9981e5389116b09119602fdca7080c2c078eb9f058cc9123c75b68bd85ffccc05cf8cc7d7e6660aebf808bc0c05cc0b1788463443a39eec2b1a8245df1391e6be1f8165a780e1c8b422d14e5f8cc5b8e5af0bfa894031b990136f319211c87b0d55d2e84b5dcee42188edbab2b7b2e8449af47e3ee329735ffc3e3bbfa0262bebace8bc0c0e063bec2ac89737c88b4dcc80cb0d589b4602333c05a6e6406b69a81c1b7e02230b0158e11e9ac0e712c622333c0e0a1cf0f0c0cbec80c6c7516b0132d87b0223330f82f3ae568d472e952f488587984e5926e0169879ca4924a2aa9a4d4487b47a14b6dd340f6a34b74c90988a92a8985a74b6d339f304111833a5133bc47d5e3b39eb6992915f60133d0cc90b40d6b62f944b7e2a32c9242570e25c1017e85e3b40c922f88637c503bc9ee934d39feb7c80cece531d7e70706f6f22233b01b67e1b286f41499915fe1b270805f7d857756875b907c22cfe48f2e35a57a60bf4eeaa4f85a6dc77b4af6eba14e72592ebf7159f37309580b5d922f08abb69be27b3a03a240b0d5719a02c9d70ab3e6a70f9460abc7d3200a248de491915136445d6ed673332148131b7fd94f8ef114880651213a54d4c263a36db060a22295d25b6bdea669b5c80a1d82288ec0606af28108605018e1c813653811e94088594506c6a669b00b2ec888c1114d08019117c0ba098aa62326272c81c50d26159389099586b3fa020d9bb2691a130d529aa6a1b44a8651770507613bc85704a0cb83923d249993d75029954d515961b131b3cd86f775f224890d7c0048e3791d6700e8e2810d3227801a43163c38c8dc0bd0650580807c59d0e59dca64eff0050664ae63c12f90c6635d20733720cd0b0654ee0ad2dcc840e60e5ddee55ded90b90ceaf02a10999bd90754b767f662993bd4e1755e87bf2032f7c845180f17c4d6f40c2e070d02b16a3fa48b56cdaaaa56ab46e72bb6aaaad507401a1e943a00d2504ae965104803ab76aa5d3a29a51487a803bec64cea744705441d317477cc893ae083681eda758c1899e0e1ab8cdd6f49994929678caa215413ca5a572b29e15286119621cdc48134f0d952adab5556245df0aa257010f298352d2b57014840ee5fe89a32421ef4f01d71cb1d8a63ab76902f0940d704e3e35181c5912f1b292c870f1263a0877f408c213b7c04269003052a6001c8a35b4100b471bd60a2c336409ad9831ab05c1aa0ab8992dc3b5464804c7896a45c18a0cbeeb021370c844127f72387599066c2e880ba2fac0be4be01695e3090ba1bbc91817a35bb752053cd03b94f41901bea9859ca1d19c4c6c375f541f73899119fbc70e26d80091358687184a0213060bd8444144130e24511ba80f59c22f7f6050be0163445a5898c0a48ac52ba75d042670517329a1565c034d1d2e5c0692525074bbcae7f6004cd8804aaee571d66b4687194a48f3005161c742b9c23c46045e2acbe384245e240ca224768a2323242ad39ccaaced880f363f516194ab09020863143c60866946eb0b05a864864fce4af0b22a3278a31a240196a6e3a16981419f99b391241edee469931861184b03543a4318280d310690ca419a51f4fb05544bb3a2b43a43184c638a20428c7733be810ad111b638c4f74e693f938653ed94fe643ff49274a674fdb7cf10927e9d3367d13bb571729894f6eda46061c1ab42cd29894f4dd6451fad530882446941c2fcd681bb9f42433020aeaf1510c9899167eb7bab526fd626917c5408e4089496230891e8502e408144ae9112847c4f0893e3e908688fda24d7c7c6402e2e54a31ba156514261fa2eec688e51313fbc1a520b1975aba207193e5f11c5a09d920b814ff5590f81ce24abe229428468eb053c3493ac5cba7f8d9035f3c443f46424c651441074af075430b283c3081154b426003583c5439b144d8be25c2da4726dd8a49f27c4a131b9b782fb07026e9970e3be6dc918170864864880144fc11e2b4830e3d08717272921266da58158655f9ca0ed4574f589221121947f94686484f10ca9f2cf1f32b9f2a9fb771596e908bd305a9def5f0ce49af470a66fd8039e53e604e394fb6f77bb657f54db157b5bddd559727f7fd81e6149e4a480feff0c1936558b997ae7a958b336bb57695ab4633ba232aa1884c289bb46b1e9e834d20cd6c25a62690474aa95b336a9a7d779374924fb367fec8d78dcb2895c8a26ecd7fb2499e397b12031bf3ea2da74d2268b973689519c9d7514dca53a95b69818d5f61819d2d80342e8034f39cd6ada8202bca84b221c8237e3e0bca3220fa94f5c857cb71aca4c0de78cc5798b0f22b33b05f6694e7bfec499e5f11b2da579058fa9515d8ec2b2eb0a8674690c713c883f6409a792120cd3ceacea7a8238d1925ea08c19d55883a86a46b1ec79d33f332f339868034f32f773a49d78f74cddfb8f32e174ad7eace0a676a0a419a89c6844e5d0b6c5276cdf9c9c40479749987533c6a27e972f95c31ddf8fcea378e83cb5b8ed35b4737af074d91c27694979e64ead68cf148e6f9a8e4656157980231b58d8cf8931233e1d0a746d2c5249f9203fb45235ccd75d2bb356253418c08d28f4b1eeb8697e7789017cc8a7f390f2cc86ab57ac43a2e7ff90b8eb5d4bc3cc7670e1cb32faf3984bd60a2213c32077e904350863284b1343c24669c6e4dc9342f9be6a5137cc11d2051a289268820510417b079f9045f3c468cf1c5139c14a1891d7c019b871e0e7d560d9de3cb593a39fef21c2f8f4b54d81c9f429087eaf3b3059007cbe7a70b208f954f163ef1e70a9f9f465349be603e3f935eac981883cae7671a334a8cc17e7e5621c6b05121200fd4e76908208f21200ffaf96aa1f579ca245faecfd3a5b671d236363e4f955e3e737cca7cce7ce2f8bcab75e3d1cd4d4d4dabf5af56533231e5498bf29c72dec67549c2c6a350ca31c368c3868c4baba65695ae9863d39caf813d765ef3949656b6c7d61ff5483169d2c51c3716712c37431af9950b8334f24151877cca8d29883ae4ed8d48a20ef9edc625a20e2148d30248e30248137f22506402d2c8cb5c7c7f04d9e1b220616e9c70a65418a7255fab1b77798b17a4ff8263cabbd1ddb837de82632dbf71e3460b6da1f4463c02d4ad9a55ac5abcab1bb3558ccfc9f150c262392bca75885c5d0873c9a1e54258cb16f68b4146e4f918847db0624b2689d86a4b5ab6b01f84a203f601b3f6c9d28e67167f3227161e95be5a4f9e306b267da49473ba353f9d26544a29c917f7f99c08f40bc2206c769f6f23f9f2ee94fba77b7a887650c641f5146e8809c605a6f8a884ec15a64d4d32453322800000008314002020140c890422915038201565d53e14800b91b4486a4a9948c32089610a196308218400100101100092d1a6016faa6b8a7620e9f0bd8ca4a81f571403ae30062215f1c5f602411bccdf59c9ca1329869d6216a7a0929747331b86a1e7aef3f80a695265bb3c7494e0c0821b72fc59b88067e32a0c9f979632e9d2f3eab48f0747e25c2f24ed07fcbcb0f99e10170bd9bc046a1cf2cab52b36ebf32237c668cdaa9c9ccba4a1f6f0b42abac73c0f8fcb53b0614414eb6d5048eaf533da2ac678fd64babc761cc3b6f070a94f2116ce09c3d04075ec5b25261f3a2bc84148747b0774e7976c4425f947228ddaa29004e256e12b69f2d0794a480a271a555b9da951b1a335696078faa264868880e38b62a81c035404f473b1c49977a6b73b0e8b613267b909387ef763706ee527177fc10db878c4ca1b862fc41e173ca700e74956e25390ff8a22efce1a6dc3c04fbc70b06e102370732b0a7960ea0be7ee243e9b80f3ba410b3312e0ede65a626f90a093e05701f06422a5e0345766329371859169ab050ba05f5dc4ff177d74e1a96c87eb23e5f52549fe1e7dc8e6dc0d375b66d2b0c5a4329e98e25fbd92078bb8dd2e7d424c51071fbbcf0480303311dfb596a2075b77be97cf777c5416b29a78233cacdf506c479e9998e20d07d51d8a6fc8ead314634fa04be7cd12fc4e48c7e2664909449f052f80bfa594963696f2cf4c04fbb2bc2b8cefcd712826e8f4fa5d19b55c4222c213097dae6e637214ba1c1c1d0ca565393bac8492af087d29fcd06e69d33404bf1d28cd586444d77fb56bd34d090230472e939497e8e67a0ec136c7f4be3fa63cb23521b1159e09162ac0738b09b62fcf60cbf183f1d12c40049b7f3291fa19496a06a4ad9f294a743236571f8568e86f2d3e283f6f91e35642a9c9c6a3fa7b8da91af816be33873bd0807e957c3ebbbe77662e29d0643782f22a399524a443898d9b7d9ae4f1d311764628fc9fa2f8d365cbb5596c8f95a429fe6cf2d2810f1172e359974eb15b8030e54c0c99e152e1da851e028232b7f11a2ce9abfd0e78f62f418e4144ff3ee4b80323447e016a411a715593fb3ca83b58221a81805702dda96840b63948bd0358beb53a0969011d04cb9abc4663bf4ec2419e2204a08304d41d612e4f51c67573c977ba1cf6a94c872a21b3f62cbb17ee467f036de264c2bfbdf6831f53da5a2fbd9a096ee52d40c385401fd02ac20e5b69a6feed42ccd840d26553a73d260835a7a034a2b4aee81ff67bf0984bfa3d176c750c42ff07e5abf8e41252ee9056eee65ec6840c382367d7503a8269c7ab65ae4494b60d9cb56a007990456e8bd82eada4220c3dff2c249c2e440d49dc201e66013364b252321acfb791c1a1049e4231079b4412cc73d6590df6f13a27e3c67fd12021242087dd1aa446136933263b5e91767a3a86213199885334bb70f58c8e854769dc3d5516c68ad7c000408afae89078e5d18c40e78c4c94c52b3b8ce6f778e3d457a10ff0a9d101e3ac221bca31a34818b182691c85a096c2dbdbc502445e68177a4844f1c8bf73d0413b152282f3ba53bc91d3bbc54e5104708619885ab0a1e5e1334a5be4b983f56abe3c1318f972a5bce7e71166be8020f9327c06d36b1dd692ef22ccb22d7ac93505515e3ef67680efe5e6d1549585db78bb89c1e817d816094e885aa9bc745769fe41c78d3ac0417b7e4cf49b4d8e26b80e5ca7d127283b403389915f00464c0ca5e7d096662df9542ec6510765fd8134ff13dd78ecbd72665b921fe383cbbead976f3329251806bf6596021fbe863fd4b4c643a95b44ccf076cffe25f53209ee246596e00634fb9495dfaceb9ee88ae68ce51a998020b217fff902864f6c350be7bac7f571f2c14c542ca41f22977010a28ceb107c5d1c227d684332ad2bd9f53cb63789591ab60b21f82efbb0b7fb9fba263ff80f04d48f51c25a194cb0371efdba614eae1bc385e8d1ce3c82ce7e5636eee9f97722c2ab72429ebbf29f642ec1cbcd242f57663910b3265c41ceea247379bd6288e03b74ec2be181845b52fb104539c10303d7bc3cf22be82749c7eee99b7e3dcebe03ef11390641a9f78e8d9aa10da0a027a3c554039d5136df0fbce6f605a0d583d1b3a33d3c456c75be1647afbf95955a332b2cdb612d4ce00ef3698775f480fca4758b233ddbdd3b37b6b625b5bebf861b3859ff5767198b5a5d829aac18207bd564a5836febd56748fc480a63931f25fdac4b6c249d140df6ec9de44bec31878f8e67e3295099aedc410268b594c567c7ddf551389b61d9d98e21069bd06886cac3cca2d8e9153bd755843fe82111ddbd6f87ae2f35feca6f0929526903bb385df0f2d601a32f85049e2ee97be6f99711addedd8b7d6c6f4526b3c5012117102793d804a30e4710d37195b11f4f7086dbdf41b5fb492a58d02351e4c03457de73a462b2edad15cf561fb17540428c4fb23930eed60edac248fd2285a97deeb4c7f838031982eaa308e449bdb00de93b9aee9829bb67ef471401f0370bccd107aedaed63f6c3638e6645c63f66686e862ac89b7cd03471997250f5a24ce8eab7adc4b2968a974f20a4e7986883dbf168a11c56093665a88ec7f8cdfffbbedc9c830ee8411cd405631fccf8f4114e53ad406c4ce83a515c9cb21619279950a45f025f99895ee086824218d73ebf88674a112e9ccf4b8c0dfc6cdd1c9821d173e3d2c366e48b4630848ea28ee9b6790fbba77003dbc23b42a6b1ea3341a06f998b2dc48b4cc47cd83c6a2d5319fe5fe0ba72c4c58e9c3e84f352003966fb90579fcf8f159c36137419bca58fcfae7e55570cbb9c0aafbe7ef8ff0f60327b5242e625b4c1bd772c898eb39936be06463ab6c9dbcbabeb692aa4b510f1cc0d4536bd04c00a11585c3736a073eede36596e0f8c0bdcaae591c6d811788cd0fc2b4661399ff574aef5b2d290cc138eae63cfc042299a03bfd6decd0d829f8bd52f0031353f0e320f5e38c83a190803188f29392faff251e3ed1a86de7389bb881108c208a8abb810571c861090acd96f57b2571f1c1da57e2820d6aca48d942d0937c57af2f694628f23d664e0bd2b91f1b5470e6a09c7c74ba5ef41f0a7a831601ebfe45d55cc039458372e18496f8e2284640d60f38002f9da5a9c35fc2d32ba93b3af2111c2c8c3942b04d36033b9d7bbada8c88411b9093f0f6b802f6d43a8c1b94a3abf7e7913c8708e6a15f681fbdadfbfe2dcae6dd63466464d70ec3f6d763f450b922c0f91bba12b005e4e0ec28ffe8e41f6b485ce528bb306fb8b946c4dea007ac77205019b4d99261ca2ce259a9071b6df68c584727a8f236ea3c72c0b62e2b2930008f2014a16e0885b5f351327592a53cd06462e7078bd2cf5812ae96a9e46c6102888bd5a9800500cd702fab2f290c0f0eecb6c502a0f528f5e1e14316aed4a1fd34d073d70d2a79bbbb66add279f4ec1d452827e2641f231deac2d900720083ee2963962bfe3e91595dae3c61431be56d4dd603753a3fbdd13d464cc80a030446dbe79995bde0c17000c380335215bed0971070eafc77a4803baab52672ca3e7d862b17f732118b1d3d9657e18f4cb0c695cf27ed19e5524b90fa0c950276c52ecf1d462d52daccd82d18999dee473db5242b96089df3de5840e8d3290443affda91acffb6b0fcf48d35ed1273e5fdb5e7119713b3bf3da16921110eb4d0b5a337de994e55a9c84ecadb146bc934295b17aa5f49fc353142aae938baf24224271c985c6c54d6adb88fd30bb1c57bec907e7d8bea2c2c742625531cea11d9175f798cb5e14f39d4be289768084be70f6707af813a273001ff2b6e70284f3e09792479d48ce3dac6b45f690fe4b2862ad31816dfbb9e49f4b0a97131ef5d2cb503f336838bab76c0a39c2f12ac1e4b0d7d3e8f00260d3a6a0fe07f97aed2871e43b6f56235a0843e0d3d366285b835e0a981366974ad643239349f46127d7c6eb5fcb306f6bd3f5f8a25fbde2e8a7da7fb8743a685fc3d34b63dea3d2bb6b0bd95a7bb16bdccd5ccf822b1864cbd0a7d698a5ba32e040622e0cedde4200d3c871625719e4ccb5dd3ed3d3ac5a0b1ba7db4d1492639716607cd544074394da6862091b3648315b880d5a15ec5c0d1fa0b423d18b3846cc1ad81b52ece2fa563dcf04e9a5a91d5f5a07cc83b07e7e31b03410ed8e6c8b4408c74a2af37500dd6981a359f90bfa30e8d301a40224401d9d5c0e8136be237c8a4efacae8668358f2dc86faa1e05113c57e344ce2f316d0df994cc5f8d18d5dc4f44cea3292409c513d77c2a31efb3b0fe9e5fb9c77edc1fea88d2dd26ac45da4696b6a1f2e984b7e026406f74d4826cc0ef60e8a8d92d7e079bfd5284ab48fe2418d7959e0eab6134b9f9594c12cf953b9edcfccfd4dc23bc276ce407aa1ab48efe3cd97644c5396103d7f230580b3e7fb181dd0900e69ecab2c80796b5a4d132509188769255eb3aebdd8da20dbd674a1b79c5538bf969da10fada5fed4a0a7f397b33d0bbd6841f16d1c580c838a7f4660067d184b9f0290e96b58f0c8618c8149e161a193e638cd046a6e5aba7b8c2134546d3c9159251191db29c2d89405b3fb648f76437bb365b795d11672b3b297895e56eb90a5336b0e63d131f70d4b51a26deba393c4efb2631628de4c79fd12b2090ef63dabe4b51868a0d15b84ad5e92544b822fdbba3626197f36331e6b5898358edfe18349e50d6146b35341ebac807f44d6395ca1246b670eb803397ee344420bfa067b2ae84ac9f0f96b5dbd551ae4c47ebcb9a1b247834c26a2413818e838992e08718ad1947bdb79dde41e50d64589b776cbcf3d732877af1cc469b20ba7ccf0181649816776ec2c0b1a0d1767493333131b43fa2e6aa55ef60c01bc8b2d6f65a7506864b75c6d79d3faba154ff1619624aab7308508b48c8be03ca1392bbb7b132ad08763841566b14e32586e896cbfd6681ae2125f96d25ebb33177cec4667220b373f21e418ff76a0bcd069d5572ebbd51c1811f6c5e10f292848573522927fc13b940af68dfbbab221d0a412f8abe770b678b44359efae0c5f495e35d6111dd772360c81ddd2d70bdd8452098b78f04a880d08b601f1d2c5e7ec0d66883b024bd1bdf4b21d348c215a1c156711934c308e8b63d0a04ef5779bcb935937d318155c59d8706fa0710582ef87d81aaedeae9f56bb7ab8069801386ad367708cab454d79f4aa8f902353d59bc2f38530458ea7eb47d677eecc4d85d9ec67a1bfe953521cf765610cf825e25948e94d578a36d081b132bd02fe4ae06871c15d16f3f82a3b7441eeb8c2ff5eece1bd55dfcdc9847fc01c7c27cc35dd8e10c8c24d23980a6814a00961ca9ec06ffe44215d2fa826451bbd7a3282216b385ac04693b78eb5c2091b02f072f83f7fe4a563ca9cce2d35719f0248bc7083c74604eeb3be999d6e0fa235f9bc574ef3bbe158a9e8625950e3bee03aa3cf7f2fe092bebcd041dfb5297fa3b9b4b27cb0b382704a69a03bd9745e7934f14572a6ce451e570f9847f84fb893c7dde992c121f6ace2cabd03a7ced99c0b5a08c0ac133654d5d97f80e9993eba1b4ead787e9f64e0078a253dff46fa4d1da65db52696b51158541c30568a7fe2ab793a1d74bb5cb6e5955a119014f6096105bf82f21833626cd1bd075f36213ccc142d8fbc44a36d77842edb9d676432a021c6bab0f300c2bdace1bb7d6809810762d6a2bb323151d296470f32b902e717ee1f0fda74077d401693faa03968adc4b00124d8dac7fcfab815185164c2eea4c03919c0a28877023be00d00f0d2acddfd452b4f93ed18ce332036a816ce603aa43367f6e3a42dd18df545a76cbaab0ab455dc2cd2af6d947f21d0d1cf0aa05bfd17296fb4158107b0c4aac981b5bea6af263cc1c35f41c26e4dba7bba681f0312c411b4205ed262a04d57a4891480e9dc9649f9e9e9556061038d79a2b43216a9b50631bd74ea6614c45cb13a4469e241518f73f58b92c252e4520fd1278b48ee6955b9995388f4fb610a0108395e588d33c38098072f00579f2094dc4284cd942d8abb1b51c954346a37d0e853ea67289f013e51887033efd98c95b8827e91dd393fb82318c4a7907059eb0f5661d0acba17cce7b2d48538c9f15718946f148b8ac431a361a55b4c30eeabcd0efddc184754749a01b00b75e60db1692748245af4219587b11085b671e75948acbc306f48645ac06d84fb9feac6df7e18c91a0f83b5f972dd4bf5098826d6a67a292a267291d91ca8327ac6d3aedb37a5bdfc1e854f692f38ae965890433aca8586c6c231f6bbc9562f479974841fb67a8073a2580e2e9047b190879ff0445b4040839b699263530f1b40ee8f0f3d8d2c559eff35b25529b4284611d5f897afc95d2878bd13c92e0816283a7f4e82862bbecf201a9c41e54c46cc46eee1b82fda5bc5fc0d281313b8f3aca117df61a34d662127801ada71a03db26ff0e300c83c09209c6306202f341fd4546a9851ebdeee47ebb69b86010d712bd6782d18db7b4009707c099008593cd3b393741fa3806e87390d7725911e4e972a0dbf95ec762ef670905b1dd5de0b2342c886f6faec79caa2b5e1a1b37d2c57e42ee9cd4a82e12097f440b429082ce36bac019d1ca4dc1148b25b84cf4706cb43d115ebbc9152270873999ea46f08a3e21f82be19cab7a76e14cf9d3c516e23e5226a334d28a591bbb3130bc746595426e54f50b749d407e4460cd53a586634f587592064eb82ea52188db45bbe4edefe189a9a4cd014b5d07ceb1ff5a5cd7437ebddc0cddfd4a4e8806a5990dcf89490c39c7971985a926e81044d2d4376439717101dd5c65713c49c8ff3be3071af8f80f8b9d3e20893221614973cfde9c61cf15b9d55ef5292e65b290896fc2dc3e17317b4ef24c470f46a82f6695ad523f6179fadd543979a9c8ae4f49d9d98cb07f15009882fe95e816dcb2ec3025ed66617b305e6899bdc8f1d2a8aa193a08bd8556a39782f32180ef6bba31b69c1c13c1361ae3a6d85e1cbb727fe9bd2133f914df6c7f4277817b55e424754ddc4b4ddcd3acb5b0ddc0dd15e5b0794d2803ff3842cd21977eafaa186e35ae8918330e93e979428e7091c915c95a2e5fed9fcff9379e8ee0c60a54e248ab45bf02da63320fbe228930ff22c540dd042e3b52cc67bf3a7f3f3ce49079c703f1316afa3cc6c32fd95bbe8d07f829a2e0163727e614fc2f9fe71fd2286e4f809a1b7820246c8db6df8e99d38849b4526ca1a7312dee350ec90067c977f36329c4a2484bc18e30145e0d7c6b97c25904f53356a869221ce24430f93706cc2f23fa6584f1d3f3e100bd03d469ce0ef0c6932e2c9c4cd698d9770c47e70211eef60822520073258bceed2eae91814130e5c91c67eaea1c64b4f62d5f7506d08fd17641a787fbc9582ddaa40a033bf40376eca86ee866b39603cc69f879ea4e54750a0628973fa8d340494e61847db346f5040950ec2f1a96a76aeeecffe00b70525c285bf028f29af8f42c4f4a0b365eb12f8b7a4e2e8d8c6ba35a26b8e5aa8589e278d40fd7bc685c750b54e8a9805e07e97590541565c690ee14f7592e28d69065a43f85d81328a7b5c4a7df413a32c31f1a4c812f089dc6803665af58b5063f78bb8655a8c08c01978e01a816d6a526ba81f6bd2a40fa209f7fb9bdebaa18aa581dc66598371f7331915f5457dad719ada068f80d3cb2c1650dff0d5f5da32554e5d543cd505a14a10694cef22fc28b8eb0e067ccd348ebd284f4fc9311a3d634415b83aa3e1099be1ce6d79ebf450ffcdbf998ab8d7cf758eb5f893f7a8a86261053d42643d817d0af7e21b7ed5f0ace48a80918ff7f6d0e80eb72a85402ad958e1459d710b55eb6997b5913b7bb0c8617ebc75a33e45e4ec4369be4e04089f013051f251c60f1f0c7cdd584eb38fdc9310b4065d4add21551033dc839e24ec35b79cdf9f0737845c08971861752112f46bd234d77de4161249bf44912e9b75d61d023d434d8903f226a7dc4b66d70c3c789b0f87aafef7ac0942b48c2b51197fd2b33b1bb8d1328042a3f5976f13b4e04467e6972128dc6d15e820c0c7f78c6922a698c6be6639d16b1b813ea11cbf0589586e6fa05a77d0c0ce22f702252f8737d03f0683a780e556f2aabc55e181dc008634d31f11b9a6aac50f809c0129fefac76e50d9340bde1dee6ebcdd7f0f7245ce33aef8fac1a8f4600b68149c111b7970d648e85037975bc34501206a42b73bf92525e4009baad996596fc23d76080166fd2ddc2d96a46afd10db4c787ba3630960e6f73a8181b458ebb4189640172f63544e8c01b7998572103c4f6fac1ca9421f5649cd0fa4dc1cf7b29ea270334b90ced1b183679a314ec2be6b89c160aa4806a5ed5ff83e49fe5389209738ee878efd70b664bb2dc8a436e24071c005f3b70334871af051501b7462232073e81dcacc6ccf13f8a2fca50206289812a1571a0557da00e68a30281efaadc5627f05980a301988b11b1faac6b222460871a0dfb236062d862b01359dad68c63edae216fb5f7cfe939c787ffb8916bce15b902b644e8272c066240971512c55a2bce816c2abdea6bdfb30876262ce66304d055fe007cceb10e075b4232b771a2e240f80fc5cbce0f52d714550c06b29a6a5762f13a553df8b59eae3caec1c063a599a864912b8e4842c92100079a22efa63fe4f5c5e94410ec4bbcf960fb3760bc559279bf49412c448e7941d317d84a88bce59691054d9a88094870e2c4523ca3630fa19bc612e3c8d0f3662189939c15437070896594dff1228a5150cadc4f9fa2a580d46cb77f5235bd70069e93c3c29b2a521bff65214da4248df38dd1b134692e57b24a3e003718f5b7da76a9cb91d54cc748eae7812db16b12d4bc68b998283e3b9d77a59c1cb7f66dad1bfb0ccbe537045bf6f91ab4691cf14353ab6a4e0e7c6500701a354a9f5b1859649df8434ec563e20afa710aaee5f0c5eb962eb6b2ca669db410872a1abc9b16123e4fd21803bdfa29909b9eb5847b9366f7501faeb096d716b95490eb6656c60493d1e264d78688333bc1d73489c37d5e4e55ce8b2fb4c196c9472b901e510defbb5d7c16aa1d67a5d25142c443913c74a4d1682d9e7019843a2f3634b3168e9f13085fcf650eaebe66ba09926a05f812ff74446adbb89230fa8177207313cabad728f2e284f1ef5775b807d79e53dd3ea0ae384b2f097074591e8b2bc276100070813d4679183e7ab8e27a734cf423aa7197c63f6ffe21d8aa42938a472dc3f0929b1bfbec796c813ec7673c095c575afe6db280673cde55d64c1847e1e81be906361d666496772c51f7e66870d2b0d44137187413b752fe2abd4f09c01ca440fc087f4189821de3d558c62ab243ca8e03b9da45cb5937f2b3a03ff9e0ee03508c311b8885dad564ee64ebfc0607115370d19262d42c230869d500f3a2e175e950e2e9176e838564bbc8a4286024b9290418f01b4482490229e784d9a9b02a7c98b81d28ad573bffffcc5d5a49fef6a2fa382fbf4e44b399ffdc7efee8c8ea9ffab7c4817d6986fe24cc7bc8005b61b3ea0cf3afae936997f1414c2f2ea1a08ca75641537553c055c1ae9b8152d3704e7b20bc427661bc8d487951f3ac0f8164cd71920b39c5d1e96565c3c7ab597c018b3441f4274bf7ff8ffb29ccff63c30c214cc19e520857a1ec5c3ac5c309003b55b6b11959eeee801cb295a2eae6d342e85b7a58dc2455ce871e78e43cf69b873f2ce982aec731cc6903616950c739aeb13fa41d18822b87234cd4b12dfcff702584ff517dd4c14e70746314d6741fad718776af9377052ce9719ad25fe924f5a1f0e58ed9fd14088e38f67e465d26c45c9f93817588812710e2927521be8d6cb2776bd5c5ace57db527459015df502b644062d5ced0c1e07035ce7247b9cc87396591628d8f206f64099739654b3bbbe78545b67c54886163e2aee36f7ff15724fc6136f9755f8d403084c9c92fb0fabb019d36c0d6ce89d1b6092b0a270db9ecfbcd6c1abb8314781e45e76c455b3ecc7144aeefe18d3b5c06738d4b33935d10b51ae748aec09ab85d30f0f7c7d9d8500894dbdadf7a9ff28dfd99a2236d84a05080d16715a267f3c936f5f485c7ca2791075cdf1ee9903ab0257d850c5c4965fa115c4b04b168da02c24c3834a375b8ca45c3b0975ec1fc8fb6d36a34d5ab849ca68f249eae26b63de746125beb7ede8664805dc2a87505cae578ee2b01a4e8bca141b5cdf711551432384cadd4c731d1857d759db261a09793c5c6dc93ff3238e225a8b3d2dec835bfedb34c6f1fd3469ec30d0b5572409283537438f0b4922a561089145c567524b6b0aab7f1da389c26bc06aee72194749810ad9f1b24f93844b8fa6fb6df318c1cce100688c9e1005bf95f04fc61e370698d14de2d6f317d40d1edcaf430ce8c7f0df88adadbbdbe0f1bf8684395a05c3e5a803f7c8dbcb04c849ecd48d96661c58a9b74fb5476962b15dc42ddd63be2ec90113073201217de4be611b32d450b7d2e763402a51254a0013dbeab7fe3438264fe1a8ec9c196074f18afcd875c461d4a1951daf16302c0fd98b8011f76f47b3534cd0e3f7370d93a182e036d86ccc04b8315881d327e7bee8e4b8325b14a3ba6cb7870704761c79244f0e2c60eda2ce43792c6dd1e0a3ba67b8d3b4387c9d57c5a17a6ff6a5bf709433ca0a33c1ed249ed41655b38fae4377b484881b475e03c7a61b66b4db5bff6a1919aba14b4da2a907ea26bf26d27bc0e14dc277fe3337ccd2eaf904a2861323f44b717e3d1ed5fc7d12ae6bfee8040ec333792f4693462c2247f7b1426b38528f5d19e22820c099316457da383e20a9c59ee627b974e8b5229e2520de5859a5021e02d4e01d94fce8785682005b688d7dc71e54a68dfe98ed9a48b93d4de50dcdc084bb33f531057639363eb39aced2a811ea38b648ab257a9dca895c1afa309dc5315e0c1511e9b1f49fca34683d6347688ddb00cba1c2bf5dd09ebb69042ac94f3318a1c822a9d5f3cd2fc603c938a2aa3ce78449c4a04bf5581bc579f18957425a97049644e728cea7c203f59297697594c4032c399304f852167d0ca4c265626c5bf95e57e66ac8bcfae90b1e5350d86084e56177e25fa1c385f9059269078969d1844a510c1c7200e6507064ac9a5d9a23c9acd77e07c2b614fd9b41ea24120aefe13b0c6c24fa2a2a6ebf741e4035a87e28709cb9eed518d6c42656cb1b7d5aa1d76d3e3b33c0df81a76d38dea65f6cf5c107bd536a4e00ccb6059c67801ce2e6d2b05362f4352b6b57577bc9c1376236a65be0793bd39ee690ed63970fe821dfd64a5b244115b980486574767bef73fa15d4edfadc7ead82327e9d5f4b0d46aca482efff65d65e348787800f11ef37e181388f9aebb4c404ecba002603adfdfed6fbf90fc9cb4ae95f330bf045e803428f4776886b96311e4b6b317a28f8a0d85a78b286ed49a96943033ae9391fb3666d3cef1b42914a8372ac5b2bcb1149f845998626be32896eee9972bb09a2cfb5ea04a8e679ffa02f92930ebfce4e6c7f63157e96eb6d732600726ba5d8dae28a405ad729c3d3cdc7caf1aa946c1cde7dcca14040f41ddcd2f18ca54d7882a880b5d87e47b5a5501ff2107caacdaa570e88c888e54684b0067563a47c74c2d1b42d3e362200c19b36352f59f29b6cf3012b5d781115822d0869c8aa8ba219d95778d38ae03130129196e73508be46ca0fa110c5a3e51af3b14315741f925afa79506aa0f47b3224294efffbb7548fd20529115db2e83de5806dfb9f45d704655f2bd68bc829d545ddb64b961880d8c1f15c66655e94bbe20532977ec91b21fa21ae96ac848bec9afbb266bbce6d0e94ad08110d577113b1e02694f81328e9923d5abd7a8d2ef063564d0a67d6854f3894f7a013de1684f29c6fa183aff1122a0a362e95e49d0e28e20322cb38e407973adbb529fca22ce3f3ced1be4906d2c7676c8a097e907a5508066ab5c1b00ce1383cbcc9fa83a867ac8ec03af97bbe595f6cba633f42e10a95d6cd255cf26111ccf6ddf2f1a376e4ac1cd1a1e3db9e8cfa862722418ae193e159cdfb2dff7efdc2b06ff6144187f03e09c1b27de99665a56f22d38be0c8123eea99b554d74be8b5424f25dfd43d9850fc562ac7a89f4ce83759660107246cc83b4052f289c73ae1c0a74b0c075b684ae0190ffa63fc588389db3ac1a8932795942a61184ef8105153a7fb0c58587f3f7198bd3507d3ee2ce5771b70b7653cbacd4e06c8af011373581874a95daf4a95323c6efdf33eed0fe9b91911b6aad07c39133edbf02036a95add6c458e2042aa46a5e4a57e57440900f1379bb80400d603518779b78edf463644164606b8fe67ce6c65d15d2e954a9c3c4d942801fb5bc108163594ddfc554a0aadebe5afef4f1ec6467f7700f10488cd159ab002f5ca21ab71fa480256c7df4516f37899bdb6020f141ee498a4e87014b48b82728ccf2faa2fed360e036f616e08ded3b85f33d8655aadfaa7b11ff74dfe93bdee6eff8aaecb7104193f8bd42bcbe593ed0dd0c4260146e5ee04cb27d00a8f14d8686d87f22630cc9f660cd921ce783ed3cfffbc9553a9cf8c83320369084fee5a3cac8f95b730c2c96c9ba471f301bb947e53887b942524adcd6080e8988741c48ecee1ae86f07515ece3a0dc65ed43c5f44ce9cd37b15431c887e0b3a23027b4b60123f87b62a817d59b4908b238e4ebe09d1fdf64da4a659661d3b05fbcacb3fdf607d6e7edeae14501a7c403dce8ac7f331ee5dbe45f5691a2b443b676f268bd1c47557cfbee3bcdbda431df10d52a508003db7ff666721ea449899fe38ead1d77e2d60ecad80b79afce461372643c74a3d605723c699768073eb58c0ecae1531a39d6bebcc4bbdb059cc21a0637746e781710225dd734b5c0196ccd89f5b0e2bec409946ea666417c1263876c5cbd68e45f4a10bca010d3d3a843db56b8af38f61f40b978f365c84202e88ee51932cf2689ea1e45e47179c1460f55e3e067b9ef830db5a8040bb0e2a69cf4ce8300720ba75b6bbea944e6ab12ebea6af64d43f34878d1c889bcbaf79eb4f9881249c1d4e3c600c2fbb8be4cf8ba5afc0d489a42d7313e06b9e76232b816abed56643e6e9db253c154bbd70b6cf010354498d242f9b4f2df674016e682810cd48ab5541185f7d418f8667739812d902cc6d99fe1a95708d425ce0d1882d13daef2553808805f10e3ea0746bd67e8cb7ac6bec0e739c1a5372dda3b508fb79a697b1270ba639d61455aeb15b3361703c1dc313a4e5f7a56c5b97c96e407943223e6421ca441ca57486b93a5276bfed90e1d8b39a2c9cbd0005c53cbee63a44b871815d6a6ad1033ce611ca5382c1fc92127842b54d0c04d215c88014ecadbe98e4048b17f7605182e802c937f8e21e942bc03fefa57af30f353cf79d26c8d4ca28a52de8c00ac4427f651638ecc09c00628800474af86016d5c7a0dc476c670c6d2caafbe260baf5456907449fa4ec9fe660fb405e59823d1091360ec7d384ec01439be56c0b44e4a2dfd7b9fcd22e07462349eb543522b3313e65ae5e7856f0ac4d7056cd9aa8ea94f4b07cf8807931b2a2fadc1e667030f75b0115021a10e81acafdcae17d88e2315c3900450206f253515efe7e5beb914113c81a1b967b2b4cc8fcb5d85fbc237e232fa00d6dcf00f67269aaeececba9180a428e7f5c3de67c156d7fd1ec25c0552b478076a1a2a9cedd5320d1a831fe7048347dc61150c61112bbb9575d304b7e485f92f59600432545c385bc8300ca863b7b103c86d3d6392cebb57e085d40cbd45a1f8af8ff985b74f89a214c7832f813027f8ecbb90d93d35f1ae88a338d5c6084eacd847511e1d89670c4281a87a5da3def96a2c8aa61ff8c10cab0daa65af368a15479fbf8ed6e6caa8d1134647f1fe403d16182ded3f30f19d8cc47fa9495dbabe3bf036e6d57bed218d5b32148b97089f044a4e235ec24f2430fb342296b5512cc0986234a1ce24a05050dd1d5a7a01f3b817d132c506c20688cd653ff1317cc62e63c76d5a75d1251ee06fec2550ab67d4be856ad7af1555976bed21f18608279a068f88cc415811766889ec0c6c120f3a0fcdffd839609240795671f967c0628c395bc375c2b438c2fdce55ad3afd8ffe458186acca201150fc7615c30afd341d876a177a036e3ec2d6b4d951973c219525ed6c536901290b0ae659744ba2f5857c7798826f07f1b2d416e62e84b003c940733f93125bb9d649d29a7faa7619d4eec021acfa6c2e6fc4bf8cec195bc74255db4581bec9a0c1c055921889504e61707e9873239f355375bbadb1a6e84ca669ae469c3054a77e5319d7fbd9e2899e58288724938010dea511591f5907f044f4581a8711b0a0b154149e5328ea613a17588cec5b1e9402f1cc64ce461be4fdcda924fc795ba3f45e331a6114309b7a2937590bc12dca2354f8c6f87fc8a2834363fb4f5f60de0f9945917b1ae401b94a47085b41fd1680ab6477000856a954dac00c8d0a2655bff15ee6902291acd70498770991ccf02913ce0852001c1196c25ced4de7c1126d47dc8d13e82db73336a071d4b1e1d5d66d3dc957eadf7f561a3622641fb88d6934521da4f34d1ab6b2e085adeacf67d787183b2df05f149c0e2017832a06dfcca47a7d8ece411e44e0164049074391e4ade008fa34889c7dd77b22ed9cadb27682056c05f4578d2e6cb3db834791510651cf2b2740e0f3b3c81dadb88abd6f7065ba4cd132f635ed535020004da0847c14ec8d31cb0cbe505387ef16802191d0a4f191d6833f2f120a09e1244fb56bd21a30eb885a6bf77dce49a2c64697a912ee5579eb7d1415d01f2d506ca1b1ae5b5fb567d0e78f99a0297b7d3e97dbb6dc389ef72754c4095749b805515ff198d50dba03c3b35cc83828760d5159064d3848b9203c260c899df37610ae7b4f224e32540a742b85b432094e1613d1cc55332655400400776dd499aa480624f62a7c7eef3c3f218449fbd78b8cf62cf7b10ad2422825d9ae84171d66dbad1d5899f1e212dba24cd2e3d61ecfa09b7219cb074c1b146a9b8ca083c3380e8747d02c3a32e332f6684d6eff338c696caadf2d2e3fb7572894c748842ef864e30eb6ff37473708beeb2d5e89d09bbce2a832e4dc6419b8177dc227cdae8639bbe6faa82d6dc8044c26587556606acd44ce0512cd575c62ed93d6155e162154b089e0de6c8a5f4a068be10e1218af353a0a94323192e2d2a7fd7cebcbabe493f01b9caf2ede605c800b31ebc88e9fb652f10bdfc5a60f4068f15306e27739873a0bc24afaf8871904bb76cbafc096fb1e5e6efa3409506575bba22b9c151bd440e2dc41225b880c1baf6c85b280c68385c4610e3161ba75b927dc44e68eebc41b35e19ca467603fd5808a910c3486d63c02e85927be0fe0a50f0e7cd667fd59fb77bb85738816385828585fe718b8c7ac8af060d1fa4bbb2f8742d102487ae35cfee85e7d367b5d776a1c030f48037ee7ae81237727ca43886dfde8be401ee38c339a2e743b74a3d9c73051ca33134611e8fe0b644e0f1bc3d205ef487e09b33c729c703ab0b9e2677aaef4aec808c435ccb61725f51be40410712716e338b5fdd8e4d7f63019905c4eda5a82af88213493946e9902c81646c77661511297e7288ad60b6e4991ab0b842e6dad1d3edfc11c60db613eacc349ecaadbfb92a2c7cd3a25bf57492a01838ce6e847bccff6bbc6135bd65b9bc80fcc6be6e66a4f5109f5dd2df828e3e70422e21a1e9a55c3a834cd709fafb103184a8179037a15cef87338ce4947affaed48c3d7c1e60044b10a750122d1d569df2d13f40d3252f634f214c6ce4e301c7ed47162c880584477c931f291dfbbc8b140e8bfc04f74c53219e68038ea14114804d0ef12d17d222073a7e60695945d205e06cfda1c05e3f74ddf34712c5250dc231f17d9ad5a1d1f975b419a55e91811642412fb0808434d0c65faf808e039e9611c363794e5d7a0a26407f7319c4481071356408e09eb8e3bd57387500d90b225236c7f8c55f85932044aacb1117db5ddf3e46949e1e9502a84ffe19b172d657acfa8d809b47ef95d5e72b40c38bf78e3af9af98d2c1930db3edd44c70a8b79289cefc711d88b34d36442fe5d51f98f0a01becc7b487c710433bf27153eb616286ac115b4d14ac7014d0cd7173cc78a432197da7f79e161a36a2ddf5c737a08ef45b0094b2b1562dec0784aaae84007fbb6a71adfe0e210a016578018c2f99a3cf87123967a78899b7b5ae6d1be9da90f090f1b3f13e3b5ba3aa725f6c21c9fdd9203dbe07910db63181cb4e428a5ec27460a2ced12e3cbf6d2d91479e66832f9ed886d78ebe37d99c36cc18f4b78074cc2432ba98259d3756acfaa06a64403f8cfba4c56e7a9c31acb2c0ae35a28dde98e0fd65f0244614434725061280dd12004e64b144b275808af478aa9d925b273bef779033a451f38b584ef4c5a96468c4f38b39e3694f48574e467c664d5058e5b1d8d35a2128a9f482499a8aa19ea832d4ac39437dba9a6934c33ec56c2c6839a68e7e334d7af88ff7b2b0f826dc2b19ccbb1194c8eb3bebeede8509c8aed64d3bf74feba9e0a7d8c1ba91bd1683de376e10960e3919da1e17a49a4fc0d8bf3d0f855fb4d118b1ef0fafb8a1bb73a4a536d81acfdc9889ffb0284e36f820165bbb04f7bacfb2949ab0050fe62ba9550236bcdbbe27fc19f5c60f8dae2547bf8d0ffdaf275fbfc6095a7e7d18a81e1542c650cfeb61bb833ac754a70fe68ace1aa7febeaab17beffc94f1b0231ed900a479c257b81066cbec5ab971a5834f99a0753dc1dbfba10f90a5b44c40371af38acf2b777bca34e07fc7a7186f217f8183f0d976c9a563658870dcdf28b53509d16a025620c85b57b95a80647a5d6b9c85fbfc02825e428f30c01339342f2a0488053ed84819d01944a48035efc693db1548f3afdb53ae1bcd5d8cd8c96e1bf5f6fa879f5a566d2270b7c64000888d437cb92dc04292924ab26c0ad6dea0370898cb67020dc01373d80b524248e8bed39094790f1f75c206217a87668a952717af6a5ecd99dbf7f9efa611da8dc1d65efcfefeacddbdbb7c3104fe13cb48e113ddf6885632c314c0c4fe325f2d46a253beaa728a935748338dd74433944fa97fa5382ce93ed2127ac6ee8da30a96e075c371ebc3f3d21c2d4b018d99c22d778bdf7608dc4307cb2140ca8c181518003dc1bf18c0b90a8ff1df6a0d6fc4d0ab05861526f45d723a4953e0941b2fd76ac3fe3ddb162bd24ef8b0710de4fbdd83e99adb437ea877e667c656491bb88ba34c2364838069777eaeeca59314110de77909483b084ca8523cbfccc0ea74e195c201828f0447b86c788f86b383bf0b199c0e5c594374302215161c1db53068b467743a175e996478855380afbb07e6b100ec95ad3b169f2915de97de446bcb383af56c56f1bbb8f1e613f2beb71ea13ad5ff997f0213fbbca4778121702857f345b3184c33d6f9a2575fe87ae6f2609f0a854d859479f04c0d7cfa84a41796dbfdd1a25f9f7a2928140ea26f998c69f485cb5e21c4062e7c2e123049a065f1857f287561a44f9384b7ecf86786b7209c8625124a1c117a65d2fe837bccf1468758801a430aae966fa3894971b483635f9531e7786ebe9a99a8278ed8816ec2e5768e3f307b1cde815aa76d7e38db0bbdc8b7d545ad5b514f97420388d5e76ca1976393adf228780d4a2ecad947d74f88000b098e820d4f295686cbcf5ad3ef6380480776c030ba10b29031f8af068afaa4f3845f15bc674bd69f3dd3bb30b811f7435fe9e57e2982988127a504daef18a4147794abadd6363531a923e5c6c21c2dc56dfd2b965fde39337319269d3e8cd7dd1521f0855d805148cc051414080fe5271d56b4bd8ea17e5686d699b88f0dd2fcd397f109bd675996fb1a027941c6a7c955d429b10e4b5e75e5422ad623482011ce0184b53174c80a47c07c7f3f75983603154d1148071d1355de32c26a196906581a7a8a29e467c837dc319cd183b139268130e226975d6cabae299162a38ec4284e009ab11db4350d128614d4ae41aaa5900c9b08a43715bef54103b857df7f464524fad6f6de37ec7087f8a9dd862b15a179d38a7cbef2fc49d2bd3fec2589dd49a963cba30ca3e3ab64cded1e9a09710b5d01a1a4693516f76a1d7ca6fa85fca5fe0a61eb2327369ae9bf117b56738382cab16d1c0a495486159c421aa7cf26e27c242a9115c65b70c3436155a60f1327a0825159ee38a41f2a21a290bcc1a9f7276f967ec274a81d4a1f8accb72c11f35e2b7c3e9d347c81ea7be01bf7c53385a43a34c990526817ddefbaa500dd1a9537f9504bcb828dac05b93c67e812f243ba1479734b764eb92875bb634cafaaa38342a406d4a960f9aad17e5095fa398d6c3270290786ded4bf2b6d404a60aa5bdbaa17b55513521a3492dd0da5cd8a414a10e556e6a763679573d9d57010de0d30d3266a2816543cbd793e479b052d7193762c22cd432f1682b7596ad3f02b3929325c06275917d6e7379466f17c7b42a4ac28422913e1fd5f45de5b791d7a14594f193438100fb6ce741b094cd67cccf467f872a3101b5a2f0bf1d00aeaa82ccbbbc29f067743a563710e1efc2d757005a31e68e55f3bf0630f83dd9b03f05f27549efa550010194ee02f20abb19502bf4e9072a7ed77dc21018bca978679348847a7a4433e60cc0f0251798eccc5f8b2d12edc5bd71d50c67d2071d1c18d313d2a3af6f0d3e356392037bcc68f90a7fe13badbce0e5c8fe587214971cdff97e20ae0d480cb346162c698dca3b66886626db401490ec943888459bce91c7884d7f55d8c1be2231a8ec735e35b70d505aa14ed7385fe3bd3b9f7404414b437b305f4a8191f2c231566b0014a1a06c888d5636b4e04b900961022fd8063af528255554ac619f8302e08fcf32e2c0484f1ef2579f6128e5dbffc0120e4e394ae05ce4ba99ee8b9ea060a114a17d805a89bfd1dae6735b4a9966575c2386567494202d8a0c98178f11461b14b25c31e6f7f6ac598b9d03e5b9690e0b9cbdc70f1e9b7c540522644a654ee0d86916ce7d27e61bf4d8062d384df4e63b3d57de153e6cbff042a1a753124036c98260f222365b5b6c0631a433b3b4941900063c1606a76281a05743757d43347b87e1e798865630d7c9f468bc359e171f62a836c10cd190dd6c2a05bdf94422d48b021c656320665e1eeea77a2177a7b1f89e70a8b835b3a91a6ace81c2b5c9651ff2c9463f3f5c1c2685fcc7a61b8ecc20883b142c4d896ad29099c48653d623be07ce01f9041aa6d80c5fb990470eadf37dd752d0753b586a9a017b483229e3de1493ea591b3180e8fb56cc46d0f1edd273472be18ec108b7a9f73dd0dcfe413500a136c0fe3c2ba1a01ec8b4de4625f84fe969d1179d2e0e7d029f50de8ba07aee0b35e69f866dd4f3e5e0d18aefff17bec650df8499cbcf60817e472c4677d2d3d614669adf73af81a4f07e351c6814b0bc51df26a11f6ef299dcf6573729335508ee40016b7ab15281a20d70dd7bdc4db81cfd4d4e03ea3548414f2cbbf010bcd47295cdcb686960e521788001575b72bad70e5909ff186d086f8d292be9b2238c2944645dff672eeec33d4e1c1f838ee2f87c1aa188f086615cd89617dbb23d9e7a4af8fde6dc4807097305f5f0e5c602d5e940fd8925fdcc049b9538801bcba3e6465e186c0353d18de4739731978e58c72e7b40b10de8242f47849809d36e53e8f0f1d3041d005e9301b14c491eae7204ee98084380f32442e0f31010b301ae39394b12b5fca90780ce43e11d3d998030c06c9213615534abbe00e5c0a822f4f5afa584895cec482a2b2d68570769fd411127e82107cb1b9816210db78234a88d877e36b76721c0e08f13f1cf2f6a079d35b1d7007fefb49ef25b90824f89c72382924243304fc833146bfca7d48ae1daf2d3ecb276d6680d14736fc163bea9e815594de19cbbbd4a5b235f54a69d3d250f292bd382b63b84339fd36077009dcf979a2309c534e6b03d7a11094adf7291c4f9bf3dad4dcdcb4384feedb20efe39edfc39388984925fbace39e2cef5d23a489776b250e632c268861b50ea5dc8b1b48b05f05c38031dbf3805862995268fd17aa29f18f8d2e0c5e6d948763bba57d38620903c73e4e8d55479eeb95b103d2184a37ea06b8c1d009f870bf124a22d9f3d700dd84483288f157e3c3305066c4eb8a3ceb4110302b8710ecbb14673f408312530c72aba142c839d4b58fecb4a8c25b98b44ebf453d93605584ef9a44e39aff035849486b2ad23b3d1ae66c6806047ceda18f68b9719997ff71624a1e3d492e6e80794506e5781f4bbcd8b031f4876e93a9f6547f577d1913ba474b1a0cb63bf11f55ffb4295b892002395e3791ea8b575f77d6c3245843a542877a181dae1c3520f3b833a4b30087a1346d781ac995c21448c79482d6592904b97d9bb417c5b4b02b356d24cd58fe0032305f515ba4aafc1264756ccd92a1854e49c5759e254e87662e40f3b5d17ad5c66f13930aa5e0f831578747cf4c80afaeaa2c8ba4dc00d491b52d82d40a069a0e06f855dc9587d0daa6fe87c7afa0088fa30d823eb9234547a81ed634106dcea7e367927920770bf90c7333e9ee21c9157c08f189e701c8d064d2aaed357c20868cd5dc1be51a60f10bb17b1d162ae326cf392809621420ea1526b57bcd2383bb04e35e0e212513a258829565b129cde696ecf4f05c6b857b725d1e8c191454539a48950e3d3616f7896f95aae532b83f8b8de8ac7018a312cd23640a18b25796d07890419051cc5e2c3671251d226ae38aa2c2707f461234660544d2ee470d84dfede94cdf393383bb126fdcbd69c5e33dc832415b06831a00f8e8fdef8cb152d0589bc6fc12852815207602e1d5e309a8073a5c599c05c8d4f564501f30c26471a48edb45dbc3a989ec7ea8ab685239808cf013b4e01e0963c24c0e8ff8bb25ecf2ad3d13788002103ba0ffe180cb77af484493f7be762c573c815e20c9b8768f4092398f42fe0b67f51af70a225583f4aa50301c91339c40fc30df08edf711869f036e1821d6817286d788b43d0bec3db41621b1c42e98c1ce5b3430bea80c7a6284a6472a4f5f3e6fc36567789aff4f83cdbd1719e574e14d9cc4c73bf1c058c90e281ad6da524b94edfbe9d77e14ddfaab3f52c1453d6d88b0d9fa21730ee03319f84636bd637353df4e0a6541a9fdb190becdcdd119c8127e4bc566c0d960407ae65c7a32894869048294202e09526483bf87e9272722ca006a0d3efa3e35573c9c99bbc38913fc3a963a61061028901d3b3ae1191af8286914670280ab49ce068ca950961a173bcbe38a322c52c62ed1a045edd1997814a66bc87cc01044a005f49c06b1cd0058b8e2792918bd2f167ad7b5566072c30213fbbe8ffb4aa1005055681c2f40061e44aa7851673e64213242b56dfd42c4e9f759fa646071a3054e1931f7a68ff3a27789ed6702c46352c82b0dfa0db5a94bb5cee36f7767b50928453eebac15547102517fb0835911ad07f0b1f50345273a4ec55d33919a68224a42a19514e109602d62db8610fd16d42345bcc7b4633588f8ba886f25aa062cadce6aaa670e862f992ba40064d6f740835bfb05d246184bd24baa38a1ba487618579ccca2a32a08f84334e3e6feea94348d572f4ca3228260ccfc74c4262e09aefade0cc3933b03db38ce268338cdcc7747f3e80929d1e149ce8d2feb8720b26c8709d64e3193cfe557b9bdeafe41179c0f5007a84dba6f4ddfa2c7ec50ecd9cf01aa0e7af14cd55fa8f2808d06fc4e50069a2823383816834e82b7a9c942f45088c416fdfc2b679bcef20707f81cf8aa080ce6d9c49c34321bc125a38d6eeae6f372ff82b8f412d3b51069a5a3d290e747a7c5516ce7a798b2fa22a14f7bd1843935805a1db92d393ef866c59216ab8489e7c6bb53b5976ef27b9f908ea6ad0187d796f6d35e74ff5760060673742c3008ce7d61b128181af3e30646d5527978a672952d3fd2056d2edfeddea58bc17705800be99a5ecb4dc7ad3c9db51397d05a1dcfe72ca6f6b2de544551c4be350180146c6e127d66969e3052b70e6f773346b8a1eaac23c23b49da859566a7476056c4f5311e30d09a615d06cf3877277ca88d2752c5e14a410ece8be1a2162007f417a4e67c825ccbcd50d5f4973887bc420a2232cca974b44c04dfb590b2a3160aa48d628d7e0dfced9975c6bb5a23ac9b1fc8ea4f99752c5695f4a52d9452876ddfba9294e510ce50ea155b01485716037ed14ea83df3911ecff47eae95077b87491af742fb3af1e7dd00e3b1afd6e37a710d4e4efc9614e84d0f3ee1d810d446f9d03c526eca27c6814659ebb7bce8a132e54001e8dc38ee92dabf0d3a946d37bfb1e4c31a1d47cb2151c9c7b0ffc3e33a8a78c6ff70001ef1511e11a75102358692eb042bd984d823caa0171a9ff56384a1678f186bd5b272861a66b4b4a60bb847cd824703143978a5814c0be40bc43d219bd5085591878e45cb45e9ce3937bb72bbeb7868b629f2d21c2c82db91aa26b00081f6e1fceac90bba5cb232cee57a7ba42f4876b961871ef3a1b25df476308e4a24a4e398682c53500fc692ac5fbc345661d12f0acb2ea2d1a24b3d0dd386437f97d0d587e0d53f8a72ce185db5154ff8b90f4cba82190a9b21ce0946f21d5a7f505cd4699b09b0b2e9c7fd60be85398076c04268fcefac8d79ce5262d0b86907566da5c6571ec9cb7a218bba2c2d51b7494b7b108c133cedc7387e94452439b20e26d8c57f92ce180fdfd165daa1f6afe6dfc41462d11c36fba4e48d32f788d891029099ad24e2e960c133db3dd66022ea2cf5814eeda3b287ca0ce391264a1dcf7724493387eb6ce863ddf496307f7047025ceaa8649b1d199c5b346408bd9267256b232cbf87d3a4d9ce62377dd7e7738f359f0da97040e050978a1ca902a76d018537a771492278e821a9d783dfa4d9f8e8112987f9d197a005969bf52045bd3e8cb941aa995c60681e8f3383195a78ebd9584223f557a10bbe9ade4ae02f3be56b0ac80801f6a313f5546a6290e5dfa88f988fab2984d12615c66434851ef04b6cbc566fc0afcf59672fccb53a63d694c8e9aa561db7cbd469dc24e3ed3e2ca9a43f2cd1dcbebe34455fed2aa228a3501752fa2e663161675e9bafe395cac3041c83daf89d9af305749f732d85b8a91d242f4feea133846810cb6980c79c37ee3ffa693270eca3dcdd967c226c49aeb6731929b463bb42fa60872f687b9efe050a56e2fd0b3035b0b8e394fa21e6f9ff52e33e707f83b7c7d22155e3d17d7841fd7ba22f77d335bdf9bc88e61c3fbc75b5de87910a003d9218ebd6a5d0cb3173dbcbe406db0fe755d64b117847e6835116123ad1e7fe52593e2db5e39468741b242673def1551fa3d31d0d545f4cd353012f4587e82412187da8c0d9664c662c13b0c378e81bb3f9e0699179851a69f46897d90f91943951388b866355236cb3b440fad5c417240c920fec7b49ec097e293cc149fa3a8f1a1d5d49789987a97fa308b03fdeca6fd28ff206d79231b13d4e9601c51e50b2e815d6ed4eab97d0b8f9946b986a4e71338583a45942ae052c8eefc8345fe2148e8b1437894c78d3c4791fb1e217e9d204aaec5ff029594c5546029dc0265507b3afa06bcc71603973528c736013b1f7b6e8a8aa1f0b770947a1316582ca1b05b8f93e072f3ff1566f7aada51819e74e42b2518d1b2b753dd4b847d72e66b84f80a7cc774624f18405553b4b78b4724cac2491697967b5f9b8f977d59d09c0e29d9844a660661e69b339c50d0d873b3361ddf93a1e4b4b674be8b686dbca03000b6ce66893dbaca160cb10dcfc22cfab07c28ba9b9e271ebfdf9fcdef60bf9f1a28daa5a1b08a86be9ac87a4773ad68b7398e31932056cfac6b260d2bb444a2ed8e6f4965dda2bc21d34c5d5fe7673af2a8a89cfc646e9883139d008259fe71a57662ccdd7e31d15a12abfaccb314982d15c095fb3a796404a0c5dd17519c35f6331f11bd3b345d80b17ab6b035bbab4760678c83e7124df36f44cd7938ca804b7563df18f6b7e0570645d1abe3d472d0594fd8dbdc29dd61cf8594415d1f380bc1e61dfadbd6e377438bba450ff00df0e7f52af871a3bcb155cdcffe49ca22ab2faefd7dbf0733719cc3cc5ee6703fcb19aac0835a3ac4f8f314a4b0240ec723865fe7a04b1798e2c3efc4894b76379f74ac77b852c4ed48bc44aba2e378fef5334cdc8bb772caf011c0ab3856547ad88156e60f58d45f260147ba39a3418c71c444283579b188d16cbef328214567f05f30a238dc672856f4ba0c1be0add96613ef0fee32fc5412885671962b3470035bfb3162827d26994a3bcade1b44c067c90071c67654e554bdb5d9a7f1be6cbe7f5043ddf983c4c38b04a56d0e9a1a5a9fbc64201eb1188a7d5d55ec6c3e9597690277605326beb67a36ddbda9e0d136973b1c7cd5d5c35890c42def50bb9513c353a446b934da58e401fbefd0974ed7342ad3954410488c345d135754145daa2087b5bfb9c0da9c6360c73dd3407a16f505ddf2e4a4f0377a820efa64e85c712830a284ff830d7800a2a5cfd922a6993271c8ac998f5f7d13f0b6728eb7ec913ce1092ae7207cd905f31daa9c1fb46535338629943b71b0a91bcab7369829ed513bf91382193dd55b1e32a910cc713f4d68a0f27bf1d6b2b9ea05fec7b0470e451567dc09dd06abad4129ea0eaf6a3948f04fc6042aa3a694a6101cfd02c839b0727365bbfe6b4bbe48ba27edde91087c11b21230e97b06fb136422719a3dea446deb3679a891a9d3f539f57ed71ae7a7a413ccefdab0ac098385398d0e2cb21efacc78b2f2fccd681f43647c616bd72a48c4df482823b0d26d9c96cb1a57ba9162fd1238a15217907a4df40bd893aa4196e3c69c4e07344328bd36a0ffda79fb19ef599ed6e649466a0021694e32c8799acae42f9da8a02ea247aed7100140f50a14cdac9ee0aa428aa96372d83bf0c828afd3ec7f2827a0bc6e43d863a79b7a7a523c37beb9f792f5f1ce51f09b555ab64e87412289411d04dd54b82a89804892db4a24555278af556a9865524225b591a10f85cbb8a39b474070fca9703178565e1648c369b7f2f7addf4491f6aa99ecf61aa6c2cfff1d755de4afc85fa4d7aebe12e4cb9bb3afd5e1fb1230c0d2ac64ed68b75d2efb0158f879862ac46e2284a1fc383adeed47b904808283d82d00f1bc20a81e7a7a1d3fa2479e101415acf1704707dda70cfd442f612eebeb668f1113bf0ae49d46429fff9073da01543428c9555910e9c013e6a57a041f3c35348d9584f5e1c04e1cd04e693fdfba16cd19b7d0c1d183cf381fc1d0e7ce65818ac7f89d6c881b458d81786a0deef20dd8c4f4fb473c4838537dee765f017d03430644e216c54534f9105820c3109109ae9b3182f34a8a07823303507e0acd7abbb4710c4f079244ceca1e08f582010acb860a7290c8a49a42dcc1cb17938eba7b52ae1b4915b01460e6112a02da4ecb677bcf32b43f3883eded3526a8bf6d4d7ae8711ea3d5d71d16c74a6d5073610a42308fb8f396dfb3492f6e6ac10a596a7666d9c7ccd38c142131cf503caa44b0921bcc69d0946a4495b2d35f53005e5610961e6f8fc37a627b5c817131f2d5eca3548512f8d674e8db0f475c434c24165b6fbb0e0b582a6c391e71822f83f331b753bf0e3eb4c9a0de3cf7ad67fdc1156679dd5a00fa5446fc4b3d8198d0a20c5138e4d90d5ac663d40336f0bae48b0d5fd6866ba91f968a8f99815eb25a34f183e2e1a1740ad65da730b2540252e6d01115e9514b2f928e0b988356fffd806dfdebab83d2d1b87a10d9b28430f962b2df1942adf511a3e114903068eec9e660b1accc0dfb9718df6b11b151e9019ccd4d68575f26b62687a6b76349c182c6c44d4a228e624cf749fd1cb9f988e314b00323153f0839dded97d208a87444867ee308ba4113c6af5433f448550359df80a3aa31678bbe340c1e43bfd6df5844e51432d5529c5e379adcdfdc2478989020de9ac01911d5105ed2926ca976c4f084b8ec26c636b77c4e19202982ca060c43e20164f07ddd14f367eb200fc64d8c9eec1858c6e42728eb380366ca3114742b7f75dc7d711ca4180e2d3077e8eadac39a8fc452c955a9590c2950a870b0c204fe5c68ee6d6ec336c89196ab334733963f7590bc5664982569f4dd549a3fa0cf87674ccd424705ca9ef0093d21b5be2d65517bf8bf8484a8591a82c82ea36d1035e2b45d94388b71cbf734a820e40b52e7fe8aab566562afbcbd82a88afa1776da12f040a3d0c9db55bc441b5d2e81581beffa8af6bbb7e40d7a9667f07b79af8f9b917a09dae5092084b8dc409835b30644d112ee640a115c05b09a8b9ce802df87dace7d359d7ea07a0e1d9c626a6ad764c695f9d76ee5c582e8951e67b4474a744c652fa8397a09d11d32354259196508562a1e4f2e38125d11500dc4a26363895c2781a2209611bf243ce0e584b32c17ea0cf8174613174853d7e380cd5773aca06d440ea2d0941037a185f26b67be19b16be8692e8244e83a5dd420cbb8010cdb91198fc4636dded4fbcd273a33e76ecff3af0484292bc4cb629ad84d0dfca4b94b693bd9b5692f3499565ff9c830ca85db79ec6cbceba208a83b4de62fea542473b6023217403d3021dfb3dc53b1c01fd0465c5abee88e3e52e9b629049c160fe06cdf85256ff76b9c036f58727fea6dd984be2e69ec8fa7616aeb7d24233817b2f3635281eeb241256b5067911226686b72f4c07acafa1e8547c4294bc016fb7630d5160ba198af42bb186397d1714c3207cd542e750723bb555cfb437fbc5ade3ab25983961f103d0eafc8e4b6278e01ad9e64d4865cc06e10dca83fc8b85b59d9e49097f847e0645e262202bc911423aa55aacbfe4b2ccc8b940a801f5191d678a64f304c2cc76078fc51d8ebd1d20d07eb8c4e68a172357cb010882f3885ee1e43cae098548827332429092902ed15144ba91ae0e2d06cbcf262bce1e044887f4e04a92185e92c9e126741ce2b8b268eecd05e2661a7af5b66210d1262caf0351287bf73f2cc3a99fa00a7ada22c278b993a96d1b54acbd57118563667412794c0ec210d34d95a6a74266fa197b22e73a30435ea2125a8de7874a624c6e3cca98c4a8f6835db66c1f2858197eebaddd33902b3e5d6ccf18edb1c4c6d66dd1f12af4d39e6eb550c86ae32bc05b5320986210076701fce6e74133b44073aca81e88eca536996c9376c0ae4253303bceffb4becde61c2f7ba45581bf236dd68570dd858d93886228389f3e89e1d49d218f68cf96818ce1d9efbc2263c280d53d90d6bf02cb1df4350d0cadfcf5a295acb53b68b7446a040c824050c17d2b1f71d5612560f7179e298268698f1d01e78a58456947307fa8f8c3c4a56f60c1db57a08e4556ae7c8fcf0273eb5b8cfdccad1bec44f366e8150925c2ca73449396aa03c4057fbb653d05da367b40d6bf870f3d4d0eaf658ce6be94844ff2c90305dd7ad2db4583ffa7d8d4c40700aa21aaccba08c2f61722bdffde812232e71edba3644cefbc2f69eca07712d57ce89af5f5827c5bc20377deb4d658ab6c31850164f3e9b3faba0aa1c223f1032a73c68541da8772bebcb7ce8ac24892aec846e90cfcfdf06b9d07e90c3ee1ba79dd9a93dbd8f881d091e7b560c88bfe89017aa7d2e0fdb4f1249ef15efabadcde130a9d68fe171a471dc7a2b737f1ea5d5daf2aaf001e45ffdb5362a43356862b2a4d1a10151aca2ae9686f0842b69acafdce98377f47d59c4d52bac95674af11e4c05400eb110d4accc391ae1ab15186a4634a0924211ef7f93f85e3da9866c70cb7656ff0b05acfb85e41ada0f558149fd2a39f3d70c368c8497c2355c93df6ba99a472e090e2734420bfba1753d81c672241ab33f768d9ab5e28eadbaca766153d6b4a8c4567630d3f61bf0cad55b2db3f4c76b6d5e809d5424217c8a8a23126627d202e00e3b1e39f4927aa209e12061270219ba34c731c940f7272c14dc169977a8fed32dc70471f99a54cf95e15e96860e9ab7d2c4b0b765f23a133d85aa45b7224541ee8c05e45adae37c3c91a61bac38cd969ee5bcfcc5f7eecd15dab07f5d8c633c045d1467d55d286d48daf22bbea0770c74611c1921bb18d0dec15f6b66a2e52d0227d53a6a333e64aca0e24823283b2fa7499cc37443d2722818624fd928258b641121918550e2b7f638930e6edf98cdf067dd8415060d8c24bb0019af09acb82b82df76f775a40b444d7e96d0cab9ad50d71e128ac9295d5256d06f358f76af6cca95416903c5c601cade340f338540d22f360f3754142e1edf9b4441ad161300d22be04635f99387dc0dff6821ee695f497a31b940b9a1afef55503789de555483e29834bca211d2fa6bbc4a6af87c0e47e27d653ba95769715e67c3b6b359ead05d3ac6951787c25856cfc8cbf256bc3e757ab661f2bc5f38e03480162bced2709ea08fa135d8ee7a066e7100e68bb57f71f88ba70f8b12987a3f69446fb3f7493ab69b5b7a137f946ac5015547e440cfcf1b85254b1165b506cf6b7d07053c8b61112f2e92dc408006a018e35d3f97ea01e8a57a525a548613748de2e21612314647aa76b10fe1cf83ee660633d4838a2cae0e09b288d8e357e955191f3228ced11e4df56bc8c95e5214d5cc60db1caa8926cfb654c3324d941aecbbe56571aa131d4af77c8f186929dceb48a771006469d7995ff862d88c7706fe5c6462210011fe41c29844b3f7513d6bd08d4bd88bc3a3358a892b4632f7bb1d1d4e6af02dc7b886a73c56e65525dace84ebcdcf2d9c513715e88e0bd45da9908fc74f6c85ed5e3bd5d12df766120686845e24b44b3133c837882eeb212902000eb74ba2ba6321684279a684c7275f9cffa4defb12a62e994c671a447ea188eefdfac86571af729c3cecf9131c81f36bf2ed4e736959ed12b30a40137bd36fe5204bc6b2393263a5cbdbdf4e8e7f16da1245d82f800148d93cac780436fd9b34b87e6ba110cae933cf31eb2a0d4faa5c358df4b0ab0f9398d5f2002fd8c45d191e25458dc3c985706f81d172255f2724bebe4dc5cd839c56d7e25cc8ee0e0728a8ecd4fdf5127b8f9f117e4baec15f31d217397a0cd032011ee6d89c11938cefee6040746cc6a41cd09cc4dd379dccd89e37d7e43a75a6b6c6190b0c608d3b2a869b212ce1f743bcf1d0990f611078a95affee3117305174cd033cb15003e9f35a5c88cb245430e7d2a20e5186a16c53ec2c5451779ef8dbcf17c17c7ac9f3f10d436e0627c79468818ae60806a69024401af354b5efd98872c8e37b400cfb542105b1e35e0282d94a0ef4863daace153dc63cc8669f33e64d0571fa25fef7a9cd87309f324fc89b80012d7b8bab3368b72b502cf621f4b0d259be7aba5a8b378e82dcb0c27155e30b191921d20518ee926d8025ccca1ff366e3e0b1b605e5a7c3d6d506d005db22b128aabb647dbe20d1545c8aeb9be3e4186adbf348b3c5084db5559c20fc400bd0cb3fa2f3d859edb26dd0dcf697872097b7da71acd1fa098b64bf11a2330f17d9e2be9835506d6039d2881ecd006027e399067a052be5faa370607de13250cbe3f554fa5b99ea35535b4f9a90ac1d20c0c2c6911e094d5bcd3a04cce6f15d2f96adda4162ede956306e5b21be2c95737c2d65d3982079e221e0cfede1864e4c9d5e182618204ed4d8d7257802b1b13a7ed8c6188968401acb4e8a67ee0f81d9f646356f439008346d85e25ea70553e749866935876b9c95738442cc4dffe7f289db0864e626099ce71d4f001fc1ffc9b7ec6c525f3c0bdaa12118b008bf01cad65357ea3240d61fc14dfe59835e8e6290ddf0585071d13c40b1a5c2812622a0f9ecead4dc57910ba10e38b1de5485f5bad5fabe66ae4a5c41082f940323b4ef35f000861e16fd75e80a95a6564f55d77e19ee1d39381118f5ee6409adf44d0c0b881a1f03bff56bf012701c6d79b42cad5490f2a6945e693395612b99bb256bc0fd8da203a49d86dad40f17d615e353f185e0961cd494003007d15ffd47172bde0eae31e13d64cb057d4ae2601e02443a958317d3e2ed497a7349019307d6cb8549644cc96b3ac514b248ff98996743d9451301f008cb402e22c20df273a504174b3b272709a90c001e1784fee8e07c8e46e0728600e2d53bf4faa6c8512abe31cc8ff2f2aeca2df2d61c455bf6fe3402a42fbed5756c13b1781b862042ad2b0a1e4c5e25d33379b799ec9db1d6a78483089d9e7829f56780035bc5ea8999388103aec9b1d9f8d22c84624260eaaafe9b882dbfacc1c84cf022f508e30eb04a59fcd1fb5d9a0c2239abb5997d32b0c36d2e425b1f9312b1684b4cbde1add3c13109c5f215d9ca328d3cb1ad5dbdc30c6315977e5094cfb0c09e8c3ca4c5bd8f98044c9b3ce866bd9843ff5ffc973dcb5286cadc973d2344c14ff8b5309f50a5c3acde84367542577349b1b4b98aee10cfe36d10ed5e3b5740c974064d0ea0000a401198996ec835492355325d526b702673c1f94fb6ac5e103171a82e13a682598abbda02394a9070aa7ae34b7bfec186a38a257294ca6291dd388f45e19e722269a549d8917c6fbbafcc4b402fb8306231e84551c5812203b953f903ef9912a51a1ccc42529cad53b9235b01e1f5a3617122e2818f5f90a2a31175943e19676800a958b719b29222edb852567dba1419bc31f039c1bc02aad37489e8f4622df104bd186293be1ca25d66dcd7f3ba097ec12361988443ea18dc595fc4a413f12a116db3232031ce6165cabf2dde0dcbf65f42cb1781d06a371094951e176554085c3a7d54247da300a1e3689c8e6da86c932ba86b1dd3024f3b111adf196e926197464e509925d3278b6de471e9b84a05ae837ccf6c9012deccce3a1e5eb2bd1dc53f0d200d13add22f004bc354e0531997e0125d46866064dcb0a4e8ba09bf88166eaa404c327bd793754acd4662f1d883ee117b479f7dd43b703d79175f35d2f3bd676e2c02d7128f739f4dcb0156254183a228bf8f49052c9436a476b22caf40f54b3660d98d2b01de4f77e01377c1cc59053d16f477ae43150fc328b7d637525f3aaed7610610bbeb1b26ca71ce670d6ef9417c193cf55a71497eb1d1ce1ccabfb57109f2dbeaa4f0c79d26a0a0341824c583089b682ca29aa92d193f1bddfef1c631652d3497e68cffb499ad4b42fd7741e040ef5e34c55beeeb3451160a5e667760c45bb4bd194d2c89ae03a7b85f897a46bac3d2addc19953784256723b2962639a59c193fcd9a6165b2570939649dba3ea08cdc224cc11724b5bac11ed74a145c6704619728a89335c00063157d4e5f4dcf33e945938332d139fa7c8c5788cb64c8ade73ee0af1506347d576a1f1d64275e054be075a04ab28156a7f2b0299d935a3ab9e45e0a016709ccb67e38dfa0507216a6a0b1c78f10758908abe4ec24622737481b8fe6954ff9ffe51095ae4645742ae73e523703dfa6520615764757f4fea344c097097d9b3293d66a3ce1f383c6733cfd249d612d542c166c28113fdcf518a661f055934cf9d2496e6982f8d87525fc51f2dc62888bcb008511fb3fd48063ad593a9d08b931ec487d2cb777559038279cdd8c9d66ec921a0b775a52b2f2296bfdac9d44d7d16e312a6bd77c0d1ddca0a1eab719a237943336b2eab161d608b7feabf2b9a3f44a9cde632f18d49b8d68259a267b780bbba5d8a796c31e58482bdeaede20b92ee3bd3bb0fb0f97f02a3fb79b323aa86ea91992513fda9cf1633e8bdc755566106aa4594b12633bce5f3f61119fa68e447e0705f1e7c70aba7933e8da54ddd0c874391f8e7b79043f9d46389989905430fc8a180af11c61b5aab070787a28885d1838b88b9ff74d13a6784a4c2cfed7c9dd79a090a118f0831cd62ead26763a7847601cfb5f7bb062fcba3db4df7eeabd7a83a802147cde4d5bac08b39b29c134e218ab13d626942750e2b1479cff78749663c56005902dc89da66f1c2ec001c6fe6e8d2f6273e712ac779407b95fb5100c0bf678c6c0104805a0c6d261c031a43ee02d2b7b5d559fc228aa34d62dcf23e5a57b0a756ee84623238bad9a41aa5a0ae0e0185f46704884970ded9ec4fc06957ca1504e72dd71127ebee249ced4068e0296e883b1ac913e84ce18e2540ee98e5b7ff55b2b6beb8e33b9249a630a19292777ac13be45346db65fc20ee68bfccaf86c41d337b8192079a76801799b058c6f512e594b2c570b7c0780fd78be9a9e6616ff89c9a0b5bdf214ea5b7557e30a93eef754944b31123a2177bfea48a5a0ad58bd447057308733e5e3b3832e477f68c1138448d4fcb4eef0f31f4eb7e9326016748d2b91f62c8e882cb26172f8dc231417ef3e169620182c4948dd273680fd52b847cc19ea52224311bfacf6bee30ce6bd7a1a8b22cbbf2ca617e9ab25c61f5ed8426dd40d668af5641247e9dbc32462a01fe980070ff19d4e06c4e929673c283949dedbf2a1b4334063349756fc1162e83082b031835168f4b50817bd6bd901b28ecd3829cf24f6a2db2bcfb550a8262c083e1949498f7d4267dc7344d3db61e2e1593d59a0f2b0a55d0e5b2cb67186b7c2a0e761546f1cc21863f33dc3f70a5d0dfdf1ae53b038a33f9875fc3b7be12459f6f0ec3371139e6f5e4a66d56bc3ee13c8323ef0dc9c2473cde73e426ce7c634a1ca0b0c81d720e46088d7766566f4f8263d3a11c36ffff842020097408e6dc2e363c326f1f33a344720f837f5912e164abfae92f7c3dba3bf9bd5c1e3a603e8b283962b7cc108d0d8039e5f87ebe32b5eec4c85fa05420d578e7efe0e75bb82c1f5a72ed1c20064450720a017e25d3d8ee68b53f120aa002c49aabdacd60a0b898ed8736d22f67a9b46edccb5994c42ade31baedf51ed5a87ab3e1c56f93ef5c0b1486d567959d5ae2d3b2b4cbe3528dd349eec2c1295641f550357037a72ce07349b768a90cdf19c499c17674199be26216da8a1d60e074fb306511585cb47e7d22aa0051d2794406e2967afc7002e72b627d466327d3f31c6f82872392e3abb6c07240add01afaf56140150d996389dc83fae0bc7f088daf31bb181d758b9f1a2fb4d8bf785ff42729e5907f9a89420e280565c0198d6ea66d184b5a3fe845c1574278da0ccab3c8319bfc6c2bedaa5712ab4669de18b818823b1790b0adb0cf5e659ea94b4e6a72d13689ac34b0c853f74be72b586efb905c0a5c5b113763414f32ce5894a275e4bbd37999f1223863015fa0e570168eb0590641e8c651d7c5635e47e3e666612997969aa026ec50df6d8ff5fabd250ae52ec1fdcaa96aad3afb6a083ef0870308110b0aba0d5df41b603906cbf90d9f9851ce3314a4dc4fd46f0cb7b5f495503eec29ed350de8a805783b20d1abe6524732e3c3127bd6fcea53c5caee048f8f6c76276b72eb63857455eca87b65989d0fac318d8175d297106042b0a560ea6a61392ac4877e578442dcced1070ca1171f4aafefd4a0d72f6809da76c1678df33af08b794e445d1e9395cd4c1a2c2b7f825bdb0a148bffd16dd0f52613d563dd47161d8579f568083ad44642dda63252be16d973b77e7f4ac7ad63988ff83cc5237b25bb4fcd57a741a09046fc7bf7e7b78a9b649a4fb73295bccf50b00edbf7be96b5af9c2f9eb429f6125f6ad135595738d548132bd598cf5acf7409963e070a04c007de3a7f73ccb34631e1ce03686278da343e1bc654a017e0520274008ca6fdd816dcced3b47b6c16b831a122c14d8652793fe73e039110b354aaa5414513323883e1eb8da01795c74583cbf8f831536aa1d82e72e899edb15150516fb0ab07429ae6544d3e83db6c8792b471f06e1c5b77a1792940dc95cf0af73e156fc3222acbbd647d5441e720f4956cc09c3d8cbad4236becf144e8aa2f6b3b6dbd40ba5ea404cc8968fa7df0a6fa1923ceba1b02fd0cbce49346e9c669994a96be3710469401d0a433c7ad8c1e8456b54ce7eba9275ad561fe53f04bf554bd5401e48686e2815b4b6d0bd82035e9cf7143ad7c7356025d157186193dc49b16d0c82bacb10c11039056021fe8f53f74c7d04334bad1da914386edf891260afccc02e7a339371ddb2551b82809e2cdb884558eba178e8bdfdc0e5e2c022207067ac60bec32f21aec503de8d7dd2e8ee61596ad8737a89907ab763d023c74c5c40bcf880322cce3ac0cc4df55cc021aef05f707bc16778da2d2b10a35ead1e2a6fa85fb0d152b1970fb2147c40f70b6c1ed00f46de3f321c50cf1821c21a57089b760199f39bae48a1406b2be7748ed8a69f614514ca9163d0291f7f9b91cae4fd554674811f689e0acae72b993d60ef55832d7e1d9856e444097eb2993a5efa5cd7831206935566a35ab9f5ae3231b82442f70ac87f4c8b4adeb8ef5a5e7b69be28603208c2ce3a7ad4ff73d870ca051e5625297101ad80206e514e5131f7c9b26a89f968956ce9633dd2b0992af89ee371b8b0cc908eba2a5798f03116dbf006cb9c34be3a98a470b04ddb2958ff018a024014d709a9c4276467f7e188c2c91f75a9d24b3c527c91772fb0c7aee03356c1e1dee634db1f4cc6543898769ea2011508bec317077c45a7c565681d929a0b09da1cdb609f6f6f7210e2ac8bbc960ce66df2066b1a5822715a96f34892fbfb6bc215c3a8abf9fadad7a81ed4e381d164ee206b828060a9759ac47a2f41dc0be0a55417caa9ad458f77b7b0b83ded6a3dc622fd88b3dc9c0e2360aca51dbe85a170430d254a4b0f5c56dfc1093b54d218ba4136ed53bd97fd5ea1137320db57a7ea757004dbb2b285a58dc5d0b8c205446cd31db426e144159d6a94c3675fc31edddb1fbf4fc1a3793be11a49db5eaf37b497103cb314e250d0b4bd76c236c1d270d02efc4e815da2c0239f66b82915491a025c2192143552ac69b214da60320c7c200466be485ad62ed01808d322b713049d5b7be8d2ad2c59f96ce39375fb96514e143d3fa2c8fd61ace3a6fdf3b6f25e8aeb3f33aa1a20cecbbdf906461bff84acafe053818e27f45236052053bc70538caffcfb475d6498e353d7f5d93ad64361f306786637b057d286de4ce000ebc0cdf044d3a578fde60aa763ff6adf1bbeaaabff4d32da71472f73774aa65369ce9e1f45b2a00eb869ed54880027fe383f5d6e03e137733ae930c80bf4193d1bec3d984ec61604db762c4d2dc83bfd1175bd57629c745ef372a241e920f117a469018846e03ca584e7859309a554d07ba499e4b9e4bde43d843d823cebd160e7a6e033dc70f2ff3232d4b857552ad30f2c33224f602d2c0418d1d3c0c053bd8381033ab73f31d45e5ccbc4415ced5e20ee996a1a9abe3021bd2dade6d6def2d654a2905260796077b07432e23eade2145efb851d050bf9c1d394f23f98f4cfe784e9dda6c9ccd663dfb41ecd9f6cceacab2f45c92bc817459f8e56c26913a2cf8d0f596b671dca6692ce896b7e8a65da51c1c1b3874e4e8ecf0ac735cc75332f73ff74d41fb67dadd5fbf2c43373450dca49d82cb39e5c7cff100aac8ddd0d841280cddc559037f59fac52dbab9b12e1a0eaceb37668e60c042ed7d5f5f77a771578dbe5152745354c4b36ed1cd6948b72a2f7cb6b7b93af62852f7e987a174316cec31a4f27633ec0c263337d6e35c780c1db734dac5358eff964a1ca7392540959ffa2ae5afb4ebfbd24c8c9e5163734354e5efd02dae1e4b47c8f4423cecd5344c13f8e2d234ccefdce33870a5540257ba721dae06aa3450a5711fe0aa7c827ff88783d8876b003c84674c84475f669e61c9cc28fa4c513ce32ee953721c2719649d8f09ca434407d46eefbbd43042863e1cbe130f2728a0e2ce7c90bc982c41d939888194a0628a4f4e405dd41d7d94547167ace3f218d6a3113c6a3f03b97488f2ef1cf53ea3a6439a4ef33e1bf6b5ef865daeebb85d151b50df390b622fa840b78a238a7e91f08f53146ba532d3cf7533bcc0828a8be4a7b6985a241b3a3870469d22b59f759e7ecf8aa5f2328e481a7592c6209ac0a00c9f2114b33ba358327c863adcea33e433e32ae30823325b037fbf03b6866d999f6ae1c095a250289393479d98a050140c512a1d4acea329a9d5f30fff18a58eace7795e4a6aa512babcbc6462a0c4808a9e2bdc96e8a2768b0390eb795374ccb352bbdbf9a78786b93bb92ca53cf13abb3ca9bc3628eaa80ccea0dadff9aa16bca1ebf650bb4a3944c6760da08f3492465a76e7384a53bb9efaef6a6edc85fa7e1323688b8b547bec99b7fa5d5261783204ad40c35437b89e2658e394c5336fb178c8410a06ca5555a3a3c346fcc3fc6cf03ae4d3dc5d79a21dae3cfd9ee4eeba9fdcdd5d7eefa71a1c1b1bd3b5eb02edefa11ee2a3760fed54c0613df40345fdc2c4b9e44529fad18ecb25b33f77774f3911c7519a4ac9642cb63b1ce77289cc913a7ee4aee644dacbd2839efa7be8b990b6d8433329cb5e871b2b468734336a6c867a2808e50aa9542af52aa1cb8bcc4c0c9a1ae757dd70aad4240a2aa678741872a7525af0abbc94f39af1515b8b29a040620075a7d80150edbff9c19741d9433793ed70abf049529975aa5d81046c15a72be85766ee6fadabfb16c3da1a2832a0f6146b0217dc6d29f7b98652cbafc2889ecaacae526e9a0ca718865a5407650f9d69220e899dbbbb7227fb9c73ce39e764097e00a694526a4cecc6ccdd297beeb6812973354dab9d36a7e6227ff418ab48bb1cd09214a6180431e40874d61d8370828931081d4cd941a5310820b55fa59ba67e0c6204620925aac2dd57babb7b1032a5697777770fba5d9895d2fb88754df99395627d77773fa1db0f4003d1b9bc8915ddddbdbbbb3b981988f3c06b82735a4ed1bda69acfb55bfefc8f07c33ec5356c87fbc0cd37900b6e8751acc8a0eef30b16261cc1bab81f28112b60176c4c7f8a3ac7d1d06818d6e4cfc7d13039fee3252c0b1396c53f6c186ec286fec4b6fc9d9f50fdc595ea53547faf8aeaa6a16571d98c75e8838372dc2595722336e2e4c75a988bbb648d48c47175e66c3ce016c4f0f20caa3310507c26aaef6063e43bef70307f7e62d7dd85d0754ee2432dbd23715004ab273ec751caae65ef4dbfb19e5bbce7e47bd33445504d9c163f669a03614222096a69db9ee338cff3bcd2779d67da4a2cb19d5037d921b831c0992b50c9425981febab823cd8c74264023104488784148dd2b8cc8a49e6531c2b7e0165ec0152e5cbee8da4d4013be5dde6f6336a5c3e5941e4ba022c9091749fcd48d074a76aac80d5591ab5c48aaa2573707ae2446c4376b07fa01f99c53c5ba331e4655b2386767dad52aedb74e0ec67dc987ba3f592596102fd8a623840c6cfb1d09e3de41d187aa813514c6cd39b91777d419979cc339959501cacf95bf1b7f83560757b2886adfab5b552db8cb4245928fba5424c96a0a02ae38812109551471931ab0d730a71b5055becfe9625715bb83ed5556ae76ed9299bbe949824d817c4030b283145acc9331ece4ef064f4a2955376c554657599212ace1d5540dafaaf8b0b4679892c61c33289664699a683da7ff4c4b50754375961194080f20bf0f8ea3f27b359f5b4c614a7fa842274ce82aa8521d7491a199ac9de9907f091def16c18a172ba0a9d94da94dedb9962a0f0ed6086b2859ab512f5a556e29a5fc969ed62a3c781587ac0ea6a6047705fbbd05cf0909c7fd6c0f639deffe2954a0a257dbdddd5d05ce1e0e9c40431a121573cee90eaa64b8334be71774b364d6895bb417dd414f7b21046b9ae7350c57d744596b80758707e95e6fa41977568d46d2bc55ffe4d161bb3b337b1d76b760a02e7dfa6cd5e461d61a8d543570d6a933abf37e37c82c4c6a4045e9b517042a4acf63590187cd76a7594f0874fc01c90417c89c28225044507f6de2905503575ec521eb642c88a03f321663190b2263cc1e32995117788acc2832c3e666070fe0d8c09143878ef771a512e72f065f344ddb386e7317eebdff5edc22199891c3058aec136c6016f3c681aaad5ddd41716a1cc7719dc94b2e338acc282d8168a419696a6c6e6878a0860d1c3972bcaf3d1aee728e91b8257e47b3315a0caaa208813d08f5807aef1bece1f4df778db7ba6846872b1d7695db263b2554dcb187efc17bd4abf86d50ef7d7f2a062b807aef754081deeb7002bfe78f46367ea0ca03550caa6abcdf6af381ebadd2c3fab97e14d43228bef42f28b6364ffb6c701697bcfe6ee8ba3d77e5386f9f7eda9e3fced475a612172ecb8acb4843d43911e3da7c96528ac06532b81276d81cc733aca24ced9a09ee86ad6d35d7dc14a97059fa690f8a7384e3bd35e1f57abd6662d0d4d8ec40c3033836dcb940c5d4ab5fafd7f4c18c9a9850fa264f4d280a8542a150a892a9843a954ea8d3c9fb80a0b1092491e8c72650c947c39c909090909088461a8b2db7dc729fd7a15028d44cca4acea3316866d4d8dcccd9a953a4e8dc7d73747678d65d74818a5b7433e5cb8dfb8d165248a1024405084f4d9bdcbdcc53501499e2820600549c6955f7f907ddaa982c4167a84b7da0fda91cfafdbfaa648ce0081a1431210757fc60049f203c4189901596c8620998cb50975bfcbb9a9a52ffd40e1954018914c4b200c20b4a7638c1e3094e2802115a00510116c453fb3be6e598b957b0fdd518f716accf605f2fa1e6394636864f4a255607e9d047b7fa596b1f311fad695acfbc65ee62981b495274c44bda166e2559bb5c7c0fa186bc7822295ce4fd30525ea09aa85d28adbf8f8e8c7a825a6c1e26df0eeb6f1e0db3e3103cd539c892ce699dde61adbcd0047e875a0954694888b010477c88682fc387886b9afb10f129c23c9a471414f529cfc36595c687cabc96f59007b69023a8b847329613e17867da40eaa0e845b51f858d9cb07484449f2c97e908e908a1c0d36c2c42c5f043824a397724cf049d87123b5ccb64cfcef74c4990f68ec8f5a46918d65c73df39c209eaede7904d93410dc3a33364fa0499734e9f204184f0780d80177474d354b8d79e7fa5e4c28f5383c6d1ab69701afc39964bd3e034f8bf7a26464dcba39557dabd532b0d3377cc7622ec4aa7b1b9f180370da6820c727777777777778f716ce36c64d7498eb9cba65bed1f0ea76ab32cfda693176e6f81ff2c41bb2aae9113149c00519b9f8df97c06ebc2690752db99f0276aff0c2836a033a000a11f11245c03c72dfd5440d9a12287a202eab3d2b74a464e3d7dbf17691822958c9cfa7dbf171d51c9c8a9de03e0450e00208ecfc0ad92c0f5962ba12a15fd508aa0fd02eafde4131788fe73d2027afad2b3c9891154f49f0f09d40603eb6a30943a490228efe24f582ebebf1c50fea4937efa078965f2481e259155d699aca8e8c84cc890110c1af6c360ad548a60bcc9d32ee2b24e32c30bd1c3478c90644849bd9021f5220546bf0911ed360112f509922fc3274806d58eeb763f4950864feccba119c95dcd830291927ab76b9e55dda0b259bdea2db002436ff1efa8fb49502503f5925bc47f6e7110bc304979fee877cc92a00ea1183eb738ea65aa7b67dd788eea2a18cf2fee88557fca52c10075586fc1f8f5167dfa3040b1a6728b48531d85832b08d608c6cf34ea060c90fbbb01f5ce125daa3fb7f0772cb1a6be783779144b7c01d670a9292f03e54f5240cfe9d084d54baaf0a1d9109f1d116918b165b55f1556d6b2243d0b12555001154ab4e00710b1226240c59127c660851d1c85dc62005e80b724dc110319f018499105134934b1c48c07436259f408e171797552ce0e4f7fcf2a0a8b8d5848928ada9d1c41bbe78893fa07e59def48e9992c41b52aae91e691ef489074d11123b19222231310ed6802a37a62f2fdae53572a21aa0355cc47b5fdc77bf865f8f4b04f0f83327c8096652b1b358c4a02fc01190ef250064f8ca0fe3399092827a0338dc243ce704bbfa9c2b8a55f355b252069c1095668c1083a476400e9420f21533cc1840e0db7f4332b02dcd23f763c4042135a5861a4c50b66ac608b2a00912489279280992c414daab84664a86e70ad21024fb500b7784b7efca7df838a4882144d50628b297a7cd6e503133a496ac00229a4300558ff100761d9491c89e54b3aeca40e9b0a2a72ec43021539e6ee7bb404154015d788ff789003f9a0e21eb9f34e2ce6ee4122effc308fd43429dd9d9bc71da9932b951d7739c7d19de6113ba9f637c7ea9286c989c9e410aa93bee326d8d9f1d9d9e1c171d78c6df11b413a82a476524a8a92dfadf4686ae53ffe2383520d23039fd30512edd053b8954a0d43a48983d56ab55209575e5e33316866d8f02ec7cccb9de4dcb55aad7038d5d5b2f4a32c41c559f9ddb56dd3dc572b20cff3bc94d44a25747979c9c4f88d7167c95de79c0186cffb47b3752bbfe76d4d74bbcc7d92d5eb52faf2362cf5a14b2ab54209757790b644273bc2f123572927478e0e0f9e9e9db994ced174d11705ba1dda20e7106abf267e0c1327a8b84738ce134c35f7118e26eb5c261e4e150757b9326b6bb79a941ac72c1170d541a9699ab649d0ad5b55de9adb6b9c56e2346dd3c295d46645379badf7cc7d3616212a3a82e4280952126fcf7ab631dfbb9ab7ac75ed14dbeaef2a2a8a378edb64c318f61bb3ac1e62b5cc5b0d4bf54c1e15b913f938f35f7b41f03ccf4b49ad54429797974c0cae613fa857fd4d75c7208c50dd3966e629d9864d720ec7711c4d49bdca8acbcb6b862bb11ad675816eccacfd1c9700935d1958db7d03d78de3368de368b0cbbcbb724e29537ea8d4a42667b81d21ecde7ee997da2fcb92039ab2314cc3c6bc6c0c83fb375316151515dd6c2b60de6596725dea4ab8ea905342b146aafa83724a4d6a92775b020cee6408f59727432883333adcb60eaccbc79b8de1aa2b61ec5f222554517b7c6ff5a99e6440c55e52f43f7ef87b0e96d81bf8cca1f02afa8fda737b0c6e825e0283fdb471602fb9292a72130a783452648424099292a49ca939a31c41998aca0373b5450ea2f637605d2b96d918962fae152b4358fd60af2862a302ec6a4e4dd35eb236fe81889ce9b3fde41bc839cb2244451eb77bec91471fc72e19a15b15fef941c95084a8fc1d773928416f061485092a6e526bdfdbf65b2aa581cc03328f9d1ffef17ebbd7a1e4813d780f4236af1e5c96797874385f74d9e90d6ce047f70b336934ac1a6fcd2f71105087736320241a38de9afcc3411c93056949a238b9c149162759f8babb8d9c1d1e3003088af92ebf5eafd7ebf5f26e0895bb31ce2693f6f2f6f6f6165ff36d388cf73cea74c4867d32842e284b25e9a57474ab1f076b6bb8b12110c0c7daef51df89a5fa4ebf03e647acd7d2f7db28d5d02fb1c45d82b84637cbd27f7ad4378aa5b2418141182109e683cb6042fc3b601f4b150018c0bedf01ebd83bfd40fd4c53f0e5ad9ea1f11a1bd09312547429a49841dac8510495394acc271550395271915c8adaaf836be05a6d34cc8e5a1052fb71e4b09182042a9af4d486d97e80b6594b737e367026427433759ed799906c98d0806b6e76a081534347cece7bde7bef49f95e89f37840c5255263d0f887d3ddbdacffff17a29a990f9edd5d8a5e4504f85065862444502c168bc9840ccd8814213252644429a594d2918e74a4231de948696a6e68cc8e8664d45d34231d29e528a536a022e7e47020cd10e72dd98ee378645444e4ad20388e86064e4cb631dd6cd6617fc77262a72d28a54744315389524a29fdbcce898888726239b1582c168bc5828258b2942e9d794e779fd2dd3bc52c09b8500f236c51eb0fee97037384b617e2df4f02dbbf0744357f47ddb80e5b6e9243cfdb9ad845aad3797136e65b9f2bab73ce2054dcf13b82f66b3713a7b3517ad3db94dea44388eb5e8237b8a660d3f302dd401a3bf850fefef9367238e7a0c8260d7799c059026dccae5c371b600d25683f581776e3afd2e6bfbc3571e6db983c900022882f08c10a2638016ceea8c112582c91138314b8c008369fc65dfef3e7cbde5290da546aced4949365cf131dd0d7cab6f85f64523e41d7368edbb4f0f5e29ea0a8a6281b6ae68c5d6d3d6f8b44991d82d67edade775b18ce5164732d95be3f1cba9abeeb4ccf5f273f79faa4b421c36571995163638ac2e5e5351363468dcd0d8d65de654ddbed52b44de34eaebb52523a25c5048a300c432d5c09c3deacd0b98c4c0c9a193637343c805303c7e73933872e2afc38c83c00023245907119999c248c807c046d91cedd9d73bab952479525e0a9b2043caaf41b3e88a5a2da3a48ee494a8e3a5c89848950ea91c84891119224484a5c3bcb59673ef1b9a227000e6585b53578dcd2bf2fc3c2a478381edc0e97538186bd00b7236fa1e8d4fe9e6e7144703f20391087822de9e406947f6adadc0ed25eb01ae6ac6dc996c4da90503625956bd8c0b02dfd5b161bf66f62d8cd68086a032a3692051cd647443dd62de50454eccd48fe48a02f1644cae4901c22679248c36cb2c8d81175c8fc035471749d9b910ebba8c33e616dd5264b01d5595bc5104654ee3456d769ddcfd36bacd3a69d4c1f4c4e5837b89a988c2a4052c51e774cc192ca422741a8d823912174237257494849c84654fbc70be6c9279337a2ad484887bd1909a9fd9bd176b4216d492dc5a27c7f3bb130502c0c5381f2629f9c9c9ca4b8f813172927271d0485257612b5b68f93d661244cc446b8c8888f188995744e87b39655ee182876d06b1c4bb3944e51e2bcdb52ae94734a29bf205039e7a6cd297f2e0b6b61305aad562b9570e5e535138366868d274457ab020440002f2dab6eb96d52ae561b16af12babcc8ccc4d89936e7cbf9ad95ba322ccc6ed82fae5e5cbcb561ea87a022c7a5523ffe3f5c7179c9c4a0995173c3c3d3a137a787628202723c1f0e263c109fe7470af330100cb31cfabbf896400851fb4393a70fe3c5f7e7e01abaef27810eaea1f4fd3e700ddcf6fdfcc3c668dfffa2590f14b7a88695d9a409ea2f3ecba5f267a3a5600630179f000308c1e8eb7032eb7e3718a0024c07068e60305c180133791d5010a0b1d4fd26b048ea4add6f0228ee0075bf09b81044f5866fb18501ea7e13e02d4cd3bdeff3bc55fbcba16bf7fcdff77da70f75fa3e182c1c968d1cdcc26f6291805bf84b2c1ddcc2cfb17ce0969c65f96159f85db078c75b3cdcc3e21f9493ff19b7e3d49f17787278e3b8cd935ca9c4b93e0f94a5ee4f0a549449c9ccec98f254ca844bf20588914c26930d0d998d458c141d313a4ab9cbf42f936d0c6518b3ba9a580bdb365a8362cec9b8a27136248b05cd4622d94854d4dddddddddd0b339241b5654332998c37c9494e72dbb67d6fe0aec844441c1161d4cddf8c2052d7075a1ca99389d6c510dd9188581579684748e5dfba23732dec0448aac843ed92301e4f70647fbea8cd2a59b476f2c3e1c3615f33fd4c7355b2bcca1f0e267091401714b7efd74071fbf933fe1b37ab873c37771aa6c19e7120c73c22528aa0dde7414155ad6af006d7f71613a1a6a0a82b68f77408b4fb9327d00ebc118276274868b76da29aadd37b84a023425446c178c79da12cc0461428a97cb233371424a93a423bf2105285789890b7a0de205fbbc163a81f0b88888ad8888f7cf240aa224b1e477b2205baa30c64fc73a74fba4079c0412b43f1c4b6f08fa8ca43cb52c3876c903ac63ad987c6140ca9fc2f170b199ae9ddeeb7dbfcb51a3ec4393a3adca197bbd808dbe25f02bfdcb530e6d9900ef9bb1779a8a603df5b3bc30914e8feaab0a9690c18d5a1e0808aa9caed2e4e65c32596caa6a4837a8b0b60a25a984a07b007a33ac5054214473e30659c5432bedaffcdf407b6cfa1e7d6f503f255372c10a4e0d9af8110c591eaacaffe00e283ed7b2c950ea7e79e037bf0fea4d281eba1f4dc8d4da9fb1207f690df78de73a0ca86e34e60cb9699999999999999999999999999999999595d62355117b511ab8ff8e391fad04522712ee8284df1377f4a8729ca8129d6ae3c7f90a59221679539704e4ecd61a6b95311b47dc8c427d6838a1e549da0fd2631dafc2741504ea7baff506d1faa332d4fd0ad8a38916a9b8650dfe9a08df1e798ef80a1f3eceeee1fa9a23c0a32834083badf33d81ae6c82dad9280f681b1c7ed41157b4cc923eefbe758126751ed5f9007aee22c527b8e613f9bc030ecf107259a46667570163901a288fb4ec3fc9be137768beae02ecbb61a4bfba04d6ece6d913a66287f5659823a5f9475beefa8f3251207c5cceb246c4a0e1185dab59feba74e18028b7e174f0216fa6baca8fd34bc306b3f4ebf0d3792b343c3bae3103ba82775c721623c01d80214946842688788d811608d24c80b88f063488a16209155f0c81df4a852a999219c98dcc0c5c6ede08a05cca4fc8928204042d1d342c44f5c6ad4e942a73e1c75a05067dd51e748155d64534a398165d9e4b2703edf29b02c4b1343a6c37d7528facf39a74b87fb9b4a719cd339a49b99999931cdfc8c8d11015727b04f818d39bdff94daefbf646662d02ce8220b941ff57da5dafd9ec05d96eff70bbdc46dad4d955dffafe516461f28461fd9e85383d10706a34fcee8c38364ec515264ec3932f6ec60ecb9c1d81383b16767ecf9197b8c61ec91c5d8e3c8d8238994a8d9d0d0d0d08cc84864e488119223248a22a36258dbd4bdb802155f0c04b44041bbafd78cce249399a9618f93984c1bc32cfb3a94c9e4cd74d82dcfc9e1897912bf64925ecc4849491d6eed919483d3cf330f89150ce10a49f00811e90001e171451451e0a008ac41930913b47b93fc306c06551cf24ab38ffc3440af1935f37df6cbeffb69805eb5671e911317417dff8cd758fbd534f0a3582f4d03ff89e5d234f07bac95a6c1e5bdb38b61ad6659181a5931edec30acc7228c827cb8d8dcec40c303ed3d92b8bf572f62488f243d92f448d243490f0d6d8cb63128134a0e68f7a66e686826c30f2ae1cacb6b2606cd0c1bdf3d552e01f56c40470082602c4052c55595b091054778572b959597fd7ea5b2d2ffd2dab66973b5322a49010810204094f032bbac4b17e366633417d5e4aeeebd77d7347771578c6ef5a9c60842b9abfed9a043f79cb76eece8b12428891d295ee002200c0891c41652d0820f2890807d600fde9bbe337d0f9d8a3d968a410fd421c43aba8eb5ef057ad34fa31fa7df460c6d6aecd5fe6ca8d1f958db346ed334be31dabac3a26876dd8c9d605c100dda2124e548ca91a3b3c3d30314e423268351e2dca5818582dc36e9724ee91f6724860e72947e7d8bdc7cd117bddf74ef7d0e900359eb2b2f32447e6e1bb76d520e131052d3a477fa4e607b9e4913b4a58a9eb76d9e364d26cf0237867b0edc65e1beb449e97592ebf0e5e5fd9788c0bccbec7eaacc52827294b90e413a3a3a3a529294a3c383a77bfa27a89779b56a1321ea2fae561bd3a6ae3349a9795aa9b4da1877b1926e352769006c0d8cc5b6740c5f6159baf49d6cb531a7a325479447ed544fed19101f6d8c9fd85d35dbeaefa22522d2466aa73e19d0e909511321ca75a9e6b0800d6f7595650d637a3e5a967675906e3563b1456a91d72b010968b5582c19643031e12321ca5571f5015191677cb473b673b673a4221ff99bb88646b28123c79442dd6c30bdd4be0968efe2e26232994c9f673275a695dccb4be6e8a809734e4d9bf309bade9261c86118223941db36cdebbc6e6a1bc76d9bd779dde6dacfdfde9f9fdbb6adb4994adbc66d2b39ae0950f0b8df4badf855f8437e17fe17fe17bf4c0c6e963dd44db0124eed9935df4179c3a5fcc22ef36e4fe1884b5f31e5beb8d67579cc673646c66affcb0922c9fa58bf8b132dd91e19e2c8101bb34796a55fb24e152544c5d791e6e6e666dfaef059505050502c886c680891b1085191cc3499a697c27128949e80b3ee64089d3f7343633b4deb3ae9ed8ba9174397ea02f4963773937f1a86166818ea51ac192b28e72d9e99386ed99e73f74037e1bcaeebbaeef4759dd7994a2f2f9999a0a059a102a8d42c9a8962e9d48c00004010005315000020100805c321a16834a68aa2261f14800d6f964c6a4e9e0b845990e3380c638c3106110300010600638010110d39fe7a2a0e575f234915c57cd5f16029242ea1c0266707d16ca4087b2718fd52afce6c219cdddac2b17224c5da7fc5ebd392522b16edec6731125aeebc8b5dba64d8e1d8d047320d2a3cfe403a918421622fc16a5673ecd9ca368c9494d9cae58a7af692aaded8cc8994b1beaf7ffabfdf0cdf331686c7da88690b369d964d346f54b009fcfeee131a9743390fb8e3cbac79050602bcf41da6cc706d83fe891fba093753070e02339f69399c1f45e0605e89940eecd03abe1c7307ac35afb820ce0105cec51755c488d877bd57e31ec9c4f67f0ea7eed29704101023e9609c56975c76a67e1c694e4be7935a8b79043a449ca144a1f567aed41afc8698be8077099518df09208ef3033318afed2f410e3cdee35edb3e40457e24cf40ccc311d9dcebe3ed23e2da129fe690fb5715c85b5b1f246eebab53a2a12d269e078036a96ebac100774ef9483573d1ece0b4aef8e94d699044b9d43d63704d590b0a896cb7335fe2db683e366fbadc08c4e4072a3531ba73de877b2d0c1b663c00e842d72a6181c60e9a5bbf5257dd05933b521d9115eb008e5853a72899f40150183909c20e497ce55b146105ba31076344ac54f55705036bf8575c8c2451774df22c14db055ce957302ce723c1f98429c70f244e13ca8a944d92122779681cc72fa790dbf7e4e29df103736569b5f7e093987b3409a3dab8b9fbcbd250baf53843006a8d58c2aa1d7eae6067a2cd9f95899430c922e9021c377b856709ebf6e3f1e42da3894fff14e1b44398693c614e12fca9e8f719433a142f36dc0665a0ea1640ceee7f6aa2a583669770124a1baecce7db215257bd16d46a633d588d494fb2f7ae0f03c8da714931361ab4cf7a42f85ea1ca6d46c153a24bfd3dec6c414381988cf9c38b3c952aef4c3d5fc13e467b017a13d04661da9576ebf0a9186c7cc8927c9bf9d3d3996e65e0da8a22534b88917c4b416b46f5539cd880ccf3db83d766530c67eddf0fa18d7d0ce044c0ec87b2c4180d323bca5c507258fa030b4878e2291187591ed8a20c6dd5868ab2837aad6bf44c2461071514896952782df46b444f65e859eface6a32478ee2bf9a3cc616ababed0dbabbf65cf23a1dd6aa11128ea0727c707ea224748d37ca76a93e4fd0f898792f3305203d87699fcae53e1a16c0696b0dd1eab14bcc9f48eabab2ebe9ba646a3c78fbaee0e031e8c6e0bb2c412b9611e88969c0a2998812b4830f063fa65a300bf9d49ff5d35c414ae9001e45e7cefcce9302e2d408f801baa6a4dda27efd17ccec1b238a89833589f39e06bac860f0d92c359e793104c2d1a410dd9769b8dc5235b8d3242ea8825f61c1c20cd87fd356ccc0aa8d4da08949df58320e9b5e7836fecc812ea4140af9cd338c77093ad73ae79393e67694f68f644ba951d8183720a5ba2aac12f12aafc1118ac09ef1ef5b4add3a611f07bfcad00784fe4e800a5692eeae89c52cd969e17f1953325a1740e80bc731407e91be192fcc1daa743e1ab2317e2a27e09055de8552dc51ebbd08e29a4c17821af4f631f3700c8e25bf1b18fa82c70efd7c5c833fdca76d05e0449afa99949068a2e07a5485f4251a3010bfca0e86fa1d815b3d009aec92c8af31050c573a8b69bdd129aa113b2ac73dbebb2458f43fbe17ed6369c908e274c5aebdea3a1c097584509c3592767be737a47aa250c6f92eb984a8c0244eb844f20e0dca493569cf985e756e1c1c0dff738c251fb38f2fe597b594aa1945539539870f16fc6142e6ac97b34af3bf4819d1c1b21422abfa677c3ed90b1633f309aa0f21e3d54d783d9b9bd7b4bc01d297ac651bb57930e3ec13a0c4e340a14e335b3e1ae2e916a5c279cb77e382dd2786513368000894bce1d57a03b2e110e0cd57ba6944cfabbb249787fa0962f29893ad33e389b596b4cdcc8461ce651bcf645a5cf513021128833d7ad980c5f75fcad2c2414cc5247588945c2b92b10f8d2bdac0d0edb862eb162862958e82ffa19575b6d760fda483e56f309da401879da5fc863b22117329a8b276d594d09637a68aec7af4f410ef604db127a43d075a86a0cf62dc8601f0656fe5342f3bbe0a0b8bd0a766bb782bd226f4f9764a348dae379149f534775dbc323dfea029e0793c7ae85dc4e94ec5211c47f212eea683a5680551c1c294a7faaced11e415ee9bb825be89f6a81c2a8808407b5e8438dd291229f570a8d49053c9c4c33802d9e7b212088cdfc20fd534a1890008dad60502dba7102b600686a08408cad6072c09274f08086d86d44e5967a80fc9d602081c56c5d457de17d1f65d9068684c4cd012d0e736509cbb0a83d99fa5ab05e49ce32662e4d942ef2b95160e7b40f9d28c15dd15ef17bd3bd7b9f802378a3b211f4eadafba6669f29b7e80f7bce82719c6fe760536c794a57a15913190c44dc046ea46adaaa0da925f0fa90e024400b50749e0859fbde953a7823330de5408f9b6f0ae036222791a76ca9e72483fcc26cc4fda52f2c67ba6abbc03436c73e9882cdf4d96551f08a9af5000030223297cf4f52dad8646251f5c02fc501e884a91e169816d2b693343a333ec34462f408f09ce20f358ddb4a0a9cd6cb046aeabbc8e2a1d8d22455d15b37dbce98b69ba4dcec4cf62f2e8533b17d50a69303af1edf2900f964c31253cccbeac5bf2c81df8b9d77bd2f6624855c38b85b7a295e75a20e16bef92b9bbd8727ea337786923f8d8900318aad68f77b9cbe1c523cd3021987a050f984213c3b0bcea2738d77fa26725839900eafad84df232e7a779ac8db4f087a0f98e8db279071a3e0285575c3bfef908144a9ca0dbff7f1b9be4a25259ff10c6535a159dded2b5531fbd01a70db280d1efcae34e6cab1069fd23c051f135cf3456bb5ea56a2a81a9aeb23ab7dfdd30f94a1e380e4e053cbcdb4b379223f7a35290be7f8f8f092ada983d9bbc87185cc593165b54bbd1c3d7f01541c4aaeba8e1bbbced8c3d7df8b003536ed64d9b8b684dbefcaac76edd292b1d1bb72fecce3c7d69cea93613e9ef1b7ee6c75d182f40559e9b5df3a1c4c2cfade69183c31d7916c04c4ebb7f40fc4f48db78091630cac14a53bd77f7629bbae2f0edf57297f658f99046dbe5e4fe4d52b722c9688d2da857f6b682a2bfc9a11893c12bc662b3381c41fef692e2a8135a739e582f9579c1b596bfbb214078a60391a5eb98655c24bce38893640cc0420d327720d3ef49682578660351eb5e1e3a8ca4cd8a41235085f62acbe7b284fd894c30a10f236689f7bcb5b3d863bcfbccd5f1da30c726b1c1ace1c3ea1534e48b4083066deba38d99c9bb45192adbde425aebbe54d53639c8957b369f9fc9ba3a2e818135baaf25f4d89c873e300b234aaf1a5c7a31a540ac15c820e85a40a76d0d6c8ff35a85e0147719879a4923cbe068b40cf3ec9435583c2a2defe0d88ae2bae7239f58114cbbf1b6c616c4ef229fcfea50379944e677bc352e1078edb23536581a14076d083439df869593f20cc016684d58431fca52eefe8b6b4012d14959788c98f428a276a6f08d2cb9a88f1c29c25905d624c2de442c594bb706947072930066f346779ce3411e8a694b403ea93be61dee9225d30bed18414b5d103299ef29b685d0956af8d9896b3d83e43819d58bfdb5e7e9eff139b6fe111602121206e540a6c4ff1d6f1dc1260bda843916f68102a90c9b74416f126bb21d34423611e964dae09b7a41ca2cf96456417692c21d228587a5c3ffeb187533c46800bf6dd514aee6f67416f242e340ad4a02cc9852507dd0033f1e07da25b03dabe49da792005e2c43080ca911cd961c6515f397bf85a249f9efa2b6826cb6a37c93f5b2dacf4457f7768487fcbc3f8a09f86987137dfc157c8b6e95ce0180f590416b2b882b2137c9879a917ab79e2f554e8b71bb5876b4df2fdafb6c2478c865f5fb098a8b4935ab947dd1c0cc8af71e3dcfba217aca47df3dd4bafc0f01b5d621a5f1e68e1c744f97c38441d60e46af8802a6c76c46b63e0bfc6fb15f139ba405dadbe890f617d7cd5181cd68f649ea276633701e38144d3722a704a5241121b79244f3432caec2b1a75cb593f4ab531bdad5f5136b0a7c7389480ecee8790feaf55e8d640de089bedc86f0cb2d5c07b2a274983f5aaf2c499317f31c16abdec5a97db21d360b522afb1da6f89d15d12a2f837119ed20e617417ca78ca90ab0e5986347a17a7c4ab641a525115c3787b421facc61dcc22107bf181baf49aeaea03156b2085087d85ff5f98394c1b66f8c70aa428aaedb536997885fd70a0fe1ce240df4e103fa965010f82638320b12397092e793356f0c86fe867b61d5b287c57b90cbf07327671ccefafadf84b100a808f01f5d5f2343ec229ecb1688220b60f15aafed6944a954b7d33c4f3421b0b33e44ffb93a29e5008c550c6c74d9c3fa0941b870c18e0d33242f5c03cdacbe3f25934a93f52965a769092e25551480546e780f883a6ce01457401aea64f5e512dbbe7e09fb92d16856506c86bca97146c7bce6b662cf814d838a4909e7ae7748182740a0108df884a2c1c153102a5f6d2d0ff229ed9524073000ea8986a0e5f54c63a7da4ba2c49c3d54a5e89b67d8a24f8b71afc911dbdbfc8a70874c37c0495060aa4a78d8a090ba1066837d79d9265d95747ffdba103556c4686a9140532a6786978af14b998d58fdee966247e1d8cc47322b90f2a6e882c8674fbc241fa899812f4a42ef356aee6f0e2c1c0de18ed3ce2d0031c140f268827742f5651ec2bd0bb8ede4130d26fc7e860c77229e10b794e71a3006a7b17b07073079c11e86f5bd8bb78df7c1c8f03e95006b4fb5b19d64038dba6bb5a9bc0d1fe7f358f495da3dff35257dbff0116385ec2802aaf3cbe9473d4b5ec9b96b165db8291e18ef679a89e050e7f962361c49ff834615b403bffbc8666d3078178eebea3a09bdb1eb54cce8f341ca9c52fb816f2eba8c4fad45e832bb279c6c10060546d8e34f048af578d70e0328c19711ea79bad98df2a459c4113bd2167304173ceaf089134fe041af22c86d4c25dd97daa3cc44055e8a108a2badd319d768005e6db0b86c531dd5e03c3eb8dce4869cc0c7dabe308eaea9fce486bbff400af891bac39498207836244904b0d87052727bd63692cc4ced72828813d025afae7e31d7b5f3a47d9498c11a8464476325e7f070385d702843b131a0cd891c1db95df58b9c7ec53320d7830e02b2066bb3e687898a25f04d11c1613f934a79dbbfd24d0cf98f66113df40354b59fc4e8a04518eb4a52f629c3dfd73e16d6642026b0ea6a5cd38a840ee29e82361ba956d18092d47a7335f4be76c89f1f044ef3487592c30f046d156036465c4139100a9a4546afc2c9d591ae429f10d048175188a8bb98f288e8b9414a1eacd01e7e58d8d28f260a373efd7e950613c59c91b9f201c2262543955fcfca496470dd1887664b60c42ee6866488cad21aabfcd8d41940601f303b739b6e0731ee8e975e63a099da42e090fc14778dd32b0187607c2ec1ce2659388b3ffda6a3bfbc6c1b1ade3d6b84e8054195f54e7e2fa20f749c6a399c7531d15fab4643d571f0466ea906d647c961bc72e1f2e0ae8e3843d9ff1e4f444570dcaaf6dbbfd8c3342138d7428274ddee6d75c9256acece3062ff99169f59097e49ff29857ff3682a674c02e89dfa66c2c2c78950dc8a6dbe78496fa40d090963de7e09a0fe233065d4983c15f7699f0d8e816c0b0dee1f028e90d3c59f6e1bd6fa157242eaa7163bb5345a0f5a4450000679b98bc7f9bfc8509d7c9204da840e5e23389808bfd9781de41186483431fb2e8de3a0370531190443d86dbe63931c285d28624e4335e7c4aaec707d4d429d7ccff453a924a044b2837773d5f96b5de2993284f51361020b3c8e4038c1e621ae61746ae483e2301fedb80f351e96620f9a1f431a288db66c5600699ad31f5c9390eca59629613fb2978df6c756f9bfb549a75bdf54061143f986dfc33f6a01280bd4e981ca78226d1381c4e50e8a904d8d93507990032532e53885d0ac7f80c9ab152cbe42894c7421e18c666ad7257e51886723207bdc510656f16e8b9d393e2d1108520a585c6b72cc1cd1663512887253fd209f992df109f66f90ba742feb197d80e95d5f0e534a4d2b9322b2361248c074014e975583c1740be031885c2414db0e0ba082db8690b27b21b80b22cfde0d8e8c20ea973ac395d9864e44d6873be86a608032704b673d8d81293d2dbb11ed2879dc6ffd76c2ac4f610b26cd16233ef632e6db939059c3b1ce069720b25c939151605d167b8f8cbd741b0048b00818b83a483fa5e745d54f23dfd4faaff269524d7cf6ac32bc6030d6c2058b87a0e5e59dce316aea81098784950a1f4ec5f7bae7dc90f5f907dbc0a648190a3f893e75116a5b0b6994759ac5c8512fd88193870f2d0fed9e38be309aeb83586fd2765998f8530f1d57be1092b0cfa4f0ffde236c4ea65b1b592377dd939d6f9a05f4f39d8aed307b52033e89ac99700bb7564192361d87e3ba61c440f78940bae363e40de9d13c8d9659ed7579636328e6c5731e80032fe0e92d1a92420cd120d005556eb586f99e9070748e831a0624d1b5c595366919790fc16009df9d35bed84562d3e6baf29191cb1464365d37d10641086189d520923cc71c9dbddbf20789f6457ebcc236066c4eac0ad6ec2fd143dc14b1f0df5d740d024985084d4c9817b5c701089a89fce601c187488b731c30bf12f21920f33a26c957b472fc79bcf6ecc738c10914f1216357bfe155c8966860be7f03c79470b0b8ea4278d12b11e1a3fae8ab003a5cde9bb494b9be1f537ef25b66604910c5b5751ea9700856e4ec17cae7c233f50efd87723078349c7acd393137138ef49e489a9be5f719912e3e09296fcb0b12406d5ce2ace12c27243b2486f4ad4f4c4cf02c5aabd6fdd0cea55d9bac06e48b1bf9123696b0b3b7e53744fce424c5bfe674fdd6738ec8981ddb06609f4ec02f862d25b09ab6c7ff5cc3ef2646e16fce5a089efc269f6d1920bd3add38f5cc885b8aae71f1ba6fd2fcb962c201c4d26b45822db31ef91e43c19cecab8ceea7ae7baf9751dde3a9a859e83f74bb9625c687323a22941b05b0fb1016f497d4bd6e169af49c241df529418d8ce1204283def9c072c5c708979d0831685709d120bcaa75ab61aedb0d7e7a581b8d3cb5f29ed7f1808af97028b8f143e650e5627d3007795c17487a8af70a59ed4f8ee8f925f676efebc1488c4891ca545ebc44cfcf5c012756729d437c9c893fa5e85574ece7a02143cc3f2612a7a84d30360ce3cb29a4e40002ac123dd93b1ef64a18e04833b9283baab1cd97b04754b2b1ca9bb238277b80884da0bee700fc135f2e0b291ec85784d85f649396dd9644f2669f0ab9f3531a1e716373e1678408c0458eaf8f2c7424d81a0b671c0c874a2bfe8a73049d2c434d0c29f398769660439b2fbdec8f6b9499b865ad06c8f7d3b38ee7426e2126101f9f9b3efdc8e3507ba3e82262cdc727fd38dda8c4cbbfcb4190c33f2fe0a9941ba55353468408a971d474f8c062d92f7869e17a928372af7cdc307fb4a5043f4a82d455a6690a91a4c6894b9af8c775c0ec245a9725dd0297ad56078445fbf908d8892b6d5a44e33ce81e5268a22172debdb61bc1bbaeeb56ed2637d6985bb64b6e5f695339e112395dbd8cb9391b3391d1dc98eea8e2a5e48767c5a00c1100d3d733e0cf6dafbf7df7f3998f4081e6ba51b8683de2890d304dd649a401fc198f96f7d13336f0c1ec678b9d986c895d5cb269f9166b8c9606db46d28174620ebe6b8c6cc33e280dc7c3935397c174b64c53dc73f46d81708e5103ee8621c7a06e6cde5955632b6e8f705e94aec2400c991498cf3eeb05c5f3f11997a122f4dc8f986758791f714be2d05d998146dae67eea4847b2b242d79fb548a549001b45242d3a1908c0b34a62011d3c975542d9a4c58fb931318830f49de055c448bc134310b54f3e6cb955256b6b8152632e41e00762caab82a5f2524e5eb4338b75ee6cd170ed2cc7cf09bc2d00f6990abf9efd58cb902e8a1e79de644c29a80766e6c993eb4e630ee3db17fec90ec8b584db9f2e0e1cc5eccf3747baffc89760ababda2b2e68bf1f5b748d5343c06490e4c97ab8b2575170f9609119dcd40b1a2978f7470d0bb12cffdbbddda918c2c97276181bc1f54dda1a36cba8ab086d44c97946db625192881a7cec5029c4e143f4905177e909f961ba924d8a395d970f0143ace6b7baa6f9a473bfabe34696c0ce197ee81a6c10c58d5c5e837d31ae0ac9f17cfc05d5571df95dca7a4d2a7415d1f6d3e85be96f9e251379cf2f7f7cc702c1de1d38078425f179236d0dcea70b2efcf02ae1911425d4b03905c9c0e7760a6bab68e6edc9e66f0b9d0dc2bcfa18bfd4eb7d3288f4e764a05791f2ceb94c72cef51c63ba4ae3a256f36e7aada8d96e5795841a7f0e03915c04be69412e118a8f482a0682d662044a9c9f7584ed74b3ee4df79768e559966dd11537757333a44b13bf49c69ea697efc081c9d929bc0ec15d7d88e807ff59fb3922c07ae744f0328050be7526f2ede33c9fcde882890424f1b86ee42cdf9dd638609564646b07ee5374713d2316f650230a871aa7e85dd5bb38f7b0a2d488489d36eaf9c4e8fc65d4dfc0235c710e6538f1ed8d9a2f65e8d79b4c800f212d001a63374d56d9a85569e9701672741047ddbe0ab2e9501ae1550e05a0ed0d787ef3c4c7b3fa61a24181ba537d3824595b0061099044e1e1dd60db2fe108ae299b4c348ce7dd24e43ff3cf392027300f96c59ac0b5d9bca3aa2404c53c8631ac5530825781bcec53b1d72b0203bad1838a8ae6e6b4c6be91ae78db56ef7ab111f52cccd916a1d8d0898af2b056d8a50c5024e4ce857c67af1b4bbd9b87b2144d66a0eee3b4b8a4d3ea83c19308a445f59c3a57fea5fe5cfaba586ea4d0ca273b19edf1bb9531073d4fba8785bdf06fc5f6b2b2ddd0f53a4afcef3ae1d0a152d6673f5fa619fd1f981919ccb31fbb49b5d0e578381fc995bc0bb50739f5562ef750bfe4e7c6037cb5ee21abd6a4b7c957c57de4c4f51d916cde39b47d31f9e2ad390e8a2da8a17ae198fd09012e31d222cb859665341fe28b396e2ed10e61458466546ef1877e1ecd9778f0648a96f8fdc9ed2b2b5bfd23ea3cbdf90da9c9dfdbc64d5504eb767fc878100823cf661badc741c8c11696ba5cc8ca7be06da0a65d3a8387b3e181bd5f3ee7fb0fd1e3070c8de7453436f8d2757698b5b5c870abad8f1a44a21aac0477e51f5e239b4727d62622e0f2be3c9e4585713fd9f4913d45ae5b844f1695d03084ed305d65595d753d6b28b470ed7c48fe0d566d627764c9dd98d46906e3d19686893b1d367bb9cd0c40edb4850475097cf02acc97056f9ca6b0907346124e294cd52ba497e265d079262f02f359ba8b282a4345a95fe880d7dd5bfe7b9a146713cb0fa956b87260e3232bb4c5a6aec124b08063cb6135fe72e16da7e4b359649029571b36eb8f1c88c1b81106b552cc86b8791d271a85c9af01fdfeecb7240840905623f8e59d3c873b99177d62cf41d14716ecf84709c9596ccbcd15f2e075c66f97e5bc95b41676b8a3e137d92286abcb00a399949cdd125070390546f335f6326f472100bbd1785096e460727b37b37d815c82187fddb36acccea4f75a744abc8463a224c89aa54a5f372df0b65ae00537367a43b20f91157b871a258b3fb688660f19c83683690e57d76d1bd88b4594470895a7196748961f2f1ba3dc54cdaaad2f8de636dff94a1497e13ffafeadf81d51c3bbc295060e837af925dcd268eebd94c91f52248da82e21460a538dc9da97201a5d8d2e8eda79c02ad6836e560380092ed50030360649737a96226ea0ff8b95708a3a32921ece60576820fc86342a65b2710138061b21eb0b0b68649283526046a8999b04bc7f7735e315804bf62c590861e83ddf0c58b6cd17ac3b389eb17221dc534c09ea7051220a4416a616d3c6a0b5a8ebbcec664349a7d80e3586f0efb72155f738f9881ad71d45709e15ab6288017b18fa8be36b9534fb00fe2a0de4c2d15a81235cfaadf61448bd96d18738b0c6e672f685d536a443ab9ae89c6c5ce73c5eb5e7f6b24a287fc166782da9d327620d811740e925efb62d5e2382d42a8c05deac47c8f045f00e42e0023a1d2bf6065b8d840e37c8318b27a26200406b9d4c869f9c1396145dbc43617a4202dc20b559fd7d438cf25489ef2a0b3dbbc34ee27ebc68512ed4504db66a3c2bb948aa8f78e08e5f2dafa4a13e82d5c9aaa267431a4ad7663729cd21959cdcf967985c5f27fabdb58383ad8e3020ce2f6facf348a618ed1c38e5e08b8e751c4b0323235f1e25aaef602c4f25d953369c0fb902d3c7a8426db37688819aaece7928e95897e92978aa121543a260a3643a086a3fc61b0736857f9519507fd816b92f6aadbdc8d0239e9316780c551791c8aa8c3f3763d3cc41fe2a81cf05b6a3a80dc759fbe2803816a99bf82db21d55e40be5edf0e733a6d5077c489a193e24bc62e1e523b09dc333292e036ee829d823d0c5b6413f54b61c1bf581502518f9c5c700d087df499f94b024249d0c4c59396e1afeb5f88680828e5bd38a1a5810095f4c9d08066ef22ee2ffb5a4ef0112182b571be4d5c5bc1d3d5a1df8ae0b7150ab3e33a98b06247e0e935eda6c0177c019f8608deca951ab8b7f19b9adb0888ff4f7b9ff9c7a51912c5b172b15e858cf05ec725999e24ee250c542d0af8ea6bbfba76e6ba021ed7479dc5c27c45181d675b622198e870ada3d77a9829517045fb6ebf7952b0e5bf41212de29d91c6d4e42d62bdd359c077a834afe518a2706880f02df2f3110ab4be239f3c7448a1ddc44bdb402e0ea0659236abb9e189fe0492b3ea443ea859976ccbf94704f79f0973c9f8bb184076bc80cf5bc012a5b0322018c2bbe1e08902fdac004c3b96fb32a4e8802debd4428e0c97ade3c1b4d3d024ed29534def520a3b3482bb2cfdd137a3d4dd0a045b7b42dc7abda1a0f28d12d0ff9a3e36f7795c58e7788280282767a23cf687528537651e1edca32ee59c4c09d55919be076aff3b9fdc2704f88a8a57d24d5fb96e138803966ea895aa6b48d41ac0fc245913d7bb1ee800fd54f02d5f3838367e3d894564df56d8ab215ca56e22fef4e8b0ed79ddf047eb2403eb37eddcd2eed9e35d1cf4b9082594abc4b8e8715ae294d92eb3a97715b3b9f89b8b0c9ae81ea5d9f8ab1e15333a3b12c5786d00e91367d9905377ab0dd0a294394375a22ec8062c8c8e367309d048d63927629e21955f1dfb51607dc0bea676f1a69a47b81a592fc5408e211ad74b2420ee89e8a2deb3dccc02944d6f8669f760a57de26c3fea40596695a74ccc581549ed960e620b83697e70a804a8b2c982bb94a9986a3f69b8c41d7d067331bb7c6c901f2751927015dcd2a25f98b0092df225e9000d12315e3b2423fc83d1ab5a034eaad3c0f9328549fc44594a9e6520e8e541cb1483b1bde98b44baacc8d44abfb423758e1343bc9097d9858e93eac6cd9c477843f5b02c707755c3b7fcdd0ab4fad33152de344c272c32625fc4e748742641d5fde07c32e753463bb152570e6d429546e3b4c2f921711720a994added8329c73ae06767b25a161dcbed696295c45d89b764e8cddc36e719faf2e88102ff7f9106203731c567567ce34fdf53640718b47cc6ad2d4cbf03c91b5c85b56c3074148f0a7e0b01dfc02833149dfda80a5ed4f5aca2475cabf1dd59819f0bcd8236c5a550ff658a2065f13b2af57585de412aa97749e89e8ce4556f3a4d94489915609e0672b22adb15f26a4c00b701544be37afbd0a2b6eea7fa7051cc25aedbf6812420dec3c502649e0dd89b581060a7e413e8bba9228ba1482c1e447d003c12c2b10b2bb4ed90813a4e0a7397045a44622e3d9ee46f324f5cb691657756a4c8c58a62ad20e1e92a9d018979595493c01bd32c65912b402df27236a61324f3eea3ec45d70d34c79034d03e48b99063ac5255676285f5afc34becbbff2429dad739983b1f36202ab9d881d81437fb1847ac21ca4e14dcca32249d2ee13f47c4638ba868a81cc80faacf12d295553ca4a610e5dca0c6d1941972d11138c0f4a71b0fd639f2ff1404c9e6faaad4fc7d7c150cf09a5d2cf30217220282adf5d4290db3bf7d7f2b2231fa253440eb554563515f4ce206c1b09e806cafefb036c5816faedb437bb467480cc37d272d0c689029f44b7ac1c0ebc6a3145007ed0a2da8c7c0cf39a3f0d8179e5a3900b117033d98bde131dde3103f04ce7ad52763067b1a1fcc0516ec89b3a0837a1bd6f913d459c17c6de3e90455ca4751443aaa07ef33d5421172979cc2b1da50cd96c80a96f26d47c00cf8ee6aae6cfdb2744f8200788e2fbdef11b6163c601b35c729890b3b23b289a867af9eb34d0af81602b5830ed7a1fdc2e2d35e062e78ed88c8c511a862fe330e824cfd84dde537aa89911889e2a99969f30d575a79f87b0af46f5045ab198372bdbd69e1044982ee3035efb65714eba44812aed9d4750741dd86757d6dcfcc7344044b4425a8262fa8a54ca2a12283b802d00a549003febbf53149a637710b140f6784b257bff82e104857140d96b49105ff2bbb2c77a4c3c7d2174621fa95494ecd7850f37716c62239235d1e2ef6aeea02cdf4d1aedab7967ffc98de3d77fd0d8b42a0470f48888185ed85f12b9add75fbff986fe66d43c4f7106f3e2b60ad9c0290eb5f90e780119ce2f11e1ff3b7b24b737c6d2dc37082dee4e9f7ecc0e30a0a2000f86ab4b8d9ca605c6e8b6ca8eac9f8205ace433864c2893a1edcacbaf0cb440c221885f1d8a01d940f2182386ceb5da51dab75c9574f7a94fc8b149a5e54cdf6350f65b463146b3834744ef7da7f37580233f8264f4f19b9178e02d24d0f1c64aaa7c4ccfe51387ff9a24a3ff2758fa43f37ce6fd32f2bfb9a30144c81158634654463e08fd9abee02835c95c2c780419f1f8b45372c0843f4deabea9dd775bc4121c1f3e8201f07646f029ae52462b93546bd393b07af953d8da58da8a8008c77709b495825c50c001662bd7504cbd15b36fa9aef24266f142add9a9e9ffa6f1b7cfb4fec9963c060741f750d97feed5b1da47f210f41546f33b539217a5330bfaa4fafe6807e0416a97b75616f5b1a67c056513485eb0d8dbc92fe09cc19e7da0469fb3c85ed279f10819e45766e0cfe6cac0b2da85f203a906f0170cef2fb1eb0ee4330949711cd557a700a0169c04c0fbd094c1f4ebc0f7e3fe4facf5bb1a291af200b441e2b8e3efcbda413218723805f40bbe5eb6841c20e60675f7ca1bb455c5cbe12f55a47d12385d5d01868a063f1880d4938c38c009b5ca147e096e0ad0ef98318bbcc313c979ac77bed31d5ebd2703a21480929769c47f351ef70608164ea3aab17bd2636a14ad369a54da83d3b7a84901a4c3ac2c0901263baafb9cbdb2f286ad37cbc7ec90ca69c6abcdaed228baf1660208ebe15c786d16280cd38f256cc0c0d5b049a20966f385318f576289c5dd994ae2b12426362b5ae6b3d863435ee6132800565f91a68c91e93b3e3e0f923940286628ae97ebabcf6d56fc1a2f084c40cc9cfbf3b394ec5ec0c44bbfe42090f9f74bada49fa963d2abd8a7dca116859e64b0b5ee045960e6bf0cc34a4a6e5827b07d0e43fc3ece613879139293f38341bad59f8dda464d4fae5369b95e15429da0e9839c2592d79afb7ab36a4d73a5a2677e3ddb0d021da8ef0adce6d083eca1e908fd0986fc83eb2c7abad59edf96e463cf2a56d802ee1bce582fa6341310d6837e9d3023ee2ee74782b1356ccbd002ebf921c5872b33df39481eac4d91d018185acd2a62d9494e53b34d13c9a131311a67045fc9c1275ceca1d9a8355a89370d62f50e01523262ff3fc4b0bc5d97d10c080f9f83c78aa9c2d013ae8afddeb2545870ffa0c09e5a7e02c9966a610ccfba60db2bae2dd4676e901889cca4abfbae0aba6d6d3c70c3d200d00174936661ba872e43a8b2a342a813353d90b7469e7ddaada0c6166ae923dc2a95f7751ed7d118e86daf0937bf7251aa1d65e8decd7a2d98ebf103e6989552352764778a0186510fb539ce7d5ff188b76de2d10d0d5483d784da86032847b2e159b858ccb3a4439b5128465810aeb7ccbbd391387249bdba6255b59137eca5c28c446080b4116cadb170e811385f292c8b3815ca6250f3a200a115480270d09d7a41c48a500763a8ff1c84f49a6ddbd9497b4146226ebab7c3cf732134415b0a984da6c5ada003480637a403ae7da7e0c9b19efef98006c2e46214ed53023eedadf5270ab00076e18b824261479ed0b6af71846c4860816bd594d498bd8e085c8f41282d4c5bc334eb155f60a310ba489e5376cbc7ab680e9ce80e3055377c0aba3daef992bedc100c62bd57a8e42e9748a4ce0adb084c1ede06e8049b0f014d565c5a7531e734d77ab32192e8b155f0b375f00eba3fee1724d5ae42cb80fdb178f5f2b99c976d7f43453a2eae9871fbc95b7a11c475fd3439e0ca30f979a019ccee8828664b225e59e2bdc5930f47c00872c3b2b21eb26e4f47c9857bc2ba55927bbefd6c01d0f989881ad754404a0589a1d4b06614153ee5fb9f2cb8e2dddd85f0514195af1efdf3554145f85ddee37ef45322c3b9b28fedc90ed303d03da46bb43a2fa70a783520cde64406008144daba0f5ecf1a7441af6b508c61267fb8d106f9e4ec38a452787144ec53d244569f7fa15bc232914e20bce8cbb5f97032a7d993e70616416ec86516ba8e90eadca4dbffb587a849fceb82c597c526d5e49482620ac36d1782862aa81ead958fb8e5365974283688e416b8ee30cc427f96805ff07de99d3ed48dacb6fd2858e5198eb3acf73a7be82fe3d9463a3a6efee1084e908e3a1620b72e7e95ff3f83aff8ee4453d94de3b69dd23963b739b5cbea92e44e0b2c6d0ba37d7dbb95bfe0ec1ca49acdfc9888b35cb11dc21f7b02e682658dce92e1ffb1d32f4db169d861c471da7aa926545f47bf8ddb41b6ae0e65de69cccd105df3c8c4f77a0d09ed7440656ffbdb6da024efd0944c507e77af7ca48efd308b17946d84dd0e39c838c566ab476320a1fcfd8942a9dc6304fc10cc169ccd36b681ed5e51beedd10f1b7da97068ba030a80341b8c3cfc3be0cfad386623e89e3f44c2eea0a70d40f234792b63e34fc0210890a7949d5e1737d2120ded4fbd602b523d5c9b2fc9a95965e62481000e1cbdfe776d4ab6f30437fc6426b556d0cb1d5036e6edcb8448baf38d5d73a8db823eca6ceb50b1bd4e45105506aa5b7413179ca7986ed4ca678336aaba68152f1a3d6a00a02438adaa920a813faf6694a0deb994d011dc88e8d45832d3ae2481deb06b4401fcaed1337eac2fa3b9bfb4b788cb9dd3b014b8de4d70055bfe4cfc5fe71f0c39be3766efaf6ae00bd7ea424954395cd1d6464fa2e5ca498d981f81677e3c967caf55f0e8bd1eb926074052b042a2fcd12b870054de8a352bb32ab7d067394023350e0a1a7c5b0e5b100a27c665b196e97e843322c6b2ea100384d5f5ba6875752068370ecd993221000375842024c68b204940cb1d88420a8462b187e425341e3976a413c286eff0d1421025daaf100ac544246a83a244b4817a3db56e20621f63a08f63ede322d224a3ca1bed1011d7a4c4cf1ba1993090b0928251208fa4dcd86a146dd9224e03c032416a0ac08aa3d545b7e8824d72fcdbacb123dc46ff2daab717f158af607e1961e36f61e506e3c4f4145d417c11db8d8b9384e190055251e53b6b0c89ab1f07c91e2473311885e5a0e744dd52a4f12167a911eb4c2070c8614e3a41fc0c10e423536f67e554eda8976b2a2a1600037d5be588352eb5a2ddd9150a0e0da75c5e9e285ee5802370107df589d3744e7bb184558ea5f4492ca01c47e94d5f4d5f5dc4e077604f2cb8b86fe890e3111cea5144b351cb344cbea5bd494908270e9b40071b3553b508ba3d3962228dcb4aacdcad679afc978bbaadcd7451a207a08d7a9c8afa0dd73222be4dc73f1fddef3f462d75e28ae6fe1b92620e2def0f80cbf88bc3cb48142cd958286cd606212280f1ee20abd6ba4a9d8cdf1b9155e28699baa094e5639ada5260edd179a18f0be811404e90f83bced8cb4ae065c145cbeec9bb431f65b25aa5df26412e68931c3a6cb6ea4dbb5ac8fe1b811de3612cbfe1bc3f0c3f3044a5e78346b9c7a516db8ce00657f497a8d65d11f1d4b786ab2451b19bc1aad52464553230073aaf2b8acd20bf4d815dbda542571e9a38d7e7184c34e40d2cb56530ad4b3afba074339ec763b595154b3e9790c697f58cf66dd4b542110896e41c6eebab890311892f044adac151639302e5662d58dc24c75cc95e9b5ac1ab05b3434fbe6667eed88362db4e3d2256cd158205ae8941d4e739466b4ca5d0ffa545c29d2bc50e0cf8805553b7d371fac71d335cc7b8d1280a6bed35d93a449c7f14302e3ef42b23060abdf3553dc880125926fc6e782f456dc34168a49eef1db5c55a4406e2532447e83fea1ba352eacc40d5137b874e8e97bcbb1df41f879b7ce91309835b515f28b0320d1134fdbfb625c885b4937702addf41fa90451045a78cf07746f94351d40860744c7318bfb4024498adc8e9b487318ca127db7c5ba1aaa5bda3c3041132fab50770074577db27b8bb6cfa95d05cdd0ec38e4577e635b8833b4401257e13d185044f9ad92eeda5d789fc435910c98c9b913b1654815d19cd7a468f362c61dd63e15f022977dcc42dd4a7106ce51a655f2eda921391b39f6e67d7f82e649c60adb70d2bc711a52eb73f8580b9cf38ab1e559bcded362ee525f047e6f674c1f12b663780bdaa19bf90ee6305ccb5e68ae10f466bbf939c1034b12df08983c6945d96ffbeaa57e4147289b9a3faedfb1011d155178cf512e37d225216e178952ddcedf6dfe29a577d15902a539085a4222fcd6248b2f4cc8c39f247116883712e64b0caf8e0554f3b946af81c439427df42507aaf816ca51b61f852a1be43207717ffc27b6ad0006a63b6ea00f0682cda61f8cc19ba90aaf0e0aa2c5166db97d2240276cdc0d4f0968368511656bbce1c647b26ec28c03bf8ef48da60b0a6e2b450a64b933e01e72a12fcc76abb52636845b1c5628159b8c599c041d3bb33486b05d71e075f6963204d29ca3b6805301f29e1d6371f7c1bd6136ed9fb79a43a6fbc7d677180f83388addaa84f58c995fdb4ac41f01e794d567208d1db77dbfa233c817176eb1d35dd09a450c297755372aeb5a9035ef36b51f9ff7f0e1c74d184fc2bfc100df3b95b640e574a5ee47545d918b2afa484715b1b2b144e6c92dfb843897e8ef6f61451c29d59303a7dfacc25d1264db1536c1343b190d8e975a179b2e22cc6de1ac0f29a23260d325c2a04f683afc980d57752213517bc64ef14c8f6c5b7967cf37cee232b3882bda2fcb05b03fd7c82692dfdcf347191e862f16e559de4c74fa594c73bc79b3b9e66044f2d10afbc45f0822e0220873796ab6765772136e25526559385ba0170eaab1340993024f14256901a2940b260b3bab8db1754c07dd406770138fd33ae69c2967a1b0aecc3bfc928a4fc927535987c950982419e82e4326330f48a0e8fb5b2843a4d0478e90fcd799298d3c011128e34d43522366292d1eb084e41a611520104f7a0856b599178fad643814499a366b428ba12c38a0f622b9eb2aacb52ec158cafe82285bd8d78c8fb944e40e409f4ca2a1bbda0d8974e41321e55e300d2f3b91bf6b25aefd931fc06bfa93c37f0e043382af91349f2f7911183a833e7e8cd6e13b3084fc3d74c25cac2e0558a742bc7f8e38e893b1a6308223d2ebe5031098fae65cdf261ede185e47b729139281d8b2fcae7922636b457da0187d88f8bc8035b26236f99f0ed328c85c5b0dada6d862c62635b9f60c73924d2332db51acf8f09ee18847b74a0e221e20a6471013adca9ca05aaffabb14d89de7fd7fd7dec21b9c656a5a1c13fce307252fea5290b94b8e6c3db7d9054ae255e541ca944276af5448af87a1a7e3ba652bda09afb4cc17ba5eb42856605f77bd7e86941f0de4e91e051fe4e4621acf64d3b9a1747dc48a24e4661a7484754c2128762de45e02c19eb52beaa2e82ea2655fd4e3422961071a7494b048486c5564a958b8bb5de1dd6ae921f4572448800bdac5609db9b625ac5c79955e56506f6858a841376e0e54b957f3d3c853f91b282a94753144d49a701372668ae4222b5d4733bfcfec97b9b7970ae9c2197060f8027bd15ac8dd2f7589f6d897e773d32b867925a964227f026d95d85b9a15552061877e403900514d698045588182a4ae5efce6a572458d1e24c4fdc6e9f5ab46d2337eb7d4c387e5c6d1f1026b284905d7b016daaaa865896971ef1dc607d0b23640d61f9a9cf3faefb071049c548a95ed1bd0110891e6670f638dee0ddde297d4783fd19711d1a7b044b86db85f9a1bee511a47a5edd1b8722f4967d001cbc4456fc973b029386d8b11ac2cf1903649380aa81a08d69dcc64c5667393e51a79774c9cb753d6f9c11636dd387383316e0f8e7ea69d808370152158581e335688c270792ac2dfefb281ad4db9020783aa23f874cf8f3b4dc3e2bdb321928fbc44db0723f33731db885d13df7f867633f7b8cf511811ebd9578ac7e0e5f97fccb8316ac7412672b7e737e42cc16a2a4e567ff1dff8f8731ed5d1df733d68fff67f0a1f854384fe47f06a2ee939bf7a7864b1060e00657cf7e0d3520b1c2e4921db5544af8b99f18d49028cbce0f69903b98d33ca4ba31733f61622259be863f8621a9005451c8b7a4be49564c09b2e9ffb034b027377e9296fe66057eaaf126084a0fb9a9fad09d3e6c5f35a4d34736756eaa0d3f7b3d5880a6f41051b314087e5a01c34e0819ce121d2396b415709ddd413d04b55b5dc58f04a49c1b818b5e5701007cc7bb9b60e6435aa330ae9432dcba2ab86910dfa18642dc52974deae8f4d1330845c435509647fed4b5fa15d2ad5e098822b483e5ca7e7e848e9da1e287829c4f65229d4fc610812b07f6eaa6ccad281d44aed4ab3d370432552f4d828ff75036fdb836650cfb897b2f015e1aa951a5a5ba31a4b6339bc0ed390e65ea5bdec4abdefb82cb10599769d1b26b318a284265c0c70fb6b8051fd19e48ed2ff7ddb161cefa6f5eea96a5abdfde8fdbc05bbae62672940b5ba57d0314b1a2d536734a43ecdf8ade4f9ff3e0190815971cd75dc11b7d9bd882570e082a37fc50de94a0f1888f0d8ad54ddfbab1ed5e0045f6757c343d5bfa47e6fea8f86eabf33458c79d720b9e7203f6a78f28c9647fb78da2f84f33e8f21613a15e91cac06d33bf099aa1bc08e5c5870733270d8594be409edd51fd64c8a34876a50f80708f6e05b0b8ef8886174f3f4d03945dcb23989e3360d605c4335c3fd36ef815e785fc6266313dd28ec4674b72a2bfc88aa3329ba55b01551bda4de98c7a22144dfa7ac3fb6b5eabb2ef39bad772bfb1769ecb1ccabfb36b89fa76625c5bcf64d17f6e1f6d1f57a25dd2dec0c122ecedea8213372c84e2869155dc50de190b1664b1c29341f3f13355462202ce693ed0276f5d01920c85d9d5ca0a7f5a792e63e05c2024c2b679e73caf4e80cfdc6435f1b0f15cf8975dea311260024577876a2be6251f5e9558e519cca5d719f5a2e58b3e54f0a97c2ece826f055eb08002dba7137f792d7fa22abce262eeb10e03b5be5c8e30ea3f9943e0718b95f6462168058450c43a57906acfd66f8ca8652048cd9d725fb701b4ee7f2098117e5f01b71513565d299dbf80aff4293c918c7154c0ea3e72e84daa48588bd4207b7d9e331f387c1d3411ada857cb9ca6115476fbcdcad6fbaf4252ac8cdd757205eebe9b2f22dfb0a30d9fa3a583fc9dbab05d7a2f6ec0b0b46c896e73ca96cfc5aed384e963cb976d3ba9589e52ba6c00204a537b726ad3c0bd003c1aa473d8549128da3d81ab11efdc3e38deb1820ece033b8621cedcf950cff8e87ce3aa108ce43020b8bc33cab40701e32aef388b6ec6187fe3da163fc55bba77783141daed8709ed58917ccdc810c0c0ecda0940d3c95d3c927d188e4024ac5e74771d4528cc4c1a06f20f259eeb87896df16d3e11c4efecf23921e40277cafba1c63881609983a3f984c054ec2267294e1fc03779e81f47e732c34605f47a619513b97ebc30e6b1d7d6f1544da5e5588311e89c3d8105cb31d4cb8897a310274c34d2b42a0fcb4438a0f2cef5019d2cbf3bc3ede07f396c405d04d70c742f6077118da873f8c3f77413d7c7e0ab746426a15a2ad0d2d7d6a7b83663c49b88513c3159531325d2676247d665ca2d609488f1ac8d03f006cf5eb943bc1b0828196f87fcc7d02642a1c1db9ffb47db5135b9d27a618e8b1e87ce0680f53a9cf75762b3a24c7444c6ee7c22dbe51f23d20e8c2fd1193313f7da31edf074ee6baafbc7ed7cb9846d171cdf8d8004022ff0768166fa984abf45e5a1cbc01945179c645b52e6370049d2d5bf1e7a573f6d4d945b49d5bcb4fe022a636806bf1004f9684fd15873833975d96c7fc9968a12f6c8562c1c6aeead97a0730b8e4b6bb6b7cb9bfaf1e7a924a65595fe3e631edbebac4d05fa14173f0991dad9cd3fbb30cf1301356727de60b7f331f205252e3d9c1cfb5a11c44e781e7f454d90b4e37f2aa0d6d3baab0c9b2659150dfed216b647dab4afe0c655966fdb7a8b8b932a344840b34092f1b8bfeeac1f5157810f4cc330da88c809b2b8ab05c644180f8fe61d715b192788f7600dbc0602f2f11bbf24a7111cb78d40b93ed2ccd2f2846956fcace78ca78bb46ef508a961a51588a30129818120ed5d49622149665031cd9ecd32105c24e658aa6690f46f7600a53b0e1e6e4568c27904c2e126fb2042277d2fed963d7f36078e24b93ff4b58991c4010071752f15d316a54b25f905fd50e910c00cb77b447763c5555298050aa2a456f02f623b246860c836215f67b6167830945f4a84d5a10ac32407938773b8e2cdaf2839545e816622c7852a7f64b01900b4fcf5170a2baac7eaf3e7319dd2623c000dfb8b4192320040e15f692bd83154d3d1cbf919a81dafdf488fa41b75d81a51556c30354289c840aeeb6c41b81bd2aca15bededfb50d1765c652a8fb433617779e5e1a5b40352b1d496459a73006ea521f09f9bee76f89fca9b3f0f29eff5950819f9b70ac839f842e410f8ded52c70c141c068e05388cae3f4b61d19e5c6f73e4e433b26beca836adbcaf40dbf1b1c4b880aaef2dd470fe749046797934a9023cba1e2654170deb306ba6267a0bb5b4c21d8abe8090617f6d2a96002cd0a2d9e0aa12e5e3284494844268446fbb07482c5d372b03d57c89370970837bc62051cbea26e9055c158d75e93b68e462e99146060fc355ad481ded9af0d5f0162db4bbbe971def48ab5e6721ee73804881fa1db157339f77a0d23157abb267edb94f49dfc31c8687168533d8677354a52d055be16ee911232d2bccac25899427163209c476ee2889c1168021f0cc85b6c864d2076cb60ee840033c3cf805843172850d60a449c2ddccda172170c1461f43a0f2d47f8d7ade1042522263e93c793fc230aadc920c13cb01c1c10b832711a786736bcddb1143bb9ebe57ecd120a09ae006e8b37117aee0d3ddc76217ac4c5f2cd72b33cad096713cb5a9546c022c3d086da0fcd1ef001a81ce5b56c611853409fe008551ab99aee9cfddde498e14ef9369867b99464dd46d5ed34944ac448785c78487b299d12ca3cf7966a67657dd2b891e10e88c0bf881adbd9b2092ff14dee50f1396f21370bc5ca710e40e689684d72d60fffe50ecbdc9e1f5e161f2ae5ba2f4762ac8a69624f795c1106819e3542b58d332b2bb2ac6cf2b35ebeeeeff7e7d35b2121ae9bba807b2e9cfa080ad0e0970e5776d072abb336dc20c2f668e0ab9e81588c915c30c0017c7391f5fe876d24f53a41fb3b55c00ff36b0613063991d53c34fa0bc885dc25ddf9eabc4789201a1666c7688f8299b3e453ace072131f9a574ee65dbddf4f4e828d70a930d4ad4013e17eed9e19ccb708e53aa02944fe56dc223baa792f71493ff9555b5ed362ad68d99eb25e03ad6a108efbfe978599a464a948720f0f02d6436b8cd72ce0e651994250e3ea71152098faf8e149a591d3609bda51cd0e829969f9c8da3d855b034b7936c89d197a609724821d8a3b7e8b8c7ca770214624f18e6c6f72a3aa361462f74a02f892216434ff673b003f4123ebf991fc6df10d44255975a54270a8e70ac35fd3a05010afd6bd5ab7b87acdec7383012db480a1c1c3c0ec420865b2eaedf2dc299519369f704552e5828f8f33912e1edd4a3641b66e198760c19cc4b1d062d279172b0066048734889e9197d78e41f56d4f6507a7aa551f920641b5860f5392a2fa4bd5c0d0f37dd44eba8cd2ca40da35ec91875d3703acd700208d5a3f398a641df50120b710ad27b4230a5406cd6640636c3542e6a0b1ef99563a04acc98731c498cb5b17c324bfeea246652cc7deb228b8ca7d2d47989f2270a1a81cb45c20e5f357f7a42db24e654a186a9a2de2964bff82f234d9875990115762cc0434c954a2e240f23dd01da9b7f52bd2ad9e21ec0df2af67e2e8bc507de61c33ba81bbeff9a9373b78fd80ee6f2d038261dfa508f5a6d8f11e7dfba9368d7e1e97cdf71b522face5114bbef57e5dbb323e01476d0af145b2dd623354d238e5761829dbd7b06497d1058dd0e1a7edecb14c46ea6da89d02c36d9f808ec62ea60b7284baaa092c66a2c22114f32ffe78f82c5e878b01bb40a5267a332d1aae8be36ff007d186e7334920ab0ece0c7478e1d935d1aba267d9230bc357c7e6f9a49c4c67c81448ffe3dc4188ffada36aa607b9dc832da8780a7fbcc399d6b0df2263a7bb9c7c463cf2529fa6fcb3e15c89b9674513eabc73fdd18e9c9f5280981d959a55f56277f318bb7c38bc3ac8ce61889b8a94a0ae592e0f1bc41c48dcfe31cd4ea1a527ea796420eac237760a0983c8763a28d96cee037d04ef70a0095064bc993764c53aea4d5643329ceb437c5481c901d971784d9bfe689a9c48a564327eecb0e1c31c637ba64b52543e13ee5a76a8aca2db330dc2698b69f8fd41317716df927f381186241cecab962aeaa9f17709715d81749be64d3e4b6d5850212a87550b1f3a0e0a3ca75e33daa4b34a65bac052be0ce1844f804cd47c8930bc207b46e43acf386283f4b36c08d10f9b4c5a1e6ce753cb2bbb070c1da9e0b7c8928a1bb64e3be6c4ac40e2ce4306a71648ff46885c4551bf3c8e6534e7345a3290c216e749ec3baadbe6210a9f16ca11427abc326023a4db901aa2d55096924200c4f7cec5ceb7dd41136d4bf2a611a9c1c493ee1f42ea266a32e0233e24ccc582f376a5d039841bc70542509098b08541d0ebd0f372ee11edb81ec752efc9daa27865c81f8c7b7649b1d0a06f00b358485df35aeedbec6bb65e3063b2ba5e2b324c6c90b2e24b13c803266c88690cb57f314bd24ee498b45460090297699f6772082dec8464af2be5f2274542b3cf7f913b69661c1090400b1e84af7396b6f5bb285c7ece48e78270d1f76bb353c6a8998966cc7a9a7ebbcad7e07dd5cabf9fb05e07fc7720a8bd0e35d23cf5ea92b60ae75ce322fa69970b63878613cedc357e18423d0f9efc66295ef756b2ee469050696cece596cd8684499bed3829df6fcf348427879ca7215d461b6e5869719408bc4f2b4352330525b4e14a150ddd77222b4aef918b7a9661516eca2938ca46e8797f75031d71843ce7082185783060d05e1a535925d1508ec6c5f7b08a0aa889523888a09c9209e0d42b874ef222c4295db9f27467e989d3942e53179d7c65fa7836e397b645accc5cc9f1b78657845d893a57ba7bc78af82421382bbe071cde23f691e7fae3241f621ff2dfda1f851fa7f9fbb0f2e913ba63a7e58ff0c3825be9def9111c9faf84fb388ec14d83a34c67ca2aea77f58b7b985da9c0de4b35240caa0253827965ff8687294012c587cdf1d1c336329c0145cb11a1a91fe43eba4d61949310c8a3aa4a23681784047b738028aead6d13801cbbd5a473f72f0a68f39aa65050a898a9f0368902ebe61cb8e29eb1b80c347d43883c9d250ed8c5dbd376476bf293a54eb115bc2441067f79f4f3a457e45548325c45f89db9cc859eca15dd6b51f94a39ad16980b0cc9d4c2adc61080a62801f4fbeed63629580fba22aeeffea1f0d152e8dc43dcdbba21297e765f51549748039dbb2fd4dc44942a4aa89151e7fdceab7ef4c061000187a93e239a4517c3c8c8deb3cb6d1c83dc0086f30749636e0db04bd2fd248739e0410c4ac05ff048e0dce14accaa2dae52b1b2c598f75ea85ddb93f42f1f094d629e155704627db5ad72793957476745e515db4ed709221000932a1ef3556eb0b3a81acad598eedb7cf3eee51f9da5491b3efc62e3f07356fd86f86839f137d81fe097df6784f3b28510e8d482c04db3f467ec2b18d8822c9d1a174a461bd2eb660f9fb79326ec36282819067071515bfb0de6e00db6be119b8df98ab5493c272e36d8b751964710742e707b30f2718a5ca12e8d91d1cd35b8c66692107f8372bd17290889b757d8fd8a0ef370150146d9cee1f7aa5d6e80e482ed2f65b49ab1a04b278a1d59902d440bc052f4c246e4f71878bed0ad544460145689b5bab8563c4e459ab50ad434de400d9f6853e6ec832d11f73232a881e372d211ba143dee293f3af4cba854a067910e70128280265b3142a3e004f6b19bed7667307839a32eb8ca8a87d60de50735c4f8b027047c1bbc60b952984e2c9127d40f26f13d0e60c926740fbc389d48a050d1320fdd0c8af0dc9801a11ba9cbb08cc4853a6177cb47bc829b5419b1ba99f508629cc7ed19f0faadd1d8bcf96d9e31f4af4d14491ca041c8bc3b05932a5b99e84d4d343b18d3e7c68236590b5c76cc3b971bccedb971ee921c68ed58a0f6a6a9558809e810bb8de7fc5251fe4917d04afeed3ba11c962d6d74999cfa043f3cce15ff5c8c26d3d96d0af63622eb994804ac52e8f6cfddd1c75c80f9c10f1dd6c3d65cc8fb940ce898271fc6d71dfd240b45af4d435a46b5fc8cc0ae8756d5f568c927bbe7c619a3f90bf008428ece64b210a63adf029e5f8fc8fd7bb181b8e35d070760b9211d784c2e724540aaef343ad8e4683f95805c465522fe36b46b71f3fd96bdb9aa02fc5d3ce996ee796b089f291ce3f39740377903f2fae1f6b3e4ba2d0a602671a8d324f7257985e464274633359dbae292b9ff33623865e22734e443bcc1ecb3a9f6d21b72c9d19f9af2d5ffd110f8ef7b8789095aae44c40da68c5805e9ecb7da2acdd1e8a699cc17287afa503e3dab65c3797770c187b8393185551e87d65bbd42a7b2a82a83708eedf65c24ed99f12bc7667207d58db31dee5d3a1f8fe6267d94c1ab24a9ecd126e2cfb1a2a6ab2758ad4bee6ac28be24ece05db853e55a119b13a0f531ed8f54d3647eee530c41a5645cc979e4d81f135c587bb0472d786f8280debaaeb366644066723d1090b29dd45a15cfd390980052ddcb81bbd745cb39c490379bb3674eeb4330222982808d9c0a7e028dcef61ba00960a2857538eb217e0c2dd035b9e1aa4a2ce03c88ee3790a30336016bff760746b8416a47a07642051080939c3df7dab2248a23b40e6eaaab8a00264ddb04c4fad3730c649e167b64b684f500529497dc11686dc0e9cb7bb54bedb843235c9937b3e0e3c150f044f44816a52312d09c9a61141744698258f403ff6718f160d7c23003bd661577fdd8eca61578a8410348c6402fc077509e8ecc6a83fc9016c4b6335d25ff6413be830ecb0ef308cbe08b6554d803b7aba6aa1cb7ff563915a8d11d023203dff400e7a547e523247054429a9f95063e126cf17518d12ac5b4c9f44d5bcba0813b0883fc03ffaf5f81ee697d5e60a0639a8e9998072588770a26ea57db0786f37f2fb835fc14931022cdce291b7b93e413ce5aa06e5ec418d617893e0966bd35eb49e9ca971250a7416d312e8025772d1714c86840009e4111fec6d2f4a0a49a9e5e1c62fcb215ec3be018dac6ccefe6af0ca515961e0078cd81c9da06fd56a1b09219902682fe9a8f53ad86f54466162ef4d3511abf9d66f61b4ddd63fdb3e5837e45b5c617484d0bf039c6ab6be20316229475d8c3c53993c1a209625b8b13d126d1ddd01d3feea0362e00df7c58306febb77699c0bba1cf8cc17b008dd2a9ff9a26da5eb6662974eb30548249b06929f40f3b4766777fc8a84fef011fd9d2ddffb80c6ae300bf4013d2b3e2b735c692041f553771f1e5b9e842e66bc6c2b02d2b155762fd10e9715dea142f12842a635fef6c6936753578a44591c0c43b5158ed10f43aa441e59fe86db5b9024abb041862aed9ed8d715e4d936ecf7afcc120409d6d1ac03c27644b9905064e68c8c1438e76c673ec6a58a1707346058256966e00d89e3bf319513ff030b4a06e10424ba4b39049d344a8f287b09586e19e56d9adc89e8df5e2b6a7a7bda86df4df42454f80b049fcfbebabf4eafe4f3399d6debdccb480da1190b4b82a7d437b802161a4a661c6affc0247240e4c52df64ee869f535d5c04afd1bb7af1bdd5a9d80e064f19e13f64743551f07c2776d02cb15440d3586ad9121b97765dd8a3c0a0f582b4ab0f3bcbf98358bf86875be5023dafde7a0173262a1c6f2a4efd762770f801dd27c4c750ee25eefbd3f84cc6bb753331631730cdc5abac665126b47063abfad80e17c09af9c27e62d722481b76187a8b4e5a88cbdd1b221464cb99f300661228f02bb14102aec4e0ed7d6bc5a1dc7c4b5772b5887fb5b05afe66065edbb5b12e23e51924d5690f6fddb02e5eeec5a5abf507e3d0e3b31e98fcd0fcfd6e48a50b9773728fec2e4062da17ac821e939fecf34e334a937b02f866a528476ab3525054251fa3990576aa7573fe9ee28199ad747a25a0819859ec7838889f34906dd65dbdd50a6d6641dc321fe28230c47d5f148d7b341c651891eff45a2edfe5fc5cbeca07cf3547912bb82e83b52f18f60e2e2c2a2f60fa38748f254c22e3a3e062c496133fe726799c73a7ae3912f57b3fc3da4434e028bf63050861c21db93452031005f16b9c0f81120387dc1e6fd2df73a0b3208fc3bc0e5897109a169cdbe78617371bbc9bb8e6d5ea39df542ffef6158c20954a53354e5cdc1e18a46aba4063fc0964dca6498f2e6ced820665850543f58bfce331ff8a8006a2bdf90a4a8238c3cd5edd8c0870454489ced393e49cdb9ca65e832fd6d6c1eea78e3e44bf73057d64120f81a63c9715b06e11a213ca46e85775512c9f322fe02cb74d57257ea1bcddc389f7ba31c969135a6954f000bdf62df0bad2f6852020c4970c3efcd250a886175eada36fb217faf96f23461cfe75ceefdedafb57b7f686340987e1ccb3b32e82c58410eec7be4eaee0d907cc7c955e7aaa5acf49610565ab187b66f116f0d99bb7e49d1093cd8519f279542f5143e0e9da2d410969c52a40f5543c065e149c10c41f6a22dd8fbcda293b7800fc69a2851283cf395004264b30938ab6c5468b56144e4a715c97366eadb81941772d65daa7b102653492790391de15979588205a27f2b6ddd5e904de226f6f68f8b6d30397f05aac8ef5924498b991a13cc8ecaf3d20f70b40239729aebf2739ea5d2ea1f8b53c6b13c5d090e6c369d1f18bc885ecf70ca9c9567b20b0c2000d85c76c14049eacbaff5e176653d131d742ba90f7bf3ec4b8904ecdefbfc421dc3e4f28ed717f2478770b43c6141dc001f012dd173131cb890ede229643e1cbf2d6ac3f415f24b891dc1460b91adc166ff6e96603f12aac5b3e12d8191005d02d94ac31729762809b4513e5c6262a6a118f0d05e5160b5b7e9df071a4b9bf0b05c60590650f8a8423dd984a7304503534c383925a22765ee0a28ab106787f8580eed7ff0fcb769915ef8e3592cdaadba3aca7caca0e7f918550fa77fa8e148438822cd3ca1bfb6839d8ff33a1b556cecd3679d3ac3a675cc599e4323aabeb1ef2fad3bf3a097b64f50372300f1036bda6f8c1b25e7520e76e669d9f1956a29d06df0a285fb90e274bee3ff3f3983f85984e9c76ae5c269870543a13ddd4c65c860120b1c63d3a99da359e33fcd0c3cd4b8f6fbc58d5117ce5622f0f8f90c69b81446e656c73efb59702106281533932f54febbba3d44d6684e0868d52ec8c69ca47bcaf2a26830414b3fae90e0ecc43ad6d2051e735094278de4e74260f2496cdf48e5064b07647881dbebae2575301bbd03805830d20d3d54294f5ae72e924bd59c83e1d96cf48dc6d4d5fd2fd2d977415c2227e62940dd9803e3091f0984217b4a726b533d44b034a925f584316c9c276be1126ba6834f3845592ce6b2de2b27bb055ff8543ace502a04d83c4c32dc571d6596b62f1a6bfc82837bd1da942e687f1fe6297f2a09ea3fdb927f90bd498dc0dfc3f59948aa7ce6a7ab8fe952789d5d9e83adfd3111aa46f5372893d61ef07a0fc6a365e4319153c4da049ad397c2593018d6a803f20136738379257f191ed669691e2dc3fdc8b91d1e98bb6d7e2057adbabde23ca9feda100c57bf1df26826fce38f7ffc3d7444ed7e0f2ac309e5100284646514c27bc183e7dbffd3a31792b69b6cb9b79429c914520cfb0be70b5578546e340a73869c7c7849ce5b49574e19e384ee7c8fb90907cbbb1136f5b0a1ef53a5ad242b575e9acd135a6247be02f72210c226120e3779cc7bf87c926a86a3cba6b7e0ce1785637519dcf9a0d06f70e77bce83ea2a06e3ce078168e8d32874989736d051c02eccf76a2efff29d47054943172db8706499d78168e0d3a8e55da5f295b3bcb5819f4bbf28d89134a2e00be862c373b28da4ec21991f7d1a3ddf515e25a330a704a79690ce44fd7204fa52e754b7679dd3d439d1b03df73f36e71f1cdafec18f1c9d1f393adc8443da8396ed5232046874774b1bd44f28f45263005458428665b8ffc777bf87391dcab07fce7c3e4d2b1f47370fea5bee1c03e10d2dda046131e0df7dd7da853dd0eb1f698686080ad6c666eabce70e8e38d4ed19e4d3c11ee8ddba3decda6d860d8e1dfd3de813f8fd3d021df660511036021df6402fcbea21b7484324055b7f4463e3868e253c96cf2cc3ae9f50e8a506ff008e2009e5bb9461c7da43ce8e2c224fd56d9d436ca043e6b78764ef68eee9b6c151a45a52ffb7e51a49573c8427dcc9ac8d47ef06d66e671a8e38e6379a218373c2bd38271c8c35dab8eede49bad54203cb4f7345512cffd48017660cc1a455042ac8e02abad08114a070c2135708210b1ed3fc95a018665ae41992750fbf9ed3ed9ce1e7a0750fbf1b63080b7f29a7af424dd8b10ee1757be85b2da90aa117a6620554a42499220b4da8024709a3092c5c2880c21147c81f004c0bf209b08308a605f90408e2820b8cc32f5f04d3020178e8566264cb2749ae6926f20710e400a12bff003207bffcd04b0df903e05f009b5c649bcba60e016cda9e3eb314575e0671b5a4cebe83df4b9abf6ad1850acc30c28a161231383514573c018616492861420844aff2ad7c92fc0fc2343668c4760feb379a99c2f7cbb750f8a51a75113363084cf030410a234fc8c0ff4df2fdaddbfeda6fd9648304932f8cb08668c28c5307a18a1b44810a12821863e7c472e6388ed6a6ddf93d434fb0ff022aeefd746b77f7a63da7b4c82f47589f53c2590b6d81e4bbffab251541ca5b97f0839a11483882062b970e0ca098c2d3040c256200610415bf28d395df41eb25d1864d3aa822306001915613a8fc20001d2c218826988851a406278902d28b42d80cd28b365205b692ec936c447f377115798213a350415c9d229e109bc5aa60a12a8885105a4f2499a15027e620ecef30401327aa9084891414d104c3a8302142165268c20da69c66ddfaaab4b16c63536d180a3ff9ae886b24ca06c7048c2461c2082a6030250c5e8212ba88c1ab49122648d0ee47ba50a50bfc1f15cb512002126860052a3f58920326421648d0c2074866265062049ecc0ef2caa7012b9b38c085145a60648b2f6c2084c903573c29838a1a9c118517dd2290711feced107484fd2b5f3e89046cbf879b2af7db267f6ccf5dd106473bc1ef1ccad0407fbe0df4a78743fcbd9fcecfa74a4319661bba2795f833c8863eb9cd956999aef56df0bcafa137c4fb19cab4b4b1c1b1a3c78ef7f43d6ea341caf4cfd73979a0e7d19f614ef7f4733e5efd0f577ffec9f3407e3e7560ad419ea8837c92201afa137621180a214f4c6a9027fadc2707fbd4bd2d81ed7093f74b29a594ef2d5b66d142c48e7f65fc599cf2391cc22ff9653844f2e95fb4c1b1239f1f268fd09f971b68f1f3f91dfde177b72ebffb006175dd7fdd8352b7fb50f7a2daedde769f7093e1f3ec224e04829241b60d599fcf7f2cfa1fd081d02f2efd51ca42f93467645a0eaa83f0b86f3e2cdff2fca3e71f91beafbfffbed1fbf79ee78ddd7f3aeff9b6782c0ffacfb374b5ab5dedbe82baaec5950f81dca27d11c8600bc8027aa20f0481e377bb0f89c07174bbee57c071e6765dd76f417f11383f04d207755dfdec1d91409d16498f3089f4dbb68d201e5ba8830ff46edff6f5f9abd55a9e218df6dbded9244f1b479ffbf74f77a4ed2588878dc88d956149c4694958f098865f644943bfdbefb90c61c7992b439a2890dc92c410146c7bd7bc96d2a5fc74e775d2ef7eae9b6e1be566f5ae3fd20bd5168834efcdc9711cc75520df75d2a8568e27162e5c8eb9000597a565a38b6b8b8829c145012ec79468e2862ec794608184d50f90ae0efdfeaf964baa5642242ac83b0e3978897e4f1afaf0120f530082055250a2075b6071ea1878910521b2e82963891314463c7106134eb048c289938e10403cc1832a94586109291560c20c2d8cbcb4c8c1134edd051329ac769c60440c2f6694798479c545c0119a9831cba20b26544e3dc0600195133c71c5ce13567c51c6162838d293440a473835922366b00516a6ec60e13465a2176038c10960cc60554efd80981324b628f2c3156c70ea2a6e3701c4194cc080a20750bc4e3a39e0f1410f9850826495c4691a610152088107547042ed0c209c16d08319153ee0a94115649ca88005d1428316275a9cd83ece612e7a4f724d9cbc96b4b825a018b8568b1b17a5c5cdf3401f08f4a1f73ceff3a0125c8fefc74969717b9e16b76d5bf91dcd52b323e5a1613bd917817e922be10a287a1e2ba0e8195483bf67c19c2127cae3a5ed512d6e545adc9eb91ad76ccfb3d5ed7e74580ddbc9da3067c84914521eee65e53a158784c4f181d1b8cce1e56f69b2f1deb3c1738e811b5a1c6dd8c6c6eb8f24599ad26dc88577f2fddc0b8f87c01ac21270e45814536eefc083c7be6223860492cbefe231cdb8a18af48d6aeecc54bfe02f3d901c0a07769454aeb7fcfe2d864aa56f5a3ecadb552239da11053c92d771f4658eee7004d2fff9d6010873713fa128411be9827f8309902ed0b45884d5d1a23b4889edc00de070c38f08f47097c21bc9acb7630407378eb0dce598112511d8d1c392be057714533db42ab6c8410fae38c3024db050bd00c9184ea6f8e2abb198665a6cb32850232b30c2022344eecae5580aa63c018200b7cd19aabbfd9ea15e1dfc3f1a8ee2a561574715b4df36ea5a4924ff1afa6fe1d7e27c0f493bba6f9c5207df6377974c43dd659a5e626b919d3a654adfa953a7eefc2f42584a2990f0eadc25a4e52428810e3f2e8c406f6f5becedbf167bdb360e9c00d7c81fcd39270cf4b76da3bfe9b0511c1cc76dcfe9c0d978eeb35ce546ef7223cddd421b1aea98618f208038769d5b1647ab65a2cbdce42f59f2afd5fa4c75ab8e3375fd59e6a8a8cb0f0aa9ec8ef699ccb1d1b8f731b8c69fe7ba09eef8613de1faf3469339b670abc9311847865b16b8c6c38ee525ff0fcb4ddd0db8d4922ef8fb07084220753fb8fe71d6f5e73e515cef78bab8ced5648e0e0b76210b8cd325816bfcbd8be2c48e1d2bcaf5ef586e72196e1debfafbbb10d8d44bb8f492391a06ecc20fd89de09bf93e2035711934715d5efe9ff48915a8ec13d378a803c8d505218c9077bbcc10f92c820e8a70463e582441831ec4884082104eed0230b4c882c88aa58aa98870459763aa17cdd859962d1bca89ed67998305753715d7cc0e47ee7999c353f4a717c135734e1abaca4bf38b48c91cbe922ecc9f3fdac28e9d1377eeb4383794831b4b1350776ea8d15526866df35de5a6397f436da82db5a9b65507935f7577ff6c8b51d8d6c1a1dd81e51f6fd4171858b602ffe808eb38e4e0a6f974c218e66fa9b0fe2c4eb01ecaec70c2f183957f03837af8b8a1bbc960e68edd3067eb9cf9fdba81be0c657ee4f84b66666666666666666666666666666666e618d8322ff13bd83c5ef212334b66666618ffc3f83bd632fee69934d95b153cee806528b77ff2f09866fc7cb62168ed93fa88eef84989640ed1e56fc681714dff8e1d692de6a6cee5a5f6cec551e9ce0b367d4ab38b753d8c23436f714dbb1399ccf1414917526ef21a70e9086c72235cea0f10e1f849c2fd936a69e962d74fdc07880f4ae6686962fdc7ce45f26a1b8a8a6165fab3a2eb8ce3610a64486bfd9b8a863e6dcfa01ae689fb1d1d9a41e7ba1d932e14e17347521777f4bc5b84cf1dfdbb98cce1aa1a7aca4b3ddac28e9f17d49cbd946ac2f761752f7095ab1827c8659a91c2ae7c0ce0d0a2162d3bb039304e7f3ea1cc8fef3fde2714fd2794f9019265dc8076027df73a6eea5a68df0b657e78de477e97037dcd166baedc2467ca4df2c4a796ebbacb613cd3c543a329aaa2abf9f2596dce3c06bb52ca151ed8ee572c68776cf7632585c057d9ee47926823c5761fca8eccf3813f3efffda7730acd7ac861e4841d71f4f0e184edfe29035f981358d09dcf20194037488b12088faf0af65de52c6f01616f7093ab80acfa46cafaf46ddf0019ddedfd0813ece8aaab0a7db54d39bf8d72eff56ee077a9b3944d43dfdd407b29086474db556d62d80a081884c2404c8a485204129a84c5719452daad76d2a2ec578bb2d6efee6115d2375f8db852256d98da4e4358de3e4bb8124a5418c44be090d476b23f244788974af2837849dafa49953c02d77ca117eae02c00a4a0cee91b6871563935c0a5f95e5831ee9c138403d7cc22a14cb538fde77b382cc1366a4a2a2deae8e9b367d3a0456ccbf772b846488b93fef6f5b95a8e10e7da578fb0c4175dccba815554c4b617312c58312c5c311e15f78f3c69565cf937e020e5cadf80134e3216fbc1cbe518119c5cf94224aa4d7e923f9d67ea0078ae7c2b9370e50f40e6f8a6d043bc32d6e1689fd07387f084bea941cc66348c8fa380ddfee9cf52b3fe13646982f510e62551cd8efef2973ba13111458a0ceac4954f621556244599478edb98999bbc8c60fb4335b023a5499a267151249726b90ce38ef0e48969ec7c72e4f65798140292db5f5f8ee1d12f0645931d26fc54ce08f1a7ef17381c87cc2e8b8e6047d27c9692ff72b35e8c00f1d745bdb0608a27a874ab6d7377779774d5625324475e2a5a84aa682a4907d29615b6fb432d9b056f87c936b7f9c49117959ddbc6fd064a6e9b1bdd36fabaf22b634ad15f3f86b56effec7ef91b4729dde4d6b4bba59cb5c90515aaa2479c60fb41aa22b4083d42935057105efd53cc09d8ed277ddcdddda79c1f9294dd4b7084a33b70867b8f7e951bf58d4f1a5a100aecdffe191a1b5120592169b1e542a19aa7492bb664898b8a9012db72144f8a269bb550ad56ab8542a1785ecdc3c3d33cafd76b955aad5292469b32eb96e0ed30e17e2965abdd7553414022a5ece1201afc54674db0630dd1c08e13d5137bb1521385424de17177cd6a8fa5912accc65caeee794fd554eb76ca4d124a7777f78b667b58324a9592aa2132983f3bd86142bbfd3d486666213db00c47d2f520427c072cfc000ac2358d448290b03e483b428842e038d57e1c3e9fcfe7f3f9bc10384e9f1dcff3bcf73cef85c071ea06fc886798866d70e9c6951fa44720ac23d800c2e872524a91a6c59e954bfd6fc410de0e938de5c6cca1ad34342cb3d1389172fb3f9e3c79b2cd168a386ef417864d8d02438f9893d6eddfc1fdad738321dca143e7d429f15ee7f479920ebb4191f16fd14b3a74f4c3d01f81fe1ffdb32739c480e0f08327b77f03a5fe91173878a9bf566b49a47f51bc339e15b123c77ac830baf25d5cfc402593a4aad0c492db6f4bfd3c7dbec0db61e234d2fb8577265cf0c1931fe64cf9e0c8ed9f7129c324d8f1b32ffbf5576167a026172dce9e399bb3d9337be66c72c13b7ace6ecbda8a8e79a9d4a119d8d96c061bd53a6b6b5661dd64069b75937ea1bef046fd9a3c3a32eede23a7bf5f1ce3c8f70956987bf8837e0d73c49c19da93280956865c8a8890436db5d00cec38b79a9cb35fafd66d24ecbb94f25d6e359ed70c27cfb8d5b6da46a54dff756f2640c9237ac861caed07a292bfbdce4946fe9894fe16e6c8f08b349491af73ca91e190871ff4b7af81a9c8c38ff9f46be0936d9d93cec939523b07f6b05958bf7c9a3f72cc6661e5e5d30c99487fd19fe4ff6e72da04078e0e23023b987072fb616894d39f6ffb6fb4d8cdb07f9abc2387e2502f88126362074a38facbd0a1b42877b8cc633eb0a3c7642bd7657d23d9637de3a1cc13221ed05aec2f7ab8860651122ca7e29a7e0e055cd31c87aa3b666cf498c35a8c31732cfa84c76e7347986494e9519ab022245887f9585de562c4f6f71c82c7a20d57b911eb0192db6f83613fc11c5e76ac152585d158ab0b3f2231c18a579ed10d8355d11c5b2289956dc990f1cc5c1de24c13d9ed7f5ac1191a1bfd37fa9b093ce0022446356263e3801d4cb9fd33db73232bb967d985f5e7483696bebc323c78a0b787793d1c25b123fbb5c08ef363ba84b7c36472f3676dad574e06694232b063f57f1ba3ba0327b7ff9320072d687ea0ca32e4497fd801eaf65bfa7604c5cac897214bd08efd3b7ea3199a06c34e1dac6e7f9528530360533c79628182cb35c7f0b8679ad153dd7e1bee14b4096fb4d8edf229893e4b9a507c4e0a375b821d2d4b14ec38599fd9647d7a9c449a2c77296eff87f6a979289bba6defc8f1703c933563a9dcfe114b8df3984bc126a78daec5ed7725b815756559aa3b4ed66439cd65489bac2db63dd960dc87f348cb4ddc7f7abcd4bf5ab158dc645d8ee3617d58b2b0e33cc273fb39647964f54d4ff5e9a0e572b99c80d1b75794b2a36c758e9997ad2572dcee08e4bb1e9260605b2e564b0c98b74bd9dcdd9df60bfda3288886b03206528b7d92e18c117624552f8535c85310d7a6c08e0cdbe1261b86edb021e5a0c8ed9f19c28e36d7c69ba65e068976c060471408590407516effb73da594f62064b33bb06365e9c28e150c6f7ba61939954be952ff4a1676b4ceb3cddcd4e32676eadca999436993ecb9120976b4b7bb498bcdabad27749ed13a8b357aab153acf686ff36ce136f3521676742850649c19df67831463d2e4f65b21fec4e4857ee6514a29bbfbbb2c4d928642a14e70f26b8344a6c6af086a496c6787c9e49d54bfd0bf72851d3f94250d71494d58ff51a24812c5a22be18d34392de648940ca5904d8c510e2f5151f94d941d473fb023d7422c3b726d828e42c28e65e2ffecee1e8364d1c28e5cbb2c7fbe9d5c435939e5748325b73f87e79cfeb9e41a87726679604739e5518d52d2acce0112ae0da65c79629959cba916c7b063bda3655046bebcfced9aff99c0f66871d125fec24e21b5a8fc8e58a44bdca30647bac477c46183580d6af28bbed94156b9dcadcc80c4175ef3f00d0be10c279779c83b43123d32c81992e8e91b197f793d94c12a95524a29e946a994524a29e946693802e162d7e77f808b5d1d7a0bcf9b93d43ed0ab43bfec97c734ec2d2eebc3bc3a7c52255b35f1038294d4c9ed03689b73e6cc3059e4b8770aa2c0bcd3e7ac6109646c68a1cae9f3f294fa4e9f4fcdd34e7d21ea493202b6ef7eccd327142208d1a97e9fd86f0d7fa640d4855dd7755dd7799ee75d814405e729618db049b123e5f6cf6a492ff6d3210471846c0e018829582b1670fbbdfbabbda2ddf33ccf73102cc2defe6a492fdac8eff39e78bdf7c211088efb093f1cb75e79b9865cb885349ca1b7585ac6909c63bee3c81c648e1932bb201f861f4e3a6ed8b833a3edfbca3d0d67e8b5d8c3a49e51de33acece126b992b15ab31ecd73bb8fe09a0e12029147dc7e100d2c9fc0601d184009238813f8e0042b1c985153e2889126185932b1f0c1f5172576b436667e86648469336983110328483493a67bda7cd7c34d0be8b9feb9de75cecd8e765bc771a5e16827cfb80bbc975c7f18da345128142a057df3a322cceaf4ebd16d77f714783334563a254df92dc1518b2a8f69c6397f8273075c43dfc1e9922e30f3e401976837bbcd6b9d734e946b02b183e9621c1d30cefc3a28d8d14e970bd637dc8c7d9efe94cd283c6efadeffad9ba6eb89b52e5088f2a060476e6162fb6c38612dd21f0d61e7b7e3c435f49d3c81b5abb7b9bd5aa44d18c79ffee51cf3e90f5c437f821308e902a51e92f9e19dbedfae926f8237803854f0478b3c7cb4487fbae66bc2666cca643e278a46ab39ca53ae920deb58cb9a67d6d3aa56f5aa59dd72bd18473a6b229949266baae66a1e6991d6e79edd0abf42ba305d13365df3890d1bd3355d3ca457c63bcb59de7297bf1ce631c691970cebcf81db6590cbb886fe7ccb35fea3cb9ae6289aefb48a46a3d16ed8aa25dda45dddea244178f02f5aa43f85d6229dcdb6df7ce93d2d522e5aa4de2a99c3c389922ed0a7df29601c194e20b886fe167636ac65b08ed2a679a483b8e90b27ca4b74ac366cd0d074e13833436b38d63b555550b356cd7a68b546754aba5c2f584cc623511295922ad9eaa0604797f5f071030e6e9a2739425dfe0e471b97e99ce8fbccbd679e28fdbe30a704a7391bc0118f871eea9ddf97c47df79fb7a17eb8afa10cd7ef4219a635642fe1f0c17d16bc965938d1b96da11706836aa0dd9e03969acdb175aa539d9ad223314e68d662ba719fa7607daff3cfc7a3009901620190b94c5baeb73d7ff7611ce9a43ecde7402f4272138d824bf3291558f44c8b2d9ec001a1795a09bd04c661029ba8ab9f7067a5518cbe675c339f82ad05d76cc135b39fe046dc39839095415db7c9b8b3a770e728ec900becd8b08ee4a66eb9eaec542a95a2a14f9dea948cc226a3105ac26ee187f2e838870f952be37c5f6512dbc8b06509cb735d453fc7f6732473937c8932b6aa96f46db4436309ae178e52b67b1feafd3c07fa60ef27dc81ab5225ef2085bdcc4c969b609e7e0ba08c49d8cbccbf80323e76e69caa997262475ff9d899f9171a242853fd82ab5fa09f2b73270f31c877fa02bb262dd277b0738d61391687a445fa5f18b6371495397fe3e4dce6066ea86d674a8bb4e640c78267816be8cb5a106ced52affb5ec01d21ec691ac108a03f896005d0af9703b97b43b7d042cfbf844db3e1e56b3c836878f91a3e7684b02700fc8ecc0b514f302dbc3c83bc08d738c702b916c8b938174805d0e758205fa02f03720f03d69797e87320b7e21afa1bc8ad805bdd1aaa97c2b9b3817690d70505b2813a0ff749b9a22fa1f77889cefccb33888699f025749a97e8b35a6e6ae1e96f2e37c13c7d79fa1bcc4d324f7f2382ed8f1b0ab615c43cfd2dc5382e4f9f4bb94926499de873aabe61288cbc2e7dee08e3f4d0af344b7fe3b9f4b7187d4a65dbb9f4a98cfeece1668a9ba971a6681475298571ab3923c966ea678abaa88ad29c4ad8cb355323fa9e0b28ef47e5a6d6824bf4297ddb625cdaadb806e4d9a53f02c70e358a329a9b3ad7ccd3e77adc447a4a698f8bc6c5dcd4f5b0dcf45171b4c6936296613db24b5bc2f1475238565138da0aa35f59dd8aa2ba9dbe499160f64562ad6aca046d829718d8514ea9e128a7cc809247cebc44bfcee8cb643c23b79a8ddcead2870153f304f32d8032dcb7f07cf2482e37c917ec1583c9ba1849f65c9ab261e65b780f00a03c753d6e922b5a57bb14d5023884c6cfbc570394a78fca4d39503ab3f4a3baf4b906c82700807c920f7ecceb9c24941669cb5aa42f37cd94b5ffa2686343df577325b38533e5255a9aa1b7e81435667e26cc612243c3ccb7f03f66be853087c99c99e18f99af11e6cc00204cf169e6c73a038384dd81fe0e2f51173d613d19d0a5b02f3fec0bc8271ae094c590c01bbc4485d0f2b1d32c2fd1dfe995ca4bf475e8d3aaac59d4a5f4bd0856be80417055aa543931f980b83b7055aacc14d7d04f5dfa1fd74adb90e2318d94a68ed2cd057f93916941dcd45270a9bfe3dad8319416292f546260e1f60fb79f474d7f12a99d5411596b62226929457a663cad56420a12d591554bfa3661344ffd276df512272c334d27bda2e2624999ec54a324aa8170c7d9956776c38eb9a42a888cc1644bb29e467b51c28e928a93db4d5eb2a7d43c167353bb6c1560c1de4ab4663c32d70b16a3efeff9e6de72530e5e92cf5ea3c9b16332d612abb0c4ed19cfd8311c529a2199b063c75ece45cc4d4c52f2949381537dfadcd38ff57c71a58871fb7db5d59ce4f2d6e82c57a562dee32e650fc691b181e6545fe6479f723870aa3f2f7d1a2aa9f261249692d63bd6d94c0b3ce96da0d7df17c5fcb6eddbb6f96dddb77dbecdfbb6efdb40df16fa361b0259faa14bb7fa9352eba69cfecfcb7e992dfccef9844aea4fb07ac9c9a83d2f30b12214e9a93566b7ff675847bc177a73ce392775ea79361a878e5191dbef7da8165b3c39e79cd3a7e781a3d1ce94165b682d76cb94965a4b4f0b172d4aec18b3e4a51062e7b2143b362e4bb153bb479072633816a5488cac6fd86b3ca901abe1aaf1aad1a4468d242d76cc931862605bcc921a4e6298c4c09adcfe1a4efa06e4cd39e79c73fa941e932486d562d318558b1db38a39d2624caac5de69b125384a32627d24774866863b431014611c19333201df6c6400810b28dc7e17d6e8c8ed8f41f2034b537714a1287b8dd8ac75c4e252bf8335a0d490b5d831b0188f99c21e61d95144c28e312eb0e38d1623b686ca4d35625eea24ad1a4b6aa06aa4dc14fa7ed69d3019d87152a172c718d8a4d1ee18036b21c1dcd4c26ab55caed7cbdd41600b055b7a5aec962f482c37b5cc39e79c24949b58663337b1c0c0dcc452abd1683d3d3c3c32592cd66ab95caf118be52616542ae52a18949b56665eeaafd568b49e9e97999b566035626e6ae1e191c962b1961ab1dbc2f30273d30acb5f586e5a79bd5cae566bb5ead4c80a76fc24794162c7991b92cd06c9dcc41ee271d3941015d04796eaa1d5eef89155959b3e2e2ec9dc2442855c6ee21389c7ca3eaed84a846a950855a3817eb04dd8900a44eb079178ac0ce67a7d6431b08fe6b535c78f2c8c79d2628f1fd9ed189111760ccd6ac4442837c53cc1a57e295256a89470fb63605cd3356435a0c4e4c0d6885d1af8647ff47293ce69c5c572538ece29f4fda3d6c8e526d1f78f5e2210f412e443f4203047e7245a5901737442ef263ea55457b4bafd7cb2a1ada04b141fd7ed8f79d2372310584cac6ff893e4b3a46fa0b0a308e5793f41ef4744d897272dbec05aec39e7cb939758c3dc3482350cc6fdf859dd7ed7a5cfac8371bef7e77a70b4d8376ee800810d02e5923b8e5e5e60bbe7501f2833856bfa472c1fb17cc4ba31b016dba66f6c10614751b4a1f17004f22e45d871e6ced0d018d8acddf61317bb330616d3735ba66704bbfd9c08b5d337f36f8af4cd46c3512b1c2541b549a244a9110b08fb778c81b16e7f0c2c261623eb8fe1e9ee465dbe377434aac6cceb03ec784c33ca0f28233d30240a87844398fcb0cfa721de7f6fc3e73ffff921df7b1f295f24fa2f9491ffbdce2907f4a1504686fe87f7a1971ffac29cd07f3ee77bcf856b2a98c3e4c7caa824f4a80f852518b2c3fe8a089491ff5e72b9f23cf0b0430d7c12fd4a9893c33aa72a0a6d68fb85faa117fd68834448e6c34b2099cee903754e3e4808f895a8ef41614e4e102ff9e3e025ff4f88973c072ff9ef50039f40df8f12f5310de43bf495922555ac15ab43ff81a2f7bc09cad007b9434b1888871fa20f853939a10f85d215b2bb7c8942bfc34522f0932706c970c4359593994f4399194220c441566be022956d121f613b061ecd9c99d59e6c884e737db0bd83b24a2ebaaee3212f0d6564e04b5fe7028139811d5dff0019dd4f7d07777807eed0d1e2b66d5c4973babbbb5392bbbbbb731fba9cfbc6b94fef412f5f82926ba62743fffb1c502851ff85419478bf79a190172cacf7fda120d8f91e0da5eab7303cfe20948895bf01f002db6827e7ef1be5225622e1752d631cbe1f33b712f87d0756b28c61bbefee1b6419c3d2f7983e91126515254acb625dea3e091f822577b74b2cb8c6632d761fbac276dfa826dd2ccb4f5a07a3aa7cb9a97bf985e42191bcd6273a7eb411bb07adc076cfd7fde3854fac3ede7121c9a6ebbe917984dcd07d47b25c23752f5259973f47e9babfe708c8ee7bc638f276df5ab017b71b5b8cdb3d5581e5cbfd0dff742fdddddd3f60730172c138f53b77777777afddce7d8b73f6b9d03ef7f665fc593ea765e55994ac7c5d711f11b1f62d98da4ed41be4ce359fff50613bdaa4a98b3eb9dd735327b7eb6ef4ac4bdd73279f71e40d3df352f7ecfe5ef7d0ac97a60d2b34ac845df352f73624796916b1fd1f97baef9ebbefa3d141d850b25a9c79edd9ed7e8402ebdf3dd374a10e9446c38c99c9538254f668d4a3d16834228d4623ef1b7ddf6834127d23fb8de69d217f8f7ed3534561c7d927701314a1466c457c1fe3d427a2a6ba21fabb6f6adfd43bbd25fbf45aa85879b9918d1bcc52ce29eb6c29c3d659fbe6fbfa5ffdda755dd775ddf781a316eb7723c6f97cedbaaeebbaee7a5df7f1e6fc1cf4a20f140621ab54a972c629354f392d9c98742ff38552f539a250a23e147aa012d07f40392d4a77212d4ada859536c7849b6cfdc6b0332d7a18f2041ed38ccebade9cfd59106815fa914f0dac6ce1f20360bbfca39e49e25bf9feda8680a84aaf6466e80bfabecd80ebbdb77dac8512aefcb6825bc638f2cac67e5defa5a7b8eb7daf7cf87c550a75bdd6f5bc9728b9d3268b92456631d8eb7ad275bdd6f53cef3d096b5bacffb558bd97a07cd222ac45f975be3bf756f4b64131d4db7e04093ff27d8316bcd125ef1dd4c135defd421b2f512cc8c77cef719027ef7b60a06f3eef7d0f8cf3bdf737f48d7ccf7bf61e0476112752fc24f8afb0df4baf93b0f57d6624f97a120401196b11488b52c6bf73cf91f8aa45ef1df42363d81b362d7ade7f61d8d186e73dbf27255dd9daa227ef0ec691d7f39ed98aeb3d5581e53c0bcafcb0a9d7397dde7b1e68ac23f7484fb64fcae184b8da7dbc0f240259910c3dd75a5b9e413f726c28f3c3befd95cf690925ea57c2205e0295b07c88251472ed94a15028224efca399fa596ffb72ecaf8062a8a15451ef3f10861aeef8a2b0fed55aab57bf0a7a9fef03616891880b03eb48fdc9d65a6bad1514fabc4f5739d0872e48890dcca5951f7588c2d1da80a8b0f309ac7ee18c327964c4722f276cc2dc44539fdfb6c1a5fad5868deab41afa15b0af27aff74ea3d19c46f3d86587c612f407cabb22af884546d8d1c6ad34445d589897ea5798b702b6bbbb2727acd695f71550de4f5ac1352b1fb3a409eb527d39612dd60f5561eb3b8d716c288dc0352ba1d35aacbfc4d26e7ddb373afc57472be0f8dec8f23dd01b1285c271ded0db5f59790f1cc771f474587765c75df995dfe14ce5b278dd6c910b852be028efcaca0a388afe131285e3bca0f75df93106e69a957014fde73fbe5fce05f105fd0e3e696aa803658d5c109b227565ead28ec55f97e8cc5cc2ca18118912e22622429c48901cdc4424072fd12782839788dce0a3c70e1c36f4452f5122f2bd44ea21d9994d4227816b2811c9e344a4ac67d03c3d0336f1898a2880b004934befd8512efd26c226972ed8f482b4e265ac6f4897be94318eac522380560100da04d28c4b3f8a2a5cca0030a41652099786ac6e7dc26ed8f58e5d6fa7201e943d0abb94ebdb5cc2d6548b1c4c057ba55eae56adc5a2b1563d2bd54c95e24971281987aac56a3418ade7d543a4babce44fa4aabce4bfc1ba2418870789ba5d125ce3efb5e52527b14222b55be9405fa6c26e5555d7fdc538b372200a48222e0d75a8211099ba2ab035fc804c5dd80c3275e9ecb6fca73f8dd9ca0c4844f156fb92067d823c498b53588ff258794747e2846b98307377c23849b07dc70db6c1b6276d92287a9da26a5fb8d548346bed6cfeb8c1bc63592654b75ff80a2ce802e5f2dc2c2cdff77dcdd2d559beb284df534a29a52c20df8f7b5a9f85fbbe8506f6fbefb7ffbea7e0f72fa0cc8f1750e6874b8e0c0d7dc43cccf3c9e5754e5ecb8885c57e2db5c5d1efe81670b6380a47fa22168fe53d1610f4b0161b04d12ec7aa40f2e472ac8a25f72306e7f0a15efafd1f9a11965c86e2728c8a9e5b4591cb31233861c0e59811a0dc0fcd4d5deb5323d92789dfb1c48e07b471df8803f1a81fd784050c7dc7b2eb6668f495abac2cef97251c73ee28ac52753d3ab78d8262d84186d01dfd0cf68e589e5940d06f20199c5496b5ce508bc73127b9d1fb1d8563ce6d09ebabc57ed0e568312027e36040ae93752c2f1561c70f6dec58b765384a59eed5d5be6ed384b0235d1db1bdba2b4f576e827998f0dbe12e209f28387f055c8d1f31468e36d626639702e7bb807c6210fdc905387b260d457768386b366710e939b9c840c59dd8949b3eb40fad534e55fda1b5d81fdaede76a4920554b8b64e0310de9451b5948a3e4c0fe1085391e78c1895f827eb06c71e2dfd14958ee311e28ee34498bb245e9fc8da394524a2745d2225dd1548bf2e508ab6a910a8f5110b6077965909152d2d8a5322aa333dad392b23cca721395c9aea42c975dc1fe25bd6813c65366fe501956bed30ae572144b82a17f9b75ce49e9566de4687469a5b38539fe6d8672c8bd0d5167ec939d2986225a5de2fac918152f6b6320a267d4830a974833b2df379a895191ba23cd260314c4a840d1f48052ebc019529d7c43870d0e284c9aab85b9f3720c4a0dee48821d212b75f5d4e957b0e37ce771c4096a4004258413fcf03a50821604255c610b9914190881055b0865880f065914524046174aa0fcc0052ed54c095390d1830413ae5f71fd88937b9df36b618a9edb3f3900538cc144142860e004199c74902852658a22384142058425c46009df9461c509767c8aa46fa680d2554a6982811157cb08279418622a41063f70b700307881ab8a2348b8010c4efe4bae7cbaa46f46dabaf2e5d3d6d3c82956f7c6a5ae2e098f69461ab3eb3f932267928b2832598bdd92691ef41ba8bfdb5e26dd176d60c21b18f6a2af6741891ee845653d4a29a5b49384dd3ac2b66fa0930d2bcff22ce190965fa9cc6f5b78191ef22a89f995aff12b218d51b5e119cc05359ab5809f0d2cfff22cbfd3e2f22fa18c8f1d1abf230380f7f7be256d6a8131cee7fa7b54be227d137affcfff3bd237d34937f93e98937cf46a6ed302731365b160b7a52536b6c8aeff0cece8b9dcd4f538619c6efbb1e575bd5b715dff15ff15959bfefd57566e7a79ff15ff95969b48b4d1ab753d6eea78b6d03f00a04702691e060cc0bf80e03f18d2802fbf813f6868deebef49a0ce0906d439bd803aa707754e2f304f13e6b03ccc7b010049ff02e630d99ec98f003c29cc217d00986ccfa01dfdf20108735aa84702739870cfc40718e6c81308f36198e3f230215d79697bdaf2d2cb8321650979ddb13e102e160388e5051cfd832edf813ce6a5dff1b8c90b79dab5c1d06811d2b4cd7c568129118cd3bdff9cc238de5b39a32c98a5e03a25c266f494eb3052fa666b79c93fa6c74bfee23f89f43de8ebf55cfe8e762939ae0b37d0a277dcfbe5429a9b5e5ec2161ee77eb434522d9ab61a8d225df21fb7dab871ad8d6b6d5c8b6bd138e275a09ccfa0d0ef68fa22918802345ca2bf63834bf46f70897e8d1d981a5766861a777e8d3b43253061a8834b74068ee28abc89fc42f5453cb65b431c5a009fdb4172a48874d24990dcf15bcab023cf528f43b47991f496542d7d750a5404a4fa682e2baff6c9922021fdfff7b8583131afeb6fc311878d5843e19437745b001f00e00c28034a50a6a44aae5840d9f2d12f38949e5d7f98580b8f979ab4a9514c82c239b9eeb2aa5de9f2f9200e2d6e50bae4740a7dd570dca2c0d046fa7a37b1fc0c3f949bde4bb56a2de9ffbf989b5c56a0236da2afefe5a6add625ff94cb0ae5d5be8734b33ceeb2925d5ff24a72b71aecfabfbcc08e52e5d5dc54abb524d2f8362c21a9e5b27297959b48291c363591a7ceaccb2a099ddf5286adb5c63c69d163482dfaaac14f2b2fa1b02e2bd005498bfe1be8c202c2be57f3ff50fe5fcaff53f957b0850623b5488e63b471f9511c9f74ed68e62652485fa1cd4b28ba843fbbfe2d2f37dde02d3cfe3d2ff28042526cfc161e04b4f05cff09a2619e565e55845250a594524a370ada605421cc91161d66270618548b3d28c2f5ff171847925a675cff1b698a79d2258f89328418280d70915ad75ffee07d37e090839b58de3fc80a12f653718d3f0bf8ad801fca4b209b68c4bcc43852de171887af9f9c068fd3905df76aeea75015dbf22b3fc2b8ae3f09c9f51f6168d79fe5c71829311650c6c7cecbefb03c87f22424160949df70efbfd5dc244fa4afd5dc44a3458391b989460a26e626796ad1480f13bb30dcbc1f504ac9a282d145953d29e94525492ce07043e760d342752ae6a626e269b4dc24aec0a22076bdd6d648a375fd5f40e9020a094223e5a61e3d31526266315cf40dfd1989c7d248b148b6e7bacf29b546f50edd7e1c5dfae3cca5355b7f86de1381a0d07ba190cf1ea857734ac371fbee3f5cd803bd5c28b968b1b93a9bfb615c6e5a797f98979b46ef2d2eabebbfc2f23b9ae547a31f85433e582863d9ab5d7f9650c6c7cecbce8b4ce7f4e2457059d118e984ba0621bc8d9907f7f419fc808dab03f7f49f410e943740d237df37fd42dcc4f25ded73897918c4366c6e60ebe85b323fffc71fff0f1c7fb4b76d480ec4c69d610535cd81c7838b07f9fc3dd4fb7909ee20abdcee679d75be9a741f77ef3e6007d217754297b4d8b4d562f7ed40ce7de04d704dbfb8a6bb7683b53d2f0a9b6683e847a21fc96ff91d96151b124970a36d350eb551412aa07f93827ca19fa5fb95cf736aeb7169c2cadfbce01a296c5e30cefc3e60bd1dc85d07d1e028196e5f6c3d5cd30eebf198974aed57826200fd08bdc886100dfe1e05f190b706900da170c6642c2f35873232b421f4a2f7b086503879bc757774281485eef2523f8f9b44b487d2688d3ec1a64d268515b75d288c71beefdf608ce37addfe8d157a3ea96ea36893a64efa6755d915ab674df62b87f1e436a72d8a9ab54923cdd9df4d563759cfb8a6258fec18f3ac5b1d65f4215046863e76ecbbbcce29e4b0e6c2f15f146d1cd635fed1610e035de6f65d9ec98fd1873e147afb4c64e847e85dc29c1a8a217b29d4b25b863bc8db0e6b0153f3147a16d05b09fd8e16d9207a1b0e99a950a6063ef9087537e7fadac5888f8b717ce850c9cbcbc9a233c529c1250e87db40be3c5164d7ae3d7ff0e60f8ce397721f7d2947564a29a56c39b223da525aa494763025d8c4dc3de912ed3a29977e944b7f76501cec5c5ca383ae05955ad56a2d89f42f8a36369d7d92f8365d0f10bad6f5c813fda99a7f95bc3cf7624f2fdfb958aa74aeaecd14e9459f8371f4b915c7e25a9c8b7b7932fe30bf23e3cfb55ec65fc6431ef272abaa90a8f46c5586458e324424000000006314002030100c884462b16034a068ba2a1f14800c87a24476541e0ba4304a2184902104800800000000000c20610300e0b4d099ced0b42622abe024e924a1c4cc17538b66a87f487e816044230ef33139dd94ad1c41b737060c8c6d49937e99fb6fe4361fdf31f1d1187512b35668ccf871a95982e18c0cac39382792d32031c36ab6df594d555fd908fa7c22ab2458a9ae0eb635a818a14c3823d1ad51292d638e3cdb68a14899710fcab34e4afe83d412e31b1ff242639dc76dbd02643d0d2c1c56421c986478e4211120fbe81775a0765ac90a87470d2baded36f0f05c98aff0ba99030f8361ad644b6dbe79d0abebc44d626125baebf3099ee35e59a0923e3225c860d62182e6450da52019c1fd4598bcef8f9e0152103478b3320b3fda1485c948fbc0947db33a3f4f286d70a48786d8ac25cc755eed82e9d9b3403fd403d100dcd1a636aa69da690c5c5325871462da183a584de8d92ed15773c99e8c5f502a5661cf756e0da7fa2d7e810f8722823bb544d4e896a34b48e2a8bcbc60c34c7f181726e00bfe94463230715a56e6f38d971fd561699cf4fe6ec4c55cca9ba04edfa4cc8d43db5bd3a6ec918cb11c08877dc140e756bebe1b6a92d520e9aba1845b4e886f2a03313a380479a2741eb0e779484739a44d7f1b96072dcf8d42dfbe1e99a72dfe62ec7e40d7a6ea4c1e9f05400f64feb9b03285277c37112c5e67c29ac123cc7cb811d30b53a4031421202811fc078c104fc1ff416749988a5c21a63ed7dc50e780237927332e814138efa83f504aec4aadb055cadef599aa0660c95bec2e37f567061df59375b40af6657bafe676e664124bee3e164cfcf0a305cee1d59dafdf2fbed259795e4ab8092a1c6ea9ec968bb9d8381c13f096a0e1917aa11d7b840fb716115600ea80ffcd8f2e06e160ebf6501f439948fa0fd0c03d3f2c93a87b158b02fa7981046a7e7b9126f881046e77c95dffbfe00ad2b9c1013e4386d51d8d33364528852c9ac73215f0d9b1e90f5c7d9f42c1ec8db9c09c43cb200d4b7286035f79b17181400f21b2d6a2a6a67b6a5d9ae028621735af995adf982b52160316c5da352a849c23168eb2dfe0b21ce10195ca7b2b7888ac0a38f39acd53906815455e8eec7cb1d59bf8f70e5120e8dde52c5f685514d4747b801503f1111e86070593903abcc8f52cd6aaa72f0cffddb0c5cc43314b8ef4c4c22a21d6ef256ec8888428af3d92ca25fffe55dedfabc7b0036f23cdc159cd43742f61ca288ab90855feae23eda5b2a2c53c5b6d5e5c5539a10267aad4052600791e91ac52a5b84044da42c631249d9ad256d4d91473f590d660f558c3ba141656e4a2499fedff4cc313d69ab00dbec4c9701e3690de50fd124ec263280038be808609982a0f1de4142cf0a7f6de6dbe8db7599383e82d59704e3b67bc9ae5bbbdbca2f915bf46d289c7d889c6c1384507f1d2a3ecdba1b27ef29858da6164e087861740d78a1c20f39fa5e362e35d55fbcca341115533c4a0c790c53e9719dc375a014dd43718e2df97355d8582beccf8474b504847a2aa8036191a0473c71f5541c293df45b25dac50cc2b4f8bdadd2e660c197181aa8741c43291306fbf1ba81fde82ddaf04b03c80d07ab647046826c6b07b0831f762b0d3b81969103a40388442a3f84b968a870c95d7bb9e47d853923a33831eccf33d27ae1a875525ea90b82fe791699a957af937b1b44f1e4cd81e40ab45e757dde1c4e0a5a72626f71f66b8c785033d05278be6fea29b7e74c296d536758d0d2bab521ba3b38a5ddf1419c03cfd5f9770435cb9f1e82cf10f4efdf817c65e8bf7b89a24de0fdfdb4e5e18cd6529b40f3056dae1cef762f7425d7ea845d8a6b79089a1921e282207eef8cc2de314f9d5107862dcb3d9f55acad728131ae9bbc1a17a34982d59d7e29a51865a12d4cabeb4ceedeea598b244f138bb7f066df09cac7c3c57ff73d21f8b85e32bc18f033ef96809515d87a6f31e1cd4f9a5bd8ee018158013453a7051f1f1d1a24f83134386e5847f28a7b5a67bba59b1ae6069a7728b8de7a2b60f0ff304904e186a570246854edb88a6f5308ff38ae8979395492832f48fb3dbc59131bf7e33ad55dfc5315f4633390b54cb7ebeee3c58c2fc4de155c645d2beb22775e150ec7d077af4f6e85fe24261be15b4ecd2511678c402186f81ee57e506274cf62e592cec17f534601b0436ac222d51bff1429155cd5fe750e4f8184ca523b333e6371392cb3eab58005d566822444c1d1ec05b7eb4f9817e5530939f4d1303eb16b3b811bc65beb95f0ac080716a45b242a9b44c1708320f5c194e024d11b524eb3484a4563902c48b77d954e0b70f66b94c463763f101792d246e38cac8283f5f54601125b46f1b9db803258a8aa0aab500f15cf43624b73ea1d72efdba9c736a3d11536b32f2e100646f22060c63ea96fc8fa32fe46ebee60c7468b01391bbe427f8189cde0969ce3d650ffb14f3a5287b833c1abb74db2cc41d0a6f9e8c51dffbba5b4d946fddd285dfd34facee5e74d85dd9d2405367bae325c1d1e1ab9e236e004721eaf3ea009862a8b9af249ff5290750ea0833b3d782285b0d18f8b3f6af9b4355c27b18dc657071fc7dc6e0c6c3495616471afc373b5c01cac090a08d28af146e6eb6970d11b447bf7cd57815562e81dbd05dbeb19237916cd0b92cd238dede813070fe45f4136a7debb0a1f775c3290095b77257b656a0f721c8a93eb6b9a97fb21cee19a4173805ebabf0da4131a1f6dd28cd46df7765a414ffc90fa234de379e1bdc51529aef59e41cdcc0851e1cb87f188e3880163491c254a36aed33af93529bfeabb66d187da2fffeed6745f830813869c95094b3ce61fccef01999487d11a1214a65b5dbf56648b1b396a4998f6210cfb496efede681f4fff7bd6dd7222d6192ff02b6e7afd922ece5020bdeab31ec808736fa2ceda1634abb0d0c233be034015f5ca73f39f78515574639938523ba43a8ae7696625a734602add91ebeb96f1ea9865b3a1cad6e867f4699980edfe29ad16067239b4701876efed8c5017083e61c74fddc444de31c91d5389855739acebe59fa236cb8ad8eb9344b111daa8be3bad4c49304a69ca6f0b483593796ca6e34ceb46f4c997bf78a638a3fbffe27a0b7dc8de8fb2d9eb9cb8e118affe712986f80c73a1d44cb988ad3884a623ce475e2f11f143e08a565681151df34eccaf0affdbb2b241309d6b671033c8ecf2003849409df44a66d90f766dbe7888a3879651fad6c6f4bbf5d4477931ef64eb5a713f2ccf6653118122a53bf766b7a3a6f177b8c4773686153906a946441c37c6b62fdeee8281943e8a4c5b52626f0b5d8abd3da6b509fa7ac58a958e77e265635020f93e1c7acdec2f954a897b9b34f291fb33d44bc1a5f15715586bc9597eaa2b36330383a6efbf1f13611948a76e27ace6715ffe94c7c377614ba644e026c7a6b9aeb9f0d8d61a2cb3213fbcfb2986edbbca1e92743e3ae38ab9d659907463c4b92b94846c27f8e63e9691d67e1cd317a80380c6212781cd0448f8dfc8a3bcb24759bc4adc43914289891af0618299d62e797cba26c4226c7eaed6dcdd69ef0568456dd9b9826c00bc00469b08270c1c8d57ed193214440afb9e10be5ef5b93b87c9795a8c5c6d8e66603d99eb0839214b9c86c0008f41abfdc244af7a55d155c6315d67880157c347bb52acc78ac45101c475d13b537922e217cba12ecedc21684ecf0fc2a4c0fbeffb11e62532a2a17884b8911ebfc7ae21da861e4eb1ede19738544512ce6271c10f6956158f8ea6ac4548cd7e5a3a20b9cbeb24688c07b7cd307c193b52e40d4fe3b0d717057ef494e061bbe07d147fb474c3200f51bb2d8763a02b4dfc52f32e110c2c425d7f44761a1ecdc237df2c4d61393b634f5cb051ceff5c87860c6a9b5a06046c19967543c805ba7e5e694fb4a804cc906426d8994b3e92fa7f93e4845e5249d9cc93bb7febc7d916ffb63bfd79446862f2c7cd87c6829efead65e8412e845b18cf76325387acbd9a3101ea3d3fd960da4710de255fa03069c74588299c9606ce44c4e7860a86f1f0f5d16a5eca94e6be675b293e4944b1de4fba75f71e85da4927071ee0fc71409e0d468b24c0f6e94d50b7b22149c6e6575515ad99a54b9625c1a88cc26fbbb0fcc1991f7957c9ec78b3e344b91bfdc287b2178240bcf8bac43cf0ca53ab460810d0861b6e0295e96e503ab7ee6334d6aeec516d08069d1952234b7083360d596f83453c59547c5c0a0c1db2bbff6746003ea189cec6b7fbc2890ae6032de816b0307685ec67e8e37e03e79764887f4a7ec7b079118e0b96016de220296a66d71b4b29859675828a4ffbb1e98b8c77463a06d606e09807a55bb5d843433badeee784246f9237fc882b4ca48d677223a6bd22a97c22008c05fd4045b37d9f4b116292981e27cfe1081983af975a7053bf111e9fcba8c8e47d5895e98553d0118e3500350ba2be2e20454b2482ce86f391607809a750da27732de00c52a19977e4e2736ba48dd1bd3faaa8a9d3b46e7f236b70d42c143bb52fb2d5a26fde41a4c14893bccf59cfc2ab6d7227faaf3ec7e586005abad69657f61740acb927a9d6da9f3b3c2eb29b5b156ad33196f542cc932732a6a4ed15d40c7f69a60e4b4a42433b3e797d2dcd24c83a55e8b120d4c0928c759d505e7591702123fd460114745ae51334dba9ba432f07b2d39d8e851b9c07d6058a1d6367c6c7ef540e05ea3e595c052e6551ec8180a72929d5cfc024c9686d784d2d9e5f3d6ef479154c02c6cc1b5069eb2365165d9f41324ceaba684ec88aa34054b0fdd6d38124d9fee129fd5eb00e49b13f4398cedec1049a5e4c0fd3b529bb6092f0f28f371a9eca4e41c9b3350c6bb3ea62f017bb7c73c4f5fe3f2b2d01de72b6029212b2ce69b34e404356d7094a029729772c0ad8605b89a8f45810c4cb84e6cdfbe44a352a05f6278dcb67cc1cff5c93470cbed21359f41a5dfed140955b6d8bb716ed4307a17a05c8ebe4bef189a2f6e70e00a2248673b602a30f5bac53ac01350f62339f595c3986fc59498e03a15cea45b38167c4da85354014d57febc6f8dc77a748be76a564e5e2dd1135aa26e7afb0aaf41cffe88f788c60b6352ecbd41d463978c804ddfbc1c658d896e74b72205731e0002e3081ccc160938894bcac5e3d664a07735dba34e799163aa0ce48a35b82bdb6e2d9b0a44b68239ed216ef98758b60477bb304123e566cfb6ba56559fc59576c17d7721c5fb2e506e18161bcb456d9bbf5d964e5355af5874c730f7ec8301ba2779ae659698bb85ad6686f89969d9e2bb81cbb8dc76b3653c75373b22f627828eb33f5f75d5b84a861b21bf20755b74388a74aa3225f77a27b7da1bc69a256377c64a92c040a68f6c79472a7d14b476925057c8973cde5260179328b62c3034dff416db26e7b1c41b61a46dd3f9185489413301781efbdb12d10a8557518572082d81a28067c5d960ab901c950b7b80373168b3e8791015e62c8779a5a428246bfcebedf8972a050287b3979679e51728f3c9d5d36cd651a4516055c8ca644831a2194002d7755d77eb076a488a983ba46834920b34aa620f3614ed4600704c640b2bd65836d3c7d5a1d1633f5fac095f5ed85920543fd854134229ed0e45ac84866f412c3bed6365c4195f129dde50901eb5d7a503075c6eca8159a41dc5fc135739bcecd4c0fceb55dae3ac8dc68b6ddbdee8ff6295f98c10cec5f2e4cd1efe4e88d34d3f3f59e54eb3a8b9c3e29833c88098b196560d7b02136124fd7bb9cc5789299a35feac053c7fd07912d960e28d1a259efe03f4d9f7a67c6ee52a2dbeacc049455313907a21b432cd5b50ca007a2d405964c8e3981f31a33dee787da4e854ff19073d44897228aa199d275c0222b8b1b26fa8a9a33ab05592a7675e96dcf6d62a2af189bbf8f76d420d7a07604249ab34166fc08f6bcea2432ca7b6ff3f5448e629a3512a4d6d1f050e29913e39975757607d74d23acb6bce19b6165c1cd8ee746cf3b4c4529c626311be1fb99435345fa44c514e44fbd212196e2b913a0911636d47e9886ad9baa12a7a0e3c15860e8863479c1020a719fcc3c220fb00545f77268a53097f3d851b00b338e4ba7cded1606719cd118fa3c86c27e6978f31a6f501e0ae4139adffb83fe2b11d399707b6fd5a584ea1fd2d060146662653f1498aee519032d0ca6f10da7f1a3065e9d79aa61cd2f3ed865ac1ff2667abd1af8788ccc1ffa89eeafca63d9070f009a94e3b52db95823c7d7b79807cd835f62303a03cf370c66fe09818a7b438d5c227ec4f2af3de3ed6be633ad8459250f688290e7bc434bb92c2e66b852bf5adfaeae3830371367801de9bc244742fe4fd5d81222906995340c10a30906923a7381ef3c732f88ec6311abde40a502d6c5950ce864b213adaf6fc3523d4fdc211dbdb7c31c2f258255b21fa1899a64b21a0a24303d8ae626ae7313d5a96627a4ca090784c1720e413f526ab5a14edb517d04f23e09b0c8a7d8ea862599780eb93932b2a749ad74c14cfe49ff9d6f64779a4a24f05accb99803383c39a8b9f9971473e70bd68641b63edb8ed5d131cf8c04cdd041b0b597a48af0f254531ab9b940bc22a45e0739bf764d839f727d93a500b65b12dbb16b22672762166bc446c4f5cb54b6761439931075889f3d01d5688423f311a6b959e0856ef40ce799c0713b9c7b76bcf059d23c4e7af16ed9d66fffecabff27cb216e863f5ef7c743ebb38e6b2d47cf2b4110d6f173e60f4dff311bfe323576940bcf89efe13eb59d7cded7a228927072dfc81562c64803fc6463826c001cfca99e178c831350a9f41cf3de199e6c9afbcbe7ed508117694bf6c935dd9a6dd0aad33ec094e30ddc5b151380c8fef09135b3d5f34f9b401dcf56ff7ce89d007062286bc8386d6abb7577e509eb9a50d30484c15fb5cd91d47b2c10cbe12fbe6db5d6a518abc0cf46a2e20a49d97001296c89cb03cb7ba4aa00606b6e0777122ae90bad7d65c84dad621b818f4142e22b0a83b9b325f671f0e440468aa8ed789ba84c56c682ad37df1e7af0ad410ce6ba507029933bd434baf8b5d8f26f9728d343200428d74d98310e683d45a196566ef512117c1f4d2f9c0b8c716939f4ce40ccea50d20ddbdf93cb7d09d457003babd2316399974d7c2d162bcebcf1635f8e2002fdfba3124204b5423e5c815d817e1e9f2964374e67ca3049644a257b33f708562d4e9247d64edfe222b36bf6f8b407dceb60be799ead08fa4ccd3aa56a8d5ce9c3016b139a5e8f39559bca45f60f2b42e26c998e71b36377c3fa03954365097393d7ebd19f9b28318aa95079fb369948bb31a4b78c0b776345fa7e2c8d34eb0a84f57940270b0259055c927d87465b900dd50ede5d4a1172f370d83f4129b4868353379476886b104c5f29d2b9b46090dcc4516f4e870ad4797867b7403149c2c341304795ab88dcf28ee0e64d5f959c84ca4e5a5aa54a35108228b0ab47b61ee891a3b0a5c2b42eac1df3ba5ad48d3dd1368cd71331825358e59994d6562d8f1e68d513aeedf36f7b5bdd7d882b65f024731176c610d070aab02d335764c9314082fad3aef83da517001b365fa9d5f9cab06a705d77e202806b48f341db5c65ba61ade3739a0ab7c6a793da2c7e0117d7c0fcfd213e44468901bae6a1e9323b90c7f4f7918f6f0629363e173ef535a0a2fb001779e882b0e512381b8c4c4a71e64afbf2bf6a75d495478c901fa6127259f79f7b473b9cdbe4d93e5c51e2913c353c320ee01ff504359bfe62aba15969b3833d3104974ab5b6225e71244a46b6465b878aa8619072b3a1d3c239d10aa1c3ebee39e41fa363e80dbae7df5c48a74e53b8120b2b410096e680988ee072d47199414ac87801bf39db1b9214e0fec9ce8dcb1571c9df10270cab0f6ca1187e237fa1f034c7df62696d80c8d2f09136b7cf55491b806382f760eb05b7d0d40709ee6d1022243ba351638360f6c44613a00c7b1dd22048b9fa0bf9026c9a51d88c4b9b41ff127841f365a4d5af0db97a3355754f3073e8250164bbdfdca4e06917e3db0e25cab8113ebd63f3a10a7601c189021763df49c2da6db4be3fe1bb91b2bcebddb480df3a75c7ae3800d64549c750d4d9148175cb123f8740b6ebeb058c0cf714412fa1188f1a658bb559ca114423935e5b46d21a9605d8a8e3b96a428700d733e5d7cc2a78d44259f82a7dbd9f4826f55f798308fdec10636d2dafac8c5da889513265bf8126262fc0783b2af9ca5bb87c4645d3eb6a98b041ddb3487ba827b97242e97d07da3d0b3b66b93430adc7d05b2dfc696db0c40a1333f491f86240c15fae4704c9f2645f49d24951b2997ac81387132aeeb1dca7c441cb72b1a38e92c8680f8bade449d0d3520ea276a11668f3cb6c1245d35dcc2d5185bb72fc1468887eabdcaf5e237d6fc33adadfc04d3ff80441ae963ba7064dd65ad7c26a8bce0fcc6979ecd1511f431565d99664b37962af339e33e2a64b45f56f6e25e8b77eb34d4b3aee91c20c92dbfb0f8e52e6900abfc05e81b09f6ab15194b68240c16e82b1d20877c83b6772d338a22d4f05587cf0f633f97da2f6640ac01dd24269b93010bf66b66f343e729dbcf466cd684bd21dbd9c74c6179de86aacd01423a66a46cc1c8782d20722ef84125df5e8252bcafc7829c789721a00fdb4d31b587c1b6ee8718eb70bb7cd57570284cf50107e484b544d775ac3bebbfefb83c77b6f461428677c8e1e025c44f4da89a865e8f10dce3b174c56db5c879e25b49b9fbedb043251c5ad7df77fe07629731727a8513784b4459910d033493c6e0d5108199996e084f60c251633cba367b20cdaac8076e82dfbf27923fcb2f14372e2cccdf38575856043c2e14eea7e9d829e455e0634989b630fe988944dab85293807c41e927f3ddc3a520d2570d74726cb1dde775ab8c8ec428eb32be7ae410e4706a18ac829b0c31b0052f9d4496577ed107482805ff76e32e8b2e7310e684a93fe70a3ed560532589fa5b5a089cf0201f8348919b4a150b4cf9bf058f93305739fb3409e2ae1ccab71e101067cf51c9b71bd859cc60425e2f41387ac4935abc478361a35df83ca782fe7dc30a2a74673af7e61d236b3abad4aa99330f2416f0b047c490d2055c12243a66a412361fd6a946f0379d48effae85fbdd852bc2b807724c3723fe4c4ea6cbb5708d0537c0dd805c87961e36de0133c85509e070894e941192e153170050df2ac884a1af391926f4d0493576abedf86a47cd700d4f5862e74c74521fe1180bdb996f95f1f26297efeebb3b804a7359d44b5db3fe875b1b62f35aab1c753a940db06fe075a20ece497f7c5d9de62de9c5f3e035d3bc67eeec985bc9d6dc4b06c01b541e70382020ef0332a306a99062f4408a08450d95e082e60133f26d5afbf0323f89043dfaed33249df385c8004e8d2aa16190f102b722209bc9b2e3969531f1e33d79922ae264e9d041508503efcdf094962cd76f512f39c50bbd531ae7072cab6df22f62679e532c0e0bad1f30d7cbacb6c878a147adba24865a76cc09704f9b9cc6423da1237770b127d7dca076d2174d2336a79b98575cb1736b791a8702703629e3e0846997e81c9f918f994b5430797a36c8a806a619970fd80af1284e8a21bc348c003e90f28855a2b8127343a045a34f73a894c0ed291c9ee683fe4353007b1d5f1575eb48ee826bbe725d502c671114c716b6a5dfeef6dd5f6db1c827c7f9277ce8172310a6afb9c2955446cf9e2a1245df8731d3657c39691cf7634252bb0213b56345d5ec3b1c37d20e144a7f1474f176b8dc06d110fe1c22653abb53e9177ed3fef7bf1e3406f37a049a8f04e700b55b9344caa63f37e74c9266622f171783684259bafb8c386fccec6b27e3ade807d9e3f681351f266bc0eb200e4336136a86bc6debac8b73cea21b49b6d8f08b0a7d0a56c8314a7b70eafd9915c8d0731bdd87bb50f55b3b55aca9027389911df937e30adce8a939098567b666e82f00fb2c705b90aac81444368b9e4309a314a5c06e5254ecfbb04842f17442ef69fe64298716175ae6f1e17e77d99dd3978c5e16ece52615efbf16940d3d91c6d4ca2cfc666519b8165dd5accba4b58391b8bbbc0e169087686e4a0e88ff624a42cd339995b4b59d8ee435d8547dc685d8a9f672f9eec68d3d2193c2ffe65ec11093d76dedc9db817c3271f6b3d218d1024a1ea42b161f3763d5c75b8fbda1ca5b2ffc7721b94e661274ecdf0ec666f22c71819d9c718ab7e511388d1a3df5496034c278e0eaa29640acc441c8e885f24bf700781f91bd30d13003466d72817a47e9ecfb6232d47917f0974875ca3301c1c0be4736c32521947177c2e1f555533ed2a269212419284e45bc076022c46f2cdbc73be4d7fce3d133c6360096b25380ebe4f8c7358f7b7f4277c99d485e3c61a4ecc5d97350e8b65e5d1dbb7a105e599eeb0ecd044436012cb047a667224f4cf70f525a5aefbbc62e2c714621e3535b50d4c0f898bb8de531b96c6c0ccf5986cb16af11a43b1b865a80b39f0ca42cab1894f54806bf32879b22d07b0491af327b474a8ec7513bfb643279522c28ef7b23c51e1d58325214a32eb4ad70fa34e2421fc30341a69e8954256a897cc800c3c31657e756e8b840e9efffecabd9d4d0f68ffe70f38ae2c843d49411101565cd4c5e945ca33b274d0a5d37be2ea4b755f6e22affdf2f48ec9ac7de1f5ade54a1397976e3521a17d6874bdcf0c1986a34eccf4977cba4c9d9a7e5d0cb10d1501fd85ddeda474a641609aa05cd16d7a3869c4d75d7fa6f23121f6d1d123dbdb5094416ec5d41924322d243009f9727b7ec0e4af8006918332f07d67e4a229d1de1edcb1bb50d0fd24e39f623496c22d63254ff831bd3ade6c19033aa00f078622592357c1427ab942e254b5c93578ac2580fc0e6b6f0e0b51fb5b625834592183daecb50a778d730051fe1e91ae61f5329162c336d26c00fdbf1443e7900f12a5c467e6421542c45708b5046bc09d72115a816250c7a0c1463ce3a80b5050b258066b6519ae1bc72c538179037f3f77f1da0c42647290ba506a2022db5a71078ce30468d5a7550170c54ac3ece2d5287918a3d42157801a8c59b8d8132d8e45c3e59e4cce66f49570e5c7354fe4f88e82ff8285939dc928d1b33e71dc2d8ddd0431564d637787ea1881e289bcf562d763e1d46b38056c00f7ccc33cca202e54e9236a53afcd26a64d7c0f04d73e94125b34db7791f22b16a48f0e6edacdfa18fc0960b019490615cd6ea67133ae9c296dd4c5380a4404153417eef8f5c5b103eb5100ed676221de46ea15ee3fe0c6217c2cbbdf502fd45f853882fe45b338f9464d432cc47359cdc7d08bc9ad9beaf174f19ed2c29cf5ff3d93217c75c9346153bd62000f1db82eb69ae51210530abc29777d8c1a705eac1087b3aaab829c2007a8bb0e58827f00e86b9ee020dfdb5a9e8c2d36d6ad0f2345d890c1f81965f72c2bc2bfbc5c93d037722e274c29f618a1081b99227d7c628437fd0b5d63e46903016d69856c19a7ac0ead0db573627367185d0912bd3a6a1d686de019229c3f765745caacfcef3ecf770f4d88783151726987c59b6eae27802d4122b1d6699eec762b5854c740963db0246ef917c3f1721385245686c65ba00c5a0585d11ffae9343a19ba414dbcb90b67aeff928810708f296ee8e81adca40622808a43321ea4af75fb811196c3a53a22a5e835c01b774df4c7d295d92657a55df8c2924086c4756f1c66a11d379285b14ee4a87e7defffa83147acb126b9ff15f8753d920010cb84c020b7dbef1a71cb5e4a448f0fc8fac949cf1aa535f2ea317010bbabe4ab2d8f9c9d8e8b7a08e120b537a185f7588ffa1f444247bf2a42c7af0298f988ac3d09122d4ccfb08f9fc7434540e4212c278580d0358274131320a5ac6026350a62b4c90a8d4e32fa8d3746b5ac2b221b6e3c93275f1919ffeb2f244dec00385c84ecc1b93ddd753e8dfee503fb80d6fbf0425a2dc9e55df4eec3e2b91a4724db92445f52d1ae3f8cc5184c93e0f978cda9684e8edda0f89f1501a6b326c05c9d354319579568e0f480c49ae6ecea6e0d969f6941c9cd46904047e6ca5446264dfe95b3e2f78a9d13d7695171a83268db873e2c06a22e9d3bf32995f4b53ab25fa470789a41bae56fd09b49d0c37a40834f9878678bebcd133f501ce4ea5b66b2db5cac04cc6a32137467495edd1355bce985b86b1b3eff1dabe9f5a3515844bc1da7ee402af37ab67e191c3192dc4e1ed24ebef9212fc2ac115addf0cf9a013dccc0c9cb0d17e0559a39538c2625f63618b748eff5e0871d982b8dabcad47e7f34e31a5a9dc75b57afe073004e3a571f47e6310cca527902b60dcdb4138de4dc0b29e9d481c2a8c6436ba9a6da687941b0c891b7a6c7488d9cf80c4f921062486f72f9733e764ede88e506067a9dcf4cd90691c85d7f0853b620be928a6b2ea476eba5f53d49cdd2858ea4050dfc18cd5a1dd215c562b4b4857d92fe7155284d0b9825ec59dcc288ca7f9b8134309f4f62c9df7fa2995037facdc723a1b3165e2ab6df057aa483b7b3869f00749a576c3f4dd90e30829481bd884b7440461dfd45446c44f71c1242db2482c6a041f38f8764c833adbb5a25d29615c32b9c50b2c8b356b07e7b4045cd7fb7c8621336f62d4b75eb182e5bf6b8bca0bc622cb9789ee3756411daf12a1613625d076294352ca0c9b42794c7ee593846f61b00ef344cfae3ef2d7c5c8ad0ee833c880c6d44602530c9a94046572f51722118c34ab3061da3ceda9dea46018db8ca855bad703259e02f5e816778ffa78853d5c3bcc56617bbdfc6b079b28d83d34ccc6308621789b5745eaa53a7228ddc69cd661c03103b88da582ffe482d68ba2ba25b253ee45071117850f8e8c72a91f3825fd75c27fc1ebeb100044df8ff4c415a99ee9fd5398f0834a327b11e43108dd4adf672e1a4f5c710fe37925641fa059ef4e9e4489c4fbf2a3b65ba02fb8d7fbe2e50ffe9420ea3511a6ca95e4381e4080f1de26b4f9b4ef171f3bc809bf731aa8f93fdf892cd80665de1458c6ea723e058921954cce804b774fb571525a5f3ac5b1e54065ce944b1e800f0555de89ff509e666928a7a335c269b93cf160376841e27c383f947cec5c2e54b5e7249f18b14252f5f9c3d89cb8623634b339cc9f9560470e0e638e05e32d3fd01d3b5bc458b1486efab79b522d7a53cb984c653596ec50a5e28e59254daf844493ceacb85e23334cf70fa59a073c6565285764e968bc4e00240a16f52430f545c7df30380b7179c59e033e2c3714e190db949a98854378e3e6a4ed5d703a770fb53807246b1f297aa784e63fd448f44947ea5967e418d819ce49d587dfa5c96d79a2622c16fe29e49f4d63e319289d2a77bd288d4a1469ab16a5dd0946eef7a01ab59a2c19da446dc4caee4b065a8b6fd540a439b776dc4736a0b9d06d12d5b2a9d4e9e25662ff1b7563900ed5c8cdf57051599ebfe392df6d2f43b2a48cb8eec46830809d02e27661910b96a486cc6a1fe04c86638d4ac5f3292a214d0a902cd7c733fa8ae67b8d0cdb3ab210ddda206c25420fc143c0901ccc9a9628fe3794ea6477ddcc13cf0068f148262881678d5a95659272088950c0c83fd05c976e087965c824db92333f6954326962cc8036359767a93abd301a8ab1cb0a1fe662e318a96296bcaa88e00145e8c6c5acce6c4ee05d71bb9115c6ff242e20e186ce231dc4ffd5a6adc0d2c5f17bc773c9fa9211f28d747d54cf4c2ef86486ef4fea524570650429e8aa0279b78085a590a93b64a58a96f74945905b5431bd410b5673421ccd99db9c59c23f6588684bd70bfc0bf3893debfa7c4bf449dada181c1c18fcfc843efb1fbcfd6f1063d369bf47624ffdfdf70a4dcaa9eedf0d2898c6129e97b27dbb2ea32e4f801dc99f09e0b6a89347d03a63c3b2254aa7c0f8f95b0e3f9e004320fb395fdfc7d7bf6cabf0b9fe4610e6da973563ccc1dad6624872f4207676ae22a60cca4d9e53b05cf86abf5094547f3a4953baf825577d93473304e672a88c357969bb3404f603d431303057e38dbd7989f6862dc86ea5c8e7778d2834b2044e12f21fe124e99f4b9785b48fc4c71491cee20948e0b2bad5daa2b6334e169a0f2f4ed9ffd9e7ceb245e677d10c342d868762d9d5c394f2f2d7737c1ee94d00467acd41d283f9dedc11066f48e8317a4340302c1f0f640c04667fcbc0a7309c3d2970cb4b4a3dc6acb10a6d4554a349dbaa549eeaacbaa1632262a69c4d8c924893ab0f4097d58ca97fef805f2b7a9c07a699e0af814ba0c02a818b495ee1a723b2f29ceead4030e4e7b9094c55d4db5f4f8250eece944aff4e7164210047b3b25d62a53c1d34daec9bfd0263128519d1946a607f2c136e01ad250caa46b2e8d61585aeb09155d34ea519d55dbd3f81fbda5cdf3a203dfd94e082325e42f3ed9ed83076401bba4a9a3c41eea3ea6d12898cfb4e8323206a8e835a51bb248efcc7e12762b9d5b8e62be0985d026bf39138a9b599eb72a37ae5e43f5ac991109a44391361b7e28043d084076020a9281479a398ced629fd9c48e8f11bd8156563fcf2e3b23e22ea08abf312b691722e381309ba1dfc7b8f2363062bed2484b82b6506ab2742cc1d8c821c1d84e9753b024b8cb76230d7fc95b4345d37bfeeb5dfea4abd1cde8c8344b1ad3277409f899c0900ca1f2a13067003393af19f50d2a52559995a2e4f04b0bfb9e7a2a6246a996c5783c505875efe59854d383e94daf2e9fafe02b8c96988412e7ac18b06f7bd90505cc9f71b0132cbad3277dead31781a00223aef064a1955342b5e313f7ca973ed65531e83c3ac369bcf29638419965dd6f14220fee8caf801e0c1e91023b3e8fd6eab66f52e0070e9834ae81e53825b7a5cd725ea3ace224b8cd7cbdae0a9b92536ef05e81e2215a257f77fc840f99093015bbb64254a3ee6673c915f126634e0e24a5588767dcf9d7b14ef06bdc280feeef8bc0b9443ca5499378a4eaf03282d2ce380dde461e668fe40c1d89ecd68729601cd9f5db74a26311891c1c49cf822bc7446e624682b4a34b8e19740afd1af6e2f93d04d32eca282daf742ccbf4146133005195639b8b7eb18f5527580c517c4718a32f17ead63ce949b47f163677a88c1ef64b12f14024e8ecd28bc7287321e495ff36c49306f5633ee847b70114fb947fac4552ee8a1fcfdb0ce6ff03434e2f7319e7f1c3cdc08c3a00133263c1db885a888b844fd2cbeb7458d35af952e911ad491e4193ed05566c9e08a678650c3f8ce86823454d0de9434106716b9b1f44d00b770c2b37a6758b2da53fd453725989c999bc4be86bed3376645876b8ea633e5320992abed941dc354d704dce4faa55c8c67cb962a068200216b31d06128e52dba4c6bcb7337b39935e2a599def24d3413f9612e3b7877f1082c183057560ea70bc3eed01bcad8fc2eeb7cc2db69a0d873840f30a0af34d950e3cc90e0a5c34eec33565a76ea68fba42a3dd93fadd1cd6f1670f13d29f009af09d49d6644476f706936d4c39c1624de549a539586667980ec45c7eaea9e885e0e89c14acc403b0eace3bc1b4d733314b05c9421f891f1ba349ee09f18cc0908bf86a1d4ada94048212b6455f8800857803c057e10cc52e448161a661f7063e157457521a95ea63374fad013f2a2e431f6b3693d0a24ecb849ddfb7bba5dd0584dc0f11e24be988411cbb9528e07ab4d33115fb49b7ef7c117487921dd5c2d9302e6af61a8abcbe9c6aad0bc2039c22c468fe78977030df9db5b15153d37594b96535221efb56b16afab922769ade1cb9d95f755bed439a174678165ad8d8d6e913b4a9a3983dcd3379f51f8b76b88795151f150af8be079e10ee9c50c34a0c3b772c8c3bdf3c12ed917a6fbde2a5b8d3c1c67c4a13fd62381963b6c7c73c75b507411a5b7a4c451766d543c3cc52bbe7a8153ea52180a5a026e9035426075d91ca7e56d7fd92e9b90420e78f0863adc0d9aae2254524e4c1600616043930bf0f603b4370c8a2d375d0279534f54b49dbebaa75c73695f86618c986c2e816a52285abba03dcb685f49d986ef103635e26d0f061fcc0035a1b548126457145fe7261556c187386020d731ef032dfc7d3b088654df1fd0883c4f80da51ced90d4391f13dce64fc5d1ef42c5a2a91ea43f55b02e97e5c0101f106b3a87ced7023520d376f8277d8344eedf768d44bebfe894745154b169038a9559225285bcb2ae6bb43e0a61175bb2afa62c0526eef40682f2286f9fa5de14bc6bad164240dec755f3a0fd1e30386fe33f126d37466b4dc74eda05a691481254795585cfb22b68c8d90c092c952919a669347e8d762d2b5b9a1c5962be3373870d08067e2d181e905588fb0a9416229ff5c1a039e0a3fe2aa77555fb668b90ee036107ac11689ae5199edcf234ea3000ee49f30d81171d3e49bc7982de910cbb31d1ddaf25faaac87168a687353e8401d773c15e6dd5530b39593dae07e982d05f16f73071a84f52ba91a6eb2f64e172fc07338ca3e61a3e82456c6f9a67aa7b0fc072b02a1d0e6f5482c6413e21ccc97c18980f284c9fe0ee6884ee1825e1c6b2e8b83da227ef984519ab11df1ca94ee0c3daee7f50fcaa2c26ab9cd5cb9eed8c61dc6fd2b7e6377a881ce589737ebe7a2c5928f0ef1909c3ba22e24dcc86a702473855864079737d09cca53056c845c7df09012a90cf1d582ae2ccdd860b1c1611c5bbb95e31405ebd53597dff85e2ea52f609a1293d9f01d48dc6d7cf3bc5303b3a797a7eddf3827f9d404db9b0f1c8b7609b02cc709d965c8326ae829043a00b9b74d6bef98caa4cd0999f59d39c6cd916774954812a85de3a9a7f2ad19f40d3d46ba1c3304b28021fc4f0dfe9644c0853fd517f3e1e9b19253dd74bb5834ab282fe69ab5b5b4ebc0ea8c1845101c6cfc6cee9e94335264e76e8e82cc5077ed7216b5b502de271bd41ace0af330dc8db1aedc78d04e57f967912c49ca971632afef0f6d2e1a6efda97872b51969fe90310516ecc34fa85cbc331685c17f7d6c645fb5859019719ad1f381a5bc73335d6659127b8fa43488c1e2b83ce3187b2452b13d07065328dca58062088f9c325d8be1750964142134305874b61703b151fe6d292c3a94026c28084632ebbe89abca43f799bc1f0367dd267954489339b8ecb887b461408cd77c4c36f9fbd4178c1c494f27d66e949f74ba00f7d21913d4ae4d6f870be58e2324b20abcaac11f4a237b72b134419ef5209009aeaeb6226b471179291c8a138cb30361940d7c90c587ed3d5650c4090af1680df8b4de56ea828c2bac594b00b76d765135a950ef020b8004baf2e9b8abfb88e82e31fdabb85ee1c08999f9f3348919861074fc93687b3575eac2899167a1a04ad27ebae31a7242bb63654501ad7d00b48eac81989363966743401ddc4a995bfe8aa204d573a85289f4ea33bb5a7db51b55ebb8d84c47e7e95a254815a02265709c1f5ce1b69bda1b505e740e1678e0ee8e4c9e8a95c7f446d9260b86c6ba0d55209fa1b600997d33628762310e0051928a1d17933dc0877dd8c37afc6a9e97d752919cce40b4dd1109d37a3f1c53280c1f90b090eb034b3aab7f0722504101d127eae24886f7fca3df4152c1a89e4a30d8593b966ae8b035aa1512ee21391e5bd7b8b019f8aa2c74dff00421d48c67dce184469e2930176c292db95dbca7142d5cf374e1d5274687005d636302b1782032316adffde75ed24c70452669b744318aeaf86b4eab843997051375f6f6926323c6e0759061b5bbe31d451eb25b2f7e30a001404cfcc0e5afd7b864bf81c8bcf0fee3c4d7f8c6e7011dcf1563f752c45b5674303483220911fb29122a17c65f26af7783c2d7d65c142a49f0e11bb6240eb3944df56308e469cd99d7aabf439f3128ab12dda7c609b43ad945cca72ce1700208f90dd8f0de5f4432d8f7df7e1295781fd64e10f11daff1faaf1dc5974aa0da5be6eebdba03b798157f62c9e92e151cf458b1a1b836c047a9ee48d29609630f1c262a3fdd6d28a6f9767c55a0940f9789813316924e197fc3af39c3f96d338ee96bb1d018ec6f2496e9a8914e528ef2829383254a46f2f8a9060a80241addb6a13ca8c48e0438d7c36815004429d822a145c2cfd3596bdf0547abdcb6058dc0ebb3c1f909bd3cc532cbb8e6ee4677c05d0af013712190337ae6090676532329608dac919b889f2c47553a5e39f7b4d851633e4f0ea79e016a6fbf0f92e04da5709e811310cd3c226f4a0adf17d25a7889dbf8426a81839ebea98538934f54a0cd19f6d120263306baa53f8337d244e38cb8d54424b8686ab606186f8869cff36123620e80292c3721bcf7b2793ea9040fffa63cb8d563d91c0823d89c8ce76c69de7b759404dedabc00044279a61791688513f2723bfa8d820118a40681c0a329bbab654832029dd3468e5796e24a4a8638a298de7553733e2085cf640fc7eb7d0860e4c0d34681f2067f6937936a9a2011e9c73a0055f2aaf1864cbd3e27bd7cce37e8961f7d060089268300aa69395137d8ff77211db0ce3036de680fb251df2adac50533b6deb9b83f101a1b8752d63256dc563fc8754c7bc8f66d1000a54db3c59b50337f39f83284c3a4596af771795ea95fcc59ffd8856db628ef35894e4c4de38e86844291a424bcbf6b66102fd6153cb443d5d16569ae086a03c28031ab5e64d84f32213868668641629d171b2d874336b439ec0c2111ec1269b72dfed060a2455bfe9507f51e05641e423e1d5835d5a9afb3cc4b32b3e214431aea6f9cc4b33932886147609865b3004087ba5d562b3236396c9eb88403526536e50840872a6f409ccb6c79372d98c849bbe18c215333fcc1ab9e4412b536d794697172c2a8c6e201204d61262215d450781b87ff0dd4aedbcf6d204e207afba055dd4f8a38467c9e05df7ba8b889a323ee0010226db876e1e6dc5c42d3f8b6ac9fdf5e55ff4c30798134abe6b130224dd91b6c703377e62546651b8849d598230a6b7c165d35b55e40bbeb1f5455e3194574ba1439ea6b4db0ab00f2deec011fb4b6ddd776af471b501c5f9caa34b4d97ebc21e81c7d606f3b9c500aef28a98a4cdc71e19d396eb4f41b9b1522e050bca6033bfce0e04e538fe42ee6514cfd7dfd12674c591d50ca211e6998eab8b6ba299f9aa818b3e43c0768dca17c81ca3d8df804bf22e51a45ba7e6f27fdedd0722ea807182b918d1dec3491393b52ff3754571c3033840da046b00532075c86fdcf2570fb35325e38df92b411de04cc20a64439e24aeb60203149cddb30ae441cd19e10c75d7fcc540f5664e944a0ddfd9e74100d60e4ffa624e001f672bc9c163facacac69dc923f994d18e9a8a48ff37a427a9f6ffa0bcfdcb6e6e5e091e806c2d90d650a139969360b3555c909b2bb6a08e9422e143819230333d731ed8856a52ec7a7145122d00a182f4b2e7841d89cf13c989f6f38ae168b36745b10d037abf800ed67bf89af3c97c317645f6eca493372eed63eb559efb6f52999397f7079275ad3d892b6b3cb5a6fafa1045f2cccc8e40c71665be7244301e172bf73bcf0da51a7dede5ec5fbdf0ef71d3127b93f042b69602351159577cd81a6e14ddf3d362d92eaf6038ed9b0fdab9e848a4d250f336fcd62b107d70ba8fdf1e5c72a3d9e3ef79e02dbb628f8d9b672e2c8cb0bf7cea4260bb85f9dc83cb436b3ae723d2724a772f18109705cc6815e09233527599655690d71203e1d424794bbe631103b19cdb19122b682a7f17a6e7057f8da235e91bb672047afd09b2012ab42379f229966495c3bf1eab644540a16d84d25d5a9a0da802f67389ccf424694592e41199032a13697cdd603f2bc1bc25c2145a92e0c418ecd2237afc420ee506527681c29980a012d46dbccf0df0409bf484d6581e14cbeb53f6208a17d447ebbc05455a60ec8919305fb8919b2f2c42e70bf1d72100a4677115449a1018c13067b88a6019b8d7b167ed00da3961f3b622d1f5ad6120e4f0d25fce31ef339f13f68c7429cdf6cb27d49f0dccfa32146ab9be3281a58f466057b36475e1c94ff6b6c96f98c5e0f78681b1cca9703a94d295dc2a28fe5055f02ac9c8d354727c0fc34d52889a8c11c5f65954b6fce3331b706e68b0eb36de00b82ceb84014cca119515c244d083f8f11b6009360a85ee62674261cd4ee0b9dcbcffd57aef78250d076a63e90f6bc486326131ec8b10509cb42355633be29318ee8f9e2f380adbec213b57175f1bb0bd830aa927d77d66f2446a7588e3b8b3de559704f8e65d111788cf474b85d994759ee3755339a594e7eac2dde246c166a2eaf1c444f1aa1bbd1207773e57f45f6e75e3ba7a8b4f0791b59f56e0a100535d44bbb21c575936f4d375aa29f2f908191e5bb5f0cc2b5b04d0b8e2612ad316cf6293c8e3644ce8ee81ba86b4d9a31c1b52088e862c0ac63bf76ed7861789223618195e4e65019592c88660387a0fb9fde9c90188bd9c0ae41632f259041853984f2c8cef59e4c27150bd3e8b5319b3629a1ee6780692fa01e809b6eb3f8585e320233855c45f83e787cb13c2f873714fac801c31621f87be608d85367568fbd704ba18cd13b65df34ff6f2eaa9b1f734fa78e80d9e5e855ce40f9633f6201ea46752d9a1fd3b8b6ccbb32e779b8c00d0102e9f24dec4b4208a91db403f41e0bef04263bd253d2b7001db02d04d5b908b0b7b2c4594725aa184a960e003552cbafc73817f21d087b184625bebb916c3a97708bfc6ab2d89c397304221b6c2c87fc75fe9ca054d3f25d7d6dff72fa8540b8d867a5585617ab5113cf0c3e33eca2dfac7ee337ef13abb85bc3c4751b9bed2a95a08cb2fe74d5cfda17b1a58252c886faa90345502258dda592403e59338859f4dc12af38319a2e17ba65ee06302868d8292ecc740625ec28d878176ba440a7c18e96158205fea5924883258c1695450b9b6bfa05e0a792d91f94d3481a1abd15c1cbc7b78fac66d25d83dd2309d11678b83871bf5afb4a00fe757feaa097e703410c3f81d946cac60192933a29c507885050cd4ff33e4709d42cb2a569fb151eec8570ae9c7d47791dc461c275093a9dd89b005a30b8416030647292366a1988c406ebbd8a1af94c217060d6022918165bda2c2d76ec04460f25a2dc797d27dd778d654f177023edcfb338ee7462ab4cfb856e597d2c12293538c5d06df86cb445fdf441f1b0cfe7fa41814a93d47cd813d6447615826910393adf117390eb16b2df8ab54596bdc490f1263492f6cbcc232c75b728d8fe1ddde8c9694816a0c63c67c80f8802fad931efee88c31701ecb1d4815a1b42c122f033b8aef186bb80a3150ae67c7e9c364d3f0251582feea12058f4663d321b8099f2947a1ef60efefa5a83cda11ecdda48b9c86ec3485922e89cad485da2c759506224dcaa6e05cf9d5f7273377f0d08db623c7b494c76dae02e34f53d4b0f246c355daaf46ef982e40e51930a4500340a7e04899216f3bcfea3cc924945f16e3b4fb2974b0fc5e16e1c819fac2692506e83fa12095e7164544a0092aedc94d608b2f238d81153535067b0e1583c63eabef2e9896c1e8abfb708ff30e01895ffaba9d2662197796ddf0e8af92c9c49bdec7acdbe8da6766bfc01e13a3a525af2171431d7abef076e01e3e23d904cd7000caf27aab38b8da8b23142322696492293edab81eed212256176ecd326d0d6d80fa44f6497821d93993830016e6e2852a9cdcbb9c5369dbf0a12d00804df9312f98fa6654d2800216196053835d0b1ab088aa6c99b5d3c414b94b9291afaff68fc7de86eee098a11640c37f6235b4aaa83a6cd48be7c4067cd6cbd4938acb1e9cab3c9af3c65ad69c64a97e728e026e8f0bd94f1d3fd1ae32f73c53dd4dc1b22cf3364d05305579c673c13979888602124d66faffd2772e37cef415e44fc0ac743459bd0b7974bdffa61920d5cd04c93122472a8239cc4e438776edc64465f9b538f81087b6600fb8a1ea958babbdf0eee8db9143e386525710c3e4127363d32623ccfe3ebfe8a3137b35707a0e719e73db243f52b2597f2001c283f79fce6240eaa441f19533a58be4b0815f18a8a3d7e56231ad4e367e600706d24a0738e5dd13f0236f666c4a284a7bf1ca293e5ac84ec15d37476539eebaa888020e2807e687f4172a04e4d3b5d866e893378b014712755316cdd0efd3bda817fe684ff920cc2733192c500c2f5a515785d7861190b078809655075bd9577545974c8c215331ccdd180d3f66be4411fb3662bba20af3fd89dd4c6fe62e2a734c8d619f2f01295c895f569540604e09aa7de0824a553da1c5377a313d22dced0870c012ec38f3f88de977ac8f0993682e04579b1643f7bb93dae09b6c8bd6508adeaff14ce19de2b24581a30431511b2964d12b831bff4664f28d95b56ce50fae3fb0e8f3395cf129c8be6fc24bf847304f7c62b986142cd568ae02da73b882847a76e67bf3873a9fe4634cfd1bef1364eee5c6f835b68640214d22c31814f1180dab8235e178d734981b25295ee56654d28f54fd730982c75bb11d8d99e8f9c3af58e740c1dde1aabc798e6478ba869fbeac50a72c6a999fb4f5f388ca0a7f20c6a3960d7fec82d4e741b2d8683176be3ae9b87a0a0f7beaabdd0ad4a8e5532a85483bce1c91bc01e3c989420aa5a4bc7d0c4fb2594453385b3456b8fa0de292d4955bd6b297626e5f8a37190cdc35f896b54e5416290c2eb4121ec2f3805f6c384428a7a4a0da65338f404c7acfa288014f8ad07344af152994e49123b9bf2519e6c1cd0938947ad83ada85c7d6eea2d8d3249cf695c6f93437668c6d1ae276fcbc61721617ff2033f5a01f560a3f23b274ab5689a1501970267532ad8c85791855bbe61180ad8f75ce7510c0a5523b22744ba19b23fef1a7c82f1e1715f2224267d4c23eb871c61db474cf3c3093a7a5e40c4bc63cd192cefb6c8f1e521caeb540d0de1b46d068f80ac685f411218f95613357f6df5fe5e403ab31f7d4658300eb629746eb042e1d1e1e4689a18f10b4e63bc8abb2b611e68d88c9bb1d494093971bda5c78af679be1e193c716983c4bc4cf543a03f9d9ad008be12e38f29cd225b2c3f6e2d25c6ac48a22283c1ca1291fb7fff95a87a3e20cd5df5d8a67e7e41d483b3351615bd723a7fa967108b5cf731781d50474c262db80a69ac92328e7f0762bef56280f7ee50d8a962abea1b7c3a24beeda726f84b560a65d44e1840d08cf394d612290f4eade206d3b6afc951d0fd661a872d820b029a0d1767ff08c06e437ff21661eb185c46948ab7bb6e5e75d37da7c6fd7db99ac7e4505f61b5cd6a702ee03ee34ad04fef77442f5d356f9fec481d7c57824f469f45afefe320316570082bba3589e5a898abdf9538aed96647f590aba1b42e03484ea56acd41eabff05a38b47f790fea172ba1d0ba754d5f7ccbb58e14e7902493578f6e5aa6f4b09dae6be2f17257ab6f955f8bbbee82cbe0778df3758f7d0402290842367617df840afe889ca8e82b31b9b44dd0054ebe74d4f963b4a954366ea41349330aad28d447cb28d5d4c328b11f57afaa83a4d2cde7159461694110087996127829661cf37d887cf4692b700586560e5d29022c4186ab06461758b509b37917f43c18bde28c7ec3c50c324b08a5d3dfc019b18a6075c55d7e43c87ca8e64e8e568711f7b6108775f63328b6c1094c9a8503fb519e084bd77d3225071fb34dc8996b4429cb3ef7d41346184af9a44770ce15d7e5397041e927d7e24dd772eef4cab09a15b641e9b4ad0381e5a5a2561a117696f6b8875eda8fd28fd68c21636b8682008618f4035cfc0a7e6e79e2301a0fe35bad53aa405bbd2584ccd48207f131724c3d7b4495c0d88e478c44e3086f5f1f483206be278bc8903953238f5957167fe760d014be4487d88cf53ec614f69960119554b510040e528f933202907ab30484b21d965802089dd5410765e2a7b8541de0060d5ce270f8f164df21887aa8252272ce7b7aee1167c556b28bd8d699e68cb37e792fe8995b6b32d5f4ebb2981921a0d58db36a44ca13bc3a1b173245fc583d772414c23129ed4f9a7a7e2dacbdc35966f8943b784e8648f901cbc74eb1b655989cf29390a7a67718d0300a6492a4d49fc2baabe0e1bebe9cba5ff0d5a3af7bea6da30c632d1ac23866b2c486e7a51df8fb91d2363d80ae472eca2b8e4a1e86bb70428cccd8cf19f349fbfd04e95ad93d36447b2c642f9d9b596e9c2f7d089f707a42244ca6b8755b3c146bac8b16b28f2a5d851af20d5942c05ce2d6801aebcec945c6ea27760de81279f7b8172a086fa25f8149bcb95e1444bd3fff273c7cf3a4cbe1b74a7bccef6754039779ac7bfe7fff8740f3d7740ea4a859b3339985bcf7148e12e855d6d05535b6708fae6e848a3719c18cfdeb6a97f770a8107f51ed2e447f76c7a06379e0fe93b6fe7287b47e4f068ef1a7d8a46e05422c9a52993d705f8ee8a46be510921daf616992c933074f351c24c9538a3693c14a90c0c65333af955c6a82ebfe6c143c7d54cef017408104e8d6f0c1349b2f3898bde8f4c75a58993d195ebbe5cb7bab93bab68121d3bf461cd421f07b002f3dc42d974b5445293179900bac2256c13ec34f9cc5a8eb8af2ebf914afa09fe77471b9c47d0619ca9c2ad381c4a455fa535f7bf42bdfb2de26b2c3effde0c1bd8f36d08bb46c54f25772bca05a06dcdb040d1e628e971e39955df4754b6079d1194fa7717b799f3cfb9ac446226d11efecdc861a2203950c0162b6aa0aa256a46fdf7f09704ce49912c27d7f57d4de5f28c3be2c8043ff4e9c48a855122120c0bdfb73e0d0b055dc866627d778f582db4589a855ac56bc374b5d27d28a59c52bb6a05f2b9c20cd17cc220cd3e10b5fde8579034ef2def362a85ce5d418bbd759ee359540bad68d24260d50c4380111e3a1f9d1e5497684da39c82f6ff6eedff64cee3bccaf942d51c37feebf2fbe7e513fbe5cbf6a44773bf91cb20e33c7144caa97a2d9227d02af46c90a0f9e764eae2bf894b5727ee5e2002e75b18ba14e4642c972d375d40f077137448f4f989eec704bd28d6ec7c60b44e591adc6a1074af05c258041645ac46f555cf9b811c0fb7536456af8c6860aa3f76f4e34a34069187af9617722532391a8233de44899a6dd0d04af4fab8cf6de928e28acb6f0ced1d089ec120cf8de627af9fa4804c65376787df5b7727c48fc0ad90627a864bb406e18f3c13eda503c78c6f0147c13d34bc0e61d2a9b60a69eb249ddaa1948a231dc2c998cdd37edd60bd98b0aa519a896c3fc8bc25202bf1fc167b942b88b15eb02206d12a5859d55b5874a2828b575c7357f10ce2a2e0dc252dca5f8bd57b81590ed50b67683223cc0047b30dd29f8f301ed8e737e1f28663896d12a77167d3c91dd3f6acb4cabd5d1a394d98c04ba7d840fa3ba59979e04c6e16dc19e7e0bc464e2dac637e6b15db47e3f0a2e10811ea91a70076293b1ac9268566a6b79096fe1332a9be4f0632547954af83a1258452179614701db5d1eae0f66bcee0d562ed30689de9393a33f3f19845e0a6736f0453af873a5058a63a408e511584954bda63c038ee29b2fb5d673070fd513ce467485958e07a533afc9f09ff243a5093304a659c8bc13e61fd229a9a0f0bdfa7cea87ba31fc32316a091306286fab6fb07df081fe0ed389cf692038f723f62ed09f97e3fa9db0961df98e0421475000ce2783510ad37c3e72ccc0ddaabd9b954f47870a46b6fd5f9c2adcdc699af4ea011f8f874de4c0cc0e8b3d729afb1ca9f5a4f80fe093faa21e77d1b169fe0099cb0245275ed033d572cf9c4163f06baa9c6fb573e11c9c0fec514722a4e69150c61857927bc5559500989005faa0ef1a749caa9c06ec28fd21e50aa000427b5ae2f153ddd31e815810e90d679676aabb82848ef993d232dba436b8fc0fcf2f9673080d18865232f1d3ce9624e2f67a73b922efee0ab51dfa3a28e86cc6562dc4dbfcba02c7287bc3b037bf0e627a6518652bae705bae288614bfc295624dd93ab9f6526b8a171e47afbbd3ca725720bbb4d84c07f83b6baa42d6f90f21128b1cb141837aa40e33a0665ccca638a70101db4f60f63c9e81ec0b20148e928ff8db86cb25ea35a4f29aeff28885a52afa8c151519265892fdc0f482270aa8899fb5a7ed710a488d6b35ea8d0eebf38eb71c08d00533747fc75049f6b7f518df7c9f5a626dd938783580d0d10022e70529f4e08e25a484319893fe0346ce2099b58ec0c1edcc61b40df14211856221cb9be195cc4ad100cef0313ba7054bd7d065b2014d7ad89911b047e4af8371885f9427003c2573c5b3401f40971f095a1de117e60c9049ba7e34192ee61913a32749a2a6b5256428bc532230423c98139ac3807e232f9fb2a2bcab8666506614a8b6086e30e40b5cc3bf3f2e863dc23814f993a8c9fde996721b6de9a01260a6211606161c8051286b1c5c2a81eaffd4f8686fe7f1ee150cc52a01d268b7029a7a17f096524631ee7ce48afa5d3975de8043df396c0c421b122f54fe13eded3e561b1c2a726f2b0cd12ac2a610535e818af546730ebfbe21d492aae80d277be1df9cf89a23e7f941c7012e2e425bbc8709a0109740fb4229a7d38c6f0854838ba9e80bc1911c32eaeb1c8a6a4e14f47859a8652364d94f1912317bf545c733051353e57486b82f11c2d501cea959382c1560e54470e9edd45fdd60dd39e820cf3022cd69315783605eb9ec143f91f8e8cd7998ad62acdfda24c5a0ed3a6bf093884ae18bb59c16434f467cd640ae496503b97f741c042fb041080dd976ca4708308edb7a5b4beb83de1c52b73a23bf00ab1a260444e83e406ced88a045338ac639f08cc694575f82a214c87846411f8b10c72982f359f557e36f387f6b36bbb1ab50fe8cf7c06c8bb9eb394bf24af15184bb507c7e62267a3562a847f79fa3fb25773712470ebcd885e9a6dd51a1a64408594c3d1b130cf01f41a8fea00976879a47a3eef19bdc3e0b9547b39f6e6dad28f00a23b837fa6722828079d42bbcc7ff848e6665f8c8eca46ef01c9bdbfd3734216079dac96097b95d8ca90fdf65ada837761759019a0c08998354d4ae5bdc8f75b6a3bd6a50f481a060212b81bd553a33c6c0f90d2622305468a33c871c4fe0a750f2d6dbc150cf1b86e2a4183f61e5505d9a02176256c68b947cb6df35dc82d215ca379e3d17901c13cf087b09ac09ece8f86f4a892670709e1337b45b3bf9e14f7bc14f4456963e921576cde885e4d5f0571b28f70d156ec507bdaacb1bdeb693a433c9e148677d6a0cf10e0ee2dc36089f85e5dd0ee7633cecf8e87af1ae6422ac3caa7065b875f8bbca2389821bcfed0ac8ec1f1d5e55ee33fa2dcc342d3514de9ac0626762f488e19e98f460c6668b8dcd99d6ab71293f25a92ba07982e800e62968b4ab442888fdd87c59264f64cf8edd63c7ad44cad5c08f6766db5e93ae8b6529ef32b0f1bab5f3016dd1ad39dc945efb96653d716fab0a67b39482df136ee2b5f35fffb5b34c0b918ed573b5937899a64442d6ff562f244e16166e80c7101f187138b637327023c87ec9a5d78cd4257d4892e16438f94253a1f5da06e01509d69ef179c1432a43861946771e8d78273369e19b147c251ffe00e5a51d0a76dcf436f7f0d36ab80cc105909fdedec8f5504bb8ca840b934cc556fe65daa355a319b78a760c492abeeedfd5bc9b2e28addd1ec191f1360d4680ff85520bb9c81e768eae781e0321920efb2dc900d36d37e573b4666d0d6f26c9e174d0a7bfe2f12dbff65bbb5e274e43da6e59699939e5965066f54b19d6cd8b8a0d3352e9b4e2d09f123c63e605ada3392fc6e16746d534b7babe344b3581346e24950fd6edc0b7bf6503fd8bd9b6a6139e0c01ca579ef600194d159d0d38a68ebc09f643ddf643bce5ce42be96c8ea983e7909971fe338fd5ae34a848adb7c4feb928c96d7517bc58f541f109e2c6f42bcdf17b84f3923cf98bfcdae51cf1cab1a95a76601be9a649a6588760e9770004fe22d28d08af43dcb150813c9d250fa464366fb9e4b70053cf9a4b13a0b7a3557e2c71a24f8d0553a99c2573202442adf9e030dd32af27d62aaa843bd3cf562bc3debb42f860942056b74e461d7047a52710635a1d3d18de43eeede3a33cd9f1fc3513769f14fc13641cd84b833089cebf82e3bbeb7dd08b7cbcaf40df755ef25f14fffb4e5e2b8749f7ebc4fa2f9fece726d92b7f07be41d0d1959f7fdfbe4841dde1a92eb6e5f89367237552051d7b3ed8cda04dd377f31e8f9bc264878f7c9123d8a5aa46332367b3d6c25a1cb42e80ce590ac74434e35c63f653f4ccf45b4434f33218ca51bf6cc2e94fc0f799c21c7443ecd8c35943e0320da0cce6bd71778607fc1ba57bafea0c7712c5e20d5ff7fabdf3f6a02f1f947e1555641d8000083319b6f71456bc8004a2ad8e2891faa6e99b758a95b18339518983c6350abf99609400120ec8b7c3af1585e42b1ff1330f69e8e480f73154b8e4a74d8666b2bf212704470dc2abf83a74dedf38ca8c723afdd170f56afbd6d991ab28cedb2adbb8186e43b3a148c658233cbdc8a107f3879256b7186679ac5177f48106d7b0a65e5956a24d580e711c115f2e10cc44ac2d970093f698e03fea7faeb2e8a8b3ef9750e58a73223469fca77cce0a95667a59f7a71e255c6ea20132be28ed6fc5362f0fc78dc8dd26c80b2981f1ef87ac918e73e358eba69ceb97f5fa6f9028584001439db986386e7f9c118c84d9ea4c4610ed4c04b408d68d486b582e7b9044b02c8118da727bea0a1eaa0a1999fad5196ccab6113799b0c4019b258efb6c424fc570eaced6046d23bccec8c72894c51b8b023cc3110425a44cee03c016b3768e1f378a99c7c355d2630d8701a6823589bc9d8affdb31078c919ebf3f2d379351137ae32db1bd8191705c7fecc4e424598f9c9c1d7db094258fce85253e4971b18a5a5d3c25e3f065fd2fae19972d2399395c3dc1c8cc7681d0073ceeab6788eea893c749cc16c71899417dabf0a91c1e75244f06286d04bf5bfe5d490eccb344c6b01abdae7bd7f0d57dc36a46ac2f750a73bad840e35e67c7097aec1b91e168c026ee9dd9fe8da24b10e20f25010ebcb008ae336bc8fa6bca2eef28a1a75c5f12c3451a7ca85b15235e6f81a166b855227203d0148b6876c66dd06669158b78a921af2b66c37c450c5eb48de776c32648545b5763a9154385a4b03edc3d9b76d0172e463866355bf7574a84a1ede80cb25fcdff65185a8e0f3a526a0e6d2f0ed25095b7f32d5c18395eafe122899c5b0fad504b317799f647c37077803893ef87c377f1233e9fd85f730f0d6f5134fcf1fb63bd727d027d60729f968d4beb38c6a12bad3c6de45143db5a24e70d58428d7031e7a442f4625132bf1de517683c3f559f6c41b96415aaab75d932a64e7d3f41f83c0a2417bdcb7b9ad2313ba1814ee605ddd0f3d415878bd2b17cd7363b0d38ac05ebc6370613520076d084d5cb632418c1044e388a556e5dc6646f7282add97ae5c84908a93b8e2027a36cfb689ab1f3ba2490a5139b36032f82b44323e401747d7e1adefce66bb1b92ff1b5f11400c7b3ad72567bb82590ad8c54d4e5bd8b0f1381341cf0532cdfc79b3b539273d701cf0457cec06d70b6f9b73e20122b9990ca209aa318ce480a966e3b30445b195982f4e8514092646273c4a42869f95468d073bab646f33eb8531c5635d2322cc15ccb75af429f67bee2d94c9765286c70e253780ba00664d097d6c753740610abfaa7987b7dcbff1eccb5032964f41bd4e9ebd35e0a7468d906690252cf6858edf98aea04c9a6a556b25cfe599b4acb57b7484dfa40cd7bf3386089c695e4b80e018273ac580be8667d67586a2e83577ef2db4f0a9f2770093e5feaeab666a4bf9aa8db1fa49d1adb34768c3194f90438466a44bebffdbcd111e3454701d104c8c84300f4571fe118ced43271e887ebbe0c28a6bcba3cb36cc7f98344a799bcae8e5e0d06a01fa2c2798509d1c87cc51d810d1c48b854e83f627822a69352c15038f30049b5fa60e293859967747ab490e88d011685e945617e8925ef589a9f94e9f4ad6e69cbcec4a3ef38208092455f6b4dfccf13e04e6978a6ace1c98b5f263a0b033e5908a7f4d022d643d3b4c063e468d2c4b842d81101ef7fff9706fc3fba8eff0788fcbf694821683606a222e7f80cc217786a6842444aae81541cd68b653120765a4f4353f1f0dbcd396d02d44af8702d79cda189f3a526ae0643347aa15919abb502189a573525d972fcdd38f018184f673b039b1ba835981a613f7d1630e28a2439943d61253fd4a5781883c0dddf97af6e87df0af64c9b2983ebecfd4a61ec3dc249a028aaca5090cc7117d2c7eca8dec9993569522139892be929b5bd383978a03f7c4a44f046008368cd18005a5045f2aafad5ac62e64435df181014390aeef2fa03f82588e6490fe18c10eade51976eb59c0023b2d96d9b7c8d9973931f6ba0c3aa89de90224b161c8ad968303557527d2250d0c7349b870e08779033b3782c9e8594d29903da23ff6c8d5aacd01430f5286bbb311097bd167c533c370e4d46c27aa68e84f81a2900c88912d959155fb1d9c01f4f8aea3ba1e49c2738ac3384a96471e3bc8f41a6cb1308099e1913974d0939e5bc202e3b9455b06029bb6d06b14173ac3141b6e140c648a64bb55ae7fd14fc679b261c5724a142e3c203a6fbbc565cae8fbaca76054238381705262f76d7400492d01b3341fe0b11f4bc7b5a8f745942c263d1684f49d8c72030a1ffea8d43597dc049e98d40eae4df9370a54deaddeffffe04b72765b92d7180c96035e7424893d8523846b83aafb2e7b3081a4d1169f4e9bbcab7b46ac68f57b9f5cf340ba90f9e9edeb6f27ec19ebf53755e75fd3f1602684bcdab2ce1b99ef5cfab9bcac383dd80c74896397f2b193c6938b9eb3999bb5eeee0c970f6de6a0dcf1d2e1ddca6ac7ca2187c94327e1d3009652950084701744f5798e530e0ee6eda86fd4c1acab9a94136bb409c4c943f3c5146e58568afdda6af9996fd537db11e0e979d271275efe9425fa94709d37ec8fc23cbaec3b9d9437e4cc1d76e95961a2acc3b5460251a791c0a06103f043deda59a1bf64d5e97d7acf5bcbb6618e7a85c1781d2024f708a6c39c0c8164e16b7697152fef0088f34a6dba36a3ffd5432d7802395518e900e05107b9993288841aba3bac74a25edbc4b1638a46c6c74cf2687fe9930a0bc858d8477bc3ecd38a521118407b4c19f7e65f8439a7f3e9f3f515a768c900f93567f5790aff6a6b7c064156fa1e302e016762f1e052a590bc612e1940a9cc4400a80d85004399abcd796d4dda25d2e1386d78b7e13eea52a10d8f986a5c78b4313f7e46032c25bc18c39ef3e9cce56f5a2ce6252eaac287813e18a1384e574f214f23c72b880bd023f91d9f05e6974aff6e97a7af3b925cf5e03fe0474161954f1f46074f588f05a34a665c038d52aec2309e32b9d3a8ce5528441af1e444e7c42b0e61cbf01138e6fd3fa495c1f59fc9716abfdc7814d3dd94c9e736ad5734ef8fb6b6b7a0c2405e2aae8cee98cd1f8bfd66a5641781fdafa34f1f90c5bebcc6e884c27667719cdc151caa634e295bb80b4c7f1ea4fc7aad4ad5f0285c264062b04cfe6546cf16476e87605c686a9f4c860136343c6350f19774164dc7c22e394999ed1f328f7949cdd60b319fff8372cd488a2ba9045751aee0f2e924b8cb49db56bcf8290ce571a3f12bd1d7a555bb7dd607547f6a3c2fa4cd07551d1bc93306c416ad1a5c05a9db8ce1d7d3a50058a8444a80c9b11b4a5e764ee7ab84319d014db88cefae3028ddd40ae6c5d13a385b4cae827d14f82afdb22a4aaad6ab7a123e4be881c3a0890f4262a5a2e121f41606fb1f022c1d59c768719284262723083b5e4bc73139d3e8526be222462bd51bb4a48343ed90b8090907c86c293f8446945cccd8da66597e3c60443b3e5e95ffd1c4baf0c3ca8b5b5fc8d4bf2c4216c9445e6ac03d5a15cb7a0bab2110b8ef110f5e6f48614e560da8942cc472db06f3153df220e1a44455f628151c5e8f8d011c806601bd47f50892760fce5728342341a0e6424499b65b82807f2cc3250032cdf259bbde6cb027262961adb05fd25124e62ab6d8a46110ff74e1021911147f747b0e374216e1e78e415589cf72c7f4936455ab713db20ff58d6b90e5b1bbe9c604006850c52c31a5786c41b9b2c434abd1d5b7d7065b29d07125c4366a81b3d6fabd32069c85ad9e1b8f97e86fdadf219534f3acd1895c5e4a57295138c31d0e58169d4ed9b32afcbcefa31451253cce0aa1426d3e75e949f957be284cb6e97aaaffce980523642dcd9217f487fe2a0713249a4b732e1deb200906a08d28a2b6e858c1ec76946686b1002f92d39d3149f2904665e33cc865dec3301ef07c57305c07c5a6d9cdd542eec6a745a455b85c2bc506587f9c2d74751825a813ff9f28e743aea3e8341f846a7cb595f0820d696d99c8d21daec520729e31e2d2158d8e5221e276e2cd8d99575cd422466b34cae76a0fd8d4059a0f0118e6379e182d717bc3032f80a764c778c1c315c9565ef97a26fe8355f89ca7c983d16a97491b6822594e0f2d9afeb29a55c1eb6fc635a03ebfa6dacd3cd3f207eff188818a9ad3c1f81fa00b1734e8db6104c608a33765d04e5c5f58f4ee216e532442d4edd9d5dda69467ba731605d7cbd04c97e4291bfb40666afbd766b708512e6f756584a5709f271397d9a07b597dba3e29c86bb34ea8810e03fd1b78cb4d984f8c661d8d13a55fc521f84048f62a6e3ded820645c062de90bfe58c95790ca50d6660ad7cd8a09f97b912995b674bc8c5ee4c0b1db25c7c3eac7251daafc8d6592d78084e619d351ba3bbc491d3220f9fc0cbd983818fca5f5ea50f10527f51625d6a46f7e111f301e511d4b3cac729f3aafdf1b6415df0b596f003dc47e56db68c49f50753d900a8d6f32ae009b341336d2a56e6ab911a5dd823a0d73eddf9c3dc50f5399dc812b82beb02defa0bb9b1070afed43cc71eb1e59f5c525ee1ce94d6a18b69b7f56dbfac1994a8a0d84c5c58f40081a7406b3075213dab569584616f0d1bf50f705c2d548d8cbd27000080fa3d6470d6e27bc50f30724fdd7f945691537bb1f019dfb410b971744b56bfff170dcc7e960e5abce9db4c5612518099abd614fd2354e71157359ee760f9be0855398fb343df915d0eb37b45eb82a0598e3fc41233489ef6bd57d53a957c1aa3a0c9134b88dfeeca608633371e14a58c1727f1f68b0b32b7a8d5cd43b030dfb7e00ec9801114ed742ab7d97d98b7dc3ab6a30719081ab92f6b7090722c37809035807c3d8ad0a8de29f8d2484c73d16f6017e73ca70fa2409a7bfec8f702a346f22c21c48c1488423d508c1105882910b30f03a8c618131a0e40abd11e3ff451c794246deda984b101dbe3fbb8355e9dceeafbe4ab8c25a266d5bf8f01b1f9be023544cc1abe43f522deb78660546f4ad04a8c942d1377acc70ec4f58501b1e9baebd3d05041699e83ba56f79c9b59982c25bf8d204022c5b14c99b21615e5b71c9e63f301cc27a7951f3aef4bf66072b0a0059beb8e44c9660cd83e82e4ce1a12e66cb54c5ddacc318cb3aa277d5a6fa6e08e0dec3c2a1a7ff20af7a2f8a23b65862fc912d8d433f8ec84ddea723c476294b1bf8be5c962e363285f4e47e5e204bb5cf067f0c11e95864b1af54a1bacbddd1cebff8834643613694b621f602171b02dc5663dea3bf14071069a1145a2771c6db9dfb4565a910ed4ab881b178c1e19f90f5f0380363f75ccb1b36b39fdef39bedf5068912f55d0fb1e1903325fa94d148c81281bf15963abd0bc2f99c1556706511bcd7aa37d5efc562d78ee8e31be05bbcf2d7238c6caaf7060857914f14790b91a94f80b7727b96d7c2a8773e744f687657eb62fa711e7c2a203aef29196b269eb6dea82acdefbc563838a38fbd487a59b4584b090f3c1c01d0c066bfb00421c50752572422a6405c5ddd804497b172381c562c129db03c0bfc84ff3e0a908da4f300b50b4d633b4e4b4dc601c2bbe569a176648c2bee42855bd36ef393ac60c95e980d4d2b47288895991dae7373fd4094b8d02cbc9d7481b551d7d3a0ba368188bce09df7bb368d68c81336a11eb30c05287a9859354ad51194aa72fc5f945e8737ee775143851cc6214893508be1e3551802a1893f49e93b9b5cd3f17bd77a84081afedbb14720423636db86638698a18c610bd6f5db5245432fc744aecfb51323f944ed4f5adc5378dbb43ae30d044b0d27c4afbb0f40a50caf62121008456c017081a3ae2401c97895ccba6a5b33c6a3b8d470e9515981634668d6d23be76f0c9c3f50381cff0bc0b615e059e3ff4685a0e129fa494e5aeccf89989767aab1811be53802040a40e189b87aeb9a7b0119a550f2e0a1c93dbc83747285349a22d24f6256753a506b2e1d426cb58193d439d1be5352a75cbb9b78e4390a63149a7a6b20f4798012afe1d9a67e4c5cc4500fbdb8c86f335ee6ad6ffe54d92f2890781fb0d10bf9076fe746b49bffc7578c25eadc6547f906579381f1fac914f6826b8b77616b25df9ba3d1f6083eeee2686d3864329c5eb22cf7040098256d5b4f46dd8dd2f6d83c64930968843ad51e6c866e80ab02c5a65ba4431643bf95b8aa51a2cba171e4171b3dc2fecad8e413228c2070fc41f2771d9139b3ea7acb6fb53a59134bb0ad32e6a9c549c9a6106ae128a3d423c11a6ac7b0bc3b2fc6ee022edff69755ee0769165b03f582e58278b298db1170184e9a12a40c47e46a7902c3c847ad5a128543a7bc3b6870cc8910fe1a9bf15988245004c59fcc74897cf476c6f5b19657c62a92dc11accabe2532e530e86526fb813889d1df9060d751cfa63245390605d731126f3cae9709d5168e68a0424d3011fe620195f8f71f1bb64556567f7b51b8e378f7bf8de1f803d02a528c998b7476bc6b9d378a6e7807ecc90c472ff87a62d4fef6a03dea00d8c228261b1b6a738e7e627aeb95ae2dbfa4e61247dc20e5b779c8965f0de3409e628ddcfe17491f09d78bc4e32ab29d561756afd4cad0f21bbdf84e4ae0eb9d707289cdf6c469b750f36ca21e645a79bb816f170145beca6dcdc4d54fdac762af5890878876fbc56deadb52e4afc1c8e59e36231c91d0f535aecf2db8166a67cc900921169e26ab3301475888a8800061e5ab13b0c1945e0f8f756ba1f83c075aac949044f4370627ca0b347cb5d29f7283931ae29f0c0d4d035a02ccaeae8e7078171321b8029abd60b0937e5e0bc380383d19a4edf3374499daf1a14ffcfc0d0838c7d4d79bee3c0b784e04acdf013e28f130b5ad8cbfc27a6a67b8fd31a647a9aad90fdabfe2206a33e483d0706aff9fc8ff696f90adc1f48e63fa42bcdfe58f80d449166d6b644b7784faa67b0208006edf9031982edb6a74aa245d9a6b5bac93eb8a13a7840d951b93cd15c4d93bf0dd080f092b226f0ab098cf83f2fa0c2d1d7e11e73a29f927c981809c31faaba11858f5b365fae37e05af30cd51548790b1003e4f10d3960ffde8418ac484448eb28c60bdd2b876732580138698f32b90f4c06e3cf01308b104fdf80cdc5b81c5ff211d852692b2fba2b704c155333dd4d159e2d9f23499344c4f39809c8c205db0f21c718f3e7b4fd7426e373a0e1b15e185d4723cec72ea407e3cc09e7dead718c6c11c796b5884a0842e315053d5818a8961f66bb0e5d74d4b5e08e62c609d567f9e9fdbf14189c237a049a537cde04ef9060abe6b30cd16db496cccfe37cff209ee5f06d3f235d59f807e1064a689a42d134d9af5fa1f00190cac6b8121cb9f7f1d4f9a21ce0541dbf55b2c86f85bd48eafc8ec20ac53635d4d8468c7f3e759e66166733ffc624d818cefb31f52dd6da3ab36368713893afdaeffd9f76a1a82ab81f7aa2174f6ab1cac0a72e6d64064b6b42a572adbf4acdf769de0900bc77d91111bad0e8a60533564366731eb09a4338f6d83213e90269fe911ea3f5a5db9325f47f59262f8cab52e6440f0aa7a715ee854b510d632887004dd80bfbbdf22ac30a5c4b294a0cbfacbc10d7cdf3d1534c71a93208a8b298d299d3657e4c098c6c4f50998bce4e310ae083417c854a09bad932786a4c1faec77a38ff313596d6cbd83a18d90be45816493c5f677a77b9f68f75fe3938b90557a68b3803b00232d8a764ead08e979475123180bc7088d0f755def82cc34685f0ffe42091bb3b161fc9c6e7039870ce5a26cf07130631984957eaa973c50fc4e2c4d64f8d5cff04b4851cf83b92c6e0551c7c44526f94956a711c496f11c7c9c3bec31dc3e910411f621f4d44d963795b1bd518376560da53a7b39b82fea1961424b48613fb589deb1e5f95b2901b7fba3cbfde2f23afe70e6e0464ee596e3e06861818730a42c504851db3832fc24b16328c67d52819d5a9bab3e7188f663606b6d7d3e6ffab446c1a25f49f9db5051c62df33aa42bcc8346d6e41109a79220fed62993c005f9b97691b105baa359e180b9de1d1f6745972f1f97257f0a6346853a709304eafbcd92e863c07021ec0df92fa3230df355e22f45726e345d2c54aa81151e7818c3e43213174e7180feae9c5dcfa60130ae81011dd91991984c55e5677192e73d03d520b87933756b4794fa27cf9e88ffeb62e9314ed1aca13d920f6c2f473de56ebba861c46f9e85ef709bfa795b31706b6671e6709ce434cb49c46e13172788485a807cba70ec5a1ea4f089ca8f018b39d08690e1b611c7d6823377485c394055b8b7b7042ab4cdf57168c03cc8747a6ab9d43911d9c58c788351dd8d2c8f962c66f60064dd964178c41f63548605c992406fd95828083381acca062c05460ed526d13374d2b91f792f17cd9c4fc4298fb6f6d40ca04baa87a09f9cfd95ab68ee65220accbd3d13a8ec3365754812cccebded4306af3863328b3fae0d3f6a05cedcab0c12ddcebb28c50c3200c1d37348303a22982f7e1ac93c5a68425f0919b403fe6b219e0327620b35760153087b9305334668e8964b748d412017e9ff5dd0ee697c9bcf13345342b5f7bc4e711ab88407bca8c4015b1941b795fe2fd4aca0b68cbab79b610d64cf0f5739644b6b47f3c38c20168c27ab69d1b46b295468c8a34c67e0e9f1794bac4f3de971f56c75075bc075ca3269508b31b1069dc8a6db67a39e9cc07a54aa0b5d6520be03f725fe8cb98290034bb22b5f4265275acd7609b8c66cba10fe1946ccc7add7761391250be84ae0bb630e777acbd7da7a54c50c71f675e8772cab5909f5553d23e9e5fa642d4eafb3caa7f45f994fc5284fb043b8c49c45666372e335eacb9b1979e48a91e1610ffd0c8c687f77989194156623f22f10bb6d03d6c49155302af2de4a484dc1bb3eef83f727583c3cb2a9dea826c64f9a113fafc5f69c627cfe8e8be26bbb4144a1deb1a0379716dc9fa45cae767c8c2fb91d7da38ec1850b82e51e7c83ceffaa3eb41e756631c57cb4f20601c39a970a061f728e7e3b1c9113a799a010158ee1e5bb6636ac216dec66968a7c08bcec00af5d23a1c84f753a6e4056281663abbdcd1ff6ca1a4bc09663e2dfd8bea1b58edfc989fe452d669926fe167a9dccdc4de2485571ac48b47c3783f66e002e38bd0f3d0f56e0e0da3c4fbefbdeb0b007d2b8f329c8b2641c6bfa2274ad3cc43a5e71821fdd11d09cf14add6881bd8e02fffb553ee2e2bcebe9af7a18b41d2a8aa23b4ea4d2c60a898c6be1c519bd3dcaed91f5f9fbac44efc9c1d81e8c30d96186b456f1e0cb5022797f2a1fb9c0acb3ff3ddede729c3454280d0ff91a80b6039c2eada9b9263d832212f9f34c623368bfce002c9f917b8038a1ff333e48f079f106994a0df59e2cd51bc014ddd3af3d72189ecbe055cf4757cf6f24224dc657157503b15c5c88860c293134e5e124a33b2d37b80cad11acb31961665ede9491461fc6bd6a18fde75475d17f3960ab11ba341a471c225c146c8b3f7c7df70640b3c9bf34b605bc6fdc98c7779fafee85616aec2886ab7be606e2185d347bfba7b6c09ce2f9548fb9a9ae6740e402154d928c7616009f856aecd39de6ba9167c1f1b0e9254e55a815a9025d05c00b2323eb8ea9c2477bc221a6e90f2454f25eef211585c76320fc50ebbf0dd0c3ec0d2e9817166787065d139996a037f9fbffafbaff8848c3f26b1f00eee9993325582788bd73572c5a6dc39697938780d49401e402740804ba490ba75a301816a731ea934267502d8c69155bf5d0af398c30205b6a481c98fb27b6c14618190350b6bb8e3b65ffdefee8289ed00fb7213e505f8d16a57880da33458157623818967483725146d8f12d2e359264ef2db7947b6f29a59401200a070acf0adb7194d27e733fd4858634516c7b0d0c25b0b5ebad3d66e64b606bdbb91fda9dd3a1e58e759865e91ef7b3a904b6b59c0e73c65ad3e17f377046e78011c12e4b251dea30d3333a3ec618adb5b700be4643661f656633ee9db516c7b6d7a177e79edd66d66e0f75da749fe1ba6dd9769b596bbf817a5b1d7a7a466fecf119c0614a1294d438a34ec13a99f18a199f602838e42a4a7b1a89d06315a50c99366d1a48dc5d88c35a6bad366dcf6ecf69d37653fdbd3555d39665337a1bb9b17ba0d9d9e3b56b6068d21ec1d8160c4d9a6e02c68e60ecf80cd49a911b72d8e104b63c0d49aae01c61043369d7f0e5b1ae33a5ab8e5f1299c61dcd470b259450220549249104124820a1c462d883905a76c41147489f225a26a5173d986aa8c75e03cd26528fddc4807b7b21daf16dc08ecd67da54037da530d8f25a881146188104a3a17322f1bb5caec92377ac2da2882294441e1ad08006720ab26606339881f5c15ac711340189bb07fa1e5882c88ff3f22322d387989e9153c2aa67a4cda6da08ddf4f196664a99829e273d3faf245c11a3944e6889434394734a291f335d331569dc525389b160e765050fcecb0a9d9b9715ad9715369667dbe327dbf2d856887d1462a6a84d966118b5c16eecaddb9e0a315fee6f57c3dda999b2cf52bb87dcf6991271152356859801118190419131d9361341690679886d1f53b0ad56ebbdf822acc379efbdf776a15f51c80b8542da45dac5f85e6b6d66ca624041f38508c6a46040d65e307c77452f82edecd59dcffd825d77ef5377877e45198cbb0b85445987343bcb60ef5c161d83745e1d7ae78e453c503b531890b5158aace9cc5406b403f4a3f3e393e3d383d3c3e3e279ddbc766c76746a7480b0ad9c201c20d7cf0d75b15f01a1f9d85017fb15101a0644ad11ac11a20efb1e8f07eb306b2fea627fef65cd8e3bbcdabea20efb50dbd916fb893deeedf105b7bbc01d77e78e8f5d4da4d333dbbf21f2d519e01e6240db6e40f3c59eab3df6d8da6cbb651468c79a96a3ce4e6605e7666bd466ba681a6d125227b66e2d6692a664563dfda718118dadfd6b41ce2e73ccb4365b6badb536735b9c2dcb71d63ad95a93e9d2c4891cce9fad35d99a46847b94f9c25dfbfc992f526690662db5b9bbb5d65adb6db779db7266adb59db5d676f75e3b5309e0b4b5336529cf55034b2064abe58306303044872040626054a997b2fc8cacd9d3098ea81003c120b42a9ce982717090c30da8a687b664cfe9f974eef49ed3e9e9a1d34f0f4bb7b1d96c4284db0a4e279a9343dafae1f4d64f6d6818628f1bc7717a179e4121fa30ddbe6572a687581f86dfc011c1db3075a7e316b0c220b7d0ecd3a7b6d90fb1c7e9f431be8479e3ace7780778e338401d378103380c600c2f62b78ac337c01df8a0dc36c0484fa08c01c4f1ba8f85c03743c41df4d866a6283d6dcd17ce64a305e3986cd83095e1d3c2145180a230051574a628638a8d16d37dcd9796cf707a9c43573c5a74b5dd78486f40f3053cfd26650bc23632e06f8057cad5f63523eea06f696969b94040990f87297703940104e3d60112e07800a011bb65784b4b0c3aeb210098c900664faac431d08a69367b127bfcf4f8966063dc79214e063006af0b79a77b31c4f0471ba7938d1312f962ad3493969b4e2b1be092d5bfd23e5017f036c0b8556005e58e01b40a68b9ec642206c1ad6653b2d928010fca8d638cd1647ac19c73ce5a6b75410ce0dd3b404985969696161b2415768c3a4cc71c67038c5b7657ee01801b2892f7e931ee385d051ab13b86e31be08e83e0bd373b81e15683ed2733451f4ffad1643a3d9e748c41c756d3c2e95b78383baef2441da7779d4c8bbe3e332525eaa007c1db739fccad86aeb21badc3dcf21b3ab4fbe34e60dc1a8401c46e805850d4418f03c4c0db003313887788a11177d0d31fb20d1b78bb36ce146e31b5b4c81f80785c2da61e05301dc8046e3539393913ab749e4ef74963405374d237ae29699db43e5dab992f73ae621aadcc2783e2daf4d9cf5cd960d16740f325be7872367d2665aee24e3665069b5e6bcd17ba5fe2ab0a1f7de3445b7405737a5a43572fa795fe906d3cbc36b21bbaf2d1a24d3accdb0718a3cbe92bf004003d79a20e1b3f81e1ac62dbf804a2abd5e93120ef5fad749c18298d7ce3deb1c4d13f5de6cc97ffd4f21308822078bac1d3ed7c11c04fe7e64b0ef0584af0b3ab01d415041f332368025b9e036c69f92f80cb1d3b01b45c486eb55a2d0180b2e5d1c763a6d4cf01b65c00e06f9a9cc96432994c0210c04d2693c964f23893d781f736683ab8c4c77d1cfb009330790175ac4114ea2d7f61aeb2d78cf3b569f6ca5ef3c5f496af56f76e3cced5563373a49c5d0d275394385bcdbcaf4def6bba506cc3fcd0aba9a5c574cc947198498b52d3aa67ca6226b396d3dd62aaa6eee17d8534dba433959b2cdff293177a609b40bb4da7c7b9ca7aa60bfde9b8628cd3c71ad7026e405fd37eba0c8ee3cb99c0ac277b92f94c97d3c401030c384e71e0c001c3e98601c7c4a1c1cd84651a9761d672f76edcc55162bcc54d6e76cb7a5ac015b8d9606eeb6430e6381c38f4b9ae868ee334f6a2f4bceae92e76b2c371ba71e8f0c8d6b8ab41db5a4730347d533253d47443ddfa726b1d7a606f35a29d20d72e32b7bee9fa8433e703bc4f3cae05e401496bb7ecd34d60dd35f688fb74d9dd3047378e47730439cc7ab21e7aefcd9cbc40db054457d866026d8ac3e3c9a6c71e384e5d1e9652a2003cb45bf418571b10001ee63d82e1a1dda3c7b8c2369f5a5fca440e318ef6ad06e3d095014ebf29992b1fa7df6ae68b3e3d0e50db893ae837a095d3631b96531818952a95fa4ba58f7e2b77d140a90d68e501d02c07800e33cb61c0369b964e3280d682a80bcd7a668ade07983d992ef49e09b2fcd4076ffaedf9e9ff87598f38aca98f1bc00675d3b109947ba57b01857acc443d669ac0b8310bf702d8f298a99718e0b8725a6badf50be0067840d2da2f5c6badb57e81f341b7987e436ed14b7e3c76a6c74c8cca28d3bd6dba5ef2e3ba055c5273d68f873a930f6da98bbec9e4e3470ca07ff8d03a8c4350b2b38bd46d329d9b299d674a9f4e3bced4e92018e67dfac170deecd36f9c8e4f609d291b8f3365c3860e4370b3434cb99c529de6cb4987729fa0b43cce17d35b7438337ff649a575ba27d0ced4b4140c710b6078f7a62f8121c70286da10420d8b4daf028612e7c33821473fea0933298436047a5dd6d3b3e971f6439845d9f43dc0244c562f00c679c28601933059e92ef60b988409177b06300993f0be78504de6c8246210061ac0cca10452d39e6558d568e642084ade4ad17b8c5df6ab52a93f8f1e22ddfbdee9d0ee480247608cda37953c1c608d35d4909a88f67b4d3bbebca5ab8f64e74702978c74e97b0d9872f8dab194717a1928f7177e391b1bb2638f0e71624592d0d295e74d02475488b9b6756dbbb19434a88a44dc471c777c9148241289ee45232e7f6705a7546f28901059bee68bdcf647545f44b722ecda5db6a195444c177ba964cb1a52500ee34e942cecf4d29edad74e9532abcfac0f6393f923aa62e8cabec8906edb09e34e417a50843d2f44871d28f04dd144a70bcb4d61298fb9923fe64bdc38c400e9028d994b7f7501461758ec30b56f121102572041124c88e2da811456f441500b84c084275fd8e06686253449821738b881184c62b280a2c4044aa8687d61735cd1f400073d8812851660010410cb5ba2831cf0800669ac4009acf8780049802c70446547b467d6521a56e48290b3d3ec207dc85df2b4c8a31c151584a814c33414fac466f5b9288081550b2cf9223c5bde072bb0647c4d418a2d5bd8f2b266bec4971494cc1721e6aac2a862a2580144d3350a5b3e4818c396576db16d791983f431354746fedee1090ccc1398f8440ba3f5e387f4217ffc28cdd28fd28f2df10f0dcc97b054ebcc0f1a80e020440729b0e48750a00bf94a67e95c3cb1a78802d096ff68de34cc54cc0f17fcd8928b2928d18325bc58c18f1496ccc28f1853542104225a4a5a158ca02741518e83f4317170429d44010b1b7287bc93308583101d76a0000680c07a6d710517446cf923495257d9f062cb3fb3e109098283b7a5bcb7620304cd919cce4c453177ba0648b0ee88435da0a800ca9ea72a883de40a484f13d125eae0e607d125ee1e29a24bdc21c5e911ed0ad33eafc26ad913863d75ecf9824c102c8b5d0322cb96a84b9e3831954616edf8ea89c1bc6cede4541f6caf651b6b2a4bd3b4294812ed49ec54526ba5d91462ce24333577a8cb4bf280b2e708591af1564c7139c056a0c832fc369df936d5558a28860d99bd4892968d92ee1607f97b228f6eb57ccdd40a1172dc4446ef0e45ee5c3bdba3771fbd9355da1177bfdd4b1d62dbb55a1d6144aa3622f7e8e1e8f6232d9dcc9412b2dd72cb264ee68bb42350ee1b978c74719143d944a78638a767e5965b36c126e867abecf8ca826767b1b357767c6111848d354eeb64b67f51e8bc9a60d7240f46e515b1c7c5407985bcb725865d49a9bc2c6fe198896a59fa9116b0925eb2f2bba27da02e982e6130c83cc82d5a39cbb108ec41beb474c20232d9be0232e97ebb2696ded2db513044b2a9e42ac9625cd521fd0d8d4ebb1109ec1e76bfddf7057377ecdd319d1f3b05603a54393e655192bbc78d75580763fc1063fcefd831acb3838f69222aa70f555eff3d760a50d9fee10f7f187318a3b176136d2bf70d7b40b2b1877a907e1f630fecdc47278131ea18e9d062748d35d65063876e8984b411b9b787db394ce2e46c8f994360df8e510f0adb051625797bdc9e8729e76ddb23ab3bc63a9c61767695d699e2429a4d1f99a9f96dd600dc914bc0f67b1b360e6b6973e99542482577fbddeebdf7de7befbdf71ee363bf1c77398ee3388ee3388ee3b620d465de57138ca03b1b2a8713708fdd86ab8fd86f5a26c16a27636fad9635b2a552a954b2ab21e36457c3fd9600ecf63660fa880f9a66cb4ee6484d42b6fb1b0b454fd48d3812fe36cc1ec356a28eed2c1b8b167b602deac0b2163017aa899e664bd481dd868c3d6c8037e28f951e37a20eccaee84c63cc40dbdaf28a1f3290d7cf7c01cd54dc319b56ecdf98ea9bde8567155d459655e56fe6e80116361b8762f45163ace0064cf1729b6e08edf8d05ef281f922752f69513da75cc265966551db7e638b9676323114038bdc62a91d4b3433014f39a59c0ec09408b5014754b544800119bb851d8f451f71c71d77e24e8421402880f0055a4f8a2bf943e34b7cc15e88903be20e386f10534dc4943c06ce2531259f81138998925307d18508e963bae20e79d93353c0845983849214f907f20822661151876cb98a3840d4b14357435c7415235bf23296a494524ad932dd205b3b7273c5a2636bad2c3aac8e458785b110161d96a52ed2671342fc777cce6c899ed2d76c4f273bee3065add524978425410d6b9aa6699a0573e4d0344dd3342dbbb7334dc3324ab57b4ebb37693fc26dc74bb6639b2ecd94bc33f583858463d5605467489812a474cef90aa05028146a07140ab5a1628cb73328116a87cdada87ca8fc1d42f75654be906749f9598723d4c6e00c2a1ccda0501b773964757640edb06dde3b9a7558da21bb83ed74a9f4a350bf5422934c990172e9a597d25bfac103656da9f4634c293d46a1b6f658924980f4449f1f3c50ff0c6a1bb91165c7577c7ced18e528d5487e3f9873ce39e79c73ce39e79c73ce39e79cab383f57715abad11cacbe61dbe26d0f341bde4ee73bf03e82989e22f1a134d49de330757996e64cbaf606ce489774cd10ec802eba812c43648cfe6a2b5d21e5a8cfd5a1db534a71466916a98f0bd46ae9327283faec39e9dcd954baa4ab931b0abecfdaef9b99f966beef729f36663b13fa6636471addcfbb9734b2d9f3be8dc11c7af67d935a1d66ee3633e929477598f3f785ecb7b51f97524c31a5f4664c9fda3fecf7fd986174326136ea3467b6d67edf8f9d0a53f1a9fdc37e0f492f0dd536a3da728831c6b86195ed81665fee93524a698c31c60ddb199548156473218f654525886a940a12ca2c2b2a39e4d96f34d22149b53f3024899ecda854d4a329ba7dba82ec4d656dcea5522ac8f6896969a4c3ef144da56654332a512af587a94b2fbdf4d24b879482648b5e7ae9a5975e7a5394aa628e74d90c2905d5cc1d183a53466e489b1d7d7ca48dcf9636aa15333e7fafb5165f5b04db6ec1ecf7139c9452bb9de23824bc377f0fd99cca47c2dfc2217b0be1c74c6b4b25fcadbb05b9ab7c24cf8eb26e9e03bf713639303cc5eeb15b9bf3763ff123c52276ccb39c2e95ec67762cbb1cb467cfb854baf7decb7dbbc518dfacbad184df3ddf7b771fb5293bfe7d58f2b429bb89bbedb489d340e2de8ef1a9c5a7dfbe81a169db287dc85a6bb5c99e8b26ab81c4ed4d7cebe19b6c7613deee2f189a6e14518163080b2f3b1be83cce817e1e5b1b4b977e86df3782e18714c138706383130c27a51401349bd3a65068dba8b571dbe6c43ac4c73ad22f8feee9506eef21301c127ee7b0c452a2d884310d9bded27727718f99d6964af46e60a84431164d5734bd3da5c0a6b74b4a8f99d68a74a954d22a31d423e9f05b050cf1489b7068ff3d7bcca4319482fb03896897e740cb443bf60f974a3ac421ae1b531cbafda51bdde8465f82d914c76c146bd3463a11d1f349549bbcd1e749a0a8ce541767aad326efa6d0eff14394526bf2283d47b7edf4f16edac49dc8f66b2db5f6d81edf6a1a34057636b7fd6a54d4e148c70f99405e0c2af5649ed72ec15c6dbadfae4d570389db243a91fcd045e7be59db85a5fcd0b3ae33c53da44ddd4ddeede9efa64d9ee7d96fdad4692091fbf64e571ebe8db8b07ba0d9579bb613b9b73f0643137ef4d971679bb0e6742a7ec8ce8e3e3b7e03efed2f6aa6a21129f7ec12404f9a2329e088437a6bcfc050efecd8da87972b4b5d2af72881cd81514e39e59453ea50027b7eea907be4c0ec56bb0eb3d474f8f9496380232aec620832965d0da1def5f71aa8fde67083bd6675ed8166cb34076eec0eff5e03c319bdb96bd65a8b009adde9d76f31721a01341b6bd1660f6d28817d7528fa8ccea196c0c69dca47daae85eeb7ed17c4de3b95fb8fe475f7a3504887a28756ef11188a9e5f67f4d53bd162ded459a68f2091bb0829a5cc1e625ac6fca041ee88a794725594851cc2ec1804071f42e40e4a53dae77f6421cb5b3ac138a5dce1a9206358a9646da6c367973732e6998454d63dbdfa08129637021c5161a593669addb04c3d0d3c4a39326aba22c6e2607ec4ccf904479f8136a62e5764678fd6074c39d5ed606284481fd8a78b02c121488eae5229736543beb36dc3d7d22c323d5d5196f72346fac0ba6f30f3c54e0f9c38dd0cc3cb4296c7dc8da9db853d74a08c2ef7dadd74d801adbbe1eeecd85ed6d571a6e8ae333593883b6808e8aec722aebe8295c4913a19fa38abdc49cc144e9c2e1db8b84857192b1ed7bab34dcf081ce70ba56510b1e5abcd54661b2b14a1b322abb0d32d2505de96f7a195c446082b58b17d94aa2a679dad58b0b07379cac6a8d858194b76a956bb844dcf19c1a22f20a09c97e864d35715a66cfa1c686c55d66466021c05902750ac406898b0e209265248e30527e801ab5631a5e7079e2e7e90c20b56fde74b1563d7a7e8ca03478832c51280a214d1048ba6881f9c00e18b2b00f1023558f5878b5d4fc37cb9bb8a7a2a109b52e18a3d690b7860d19b2cf7a242933d4b4fa96090a8d88ddcd873e2a989644740dc45300dfb9c8f9972d3542995e0d4c6a10ac69d5d3b191a664a9583db588e54cc64966558e5b1b14e0626036394ad753215acdb7632f1d67befa553c6d0fed8592713430390a87532b5d65aab56b1c8235a9a6956dbf027857b3f2970f76e18735cd7795e2894b70d739d17caa2d16834c298e3683024737e69e0880ab99d6de371ec18b0011c2fb725b6cdd976332296f604e3e676f8ad93f1a26c1da10a2154b067b49a2747b8628f0885b81ab2a1b1edb72ac44d8c6dbf191187b044c4410f4a5ae42aa2a5026f36cfd40ef581127bd09ff9924357d9b5db6f5fd8ad675b23a530b6fdd79343bbad9e98d49c1359d3479808d19efd475c40c114433022054025ea622fab0e0fa878c210580f4bdab673662a3f03254b9b41062c95df1bea624fc3fa409390ef19d5da55f4b5a14798841209201d16ec99ab43851a2c26f9342c5cb97a8449189b288981167b266b72c4be478299c062921f5fa2ab1964f0c45c653e9bab3edc9a849b936d5bdb15411b4ece7cc1a735b8b5ad4fde7ea04cd2c32c4a26e5e1697733c8e1e6da38ac0261cc4d50ee2f8bbced50972d3b996da50439cc7cc29a43d2794b1f3d75b6c4247a764ddf1aea6237287375a3984ac4d556b36d3d9b2bf64822f6a0b73849694a96b26d94bdb998e8e09abb335731f821bed9f6dbf6db6bdb8d07bcaea8c35e236eceb60fb7176cbbc4b63522cd80c9caf46d5117eb6dcf0639bc51b4b6bd6144b1ed6f18b1c74f5cc550177ba01b14775a1c93dca22e9dabe28efbb2c89d0eda379cee01d93797a7c4cedcb29b1ecb1e7f59e47073e5c03dac175de55645cb1f200f36c40d3353f637709a07fa3521ebcc947d7d62a6ecf19d18eb1cd4804f5beae2e28a3e3365bfb9a86bc877fb2121eda33f70735197cc67bad85b9bb9ac398dc1cc470531b360dccf012503b328b147168517763c187d6450883b6cc56e5f318539ae729cf682c82eb00c917503408f1543579bab945f39f3b15d14e963de3e04665166cabe03b31f30833253b6d3998fcfb6df5cd66ea0dcb8eef0bbbb2142d9f7cb2263971d033c56a42ea51d7e476e879bbf49e918b7f40247548e5498e00a1c0a398f48f6aa80ecd97745a6f53764af9149968fd282f758db0b90dbe24073ecd83359eb730cca9802a3200a14d82687767c45a941942831c03fe46dc757141b20516a5e64f8d81cd2b25a53930c2a5860e07141158fdec10900193a22541000404613dd0b42f081818c2156b4116c5064d474e0116c5e98c21d09379a0cd10d20b8c027369cb43ec54acbcd8d3178103a3571d9186389498aa096316e422ebc784e63d4e41686e063ba82a874042017c40823b31441a7852cc5d0c25bd9e92921c153e161552a9816cb0e543e4e656dbefdca11241e56a582e1340d51dca88811c437e254d6e617ce27c505911176489f3f5072e654d6e622d4d88c3216a11015362220784e70b212a50e083da11f2144dc115ede4f09b010ba9f1b9b143cdc16dd25420d7662a9d88010d290f0ba612851ca84b063c350c10a26854b1b03864a049feca5e9143b180e5826a7b2364701542d0ce6a421083ddc0b8c1a110d45f8992e71db0c040cd4336779fc50c1d85cc2767c7dd1b3c3bf40512b6a0a0a572d8890bd13aad9566e669b9a4bcad83fa417b9c2f0d89a5cc1030ad9dbf1a5c5143bac41646ec797163ed85b185ae06087b5725ff0fc542bf76d31c6173fecf0c4833101578a619a864d0dc356d75e8bd56aad16e9a4746673fb899562c7a20e99d188e928a38eb84696cf5228bbe3a914c65a2b0d31303c28a5d4e698a9989aa952c95a2a69c524f63a531886cd2aa576a9c36a738d339351ebc4346bad95b1473c8d3d78905b7a8f9ddd1eff954e47a53c50461da233b2bc51c7b451c719200f10c66ad515543c2e08a352f18051a9388ee33a19ec1e176b866932de3c63d66c86cdac52a9bcd08e2e5889471563151bbb014c5649a9ca59ab3894670e3d0482d1057b8c115395542a50a46519e6359177bd37dbd669659e73663b5f54b6ca8e58d8a64ce54ca96086d856e4cc7a02932d5fc487d69c1287085baae4e84cd9237d9ab0e52514f93327191fce9caf27acc1b2e567cf9c2eb841493073e86aeaec40b1e56913fab222e7cf66beec70e1e43c61cbd727aa4edd913ba47cf9a0b1bd1ad4cab9049e9456e4cc1a6265634076db9acca6892d9f0991dd64ae0c27cbc99eb03bd92b095bc290f5643ed9cf7c8992016541502863cb6b49b41acd86dec86bae24e6cbe8f21a0ed572349d28e844315f4e3bda4be3d17ab427f3857479cd87aeaefd6851342025b6bc2665be985a353642cc1795cbdb1bbacaf2d6355f562e6f93982f7267cb5b27e6cbb7bccdb13a7667bec828b6bc7d5927f385e5f296a7c7facc97f882e2b3e50b5bde5a7b5ba5cbdf9a6b434b67e9644a2c5fe96458aad82b51b862afaca89cd4c9a8d4ef768cfd29617f5e08b1bf7f9dcc9749177532a43a7aee6446936ed1439d8c68e67b9d4c0ebdeb6442d6bb8d2bcbf2ce75325eb61177325dae32b207266db49dcc96efb54ee65aed5827a365507cc449e9e5bdd925598241bd9533f12728fe5481c79439cf3c73088bacc640084728e132010f5620441334a8e1620a3b31a882456b189bba56b069c6e37115d748c5950c224ed6bca893993ce4139240c20f8810d4459456065a4e7ea002255c48d153c148c28c20a60562cfe74e66d6cf2a5c4e88903d527b3e24eba51244ccec7532335fe64993e0e204b9eb6466f644e08d20c48c70dd6cbb9eab45b8005325a460139560b3ebb769440b289dbb1e092752f06e8d0c67d3674ecce8a222f081325f7e30a079c5a63240594110921086129270068b3eaba1abd88433ac18620454f0e00a50b0e8339bf952bf88536cd1829d69a22c72f8219ad4b67c05aa41580bab4162caa6c79ec0a2c076b017c693655bbed6549b7a535df515844d5f9dd42b6a4ff5f9c1b04873a80ef55162089b9e42a15128100daaadaae202d67ccd72be264fd0114b4c81018b9e26a135d486de50da337d26bdfc99363f6cfa29c45c7d12315f5c1367e6ccf989010df830a5154248922b2b17b1b3a91073fa90ad3df7490a05c84e2645038843d421cf838c524a1b62664a4621332577d061a6e4e53b26f274c1a746fc62f2ecf9793371806043278a269af6913f2f940460ec09ce249bc70f89a3335f563b2fd8f3b2c97c69793db157a22b7c903525d833c7000921d8d865f6437d687dc6e3799ee7799ee7e3c59164501bc010fdfd64031800676dceade822c327022da356a0646c9e8c27e3c9786490812bc555b4ac160142369a96435deac504e05aade9225b33554f7d642b145da0107d643d346d24ef87544a48a35ccba19a0e6fe46c1db26c021000a3b4e47598623c38ef9d8d57d34d8967b036d6c6da581b005822e66a3a616d6c12bb46e184bdd9f5f805080808080053e6ea1a90925db50c6d927abcdaf0a601c02191e39ebb6a9a8ed69e98a9dad920d7d5bc992ef2934691f518267e3ec7525ccd973c90fa80f48702813488ba54571672285b7204b187912c5bd247a697d4a4e40f711542c1aeb205bb7e03b5e8425300cea6d56a01c1c20ac0c592b559e3d955e3b922635800ba04ace64d7491afd778e82ab25c50768d5a945deb7101b809662f307332252ff1be847b96c6934d7fe6aab2ea2916a2ec7a0aa5d381f4981903d03d80ebf003d001a0ab81fa84e84fad87a193610922e341654d66aa7ea691df64574f87b9556f6dce190f5d799ee7799ee79d04302cef954422914824d24900c32269ea53a25ec41e14d3f427a4bdea1c5d6628ea980f65184867a984c487aeebbaaeeb3a4d7d344057f4070355eb52749939bacc532f7ca210465c69a73ee22d45995028140a44a150a896a36ed838a15c68a1c4b2825241a150a88f847a81ea912887bcee7278b31a2ac3ea94a8287dbc70c82da6c966069880234a2b451df6f7978b2a92e8b090d01c963d0debc60c589aced465a29e4aa5aee9236a5c1d2a4c0fd87ebfe923ac2348301358f648b22647b0b45f7d847504093e82658f44ab79c2d24ec3ca73062cce2003163d128f30052e66c04292f1bc80153367d0740c75014d4234186d7a8076244a015406172c241909b0c0d26ef59178841280510516924c0b1f96a683cc19e4695859e6059131fd43ab19573d2532d54e8882c6159aa68f2051a1d1b3b150b3a52e42e300e41639b41bc7880aafcd9cd5a7ee4c2ae78ecbc7e5423271a61373751fb3472dc9ad992eb354922b38b00fb5247bce233616822e36d59ef9d059aa5a021928a30eac52cf068b6d67cbc7486ba4d461e623353d56251634531493325314038a3a72a8bbea3a53195d6d37d485fee6c6e5a29b4d939a4d4f9bd01775b22981616ae4302f5d3a3a15a802d59a634a0e3ae702229db308da4b7ba95454a03a54c75a5790ab56a0294055b0361594e2b80cc362a994699a944bac0c928fc524bb0ca3d63965d25abf295fad129363cc39a75643efe4642167df4657e93c12894422893ef246a81d8e42dd19148742bd7436e6b6977eec8dc7de6c8ebdf540517bc31bdef0f6d00c0ab53754a9f47f0714ea7e964a47a14e848d9cc264871caf0826ba6fcae8a1a8bb04bb118984dd6dcb39678cfb3ad2e8f1b723752011d2485f1218ca4d9af724d24d9dfe4ea43bf7af3bf72e67522a074cd77198c31ce630cbca770c721c0993300993589ebddb7fa32e8b468f5d0ddd25914ea48b60bbeb7067fa4e8474ee1fe9dc491cc6f8468cb1a5739b9bfe6a90332698e080769a482394f3a6553a8e2391482451a9c4652e94734817c1761e22779e5d0643d273beb70896535bbb2a950366db4a30599533e992ee2d82edfbbdddda9cb7ed7246b04d249ebbb596bb97fb9028a2f9e00c6962879bc20db030e79c73ba6a7003b963033448ff445f371a9de34423cd7df47d237dd2353beed7c4612cd2a176992371a413528766664565d3e1dcdb473b3b043bfb7e46bab6e76fdb77956f46ba3623373677eeea0b66ece94e6740ba6680b5accf12243e36903b368809fe82727609e27b398edb4857e93c8e1b8d46228e238171731ebe247c3148e47efbce8ef4fb6b3feebb2f9d52c71cc7a574d8177522f5107e7bdbb68b398cbf8dbfbdcd7c7bbbf717db99efc376cefc7dd95a5b44e4914a969861a2c23cc01185bf2be4eca287df557200f7bd046f0ede553acf2391482412c9bb48e5de27b70a18e6c7df13e12eb3fe05c3207273b3e3c09074ce44d208f07e6f27d2e11703f303c8bdd49b0e59743837e9a36f2006431ad7c6a99ef3945e7167d391f4fc50b537bce10d6f384ced6d03594eb21f8948e17795af803cc82d22722faf02b20c913f3da3da1b18aaf636faa643d5bd911b9b8471f88d31d66190cd8d448fdfde9d03b3ca3b766b732e95bc87f73a9d01d526127f1f1fa62ef7ed82f15322df6fc7e18cdcd9f771f2ecab8dd02d559c08f23991b31cc02dcf130a636bdd555446d39e7b3d0ef1e3f771b7c76038646330721ccce626a743fc884195dbeeda231de930e313e16e8fbbdbace34c752a60dc6111ac03c3ef8c9c3deeaaf21b44f6af20275be6f071b1ebae9273cedd45dbbbd0ef55401e90c82ddacf8244beef0343b9bfd168349adbbf9bac4600cdb65cc7759b4887a14fbe82a278053d612f398ee35644dd4eccc62598ac0a535f0f0758630d35c273dccab3f7fb4ec5ae8021e9a3ab5c12b1971f812c4364922e82755d373a96dc68342a820d219dd3e137770b86f6466eeccfda9c391390b83f6d523991eff82afa3bfed70dd93976399044a3ed190ce9d0d345b02de32db52782cfdd72f1f1df928c29a7d244ce2e37156df9679957808323a36022cfdf1087b0a3b2047ba571574a97641a8974b19860da9400d5a6576daa4d09d0a61b488044d2d02997a8410d9658423af964124a50b4b67c098a16132655a8750aaa8cee15c496ef5e41a838a1e244c4c2da20158b49cc6273c109b6fce682135c71aad2449ebf01dc523e66c7441032c266cb878cb0792b085f16524a29a594daa28182202cec8f09e1f705e8431513aae79c9582d1923a2c6d9abf99a220b0092bd09639a4935c2f9f23f6883315488b3c4ba8b9c25855f579a7a492ae3aee72931d28e59f697c4cd7ee94da0c96a88bbc9d1428aa44c9f3d27533b15a71b204236678ce793b41ae1299af3345475d4c909ba13abb863957cbcd501d0cc3664ec46aadf5116bed9c655986dde61266f39432be6656c84f4e1d1d5ac3b302923257a2295926ad080037ab78e104dac90759831520702b92a86b61c7d7158238e30a3b4cc94046cdaa58b852e6be2f72c861600826ce90c2097ab0c0c392220b2fa0c10e741083318a10854fa46255cff8e28733c438a30c00ecf83a238a3398d8210a05541ec718e7b6e3e74bfa987afec81d47883da49e63ccf9f8ad82d816981671077d944da16cfa90b4c29e4450faf05a3b623d5107fdb5b93d5787aeb6d64bd7e6da6c7977307979f6f698297f7bb6165dcdd7d5e17bb62ce93067bab5a54ed1f9435de8edcfcf6bd37424460fdd366e8708479c01032667986013c30c345c19eff832630a2c6b14219b0185aefb31c38a108e194220c930a163060ebc1d336a80659a08328306d6c60c1758192774ccf881b4c44bca14546496fc48793292c109424290141f886498ec4869222463831c2932c8324b00d91f2a189635568c40630b9c1daa8cd8e286065bd80891bf1d5f4e98c2b2461130c5241675f89f18983929a574f6cc39e7849973be62556bb3d639e59c9352597548ad2d95c01de59cb36253948343b9e7b19c52886cb558422aa5533ec6182310435da2897e9e66639945a0b65a750375c7cbb0a32e82ed98b9e584d940116c0799a9786d93e6ae5d0464abc5ca8e7542e20e2bd3bf817e6ea008b64d72777b82a61be6b781ba8b603bd32903a63ca8948c17a5412c95aa19000000004316000030100c8884229124c9f24851e40314000f7992487e501e89b324cc5114848c31c6186200010000004084ca2803a4f83de8d29b287ee1f7b67dd67fcbf340a2b6d67d54e90e3c60183c14cb207665082d29e096b5b05d3a54a66e4f6a8adfadfe6c52bff4a81726d5b5b7f1e49785820506d69de03e0f84e5243af8896ef131055ea5bdd3cc722041ea6171cac2aaf5a5b56f5ec3b8543f3faffdd5ced447dedce35d822d0c7d4e8419bd0bb2010aa15059401947d9278917034747ce26815e9642d7fb2f8f06d64d7c08d62ef502c96c230ffa1964f3b7378f1aab17cd211b02b0080fd90891ed7a227b7784e8889be1814adc101f4125d0f72696f348903755526cc59594c92114f42234882c33e33ddff5127a4df99524546ee70dcc343cee4beeee2b07154232107b05ae72207a7ac9134f03404d09d40a2796e927193ac69d5042c4572edaabc0daaa1731d4db46ceb98caeebe0885d17206ed74a7602f58053ef521a4917d3ef7b2e61aebf9ed554bd0696fe6531e200c3eb01bd3acd234d164a495c07310e935566778a3c84cf6d2bbdcdfb4a70af79e1833f00bb0b70c5f732172b46fd86dfcc091efaf415d574a90dfb2895966a3fceca78025fcd45abeb107d475f5c82c33e8ecac414500ae1b5aa54311dd4fc0354ffedcb8679787d079d281005c78319d5fdb46829a28b93011b36a7e4a71ea65cb0e4d387df959fe6e4d36c43520cd2a19956bfa591324a8d000e74fce5675939ccd17d3c4000663086975e1b96562e5ea9e2d106c54d020a6a8f69b663cb658aae8b3eacf8e728e1f358d111351ab93c304be0305843ac89fbd230714ed03daca5172a64b82905d7a72b52e262c38182f6be758528392fd5172d47851705eac560f457842032970b11317b5789e817c44dce33bdf14eba40385ebfce2842be4308a67d187ee6f239586cacfa003c13685eb99a9a63051960142775e1cb0971b5b879f5ef9ad88ac82c3e1444d4a9b88b9e89bdb5cee976fa8bd89c70e0e99baab965c695dc86a92994d9a9729eb2a5c39bfa92f8397a349217b23968964150b0e1a6194c6286f84c6976dd3037505dee331037bf3b596be953fdc4cef1937bf1f86e8b0a9e2c2eb7811c96154849417e669c88f81ed5dc5d470ae530ac5076c279c4c2263f6510ca89c8083c912ceb9087fff011215ba0132ea0168726f3b5a4a1212fd61945eeba0e6a3c17c6334257d4c9f89beb7c9bf4c2739aed951b5443cfa115156cbaf86eb03c6e6341396f8a07bcefc9f3532321ddd05b95b7287b6279d8ea2dea5d9943ea141f1af999a5301a8a49eccda68239dc41377a08fec68800f8daf9bf9f4659a18eaa5c0015b644c26ef6ca6a3795ff6ebda706d5dafdfe6e84a92f52762eeb1517ec9b4aae85fdfab553e16e7ffd19d8ed145190d81e0a76214f3d8a9453c6fd30dd4b2ce57e9397425613ed270ff1be63bf1f2e12b18cbd31c2f18077b15ff7f3c4f1e31925da1fc7ca67700e016a60f723e82a39b85c40d198ef904dc85241a52efe220b708e1af15b34f6b9465814b6ee8a4bebda082dbccee495bf2760c274f8497f051a9b2eccab7f45ab9bd9460dcd85d7ad6d4ff85e04598fcafa8852dde3a0cf61da1d04008e49d7acd5de22c63c80fb303bba70f425d55e247db119d59a6da0b248d9945d0d1a909b5d2020a76bb50eb8eb320c78a304e71fb231b84fa8258d61d35fa21ece28e1289c055d7eeb362f374f6d491685335d23db422777785b7f1a84820948fc402532bf92f31236b9c4075d037ba27524d2c3ecea87bddf185f4cd1167472d50ff31bd677ffdae2493777cd150e719aac37fb49d14ee26a624913abe6ef65a3dbe04c160af68814c27cb3762c714c39efcf82f28aa8b5296e10b1fa5a00eff4879a1ff2693db6be506b708f39c793397901b77874b62e6675681ae11617b567a0e91218b5c3b34a2e4ed97ba2101b2482fa7768cf2656902f60d5253b3c6aa0b8bd0e604b8e6c2e8d389c3c6efa7b36830319f3861af227df8308bb6d907e6c77adc0362fbf1b5d0ebafcf9ff3b2085cebe049d9abc5a223ec6024d6b351f01615c7b53266e3230c2dd905c87884f2355ce0c686c379799269917752c44c81ace1701705ead9d9966be1967aaf00ce6b58c8dd8a78754a1f575d90ad30326b0f1cc99b6e4829bf0bcf35cc120a5e1c20d23c4d6da105df2ce43f38762b2ab50b4f3debd1825387dba99ad68fcbfe3f1c554adc0bd830b5ff337f06c0839d129b79c6c1e06ec85214be88f5b3e2a38602c67bf027209beb805d4ae9904d71aae2c5d81b72fbf823faf31cd4e818d7dfa95b02583652e09386db94ad7e0cb84e14bab10f049181a3aa3854bd35e4d7a9d4eb7491fa4f8405fbf454dfe37ed76488f559fc1ad212809e9e64c442b256fdabd773c0a9835d5617ac2c31cbdc99a34c50c3724bc9807bd95d2c573a918e8dd4a26ee93a0c13a66dfba027cf2989296989c2230de39ee3f23add1df42022dfc1194a0916f491e18951f048847683ff7d38b44ac56c598b95d510cba5729a19dc71b45dfa07d18938ead64e21d69efadb3f95f7beef58704ef4b9d69e0afe2aedf49d1785d617fe93e68d0372bdbf04ace14ccc3ed018b8bfa4119576f4a1a57990ff22e57083bba30871f9a0617245fbbb457c871f681548a79c93478d7da0394006e670cc5fa5c4012cf92ad4cd7b24c4176099018c112dcb9cec293c6be581ad36f115f2521eb8afd3bed4f1167d5ef8783f1a7068bb11a15ef9a70804294504067c57796105a5f960d0e83ce4929e79495d44f25685c87dadfb01ffa01cf32ba5d101d9e40b6d8a48716a692b522a6b2bac4d4090e37020143c95ef277ab4f59d6ba440c02e1e6ef8d480784ca42e03729061fbc53109601759a09e4a52f7ca9b3a4eb31266affe2123cf3f3e06d2190e48a30eaf74160610468fec5c28168aa83fca0b3c96639e040ce32b865dc1a8d6e9ad2a0fd5b944ba8a4137b403a72cb9181890a707b0f45215dcbda4c960169a0ade028680cedec3ce6ab1447245a051b2a029177d7e46cac7e30584b11f83fb218af95ab1b4eae6e3c518f6400a7d2bfd1c8c6f265315858a0d719681d62bbd99c8fa1d63ed0b340e9462e0d5859d8bae89d573f1ac95fd8aa56a2b3a79294262f20aa93a8e1eb91d8ada7ea85a2d49d4e5148266bce45fb1ae155268c90c3b7a7c4d7629de1d18f100dadab34624a6400533cb3f475eb7573266e3389754402947e06d645cb3a30f3cbc011b15f9c80f8731a038104d6938cfe09674cf8fae3872e297e86aebf99c0d4def8eb1b31e5a16b189cbc2d9aa601831ff2c353be1b53368a87103f7b383be918f1a157269d4139ce214762d7ebd68887d717267e705f734952c17a3ccea8dd9650731616969867df5960e4f9b72086fee7fc75aebb95e611d9d5d030269a0be3f247a1a3f7ac43a69b3a495f356b3e69b3e0dac97fd55179a103ade67c5840226f52fb7a3c3c7cd96e0332703dde51a30b3d3204014c4dba6c5605d0e98908417802ed7e4ca328e356e8bd87a0e589e15ab5dc48ae4afd6d9fab6d89d3f977c74f2ae7f0112f87c9b39b71f7d2bd3eff9bd9011f218675cc25a4d096923ba4eb99eb7c34f7f311b550cb3903fab9fe4092f8576de7cd46076b0aa61f29bc1e061f9259f6147d572b8d242b752e1f31d688afa67a268399df90e7c5857e833177760fb1fc0e3406b08a294d46c6694004fa6b9a350e41a1677b38bd8c745c208ac08213314001f677c033cd58226d46e763f0a362679c4b68920d1f02056044e9a4f0580e66cc04bd8b0e74f2cd4010b4c66e6a28544e9633e66c82180481810110a4aa7e174c72e330413424c347f0a062f08427094f26cd80863c2293d2383164136682ae45163a3f0dc675ece3183c008220040b4ef2822f5ff9f1752bc581a8bff910bf3ce203938dc261a8208f0d266cb9f2bfbf54deaa06df098a7885330120f2de12afd2f4061b9fbfe658b8079cab6a5ad38273e148f1d28ad2003dde2d2d5cb9e0389e4458e90dc54bec5318400b2e3a6fd86ca6a8c84abb9087b0a543013614d4652828856005e135cf061170fde521174172dd82767d025ea314f9b24db98427ef5e555f1b185c552f632d22bdaafeab16c9d367f60d99130f31cdec84609bd0fad4336abc32c9a88450fd179ab0f7d467c61346dea97fae4fb0bfa34d2d4d3472ee8f242ff391b4bee9a2622f8daf8b9e69f9365ebdf93a6e217491e89119bda952ce4902957c5a47b7ca814bbb309ceca35b79ac2f807486e499b67da29741be4a79401e1f6f9f8a945019a24d93558b8465e531f0936ac2368407c6fb2ea75c6135e456c5381c064a21613759de83a01da5a2a154763fbba679d124b928d8baab4df902e9ceff43752e4b1fad2e490f543297b07082db87d7c1b0b61eb03f3e8a12ecedf6eb256aeb14d932bd0367914291f3b442346dc7c00659a631efb425b560f8d65f784a1c4d4252034c59e63bb8ea1830d1b34b53341db60a98778f9302c5bae3fe525431ddd0ffcadd792fc63f413fd19b186ffdd388fdc3b204f2b5fbea4a4493d9af8119b5a3ecb9035745480b0929dfe2e2513a3b6daf70298fafc3c700dc1b62a92ed9155a2a24d3d30468c07e28b53d832632428e91ccebe7f073da93c11a9bc0ad7a9f3dc3389a409c6977268de43e90b608ad946ae872321c4fb2ce859d51c9e23241a9bb4d8ecc0c8b269321bddaa7cd7b0e61880805d0f0060da00f9ae0e4e6118b9a3698b6467efc8b7eac4e2b1c9f66d173647fe170041efe37d04bba31ef25cd47d7fa4d5f6f6201b795f6b38eb3fe8e628e0224e1b0a0bab106a0d88e7b093f57204e8dd8d5d3c6c78ccc538c94041c65662fa0a3f9320286e0e8d4817d22ef9572b9b072e2fc966d81aac8a81ee5677e11045c67fa8f48d471d1e63a46fa8e00ed290cdb4f4c38779e990b094965a16fed3f1e091a23c9b9207a46b8eeca93a0a802e1b1ba50d128d5de67e752c96c0f96c29cd06ba955edbe22607a76e3c951e848bd48a429d202918f2c2a94055a046d13ec034e2511e3020446f1a86503dde5747820c3c22510b4466af0e20b363265b68816f985e146542e450047f6318b63de5b4e75d52c686c2186eeb2afdaaefd11febfa9d9487776a02f3f581fd32dcbd73c3fe6cfbf4228eb4e8409447cdb0100fc7473bf2f81cc079cb72aa9b21f07474b0413e49360afe28b92ba227082c1373979f79349e3cf99851cfca154644e1234d9b0eb056478399de307392785425d2a126fa7017cfbf1c2af7c6e4f80c83cd029df66617b223ee6ba17bd58457f35cf580d46d5d99610c5e27b45c09c00b32916b687d1edf978f8ea5950973b41ec15a8f39efde6c071ac23f3bb6ef022ba6f9bcc588e38a5add7e749a1f244253c26200a7bcd4d14a436c924a0f0502fdf8454457f51cddf03bae833d0be3140d5ce78ec5fb15190409271ee9ef367044a7b9ecb1602c4932a657f93dfaea6b4ed8d3d4481a270f65d53f4bf8f27bc6dd7e7eb8f95af5c2f975738c7443591dcda2b451288776bc40273d5173ea49a65a88c72ef2e415b332c2941e686c505ff96936a1c2de783c0ab6c9bbe9f450b3f7940db2adbb3c6346fd4a53143df726a4589ea654fed72e59402b4608defdd63edab52e57d796f6995b5fc8093358620b65ca1b6b1e75704fbea8ad6a20ba845f75f9011470a0723227cf7c7f9ee9944e475dcfbc523f7b7b9bc281b97fd4afa6f083968c7c320f19a303a53455c5aa20837323b199f1ea37e0f21f7ed5271c298d5f34460f53c068637d951b9fc9650ca3c6c0aa999690fb5350eacb31e152448fc380eb6dda0ecf8cfdad5546aa91076911a16830e0b39288d26f728eda1cd7654e3b456667d6f79b07d35c1cece6fd7ae81b49cb733cae100edf26ae78d3fe6aa08fd0024ce85806bb90a8eb7edd3853d447168672072449b7e6270417475c8f271368652936107ce1b3229e87001727e3c3bb9353574763dd13e9ac4d965d0dbc9786bdfbff0d2367003b6d353e8c606a536527b0b82093f161b530525b2e0d86274cb4b1796abf5a4367b9e95bfa8b0f84f5f53d6c0c416be4aec91a425ad9afefe887f76fb0a8999ead17d73dd5dd1439c7d9f0e8f01475664677d127f335a7032d425132d14acb6ef5eaf5c688011fe57b14e44d2a94c571254fd68ec3804296f0f48723b69b93485339c28a36d1ed009c76ddf14bb6cdeda756ad2664df69cb14530d3dada303a656046ac8229be87d71e6c2981eef36b96cf813d70c3d22c09a91475d5969df9269d23666f487e497d128aa744728aa66ce1d925086fad42b81e6cc51ba6c98fe054d9936cf9f0abdaab53c7f3cf55b7181b68febc78539df678534c4f3be392433037d2a81ee651370b2c2072fc69eb119ae99ad548a2e4c99bd603e2f9adf9026f2024a8ed011060ef5379fe30edfbf5728bbfecc72ab3256298c9c09631b0d699d2f082db324bb8a180f1457685750f2708aa0c9661ad0100f0f9ea2d15d815226084d49c281649a935e4605436204d6b75e6eedc5ed164d27db4faaa245bfd350a280664264fb137ef0b4edc8026be54bf65c7479d3bd64e2ae4234a4ce7c5644993cd2002429a04d78f6d366cb3f60a0629af2c5a207fd2d1a910f4e70e475b36b35cc0fa8102d6b64dd338320b536af7271f2abb35449b141768150c7320b0ca9061a87c117f9629aecc39c294c3e1d2be163b9237a1b227f8233a1728ecdeb5ba055329c2a97bea765f4f3cbff2e9da9aca2687bcc4276cef3f20ed9b7a048618dc943a71983ad316354a2c88ee653fc008505c214f4b94565bf252ab76ba4f5703f849b211bf1a71d87315cb696c6d88677deb5127f3a58828395800820ee0d37d76ae108232273000a1412bb07cb34a04d8a3afc97d365d07e41f00929608ba289ff060624a00a31d50421d1141e56fbb17144b23c798414a6244315ed77731ad06bd4d34954027e366f37289a9c5c013c5f2772b9879d2c63ae755249b66017a4bf4864a75a8a1f2cfabe827b38c62bd028f48b4cd3ff6caddd9a613d674d25b8c366220d93abdd92740b3572695f9c48aa77ec026f449d094ac82536688ad3e63afe802b4deae8433bcea4170c3af7f976508c7fad92bd44e114ebb33b68dac5dc96317f740b62479bb34e16437c36da131c07d0e4f8139699f65fa6dcd3479b23f46a7c8bf975d049381663ea5016ed59c14859ddd10c4b08cef654a1eba7fa259ea811c661aa755baeee299d139c56ae6bd6322d4c2953b84b99cc0b94df5e8af0aab6fb1560113e6420ec10653fbf7a7f190704dc66cabb488edf78a9ff83814a464e3183153c032cd635194ec83a26284b99fc2510886233676c51167ed03f11ea8177de2fcf2ba09d11cb37de2b2a64f34794af2ecc8091db8bdeead0a18f3a2026c397480cbbe1b9d8a6f13dd4b020f870cae3301add3ef989f665a9b5c7019b909c92c7f7a5d718307bda9596f5ad1d0cc50184e2338a9313eae5d3b284bdd286d4409b90e9052d84c61a91c94e41777e096402114f4cc4c3013334f40be68ff358029b3f6c88cf5067c8288ba66d58f2cd49ccef01d244b8fafffb864611291a515146c309e3cfdb139998953a775d96dcea4a820b522c64776d351666a0810b96dd425a9ce2fe51695d4bd8829203e634d049a9a08ab2f1551b8f6c4ff7efc3193be4c5d242cc1bdad25e0aa68131c7e9db1fc4c97f1cec05edda80a0e3366e72fbac860367551ccf5086042f05b0bd66e022ab9090076289e35c068eaa2a0e411800dc1672d589a5d54494f0a30437ed6075bb3df44ea5fa9402f05a9476023b4cf8a6035f79bf0b4516c13296e6dd30d183d2cdab6aa03d0b8b1dd286e2d79b043bc17ba7b7ce2477f2075b72389c024bc388dcb7e175f3fa07ce5155f31fa4ebddf9aa8a285095ff7a7d674bd98b9b861e774f3c679bcd7bf631b9b666429e2a3c1da5b61c8ed6a74d3fe94e29b51a3804640d7222836f6843491bb9affce92dd8c609401881821391caf60fb86dc37ee0f6e7bf4a57a0e00c77ede54d4039226aab8c5197d8ebfc4649ae7ba74b03a5009f7e606ef57e92b42f84da737db2b9481a71ef497c55bde150433121e57fdcc45bc5184147e04fd8547c4d5ae78fc9529131f67fc2a5a83b715553ce574ad28969c9ca8e128881d2142ac1e6bcfbfa2394518177906e5c23585464247e0e62f8ceed486c7b40880aae5875e4a22f7f33d03e5f866c2a5060e54e3c1bb6b9feb601fa616fc2ba84532a02279f8dac7adf8b747161c357c128f9496649736af49c439b6bed856d9bb8de9d9f5a24a84cf6cabf62fff86c2389860a3262d6a16674205605826922d20839a81f3128ae00af9b50843c82b70ea071307979871421aebf25bdd82f10be2f4a63b65a7a1e452eb12950d1ed5d9eca56c063c6a10b40fc394deff5698fda667846f657237f4a5aab0c140bcd7c816cfe6205e6bb51fd0845f993c58d6079b9e511d661d49643db7cfd14f347dadccfeeb38f5b16a931dd82d45d22f0158d511698d137536cedfcdc781a1f9b715c6844e6e6a175bb4115d02844df23a718f463530c6af049b3a72046e7253302988a778bab2a7e56e4dbd8d1eec6998b686212616b16b6511bc9c4721d307276fcb00f9921d0206db279062d43d9a83e30c42df65d39b27392b16ffa246eac0b4cb9f9c1dd9b597d1e88897bbe0760828430fb25a63a76b76d68928b81a3f38405b5a0d0795786f198e6cab5f379b5e918e30fc7518c7497a197c0a356cf89760a922370119a681776d6e6a323ae388037d86469b7a7e12779067a8e9e36adf3a9dc58508c539b8938140742e1511293a58142d97e6db51d59eb4dd76ce010748db58cd52a209bbb4096e8de29ff62a85295fdf595de8f1707058b9a8e137488bfc65dc242acae9ed5c5ef323ff62115edafb6ddb2e2723c9e3ad881813d65264ab3b34653bb10284725ad2d13dd63812c1c56c54fe40febed5555426a220faa59ef07d592cf25f43c1bb12c6681ba5802d4ea64afaa223f6245bb1abe01199beaaa0ad28b44f01305684f792cf5de9d4dafb2f447010c1ea5a30281c62dc7d1acadbaeb9a679f096a9c11d3417aeeba4ed6ae2225d67bc7eecc978e3d9c0433f464122d74ed8ee61eab1a5edcb447c957e625840c3ae16ae6e4f4524098eb05698feeaacfd7cbdc108fb3df4dc87eed688591a11178ffe693cbb51629d484c0bc0a9d5fc06634a91956e03ef56e0f293e836f28d434bd6e6ad4b5c1a0518d8a7472578b514f03f35ef4fbab7c0b5c852167c46ef823f787c47c36dd3be2355915d2a3efc32d4691ac2eaf9e87ec0f10e7f8d63fa9ac950db8417461272862a9d35d0a8d8fff576383f0232aca3f325729a1754598729195e047a6c9a748c2d1a38022294f88b518a982cf2ecbd92de6856e2e1924dab106a1078790d2fdca2511ebcc02de574a43c2ca992b3c1c050e2dae9f27edae0103750a6eeb253255f84338ad0bbccc776ade089198ec83e94a9e8146584f9f78e23125b91de6d2dd036f305d8c36f7381e2fd29df7881a6f93b1865f6f72f343fcb6b46af690b1ffa1a2424db7514da3254acec0cdf2909b08beb7b766e0173647b3628b29dc3bbf5f2625565c193254a383d50c9da6d61018269d7ce5a818ce419e0540c85b0942b8a2596a172f2483191e5e22d1b25ac30401171e5ca1b261de815f13c0e76e00db0f3bfdcb3dec05f7a68bc4f8c78c1ea66a856a5a46ae27402bbc93f42cc8eddc08934f4d6808a64051a6f186ca74e982da67f794a5ce3331e733cb4692f2e11c5f57aa3b9418f460db8b3725e44b6b649ef3d38f6ac40139e03f1d6ff4326e55b3f1906ce115ab7b70bc413f031e0565ed57a7500705082b3cbc1a01f43914dcd9091c2fa0d1a580d9a23fb77536933188e217fea13d0fe23a1408b3d37cb38eb469e0b85cd77e0e3555033ee83ea4dc1bcd222cc2b2d625ea91bf34a8c66db12cfd2d2ca1da24dbe95ce2ac51e05fb31b7af5116375e01c78602272b2a919a3a946416b5bf2b7ef5b799081fec04a9c2c4e6988c128e0d7295c4a72ff34b1b0d5a1bd3204c56226a22a32b2477240f760f7ef65b5140c9ab9bbfac774631d4ea62fa4eb6335dc0be190573800315aedc37067fe7ddd6b9823aa967b26120a7d89e07c8ec8c7885a8a2ccbc9795ec48be060140eda5f1bb1171994ee7fdaf8f58b466bbe007762831fdcd2a2c5256238698c4e9fc12509e83727c09847230ece8e9a0b21e1631b7e6211bdf91464210e5292e5a2a5b4fb908e133eb0f48a45ccfaecd2da2ec0b56631ecc893afb7ef531655e6927493084ae4cc65894de2f7c47fc3e6760c9edb759935212e97d7fc763a291c3e186dec6723a4e46990b0cf1d2ef7a64cc2cee86465344f51881a75eab87d163c01b09e536c6f17c526c96a764f24e4a135469e4cd1456a7096ac2d4b11fbd38c278e0ff9d21f5952c8a023243f64c0971f5932d5c3ade7681b2056439594e82b6dcf3a2b7a59e004d0f4c1c178df50fd399a169c0e7c8dd6df54ed8a7642d94631b4d946524918e67b2a7017d06f742a9d5dd6561e35f826601428bf160f48a0e227bcd9701940d4eec137aa298f272216b02ffe3e4bf0972004c9cb660b191e3837190853162496b6a38266ae8f75e4c39fbaaa2edc408ab7054b69f4371723408aa513d09b12246b98d6f09ec983f4d1a4928cd7f49182a084c70df5f38ffe26d12b57349ecd8b9c704fc4575e01b1b14458c6bfe965269fe5eeceaadd96210737f04b9672ed07c2f73b562be0cd5fd8d424daf958a9d541cd62ed1568b00843e6e96a1324f302dfd094ffbee01502421116a38d8cb4fd4d5629fcbefce2a9b0434a8a8feca47709c4e10ce24684000294e2e52fe2eb7f3d0ec8593c05ba305f84c22b996d24ac77a04641f1d30ab13dcbe12eaffe249c8ab02861beb5085df97465ac8e5ff42ba906911f0b9117dd3ccf48c0a6976d2d4c82848f81696006af4782c0b25b3d2fb2f78793cabf3577c904635da131146dfa77bdcb3116426c4385169e97c6049cabc6006e28c0bca3a033ba23a4a189944e3e8bec69fdd27a1b8308fe4df4209e085e31d0d2a67a132f391a9b8275376e8808bb64321f82aa74e773e132bb0230c2b1bb8085b9144efe053e4c6888c083e88e935086a0a828fe44d511e97dbb1c16995432a952f69b9d6c977913f19a89b444a10848f481c8b5a6ca3b5b1bd7dd22aebaeeaaa40ff5bd9431948289212afeed911b7cf7d953584ee26edc7bb70f77268366ffe7a9e4208b57b67bab9f03f7771185f62e3d6a2e8b7cbcb0566c0600cded72fca19760083093943726ad0a7cec436941cf3467c31ec1c1f4d4da9c041f27b5f7cdcd2886817717cfa90a6897cbccbaad3654cc981af185d0d018986dd3281ae0861554e0fd61b3dd4ace0d017dbb932cbd8cae0cb6600df063f79ea260e3f0b1cf7c9f8596b35d1a0863dc9adef0d22cedf289652e1b41b14e22bfcaa3fe0054aa5be6cadfb45b6e4be722f065d2de90fe5d8d31f8adeb9432a7cae63268e2270727a26a9464c1ba6c33fb2bc4f69067b5758d220d715c30413fb81190c4c8f9fc026a38a994e107574ba0a3a9c952d54f6d9910d6725ff13cbbec8c2eccf9ab12f1062a384053562580229940eb59bd3b538752223ed406459648643ba201ca3e91e903b156f4e82b7eb5792e039de02cdffd25a92ffe278c49dc9196e34aa3cfd3e00c22c920b626327eeb83400f3b121233d2ae06da47125506e812b92dbc8139622e209f079d79d57b67287a6ed634baaf3edf0697e5913a304c44427a9fd4f4a9cf6659597a8d3024e776c8889af000bae804a1cd6e3e10aaca8926a6d3841368af7b5bfe468986fc20f9de9258ca320272e488e3541cecc56e9f3fe8d01405d2d4466ca7b223c31883b1a7eb215c991ad05611305658149c7c599e5c2122dbc9e7774e5c8701fa81e76756655ce155fb232b9d04c254dafb8fa2e1c727a7e198270ce7d3449bf5806d0133e5c46ba5faf7737b4cb4d813c45bae62e7affccaadeab62a0671597af6750262cb430f29840a22a558102610a25023a854e353cb8fa2ade089c35062b5f53ffd7f6a3e77d528ed0ede1cfbb9da43d37afe1b2ac3c3c003c881191b8b17e6d0f647818c354575a341fc47c443e29448b3450cd89ee4054d5711c6c7e800ccc3d97968ca1a340e8d183ac6a206a7fb99bd74312be560c98235c8f3abe0d70e1b630d4e95a934905abc5607a6cd88579b1c3a478e94e02953c64d25f3d707bd681adae500369ca51dbd14def1059dbeaa3583480b71b4b8cce56867fdfd2647b112177459e2f0cdc7932b057f9ae86417e6b22ee462c70f975989551013bddc6e657b5bc51d079329b94b568ae860e579384c8eaa7f739eeb1c774a6b8cb5c3b8d8c2972dfa445865c749065b5032587354d2b652ae256b5c9908b0e52ab152839ad55bf90c4a845370344352148ba0a7aac35a47f90ceb025a946210e17ba54f5024d0edd6ab4d19910434bb212419c1c084d545e3ba51643e3bd2ba07037092282a7ecca396e249f42e1661605828ecc97831f0b95d9dac7c4b3103bf9cd87e97afd8ade77a13020e0caee1b0134f10c6d7371985a54f74931511d85cd4b21ab3330a7383f7087425effa27775bf0f13a2fb161de62c4ca8aa7ad0c755c33c056632d9b2544a102d2bad6c20c8b5a67a29d391b6147722d3dc61afaba205210eb5ce53303383ada43a8474784855d520c7a556af8ac999a6e52271138703c157ee5e8b0642529afdcccb4d40ea643ac038dbf09db5d4fb196964371d628d00070fffad549062508274ad014c4a123555a5023cd5a81441627958a5bfdb94d111263c7fb398c3c670030b55c82aa8858b185db1b154ba1b8f64e50de552c39389667f338cf195927777be53b240dc16f543621ad451f617caf247fd125d20bd04ad094c46f1af740bbcb2729554d32f68d1994c9d90685465dbb910d526d5679e7e39e32befd9e4865934b844271d3dffa9468b2f91904fc6760044aff62ed554a303d46fa673a80223b2b271e20b76e0357a56dba927574ca01b18e31fb78e2315d39b0cb7bf508a1d9978e890c7c1825afd31f2744b2dec8e11ec3e41063f45f79b9dcb74da42b16b9b3e2ee8fd5b5908f025b9a75f0d11d5736492e95aa8b47fb466668f5b07d3631837a831091a642377e264e9d65c219343994c70f3a3052027276f52d3a18d7272aabb43f30176d4a123d29ca94fd2dfa6b2f3d09728865ff6beffb9e81d1e2fac829f00d263d0d0757a8367179aedc2227d94200266590b180c161cb41168f8e0897f77d888a0420a6b3290d148db7002e7e34d9b0dea52cf622a03918821e805d18777c82242f5993ba9da3798e8b40b0e5343596a007d74b8039e11e360205325182195a1f9a24482199ccaba4188160903f54969359daed756f5e822aa32afef3e7540c5c58c63b6445e28e6a3bba765219c090f98e88beddfb2385238cc44dffedd5f24170261f204eeec41088a30594da9f280cbb93be96ca6092a5bc99c9030c9526d1f656d42605c6c1943c9f9506c56938f01c1f192d6d381bba87e26ca4acfde50ebc0a05a8d8800f5143db56cb3ca0eb532485a2ff411c5e397bcc20173f5b283c09c359d5a2340f406cf24f0c0bb1c3b518f6a0528efc76e4779175e792629baf126f047736ad9fcf428602b71fe9220f0ebf7423627b8845b3983247d46bed954327363f2eaec5bc543ddd1dbb037a4911e12a8178e2f5d2463fab7501f5f23cd9fa2e5556574a6dc1c96bca013be6c3227ef965409f6cce2a8ab774d155962c5596a7ff7bec48a4a8dc1100255c13347cfe7188e3be94d66031b58657d783f45a1a071c8d4c421a2e1c991051c41c6de0a0bca9a35b1041dbdd607d2ecb67872b96124117014501c458387720fd90d0926a6e1ad746ada80df69e1594b7c8246239916de96852220a55d1f6414939a70f765db4feed7b6e97733a65bc4a6b54f8c5588e31b1351cba5dfb4f036d132ac2ce2ff7ca25090f8829556acdc50cd35c6b75120cbceabcc1e2f302a21dd7734973b0c7bb2efde0026b84933112e7bc2977b42ed5bd50ff4bf3dab3110d54f808d63daf221fcd4ddd87e06fba8737a9d1454eac4789ddb9f87e394c5fe3385f24ab5000e3c7b08161f2dfd5a5ef08edfe181859a6777f78ee9751d850e5382779160f145519c8d66ad9e51b994768c0dd0369611926ff6f3d4390f292b1fc6aef2386b0d68a2414ed86b26683ada7acb5057e40f046be48fe89e47fe60c69256e47a86428df7903f9213b76454e15d32f8aff53823c0fbb10eb1cdb389d1eda994feb654ac704f2103e796aa3fd0b000f8caf1c6ea697ca84c1c345e4a557254c241bb1ce4d14d25367455785633ad81e7ce320b63e97785680473855da3f3851aab34a4fbef45ace74747f55630c33170bee61f7e95402b08b11e96587b262354a12b2e26674d07b19e3a3a6a6f0d84fdbffc775b9020b61c08f633f723f50fbcb715fbb01e220e88f5ecbd7d58afd8d4799a0d06f4b09e00df398d3cdf73d4892e0ae42f0febb56d1050884175a79b59b7d48490561d45acfdc6fdb35cf2cd88d4dba79b0eebc111dc7ef4d37a7e7af413aafd2abe0953c05c5da227b1f4b05e79f6632263065ce91807c47161c070e7bc67080b3bace75eb2e3e0cd2665550eeb6dc6ed9de0753c83ffbbc4bc67c79fb2432580a0b98f3016804c4d20f30778ff7115f4bcd04f00302b2cd0123ce11bc893953b45db7f0348d2051f860a73d743c3f200c9d1dccf49734127546fb07d210bb2e32e842a95460825201ff947ffbbe581f8d4c3a05f1032f2927c25282d75937d0d1c3d3cc30028d4bb55091973dcfa28e47c5f55ffdfc419a2ece848f429d8b455a0e8d10c682df400c1a1999f82ef748d9002e819943fd0e33b1192e3b00a2fd8b84c13755a33f0adfa78a60d5fa3086fe44cf685c37dc2f6ea42d6869205172809afc851c4b8705cd4ea3cbd40edfd9dd1f6eb3bab544bf07062c801cc6bdb24a649170f1a338aeb74e773ef42f9bfa09ad641f4f85d1c9b6e094696fe161021bfc7bfc40e43c25db6f3b35b29a1051e9e6e73156cd9641aff2dadc8091c1b07421f70c4e14f0457a886e021c842dc096934b667ad6b350f25b17e986907bef063678f0b5d08fe377313fdfdd80f6639e10af2de4ea45bbddd6b71892dd15391e1e9bf4f2fb9d2d570b3fd82bd2e9bb3a1f7685af461375a6942585b2e28a15eb08d5d0f16ce527340931d8ea15674850f72ef956d4b5f618951d2135840df247b6145cea34546b5fb8e5843eeef6af86f22683675cadbf0879b08528265bce147e1ba293c695b8168a430eb7e59eb8c2b7355c48c9e18b9fb124ad9822405c681001284910940609b4ffa3166569b7992698f77d057e44e77cbfc8cc3610e4c49f176ef619d58be16b1cc5120dba9dbf482606ebbd335edf303fbd03087ed13287d500f2e72cf4b7ea123807d8870feaaa32403f4f6ad2d0dfb1768236e7bdaa76ef87301313fcc976e2485d86b6ed3e4d0380d1d898e21f4b32310f701dc2989233a98668e41838e68789324aa4c3f5fae363810b601f8c9d485d72cac0ae3d9e0e1c7b1066034ee2c52647078a33aa848377881810ec4b04007e5f00495519786535cbd4dd82336619a9b3b8459766209326c11f6f3b45da5afb5106cb4ee64b6b9deb8eec952126061af7c33952073372a384d17fc5ace6c17425119664974eeaeadb4a04ecb86c1e60943ab9c205170d11c05bb191b387310ed94208e3b0474d485c0de7f3446ee003b975bff4cd8bf645f26a3617a92c720d122fa54032c0af6e6ae56aeedf4c94c19655161b2a6e1ec558da370042e1441b7a200410a6b76ffa682c661f5e0b9f1555edc92bbd16d3777714678ae7dba19244f792c176add757c7d76c82fa9c7ade37339627f22af18ac1f594377a3e36ecbd6cd96f083462d34d8e45ffaf518e4b91abd763c0bf77b33b12654c7976f9525893422ce96da23b63988e0a6c88eb8fd73dbb560c4f5c1d9383de2d9987a96e62cf282ac38f8d874d4fc459d081a64825f28bcebf3e982d61d47f2c3e81b9a3ddc9cedb89f88335cc04fe41fb7c7cb86c9d9f1eadc65988627cb1ef3f00225f0c244682ec6bef0c601bd538c534709735a0e4d1e1198967d8d183512f378956f9b79ca02f4d3ebe023cc427672fd278d4d1f9b4c71702262f3218701a32625326556176da77c9f36ae5168ae03d8d3c1b530da8a545d2e58199867fba920d47b842c8f077771e39356454189f29367a0fe868526b331712bc5edbc95adc02fca0a938c2aa46f000ab50c85343ca8600280188a076995e26bd1884c07ae29f00be5316c85768a8a93ae1c79471c3635f2a62df00ee5bb159d62ca2d851eaf2ebd7353b1558e5e1243cee56ac9249f2be6767f8e14146f9088c50ebcf09945e17c30debba5fc10890ea80ae610e1b290ebc2f2657c09fd4084a655f41866f84e80e333d0b6794e772f3044102ba2062429617f7830a8cc8b3c4a7a0b344ea3e0b1f19a21a0a8b05bf312dacda5d1620dba0b9128056b7b09a4c08e69390ee6b432f9845d0a0dc5e5681d63db71e331ba688452f131e18710fdf869a8520d6cb50a2b2819194c04ff31a2b0b9abcee1330d80da36d648f12e3390c949128e0fd3042ee644a13093ab8809b619b9358b8edad9289dd4d54aeff01f3c038966c08fa65a041324c6c811ec60deeff43ad89d25b1fc14381abaee0ea167b00ad7d6c95fd4024a3182e464431082e4c028999e75a02b86cac75586369f427518ff665a0a05b52aedeae80b1e230a03abd8558d0667c09a1a4a9d30e9d654d258b4a83d136bf4b6ac9e58b847fbc36ccae2b529d3010e030a7644358040742590426fd5f8528e6de8f41baddacbe4d1a8cc3933654ecbbee8b4357a623803d785ea8d16d73c86ce2f87489f0b85995ccc41b391a01e91b16ff25ef8658f5283773d2a67b170aa8b308c7a8d13333d49ffed934d383289b29c304c7984562df923936a1d402a57b45047b60b9f12c2e72334925644a213e8dd476649848504e9f49b347e3a3e0532875753f95d685af52605691782017146d7ff9a38513d61040bd8f74744492a6a8a3354e51424259c6d7ae0517adcafb9560f2f29a294d4c6623b0c0a8afdd1aed2a8f41dcb694d02d5d180927d83c57a7f32babcf04fff0848eb224d1f1b904f1b992b7328437043c18b7d91fd36a82267682fa0609c536217b292e90c86c11d56807b3cbb1115841f2840c92d6c7f2ad8831ead6b43b6d67fb536b652fb7878bf583b4cf6ba70f8fe3d0543b8560c43247f8e19ec7f532a140faaf4111395f98075747f3fa95f3f964e0cb9a461c4adcfbe68d0fa10286163b02f8d99032e34a0fb000bdf25bba340625a3979a2308065f256d12cb901af9de1f3ad81604887389314a80108899a2638c02cbc4971559e6a086d600b04506feb00af33921de1d6212c0a59aaf53ba5cf0124d2d3bf1244ff51d5cc45714c4062511cbee357c25b3b821876fde831314054b707a3e68561edc3e67614420a2a4e037f0bce37c36e3f6020a598e4a363fadb48d1985c002d3640a46a5ba6a643d079a0b2944f18e114774af6b7d1ce4fce3899c1ee822ebd2cc580d2c1826bd56ef3b894b0c963586b09b2937b86556a80a4c1c9d79397e8b6a31f38cd128a3afba37b58b116cb6e9a91f36c4aa818c2b29ab04ddc5406074d91b88f84ccc6325e7b97b80f3354f25d06974f58ad705835a525d850a6d741b7ebfd0291527554d85397a8e413a039197f4068b6318e6db0726ec03c7d668f9c8200c4a5b9d6d31070d4c150d535a00a1540bafe8122dd8d83240ebd42d24c3b8b715870f95602049e67885bcbad590ecd69b83575cbdbf92150f17173cd90f062008bef0ce58d416abcc8cabcff851e6ee7b05171be092c44be71a385dea6f6395c690ac73bd3618766b10e90526e20b47b1f1e446b520afcc076594a0ca9d796c5c2a91eb50580434adc41b4abea347f555bc345ea143a56904756dc90320b005b12da6ab37765b22f67e4532d211c3244f727b87afac8c5564ca2f151f9f2a2e10753e9898fc65b0616c6970548355b7a432f55042bfb74a96e41609660659cad359f3bf4b66c293469fb814b94a99f933080f8bd46e5f5ce1bfa2c8b3df2e8cfcdbe1686ba6e3c13bb85f50b60d3cceca58b3d0a987f0b4f107b840fc2c863528b5b2d0d15d20b5bf6edb28b0351f8b43dc4fec731f11c23c982f4d7f65888f39e319f27725d9675a532a80a99d5531b87bbdaeb338aa961844ebf3f8beb2c22a354472c41edbcd160f9e2f785229451260a2436d66011e50b18b7adae5331bca3d32a9e8c52e6d12cd3c67e1014111b6819e4a5e022684e515f4ad93095622a5e2bdb13f36f05ea2e80e5a17351503317a7273dc1d9e08935d1e72a56107e55544a0115bf90024ba44e2871b51b8955c8e379e1e1d7d2ba31f47b681d017ce8c8637b82015526b348e4f68e8b982d2ad398945467700c8b37e9da4f9ce2c1e1767d8310b6596fcf37f06844d66dd56eef8da4438d6cbab896dfc86ef7ba7192cb5205bc39e02b16b0a37c0374c687f0507e268a3ab3cf68a4461f28ea983a6db61819c84a053cab20090ad5a66df0c56032fe6c4103403735a3b47fa19edc80372326dfa0cfaf312f0d28497beda5011d6d70df5dd69cf9bf742e5128622a6fbf83ee468148844fedf21de1968ba457767536163dab7d92b7a7149bf310d5d7c4a18a3aa69838e849859e421d8b733bd63aa83decf80f6b0c49407087796ca91605b7ed500e199cb99b5c01efef155bae44806d7b94dba8c15fa7216ffb1ead380ddd42a1b87a7579afa6a3c42c2a375d303f74364b379c03ad45270169b22157ecdc434ca08d41b9865063001c0d8aa048200962c8f7449b19aaa42d9b70d32a21980f07b3cf35d19242a970b069088c0522f5fd4cbfe6b5ee59e8ed66ab365475385bd0d431042fe982c9626f0f6ad834905a5b7467929fabffb5cb5895ac022fd7a4a3b46aa5b1a99c55f9bc699158a2bd47d293fd5a6e0439dedeba15e998415ecdb39460c0edbf6f2dbd933e4a075ace9c6cd9de23e913f711b98f1f75b9ff1e9d13078e1bb2b5f3aefe275358fe67b51d9b82953b488a84b130f383d5aabeceb8b3fa0450bef1ea99b26910ef9f58f3e7a991d0c9947dda500616b0069966d2939425bcd8b8a0a039a480186058d27a86668c18c2a2721b48e23830e15a5169de124539d492f43081551dcb441ed62dc24e5477ee69fc18e32c8b8e85be9d831c1afe0406c585b804ffa948cf2e7c07c7fc1d75bd9acc9e82c840c200c13f3148f71c62f868e514854b0c93f87c866c6336b9a47c3e9b81911892c57e666e235540965ed144e2deccd1763aa8a374a82133ed3d91599d5dfe7c43cbd1fb3df534773b5fbe4119f7f7950bebd76a683ce3489bf12f0ffb20fdd9815d8ec31308d6c138be906333ce082352e4ccb07cf83bdb2a94cc7487865830c0da11d2e6c40a45efb2539c36a102bf6acc86cdbb8466dca4d62e6a57747eeb98201332d141d39f912200faf1ca217aa96f15333619d86176ae12682cc84651bcf11c18b0905ab1cca8d799978abc31fe04406bdd0483df9d7370a258cd18f3c4a65510917ab6dc4e07f893b7777b4c6e9ab17e05bb189fbc02c4f77619c4b36a86e2f2c1e57b8dcebc81d408a4d741e42112eba19b3596b1e4ec9b26b6b3dbc11b4c614f29f82728b8887516dbaf127d70cbc772c57c69e01f17738cf1bc6424f276f5a6687f14b2e47bcc127c56be586db90e402387fa0de8d68370088b6d6040492451be37f0001f64e65b9d057d6c55ff81f217489ad8eba8c0a649076f48c854f8f63103e108cdf4c858614c19701420d81fa89f0ede19f4f01d321d414bc03c75392ace29f022d014cf670a0056d203423a2ac9f972ec41db55b7fa5de5913b6878493c8f502dc30b9ed75097e0e3abd9f05c9544002b5803870e638eb29f58da64fd1b2a27bb578f445b8f7f2212f846bb4e451fe0668606a220139c28e08726b05078741e6fa0662a6a4d88aa817a1882ff9c112290f84b0da52c8c3974a48687c59b780281405a085be1a97618663fedb3c7f6f1d407f74a4053cb58a454622206f1e8786a972e56d2f3bca18cfe0b851484cc26b78bb1068ff2b5afc2538811a3b06d729eb0129b62207da7917adf68356168286e47d6aa3ad22baf76900ca3b8b030ff2180f7050834cb1c4d74487f96b5b220ab2650e3d9621066f805f4d637141751bc7db549f36fa8c839c3a414e90eaf2d81c07d92ee2772f5de5289a4c92d3a47a23a3039dfe47730eade817fa4d3c1745ece7d30b64adbade9e2269d2478b11b24317d8271d3656a37abf0676f424cd90cf118c29c3344127d7af46b6c9f5f1d1248ff6612c5aff551b863018a1205344eaaeb4bf4d0c730c10c6e12e70e998401f91dc489e43d42c20508b33127dd40a68be17a40c2ea433fc1f059f7174049d2ce18e40c341a5874be28502ea265e760d705ea0032dfffd4e90a002fc6ed2a4151409e7b2d6403545812db5cf9a6d3e67a888078c4fb827a6955fd55c548e16d156667090c8db3270b90aaa272f6d83373add7b786d0413fd3ec15ec8b75364d3a33618d774dccdf3680971b1659644238c8ad1df6c6088501de2b879cd544a8ce9a99f1ad0564ba21d107f0c9db23e684f54d4231cefae3b7483e223d9edd95bd02417c9a89c717f1348cf70aecc747390a30d193519f8254182fd325c633feec3d20e63879b6eedfc0f348f63b9c31ac322fd57bf50bc34d2a127acb7189db0372b10e4969c6536c30ee4dc2b8978aacfff64c204d44c7b211a30a0d17849b98d6683378902a80423d1c42a4a31e2c1374ff6693ded055e53df6a740c71fb530abd82a4d73da17f360aa2d239fcbe88292862ac7c0c988558280345f78a6f280441c9117791749518b6665006eada94303e071f94624d4c64821973013db99209b75988028c041307d30a850be435e6221bd4a25e7ccd214ad2abac894ec3bc1b6370f151a7a28bbb288f846fd37a7a291c477516b59e4aea8c87f8cf6ba61101a1c10814cd4ae0571c5c1c9019f08a57e6caa835f02ec9331b91361d0c55192e2875100130870ac3ae4440703012c6816b3bd2c248efcf8a84c197499c0a34f0488802950ee9123a4844cd6d639a1aea8005e82da0c0da26c5402a4e1c07ab7bb0eb3cc1c6c3172eda5ee9eb4018240c829c157546b025c616a24671e994d43278a9b1fbd7e09e8cda1082d43d008b0577032bf56a44a4e702121d9a0790c1b68e2417b09b02f1a18444f2f1940aa384b6b1c528248aa9a32b1f12f78bd3384519b70d4c3fb4125effe026c54effa1488f13e855533491a0ffe019562b0c06c7e5d8f188df84b420dada7142c4d9766f3cf3ed767254a5d9d4ce6c183bf96212dca28fb3c0fb19f02dd215266708b2cbee578e0406cb7c0973f8362bb6b6866d2199e87561cbf7fb9d6a16630c663717c4243bbbfdb47d21db9c61d3d96508a7a152b4b07badece3007a1758ca6396c7daa97622d9b372c73def65d6273a24e948c782aaf185bcbff374408cae4fda6864250be9589a56f2215e52318cc057424bc714aec49fce000fbab9108ed4ddc8a85ca973838e866837c8f9a7fc3e5f75d310eca198770e6fc465ea25705fd362fc0f198871f12568780688438f4b1ff4c91b8dcc463fc36e66ad0edce659e6dac9e38e3a428f6702f36ee0b6aea0b6a9d41a9ecde09add155e2a52223be50fcc27009018f405af0732fa4ac86267541fe2287b7350e860a235214587515c84721c0c9062f37d24b0a2f263ef33d4a8d065bae52aea47832dc9b9ec14fdf060001a7f969dc37c823d05e707a359800316c74e7ca50dd3e73a33e19c7be2e04726d28d91d66cb35945e7ac8774f3e4685298c5af8f6702b3999295451d2c6afa85e6b7de3994d6b66792a00909a0d659d6247e8ac45bbb92f2ae825bbb495e52270eb59bd227bdea16f40951e102c56eea97a260037f0a51689ca1d6b2d433ea50bfc615c9ecec4f8aca809b36efd4866d25ba4a9ae54f048f5523975ecef082d060606696cccd59901a709367371e5432f2d3ec4a95428c291950a0014940b5d546d9b2c015b3ca19ad41c154c92b977084999ed5b4e95670707145ca4bedd1cc0bee5710b754f04a51c7fe95a328e8080b6d556b1eb0b5d09393b0244b322a1afdbcc3b89664b11736b962c39ec6d2a48372807517c7f58512c183651a01a10e5965d25e0330743ea4df887b3323bd0b84b2db7e2fa2de0c47a7a70ad09ba2540e045eb57fda95a2bd331869d5cd0b8b544e8bb83a6e618148023c1e003d099b063dd6b3b835951000fcade50a0c62cdddbadac90e6af142178ea337039b1a4c68af5697347b9040136290d91c8a0fa2f9e8413bc0e3bebbae45bd26b40f99cd10050638df2e1c906ff4e9e30a71f00cfdf03fb0d25e04e952506987b801cfd21ac29bb53bd21bb1feff626c41e8b8d294a507cb91e8cdb832aefcdece0e8e0a1a0b8e9791d7036870cf48c9c7c459ae8e065105afa7d86952c209bf08cd3807b376e0a7f23c4442ae5d275cf41a74c111d008648e0175c41d8b0709a15c13dad1813912cc3af43e0253eabefdf95b8728def786165a730e26410b18843204f525ce64c2cff3f0190a09d4a9d7e583810013290a261b2ece1d4c9d00a823d1b2478fc642215b430b5308b07d0dc64429b34538540d2cc79116481ddee0337e9e7b4b123c6df3689a06bcda35bdee5231d5b974c9a8cd10f047960ad4b5d2d50b93b9d605e092c0eb2817c266e70667b15cb13c755c3a5966f5d2b8b55e998541f0e7c240da2526e2e70a0eaf319264298a27bca41d2b797a3003cd69a0d3a1e71957b3c2d8c92c133104e2cce80bfa63ff39c211ecff040339e5c44d1a3b6d179cdec6ca53b2a8e89a5919fcfbd2a661bb9434cf71f6fcb58136864de0b957a9dd4f60732f726b056fa555e4380334a0fa1f772477a34e8733ba001cbf7484641a0d14f3f02be186a1b8199ae392d83c6d4b7137d9a6fbbe0195c9fde6070f386a32844fbbb31000e35a0fd894a0b54f85d73314c8904e548dc90055ae008bca3e3320fd00fc5c7608b830242813a657891ef9252a1a9c179e55ad6fb6b4b09a885c2d159320a538d43b7005b52e3ed58f38d4046e352054bc652c0ae0172e7e75a7cf117357e4eb720492b2b6923ccb37aae7970e480bc243c38112f72a371ef305edebad8d8f012692772c6e8f03d53687d18ca29153ea9c5b1127bdb716f1cfaee1073cbb85b731c3ae6ac66742fc07d51e1d488164a093b296e5fdbd30ceac48f97107d143bb0fab4b1977a10dc79699a346d45ab1efcae80f9cb686c13e8a9a9468d5e1a70f9012c280c97ad42741f103d5ebbd7c3350be9d9ac7dc71607d3a2df1e95f644d908a843f914325d01b0f098235495a1b16097249428943e7150fe7e669083336aae74ddf09c8e5d61b99bcc6647c1025f5ec00276c9b49286b3a58073b057dc53c8b8d5b9c97edec8ef55c065184db8ba3405545079885d5702a3a44edbcc63f7398e6a7c5e94b2d9a0b0a845c5a8cc4e5b844e21211368c73b3e10de3c0b15fa6af00e922469577958042105d2ee82ff808f3731a6921c85ffbb31d137871c4cdad0ff9fa1df0cdb1c2a4a99f61e0c7232222f232d0943111c82ec54532c678fb5baf2eb43d12d0d0e888cc8458cb9a53fa764306261aaab8a15a566a5ebf792720633f86dbd0974d9cd95fc7ae40403cb8bc5b35a5cacd239e8b18f9f92640b00061fce812aae41f9be90f33752ae822461d230e41899fafd9be43a2b19308f5a63d472089a7d4b451cd57f1056e03cbc1c98563ac209961accbb2ae815afbd3618dabe8a42b615824f70ce2574a749586757c5e4000d4f6eafe48f0b41540b34728437b0672e9fa01a0ba7c0a23e6cf3fd10474078888cc1c7a0cdc52d1302b2b09b8b226e3c7a22213779f5a1492a8e1b035b024a1be8b405adf5670af2224c18cd9a6f04bd375e834442b004ac59d38ef18e961f000c8e095333fdf4f692b1b3c23ec5f824d72edf33cbde8f8a810df1554acef9890db168c58f59a7d025458a03f08d81494d1e91fd719a35b2849c53982484adf5bc33d69947c04002b437b3bb345d6c6c631779b038e33167785a88f0a0894f697386e304c9a334a1b033c80de67654ab2d111864d1af9c6d721c37c31c6766d8bc3e58175ec3709b02813c8416cdeefa5eac0e95a285822157617f60b4f1036d6738a0ed8046b94d2eef185f4261b667116da5234cdc0111d51a4c835fc5d72ad20492655b5bc721fadc5fb620328c0e1b8edf17f88c8311ccb55c32885c730d6cf14baf6e8202d24b8c041595fbd9135f32d6839e23073ce25f56cf4f821d4d648110046ac1918e50012f533ab8e79a33df13149f4d9298b196d528cfba5a94fa1d1cd704a04a45511445007529b14786f9cdba987e14cc3cf454a17404ca70018b9ee536d5a8e2ec1b2e492eac836975d84e511a70076bb01ebfbe8843e5766d89dc69da1d08c04afd9c07509731332b4d2c93d7edeb3e93496ba819f4431c11cc230f0ce43e8903005e90622bb10de927beace5459459d327db7c2e8791dd7b9a4df003d83a0aede6a66b05f66b8f1de8f39e128bcb8975cda34430cf2c9cc84a3658d33cc39fecb93f20cbdbce73b996bb0a699e5dcf0586f883003ae5d35d02fd27a475969b233d84792ea7886c4bbf5da0ec38510dc02c0f9530a2c8bfa3733ef54ee914b7d6e34c7ad667a1f215d3264c029f86095f158973e4a169a9e22454191fd6cc47b8aacbfb87a0048472a6d9c08cce39e209732bd6ff494dd465864a2bc3a16ebb3edf1079fc2557a77a2b712dfff47a0f211b0725ea83911418a741619b513f83cc9f1c0700054780708eff112161cb178f97a237162f6904032aad145048d0170f1340c7e747ec50108fb401c0f94110462af1b77dbb72b9f8238d6b308742beb1cb704f32247f9243234199e8d669cc0e4c2ad72f4af0d7bdde2265bc45191ed0971b454afdeccd38f80d56311fd2e3649d363f263dbba69b1745898a3089b2b4c5d55173af1cd73e5dd58b7587258983cd6d9c0bc921bccbc5c658034d9451b8ff70f6c657bd501db4e080dbe12e4ac7270c4eb7f864ae152d3e859c141ff2cb30d41c1e57385cc820d31ed9c66c3671b29494b8a937ad41477bf363236b4fe3d3d438e59d228b9efc58a5f3d5fc6283e1fa98e3571f112491a1febb0aabbe10216faea8797199b0978b3e5aa261de58f5db4bbabcd17da742616e32b9f166917a42e13fbe7b3b09fe8f37e84335780f10c0f68414f3f6d0e1f1aae6721ac24b60c50564f508802426a1b194b30077c04c25fa1ec573ad00e8cdc44a293e8491ee12341750087b2fb39015b61135839914a243405e67921d8dd8213a1268513e839c41e36d1522c91eacdc419dd8c8310a91d40265d8ca227dd1bd703a8e00b1d4139ddb1a1ad33a1c8396832257e3f94a8b9c3244918dfb5a8834160e42c3a6f22a1dc63dcb59374b4096fb72978866b91006dc920a525274bcd43ab7f336a03cbc839381f10ea45a7907e2c0a7153801997446778fa548c96b483e9605c252fde6895d5e4c01337c5f4e35f8fce31efb7dc8ccab822fd4890ab7ece32e09d3584c51e37e0105059a306f3bc0f5b6dd0a8ea0345f4fde79ebb048e1d801200f7d591bea8eb335467a5538d6669020428968d2a5593ca9252dc871f56eb2af16b8e9c8c8432a5cef502e1cdb7d0dcde2330d4444da0637f22f3eac8b81cf9a1798f910dff90b708d9a965b36a6c3980301e554631d2996a66f704e79d9d8bdea11aaf6536b412926036f6e3dc285516c2a22e51317cc6d6f81a602931d610f6fd094385ef486d3c82844284a7a8a576fbddc6409c26f00676f4831db9f4b830c40d66430c0797114573bb92cf47c5c811db68076d10c8d99361ba4236ea11d45b37d603ee78ce11a06001ea3cc65befc51211fc28ab9667a7915aec835d19fb93293e4693290a3914b2e2cd2a650803a6791d5dd327e0c3da53479a6252bec8c02f8bdccf336ae84b6f784fe6951b92e03a6de28e871e416ae37bb7d0536e15b5a2324b4a39b7ff901da5d0a060baacc9c5381962da56de8a1bf2f7b614fbde3df4fd29780029960a7dc24a0f09567d0eca066d4d163662672a33a1645eaeb1a3f77c64694748aa9dcdccf356078b1c980c835bef5431b6ae5eeb7da5f918747d5798bfbfbfa031801717039e6d72bae7ffec002a027aeffffc003a0e7ae7fbc50f9a9f08037e40860b70621440e26f8fb5f2fae1f0f28c97ad148dc669f4d33a98cb85c9e2f370018a50f27b9a54ef7abaa9888afd6e0d58f79b70200f0902e81bd955e851fa99fccfb57fe4c570aec0110381f6b4572144a432dd76e41b7228cfe454a1f22ea3d526e7ffb34153683a45820d647b5c8dabb84ffc9386eb149d71c657ac0fd4698f7210ad65845595d9bca44be27fbfc38388ef8df4fcc2181be67dadc8577535f3eb39c87e0906b42423096f4274fc3563dd243612974d82cccdbc3af9fb4ef575492dfdd751403bb23f9b05f5c1fc4410637358a8add81686ad07f0339f4f4267243f4535e8d73bffbe6c867d63b443f0db6a3402f02ffccd21333b05c0bd1f78af61607b83dc314bf12fd9a5b66169f504264c0031742f94c5f815fa9ffdac4b1dfe453ca3b4b585b4b3ab3e31e0edac1c635d23ed7aa16fa0831c470f623e50a27014e1d6ffb017bf284964a664d0e19dc1dc026075397a59c3632b110e4855086960368775e9a963b7105635ddb5f9e752b17b77dc1ae812699c1aecf0f2c47cb55c1bce5fc5ac6dea496437c1f94d1e32519a0b7b1a04f74610eb86333b4c4aa6b00b57ab22a9623b10c75176632031ca0099789876d32437bf608ab30970de7805a32d9f160c8ad0cfef15766914da86138f90fcf5a9a640db4bfe462ce2049bce547512bc0a8957129787506932974ae376c96b3231c8072ab29461deddf2f1ded9ff780e501028e11e8a08959f3baa0778f863b710f84df7ce898b87211dd3b843e096277b66ae2d47923ed05fa07226fa61022525a1fc4bc7b233f86f0faff21fdcf213c5074ce8e8e0b463574d5773757c6c96490077125954acd6127f32b4d91efec0ec929e812ee4342e44bf8416058f9129617066dc21239206901db096a7b3bb24977e1249c53284213d13a4a8c4faad22bc0d2af505aae5d9eb9314cbdbca2b0b63e388f2313b4f8007f4f440d069142db80163b417e2adfa230d4f9cac1c49adeae076af08f6cb0e99d3ac389f37d267fef0108ae56cd7c3fabfc7780ae5158bfd7c77dad649eddebb4b2ec5c48af681aba11bb4bf68d221ab888d176822e02bc5ca5ee0dcb5b966f6ccf5adeb1fa63f1c7e62ddb1f966f2cdfdadeb1f84b27e958dd49078154f8f01ba8643a94d7724944a8dc722a7e47be6621272ffb3936410ae85f4b5d951787d15a5244224f1956f31598e63e4b77574fe3d7834b782e315f3570e0016df45c3a18a8d4cd152668ba0f1bd0786c741212dac7c8691342db89a13141ec684687d47774f4b230a41f722ef852811d74be57e50babc245e443148680a8510fa8edfb5c0248c396832f32b41a2a2d3d162630958ac918ce6b1400b5262418b13c2d2b64d119a3a43e0789e348a45c0c94e406c2a2483d4791806214717aa01ecda73f94dc5e17d958d8d31ca0765892ead132b049a0d2bd2a0675c72d73612e0a4b5dc60c0858150e44118b763212a1a824825d118850b7fc59e77f9741a944267fe9cbda0e616fdfa0548f18a6029d877db432fa9d542ab8b7083e39ab76d2d0ff0ff6751bdfff4b5012bb73de9941d741b36bc7be150c4c777101707fe457701900bdf65cdb1ebbe654178d1f1d8e5eae3ac7af9b2236a2b4e11591b30a7fb309a8e39283e076af9331df22353730e39a18275736940ea7a392868df17975fd0300db9d5610b97150a502394786c6ff6d93cbcf769ebc3397f0028c5cb26e5b8b81082de37a89ddee2a26b2de10ca50072aa2eb884100b311836061ca6c227bdc1217be229299d5f9db364c1467f513641d3fde012c078200e22e0d108e04afe3634ead13e7001c4fa199d25c366564514d71b3d19904534f0c1b87f654d6d3e729f2fc8af3621d0aaa02837ccb5050ac9096c26e4f34bcec559e567abd2e931ff63c17b58f1cbb4da54c367b9cb68ed61691046fa052d5b0770d0cb92be5ee1c34aadae4a7ea2455fdc24d993dbb19eea5c7d2cd2e300d3ef2638cf8c2194b1af3a6e28a71ac1774f9798805c3a61022fc8761a72dfdf711b2684777b18214bcf4ad21c7b8cdc2f65a87b3bbdf88286481f5e64f0a6369fa11be841649e1b282e96ed9a739a879118662b4b63696c28284cd24718c8981cccd5ffaee4ae58b7f30ba85b60633b0e89eccd53c4a5a7f5152ac9841dc34dead9c3e0e026af9b0fdab82d76f9dfdb1c7993f4ada72606e475505944aab24954292e4140d588efcb5bd27dafedcbc4491f70c1d11314a4a599070d8be4ee599969f3a178242b85b38bb7185e51ecb3e4d1811a49940128a3b23c21ca9a560e7248d2bc076700e69626328ce773df27fa3b07897b54fb30bd8c363c0cdf34509b16b4bd663e7eeb96f0dba05aca3799d0b72058411ace24f5a1244977f09eb061751c2f8259cdcb2332ce56c05c5e960c4fac6d6ca296873c9145dd1ab86835b46726c98c56c2202d6690d7f00305b3fedd4761fbb28f5a0a47999f335e967da8e8c95de925a6ae7640c9797dc5ab7b4ec8dfb5b5e1b3d12b83847459f5a80b0a195b78177820ad1d3b04a47bee522702793b87d5cad881ad6ae7a3ce321cdac4e9d20635b4bf1baa81fcb8e86b35db76b077adc73e6b4186946aca820863a1d3b1986b48e478dec28c3ae99417728d73e7534699bcd06cde45cc97807f5ce71f6b076e28460bdb5ccae58406d7e57ad97e00f13378425f045e5489df6107ab219e0731852665ca3ccb82a0a043742a1a262510a705b1395e4cfb352cdac4aab6deb2da1af8e35ec1bf99f46e49fbbf88f705d4963514821c3456407a34c45a64a362b2f731cfb520b30710f441e18366dcde3b09ed06dcac5f5841b3dc54d5970af1902716d2d50537e1185f8ad0f4a4332c5158eccfc3b972048a6e8e0fa1a18bcafe789161a487059b82e5f19421896b70b65cad2e61e949d5c66cc1fe1b736b51135752d3312492ed6a7b87d7a027b04d16c03fdecc0448aaf211f6a4c52fa35a3d9d82511406b59c8367f8d1660bfa74e0f54623a5b48e7c2326813beb221aac16326501c91b935bba3766ff0881ed8965faefefbe29f122caf366b3c5ddb06f617a04decb0742d3b30f29429eb3b4918da57f6d0aed864341f4972396c088530cbf908d1fa2ed5cf67f76f2bd17b584bb138ce5e151515c7fd4b6e2d60904346d1b4d6d47a3abea5092ba05aeca3acb14128e6192298b0db807af71455688e41ddbfa96ba719ed033ed1da038cdd22383e262f6666ed1e80db20ede721eb660588018cbba66eaec63df371b56c216e41e7c4de475cec0e5e93278c98ce1acf58bd36c0d23f54dce3b38382649ab79e6b9ba989d8da318fb6406770e947d6e6b31fdea546d010f7018c0926f971ba1fa53a0078abf417843cbf87b24fe88494ac3e635895704b7767dcd8e1f69690319d0a98b2d10479ee379d26dbd5dde875c2fe5ab277e646cbb55d7e7fa819b130a3e07e8516756d3fee21ae1aa6d1101a3dbdc54c461d0d6d770a0d55ac37b9e7e41cdd39efe1339d43bd5b9b586d1e3e5fc3b4a0022593ddb5f5c0327634385c93ef82d48af134372ee082f05e984117527a14e71cb59b1017679d3eaf5d9ecfcb1f57f672c9247a2b9b5012ffda9ade661cf7a6d0e096be446153649371dcf34a4ce0f898ec09f9c834b076e58409f28dc25037b8a047592408f95588606d09ef1094c281a6dcf17accf65df43581718725b3e680830e1a874baddfcb3e538eb6f7eb10b93ec5f01ad6dbe030d6dba9b8d55fab7616046afdefb2c26063233bca4fcc718774d09eeab6a8d9970617c22a82e5ece301baf8939c20611918d88a482920305e807a4ac851a7776170f3935238dc263d16c7c1fcaa724f56fc4aca606c9b1b401c4a88a6e5aa6690146045c38a3183a367bf9e5629f928f18355a2713c940b0be30f7ca38d3336bd76b91b1c4147d21b6754645a9d7015ae12c5474e8809ac2a95130d5244d2deae9deb260ec132d274b0de178588a42c67edbfa79a75e5245df64a557fcab0c199e779bc451b76c91edc63f1e8766f4192862ba1e0557f1c794de9e146807765e3dc72b1ecf0f43c0080c1e2cc416380dbc4116739685fa56f57f08affbb269a0be80ba6a3fcb2bcf6041a81ce94cdb01a503ffa75679e90a0f90cdd284be4593790fb90ba1b82231d0152368910efd4d24528224e8eb006b48d7e98e582188a8b7fb7587eb10e567b565324c83a93f329b6cd33ee67a234834105d9e8763e380c0c7c7e821e4a66b2fea12e4144310215af80463aaa243f16e20fc2085454ca56d961007694c19b299d481eb51e32ad41c2c081be7247bcfca7fd1b116d601b9c0240e8b0628871a22fabee7387cd116f86d32d1f83ab5a7de6adc9042db0d536d7379acf38eb3eb2e2252bb7c1bde438ead7d28ae723a08f9a4a19105a235db509fda981ee952f3062087a6710d02ae46d82c9cd0497fb6f8ff8fc1a1d025179c1a23e72614f3b0f042a8eea9de05c5861287e774787d56288a101d74fe6eaafd2df91568c91a990561653a5df51703bad23e0a1eeacbe85212f830f9762f3dc79e9b5250d30ee6ad1a89d6fd01587f133f1a0f1e377305dfba84596ac7840041437ab4c38cc730b0aaf025ec93e7277681de487279dc496a0669753e98a6b367c346af325146525c267ff8064676ba8dcc27fb84a32a2a30661edd62259a46bacfa2b02c78845dbfec490e0acb72f4b23c58efa26a6fb5268a9167df0410fe24ffdd2a9cb16f98ae7d5ac40d44342aa886fc504f53ca6d1226157845e066c91b9f94a92176ca63eeae17387376cd796c512a8e58f29b92b162cd52844a1d57768a2a929a1b620ec4ad165a992f8af6cad8a2e8554b5416de77bace0a11b4dba882fa23be4e9030ae9da915720dc15251dc18a1bac6864e13802a6ecbcc794c838586ed5e5862a5045388e4387f95e4c57550ea162136380540ac0101ccae4ec60c03503ac4cc081557c7ffc6ee437350360df506bad11b25b238434b237d97b4bb903220991087c09dd36c248a47a921a75b35ae5ba215a5a6e8539912a49e5a65a4db554b22452dd5e7fd54d3355be95eb7eb5caa91c66f5a47ad2ab7daf512ab6be5693f5e1ddd1e8243bb22e8dd2fe4621912e43dcfc6c9f935b399148a48b61d89cc75656b6225b1d69df6657e46a2af5ddf6155b84b46df6c7e8f5a39f9fd188343aa9907e48456addb622b72b4222912889922889442ac20292c2a2635c36eb3543ef669671a6cf6b5e9f9c0ac947f6f9bb6ddba6cd396736c4763dd39e7d34622169d7b3cf675c37c4cd56b4679965b199fd31baf6d1b5795d1a12c9d911d21a4687dbec9048ecfad4ec689a42a66cfe7d85eb66165a62e34a58ac13ec4e3a4cf44bb48629124d6ec301871b6eb871a3a58585c5868d9595d34945c5642a9548a4d168db34ad56912814ca320cbb2e10c8b24a25db51124749efe63d5df44eee50ba8ac876d52964bbeace93e69d7f2ab68b77be1c24dbc5bb5d9330dab7edf31af71e6a0e713b2492081279a7a669b6bb461a71db37facd12c1de69160910ec37747d081b5a16e0143446c7b81109fb364f9f13fb66fa66aaf3f3dbb552e92fabe7d1a563dfb677e6631e331dfb564dd8e7b16f739ab097ac8a1315ab67c1ae7dda6a5930fbe3268c8486e9b02b8286a699b6d1bb78ab673fb277cd82930ad769b608dfacaca0d13c1ab75dd3aa253e444cd608bea33fbee11b910572852edf9b253e2b1ccdca0a9c326a500d290dd331ce4464fbe89bf68d53f9ca356df4ada62e36b1894d6c62d3b254fb8099ab7d3ba6f2abb18d5351f9e893eb82f8d83eaa1f515a6b77d25077b290ec03666eb5db4741eee81bd70599dce995eb4657b12a4ed411cbe8d835dbd3b28cec8fedf5dbab362787846fe91763f5f09dbadbb134783456d24ab6ab9b6632a5b693d2d890f065f9b19d7e3b2d822f12be2393ed66aee91ad7a5aef60d070e14cac5e577fbd55a5aeef6d730a4974ab63b5dedf5d576a7bb95b68df41269db48a4ad0b623ae91789882935ea517a673fe847bf46dcf6ebeaec01336de2f88eb8be6ce2ea61667ab55dea9ace038eb8be26aeab073d663efa6e1f956c97baa95490e6c970662563cf050f5f1436c2c67262e41dc4ebd5faee3d8b51088fc5e50b858916574640420ba130a1e272bf0eb934aadf33c0428b9d35c4d859830cfe73e12c50e31896b023c510c9154fe6295f57d5c51d23a961ba36aa27335bda28ae613a4217ac63c70839da287e30246d54a3517c4b09f03e8e76cbf88ad4d29ea250a474032e42bafc335c8f4f49769218d13142c4132286c8196208ce90203ef0d89142fda03ee52729a7ea53b97bde0e4f65894aa4cf35b67b5e0ee8c48e1a3c33902b26a2c4e999d223a5c7e70ea13a95fba6a515b56b21d0b414fd12fba65191716e3c5fbe3ee0e8a577728a5c624a8c975b78313cc50c53c07063df48299f481d18a369e1c64b3198075a2359b004f320ed143528d982276f206570e3af8d63998bd28075f09f785de383cb94c5e8986db36d03b79a29d25e11c38131fcd354b40d7ce137d1a979c239580881a707728724ef300ff4f12c4648f458b5c7b3145ecc83d44ed171149ac9b8f11ce5562c5456780c5f0c4927419880cee43af611d7387d93c350b014522e219798d4025dd8e953904edf31141638fdba2ed38e1c10e92010c8ca7c9c1aa7a27d53d979134fdfc99b2174d64abe924bf48dbc914bdcf8be8131f346dec098137c89a73730de24a1ed8307733d148d81ef85522597f6a86ea4a5a5a5a5a5a5a5c5860d1b366cd8b061e3c68d1b376edcb871c3d6168e85b3c155f176109920065959595959595959f141454545454545458587c96432994c26d34945454545454545c5542a954aa552a9d438f0a7d3c65549b59bda38d59ede8bbc9452b648e39ecc8fceb8f95eaaf75255ef6a456f1a076445d139e89b9ea2ab68529a912d8030224ebc7987f3c69b9cda31154ddc78661269466954eb4fa68b5dbc91e2808ef262829441c68d8f57783c6c8075f43c18f9f828c68b09bd8b5fdcf878c58bb11e1f91f0e88417a71071f062b2c7c79bb7038599efa215a2785365b66dfae6f24355b66b1c1f2237619b2b6aef342ad2f034cdcfcecf149d29529e48f1c9f1e9c1e9e1b9e1d9b1d9d169a2f3a4e6090a204d0ece0fcecd941b1b29364d7c9ad4f4d4340f7c79f9027ef172c4c70b7b2a0b7b5e8e78a68937f186796e176fe20d047c985c900d44b1270a011971e24dbfc4ab51a7d03ec596c5e41aa6e12117673cba8682b820d6dd19104fc63ad77013b6f966310cc3300cc36aaeebbaaeebba9ad8a444229148241289348baab5d65a6b1585321a13581cd3d4605763b4aa5e3cc5300cc3300ce31aa6b1b8057c02cafc297be5e60438f7fa0587041902c62378a761ba98201809c7a5e72c640b6ac73ad4f28e111883a36165a5ed9ecf0de950b1777d457f0f267b87e4d22e090f10601df122db1d89d961bbeaa946c50e871c71f3bd882040dfa8be27d8ed105dc9bd7b8471e800e282342ada8edefacc7cd05fe7cc0794f7a1518c55cf9e5922f29585408759d9049886868606b343843031ed14a73f3ac5ca5f1684f498057145d2e93c1aaa1c9a0e3b0be2ea0c0823343434344256cea3f97cbe28f663e45d2b46238d8aef35d4c71304c6acd85a6badb53e891d43344dd3344dd31e3fc4b66ddbb66d4f6287cc562a954aa552e949ec90293d46fb6aab891b427abced90483ada388dabef85be72a7f74281a0007d7c10faf80abc9899015ab13d45ac352cf0cb812f07be1c98f35ee221ac2af81658aa41eda04f098a0adfcdd330ca6a520b7461594874d5d1086b8e6f95452c65815d2ad7956a54fc8ccc0ef812df2ced43a362101fd1124e9407343434a515acf444e90916acf4440b567aa29668700356a2010e33a75fa2ce1b99d1373438300dfd7ee4a0ed1cd8052bcda0c23f00704a92c0177823f00536b90210da023ed1b9d007fa4ce8b3440095000480a2612458096ec1c341a56b9444bd2644f1c9a1a1a1a179390de028f8128f4d41002498e508df27037a0e34538acce9887ae1c8c9c9c9c9e1c98d148b1cd0c707fa1420c486f964e64c254c20cc204c22144016007bf0422937bec3626443ed2c1ac5bf74bcf81c7984dacd26537c6613a69938f366369936950966cda499f2a3434aa803eac0600549b9d309e0bbc0540afaf44bbc01b21ed0a7d9502b2d7a84c618d100951655165d60ae8fb58ca6908c1b3b9ed28ac7869b704d2b993b53673e81017c2b775d04fac4ec911edebd6cb53dbc6bb114e9fc6818280b0ca46918280b0ca469580f0c748deb341048d3b48338eb3ca0c6f5f02e66597c68efbf1bcaa2d6898416d77a7b5189f4ad77fd77ebb1147c7a24d4b8f4165f2174d18a521225519691cea7734333a8423adaa28fde15395d6bfbfc9086a99f5d15a2d9ee84d9ee31eb51b70c089f1e94fd189dda8b69a494444974d46fd943e9221217b2a9ddd3e9de8fe8100a93252e1f04c5ad6420218605c292344ce9f34a98e62a71bf19f7fb5ee8d6a9ed6828c97b990ffdc2b024f3252ef412d759287be8cfb4f76b073aa518117774ca755c77ea61fbcb7ea8b6df471c11cb16395d900f06c23eb43f999aba53e7ce791227e266080bcda076b5c29824fd323fbb979a50abcbbf8d992879d52669982a6544b63b8d6cf71f5a653dac2f2a91fef6ae2f02a27dbb202602d2df5eedc6b1fcd86e7da33d8c2e7a77c4f2835ebb237bd0b5f3686be334fb1a957de0743b22ee658b9cee2936cca4b44ecbeaa25aa70d43a7d5e308534ef654eb90d42888350a529adbd9da2888f1494e880c3932e43322438e0cf98cc89023433e23466620409630e0974a7177109e86f2c13c98186969c98ccaefa2bcddf24912493e7e32c2f75e5b50da5caf9251bbc696008526b7fabcaefe357fa83e7df0a545208917f4ec1757178c37023f7efce0b7ecf395191095dbb613c105dd191edce0c2ee07f6e6ba19255c685fc7354a7d504e70240c24c61e90f0ad2cc7757def4e1a3a7706c4b20672c366ee862dffa3faa06fc90121123db35debceb320b2ac61ea6aebf02d75e805f088b16a7a24f25eb1aaba0f8f28796a5c5acdeee6ba78d005bb6d170fb2a46555208bce2c5445f60d2184cc0376c47dcfe42f9965414c405e55c6354da40d22f4ecd1daa4f8c66254d0d0399b8065e9a735ad832cd0b9ec210efbe4ac83b8ebe2e6f56995847e81283723130285e867c80a5dd6e78561d7fc0502fd9a1648febd41169dd58d1c29826340fc020f026d1b7d398c20b510391bf2b220b20964afaa20e804a83d5d1607fac5593c88ab2a7b3566cdc864163723f38454075d94b39e09a1b79c448e7d40d70502550759dee19ecb2ab10eb2d51fb544f0e521941b622e2193503b9a73d9c8911763bd17784b83f0f4e5802f1da1f23bda4442b962c37477676fd411f0ef5e43de7bd0fa8f7a2d7878ebb23820b2d7731644f66a3b14da11bd1e08d1ab6d1e20ea35db3d5648a3faa9db4ff950bd7f77340c11ebd5fb3a2ca0dfc92391177445c87594c2a7e407086f5d9fa078af63b738d8f356d534938330a99675e00b9f89c872c8724e6619075a58d3a8c6812f396df3b21e0f048674c2f560cc83f0ed6068597c701018f6cabeaae2aae257d7610cf69e97ef8a790829715b06c654724eb60f32cfc84c6e468672333287313332a819198c9b91b962d6832f85c85b560983ac4bab4472d7419c12277c2742e674c27f42409f56c93ce816d73f17a7c449bc9320d42a61197a21d731abc4fa65db07bef41425f420db52321f7c81b00e3a67415807594a0fb2741e7420e63b08f9ea4048cb34f0e512c119812ffcc925812fdcb0b2b4cac0253a0bc244befa25e273aa7de00b7c43aefacb6a02f8cd11793a140a179423706c8ea88142f3e32277d890b7315fcd4ab6ec962c3eaac7aa7a8c96da075f843cf8d2158937edc525aa965c519f8c901faf6027d74355335df4695da56726eef18b7c897584300b9297b188ed8ad82b7f74117c2354a20d3c970f84e5bbf22f8aea1fd3d0f611e958892371fc526d572fbfb08e0cbb1a64359d5dc59691c3c0eddeaf52102a3c1bc15dbb7f2e124e8de7f9921535feefca449a26caac4f3b27358db6ca7a5f996865b3b8c73a2afaf71ac27ee0d1dbc8a4a2324d7334b7392b0cdcf9d2a426154a29a576fef928d94b8dc0c18274f6958928a5748ab2ab7f945e7d72f4d5dcfee6bce98fe755e64fb3e564b932591bd55738d2373b49b7b8f7b29040df69bb99cb27d9ce5ecb2fef7200f7bd1ee0be8776b8efd863c27d07f1e88f6336d0e91ff3c0312bcffe38c6c6457f1cc372ed2cdce39791b5c13de617cb76a7c73ae87bb51d153d7e799705fdc09fb63f60abea73da80567f5c865b5923600908957f70972f495d12c27595aca8fd99ce62e05690e37e1c70b8e1861b375a5a58586cd85859399d54544ca65289441a8db64dd36a158942a12cc3b0eb02812c8bde38ef750c143f2ddb45ca416646bd96c0bbb07a67f64ac975f6be33b4200631e167b6ab55f48e6d70af3f86611c1adc07e55e8d414cc35258c6e2c3c7f59215427a3de3648fd945d93967da6e47f6ca76a9ecd276a867d76c4ed6a05ff791fd1ac1cdb297ac1052f6999b9b89387e37cc8fcf46b7d63764010b5cef01740b58406b118d94cbc7aaed2aac39ec8fe33a1094aaa8d84198e807be1118c3392fd230da31eb633ba6d2447d645cec1a76cec11eb15bd829f689bdc22e8320fdc197f7b810d7bd9d1fae7ace7ab0f8b87e84db7041172808d34b4190eab1cd767c03e2442771a29b38d17511a7d244ed6e7ee08340a59b2ea464b25dbf0b94bd66af1732baca45c77aa8af17e9424c2709215d4564597c849e8532ec2c1330bd7421a6127621a4117610f74838a8a05fc7b00b648d104285dcb3d3b10e3fb9718aa8493455d428e5fbe4e07940d9bd17e11b23f872bfc8816e71d8e43abe61f1414fadbc2e04745dc8cc1477de3a0f18b9be93eb2018f79df9b1b22c3ee4a3b445b8ef916502d741177249b9ef422cfb02d9b0868b8bcbc52636b1895d0817970b21848bcb1a2e6bb86c9ac954c48585650d97ab7d13e276455c5c5ceee2e2728bb8088145719d715a39e38cd3ca8d2bb9e18ceadbca49a545635939a9fcb5d80e75b793de3c2c366c476dc876f56433db9d6cc976475deda92037389a1b37208d4a67479861861966d4bbbdaa413ac69154b0d763b3f47a4ddbec03666ec96e1f8da666facb30d36be9a3d7fa8dd25a4fa7d27c9daf9ff3b5d6214c56c5895a59eab54f0db32c159b53458d6d53430553b1016f36a22f773f723fc8a4534b3c01e770d184a5255d2fe86948ff7b8174dab803ad28638c34debc17cbb22ceb5d4aa3d8b21e75e0cbfbb3a048136b62936863f94899f2437576787ae0cbfb71a0f5046fe0cb3bc6411c0ee640cbb2200d84d0e60469e4a54cf939b54ffc0ecfa975e049925a968c3e35f234c99ad6e92f8b324ece939b5bf444e7ec1a2a6d9ac63483eb354c159fbcf50eebd730f48adccc6d8ba31783590ff9683d750cd3bc51f314de6ec96d09e45da10757e8c1a5e7d1d6e9f6ed73334e0167ac25dcd1c9758448bf8b2c40e2ed4768233f0d1e4972b907998f387d72b61fb1531117e232cc7693462cd66a9568118b20db558b077c3cddd342bd52427b18532f8f82314f464a18a1f6ecd9513023935db34aaa4de2324b18017d110c45dbd11d300603fcd2ff422dc3ed67c66d2158479b51bb7a9f18b73fa7e0f8ea978d1e925e72f4be0c48dfe052b645e8f653a59452cacff368961fe89b4b6d11ba9dd1512a051543e9447514d77bcdddb673c86062e2123d66d823667123779b8370f29c737634fa800e903ebc570f0e719f1047b86ec79531eb01ad0e8d7aef2da8ef1374319b5860592616609605ba2e0ccbb2504824aa20d085c1cbaa638cb1eba949b551db756118b72645ec18ebef3c05cb0fdb82c4016ae45f15b5ddcc8496543b2c368ac6d4234049411428292883df0e20e02bfa42e5473f732d10d71657c548bb8b156801082788421272a0831f36787155010a43b04118d0d8420d3438420d1555f08130890dbca0620b25a031851face1049f9d10197a30864e185f34318427353d8052e30376c0101f28354caee83e284aa82195025116817eece2b49edeeb1b9a0322e49cc10a2f62f0841a6944c10330441105076970d266d8c0011aaca88211a8200334c43528f1c5135d1ca1270a17baa9d03d430323301186246c8109cf0bd2f8510630d2a084315411061d74193cad469b810b22c0b0c6136144a10d6cd0896898a1055f44f1821376a8e0a29b0ab19b8b6e88444f55af4419b7efb2e3f74151a20b25a2400523379e542f7d31d565a3ea650c498c5dc5f55c481142d850cab8733d975955a49fea8b31c62ace18e5ab4806eaa77eb6ebe29c1345293d7ce14b4a79555555e10b5f4218ad182dcbba3090a42aa5941206eff95ca22a1289558c7fb7aaaa58c51f3156598c97312a915196a0ca7ec85bbdca7e8891d2eafccb2925941076a3ba670a2e8ad54a5695941364c4ed4b4467bcf5746048ac0c04938a8026a16bb041852b526c56f15cc3ea977c392a12dcbe283685f1f2e9a04960f643949608687c3174a419a271a3c261f3c5000ab8fdcde6743a4528dc7d3fbde57403c65b7b74e5f6cbed674ca81d65dbd59845a90f8a123bb06b703d978b510f60e6a15970e107c031dd1b230c7ef7aa70801d3224d49717f3e43b2d01d5a8140ea85d51e55f204485ac80ca893597a8b337c64bf932690f7fe3924b445ef211d6d12d89ef3070a3a54d049d4baf961309565cc194c45297b98e52caa76eb803a22e64baa3510da5f22593ebb95cda15b5337bf955ac22fc33c23c842e8f9d9746e5135cc82ab8f09916b57b538c20793b2479675cf8103c1e2afaa628a1a1f62f120f6af76ec4b42b9e4e29a772f6a374e565117be5bcefd9430f027b7d8fb2f05fc83a91bf8c19879fd98ba46e65e9d02ccb38e39e4c25637147945cceb993d2535b6496ce50a3c46ce08991c3272183096b57d4d810ab462213d12858a451994d94beaf079df18d2441e203ed8aca116039c277871477077923f049e099065e1a79390210b957693f9c28a308114e2a3c0f187304c2ccc8944c8a273ed86eae072186dd074509151ce12aa25f04920ae445b9cfca2c022fca85fd9a55a043e5ab523a10a10cd394d721954ac1180c4238258518cae59dbefd5c152edcce45e789cfcec368ee7bffdcf7e69a293df7e1dcf74e696854fe6336c3f55c6452b1a2f4f57cca078d893a2408cb684c54e62ff0d4201d43e18b8c2d5eb060455f51cb438271c1aaaae04f65b810fe512e84b08290f4043923bbdc7e65820b9424a270eb7d509230c2ed5260b85e8cdacbd1f7f988ef76e6231eded697e3354a6be295e17a2e40b80db7afa703725beba1a06cd96dad970332b79496be1c9021a4179e464e061f7029e2e272637c3a2e3742a600094d04865d553fe40f11565505bb8819abaa479cf3d59bf276a82e972fe9d4f286997f7741d1ffc1bcce7a5834defec1b7fe5ceefc1f0c9f524aa9cbc42ebccfbe466da051d583f428428846551fd2a8ea190a6a114b44a3aaec07b5cfc555041f09bdd55980bccff785f762cb7ac80bb54b5d5971bc841122902451928231ef3aa512cacf2240b7cef7e22692344a9e724a1a2539664244a5a7d495293943f3a494525ea94649286c524ddcc8276ac4b650e1217cdcf07517a81091a069ec0a15de88060261706194e7a743fe4908a58450460891b81edf373fda5059a2761401a148dcfed5965f8e78ac6111d59174843fa2cc1e2a72ff90b72f617c0ec5762cc0010dc3b7d2808f1547d8c2163f10e30a32f1b5614e59d8a02686cac4e3883246284914a14f509268e282ee83c2448c9b824e50410a632871c60fc250410e5ce8c0e00a4e70a20a27677420ca16a2c059c30aa4f082191b181441891e2ba2206389688603d678011661d862065f2082cc13c30b6c6045187690c616366ab88002d6808526c230052a9cc002085de80013b8d0052e605005109a88655ce03d2204218926585103050e6e30e3848e10d0c822055c0ca1494c0306200bc6708125c280820a240c41892cae907931d8019418ac510329c6b8011a30b0801b30a10654f0e9891285081a68610a27ae38810bc2886710a2bb806a08319304275cf8410d9a90048d0a4a47f8c2a6890f6cc600c3940b788009264851421b8ea0852114a0891574a08510d2c08531a2191e18de7b61b0600d4f00e10c2a72c08426e0e0054c887046cf195e10cb40dfab8e27c4bd682f46b4c8e9d28fa84d9ddfe1b8fcd18f306f56cb82475a1494a0317103c589e472397ab51d45729932d7912ef368eea2b21437e79e8a233f7a47714a4dd0ac0e29264a443689cc6c77da6cf7d73054523659a176383ad2908661b1feee75f91d0be0e1001f2010445e88867119a261b2cb6fa08b74cc93b91a6354c364568eb25f47712d0d23efe888e8666f699891ed44eff8a7464912c9887833fb5e0e3b1a5116b1f6ca94d27a8da3f4954469a5b4d67a120d71d7491ce816aa61ae4ba3e4afbc4bc368d7de2846d2f73abd94585cfa90f0e54b3bd15fa346a379496f291c0f7864923232b66b77d3be9d39ed5bfb5c8c6d7f19f72e8572022d92d09b51aea5703ce091c95cf61017fcf7d2279eac07394cd42ec5359179ceec57363f73e7947032cb8360a00d763aaf0be3188a464166e60921945cc1cb0e11829b34aa09b6e19bd30dd5d4cc2ccbb258ebb42c3fe0279c9209d02d7a1f40201d1cd0a89e13ca3967377d4c4bc48809b2288b63c70278340a02f6eaf1c130944bcba9015834e018f6cb0d68c0cb81450376280f4d6dc0cb8145e5770d20c2ebb0db4d61e44e9925358ad1502f5b2dd628ec0cb59344fa3ce99c53842acb02a489f03b0bf15ea2188340c0013c602865ee973ed318230f1d1d583be584ca3d0031db0ef28d568aa6aa5463ef177451ebd53981e070d9468997d4301633f3b51848bc124463aecb3e883bbd5f8dcdffd44ad28652c01a067b675966bb22a7eb82189fb077b187789165f16886d7b66bdab573d643cbb88d8b10143a48d65adfc3bbf53357c475bfa25f5c48747a11077a889bb91987445eccc217b00ed02fae6b9f0b3a0f2853d5ab5d451123866996758dab29dbc1a722c8b275ae6265591847241e420a42c198ecf43026744a43dcdf8bf58cb35ee165bb13c84e1be44eee0c88e8526abb21eeb496479e1123d6105a5aadd8a866e111bc1cf648a66561524a4c5e59966557765d17a8ba2ad0c4aa6745caa4e632d993b84ce8495c263ba523783960564151f9d5185330ac05b54b91baab4e9e6eb45eddb22c3fe6ad69dfad6c10688471de9486c9aa58035ffad1324f8d90eef69112850ce6e19e46b11843ac1038b4c2d3659e47c68da9542a954aa53a459a0db9a7c649c6098496e587bc44a4c5818af6b50555879e725053411a263e867b301f2954748cd3310e0e8dfc44078b46314ea3a22562c4e59c18816851a97ee9530a5338ad838c49fb909899b3ec3c1a3be55949182dd0e3d1a85e80cccbdecbb1635612460b84a3bbd3e9fa755dd7b54da954b4a305f37017dcc362c487de4c69ada7d38f42a55297a784a000411678f08525887aed9a3581e82e8dcadecbf1463116ad93c54eb7168dea82eb1ec8d32828547ea6c4f55c3aae4d6aa4a8dd0e8bd5ea22101cd2e1c0014195644ae993b1bad4edb8462405d7e8203f8f8231a1679ff4ca1865fccc8d444096eab2a6659260808ce8352d535f714144971c104f46f4c805014da0fd7a8853e244c8f6cc2a619244036442af6199ec9b65894a6a58267496c899c08910cdb2c48b6502dbb10bd17e7db34a9c08a9d7ac92ecf54a4217f1806cb8209879322cd39d307b59ee2695cf355254ab413a9034b632bfbb908f3c20c73757c216c08e9f3c79f2e4093f91344cce503b0e839497430a52204f0403078ea943c3641984100563441bf7e04be81acc5291315839ca753432843ed0674e102804021d42d82db9926fc578d8527647d95c4b2b822e39105f0c64d189a37a575555551584f1f4239222bb2425e324d2f4440d8bda310d8adfd60e01a10ff4f16152f9266b101aae7e97f215bd6b5b871f719cc6bd7e61976b72b17d68df8e856e73e1b38f9a5cf8ade6c26b1ccd853649cda440ae5b726337f36ec50765f290e34b2e8bc23a600fb6990f8c1066521804e2ea1174655c77ba18c8c576f1ce39a31a5aa5d9252e17dada31dafb2e2edaeb535fa482ca7046d41409d773a94b54be680737944a4a8b34aa6ffaa53f29cd8531d86930cb377dd98e525065bbda2fb2997750b96fa015aee752595099ab7839fab4482cbda0f2cda597a5faccfd25234103f3bc7efdb80a975b850daa98d2e47ac3f389404b8770c328ab19250a4d8c421325c3b2ac877c8ca21377e8c581318ffac0977e51e73dd199a2f3a3c3236f7ae40dcf8b91353dc78131510a3ce9d427b7771e1c72ab690282753ad53ac4add95b1659c84216b6d8620b1e1e1e1f1f1f2e70810b5f7cf1c514a630852e74a10b6080018615ac60858e5b74d145173d3d3d5ad08216229550c21d78e1851758c00216c208230c2eb8e0628c31c61043c6d8e76e8e2dc59032cee0ea96f4bbbb9bbb5b8455a11ad137566d03282a10a31445e905f2880765053eaf99032da5b3689dfb9ec354e0bc9d970537c14d2e37846dbb1b8afbeefbb96cc3264e0f8b94880b4a0ad2d0b4d87365e48992c3bb28e5ca77918c00bc8b3a02781777ae3cbda2812ffc9acbccf0e7e4d30379a075035ff82039c572b7e91bd80d180e18f6f7ba539539a78fac00b8b8f35eb814328554423ff0a545b5878f43739ee4c0a938515d9ec3010080e7f00b009ccb7300000002c0451d2e4a71b1918c1cb877ab2617d2d8297c6e4a77eaf679537e4eadf35ef8fc16dbd11cbe0d2b6d604ce4e1af5869739236b7fb46e5c7f4536a9ac7363dda23ac1ccd93eee91f68039fc01ef873fbb34f99fe042000b4894b633abf306abbf9ead402b27ccc0b9d48ae2331c6dbf60e5eb6dd88e36863d7ad5f21166534f6b1635c875917ffd232ceaab556914824e22a0b4d2cd4c56b59c7b8f7745c1c85f6bd1c169c24925d42da7a4ee19a726573e1ed40daa13b74a7b5783b94ae3d07e6d467736137dde022ed847149635cd28e182e69070c98039d704bef29dcd2156ec976f2f39dc5cb517a17dac098d41bd98e6ed606c78fc8763593a1f98c9394b4c309b7a361dc8ec6a886c96497f41448ea8a0a1cdb3bd4e8dd49ef4ea28ad54b228db64ce2b8ac3dfba571d7334d635295f27454e4a8c6686497e0907112799edcecfdd0ab5f21ae39749d6642b8f2dd4d6dc7dc3c912714b24bfa09d69209518cf60e0b3d5eecd6ab137ce92a0a715876f92b93218e18d6c2990feb113e728448642ad4b08b572653dbdc05a714dc3ee2321a97f90c97cf61e8384ac762fc1defac9c6e3057bf9e4c941dbde128542ad5512eff6d3c94f6755dd71fc4c176a71bec0ddb511bbf18bb713ac7b1cc2c9da78b9e8659f90e37decc18afb17373b2a92fc4f2ab318e6b9973708583270e76017b1a457a3f25804bfae83f9d2abda16f5360190d737aafbc1f6bf076b8d184da8844d915413aa56b60ccc9b298417dbac1d5e0f2df3eb5a7f2d4aa737a92bdc7cf4e9c8a1375e5a7b7bca5a5a5855fc60f0b0b0bcb391b3ffdb2c1adfc6463c5c6ca1bb5627b4e9de9d387e9f13ca00a076f9a97643b0ec3ed0470fb1bd76565c41aeee2765d53e373c59bd35493fefcf086367d715d2fca58bd559c9050c2c75fd5928e2d7b762fa1bb2bae988b8b39239a23c06db8dccccd01a461a8a4acf864450b15d1480000000315000030100a064442a1682c0d1469b31d14800c859a446e501b8ae32c49511033c6186208000000008021003234649c003d73dcd6138dbf34b6907de625dc91bc8d4dd45d0a18acf5750eabf005298d8a444f080928c641d5c9906ad05322d86f6962f3a8025ebf12839fb5fe6e3ad3595c6dc8819490d2747a545352fd4e787e25e8756ada0ce0e11b9e9d0765a81daf26411df1d91449d88969ac9b786936cdf3e2f1dcc03cbb6839e8de0a7dfb7827553d87113055d59e1d507cce3d29f9d8f22dd155b5aad8bd63b18832de7493747c96b3db2c60c2119af4f5e17a564641f4cefc91eda94e54c191a1d4ac48e084b792e43bfe175c447d1804531a7a63b22fce49e8d6db6407fc3780fcac44448555fe1d0d045e7fe626e51b890e5358a790d8f126d0e9f540b6eea5d6d86d1612461a3bdc28eb3a1f584d99404d78f69d55c3c02a230cc42d1689b19a4ca5c2d00d2a5543888f7a9ab23f79fcd5f0d44299c4a6ba68db57c1f97986cd102e0686ec84701e9f23503dc5d54f71a1474a3c54456b923dcfcdca3686aa242aa1ab4b89ded5533cc82356d28e570ad379efcf3ac2feb46b540c598eeeb7a730b570e98a720a236ed3861ca45cb97ece6b3540a0da7e7c6f1d687e0b4efb94912263123e02f44eb423b0f54239b33ee7d3b9f156c338f65ce60d244b59325448db46ca9da3c0bef77ea63c569459cb61855ac60562b2e81776ef7d1f348c02eebbbd8aeb1e36b51cb5b4e2554c1bb33140c66d300ee85fa5f25a2c6d265edf954aa19eb37d19436059a4a9364b292b75c0854e1f6865a9141f5c5838915b394821b0c8404773e5f4c6f2ec9bd8f849b7313644eec0de928d3ae9f9731ac67064f31616bc449301e5014c2ce1b2fe81e1417d0468495a130e6963f854f1853ca1abb74ba2a49349ec99e7655e8cb3d9dcb794d883f5c90d942539438d0ae093d3fe3425ec4cb6cc5707b32a2aa8ad2567b6debe66d9448099a7b7fc10c87fc028628cb23cdba32d5899f7f1599e6c552e089ad66dce35d80d8fd3b5ec4d467e3a22b60801af79e7a942080d7e32e72a1d18b5c88bcd95442331fd2023efe2b4fa471b985014f8906adeb7b654487512c268ec7653a5bfba8398d41c492e791ed6b2db2d6c3cddd393111a4d7116b78d6bda9843e2c4057b9ebd3a58a4cd3175ec433c574a5ba18caf5a492f30bcbfeca8d45defeeca8d47ac0f9dbf46595fcb12e03a53236ff45c75a08f927135432fd95071e3468739975608947aea670fa03bf3b3d70bc171a3fd8756090d5a18d7b2fac1b92bb5918e3fe6740fc3107ede5ef255e7f62e97bb8b921536870e07779924e7c9239a30155f36386b3ba0e074488eafbf6451ed84cd714f2c2a7219ffcaf9b49702166ff676809799ff2f24feb8274d639a0a5a5ef1144c1bc128b15ee74fedd96741f7e6cb2c718f00bb592384593b11132ee556a3463dc3dee6dc60825f3f824245c3e777a99dc2c0d74d4d48ab5c1e21c6bc33cb3de4c913808c739930f033396953f003a9835f8ce0b76d9f5213158c8810f64a773bac11dc59be385a42d867513a4666bc6b3f58444657a75417c167026596ca95a677c35bbdcf4794ad4deea2654987f66f49a10d2b62a491e8ecde38d3b943c87b4a16b0d5659cc92da6a5333eabe18233d016d9e2bbff5cacb5eb575254b10fdd58a5611fcc1f9c59b51571a50b865c9562d525066f52dd60cefcc1ca66c18d7e7cf384d1270acb9188ff55bc9a5598358b1e39a9af5fa6ddc422263d9058bba59ff1f65917bcc20e0a686466b0b7ff5049899397e2b88cb2acc17e6a996caa24ab46bc2c31c7124806c51c218348b3882afbbba96a6e1fa523ea6380fc11755c9c5ab8de9867ea75f1707c9d67f815a6bb6371d9b78913fd425d02c0d23075e604ef1ad8bba5eedf3d27f5c4823d3516a828b8950e49ee4deec2a4e31cc8b0464c388857c36c64a2b211b595ec751da88e4bc42d2f263c5c01d54c6a387ed740866c392cde947fcfc3f520fe02282801bdbf66caf4eb44ea22e5df8e6c9012a017854ad9209f7c7b713a40faa3de3c54851804fb4610acef013eda24af0e63f9d226cf74eecaed7dfb041038d2620be33f6d965fc735b13b6e2e8bc881aaa3cc945efe09ffb9bc34e23ef20452949f8fd74380ba8d08cb884b98571d73ec75da7ca76c35bf0a3d9136e09865fe034008ac346c54d56200db1bccd15287e55366ac4c03614d071a7f6599c5bf81644833fa5812059e1698b652f22bad5a46839fdabdd086ca8a78cbb76f9681a1655971c37976e24f1a81b29b5ff971d85119a309b2935527b9d8b52f4a226562aee030d18f23a1736bcb899e1f426c12b45294a64c7bf214119d0f183cf8e2275aedf7b66fed043bc441d925b51000054bfd2f652857fb69851224d79266f3930e516d1ea8be6046b6f76bb841d2cc880a6960c14162d90842e80ea93ee39fe0420e85c7d8c1638b0a7526f0d1b72f16e43ec884e0b1592e48c463831488339c2a8b136f28d0bbe2e0d2948f1c941fb1922f959cb64b4919964643586de493b5d57653e552de7e611eb8a952c9508b842db80a22747791b1a28ffdaf9fa0d860b3794b0066d89c031abb3a9f7c393899ebc7dd6fcfeb35804323425ec39eba1a5ceb49de1980860876ca32ce174a55cdacd8090b4e56139a70a46276ff4c312c7145cfc69e9e6ba0ef1d5af6c0e248cc8d0d6df4082a8c1312b4d6059c48ea94387481022f4d7e4aab8bc3488bb57e98ea9726a51b3e79df3139c65708eba4c7e43000a49266662628d0b716e8ae2011302844f3e5c9240f0eafd623a4c4bec21068a9a9b734f448bbeba82c546e391ed548d3fc4383d83bb0397b582555aa230faaeaa7bc986e0594d970d8dcce45872c99d13cd14e3f7c8e67c71abbf5976a6394496797e122a3166d54d7c249791dd36ab42efa547731940b75f441d66026c8654c9c17b8c97b971db246af2473ad04c0c01600f8b30bfed173aa3074582b4b1969308fb778d9d65e5704d4e8bc62284733579fae8a8b4f034e5e8308c946a0684bb04762af852895ccbbf17b41afcb2dc10c7f6ce97f03d29d49eea479f702fcaef8ebd24106689b620b71f03a7f590f58ef8f31f881944808c25d13c2c7957650d3ce87f0d4b8eb7278d5caca6fefdac89f4e9bd34e13c769385f7b9c24e3bf35e23a930c9235313c405f126f6c94e2f8f0ba6590ac58f9f2ace1d88c1157a249c083f7fb93a0a9c9b1cc37f17a6d2a18b1172efed04573ed875b8536e49d8baf126ee4ce0f77e9d9433642ca1e0f71e0a88d56a5878b7b6ea61bec7cf19376219f5f2f4792597841f7ced9573e80b65e2e760912c4a2bb6182facf2c1665c187821bb72fb1390a53a79490de1f31e467c53cb5be469204f076c89a260fcb1e6f737df3b66f7fadd9d9141f6e0d5776bf085132d923707c618f3001339f271cd2e4807a3dc4279a6011279801562faf05bbe005387846e49eb540abdad2938a01ac95949f17f61e407a3c0c8f0920f79828198ceae08d6b9c1b0cd89dfe3d923d0103a076f25ef5acd61b47285e18028591a4a72b13a2b38ba7cb43d6a5372c9521753c3d6073550a16cfefbacdcd7695a09688a57441a61ebca4ec704622b03d7024d53fa1172197f8c5bee0784f0b8356898b385cac63e95c203a0ec38b4b6f5f04e4ac38933fc4320eb43cc319371681f68c8e33c1e38e0f734c3694384f3edc47dfca5e6671dc67433938da0c40966f7cbe8685bf2da09686394758786de867b531324a6c3c8f56ebb0464b3864f0dd9063c96eb6150c93fef175dddc980b3abba870c05d4f470d234680d68574781de7113d20338b84bb032ecbbd8b5758be3d32039c9466ddf8ed4666c59bb5a7131118e27197e1347a8d9b85caa4c1d13ecc9c09ea4fd1b6e2975af5632c8bc9e3d320ba7d912d327d6861d0aa4f8cc6339a449a39d60b3a5cac4705da11e6b825719d0510e527258969554a91732e5051306b33b25e76451f30e6b9e65f196ae627b189bcc6f5e0ccbb364df9aa084604eead0d7a8c248c7570896cd7a1203c3b5183c1c44e5a7234f04b00cca9d5fc2be9f59df88a7bdab563d75883fd8256f73ce3207fad88b983cce281403d8db590399e0b8598b7d7586bf711e73dbefe35e8015eaf9c5581d936e47a65cbf53c500521bee7ebb35d52633f1c8ce5461207a73f3746430c1357e6380da6f70be4e3bb468ca30fea5be6d01ea140ad25c186e19a3cc5066a54afe1220bfce00c963a83212a8cc7a9f049c25129a03306e361c82c6cda137beaf1ff6339354d4a1d9cecdaa65871ce780c65a2eb8de00d6390aa8f05bc1815ae43a691e8889c7b70f32270fc4d9734a9583e66fea1f5528b31fed7b927e3373ec1f77c5b7eec7c86207469b2156a19f5cd514ca2b026a37feb1ce42d71e0516b2786f843c054b08e5f2aed8607027051c6fd8a1017b4b4a73e76614278e1008cb60b6b21b58f8a5a3335a3bb210a977b01c6e664736fd4f03fc98cc7f08104861953f909a2a4da734931923b2fa99dc932a800b4f9ced4c2da848d77c59780edcbd2b5a8ae1fac5e71f61ea9fee5ae50865bb84958f12420151b35fff6332fc0b39dbb75d0a912b331e3e0b31eec55265c9352b555da8fb2e461dd9592d53bc9bcc521d31f3448aa3b90b1f45db3cce80f8246e603171778f9f25539869030ee4acd93250261f5e93fcd8708a874b0d3cffe66dce7f9f2837e8c87f2818fb0ad6896efac29745a031c6a3dd3bd5a00c3be0c3376a8503828e19dddc1249e4d6f44038cae5396017e49a2d69b24630051a18186cb4039bb6726e8cc932c86e6f0dd2e2572a3c8a1bf19ad7504298034c393e28895e2f87b1dafbbecb7ec4dd7d27bbb879d0c9724a580954edb789181c63eadced2f85a29b8813645cec8d9d0fcb3d45467432dd0d62c0889f6090d6fae996ad19edd5f2cc745e4b603354b4599e336de90039e1b65918aececfcc961a98ec766bccae8d260a609c1b17b685c50a20df2fc0f7845216608194f57ec4973ed483575776ad6542e84c1b781c9eedc24a23a212ef644cf5e43ccd5b3a20717a0c2823100af113d6286883cd8bf1ce439af6d17cf720d858f485ac9630baf00e687a0dce3d86faab7ab30f199dcb30f2f88cbe46c1f7dd5beab9e9e51cb01adb4901ce80667c9c7e318bc9dcc59a779c1d46824756332b81317d03a98dd2cba8126433d424efc767361f9561175b36731cf4be94f4b1dc825a78372850c57f2e2c53b2eb1f33df4fcf1449d8e90a502d852eae6f0b698bb1e6b59363a1983b88b9ef8cd772cce89b582cc2860c1084a8e00f1cd333a6ccb3421e518426b8560a0b562e532fad0ed27636a2329cab04207d8110e000b09371c7485b11c89b703cb6b8c7ddab1cf2e6c095e9654614be9fe90282fcd03b4ac981acc0023995225132d3a38cc324c5d0e9e4fcffbae9de46e3c03a5fb8bca2038b80610ac044e15e7064d1a521cbe28cee8e5490a58ce1bc18b0a1ffd1771c556f8a5918d77760d4d27cf4eba1eb081b0f54af37ef6195b19c1d69ea103bd4901a9368e898c9e6f624f34821d8e3b6dd433e627ce56d03e87fdfa0cae9b124b1d257eb787ce1efae9bf8c8ff6611fbdffd88d7cb146f7ddd0a718aa95b513ae038f9ef3b11abd98ce8a75c0a3773e56034f63bdc756cc46a357b1bf3b6c4f3f5748b9dfd034d56a6bea3a43675332b43bc831b45a0aa4a13cb99014314076bfaf88f538f494de1b24f3a379d0a31bc59e877dd29789f3174689871a6e9c2522879b4a5f20c7ed9e0e45723d556dd7db4514abf23fde433fe8bc67667c3c07fc74a358f6d04f3f8a650ffda0a3113fad98069ec5928f57f44b79bc11844197f4f8b9d059e8b425c87d1b6f6eec5c5b6991bc4bb4e45fcf59c475e14589813c8706ee2181a27f3b210b9caa34d20178148541d32f6ed8c371838bf3c94e743d2bbec26dda90258d4145c3da589e502c7f93c239979aef574ddfb22631c7d1140869586efd8927a4dba19d7a373ca197b6a59119a0afc1efe9e7306618d31ff4238b580e7e5a09323eafb36650211d2b924835c27f9a0ad82b8ca5244d80e0f93aa1b0de4a00068b548be0a21eeb9f052307d40a93ed2dee00292a3b96b557ca89eef04ef378d41a1e962bc954ad715ab64cace0f50f32871dc4fca878110ad79859d320deafb0c0b5083c850047ab9660892fa01067af8f1e3bd31f7c5adb665b11621c52fc333bfdc826a5ea67e8c97e47c8dab0549e3935151e60f55827d2e39e268194cb0a1e146a680ed6fd102358405b5a2e1899cdf74424abd6c16abf13aa9684f9ff1978ed708e201b477878be481c7567e3803d31319d00969a73f4da7f3ef7d8cc620f9f60e4f33b88e4db46b1448a91840b179a6393260a0de5a16e0ded079a34a51cfb14f8df3a9af4c7a2ed19c44c590ad56341fb43f8e1224d1e85321a3803134adba380a38e6fcaa65f763e536128a8fdfa9986f9b3321a0cec52ecc8bea0a2652f02c4ba58d40951456f335f0dfc890f808f4913eb38fcb6a2a0af2b3c62bf3a82a300e40ccf0f0dad66a6a0e2ab6b2c0fc555e2f8b1126ca428748766981851f4fe27234b8151b74f6b48b9657a8060bbd8adbbc4b6ac5e73f38c15f577c5b12a2c275678ae74ba7348fa6f48377fe087a59cb69f91e6edeb0781112d2120255d9125f11770d2180385dfa2105418132361c65fdc15826a193d61d1e61a41e8891f766dccce053a1c43360527682f2333162914482d41a60c822cd41dcb62f90670c522a465f482fa2cc4ec0fff0c60bcc1544a304ea81fd5f525ff0a93a380fde8c438128201e63d5832b1b142bd7c65037ee33cf7590a407db1847053347f6a810ff9b73f5ff6191eedff461b81e6472d4c4ca7af54b39daa1e5f9b20b2b8ddac324dccf6e1ba96c047169600df7883fd88db2d296a8756c006c65659c36a4c01551065946b9d0995c983e5037c75f281f9cc0e453c3be5fc8a3a3348825cecb58ced6920a0b68ae8d1f68ca74f236c7011f99cd78477b9157a6de9d764158f32d10f70ee484f57c3965542b9d2852267bb39a3f4ff0ae4b4ea400f0693c13a142c4cd7e0bbe6635c7822b3673d71e1931c56b129d5ee45be20ccc5a3e00fe0ddce60dcf8c8b342695e0b3f4da2add43b2de584c65dfed2422189c95d372bf343fb962eeb663b28300163b6f436539e7a2b90b8e4c01e2219623f67684c704744ed5852054d16b3d67672c2382bb842319c223b1f1bcd5e7c699e91c9c0f81b1d8402dc59ace639d7e255dafd459ef633887f1eeefbe2845214684822db168333ec8751ee8a971f896806500567afc2d56025237063b4df0d23768cee22a07173aac74ee2999199261747e1068800ce6174203324362c0a3e6049d21050985a947f4e85fd70c00920b820f4051d55443895d9df6194b6dbba946f4541efb8129a164edbe2755f20eccd407417c8fd19543d4daec78813882292332e8ea50f366064964ccbdcc874a1e1d7c7b5e07b9abf881e2459431d2ae1a92ae22ef35d4728c443b1e1b1f8edd3d411a76762a43dc99896ce8baca9a7f5cbc18902bb1269b4fa77d0609affcbdf49e0c723119763b961ea84f4fd62dd7af7030284711bcc67ba8279d6098c7d233c4639380839d0092b703debe3870714b18e10079f0dec420ed35aee4f57cde8bdd76c319122ab5846fbaa301aaf6a10111f34ba9d6932a5d2ea63b8a9d70998cd672804f34c8ed4e8ee65b30a79c943bf6779027520d8058ddcac4801ec0e4e33aa5e2fc42dc910e45689def86372a4ac1099c378fabb1e31971b829c81236b40607288fa0942aff83ed366efaedce9dd983c5a7aa1dee414b9bd48bd83d18cf632025d60ae1dd748831b76756c27c0f6e4ca7b996c40f2c7fc26d2b8fe0c5121531db51a22fedc8d08695642a52d535ce6e73c851679add1b09b3ea0125784d5a2c9ab84b48ea55eca6dfffd16abd96da8e34cde0b8d4c4c6d0d53d41d0eb999ebc5884eac3308c953080e0d9835a054f58f8a60d1e4b1f0ff8fcf0cb7b8ae2eb88da13911c79f596ab50afb695e0eb6e1f79acb43d2e8fdccbbab26236f6f1181325e157119ac8580881b8b94ae28b2da4e9b08cde39a90f57d1feed970fe884b201b13013e6e28ff0bc1454b5f99486d9729ad4862c34706497eca2bcf5bafd77e6eb60262faab08fe3281f35819f7c8713b534dcc9e787954deccc3ed532b80403f764da49291d4a39030cf8b44c842b8643071544471340cfb42763f988c7c22e85833654b42a8e243458cb916d60284e1a425f1d1b2a0bab69e9978c09dbf0e7c832f076ebbc526b12d552db0b53969fda2a360835ace17d34d8cb55a0e4a598eef37be419dce6ed9c73a0c4f0d1d9c27f00e9d12265885e75bd65c4c09eb41939c2a64e1510126a0a94edefa718d93cbced18476d4602d9dfeb10cab49fca7dad74cd37cd166d42150f347527fb3c324d0265d21c16dd345993e07b1d4bcdd7f98ba97dc05ee96d6af109d60d9a780890a32ec749e519d71f4acdb3958136454a06ec74fee08f51154a78e8950874f7d97723496f7b4b1357fd4fd3c5bebba216e605aab0de15c877bbe4f988ab08740996ad4b44ffe3656b63c8d5f9f23b13a27cff3d747c2cf5a3b7363ba6c625191248a69c39208fa3fa2c5ece00650d3a4df0457b6f950aa56a2c1b4d166f48459359aef6cfa16e1ccc5ab4376f2e5422d7d452368fef4fb9d2f3c050624cf33e2bcd58f2c97d5c61cd2ac085150d48edbf447205b06e83cc38028c91448c040af30454421c05c239b3b7ba0678f2fb02832acd9fa4fb32e0d5467927169434d59fa3a8d9d95bcd16619ace04379c8663a937494c44a88e7b2f4b2a97121a8a16b45b346ef856c23bf666c9a1f6ea8a5fc8d069418f2caae288f651527caa03b18a31c0ae720ecd96b67d1f3ac0beeeeafe8515176c04447a5c244750c41ea98a4759121efd78399b536f8683edd1c26d893ea10bde273bf77337dd554c31c32cc3ffbd3f3c6ea8bf3e0781147acc12ed42c9537a65a7d2c14be0210b4381d6cd8bbee6d5c04172fc25582602b5eb1ab1a32d2c74afe699a74c41d6f658755cc7efb11b90086580d73743fcafd9af8dab895c37de9c78cd52756844cb4db496173cc0da506d86b9443ab2d87ac427e969201c5eabe1e7496907eee44d049f63c39c9b1cc5f6be10c1bdfc1e1443ad054f5f09bc61654a0b076d5646e6d1992cb04322a3d3a033f9884e31654022cb188d63a66af7de230f4e09e4344b79a82ec224d02eb283c3c5c69afe8a10f60110852ca20a9422ca5260d089e8d299991d285ce46a99721e07a3f5a9b9cc1fa038f3055661c3d9f3470899a02ca8835dad152533783cd5fe7fd7e96a3c41a6b77f78cb4351e7dba24c7fb0df2427331146bdf29ec723f77b6ae4aa5a2725b29c044878bb2e0bae6ad1ee7b83513346fe91dfe1b6be4d10056994a82c8dd4b13ad084b85f584ba45a12044e33c62e634b2a769801a23764f90c81465d5a7330c6676cc1797f0ded9b96d13947ff8325e2b6541fd82c727aa7ff3a8cd304d0d545d48c9793bc154fe9c4652cbd1f8919b2c36e05ee9217ac023e474ec3cec45f7019994c60c0628b7b9a52b02fc978188a8b6f2d2c641ae1ec069789a9537431ce578b109fd7b270a1e72eb6102dc9f21ea7da6aee740682c78709a26a4c0b905ada71251d691922041d5a83b91d8e462edaac0c1ba3ccd4c6640e4c080ecc3a8fd623a36109d5a6455bd66b3720a9a41a19e2fd45e22a0e2a3b469bda291acd3a53030c5f9668b4e5c84b89b6a6cacdb9c49e27edeebaef2a02a09185804fcabf483d2296ee6dfbf2a107a0cb7361b2c577c6698f40b6e847f6a069f8119ca148e94abf98a49f61ca66048c57141604f2692e6091bf47754ad5db730345885a95752ca30cfbbcce46f652e02fcc1538c32d08a4fe3fba11b8f6aff7fa8586bc76f02e46999685c2143c89fe6b00c6a8dfd0a7fa00fa7e868718e70b1ceaf305dea1fc596ded197068398f3218733631c1b087fc2ba985d253a84a9278f7995fbc2c0b2947a554c8c1a2ae4962a75ff12307b2d216f46c6f54631b310dae91b6ad267b7de973b26c612b0d6d3da85de19cc26e5ab4c9ec7a275246016b49c1341477a90389ac31ce91270e325210bbd86bbfb4f9ac5d0c2110929072ba59f3b45beee9933dbbf5cf7d5c2394ea407888d40f8983cbbfe2f7b1f9006066365dd544028dfd6b64ef012f8ef89e9eb8923433360c3d6c70942875cc5243eb6c8498136fcf2857bd21926b85ef7b415960dcede9be9ef8bc3eab6efb5623fe7f28793b26aa7f6f1afdc8e3e986bf7b88548c4f16af175097c4a2a3161c3680fbb42ae061b7ed83e1b0da6e9add57d8254feef759fa36e8fa781611e92c209e0e47c8bd273473ff53bc9c87d57eaeee8857dfbf54b5644a04d1e40f4c930503152bd98bc320cac21f555b16d7ea0f036cde3a9369ace2d8cabb2db3d7cdb6ff79b9ed09a51ceaf8cf6cffc09fe30f0d9fb4f29039682e4243d9cafb4bdf513214a796ff1445c50d5739c17005a3d953356fe68098fcd7bf5e5559163f0a9cfb61dac9b5c389170697a2a23f5ac24de32b53e3f0d194d93bc49031807b136d0adada3f6dc873960670f2f86e5efa937dc4dfaf3bd9f40d83d0ef76ea8cdfe8dde0cd35da57e93566d24066ef0865f86bf1e21e5138f143b094fa61016dfea0f7038ae069fbd0efacca83aaa4bba156943e7ac257225fd69c0d6b3007227258dfe20ecfa8fba23ac9ef6c61e9afe5f6c697f3d43433eb8d20e72c48ef9f92f94e8b425e242088fe0d999919d21189b3da085daed3f8ee31823e77cd9ce902c68876771a526fc81b5c689578515a97a39f7926946994d1393c11aa53d22de18b3b8752e24938b51ab09a71745be0189f53ad215ee8a2acc46aacd8486b0d2e650201a2c63d996f51a0e714da5381dc088ea38e7e889e7675c0ac8805fd3d8b8c6d19bbc16e42bcd0e077132c1530b9e8c6af90f6614890b198b0b0c8c2800b0e12373b8b8c0c4771ae7d1a48349120a0dd5fd5328302f8c3b57046a093176178b1efe26defb1919ea7478605dd167ff86ad51e4378c6c9b3a9716f1e305c97ded1bc410e1f61304446af3faf51abddc7b8abd81ec8aeaddccb53e9b3f37b6c087fa1d5338caa5bf4371f2c22b651424a195adfca96c32386336a5026f7a035c6aeae30bf59e1a1b18a14326a49e4e8071228c11613c804249d0c7bb252ad91f9b0d9a4085f791057c4aa062fbfb004c92a8ca1427018a21e3470911b3b42cbe7af094a490057bf044c7e9886d0d54f67a70b24786913078e250a6d14886428ed22521cb39a157d5f5920c1f5f33bc0af6e024c7cbed48eb335002610c535cb020dbc83e203c4565157d4a1df7d310990767e2c2bbebf37dee617eb457a43519b62c428a9edeed824a311acf5dda81fd661361128c574737146ad67057201f76be4bb9b436e1d6df2510d5a2a3ab3515942c6ca2fe7065fdaeaefbc10e5b0ec7e9c51061f1c10afc0eb17de1ca00456fe273feb3291abf29993f418f56759c2e3f9dd888ea3df83a4603f30531042eba16bf4502ad0e8194f0c8960e71a34f44c0209a88d8d1c8d2d8add113e69ccf98ec05db9d0b973a9e5b0c6c1ef0dff31ac139f51a39af1b4e0c0a2fb5e4b1b0012f27678d0dfb9c0513d463fc67cf0970141793cfa45ae3746207e9c88869b5036b88193e4444079a52e269d4356f15ec95a54a40733d4c9876826290f8f8af7a03e74d74c970d076a04bfea5a0bae8bd39a72d2c312c227b7d73d7582b4a6b92cbd24e43d9640f8802732fccde0a5b84cb827b8f5546f8660dd0e620d922634d426d278528e4bbda177829c220becd9aa56e6ee85b82781524137ab435389a72a6c6c00e7eca4c5bbe6a6422e4fd8da06057410cd64ad68155c96af63f3f01971414995608755514a83154095dd5e9b756eec6c6d659967cf495bedb71d4d7c0f0a20daa879556fbbeda47d61d082d7139bd0e7fd1fc8c6a72cc799f9fd1a89fdab2a3f3137212f2d80149f9ef08d3feb7f6abfadba6c847526e1dd4efe69292c25ef557ea8688f7d47e0210980f8d93b41e370913d1e571e72b4d0fff9a260bc195f8a607788aa1229ae9391360b2d17dab50121193a3667bbe2fdb79387d300f92eda68a503e97f997e717cd1b2168cfdf74bb60196c4ef406c7be2e223c5dc764d2725b5b1402602074de2d314f8ccdda9e26323ffb3696eaec6c427fe2256e7666e3e4e41a55f467477fe40285f5d26f8646d1b3606b160169dffec1f08d1e0cfbb423b9aa0ad617ee74a367f876f9f43fff35dcb20d694fb299a4d29dcf2c662b20ab5d548ae07dafe3dccd215499f2bf2d52a3946e2dd565a070bab130a43b9a6068e98f83f989800b8db76613c02744b9f3be4c385a3db26b34f0fe58639d2bfcdfde8eb3678c922791be24ea5966ce60b3e21c6bd1f9433d5e212f331e5c6d71811fc8c4ad75dbe91f059957bf9d9dc7a8b4af3d7f7807cf0254876e3878f1473d6feaf23798d16f52f04e120fa4518e8a9bad52fd1e19ed8f64b48b07057b48d4767dae401e1a0a249b1ead062c2984a258a7cea332af82d620fe3d1802b40186164281e89d30904e28335cdcc4bda0b468c10c1fa9bd753e021f383173c2903471cc178d43b37b28e603fe5647d300e4801117f0a2e78bcfe2358173ab516e69ee058f48083fbe3243def7e337bdceb913232dc5f06b7645710279be77371302eb9e71440cb49eb7947f419ba14871f4a20dc7cb2994d3d27a6e8fe4841304aba554fdf1580f56d1f29e75434cb716dd3ac4cd334ad2fad272c21ef091b55510402056d5000226aa89172528b109a5d238db012551c4a1b17b9e47d5cd8f1fea4710ecf48093718a557ab47774a2d248f352cbc739245958c03fbbf6ef5c5c1c3d4db367591984b489138fdd79f2086de7a4804cc8692c1dd65f609f59d8066a234ed759bca1d06b21b7cc7accc7315da050494c1d73650112c10c96fe6daf33e3c9d4b4e2f19096c7142b154afd2b553430a6a3c3de452eac5f1b8e1be87fcf0ed0c9977bce3f23bb825b12ac39b1115721dbe5f167e66219465ebf5e7fbdd9b1ca7c4a443a4162d0d351023744e2616049992d0ba8824cba1e8eef12dbd05a56f5e777489b881785b780787dc47af2dc80c5d1551ed845c0bdf784e16bc988447c4a3587990c2ad8d5074a85356efafc6455b43bfa25bc481e378bd2ee29edd10298e7af6b0f50824db92f284085cf749d1ce63628178237c5b45db1d05ec07dc2e48a6967a79ab6dc70e32e5cc87907016587a0cdfe9922a948e6888d01a45085d35b31b1da0ccd831a5f14e7246301415d2d378da41e2740c4db24b21763db620c02310e0535c40053c173c693a9d80212a2f7aac5f535341a6e927594e40b7119b70cede8ca60b8495a446566f59ad5e2c1db16091c6792ab0750b25447a28948d98939ca0fd0f49031604b2ce9e87cc433c1d492f6cb9572bdf29ff8a431cb6a14eb84441c1e7cce2758424767a13812e3a5f3dc8e6eb55795973b680dbbaafc7c8eb46fe6a3d038dd035418e42cad6c7bdec76b6b4e449e271358d45a1868d1d2a071ec325330687294726825bcfd7e544eab59618a4599f725f4bc74c868d872efaf9656b6c6e8496abff960920c288a224c565fbccef325e0bda9e72a2da0a4c5e3fc5d33bbd1bdc7c26b014ccb6014e4fe05f6830315bd84d04056b20a65ae026e2660dd57f646273e40ab6ee6ef8d690994bc75e67def339dfef64368362fe8d64d9072cdf10938bc019b94371c26fecb9b74b34a0cff1092ae999dd843e3ea52c03d293481aad9b90cde971927f183a8cc607ceb8e347ceb99e3ad6a0c2c0e203140df274485e7b2648d88d8f3c6abc6622e8b9353eb8eb4373cf87227b64b101ca386f30ece601a9b4028512a6d35cc5336d33f64337ddd481b3468c387245284ce0bc1c52c3201d5e69fda31f9c3228b56bd0f7365dfacb0e9d0197b3af7178440be5c87c9188dcee833deaeeaa4be8199a12f0e103033fba94dfda55da5d1c36927ee2ef21fc720a61316b75dfe71e2b8c12d27a09314baaaa26d339470a31d8852bf19bb6de3209cc040d8b038637b7a66d5bfc883a38b4570d2a21e354c6be9207d798c5646013529736399e0788f5c6dd918ef61a3c0b9171d8bfeb9a36072f16cb833b480065fa882b84bb465a6a0166bde14fbe80038ec295ae019b3ec455a6ed7efea3238586d6df999b75d784f79d9b75f635bdb9a1ae1ec7ad7374591c48260f4183bee35e2b5d46e7f9a1da74f985a400eab8407e6a520b53f7be6f5ad6e83a1349f561629f99d90fe8a14924019754fb82050f87b447d160a5ff48683a6338d6c7ae434430cdc93c0af263dd8ed68e29ec153d7e7a572694bc4d3db63690ba638ea6a5ab7511daec6fc82a4a3d7eb926e4cd5dd615b1bbcd1afeaa86c823fce35fcbcf200463c3cd19145ad924fbce71077684d5e8a2c257e606ee9fee6a56113d86160b0b96604375c6d32d161507ef9985f03ade96e86750aea23cf38d4bb15c97ba5bedc3b1e0dc2a4b6976c89d081fad69623136c409fad7e47f0e7e3ba12d6cfa088092befec059b59f4e0ed6c22695b670ab409653216faed2e9016ad2bf8184d2b2c38ed32e907e1322180b4c2574fcb7a74b65f0d77940f8e5d62bf131154b34c8f60f66dae15910ac602e5dc4afa9a5bd9996e77e231b7c2eeea7c8a6dee3e3f9c0719bb3b35dac7fd53fafbf995180f54cd075077fd3572a5b05966effb0f60d9f4d94b98be488720e2e177143a04a82254949b58f9b904d05bd6b07bb890d7572070edad5c50bc32dbe1e848924170586b57a0c98ec3a1efb70434373d07982a4cca892fecc97db5603f6b82578c051b4abeb482f603c4a0474ad3c96d43678606a6da871b35cf9e7750ce52534d2ce0740dc2835870a332f8bbc0581989b40390abda81db931e5618f3045ddf09c7660085092221d75ce0b178709a379aac38608e0928c8147961a828ade796c6ec9bca3cad23aaf8a6ab18f120a621fc4ef10669bf9dfd796ac2dbea11fabfe4dce494c1dafe324bbc923537ce503e9fa6d5ffa3d64360be93a4c48f6880092869d02dd18021123f9e02f0d680f33c450d7c2c0240bccc868a20e2673ef719e88f61c7e035524509852fd0d691201fab3ee69170e37677a248c653550902cd4d0b3c2e120939e4cbe5ce34fbc020709efc405c58fc5ef4ce2a99182847a1cb699395466c0c0eef1c4ccabdea1f43ba83a657ebbb1bd9243e5bda57bdc341ad6169fc90d5123c717b2fbe1bfd854edc65ca97e4f31d69ff0c652c89ed78d584bcdfcf4f2674a3cfdc9cf4fb75fcd0684ada09d538d65a3e41eca3094c452f4a863446b31df6ea0e9491da6dae748fe6a8f7e01f206cec9036126958c329731a3f3db8a622e9aab568c9be99dc6ca830146e34f51ad017f4b36e7f79d091d5fe29ac211352e77d4bd8efd74b92efccc69e3d27dcdfe99728babbe174bf57d59d79a9ec2a58f8876e7489693c2316a8f9691c310c9d192136738f53c1ad3a62efe3ae926116ab8c321d475355a80c2892d2df9931691ac28b1aad076f85e23fb3d8cb55671da6c39e7e5c71a943e9e5c61898403700487cb945054a4fe3413f61181e98b86170949d65c310483774c9eca30f22b44ece2342e53f0dadae429b3d7ae7cfb0426b75190cbc483eafdc281b17ca161389247c4783876b85ab67c3206ab1a3f4f391ecee192d00babd21e6d4e8a092bb9c8da5f5e83760146fe840c0e272fe0d749f932727a9bcc4e9dff6e2c74fa07ef52b8557ae7d7299071691f9f08ea6b89d2eab6b94d04d7419ebdaf9fc36d4c81dafabd77d0e7de6ef8a8338b645dd7903ef8dfa619d6cd19136626253a1b527d165285b6d49e318d5bf27d15d1b2d66ac72058d2a4aaa9274ae6e2f55155f20ae3b9b102ac0b088dd7b8f050bbc5fb9aa1d220cebd7f491818c744e01bf2b30edc67eab4b82a84a6f094608fa139f1e37cfdcb719b892808315ae6ccd66a3af38dfaf83b513887772e496513f5e7c2c98bf5ebff1196a3557c08eac90548da8f453729c12fe0978cc28ca040397cbadc4c38d3d5ed8d1a1f0a2e448b9b62100c055a5799b7b193f4c1e82a5e0cc64dfa50ec7da5809985582a24dcc5cb20db37b33c00b441c43a15c7ed002005fc62898159d766340ffbd9c45dcecb68737f0c882bc9cdf780586e9f41c8db2bbc88321c2ac1c6f6994ff7fafea025fabffc96315bd3d03bad42a2a47ad8988e89a4c0da8d99b9e58e37e93f22fe8fd1c04d51c9bfc8d50c790c715bce2466f3c37698735ac6861bff56e70eed4a050119e1c92aa1a367eef75ca19250d788d6ba64b161e0f6e427473e789159cf93f65c67a38a11ac142c4fb075cd9c6be088850bc553e6c331594e4fc4a59f6d3eb77a1a4f78c1062c0c013d48282b21f16b3ed258c12fcaf752db53afcf875a13ae25b59b7b24f87522d829808380804bdda84b42f8bc55d0d67bc28302391d2c7645f5c87e65e89a704aa6bfb8c1b6e9b9ce8f2b372fde77e65dee93e1818c71fd9462b4d6f01610b8b77cdc0154736b14aa4c0407126a34c98a46f4836c1d5b053d469a8ef3e6322c2a63e9359f7a2948b0f3875c6a89fa316cd527daf4b6f3ba2aa9ce3eb146559e7df4f3119270b653b41480d313a75f88b1808a2a361dbad07897407a3cf590322e17b1a2d5b42e447b8859a019b2af057fb79df2201a5a32271b57745a8a1219748047037efebadebeb658cf80dad08daf88801dfd9d28e7b6233a6df9914a2dac6bb3a69ceed3d77af11ef11d77baf41c084ea0a320374613a5a374a94f588a184215c0c4379372dd379b722edee9981bd9e5b82fc41194ba8a475c02e863d9070b7140db7fca8752d0eb91e4fca8363e8947c72e234258240d0c06022eaf652b81c69e2bc64f26273b4fb4209f5b60222f8c9ace33e841bfe5a8dfccc62fe002e369b3280e10d0a17d12788ce2c490e026d0fd443a1ddf8482948c0f29549c7857012fe498066eef9ae87bb9430c4b386f60c6f4131521fc4b13ddd88582122c5cd65bb18fcb08094e88914166eef2070a64336c9794de69ff4133937e88c407a72548746f6bb24e62bd0505fc153719f03b4612b71d4305bdf582d58f19d906e5c2634c94b9bf1a24ec74d12ea7bcaf34e6b090419215a32a1d3e7823e91a025a92a2bd2f53c260e679b1b226f5cc530cfa6cf1f59df313d9394f10a671b4f790ca4e3d35ad2cd185b846de30b126fdd58defa67cc31cf4bfd012d7edf40b04c901220f320367af701aff52bf3902a61f07c38a8b6983a7236f360632fd7558e952f9fdb1dc29fa3a09b1b6ecc8d882cd7605d7b9db9f8a69a006bcc2979e9f2c2dfde61d0792596a66a0e60a22ed605c4adc864008aa09365e82d2a261e89a0dce206c920eb6c5ef98c52b0b4c48986a6f0616f4d8ef5d713d8fda60647a11c3d03caca8921773c503017ee23090f1f28b93efd2c9e158c4511f1238ecd9cfbee8bcc38f1637b7a57f51b76448beae6caa7195b3ffb1622ee8bd76c21e8ccf3b11f5821cf709d54a4fbd45a4c855516c02abcbc383402b01a92768e449515a442e87a4ac70fc417e0bc1a20d075303f3c9da0bad0ff110c3c3819cb07d18b91bef0fe66cfb54e4871691ac6f274b4ccd2cbbcabef954c59e513faeb1a2f7fd31e9f00dac0f9adc59833b36309957a8586b2d9e9a4b20c6b0aba95e1850cc699ff915adeda6598d218bdf5dcd6943830daf2848dc3de1c519326b90885f2e82904505379a9cd03d46aadefcc843ae321526c776dc46b82e4581a0702918c486d832f6e4120827f30611e8ab8f017173e9728411894b65e2a05c1f11c08839b0b47fc2ed7d0da916d8fbab219227cce96c18736efd1a45f56c6443240cbdd96de8d5c08585dbebb3ac900412384a3d656adc5a248f0c9a6eeffbdf0ffd42f206b83750e316e4f68a2ed635c20df1f8f0cd0455c5e8da0016b71c08a5e1fa4db9f3f4987bed8fa37441f38bbeb98348e584966a69caca09d8d61c894f39c2be118409e27468e17bb97aaf643d30375318e2c7fdf65425c178270f6ef9f092ec392528b99d0c41e41271ec520cc936f3bebe049f2b9a0b2303dab33d7155bb619aa72149bde0389cca0e160eb50245055b603fe90384b8b3e2e13d1fe2c49324828120b36ba45059d137b711e7f364c6b4699d2ba617ebd6cb016993171642f6fbe176d0999285fe1a34b4e3fe1cfda627c89d11210c03d5162dd000d4a5dd39246416293b4064c3bdf719404adf760df4da2a0164b0507e7a1f9403e880777bed0fc8a6cf489a91fcb607e1af6827bf83b9d0ae2ef5395096e1c7e27d515aff5ed0d929f204a0060feffd4d09fd5682019c8324554f8edd58d8aaa296d5042ecec971424f19dec7dc9f644460ee68747baa4047b78444f6184f2bfb7f9bc085e80014ec5570c3d4293885005fa253f59372e52d5856bfc2e663ec8aa97c69195eb72e487630d4c508ce256f209915767ec412f53503b5eb357857fa7d3914812fbac2029df8953a758a660aee4697073314bcd1e8eaced01d4b779b7c5a5c3a19d98f2346a670b602791eb25a64dfd9c7ff48f5dda06c5a421abc44cc224f56f5c21b5bc0653f631f68952c9c58238a9e47c27982ecfe8367146082cdabf049d2b31cc5705fcd70a909261e5792092084c42ccb1a5f7843bda9f8ee3108a98d670e6d698a0018e2035d839d26a6cfa2601c44135ab5e835e561300bbe94e93822c96d4fe611e6061e2e5ade959acaeaaae723342b11ad2ed361e54fe2d448177120ccd35e1d52d5549536900631716c49c5773073d1829a230686164085cbd681291af941b65a88eb6e1015b4980d92d4761bcbee600d97339cd82a4944af4157226126f2be04c1f0a284fdedfd971023d72f63e595a42b4fc27e0db1c89378acb9f17241c7719142fc5670710a17c09ecefbd412cacd217b556abc5e9f43fb6bf6a8ed51728875a87bc54627dd9a095268009cb596e10be9fc44274af9db9870840e355d36a0035c6f902c6d13585f84b300234625e3e05e98e01e8850648fc151e6df087f7e8c04a31c3b3f4c4ee527240775658095da91a5d35e17b6deb1bfdf031e7481566d9ee50c88d103e173e2ca1f632d21ada68f2c67183bd2041c6a8b61306043ac21e54e315e2d24c960399589d7adda3922b99b98616d00390f217b002da276945c4e5f45e7323d903381dfe9080ed33b2b5b46b492a2dd716333e18725242274cd40d736d516fcf8fdddcf1cac2512f7a7f74031caca0878282b2f1c51f256ddf07457af3895e2599be078874ef8b1e4a9a7e0fca2b92cbef13a6c4296d8417fac3e7d14ef53c93d81b403882ee7dc6ff10f3074b54edcb7ff0038bb282064644235d89a0913ca53d8f58ac89ef920b2bdf462ca4cae60c763233af915f7329011a4e0f5a647b5abea1233c0ca6a427f630b410e044a989fd4d0807139cbdb30e361ebc7edb8ada0be1514c6775076d280db5b7afe8bf7f1d82f9edbb6afa49f06ce1447819d4f0586e37512f22c0634458b0ecce17c0aec44eafe5d43151e906658e43738721a53c63e6fce23e775b15dd05f079756056871d22337054b969285662f82845db70c9bb9784234ebefad4ab12c26e146511eb71f9d706fa081c5d533956fb0b35e9c28bbe2c0b2c69a4d1610b86c94338e64718b6e61757ff57456d38127318ac38042f59a41698f0803b2c9dfeb8e6e3eb04f16de47c0fe6daad28c02dc47e2a1e4816b70ed1042551e5aee305175111f8f80a93fa6f27d817573dee04eb946899463be57035fa6f32b0a0cadd1ef8c3c583843680885b3df54f984c9164eeadbdb073b51e252d69f033834a484ba54a3a2c5683f312f1ddd2573d11713b970ceea0877c31c6951a64e057b0e825c7dc738713299585a7a9d7a72947cadcd53b6c2afd3a8392bc50af6ce0dcda2943f2217dacd7a12541bfb53e4ef2214acdec2816924f1fb71a470f09ad66e18f021c63f0ce6300c65edb9b26f7433efcb111e905f36410f84efc2b4fbeb8c483cb8e0d00dd4bbe88c77796210248dde41b8380b37d896ab92a25be194e9348f1038d14225868a312a33686bb59ff2cf73f1aaf6bb4cc52c1d7df849444ff657244dada534120183e8a64d57e569612947cf485acefa38b9c6d8da3b2817c7b8f8425f61db041febb552832a0aad0587ad0d008c357c038241e183594945e233488b6f78646c4dd58705eef9b065d3186787473c5b33f3de46cfdc84323ae5653daa97c3423b42491c390e700e8374ead926906ba71eec991248672e362a0845688e1dc5a608d25152cdc44fee3ae2080279771b7370337af8a161e17d3c3171ba52d4fb56cedf6d960b0750e84e2fb8f0c8c785ca0ae6f3ce843238ec307ebef9819e056d36426c5584d75ed452f5d3de354d8a5092eaa863c3c3181a3896653c01932ef443fa2cf2ce3257ce2aca8fafe2f811b6af8f37807902f473c113b9a0520e40720f9acfbad356def39762f1c2e19c0b2880756aad2fe0760ea7a05dcaad34b08a72695c4326e8982dfe8012dddd923cbd3ed259659d06f8c4af2b5022f38af0fe1773264fac3a6d0b053b7002578c3a28080ffdf65f13f9930197a6f7b815270c5a0ced0d54ef93410110929c9dfcd92603ba226cbf624a446199d73900330940cca9ee4b2ded9b58b0b1877c2f14f9e0b96d688b8bc66291d4a1c8190ba712d1e9eeccaf3913d07aea287a4ef2fd4012b22459bdadef08e75fe90aa6bd266b1c3572a7673515725a0c8e4a0c0b5699092b4d250ebf00f94361eb2b566cd6ee18f14273434c6a1bd131d43425fb5e26725acdd70bb300eaaf38339aa10b55522ab6b70a1b09860950135cbeccfbe8b09e6d950ae44d1f3958e0b560fb09940b22c3539cb602ba31eaf42b7e1f6db08184f2d015375ac1a6dad0c43b1759a131d500ac999ddd749cf968c923a502952af514fbbd475d0df5ad46b7712d5096dc3b25093817a0cb3c3bcfa521ca2b02fe87e2c841067c990befa4cf97245fc1ff9b79ec0c602ac7b8e58079eceeeae3ec2bd27d1d883a927b0489cd778a67a9bf3700e50411f64bdc6eb3180ab1ffa234cedc9187919ecf68317bafb09887f982e2284c42f42b29921457295942da36518fc3316456eced419132e77e1218fbd99b2e92565bc016e8734e9c9a6440fe120fcdf78f78384a981f1d758936c77e4ae150a11a143bdf8503a550255d786bb12420fb47051d2fd1c0c80653261ebd31690fe7104a775064590c854a7090cbbb67c59276555dad1cb48e0c201e7ce6ea0df5990b3f312322b21934371ccdd4ddd10c4057042f37deb9bcf9782ae73fc00d891f2f42b9bb2f4a3378644a53fad16f43b73b01234ad796dac8abdeb47e42cb17314d0ed31cb02d8a7fc0a4e046017788dd7d69be9bd5ab0471455f7c02c054dce2d9e8545f88369a37cb0e5024201759b097cea07859378acd3bf00af6b61000d2d8f245cb657847d30448c291ac6bf152b3b000d31b29e7bf9d9a7336794c3db368310dbb13bd13ce28ba26cd06bd5319ffec8ffaa75ac166d9e3e1a96155d0f5274016675b1f604bef31b6cd21277b26f6b21a0a02225a21a52d074251beb63ab23f6816f7e38923b0edcf8528ca7ba4decf9391387562cdbfc5e7b17aaa7e5ac342bb0d2070b27637b5f5676d6c93a6b1122ad969df47b25c39bb7ebaad601a98c088ff812bc4a2b5a6196e12658063889bc07ceb28f101304d1b96774c6a66840962b8380d450b57f96a7988192ee67646e21febb062a2023e1b23735b6f627e3d56e3ebd6df0510e528208950a67e56b25a008b20542597890013a55163fed577784818623d6d274e03405c56a45aedd8ff7719a061191e5d303d9b2a9641b0587461e24f08b3b6f0fa9c98c3555d42a58a2c6bb13f64252a88332f40bd4951225d3c7ade109a84b4b09f56fd1c9a6ae11aef7bfbb0bde952a006744a788f10095c9c93f272b842e2b0c96e6ee07e899f71daf9b16a2bf3b069ecaf4d41bb814e41f40cd83d749df9cb9c1d06e38d51e6d2c95cfc586998b5147f0edd1111786f8a784d19799d9ba57f4fcf3ccd02500d5f2cc8bab07cf215dd69491a442d7e924e963f4d5ab32934f952286169561c54cf58ce7cd624893f32f85cb0d73041445a7e8f0e149cb54f6884aae9f724b08150c9598159f6f07e5b8208e975a7c4b20bc8474813f26f3e46742962b0b99dd79fa72ea4282aca6c2f66a7292666891b31a1d1015a91181b8ed721f2c012934248e4825811f0636fc366eb9f2b21999ad2b6590fef614710a2b2010b2589932dbb45da5881ed14e579918b6b2142f0d104696de981d8be8c8104051dc6126ad6ea165399270869de453c771262bd6841c87d61289d684144008b5fca4a927028a3fcaab04e14ee3e8408c51068bad8668dc955e6bd13d4f8125e1c4c6a128b8a59c99deaded50f768492f5088c83d314ed8996d9b6e259e0d19052590a086ea1b695be5637a623f002ed92cae98fae52ef4f7684639313137247f693fe94b5aa6b48abfb9c5e6ba16a0a653fc7c9b622295b8e33c85c4e9025f29d3ae4c902a52df731fa70b2e90bba1cbf5b0b217b7f45fa46a119da84dcb76a94bee3551f14271543ac7fd619ebd0d1fbc5b69d746e63d9228aded4dab979c2285c322f74aabeba87a6d879d1cfe86009c95ecdd357b2157ce1fa3fd75949b6c2075f26978b0aec54bd23527cbb7a72eaa3531bc3522096eb858cf3d740f5d860c77c8780424fbf4a5c91da4233b86787259ceafd585a37cfe86c45ef90f848123946fc92e94a839d8ac614eb5c5f9f2ccaa2b482379b5f9d302b18113e046b4c16aa8e01660de877a05bec84ccdb648031230d7743a9f4c54fd0a92e952ff8ea45cb801c276544c96239bb5fb4f76502e3d574307e8720ed7f22dd9e4966be599a22ca27c7ab1201f64d320d6ba1b22b38ce57d912c9a7a4bd17eacfbe2cce4753036e254e9ee33b52082317c85a30a65f7f5910feca6f920a35e44c4dcc22d5b7ebf284867c59c1576a4d05d714e851d2976ad985bc16e0a1d2be6acb89382ce8a392bee4eb1b3829c8a7753e85c3167108563c7be9813fdbb9d655d9ef9e167f231e057237361920cbe0e88ef98d21f39fad96a3d007cdf96fa9ac27626c459eecd9e1df2355281d499a5198c6c01525be3689c44241ff9259fb12ad94f18736922a2286db65db6cc1998797dd7e74601e8e0decb4d47ce48596c749ecbc844380e3bc7c80cb84209ec7198c8c91f4d4f1b22edc59ec43f5b628d90bef280bf189248fb1c493cc380f3ba7ddb949b4709c955bb07b62ce167ac792c61a79a1d835a728b7bd188095e18563a53c835917c0c9594a3001fb42589903f27b6c051fde225964c0749e55346aef9d174126f3c33696b741802c0d5e554dbdb15025b0b8777ed8f5fe82e0f6b5ed742103c2075f2f26ca36fbfd444c838207c5f699a63db95a7feb77d423b89c8fab970bb3aa53ab06a376d272741151434426c86cdebe313ec7445d4a179a2645e21d1273170784d0352a7628dfe23fd2cdad0eee9d0f669567cfd480e6ddbbf4a9d57f8eb97c51cd03d640b2bea6b6cc2ee696ee7f448a3ea5754cec1bfb9b8bc674f10b5d700fac6e357680f16422081edb50a6a5932609c5f9ca3166e822c7b5c60fa2239bd7087a36154c3968f670565314282c9dc3712c5ecbd9745f2abbdca40eaf105981e67d770bafcf4bc1449460a22d29b4834e3ec51baafbbf77ee1cf24e4fc314e84e8f52bd19bdc83395d476047cb46c2f5de91b1fa06190bbe4e51acfd550e97bc3d9d1ef2002f36d5acc4eca6b422508e184b28183ad4750770a2fb695702671ebecc536d51cd149a1d3c18cc30d665eef368719e317ff633eef1aa97a3ee73cabd611ce798ddff53b38d665bfacf83910bd0775697eeeedea161542654ffe09b5420e19b03c58ef0e59c1861e6d32c3dcbd99f8006a2a6f29190d05613088f44b26afd669be3df4de70838b1b4e908064279ed0679562ef441028504832f98a64c628c430b7b982c3a8c13ab07ae728fdf132a64b5e08f5df387425201ea8f644d77fa9aaba4b33fc9411a647b6f51ecc725d2ec2f176611de1743ac47f580818d842a87e439a57bc61b7497724d21163fdcff832bc087dd654ff710dde5205f538301126769234aac991d76b39b039679ae848d629229511f5ce00d015fbda6a06a87c614855cd0f152e59021745a4fc23e7fe2ffdebfbb63fa6fb855853a2223a63aaa65c00417fd29cb71b144f06711b93c4a06f7d4459c908eb4d445e4845fbe475894b54c9ec2221d2f2021e74018bcbc24b7423fa8b96c85c006c4c690c2da841986646754b3f75dbc0403cf405c85df4afe0a25679fb0463907560a136837cad0f81ac97f24f0c944dc83c48e1b37da2ed1d99769964b93ac4e1b88ccca38faccc4f989fc508afee3fd29e3a977526c8219856ee93b3c07938590ee924fdb4ce1b0476fd6c78884df8b7df7392601ace579dac4dea6e3e4561a1af1617286ccf441ee05b38744eb08d41e1c0685e0d07895828dafe3a68c840e4e06c32ea397cd55bb69668472277133344f2f3e1fe3e16cda4013a1ae9d6166ddcda36eb00a395c6b33df9e1a4105655890c02ac381e8d4cb0d53922d81e3c943b086599fdf6ba6d78315c852799d8800e4b2150ef558ef4e1be9c468927ffec09820a768f9aa8cdec0a40961acffc0352f150465bf80c5fdb3445dac236315790363149b3aa719977f9127188ecf39c2b703d99cf4329bb54f99a548a82d74284b0c631e026e481c7256efa07fbba5232cee086f3730306fba90303578ea8513c15c9e63380442bd500c3f7819e3ba44f1cd7e89482e5ecc5cd36dac8f264743623cec70b381b9677dceabf3b0f535955f3e8a6a227cec75b59d20623ba836f6b2d321ac692a7fdcdb448b13dc042d972e20877cb82d1eed542d77a823a2bef52b3650607b4abf529348b7b588fc18c643e4ca635e91d69e60c416324364d501146ed341c3a0bb87de3dae43cf3cb315a3cb6e0b11236b93f494981b67020134c745fbe9de96f3263e90d58ce32750c73b4775956dee944942670da7bf2036aee5ffb4afa24228320b5b1a7dcc18ee63c65892ecd431b59de7a0545f30cc8481d15b73eec6ac5bea9698bdb37b7bcbb2eb8982fc3a934b4e2648dca7897b7ad4286495c96ca7d42218d56c48a99ffdc8ad02f3e27589285bafb7544baa4e14edac338b5e1d00e95d25d51bb49e48cacc89c339f6821b1e7c2c547721e11feecc640bf6d123523344da94ad0bc376f6c6df7083dc4f8b8be3460b81dcfd623192f076dfa9f49352c288949e8d0330ba17a71a7061696e313183bd2f009b06f301407b885ac46f4d589e68d7448480005a61ecdea07eb3b8fb80166e9df00235b338007e7223cdb6d692a770da99c5e2ee46f652d6f2f83511a756de06f90b6ed1f9558f44e8cad014446881b218c0b4aa4692bb5eed2802ec573736642a81a4068d09f47b126b571b26c862c09a7c01bf5d6b919c0a7452dc513167459d147754905351670a1d2ae456ac9342878ab92aeaa6a0ab428e8a3a53eca820a7a2ce14bb55ccc944e1291a0487bf2743db189dde6079747103b49ace8e27448a7e44a12eab4a89ce3c2b09d7a8baa8398f07292c8a022f2e3f3440025e20a109924c4c795435516b0e892fe7467d63e4ed80d6c2d9d75e742d86271b5feed0c5805dee62f0302e01e54ad45180c0e0926165ec56096f0999a1dbedb344993a3e853794579c575bfe6fdbf5d083b4639e0e4d8aab0e4912859f0a5e2c473faff8d157da77a444ed009fae26126e9b50f8df26473740f5177e256c803ad0a9a5f7f48cf496068675ad62a7191409897e4466b6a7cdd9cdddd110c5ae699641a303ec57a2e27529d0c3803f69264d03b7036c725a85eb1a6a703aa6391aa5c3a033f23ae0654677057f495a4bd917ca0484b955cedd3bb3f69f963b09d0cbf25bf31c52ad456432fbc74dea99d59a21c5f240566865c59a7d1c56216e9cc3753f805a1a7e9e17c975597c0b8d1726d5c5a5b4906dc09f07ad3ee2b6a2a8c31d80d1d7f9abc11a86561ccf4e16b386c39a87f6d875caafadb95c75f9ec94062343ebb51b37152e9e62c55a805a4e48656cdb8d45e2fa3ed09e3744341fd83519e0d43d89fec355a40c38b8b7eca6fd05659a93b11313a0beea467c5edc7df8fe02847bed9d3abe6d36becb3db523ffa95f5a1137ba5d756ed64a8599be974f220a76f524469af11e9eb616f15e949eb7c58f0660d7cadb4cafecfb60db2a1761fd3389a81bf73faf90d0620ec05bbbcdc93944e77f9144dcea715324a0aaf453145cb742e854fb4c4515f61baf952b461beb8e32f4c65413ec00c96e0204205992d8568d9b0f918b1b03200075f453d0865e8a47f34efbba72e0e80da57623f8920d2c7c6f1f00a34ff10021b5c46c2c33de0b402a689fa0f7b3aa0681ba544a9be6384dd0ffa140603a281d7ae5ca10d901e08af4d98dd61a801c9396dc2c8c5e8f83f901ecbeabd2ee25f345944d418c35568d53d00609f9c748529f45ff66159e0fd7affebf395c7e3375443f95c55dbd0e9bcc77697dd0eb7aa44d1f6d6c33c8bef4ef5d9862e04b28dc9cfabf30abb048ca0d762ad609297c2a50bf408128f75195e66ef863c99a6e32948ca97fbad26ef5cae5a954e28202ed91b35cdf1a5250c4b0d88214095d9139f642506293904d54ba7251fbc4a7fbd2fc05a9239e23dabb7d28d4350fa1e4657b1e9cb42f1e6c19010858caed8b020858ec4d71980b09ec35826e2e25541ceeeed1b2e0ba8965c04944f070421860684fd1596ca5cd37d114818f5980c266685a884fc005828b935ba94cf6ccc57049fd09e0ed2a737983c72da6b082eb3d9a08ab8c38cffc418fdc0a70e74d1f28d5720df2406301138b87015f022dc0aa9bcde09b672ad6c00362d89b02c0e8691651c7f299562442752a4c7d57a0b793d2fa1d397b28b3c0e722ef1fe11c3cb3c8fbd6de120191130e558cdd2983f06649055ba1f514af4b613adf436b7a6b2051412536eac516932bd60b7a7ff76fbd85ad52ca19fcba774ada3dfb686366e133c0e4486f0bfc68cda2c8f9ba6c7345497237d676287b38de55855e407f720f5e43d3c34751229b3a175d7a4f302a862ec0d90922c34b2949fb75e560b27e8c3312b5f762b29e3d2ab7ad728baff1e958a58e2409a1d1e9686a2ac49dd519f9f8188fcbd60a78bcafb87ef8d12979e3ed015761d49c3a0c202bd439f29a0b7d788d2a705df589b14cbc6a508ebec36a60ea55432be949f1e576f68bc5cbfdfc376ee3f5df1d9aa99a9df721c052c0a2be707fc6c5c7fe326a1c4479d0865035a1a5c4e7a26cbc553e9e52b62cfe7f434331620915a02867fb7fb42ff01a38eaa9c1d3f7595dd6ca6272fd98d39dd26bd643cf94a3857e98144d4fb00baa904288cf1226b0fa39586eb6cf1525b49df2fb9191d8186a6a9dfab356175b1e92973a2257bf12970d06b31ea17ea2e5d78c69613f54b632054f3debd9097d00c134038605e37c8a60f45561a8ec36335ab916bad3a6f0a5a29c7160499a55a44631103aa61c10d498536ec159d1062dcdeae855f3e6298487ae11fe08843b212eb1939d8cc4fd24489bb949d90cf5d1261e48d9e7a1ac854c6a1949eaa6cec3631222b834fa2142196b46d8ededa801e468048982d97e3df14698d2b3704f64c1cc9914da850dae86d52563d6e198f54eb93f39c8f60ac473e566a443c528e3c280c6047f15c9ceeae19de7f15ec2f738bd1076c9c8de8367a97ff31adb51c860156deee39eaa4f9f8699cbf5078bf5b10617932818478bcf93079bde26281b14c97b9cd04ff952a97a56b8dc30b1467ab10d69c095f2900a1c91e37e22f863629dde4e3faa45825e1eedec15df6898e234f8675df4eeca6d26386e8993e5ed3cad780f2ca43dd49874b8cff73291eef83f6281cc5bdf0d53da1f41a2647543467b826fc4ed65563dab6bd036493cc021abce964daaa272a745607355922dd826640dabb21aac7496296bf7c307e17ac481a11dd37bf2ad43980e5deda74836e96b688f43ad27c2809ca52cda582034bdd15ce782457b8d64d299340f0f2669e14098e3a29af95135346fa67f99830542a75a26d214a6b5ad9ed37bef430b2bf424c23a55611cca1c4eda749ff9357eee47862f50c3f35011945bd6f4e59e8b6ce3261f6ab1b763c84fb29a3cf9a2e4c607af4ee2a53b5f5ac801887e410e9b13dd8d0ebacd63615bfd61b2948806b5116b13a65222a6610b536345b1d21fcfb4bc80cc4a2e61dcd880ae4be7933a47b2dea4e1a52526d35044cc219d998b922c1b578c2d14371ff2e6e39cf1fce3121ca2bf8bd08cb5b5bab3530643eada8a231c393e9287853bdfe7c3552c922f7b51a95f3ca55d352bd43311f11b5a276422443530a229ceb6bcc899bda6eeaffbc14cd030d1717f41c73bbc66b9f5b85d81ab5afdea3fb4b469ddee845d0f4a004993663e097131c5997b073359acd2b6c3f9e033a258a0fce5433020824820111ea04730f389ce971e7c858b7b399a1d7b5581f0e95a86bd6ba0e14341e478d6500192c75b4009646dc4f49ae66c70b54e366ad34ce3e3692dfdc0a82df8830dbca0ca1f92c8586cf107ba356f4a82d244755aaeb1d991b49bb185b7a0f2d1cbee9bf7d35c4a03a6a4ddf4f455781031da7e600074836f3b4eeb808ab5fe816803e46eef94bb71f1eb3571f76171dec7e55c7bddfb66c14f602a9761269e4035fa674d205b89c710c96b9c4ecc05a8b45ddfd31690a2a38958c7833f528208baae9c0f08e8e9d14d07da1e440c4613603a05bd87c3839fb8470d191bf33a966f9bc7559dae7669f687c8dc0fce9c667eede2a14b477174d74ff1ee93f89592fdee63e6d2b017eb168063c1a39ca39b72ed27894119b50dbf3f7b039035e66af7f586da64cce8e597fcf4f4fccedc843a95a05307008900d8a5824d6cf63a5236b56373178ed5ccb24b386ce6a484c4d7f3d100b0b4167be15c1aa69cf408b22c65a5fe0385f67e3988c666768c4fbc8ed74d3bf205d6adbe96897590fd6f69490a774e5ae29d4ff8ecb6d1db68c9a0678affbead042765282082c4614192030a6f15523e75dd25e5403a407414fa2de3bd8aa24718e5b5639af44c6c900b580fc3a3ccce91a3bd5a4ce1f13b294df5e61a6e7861e3e7c1fd486b69247d43f4aaebf816e2de2274b29fa2eb5ed6aee1165a231a80d7b5bb214e98ff49078e4aafacfb328574f371e3ff05633b59ad8c43752a226604d6e1fec380262c92bb5e38b8c32834ed5c29752741d6b2bb58700e47b69dfda6f09b58194ae46f1974cafeb1427ca085daec8967e34a9afebf25da3ced95a3638825702500e2db106c1ff7cbe327631b8d602ab809fdf5e37a1fb03dcbad3bfba9590c92b84cd1a7546ce9c52569e4db68d4a9b910f63c5c28513b9746ffa474e4a0f87d99e5a8a0ae470a4cd3a563abe82257e31408e6a9e82f545c2c21dce50fa52a45ec4a64621f22b7fc838cfee595e14035ee02d0c2caa5e20db91e1c6bd0b408fd59b16fd6eed4ae21b6f1d0ae866d3075c31a16c0860705fdb6737dfa31db147d4eb0c275bd03d62ae198c4a7e27cec2c39e02f1750a7c9924a97b0ef9b1a3fdf976aa0449b27259e268e4465e5020d9e9d714b5584bb3721b329c450f2caa64dc88d406ce5a8bc88af5b7db8468dfa96a88454ce9773c0f44e3a1a316f6270e76425d38a80ceb897245cff6a7ef8edc076106132651e0f2a2781233b25a72521887cbd5f7b0a83736c4c64aefb08a1dc9144ef59351b86f64cec46645f00938e518f1f2ccc48e1d5597ce4245e3e1e9f9384d5be213400319a42415d630a4402573e8c3f493985a5b0de6e4d8176cf9a2dc156f3d54504929a467913e47555ee88cd8249562e2e9b4ec31120210ea612defb1a9577254ca558daea226e88850ffc85ffcd80ddfac00566ab3e6f287e2a134b329c706efb40a4cd129b0e0d2e1a147c56736662b5887fc10577e064ba3335b3b15a48f0d1a9309d2ef4e6ba0e8bb6f48d2c55dc217730000a9f6c9ed01056330c5eb39baf37082eb7187e7ae813616f690c4638269792b012fd14c8cedc0b0cadc2dd43c7446e28a12ae352fbed673d421edd5039caca5025c049722890e2143db3d871379fbc3e9d4c5ddb17896c39f2500690a801e354159ab1cadfff4a158953a2c3d468e063ad167359145b5f3dce41a539431d9b9afb5122f24596da20ee6fd31d765a938d6974b4b47d6970a124a7c8c9629d3cfc559c16355c6d3b09b684667e03f7305bd608c3addb6f7001531a9eee374d46609a5ee951fd1f62f07bda89dbb7bea421a8410cb344ecbe73dd4724e208ee4734d5e99e7d2376da2f9c9e5b4ebebcb8480a55cd85868efb399f2235d1a7fa83dbc92cf015dfb059ba80745bd6e7589315cd7a84b5ac14568fc76a44e17ea0590aab72b03e76c32a7258b56515894b9a9ef03b8d325a555dae1dce0cc4d3a54ce57bb03abac51b39be1b957c9f6a02c91fad48f19e2dd7cf4c3587816d7caeec098a7fb02879f1a483fdd522d156a6bf0cc796d29914eb8d7b67d088f1ae2157d5a957d33358551d3ebd4c8a47f916f0350a31a71c23d4254309a99b2b6468ea176408d22521264ca81060d1111823c94d0fd0f14a359736b3a9c223490e0b35672e16f2e0881bd9a263419e4b314188cd245a6dee528e6a1782d1b8907927d23ddb4f209a6590636e28d6c05f19af2f0a89c7f4b4cd6b9b0963a695fce11ee98b7610734305192e066e9094780eaf7796149d2a501643dfdf777562c42e3a46e45264c7e8e379b05c40414c392a85235a9066f34bb068f8b4cc3c0485f9813b7a8a3261b702234249f72ff85eb19cb7a8209d16b8948cac501f1fd4f7c893b544f2f1eb3854fbe47fb01171a00c1fab61052842f8a8ee2880891672c64f0a891b26d59961623f40729c713542988b638021d0cada31c6be0bf65b7ab26a457dfd758de6137a75399d91c2d4fd4f8a528afaafc22018744691e343934b83dd71c9b1a9eec9742895a6a0d3ff08eed4b047894cccc0e6da23299f8083f80be11739b0313967b6acc591ec68bb2fb34caba80c28b6e69c4900eeac376314891752e27167f863c6275e34390fbe08ad59927c0d00c285f67c7954f1e78bb85feaa37a8ccbdae4f5bc8a7fdbdb63e078d9de55898c62e0f80e805b04bbce4b61706db6a68f7972eded64c042cc796297749866b7dc9f45c7e00288915e02b9bf3f15ff913770fe37553c2bdd97918c3180207c6c2d8093620171e241d0014a94c398f8f717f449e74804dc8d374627fe4acfc35e9004b8505a24c44295463e23c4ba9a1a08baa57bd2df9558e552af7870db3f54cb43b10596d93610d133da30399651ff8292243a98d7ff989c35159345cb2826cdad5d1d7c66ae3e38ad080162c188d83e9b9c63488ca876b23ddc047e097278374e192d8eb912eef4abe75782f7f9c2c74cf82a4e867658427b180d21374547e19a76d89b5a45dd072a17f80ad065e00928b281f69898cb4c0d0b3bc2bc81a0e13ca4ec686538e4a8cd308caed023ec0b1bc4632326cee136152e16066bb8bc84742e66d0c236f1c30cb73db442395189708d0505736c48983dd2924126251ba6c5b0d41d798c56b07bd2df110a5c15c2220b211eef028460068e1888321e3b101052eb3d406721957b047a45805e0bb81de1ef23e62c12491e1189715942229bb974642a299b69d2087796c195b40701000000dfaaaa8aa4c914571dea1f7a20765e361ccb5e31419d9e3af98d3b57df7637b3c6b7bfed03718bb4dd8769ebf64ff6b7cfbb6346bcbbfe8a3ff08e19f162463cf87fab952b78c78c78d2205cca788483060f9c2332e9b6703a1b74040617693b269cf3254a9270ce911889e49c1311028473fe8373ee8373de8373ce8373be8373ae83730ec939cfc139c7c139bfc139b7c139afc139a7c1399fc13997c1398fc13987c1397fc13977c1396fc13967c1395fc1397fe49cabe09ca7e09ca3e09c9fe09c9b20c1391fc13917c1390fc1b923e71e38e71d38e78d1b3270ce3170de5de49ccb39bf39af391fdc72ce0767cee544ce63ce7916fbad9c7bce3995730a9c7344ce27701e81730e811772ce093917e49c0772ce1ffcf13e079cf3065c6f4810a6021b76edb4dab15681ccf9bf10dbdc4edfb7edadd87fcf7b79bc026746eda0c95ef143d79ccfb35fd3d633ade2b7d015d8f557fc73bfe36e73b377378320ed8b46dbd8d2086dfbcbdd8ebbda96e69c33e09cbfcce896735eff2dddadf1fdb5d93baefd1fe7fce59f33e10aa5419dcfb3b3af18dfb136aeb70738e75de00e9f9c2721bc7db16be7bf3d3656f44a73ee994b5bbbdcf4be7e790acbb4b2d092d0f20813da6dc35d4ece5adb4b9247a0fdec2a7fbbcbc9f53b8b8d7fd6f9b1f08f30b867270594daf5b8ce08c71638e72038b3cd0fefd6f7fcd1b65efb39e78d9cd9066146fbbfbeab68f69765da3ad7e72f23beb16de159db67a351fb6fbbf774ad4d8fcd6b4d06e7510bd6ac38e78a1c4eadf1dff69fa7f5bfe3a9f56f6d34eb575483b1b41c8d6269beb4339c0007cef99433d300b95d3be5f8e62a19829a796142d740af30a139ba5c5cef512a768ea9fdb6fd76f656bb76d6ff8ed15e16d03efbecddeb9fc5c6d96ec7357dfbfadf31e75c6902673ed3b672fdfc522bccd61ff65f0f8d30ad50fbefbddb8ef9a4b7ffb59d2c7bbb6834f965467edb986786b85d3bd9a0cee79996fbeb9fbdffcba5d2b6332728a4b1a20052ef081f3946a4483272a680f335e713ea7c9ed5ff7ae556cf12adb45ced5a3df6f3317aadedb1d3fa6fa7ff5fa7dd3baee9b8de4e19bd56a6e96af78e6bbf9d76a7304cdf76cc27bded589edaf6b75abde0afb9b79fb1b10dc7d339f659ebcdddceb1f45be37a3bb53dd6eefec4e9c7fa9abe6da95dc37bddfa2bd2d61f38a808c7c6067daac1a501eee1f9dbdf05beb1b501eee1bd713f4c5ba736f7f6b73d87a5f9b0b46c7bec14fe36d7df1e9e6b634bd38bb3fe42db1a6fe9dbb67f0dc37ead4def5b677a668cb5f6bfbb75bebe19ff5a1b77abf5b7fdb5f10d7f9b3bb53df68eb5b13cb53db6fe552d776e634b23ecde32d71a5faf313cb5b1b47c6fe36ffdb5ededd9d7f74dd3f5f4dffeb69f6d50bd6eed636b7cfdf3afdaf5d76ae936b634bdacedb3d37bfeb5dfded0d2b45ccdde5f4bd3721d229e843dc169dfdf1f5f5d57f0c69da084735ee54c0452dcae9db01c73ab6d4e28d49976465fe7f8eccbde6ac37fc6c6b69dbd3d60199db22f1c9effedbb5d16049e7f996219dcb33776fe72bfd2fdd7f4f5aefd6d8f69c0799250324f524eb625d5e8cc79e54416a17ba5dea72365d0b61e17d7a1643daef70446880c11f2ec73fd8af30f9c69a089dbb5936bc735966f2920100c2bb3943a8b6fee948a706cc561c1244f979038259c356a59376c9c80225d535e4981b58146e16e920a33a50f2b627ae8949173ce08284d34de39a070018819105eca6d24597f535590a8cc4a49d88759e3910e1b5137a2940a6a307becf9b3025af62e95fd4c1821e60f43473348ca2513445210724267832b5132d014453e3e203dee988292671ed5c8f0a60790bb383d492741dea0113cccb304869c640d3c904de4c4087b46d7243bc8c09280088398609d31c9eb985ea6869a43461f5b927c232021ca3a3426c54325097d22c78ae0e01f00ca3049622dea42a3e62123c761e40bc9478d2c6b71e04e14e8f1dea19397a3ca0cc8691e1baf971708981c0e100372898b37f20b9b20972f3010e54ebc2c424c08c162420d2e591cdf4526837a7474e7682d66780f0f39316260a22111c4fdd6edd0f2984183d06203f93d00e71d04736d5100825f29167db1d98fae3e10383fb405f1cb519d852f1a83dccd072f4d29b888fc389c574142e7bf9df85224c81ddf2180750774cd964707381f91e3ef80812c1a63786b5c1b409ab71e44fe3466391754b121ad0c0640875bcedfaec42883010cd3d512cec13a2c80636ce4c2c991736511c6405c22ab3c6a921f3f6b7c30f97252191b7490262d41f3240b029ead6f9668d28c1354c638d18023c6089ab481ca9e269845932b909e49d648229a1cfac0c34cc999b43784008119b1cd42cd9a494e3d87cc2d081228581a33c96ac6023c5dce60e010b945922332480a107e28d4091549754a34156a6445c0552213495ba2dc6d5ba80852c34ca424218d844ccd8cb835b8e82149c58f3a557240d90345850d49771d478b04b6651baab8902401861f88132ba418203c216901182a93a86b589e828e920a88a84e95e40c0d4c6490f4d4a449912043263542b923114284a7510b3a5a0c19902305c083c81582d414ce22389294389132010d551f8e8791205b24e62833a500181883914070997377804b0d19297c91121dbfaca993a6cb020577910095bc611f21605392222e121ba1b52719590822f7ac45ea820c61864c0c2b31129945e26d6e10620a78887a210089cf230c40f49b9e8c3f2f4862b2305db4f53d2a74b38294c4431c5517d14919c32848308c8cd95b41c728a89db4848401908db1c501834c888104c9dfb010a9a2c80f304d1241ca53f3e0900c4a48e38320486628ce841579e400294e0fa42600852b084913d944c979b468d2621248005091f3b7e6911c225b49595e6874092369cc232c7cb8cc28e5b8f0ea70ceb91f1fb34fe0dcd3f275da8d61342d777e76b9b9ee6ff9c3bfcff5fa676ffab9d6e3ba7dc7d818a6e77708e7dce6ccb0181b57d1b4dcd9e99412a0ec5202d0b844d1b8e45b42d05f26451d983f1a9594a2980cc0e9b0d4015d6645f520b254a271c9e784f5e4a5f5a1d129c25282120cea5e8a6aca6b7a5b7a522ad07a5212d3d804a5d1eab083939b12c721a83a8d4acc0e5c6c1aa3ee31001a9db4a6924c0a94d0945c8cb882da8ae16179a25180980031e55913ad49ab39c9835282a637a638a500655c538f46651f146de96929b25109b5c4b53483822adf65d4d2ec294f2901538425aea5a7a50a515651564e5a4e584c1194913c2c7129917850fad258a0c252dba705be96d128014bcde5ab3c53da2d01a3b296924c864c5d4c7e4a5753ef1294526919a5542a934a266593d2e9c96ba9642264a21200f8d4645a627a954ccbb525daf26dda527675700a5322d23815d9a1b9b4ec6abaf3b0ace3616cdaf924497ddeb8417306cc172e5670c5235edd0239377a263408ed00534013d304097f7e93caac4913a6e22923061da751a78d192f569e1c0182e63400837babb06b45860ac909600d97261c3650389400e1cf8f415e1858161695291c8e18d9a061fae545cf615375e858d0364e92c468d1e1842cac661b2f5db05879e224898a1424a6142218fef9ed9929d3854c15197a71e098f1c2c50a003f7a9800f1c150a136015801808a12c7c60fefe135a50aedd153070c97295298085981e2c3530a87130cf7f01444cb9a5266ca80b9516385e3872934d8cbc353c0f7e83153264c972952982411c222852362833d390551b73568195573c927edd143270c982e5ca648492284c58a14281cf14c110f17a039213de27320606a8ed7e30913100c9f3b5098e83216719aa494948ca4f42839401391e590a4902490372d095d3e5f27d4993281b2638525bdde2e262ee5d6abb5cc7ab19caaa8a894cca580a829a61457d41694d753d389a9698929b9b4a4a4a47cf992e35301318d4c4e4c4ecba9a6362627e557d46007bfb126b2a5a7a6b76594807719b5345d2e2aa594cda59b0f341a97a6924c4e4b33a9af37238d4f8551f0d26caa4372ad4b8970f92ec5656994e3bb6b7e482e9f967c658c1af9784070a6c3ab146d86d175482eb99467db576c4e2941008d4b4b61808e5702ea4028197410d1b8e564186515657521ef6adb643f2d6a8cbb9d18505930999c94524a894b12273a342da796be5e016a1dfaec7042c0c6b1a9518ca92494125d93096ee9e04f40e2a14a89ec29efc9c0d2e11201139c87283a187818a2028bf97494b2f295d8d208c5bdd6f8209526e02df4522a60da6aebf0c404b7f4d434a574db63a0fc7aca5bd4f8c4b42725d8a4d78597f7e4a4172508c74569cc5a9ab53d2d45aba4969ea0f0c628fc687c6ad203ab9a6854523295dea5074b4f4a0a9610ccd541719d0e34e92d3d316d49dd391158fa3965597919e0c242d094c041a0810e4f4d4e26352935b73d40a6a82513975254d9e614b53cd0e9989c989e96684a0e966f74af5297524c09ebe9d46455c2e129d06a7ac27272eb60e707b5d644b624b024b034a411c1d4f24e298112981381a59700a8f2cb43a313ed555e95674ba51286310a2d00a0e72346ce5c417264488f121c3430da89d76fa552389400a190501090af815ef44d8dcc4081017dd985cb244282fa2c982b30c6b5c50449660c901f0ff01644bfaea2a096b65091522408901e3c7440de20243b80e6ac4163507012a444550984065999d24d162ae2eb9c8227a6202b1edd9cdeb81112240ad7966505f5d4c4e4d5f5c4c9e187fffc1aece5e145d7a06554cd29a9258e14244450d961ab72c4c8100e86856e6d5a564b34671015cec9b539312d25092145c90e182d4c60c88103878a3fbf390507a2de47ca01928d9685faa0a49f659fe41d253b2f9c649b241ba700a2d624d124cd24a92493288f241397155e026f58d3979297d456322b79f55a35ab94a892cd97b99c4a42293d259d9a9a924c4c4ac9e5ab7cdf25fec4b9985b805faefa7b8eeb2d73cb8ccb557f73b55b4ddea3f0aff62eec7f2dfbbe45baaee9ba2ee3520332ae64c839bf39536bcdae9d73fdefdb6fd1eadb666a85f5282fd448e54c5a26bee44bb9973341beb052f365e2025e25ac77ea6d4a5bba71a58b251853b2a94969a97c5f9e9574f2247f1f2c17bc9c49811217b0f4f2f77d9594d6925049febeaf32a9f7be4c6ff27d954b17926ff2654a6205beefd2cbc493af9453995c5a227beaef32995c3ebecbf74d3ebd8a92af13577a9749e57fdf0ac9f74d361126bb926f7269997c0325df7729f93e78b3de57996cd2a2a4649a7ab1def77d9370c9ab26e57be34dbe4bc9f74d2aa76f72f9e4b4968c7ae79a5e25024ab99729995c42954fc9e45b26a0edc5b08442e52901937cc9933edea5926ca9947c955ce9c58be7e549ce6432dfe43be86d4a2278dfa45232a97c5fb517ed6d7aa392c96472c9ee3d904c2e93ef53e984da6a32f04a51712563bc4ac9ad77f92a5f9e044cf6a777c993f112efd41785928b6979395d97a4f25d7a974cafd4ab94914c364595ef9bf24d26973d19e544f62abd2fd373090d7bbec9a7a5a624d3fb46df64328e72e9754a2e958aef5892fbbecab3d7092af93631bd49ba2458122cf9a5e44afe0a789792c9576ac9542e935bc964f25d7a97d7d789c00ba5947c95de29b7aee41e139453f2ad36453125df076fd3fb2a93eff2d57bbf927049af24549229a9f42adfe49b7ca3ef57122ac9b47c954acaf7757b952fd9ebf446bdefabe0054b3e2999dea6e59b7cdfe8fb2e6125adde65f2555abe7049a85799047b95ca6472995cbe70c9e4cb957c7a9ddea665f27ddfe8fb957c6252becba6e5fbbe6efdd542d014a74ca0f42a5fa777a9f53a3945a1267481bd03966f32b99464fa2ff3ea09a5f7bec937f9beef1967e25b2e81c35b28c220de23e8f0732682981e41861e8f11c23b76f8a0181c2ea803cd17f46678a00e2a3702c5e8bf073a2a1402f46b747c3ac010e979af279c0e2d34383f45c4ed8e140137b1a7b7edce1ba98d3a09475b97c49dd4476067d42049333b3f68b3fe449000d28c5018b54785f52c2a0e5985c8a94a2b785f7ee05cc90fc938e7809c730d9c6945c0df1e9e7e98b6c633774ac0cbf75e1d0d397f170970fed652515d3218f617cac8be96b6a776ec2c23ab72ed29fc13ad3f6b75deb37f93fc51160c8cf2769173feec73dde6ce31576c323efb5cbf67af75c2338df5358cd6c5fedbd7b7ad24c8682a87509944b300721ae57861444885ecd07744286b0ca17dc53a69702aae4e8d84afab360245ba5c91185062610ee0851b01661accdb443a805da8aed044b87993a306408d8809329c195ece937e7fc20c287fa871d8a24206099c2d4b394d6acc281234e0d68326e0ea2d92b2ce0c27e78bb9976bfd29ff2c7094080e901802cc6f02c0562a84bd9c2f079d69a513404412eac0391f10e2108d45018d305c49d11dce65c068e402eae8f81b0292f3034cce957e38e730e7fce9fa616bd5c3bdb9b5b1ada9a5419f88139eccca9ec8c834740d4f664f187a8f76b38e2101e71cc152524021be5426f9ab3ce49c3b72e6d4a15d3bef9ab665d96b6d34f8d73e6ba3dd356da37d6b2cdb7c9c39d5547fb8a6bbec6ffaeebe77e5dbfaeb9ab67e1ab6cedc6b9f693baefd564b5b3bfce15891aeb767f5b7b99cf338ce94dad2e1994b5ffb59a722b6a975b3b409d4feb1b3afe3fe63b9df3657dba3f71c4f1963d8d7d3fab6a75ababe72cee13853aaf14af79ab67dcfdef162af3f3cc75efbeb7f7b996b95bd952975c839a7eb7fa177abfdc3b1620c77faeef756fbefdb2737cc5f66f4daa48427def3f99f4da07271fde99c5a3fcc64c9f33ac77ede2fc159cc0507f718ecdd4d19ec094e2148fbaedc6af60cefece3fd37aa0dea7d723e9d55f85a979beb6564f3979df65dfb2d9503cf03d53ed7119f13aedcea14ce3923673ee1e16564dd7babfd533b765eb95531eb87d36ef98aa6e5ce4fd17efb0eff446b3cfbedd394e89f693f6a9fe9f8defe7133ce79a1a7a6fab6994e6eecb82f71a69310a6930ea61306a6d39653fb95ee659dacf70fc7f61c773bee77dc15746b5ffbacb5fb7ed373b7e37e77ab4e7f4e0b9c14309dcea8d458b6cbba5c5c27ebf0fcbb5c5c9f63ecaf223a9dce09900471dea3cca6304d4b984d3c788f3ef5e87dfd72ef4fd43b8b8debdeefeb97a9f6cf5a6faf95139393e39c9771ce97bc096636dd71deedf8676fa71e063877aac1148473feb9f5fd6dd95fedda09d3da67520a0edae77a5d73ad087ad4f670706f706e706d706c706b706a70697050b8271cdcdbdb9bdb5bdb1bdbdbda9bda5bda1bf4edf906e7f6e6e6e6d6e6c6e6b6e6a6e696e606757bbac1b5bdb5b9b5b5b5b1b5adb5a9b5a5b541db9e6d706c6f6c6e6c6d6c6c6c6b6c6a6c696c50b6271bdcdadb9adb5adb1adbdada9ada5ada1a74edb906a7f6a6e6a6d6a6c6a6b6a6a6a696a606557baac1a5bda5b9a5b5a5b1a5ada5a9a5a5a541d39e6970d037a81bb40dca065d83aa41d3a050e8130af77c7bba3ddb9e6ccfb5a7da33ed097d3e9f57cef99633950a71cef8b46ba7963ba3dddaebaf696b09a612004c251bbd5bedd839ee37b7dabb1dffecfdadb357843997c0994a506ed7ce6a2cdf355df59cf3019cf331ceb9180fe39cbf719e5c931cc239a772e6f2d1ae9d37573b05e39c7f71cebd38e75d9c732ecef91ee74a81699c2bdd7daeec153bb5aef1a87df67da63bb58c6cebebc5991b8dde32d7fe81d40e7f59f656cef916e7fcade21c8b737ec57915e79c8a7366d2a9a432955498ca2b3d6ac33397aef62bdd6f2edde97b7ac7f2d6ee7271ddae9d4f279c137a66ffbb2b804b41dd5cbaebf938e79df33792730ec5f97b85737ec899c92d76edfc306dfd30d4c9e67c9ebdb1d955b42bf4f96483fa6a352d0d76835edbcee8d869ffdbd75667b7beed18fb6b341a5b7bab130d4eb42e2a7e18cdaebf4d88c6399fe23cb98173aee5cc641eb76be7adbddef4dce118ee5affebdbeed839eecaf587676effd9bbcf3fbbd86bbaae7f9f7d87ff5c73ef5fdff3d77e79ab8dfb1dfbfaeed839be6fafade96bf79c7327cef9dbc439675ae29cd7745de371ce9538b7c0996f1ce75f71bae8eb2667be9d73be48cbd7fa2bd2bd7bc756bff55648feeee09cd39cc91fb95d3bd1bab5afabb18c66ad6db46a2cdf36b746abc632dad399f6e6849ec95e1bcfb1f6ecb6b9f51956cbf8d4d68b8b70b64256cbf60697bda09dd7d4ac17e00b895536459811edd7f46da331c6331ae75c8a33b905cef91567f243cee12fc7fedaed7f77abbd5f696fa565d9f76e4d6bbf9673fe7226d7e29c6771263fe39c5b7126df9abfdce5e2faaf7658e6d259bb97753b26eb8c1f9ee33ed3f15d7f7b8ecb38e74bce7914e7fc756a41058a5f696c9472a5930c1b50cc476656892c13cc64876226478c6062d05a5097ec2292219822947ab23b8e08917c5b2cb3463043886581603a8e28626181343184524ff6104a63452c2c905ae057a4cb37f9a678662832b8ec4b3dc3b26750f60c450699fa9b8187e875ef58860d4e1b98923d4b0473c3db971dea492c2b047383d3d8885ef7f6a6b10d4c634b631f2af4e79b7cfdf40f3d51a92795c6ba0315cc658f83e216a0e426470f1d923db9542e97cab70914efeffbbe504d5d492cf1ed4b169452a7e592a969c9f4b4543a31313d55503e358d252a97cbe552a95c2697efdedb93bd565476a5b19ba92bf5778c4e2956218354a9a92bdfa69e7c4a8a253e398d2532f5645f5af6a5ae5421d9df44a6310b4ae9d24206e9b242b227fbfb766e058a27bb124a2965ea5050afb44969a9b814b3a0257dc5926216b4a44b63b752ef5df677cc420629d358e2b227bb9252574695dd82549aec4d6f324b8b57e946206b05331ad579d752ba41f59749a984824a422539d4d258d703a7fe9408e469ac9bec409cc6bacabe402ae621f9d63526a398c41c97bd51d9df9e4c36f5a41460535f8a392e353cf5b78943a358880575caee24e638e2ad53f6100bea965dc924e641e918d547f4baa7ce24e6d8a8ecef98e3070193264d9ae441d99fc61a95dd69cc7144af83eabc51e941d907953d099874121bf1d639f526b1118e2116d439f5116fdd53874a8a41f52514d49886274726415e0735a6a1c8e0537fbb06a79eac7b12632acb94ba9358882216164c922e8d2502e9263b90eeb2330193fd95ea7a00b8ecc9e4522394b2f3a5e652e773a44b1657a4c9262e95a71cabc03b53576a922a5930214016c58333f1a5e6d298561ce972ccea85914c42312d259b66649cbf4d4a2d2f142bc6aca0a2ac52a48e2f41f1649b85071c6abc58e3a18d0b218f1eeb94fd41b247a3161b889258d95397ec1c011497f225981591ef0ea8261eed7a3b97765978277941712c454c0e66850de92b6d4ab671308f91d2b74759410948f657d9b9b48b9f71a8b7c9494cd1c2db487a7b68945ae04b4de6722f861cb1bd187692645c2996ec7b310ae5297bb227c7a44ba93c25df8b512849e6c4a34efc8c77de3b2750e16d7c973a975658ea7b1b1ba54b9d2ec9c4b4b4c4c4c4b4d493dd2bd9562fa54bfd7d97c4ea26a9d252aaa434e6c5b9a31490d20a4c1491d29727c9c640292d75a56ec5a4c5d4957a57ea04da2af033804abd4338e4dd496c2dc9c6d9381bef4b62666f4a3daeee4dbe74a0f852d32af9bec9f7957278df2e144f64ea4abc4b936f32e9284dba4525cb9696969494964a4a7da9546a625a5a367b924c69a9bc02084aa94339292965979d3f3d39392d3129f52625a5a592d21b682dd9f6e416d5dda4ba52e7031c846043aa3425c69d1c8b402df52527a7a5a7a7a5eec434d6c5d4c5a4a4b4b4a464e1954af1b364bfa394cda824591318145ba4159a96bc2b97ef929f71a91128ae542a95587e98894d5de9996ce3d1337acbbe4676229174d9cd00936e514c62566215a2a44aa5de9424532e35f1312b292993180773c28eb449ace9edcba5141f07e9d8d253d32b49d6954a3bca3f5cc40c9b7a17ef4d5d43862281bc8ea98b8f092efdb0512a95cb5e814f5ac17c3b2187ba65d7a0d441288d895850b7ecc964928f95f9f625679e91566852bbf25c22512e9f90d20a0204f0e8e3894637656f11294d2ae12dbb15d9ab7c95281abd25ff9463cb3109cc0a4ce9526be90526c5a374b9ec6fc9b638b2b70ed2657f2a354a97504926290793628454991c5b2a97527f496652b9b481d586c9c1982824ad0097345b36d2c3cfc49125978e2718956ebcee75918493874937a5e55ad24dd9d8d818d7d8d848a68cb24a0a72b35c2681e2042af037b99cc24c76be8499ec564a98c9cea13093cb2454126fd99362ef9380ba0d4aa8a81acca5eeb47453b781378aea9c775ea6eccade97cdbd187ca93b49152e2ddd18f03265af1095ec74514c1e4d763152655f72373b02fc4cd91944490bf0321acc2c2875cbaed4ad4030b3a0d455e0859a94a698965e0f4a4b25e5b22795636fb227034935bf4926098a420102064dbb808151d1b1250c4bfa5588080b357f183df1f123310cdb812e345f66b338420fd7870ae612952c169ad53af0d25393146044742b2cd91c89b89a12438e0945f510863f865b40d82dfae942a0216a6f3be508579e224d7eb820c4c31c20c581227cb87ddb327c2b467835317205074d32834a0549e6add304d0803c5b5c22367c4d8292b5c7eb0c79c09171ea305d18496345cd140ac832c52e60829c12ada2c011417b49036d525bb3f8030854972d3f0fca1c44e952a5011d98178f8065a030a16951cc0c7ab5f9653544ba90d641cd4a8e43d6ae6c801d9ee48d0c6eac88356ef1d5a91344245bc1f97027676ad09f3a619059547e0a31e06a12c0aaa21ad2c3b06acb54221a1866db064e50880934e4c713ad26544b5c1e3d39810843e7f8bc0084c1f0148e58bce083beabc8a5808cf6d050d5a778d52012c80fb228af4b80c08f325a5d0d8d1b86681654a9b9c9d29e9df10056d6d4e1ae0897146e78992fbdeedd0eaa373e00c308aad165c01bd3f43908c327eb71aa472420590c655cd1b1640747951c5f37959f5c5389001b0a81d193d145bb449535b1e59340c01aba50039969862581aca491beb0266ac09830fba27b3241e9cc4b4b043b581e7a53046044e0710fb40b6373002d33ba2e52dc5b8a221c150bbca0b01871b801327a4c83e68fd50ab5a93c535e585cb81460e33285b04668c2214d0d34cd140a6ab84963024b246935e93c3aac5786c278506a6ad1da8984e34a8c1c1254ba66b9b110856b7b11e4946acca9894cd024c087ad85223b45da7419d081e9ce418dab392c4b234410def43d89f47b57143a708101b2e4c9134d808e0231ba352438196302d0742670c357bce5c986c8572b49005602985862bf7a6c61db43c1f0a540a7011799005c1af74829b2a3d0441016272fe63023b8a8b1554116a54117748923aaaf2156b4a32c7c4a0ef5b1a143526754e8e36acb44a3b43a758ee8f81046831036333f096183162d88d1a606093d55beaa3c2cfa42558a22f401800f9636e7a2343368891b6d5a8790782390163e485902c0133901ee3e84a11d5ee0d243a14708d5c897cabee851a561c618402d04237fe4c893c83ca2082d44be001e61044e0fc1117387ba4cfc80dd747f7243e0ace8cb56f03ba2353656d514041aa2c4171a677c9d8533faaa302b4c1a393f6717b038765b4831868143e4ab4a0832d5b73716f6c46074864da4158554306e3a44ab883e681b06c01382c2053659714dc09b4a6ce7118528350e2cda32f10575d5634520c708d1b6ec6b08518e415406040811472dedc996eafbbabdd929c24212c4cf8a49937e930b1da42096060f791daa1973c261d282b137622bf83000e46c4a512a5222609208ae17268fd0041d42c422734404d662522c08b703ee911f67a22e253fd0f8bc4db20bd2f4f4e5029e6892e61f903984f2e428b1a7b454858f0c7ce48ac78a0012e58890e3e4e9c990bc0a9cae28c5065dd408d1a3ca8223e20b17e001b30f984154eef6c840f9f9713187bb10bc12a3522191f090ce6f6c87142bba2858ae0a09402c215802e88938c8ce00ec8385e96182da003848a8e4a004884dd33cbeb1da6168922034875863fad2fc79e2854dc09618231cfc282df1e2e019f428102519c80ceb136048a9c290191b63bac468a1e3b63ad00505b8b307d97d98d4488e91049aada79fac9f178f7fd6c09316f1b189c40bd330f6614c8a22027b1b1620b21365585865846d8522266fda8a0cead348667202436b469645f69800c70815742c12e1d44301d81535260200b5f834970637d918a906556f1d90c4211b613f8edf88191c46f8692d91c191b4dd8105816308acd4a950056352a2a18d892a43020c0c6942b7b91b806a8b99143f9c085214c28820c9e763c22b4b515903c2405c08b26143b4423dcbf325e8e8a747039a6e564c9626686f708754836949fccaec087487438424721f06c0c1fab300718707073fded4797e9dc823e88c170f156c5063741e1f0b211128e4e567d9e403d7c18022315c12da10636051359558532f77b64be4ec14d29208521c182fecba18457933c68e5404b34487e2a832445d342fac21eb514d8654b6b2be09143d6e5cbd21914626e0494b240c716e9005a92d5d7f813628a122e374d5672dc510a9076bcd2622343407570a1441d2f806815e2096ab427a80476048d0b6bc7408b8e1602d704542398ac2e7305ac70a4630b0f9f6318988c86085e6a887181c886baa1a409eb162134fd852d0484a1208457b5a5f7b4bae2865923a251635371ca86b502050038fc9c0c35f02276fc20c72034407179b3b515611aa7816f578941b92020d097f6286df163da506933e267d5769200245216465479898211e747831aa040e07ae41128f94a8aad360450f394ce4bca960842cb3eb73a2d5e6ab6daa0a4f55de92c22f6a2ec4088445e9f9b042061c195a54b30b74dd326d55762a4d74d2881c02e2bac6641d44d1a3554715028c950a5dd4408d59f14021082258600cb20c68788c22c804a2ab8b026f2a4438ba7d374c240eda5952e0c61b4424b29084c8d2b11c948740ab0e2125c06de2970d203748e495b56192230b50971e27425075f093852b068e813379e643540cb45993355645543577060908af0647129f28be78017a74c4cd94a39c1f56c40978909244a9a8e6f4f571aa72ea23892b025495415cb062b8d041156338c6478224e457a482a2975c170c144967562e68704a3006814b55f3870c5685434e8cc81405a4285ac46086c5642a2023448b2a31921c2953124004465d2e9a06490af21619090757a2b01248b8cd38102fa6650364300f67dcb4706264efcac48f019c209219181800620a4a8f0871b8063d46819130804028f21a7825b30d6406c065d3196416e385182b881ae9ae6a574f9ec946c8932a18e68e14a20272b8c2c5e788306ab040249ca9098218e11c4898dbae000e308971a249cf912d662e4f19ab1363612ce8a8423f4d703b03c0948d2c5b471268987a320b33e690d2160158d81d624a617092759920e94a965d0d2b0c1516ad986f1c29617448d2f6cbaac31b1a78575b574cc6b02684008822106107206723214cc2208c033c128ba838db3ee979a10c55c9b8e7b8e93280af9be1ba54a611c8a2d60616577e8c22c362c4e130c24347330886a38dc68e26310e684833adb043889290aa313cdd47920d8c467860d8e143088f125981680431f345070b0e9f04137f5651f2179f0e82c93d84361eeb58708ebd1120820a0953cd1d33841de098f84125002f429a641d5e35c1b14380e781f35186827331f6a5c6e580a946118d3d17d6444c31394240b5a0d00cc8b1db6846a6aec96e792405cb8ca0123e0ac4b8a364d075f2b0282ac4eb439f227e73a437775b860ef22c0123d84cb31df340890290302ad8a8980111d76031889af4f39c3ca8a236466d4f0f77afcbcd99057332ac7ccc1aadd07921b2a8d1c47a3820226c8e8e73667144530a061d5758aa49b27da6a0d26c795101ab8c8b4417740aa2968e268517ae942d3596f804cc49575c331279701427c485943b805e53aee6e0783a0b3c9e9850e3e8cf8c1e030071a57874f49822cac7fca511cca5ccf4306770d5180082973e5faec65c63539c002b2bbeaed1204777e65024a7fa9383aa2d42702d9e20801221c5b36e4590a8396d986c1f20055e58e2d6884e590da7a6272056757a1e61b7a84a8cae98bc621a48016e09e288d2d581c274c7114bce793df6080b02e20b9aac1f4e81cd3f7564783021530546f08607235eb8a87100057325c403ae352588631e09dd277a5f92e29e40f6d0810162f1c30baa5580ab8006317168e83c5605d6008206c791aca7e19c634999804beb40dd8a2e4b12e440d236c8f3f241d11d3068559b9b08432e148cb0e1a60b238a404527f2c5c36411241f6c55260775b4b4b26018262754d7a694f1208504181b3a5f5f1804653914c50228cb8038c1f5c40b1f545adb511b384a5a9442b1293d6b8e88aca6338dfae4fa70c0121952e6e76bcd1f2f314a6d54147e2a85e18249b54083014d4979a490201cc61921c9ab501543bf42ac0d36a830cc3755a25c0f334145c4027981d965713568662d4949bd1d7053e1da64f167d0766e60c4fa85cc4eab4f5de315a31e15a248cc8900494a9a601db1aadec545e1a822721009063f00f861f3c7d04fb38cb17e2386c9a03e0b8b0f423c6063e8ca66a3e2716e47991d320114e8c387af08d799316ab75f032611de06b4af53c70d330b0748322483903c812c03e24682407dac10858d489b83e0700f89e481a5229f3b5c687d2a2c707127020b5487848b0bc8194cc4423bb054c068b51074328221831eaa155716f312794401ca81315c5c875f8c5b2cbc44ca823540db156aa5432222c0268c5137529a0d285a2601e0f403066d1054d50091730b7420bac081cd9c071aaa24f2a2e5c8b0cf4c896d84b0312e7ccc39b3e028ccad88989d368ac65a89626690b1cc629587316b61081ce002d9668d980b311d9eb4ac1ca4908a409f384981297324c9f7816598526170b3818098070a6e460d8e20aba4a624a2c0fab19944c5854c8c1f9565161a04795b2c63270068a3584b1a4b54fae272bb893294883608c5a0802a4494ba50d588999ab0f04452a43548824d893c36b2eaecf4c278d5a852538823f9ce6c7cf8a25ac305894796c8328b96595338250faa045b1ee7f08910f946c892a2c6871d79584e9a34b99a16ca7a91a8a5d5c125dc78c1d631094f047965f15a20294da422299a005451c4a804d10a470f804cb2a373a28be5d4d66cea20515cfcd19c64c5062d46979426332762d87071a502c606385053323407f13a3ca183450e8a2e0002f418103aaf8414e229c0a61644e2e6ac05570404ddaeaa481a47f8a6fcdc987a63648710378b29c8819d222a483ca892e5a121e88510b4ab0314dcb84194e843ca12af0e40a6545de0b2d0a642c0334f45d934cf8ea61037119821b26cc51bccb6ba7106e139783af06615a4cea165ce933037817fd8dc189364692b8d0a064c0220d0a70cb6071fde82390c9803669c40a3e4c6bcc3bb1c21c200109f951987424a798e016cd1359a00634b4f9d2db71c82966418789aae68ab314052c80a0321a24fd31cda09465c47015c23b837aa96dc85be813950b884d424b62ff63c6841069a6dd8be3020266826c1182935f2807db93ec1112585161224cb222b7feae254c9d1a565f192084418a72e1c374360c068453d2eb0bb8680c4997003c865509c0230014cfe0021cc4d2823656046b198065460ce2461e1761706481fdd24ae1d61535919eee62ce27215e9415f3177a7c18f345f130aaf6ec509197c649ba4987103300455842b3259308ecefa780bdd9e0c1cc42234812e0ba4c5ae8723d3269be4f3c78b481a13d1941786514648fbea94903c9a80263590412857a84611d999bdbabb2bd6b7f23557e144e48843f672028b001abb2639f5a450426b43044d00977ab1449d26070d7e6eb4c8f10913298e832de164cc559dc31d291249513550d91228d5c21cba0cd5c4a4256142b99140d115cd972a389a588d1426191962571574a9765f8a1fae0ebba2151a84cc68184328827ad610e05a42e6826e0434b89741801f593a4e66cc238e0eb920617117196435e22dc1858a551c464b18793d69be89670c7905584cc045a50832511e3d6cfeb6702b0fd9358a980ede38ce98a2950cc1698c42d30104971505337bac043e79991f74a6d21d3ed42dc50f75d00ca0e8eeedc95a314998360a5b4380cd00859e6d6c50c8b2e5f464b4a84a4f8ca543366021b04c81fbf301008d01b4e650f19208ea07598d8089870aa7144ad855024786a6542849c184c489da511a03555a0519da846c9999f10c80911739032068e99598702748b5e3a0018a1b458d99134c42e4a1abecdbe0f4d04f908c012338aa4691597d7ec0da9419481039321bc031cb499baf1e457e01357e3d1931c215f8ea71424fb68f97e4ef0434b0153298a942b899c2f228c77358c32a232514e4238b2c0595054555dd3aaf57073444b065bc0e2589315543805088c5ba230f4b8a852acb88a49869d1aded8d0e5e22993f5b58376800a0dc2354527ab962d3058b75ea85f76a1dbb86e4dd4189c3c768818a5b9348d753af6890080811090162185cedc0bafaf3a582edc6d21e2489820068c581eaaa61851129977a39bc429015c9d124d394828565ddc153c46a41cd1bf94362bf5af17fcc81330102153f3d335e7ae0f9e1526485f902f09033908fa38c82c2b0ca7c13a30262600c44c12f323c828d0a715c098874970888dc1a103d36979f45321e972024185034511dd0cc517187c71a5321f3d630a7ce1810340310740558e28e30ac56dc202c0cf4804ba222ad2c83461f53b69c2c8744fe30d0d6e510050f11a86610309b590011e9d3064f9c2186e6a29c0e18acb0d47c14de2103478c36420001a8d1f166abeb4a8a481ad2071bf4903870a057e22fac8a4489e115343ee6c09143018c2b324fd50d23b4a29b0f4c4382809192e64ce49416082ea8c1143cc0bc08845426c2b14d13ec0735459912be29030099a2f6e71ac5a6ea0024087004d08a320409805ba8f36529cbd0239ad9c2c1a1386a9ee852184a61fa1a74a1c11a2860845878197326890041485035899ab720aa229c42c54e925e23519855fd2ba188e6260182482d25d44b84c857348fb66a4a19364586604a3259b05e50dd9521604648bd13a5b0ce429de10786c5e62de256210ad781480175232b3a7c7899f0a005020f4b4d12a3eacf09a11253cd36d03f4107541bb324b99986d0c91e165f241e64606f5a4a00c084951768409c2e3b7250870a7449a4d58e88e3c687a0344dd9c08145431b10b6c05c12582c13e59517b42484671f66451a5804c222d5b1ec7a7b746308a39e064ae430fa918485135e5379a3ae848914468e84e1fae27c8427e6eaceb1c599b39630818a8e0b512959735c2f7c3c697461aad0212260dc80c9de9062de10c1e211df5e610c22140e68b85325b3daf267514ad8844839186c4910234851b2b56840004180a4c5e07ba4e58b0992b229138ecd2791e580e3f12bc2a1c7415b71acf41c480a9425478835024868b632c8c02d091424fd58c2008be54c8e89e4dd840d43b2080040ea96344957b08896e6536355191a6d87e20480990ab4866f06a01f8f5a59e8b61811533525f00798e9950fb80676e88c22381adc0c390088e109920d3da455865966044901a40204167d8165fe0c08d13a5b4247a5e4c1dd2027768074c05348100cae33b328ec8181009681a63a21324b9587c9d3548d3f0d7036d4f130a7eb004b960d1d512cea06203e008b6175d1064792af0f60fe9ca4895cf371958bbb20150291aa464493c68e08649f291fbc317af60059538af2f2d6c02021e656a7cd02098f8ebcd22889e186049504318836640440d9dca8944770f429bcaa2186e8879db20d58ecb01c6b84d091a0c60b68fb28438d8e85165e05b264f7143b64f9514c00a06323d5a8196346873340cd2d0e070a2df203e2cb94ab481cee74e117533a860458db01240aa82b439d376daa4879c2c648b68398074e3d9a4e283f06d8b850c2e7ec7d1046f583e9aa9b02cff3045c9d1c50a43eae6dfe4670b5394483ca113d43113f02a7aea0185081d9851164130150b431f18268ef0d42db9855a32623f2640b397a4785ba42cc7644cc7c5c6094c7b24e6b6030ab7d690c0979d4473661f7a2c312013a5617ee303072b53563068dbee366e46f62b68c6cfef71dd78b539bdebe6c62b7954b77b5ff8efbaf696d87e7bfdd762e1da1008e129cc7d658de327e291e371c71f927f2e19c2f11d3d49e69886b5dc15a1b77c20db936b634bdb8671b54ef47239e04bc8d2d8d506eaebf75047dcd06e7531b1f9e8c4f1b9f73ceaca105b6f65fedf781d95b7b9f09ad1fa6ed8ad488833adb9c6a676734ced090426306e76985f7fc63eb2c8516def3d776fdf6dbfecb3f70869f774676cb8cc119515638b89fe86f1b8a8c2d2ffeede12d3792298351c3cc852cf4f7ba8811240604cef91b0312ea165dc09930dc30615ce1540d46c08002a30613460b027438e77338e76a98308e747fa2f39e3fd647a3cf69fd0301ed1f2f7e3f180eb8dfc2b3afb130b45cfbd72fd238b7f7fceb9a6b77db319ff4fef6f4c509ee847f9fffaf76db67fbfded9ebdb9be2f7ebf174d195c302a7263dbb6f0930c8073feb2a5b945992da6708b3b1689f670ce5fb6b7b5a84d6fe97a0b810575011cdf183728548d6ec5db5be606b7d6e3ad6273237b644e6263f3529141003735a69f3870d034668a28268a449caac1128520268a2bcc1483439e6ed0a85d3bdf70cedda0c8c36fc63f47a33636d67e455afb0361d847a3df3afbb9fe8a34762b45b1ac7bf727766b2c57b9805ad2dc29c44c1b549421458e2442648890c0e20d78d7dab8ff426c7fb800d7de6ac7b093f3e46c6250a2d5df365afde7995b2bfeb4362bb40a57454b7b4b5383dd9e6c6ed0abda5adb5af5acfef13dd3f5f5dfbedf345df799ee77acd5d2561388bc8413ceb58afef6b0bf7fdf87693bfef2255f72484f644cb2139519d8c4cd34f1341fa46a44d31a4c75056ad0af5fa1922020e22e4412cef9dc1b37cefa0bebe91d337efad6d2f59519428b3be1de9565ee956b77db2ff6de67e9b30daa07e2f1e65a3f231e13c461b7e3ecddaf74d772e7dfa9d4feb383788e5b1a39ae71ce932f9ca00f7e3ec860b3b9f6fced99b6aab171ce5fe60726d343234eb567c74321a687314c0f19c602e09cafe19cabe11efcf08ff5b6fdb5d335b528b71ad7b71dc333fdd16cb4339b5bd3375a624d2ff67bfe8a1f82076ed74ec5189e7e385e84f31e86d1d4d2daac6f50b80dceed0ac36b6bd733f833c6d7b33428b703e3bffbb6ffb575deabe3bb7bfedadbe65680a536d6cb79bebe19f164596ab5e3befff3a251bb3adddaef8746249ca6ebb5f8e371d0c36c14e44e5feddfe67aebaf76dfb5747dedd56e47c621cb39dfa0670375c31a7febdebcd7ef15e36fc7ba4aa3c14c4353861319183124c2f04504063ece17e92d13831717b3b93217a6b59daeff85bfbde0e2c2d6aaab8773689793ebd06ea0233e27f8dbc34eed102c474af0bcba3ba91a93d10563a46ed7ceee3dd3da2d63d4a29f4578f14d918a62902b53f169d7cefb1a676db47b8e3f5731be3df6cf9cf3334b492fa4e5004e8d988bb6121138042d4437e881201850d7cf231f217ab6e0b97387d7119b7317277ef3d8264a007ad634d3d09db150a6c79837629860f6bc3872c1b28567915e7104004c15e69408517a3c31e4848ec90a257a92c01d792cf227f26e880e211c88f7b1a547d98e47484739e01b686cd0d1483283408c1930982e48b458aee8f0c8537440b13441a20473c40c1104402471a4f380a603ccc1d186470d6518b65cf05dbea843f1eefe633fd6705b3df48a994e3694d8a342849889057375fc529857b17847eade9489f8e6b0c7040b12e822340df51446217c1c8c05ef02c51efcddf1dbd22784efd141b701bcf7408f01348f00ded61dd3cea96e297d17bc734b39a738a682ad280138e81b9ddb833698adbbf6a826246dcb1d287f8aa1dd39e3b347b3287a123411d0955920ebf1e600d3c05e01472c04f800e998231831668f10d6c31018ddd70a3d5e705d8f7fb8ee746c712dbf25ab0cebd1d1158cc68a2e49158119544c12cd25b34307014b1253cc1952049244d1a181821d3d3e956df14e5c47d3dd9f4726383d4b2b06e07d9eb081c0658e133a2018668c38e1ef69cc38c523bcc297e72e889c531b4713512683c059181d9718ac2fbc0aca050b0c26bde20187831e60f2112205e2848ecb39f11192281940b24eb24f728f812149384961a9c6d49a9dcdf4fc2fc4764f9cb959eb932923e176ed3494d7ecdaa918c33233f1442295ca1b25db2391a23e2cde1669d0b3d70c500f8e598100e75cac63e7b8e6c2bdaecd98b18db8c75159c62c5f01ceb908ec185ee5da151430b174f11dc3b047bbe7988b8dab6df71c63e3ea99963b63cdae4198d70cbdfed8dacbdd77faee89735c67edb81e3c635ee3ad9ffedb2bc6f5763a4d73ae399f67585afe4cfeb5531513a9fd676d6e87bf5cf5f3efbf0acfbecb71fdb78cbfdb713febfe44ceb919ce7919ce3999417021317bd08ff0cf6e7ae747f81738cd9b3a90dad9e13998c23397aebb94cd09753ecf12bdd5fa131b9bdec6c60e8d4f8d9c3736f26423573672128ddc8409ce9fb813e79c9768e44e8d8d1d1a1b4d3472ded858a2d1031d675af574ec1ccfb1bf67dadabbbeae7dafe96e97ddf4dc6bbac3ff8cf1d9b3375d25eb9e69d562c5628582d81590f5f9ffc5fb57ad902098560c56b8dfbe9bf568fd6fab67fcd91e63e7d8b6636db7e3ce185f7fbded8c4fb8373eb706452babf2a57504093ab42bfefadb70fded3379ab8de9ebbcf7615f63b784b7edf9e23b9ef72ec4b29fe33cbcaebcdd4abfedb38083d1285fa29596ebe6e0bfddc6f56d47b5b65f8c7bff98d433bcff6aa7ef7edbb7ccf5d70ff72f57637bfe8276edb4ef581bcbda7fdb5d309cf3173bc7f52d1838ddda5febe7dbeab75ada2e1ab57e98b6ce746cd75f314d8d3b577f407b5aff2da3d7d6b2bfe97bcae8b573718c5e6b8ded39ae6fc63ffdb6afcea5a971e3ea0fc8e8b5b2d7ced337c5fadb3ff0ff3acf6ac7da68d49e7f227d47a3f61d7febec655f07efdd5f963d207d9df7ba357d7b78f67db2ff93bdb6a6fde0ae07fcdaf89eb975d6f6d999cb449c8308a647a9d47efbdee14fdb313e651f8d4eedda297b341bed6b7d7d45ab726db4a7b50d86bec1a1b5b9c19fed0daeeac606856bbb5ead6789b07d76d3b04f94e92d9a7d7369b43bc61e56e19c3b9dce03f797cd6eff6b6cbf69bfeeb4bbecb173bc48cbd7daf76f1895bfe297a7b49ffd231c7a4d1831416b773de0ffd7a9ddf55bdbf6b25dd67afbad1ddfd9b697ad868b12a0e4f149e0121cfb5c87636da235e65a40d381c679122b021f04288623a6d6b938a996aeaf696adc420cdcbaada7dbaba09616fc33ed376895dab1fde7cfa0df566e7ddb9c2b5fe5cb39e76f32f9f436bd9c275fce394fbec99773ce95c937f972ceb9f255be9c2b71ded4a4c4b9922fc5d8b5d396e39b7b7f2d6d7bec9956f19791d1f5bf2027d6f132e02d695b2acbdeeede72ebfadff31efc6578f6d99910fe774d6fb75cc19bf6fbd699f663f47df5cfde7fdd7babc5b30384676e9eed19dcdfbe5effae7f37f7efc3f41d6b63bedbeaeb7b9ee9d88e6599b6dbfe7f47d383b2ecede0ffef3e76f6815b2db7c1bc07cf8489567f0bc2b135e60a06c27fbba56fc19aaeeb68f4d7b475aa55fc336d7baa79f7b76de9bc48cf8933a19d96ab8de7b86f91967f5d579eff6c78e6e6c17f919665e94dfbdd341df8e5aa9763afe867c2998ee17fdb5c9f65b4bbb3efa3e941bb06a4fd02ebafe5da336d37c7d8b8fe837ddd969b48d37cf5ef7a3eda0ffe59abff81de86ad788278f12d73fbb2b6d77b1b70feee71feea31e0fccde3fcc5bb5b52923dd7c2f7f5f7351e1b1b1b1b1b1bdbdadadadadadadadada9a9a9a9a9a9a9a9a9a9a5a5a5a5a5a5a5a5a5a5a1a140a8542a1502814fa4c7ba63dd39e69cfb467da33ed99f64c7ba6c1c1c1c1c1c1c1c1c1c1bdbdbdbdbdbdbdbdbdbdb9b9b9b9b9b9b9b9b9b9b5b5b5b5b5b5b5b5b5b5b1b1b1b1b1b1b1b1b1b1adadadadadadadadadada9a9a9a9a9a9a9a9a9a9a5a5a5a5a5a5a5a5a5a541a15028140a853e9fcfe7f3f97c3e9f50383838383838383838b8b7b7b7b7b7b7b7b7b737373737373737373737b7b6b6b6b6b6b6b6b6b636363636363636363636b6b5b5b5b5b5b5b5b5b535353535353535353535b5b4b4b4b4b4b4b4b4b43428140a8542a150e8130af7e6d6c6b6a69606ed93fd5dd35aed1e8fc054d4a5fe6884f7fcb5335dc78a339eecbfe0af01e168d41ad77ffe587f8777f767e787370dfc0b0cc49be2f111defdf54d2148fbbc0d5bfffc13e9c12f7361baef6dee63e33b78efcf3176c6b34b3480f332b29773d82c01e72f82b72c0822adead4b6fdd65feb7fcff1d93dfb39d6c6b5d58e61bb6b6dbfd8e9bbdf36adc7f94bc6397f0f51b9d450a2297d4fb7dc29e72f559329cb5e2b48d383f5bf5eb975726f94312f9a33854e14d28263bab00521157cfeef94d5dbf526d4d2751ee76fd40b158dfe3a4d0dde630ec233c84e99d3e924ebc9077881806f6c828217ba8c8b8adcdbae2d6ce9599b5821ce62254480605848382818f800d0af8fcf41033d0679787776755234e799d9a40408cac80e18284060c098d8a41e06f6e5d5c5b5a5958535e9caaa8aaa398929604a2a0aeac9e93d146004a7ef6db7b63a9dceb536ae7dd3b27dd3b2e021f80be2e3dbad9f6eb73e1af535d74fa75b3b1a8583b2b1a5d5762042270e9c094809e771f52d0d3ab5ebbf957ff62d0dca0554869de3ec3dadfff69ebfb5fe806f695042f833c6794d52987e1e71cea3d1de6fee768efb9f45bb764e6d09ddbabbe9d69652f969c0edda49c772d567adfed733b7c3bffef7fc7b54f673fdefeb1c9f5de7981f72eb2b77beab5c0e77c6200211e80b2487480c617191b71a07c52f7bc20c782ce350177d307b7823858314822e3d4b158f1bda0ce6f13a53c3d9b063c85f03ba09783668e73818c25b2837b8e9891bc1b9363628bd22c1cd6084444319175f0ecb4ef06990b1b884444cee49839545e215ae180a34a001465e1f0d35cae048aa108a9dc84b862d4f44ba6841f096e1b18944a299c1013244005297a7256251060220cae0b8b034c55028112ac9a3373e0c52eeea7c4880220f0308259f2409b9341800cd04628bc68883818b0f9e18a308142eec01b1ec3263c0e14212b7b60c03e47f01838912d4b722f4853c27058d6786272e3421215d4b446ebb72d6bc3c2d5ee8ebfe78cca180c517b96e2dc587160412da8dc353c5e156f3d065eaaa1b73b8e8654c93816ddb800296f1468b114b863c7d30628544cb061141614c13e08b18338ba345497b746b7d701c2e7e89ced022680392c516552b1b55d20c2c4e9583678f3e6c17c9cc289a40b3214111d19b043b4e68b852b482a54e850b7e8a2209ec9e415ffcd0140705c12040ce9d50ec751b8af04962c305a48c84c72a8c212e133392fc169bae701b7f7c28165a2cb7018f3575008f4071affee670b0adc4dd77a292a4659964bd8930e800088d0c1c37374d19c2fb82d62de55a98b3e88bd50d45c80b86e18f10361b087988740397b60e3b4ec6bcdc676c994695653dd8c16ec3f33c3341918c9df44361679842d5641a6008340094481d630643c245221275d50a930ebb456bea3349758d1c86042d309294056b0b851c0b5ad2d6e85c6893c7420a275222ad88906801020b34a8d4aad0c2802005b0f039cd2d219baeb1e6e2cf364a99812b2d4306b78e3dd09d8d11765bc0ed96162a8d5f0e39d07a6cc020a3c51a4323d180678100951c7da1dad464e9830b1aaf2b8a20d18622cdc4e36210150d66739ca59886017c9dd9878d3e311e75e0305b681058071276c6ac600898da59ad625e124b92a54496282d9aadd6c620d6141679f868af428880a9fb0ba44d132b8cd6b007c89192031e1b417193bd7491593c4aa1f1e6058d8cc804514b8a280ff2012d1bdaa0e4d8121125c550a061048900248e20e4004d4b9c9228b828231159e133b1829f40ef1b08144f1596105a3b73ebd15481c39eae1761c9aeb057c12a3652f7a5302ab63368220b79c7261ed2eb4891891a8aef3e5a6dda5425c47450ec4446fa1d899fb0602f146990241b0016c4a32a0148c8ea08c3519574a7974dccb2056a320be3a24df61da1c6b069b10a3b660acc10100281b0302c289120e88b04d6274a71644083355833291af628dd85b82e7a140350851b6fd72cd53a83a6207174455161929e69071557c311639c282913751d53c3a6910a28b93f280c00091b18fd87b2f5afa08efcfc0f0c1c9989bc08fa7e6ed4f80dda565fab08d78d9d0a3b384f154676daa2dae02330225ca9d82984bb785681cf258cf01dcc3463635496cd617d63a710421d9d246b8f258c7935b069d6ad8a1689474060b1463904e2edd961c6aa9416c40d901f1fd533d51a636093f6f035d5cf64cf0c472ea40af58fbea861b4642dca7789da99a93864e3577c61abb24003a33f4ce40d6459538086a4857a884dd131428c24b50a55845fa453c48124d4401f8526720426a27e05608827e68900d33e73ea243a4d0d4d9764ed21145d7260bae1040f2dc440f5546feba1ab87ca8429853a7a84587d0c395010b23484310ad5180ab712e119350e1b0a74149c20b54b783c15e29a46c3b7265c5c44c86be419a2912d8815e4ece8bdd0a3455c3344e462b6691cd8ddc33075b80051054e387cc1416f8a344e86439f06f9a2ccdef33041df8445ca433f4ebadc042c361a086ee11363c28933bb280a9e4e4c289c302641109caad284331c129e5c75b96520b041828734097d12b27608da6205b920029e0846223046b0c312618a0d821b083c20d010e012212c09199e3961382392004237fcd831841b0d9f8503147269f064d0c585a4c2158513a80a0b8c9124c7e6668ad0d0560c9ca06a01e114c2108184e450b576103e8883086b499e1fc2413e72b46647890e0795ec1529e0428b86410d830cb2269ac0f11518a492e284e8650b26386711b7ea66895510c89fa01d253867e4849143be8860138140355f813902e3c0b540fe00cc85072ebe3ca06a1f2098f03a5122c400a808f00a6089292021a0d88cbf407f4eb0fe3afcf1fdf9e1f18b8cf25b94f3ab83fda4fadaf4ede89bfbdefe947f163852d4a7ac631157bf82cfcc17d7c7d646179f0c3e2b1f9a03470eb654397814e24082d40181320d0a3590d2004483075d535c36c0341aecedb1f7921cee65d8cbdbe3d393d3d5fbe1f5ea3e7a723ef49818a461808341360f03b53c49795ff25a64e54df3ca00e125c2bb8247228937c886d757dc01ba6b72d778e7e0ceee8e1d113b453ba95d541d9bba1d755a2e173b38e7756e7a8a7e38e77549c869e79c4bc990f9d2186d1ca556aa334ec746ba4615389d96119c4e051d5d044e47802f28c439e7bc10b7c3cff02b1c0987e48fbc916f399503723afee49d3339e702f81497e2511c8a3f39f126cec497b8125f72254ff297739ecc260b934e49e53be91de02d22c7f9ebe3857443e5fed7490149a864f211a33691dcae9d6a6ad099b62b4c3f5c7f59e6ce6d5cb471e49c53996d60de26afcd1be77cdbbddb58b5796a93640389735ed6a3663d6a46c6e60d9b33b3962bd3d6deff1ccbf0ff56c6df3bd7faeb2bdde1f977db63e7588e7d7d33fe6cf758baaeb9b0ff72ff332d975de7f80c2d41afe9eee7fdfa4d63c9fabfe339be76fbdf34d7429fe3eebb3fb147bb3fb12c0ffa7c720fcf9ecfe7937b48d665fac3b4b563675fffadb7da9f3aa601d18c1aa576ebaf50a5fb7cdbb1dc7dedb7fdcb7176b1e7fde14172e0bc6cfef274f1cf64d3da67adf2af5a0a53f3f8b4a44600b76b675786ffccf5f2d68eefbae7fc4d72cedff7e5fce58e38e78d38e78c16f1b536ee1bf7e9349be93487d45ed39dda148889260e87a169cea7132a6fb9f73dfbb8d672e7bff5da6f9d3fd7c2b7fbdf76efc53fdff1cc4533c83b9a374eed68b4a8fd9e637adbb1730c89734e3d13e80c1e2ab5cffecb345d55c4394fc43947b427d8c71fcf00fa5a829930d9db6fd1bab75dfff81adff387e37edbdcc06edff3d762bfddb3b7df76599672ceff70ce97d128e7dc0f15ceadca58e16f695042bafe1266daaf8c944c09ce07d47c54c494be8c5933862e8c9d300e9c4f2d264f7e82ec320432de81ced41e1f98555a14d48536acdcb3c64410fa00b370c27070f950c58bd208bd328257302c81b368cb019a36a8bcd4324129aac128c3d0c82a0e08051485942564a704878c626803309f20f6cc45b0315359338684ca75e2cb569f381d910ecf340c20c0b2effa7887ce0a4a243f78af8aa4aa615b8f40a90e9cd922921bc0a8a4dfc5d8e8c3dd86c6952b4415d19215319a1224ba9266f00402b9abb7bfb2c39b514d2122766a88d31498e9c88d00791ea9429a7a026b311d55275d6513b0defabc531f960001b299591a5e49397237402076ceccdb149bc282b6c866b5c0992f5241690ba82f14e99944a150d799b80e7471f7cf244e88d01a3162b8b0e89ed8ab142f833e8d082786c4edc0d01c830844a02f390c01ba73476e30921f182f0c617191b79a1711e5fb688a53cf8df5654f98018f6479a824b1905e58f94240157d307b7823e50f4c8d10d621931a8cf842d0a567a9e2914390466d94e8fc3ba9acc13c5e67ea3793a45023974900d9684335e4af01dd843b333c9f424a2c233474bfe63818c25b245528a1b672d8907a91224b4fdc08ceade1c346d31dbe0c6d86b8a9f28a043783d191274898b878c4a0225405e6e2cb61d909be085b3d18c904026985692d2e21119373b27307904ba1af1176b6aa58245ee18aa180ab0f8e1ba2066af85c08038cbc3e1a6a8400ab0c11189db03608b6a40aa1d889ba8c684e21dbb381439d41ab27225db4207893e140ea4f645cf9ec984d2412cd0c3a2a74e4c965d60db46ddb025297a7256251df9e2d2d170e89f0a96205a20c8e0b4b147a3c6160e60516a14061988950491ebd3970e26869c110462b8402e0baabf321010a3c4329b67f0e8a497cc6ae947c9224e4d0a4804201d6a0cda4407e4c3381d8a231e0b871924b1240770609282e3e78628c225030c045f340884c5110aa2b10cb2e33061b40203891b522c8284a90a65b5b8601f2772394eb330438f2825d264a50df8acc000cfab246b6a5221986e5a4a0f1ccd0849843705a0419f8a8c1d78484742d1149b399e06301b2630639af352f4f8b17f84a243033c5c18ae9cc89f59843018b2f720a0a17cc8d612a5501804a8a0f2d08e413d2dda4bf8d4203cbf0c253c5e156ebd042878c1d7c77fe98246475d58d395cf4d6f529e2c7a34f2deb516560db36a080cd4631acbda29015427eb518b164c8d3c73dc18ad70058e01050cb12122d1b44f4e471ef23f952c3ea8f162a01be8831b338a28b3eb9029981392509b647b7d607c784198c4e60b1667d56dcd08aced02268c31123531e20040d10746fa8aa5ad9a89266a0c0d61f8ec20f031ee130e5e0d9a30f5b051394c02884264da30e2d338a26d06c44008345c67805481c1a5c556f12ec38a1c10a924e082f3cc49ede5518963a152e78293422f5b04063cba51bdbc2ee19f4c5cf8907fe90e2cac016353f2b413008907326fc00c6738b816d2a2c30eb3614e193c446d016f1cda45c16a4e05246c26315a61008103ee6226d4d1f899519497e8b4d572aa07950c0908216cc00f3c78762a1bd4e8103e4015592427a0271f1585307f0c85317043efc1cfffaac89bcfa9bc3c1b6a200cd9427b5d20e9b53d88c4a92966592750a8d4b22332af892507531e800088d0c1c1ab6e2a4ec5162e5f7e12a4d19c2fb82166cf57ce19842d1475b936b61cea22f551fec2434dbdc5000b4a28b90170cc31f2070a4296b4200053cc40316843c44ba814b0e5322b67cc9011a4b36ed3819f3729ff93ee062249206fdbc5e34aa2cebc1c61d3a1471fb441afc1163e1799e99a048c6af0fa31521603b2883547e28ec0cd3271f21a6407038b1d142f1ab018640034087ecd8ce888212388352256b0643c245a2111d1015e121e18361174954569874d82d5253a3ccb0099e64640ee897a4ba460e43812be2582111dfb023c94996a42c585b28e200c13349879803ae4fa12a6d8dce853678043599d1c724eeea6b0f98132991564448b422cc722580d920180ab458a041a5568442e8acd131342c7007a92a48012c7c4e733089963d54915f67c084d9748d35177e447850d3f465078d89e25699812b2d430473d490b3b481efd0a22d563dd09d8d11757cb0f67088d966992a995c846734c09901638ceea15164f9945b5aa8347e39dc10c3c0961d7c5776241a2b1b30c868b1c44486299b380dc952080853039e050254712494c4883a08b3574270559b9a2c7d7021e0431c30c931e9dad355571441a20dc5da4c1ea6353f6b653a98785c0ca2a221818aa8263910433c8af9752dc5340ce0eb3860304212a4a746b6bd2b1b7d623ceac08196b532c0ece00874341b04d681849d51a0906191b94b8db0af6b0898da599d820757013c7b5cc006e5c1124b92a54416a826461c9b309dd963c24f93490a360565e82d266e20e680f3204e8ad720d6141679f830e17d7931e6b1c3005ab084100153f717086e09b9c806cefb22a6122b8cd6b0c75c2897b4a0d27bef06bf92031e1b417113840b7be0e44d0dc810596b7fe8ba38e222e74c09102e17f0f04943f52885c69b1734190c4d8852e14b1310dc2f26885a524479f01ecc26d09122a4605096960d6d50726c5c6548e4d1822a00c64455520c051a4680c1cdfc97473f989dc02ad089c46169c8f40a920d6db43cec05d122e4004d4b9cc2814c84495417de3521aa166524222b449b61c16accd49757314d58012c217e14e2236332a8aac19b1a8600b502bd6f20503849410041006d95018b5415a1b533b71e4c5fc4ec444198f3a4b10ddbd3f5222cd56fcc8cb193c2c90481df96e3969a0b892aac7ec8355a0060d18839abd848dd97c228a6a3242e615202c834e6a0892ce41d1bfb860cae37668c4f0aae5e478a4cb410144806ae70ecb8b56960d547ab4d9baa84331820c2ae1acd221530a1d8898cf4335282ce993d43c6142201860b0bf642910648e840fde2ee3070294e5d61413caa12800407127a4452be30b2c54d330c4755d29d5e9cde87483616ad28ed74fd306e91a25267746ad0a856642ca95d056a320be3a28d21564004ae343bcb45cd116a0c9b16a92203eb2246546cdd58e13505660808014045009f6468b04145d50396052512047d8d28f1c3d153818cba095b33518a23031aa8d911767605ad08d923232f291af628dd813803c54366eb4a8a8915ac47310055b8e1f6068b07b922432c207eaa6a9d41539038c2f0ae492230424212b0af0a93f44c3ba848c0260603120e022691b2468c71a2a44cd4d8631f224bee4cd112894a0d9b462aa0e2fcd882481c3281d106838501206103a3b7051509e262704089a8d6d6bf823aeaa3a2500901ec143dac7954c5c09199c88b20db4000256c5030c30403e6468ddfa05d15c802e1901661f4f409a25584ebc64e85dd189626a15dd3933029555518d9698b626b82953693da299f8b301811ae54ec101282aae157414fc605115b785681cf258b87e823160641761fe5b072b3bb1165e932e1c4890905fa9c553e4c33364665591c4778f0c8f0d506c21fd8969d4208757491f6a4c96106c9c4950d31ac9630e6d5c0421d8370307cd264d2a8982a5a241e0181a54d80b4480356da4ca8e3e21088b767471900f41e5459483b94e0c6555a1037407e7cfc2520755714a520d180a948704aa83b02a609cbd2a000a5a3a96b0c6cd21eae86c9877f237852d5a0bb62b26786231782c80648cb20a2ba2b324d44c70b67b8080d5ba698592c7b893c757d51c368c91a1424ad230786e2b0d159c48ada99a93864633571c666c2d596248e9a5fd8aa2cd0c0f8b7c34413cfe29914542f9b8453cc23444a6e10f93b638549d68b95654d011a5216450d08d952d7b2c8978a4dd131428c246200270e9fa0881562bfc60ca364866e5409e5391a7285cd102acb2fd229e24092ae43399c636a8875e2a87c149ac81198086b8212137e2a36f03dbf0230c413f3445021164ff01a707876fb64cda993e8342d74853bada0635284476155597b0845971ce0887b06f59984018d0fec040f2dc4401668a0b1711025a69183225a5b0f5d3d5424dcb14267c796c7999361150a3627208c235c93f6f85df150425b274c8f10ab8fe1861533663d58373b3c93b696863046a11203a4c821c04016369ac8b052223ca3c6611306c0049b5b87c5a808737947a02f03113e197b65086ae0b130b405a95dc2e3a9ac0cc4e1321bd10f3a58351abe35e1bae504c2b345aac509e91af31a798668444b1e427e6cb41122c71971c9d9d17ba147cec1876e8043417c0d025692fa96e80016f27940e6450a01b8f07c608ad9a671603342915ab8ab0df59ab471d5e102441528e14ab64914d004901185571cf4a648e36020d31f1fd93b0469a99a69902fcaeca1b5e9a30353f637a004b7cb716d2c4f103e1346ca4c05d990c36e1096f2d08f932e1767c20d5414497bcc186ada6820b8854f0c2b8faa381762024561f13ab38ba2e0c9441a1c20cea4d4a173c10c56091b2ed014f098dae366f865895675015593063b08903cd4808eaa961415e9fa5e70aa4a13ce6e7c6082050ad49811167159575d6e19086c48327aa94d7e4c0479522dea397a7e416b3422c3471b824d37f0650288a2ad2f7fd3441978e0b15038a34dd60e415bac2017705814c6abc901460c55547eaac443b6c65ca74d588c02bb7c9103264513a0a8a2c856469421134f7adc2db4d60af868541b3260e749021bb30f8fdcaa434081cec8ae04e2331f695669934a00f6a8c9a8275d8be4a1c7c1df8b017a775a5fe074815c4330c00960dc82211e20ddaad4e0796b2c9bf2c7250ad2a42935964cc3a2c489781d17be1983f33772042669cb8b3d72b60a3c4cbc00e0c900d43d32acfa98d86a8883fec42d8ae9e2fb805531e7ca146549624200308e68347d046909d88a2480d00d3f75f0c8c9c2f7212a12119f5518db4096001cfc20a9b1cdb229948507538722285504ae825732441080f14a0d275c36a8448012950b24d342cb550aee68c0558327832e2e22c56923244b074a6d000fcd260339d230c560e589f5243b543caad1452737e6835fb38adc4be6cf728b058bab3192e4d8dc4c3d23d580ea67acb875cdad183841d51c8a1847e2b8e8988865bafa1051c308162643813d668bc6f081a4012b90901caa960e4881beaab0900301234c330e22ac25797d228dd0132308d48d48005e2dc04a40b160a349b556ec0e87224760c9d19a1d253a2c40c6d05ff4a628a4a5da2b52c085960c81a00e386e290385a8c4579d911d227238efe8f8d011cd9317b8989535d1048eaf8072cf83be2f4dd0c4614125c509d1cbf6cbc6937b2e9a606aafee6b11b7ea6649d505842891cae868a853663542f453e4d06f4e95974853b4e0353355675902186a80d223400db4dafda3e50d989113460ef948c8ad077e6ea89023abd032c1c30a99df80250c6e29593ff60ad5553bfefc286ebc54c8883e120413a2146189029cca22787160e7456cd5140545cfd658ad956204cea97151841d1c0f2f5f565d2900701af212256326b37971f2a68789052506021619ed8944a1044b09a84eb6a8d4218285adab678e90c63b3644c814b28ab155b886c00ba00683b81bd500a8034cc63b4d2d84f2149ac0984671fee2c2b826bc4e94082f70d9a0834122165ad4b4ab2b1a8d96775537191d9610a545b6b030e95cb568bbd1352db2a69485ad62648d0b12a107851e51988421c46ce20d9a867e15a3409c03681cd2c0bc41a0ed1c0ad3d8c47b82078415198ab45d8a18e853d174edda61e54c0093268cedc9dd61836783dd06ab6b0c90e68cab264c3013227e7e59b779848da029ab26628e0f5aa8440124c285179f89aabd284daa32d2a4f1a2628e0f29583c7670d7b858d15584cb95edac275fa8bc3a309a630764cf7005822a6475bac0790d109f78010715e444d7e28ba9343659b29c52d8ccf11217824d86e9100b59f0b25426be10d193c39aa319698bf040991b027c45de79511939e03f2e14114669008321ab4a199a2f17b6be440c419cc323c69a2a55a42953708f1834483328c906afae6213b0ea963c2a1ad5cd071afc80f142568550551d8bb8fa472382ba25006861e8eb877d717d6c6d7025b970d87c0a62f2888d961e0a5f88905c49f8b20744422123343a557ff4e8c982e84e0f322a480f8fc50925617274cc4b285a29a79007a709d005275b1afa0cdda01a62d536e4b05233e80b0b2b784e829e3e2a288a24ed196257402b650242f100ca0569c168129898990704d6b8b6fe54d8824427c88a24183636f88113c0ea8e88115660c894504ba3c21223e811012613599e33cf3591258a834717fa02884b0a03ab171a9e5253832c9a9670c5615ef9348a73225d79b230470aa942ef085db36b8acb0678868e4449debe05da08bc8bc286a6305115b1880e358c88c143c6aff64021757ca9a5a429835580f6d379d3f1c012269013be04e941c731428846eeb5e443d0a05a1729383ae025453d38c74a7c52c8ee1087050c4c0095560072de24d42582190d0e50407aa45bde749c7b2961b348eb0b639eb3253320a570ceb114316eb103496d02401983255f100770e3dae2c348cc20dc2124e7fccb5a6648cb610f2b44a228f2591e4424b2d1e0eb3af6080113aa326a1060e94802e6a13ae2310b8a9d61dc052bcfc069a47264a6dbf138896d3c75bef6d2e7218108157ec0ced400e4268392d10d1f3aad1f79c6f2c0d8a016015105a54913a5196b0900cb30148446342121100806722e021ce4893f71d63442ed0cc0a78d58862107faa0855175788ed87a63418f24c7b70f9d5591444fd2946b514c2030234b3ebae062b4ebbeb9c1a49f25bddc69b0a89159c8cc525f002cb8f4b0c14308f0eac8176393137410f45057c87561d162fdbeac19827003d9d4d275b3d3e895a8c8c01a16952d608f4f1b7be8b85cecd053f4430539ed5f647e561b47aa331cccb1916b55e061747c8b5b5111c13aa1458eb4e204c191833547193ab208e5a02562d0669098236e385e1f0084f94a20a8c05004328036d45002e14180330395022b2545375d898a9ec7b6b0a7610a0bcc9ba53529c8eaa4fdf102ecab21e78157863f3d124996604de261857db7c77ef9df5de52f480ffe386b7895bf604de7d95f30f0a6fdecbd8fadfd170c9c634146dfd765f47d7b7a4efbcf4feaa728fb6cfc07ffeeb671d6a605697a108fd1f795c564b7a7abdfde7a6da70a7667dcefffe3fa9ebf336bf53fd6d2f3b7b931a3efebceab4ca59e41f8331ceccec50ecffe27fe79b1a63d7d3bbf33ee6636fce3db2f76ff17cfa4dd69d7f455d676fb8e11dcf36dd35a04777bd2deaf741fbbbf3d5666ff78a6adb1969e69eb8767afadffdde7b877e5da3b3f76f68bce3233b21efdddc94c5235b15cc5ec1ff728e7c96618189cf3ee4ffc337d674b69982b08ffee7700db75bf033886b98234cc150c0c9347c3dcee4fb4fd9fb934ccb59d30154c1dceed1fdfddb42ce8bc11a9f4e2207542ff36f7f65bb8f68b89565fed359dd79ddcbadbf78f6539d6f639eef596f177b3995bfb9a2bed330dcff1afdeb46ccbf902410c8ee970ce934eaf95731ef3661629cebb7451ea12a48b5a9701f7617d381f5e0fab87878763871a96a478d300def46c729160173ae0c2c639c7d27c5bee48fff0b4749df7b5b4dd6d73fb02f7e6d867b3d858cff60cf8687af05be31ad0f60cfecf5ba4b5484afbb72c7bab161583b2ecedb63d40202edd0c8041c1010f61049df03d57945ee428d1b08145dc004621debc345cfefd6d1ae6da35d74fff4dcfd3e9952dcfe61540debca2c79b57a44cd1a8ec6f9fc7f9db2890f39711e7ef22ce5f459cbf895e44003c9dcfb3b32a8f5564ce9df6affbdfd256bbcfb1a0f52b4e13fd5f8c46fd37f45420a5a95191c339ef43a820e19c4fa272732e0015372a5ef7f6c799a28773deb955538270cee1ff2e98a2b7f863b7f79094319c7333fe9649a9cbb0dc6af764f71784e51fe70de2c1356dfd8178cd282ca26ca35079bf3d5994b5b5b6284bce03a1bc81b285f31e9dd0f9d2104a23e7bcacfb13c9a0f071cefbede919cab3dffefef2bf7b32c093434f0a3de1f3640de7bc47cbc8cc7a1959b7cd68b963e7782fd1ea6f3b1ad52afe27884ff69eac913dc97a02e5249293424efacc71a28673c41e95fdd48ebb598ffeebf577b31eb53d766ad6a3ddac477b7442c76b3669c49791cd26879c4f9be8357972dea3fdf6dd9f28f640490c019fe9ed4d2f9bb85813ca39142a05864d53571a7f525ee07f6ff892bb38258c4b102c195bd29584c4922bae55fc4a32f03bbc0789b61fbc677fdb34ccb5ad4a9e9cfb9a2b85b9827d8578cf3973de38dce67a0d2fe74a63a44664ad9972e2cac08423e04cc8d2002065f85c61b2d2a3b109ab816eea8b93530988af54bd39a30b60099d959c168d4e4f9c57ba9e14d2494568c4a10ac057201561a253f6aa4d358d40c235bd68db1e307b7b402df78dcd16e4fc5503fbba37b66ffb3ad8d7d91febe9c16e1d6c070adaf5af6a7f9f6dcf841fa6ed66dadffeceb6c65b3a9eff1d0cc3d29b2e0c94129973cf5f118f48112210be361e64f47dd2dba6ed7ede1cf7d9b49dec15e1da2ffe40c1fff3ece6d866f473dc27fd580f78cf1f4b0fde5cda8e0ebc69bf9bf6b323ec7e078037edf72fc482f55fa4edbdfadf74e14dfbc1ffa60ba5363c73f3687f37d3b16de76f7f67d3b2ddcca5f36edacfae7fa2bf05197d5f4de7dd7d6cedf9fcedef3e3d8877d37e78366d879de39b2e04ccb3f760bcc0c0f96fff069b3dc2f470c239ef71f768e3b1e57c8e3b618f6269be1d7c76b0e12fdfe1c8f9fd6d18f6760ccff4bf6945dac35afab6b9d6e9740ac3fe5f88bbf387a7f43d85610fc37e0ac3be29f9be1cd2b6bd6cf701397f99bc4b38e74d9cbf4ade24369a901c31f2165132e150c2393fcb1b24847fa295e6833f3cc756fb07c270a0605d9f2c08ffdbc7f5edb73f1086ef7fdb34df6d73efe0bf48c333de0d1a9cd3f597e06ff9dfdd05fa7f27889de3403e6ca10d2c9c73e79e8d229cf3db77d973e7988fd1f739e3dbfe357dc513fb339de87dbfcadfa6efb4f47dd375dd19f79adbef8fed7aad2d6fb97477af3b05e9bb5ed315bcb6fbbee5f6f96fe968a21dd77d5eecf6db77daee345c7fc5bf48eb7527fca774fd2f4c7fcdb57e7b8ea97df65633bafe17107465d9ff1ac175af8bfd05e249e87e52bdc11e883728c50b64d0f1eafaa020615f77ce7f4b2f95666cf875ef5ecbadf6aefc15637bfed77fd79db49e5fa7a241d9e0d2a068b2ccdd66adffd6d25667959bbd632c1a5ad4dede7796daff17ec4e2eade8af7d8eadbfde7ef84acfde4c70a6bb1ddb9e4aedbedbdfe6526b0fc73676a665dfa9d46e5faff4877dfdb5b4b5db715d7752a9bd53a9d4aea1f7b9b96e0647bb99609c36ce0a6e7d9f5cff357d0bf6de31f4debf1c6fb5b4959ea9546aeffeb66f2eddafb4936bdb71b7ef78e6baf0e0c2cd79e0408fc2f1d4ccbefebad71fa6ad6403c49a2d46d8b5b3fb13a7b2b7d22c52b45842ed126d3f28f8031df8c11fa6ed045950e033a194f64bb47da2ed07ffec3ef8dbddcdb4df6da507e9411bfedfcffab7825febfdac7f2bb882bb22cc67bb62f7ce39d16b6f2e5df57d919e13bbb3f6b2f5c3bd7bd77f2cef8dcdb6c7ded804053b5ce89c639f65d09db6bf3d9cb5bdde6dd731f7c3324da6ed7dddd99d363cdbbeda0d74a7b3cf749ca5daf475bee9b95fe35e46d6bf2dfbbceea4a6a971a9d47e7b985b0ff64fa5529db74dcbfd57e13f77fa9e692b95bad8afb11919b5ff6df7cedaff4a67adf7bf6aed78f659ebb73f76fe585f7fc52fc7b2f5ecce6263b9dbd6782b8dfbb7f52b765ff66bb2de3d768eb75bdfd7a9738371d4ec1d2f6afd9f69db5baff4d9cda53b8ded373d33d275dd7936c7dd17d280f2758e3b3dd3d5eeecce6ea6d79d54aa6077c2dfb6bfb5cc3eb0f55ab26e77a7edfbccee7e73b7b22fb3e7982c6bd89ddd79b7d7bdcce55e1970ce137993c312fe16ba82acedb3dfe6fabd4e115a22a04438855814e24f083c21de84d8d20c912504962dddcb0a90a1f5b202bd9b15e8d12dddcd0a74b26e6677c4091fa6ad216e84f8d0a36564b7ef5bbabee73fadef398e6a41d871cab2b4f9210a4410461019667f567f10794d10719cf3de19bdd68e7b6f823000c28973dee77a8fe231f2a6e3861efd59faee49a5a315e7dcf9ab73f66e3616f820877327960b7fb8c27b341ab5e77f337e0f85788f12363d6c39e71e069b1dea7430c33977c67637a3e7bef8fdba8fc71c85a2dd3bc6d63e6b9768fd593b0d73cdad4eeda92cfbe959230bde6bfa4acf1d840d3cf0bf9068fb7b4ac353598e13a7d3fbdbf6c7faed74eb7f767a7fb40d4cb813fe3657fbef3d2d7dcf3e0b389df6687343f78b7f5632a2e1c9cc4c6e4eae9731c231d97dfd7cd1c0faefbe7ebede7b7fc2d019e178fab1f09f265a7dade5f35aeae24b5172e4e2124c6199ae2a25b8e08673fe617a8e2e49c66876af34bbcf7bfe8a8a34ccb5e3a2d1a7cdade941067d8534cc15b419cc7533c1b89ace93656f67178d3ed91f9ece1f86e3ec34defae9d68e46aff2b7edb9fac3fe6fe3dbc20f0b80747631f65b339b2b5be7781bdfd42bddcda89e7b5b3db5ff7f953ec5fd9b56ec664f770c6806efcdf97533bd3878effe82703cbdbf3d373857d8cd1cd4bf8d2ded69ebfb16e9783ac7da29a3d7c27f91b1a6af73731a7a9a1ab763884b53238cbbbfe0fff5609dfd6f5af1b6a7f0de3c539df09f9fdef6d659eb477b45abd5e39c3ba5da2e179247cc1f96a95299c9b9f35f886df827bae19ce3253e729e08a19a4856a110e71582f039aeb0e5ce6e7dfffaae3b2be855688add70ce9db26fc65778dce88cc96e9bb6f66ca3ec15ceb953f6da5ed33d3b22fbec35ed876dc4b1486c2cb69173e7bf69452c1dad88d5f2573f33add8fd0eae41ae54ceb9affdf6fafc850ecc1f92be3fd559d3dffa9b3877daf7b72fc45efe75b5cf5218cacf0ec259e74dcff0935b0b39edee4fc4ced62fbd5b19f9d75a0139e7de3afbc46eed553d777bcd6a97ead68eefbad3fe701ddb77fcb383552dfbfaeb6e169fb146a3836b6d5c6d4d37fd08ceebea60a7fd9d07e46d6c554f3d135321e12675c3bdd502ce0dc6f9dbdfd95a5f7b40d9576999c1ff35d64fb1732c5bbbd65fc3311cbf713fd66fbb3fd1a6adb74d5b65af389d4ebb35d7f6bfbea770ed177f3d9d76abd35fc3ffde7eabd577ab53f82bcab4fdebdba6addd9f38ad7fd76f6f3fb57f1d6f19ffdc60dcdcdddc5337b3eb66f09f09b5745f343ab848cf888e883762d8a19a4325140e9f26bc996065023d212a618f84339c73a7937a7f7b5af799a6f69ee8ef68148eefa8645c2d3c7b683f2bb3654fbdbfe01f95ac53cba0647ffed7bf63679fb5d67ed1f75fd79d1fdbeff8eed3be69b7e3dea77fa6fd10a9301dd71f301aa54ee856fbf73e6b76adff3691569ce3af8d6f09904e0954aca2c74a25f4d947f043df3d0292fbdbd208db39f6d85f474853eb147a5a9f7df6be7b84a6abfc216ce1f287bf3d57d606e576b368d4fa15a351f8b6a75b7b6e30cefe8af13d7feb1cdbf0fce1583186a7b7ede532c16e5648d6bd63ec1c63e75896656f67e8868b5dfcb36110c3ec4c7f2d6d1bbe71a9212ffcc217ffb5500677da65bfa6b564076659f6768574bc773b2ee4dc49dff4dc478884f623dc72bf4848e7f4b71f6c44cffdfedd6e3678863b6bbaa70d0e36725eedf781b90f0eeac9da4ed3b76021ee1763db2fded718ee52411f4ef8777ff6ee0a7efd17fb1ca3d7061e062a08fc7ad0e5c18b0774ceee2cedced83e9be96e869d63dfed00effe18fd6d29a3763fbbbe427d0134fbc0f499e82bec3bc057872f05df02be28078ddc78d3011607b203ac06671a906830d880ef0dd953b1b7400f90de1cbd147a767a590cde3070e49c7704bd27e8dff67557fa5f63b9a6afdd9b69ff6d4705fb99d3f96f28b79bc1fed71ddaa37f687bfdcc59462d13ec09ba209696c9fea864fdae7fd65afb6f77c12f9f314a9040f647eddd3b66bcd206baece92d5d0b32fa3eea76ebadce4e15a452cb04c9fea8666675f6b66dbfed7ffeeb67cefa8cbefb96b09f39a965b2ec7b822e48f647ed674e2a36b6e35be67e33f8fb6bdccd6a3aa626fe5167fadbf1627752a1d41f77db67bb379bda7efaa97757967dfde7cfa5bb33e14cc765f0ecc9ba19f56b69416a7cd3f35e8f52efe9af76bd96dacf9cfd57bbbeaf3bed98aebdb53a9f39e12fcbdf3ad774b7bf75a6ed985ad3b7d5e7d9549b2b6fbb19f5dbbe8edaa380ceb986f6b30ecb74d6fe75f6a6f62b7d8dadf16dc7357d0dcc93d3cc3393a7238f43de02bc4278363877ceb47dc7ddaec3b3ff5909fdd7763d419740f6d7bd6346bb3e6080f396b95ff68a31d7825396bd95dacf9cdbd81adfb5dfd2f0cfde7476b1979175dbfe714d4feb9fbdfb97b1736c77ef7b0c7fad762fee6be3c1f967176b7a4ecae8fbba992d7b45bade6efd5d217e5b3d7dfdf53d7f3bee585a3efb35e05d197e5782beede9fff5554bd7d7bb26ceab1fb6f3e384ffa2cfde7632ee98ac6f6dae6d47e5bca66ffbd77668757638e74edba6e57e73e93e63e7d8ec0eefe6566d3abb5877a54ec6fda575109c657564523f9c3bcb6cf84b219d65d232fa26eb3057dabbb2ccbd52f7a8fd67a5dc496707fe742362f8d7d66e46a5f66eb52f0ed265e99e9c3bb377bcc00e7796d9640b22e758db6dbfb8c0ba80b9edde1d86b55c6cedbb73a6addfb6eb786e169c83e4dc499d83655aefaf1096e96c730e8213feb75784bf758eedfeb3837364347d17caf9e1f657ecd2a61c14ce9dd4bc0bffd757b91167bfded6c9513977ca75cebd1dd7b7fdebdebde3383f9c3ba9818cbe8fdae16fc35feb67bfb845b4b847bafe17e21a70ce9d5c98b6fe42f8b63ffc7f7d9d2e1ee04d05850a78b448d4308a0637098e10e7fc016fc2e18063f046e86dc61b84cfad6fb2befd3fb1ff7bf6b5e762b1739cbdcbc8bcb59bd93edbe76fcbb29fceb1b6fef7873b7d77698f9e39e71f6f63ebaf6ffbc3d47ee6743aadf7ef66b6995dffaadffe7adbffaced5cba6b1627764f0ff6fa57bb5919f573eb9b4ad6ed9aee66ddac77677fcfde9e7eb9eaa7bdd7f13dbf1570e3e3068573bc3ec049f5b7a2ef76d72fcabeeb173b76bebddd7d9f63a91b9f1b55db006d3d9c0364ed9d753aa3f7ec17bf36bee1e0123de204c1b6c63632ceb9f3de9a75db33e2b1a561f3c076c6e6b42668ed8cb36caeb9596bbfca7135b66d7abb48cbf21c7f459fed373dcbfd1b92f5b9177842fbcdaddeb6ffd7b8ffaf18fbc52895ce2e52fb99b3af47cf08d74c70ce79738dca9dd49ba66b6ab7e32b5d7b998bfdb51a1e35276ab55a81665a21eeac692ad58eebaf187febafa9ffd779549b9abdfd87a753eaec3b7dd7ff9a36a77141dd34a12a38e7bc0905e4dc39857f956bdbf1b772e15f53e79a5ba59a7db91acff14ff4dadfcda6ddcfdc6bb7fb4f8ce599d0acdb71a77ec558f6d3edff89d40ecffe967db77dff70977d7ccf7f91967fb56fb9f6819fbd7f7ded70ccb510cb7daeb97550aee720ceb973f0ef2fb077abdd6af73361a09d68a5f9aeffd7571bebe5eb1342f67e2ea56863d04638cbbe622cc3686ffce656bb148d73e76d7b79a669bbd3361f6f3a83f8da6fbbed3b3c3b69a7d359f6c9be622cf7fbc06cc7fdfeb6ec676c2cadffbcf8d7fd0ea2d1c169f727cecd75b3b82b4dd78078718c74ddf40cf14cab69a686736ec79b668ff5afc6dd8e7bb69b95513f95acdf71579e6978f65c3344b3b00478124072eefc56b35ffb7eddebceeb95eef0b7e7d8637defdd9ff8ebaf08d3d9fb6b6b3a56f4d95fb5632d9a62ccb5f07bfde9ed0f4c5006e54d048d10f840005806a9cc4799e023321e6483dcd9adf6f9cf392b5ee97edbfff6b2fdb3b7d3ee8b7f9ec2ffc2f4b67f754bdfb4625ffc33fc6d5fed76fd6f5a91a6b3d6f957b1738cc57af94acf8b346cf75fcd5ae3ec2259ffb7af3b17a6ebadfd7c3ea1dd8975fe0e7f6c4d9ffdecfdb55cdbf6bd2bd377161b67efabef3695dae17f5bfdfcfbafd27737fb76bf19ffdcbbeff5c762e3fabe6d2cecb1bd7b5fbb14f0ce4f1ac860ee8eb5315f9c9fde8c7fbefd149ef3fbd69abefa75bdfce103507cb30bc70140defd894d0390e6d8673fec9b06e21818c179f727ce342cd3d6dac033b1a6176f18f6dd9ee37ee09e3fd6401377360b9c71ce746ca57b9fa5052061d81760e44edbfe56bade6eff6d7769014004bc59408b13f812cfdccee67c763beedd29cb5e5bd30464340940e0d718a6b5b21cdff61ddf3381279709340df8d2957f622c77b30132aecd017a5cbbee7bb7dae1bfd87f15fe66b71dcbff8eb3867db67fbdedfee65821cef9d8953119cd31c53132a7cde8b5fdfeb6748c73cee75881981bce6b3a6bcb35572c087d8b65bf6df5f0b7633126e7dc39d8fd74fbd73ebbc73997e3cd0ec93977be9de50d12de7bbd53ff5ce5dab71d337e3bee4f5e73ab5dcbd5c68c5edb7f7630cc0f1f0cfbc2397f863d72ee8c4607dfd2a0dc302a0dc33eacd36076febf762db7ffecbd48cbdd8e9b6041e8d9da39e764bc09c6d807c13ad7c2af3b7dc3326d9df7be18f5e9e29fe7ba3f71fab5deef6bfdacedfec49abeadfe3aeddeb29fff766e30eeffbc58f685d1e8ffd768d4feff3a77cfb1af6f7ba6ede49af09e3f56cae8fba2d1c16ef6e1994bd7c935773ad7dcea605c4de7f9255a69b9ce67b7b29ffab9e656a773ac6d837265af38adff766a4f19bdf6ffeb143bc789feb6a773acfdff3a95e9e91c6b07650fefc1f13d7369adcfda3e4b5fe73dfa3ac7f6b4a6eb1aaffe5d10bade7897d6d6ff5acae5073bc33f6bdb3e7b8573db2f4ab92039b7fd6294cac5c83997720166e7bf2657976e15fa729fa5cd2d24bcfeb71c6f015abdbcfd358c9dcfa4cdad65ff776cd3b6cf6a21c95a6fafd5faa6d6ddd4026c6af19e7506919a68fb41ea840effb8996537b3de38e74e6ac7cef1af693baaecad319ef3b676faee79cdac26cef987ef3bd656b190706ccdfdd57bfedf3afffa5f7fdd7dfdb383582c9c30edd7fd0ee6ba3f314d8d3bf7b9b22fec7e0771d65ff861da9a68fbc1c144dbdf585a5774aeb638a9d4deadbfe2efddaa9db37945e32a8f73ce9b579c7331ebdf9eddf4dc7ddce9d9be3dede7a4dad839a6e1c5dfb4726365d8b4eaaae252352ff16655b659c5e4dc690f3aa9536aff3661777e9bdbe10fcf5faba5adbffe5adfbfd6cf5bad67fc357ded6676f7fe576ff7eeecfbcda57fa2bf6f9fb57f9481df9e5fa0d4d059ffdbcb5cbbff6a9fbdb50f7627b5d317e29a2ee34d2a37f7fc157f62edb5bf3e9be99fe8fba81e39776efdcf76fbc0ef5db9aafdb62dad7e43fb63fdf6fe829cf33fdea4026b36cf344f70ce9d5df9dfbee65aadbed38b9d31bedadd9f58e5dafd4a733b7ddf341dd8957fddbf614780208a37f8e7870081d3cbb2efb21c3b68266832fb34992ba2bcc9346c32959a029070a79765a953e6c23f6bb53b7df79aeefd6bbddd95b75b1fc3bdebb535d76a777fc1f98fdaed03f4fcb7ffce09c7ddf659183bfbac75e676fb6bfddcad7f6bd75c7bfe5d96e345b3deeb986b61cf09ff0b3e7b776e9f3df5c3b495dacbbab59fe36a27eb1febb5f1afb74d012478bfd25adaeef7179469ba9ab5bd5e343a98b57df6db3ebb9d1bc4f3b7bff3b787adf63dffd81a5faf5cdbeefa03b7bec68b4607d170eeacbfcdf5da2e73edc17a8a43996c73e958f1d75b58a6fbcf0ecec132dd9c8ae3dc59767ffbcf74bfc66483d1e86073aa49da94faf2ad5edef6449abe2b9445a36488b69fd230d79ed0a5904e78db6dbff8b3834d2946ce9df0a0541fe7bcffecfd05e9ece29c2c7bbb396c7c9d69bb6efb3e1817c748d7c9b2b72efeb91975a419053bbbd7d8fab7f6b7b99d86b9828bb0ffb73dc76689d69f6d46419b514c04089c7fa6e1b399db7f15010267ddbbf23dffd96beb0fd8846272d37460132a07941e77767fe2e29f7d2fa32efe994ad6e1fbdb77f329d1939ee6d30aee9c4e6bfa67079d9eee54f8cfd85890eabbfd3b3c7b1ae65ae37bfed99b2b65fcf0ecc48763693e2c2d379d1e7ff6eeb65f6c3a41e09c3bfbfc15636cbf7dd389d9e4873b6dbb379b1aedffafddf6d8de9567babefd2dd89db6b4d94475c271ef3f3bd8f4e49cf3aeade96bfdb79dbeb3582e3dff7ed37ecd26e6ff57a6469c77adb3afeff9ffbaf715da693241e1fd67ef26930cce9d596c9c6562b43d8326931ed3939bb93ddbd4ce00f7f09a4c5a4ef8cff1f5c3336173a911e7dcb948cb9da6ef6ec7bddb9e417309ccffff6a37371877fd6b634bd3bb656f73e7cabad9b30daa471667fd85d69a4bcfb5b1a511c63ddba07af7c7d6febee3396e634b236c2e2d39e783bca98484f3399ee9b8a904c89d787d8e7bede5581bdbdd8ebb1d6707bb2cfba6121977a6cdbe7fae6def35977e9c685dabb5d3f71cf7be42bcbee86b387bc786ef952f3c8804be7d586f4d25d7d39976d69de33bae1761ffebeadd5a1b374d711a8ddad3addd4c1e69267534938f653dfa2fc4f6f44ad3f5b69bf5e9f5d764c9af37eb2fb4e3add48eb71e3bcb5b6ddc7cc5b676e1e0226d07ff442b2dd77db9eae1f96f19f16eda0f9669bd9970fe17e83aa1aba8e42dab6864450c32a6209a9119c140004001f31240304828160fc70322a97817d571031480036cd4769c4217894114a41032c6186308214000008080008800510500ae97360a9a61113e3d6dc5f556cb82b583e126f0749fb2179d048c2a972c497047d666b685b8024dd0cf32b7037a009ac69495427870c40bf98e3f06483da79fe6d1ffa1cbac3453c9be1b366e7a0d585e6fabcf5ed3b0d38b3c268aa59d2915812d67ee29cb430277540f508dd4ccb14838cdf549f93d24adae0c6f73f7c769edf42502df12894a1d62f8c77db962dfce35275bb0dcd41cc6397ca23a0b3701a7e5095334f930c89f502b8bb2aad4c6f74a5e166b30dd051ad6c5cb3e65096c60a165f4636b6b151a198fc44d5712219a889450ec05e708dee48a68104d79841f0ce92bc51d3e84cfe517ac53a8d306d63544c2e3f1ec8b9185acc8a00fc5f200824e5ad8cb4a67044ef276298eb55476c467171ed8966a650891b69c5523753a1aaeaa06151a80a0fc64ec0e77687593a0ee0e56a8702cd231759f49d3243bff8ebed217ad9a3d171dbbaaadc149dc138f542126382d9fb2aa9101e10d98985309195bd666d06cad6190c022d915634243c6c2116a900923d86bb5674ad2026871c723e4b903c5b2af233b8aa8b1541b4f2bbba6ea82bc3c07bf92d5d9c7d9827534302b9932d60bd33113171eb22ca2c4d69a4ecd9130c42ff65cc027e46f1c9ec9bb9ea46461fb40b77cd8c950e839f8e288ec04686ab9cf28e4283dc18c745e9059f7e6d92759385378e9e763ba093e7ee584bb7e91a7001029114bc767d2bd44e9fccd4c393a47722d325788e082b5165b41e1928b83606c303623e2e69a665ed7f04c24f87a3e4816c27ac91c330fbda44c015eaf8722abe9d092fdb9ba5529610076346e6ec2cbe5b242ff4a1135deea7c56ff2f36560066d36f713bb7643b1ac45df7b116ebf93f047ee7358809ca7cdc130ffcb77c86f93ce47ff516177832017972301ba6e84b4111a7088a53c2bb7bee49b3eb97dbccacddec98ea067a36917f0bf224926164487f396da11892ad1f281125a060d943f01e336ac52464f2716d778075793564a8d5f72a08073bdfc22f94fd9b6c6b7a8360151ffad9fe0e819782ede3389fe107d011a35510eb92dcd23ccbfa58d8c9393c14af2bc666dddfc3ff06599933294a43910dbfe083597be28ec3df948ff27fc02ef51e5e123cde8083e72b82dd3c09358e2ecfbb37c07f6c58fb390c9d610f75644d82e104253018db061f2e3bde1bea626b15aaa758b352d7064476ce64603af912d9bc82600f890de475ff206520f8f6b20596c6d9f2e88d27777a667a804ab810d6c2b170e657dac69b0274d846e38e6921e20bd1dca96d83e61c9bc2af02158ac003fdc72b96b593effc6044647b6b73127e6b58210f703222788c6ada081ebf695321213955d081dfd693976caa34c1ffabb14dd41e5a813392f6d3d39eca06dc32ac4e15d39d99012e4ae051d8bb040754272e6b6070b3b09af78c33278a043061d287ab3b59a68bf3efe342480d79103bffe698170e156ae8fa6962889764678208498b882215e4f14dbd507cf59a545bed36e83fc5d1e2b3d2705928d8cb455feb42af57fcd6afd7f48606446a6cc1a9eb3debb7ddf3eacdd1b4f5b032867b0a7f7abf8109805aa80eaa3e0b280f9a5ccd72400ed69e487114f558ebc513856d43f40c1e4dd78f167615db715759cf50f6f70f3faa9c06cd536e5b3681446eb92ada0e93e730d5dba3e931011d2cf92996d90d9dea83168073dac28734fe737eb33a5638a863296a623c3e8e98971416a75c333dd56a57b46d7fc636beaafa5a074b1cff1fc8aed40bf1fefc966d25da8e615c8f919dc1db29b645ea42ead56f184d1ecf2b217eba26ef6313e85c6596fa4ef147b826e9fd246a4bce2e84bee792e6074b0de8cef1429bf1dec4f0161c8ad06f73fc8a7eff4d72311c382337a5d88ae9c821ca531933c555a48955db39fc6c65cbad209eee99233101a4f8fe64cf76db0f655fb5e47c720d9621450b373c4a31e9c58afede159d74815dabc31f65d6fdda34722d3b1ce30ff28f5c969a399f8b26a3cd5b97388c0f9704ea67b95bff3898460dae44028ad7e6985acd4b8642e2d5c673235b1eb1958a09c46f3e687124e4ef9847a1e92eab7f215f91874d3e730f5aa4d5da60428373a7b110575aefe3fb1f84dbb785f0413d3335f700540749c17baffe05687d05b6e5b0fb3eea654fe82991a2348f1b14a382b7b24fc50959c1c066d79329840ba73e0e0b76ea372aa6813d2a7e91af2c54617bf03d963d38512616f87ebff40ef95ee4fd4f431738e5bb7908eeaa7f7428678ec9053b58556a644c9f691326df5e4e5c06c7f11457285075b34ea1aa4b620fc0796b3f84070ceff4e378b62b399f102fe8215b2bbd3a5eb7e636c728b61c545985b5a2d6ffaab6c089f8a6df169de16d77384c51a130ded769913fc4e9f1882c6ece99a9e281db756b909b80037bf001f5671285ac36b32453a4b363f4a0e8ad9a6bcbdcf0b00d095ab52e0b8ce6e949d3973d9c576d14c3420855c4b303144fd1bbfa3d341ebf34465d1f516e885355fe0e060a654211ee995b6afb0a3499b8e8451a6f2f4f4776e4fbaf5cb838edf89ee25ef0fb640bd92535d6e77ffb49dfba2208b7a1aeddb6406581de0ec2e756f7a2a5dde6bbf3391efe9158911c4cc5b4df82c8c327a23112e1bf0dc062559b5868a46022bbb781471a1092ad1857e6bf059260a2dc4b80a1fbdfe6adc51a260094c105292309798e18190067bc875201cd4facf9ce29e0d93fcab625dc5ecdf5046febeaf6ed1bc194518b0a21e645770db9c6ac0f12aed44bf9cad6c04cd4d7296a80d43c7ebaa3dc62aa6fc5ae782dae8eb8a9407a50e20bfb1145b49b666479613c287bff182bf08c9929139ae2d49d28e088927ce180569132cd031c48d1e88087fe0308a4ca56db7e80518a85c4384c742b9e06911eb9ef3d6ec1e51194a6a4123f4a0d12135eb68a3bfe3aa98c569af85f5537fc38282919913f66bf7edd238c9e0494179ce84565022a29fcc9ac69b5cfdc3eea68b6da523219f250138ccc7fdd349b77777247051f934757061fb1e002195dcb818a7a47addd0cf9e082386127685e77ed5f517caeb753211acd1c5b189d61dc90bd9a5b6527f3c01ad6909d89aeaca5dba349d57f80317aca302c19a8fa3259e8cacdaebd9adafc74218e09decde210d02bdd44804ea17c57066664e8d45c5718801da5ad0ebea2122ef02dea92785e38f90a0d3c6651c1880a10f9d2337711b3f02beeca40805d9573843b157ff2a92f610b17664ba1070f0d8d42cc0958694663045ef749accef249f004348d16a669349160561215512429086312bc9099362e76fd169d2f60afbd1b1b094a1a8527270050c7b609d940ee146bf4b15963d31581cf48ad75b5001e09b3f09d80623556d5accf71e9137ec6f243df4ae57986030da7a8b0acabc923cf641335d03a6dceb624a679e96d9778dd9a2c8887711c85a04754ce00ffe0fe9035ae444ff8f315a9872b4dbc2123d5a04e331f6757efdf3a956014898369682c99f75133ab792357df2acf14bc11dfc52f60a897d0b9e58f47301d64e76604d81e3f87a9b99fc4bd49904df18de434689d0248bd80865a558a1a94eb684ef710737d6c94c27ac8c7667fb91fdf5ef3b8d10a41e022c4027fd9afb77af761ffeac3c2d91729a3182510eeb8c9cc1ef0033e273d85f8e19c3eda3bf9e7e460aa2c95e1e01e1005ab220e4d696efe58d7de5e79dbc7d0793bda8febda2ea0650b98b02453de3c7877e68c887856db9cb1ad24e70323a00b161bc88c760fc56b8bb6214dc6090ac84e1d6468e76e1b123cb7dabc92cedc7d927024aa5b21368a2e90ec2250b51cc0082e67c72e41eda78bf4f4f06ad9671e452e185cbf38d00934e808dee810ec838a2b929dda49c1fb16c1deb62ad6e8358d6de72745c63ba50db7a1b976ff8faa4f9d3d1ec2c9b8a19488fd15ab6512b71382968bb478840437441df653c7bf4e0ba576b8b3671f759b9848a86158d6962a6a56e837819a471ce09ffc8125e55a22a5facaa095005268eed3df1609c9b27f2335310883673c415d710ea8677a1d0b7aa54e2f44dcee74007f147e2f8c2d700cc75ed659da88136269d3e19e10fb734d26c7902b9feb30b06eaf5301a25d94a9b68674f3c8bf41a92b596a0fedaae769ff24a261cff71003d4313488b8599ece27040a26fb1e429f4bbe00e737984b702b6b775513d3138f21129aa1da28125f490fabb24ff76ad31a9bbbd65cd7ebbd30c2374903d1745165a0116cd34bce41ce551bac1917796d82d9810e11cc201c6423c94f9d44185dbdf2a88d682cd82cfde92804e9f70978a38666a45080088cf3fbb4c5626677905195a6047ff744a35e7811e6c3607220e344d3df0a0ab568da865492653f1f0f5c94162f5a2f7a2c495ecf4dc046b21c0d726af4f446e8a1aa9c2194f780d8c71474b11d6fc7a5a9e3d9c5add8f78b1f90dad4b6a783816b6908a6661bfa167f2961804701f2dd96fa951de72587bedd550d16cc06467b7c9986970dd90e0422d396c4b86c964cf14e583f0377ece95a62d74dc6427e36d0b841d44d019b1ed792aa26c332886027133476950f570fc8c8b65566cd4b46e4ceb8fd6ab0a3943b2c374655532977b58bc04d109b18715a9dcdfb036f933c39aebce53f9d1b89fbac09f0521f2c797da514bde0b9a62d559dbc5c68d12690e20d8737ee413d3effcf3e75b2775afb1411e933a03bc592b3727f0100152f80c5c3bc74b191a24f95b345f2d30bcffeac9cedf89bbb872cb7bca783206f18c90e382b0791870813e2b55dbaf55f6550678a2d4c93105559c88305f41e2fbf0535142b7cf4c0915331ab84a499e62641cc041b7686076097897bf4f3e17a516d3c60b4ba8c2acdb7f5d9678400145a80bf63bfcb9cbe3f2141fa9210e0cc352ef700360302f7e21d2406206783b63a4a470f65f98d2c3dc3ef0af9d621460773592ea4e468200124e7ed8fbab77fc6740f13efa13e1999e300713707264cf88f50c709986cb6d882cb28d5938ccdbc5b03c2f465e980a9a890e5b2455be675347075f31f1190da79c65c11927693b8c0c53b0083738ce1c96631e10bd55737bc013484e6168fc6b8e7aed16755a697cd34672a88c22f21dd70d19f22da2cb0e439ecfed35c87384faf8ef2e3040f98f2855e53332b16a3eb36eff489a5569da43006114cac256de424aaeb81b788b327f849f9705fe4ea80cf45b6f9c0968702237018a811f4a5755e6c1c149c234b9d8a0942e45327528aa174a8d28372c8b61c8a517e22d5b34b4e7c2928307dd792b9d6091c3c49a7196a817aea8282c67e945687d2e8ac31b649599bc57e00257be008fe104e1e2d6ecd150b24318832938cf10e3d24280526b80608ed28096c935b1a47aa062c39869055dd7723cab29622fceccdef18e61686a1b4e3a842889bd9fa1fb08e40d653c79acb962b094f9d3cedcc7b9bc963bdbd92b5a6cecbc6d17672f47f7be83c48eaab9e9be569d4d35f92c14eddb7765476ea1915d30783a616b8c8cd85a56680eacd5b7aebec2132115ba960f47408312ba3a5a0b351412c3b913db97eb52baa944c2d992fbbbd21d5aa708563ee898a54da64523359fccb44c15147b5a823f0c201cbd1702a75ef382c5f3a0b1fd04a5067466a2cf703520ea901cb8909ab028ed83dc697efd3bdc0bf752b69bdf9c96c61505fa7d5bba7de4a1a4c9c122209baaf2ba1d132d3e60953693b923fe2e2622a63338d1088e45656a2595334156f14ece837ffd465208cc813de57be89b0b4dbda8a85d7199b2af8d07e771d578c7a511140abbea6a61eff9b4b8aa92dd737d5c9a5498bfe0c42530d34a1c3f469bea8029456d93966d2871a24d98334ce8448fcb3a772aaa0e7e0e16bc8db1fea01f70ff47e691e854ffe860acf08cdda12d84e6208d579c4bd4e8c906a9b6509c8b84b60ac409615997590bfcc1ceb7ba97f905c645530a5ce59a728cf729e5ce5e635db66c98d99566e2fbdd1abdf818cd2cbb774cf23eab6ad8be4901c7e265e4715762a7c3415f63738dc173eaffaf0c064bbaaacc202a90298278958625efcee8ecb0ad90bec37524c3459ce271b1f621afad5bec4eac2f7be29080023ba49ea146b32e6ac7a1cb8f0594d11ff06602a1ab251c7124e585e40bf4ffcc16cf36a6b6ef4622a6191bf11b664aa5960b5b128ec4cbceca7db8f73bc24d0e84767cbc6b8e9d6f577dfcbac96e5d0fb251060e41558e6b48cf25058e5f0aa29124ebaa75df8f6c4dd836ed1196ceea575f41d2479fee3743009dace5af832ae50cde54819e31c7df06a4cbf800914ee8e7df3d6be133de63e35942309d93581cb14bef25a3324b2cfdb89e98d28b092f052893e6d6f577cdc819fd48e4af46c75fe3166102fd8b868bfa2ac1e9c6579c4878a02119fc8d5663a6b5469c6fdb52f7fadc2d44a390f98e51eb6289881eaad21fd83221d832828fef8f4ac28fe38f1cb2471c7bbb3a761dc434958c73ae8ea339fea76fa1dde93987e62eaae2d26d1b165079ca43a8e4e87884496290fde8bd374be76cbe1674b4aeafdc7e9783ca265b27c81517c9f223c0885bbd969f138ebbcdb810df15a51eb292e61c473b26af5cffc2e511d2e887d45dd10062421b5ea55a292dc3ea1e1f8064bb59f27f266a64071c870e03f5fc9c6e75aa0b3cc312f2c7a3308f3b85b553aba5456848203041892fa938e56af00e70890727f1fc70a279665a5a360b0b7123269262751573aa91160152f705b8033dd3b30ecd3ea974d1cb4062f0838f7f3e6b659a03c1c07c7a2c7db34462664ca0c8d16ef42ecf739a13551af03ac7b2489ee13e857e2f272972be152f2e8bacb0aa5ce25b1aca3b04e9cb4f9c67bf2aad0628612bee3a74a30186585535c8594b7f87b0664b85cb6a044db0fa983e82031b80edcb4e31b65ed786c75699b13a658392c9d541ddff55d46fbe23f7b64839acc28afdb05be573de2b743eb4049392e59498b7b573abf6ef58a78908d31f10d048e48c83e9d67ef56e26d332d73fb81bafd8ef4c328dbf7283adb99da1d0aa8870c0e197b84902691a4ad32106fa8eb6dac8b457cf9cc8a371f0d636f8f82e3d7e0e65bf6ae78486b29e190c5af2c746167de22803d620b601d61116ecf9554015d50e20dc63a5468575ee48feee2b3849737efabe44fde5e088272eb75ab21c898e95f01e5a84aa574511a6f736fdfd608e3cb1130455147ec94efda99b60b6f8dc5ef1b29891cd4e1bf4cab6c79bf41213b9d20023f00e1a093e8fef139e29e38714b5c3611ab9077afc96bbf386778782db8977062387e75e318b31d242f052f63f7aa6ac416aed41772a95f256ec50afd6145c01272010bff397d5bc1da6d01e7abe773c4bbe7a7ad889849e97277e806233ac3456488bc991c022e83684bd3b3799261adfb2ee1086b01267a0582ad48bd463c1e420d802064010e73b9a677db7b40f224db1a68971916cfdf6a4fb107e104eb4fe6ef28b36a17c01e24c4a56ce4cf5a4f721114d8d1b2586ee473d86a030c36649ec701384268538d7cd60a9421bd04c03c4eab745a6405a506acd3517ee00f0a2e6f058ba95fa1ab03905c88094c8c85a2f2f960417ace61829e34754a57d7ac99bf07b3a5d0e7da148bdfb452433255373cb1982008c4ca562234966ef24f4a9311900fb2d05e4523fd1f45505d64f61d90c3420144ea32966dcbd1b9675f42e112e9ad1d9072cdc18faa9d7c7dfe0d43ff52810c26d5c4c77f8d31afcc387bdbb6148b768f81d72aeac825cea611b0148afbe0db85981efcbe76e4768e20e9bc39d6b869d37171de223236d8a52c6bc6a9aacf7c2af476d995e532faf90d1b750b968547c209b9ce19e9ead38aafffc88283ddb57e3b792704d7dd531307b2e8eb14eecf84d4c0097d904afa38f4b2f5ffc957817640a0afd76bd276ed452387b241963dc4700546c1bc284d1efc10a7411644deb0d0199ed41c1db7fe961f6f0278cdc2bc6c61618ecfa4aefda9e545fc6e417770e611124783c587e8dc1a9d441920e477c651ac9adc59ca35e66e64d8e314eebddd91887ea63dbb4f7d4f653f3a33880c281f91f1139539c541fdf26f3d51b6ad72f93648286d2a6ff77235f37e27805dd4fc555bda84a3f7fc447f5d4dc0a709129ba4010f29b5d73d85923bc083112004b87f3153bafd809b5d46378662301bb0f8ca896d040002914be1cd10150cef9ae853ecae2cf5d976c07cd07396e25e27a14dd5167df0d125051f19f3d810a24d622ab0728e6c06ee4d3b660bd151e9c5845de4720af27382f34114ae4e79508d34026c185966742a4b965356e8768f6d4fdc945cdda2400f48b86ea6d7809dcc90e1e9320cc59cd5a10285d4729aad10b82775450b01d01feb814397c006d1f8ec46fa8725401fe501ad8548081865d7320f18a6c1d29f582086d315f589fe0cd574a103e181016e40b7d343d3156f5411299cc0906a9a41975162d6d4dee0fdb828ec801576dc8d85a6a0c1529130e77396aa499f64f36858e74d27d2c566731448b34b9cde960634075883d19ecfa3f79a6241bff4251453733e1bcacecf8e044319b1aca0b01741c788af02e9fb2f158d53ac9086d400ceafee258360f8d8d81b251ca4062caad339e1ea6a80cd809eac5e175853ba6ebce3aa267acfc2c0b6b5468dbd165456bce7a11583891e2e7e68e8002e06c147856c802dcb08ed144cad098b90dee142587d0016bf48ef4391dc5b8a75bbbe3ee954741bfd6a65599f72d01c29fd1d63255dd59e80a19b11d7cd51800e56193c8c01fcc34871674dda60f90132dddc4b157c5712cda89a0ea69ef0448ebe128c3f116675a75f42def0cc176154e281c29963b87cdf7bf880599b4718b6c2781748798f66e2632433607373f799686090da59187c8b0abfdff0b1c100f75b90732371054b03bdb638b3da75563e41890d6537522f6b0de22db7a46a5f2e78295158fcee167e3378e3ee9180997acfb3b1d73fe0c0b6eb18fbea504070a09401cb174a26cea4b585c07512a64306adb0dd8607918237b9e478457ade92c22e95e70e3f6606388b8630091043b0df5ff629e3c8f85d0990ab168206205c0602cfd1973a3d3d44f8924959caa7c060a963bb2d1cfbc5303a3a4ac9d5b57acd94a3aae8b82d35242a405111d5a11c70e85c2ae2b7bdccc93abb947e3ab0de8f6fee2901d18e8ef9f68dee291abaddf052bc9f1f3e6f91abf1fd7484086b7fe177fbb73ff77e44dcf790bfa686af26392781ae11e3a945b54815154a8d5b8631c4bcc7434b2e609ed224d925ea19e46f72e16bb70609b214068799691e3e9f2168c8c6bcb7d100632b86c7e55dea31660485071f233d41acadbd4c1c1e210eddc1c774c77fb8316fddd527aed88ce9764f724dd820770a68867e77983b374523fbcd8929e62d0bd20102a48ff71ee0f1632880d0a1bac7c964ba3bec4b6d75dc74d2b90dc912d2662a4fff4c362fa1798c3d34aa176df48b5c8d9c318244466d8b7a66393e73a0d952f95e7c5f92d7ae24a5097fb258da3541902d5e99e4cb4df0a8fcbe711cbd238dfd55109833acd69bd4e69928acf404b0841e3c6d80adc903a733db13a74f4bca9a481c212f77975c9fd0cbccb86e9c30f204b1e71c21c39ac4de65c46fa3af00a6f5a3c117219b2fb76b5de8db91d3baa7f5e21eb31ec4f2d69d76956d3670290e71914e69cb2b11b76ac4430799c05a3ccef188ed19ca210be46cd8ca683124c44042e217b6d59b98d43e6b5bacdb8cb94c242dbbdd239a18f81e14462672619f982ff3bc2c8801a973690ecc6d07ebdc827ff2043ed775174691320de046cd636a74a0dcd5aecfede966ea863f581c4dca9ecbf2cf718cc6ae6d1c03039a6dc776dd9c674da9f194e63aef6a59f3571cb311f482d250eef31b960fdae47328af21a8681828f04ceb98677b53ec0b46f5a87510dcb6a0b612f33e675a2d5c5400c2b86f8d95b677b54e95b4b5afe75a22d02d931251351bbe76ecaf5dc838ee49cb36170f8fac6b7435fe341d2d5ed13376bd5f5e932eb243755fab50a08cc33669f0e8145931b3f83d8c92db6fb84f80d20e90d9fa12fdc837815eada8d6d358735aaab6a1ff224b30c9e12aa098cd3cf8049c4b6392852b83b265d3e24498b5f5580542c77083e9daa6a277e310b6b16372a1caba1677150490bf47130610513e6d19d20ce41d52b75f11e3c8e7fb46c7091c6b636b43c5af328a0223e778fe344c2d10382f7f3fdf4e66a3716ec35cedcf341163669e3db59b1f990304aeddf2c6a9257fafc57d03d9cd8aa9c2ff8dca58d28367a1620a0f2f775ce73ae914f2c0acd1050ecf6f709b5ca0b4021b247847c8882d45c50aa8260361b244dc3d92361c149f14e984874e3dfc85caead88dc192ff1d6287e5977c14631f535ec08f321e727f21f56dbbe158c1139454ae361e4b5e6e4bf7828c1b5732870f230cd76a12ba7d12036690c27372b90109ddbd1e84ee2cc4bfc0f305c29f0ce77a66d9eddb64bca0b0eb8fa48ffb62dc7770e4c5fcf9df843cbcb073c575fc898b11fcda1b5c63dd86bf46a79d904fdd7c6fc2df75065f2a3af4f1db07e70f5b41dc454b846556b8177acebea2852791366aac153c81b379901c4c2326f8aaea9627510d44593bcb36b7f24d193858a96bad9d6eed960a8f47539825b96a5e24bd36105f766eb74916c190b8b506c85b44f8601a52d61f1f2664d82d2f18899b6691e8bb72994fe7a4c05e691333839b36d1745661b89ab3b164cd2920871253860bdb3f6a3388f64983a762c9779e6c1ee1f699fbe49a4488608853634692b6e74d28ee53fd047637fe41185536e97359b69dd8bb5bb969ac1405a9346d1a00454e6b710c858b1431650f4b21d43abf1e8fbd6f09c4382d74499cbaa3914b7b02a068c07a1cfe5b450795e8ee6d11daaa43cc5248e841aecc0766e4dad8bd4fbbdf5b09622b9f0d503298ae4b261a5f1e3ea02ceded0323071fb3de9c09de1622fa615d3e0f12306b8fb65fb5d94d803fe3c31949ab961b45d1b1efd9e552a9d3848ae2f18b12e8cb248358d060a866f295016b0e4cfb670264af738e0e6717b2c624a846acca3fa5767500e3d23c846affcc27940066de77522665983da5dddfd67bcee9200c66253cff9bddd77d54a24c14caadac447302ef3092decd34c2bb46e95a183518c0d118ab0e088f7872f539ec8870de1831b763c8e6e0ff6e1ef4d8ff1b236fdd727f7f9e76f4f4d9ce7944dc64ceec95ae7144b036f21531198851fcb427eeb1d9703aa730c03bb6b5948399d9d7650beb0ab325b820a2075969a0d8d941fe37b82f1811bed57a3cda2e6fd993652cfd8f439a6512c287b21c30072116ab06d3fb4a9526bf10c1913180e74ec67600256ac866f4c181a0036ca109e38c95370b0338bdcec2d3c206800ee4a8879c851ce6334dcee1684a59062824cbef6e164a0ec89746a45770c569c524e3e2b1fb264b8ed8ad46fb0aa38808c13219087735f3ec98ceb0bf93a12d1978b859e497ef5a0cb6c3496b2c1eee642c0e5e01b1000781cbee14c7f740f726e6c97fb3dc48bcd7693bd89bc04e8bd4318edaa87534bd2c00d9d5a5196f308add27474d21829fb5cb30f0ec80eeec4a43bf7667aee33d3da2b2733d0d34c9e01bc68502c6b3cf4507430d90f794ffcf7e70208d4f40f3cfe23813b67165064c9ec53c4b7173181ec1e7b37a2748ed7a58a87d2026f0890badf015117e20756e0c36b9b4ff11358cb5483f10d968d60309eae6950511783ee1344e49ef2837b6f02ead0955a8a1770260eaf8dd8dccb6e3f1312ee0539041f63c5aea65a136685a2a45ddf6c49527065570a30cdc386eef5a1a36a3b467ad412a9fc89015b1dd9ccea2ebb48cd9634b4e358b68715d7ca6be58fabf7bac25fd5cbbaa47742bc4c1e94d35f88156172e2057d8751c24066b8ca80c996bb0f773aca05d25db1f540b9e50445bccf7d5c7a46201537a390df2d08f3efc7a96404e63b03e893bed011d12a90c30621c1aed49c89981260fff98fd52af808acc6c7675fb756075e1d34208d905132c74ec740176e9ca9a00231e4c19334e19d3c2295af92febf82fa96ea9314a02bceb0f5159d4d1b4dd70df7533765740566e29bc42c0015c1c8ea34526b95fdfeb38870e897baa03a0f87d7e8e4be5a246c6087becfa6da1ac565363289a5444cfa34a22486bc4d14340794f937cc9164c074f2a7ea116d2549cd9c9eb45fc746eb1b19f54655dc7adce84e6072b28fefd7911e4c13506355b0caf577b103d5c24eb8390d00eb43c28d805d2536d5f67f4d46cb230595808001de964f33b18c11ff1962eea32f74167a01d655ea6d9f8cf02422e66c8e6defa0d3b47a7aa8a6fd20bf259ad203824d62f9b0ed8b4619454f586e9de8ae96aa5434305272aedfba84a09c323344e162e5900a61d7078a05bb09b152a79622cb19255d7a63f95118e4be960d0e7a3f58a30e83a9f5b5868f6e48585248f41498dea9b65d2c55ac194da64d17d26f9e18ec7a426c60b0e40c070d91973397a7669748bb65792998a63f16892df990fd3958dceee5a9fad3b358f1920d940a165a8b487c0d7b2b0aa47be58e1e8d0adccb53222bbef53366394cf12399a90f43f2bc98fd3ef363dba2a345b7e62f0eac8ecb71eccaf79d15edd53d80d70a66ee7a584479cf04534693fac0b188dc0c6ed86ad9b8d44ca605f134196423105743347a3a5649ed629f0c162aec69eb910f48f961756d04b976ee8ffefdbe13f872a98a2557cc3e4bb4c093b22405185f8a294de76b19b6adaeaeb1b3b10040cff6f0fee7b5c9ab425c5c059c1e04e0c9a8f87b9828c1a8cb1644991fcb25e6975ae55156cff52000d3dd170594161c62708686408562d5f038fde2c430e30f7eaf6502d7dff4e6e3da1ad7dfc6f0e7e64c31704940535ed6bab70fd11ac5e72a2dba4ca89669f70745bea5b9c6606a3a4386a2b6516b98d4787df32a326a794e1e4cd3cb19b6b214479ef5f25c0e7e66cd382eddf091f0f167f9496c926e512c3ce534304f45b99fbd63bcf2d3d95b23123ed954b77f98df1e0a5af1bc0d82ba307e07995483a3c122097c106d068b2160856cd3f84b71c00e7108bc1a8c55b5512d82d85a6f7bbb9a0465093d81f623c05e260189735b074809ac4b76f432446e7f8a0726af1ca4fd918c448f3f8ca67f6b6f6639355862d79d259a49ec8e204697921e867112781c442a45caf27359307eb69aa8668014149bd2d55d41301c3fcff1c65d96bcc0d5a3f079853fbd7fff248286044d8fd2ea0d317b65e407e11b7fa2ffc199ce7cadf1496f16a064c130750f13237cc8c995da4199752629ad0006cdebbbce66ce4ba553bbd2d9a8892d090a0758dfeb64f110a2f751a51de34b03bbe2a99c5a166dc80f936f709c3046657f33bf0d08444e59e649b00ee260aac9f80510b73a325b0199366b3d1dafe3f4878daf58715261ca4e6b2848421ad022d2aae1965bae67aa6e087f444e9ecad23d7ed0d5d67f99aa6531806f4319517d97ac81d379d2c8a640b7e15dd6436cfdc189bc1fb652421a6d71a5fb5c82a23a6dd21a6723b8c7c2c386c9789d84e39b309c9e68eb14a1cd2f36837b70d34136540bd573beb8524d04ab0d84900dc84eac84dfcd0d71b090add9781379e52c630bc3d9e79f22dad2e9335795ac95051c2351009d3b3fd25efa6c3f2b7be3a5cf54165645d376d74714ad8450cb93e6f6925af3aced08e152de1f540af81e75207add51902df5d7a4568d702bdf52ff3c762eb3c3617f46bbb8aef062348d1a813b8ef53efb9aff480cfd0a5d6f3811422986688d702b1f163cca0283333764439a5ae60f400975a0f2028053de2705e7e1562a475578422215a784388f0c5d19ed63dead440a4c83b31b1c858d63717428c61665f68bc2e6b7b871ddfb7c924e0af44a68605450c1395c37ef03ca8bf1bcabff875bcd95984366c7da2efc903d2fc92dcf133aa27cd133a657f9d0208ac474ccf4fc2478e9842d519a46d44adc255106be2bac3f9fdbaa007cface16387329035ed2b2bf68df1267fbf34da9fd21477838bbf5ee616d7cabf23fa32eb2998ef418a00bc1a960417aa6f14069f1c8ff78b0b2ce91f9c07635108a4a0dfa11fcf59932596ca8de750a7de517f38008c7979c8a4ccd448da84e91ab9d47036cf0108dc27b96a01a9aa0173ee611c370e3b6ec316a28cd54f6b371f97bee9d32fb22109a7f3025b838ba60bab17fd47d778866f8fc0bbf852aadac2e7dd2c1ad0f9418961d1ee5b44e141ad88bcba4a26d4b01ea5238eac4e7eaa66fce540afca424dbad10694b843b2119a44d027f84a031aaef150de8d6c3419a26246a4270d2b08e1a450d75c7b643896547c94a5ebbbf9ce31d70879de4de2ce6cdea34f8b427a941bbdb621051547d15dc87e0cda48fb38f7cd829f0d1963c6d91a2abcd51fcb7d06c36cd4207888a3796dc99082f517ea5aed5bdf6cffcefa5a0076fe4aae741a54851c5dabe75713f4a45986e0083e34038c88c8f5f90e45e0b96fb9e3678d38b3dcef9ced803bacf7e660d8e05decf5450d46a73c4eb3e45bd15ef06190a869c05b64c58ca984a984c464e67c563f4512c9c0a2f355a916ff4cb6f69f716dea4406ec81c3336c0edd26e58e533b9303da0a9457fffce76005678881296234bcd69c0e92683229d6716ae8b154372190baef2fe0d949d6b339c724faa39409d32c15d3287733dcda515b5337622ac17b94d94a4699da738aa17e1b4a2e26ad436ebe02327329af6c5a9496cf4d3ff84d03ff7d880716107b250f3f0bcd197573b3362e6986377dfe9388c116d66297c6050f48fe2a3a750e7ab468dd4018c074d64e94cac7ebfc129ec7609335f06937861e4050889640dbd2919a1c2b54d6fac208bf9d2d05f8e1d00ba7f725f28f7b4fdf3dcae23fc0dc4cc83eb835b089d8be6eb5533a00594bde89fd95b412f21e7076bdb80d7a70ab533d729f8ac6b394dcee5ecd200185e3fd119b3979a0542bfc5c6d12b4e29acd29e9413c2b46c56bb4bbb8a0a7c89e6e3b1a9281422015c30947a864cd786dbae0110d8621a6288ae5f1aa3e78cbf4db16fae2abba4e54d9552f98e1e4f46d3068aee78624cd365a92779145155fb010c800d7813e9e9b3814267b0954962bb6b0c736e1fb57ad215deecb5f401cd2cedad88c4df68316ba0e984befc4122d2d00c9767414ddc73d2ed6a251861fe178848a7a6d37a473c3533317343c27c858865286eb046f878785f0fc6ae7e1a4b73540e8cfc09f5598a63a4f3f088d3e004769caf013ce483e0cd558506761ffc68beb7fc02ce1ed3a2530872c3ca1dfae0267824738790bab2ca7b554e927a60f8d98ffc47f8b23da31c063ccefc4e3b6f6504732b78dc45c47302473c2bb91729b1c788c8e4f0cb170cfeadc034863f9b518212be4a46b2800f2d7235051395d37fa2b4d80d37c8e6c2cbedcf1ce23b4abd73713b0f60ed3d5543303a470e709aedb80b00181ba4277af985dff29990732cd09fbeabffa42e83dbeef9bc118028b6603d596419f4c2afb0aa25a1460173203d98121441ed6df81b3f8f082de1224d3d39e79df3cc99c1b5aff87812a4f9a936030bc828059aed29dd231c273ccb43381f00683d94b1f69e496c469801c521524a2e9c7bbcca3f682a7876acb81747ec66afe757e90b6981420c627808cd6239bbb2a34f4d879ee416d25b8cb1210d05deec9d47df2fdc36da49e63fdd773a5aab20d29334d85786ad5180807a7ab43ab200fef292fb3bf83987908b10d091b2004ab44ea4df8573bf82c31a1213846fbd626fa8ddc60a01255f7ce6778f75aac3e0bca182f63cf5d2ce300f246782060d39beb6108bbcfcd911b4c124faa0142d94a21c5dec0dcf62384e2498ef7bec2d73539708f0d87468c3222142153817e83a1582934065726c852a2c07b94befaf943d9bf4d814c453c72e961621d2fb4d15b4d771a5a8c5593bd6f525ad9a5f0ec84f723474993e782dcc912fd2e7ece17c74236605b350717b07ffa439e9a9a12db043d54abefdbefd23fd9e7af37a132347012217e31e60b8d57ec81ded638cc7fc51810c391c2ab0400a80236cd18b1b47f55936c50bde2f42f15f60ad04947d78bc8435b66655d4738ea280760dad40bb02a79b5120d1c0e19db3d2196fea424c3d754c9c144dae7b56dcdaf23a6526addce9220c8a5bbc04ffd652cb14b6b0843f9756000acc449c977565e8b7b7e632f7bb986118ee9c4776aae9b7c6304ce9acb51e6c9c233ec0906d8fa53b2f90970883d52d39f222a8c7d15572a4fed6a21f273308a77877e5e382d015cd272d21ad640951c2b2bbfc8f6577161d4f423ca7d0f24607edd6470cd1724b28cbb066db23ff5e9d03f571a5a7b335db61f13c34d9183caf10193c62c4807dabf8c20828c246a4256adcac9493b88d1c72fddf426c09f5f282faf4d0237cce5cf728ba65bc4d03abc85e187c881986bd680e8bbe4a7f695868efa6d0b1f164d6350feb43b4976b388d6bdccaf73fb193283e790002d2636efcc3ccbf8fbdd154fe17f17cc4789d867a013d82ff66c0bff56ce085df31bf92940790b24c3b8738cc82153111c349f054097065b7ca1b433e48eebddee5ce329793f95f4275fcb0e5802f568ad3af28e0b42cd565220d74ba06f4bd66f839b685c38b38967f71e9ee41e409aff9e5e82b8aca7c6725128e656809bee7dd818f5c58ccc8e640bfb2c466fe0bbf087a217da1730bf201f37599ce13cfe0601a0a2bffae720fa9407a099d732172370e88cba0352a2b33ccfc58b5a0972c0cb6a120a9c71075f57b44e7a5ba9b5cdfb01a23834cd6ad641a6c220b2235e595d9fcab565d6472066b82d48895931704db0bd8c7f72886c8ba90fc6c0286263b0db5e18d1b70cb5c1d39a6d798243af3843c90300e90eea7bcfc41f9838a4d6586f830ef2d5cbc8c83de2b5abf629d24e7cf2ad6b2fc3ad4d0bc356dfc6d5d27771d65b6e8aa04ff75a5c56c95272fb0e0cf460c95e910bb534a9495cfd3f7662465daac9b266a2381a1d39c8e051152031d4c46178793b9fa1f7785b049a2bf096ff0d32898ead345269173d01d07bfa1b123e48b738affc22b512c2836c4c6dffa36e8de46a747eec1dca9c2fec7fd390bc5ed735ef64b0c5c481613cd2b4ec3298cd1eb1c72afb2167c1999c7a6f3c6ba224b343c6a369ec38bf4f5e6e14181ff41a9c9c0d783c2321c43ced6e0acf3d31f3acb01fa3e66448fe6ad0db6fa5f8b72bf9b49082050d3db973b2d7d939378520b965f9af39458468f70e72b30fbaa1bd33992243d05504310382dca8719a9fb23827903623a749fe8a889d82c7b9bc31c171073fa34873e5d22d68428cc601989e15e4478ee50c00dd908573b5c0a34bda4e5b2b93d25e2d31e0f3102ee262c00e4c3e9502d2765283e574d3f6fff5063306a7962893940578b57fe27faa7c275aa88e9fca6ce49f0b8afde9d8dd465140916e76d03314b1d4d64df6940ccccc43b3036b06a97aabefa051226cb85718d964b05bfb6ddd189603ceb8d36d42a50b3a1aebe6138862a98ebbec2905a8c98d6e0d660956f5d6dc4291c598713770b2c910d7f6350eb44504ed8baa095b1aae7dd360e458012fb8d6e838e7d00b0fad4a067588ec4b9d99a91d25716ca9a06f80adfcec6c7089aee5216e566cdb479b826c88b1dd7acdd6da86ab29438d6da08b33c7bb8293490877d67c870165278efc8d4e13aa6ebcfe9d0e4a8e05c01d9b655c8c53f83b1b6d1d19a471747fea3953b523047c6b94e02e80ecf9d5b6e35e80d0fdeca1cf2189a534dca79da401c7c945291cd1fe901b4f689dbd349e98202ffb0c4a866dd0e0e046e285204d6933df8359c429161a6691b597b94675acfb9803cb823fe70fe71310236b2f76db64d831169c9a32c8a90c1136fc7c4f65a159698c3b70366c93c09211237203efb8216cd816d522d310d9b6c38f75d1e8ad1343acb80178b17d3f3a2aec0f0f7091ae1b32ac50825e6adf0cadc38b9b9f9ce5ba78cb5305e0fded858db571676b7e6a9ae10b0eeaad563b0383ea645428a9f4212dd9554b03972adbc1319dadf152b1fefe9cac78e94e0fc392e130347fe4743b271973ed6172533a53aca78b262944f6c087fce140e785cd1978433c8c154ffd4b9f301cae71ad74fb952aebedfa94cf68b737fd223b9be772bbff03270174f14a96cfe7d3314d58bf9e6cd1a8d1990d2dee28c67d058e9b9b354d5c932bbe569ed5ed5ee9de24bd97b3cf8ebdfbd237ee983b92e6e45953ea5accde6f7ff663f1c82dd5de9f0cc4ce6bf686012ff08168b6c77b7045d190b997d7402e87a6faf802f6709733b4734fe8cf7ecad90ec778d3fb4f3e7ac2d69cfa572ad6fe07ba9064514fb74dbd05ed1589098119be58b4a215d009d892970263a47b9e5e6c74ff93d681892c90e103b1d2d5154a4241f06f2f427ab1e903f827328a295bc701c63626ad5f584a942fd9410b1fef32b735e201d285c772244233b960244befbc75e9db8c438e958b42109f13d025cd1fc46552950140d25e301ba2a3907296e1dce2476c92bd2452cc9662a2d161301083d604afede662882fad14b65feeca557e1a8e415bc0adc0fa612f13c2c7e65131140a95a1e599d0f06bf2c0ef9f54e8bda617e6dea261595137a87a05edf0f66b4404ae5f8485e3a72f56ac1263e99519dad8a9345e7e1507d42bd5e17a4d7accbdeb8f710da23c1021cf75082a1422be5264438b8c1123ead5c8273902aa472c0a925945325c9268a8492e4c9440922506ba64d985c95e69a241d526dfad3cc15628143b5691b254a80c47a9e8a155ce122bc86ac551ae4cea95fd824575c57254b2c045b3b8562d2bd93252b7e8285cde281764e9e259bbac172f73f5a2bc7c79d32f480b186b0a66818459d030ba8b98671583a19431f652665bcbac88192d6ae6ad9c414fcff813340b15cd80a45159d31c48d46090357674cd66c2665ad9a894369fda062771635bdd6c9337cbf48dd202e750e1e04b1ccf34ce8ac8d957396a32e74c9d032b743c299d71a9b354eb682d764eaa1d9c72c79bde19099e11c5a3a4e4b9a27980458f83ea59c99e25ba478ff0f9533e104ba48f9aa781f15d7ea5953f0f864cf691b1045ea9a0ef4ff6915e02378d7de86fb6b3e20a4e565f921b1d621f18e026deef3951ea85ae0aac51ff71682aff33296dbfee86ac7fb5e0ff54ece1df0507b81cc41d2cc34143b2302946c35bda7613347cfa78580626f8e5148d29f8a2ddfc6f119a51bcbaa5ec1299a4fca7a8cf29d9dfd4306a7fb0dfe0a43df01b36e081135c2b473f4a24f31fb7377d4a5f7bbd327ab5ed74db9569fa033b0fb9d4175feb7e4908a949bf63439a02fec63985269290dcb08a9c285e969f59a9db0bd5802239dd22cf5929dda57371e4df54bcac6e26b3683335ea0fe33e037dec0c487693f94b22881af88ed6127fd365a8693a4f05a540673f0ee0c8f0280a4c4f1bddd280b5347e0b00d9b8572769640aca7be49f952f7a1aecc6723182d5cff1e688fc077cb8f2a53c5235b3427d7a3bf510001d67adc418d85aa619d7d4a82f25d09d6acf0bc9b9ee651317128bd029f0d5e73c17876620834ad432a9c30ee6f7255f12d68c479f803cd311af47156f9799ef36791ad080a84132acbb15ced2d377bfb342e3eb8ea79a4be22fc01061b6700d737b6ce1a5a21deb43a6e2d16d17ae196c230bca1f079747b1cbede077636669480a6648fa863315f90a3bbf1bddbe99d547b38ee49d5dec8c5916927ab486b1599ec5a61dfaf2d0e059d0c8e62e532e0598ad06372fce9a12e74c442394e85ca4d459aca5de3986626ae53a11cdefb9503f1f507d8d06ef1cafa017989a7af7ed79ddc947298ed6442a1ec419fb31ccd009ffc42010684a3154399060e43898cf2df100476965bc9ddb88bd09d5c5c07d63b067774c52b70881c589c4e3cbbfab707672700dd2e56c58b598f8f98dc9b12a8b0adc25e56231d67930b4ca6ca21c5cfb89def00505c587217bf7bb60502ef297a157c0aa1353661c7af7e1eb45ddd6142868604a3197a8fe691a43041c20ecd0f42edcea60f76587f9faf235abd3d29979029f563b9ccdffb025e21b62726aa6ae7e10dd9810e5550edefb33df5da003c827e08976ed120d937dd66f77ffe54ccdef97a838d3c371f958aaf9b15ea37a2c7eeee83218f8b0f23775325228662c1c2c9aef2bbf6a7f5b44d16834df05b17601e397b9a1986811e3fb4b8d06edaec519194d9e8c9f5bd711603583bf55c2d2bf92e278f4ce385aff7cc5033217f5fc6685fe9ed7ec53678c3b1e138df6c6aee109d109bafa36c461d9a2f9731df8b7849f1c3d1fe0256497d3e0bef9a10577ad5807c7081acd905d36f027108e0033b467a37a1e6c6a7cbcbabaeb8aae8c73bdfc48f704fe8f86cb0efd28e54068d230659eae428c536e98a86e129685b3fba87ddfdeb4f5d19139d8202dcb60408d91daa28997058700d4adf6e5c68795ea9964cb3e1fe54d58b2b3067ce4df895f3d57948d2cca1f19df0ef01dc5c4bf29180cca3862273a25bfe90838965f02267c109bb6eeeac7d69c8bf2949b1c5c64fd193e3c38a37019a1ca0ede589ecb29c3597d12c53a68e78146c94a7ca184f10ee6cadc01f39028a2e481eff3d07aae2f0a7e1841d4d2993663503df6a5a93cc07db9ccbdfba9ff521c8bb6e362dd0198b98e248fc34aceb531f7637428237a9a10aeaf0c94c88e0cd4c94c86bc7110033ddf99d6270fbac5e857af8c3ca2a35a20050ce5e54fd94b7318dea1756c49dc86e5575d21897af87d096d41cf3719f9371125946277c11c74a15f41b841d45fbb8542eb69780077a2b8e9f2f6f9304b9f8b42b7a901bf23ab9efd6a6a295f14c53969dfaddcba0e5d2e92fff8af427657f347b04d231e9e49ff4a48fe0af5f0e6eda8f4883a9be0f9e6bd891787d32fe41e87993da4d8fb198c3b03426a2b387127f5951b7e1c1a92c8eab006819939742166685d841ada6bfa840e884526ceaf9b7fcb469d28ef5f53aa01e7f75e30907ae886be282995dea2d0f808da86511b45101f45ab4743a8a5bbbf1ee8e55ed9338710be4630a004faa02f2fc465b22d484951313d500a197757f2998c35b13c0269dd5d982f374dfcda185189057ed67e0c1e5cffb6c2a198997c9fc7d62bd3e40ba25e13585e7ac08633ccd67c8617d0815551616f07d0a7fd1e182e2d731308ea8d9ccbf8d0866ecf1fd4c96da2b9658e5e29a643019aa229c4854ce24739f8b486e4077f73cc6e40b0db453a2b6ac4262faf39b14fc4f50318fc5c9a1f60de4626f57e50f58e2c222deb9998b84aa9570e91afba9dd3e18d0c9777bc036602e2efc51b5fba7ef03dd45e72188009500bffa0aa47c20f88d971e50b7f85fab876d5edef8631543699cb5f9ab984ab6fb290bbfcdaf34d1b129e3996932b6b704754013be0d89223ec754433d9378f2064abda12fbf1eb520579b91f8bdd564fea80237c9bd75768b85eaeb8ed11aca77fdb5ca08759b7ce761b88527deac66ef73c7f907dd8bbf001a0fbfaf849391ffd3f5c71e9efd0fb0dd628cd93f558f74227e793700f9c6256981777f0b738cec1d4f745ba099e4f79896d1f12f58e9c56f0e69e4e5495fa0e3d2791b1090ab7b86c3582ce0732f475fb0af08d7999ca31f0427211a9656a3f8c6dccf35fc1fb1ebf2f90873bacb8ed524f89bb9f238edd216c864f0f69cbcaa899c533e1e2ac16de8fd85fbbea0b55fab10a731a5bcfc67d788b15acedc7858b6e95fb2a3e469ed1cae34d3a9df74dcf87f7cdd86e8fc995f681fed962efc398c1dcc63907c3c80eda6bfaf7bf24d2b5d4e4345af7db1da0ce63978db31c39f1e997f0b46156bf0dcc141d9ec8afa397b98da0bce8f910b6b035efdd062c394ecfacd395b7805d70d578f805719bdf0d6e06154cf3abccc9bd8dd039b768f83a41bb0fdd065e094aeed957ccdd805df89a18a97a38e3ef0e1e760749b43dae1faab22933e4ed0374bd0aad140fb29360f3786b1fa53f69d171f682369ead6584b1b0f56987206917a37656284baf012afaab1053542046ce553a39ab0891bb5d17a74ac0c2541f2541253e0ea2c9bb7c5d4657db707ab70e3e8af54095d3622ae24a84e0af38403feffd75f2e953a44dbc075b82eee38534466fd2e9c457c40fc406c5385bc164f59ffd0c199ca9dc36b81c3ae1776d7f9108c3f8ef434b22cffecf659857a677d5f577f374fc268d96fdf59441bf7572f251bb86fb14e80f5f741aec2fa5bf1dbefa939c82bdf78036c8ed13bf4e40afba97bb91dace1966849219df8409bb5b2ff7a4470b8670ab5e2faa397580f3a7d077d38ec447383ec36f5efedf441566e75136391ce790f50b007cef34037b8bfd395ff2199b47d37f08fa82fd16c0aa13a4bbcbcf77c22db9634a76f40d4d6ba1c2cfdb9c4fd3bd153cbcc7359cd5dc81a8dcbbfbb18969365ecea0a4b6ec500dfee8722a961a6baf0cec8ef2e6672ba7ae2873213f19533cc3acb2ecdc164e792b897b6a6193bf4a7aa1cb2caed2d2f1cb5f7a0de3bfccf0d575860d295eafb0e9ca3cdc8844b9009377e5d19e2f4b1480d6715c6b95083347bd84c1e632016ee6440d60e0c90627d2c85780374e59086c4b82e8840f296fb6949c2577460f7a1ab1af551cd4417395404370f840931eaeeb9ea5f86a1c671bf48cc8a73bdce5247f9e3e88cf5797a53f69b4ce8df52c735bf7985efd42bf7173b139d55ae19e61457dfa1787f04b080c65029c40552f42b664dc13316b0ef908d7afbbb25e4c9c4a598e475c68af8f4e4076d7b89319e2223e3b67b4dd7c774a30e3e5f9b8f86ec2cfbf9da989773af091bcafa89721ede5fdb527a454b623ec9c308b9f1f83a3d1a57ad674b5a5a79374b46b15e01d07049c11e6251144213082f4a588d04a662d612dc212d1963e24da1360852a867d84a06b7f956cd5868599090a25154eccb7798e02436a80b45a9ad7205261c068a6e1b345f2612629ebed2eb14569de0805f923ce7bb56689dd93f39fd83b567bc1114f9ea63ef27ad2ba8c36ffecda374a11598f0b2abca92881716f97a47e7589a02a6108be78a35adf069d46b1146f26f4bbba80a4e20d77d4ced145608e238549e85a68a76729318fbba8a9ed98fbcd187c872cb91f372e2040a79e34c7624032dac694080e8abca1017fe8ca0804fd95d333f93d567376e67351d31e35d079ba306781f8e9b29de1cc51cbf3035a92e103bd26aa3732ffd7ad42ed3bb12d00399d7f13c4264b100d893013b8c739082abfd62a5bc3804bab73d1e4c98fe5f16b85bb36f03b1df4651e0acdbbd7b4d2644dcda46216fee914d2f8f3d880172f5268830ae4718e47a9ad07cc10c883487f3756695186e37636f76b6b19f1009e82d14dd841a4135804f1e4394ed7e9b317eac056aa1c1df5b10dca500e24455379d5dd5850580471e619f69584be6442001cdcf8991fe43fb95b7bc40c8f7d5e814452eaacfdd8e3f779118812a53b08257c12e6774971feaac86c70bcff269f10eb7abad2dce5fd9edc0355a3b5171c0d92dd5cb2f4da2fb8f5bb60befc29632d2665e2f24af10d2725bb9ae7c0cb81c10e58deb4a540d215500f0735be4cc1799d8e944f5e4d0cc2a7b44d83ac2e9f774ba589997eb8ddc12a7deebb0427be31567b3fbe6f46ee17645ad4a89c4fff9c7cf841faa4dfe4999887e7900d19334630cc3f997b271a063cc4f33a4b8c9600c28b5fc4424109e98d328163112fbd65fff8da630eb52d99ad89c77d3bb73dd3f29acd5df11c697f0327b9a730af0e291f73ae9dd3333f267f96746ef3fc1f77f9456f428ee9f9fbea58efda4df40d3d9a65d1789cbcb4b5ffb02543bf1587349d60282c7ce39252756ec77f1389e3ebb320f4747942f705faaf76f1f50e1f69d163c2e285f54bcb31f5c7a9dfd14fa8ff4834a554e06fc003199ec3251cf86e004d48cb1360f87ce4e78035a73743e36dc9e6c1fe31eb146487d72294553d236fdc6589e062cbcc6437e1054bda35eeb9bc95f5a33b61a9c073731c7a30030860cf965d0cc623412e9b618a4153c7ea596c818724e2e461164d064f9fda340f689f5c3f6fba463f1f42efb30ccaf7c69245a3f891649c6903753bc1a127b759bbf33641eaee08c289010c57e666cfee20ca8de5a6ba8bfeb1da4fd8ad30b66405939c33d3663fe3a82c03be05cb8f614b7e81eebe2de5ef92321e4e87d575077e6dc169f5ee65ccb217f380ca37e04812c708b11e9cd76933378369ae435c7c625f172366b28a107fd3565e3e134d1e126085b5776e27a66c398c23b43b841e5699cb79907d03db04d25bcdd3c23899c7afd2c64c38fadd9559df9fb5d56d5039b7bf123efd8b93cef243fb647ad2e0793b8738d283d8a264910d185287eb1f67e342a1db4d60e1d60d8a7fee55c7acd0be14a9f04ae04ffbfe960db1db356867dee2f34c8cb957cd1f0af31135982a912264e90f9c1c1dcad8d9154e93756796562055c4999a2142f1cd969fabdaff8aa6619fbefce877b36729582f8c83d485018837a7ff78e817b519df36d21055f001f6bb51aefa91a7d1402e0df7e5c27f068a50ef799c8ef82f287094051a00e54f3f29fa9b2f3f3605d9051ddf64f242a0e02dddbeff1fc0172364442be793096b7e346d8197168f1acaf4487bee404b1158d30fb16514fc7ff6b7dd0d90318fae50dd04c39d9019cbda17d71594133afdc077d32e9447c91586b7f90d1d077794659cda4d0ebd825b70c938c97e933a67e6d50a11d346526f07dc0903cd79cd08216a6b3546eb06b3a67fccdf5366223515048c92515fb17b753242efc178926a53f6fb0e6c5cada61073df7bee68affbecf5f60ea58ef6911ffef68b6f3ef1b30ffcf2c7af7df1991f3eec87fff399819b76629361b829732643b8e1956c320f1734db5e7f610ff97bdff8a2dbbb5090a8d7fce94fbf7de4477ffdee9b4ffae963bffce957df7de6471ffaed9f5ffaea73bf7cd04ffffde64b9f922f2650a9c01fd5d73e591f795847ca84e5ba6be61ae258620d87576cc36bdc810bbabf1e6bdbfb7c74fe8ee2fe92560efa078749f9efca33632de126fdbad07e7a3db3e479a9c88e0f044fd39fb989eb59e5140c0e29925c49738bedd694aa972ad3a39e089c72d1b644e298c0e01364a2c567a5ff8795b9bf56973fc18acd6ec06d7fb9afa16b3f0c77ff4eb17fca85eb854937990583d187f27b495a5a2318afe2da6fb0d0d0fcf6e499a0523257a9aa941ccc25df064f1e53221739542ad413d945e37103e7bd127116e67928370f570317939aec548911261dc4c2891e1dabc681f33a4827002a3429c897e3cceca42a2ba5b63c534a5bf8231f63fd7e51d7ed751cc880b33978fdf33893eba1fd13d1298ddfb00223f44c6a37479306e7d4bd21624e7ba4badc1e8a304bd2b67f2bf3b7ef58fd78da3364e8971c7a74a84f65f00f99ca23821ee7e3ad5cf6b2d83a1c82bde7d115c9959d40d857cc58f263c37d1c12aa14ea99bb1e19fc14b2c9ec4210cc21b1d44b182cf93ec6e435cd0ea84e497db637049974c1a2a2356c1c5de1d79223ca7d641636ddd970cc5957b049dc314679def31eb58374a15655764557cfdf1ffbd16aaff92b150344dfdbe50bf22ee2b3c7a9bda479a98a84efff80fcff57b834fae0e80e815f12a7e7d4239310de3889d3cabee38dc9ac06cf1e9aacc21c868a7513789154c760fd3ede7c1b4c9767a639bb207a49d45b0d87dec7a3750e2b4d2eafff17e597c2096d7d8819fe2e077ebfb05941a636f20b4dc17be0d7bac62422a43681b802c75e8d4b3296d2fe5e2b47105f39d3eb1e14d0989ba9a4f48c6b1d6f7fc3797d4ce7023c3b7aa7db2eeac4eebc2410a4427d706c9e1e7eaf8934624d5eafe7fe988b64cd6b307f22b9307f9e9a6d82748d72392fcffc2556cd96ce6b9ad894a9071f2ebca6fd862a56f15bf7d791f4bae6fd309209c360ab00b00f82c6712578ffa40f1586a6e86ca609097ff444818bd197f212336552692f19799850f399fe40304c0e24411ae687d1b33e565bbe17ba421fe55e542a9c7de7c5c1e31311f0a397537fde936a5efc9d6ac22a8a57f935d85d34670851789bb5d9e22d65912959d5ba8d515f9c08793042fb7c8107791c631f8966abbadeddbb856f4101b5514fdd6c2aead03db32ce43d998233d11113de9be117f586e89e598242c14c22aa590e78b602296148ac3dc246b227b9f75b9171fff5bace8950bb67c8bd1f9e5363ec15f3f93bd229a827a48c744579ba763d529a7e9a10a3b196c89401ba819d3642224d2024f43119ded5166e7d34de62374b715bd84d163b522d53648c2278c798e969f9f4e7e2e12123582102302bd0f63299e778d210d2b80468e28f643b687541cffcce8bbbcb81a762b75012b5292f939d1eb23337ffc6efe85f22ec793a963bea7cd5e7212a0ca862fd4b7ee5735bca89daa2499ac15470eddcc6c6bbd81359ccc0733c6ddfa09c052464692f2fe964f8b1a30e941aa717f3c11934e66c7d1424104b627b5af90fd3cae871f4fbda9150851785eea109d486e369093f96e157c75be778426b496e01ce097ebd55653e8b2c418d74ad59c26ae6d3cf8af820b80c53f645136b468baed1ead1c12837ecaf561aaeb82f415c70421e0ae9abe50849381170c65dc704bc552e7bbcd55e56511a49a06a4bb69b19fe6b29b64d519d733ba1d7d995d8d5c3a1a5bbe939dcd8617a1824ac30c871b5ee85c18479849acee753548fd1f16df38efcd68cc7d5f98185ff7d523ad766cc2a338c223f79b03f2e79d805ff4aa0439b42cb5f5eb30614a103fe1305c3457df344bc0231246af23e4931e4c530fb96163db2c280ae62940055e26b3aeed68c7408b90b25d524be719c4f4b9a798095856aaff1640aa4de5d152f720df749ebbf876620a131c9233f05dc0644e26bf0b227001b3b6dded606ec03d824ceb871d98ad362a3c9b11b2efc8bc07a9f495ddddbee3a1ec509cae0954136ec4273ad421787422e2697bbd9a4868e0593868c9524fbb1fdcef38670a7ef895fd7d38953495d05214f062dff35b86e04ef5b6c39fd662d1af43e0d39c722658c0736ef9d749f6f01746f066e4bc34ad845b32c05211a586e524aae999507ad0c087b40b3c1db7ee4a08eeb6adbbbe894197464c5292bf099da03d547676d9306b1fa5c042950d13ec2ce2511e8eba1fb4a9632e7518bdc0bffc575c46d54c929230fd1c7affbfb925a5cf416eb62867d62274f08d8785a11fe72ab55619906fbb8baa3b0741b24097044c1ce7de8fc6205a7f26445d49477acd9c860dec624f332673b968edd75e34778f41c19acf3d74fe31ec54143b4dddd7b1d2bbc0c79547321b0469eafec584f8a32730fa2121a68470cdcf26c9b84a4c94053eefd369f5e337ab7bd55b17bd19998f3f1fac621dfa0086181fdbbec0e85d4858069125100fad22d80c6001c744bda4562f21552d766357175d58496562c6c63c5ae09dc46112dba1bf92f1499d727a270cefbe7eb7d1854813952d6af078d41d54589b4a2a49417cc9bcfc5bc817923135a1aebc97f01c8bb9e9def9fc18d7337510a5261e6e9d04f3bff58f89c9b51d1c7c5e388baf77e5504fb7408b08816f1af29468ab979f4f4a269930b75acf112a1fa5ef37704135b8e93bfdb9cc46a4b659d8f1fe223dbe565f00c2621d7d8e53bad6d01761ca33335554c4b47384b03d7dc49ab38332bb1a50f52c442920b856d12d35898debde00b0c55201669a93cda416b3bd482aa043b5700c93d53ea8f130c51fc85225deb8d404af7d91f2b8a00db11f407fadee8db3bac7871452718dddb266d0e87732a6c8b5b5a9e2181e3da41d32b0833534c2f527b664709585cdef8b16a1c5c3b0aeb23a27f5f8fd1b98c5af69791f9e27cc59eed670c80b901e44878fd6806ac4deba256c5884f4e4294743adff80986680679519d4d8cedce5992b4279d8388c4258146cee3e18906d2af6fdd86f8f1a83ae1e03f34a9cb2d7cd8fa8c92a505e53260928ebf08a63e6e9418dc9af205cd34bd36a1ad88684cd793f22e4d1ffc206d20423001a96c3c02d055f75b04d5dfb9841a6d5ce62d84bc79666e5ef7d5b16f298b2dac8eff0029fcb66cddc4958b622dfed625ef8a8b20ba1915ac137a80b31a87124cc06b122c7c1cb3ae3c78cbc190f1bc5d53dbabee15acfb5073233023829dd458f9770e59897a261f27634fd8096ea2f95056e6d516a28b3f473e9d57b01eb5db835e313b6aafc0c4c8afae9cbb314e474d0dbc0010f932c8a85d931740abb9bed1e2a980ac4d05eb74a671de168b85f03e2fa71dc23bfbf3cf2c871ba631ce9deb4fbeaccb7556ebfc624d0cee0e8425bf2ad3e26d638de67d7771497d1afae54b29b65a5540d0e06eaaead4df789bbb52ff4a649aec8ce271e5d2e7b2a364e89e706a9e7469926a513c27148afb71a200875edad56e469f86494f275b4a59b783436c891aaff89c7cfc1b9345267b05fa1bd994b7a3d2d3714d65180b807ee0330395d5a3908c167a985c992a157ddb5a7ad478c80b1638d3072e7e7a44baf036c9b7b2f6e1164bf976a52f076d7a61282795ac11360116fc7eb6705a3dcfd3c8e10c6325397b0e5c00027ee71bd035a51db6d966869ddcbe5bff44fbc43665641657f1272f74b1ac18b9d8578be8ea9cb2c8f28bbdc61b1b89a744b165aea1045d60a9c4bea320585ae373a310c56f5c7afac6534697b4f4c338e43d6368aa4f374baceba4004694a34073e9ab3b163ada648946f0fede32c190edc1835174de279844a7488a8d6ef8f69dcbfbff5d769f08d560c8f97eeb6817c9cd348a72a8e3cdf533b728562889731a8ba778ae83c1dc1ef707f7b38cffea04126022becc9a7864ff0ac7e9e830cbac08937a84453e9d0b1b8c9aba08e4aab84149bba325bf648ae142b37f5469518ffc6b581ea354bf93c20cce438e1b1c212fa0b27ce8d727db0f9f99b85b184960aa0224cc4bd0cf75e3933c2c439e47691723d0a270795001a1265792a59371ca0d95ce554191316e7393805a2e6ade08744825458b3a5a6f41212112377ee249cb63e124a5d4f5796a5e3a97746e467f1f530f81a62a040e0e4da290105c37665b262deef3cb284b264a008f411471f9a8a34df20dcf8f26a7ba9f820a9af034f4d05c791e394ed1722c17a4df66714e545561a72740fd023687b10d886e25bf34c9cb5781d7c142ae99da7c0e717c2af8a0cec7e155ba96e4931a3936576d6563d809f9ca08dd23768b6f9015cd429bd8fed2445b4ce5eea2e9010680c0fd56d0a85152a1c8acf52e282d8a197849ea860d0e61ad4dd128c98f3eb665d1f3b5bab8bd5c5da86988b8c8967589441f5d68f117f349b035f1ec7356e8131d286c04e7fd71d18e36746a32149cadfe2cb5b17563aaf4fc7dff451cb15a31f0aa3c42eeb14f497333a2d3fd2c4aebb2a85bdc0cc135580c2dec75e424d153611378890e6e6613deaa336a4553586576dd7848a9c4d5998b31f1c9a352b9afeb0cb3683cee56030a1a4c674b1d0d7416faccac824e68a69f85fe25bcd7cf225da993af0e3bfe75cfc9eebad0d94f219a73994e471e035e1dae1a45932058698bb5ca07da76291f6750a737a46eb3c635ddd7e3be678c12080002871699d85c9c07afebf68922e1bf63f17f6c10b0eae8caa0c372013767cccd66e4a80c0d7c6985d0917ab781e1b437f587a55d1ec894d685c4fb18924b99fca7c72e14005ddabe6ede877469df12f90b0cd40ddc2f04be9786d8123c10b0b4490734ce55d80ec3300c83b8cd300c83f8f3c812ba4ddd1a8c7c99a414f9c98b3a08c5d7b18d8dd79732a524654a96e0af837261bfbfadd91dbf16a0118811cc30296c5d3702852839746e7b17afa860ea0bb7912770d24eaad44a76c6bebcd7531364bd496d5b9836aeaadd854525b1bcb4242744cfade7f89a6b4da973b7668c3421fa87ca1cfc7df73a2d8fc934186142e42af22ab698f9a1c2dfb812f996d4f9cdebb42fa3f32943d53b1fcf12a2d7c4b4658c2e3255c5543a8c112544d139a818a6a6ea7329dd04c64812a2c73edb531046063f5fb7705858384fb3d25854d8f208122276872b75e3a6d8f1478e10f962fd66b64bc55ee62b1e8d2a6c7996dfb8b48e10d6551f3142b4ded44b1032e7af3652840826b6eba56f264f85b9718dac3e468810a95609a6c71254b8e97fe39a4a84e3a2597961615d44c8af2d4686d0aa194b8931d599543d193b7f6ee5da6f37e74b148c08217ace6272859c1aba866ce3ca1f8f4a186c2408914aeaf5a3db76bfe2f20224478010b5c830e3eb960d9b33b671e53254d787258efc2082cbe96beaf4a9d657aa32e283c8b1a6aa7649e3f2b3fa8f4b835ac0364626e3e9fcea1f413442467a10c1ed6c8e9e8d13734ab58a2ecb4bcb173c88beb5b5d7db0e7b75aa8deb8a9f17e6599d8f27a51d448a79f763a9b976cdb736ae2b1c95211ad8e1685a38bbecd3e178148fa183e859bbdd6b8350a363b671cdce41b4dd567bca3d758a2d18d3b2bcb424868368558c907939c81cc3772cdfb941f42a77a57ffda99f42b5712de2344354a066358c2291524c7bb1b6d1c186ec341ace678d008d88c5f4a04ade92a9668b1909884450b559dd2b5b8731f2c7f31ace87d990282e75cc5bcbf65e2f371734fe258250175b4eb9d776dc7d0f359c8fc6d5595e5ad2274aeea262be2e1f27b6f8c864fc47104df444309db294eefd522ba5ef44ebd8f2afae171f3bb85c5a8748cb4b524edb20820c3a7ef7de96f4b9a5612e117c9b1acbecb6aab5a736aead9d8f272d2762ae0aaee666ad1be364226889d6371779a9e8cac164c52cd16afdc8fcdcf25f75dfb86a3c2b91a77aed5c6974f9bef1c6953f7046f49c5375defaf445ee842d2a445a5e382d9aa53d6a10a96b0d5532fc7698d485b4a89cc1bec379a912357d9c7635ecb8a2ba573e3691cb96a237677af61b7bbf1012b1b4cdabdb82f9de2981f0f0820c1efb458c9e822a3674c734e5e294c0f86825bfa598db5c11c27c0a23550e3a664eadd85a82acf3f164f4a2ddb792eb6c3165a71457381ca77e04d180e122c8323e6e106ad3f71e6e5c35abe1a845cbebb1520ebea6cfb5eb6a6146f42f26dbc6abf4c1fcdeb87ae07f34b0b930358126caa7dc629f0a9f82cee3c615369794a141b45c54b59236878cffc18debce208aeea5f49442b870f9c78deb4aeb08692eab9dffb025834871849e56ecf7f6e4ca3f82685e10830836ed740ff2621b57d64090e8bdb6cc9f27672dfabf470be71f41342d8041f4aea96f0b3f2e5c71d3c6f583c66b84bcb8879aeeb4cd7abcd3364f95f182d6de5b9e89a56fab15dcb8aed517cd87252e2f5c10ade8da324ed95099b35dab9a16242ff3b4da39d3a6d554dc11bef5e26a5e10aaaa7ed1bca7d35c948ac18208ae4c2fdd6aed35d59cdbb86a927e0048c4ab5f3d5b4b390721f48deba7c3710d036544cd75dac58e2d254397a74d5ec69bbce9ae9695b7ef86aff7d9a9b58228db2d7baa9a3a8b6f131b23828d3f595a30d953f73e84a9208accf5ba65a7aa252fc6d68f287eca6c2f72a7c8ca959918515cddb2575ce8186c6e88520f23e20457e1ae7edb927a4bfa7911637d5e5834cc0429486cb93fce6c870f9baa0f14683b2f4c8e75b72eed1f3ee2bbf70d7d9d3bd406434176e9b42556ff852e055f645aaecc3155616c2fa2c60eea4b5d779f2d53e4ecaa9be5733fb6ba883693b97c2eaab7b8beb40717114b97923f67c6feff98d3638be89dd5d9665cc91f4b0c21478b6869cbd5d4d2f2c79a582e3b41b49826333b636bc5a47ce3bae2c2a2a2f9bcb02c3741d4ad557bd8bed3b7e55104258818af6a4fecff5be2167745408248a5e476b15aa9d829df8dc7b547107527cbe7a2726f3db6dff2435ec361e1745c747b88006afb7b8b4adb718a1b57174e07aa8f1edc74e3bfb4dc628feac5062a2d2f1a8f4aff601153f930aee3d7daea5e1bd7cf0bcb8ae0f27fa9f093478feb6d389fa40ebf777b213fdfe436ae3ccd2a0a3a822df7bba9985e4357bc715d5bf08f209ae5087a622a17d4769d9a5b99cc4a26c3fa47108d53beb9bcb9d22ef6f5c44c93c6c650b975c6cb2f461eb92f2b2e2c2acb2c2f2de9c31289a4283f41d6578995697c6fe3caf9b4a868547bb1c76dd41e363f7d31b15e97d8c6757d87c345a7b5c06da1b47f04d1b8a2914342103ddde49758aba4dec3ddb876bea54545b3fae90f4bec0c836a97db16996f6be9939017f75d24fe1144730608d659aa4c89315dca53bbd97f205a9b9d9fdc774b06dd2d750f442bb1f41e5beff153a9dfc655035b9a46c381ba0e240c1e9d6f69f1911ba403af758b9a2f398e2b46b77125c2e908d1681859444979cbb6f8a5e46f3b6e5c7f1307a208d7bbd25c151fb2d78debb7703444381d218b48238371b1015fc5cdc958ed62ad69596a8665c8ca4a266af89846d509aa625fdeb86a5c9d0c0db070389a15d8d168029081487daee8967a0c5b32671b574dd2e601e40b1e5af0e08207101e40c2e0f1be05adef8724fe1144e38347f4295773d78ed1c1f6dcc6b5d3362f55838168d38bdbabcfda4da16e5c3b1f0f0f205ff0c8643e2c3193f90ee7791a8fdc17cde21f413433b8409498f25b29b7a5c472f1c69507902f789491c964323c8084c143d3a2a271e174e0aacec7250c0b440d3ac58c3f9bbd62ca6d5c3f2c51c3fea3d271017f5862fa0ee7a91f413499a27a0215408343e443010ab48d8702139040f3a6446075e3699b1408a0d1582af000d57056349c9507388085020d6040a77d3c1b5880e7010a804002ce78cdadac703a8002db772080a10002f4853ce000123080aab0b070385080bd00013aed575e0406a002d00b0460c5cfcb0400a09adf6834cfa3c222811df035cdabd93fa3ad38cdab743e1d38591d9d0c98b0709e97ac46a36734afcb7bcf07485453040323aad168381f97229da7f9a0f119801a408504a8c108232c9e4624839200e8595a8b4902d4d088014082a04227b4809637abb49a21c880400319e081810b5820a502149880042200810738a0010c58000441100475c00a6b142208555869a08203021185058535daf084142724618e26c0443061044b5823084140050441b100c20b20047c1620081ac183c91a03800401853a680165c007189e4ec6c70820084a01a312108a0ff5050822f102049174018248b80041245bd002049164018248b0004124578020122b4010491548a6004124528802141c305207143014e4e96452ca682b20942f12ca9861468f1e1e0b087971296df3da4b792e1cce8a05ccf88f8a6765a57161464a4b2181821ca8802012a44010c9132088c4091044d2040822610204912c0182489400412449802012244010c911488c004190891751f0c2c50b1608824490e2010f90148108081802028410042090fc00822000400f255a41e92216103492060ea074d13eeff97c192d48814b63d194f17e488f1e23106cee3f02f9d7c6166120e1c13f08822ae00508f2c28833a388084e9085162b5066692641f0e1703a207895cea703282778030491b060400d4380504c9009088a8009c08020c8a5fda6e5856405a5046690801424204104fd0d543c8946a29104f88225a00054610c0f70e309795079d871820b5c029ee00269d0420f209411380182e07b5e7c6834293d5c5044a0c6083c5006fc16951657dea371895c10f91f19cf26d87997cc26336ea0624616597020723c90a2cc48f1a8b0fc4765a5c195df7438b1c3899c9677e17c732f1e95222e2b90c3e24c701940299c4f8aa77bd03b6833501a48caa789a00420809f929272852b70010e08829d674f401004a1ac2550960850c68c67692d66f4e8c1e1b4bc313e2fa4d3dac665458bcecb161e202d9d17d743a3f9a1021f659011b540137da105192a00528646d323f386910c16321ac8300005047050cd4783f2015868fe0cd850b288104a16348050b2600104410608c00c5ca0e03447c802930100f890000948c10d297085217e9030c104259610838b35830ed880143bb2d85406e7071adfc2f1980172ca0041900b1a4f06940e34c2058d5f5171710901cb90965f31812016940e28008250b22005044128597ce420c9010a07920377802068c8b30c794f27c35196218fc28109a070808b11945632c2802fb2e2e2d22088c40c088200004106c0402520e8b3a2f2e244d0c251f98e8b104e18df1943034a8050349081a04c8ae7e3e2f16c6045e5858b14940cf08020940c0400854714507804a1b1fce67934281898030a06b28081186000086486194352cc30430529992c3ad0014f0a13e2f04617aeb089910a6801a118e00c08c5001d80500a208a0a40900620865280454028054802845280154028055808a50000805008b0090885007c80500850060885004280500810068442800f5ca009293d502e3006740109409005c2a099018462811140453e2a4fe5e3692b6f01134d4a16209494ac402038104a05c6f0bca054800794d203850273acacb447814040293d3e0d06100a0520044114c8941e9f2603086502859840159e8aa7b90928091442025980527a7cdef31d17cde785486025a587064502190157f4210249e07c3419082502405654dae7a1e63f46800794d2a348e75f6c0001382028a5070a04cae0a2b2f1a040e0051094d2e301a480a0ca8b10ca0372f0802e1e0000084ae9e129f2676834ff693480501cd005084271c0d27c382b1e0798a4f4e8fc191d0e114d8c9c0604a2015148e9d10019a4f44061001c1004a130a00e293d5018308687010e48e9f1699a1840280b6803ca027280b200302028a547025016a0e2d28240280ac802a725a507e703db1609a84302cac0280958000495e1e3f39e1615318a7c0afebdf801dff3ef0567a58c5f7151e900f178def341e37f7c7eb4f8d8c4020e90ce8fd1f26178369e06c6185d1461f1d1f9315a54c468e9bc6cc151f934327c3c1c0e700208f2b4705a80a0f14103488b4a5ce142888a87d322824c4a8aa7a5b8b692e26944b4d87c3a2a2ea5a5a5b4c0e6369f9797980511ce4a91e6d25a7ca00c60042803f8400fc6900837563a01c5e0131004e930420ad4108354602ef0020882461ef1c617909003113fb40282a01218b89041064728201671401064b2c617d8182301740884431034628227c440054d308216ea004150891c6ed0600d65f08315dc80206804096d54208b8e8e11900182a09146b8f5830c9460034b401044124664024f2061034850050441250b6042224a41852ad4611110049d5c410a738c34a2072c4e0041104927e470420e5c41054e3804413ab060c60e2b6c0851034c80008246c6308000a49400043d7a082013500a08468022004190a0a5b978529a8ba7470f212d2aaf753e280198034a00e0008920050420f801c649422801f8000000e0021400f801f294600445dc070500504604283b1e81b2a3101004791865c7071ad10282200d84b2c3e4e5a41122f07cc7e5062827687c4b21b1c149182963a09c2cc0c3f2d292420212a478342c2f2d283a3e2525d80084a24375e1058ac91c992e504ce2504649a398ac212a2825ad48699d0f1ad1ca4ae3e28505282549402929024ac90ae793f24a24805202a5a860e4140e402101040ac91a5978389022a445e5032b2b2f5ff090020401210943072823af7069bfe991bb89482303fa40e3614bebd10382a0a698390e0161e6d0038499430d10668e3420cc1c5d8030734401c2cc51040833470e20cc1c2e10660e332008da8100e8846407868d4d401836fc0061d818038461630a10868d1c401836208461430c08c30683306c6400c2b0510008c3060461d640058459a31310668d47409835e40061d6f0028459030a10660d1f4098353c10660d1508b3061910660d85306b2800c2ac310261d4f0048451831110468d39401835c40061d460028451230710460d0e8451a30c08a3c61610468d1e10468d0c84510305c2a4810a08938626204c1a8c803069f001c2a491068449e30910268d1d4098341ec2a41106844983419834200061c420078411032720088a400420d0000710c0012802b0400250169000090040020998c0031290010858006a801c4d803072e400c2c811030823c708208c1c1980307260208c1cd000e258038489030c10268e264098387e0061e2200261e2e040983884409838804098384c0061e200018489430210268e01409853b802c29c82141004116001a77810e614634098536c01614ed110e6141b8030a790008439850e08638a39208c293e01614cc10808638a3b401853a401c298e20110c61400803070b402c2c0e10908034724200c1c85803070d001c2c051060803c714200c1c44803070108130706c200c1c2f8030707c0161e0700803471610068e084018384e20cc1ba780306f5c02c2bcd10708f3461b20cc1b6280306f2801c2bcf10261de8010e60d17409837168479c30310e60d094098370a00614a210784290526204c29e600614a510508530a1f409852a8409852bc0082a00630e00007408002105081033820030dc06006408004401070e31510c60d52401837360161dc80048471a30e10c68d34401837bc0061dc58028471c30610c60d17401837c080202800023000010c308036000161da30038469030c10a60d28409836840061da180261dad8409836640061daf80161da3801846943214c1b1a80306d486065e5058246d28069c51a98563ca115368020122f14824822922e2088848b2d48b4e8703a9d872092134010646202088246484a0041d0086615403073380282e670400a1a8da585a3e208555422a5470a891c5f90f169e1102169c2af38959595165b5420888404edd3bae022152ba900a27286e78ca7f219f1841cae1859821c63b0012ad2808a95941e425a543ee0b9401ca680a0325a007dfc0083081a4d0c212d9c8e0b383f3e9c1f2d3e3a0f3b2a20f25e7038407e707ec087f0708a151d9822a1f7a2c8a7c0e53f658cb1d261c14a8705cfd27eb4745eb640a389d179d9a245458c0e67538690965f5951f994f15b3c845a74da86f3436503c4f3f1a8789ed3c5094a1180121890821010e40529bc803a9de80c15447f0315cf3bcf08b8c08c220d107484111a88420fa3581e4ee76fc0f9a4783e2a2e2505be4785451404e8118a2478fec5e35149f9b414971411745e604a6319f21cf8e2699d97160a05409e850150f4e143e0792420080108120421c880e0031e20e940161cf084c274020f241b20d10049062ec189284010c409221b08e24418667002039ce0b4bc70a26413a830c38c14b8f22a3145480bfc2e2088e4023e208884070906c680d1842a482e4062010822498120920a9050e0139a6041c7a5b1a4b4227f86e755309a288120fdbc27136b643c292d9c15f7c2f98027a5a5fc191d4e4acb7b389b97d279e1c02025e379a832e4e5d33acdc5a575a0031e1597cc191cce26e56111b7f2125d5e389f940641241398c0a6444e4aebe28c3744258c1ff0492450895878563e4569017d54a20a504a0fc75971293f5450060a542576683aaff1a87832f06d9092c2f9b4703c3548e17c523aef812092089040801266a0c4a20407209207380082a0119326985c611243783809046860032380200491346084041849a44050bab48f8745e5335201086245244ae0d25820121d6020110482b2e0801288f0082010c4592903aab431febdc878389f1417159594151796f644cc30c385e5c57d5ec8073865a46452cc7051f9703c2b2b2a2b2e443c22c8c2032922e888f1ef454a0752b27051f9a8e1400a09525c543e9acfaf88200b17950f07de4a7b1a12a4a47c7e25042148f90ea74588ca073e9e978e19669891927151f9a41471291fc8c245e5c38114f83750f180a0c8ca4b07049f164ec70c33525a8aa785e3a2f24969ede338ff5163861966a474547ec3b9808bca2765a5bd7c3a2a432e90f29f17cec70c33b4485904172008ea3cfc323c1c20425a5402ab923357ad922ba612bf4f2ca66c1e175be79792384410aeba4f6b5dc2d611ae7062ca1238443146d67f6cb55fea3bbe2172df8e37e9c2d451b5b921cad7049772d17576c7d586282ac86fb5e62e95aee55734ef8730658d66e98f201a2f4ad810ad15937d4aad35b773ccb3640dd182eefbe93e4caef9ad3455354490a9720da68aab36f9dbb8266519f2aa3f826856491a22cff5dceea667ce58231aa2b49f98ad6be59e19ae923344903d5353a7cefbbe45855303f5f170b848f512334490b5bb43ffa61b5f5a8668c1f61ad314d34275d79e26643119a2fcd45a6bba069f33f25361692d45a0a6c3342a194304d3b176bad131a8dcbdfa82b1117d8c2c42a8cf96a1faef1f41346694ac11a9d4fcddfa14a352ce7de35c64326464329dc53a1f97123522e6dcefaff17acd0da6b29234a24ce9f7fd723763eac1d4361e2686685bdf5a660e5f4cadb110ce4a18a27e2926c8ebc5d7ecdf3f683c1822b59eaab4985289a9e84b84b352a4f3435a4b50f28508ae872cbee663e74abd0b1abfb8c40b9172760b3bfd82dbdefef628e942c4b9923f874bfddb6b2a7e47f3493d1f0fe7b18665c88ba0840b51f4e474a9132eb77056b8c864b6e81f4134ad640b11aff66fe3ea72bd12e34cc685d33d28d142b454ba085336ecb6da9a85e8c1e75e6a7daa9afbd67d508285883f41c62eb1fcd7eadba7f343ae1045b8d4c164fae0ebe6c58050628568536afc3c9d8b8fb5eb4c46c3233f28a94294505d61cc96ed8b15f4b4a7b7840a51746fc16f71ed4b6ad942a8c52aafff08a2f9922944ce2d075b615b18b92d953a9b3232998f8ad3a4ff08a2792552885aaa54cd2f2664aae18a42c4d8aa54ff702dc738292844afbb96bdfeec94b8e913a26f76fb4ab5f24a6db3c4098c63a6832ad5bfc63a05254d889efaf890396bee91d399103d18d75ace944305d7a925707a33a7e59bd94925d7a27272305da7769e122544917361435fd932aa664912a287ab7db57731d89a472444eb1b2eb7bf7e84e89fc7b7bcc1a552b111a2de4fe956ad4d9d2ac122444b9372e9dac3f7b1b12642e41ae35b6de999b9fe10a2b79626f75a6f8bab4e09217ad99efad256a5d8672a0942d4346de6ca652aaed66ee3aa592d0142e4ab98527fec8aadb7be4565f39a18fe81921f44ac70154cb8d253e5b969884a1799cce6a3d269253e88da3da81af276c77caa7959c0c2e97891c9a051d28308ba2bdbd6626b4fb3d2543b2a5869998c0bcb6b5e1f998ce7496211ad95b09bf12765a59a222e9c97da83041691624cb97d66913d95a93caf889629c7db5cb97bdf560a49ae8872d5c15dcf8ba987ef8991a3f91ba888d14d02925644cfbd15d55ba9dd5fc64584c34526b38040c20ae5e6d630c2c68d29347e15dd1a66b3d6ae3a570c9239a2c4d6a774d54d0855b22aa2a6ff4e157b96ea53ec8d6b2aa2a8a97b259509e58892aa8dfdfed43fe34745d4ba34c1e70f32564dc511b9eda52cc1f552e2964e11a9bf84acbd6fcfabb53645d45c364d0ed527ccf41a8e28614ceb153af695dc6f44b025a7d49ddbcbcd2f45c4296e5ccfda6b55a8bf715d6e448f7ddb057d3d4e9a4c8a48296f71456dff62a66e23f29492b566fff9c9a388326d4bdbe0aaf2524c1451bf636b25053573990a45c4a22b6f4d358bd0bb5f23e20145b41c95fb53ef9b783b1b11cf2722f7ead8fe3fb798b2b28d6b7b226a2a9b397710321633b913d163ad9195622cbdf2861b57c5898845e79e4ae9b9e6de52ba714d9b889ceb97c918d3b65e364d444b5ff494d6c618bb796e5c351391bf5e4f969e7bbbd1459717888948b7d3bd7c29ba7aee4b446e135ccd5ead3d57b636aecb12512b74ee39a5a0734c5e8948ad5adbecd863759cbd716d4a44be126bd5fd8fa98a3c89883974f1b17a77eac6b771559288fe71638fd9f63ba50e37ae2912d14a0fe326a76272a9b9b8715d48446d9fd3b8eed83b547579818f885e726e91a9a65e7cb77ce3bac91191ea87cb99bfd32f7769e3aaa9115153ccdaf67afdad29aa8d6b2646440e32a6abfe57d93ee68d2b5b44e4b859776a2ea5f72a2922f2e45c65e36fb1a536dbb87a22a2f8b27badd712834db5b6716d4444eeaded6ef0751bbe1837ae7c8888db47ceeec54fed2a4344f145f7e95863d6f7d21622d26c4915c35655f8bb84889252f7b4d26ae6f245b671d51d44e4a93983fe9c9c15aeb871cd1544b4327d8c6c6dfeaedcb671658188d47af5fa5d2ad77e2d4044e9926aef791ff3e60b6e5cfd0f51764cef23bfc75c2ae3c6b5fd102905db72b2dc8e8bb9dfb8721f228e6db96f4dbd6a0763dab82a3e44cf0b1d73fadea54ab936ae690f116405fd3fb5a956fb72e3ba7a883aa6d762b2468decdbdbb86a1e2217b375d39995ad4a8787a89f3576ea60fbe4aab9716577889e1b5c4eed94297dcb0ed14bb5745319c2a4ee7588321de3a6dadae6d7fa37ae4d8728b673b604599b214bb771e539442df953f8f2b54df9ec37ae4a0e518c4b93656a9f31a6631bd7148728f98bcf6db5f662d6160e11bf53eadb936bd1b9be21fa54f95ee94b2f26ce8de7c5c50ddc6cdd2fff6ccdcff3d085e5a506e907491ba265095d2795329bad672c6c8854bff9f243d6dc9cd38deb735943043badedff4e0f21f4b57155716179a9811a22c7edeb5a73a78dab0bcb4b0dd2106dae9754d7aa832e2ddbb8aed5448286a85fa5e3d62ba6f72cb19c2162b77161fcd63c4676965412334450d5694a66f954156c1b57178e4b19a26dc7bcb9e1822f1792218a31bdd8ced8b1c48fa531442c7a47a858f6b64f832b2bcd17091bd16f74c53c3ec38e6dfdc6b5880be7ad11adcec5cfda4bad2daeddb842ce4baa48d48862ca8fcfdf7f4b236a2d997ae5fdcffbda460c11e496aacde9b3b7d26f3c61885215cba88f19bf7afe14716088de3edcb6ea5bebb7fb705abe1075b28d2d7e36984c39d1f042b42b5372d0977badade58d6b87d385a8b9b75569f7656b4fbb71216ad05b4556af31d5c5e651d942945a72bce0b6a549136b1b571bbc16a2b41e74b8ab59b382cc09c942049573e98e93374dfdcf8385a8354f566f294e49c5a742ae10a5962fa6ccc86264c9ad380848ac10e563a997b5c55627079bb549aa10bdc454b1f74c37375dd0782a44ee313e065b3fd79d185c79619942e476edbe72b37db9b91036d5259142a45c3a6d66f99b30794721e2041f5b2deab6daf71c1628442cadf5b70bf62a17377a5808489e10adc2b512eb7c69a5f5b9711da2029d10a587fdcf947d2f6deec5d38448bd57ad5da92fd5afbcb030217aca9e9a25b7986350a58d2b846d654896c0cc52aac59c94a6c472d7aad77e9d7be265d0f9c6d5a50d79b6d286bcf241a28468a17a6935e3f2e48a9524095152fa7431e62d5f526e1b572444f9e06a748db514f5d537ae443c4add4b19ba1dce3ae3b58f8717cb904f3f826882901c218afd9017ab730a6a6ccd08d1636ddbe38cd03d6350a1f12deca3f31f1f2fa4f362a47d219d67498d014911228e6dd32ed694efed8a44889c3655d80afefa74d721444d356b9b34c104d3fa258408763fd354abb90ba7d34526e3c2e9c04cc6e3c2613e200942b45ed99d5bc6171743078488557b29b9bb5b96dc7e10bdbee7fc09722a63a57c10ad57d7b6526b059d7e6e785d1a4b6a01490fa2e7f516df8adf8c5bb6584430adab6d95166ceba5d5e22393d1c2a5b1b42a2ca2e7f60fc6b4d06dfa5daf889652856b597c15dd5d6e5c379e1717cd192b2f8ef100f2454705f05b88a860241523ae88bc7f135c8faa584a0e5b1165727adb98aea69efb5811656c4ff77db1e5545a6fe3ca3c807cc1a30529d8278cac228a6a45e85ce3e8aef7edc655488b465f088c62fb305ac0830b1e29e0c1058fcf8b18994ce7cfe83496f8643ce4fcc86432990c18a9fb90d3a25895240b2373448eff9d46d5be585b4faa88dad8b72598de2a39531129558f71620c617a9f5c8e4dbabb49b3592e5d9cbaf575a9c8dceaa5ffd6a888226456d5c59463ba947144cffd7b983272b67fba839153449c69dda6d5dc0fd7251899ccc6d336998c6b346a0823a688ba7795fe2e1553522f06198123fa6d8c29f81fd7ad746f44bddc3acfcf5ffe4ad948295c73757a5a95dc3731e5a4305f7a4ceb545fee881bd1fa8bf9fb58cca72fd5072345c49c7bbc721b6bed29f736a297966b5adfe49642a64611c15eb6f8b5edf618fcddb8723e2d3e3219cea745a5d3f1e2bd4b19998c27338c88224a6ecb316fb9debdbe0b45f4568c9e1a841bb9996ba088d6d5f376c6df36e5fb44d4564ce8ce1b7e829f2b93793f2493614f44dfa0d34ed574d77a2c3a0e463a1169e355ef1783fedcabc789c82dd7f8fe4ddb5a09020983076cf90f1a512693c964323f82687230b2898835c72053ccf7351131e4c49e3e6f2b7af2cb4494ad9e32a8d17db3414c44df6c652b96ab55aa629788545a8e35d86274f56add12114b8d936ad9e2dba75257224ad68f1c95c58730364a449f2a6a4a8e2a2d8f17189944949427efc8afd6bfc52b841346262384b3d21a15c25949928812b3d698c6d5b771fdbc70d219239188a0aed7efe9b1f5a69c37ae1a48442cbbe3d3e8f0e55aee8d6b6cbff219794494ed69522c1fc35eed9bd7d23a4e035b3e93f970389d57e900715921a379379e06c6f21f41349e1147442ab2b72937e32f9862f200f24526e3a066e3699b8da78171467bef5390e94610196144b41a727f5ba598ab75ee452c6dc67c33b1f2aefbba4a909b763a63a79bf951d1a896e1b242066369dff978da65a5937e04d19031a288e8bd352fe55ed2057bb90b612411114cac4a5725f69c7aefb91246101125d6db60a763cc795d26c39646dd09238788a2c7e4d5ce1eba94cf6c8868b9b68d9dada6ef45a832994cc6351a84914244eeb5b60a5752a80a42d69d460811b5e7e2f6d4476571b9b52df0f584914144eff7b5f5d6b29694b60b2272bd1176fa0813aaa4de52612410d1b6c45cdd6a33cf850c88c8a5b8bb5e9ff53a7f565618f943a4b121a7e76053df5823338d5e61c40fd17a0e77238c09be4ff95ab0298cf4214a96eff897ad7f31ae73568a34178d8a3219f82e9c951fd2f2994c1b61840f51b3a70533ea32866c735b90f61075c3f7e8bc96fd675c7a88d4b997b8a594ed307d1ea2f8c9614ce69ccfad7aaac8081e22f8d2b79532d76a177b2dbd43c4b059467f95769937a7f52388068d113b44caaeb4b5667171829dea10add7364187dd9c6f55d2215a4e1699b9efe6dea7b218237388da5bffd58de32e15a353f6238866a40723728856c15faf2597e02655ce7e04d1f060240e518aed96730cb26b0bb737ae62a85d708858c1c5ab7d2f632f6a6f5c5d563aa92bae41ce6b893219cf47c565a5b37e04d1bc8cbcc1997bb5b6af52693395db57fb85ed254d8b2d177c87c34526d3791797d62192e9705e2683841137446a7999b58631c154fc1f1f994c26b396465547a030d286c8c5a4ebddf3ebf8fcd8107d8c6ab55aa9998aec710d51efb20477bf61b6b74b0d91eac60c9b36bf6d8f9c8668dfe6af3f55b11f8368887e976aa8d615fb15533a43c4fe1addaef7554daa1b57e701e40b1e5ef00012060f8fab192276f01574ac1ad3d6decb64ba35ea32528628ad5a29668aaea247f73aefb5e6f523880604236488721b73ee342615d9351ec35a9ea9acfe32aa966ae3ea52e4c303f20b8f1f2ebdf000c2c3f10b8f7729022493f1acb8b0a8b026f54710cd481546d8d8dc5e992b75f264c59d52266e66d81c27cf947c06236b743e9e978e4603811135226e77116e2ff75aeeb9271849236285ecd27a9b96aeabed2e46c4103dabc76ffd9f365d6eb5fc8a06b6bc462d8721721b6363fb7ebb254d911505864861c3df07973b77155b7f218a2f5d323bc8a2b2fcb870344c5f3c2a1d21ec85489755b6abd86b658b6de3aa59796149ed42149bbda1cb5cf03d5d6ae3ba2b151a9b84a86cb1585e5a84a8b8667969495c8862d2d7e4b15b6d6c761e40bee08106f421a4a59191c964321e178efa8f201a38b28568955baf7c0ac2043dc18dabcaaa16163beb6e962aada576b5c82e395e31bad6cc7e8c642152f063fbc6fdadde5a0d072ae5cec7937a040b11bf05574796a2f296f9565cfbbcb0641ab942a49c73899db68abc3afec615be6665e59fb242e4d6398e4e3d955ec3d7fa47108d0c46aa10c196d2132a4c8ca98431935959f997fd2388060623548858c14ddbbaa0db14219b4214a143189d7aaeda3a6d1529449bb0bdb163cf29a68b9ba210255c2b795b0d03dae0da8c919dc5f6808e4d44a95b8c2f35bdb87699725634da3c1e954f4b6359453e9fefb8f44b9113e8d044e434bdbf4ba9bc2dbeae70388e373a3211bdf6ca216c9a2a41b71226a2fdb7f4bdf449b9a44a2f113d5f08b59ff7e35b971bd7743e2ea9ff691f4ea72d1139d79439af6d86ef192b11e5b2bab694eb6615776d097450226277dc909f524f553b4fc5d3b6589d44e4d42b56cb5727f704e3c635970e4944f92e39e57461821b392d4945a0231251720d533f7ebdf857f3f1a8e46ea10312d1c3f7cbc9b58d6e17a76c7daad33f82683ea0e3115182a95f9b633159c7e888a81f4ce7563545a5a9d908ef54cadddb6953b166ad715fae4f8995fa4ffa8c88166b09326ed78d2adde95844f498c2f68c9db129d689021d8a8814647da9323a53c8eee948440415aaa7cbf1faaed7898884ac2947f6670997a943289719d31dcc96dbd019225733a6d6553b6be62e4fadd6764c717335d78ea54244bafc947954cd75e25d2e2b9da483105152d8f0b1e60f9bf74a300611ada7ed6d6aa573e856101173cb53f46df1b96c9f818856596c658e25bbae5a8088205bdef4d9ba522ab683e1021d7f88568b716d27c75873b1fb450c1d7e8858628c63ca0859b935b8ca7d88f6754116f51f3fa56e5da33bd0c187e8b5967a6daafb0419b28e3d44fa586f6a70354fef77e9d043c49c620d2ebfb4a9a382e63c44c98a2364fbf6f5a57c3c44aa9ff3ee56562ef5d91da25dcbe08bccb22db60bed10f1b7db66c7db12b2cd3a44aaaa1dd3e3c5da43071d229816aba598396e6c4d24d0318788d7c565b896f3d651b5212ad09b97058a75c8215d327dafc5f51b616a71705ea54bddd7d5da7757cfa3a6eb74cbd178303a4f841386fa1144f374c021726fcc3e2ad52fb9f8a08e37441c376d8baedb366cfc3c807c01031d6e881e6b6d39986a13bbb7fa8ed2d1866865735b6bad4ea7aff17d7169f1e1e9bc70e1f94f912d9ca0830dcdd7b794715bf3631675ac81573b6dbaeeeaf5e5519d613ab551e13f35e84843a42aaec492d9b5bf055726b355d08186e8c507e17b9019ee735467883875bd2995da6289ad67862d43c4fc4cbdb5f22d8bea4a8648256fef9ebbc85cd3a75293a0630c91a77e55eafaed5295221b0c7242b79ab53d75ad638d762f134b89695b67bc050f2e7868c1638c3078f41274a8112d6e99ede34b99526b6944baf1a9e566faaa5971173ac49094bbf24dd6b9a959abe470bd4c6d295407dd3f19e80843141f631793375fb77d5107182296ab1a3ed8586cf6ae3abe1025c8bd72458faec30b117c49d95b9de2bfe8ed994c26a351d7d105cde8e042c4d4ea56c95a2e8cbc9c8e2d44af156cdfd8d876aeb70e2d44919dd7378f90fbd9451d5988925aabea9e73705d75662b6479171532b010b58aab33ae7e4d697ea77d8b4a18994c26c332e4352e918b2893f9151716154feab842c4dcf3c4cca26ba61e26cd528d66ed8f201a1f3aac103d96e9585d3fe5ccacd39e4705ae56215a6b2d4dbd3e9d4355900a9182d9b9d2598a9e19932a0b744c2162b099e3a6b49e5d52aae579f7870e2928a5a954626c29f686ef15abe717135b6ce3656432994c7a1422155f7286cbf3b597261422c7991c53b6bc9fe9948e2744b05931a54d97ae76b63a9c10299731a62e47a6a309513a65ec75b657bcfaa50e26448c7582ec79dffd59d3b10455e7d65ee75e49d939ada6cffddf21278f9b3a9410357f4dce9a9cec606b3a921031c71bdb7d936ad5bb7420216a56c622ff52a91e4bafe30891726d3bbe98f199aa741d4688fa99d296144cf578bdce6472a0a308d14a87fb6edfbb553decedfc2a37cb90203a8810f95bce751fb75710c2e82393d13184e85f6bc93c6a42c8cebef3d1a8be4b11204adb113a84106d6be5984676d7227cae230851eb964b7164bde28acb8010315ecd2bedbbb87edd0f22e59253f8ced453177375f820cac4dacf61f295d42da6a307d18a1e53aef4f4165bee63112d05bdf9767b5c90dd66324ba3b08834553e4c9b71b3d3d92ba2cd5facac8f79c767eb0a66ddabb2932db7732fd7f55e64d029981edccfd68a68e17be7b4ef12c2eed703135644a9396f715b79b6c40d5711717ae516b71f3263e9bce0c1050f1f9e36076389b15cbd52bbd7aeea55459499e22a8d31bd335b9e8a4829e7fc3deb14f9a94c7244d92db2b4524c317df100f2058f4c2693414594de3bb9b52d394eddba7185ac6b69c0308923727e9e3155bbb1f8de5f349c8fcbcbfb21bba788603f3b53ae91b97b5b0fc765cb303145f4ac96830bdd75d55361a7b134d8361a229c0e531598c011f1ab4dd54e95e9218c7f0315cd0ae7e58e61f246b4dc52d61c5f6c5eedd1acbcb07c1a4bd2cda7b1a84fed526c52d7b5962e9549696f2f4fee5ffb5e7bcd35a551af75bce001240c1e6bd5077c3454bcd0d5b0ba11a5a8dc7743852ebdf5905dc1841411c3579f3a2ea6fef91db711bd971453c8128cec718c994c26b334caa3886226b7e0a7a8b2b9fb451145979ebbf45a7a27c6190aa596abed9556f24f7ece615bcddc4fa10928226de5f0a9d89236d7e85e3cea13d1abfccd6f0fdf3fdbeb78226231fd5b70f953acbe2b1b8f66b513917a9558ad8bac4b25979c88dc65e3d8dc39f626a2e469f9832c2137842c3b3d4c3411b198acd979354b9aeddf66224acebe931353cddd2bb6718ddf514c444cf77daef4226f5c79407fe1f19d170f67e5f170fec243b3b645a5adb8accec0e41251bf5c17a33bb8ee7963cdcbc4129a918349252295a0be56dee69a536b5d20874553644d604289285f73a5fb18bb7e2ad279168e904f0b87259549603289c82908f775c585bf1ccb77589e0c4944bff8a362fa9447670b6153918838374167f0ed7bae942111ed32f6a0fe8b11aea86915c3e411517a2a6e7ba79e9cae151d11ad6f5aaa5c42a79dd46b4414612f965a7a0f36a5d219919dbc2b25954badc49b58b36664cb21e7ae18632f22e257d5ead85f6f8aab268a68de6bdf39e7fa8988d2df6b6b3f2a7e4f61733eaa88881ca76e71e583a9ade6733ee9c3e41051ebf554b5a6965bc5b8a2f1bc4785c847c5edba21228e995e4166b15fec212a30e92a44b4dcbbe5d1bd72302db62a4c88483dc6ccd3fbb5f6aca0134c06116572f91cf55b71a7d61bd7b4f2c2a24e602288c8e1b707616c2ab1a4db9d168848251761367cba0cd34b2b2f62ec1d4c0011b97c99fcb99d6136741b57f7e2597f48aab9572d75d7759594a666b6af3ebdc6a2fc10a56cf5f46d7755b5abd23e44dd98fdc205216f2a6ef75206124cf81039a8961db316d33e4b6b0fd13afb4c1dd7296f4f61bec1440fd16ace45e7cfdd17730ca1164430c943b42d23744b29741a3dd747afc1040fd1fb978be9b7f61dd58a29e160728788992fabbaeaf4146c1af7e24915a2e2f168e15eca5855f583891d2296dedd5aa7ccb1985a797841068fd5e5c906933a44dd3a254dfef6b5a9f64f8b0a0b84a86c91c964321a96971637a143b42f46954a295d1ed79fc91ca2feb7b1f7c5055d54a7d28f209a642207c8b0b9d352b9ad72ad4486267160caccb57c4e37b1c7360e07d74c4a31669a5c53b357f94bed6ca95ccfea428470c270e1fc506f50d6895d5937ad65c63c93b23747b6a91b6cd7e0c6d545b3fa47108d16266e8858da7f91bbd76a6dd35b3e0cf89ff72e6844994c2663d286e8b9549a60dcf5d43b22adc3f9a43e7bd8798f66c5854525950d512ee55c0bbeca04dffe114cd610254e56ada9e76d6aa9bea76dc6708d16315143a4bbad0b21843179faa721fae7e2affeb7120d2a712a6d76658a53aaaed790db2a955a636e8a67885a46f54d15595b6eccfbc3c40c516cbcab9a6f7bd32b5886e841d6de5e356b6488d8afa6ccafd46a90c104069331448e5b198cae414eefd7632698b011b19814ab04936adb127b2c0b266b44093e073faa95dc6329f509266a44eaf253e9e365aa314d5d3049236a4f5527085ff2554ffd08a2d99888218acb58736e2dd51eb5ad4c66694696601286e86d5af0e9a604b7fdfa660bf6850918a27cee7c5f87ce996b349b8f0a915d324cbe10698ccd5f536e79567bd50bd147a7ba6c1feca8d145932e44ef5c4acada9faeadc64cb81025960f97b17ae6da39db826b0e2a76db9433b5181a4cb490be3a7d2d56cd997c395574d8ea539f520e72c1240bd17a8c5f2a4f4ca5d4169b60216aec5adbc852436eb8697285489f6f42d5b6b52d5396c96434fa3c2a2caadb0a51a606957ac7f786ea29e51add814915a26ccf6d4beccca0e3964b0a265488e0d2b5ea8d3554a6bfd8144ca610bd66a892bef3638f5f2ad2c6c86432198d2e132974e276b5cad6cae4ee664ee7346a5a29badbff8deb0bd15d69499dc5240a91526f9dbd4b7577d139d62650885c83ce4efd73eb37ea327942d49c1c2ff4069fd9351d86165ba8208c2ffa83c6b7267542d4d2bbe56fa5a8ac16f48dabf6749a34215ad5cd5ba614997d5c6be38ac66f5653a4753a2d63c2842832b6bc341566c2c6da6409d1f2f7565b2ca9d6cedf9928216a093b755595f6dab84c9210e5fa6ccbdb1daaf89d4c90b0162faf27e6cbcb73195ba95f4b914567967ea39a1c21ca16a152c758c2f5ce8c10a54e99f2717b5dacbc8a1045e6ffc7bc113ae5381221d2b72c4165e91cbdb5321942b47ea35ba6ec1874cc4408513e5d75171d4b9ddc5b8f467d3a1ccfaa4910a2d56e9dbf3d4b1320ec624c552f5e658cd36e27f7e9a2534da1c0e407d16b4d96d83fe3c6954d7c10c5fcc5ac9cfb4b6df1833f86b261d283e8396edc644e0d57b592584489d9e563ef1eb253ccf98045d416bf42f51ca67eab52914c86f12ba24fba72c1f4aa3d5ed6cb63287145145bb74eadd5cad69682dc8a28576acd9c7f3f57f61c2ba2f6ca1ec3e7a54ed73333af226a4c573767df5e53c69e758ea8c1f59a73dfd3b5643155a38ae8397ee7f4b1e6e26fabb640695479a12415514c18e3dbb8d971a5f8588e68b5be16617fb6cb085f0925a888da7a8ebb50bd8f0fb731c711a5d792464d5eccb1e5bc7175499f0e678c53448dbdcbe658334eb62d296dc13245c4b05b99f58b2dd74205399bcf8ba1e2a2052f4e43091c5163bd5cdaf70655743015e97c5aa232d41b913a76aa4556d56ae52e6458528aa8ddbf97fc526b8a31b6385c64324a876854e9907486123722d51c7cfd6cb5c154b01b8be6d3e1783e51a50395922252e56efdf922b306fbadbc8a17998ca7bf50d24604217c4ea9d77b54af8b69d40925a3881a36d79c71b7c66a5dbe4b11209baad1229fc542892822d5fe7c1b27e7f9ca75282267d6acff1253cd7c59028a48bd72f6e7f6f613d1b2552ab6970b2e4f303d11a99556e92ec71cfbe8d6c635bf259d5865aabb98ea4ce5ccb8373f296455ed4de9fb8e26b5a87e3843545c38480927224f8ec55429771b426e51d964322a0a259b8832ff37ad6edb1a5b6d82124d4491b56ea9a907dfddade63106196384c183f369a90c2599889ae2d69aeba81abb051d2622d7cf32176b2931f83a6e5c977e51728988354bb8e2766b4c0ab24c269329f249d514f96c1a259688965bb76cf7fa9c092595885a35aaf57cc554899352224ae979e7f2b8d9b4b16b8a743e6b12916acf60ba961a8b91b92889483f6932f6d8fb4844af2d66eaedb7afcfd62011356e7e66a6d98cadf488a8d7937bccbd3b866a972322e69453294b55c794666a44a4cdfcc1b6d2d35db65cc2884839a5d6820b3b9fea6a4ecb22b89f6a8d0ad9a78f4a9528c2e5f36a09be6b9d6d5722a277de742ec57f0e1722629753b953aaa44b2956de8e8fb753d38230faab9243449c2e2ac760728b75545d461b2252f65e830e9f2ea61c5c42282944c4bed96207795bba5da9841051ab4b1bd3d353fdbac7c30b3278940c22729ffa31d81cf3dcd734edd3ba607589aa82885ab9aa8d11bac294ce6532434a0211bda829ad08359379f737ae9c8f86b544a949280144a42b99bf7f55f5922b1fa1e40fd15a16556b8f2da5905374e687e8416f19df3eaf43fedc78aa164afa10c5676df1f306211f2215959f41f84fd35ad9f610257b2b2e153ba58cde981ea2a8da12bee6ac5e36cb3c4419936bea8caf1f6366788894822aad5a56cb29d796ae3b44bc8dad76b36feae93893f9bce6c2a27688d89b666405e3f347219c15cd775c34b04525aea6923a44ff70d7e5ebaa8f4b3d1d970e91bf5f67e8d01f3ac76e0e9182cfd66a10befdf66d6d5cbbc8643299961239b00c7a885854ec61fbf23c44cdb5ddbe4eaaa9d4ec788858c6f4ec956b2f97b2df21f2d48b95b657768860266d899f47b5f9521d22d577a5cbf0694b4d87a8997a1a935a9f9cf11ca2947653c366903da99543d4dafd728f9f5a55538f43e46aade81c8c9eee1e1ca2045f5cff2dbdae746f8834bef73b5497e9971b22d52054f7ded4eadbd8868835bedc07f5fd6bf56c88a0cbf465afc56d0dd7102d67171b6c061b006a881eaf06d3f3c64fc1f41a006988f87da9a62d2d8dfb5c03000d91eae79d54bd4c4fbf3500ce904aa5c612f3668628baa4ae1c2aa5ee9d97218a99142bd8ea6c533219a2c70a575a98725fb63486282ad8d8d37605172e6d36a2c4ad0d9b63e6bd52f61a9163501bfbb31757c1a846f4ead971f16e6aac9f46f4916337ebe5665e4f0cd1fbc778f5fbf7dcf60b430439e56b09a65c10ae0343e47061aab5967be5d27d21eae5981f55532ca56f5e8872b5457e30c54cacb52e44f9d19919e3c55839c68548bb1763ad637754cbb610fd8a9a96f65be7e25a5a88123e4fadc104bba5f22c448a5954ee3d1863c3888568a3b3087da9f550ff0a91ea324d8dbd29eb5b21622e5fb5e4a90b3ad6558894d9d355d0595bd94d856865f20837adf8eb9ea71031dd98aacc29b3e62c85285f3f4d6ddcaaadab28444ce172ec9eea561f1314a24f2f31f870a95bbae909d1673e8b0cb965536fd90911c75ea74e35e84da5e4264499bf9a304117997a910911eb866d13834eadf6b884283d771b95b27ea7ef9510b9f41a2e055fb274ed9310b173a7a6cba670458884a8a55bc81d55354e8747881c37f6ca0fd73de36784887dd9a9f4ec8a102d6d6fafc165de14362244aa75e4e418b32144a9a2fa96965321442ca1fba79b62ebb83808517c7ecd952f65d75101217a56fd5a47f8d869ef0f226d05f34585ec25630a001f4419d56bd9f1a5988b5301a007517284fa566e4bd1a554b188944bff913d42b6e9455844a9546646b76f9bb27f4594a25a71d763d015915ab6545d8470fda7d70aedf5abb5f4986345a49a72f85a212f16bfad226271458f99ab952e6b73442ef65bb0a5e46fec962aa2b4c9a9afd79791a3a722829b9beb69ed3ef52e47e4ff1463ab35e67497a3227a4af1f3426e2cb73b8e2831ce05557a4aa6914f11a965dabe9ab66a1d9529a26ca79e8aa5c7ae5682235a2ba60513fb77eb3bbd11b5d689a5c7aea552441c1bea5aff4df9c74d6e446a177cb0b9367ffe265244ecd636abc7e5ede0a636a2dc06d7cac70a2ad734657b8eeac58cfb2b8a88fdbb76f5223bfbfe8622d275da5c528ead1d830b8a88fd3b5c6cfd6eeac2fd44b49ea666bb223bf3e5d6136fe343d88fb1db4e440b3657d6e25b995eb9e544b4ebe18aa9386633b7dd44b460d2f71c63ac5fbeaf2622b64e77216330c5b4bc99887eb18aee978a9cafd562224a2ba5740ea3d3f83aed25a2e8b13da69a6ab7db5b22f2e6b9ac796cce79bf12d18a9bf6b5f5e2941aa444d4e2f3f5e0dbd8ef253889c84587ae25d5f039b39344e456c2f8da2a546eac45224a95128bf9924122d28f2c99db6209a6b347446eb597693567f594983a22dadef4be6dae57cf2d6d44d4d6bed4f2b97ebedc951191ae8e9befb17d499f7511115b5fed73656a2e97551191e64aed9d52aa23eb6a22a2159d4755112e4544f4debf6d96efab9a4b3d4414fd65a64ba7aabf520d11c1b894b9a9c80f5d4a2d44b4acba3dee055fc1170911fd63c9ef62be15f7c141441ca3826fd7db98e23f4144fc5cfc5c8cadd6f85e20a20859f682999aafa80f10514a96317eb6d55ce8f6bdf7536e089b1f22c8d6a56dbf5a1fa29571dd3276955862c687a815ab98e2abe79ad97b886254f1a5a62bf5ad590f51b697d2e218fba5f5290fd18bef9aab846b69d2c543c42de36bd385ada9a777885a4b70f3d3657aba1da2d7acc1876f33bbd8518748932b8e2e41b8b8add2953be810b55c5fbd58bae3741c5779c71c22e7fe1efd5972a7545ccc72889463ce95d9f3f29751151f76c421f2ef5f2bb26d4a868fd451d1685c3c0a0e3be01045fee72cd9f3bf0623f33744caccf15bfc8d17e4653744cba95330c296d48e36446bb1d2d4725b2ea6eed78f209acf0e36444e71ccc458e66e73eb6d5c359cb84997bd1f92d61041b554dd3bf6bd1cd3a88628a96f5af55a5317d5ed4843c462545fa9ad6a4743d45c7aed7d29a7dadb72e37a86c8757f3dcbc6eb5b2f33446d717bab78b5bde3a46588d29b71774c2f5d838c0cd1eaf6edad96a26ea6541bd75431768c01b3838d1cec58a3d5d834768841b9c4d15f6cabc5f41bdf6247187a9b572ddf74b6566aeec255eddf6b2ce37298700718a2d49847b6902d06615cf785c8a995ff3229c76c6cd70b11c7d7d63b6ed9efafbae2c2e2a3c8161e4f1b2393d9c28e2e446cfb794a493d312b4bc10e2e448f25764ead720877136e214a6a41173b2af50d66f7c695a5b51039f84a5f36aba7b75751b12c44fdfd71315609b3972b901d5888123e53e9abddb73d569e2b44de9cdde7b3d5d6b9358e15a27de511f2ead4674db971cdad420421278351c56796947b2f7650214ac7d255b68ebcfd6b0ad13f5e2ea13ff7f89c6bb4430a9182db6ebdd478d5d2f71bd728442caa420899d25ecdbe1bd7c5821d50889e3555f0e1bf4c69175b7d42a430f999da77fee9ab37aefcc50e2744a98f21eb96af7577f426446ea9b74eb5f8187e3f13224f5f1eb379be67c712a28589a57ba7fafba9698712a2071dfcc6dd5445f57c3b9210e5fb46d84a23db818448bd52ab8eadf6c5af6ac711a2e4c73039cbe7feb10a7618215ae93f552f06ddc56d998a821d45883231c796b9d76d5cd9f3a8b080b18308115ca996666b29bac2b4afd2f92817ec1842c454a9a50e32b7583d99102267a9dcf74bca1d8449231e5cf000b27e04d110d91184c8b9fa62315b5397d8fa0e2044ce3db7d6faab578951290f205ff8f0c28b0c1576fc20cac7db7ca563a6bebfc307117bafdcb2d2e83a3e5d1bd71d3d881eaac854c3b451bd989a462578128b4839aeb4ab13a6d65c5a58440d6682b1354e113ea85e11f15355f898d963bd366e5c5b3d9a8f87b3d1b47496a3a271f1b8228a2b977289a55eede3e6c635b54f5a1131c6608c1c958a30766356448e654cd95e57672bdb5544b0b9aec831b3652e7b7344fee938d95acfa92262bc123e37b79e8a6839c656b3eca59ea67e39a2c698356fa65129d64c4f50a1999338a2e696df7246ceb85cab5344fa9c5acbf0bd5fef6a4f4ca1addbacac526f52c9cefdfab98e8e15f377de720247d494c5c8e06b30a6e7f7276f446a63f386c91bc265bd2a9c1668b4148cf345e72e6372e585c6891b51f215bbd72fe6b958d48debe6a342e485741a90cf64167bdc0b0b0f2fc8e0e14e48c1c9d3972ea5995452a7b9ba9e6d7b66eb632c276d44e95bfdf6539ce957a68d6babcec7658c935144df1c73dc6264cff9c165149c882272b56d29b776d517fb0f45f49ce04b9df113f7ba088ac8a9abe66ff14aca6273279f88b4656ab0adf88c35ff047d7c5a5e389e88b6333a866e3363846bb1c7b3fa3b3f82684270d209e6d8264fd9d431341e8c4c06a2f19b77c289e845d87a59e494bcf7e326a2c529bd7d75f398366a829766ae6de5a5aa29bb93a9dc8e29b95559cc44f4f631772eeea6cc3ac14494164bd934bab3c794bd934b4490adf490f94a969a3ab144945c7a0bb2c51ee72bc34a744a2fd7bed6ea7daa764209cda5aa52294eab137cd9583674ca5f7a9e4c22822d39a3abaee69c623e85134944295dfb7bc8bf3a75b68b4b4bb93f826846a070128928bad72e798a29bed456908856aa7e75d7da6c3da74744ec1f7b4d3d63cec18dd11111b3c5edd235e746441bd7f5c6175f67aff34c2693718fa3e1841111e4f7043d1fc7d70c322e7868780009830717994c26e3b21611355711bab6a7995e3d5544e4b1e97faa947e3731978895de4a9526b69e9ad42a95ed4913634939a85c15119172b8dae3f7b45473ee0f116d82ee9526476dbede1a2262df9139ef87dfde7be1688a384d915488a83de595d2a16fba564f5db0b5ca1421a28dde583f7d9f7aefc54138f51e546dceb675b30b02ea53aca9b792f2f6af02c12939f72653ddccb4f7a352e97261dbf6aae9041011dc9451fd73e9c14eea7f88d48b1ffffd730926f8da0f115b502ddeb8d15d37eb491f226f4adbe6664b6364322985133e44ec143eb8ca3b552d6fb5c2c91ea27f979e991b53abd3b4ca60e174bcf87832193d44f954d2a554a7ca64929ee42162565075c2b878bddbb9b0a864321c153c44ae33e94bab5c2acc04ef107deb7ddfb835558a5bda788bd2ce7b929fd8216255f64cfda77ee5ab3aef585e7e74ded36963ac3edc3ac466ebf5d99df5eb6d347ee32774887e35b5f1f9b78c293553499d43e4ec564c4a652bf70f5f6e094ee410b137a51ed4c5fcda828db5272393c9a89cc421d25fb97e2d73ab13d3c7e010a1bf98db1c724bbe71d5703e1a1795333c2a6370f206eeccddf664f55ecf4d9d366673aefb8d2c37ae91a321e39fca4a198c06276e8814bbb75cf26f98b40d115c1895b1d86f396e852d1c0f0af64fd810bd181bd4f834fd1d33b70a4fd6107562f784ae50df5aaece682ca97ca2864ee6ab947a5aa55425bbc316953fbb72ed64bc7165e17c3c2fafd310b1bb7eae787dcb8feeb5d110b186fdfabd72ecb107d3c919a28fee1d557c8ab97cb620878b1333444d637cd530bd77ebbddab8725496f7a40c4b861d43a44b354c76d9b9fa944fd820e3648de8b33d7dced3fab24ccd69d8891a9a394963ddd3a667fae24ed7ee546eb95fddbd1331e8491822e5a7edaca0f2065d7b2760d04c3bf942c45023530b6e6c986fe18917229830460895be3ee942f4f0b1732e44ebdf31c72f2a97cd29df42a4be56640e9b6d64d74fe3440b51daf63023dbd4943ea70ec78b33389c30d686e1240b91aaa4cea56fd85e7aafa9e05b54f0238806c809162296cb6a754acf65bac6fce40a51bf6aaaade4e6a7aa21678c95c6a2f2be8bcd47c5059a132b449029d7aadf5a9bafb967320f3399932a44eaf99ae3f65f1513a73ca14294588a2fb695efc584eba71045b8944a858b41c82fb1132944feba41a560cc284430b18e1f9fe65a89b51ee1040ad153cc9a62fb10bad62f3e21726f13b66ede296abb774204135b2e6a624cfde953274d88febddfc6a23b06733d6a3a1c4d4be75d3bbf4e98a03a7167e24cceb2d752adce2fad7eef3661c2d6c1c912225ff79e5bc376f13f4125442dbaa7362e171737fb3a4982e24c2a354b96962a4d0f328bec3ea64d6eb9f97c9a0b0e4e9010b5065f74de6e95792f7c59f98e8baf93234419a152f8cd94f27344bea5758b132344a9625cd756e59c2afbe6d3c6509b4f7351453eab4e8a10b94fb9ecad0bfdb55bf1bb1872428488b1b243b83abef55cd2b54e8610b195227b4a35959f14a78d2b8b4ae7b3b4f3f1a4e04408918a8b153ef7d8324dfc389d0fd2c2f99169e1b464322c2f2d8c0927418852356bb9dcaa4f2c21e33146183c98cb0910a2d751a96ba969822aa975f28348a95e9be0730a7d103d8fcfe1afa8bddbe9a9334e7a10a5b6be5f3f3b6952ce5844dbabf635b5f698513bd540072c22854d375f54afd63186bca2e31591bbc79b2c35dc16d5e38f87cfd0e18a2845e8ef956b8d7dbffb5644fff6455d2cc29796d26545b49a6386adedc5a7cf7715be9e346972a69acc9a56aff4ac9db76d7397d6c695a5c3f182a5c389ec083ae6889a2718614a2daef68b411daa887e3dcfe4dafaab66bb5211c106d9fb772fe14796518e88578bac90a5f7eec15754acc4343b29953a75f76d2f4cb8d873c571449ff4c1c5a23f4eed29d6718a28b27270bdf6773a8fca52cf8acae7c514d1eab64e572717e1881eab6abc9ac1d6defa8d08fadae7f450bd958abf1491c2e85a57e326756db10e37a275cd295b9b6d912252af93aab69e63ed55523ada883eb16429f3dfea2bd6318a28b117d75731766dd82c8a88adf47e597c8b7fb964459a0b384480281da18836554cd1adf8d66bb59e4adb7091c974aa0e50442fbef86b1dae6f75093f11adca867163c64d551f3d112963067db5e6e88cbdd889e8d97632d7e2a726d89213d1ca0f95b8a8740e48451369208c822086611808eaa4580001d31200302028228f86c3f198545da70f1480045f68566a342e289246a2a1481c10055114846118055110023114c3200ca20da23300d8eff18b5d9c8a96bebbae5ed022b32bf7343342588bb4ceb29f4c104b0a5d9c893fbf6c49934ac7605397fc5867b61d13e4939c01153d2cba81b8d6ccfc54d725ab2be4b3fc55f2f9e64ae54ce75ae194b9be72d2b9a660d660a5a0ef64299c69ae554e39d7174e9a6b2ab3802aab7c73a572a673ad70ca5c5f39a1a3459e78cd2d7fa2df29d8900d9e71668d08f09443ffcd8693e696aa2c98c92adfdc52b90804000d52f48a7a57d59ee32afebd4275159fc55f2f9f69ae54ce752e09e737179573e9686658670eeca2daa488c889542d97818fc062d43c1905d543ae95e775cde6d41f48c8c42a2d477c4a131353d5e58f92ef37472a773ac72a783b5022ac21c46d682024b6104a446b8280685257b284fd7c8d34cb3495986e5df92873bf72a473a770ac7b4dbe4808703b70e58581da57a1731697ef99dd05e1b994a570a8f4027e329432708193298ea97e909e6ab4055baa60610682a50042b6faf14fbe53e8ae8f2ae3fe784ce4c3ece0495f3852be01d5e70ae28cc5f76eb110e9399c7ae354a6682ab1f4dddd28942d313a45baf751389cca47e22c5c1304dc84a1f150133a7ffb1f1941d8a9f4f7e93ca20e73d0c62457325574da322be03694a0595379f73e7072d0ee76dede627c619de3184ac8dd042a695d0135579e331612eddc39e20f95d77a067d0c804ca7a708f5958e191625f6ebb0d55b85b8094a2dafca225b31dc398f821ebbc801e4dc090e5ea4d19d04f8c72aa35e19a2818e111a0e4404513108ef2574d02675cface28c8a24fb9928367654b50003735f2512ccb1a6b8e06d554936c144a4504920c144d27a92ca0de1931adbf7774f4e22b0e97d00da543c6713ee0bdff37e3ca3dcc3bd46e951a3943b5d717dc1319b17f428b7856119debd787718a336737521570b8c78722e49b84494b25cff51cb7c2e41bf4f7b1eb08d2a47eaac5a67874e4ac68448931854bfaea84f5430cb8d1686e63c97a2140b3a7c5188b052d87ef95413b47e18ca87cff81043c270373f312141c4ed0634282818084641e83e27be295d0796031414ea09419bf027373857b45e78c8edb0c08641ebb776e153d076b27360db88adeacbab77ba07a2113d30648345be41dfd72c74f9e7b64bb751dc2c9fa9c8200eba9696e5a95658b90b0d456a0d415a8f94b873c7ac0028130346986526e2e9ec24cc3b3c113b4cf6a038ae13cec6a28e0353fe3b0a561f2b7fb3d2f333cb28ff2a8a7a80baac124dd615b26f0cacb7da46d9949fb841ca369aaf65ae9a4b8dee421c67f06a1b63173c4be4d5f8ccb7cd5a2c846647e90a26e54f435087837551056ed6ca268d72e216993de21794518955407d8996b389d82a098564795e7122fdfb8d7548d8b0e21817d70030d647da9b10cd07df14917c3cd027b663009746b3ad89c6de1369c00635a01445fef32e17aa4b455b2d1815b28b92a9c0be7bf014115010b6cc867d602f1528ba011cdab39b1e5b811687d6abf250401c819a4e8d01822e6b49dceff530f1c12121575b586d6b25182fa5712d039e4862db020a24025127a75cc8c28c845627c7639b46644458bda911097988f314c58d253b014a2c17b5698b91346008e8203e06d95edc59aea4fb100f2861e3991c325c54f0c66420c10c88762da121ce24e34bb8daa97dc63c82604edccadfcc58aed6f43fc89081568481cfec0e83879cf1d099c11e7e950b815f43500780e6f264b4b8dc1b416d2a56583687809f676c74ae74b12ea918c61082f72cea8b3402446a31033e4092a186d80878bdbe257c1da34632c1223ece12882dae6f42b46cc233f82122cd3fc300fe3b3e643a3ab11af29b9a9808763ff1490cb5effb96fac6e6e6183dee83cd7ac21d102c70d1727c5158b02bf94858f67fb7d0344e137fe25302f81a1c9e86cf40dfeda02de72ecd5d0abc7b9225582570727051f8f46e719c5ebbeb14c014e4b22578dfd1972b3ae2ba972e38815f43af4d40966c09d6c63d12ec463b32870a4de011ae6c41c880d07a170200d4dbb4d3eb0139b7918af111b92c2126a8b0e00d101bc1260f577e3928cedd00e72fc9f675a813af7e28da1c10879485c46e69ea09319771785696121efc690f0454d29a5b960fdc3a1315c19bb22f7c7d066de3644819b95849c42f0950719a6e38b4b8a33620a4ea84d8c186a7622071b8e569fe630f9ecd455e8f748b44d44eedc68745d2213164d9758f03710196330a98ee1e12f6b2274374db497856b22516059168da22d2054345b1db564de9cc936efd6e63183e137efe0bfb1083ce28cf8b0912ed223e6d0d75cd1d95f454f09727a0b9c616188abbc0825962dcbdd286f02b2f2f12da2d974af0f65e49f63a0a26c7944315c8e6d1bb1358c0f269e217cf7d8c5d799c70c7af509299952d67c7e103372755277499814a832a994c80deb6a788607741b96c754641b25efaa445110a47d42565c14b5b7898a4c681e6db06bf8f7af93a00020670f53d30dff9526a307259eb0c48220a1848fd31074d58f52f84f3de5e773d249a14008558dd104ca7d9664f22d461801e3e19b0697fa594d4fe90809b22ef173456f988e328ce3e9aa98ca1149e58156663be58c1c5cf40e3ea81d3d83b78af443562bec3bc379f2de8a2ad22c00e3fb0ee125cfb51cf04a292fc56f279373e63879b3820e30883a94414325e1b46eb4f4ef857dfa50e0ff46f2ca1e6900ee88697c3527cf84a74495fd43c4c04691f4731d55ae796c1a2b68dec9106dceb2b2e08578cb883b082a5c2dd0ca3d954a28e532f2107ec158495c5901aa079a4693bc9a8fe47cc01de8b981afa3ce04d1760a2ae3ff74fb5824b0109599cc323f01137248bc678b59d7e8e3412f830f8c645e4e86d7fc26bb6c0e92a33b279785c515857fe89dea9d9601f06ec0fb2b7930d0e16639961a5d682161f50ab6fd42d576d8098698b423f6db134859ea373e0257f96f30a5fe956e9f47e7ee655ab68454a48d6d263259e29c6f2abe2de6853be78916634ca1395af4a18e865a586f56dbf4b2ac25fc0b7a4cc0089e4b7ced86642ad28368535ffa3b70786e90eb802bcd85038ddec3cf06686c944303e1322d3147c29ee50f1252c8872bb8e868d730f007d3b4d0d6adb27d73fe8f41629be5d44ec1d0cfc0900af6b414c30972879bc940eeefb211b2c776a28d8f9e064a41aa9bdd9e58f08084ca51435425ad83e2712654fc44c048d9b6027e919771d7925a49aac85a5bbdc964aa821b9b6da11bee383ce9c8238f3ea667c437ea106e0a908cc9aef6503241241ad55ab44170d614b60f29d6b50f9b598e9368789237ff3dfa0b3b4b44b7675dec55608a4bcef84d764a0f2a35d1955d37cb06a97aa6fbed445a868eb93e4c63c44a6a43718b68534053a0991378588f8239d397af3e5a53a686e9fc3a71692d05a1b11296957a0feb728a34b9a50f52a8660f0520025679e8687326e344eec09ceba747239e0049deeae393d7d95e042c5cee7a69d2fa29108c5d0f49245b05b22d9f3c7b86db8d65305c47fb390a3ff4300fecf0b79273eaf4dbdcc2ba1601013cfc931bd3cb85f516e5b2672399246be2124ee19b0703bbbdbf28e076550b77fe66aeee9b6f9ec485e21000440f8d64b76b708f148864132eedb421fdaa6c7f9e3ad6e4348f5f49344069237683fa12109c0d3ccb39633d0e529ea1a08c8ecb0d50ab713c157438493345e8ec2639dfca11749c03b822f1ba27da43d1e534e14a2c2607bb6cd084311463853d0ee7b9cba101d695c6b69929134cf953cd19cda382e365ed88a1df8bda3a1a73a8243bb64a6147a072e86331af9a57b05005125ac8fd5dcaa4d8ba12a9d726739abc19d936e5d2b50b49b73d7ff77ec3d6e85798b43e687fe8f873a4907c0b1efc0e83f982fb19810bbd6d31d1d59a039cdd34485f089c5222464195c79dc3feba4156cda8ca7608eed411f2076f01448bc4e198750b0fb9bb21e44a197d203f9400124c04c3280a1e5e8e2288004d04307a05130ebf93480af7cf90098f407dd6c0cfe1295eae2466fa15d65867c168df920d6b913116c6a30d20a08ae5d162f19229f985a040bcc11803934bf914d9f30792348646f41af541954decdd7878ce4b7e0b1056b2c3c04132e23691debba7709ecd3721986f374ded6e248ceca2b308985d562a90f098ddcdc9cf344d5ec9008a490d29c9e501461a2a7384c3be6d586c7ae1883a13bf706bfb2c6348fa576460121ed6caa71a199c0b5b6acc8ae4f17b8a9743ce34879d3f0f887fa1f7271aca914f9633d8ba96615c8e65aca71dd0aafada00723b60c3abacef8f870463a917ed34dbdceebea21355b7e688bed3851629dedb3d2017f134ebc9eba043c90b1cc7ab1d26151ffa66fac4dbea622bb0bc0eb2067ab2439f8e16e54b9b7568c31250f9d417c8df9d56243293d5e27c9217eaba27ac931227032ceb44b3b4f140e5044b486e977dac251d0e95fd3a57a60e358c333d407ff124a756dfcacd2dd6a67ece5b286fde24ca985d831c82ce0f23ec5cdfacc9b12d8b4b3a5978a3e3bfe189cb63959c9d715c1ea65428da1be75dc97d64ee4cd01d33e6000592a954f1e7a8a9f7d0209d8c85a3e990c25222010a9a1e763f6f41006661084de109a70e78191b89ca78d7317e755a89aa0e8534b53b2a41ce83d9fea91d05b690f49562d8513d15e061a1fbe01a08b1e678a1e308141b42e106267de204b2bd06d84890cabdd20608472e1a52175856d8420b9aecf22fb257226ead43b7403593204a9106146370844f466357fce4be70ac648fa0127e3705a12c6943df5e12d899b35e4ffd9859f86bbacba45afce0118963cd963223d3c60ff07861cfc6f80fc6f159c1efd41756a52aadeb333671da17b4622440de56c3ce01229b32afac91001a30cafb852ca85cfcf78ab62c0724768b234ca68e9723421406298a76a39ac80955683ca10064ef5bbf0b603b7acef6ef7a93f422f2d4419be92d2617140aa0d7605a3233cca5a3470e8d7c4652ef5e3e4c0e2522af6651a5e0be3e8e8157341e7db16fb7f4e1bdbb0731378f6deb0ace6830ab0d6fa068d64456b864c414f8c2d4eab80c4cca42c26e82858cae843f0b0665437c4857e013a198706ffaa5988651d9be690b14d52ef690b84f196ff280ce1ef6a87dafd595eed69dcb0be6c9a9814f3e0af955cb9c2b0a2f62f6b521efa470699b92c3aa62b87763d83345dc88a7529029ed11d24b3a14af276134703b9fe85ea0420228a7f29507647e4830aa8111e46a176a793330a098be836113563a4144503b529c7314ec545247c7064fa1fd0003e362b31e6520ba0fb1369dc7d1b8f5a85004a9291722e5dfbd4da1cc6a02638c2ecaf3a20e2f5b8a6e5b9716fa63897bcf8577fa606a4ef362e8a36c30c71e993eb0189a80842fa9fd5562be80a771fae92fde6d46238490657fe10275fbe9ead435fb00c281e25287cbc4d3a60163f0130ce520896a488642b4c2e6832f224f13208ca2086be1c403bc67871f469505cf1497ec6734201490d13a79e6755ec68eb95ed5ad6403657db0bfaed32a10415e765610094a8acbf5b55baa44723dae62572c997d137130b568e6050bdaa908f207d0230b945486f70fdbe97cf57c499b5b189877255ba2fe9086d64370af26dd619cc29e5d29f86a2a2afc1b06b9e0c045c7c9ab0dea4a1454788308aece880c2207ecf0cb3cf339993073a0e528c66ef727034c15044705440cc6fcfdeb588429cea911b8db0bf172bb6c39073afade7de865477e90b21968552a286655805f4eeef73a1b5b7e728af3926534d7bd49c39fece2db90600aa39fe1dca2798c839e03182aa093b4a50d6eac26206fe066e11cb4372cb95ce1eb096bcc73b4b724e343dc8432a98c6570846b5f9f30038080d579c16302898f743d62824d9ebc4da12091b86af0d021b88f871d4599c8e1390548ea1acf494b32b4ac108e522bd1b207d0e3d591ddc38aa5e3b04af787fdd27ea2fd3b0c9d8993597bad7d6a574953c1c3826df510042b38a9d809cfa998a6aa2dbaadeb00ef52548ef33a868439d1ceb3b3601904f76330063826b3643b827e66aef0075a817bde108e494be36b48659a520700c45c620da4d4f4252f7c2bceeac48422486242443ed0ccf7ef55012ea2ee9109b90afaca905e1c70030c55461ed0f22eef62dee579370748e8a3359bb2b25c4195cd24a501348a05495030e9beeb7a4b4261589fb2c4d4e93c0278bc6bac4343ba34d2e790071d87adb6f4a766892ce914ede560ae5c29bfbce660c2d9713072839e438956e95040f10ee551955616a139bf94aaa3076fdec509c7a3f13be9c64d6bf18a51d3ec88b0ef52c881b4362795d291a015e1bdcd1762f419d06b3d37330a9f317a1e7a9d3c0e56f3fa23eae0bc9c0ac565a083c4ab9338f63b557ecefc008b58984f9a35c08c20d15811e8b9c8f9a7832ff86020c0aec589d56e0b8ed81738146f7eb59d7f9dc9bc57873fab52f3a554500aa3ca68eb6af1002f64abb1fdbfc8d8745d1b3baddd57d995173156de4692cd645fa618289be5734e871e39bcced23a056256c50f207a774862b277df18b629c2030ef1b29fc33ba6d82d5afe51237bc7282fd5301140530f2ecd6d16208caf47f7a805ab3689730a5282ed79b3ed8bc31c72eb0dc55ef303dbac3971a357dbeba1150a26c6445ff1bb530fb932de3fa052e37fd86eeb6934138c8bcf1546d285f65dcc95191fc0abea8217a69b0b2470f7c044c0852d4a8891503159145fc23ac94cd5410d1f442c90e283175bbbe4842d3695b550e5d5b2afda851ec36a314e30ff4d09d9cbb0a13aca5b3c77a4369318f01139430a07474ae430b77e24480aef0b3a16c132ecf0a41d9bb9c86d3f65123cbde0e15da5d54215b60908e623341cc0e011bcf21810aceba50818b1a3e2c85d43ef05c7507fa59a2875ad2ebcbddbf3c919d2e32757ef71c5e90ec1ee3100a759514cb195cbe45935cddcc2469dafe65d7ef970d082d8ba3b25d96726024a3421d73d9e99b2129141a85f0361088b44862bda337410ef221cd072639dfa6120fddf5fb483e86b7ea03a1d6a476c2f78f5c4e9651ecdf5ae1553bdb202a651a02ea2fec3debd82ac3b6dc00a546fb530e3a4d91d9fa1cea95fa7394393574eacec785259434a4d3ce341fab9c8c8fa8819130eddb0f0e53016e7f47660ed88a82364ff04100da3af98003be0f6492fc998d4db300e657eaf7579c7939883078ccd62dae5ac513e70f61e0751ac462e7dbdccc57473ab3716d5dc2936f4281af2e76903e19ccbab06aec3a03b36df7e218263e4a00e62744e0ad59a5fabf80950c642e126227cb2ea836893c62e3cc78323da9e4b82eccb68cf157845282aaa4895867ef0b1f033381a42ed663727f6e0de19a15a06b4dc87dcca6f816cb4a60ccec43dc4b0177ba33914af84a73038168ff3a1689f90a15ce41775e1da6195c4603d38b4418e61df1d6e0aa15f40fa0d88510388f5b8578a2aeca205d8560eeb02ef70febe2ac91103e6e30324c97e7a2663aeb5f8c84c5ad1ff7e0766db43f97f82aa991748d4748fbc2945f539bfe4f4a30e2a9b84070a83cc40d0d3d19e9b3bd85e0367b47b84603df53218410a759884a1ad4409bd47e264351af3ca778902184c672d0f43a4956489fe863d03429ea3286b9599dc48d0a2c180d691820d1d274de77f748047c1aaa13fe88ece4c6f76e9ff8391b855631e378cf82f387e460d929872c1f34099e6dee7079a83771ba873b35d9ad2bb0f83d6f9a1a9aae75c9ca0ad5c67f011aaf8df232a12467f25bb7a6240a3dca237ecc040038b17cb5d5c4a40575012f1c558cb29ccc9b8505b3689a3f683f2f4b617a709e1f2544dd4b096ae9c82d2502e8581173d66811947e4c96a061757f07ca04ad6fac2896a4fbb1d00c86b47df24052132dfa79a4baa5642d6cb0d6078203dd6944102b358a9a29203d7f06235b6b8c423dce19157e0abfd4b426c02852b3f6bf097ba686ab803d4d515672b00f38c7d9bd448075ddb2ae6364700e2c46aef284561153fbb582d267005ccaddb3f37a2155210a622694188db0ab42ffc157d49b5df34847f2da80d65ff99d95b420cf351165b8669227422b49250a79ae1315249ea1d1b928ff57e8ad81c2fa496771e94bd083aebde90b9f7c462df109df3a6279182c0e1da7490067587a57ef5423e6590482174d609ca094611fd8b33eea15d9dca64c27e2457833d0caf7940848b9ae9ce21883a8637f72ae2a94b90dbabcf50270c10284964232dc8ccfa2da338042f2f543ef8d797529efbab5d67c5cf71846819526326baf09d5cc73ca4c0adfb40cd19eda2a27f2322c02b8a5b158cdf7da913f58f317db7da5ea55228a021e667405643e99fe8299e07dab2508b75d74f695a5b83d440e3a8ab4b002c41a58b01a7464570db41951a3db55741c4183325c55f5191247936d68d65506d486e9b64961862655e3f943a1305cf0157c6be6dab06a3f72408f62b8020686e6cec700144cee5dfb92fefbae5673ae88c55b956adf03daf6c53e8345eb31e57aad82ea9d4d8a6b22828ca83652a4eccd2d0ee88aeb9ee034af41200a2901857b4fae92e29cae0a8e412a340fb5837638011b6dac25656cdfe394c04b69be2258ca6687d64607e28c5da108428810650f9f7be56c65cafd8f0637621e5ea8321c109ccf160f86488be281a04129841d5a22f30e71c0d8fbd15f0c8001fe492275791f0b37cfc6caeccadb0766926a33748200dcfbaa7035392bffb852c65d9600de4944f1ba0df54b574a73d91248f93a494612c4cbde675bde15fc91f2920e30ff21038776fa98a3e255a911bbd05bb1026eb79a9bf6f4b4d5eaa7ab100a8d34743d25bafcd4924a4a13480e09774e0296ebf79599c8c76d1acfe7ea03d4fddeea6187cb2432f3e5d5a54fd2e6cb245eea58653a3eee6a28acb58f3d22f060435d644390bb50c325d61a3b579694f5ae4bc09b8a8edfe110c80a5d786958fe104356e7e9604a2c97411d09347c04e9257b3e841c31fc08c5f0bdb69cfc7e274d2e704647be1dde03c3b240411dc07da3a7374de4e418f5d792b9cc0bd07c59f80c852804bfa563e208f1984c260c64bbf3dc7d3ab91bb347ce484db860a4f3530417866a3ee54444c1a586a63af859de46daeeda416176d7a11a8980e57fc64ca30a1e0434b344ad4120fb1c2f83ef24351b6eeffacdaa7677a99ad5dc0e709a799ad791081702427044c44157cc30994546f6ae840e2de1cfab5c324f2980e09c8618e240862b9c254859f89c61d03545092996ca8ae3edfc9bbec16bb3b1ce7e32eb5e5d249343bdca5d1595a47cc1af965d2b150c8750e40af6079d765a6d94533667152772401029cc5162147d5aee52546af94a514c2d3f3cb10bae0c092bf27b3997e7666048b633bc72d40c2a8bd6ecc7acabd9d26cb53aee54101aaeee1a0521528568f6f42f587995286587a5fde51bd86d129fcbfef89a5c2ef54abed791ef963f784c5e6adaaf4b6c8a7ddf4477e49db21e530cfd9423ad50223f17463a9f7e2a6c4705191ed30a00b8ddadd7cb677c929a454247f34cedb99d71ddf99663e882a2d27d1b603abc8cb0d45a4be7153c54617b2ab54b52c1975151b05b3b990179fefe9693c95c2a026baa42f9939d664db5f0c79f42916d6a8b25e2b35ad30ac730ccd344a30c38bfe43fe8f2d63f99e3af5353afbbea54a65902bf0e54339d5aa1a290dcf1a152370e4d7c6859849cafb143f356f39e15ff1e158ea392dcc97fe9ad5a2b7653d0f1ed6352f4adbcd92144ed66bbf3835cdf95053816f36c3ccab4432d1a65d72a55c1c72effcbb08b4d81181590da1ff492203d82447e34d86ff4c37337a792d710610b0a9c778398e92002bd072ec128ad55055e4cc71382230d8f682d7d4a9c6b43f176c29310ad692750c1790a22d0c8dbea7b4cc5132a61ea36cad715b2fcb56a1ea14558d67edd9d04e33931d010d03f56b96fd7bb3a89bd837fa943eabc5f9c242cbd9e242614b180f95f1772fc507bc1d874827b2747918989153a92fd296137318e80211fdc34e48cbb4e1f73b30bce9d375e26fccc8a770b6bdcc2c2ef22073301ea7d0bd44da88467b2cbeec0b0b84ff9608d9db3e2ccfc3014e5b03570878908ab8be6c4903d9be4ced0237fe2f6f457db50490eb41486c1cc22186686de36f841968749efde03156a14a2a4eec04ce0ec863a7d96a1aababbc39bdaffb5024ddceb7da530c808676fcfa159fdab4b9c8f30e0f1a0528ce38badcd5e387f41ae4884f3872ebdf20fdde3e060f760da3e09f1f55e8dcf3e82875cac2d62603b5bc7ef07afe540c57d034fb332454224b3a542a9c3f2121856a03dc04685c129416f7ff25ae9a54de8972abba196008f0e426458e21a1b4272a59a84b2e5ecb1a0a075b361a4b403433b46a5b864705861c64f9cd500591f1d3b31b725c6aa1be920ee5ba00e1fe492cfb50e4ed1c48328fce5e9f0ee7a74cde179eb28c7a0e1333a72b29caa5a668591772e670cab6cf88bb054e4539390df9e43b210f12a88addc5123edc3557fcdbe2d45653a99987426b43d63582b69a0b1136d7d9d82d7b29ed0efd9a4a70206160da1e00f70020829ce6fa96c3a443a0fa69f86560ee71c892be7927e3180b04d0bf62a1dc40f7526275e1f7b102a288b67678aed2d292380d1fef20fc9998c3f5425c52767a9171a75f4680908d983133301f7361606d299067fd476676e105508b493326252d9e3d06380759a803a916c3c6178037b7c408f65c721dc4a994c4324ee9a727ff18e41dbb3a68b9ee9e7bdf045149e3445539e5f5080c0fb648c7e883b05734ecdf7d547f9d9f0f7bdd3ec5f0172cb0c8f3d75fff61edb760a649202d2f34226935ec11672cac403c8954ffcf8a70e109b0db95ca2b76ce1ee55aa5130058cb7734d1cdf0e4afb265796acc827c0c11e960d1d6673856b6413328c346830a8b93c04dfc36cf15df918f65e909f82abe899d01f34b4f573279dcfd81b26e9e1986787ed9265eeafb76c3e6f63d2b318167f1c07c2271da809109ee732232249a61200c14b48a1756db3b0aae36b6eec450f7a7693ed5b97a0d0eb88dab9a579ba6e151a1fdbb954379243158a4955291668c9e2fe50735c652ab9dde0f3138a7ae72f9bcbac067e69c79c4de73b8fc3441f684593160512644f653a2c609544f8f347ea79c7bf5e86314ed78c82893003e835480aef80f6801fb45f13cb56fcce16f7ffe1b4e840e776213a61ab606dccb42377a2284b87c095beae89d01b093260a287fdeff9f323a4d0ee82b420542f2df6993e3b101de14bfea8c623081f7dd42fb80dac54978e0f8955372ca159203ee1bb23f6b9355baa037e7951f929be8fc5628e34ebcef1c52bfc789aefc9aae9a5b31c2bad6297e293ae00960c3bc309389ea69baae6b25c9a887601737fd048059352a98e9ee7c04af388c4d7bf048920109d504aa08e35dedd30b60d201d885436b204ff61a9c367d4e5f5b70ab640a23296d898d096234aed1a193a719c33c91b75c35453746e1f2c725a1d0cd043ed120b3710eeea3a48aeb01aad8ff69820cae2349f03f63f33a34466d6e94e98a95e1aa619a84ad02bc539ee06c4ffd9adab3417d09890d2a7c9b425b8cccac93d3a9cd9b1171db117d4974a98367508257a16950e96b651c8b6e0ae8bf827bcea9aa115b5f8ce07ac4fd2e0f6f56151d1dc65765fb1022a95a2d8ed40ad42190c605a6f9548923151ed4d646cefa4e529728b573c372f48dcd17be79416a6fe17755534aefd7b057db126f0c7d6117410ad7da17fd31e025c249ac823ba81ba19f5a8f7e04d56857bd6526351ba4daec9f92e719f8b29c5be217e26222906451f3e4a7d740fc565853e5be53065a8a60f1267d74f1d7ab544d96de544ef9f422cb360feb392dc5c8c10336bda42537bd62e3e1a32b3ac66a02b6940906ea01714db79b6d393999ff0d939c4c35ff534ce37904db3efb69890823c108728204270602a60e6c8dd030d44e3732f53693f4351890b8eb283d839b2822d22c67a274f0a215a84519377094641bab3968fff721fc8782c5daf1cbd9acb20552ba1df7e42aec0a38d08b07866dda4e920d4f713f9511fb0a067d8ded6479033b4ff2000ba1ae91111421af5004e376c0f00568cd1e31ac48069e439d479bf7d5e797047fb71cc6a976649e095315ceb34d69c5e8c2d521fbd5694c12d959c73a533961edffb1c516a040e2a21a0fb6f00adeb0af084fda4f2a52954c9f338d9465bca0ee716ac4fedf6da440bbf5f03ac2acb0c7ec97a478b94ea40a4b8887836c6d648b28c143fb46199160f841ca87ce0ec8a46eacd8a9cca79442fc7e67e890206a1c061d5f8a4aae891177dc44995f158ebc828cb64daa5294b73532d413c76710693ba11d8c603c5eb15967a21a5c740756ae502b46346ffe81b001280533f565f12b304b118df0b2d3173e9b5ea7d3796358208e5dc5ae630d8393f5c5ee7242902324dc100c8651573accc7d097f73880d034865aa8a093e9235bcd8ec289581dcd12157b04af9fe299ad2a0c0a0968bf5dc7fa08c3180287b6f63d263e1cef078da0f7ce8e3d99a25b4e3e50c95b57fe5c8b81a2d3e5272da8276ee894fe654e7b9f533aab99eacbab5e570b65d7100f27bc639045c3dfa83ebe64e93218c28df216b33e5e57f86dca2879cacd0a4335d1de541fa55f0904bdb5535c03ad420360ffaa6f4308e3ed8c4e032cf6ff105ce47a620062a509db93321372529213f5c5fc1d1188e8294cb2951f73885a80311867e026ad411148bfca547c4fdef6da2c4cf4888879ccd793df2dcf2c51b189575232386424850a0effb44fd7b5d0327f23f0167de611d2c5dc2bbacfddd36b25cc21bf136c3c0209e1e648c61967a58570dd10332260164106d623cd53c6c04d54304a8408b12cf26907eb75dade4d0f79eb8a5846249c90ffd250678f19f9b8aef8248578cacf1696a89872bca80ae5f133e462877379315ee6512fa531dce1f0b5ab1b5b71e622745514c53589e3beba0263a9d03ffe57763023e11368b95e9802ccdd68a6e6c32569395919085f9204d107311583e046e999898f2682ab079964d365d2ae34bfaa5a47402f3561e0e92873705282d519baf1e856e02c30b16a094884d70b8b8a264e4092c53e344270e4ffa00aa601fd625696eb8e9c3bd86c306c942a5a8101cd424399709abbbc3cca3b58747e1e21141ce37c410b7d80bb0b4876cd2f0d995f273f71a696823c243c2199efaf0429830ec61d387a8b033b8a980ddca6ed5b0c9f10c76ef2f45c127da967583714aec0ebe4472c63cadfeaa38baab6528dae9c0bec912890425484dc4328ca82d42571edf4c6a545afdeb6057fac60bf85483c3490d43a50874a4d380a4220eea1b2f5dbc73fdc6a517775edf78e9e29deb372ed00d846855a22c8247a0ca724986ceade20fcdba265957f6efa9cc9d5ba5ff1b75dcfa8fae21530edb3facd8d9f91221ccedcb01cf23d88b113913425ef7a469bbe125fc9880fe97ce39b5dff91f34edef046707e37215fe73819a18eca06c35f8bdfa1970d9cd829b2907485c0aede798e2f8758abc3621078a7ebf22ae1b33143e12acf7f585905f1cc6f5a79ea4c02e1ea1142791b6194bd4cb15f5436808d429d37303b1531a41a8e117dfdeb6e03e28156c152fb2ce8c21d96d87fc29d32ab737839f12decf9b8ff3367da06eb7c3bedddae6ac2eb96361283cbf3a3f9dcff4097d95ee6f6d1874845ce6ad3ffa4042ddafc976351fa644ac68ae4a5cecf86e7a795be784945440e417c166fdc8ccf883bd5010ae6ac43562948ca3d1c86ad0f127871d96cfa23a1114f85d50df190c7745641ef24761fb772b24847ed47ec658d215347bf8106bf15826d880d3ec3b168cb02103da86b56ac83918dd23387d34e308dbf6b4ce76cb523e075b8ddbd93034eb07148572f436aacc51abfd31d37c779178bfdfb34eeb7e4f6b03c5dd9eb0fdce099042005cbb83027d35c3fbccd76aead1a816056a2d5368d29a850c6f9e9cd05591206357df767d50cc0a20a5bc5ce3ef262e6342a8dcb0f1652acff4a6f5e8483f351ea4715e24081f4e8da3c0af9b4a80daa90ae4e69842601961153b0858170c106538f507f8a92f6c9900e9baaf4bb791a0f8c84d3016539ff86e942179c69c99c3f2c0f08008ac350537f4792980285f521f8e034b2747a3fcc6754793d9c48098d3f098fcca65540de73ca71697e9ac20a195e80c3b018b272abe425b86a9aebf6b841bf5d10f5e3141fac8f9859780d71877d95e63326df707aa8c121bddafa132c76f85b501400719310060d1c8210d6afbcef0b3429ec4a359ea1fb9a97827438b9da1f42a300f7406dce7867cb8f31ab631c52f72f5fc4e92dc6599369a56f3abae8dadcb89141a02153b8a8b48dcd7fb966742cefdd8cb45310fc98eaec05ab94b2644a63a1b53ebf62723f31cda6a90a2744cf8e10965190ba3fe0b87b33ca8c47e1f5e518c3d0b8f04ee84a3b3ae0154c09f12663c3d1e8d0a1891745a5f012c411e620eeba323d88cb4653cda67430f34317736dbde02a13525f55886f513e5df60df9d48b39129ba61d60c98ab4ef807cc7fd1c49c7493cf05760f2b03102682d26805d6e9facacb7ad7647e458af0f039125f8c04ae041889fc4ec82f4558ae78e88426e4041c48a3010f56ba270fe2f7576d96b061b6eecc61a49439049187388d6bb0500a712a81cde29e3415f62cdcec9e1d505b41d53b7576f83145c96cb7bfec218dfe90018e6739e201148f8b02069a89aff6efe74ac95c33d0daf151809de3f3a4646267adad94c0fb5473ed7a19bff28d5c8009b48c5f62030af0d8f1098e1b2e9519ae0cd259130ceac3001c523d89a7b563facf7c58700dce277534dac4441df091a3ef99ae72ac02dce026f93d9eea1a27a4203674fb833fe7bd4876d9de4c9e0e4f994517f69d8b119a5fb1fcf41e3de7a784d3c542f0fc694db9df4e26260f2a637c5588b50babf6312eafbfd3e9c65427eb6cf1e764750065b14075ad566ae6a62ebe7a54f549a5d6102623271b64f18424098b0fd8f2e4ffb4006be9e736502f59fb8ed2a12bf031373fd401ee8e4a4d3bf46c21030e8a88e5a11579bea885802be198be02f818965f08920ac91908ebee10122cd1a8791b624f9d0658eeaace34ade12ffb22e5b443507314781595cb797f2c52be7401927d79657888ae40b66c365c4b559dcbb997416993a3f3ca59c653341547d1d4563815ff6dd6398b153bc7ed6753e9e31bd62fd644261c04b4ca7c7f33d60c81e11f0d111f10c8fc918a66ac08ffba5d9848616ecd77cd79b92f2c67d2be8a950dc561d1cc5fc780539b71187129bae08914448f469ce5234340112f7141f2439170e24bf181d894c4181b6d2989b9d20836509f544e44d6f3c6a9487b1ab27d2f54c78947f6c7041dc9ededd251d112b7d3fe02d8da0070eeca8b88cbffbe77cd07245106858cf2496601f089a2f6ea17b96cc041ea02e4af58e8f40c9baddc72787b921453dea71915014e130ba449755299a642cab562f31a2b0fbbd406403f2f8f41ba2c77c995c9f2ca0bb21a23c3590ee373b98e60e50acb43150c3daf28d93f76962b7c252400ecd7bfdca71c6b505cd9b7ed1d943f4acebdb1cdde97bc85d85d1180fa18fdf51e757b849f2af8559c648bddd31eb471b4785aa8379f8618251d0cc5406d4ba49735649c5c38ffb90343b3f1f61ab2db0fb62a4751591e2a78c18d5b6da6424c7f76ab434fabbb51b80768591f2860f79a5cde2f9759822c65ec2be0b45f09600b17080c01ad22005be88fb9484db4381f1b628e3b70b6e8dff8ff9952c57765ddd4ddf41a5f07cbd3073d72713679b89236625fdd83a9011e753d7c14373a8b663ffc79e876a1b60f635efb0b794352562f3c0ee5b514d9044b3157c785feb9c1bc9ebdcd57a463fbcb19f3179f64ec1a2356696e078ff828ca1ca655de7cb35c579d2930b405e14d46fc1ea5cd75bb59f474b47405c0a31bf0bfd70f22dfeffb0bea6d7f10b803484ad87d6bf1f0995d98bce4a445d213315a79c776068325cf277f9cc5395f6749f9d7c4bdda9b8bff671aaabcfa48aeee1d02c7d958dfece69dc2c05a2b9cddafd4a8d798180e385ef7fab75177f1a431241c61a1ea2f3bc37ccc284780366addb97782f5674a27dee4434df58772032bc242d6494d856729a5f001e7a3c2dfaa74c762c441b7b3ac1a87ffa36c291c53ce858236d431d2727bfa1998c227a7e411e2acf89207b07fe16dbc120f249e3a24652e1f5ed6fc27f42504e5cd169679e99c62246c51e5e349f3a1a577a256d9347e9f2f99e31f38bed337175e0daad70ecc81912acbb0083715a6e37abdd0ff57bb7e82f85e8467406dbb9fa60f06a3b05f060eef14e880821cd879e62f8376e1fa55cdea0febc624201a12b3737695546010f5e7dff4fcdc2044f7b5c3a5d38bec3423719c25ce7e6baebe0c37ce7150e21940e0583e8bd36a14ab31d77ece1c019ccfec83b32e42f88f4008b14e6b67f9b37e48b6ab4b400c345d6e154736ad81a952e1ff5f085a9b801de8098cd5739de975778b9c84bbd50a2ad7d22617ed841d2788eb996d8d212692c7ce803349ded0e85b99ab949502d549458a89d3bee17f0c01005a4c6dd93d5dacc96fc54c589d68256235e8cb04d033d7950bbeba4339cad4f97c7180aa3523f9391780f6f3f6e4ec8c251072f631da17a99d8787b0fb7c1e3799ffbef34369fe72e74193d383b2e7d19a6ff5811c8bac99f2fb290bc745c0f23e782e086f79c014c019cab4360bfa554b38adf27e1e80e8a3c54b76a965fec878bd6357c4601c7ae234dfe36da90b482f76db60dd7730b2886f7ef38c6dd02f3f66a8bbd2357424adf34e23704d79e0a78b8d402b89487521f7dda8c35f69c4bc8d10067788fe0671fe3820c81c3a890343780507dd04946126725d4663acfad8f33cea5ad4d99ae5e4b3c23f4d49555fc6f38675d034036f45dcec30d5cc0bb5245a9ceb4754c263e82c14efadbea0fbb9a381bdc6798c7022c2804ed0c225543bbfb099fb0c56542848816383ad24016f58ebbaeb324102786e7c30d5b0a6e78f87b9062fb4d2c05c0c55a2650e444b31dbcc7b99698049c82846158717c12aba19e93fd384a36d6adfe24f96c12f3e0fff4f245100ae68a6538e3178e1f2ce8bf10a3dd1ee0a145f23b2ace2dbdecd7b2f328071807f78d95117b26bb25e85b96a180a5b04e10808c8f55a563dc5b864e0fb14d9ee986a9f86a975ef52c618e9fc8ee49507ba742ddeaab97a4cbc8985cc8d9490be255379b2b273074f385fc7de44f8a85661c427c2c9d4009f52a6f42ff4abf38afe93a3fa896dc01fdd1d7bf57a4fd037b99dbce9e8e6c3f2934ae348a2349ce6cbfc75e75f530f9206ac987abb10c5d0156bc5676dfb416a9c0294e57aeeaa30eefcebfd0ec468f8e5cbb59e322de53ce18883e758e86ee0cf0980ce19b9dc7a8a74cef96dc19f1ac5edf3487dd916e2941ef893c32e400522341a2c7da637c684ded7bdcef2738878c7e05c4668b59f0593287047e164307d00e580ca413ea8bacceec7561f3375765fa8f3b5421b4b1b0f490a067bce2d4ca7319baa1f544eb27cd75b468c70d27faa56fd41b602a2dc76719f43d97915d518a58f727c3c3a398daed20c35cae48b628dd9968faef5a40feb931f39b7bcf6223839f3fa1edeb5b3dbb4da28b2d61b95bb7f55da1f36a055fa4133c266d983c167fb78736415c817dae8fda4e08f9d9ac62388667e22c96b5a9cba6b0ec876dcc03547538577e929ca9af9fbb1220938d34aa49e6963674b8023e0f505a97d9d80d7a28e6e14239ca36dc17d00a8a8496cd331b027c4c4f63ed1b2f556ba0bfe16e29f6de8b6ab6e92f9380f20caf14f5b20d1d783d6e1f1afcf716fb13d30c749b1856b4fc1cd6480210647b3e15b371639d6b49154d032930bf520f44f943b028c347812f363ed66811a7f7fd67ce17f8af839fa1384c23b430f37f676a2bdf63fc3dfaf7cd73f7af544c9951162e7262e6380ee3fa1e7024d79311b51396f60ab2c8e1e6a376ad01bb4974f712df0adfc694e4a0db173768ec09f99c6ddf66f48def8380fb97798e08a84fccbc2e8a4240fd7d95e83ce463fa65e1f478e3b8ad273293f615f2cb97af94042b69308df677105cd97cfb3f8fabe8ca6094adf062bdfe7ff73d5c9d6f0b81a8b9b098efaa58375a6ffea8fc45cc25abed13e2410f32ae896a29a727429a27eb64c1f6c026ea568a71f79567f3264bf0b2a768ddb88043d3deefc51949cf18d0b40bad1b51e2e2272d1a2049b115a6cb9a0a3a9b0edaaccc0ea4d7f5b75699f24bf5fe9b55ae70164d6e6485e25866a65b8a12a078addf28b7f6a397c1f43aed0017fd5e7258babc5640d787a9e8575a189bfe90db826b007b6c5cd49a02401f36d98a7f154d00682c10b7e470435e3baf1a46e0f3a4949e456525e4a1936d16e7705f2238b307698e239505de33c9b5936fe1af329e8eb2039d9c86d5f7ce0b70e3313fc8d65ce94ea3c701cadc38e2e6524b7f83df110839cc02c5605d23b88297cca1b3c8068a0224bfcbad8f5d9fb24348e34b967c04043b755c72fccce5e5e861b130cd4dd95090dc6475b5d9b1749b60f7e7d1faba3ff7a1ebd5c5c7ed4e0baeb95691051b90d659b18ccb02d10b514c465d9c872ec9f842051e818840524b64be88aad88c0564c9429fc11cca8825928ecaad87c524bc98e677bcee45a561b31be2d45da56003064269e31d3238d686288c3092ebf9f58633585959e55db616ae1e651ddfd7500092c5782766b27de837ad4436f154bbd76b9e3127cfa89f20681ac5d0810d0cb4a7a1421009daf9ce53ae0015fba517d708cf656a54b526d5d2f949f98ca74d32fd68600c34d5f21dc338a6fab7fbca5138fd0d3355c8f02fc91e49f90f7bf480948a51821ad2f8f199b66e3581ca8b23805d618eb129487b701b832d0b0a0a190de976d73d16c6be4d5b444e6caa26464a9490c3a9e0a550658bf32f293e85684013a30c637a9a874e52bf80c0e3c14ed4a54cac3c23e90a55cfd61d4056ef0cf13b6690fb6cebea0bf4c47a19fa58594aa44733e77244311343eb6d92dcf8a065f4c213e2b53f448501922d86e89bf2fdbd99cb17e8193a2cb273d36662ae02c5123c758693983b997caf9b7a4c6bcf56c6056d3959e91661d82a041ca7f03c282ba37d0dabafebfa4615b63887b4ed765b55cc9994e18e76eb35dfd04f3f7da5f78ec4d8397255081a22a34510f40618f8d2c40fc0b7c39b5d0a93f170864c8074074b2b52469b289db29486218cfce7bd96ae0cb1d908e27ba4fc0b9cdbf41a47c18346ad491777a7bb61185925360d3b67405849a0384d28907fb1080f4cd2fb402e95421cdfe08d7b7af654cfc4dc3ba8cb2f1aa8f54ca8b63e96ef8857b7de13aa7cfb8ac9d68e898ea931e8b67f70952d1185623f7d460d3762faeadb67e6f82476adaf8e3e792156c4f1f39f2cda565f1f40c4dc044b2df2403c974c875a63ea9e37bfd7fe678ecf5bcf8a4f3e5a18e23083a5d7a836d28c9bdfb053d9a56b93cae211d98a6e13c2ab7579f0f930a0c911c6fe4bfb1b7ae22b2ca1e36a2fd1acb86a4efd4b0f1a4c5bec9a375be312cb94a47b16282a870dbd012b9c904162f20e1faa82d176a69dc5d5bb40d5ebb6342615bf27b2bce69dda19b364877628a0ed2e2e6418dd97f467a6f44d20c094e714bc1afa32e42c56289240ea4de5b6ada80a705c1774db70fa042f25edb54ed9e7234b7a49b353a041eae63b48bf8a5bd28023353fbc34a758bb21063caf2b83e687498b67b27bd1fda270a1d9f40a1a4e7efa9f2b804f15c407f87ecefc4356cc2daa8409915abf053485260e902e3fac17c65b0a3a649bea0ea3507f0f4d0627fea80ce1e41304370193c213920034470f7a0604b76c9b82d7059d6062bd1b69c6c621c0d14e9c8aff0d1402ac90847db880e06f422f779f65238d464784b1059ef085e6339f78ce603c679807c2301f2783243f83fa933e7612d16f536c9cec680cb58d1031723120222e5890e42b64b2436fbb272674146157c5b092add9841d1334e19040eba01faaa13056d4186aa326569244c05a70456478e5ba87f42759e9f897aa8f63b06209ecc4a67cb63a51f3c62e7de29d196112fd1fb62c8b64fc27753f2840a917daa980cc3d1df10dddd2d47b30716e76ffface1c79c2ddd382274291f12421441013a858690acd8f1fd0be7716935a538daca9c9f23d65f847286528565dccb5fa0478beb778ee0fc340adf4bbfbeb77266714f79290e9c46f31692fe3ba1b4e53fac1e79312cda83fb29c91d47bec151cfa66256c63439970b91761537c7f2e09aaff30f986709854fa353606c9c8e31137d2d1e4835022656284c49db7cb05024fa61ca8d1161f027aae372f9b13a01ec995d33e8faffebfc5e8ef7414af8d64f2271d4394f99ea146849d25f3104dadb736c2e0e3c2beee0bd0cf8c51f2a21c984872134635023d6f3eb5690dcf69f4d82997f7be9f9aceea057a87aa8ebe9900fee9be376155ced3d1aa9da995318480986eb8ebdc9c130c35f2d82b28a1b3259772f5d755bcf5351e106f8daa75dfef98f08b0009e01c245f47b126046e8fc92051731aadf6519ba641f63365f2955917969672c9350f8d92c23b1954d7ce5e58ec03a3ca5ef28fc3fc415e97629b3c4abe6d43f048e950d0a3c4ecc61fa7436c81a694409276aebe586af90cf9c29281ab1b079d07a231f6c02d87c471a7a565f3bdfaeb0e267d7f6369bb45be6ec504a3b16538f0fb06ed4c668797626d687923ea0db4336a7be3e5768a53e552234348656a0707035b4564bcb30f1c21d0997028a01a1a3d4c6022e0185ce0c3860b46439330f0f0f0f0f0f0f0f3f30d0d65a6dc9184895492649e5f0c6d2a6d529a5946492497066e20b67263e9d99b882ecdd48264d78032a0cd50c140dadaeec8c6785721d618e1f4911439a7930b71186d8ee79aad4bedfb88c3008ab1413238e4e96db4598c3f57c55d253f224ab08a3077d771f7f2622db4498bfeb42b2482a3a6e8b08f3a8e829559bc5b6b687305eeed4e1eb1bc2ecc9db728e9f73ba5221cce1abb9aba6a2742784e944b4bb5a5ff49b0761f86c1313f4bec5c80ac2a461a2ad26459b44036152739d84ecf31319151086ecd7de72e3f147d43f1872b69cb24d90b267513f98a427114908f549488af6c1bc15d208a593ceab253e982f25e6a7f4efc16cb5f516f96ac487f4600aef5cf1b574ec92e7c1301e92a4493a5ba91b0f6613565e1e5d34803b984b04a593b24be251cc01d8c1947458de59b8a87f39803a9875beb48fde920e264fefd515652b74967330bd57aeb99c1c5a59cac1686fdd7321481142290ea61acb56228be060de93bd93bf5032f13798aa2ccfcf5ce9d08f1b8c113b55909f278decb4c124e66e44b4f6abadd960989bfc294a907741bc068327a55b2224596f590dc6492521c40f631a4c1d74501da7cac2a8880693763d1154d0eb55513c832189e58eac337993443318276edd5f8aa5c38f5806f3ff86ff883092c1b0a294870a9796bf8263304dd089a63b78a40f41311882f49cc3eafc85c80983f13c2cc5f7aabf1383c178a23d8497d0bf2f7fc194c358cccc48a383ec0593b678649d0d19d9962e183e48ae8a5e91f39c850be6949c2cf8279d2d8a650ba68e9de4d2b8ce4749d182d124679e879e776c250bc63b9d72e98963c12427effce50599bfaf60d64849aec25734d2563057fc930b41480c3557c11ccc4fa4b4a6ea2e4c0553fca477e3b43705833265497687493aa89c140c3fbaa475f8b41e27170573ee1c54e5531d140c5fdf172bc83d25a62718cce2c75ee73e6def04734a497a3abf7ee7a809a676bbb317351e12c404434a51f47aa4a439f9124ca2b5df44eebeec558229548c85347dd9d4990493f2d0e962db9fad0509a6a0b4cd3a9f7bd0df110cfb96c5929a1cd33e6204430a3bfa41dc76d0135204a3d59d8a9152755c8a10c11c6f9f272ebfcf240dc1a43922ae9f7579be104cd943f2ecc832c1fb209823a4dbac794fca4740307eb0d2dd75a717ea1f187ef4ae7a6adfd3b50f8ce59d692a13278fd87a60d895e8a3b37be4508d07261397668225bd5f9fedc01cbfdfd3dafc8e9574608e14aa84e594ff943e07a6ff20b2887687a43a0e4c793aeb92d026a9ee1b18a2bc783c25da176c1b982c8bc7dff32ca7a435305b5049e538a75a52a581d12fb6e8d20ccc1d29e51c4b57914d1998947c9c8a5733d15d0c0ce12f4e7db04b29af1a000ccca7df53b668b9f2cbe3504b5a62bce22425a7ba89323a16fc8381821dea8a2b6c5bee0c4b214acad55aa67f1a2986306bcf2e50438b09d49040913074e4f8c262b4c2bca3add544d227ad6e0c5698d388b6de9f4ad513146315e6242fb64413fb65517c410c551845db88caf93bde418c54182e8997776c4bcb9bdbb0d1315061cc361961aa25051d7911629cc28f9ca9f52ed223314c915c78c916d12db9aa777bbbe78e66a662a709c528854935ebaa562785d14558380b173ed93a5aec0c628cc2bc7d622cdd9d3025ba284cea3bc9093e398cd4b684c2f83dd166737db25f48121486dc17e7fd7922562bc681189f684be5ca88651e64be189e20c470991189655a51cefb3f54d28991189d30cf6fc7cfdfc9ebdc3f16c4e08439c783d477310fba766ec2904bcce7745ca70b758b96410c4d182dccf359d2a9bbf46dc34626343196d4c5b01913e6502a4b9071ea1794348c2f72c4b8847192d2973ba70e5f49a523c73901174eccc2f82247910fc4b0c4f3b9f33ff74a1874b28d5bcf234aca1e83128976794457cbd599f1ddde75ba5dd49b5e3c0948c0c5163a0983783a798bb14bc27467913247e95441a46244c2ec25e944a9a8e7aa7981e7c5175dc48084f95299d23bf929412e311e61c86f7292a2c76238c2642284b4f3bce826c460c4688439c9c4f6f8bcadab2310c46084313cfc88eb0efdd7a14598d2749c2812c74a9a5a11c638a153ac64c2289fc4480413c6b22b7a864c88166d6d2bc5b3311061fad1214a672f39a22a310e61502d214dd59b94919f0b6218c21cd1cf834e79ee73896214c260f12aa6e5edb89f2e7bc3522d06210cea2dadbfc2938d4ae150dba2c140c1dfd8a2c1408131813f8e2c6a102621c954f6e71c6df1bc30366cb4171f431086b570c1276946522d570004375a102310c654d5c82213f33f2e38d432038030e934f912e5ef546dfe07634bda4a77f23cc9f3f00262f8c17cef7f224b9a92ad9d3e1884ca5b1f26c123e9da860dcf61c3c68e187c308bca398994ba53d0eaeec174264d2e75caee49a21e0c2936f4ca92d5851879309e52397f7f30b18e130fc6135a9a97655a253518c4b88341e3cc82e9cbed107208886107938ea7cf3e09b9fd531d0ce61274880b218a980e467f5ded578fb8e6cfc17ca344f0d47f9283397b7ffd4a72089393e260f2cb6a828341b958a53d1f0d11a637185fdc764489a822c7e406931811212719955f626a83b9e397b20b6fd92125b1c11c464fb2f2f4e3c14b6b30a5de3cd341368478490de6bc2336fa565298584a83c942b7256686e9f96830b7e50f4a74f73afc33184d9a7b14d3b9c48bcc603e0b9245c5b1bd1195c1fc21eb76382f214544065379da513a49dff4d0180c933ae59c63ee967f5e0ca6119eb3584a0f7dfbc360bc2cf17285ec21f7fc6030afc9ff0b417494dcfe174c7947f7eaa97657f5bd60be9484901dd3533ecb77c1a05cce536eb9f4b23c174cb99fdb834912a2bbdf8259ac824e2993d78271fe42acab349d26f92c184b439d0aa97dda421e0be65021ef1e42127eb1bf82692d854f1d394b3b7b2b18f784fc556d290bfa2a18e4aeef9c3c2df711154cd9f725a265094f415330edcd6d9ede28ed5d0ae6103909d593223fc7a36014e5f9498c52266d87827994697cc896225b7f8239e4c8292d62113f7782c9da74584a426e8231528ecaa247bd9a8c986018d30d99944e655fb404a3bcdea99ad816ce454a30293d6bc1774d565b94047ccd3c8ff68a0483d83e793b7b9e458a8e601e9de2d95cb64f5091110c1f5e3daaa3673aa2229852d48ef8a6c328cf10114ce12278d2b65d26e44330de09156ec48d67d98560fae01f6765b2637a104cd973f6dca7e37a7c8060bafc4996cce7e33c3f302791747171c3636f1f182d889fa8cf6dd9a33d30afa8dfdca9343a260f506d256e9224776012fd762985b2d95f0746eff114c28cbd8d4a0e0c2654e456be4b4e71600e4175d223423cc60d0cfa5b7969c6427cca63d8c064faae2d4d896f591ea306a690a2a377101d279962d0c024aeb1bb7e991e443166608a2f3125414da7c44f0c19986afdca9298ecf2f0891103a3ac56e668898ac827060cccd93c9db25cc1e5c2e71546358b2054d01e62c5c715a6b47cf93e4f490ad1d30ad3273f134245f1d0e76185217b099152ba1029986715a6b0f8153da5cac7f1a8c29ce7b3c743a879124f2a4c36262b76433fcce5a0c2b47fe184badc3985d1be4aee545e151d3ba630089dec963d7d65d14e29cc69d5632f97a990f24d0af38dee13af619762a8476118ef364b0d99bd798bc2a47aff5f94886ed9e95098df539a14ab4bdaeb068549449e743511f6bbed4f98c4f54cd98be5c8697bc2283a2e8b1249c9cbd99d30a553d254259d36da6b4e982a87678b9fc3bcbdde8421766c9d350f97e6b526547dd1b1a7239d0993162bf7d46e1f13d29830ed9c58a458e36d497c09a3e65fca08555bf6b3254c61d5175418d3383957c2ecd7377b97e25f71a68429445f26fc29b30ef3244caa36fa2ec7d227cb9230d9a5e5e816d5483a8e84d1a4f5c94b8fdf49842161502189e432f525eae2471894ac14912dccdb94d611066d376ad4f33a82691b6138ed4999e58c4fd02f230ce7b17d6962ac64d10a6011a6b2370b9df979665f0128c21026a8a4634b64cf9e1540224c218f691d7713e29e1500220c2ac43a0bb13e84f13f8fb8606362436c0843b46d2b11be4ca87021cc77219d270b5f39bc8430c52e119e42be9d640761b064b123229c90a00ac25c93bf823ea5c4a864208cdf315f4a59b6f0cb02c2f01f6d23b58ee55df60fc6cb0fb1cc3ea1bf5b3f985209354ff93e9863f588146e972447f860fed1cfa322a4084ab67b308887b0fe1037a4490f6613114457485f8fe7c1a0de6156d5d29638e1c1e83672d642fe0ea6d19f449b8bec600823c572fab2120baa837184d7a55fd11652870ee6a89efaf3760e3ee93998b346bd77674f48b11c0c42c54d93b1cfed6c077605d108ab6d0e6674c2e0de912d77e46d06274c49a874df2b264c5e7071e38b2741b1ddc4fe3939bbe709ced08449fc4d52a675b369fe9340ed8b7780106664c290dee34344cf2ab78d09c3e984381faefe4b7d9730784e42cdd2f9961add38b384f99357ec4d0faa847972d8fe19552a49c294309d7dda5da54941fd3f09e398bc75b56fcfc95e12864b49e7db1029fc6a1409f3494ffaf75f3d46f440c22827c9f308f3a5705a84b4341f3b8e307789162be931e7c4dc08730af177b1ed12a6654698d5548e217a92ba85bc0893e510c694948b1e3a5684a9bd9324ad7213615042854f17d29f65b88830ccae8704fd4bb69b1ec2a472d85dd2af8e91a6212aed1cb4094f0b61fa8aff1bfd6259c62484b1fe2b94dcbeca120ec2b4ab9f3ab1265db2144118747dc86d3dc9bbe3401882d569f514419767c90c40182fdfe93cdb8ea72e32e30fe6d149445b68fd9cdb66f8c1602b6adde9f9df94fa60f6102c09fbafe415927c30c978aa2e694246c46d0f261da383d2a6925ee95e0fa690d2daeba908e10017490704747091830733f260d60f5b692ea88d852bf16068c61d4cfab7ca539565ed3967d8c1a49d93c723561216bd197530d7e9ff3c13bba7fea7835923fe47d52d5dfe2f71c08c3998533724ec88745972cac124b27d5edf41589cad0133e260b29b20a994eb6f88180533e060caf14f964ac9c4523d38d4b6d8a26ff00e052c801d31e30da6cd889775da161d5cec6d1e66b8c1a4bfe3fd8994c2a13ab8b840066a10335e4d2c472c8b1a657e8b2ec0d0a2c605265023d530a30d9b4c7bd5f479bb50518e1b3ab8501b3650ff0320a0c302a40220b811003ecc608339d75beaf91cc2a15978a04616352850230b0dfc3700fd174f022f5a8b22a198b106d328f5702fb2434753528361cc5da2acc89a24c46f0004ec30230dc650f6a32149c87add683095e41c72afa792679625cc3883398891be2133b6e34733cc608a14fd53fd4385ecae666146198cebe17b97734ab2af27833956f72429d26b54275898310693cb0593b56ba6180c61734cdf46ab943460c38617bfa30a33c2607c2b975bfdbcf89881816edc38c19233030c664f152b669f43d2656fccf8c2c1727ebe63ea05530ada34ae34e4857670a881c14a98d105b3e6e8587117bfcd0a87da6f71da48009030830bc6d2b1ef94b8e46ce2df82f164a88e4fbaba453883195a30eae688ce0a8db36054ed146b93452bae8b05f399aa244fc83e253f65f60e01340dccb88249057166eeaa154c634a89c7458717601c3e0ecca842254d64379da1b7c2a76303d78519543098d708611244d7fe5b1cd501011b366cd8200128c28c291874c3439d9a2f99ee7fd15f804181dcc00c29987a94f4df581d15c1b41a5a38a086160ea861c306db59007830230a466bf1942feda39f89d3c2f03d2818475434928857aee84f3088f73849a5ce2944e54e3025937d37c1e87922672c84bc9f4dbe9c593aa72cbd0483b65ec85edd91645f259853b80893d425c11492921fb2450ed76d9160cc1f0f39334f6a4f7904b3b6cdee567ed51da1114c7a64c47287ec782aa484f112d8a29d8b09a8f1cd288241c47be9bdb8366106118c1d3d5d8ea144fba7919530630826551d53086689eb113bc9eaa46c0dc28c2098e4479356af3a9e9f03841940308f04ed11b97241d4f503c3499337b616e737b727ccf081d9e47b79c434b7ba6a460f0c236bd1e5fa1d5fe868e281193c3067adace1d9e2c99304875a1a5a60c60e0cc98452d3cf12e263337460d837cbd4bf113985090eb525c18c1c90b29febe55cbc5422c20c1c183c57c7482929a1ae7a1c6a37b840c982193730a7087613b46738d4769415ccb081b96d24a59cc783cad99f5103b3e8a4b756f4686739b620240533684048f65d26b2a8208207875af1e28b2e4c30630686f81e6ae5dd2103838734d766baa1a39d6c312306e61e9dec1faae3502b2bc10c1898743edda7d1b35ef2bfc214dac4e4a709a547a45790e10a43b2e4953cfe7b8d9a9056183f08cfd31f2595cdc50a93e54a31332f63ba634890b10a43bc9052ba9c454dab9d2043154bcaeaf4e7a25ffd2d4e0e12e800236d0764a4c2385252a57491fc7bc28a0a93ca3e8d13b7f29b133ac83885417c4a8ba723c6e6275dc01486245cef2feeb8e7f0f9c2480d2d1c80a530c988574168e730514210b061e304396cd8f01b5b0c4106294abb14cbf23722c406324671d650fd9811b295810c519832d455c8415f2a043242612cd9503abe36dcc6fa4206284ca291d3a71373392773d1c5d98e26c8f88439a82ad1f8947cacc51b5c20b422c413664f4ff1da72b06caa95d10993ac5c591ca11739c8e084d13faeb2c65cd0617e1c35b470800d1b3b4cc00517382e08323661109b91d375d0575949ed00c30b2e346110726765f749c265f9061999308757ad115152b84060ec2873830c4c982da5b4961c362c850bcbb884b9e245eecccc845904879a161dc8b084b943b460e2fbe2594ae350bbf15e74412c2320a312063db514a99d6276c30825ccfeaf6d298ca75af1a8d90d433bc89884612ced73ec502984a8dbb0214312e6b8c8ab964a62e5141b36cc6ed8d98e82838c48982a5bd0f9b2e89030e76c63bac3aa75bbf308b3afb7291739723222321c61cceaf8b69e2fabef92d1082dc8cca4362fd74e49abaf7ee47039321861d2cec9278ef8ac5767c78eee228c738310f43a36b04567c1d506198b30278ffb296699ca49096528c2706aa742ce2979f65413618835da4c8ce7c4f4460a4cb05e582017210311e610f2e99b30418730479e283a4966e9b42a0eb51498e046eadfe246219f022e4ef05e04a00f320c613cb7ce331d5bf4ad5408b3ac4bec68eb576d428430c855fa89f055aae71984a98332d169db3cc74f0bc26cde1d54b019935572200c6a562d98e8dc49b7038439491afb30b945d44bfe60b489ae21b9938a1b31197e30fbec666dc84e4ed2ee83f9b4cf3cc74ec1a176830bb42290c10793c4f59896526bf43e7b30bac7d36639a7f59e49861e4c6156495807f54158270fa6902574ce22a27cb41a87da16fd5fecb861822dc0386835b470401624d091835f061e4ca1474531db4b624f7c07936745f0cf6121840dd9c1a0549057924a3feded7530cee9e77442ff25c93974308d241199c9296957750ee6b1b338b7a0a296aae560c8b969425f8efa8a9138982bdfac256959d13d1ccc632a99a79054d4c8df1b4c963fe3f29ec8b143e80693aa69475acb219eb33698f6ed7e2ef4850d06a95de92b7454a58f65acc19ce43b5d78bc89099a0c35182f89e687a4baf7c3224290910653963219b29325030d8653a7a5a1e7ffeb94649cc1f426647d5347f69c920c33189495aa384a298fe3271965485e797613264406b3cd954a29e5a431184e07b17c7217be3a490cdb799bf00b35c9088369fe4e9edff88c48261960309dcafce8f0f9f28649c6174c69bffea583aeca30c9f082b957d2cfd9ebeb5b928c2e18af3b679fd816db624906170ce23e85d449a964a5f432b660aa4995ce945ae9387a195a3089aeafa4682a4c90bf8c2c182fd229b527821e1d7f19583084a42e447231e929e7655cc174b9e24419b1a184fd32aca0653511bb3b5905833ed149731f13662a98f654da51b92e82084ec1a4fd53f6ce22d64bf752306577119563cb563e45c1b0763d13b2eeb8e5a160ec6c3a563c73928c9e607cfb4ffa7f7f2e3bc1203caf43fc60ddae37c19ced2ad73a4b5033c1942d237d748f85cf394dd05e9727c84a305b8c2515fd8c1cdc2498b25ecaadb5f0f527120ca94b9fb2bbba3d95239852a4d6c9df0826d7cb75d11e2a82d1bb42048d142282b1e3854869d6ba5aa12118eb66bc73d87ceb5f0806d9f574577d100c592f5a880e212f0801c19c424687fc511f2ef403a3e7a88674d77dcff18171267d255b357d9eec81794599be9422f2e2e48171bbd56404318f11eec014fa7b54e8af2422d48149a76875272b9e03c32825d54ac8bf2911c781c9648918de39e55412bf81b13c42ec14dc73d29bdbc0fc5a3e31c23530058f32d12cf8a8574e03f358f2fcf9591b939f81614ba93439297e50bb0c4c91744d9bce517f3a3130e88ffd5b0e4ae8900c1818734cfee9205284fe0a93e577c8e575b9c8ae30fa8a4a173d7f2f6a8541e2c49137298530b3c27869bda2aa22f7445761cea5113bf6fb7850aac2e0913e440a9e7516a6c2dcfa3ea2fc7774102a4cf2c7dde52ce422e41446d19db2a262c714268b214f44d24b611e4f9782e6c4b9fe90c294feb6fe7692e87a47619e4bd132555617aa28ccaa379663aeb49d2e14e677d1ea24235bb16b50e8ad25e62167fd0983ba8956f56cf224c9130611a2eb55f070274c97e956b99292b73673c2e03d21670f267221e54d982576fa915dd284c183b67d1c0fcac39f0993cebf1d67a2eb681f13c6ba3c22e73041e7ec2f61768b6c22cae8791f59c224ceb3a5b94e9711aa8439474b26254e8825439430059dc6bd2e8bd8e89330960a4ac9565c12c6bd143ba705956ab41b09c38708d2e2a51095dc8584e1e34b99a7da13f9dc4798f327c8b1c50d1c5f74f1681406cf5679966e3b7d8488c04314e6e07f2331cedec7471c1ea130f758dc2bd36cbff680c214c13b65e7aa3f61d20f26262b4b4f98cb4c4eb620524861ea84498b878a3ae24dc3523861f4eb399db5729b288932533d34618ed33ea3eafbc2469409539f4a94fb52aae3586cd8b061238d3d30613a49db72b1f2f25fbf84b9f359d4f8b0babc1d0f4b984cc74eac8ea346548a47254cdedd622157aab8d6bc0b2fbc0b2f6ae04109939afcfb6b1254943f09b369fc5dce65a5f9214918624caad0d1ab2e043d12e6b51077b6246d7d0e240c7f916bd4c97d4d761f619cab90ff5d2eeb6de908d3c5e81cf4782725ee6b8431457805f1ea28e739069ce0c108838865e963e93cf2e3a83250238b1a85811a59d4a80bd4c8a24659a0461635aa0235b2a85114a891458d9a408d2c6a5479f13a74e4486b83c722cc717444fce67e4e0b2ac2a44a88ab70155bc157800b2d9e02788930859c7a54ca5e7071c308228ca1a385161d4c8cee9a0f61f4fd643b9f848d2a9d1a59d4a8a1c5046a709174dc123c0ca1a5f836fae275e8981a5a4ca00621834721cc311f2f479094b57a278449a5bfba124b66329f158f4198b2bd87ad119fed2326c1431046bd2042c8a22d67ffd3203c0261523154d29ab39353ec57060f40184bbd699f9c2d31bcb14523d982c71f8c5d69475b4a035a34c1c30f66fdcfe21e29c4ec2af5c178272c4509f373b9101f8c2364e4f2a25905a1b307d37968be960eebc1ecbd69132c7789ce6b1e8c1ffebf772be9891c1e4c4aaf435255c64509dec130499daca43e8e0ead1d0c36ae9a1e5c525590d4c1a87f17c4e9094a4ace32a0c30235b2b02278d0c1a07cf6e5b256bc8f3a0773e9beb98cac37a243d4430ea692315e2793b27e7e3de290b2f7b56cf21fc381f920445bae5ccf2a0098e0f106a2788aac4814897d2a3b5bec9cd734bfb123c78d4f81ba81208f361894b8a4d2c74e86f112e0e281071b4c1f2d4bc8a4103a29c4630dc649424dd28e6d6329e7071e6a309e89bf568b092a9d95065354fba0734a923cc4f48b1c3b72a4806b68e1802f72ecc8c1811b376cd8b061e346203cd060b6b7fef41aa5f3453c83c1227658d07db9bd8187194c9b7dea721c3f051e6530ddb66e775c0a071e6430d5f80721fd6fc3a46330a4d339b2699db05ef6cac0430ca6b952398d0a4247efdc028f301843469eb037b162ae8c8107180ca3a209793bfba02d7a63478edde1f105f39b876c7539c6af993894d50b065d312ac4b6904a7f2a6b68e1001b36769860477f61821dad857974c124f63a9662b59aa8100088f0e0825bddd1929b1a6db14567e1068f2d1844825cbcbbd6bf8de0502b2ae80c58c2430b26dfd1c9b547a67abc71a89d21c1230b064ba96448b438ff2e9919c1030b2669252d5f75770e8db35cc1106fb2ed76e84e3ae50b722047170ac8e20219b0e15d785106e0030f2b188436d3909b190033f0a80242bf56d69915c69be086e7d8e280d1c50d15b417e4021e54308ac829a7bc5b2221687784f112d080d9013ca660f011a3124404753a3b72050602366c74b1a30220b8b1020f299872f65462964fc98f101c6aef59286003366c64c1850ab42809460d2d26901cd8c21f79f15dec20b62347175d0600048f28907f6d94bd884969e250f322c70db30d7840c1b897af13b2491eb514871a123c9e600e2a9ceef0cfd0a322e8d316af011b36707cf1b743afe0e10473089d92ceb1a62618bbc4f2bcae28914a63822928710f1ef335565f8251d452b4bb246ac45637b003607828c190b2a7e8bf5627b413f467181e493028a5827855973b152d01c30309c649ba4a889494d2f1751cba022e1660c306fa15102d81c711f8e4332e92827ec58b2fba30818711b036bde833a3c65427c88163878d1454f9c2a308a95c41d4d797fefc7e01060574340033e041045369f918b1f34f884b3d8690de0b22f3e6f397fd010f2110cca2876b4c7299a05e19e6978490b39a163ded110493082a2fb959bed7d27a00c1a0133594655ffa8bf603a3e8ce9ea9adf9c0c307a60a1b124c23a88abd6ed879f4c070d96d11e74778d48d1fe1c103831aa147881c26ba8bd00e4cb2d7ba3d59500ba5d9b0f1c50a5e870d1b67376ea02db8b0b24378e8c014e12427f9f982524f61f3c881312ea4b214913d036cd878a41500c10d2f3c70604a62c3c2a7187b9f651d1e3730758ffac8fcac964ef4b081a96f43e98e0e225b523c6a608afb15fad4e738d4ce20a0c3027b070f1a9856cfd288adb061f60c8cd9a1ee254fd09dda97812167537ab54bedde6c845818ef038f181825ce97ca29bb65b9240f181865c3920af2de61b6f40a83fa4953c28336e941ef0a830ed141f6e7966ff6ad307af891aaf3e953d0372b8c7dd1c653aef6e6d3ab309ae4495194a665955815a6642954ca759f3e4e9b0a93099d1047ea7a6cd1a2c238c183103a227a0ae38c309d2f7e56d7a630e88821272cff08912da530f58d49135e6b79e2460a53f62a65a5e47e6c1f856947fae8513adc4d5a65c70a9a0235b2a8a1c30235b2a88174e49040185e3c1818a891458d2c6a84f112a891450d2f1ec78e7e408d2c6a74d127604f60210a53e659121f12bbf5ff5018ab5b6f7b55f524d65880c2285a42b595897042cf4f1827a4d44158bbdbdc77c313a62cb2373ea5605d3ad509d3a94b297f959fa854c12c60c109735e88cf51b4465012dd84e1b4e4506a42ea8626cc75f15b29fbb8684a448045264c6bd144ece4558418d2020b4c9876333c4d4e29b3f2690316973059ee0e16deeb92ea9c750c5858c22cca42a74e3baff0ae12c60f2254d8f1746ae58443cd0b2ed28d2214c08212a6fcf1c3a70f9f969c8429c70bb1a2ac2b8992307a4dd2ab48692b990e87da4a008b489855239c2a9116e4fd83432d21800524de32fdf18c139ae6230836a232f6625bd411a6943474caf1f6e0196ac4e133513b55f45431c27877d9a1a28817613ab5bad0295fbe0e15000b4590b2579010a462c022119c98ae8eefd77b4244b1538eee1d1e3c7de710e6cb39bdeb09d5b182d210c958b8fa0ea196e25d08de535e07296bbb5b12c2a04dd63f24ed552e9141244e2ff4442e0874f86e71531f55ee0b844154de8a671ed6b69612b00084f93eafee78929edae53f9852f5c52e779a8e14fd6072f5f46061746623a80f268b8f9e7fe563449c0f2631bf9849922a8dd6f76048c1e64a5eda5435570fe63861eb7bebe16e920793d81edb5172bb571d1eccbb7959774f9f8cb6ee6072afca523fd631c17f031676309e95fab01d9f536eeb6050aab24891952b51733a183d294f55c94fa70fcdc1ec51ed4cb4e53ad3b51c4ce7bb1baa422badcd713085e859ee4ccdd47b040e06a5b42e3674cdfb536f308abcca6fc2dcedeae406c3695bd8971016fefe8e3674b93db2789c0b58b0c194e7c4756bd984491f2260b106f3b8dadb8acc98b9a906d3d879f6b42d3bfeb11d69305c58ec8feaeff4a2a2c1302ac9a72a39a7e22508589cc190535e652e772cd88c434da18085190cae1af9cec43b89949125605106430e11c4ece8af10e624834148ef9a17fd1c2e2c63305d79b81abd4f0c663df5262fd45eda45bcf8a2bae8135c12b00843b51dea54ab922c81816491bfbb4e7bfb2f9cb2af263d79ac13232f1064c2df4cea91997741f51c3d048965aa3ae74223cfa3da9aaa483abd053fab73ac94104ff55a38a97c2239642995239c85b2ebf88a5b88db73b160eda724d782505a92f20ac9ea606bdbe6e141678525e419e956c1fcf5b260d993a59460418535725013d3446b2c3a05736c7cc556b0d1d5affc16a7bdf82f20c05ec0420a57fcdcef701669f68e82d146a7670b3b752b2614cc5efa83dbb8a8b83fc11466f2490941072f0d39c160d63741785a25af60018b26985a67e2cde5aa800513cc6b157625664a3f3bb60c582cc1bf205aa793a50c5d071737b6d8a29ddf7558404703b20b2e328085124ccafa4be70022811a59d43006031649484a34a5eae9c33dc00209c4f65c5f770fea92fc08fc5edd25a14ce5f0b2111cafc8fdeab9fd15a156eddf51a544e7872ce9a22990d6459fe046190fb02082f1da2b6c8de684bca62118e4e4f99895bb5b631282512dc6aa47868fd27f10cc25e2f76f726835df81608c1cd77f2ad32a3eff814149996ceebb691384366cb0010b1f1854d23e11829bf09c4f0fcca3436c988a16f5bb79601aa56ac2dba3089dde0129c710f1525164d681492767be460ab1f2e31cf8219e3a2ddfa6115f1c984cbee8ef78eda2e6bd8139b66aabcd04af24b23640a82492922c7e1d0d605103d38c744be9535cdc551a98b7b4e578dbb49c43333049c9dbf12da80855cac078d1de67f75cb3261903a3885f5c56bd600183528ea14a894b7a9557188212a24c59fb9b8bae30b78ac935578f55d6b5c21ccd538839cafc465618f48e347d39acd57256616acb4f1fd44c820aabc23c729683ca39df84244985e1823e0b9d92e52023549844f05b4b936f39b5760aa39cf68cd83b57713185e182e8115d622372ac0c30a3141aa824458ee2586172495fca49f844418e56626fa48d7afb84c270254be4fc79e3716650ec394c798a5db4912efa04e705175f34ab60c6278cefb75bdbfa49cdbb655d74d90c4f28d1dae44fb6fdb6dcea8000323067495a2d488db45da51898c2fbca4bc89f003030ae2953cac47f88cbed2baad3f1a44711aa2bcc97217792ecad3028b3f0a44b3cac30db9fd259d1ce95f30b076315a61c4ae54a3fa37ff6c61bd05085494492d39d0929456b6f70f1c58d1d4d820eec6807a05f418e06cc80462a4cf7924330ad9193720f09e34d705d340550612c6de3217e1b0b689cc220f12249136569e26174176914e080318549a7f21c3da73c8f2d96c2bca93713346c5bc313d020852988fc22299b3a5d91a5310a634449732222a288ca8bc22c3eca43fc9ed00885d94850a00a687cc2f0934ed45fa29a4a8b27cc497f2acb6fe2634d9d30884b92dd3ed2bbe56722a0c109b37992732139848a9da6b1094352cd113a9eed4d473461c857e2258cace8ef5d260cc1f6aedeb56254f23161ccb8d3a61e7f99dfd8d138d2d0ff8e1b366c3cd21cd0b884417ff6e84184b954218682d7002f0d4b184764398917c5a17603954625cce6b94adaa5b47f114d1a9430c7aec7ca89a7b3766912f7ab091b0bb5080d49183d09a5dfb14eabbd88043acef011411a9148010d48ec0a683ca21cd134d7f73813121a8e3077b4902d7a7bf7bdab011c018d46d06084c9d258275d6b0be9235ad4c8a2c6066a5c60023516718cb81492d26b232c4c4311a6d7ca9e5c2255f0d46149c432f1afbf43c436d140c429fb9ee8a424a71a04681cc294a7aeba3d295115846818c2a4475ac41709b275318d42182789ed90eb7f2d2fa44108b307f99eefb6134cfd4118dc73dc5a9315b105612c6defd4f142ce4a3c102639a96d275b0e4a450e208c9db112ed3adcf5bd7f309f1615764fd3d5c6a2e107c3769860bad45c6b4b39d0e88321c5fb748b91baa93f1f8c1d4465c92de74974b807b35c987496af42430f26d11e82f88d5b5d87461ecc39b25cc770cf6639e2001a78305d253d5adf2281c61d0cb17fbb92129dd3b3a3610793e79ff945b8d0a883e9fd84a88c97ff307a313cd0a083295e5d7d8af11a81c61cccff716669f4b5c36ed81a68c8c1acd75b6716eb3a5490c5c12ca3be43acd98494c2c17c3b22e9f43fa72335b470800e0b6cc00235b26800ee81c61bcc33e239a224a71cb553011a6e3096e9954e141129dcd906a395e8d65b09e14332d5c8a2461368b0c1245fb5825b9dca1ed78d1d396cd8b061238cc51d3b5a40630de6f78ee826a6c6dfe234d460be9c142985ac0fa6170eb51b6b35b470401a90709d5484d2d060f4cc49b6976df92a8b43ad8c9033187c74ca96d542dfe746c30c3aa0510653fa788b7cea925a8fd1208311420ec1c27fa0310683c90e317ba407757bd310832159e7902c5bec3214fc8e3098245efd577f0ad1fe8343918e5743030ce6f9104bea8db6e0c26f7ce15f82c3c517aaf0251284ce5b52e150bbb1821c899817b64ead748f37134b298cc4dadd121f41e94cf0df85e6a0d105a3a7f0720f0b9593e9718006170c328424f1b92db85e8c15a0b1059366874be5bd69c1b0771f827b9da59896043ab8d8623140230b26a11e225ed2295830b58afbb6e9ac957627640334ae6056d9be4942782a7da1158c563aca9a3089aa17bf5132150ad0a882b1325cce3d5ac59da413e4f0475430ab792c59bf11d7cbc3a1462440630aa6bca1825241c707f52640430a668346140c174dda68bbf6ac4d74b4ef8082615f435252c2277abf2303461e9108d07882e98286a5d4de3ce1691c6a58001a4e304ad4c8292ab3938fda0483bfbac7717bad0b152618442fd6e898d7124ca24c897d915d9e8392120c73f996dc731021564710a8a1c5046ab0814612cc27b3432cdab769974830cd4d945c4144978a1b8d2318d462a91cac92d8780b0d2318ced65d64f7a51f7d318197146814c1a03a75fc535f9d459c59d480c0d7d0620235cc0c348860b4f41ba1a65f12e4f0828b1b6dd82c4063086691a03f4d5eb594f204871a068186108ca71797a74ef8e72ce1502b366c008146104ce2f38960e1bb4a5f1c0826a91f64ee2aa9ac78fec0b015cac635431f18e4842dcbc1f74a49ac07a6eeb81d66f9e281c95329a5764d243d57da8129464a327ce4a730faebc094e52ac496f8321d7e0ecc9e924ff5d60807a6d8ea575d9f72786e607ad1fad221e548e3393630dc759fd259679febaf8139eedc77909f44656d1a1857822895125c2e656506e6d2234b849454c518890c4ca67be9dd97e3e65d3462907b750c0979e3fc1b9757a00103e367e4b718aac247f9f815664f39c49b3469f94be7c315e64f35e93b6e5e69576bcfe6a315a6931d9d2dc999d11f6451f86085515c334ddf278451e92accde6919a2642d8ce61faa30958c949b262af2ad28150695b3323b873dd51ffc4085c17fef2f27964e614a7b2adf4e45171d824c618ea6b405ed9f44329197c224628f8a1c2f45d79614c6fd14a4fc579a4ee3198529dc83f2cfeabdf4b2288cf2e6414777f2933314a60aff2b1d6e35694350984f2913592b09a57dfa84312cfdba56faf7fc7bc2f4a7e22f79adf35d4a274c75dfae6249b24caaba680a90047c70c2a02b481535aa2ac7906ec23c4ae286d26de972ae68c234315dbffd7343843c1326b9e0e3e9439a64298c09838d1ad752a2c5fdb397308af79924a584bdd6c51226d1296fdef1bfaf84417743446a6713153c4a9852cae177bf563f4be3c0c7244c4afae753ee1a33e9248952f8f0fdf6f1c25ee8231266834002fde311a675d70f1e9f5476493e1c61b0e0db769b231c6ad60083c347238c5e231f4bc84eb8cbd7c6e18311a63c4a7c4abb11b2868f45983cc67fbcf0d2a94b4dbcf0a108c3a71c3ebad35f9ef4d247224cf19eb2e49e60aae589e00311a8edd4d521ae1215b417ff05185d9c800b472a7c1cc2d47fb146e9144dcdb21a5a38c0061f86306986d0319f2fad1c1aa900086e00a0151f85309a08ef602ace6853ba0f42985284d02aaf2576911b84d1c53bd769b9091f8230e530f3d166969d6bbc00143e02614c1559d113dd9276310161f410bff24be79390bffc83f1732eaccbe4efdf1e091f7e306548ef2df5a2c2ca5b3efa601615cb3ea2529c3e3badf0c107939c13af2b7992fabd19828f3d182e5be990523f94f6901e4c42d9dbf68414b2c453f260ac2e893e5a6bf77b113ef0608930299a28a52b44f8b8836952e645fe1e2f2bad143eec6012fea7434a9260f9eb8f3a983fc98d2a51b9d33902c1071dcc49292d6fb2e382818f3918d27af2dfcb5b232a7fc8c13cd15210fa3e7af68b1f7130c50be69e4578f6a8101ccc39640bb74f61a9fa37183e68cbc85975d99cdd60dc521741cbe43851d7361845a8bc9d9ba019c16383398d127af32de764125b83f9e42475e93694860f3598467692a9927e1a4c7f2b2ac33f4d564fa2c11c5b41295326a284d770a89dc1543e6a5a4b458faa2133e1c30c66cdd127b5dd2e65976530e57f6e8f4afea1fd2de1830c1f63309a888eceaeac594905091f62305f8a88ac34119d45290c2611923c1d9fd7eaf64930984454677210a64a86eae30ba6aa0f5917e76e6d292f98af7394699b1cd40781615c20307640e0a30bc6882a3ae779b9048b77e0830b86602ac9dc47789864b71760b47d6cc1dc23e777432438d408692fc068fbe2430be68f9db42cf5de5c90ebc8d1001b3652402c0b66f3309ae1f9332ffdfdc20716cc9d4358bc287bf956173eae60ba307ea343eaad60bafaf01d4ca48578c847158cbadeea5972c4bd9325158c71313f8c34130ee1630ae6b39c267790bb687949c1a0ad4cf4c499a43d46ed05186d1f51d0c10714cc356342059994e35d240b1f4f3028cbf1a67492c409262949df6d45d2d1466a4d30c85c7f67658fa5df644c30b9c99c7755fcbcb5d11ae06309587a5a8c8da816247c89cc28f56aefcbeba12c6a649142f8508249f9d599ee9b1434d6e2848f2498930a13b24738f5d9c70f2418921aa12ded950e3157091f473069271592840f2318d3654fcef6e4dce7b3113e8a70509e91c492d64430a74bbdd735fe49c4c41e7c0cc1242979276951acf3230483c70a4914f80882d94c8824ac4d8443cd080a3e806010ea9467bd248443edc68e1cb9c5c70f0cb2b7225a94502224e90343d81b9b1445efde8570a895127cf4c0247285688f6149d46438d42ec7070f4c42726cc9cb221d3912093e76608c1851ff6b2409ad911d61bc045607c60aba8356e78eade5736088667217eddcfd62c63ff8c081f9c5cbb682ae7a8fe8c70d4ce277a4c750eea552fc610353be3032c3d4e3c1470d0cd252453e93a6ed5adfe08306c6f0147d26df53b626ac812f7ec70e3e66605e11224de9106354aa33f89081d92a88bb194991c1470c4cc12de4a44f741665210d3e606094f5706b5a439756a8051819e057984da71c497e1289f6c15a800d1b48c79bc0fbb02b0cca4cd7bf86de0a732555a521ec4ce25becbb08438b0ed0c08315e628f193d6daf68bfe5651ec45cab070366e63c14315c6b0969ce2b1a4e6561ea9302555d9465767d3122b2078a0c2dcb215578496943ef20d1b789cc2a0a263720891b36c8ba129ccab62d2466b9834cf4a615235d9176ef28e36255298bd625bd28931516ed1394e9063025fe4088d98a824ef851261240e8602a1602810088450381300131408001830220d05a3e16822aaf3031480044836344a342c14281c1216168c44224138180807c3613020100604c280402830103fb30a7c0ed33530a70004d73a3e312c435c7bd43a20e432829d8c6848a2c31499f0396aa21239830e953d27eff75b0ee54059cd8d4d590211b61d01d260cb2f448759412948f1bc7a56a9fe06d1a5c7c1bc464b62b8c95f9e6f4498fa9877c9ba6319c0967f729e1e9a6602d46781a1ee1c81681ea4cdcadc0de49e35bdd8400482825261fb7140ed0314f56cce5499b831a486133527c4f59fc5201146f2ef863286891f79769cee21bf4b9c216a9d65607e99c140a73e967d54b367c0f8361e0e8c2151422b1e840ad256c617bd2166cec1f01cd8b9afbfa799a9db1c7894bd28e5ad3e9dd982c5f8c249fa62b5596ccc7e308ee091999945b2ce91ec43a1781bab5f509fe444f92c1836dea2733c3413654ce2772bd18f4b0e782ef2b8afb9b6c46620281569ac833031008c30930dbeb5777c3a1eead1ac12a835368c5374f0589e06992d980c932708a8e34e046d29ce7fe352e0b40b704c4b24c3f75bb2717bcdcf75bd54b83e9e8c93e238c8076b9be2abd727f409b764d7e8ec25e352cad474c84f7307f84978f4f2369b80f75d6e457e4f0e7d4c3b664bd71d28f59e81930f9f882893ef5746cfea44870c9f468a1b8297ed7d29847f16e9c4f5d5f9661014284f5766d7ce9c822cd174758b3d8bf448f9b330f682defc877c483c64ea0ed8d0b1a8b61de3aa22ac50d71ad69a3ba01c151682c2194c85910930b955dc6868b978fb769029db09036e35f26480d752029b47b309428e69e67a7480ace05b260f6e4dfb2cffbe3e8eb00caebaa6dd46b12192767565fcd44fff8111eab6252661776e4531c88670b885470c88130a36d3c630f23c31364d88b59638e2d8d1d13761ab43f6c2d248783e2fe731ec1fc62f03c2470a5f4fe98c94442f472f12854b6f142ab031eddcaeab2d42f2ec9ce51cb4b5216391436068fe626d50fe9d2c15315cd236fe9681ea73e4c80ac563d80bc25604d3cdbbab4ab589926a942cdf747d64f9ff0e4f9319a52359f5f853d8a0ef790f95223c2fa1ea43746543a5150f0203e688185d84bea8019b2a4ee7e8d920d658156f09c8aed461732f96d6da98d01b3a2e26b86a2f153cdf1cf298fbf511b47a4de46ae4a9ec1c08e7e0a86f6af2983d5ccc1ebb89ba6e09cc970153026f9f40eea3b329b14c8610865652de3644007eb3daabf86cf1ff0f177d72effe79e95829c544b7acaf04e62609c08c78fc91908b2e64614d4ea9c0f38eb2fd82a490b24ba8fee44a090bf5318aff61ca064f5bb62d9322c28398ffef100080f83ad3cd71e3c1c4fcad2ddd0c5af185e346c30ea8aef8dd81ccb8120cc400d16b3153dcce4084e2e84a3f7f8a6c4b2e6173d99ca66907e8cca7065406b2c85a28c178fcc56c1529b5c00c9b79eae74b2aa42d8285587269ab303969271b11137304f490d9e8116536821b408c6c3c0b6db9a0c7db88a6e0fa0cc5c58427d3a4bb8addf4f061c689a39391f4926ecc48696d92c76039136c502ab4851541906f6d081d088ee89d72d2753ffaec79d91609a5c8bd6095d419634417d4346ea1146f6152c27c5db390d6793e247bc174cdbb222a92a63798ef029e22c4aa2752b1d6929b82acbbb2de7285d43645c15104f52536d9a12e92f37562a9ce863d36760b99a8afb0469c3eb21a2ab7d8cc751539dd81eb2fc960a153dfee704822b4823827c4df2922195c696292f28b5c13be437017b430ef09825838e21ab3ad03132101a67a8bc8ded888fa8d891fc807baf6a73c694850e8a057b014eba160863797c571fa17df2108b951a44a2822f7acb33f1130d97b378902c4ff022a4a4361b92d0e43637aaadb608a96022a044723496a7601c2d9dfe0d295d0bdd213364a811b07d880ef72ed11808d1b0414102f5028be15f339e3f12cc815e8289824079aa604a54f8b20ea64812098202f41ce20188288f3fd5dfcf5e5ad6d879ea315f5842c1e4f6e5c27277fc10d2c373689b3c363d42224e33353d964d68e3e643876d313d8dad712e3413232e798f10de509b0426cd0a3c692ab0822cf2a5a2727946c84f1bb61ee1684b2464640038088197ce0bf8c3fc64a6c53177be2343107848f6021a774ef8e34a66e0963302aa71c2f46d234248449fea3cb05f3aee21be016728e16362f0f9ca130390bc5c8386a9ca204233810f61791df313ec4d956da0dfb41460dbcf7e1a276925def22ba999e73fa4611f71a2f6a9d8c00a610037d820f91db326ccc8dd11dca6485c6d1ee9eeb82c2f639a870f56ad1dc29d6ca461ca789910fdc18380bcadcabe3cef92b38d773193496a521111270f24aefdb428248c54d643abdb3eeec37362c417c81c381e13838521a85d1a42448a4acc5baa730de614e2dcbd547cfe232963d1e29c20b0b62444026b88938f950851c665085971dc722c461b8f6e2930355f64115d95bd64b0ba734ec6e9f76f7aa618181737c7dcc0c19f6d422bc5cf743a93c3640f54704a3896d175895db26559c63c2def6b7b09a761591ace3906a3932b1500a58d913abc7a9b9a5545471d60489fe0829abe2d39c765c572b394b20e6817db3eabf95b4911967849c6935f75788fcbd0077ed87bf2da84694a6eff18dc747c1b65ce1aad457972d28a340a01a8ea704322faaa535b73357627fd2a7e276ba4b6b019d66998901052625514af2662eac8faaac711f33c5c4d079ee59640636293004091ee3259eaf47fe0921f3e2a57ad2b279642790cf6aa16225a499096a0b3a1c8e30efdddc29fce4436ad305392836ae850688e2f9eb93d41d42d27377c4e3af7870c92f95a51122aa1716332971610342f3c03e635908d3a0b04feed6c69d407ff05935e98b795f7c070382d325d8b2ea72c71d9dd03b80864765636b32f9285e891781b2429bdc5480e39c0dd96ce067333377bd39e920d6701924dfaad914863d75e46ec383ff4645864615d965f70692807559e916d2ea629404419265f1421e624859b27dfc2fa8a8d2f041330da986115ab309b05cc46db47665a18217017215eaef9f080cda202389a52ea539a0146ab9c94fa34c40ed91b5aa048802cececf852d22017f072c99550490172b500188457c322c089cb7c8317ebcd1156f26ce1e94ca322e9e328dde7a9e2f31e08002f27be2ba0afc2444fa9692684ece0fac9d2bb401dcd8ed081c24d9a6e24ea878b7ff5a3c651790c4e7408a0d0192210be4e2d1acb697a650c43210d1921234aaf9f4b8bf4c69d5c9d4550503b051181efbe9e15bb8109d3ab0da6c8a1e0b23186a66e689307320d0b01cd89829a7ecae88ef2c620d28c29dc74698b82e1329d45cae100b65b97e9e26063bfb838c9e02a68a2f9fd79645facd5c6df595cb68cbb1a969c8945e868569e5fdd820afd66a78dddcfb176affbf574f6271aac53acaae04866a663a4386f7c29230281acd761239fbc1debb27baa48f70228a61401f0e40842c8bab47aab7272c6f49bd516fb84ab1f84ef0a199f4c1368c849228efd571c952058d8288ea2a1742e66c7b5f28f6ecd5ecaaf17979250202c0e22ceee40c53db7d811403acdc3a550c4c1e009355d2e2358672780d193a83b421deca4b1151791c4838c2fad374e532046b6f963cd494a35f02b017d7cbf60ea77cf7c04c3da0222727f4573616d46788a8f95865dc6b4b53556ca610607e084cc7abb4918eb0c03a32450e307e331a300b7b65206254e23cdc4fe5f3adf4f4d07f8a48f30936bf88c8717cf73ef2e0cff7c8bef7dedd59a577a2763e31e7a4b6d2553e9abe4220d72eb2812721378fa36103e127828a3777735f82a518899f1990aac13a20b026bce598b96f11cdf09a260ab213bf61fc833a4d901df8a1d5cc6db65e380aa03cdf29ffde2386af7ce7f14da5646d4110f5ff6f65aa556d028154a2e23a5bb3909a3d432be0e92540eba682aa364db224eca2771a1e9917eb5216a2ca690dba7298bbcfed4094537cb5e3748d0504c1c6227583855f7081024071f1e1180204cb3db3af73fe990f69e17cd1c51407583f453d577f2e846338f4be621b5ccab06d2fb77389c4364e6506899471b5256e744a2178c112d46acc62661df2de425fe79f5184df5611f9cf94ff6ce56e1385e72b368caf34610dccad2107a6663d82d122d853c20f623a318472a13724a68f5cf3e1d57c69788a25100edbf06d69fcbdd08e516c2322badb7e5a0e593687782217a581db17ec61423c32f62286adadb8ae962326bcdaa78f0117a2c03d4bee52aa3a5d3b05a484591ee37b7055b15771d143ce5fa16b0ff5b6772a18ed92d442686e85222eb41bbd8dbaf0955156f020b6852f9682160bcec476050f18a440b4dcc63ba5dda0d40d57fcbe4ac036822bd76d2c01cd96db70004d2b24945e71a9a62a9662c9b1a295953618b743d778c3ae80e34d1c183159613c3e510caa31a6d664557c3aea21495c90a5bd58764630c94a88691b361661252f1d693856656e2917684ab4a144f300ce2ae5e59f43c7760e3b63762d206ac75f50a90aa56e78dac59889760c1c2d0d6ab238e246897182b672caeb307a58d96e3ea928245fcfc9ce0fa9d770561ca819ae9b8fc24443b75f9c15730e4c0838eb6c56f59bd0481254d0cb6d161ebbde5090b841132f059202a95f1a8bc60e83694ea53c748d450f8b55bea3d6e0bd3831ab009819979843a1377871352acd0fa61dc891a316155936ef57fdc60038fbd52503475fcf543d346489982f1061792a84d1ccafa01ac452d560f92080571cc616c0f8dc9cba91c5323d23eeb75d460eb4a5c913a805c3eb979d243489cbbf0c7c438c87f137a695d39358776071106ff287c105128e1bc9e96bf7ed47d2b28965a23fb44eb13989a7060d3998d091b8aabe01c2e52631a342c847df685520e205676d84e4850601395dc5d57451ba541c2fdb7e97b6697fa0bc99908e0a04512054fb2264464fe40aa008724f70ad50fc097d2a940302877cfcdb9f2046b86c3095b2a2a2292c38cf5413d285f72d9fc71613738f6bd250d46459c45f6ae8098cf213dd07055b02952b0a340a7fcf69669baa704aa9698ec2d1c8706cc221183811a327899d9b9b48576fb38e320bdc8addc9249a39f0a2dcb7fa3dfecd72b600f60097e0c1b029aa6f782c2968983b744ab562e98d2c25f966b30041021a6dc18e9833abd4300bd81103da89e1d1711b87c9410580586f844ec9d722647d91b4ddbb00727b5eb97ca21fb1ac49e6d7fdc2eba7c249e60cab12005a1f6d7090b4db484f5ede0d9695920854eeeb023bd73eca746e4a4c77a7d2d97cef35b32bceedf153fa60fcda2cc46f3a56c135a29bbd71c6633eb47ac341d4afb854c56beb8039ee594d3c86c471ae146a6bb2a1150c0f283176415bc6e2c4ea1380bf62052d2d57107822f2e0c377c9734c62ba6223f20083dcdcf9c572c8090923b042f1719cc434eb13b512a4de8d287ef826e9c495716ae4dc13ece2ba039d01ce50720448a0490d47eb38b43edd7ea20a2d38254213a0a462214c61dbbd8e185ca4347c4f2740afa96a96836046e9549313ab8de1f08de32ed8af02aab29d1d2f1a385b4a36a368475151a5013107a0d84ec1d984f65dfc381b5c4a0acd7f4e6009ca29b636a3f7c40c76f39987fe1841f4dc4068a3cc7351fe9e4349962453913f15037a879ee692fc19336acddf71012dd67f5bab9f21bc6bf19d74a5c3345dd5e18c116a4ef38ed468b9ea42f6dfc3c11aa0806f97646ee761c95decf82c9fe0fa14ea43c34d62b27fa83075cd1c2660533c29a833407da0e962a256a3af588acc8d76d3e7bff9312878c1e8d4f0d596b0ef6829ef9f4eb68fca82e307da6ff629ad4859b7f400d4c1782881aff78b136042d17a73afa8bc04a77cec0e8495e282eec7c2c2f6f85e5db674737113135a0cf3cc36544035d159b0879347a0a9a0287cc0c76791f3f7803492d69805ecc067ba9202ac38055c4071c03ce8ad018e77b8026f1f1b0c67ff84e38d48a3719f8a7cb775a8e15e2b15be50ecc8cf8a23f7be7becbbbe704dce698a2554a16c78690eec737e2c27d07f5608d9b37a8e320b193845e9bde39a2ac80d7fb0d1f73fa36021078b040dc576973320db264254ff9f56b5711ce07e04ea3b2d0580e17745e01a4e41e630525c8ed4265a9f53c5bf6bee5e634596b649ea11a2f0687c8bbcbad58485555f5022daaf214f260cb444c24566b0dc0a07fa9e4b9cb9341f0b422435c5146d2f54a6ae9c195ab2312655ee84aadc43e50701e0c1389b4f9c4c21066a27ca3eb1c059ecfe00b97eadf3d9f4e11d65d9d5b1208197b4e5dd2542f732699a061db2572b8684fef1acec31d13fff6c000009898297b6e38c23a0dc603003752cfee349634bc7b8823148b5f006a749c45b03714458efeb268dd2e194465c8f6560c26cc2f5824b8f4c9f47a61f6bc4600c19859881ab53aaea7127e2724f640dd9de5e4d887d7229a790b9c442487f3f71f4d815550b6729e8654a1a921cb30a64d504c74ae304ca5a0720dcf395b4de2c95e4b98a86dd6b873cb7a70da5db799caa0ca8fd053fd4a0d8dd644d2989bdf2c4deaec025965a0c65cec9cb029afa974d618903b288291a4b3357ba1d7396bac368041d00043c75a61f88b02997b5ed5334e060d610b973c581286979a36f037793efa319363eeda18eb4d516a605dbacdd19bfbf3386ad6344825ef46f4f7d607c7ac862a3e7fff9caf63f9e79b0c36b4585711cbf229b168bef5b2c2577d18fe86670ae02a9071eec6cf87a490dc8dc817660eef48712c1f9d9ff587faf88dd2cbf42a15f81561151c64528f3cd4f4e727540f6b1e04e1d71bc55ff03b859b03dbe73740576aebf5c79745fd125a62e9fbabb75e3d46d5597c5d86e2f3282aca7d1d5d697025d66ee7276defa7cd476dd4d2cb978d8dd817fb428214208905b054646bfe0828e6cdf49c67065a954c2a095e5a42ac15b2fdd331eba1d2a210daf8f7457d31afc0e31c98c2a165364d84eb168509c8789ca571ce5fa84aab5b5c8d056582836e6d997464c9cfa679c9d91d7fec3ca1deeabc5a58f2360b635a896447efdf516794324ae692d23cc2196ed58e3e8b3e3f70142c170c3651363aa2c62542dd7cd59f0aae3c909f326319b476a5fd0d5bdd78a11017842e57b45d3a907b1a885712239ee006d755e7e712d2be9e16f0127485b96ee8038952d9d869cf7dcac049c3ecbc73faa43929de6c138cfc555f491a7eaa7ea2da1180bb9664d3eaa4b25aa9d8b3e894434ec9ea8143d7a4f8368e17d11a2e23ed408b73fb20a39f4f1b82355ebb785059da58d08f82065a320ba13f68a6909f1b81579648ecd26e461c2f050f5af8c95b45ccb0aeb831c4b38d3a0b3e013848f5f12ae087680216e40eb4b2c99050b4f5652ba9d0b909e88d46082f5245b67d1c67d2ed1e16a6d2160fe4605d02be4cd9bb968c61f2888100a83ec1f548c5013061bced25a7f692bb02af5fcacadaaef8f0d4f8fbfcea1e323ece4206e84d60c8867c07f069bf1ad629cf426d4231b45a6c1f3ee48ad104c565359032531da02b8dfc4473115ca06781c18ba1b03c0038068da148091e09760cbfc9e4055024459b382b92db0e8a3f7069829384388681404e8083aa61f0a01fa204d0ef83296b561d23c1e5876748594266561766a0823793d38eb0a61e52db72f8264f36aefdbf02b15cdf2077c27d7b0dcd8056d1ae792f90edf50b95904709adcc172631fd8a67be9f8086b60a97101bb337b81f73b42cd88e1669e851a2814b82de712d15e3971b2b5a1213550a3e04b6ce2d87a62a1e154f1e839d4f5cb0b1c77c740ff8255d2b024a196d595c3a218d5dd0141672815298074038cb4f732ac7d3949a7131a7adbe03ee564ca8f198b4c184f1ef4ef7dd9a54d08f7273e7cc001bcc513a0fd0758fb859aacbe862d799b6f1b42e5a49ef9644829110de3a430316da0cdc6132e69b886c76066903a1ecda2e9c9985487a50e9874a6695b5f4d2277c6e9e80572883b3765d7e46b7e22e9590fe927da52fa332448d24fad6b8ac349c62fc134d4dcf8af0a613816c6c6788f7bbd4ab53ce0eccff2e2d4ab77c50eccbdecee91325db896fa054daaae573d0ca48faf39c0cba540b2a6812d85b5220b0cb52edc10b85865ec6713e6d9d9b62207af067f4f376966c44a6755ac0230b0e1aef4ab6e3c1c71972a3612ea1ac919b9bb82918899984ea22f6047edad4b81ff42a97d404bea5af548a0e4d93d8e62fcadbbcbe392a4a7b8b35ea1105cd47c2d498a186de399589821c621f31142aa33daccb683973735c275650fba6e58cc24c49b9d7fcb09f87fe98e036b7eb60225d04cfd7883cf6d272f2a5047441d90a90d9cd95ac075fcb53dc80ab6b0e48cf25ff3c4e910c13d270156729b0b8a866601257d887e2d2d5a170b175e7820f906372a3e18ae2b3a7a95a7917923d46acd049ef995579dd8c49b92529bd53b5f813346f510dadc5cb31892e92daac9ad6ea438986704381c86a3492c33b4c337b455e6f21c2bc6183b29bc8ca7f1488f4cc836e34926639010c5488c44a40967d1563817d4593e69a3ccad8cf8051cb8f1a077dd6ec60438f1546f84b1ba5ed9d3aadb13f03a5f39d46ce35a53b9bf63340613d85da61ccc5c3ef5658a272f7c44b3d04433ce9a6f43398f001de6faabc9fd7b11a300acbec9be8f6bea09b9abf630d68ded6b92da41b2a3551b5bf2dd607c7351067dcd23e32d010d762d587c241c9912f65460b5c3dd68512a0715e3eee8163a1f6a3d94024e2b812a8d46982986fcaa67358dac089769ae11c4ee4264ab1bb5604e509585146eef013c58e68724452723b641884a6dd0140c022d423f70be514fa495d48ad2c1522238a954b092a2bb82b12a21a47839e4b6aa0c03cb71ce71dac5dce2a62cf776fea01e128a9a33c2468b885a58d816e0106226fabc0c9261ef6679186e2b2e15c1102a331241206b028bf7034533e02dbed01997c24a9492fa64e6c3aea555401a37e90f3dcab9ae4184ef0feb8ad6c4d83ddeacc281cc37c2011e0f424e4747608dde000bc7dbcdfc656672c4bb64477304957da6749c78aa38d679ec2ae13749653ce261b13dbaad01730d8e45717beea17809454715a5cef1b4100304ec04dc6435950f8d131d09f4fe3225ba3423389e9d73d272bf3903417f78346b1d582ce1439d5dd758aeeb2ea017ad02719162a1e61c68302c5e3e95419cffe9053f75c7ca0a121f466bc1544066beb8d724ce664f4189707858ace6156ba29a34e98b77eaa16893da3d8f396e7081f034d95d9a545ea7ac502a2eefbacec326ec244e0e5e37ca37b385e443e1d7c505ae6d09f603942f629438e2113b5133e2517a66a7d47fe08e84046578dc72f947628b4599a0f1128df96ec013389aa0410e55cf0ae3532832e05a94ce843a697580d9622f02fdbcc57feba33755992b18cbd9995cd5f06f00ca2a32225b0227c1f8036aa5a94792e1000db798911c6153e7bef423a40bb0d0eb0b1a08aee20f5b20549e3464e6c5590a066741afc11b42b0a64d03e03ef3496f283c5ac113ff23828547dd62bb25397c13d8cf3aa210aec2e64cfe73deb0d36caf1ace176e30bf7632968285e5ed3531fd942a54f1b0cb59d2979ddfad9e2652c33f31fc8720fd85dffdc0f0eb6e346ac42f580ecfe1be68efdafeb98103dd4ac6238c418b4e45ee5af905a0a4e6c946c18b2d05bd58c084d06a64571ff704b7bece18d59df49dc760fd18d8acc670e096abb8338ab75b1e30338ee7aefb986eb32da7c77e61e39cf67711fee278b1e35f5ac028a49bade9339ec415ffd01f894c85b89ca57e7fa28923911e3aa108f84282ee7e60e3ce833df881463a831af5ae2ca6c794bd3ef651f8a40919ed23030104c68350cde773f208fc8f2e1f8823b4a444a79dcbe70bfd54e64e312526ecd9862964c930203031028cb426a53595cb17fcaf7decd9d56305e8595428f14614e790954a4f185ca413d9425fcb801eea0683f9f1bf44dba942da5ba518ae1890e7dfc44d4180309428cd3d01c423a339dd3197ce47802933b265c10b1450deb37bb5d310fe495763fb36525a7fb6b8d6df7a52f45f8764027ab888e089a29b67b805f7c4c03f9ffdfa4aaab892e262aa61ce22703b700bba227fcf535bef6264d0c2a0ee596395420bd972987b72f679c5fd1c37fd2598c5cad599db908ed148d14c7e27fc086bbf1e0fff8294a5e675c55ab1d601b3abcc6c62974d1322379dd11f586d9c765826c05b2ea1f264555236f4854e6c5466ad456a577b265252b3e0b2daa367a685345d0ad5431d5a376b3a63649d5491cc11a87b556eda39da0dc19779af4b4072c947f47147da9f26d2d3c15130acc878b3e6eb2a2e9fc1a308f0cb9361e9baf917e55898cfaf1856576420a2396d8b6ecd826ae4e0f3b7e208d50b6097d121e7d3c095fbc46e04e312e0536fb27ff989200eb7fc7975b7cb04986288a44d3d1ec53335456a2fcd48d14f9e628a08d9974460cf695a306459022a19a969a6faa1f77f35851641acd1d735b6c2f44fd3202ff8285c48e0810b3ac0134a8dd4c9605c4c06863133edca8675a817ad8be1c9dfcf0de2fb987aed7f08a8cce226f0f09933dac2b7ca02c338eac4da013640d46bec08b30e7cbaf695198d2e8317e491db1cdf84dd2d0c7c5c9119e56fe466f388c485c643e09f553392428df16961b19d84b30d00a5c497329a45dcc6ca1e18918e2782423560ab13af79a035aa55dab93eb98410994864e960db7a0f49a97bd321eeea238e03d85014abac471ba52f6d0448b4c21839ed1880a6a4f46d3c7ad5b28ae58b09953b703dcf066877cb351eeed9dde599bea4a0e553e6a3d4a9fa79fbd49e9c466fc25df4b75c40d51d96d2486a811162c43277635c72334d95cbacc32a1032a96ce63593d5cf5ca5b783116af9cc5b68d267f096061f491d31c5e2a419d4bab909cc0dc1bb76fcd1c90f25dd7fcc3a027e5a320b62177422e5fbb5cafca0a97a169d11036141fcab02e83848248637e4591c176accfb62ad39eb693394f38fdc9f63b2e8d1d51a35eb33aec82f42063ca66483a203e32a5245dcc0521a91666a2dd4b45662461e266abc86c13983081247dc3e9eba838b33bcfadadf071fcc033002f8d7be0241cac5c49d630e04ba815d1ffc2761ad462ad92611391712a0ee3c5174df61c20791b50e5e316a392b6f0d37a2530b4be396fcc86821a0326d3e24a921e8a2246623e43de59135b345bf82a1cdb3813b1af4161562368a27339478a8c679c4c5c730cbabe1476e636331e483f5c35cc79447a5ac9db265cace299ba92cdfcafd7448764719eebba36ac5f3bb6f67561529a911b1e3f0a316ec6be34c013cd5775692486d8d222d49878ed5e2a1432b8d1649509902b8d1823d0a588f16bc29809e2da07703be15433d08484f16f03603724c69851b2a6e0b39ec29807aad803b59752e8455fab2c26b30e6ffee43f0df4efb35f94c524377591dcb5c930a666d8e999f298219255a2268d88d1279354ed152cc27239fb6791bd6b0cfc3b44fd0800dd8f00ddff05ff40ad1162cbd8d6f71bc8fd7d13a26468eeac20fb90c0e9787e52cb94a698a551cd6254ec51d40bcb784b062ef2f544b5a6b1bde0e77eb030de186ded7eb7a5d0feb513d64d53e4c9d73fd266caa4e8caf5ab319e413487d49becbe7d8181fe37c6c8db171023ec007d838279e3745eef84b36805a830d2e57e03b7ee72edcf51b3e8ae074a708e5fa38c30e02b4ae110a2575ac76d0912591a80b781eafe375bc8ed7f1ead1aec2ebb9272ad3210dcaa23a8aa366d4a4688aa078aad40822840c91e89a9db36376cc6ed8c2288cf8886fe1857df89a22cdcd237c818f9d778a4fc48d724c47b4424f23e6824e0860e1ffa3b78357aafba7e5765ececb79380f9b9c991913e009a2a33a82236693ae5ef3c7175447738a816370132ec2e2084ac444402c5f9925ac3840b83b7a47afe86554c302812031980ef4a995030e38233eb6ca9db90377fceedff5bb7ec7eff80d876808e68279348fe5b13c96c7628cc426c005f6001da7e3749c8ed3e1a96171669a4b6337dd364d2923ca3d06faf712f4281d693991331d50f34a994144bb906c5fa62a347df5e449182397644f13645f95001803d184272cf486af532e0bb73ecc6083e4181b11ca05e97ef6529bea90ca1cee113625963e06fe880d7209146023d0260a48f5ae0f0dc274b98428ec010c4a2a324906356f1b2946e4d9a738ae1b85b5fa637a500ede80775e5e2d513daf00d0417b320db3840e8592b3204332f0186485d06375c813825ce8c69bb79fce2b60300e249f877dc9d8669b878320e45192249af2ac52dfa4d964c2f0b0c75c3da4acc8018df435aa4b415a8c9143e6043e7e23671c57e2eede4dad2ff85fb0e18067077b1c6a5bd406672100b7083e1d58ae5a7db50c832748d3e9b761320cbec237181638356018b404d25047d82f18241c698407c1197cbcd351060dd40180ca47157057b375c788e12507ce825d2540400c8b7c492cb80ff5bc7d5766a1b503af7a856562fd089016104f7da8fd41304ad4c5fe0964af81f482f8ddeac59e8e5642b58ac634bce825f3fcf8f07ba3529b97e37b34c207c58657f51e22b9482a4891024a0aa9f05ad489e5e621211498eaa8174d47ec3e4a02f1d91231c59c8a0833d27621962c9528295b0eeb0c9d7d3fe850ffa5b09cc9f34d02bbbc715086c7226ca546b4736f2295f64ae26740aee1f9f58661d9dcd4aa790b0170e6d86b4166978990f5ee352d556b8d832f78e7d8afcf1e33f6cc4f57b97a145e733998e72b2674796353d2dad0b33dfede4237562f745253b8111ce0760be0e66a2c8fdbb85d88d510f7a7706f18780b438b258d2aee8ff2db3075cc719c7cb1143d4329d9f7ac237b6b934237a464b3b6142d88b5ac83d775add946591255b516650f88ee732ee19fa090bf9d83c38600c71fc338f7cb1c5aba7b1f3255593da3e610bd43d63103941b83f2cc2b40287a1c8d62aec8ad6e029745bef9a37e226fa90eb3cb4d7c07a8b58f82c8973ad44bdd9443152abe8b77f5aeddb5bb766ba1166aa4400a5320f5523a569ec909420f2171faa23eea531c8ec371380c47e16038088705cccc4bb5b220bad44c30c488f27c640e51326b21077a2197c5f058dc880b71218ec7f1387cf6e15f42fd6e1bb10c66ec06547ccc2e40370623289cc459ffc99cda81415044418cc4488cc4261c5be5676d7a23a32452a504a55232955000f5500f755227f52999c5021a638ba2a73cca231ac11303622728822338822332221139110cf9000d5f860f8739ecc2dea7f3749eced3799a07e993aca0d6e3792fe4e4ad41207c485fb25da6189297189b6bc5d8350c2c4eefd9bd794fee518d228cb62505029a5d578e3630b0b4d001000000000070014d3f20967dbdb5b66089d9f7e6659249c2a2f40196ff2891524a49ca94db50373be3be9b88208edb40019b0834098f08b678f9fe417351c3c898b8f6e107746fcad5a05a3e2a531fd0abad75dcb7f6a4e6e5035a2aad5c9bdb4bea94f680f04eaf3debbadbb8f58050f5149f95cefc27d43cf45acee2d9563c20739c4e52c3db67fe8e891a637edc012d736949f88b793b27d30ee8eeb4b9c5d5c93aa0c56ff755fa4ae7d8241d90f1b2986416d3e5884bce01ada48e7b999a943909e5f01107949ad7abc165c5669e55533ee080f63371c1ede5ba7d9dfc78036a9567f145dda45d960b0f5258c08314167cb801bd5975b32cabdb80923909cdd29e63c7341bd0359a397eb928e584b806b4f83ac7a4f3eadd17510d68d9e26d8e26b3d89206d38096b4fc7771b328c4cc8306849d66529ab3d498e6ac81962b5c99126ad294fe0ce84c2ffd756655597a33a0c35bf3eb8ccb80188f3525738bbe96c88016577afe2c767269f318503a537f94ee8a011dbf4c93d65a9fef30203e4c6b3c6040be76d9b2a6104d1407321f5f40c7cca985d59965c1c437873ebc804e3d9fbbddefedf09ba8a1e8d8b123f8e8024acb9ca5d6b22cc60717d02d6bad31ee5b683e2d266a8bedc716106ae3caf5740cc9f8d002c2c3a4325165ef8ae0230b68316aa6b7e8e1b53c1610a6c5d3b2f87ae55740eee9a846ed192ba0d4e70f7fea992aa0ef645c5ba5e56add530199ed9269ba773ea94f01a55ccb92d294b89cd56a20dd4f4aa9949fc6982705d477f4b499a5d5a9f734d09d32d44f36ca957714d09a31e7cfa796895ae72083840447e7502121393a56727c4001ed51c7334b2da9adbe383a07190747e75039ea821b9470e0e309083f71fe3aa3ac91d39c803a196d1db6f3b5b43701f5ba757766f48309c82cdb6a1297399ddf4b409d909fd5b65102f25badc6d67d625c69286d5ef09104749a869754f4751ad742c4071250ff72e6d4ebf94f6beb98427c1c01a5495378b9d97fd6ed0f5ee148c1ede1c3080817bba7a589cddc9954498181c9ca490d52e5a3080879c1ef54735ccd3a1c0cd466d14cf7f797ca1e18c8cf9279f3e39ad24abf40ae7c716ea239fe76d41728e125b63bab65cec35ea0c63b3b96caa442cfc30b7496e95b65a83c2dec6617e89b951bd73a7fbccaba406bf98e314a0fe702993ab8671dfc95e7a0c105623cfd27d792542935e7710be47c36a92e5ffe058fd9003d6cf17bafce92d4f72fcb89472d50abf45cd28cf5924c152d9062ba4c9cd6c9ce2521090909894a5af6fc516bc7e7f9e0c043166819ab657649f3be16722cd0b2784ac98ffaf3a7bd608136b9b1625bd2e95acc7a054aeb67e125a53d8a5ddf15c85f2d9773f8bb6f17d50ac46c47ff16d375d02c670532099749a9e7f8a639ad021d7b3e37e60fdfdb49aa40ea1f7d79a6bbe5cc391568b1c57023b7eaff5b450532dae7be5cf9c2750a4f8174fdd6ac29754c818c5ab2177d3c37b3ba14a8d7abf149acccb15d5220fb33b433358f51a0e65c50993b2b29f5c53c4481d626b57e6edae89ffa50a0c5de2cbdb45a0705dae52c63cc768e6277fa044a89d98f25e3d8ca397902a5d9e57ad5d5314ddd9d40a76ed327956e3981d49212a7b3f9d9a16f021d4d9dce3a3e5dea536a02e1b9f7b21c579809a4ce3625bea7be6a4ca0c3c7cdfa4a69cf65628f4ba0b596e3cfe5366eb9c712c830ab194f6fa71268fb984ed5a5afaa9d12085d2d674997c966d54e02a55ace072da991044aeeeb8ccb8a0452cf8d66fb6e255d7590407e508d316e2f028f47203bb3ceae7487cb31a623d0df1a75e78df964bbb7d34620e5cb9298933abc246553060f46205b18cdaf77af3666b58b402b7d7d61765ec969d9eac143117d8ca9bdd8f55cf5b2088f44a054cb7277b6e768aa4d4504ba95dcd4211eabd3f743205c76bd593465ffa2986a0874ca2c6e4cfb3e2eea180b8196d4c4bb73b5180f422063faddee32a1e1ff978084440781d2975956f36a6a59cf181e8240aaff76caa66b47de0b3c02817c614da7efeca5d46931c34f560c093c0081525a9d9629e35579cb4dd494ea13c3e30fcaae792d4e34d967a2e628ed8bd9c0c30fe8b49deb5b16b5e846a9de0e78f401fd2eb4955c2d9fc0830fe814cfd2859dd344cd8c07384e5652cec81078ec01eda274ef74f7e95bac7a40dfea7e52a2e171eff0632a8f92a20347e0910764d6b31f46fc774deb281e56377db571bba983c71d1edf6c713b5f26f9d0f0b003528ebcc655aadf64bd4cd458051e7540878b72bbe16257737dc649095076b460cf4e96071dd0ae84fae61795121dfd384e508e218f392095e95e9355cfcdfa250764c8cabf9cc755beccdc058f38a064bd8b9dcd92f0fb8e066b78c0011d753ec73d66b9ea6413b59b83c71b10eb9a7dbb67b6499378070f37a04e6a27f9413668d6cda2b243478af1680372e7773f972aafdd97dbe0c106e4a9cc7cab5aae54b3b23578ac019df3ed54c3d633c9c9430d2821ea9a4b4b65133cd2807ef558d349bfa001dd6a5c56e69a2fcbe4af8196b4940daef39e9de66740a86edaa4da74565dd50c68514a5921f79ee7c560191e6540caa66cda7f943a07ed9001a5e5645355a55ad9596340c60ef3c2a6ce732db36240df6868fa572e3ebcc280964b4b632754674cad604096cbb22e87c609cdf902523cc87e7eb9edc9162f20d7857da96df6e1e5b50a1e5d40ae7dea96757101bd1d4ffa7f67be26d718365060a30c16d82021498f2da056cd6771c34a99f56c1e5a4046fd8efb73497d703b0d1e5940f68b69ae65cf9e55bb98860716d09fa547975f96e1eee22ba0e5a47b63d252e6afd69d287858012dab94a349bae8e2a2a90ae741056492f3f3da33a352abe53105a49e3acff975bbf1654f091e6a20db566b5bfacb66eb4b01ad553bed67a67e598ca6814e524a739539b5a9591e5140bbd6be379bc2e57dcb030a68cbb2ca874df72cbb20a2494bf3923eddc27ee9821b94ac783c012577b3d897c52c266a8a6d94710227783801b9a6fa4519f251db49d5afb4e3d8a1a30c939527210984471350fba2f4d21c555de6c804d4665433f995a5b4a02d01fde26daecd7339ba6925a03d272d95e7f04902d2e5cf6af91f44023a67707113aade6f95db0d42be80964b2a354deaafdb6342bc80cee2b32c35a6536e8c877401294475d6f5f195102e18c91650a65df8d275aee532440be8d2b597aba3d88a99d17610920564e628634b68feacbb4d140b68f932d35a3eb95167b3a262127205d4dda8c9d7ac3b68f45042ac80b497f55a16cfc425191d845401ed3aee45f574eafd53124205b430573bed52ccb4cb3d44c814d039edcc5e5ed7ebe1a99891928202f543881a086f77b1630bcfb2f57bbc10220574d2793cce9e9ffe75b510920632fe4bc9b4529992b20a890232e6d8a9f13bef942d1984400199e5953e9fbf8db78f9e11429e8056b73aa3d62c69f9b4588e1027f0ead3ca96b5ac2a3c8fe3e4be10d204b4cb1c45f31984102698efa5d6a76133b3278d9025782e658fa9d336c58d06214a40680be6c1e52c7e369382434812ccffb2fc2e75f009214840981c8fb6a73451943eb99182030d941418fc9b604fc5042147407a78a73dd91fe2f214428c807899c6fd6397d8ef4c4811509eb7554ad1b94ffd828150193c9dc6153050325fd62eb8929f4c6b13552980fc029dce37dddb454d2e0720be40ba4cb6f65a1eed30958936482f909e31ec2535ae5fffa701c20bb4acb4bcee36b69bc578a000b28bce64d4a254db395e124aea02a55f76f92d4373acd34c34b700920bb4ace76b73e65432091fe55589193afa860e1d8fa270b40909c91836c8b002082e406eb164e6b26cc7984dea9e9965ccf93b6f148db11a20b6400bbb5f9a536bf932be5a942c20b40099852c62018b9257a0a03405405c71019056b0e24056a10a1494f60680a462a52700828a07809c62a52d00620a098094c24f543a55008414eaa4a4240220a3700088281800128a920680806201f9040a4a8fe1894efcaf929495120d80700203209b2839c921c60a8ebf8146c36002209a38c921060440328101104c2cc825d449c9caab3000c412273922005209098050a28402209300019144c9490e315ac70e31444022517292438c1abc8002209028f91dbf23063ce04197b1019047a838426502208d700008234a1e00b288068028e2012089f000418408c8213e400ca1009042a0c570f7624ef6cdbd2704f2f67795ec96fbe6da41a0956c5958e9b2ccfcde8008c28004025dbebe51a9b772bd321f4000817cb97dd974a8f20ea32840fe80de8c6a1b6fb3e74f9715207e40f7ecea0c195542beed033aba942dcbea93fc6a59c9d63acf3da065e9ef7d42b56cdf6e074a9f9109103da0e574c27e6353903c20338be8eb1c02040fc8f75e999ad48e0a903ba0fbc5e5dc8ce6bba9c7c18313326c8c3106881d10be2555e9b4527540c92c9fbc4dadd301ad64cee326cd51ea98cf0119ddb4a85e6c2539a05f6f8e1abea637c71407b4f0c2475f311e9fd50c07c4b968797aedbe01352e6a6d2a625aed6e40c918b7954b2dbe6fae6d40e6782ebf16c7debc4736a0b4acf3feaf3335e6b30664e869f15f67ad7fecd48092ba79739fcc69004103b65a9fcc3827903590c9fe5cd672dda5d5cd19d0b2bca4563eeaf2939b01d9f9fddaed2f1e532f034aeedd6d6cd7f8763519d03773e6329eafd2391e03c23ee8b7aee77cad5b31a0e5bcd89f83788e49a8614047d598e52cca7a8e07c18076594275ce597754fdf902eadcdd4f8b32e6a96abc80d6369b51d3a75974af0b281d27ec3b567e67e65c408bdc0bf3622fb5e77b0bc83b97657e317979faac05846bb0d5310a390b28cdadb9a51d119f1716d0c2fe3c4b539a598b7805b4dc98e973e75ad65a0169a32f3b55ab912d5d1550e72bc364d8163775961d39a880ceb2490ab9f1ff735153409b0eab65922f66bea8ab817c596677a5f157c6bda580da2c77789964380d8499cefb55b3cd3246012defa59c6739db8c865040a6f2aef560fea57f02ba5e7e8ff183a98beb38012dbbdca55a68d22cfc540069024acd73b76a2dfdc38a41988092b2a3a76f514bbea81c334096804e4d32fda7d6735ad5df81d26720881210dbf91a57e67bedfb268ae305673b4eb807204940ab1736be6cff42023aa97e7d2e0797ef2b3c023acbaa5c8cf18f8c1c3bd497808444fd8a8e1495921c3bd42b358018012ddcbcc49ea7d70b4811d0f9a663462d0a93994a9fe978733bf80806facce3478da36a539384f80006da84ac98bc14b32d687e818c7ff5d9b9eea47c96b312b3c3c4872f509aa1e273c6d7f1f5b590f8e805526ea7ceb235673da649457cf002ddfee28c021b63d838c11825b031c6a6f1b10b5d20e549693ae6fc391ec5b940e6ce1e5b95eed4ea724ff8c0c59ad992c6f062ab7779b77c6725d3fd7a898f5b205bfa7a17d569a38c1328943f591fb640dfafe624bc5dd347f5510b74cad528b567699895cbc0cc759c7dd0e2483e6681d69276be55e6af6e36287cc8029dfef36eff66a1ae593e62815219a65c92e905c3072c904abfbce3fd3127fdb3525274c0e015e82cad8b5bc2331fae40aab1d352c3ab4ff0d18a9416cd54c716d77fb2c1072b50eab45e4aad3e5b98f8ae63470a193976989192c202d3467cac02996a5d69dc5f29a596bcc2872ad0f27266996f27b367d9e5d6f0910ab43eade5dbac6ea2860a74e64f31a5e5c744ed98e1e3148bf1827cfe78a2a281f830056a5f9a32f530a57468348a42497195ccc4472990295eabc6d41f6f743cc3072990e531aa55baeaa53c33d7f81805e2a5bab86eef13ab29c3872856d5623f6f7fd08c941493921bc364e5a4062a30404111c3c618366c8c61630c1b63d8b8f12b2a689061a30c16d84067b13fe3840f1fa1406adfccca526127445020a3766769a5d6bc2735f8878f4fa0435e922d9d66e954adad63e507c8c61836c6b031c6a9c38727d031e464d814b762fda6c24727d039776312e72d9fa7c4f0c109748dea5b9395a734aa4848bef0b1094d203c8bcae38ba74db2af4c1834d86b358f2f4ca0f5bfd694bdb9efd4bf04baede5bf6cd2f4adf396407dcc9eb6ef7c25d051a794318fbdf33d2590294db73429e63ade934069e9b507d7bbedb69104425c76937e4e4502a139838fcbaf4302d9bae55726575deae38f408bab61c3a3da9cb44c8e40b8f673d3936904e24e9ad4ac9f4d6596188196f4346fb8769c8f5a043a5eec4ed34617af2b022d9aaaf64dad540b532250ea6f65aacbf15d4204e263d07cb9db719e3e04c2cd5483bb3a3b1d35045a5d37ef89693c7d21509a7388e79b7e2db526044abeac1a65263521ae41a054e7e85a7c6352a78505817a4f2e6697dea6840b07e2a84eb8bcfa75ce9c01029de965d3f29702ba4cfb28334b14c89c62b642dd6366ba4381965a3621b7f2b9aab3a0408e9b5a2dbca64c559184c4ff0c9b82c827d0f16fae57deae74ad2f31e3838827905aa59a17bc5ecb6c5a9d4068cc24c594f493911727d0afd136d86d562ebc6b139ec7307232e95f13c84df79976a35a8f9ecf04d2e4f9f92697bdf93d26d0b1ea2fbb284cea18fd1228cdd3712fc5d4cd932c81f26c2e966e9a972eaa2b81f8ec52cdeed7636e2925102fd966f96b9d04d25cfe9c4e85ba543f258154f11ec555b9245b3e9140aad8789fb66520817c179396cf4bf308b4b8d8ac5dee7fbbd23902b5dd9ac59ecdca3bbe4620fe75b996316704c2b73fed45b1328fb92c02ed51c934b5ba24a20884c66cefa5d5db219208554ca7d7597f1622d02fccb3e8763f9ec821109beac5e3be68ca576d08c4cde7fc254ce5a4273a5616e380482150dac75bbba865d3f65184409e3ae51aa36aadf75f84203208e4b9743aca67dda66cc7f1282544101104529a7033e1c1b32b110904322bdf78e1ad0508b4d79d4b75b2745acdd71f18f38c39653415113f9cd6639cd2d55a4cb3fa70bfbd9b8ba3e93751c391726267a38c13dc3803ede148394143840f26cd347515d3605a8ac81e102eb3b8d9e8aaefa55d0f083b57be1f85ba24fd3ca094bcded9b0a3081ed0f14e9f96e49b6c79357740681673da0ea79a9eaf1dd05ab33c194ef4418a2a5959272a5c07744cfbe9f13f992e57840e887f172feb35b3b8a0cfe19863db3fcbf2ca01b15ad57eaf9c1795227140e60b5725e52665263f292a38729ce8ae081cd09250fde3727049a8fd6f400b5efb39aaf7fc14bf1bd0f25d73f2c26f035296d2eede796f3c556c40a76c679525858b93a53520a59c164dcaf42e3dd58096c3c7a4b4051f17b59c3420eca3cd9ffa8d45d0808e4ade83ab57d1d8c26ba036bf2ca70f3351dd82226740b9782dfba83e113320755666d528b34819905987bdbc5afb2264406bf132ffb7f45a36cd2232069447d7d8d1a44999f522220694f295ea7eba89840119e3c7d82dc6eca2f6d20f4ed6ca8e1c2b3b5e602eb841890744c0800e932b95569baaad0e912f20e3acc93a0f1b8a78012dc6cc3ab7e7a6225d409da97d29856e86472d269a47840b288fea34af0cd5928c1b2311d9025a657d945acef8fa6c13d182d23fb4dd054d1a225940bb6c9a0816d05acbfaa94c99b9284e6a885c0165e7bdaec1eff58d2c6205e46ae525b771eafab53710a9023acab3cf2dc88a0a288df256677db6a85653400b66ee2fec661f315d0d84dbcf2a9753f5b9495240c9d3b15b9de23450ba4ec66eef7014d062ea4a77516bd592bc5040c652af5a7f0c719bf50948a95cfa7d8bb52dc99d804cdd64bbb2cd26a035cb13abb4743201f9b984689ced309ee31290ab3baa04d46b57aff575c1ec739280b45b592fa96f97578b04f498def5989d9aba3c0262e77d5795eacce331024aa91e574aaa2c79da225204848bfdb2b57859827116e6954a2d85687a6d0830502366f31f5f692565ff055af7b8aed5d0ee57b72fd0a27bc96fd9fc956cb017e9e4aa3ebc407c12f39b356c6ad3cc2e506a4f75ff8d2b55525d20e3b89cbced5c2ef4d8bedabbc705fa3b2a8d7fa1c9c5f86f81d639f73ebf4ed2e5942dd039c73157aa65af4c772d50b625dc6595da937a4c0ba477dc2cab8e6f5eae9c05fa947e6da7f56f8ce664811653a9d5acfb9daeb158a03bf86effbe4b08426071425e81fc32d3ee72cc722ed35c81ecf8515cf3c421ad406be67f318e9a27283950741817dca0240321ac40b779f7f7aa16d6ec5520637ce1b4e639f58d952a906f9bf5c3f316920ab48d7ece3bd5425081cca2be49add15f7916879c02ddf3a26ed8b07faa3f12923405b274b35c5a75b694d34a8c4d4f11520ab4d8bdeabf66b95f344408291072e2e573f1fce7f4390a9449a93bde8d7cbf388bc28dfa71576b5628d0dadeff5167975f6d67d608010532839d7a09953ae5e73f81cce2b3fd784b3dcf326708f1044adeaf521b632bc14ea05b1e0f6ae2cd576a0e07219c406638f19e76f2cebcdb046a5799e77d611c219a40eaf76d49fa68a49292bc4c24de9d5d348b66d9335bd6423081d2e99ee3d96a932d4b2f819eb57d977f959ef46709b416d3e93fcd317ae7da3784904a205444b5d20d9b12c84ef74e5ad3ad86adad103209c47d86151ab624f62c32a2a9424824d06f5aea73367714ed9021041248fbac455329dc74d2e018421e8192afa5d0d3d76e2a5c0c18421c81d08e3e26bf43a5d24a8d402639b1f3964ab6dc8d1108176e3a4757d9498b3e0c421681d49ad4bc87151eb6ce9542882250c2c785f3a45ea3886f46db18e3248718651480092189407c12e2b3e9fedb054d082290b2e59c9a6d5abf090d09090e1d3b120e1d3bd231874049f138beaeb40c81f0bc72366aca96f3c90b8110ddf44e5aa67c0c3321509e1ffbf5d35eff3b21834086fa8baef346bdc3152208f4760eeab2cb7f2dcf8c869040a063856dee8bfd2b7308085309f903ca63ecf0fccef27cba6e08f1035a70ef14da397b36b7e0a5a9581fd02a443f271d2f4dafab11c207644b7737ad5e9e0eeada033a9aa76cb13db5985dba0524243f08d103b2f36e8c2d7d7ece9a86e401a542d3fe4529e3e69c9210820764ef976c59ab53cafd5582c6ca89778e903b20cb45adc4aa7a592a0ac79720c40e68f3922dfbb6da97ce540784aacda4397d3308a1035a2cf94daaa68466adcda78119ee2728173207d44b3b95e52f8ad7ad9703ea6499f76699b364e67140febccebe2cb3f56c0c07b4ea4bc2fd5ccc5173df8016b5fcf64a471963ab6e40bb6699793b492d93a66d40c8c6d25a76714ab6b43113c206e4ccf668329175b1e557d689890a5ec81a50cd2636cbd8ad891a0a0a4adf50596341881a90c145637af2e8a54f4cc3f984ea6d163724084183992a363f9ed0a4b5861e6d67675b9eeea6cee08a577dbfbebb19d63bfeb79d7f9701379d65b54c06f4553795ca6675f1319c77553effca54a618aefd2c3beb173e1306c475aee90b950d1e18d82caac5021a40e3c0621c38b7dc04fcdf0c3f57062600015f51d9a1a3000140237140010150d1f1090081ca498e564000ee00800004800367012100808a4a222180007aa515490102d02bad5274901c000003082301394a4a160080007c1c00016164018d1c58384018574089bff69e2e59e2b1823959d1510564984cde4aa8962ad3cb448d31046150011de6df85aeb69b962959941d378c07c298026275afd8d368622b9f71a2769c151c272008438d1c375c0ae664e58c13b5a3a4240161a4b1f22a37fe8601c2880252e5ebe6d6a5a555bb6efc0dcd30a080542e9a8eaef6c4c552fb8dbf9137fe0686f10473b2a2c34405a5a424016138012d87bdf2ac2d9b80eed3540fbb318cb610c7ab131fec0a8e14a0e0036130012d878b59ced954d766cf1250a65b10914d3a8b6a35266a27262529282b3852508223823094604e56504c54baa42401612401e1f9eee53f664d74cf769c95a813ff1c2a6c2b384e8c0a8e931594931c37525cc340027ae38e9a971ef96fcd0a1a24f8c1a3a0248c232cbc8e19fb4daceee4077fb21086115e97527bbe63d418e54218454054cad27e51c507292828290b0d23c1f8f76f3c7d3abd2f5b1801461ae43b26795a4c54ed0c23bf48de46455ff4cc178f6addeae3b14fc7d60e467ad178946283b8f02217eb6e623fe9f3981fd9c57eae63ca0ca3eeb135a20b5d90d9f09aa74cb6ac9f29d1b20447ca72b940e774cafd5b7c55dea789e20a8e3fe3b10323b840e7328d2e954b2eed4b8ddc0229ebed1ee509532d5713351c9d43a5c4078f636d9471821417909090901861c416e82caa921b650caea4eaaca8b4e3f0418a3a5bc1482d10abe596c93d73365f2505c54bd0d0b1c2642ca6e3d3890e57493b5416a305fafcb3251db51c97b4c7476681b419cdbafbccd4ea8b0a466481ceac533fa9b933248cc402e59fafea9ffd6f3334514343c1082c502b5c9fdeaf8917b5e42b503ff3da256f4b5cd6b2c6882b902fcb65b5381fef5c4a4a4c2b909eb3549a359ae64d254a6a1c5fa27252527296a2c3fb4649091a2bd0beee2a353d6d8e7bc29155a82239e739ea972e6d55678ca402edf954a838ad36a36fb0194105d2657c7d19bd7d6df21da740bfff78ccd2da9e6fec64c41446b28c9402596a9a937ef11b218559164e6673b86a0b9af17ee2a387f1a863e79c51a04ccbeafa85e6b84ebf2850e2a4742d8b8d95fb722414e85579b5f1e43755ab464081966673d6974c5cc8499d08463e8136e1a3a1394d5c4c5a767802ad65357d7fbfe6a4754cd4f6eca413c89c3fdaaa764d67534a4ab2334e2073302de9386eeed80472e333b6ccdb2ca7ad279a40cb4f62578b4a6ae13f3bd21f0f76a0340d463281ceaf5b76952c862018c1045a12cf24c4a3471d643551533931f685914b20e335bb984b54e99c8a0c9593151c2a5818b1043adb34feba0ebac1f595400bfa3acba925d9f34a4509b476b98d595bf2c3a92681ce94914ff3fe72722549a053cbe2ca923312e8bcdfdbba596bf32e410219b6b598f7a5d406ff11e8972f9785c9e92e9d76045aa7fca8446d6e04326fd7aae69919810c36a6eb5f072df1d145a073d3ca325d2eeb284645a0d5a9975dad7ff9f54904d2e59cdfd48b31e8bd1844a0ebeb5b8b975aea716de41088edde198dd2360452deb820aaf6f7e4ad8540e92ccd62fde68c39794cd4cc983042088476e717dcb5f0dc72191904ca63cb532b5c82406656aae595933ff57e20d0ca4dc9f8bb5c726b050864ebda710faf650bbeff01b9595e7e394b273f204e272daf472dbe8b53f701a5d25b30a5bc56baacf980da7be9ab3d6bad2df11e50d2765bd42d7ad0f8d20332c6aa33eddc25efca03525c6b3cd197aafd573ca0372713ae1b655f3f7a07b4e96676521aedc511ed80cc99f9aaf366bbd5aa035a6dd692e69c16d39c744069543db2da5dcbfd397340c6d02f4fb93972407f47d559c9ce2a77b938a0f65d637c561a1c90fbb95a1675fe0d6831cad3f25d26f3a5dd80f25a33cf7ae69ec4cb481bd049ec7d7ecd0b97b21e8e11362085a9f63f9961d2765f035a5c19b5f9c78e1a50a69e32c56627d5b14903f25f963dfa3a9f4c371a10e2597ed14dcafcdf2e236b301046ce80d2b2787a36e5fc4b626506740973a1b69b9dfd2a03b2b4ce3715729ed4773220f5dd8a9349c6fc5d3906e467519f7ef9a3ca66570ca8cd926ed5182eecbc190694cbb5ff27f3ca0d2f0306c47a2b97fed3ee376a19f9024ac7f4a5dddd8817902b4b8dc7385d254b9d3f18e9026a63d3b78bbf51766e2ea07756988ef1d1e45966640b88d5497d96eab332cb7a440b685d3def728b3dcaa3a01b8ff23d9205c486cba5a3699765564a0cd721469ae34043e58460040b486f59c94ce1693cadfc0ac8fd17c565251eb518e7112ba053b970526a2618a902ba73a8986eb96e30420563d4f2a22fb9283c074dd4cc189982ca881a3822855bee9c2ec9986b0edfb99134109ec5cff0fab551c609ee4a30120594962bff6454db081450a3f39a94f4fcd29d69ef64e409c88fad7b3dbc56529c5e627a881127a0b44597d309df31e5624a4c1731d2046494b1b5dedf6b4e07234c408c6a35df56d320469680d2bb95f36f62638b5f0988352dea93f1fa37d72909c895aea9cc4f6a1bb19180f657def2a979b1c5938f800ca7eab54caae7aeb34640baf41eb56bd6a6c557ed305204a4e7bb7059cc2cb62ce9fccf303b8804035d2f5b767f255787b381819251f9415b7a0999f717885742858ad79e5a2b8f2fd0aeb4f86a552b7b81149e94d4e272945d9a16e10562c3cb4b9bb5e82e502fd60beea27794264b5d20e434feecb54ea65e4e2e50ba526b8daeb57653860bd4cd7fb778b935b702915ba0949617ea5a4cf53b8dd5166897dfde4bf966bd32973210a90562b3d2a9a97932aca8fb01115aa03cfda3d4a6d63d6a586416c83a1763b37c6752fe9aa8a91c59a04cf485f3961d4ed777059158a06c4dcbf95163dcb35004164839a92bf75ecefffa5f46e415c82c5e7efd9c8522ae40bfafacbace542bd05a3fa74f19a775ca185620a36f9be6b8d91bf3cd20b20a747ecfe173e64e976d584415c80eb7199ec53c71f254a0cde59579358b67634aa8408a866b7c393bfeb32c720ae4acd25a8e468d8829905b9fa356d351257722a540c96ea983ab4e26aa352c889002995737dafdb8e970c92e888c029d89f7a8848fc562712c1289c3e150300862907a7a02231308303034248a0462e1904c57f63d1480035b322e4e34321a262416090662013118108602c140200c0a83c160201444712c139530ec013d255f63769cd1030e7f080a4c001af111017486b8296aef4dce122e7c159c720beb20150181c0fda5e4daa7f8858ef5d0d145e2dad24221218ea23f4750daec1a365fc243b08c17faa103cb72c6b1be43059f19d66ce7324ffc1f80d6f9cd71d65f99f4186673ca0d3cc88f1c5f46f5a5bd147a81846522456e56e4edcd68b207d118edf50b542e314e0a0990136e5de6084f34122fedf44900346adc0b425783280ada959c51e80f7bece4dd46457e9ce5937e50dcab23fb0341127c60d2dd8a96b432209b97f212bca85b1281bc29e896f810fc51efc114061c69cb072f568e5317bd8f50251fe7d557ab3a2dc1d67832b71c4cd743e5b256d1c9ed523bd0ee451a8925731566b5c1bdfc9de3558a5a110288b79ff6029b72b468eded18253eedf23f668beb2cd62aa0868c85230e042a52afbad76447e8ba6da123662e00b36f9daa5c9a1ec09d95c7e88e917ef1a50c2fff3f6111879b8060ace72cd39a9b9349da91b31514e2489783746822caeb6d40fc83ab529e9ab3101449ff25f5878034604470f9bce0c36120322b9755cab1444d0f204f4f1d45c25ab7eba66fc296c65af8034746d83a28fb10d9859a13185823fa6097f4fb1e7b3164b78e182b45a2e34827a05af1e8c1dc6c151e09b4c343c8bd6da821bb7e4e90492ebb876f7196a83e3384c9eb6550fcb3c164e9a6d5e14e51982463605c52a63bc0b9f88a9cb355dc82ea22e29808c4600e4511477417ba168573e4b72eec8cd024018ec062cca5f9447b9e8431369d3065b492df83a378cd9bfe7deb1ead17322c97d80baec9c249f1d5693343dadf1da780d9838511af59f606d065983bac9149b896b63e51e3b14f7bd2b90997a56aa9f9d358669bc6101c5c93b8dadd47085ce6dec16f90dfe6eb1d86b0bfb04f1bab4cf91c8dd4e4c5fd62e1f8bfc082066abc032807e5509d4a434b1d0d5c5daa82ba82bb1c505a813abbe648a380d8540a71e538d107bd6b80d08bb336990cf8255a1c589b7b208c620e4285185ebdfa69b87fe9c2f9396b0026770fbfe7f4862d211a150d10f53dd1132ce5e3160554064e2956311565b8cd6c0ae2250aebde20beeed0cc68a551bc509c451966f4bc3a9c8bb0fd9aed31ad033ba80933e52023150f2e4dc6318d5a4d9928acea3543a2a034342616080c0103d1c0150326b113b8f63158eefc141a8d91505bbc1346106ec9f9086f387491e0673036ce5deede41a30071d9352fc1f98b490931dd91071f086cb84c202238487cc30f4d6fe6628f85dd5fb3c1fafe42c34a704e7c249253c2290bd831ea1619d94e91ab90e8a819d175e75431101ba0e2842d050d86160612ca2346049802b5035e00d01da011bc4fb4f9f3a50052343b51c0549639a825a3d08eba144f8f5ed4cdcf8c118698ec60bd52eb606d39b1a35229f87a5fe6ccf3b43aa2729b08a4a23ecd13101264fa7a4e140691bf4662024c6e437e31c3624b0cc323debd4f05c049f14a14d7365639501ef42b643847d9701e36f76ab424f6cc6c66ff876601b343d9d8aca01eb0d7aeddb74f9eee9b9303639ee34a52977e26116b2bb17af2eceaa62e789b64bf5c1b89e8b8e0d5cf0041f5070c969603f6472ca62d9b1acb60a80d3a6d25e9d9d596cb205fd201b05f875125d984157a91f3a78bcb3b7fd6195f40cb8135076f794ef3717db0b41fb36ab42d900474ed4615f0ca5576bd304066242a448900ea8c898870afd03feb099064f063ec45a818e772d6ab4f3d051f12c4810edad33ae1581f408e692eff4d0f238f9fae2402247fa25f8fcc661ae562148591b31b75cd28bac3aee2999c34ed0889f36e1e89310beb12d64864ff89f4babfaa8d4dde54c546d3c3265ba6c46e625c6c690f6d34868967a5e90f2141a123055251886c7693d436551109d54de0d3ea5d9b644da59b238c3af2c45c030a91a0f16ec67c15bfb0f7694206a84cb800942905341528a9b4282221b66d8047faa12848570ee861d2cced8946f681afd2f0015492e662a7fb602d769bd2a10eeef2c08bac1c188f41de02780b138e241a1ce62cd430a6a72d53fe503c758cbf4329934cabb41ed08a30511ed0a9cd38374d3f907e508b3717c2d7443076ba262aa0b4c39ca0aa665b0023844622ad07355b8f095f409a8eaeba8797e1af02b28a6c9a5be51a723f043d5476d01785580fe70aea15072565d7d397e870f81015fc215891aa3099ec4352bcb055e839185107dbf1698339a8885765079c378c54c50ca9eb33f4e79e8aa7cc886a196b74fe0687c60edc747c0ba13418a0ca7148b9d2bf6de3fbb714f5f5f00070513c055109de530b7daee7b17ccdabf2685027e9e74b3223ec8ffa39c550d380cca0f87e575a4cf7901fe01a0f4e9552d18974af4b9c4e33cb96c4d7f2b0fe8c50011b7c01236c9b11123462b1cf363f8efea51139abeadbb56b94469395fa3d7d907403073e9ae885ff0f3e5033524917823020b625b29a65231a1e97e99118bfbd512d74e2b4fa080b7d38f6207ae5eafbcc146ce0b57a343c05f72c7b4df5687a48aef778e7fbe796c4e3d503d177786fdd95e049bfc7078203e4bdc1788fd25b00cad966356820f70e4e42353d360e361a425fa9d728c215331d8e9b0d44aa853063a0e7206a9522a48bf2d3546be69b26eaeb6e8bc3ba7bb81490640d4af1ebc67edf76dc2966423f9d56cbb51265cb997efac6e594000a9ddaf764efd1847c4c590bb27798537cc8b53b89c8641c10699914841e3fca3532b37a19b012590ce708417bdc71d0ba73b2a1b3a4bfa6b4b29d076e43a61f5944e16cbaa2d2092035cbf22d1cb4c0fd68997222fae495bbc216d0b6f58f000682ff4ba7f2096a5a3908daa00382a41005bc07f07ae6f638bf6dda94805eb28550d540ee87eb6e5955c2f1e5a9b7f69e94ba43c4c0d9ec368e6c7d565b10f1efd0036177e9371ff8ab4085b62ce1280a58aa35feb17ffd068dfc999879413a5f09866278672707c4797166c1467d915f856c46c2f2b479317980fcf5bf1c7e4baddd55cec96c82eae4a6e26ebc7342384f98882077dac2def911ea492ab3f57da38214f1260609268d13103db56c5d007b8e446b316eb9ec3743b0f8ecaaf4a631d91ccc2578ac4f4f08b6364da5f7790cfdcc28c27d80133fbbee418eef755d92af1ad5f7a379e87abaea80baf7b26983f7ac9eeaa22c0cd07e45cb302ef9c2db96ef358e3cf606bc01cc6d2089e38f21c40494057f80415ca452a706b34d09d2e3bb20d024b94b321d3ba1907cbe1a038972e1a8285b91f4bf4f513dc55857d3e309a405eaf75c655b2250369ec9ede3ce1fb2883ac11324490c71eab4241ba8e0de568074522439cda64afc63f8a985771e474f2b3f05482461e7b5e5b0a4c12c22b6337d53e1575e81925e146417446be5a5433ea1cb7cbf191dfd0bcacae17aa063900ad21cc28fd6c0f8024a066e2a48e8f7883e5720a4e1a201e9eda994df2f727557701976b10eb98eee0440a13ab803103c21d24984eeeddce2ea9b0b9e5dc6fb9458c8e88a74a42927923883ffe08bff1403b554ee0869d851bdace058412d5247b4f9ecd98da9b927586eaa2b7784964a24e8e15c97f4df7fc8f24e8efc3d6a0f092754d50442c8f29af07dc865bded0d97a0183768d8caebd7b1c6bbaaaa68866254c73eb755c6895c7cfc6fa716aec63c879f43159027456197bca394a6f5136ee3cca175a27fe73889934032c5c3911ea713c823283498677b41751bc6443c12c7f6cc60c29ba85432634ccf7cf21a2e2e51c64eee99cc7158b1b5e3e62b606c8c19e1500ded73f65dc63b5439836805a345b5b617782d4acadc361d0ca0c3fa157bef09f342894e61024863e63ddcb5b80c7a4a37c5bfa26d4e6375982b797de0635dad4a65dec20a40560e880ae108a81a735b7427df5e6cf6e6c69447e9ceeaace54f91bbefb1824fc2b37930fc15e89880fc749041c5e1447dcba626fdbe606a8a215e1422518c8fbd219a844620e040034fbd1c49f23b210a0e375a752989a28a99c54339ebaea7ef3bca4c3f5dbbba0a08a87502ade6023e902e571ec1e35257d30f9478b755c5f3d1470648d4585f172b7cc50114eca4a9e507984fb083030ad4b4498724e4f9b87b38ed13fb6be28c242eb9916f747e28b9274e7c44ade45cd8eb63a3b5711947fc8aa2dd5f65dd51079e5e4559435db954c9b4b8aa319448e748dd7d5472c70938b8d9c15a21bac0a59ab33e96e0c0f51e4ddf1a76c3110d0ee8a5852082ec11036b054c5f3bec2e3b7182cdf3b44ab88e1cfc33dba4a8b3a4af9ed5ba61e74ea07546477b14c7e148aa86a8c1910da58c30c35e20a8738e113d23fe8cc8e244601ae3d947c24e53e042c4b91cc8b397489f3ddd740a85fb7a404c16af28a918a8ec44672f2648d0587489ad6563f384893b0d0b8710ccf2dcaceeac3f146435468852151ca24c157557c5f4985cbd5e206b3540d04ffcebd84c6d029182ee11d4ee11c661e0242e4e4f252efd0fd10628d6e9e605effecf13eb2d2cb14283f95f0ae0a3eb3acfd5d850622e2904f6914009c755390a0b953c926d07637901db7a1b64c9edd339fa95f1cb831a34f067472dbb9266b7d57d281d21f8d84f867e7b52a6e5c1a06bb93f3498395b631c7aae7eb9ea9aeaaa9b556533312d26d3c1f0af654292ed31df58c712972a9ac77c1f7561dad5cd11d239942b14af10d087705f6749002410b75007fe2805e57133c55eae005b7bb041c552f85915c590e5ca5412540516a09c5133cf5bfa21896537080a076b07e2c0f04bc63c59faddd9f7bb0a5270ccef220c339dd48d2e4e550fb80af4851f5bc3d86ba720cf9680e531f6396d8705c8ba9c08742ecfa0befd0781391339176055c3d4a05105e7cfa277126d393e34e3059e179d01e4acb3c023fd5a129fcdb20559a51baa4a86f1f0aca64edf4f528b691afbbbf21e519bdf9f4ee964fd336dfbd106fbaa4fafe227330d744204e10372873a497f4e834018679ad030331128d787766712248adea63c49236e68cffb256a4cfd89c8c38e74d4f4e2eb52a70109da51a740a24f33c07b3e896d1759969294f10111a79f0e43c3a2c7dca9cbf77d7a656c89e71ab2ff469fba5877fbd3916dd2643ad394a4a0d73e7abd49e4c3adff0700638bfe08fde48d1276807aad19d5f780c71b088483e72c36c7f329b19ae7ecd9d79e08de4cbd4c1822ca00282303062d8bf95fcf9d620c059c1fd125819d6e0e6f0f418cdf29b01deea4519286d5b3842e211a4eac2a516282bb45dbbc90b4570e0b6eea6d272a785f35c87dd3c0cdcd80e70082d732d335bbe0be09aa6172cba724d1b7105391455d3503d7c485b3c51909618153c435d4ed603657da623b341fe5a970ade78f94d6eb2a3cb12b2090af0ba532ea887e45b33a31099057e84ec3068574d83c85d2bd69c409fe4f51c8145b8b3a97d30d3a087e47891baa864458ed568356adc6f9345281ad76d7699fb25c127882a82978bacc452f14fa5e67a5eefec273d242ae40070bd0ac841358bea082fa885aa6f42e69786eefd3c618c4ffd22d5df5a63e1c0c2258676c15c0d2e3168bc72a76cda7185d8893d687f3264cb17c1b68040b42d4ca109a777c6e294935011097d16d8e562a9a75bfbee00dc56faba44d39431e4ec0de9974992beb3c37e6e78a36800b454bcdd05c087421646f46c8bfa50eca3d2c41fed3d14d4ca96fdc9422d42b83824f5974b74c220d9ac950cc59f5dd48347ee4a7276100675cb6b32b6bfd835d9e996913e5af85f77ce435ba5633612a01fe8d889fb075c0e3a8197857c17f137e55885cd7de17133981ec9859c432fbccaabf45081af793157949a29b536a8dffba9ceaac4ce8deaf27eea78a7cf33c81b808f89151db9425db24846999c56915da95b98c482c0537a0e8dc486a0f80c85a9b14bf2cc5bb8af5c52b14d1ccbd4d669e4529e82b623c52a44c03e8a181ad3bf5cbd037b7e5a1608159c0e06cdb14451c408fda369031f9c6ab19286865302deb5433d1bed080d3e2c0cb0eb8468a25a99c401045a1043889c4b3c2ae28e89ffbedfc236fd28472d2cf34e400335f2e17a226a440773892c44711e1ed57bd6a98c58fa2b5a31ec952488ea730d6404b71b8a3a520492178c7fa055e283f9afc7f8d08786e6520e5065448db199e34894ae0a86b24f92dd4c453e85705ebbaa7a04ff2561df7dc6bdd1796c73af3407bb036ec2bb6371aa9fa228899d0bb5dc8f8d5c709fe958678cf34d060eb3cdd90d319d235eb6e88091d81178741307eeb61d973ac0f2975a3f7833897081b2120d303aa3a7a47ab1a3a361de47207d1055598d94e2b7c13f3aaaa0ebc83c786495fc267886129d1f408823a9745e82c0ac0893dc26b3a2e0e4da4effbc294cb32c68d9a6621b81e642a4ef4e6bc4c9fbff742cb0f3d7f6e58cd4907b7b0852af40beaefb7d84c5ee7963de4dd55e81f907744f99365a967f853040165476bbae917a8c7344d3d33507d80ec8b88d32f73b8282f1fccb8fc1c33dc4089d960f95b9fd62a36603c037021837d2931a7268d01ce0aa23630b341df32d86c8f215ba8de689741edbd1d48e0dfb539f8724accb1097a95cce50fe41c2ce60fb682d2552d1f9c09ac14609100fc02a00c003100fd01b80000458ca5d257a0e7f5dd4e9714409d00edb3eb7a3450f4f4ffaafc03264aa0bf012a22701133129d2603a54b06b04e00f40580ddb3ccf4b3c0013b094437803311e4dd0198b792c2740444d431795e922033b2f71ddcb5a99e42660861354d2ea2b50c51a13d058246b67434473f23596988bac52ead5b40b1e738b34980ab366f8d71e3add83484858ee7a5a4799c62aab5b0e58d7a7691b85d5e3f98035e80176df3c51dc6d0f39bd11ea2a9df05ec966e71fe7ce57fd8dfb522aa6b012f481290260755ec59262ca6d1f36653f267051b6fb1a2b7ffa712400824dc304c7b2e52742f228c42128c53499348c428dd0c1a56c7dc751849a40c70f22c29c86ef93b20c78b717855574c495d0667ea0ea6977afec9bb412e3fc371f97bd59db516438d4e1dfd45b3eacd424b75167b3e17cba369e6ab99807d5814909ba83908f71a4e15d5981f38a9ddc1572a97045a3a67f3a5eca3c0e0cc1ad6709b63bfbb1e96db1f055b69ac09570de68fb79b3b00b36b2ae01ecee86a98f51eb71c619201edbf99f40a53e4efab051b44935abd0fc4add925e066dbae167f9986ea353c542dcbf3fbc5385dd84e4e236b0e8753bb40445e54beea74f230cbdceab6f0e02a2f9334aa4e5b7cd988a9ab9c7ce4e670a040ad20bed25e7a41078908836f28871bf1a259e6de9851bff903d0ecae01735f12525712d353245cb93ff8cd23a958352a82608689e6924e5419faa546e9600d1c087595286b6233ee1ed61a60b9349627bbe17d4f7b6f2351c22ca4e803b1d82ac545b60b33f8fe60d46f9bf01068b7452e69ccc6909ec640a1c47f4842101d89b658325b92c1c76d5881c38507f1bd9e1aa0b05d4343a82cd034575e09bdef21fb0a925b20966052033a32017856b875238a0136c0adef1466e6597b5bdf722eb5db6d3129db3dd0474df05ede16cc9d8afa4eb32e677d0ce580cd78bf0aac4a16e7ef224691674dd776bd8e0fe157f0a92a77f0fe273268bc3ec80c99caf7c51ed6b33f4a71cd4849bc1f4d7d013ac1e2c1f4e9e7ac21dc1d84b1077d9e0daee4dfbabc1dc429ba26b10494497bda29180c1144f702c194fea9a8ce193860655d60d4395711d9c1fe4655f41365794781a518078ee0500b188efecbd805a4f23cb62c8123021e41a782da6cb746c7416584b2469935cca80e53c1065f9fd9816389c3dedb003e0a5df2d376f279f66bb5996781671696149d9b4293e679975d4b593d4183f076e97c3987686029b75fb4b13a57f91f5637d3ad79c7f71e4e552ded3c37317b78bbfb01bfca56a3fdb64b9413fdcdae2b97c3704bb8b9c09516b4cfbb4aba0a89c820837cfb36e81f243b07eba3252f7055b0410c91cd65eaaeb89955f6379a690ca2adc6b76b1f18a41d139e877f361d3e2adc345452bf4b323599c3a11a86569a82c56a82eacb3c563702ee43f0d218bca16db546c5451ba503bb3a06a28b11ebaf632d3e1c7370b3bb4d80b21294a6264451850a948c0902bb001be42b3892eac7be79aacac0c659a6c761a4b46b7a4179d7a6bb8bd7c878e75d62f63ea05da3b1964ff6ce65d26223f3951b42af9f81ce340f3061dd2a14cee33b589aa4d79b9da9baf41217b782f623361ac05b3be5508ebbd6241e0856bcbf20b1580f9541d1f7229ae93cca71660ec675b0a1e63a783894cbc2a4dd5b5a317d2d42af67e72ddedf1ac1c60994e9f23a358dadceabf5a5fea3e282d39ca240df89f702d4032e657478db92b8e51b45bbbad7591a99c86b2180f43758ce3a97d296082f412bb8e80541cf805ae758df8a28f2b0064335b9205d9b96caa9cfc2da1f5c8890c1c8d8d52664554232ae16827ccce40c8dc6cfe3d705c4ee135f197aae296163768cec2e6d93b29dd36ad4b06b0602a68d966c1567a340ecab052ec0de4222aedec84ac78235b8f2c17c7407895bb9142b3c035c317eb8975eb96f9cbffe795bd1d0159037907132959b65c82f78252049292ddf2890908221d340f8118e504fea86b7c301c05558602942ee468095c6646285fd7892a273e03e6b71439d05daa1a09135661622c871dfd9f0fe3e8a969c7129cac7bbad77b2a37f536db886ed422ef89e6050a48892f53c2b91a67d8f5759cb583312ca5f4f5ed7facdea6dff46073c772ef63985aad9691ff52c454acbd12b94732dec352c59e90bcfd1f274471edd9cbc518bb8b97939090cc92d98c0cd0ce551c7b44971aa97dc2f9fa4237046238e52912e942b565a85a9daf7d78e8e8b64b8927750884c958362f5576dd128a15ea6a23b0cc29e18ef73a48a4c44933b63717ca0fe769bf5c6817644b3d2b0c784bbcdaf5698c344376b4a2208b3d86af8ce0d3b9a202064dec1bf48484059a4affd8830990719f993c9a92f5fba19fdb4a0a6c8c18a0b1d7303d6b9342f39eee7531a7945a07db7225846c438cb272f905e60e0b1372c9c7f1083f5e5d1d7d2e577470a93889baf8e2cfe26f8be01fe17cd22e2aaac076d3061ff0391780ba38e27c62fcc2877ca72fe2a9435c4161dc3f1b28f4652afb2975db0305cf1ab8b927f426044f688ae9a806829debf43a65f7b04cdc91e9d4bdc0a693473e9d8da110a31b7275203579c1fbda8c6c5a93f1e6b40a0953d64a4dd4c1f6ab7db09247b8b988ded4362f5c5518a4b03f19da790889994e5adea9ce8d6c1abd7ea7285bf2b8d69d4b9a5a8e52a2278699b80134b5d045ed641c7daa9260220dde884ef444a11cc07196f47f6e169281b4d9a9a606a581a3c06c01579d040cf530d76e31e06302c9ab518e78a57ff0f839abd8a5bd77f00fd71a1757dc3e53a49338ae9ce22883757268e2369a95a31c5cacf8ee901f7ad3563ff94967cd235a5012636704f7e56707408bb1685a8ffde1a68aeac987612cc2c1e4f3afe1ba9ceab67e97bf5d13c945539af0a761933572442dc5fd299cb83e0e6cd2c680ec25d9cba02a1555a388a855f8efc78a413872859783379f24d4e800e9b2704178139b6bcc7f09736ef1f1d200fc62c6fb58522050e87801de4dbb6df5ffef98c2197f6125f9ecbbedaca96199e241aa0cdeec72e9316f28d3427ec7eb4fed81cc981a1a9f1e840283253477fa8da60a8f4264f7afc5494a99b501e1405e1ec12a26c2cf95a996d15ced9a25586866b890a884bcb9be49128e56cf80ffca0bc193737a71e41b6731565159234c6e33273296a3ffa8ab03b84ef44e078b1b4854e81cc2e8c43c4f16a8ff1d43266eef576784424c683cda1975c52d04960e8074f3fa9d048eb4a65880a19700704970c05dfbe8ce02908f24f1425eeaed6fbb0c9cc8384461ef09ebd93b11b525fb5a178588284769e5e3a13fa0414e29526d36c81f6195496ebf2c22a46e1b69ac39014efd5df8cde5c3981d58317cb5b5c642a0a64a5dd7114977abaf359e9491c99a66a10ec1313d2a1602d60220043a3a8513b73a7b40d9093d88087d121c4dcdb24c9234fd83029abb14ca0498565f451c557b54553102d49c6c615e9340f87d3fa5678bea55baa29951a3da96c8f8fb865e23e47c8d6a708b5eb4b4ef6f290e781ada15ca9d3dbc3b7dd3b59485078259342322e3ac21ca451a2d2b6be01ff71968790cff57c3448274d23ef8990d828061602813249f2ae26479e9aadae911c51cdbe0c23ce91464cb702","patch":{"aura":{"authorities":["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY","5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty"]},"balances":{"balances":[["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY",100000000000000000000],["5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty",100000000000000000000],["5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y",100000000000000000000],["5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy",100000000000000000000],["5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw",100000000000000000000],["5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL",100000000000000000000],["5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY",100000000000000000000],["5HpG9w8EBLe5XCrbczpwq5TSXvedjrBGCwqxK1iQ7qUsSWFc",100000000000000000000],["5Ck5SLSHYac6WFt5UZRSsdJjwmpSZq85fd5TRNAdZQVzEAPT",100000000000000000000],["5HKPmK9GYtE1PSLsS1qiYU9xQ9Si1NcEhdeCq9sw5bqu4ns8",100000000000000000000],["5FCfAonRZgTFrTd9HREEyeJjDpT397KMzizE6T3DvebLFE7n",100000000000000000000],["5CRmqmsiNFExV6VbdmPJViVxrWmkaXXvBrSX8oqBT8R9vmWk",100000000000000000000],["5Fxune7f71ZbpP2FoY3mhYcmM596Erhv1gRue4nsPwkxMR4n",100000000000000000000],["5CUjxa4wVKMj3FqKdqAUf7zcEMr4MYAjXeWmUf44B41neLmJ",100000000000000000000],["5FeDrZvvRmPRkAvViFjwZgsiCTA4EKRbRT5T8wqVxJbjZaKy",1000000000000000000000]]},"grandpa":{"authorities":[["5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu",1],["5GoNkf6WdbxCFnPdAnYYQyCjAKPJgLNxXwPjwTh6DGg6gN3E",1]]},"sudo":{"key":"5FeDrZvvRmPRkAvViFjwZgsiCTA4EKRbRT5T8wqVxJbjZaKy"}}}},"id":"torus-devnet","name":"Torus","properties":{"tokenDecimals":18,"tokenSymbol":"TORUS"},"protocolId":"torus","telemetryEndpoints":null} \ No newline at end of file From 240d29b3067954c0ac9381c26edcc9cb77ea4a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Mon, 16 Jun 2025 10:47:10 -0300 Subject: [PATCH 33/46] feat: add stream emission permission editing (#104) Closes CHAIN-95 --------- Co-authored-by: Luiz Carvalho --- pallets/permission0/src/ext/emission_impl.rs | 181 +++++++-- pallets/permission0/src/lib.rs | 25 ++ pallets/permission0/src/permission.rs | 10 + pallets/permission0/tests/stream.rs | 405 ++++++++++++++++++- 4 files changed, 579 insertions(+), 42 deletions(-) diff --git a/pallets/permission0/src/ext/emission_impl.rs b/pallets/permission0/src/ext/emission_impl.rs index 2f208599..497c14ca 100644 --- a/pallets/permission0/src/ext/emission_impl.rs +++ b/pallets/permission0/src/ext/emission_impl.rs @@ -1,6 +1,9 @@ use crate::{ + generate_permission_id, get_total_allocated_percentage, pallet, permission::{emission::*, *}, - *, + update_permission_indices, AccumulatedStreamAmounts, BalanceOf, Config, DistributionControl, + EmissionAllocation, EmissionScope, EnforcementTracking, Error, Event, NegativeImbalanceOf, + Pallet, PermissionContract, PermissionDuration, PermissionId, PermissionScope, Permissions, }; use pallet_permission0_api::{ @@ -10,7 +13,7 @@ use pallet_permission0_api::{ }; use polkadot_sdk::{ frame_support::{dispatch::DispatchResult, ensure, traits::ReservableCurrency}, - frame_system::{self, ensure_signed_or_root}, + frame_system::{self, ensure_signed, ensure_signed_or_root}, polkadot_sdk_frame::prelude::{BlockNumberFor, OriginFor}, sp_core::{Get, TryCollect}, sp_runtime::{ @@ -129,32 +132,12 @@ pub(crate) fn grant_emission_permission_impl( Error::::NotRegisteredAgent ); ensure!(grantor != grantee, Error::::SelfPermissionNotAllowed); - ensure!(!targets.is_empty(), Error::::NoTargetsSpecified); - for (target, weight) in &targets { - ensure!(*weight > 0, Error::::InvalidTargetWeight); - ensure!( - T::Torus::is_agent_registered(target), - Error::::NotRegisteredAgent - ); - } + validate_emission_permission_target_weights::(&targets)?; match &allocation { EmissionAllocation::Streams(streams) => { - for (stream, percentage) in streams { - ensure!(*percentage <= Percent::one(), Error::::InvalidPercentage); - - let total_allocated = get_total_allocated_percentage::(&grantor, stream); - let new_total_allocated = match total_allocated.checked_add(percentage) { - Some(new_total_allocated) => new_total_allocated, - None => return Err(Error::::TotalAllocationExceeded.into()), - }; - - ensure!( - new_total_allocated <= Percent::one(), - Error::::TotalAllocationExceeded - ); - } + validate_emission_permission_streams::(streams, &grantor)?; } EmissionAllocation::FixedAmount(amount) => { ensure!(*amount > BalanceOf::::zero(), Error::::InvalidAmount); @@ -172,22 +155,7 @@ pub(crate) fn grant_emission_permission_impl( } } - match &distribution { - DistributionControl::Automatic(threshold) => { - ensure!( - *threshold >= T::MinAutoDistributionThreshold::get(), - Error::::InvalidThreshold - ); - } - DistributionControl::Interval(interval) => { - ensure!(!interval.is_zero(), Error::::InvalidInterval); - } - DistributionControl::AtBlock(block) => { - let current_block = >::block_number(); - ensure!(*block > current_block, Error::::InvalidInterval); - } - _ => {} - } + validate_emission_permission_distribution::(&distribution)?; if let Some(parent) = parent_id { let parent_contract = @@ -362,3 +330,136 @@ pub fn toggle_permission_accumulation_impl( Ok(()) } + +pub(crate) fn update_emission_permission( + origin: OriginFor, + permission_id: PermissionId, + new_targets: BoundedBTreeMap, + new_streams: Option>, + new_distribution_control: Option>, +) -> DispatchResult { + let who = ensure_signed(origin)?; + + let permission = Permissions::::get(permission_id); + + let Some(mut permission) = permission else { + return Err(Error::::PermissionNotFound.into()); + }; + + if permission.grantor == who { + if !permission.is_updatable() { + return Err(Error::::NotEditable.into()); + } + } else if permission.grantee == who { + if new_streams.is_some() || new_distribution_control.is_some() { + return Err(Error::::NotAuthorizedToEdit.into()); + } + } else { + return Err(Error::::NotAuthorizedToEdit.into()); + } + + let mut scope = permission.scope.clone(); + match &mut scope { + PermissionScope::Emission(emission_scope) => { + validate_emission_permission_target_weights::(&new_targets)?; + + emission_scope.targets = new_targets; + + let EmissionAllocation::Streams(streams) = &mut emission_scope.allocation else { + return Err(Error::::NotEditable.into()); + }; + + if let Some(new_streams) = new_streams { + crate::permission::emission::do_distribute_emission::( + permission_id, + &permission, + DistributionReason::Manual, + ); + + for stream in streams.keys() { + AccumulatedStreamAmounts::::remove(( + &permission.grantor, + stream, + &permission_id, + )); + } + + validate_emission_permission_streams::(&new_streams, &permission.grantor)?; + + *streams = new_streams; + } + + if let Some(new_distribution_control) = new_distribution_control { + validate_emission_permission_distribution::(&new_distribution_control)?; + + emission_scope.distribution = new_distribution_control; + } + } + _ => return Err(Error::::NotEditable.into()), + } + + permission.scope = scope; + Permissions::::set(permission_id, Some(permission)); + + Ok(()) +} + +fn validate_emission_permission_target_weights( + targets: &BoundedBTreeMap, +) -> DispatchResult { + ensure!(!targets.is_empty(), Error::::NoTargetsSpecified); + + for (target, weight) in targets { + ensure!(*weight > 0, Error::::InvalidTargetWeight); + ensure!( + T::Torus::is_agent_registered(target), + Error::::NotRegisteredAgent + ); + } + + Ok(()) +} +fn validate_emission_permission_streams( + streams: &BoundedBTreeMap, + grantor: &T::AccountId, +) -> DispatchResult { + for (stream, percentage) in streams { + ensure!(*percentage <= Percent::one(), Error::::InvalidPercentage); + + let total_allocated = get_total_allocated_percentage::(grantor, stream); + let new_total_allocated = match total_allocated.checked_add(percentage) { + Some(new_total_allocated) => new_total_allocated, + None => return Err(Error::::TotalAllocationExceeded.into()), + }; + + ensure!( + new_total_allocated <= Percent::one(), + Error::::TotalAllocationExceeded + ); + } + + Ok(()) +} + +fn validate_emission_permission_distribution( + distribution: &DistributionControl, +) -> DispatchResult { + match distribution { + DistributionControl::Automatic(threshold) => { + ensure!( + *threshold >= T::MinAutoDistributionThreshold::get(), + Error::::InvalidThreshold + ); + } + DistributionControl::Interval(interval) => { + ensure!(!interval.is_zero(), Error::::InvalidInterval); + } + DistributionControl::AtBlock(block) => { + let current_block = >::block_number(); + ensure!(*block > current_block, Error::::InvalidInterval); + } + _ => {} + } + + Ok(()) +} diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs index c5cdadde..759bce4a 100644 --- a/pallets/permission0/src/lib.rs +++ b/pallets/permission0/src/lib.rs @@ -300,6 +300,10 @@ pub mod pallet { NamespacePathIsInvalid, /// Exceeded amount of total namespaces allowed in a single permission. TooManyNamespaces, + /// Not authorized to edit a stream emission permission. + NotAuthorizedToEdit, + /// Stream emission permission is not editable + NotEditable, } #[pallet::hooks] @@ -448,6 +452,27 @@ pub mod pallet { Ok(()) } + + /// Allows Grantor/Grantee to edit stream emission permission + #[pallet::call_index(8)] + #[pallet::weight(T::WeightInfo::grant_curator_permission())] + pub fn update_emission_permission( + origin: OriginFor, + permission_id: PermissionId, + new_targets: BoundedBTreeMap, + new_streams: Option>, + new_distribution_control: Option>, + ) -> DispatchResult { + ext::emission_impl::update_emission_permission( + origin, + permission_id, + new_targets, + new_streams, + new_distribution_control, + )?; + + Ok(()) + } } } diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index 5effea8e..3d6d54f8 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -219,6 +219,16 @@ impl PermissionContract { } } } + + pub fn is_updatable(&self) -> bool { + let current_block = frame_system::Pallet::::block_number(); + + match &self.revocation { + RevocationTerms::RevocableByGrantor => true, + RevocationTerms::RevocableAfter(block) => ¤t_block > block, + _ => false, + } + } } /// Defines what the permission applies to diff --git a/pallets/permission0/tests/stream.rs b/pallets/permission0/tests/stream.rs index 7d8be2fb..6b08b565 100644 --- a/pallets/permission0/tests/stream.rs +++ b/pallets/permission0/tests/stream.rs @@ -1,11 +1,11 @@ use std::collections::BTreeMap; use pallet_emission0::distribute::get_total_emission_per_block; -use pallet_permission0::AccumulatedStreamAmounts; +use pallet_permission0::{AccumulatedStreamAmounts, PermissionScope}; use pallet_permission0_api::generate_root_stream_id; use polkadot_sdk::{ frame_support::assert_err, - sp_runtime::{BoundedVec, Percent}, + sp_runtime::{BoundedBTreeMap, BoundedVec, Percent}, }; use test_utils::{ pallet_emission0::{ @@ -234,3 +234,404 @@ fn set_emissions_params() -> (u128, Percent) { (min_validator_stake, weight_control_fee) } + +#[test] +fn random_cannot_change_permission() { + test_utils::new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 2; + register_empty_agent(agent_2); + + add_balance(agent_0, as_tors(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert!(AccumulatedStreamAmounts::::contains_key(( + &agent_0, + &stream_id, + &permission_id + ))); + + assert_err!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_2), + permission_id, + BoundedBTreeMap::new(), + None, + None + ), + pallet_permission0::Error::::NotAuthorizedToEdit + ); + }); +} + +#[test] +fn grantor_cannot_change_irrevocable_permission() { + test_utils::new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + add_balance(agent_0, as_tors(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::Irrevocable, + pallet_permission0_api::EnforcementAuthority::None, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert!(AccumulatedStreamAmounts::::contains_key(( + &agent_0, + &stream_id, + &permission_id + ))); + + let mut new_targets = BoundedBTreeMap::new(); + new_targets.try_insert(agent_0, u16::MAX).unwrap(); + + assert_err!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_0), + permission_id, + new_targets, + None, + None + ), + pallet_permission0::Error::::NotEditable + ); + }); +} + +#[test] +fn grantor_cannot_change_arbiter_permission() { + test_utils::new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 1; + register_empty_agent(agent_2); + + let agent_3 = 1; + register_empty_agent(agent_3); + + add_balance(agent_0, as_tors(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableByArbiters { + accounts: vec![agent_2, agent_3], + required_votes: 2 + }, + pallet_permission0_api::EnforcementAuthority::None, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert!(AccumulatedStreamAmounts::::contains_key(( + &agent_0, + &stream_id, + &permission_id + ))); + + let mut new_targets = BoundedBTreeMap::new(); + new_targets.try_insert(agent_0, u16::MAX).unwrap(); + + assert_err!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_0), + permission_id, + new_targets, + None, + None + ), + pallet_permission0::Error::::NotEditable + ); + }); +} + +#[test] +fn grantor_cannot_change_permission_before_block() { + test_utils::new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 1; + register_empty_agent(agent_2); + + let agent_3 = 1; + register_empty_agent(agent_3); + + add_balance(agent_0, as_tors(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableAfter(5), + pallet_permission0_api::EnforcementAuthority::None, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert!(AccumulatedStreamAmounts::::contains_key(( + &agent_0, + &stream_id, + &permission_id + ))); + + let mut new_targets = BoundedBTreeMap::new(); + new_targets.try_insert(agent_0, u16::MAX).unwrap(); + + assert_err!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_0), + permission_id, + new_targets, + None, + None + ), + pallet_permission0::Error::::NotEditable + ); + + step_block(6); + + let mut new_targets = BoundedBTreeMap::new(); + new_targets.try_insert(agent_0, u16::MAX).unwrap(); + + assert_ok!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_0), + permission_id, + new_targets, + None, + None + ) + ); + }); +} + +#[test] +fn grantee_can_only_change_targets() { + test_utils::new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 1; + register_empty_agent(agent_2); + + let agent_3 = 1; + register_empty_agent(agent_3); + + add_balance(agent_0, as_tors(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableAfter(5), + pallet_permission0_api::EnforcementAuthority::None, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert!(AccumulatedStreamAmounts::::contains_key(( + &agent_0, + &stream_id, + &permission_id + ))); + + let mut new_targets = BoundedBTreeMap::new(); + new_targets.try_insert(agent_0, u16::MAX).unwrap(); + + assert_err!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_1), + permission_id, + new_targets, + Some(BoundedBTreeMap::new()), + None + ), + pallet_permission0::Error::::NotAuthorizedToEdit + ); + + step_block(6); + + let mut new_targets = BoundedBTreeMap::new(); + new_targets.try_insert(agent_0, u16::MAX).unwrap(); + + assert_err!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_1), + permission_id, + new_targets, + None, + Some(pallet_permission0::DistributionControl::Manual) + ), + pallet_permission0::Error::::NotAuthorizedToEdit + ); + }); +} + +#[test] +fn updating_works() { + test_utils::new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 1; + register_empty_agent(agent_2); + + let agent_3 = 1; + register_empty_agent(agent_3); + + add_balance(agent_0, as_tors(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(grant_emission_permission( + agent_0, + agent_1, + pallet_permission0_api::EmissionAllocation::Streams(streams.clone()), + vec![(agent_0, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableByGrantor, + pallet_permission0_api::EnforcementAuthority::None, + )); + + assert!(pallet_permission0::Permissions::::contains_key( + permission_id + )); + + assert!(AccumulatedStreamAmounts::::contains_key(( + &agent_0, + &stream_id, + &permission_id + ))); + + let mut new_targets = BoundedBTreeMap::new(); + new_targets.try_insert(agent_0, u16::MAX).unwrap(); + + assert_ok!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_0), + permission_id, + new_targets.clone(), + Some(streams.clone().try_into().unwrap()), + Some(pallet_permission0::DistributionControl::Interval(100)) + ) + ); + + let PermissionScope::Emission(emission_scope) = + pallet_permission0::Permissions::::get(permission_id) + .unwrap() + .scope + else { + panic!("unexpected permission scope"); + }; + + assert_eq!( + emission_scope.allocation, + pallet_permission0::EmissionAllocation::Streams(streams.try_into().unwrap()) + ); + + assert_eq!( + emission_scope.distribution, + pallet_permission0::DistributionControl::Interval(100) + ); + + assert_eq!(emission_scope.targets, new_targets); + }); +} From e94b5b1205844e6ec9deb8c20f441850b9920684 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 16 Jun 2025 21:37:23 +0200 Subject: [PATCH 34/46] feat(namespace): cost calculation rpc (#106) Adds a new RPC call, `torus0_namespacePathCreationCost`, that calculates the total fee and deposit needed to create a new namespace entry. --- Cargo.lock | 12 ++ Cargo.toml | 1 + node/Cargo.toml | 1 + node/src/rpc.rs | 4 +- pallets/torus0/api/src/api.rs | 12 ++ pallets/torus0/api/src/lib.rs | 23 ++- pallets/torus0/rpc/Cargo.toml | 14 ++ pallets/torus0/rpc/src/lib.rs | 68 +++++++ pallets/torus0/src/lib.rs | 31 +-- pallets/torus0/src/namespace.rs | 41 +++- pallets/torus0/tests/namespace.rs | 312 +++++++++++++++++++++++++++++- runtime/src/apis.rs | 15 +- runtime/src/lib.rs | 2 +- 13 files changed, 502 insertions(+), 34 deletions(-) create mode 100644 pallets/torus0/api/src/api.rs create mode 100644 pallets/torus0/rpc/Cargo.toml create mode 100644 pallets/torus0/rpc/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index eecbcef5..e4612934 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9456,6 +9456,17 @@ dependencies = [ "scale-info", ] +[[package]] +name = "pallet-torus0-rpc" +version = "0.1.0" +dependencies = [ + "async-trait", + "jsonrpsee", + "pallet-torus0-api", + "polkadot-sdk", + "torus-runtime", +] + [[package]] name = "pallet-transaction-payment" version = "38.0.2" @@ -17237,6 +17248,7 @@ dependencies = [ "futures-timer", "jsonrpsee", "pallet-permission0-rpc", + "pallet-torus0-rpc", "polkadot-sdk", "serde_json", "torus-runtime", diff --git a/Cargo.toml b/Cargo.toml index 13f254ba..d8d5952a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ pallet-emission0-api = { path = "./pallets/emission0/api", default-features = fa pallet-faucet = { path = "./pallets/faucet", default-features = false } pallet-torus0 = { path = "./pallets/torus0", default-features = false } pallet-torus0-api = { path = "./pallets/torus0/api", default-features = false } +pallet-torus0-rpc = { path = "./pallets/torus0/rpc", default-features = false } pallet-permission0 = { path = "./pallets/permission0", default-features = false } pallet-permission0-api = { path = "./pallets/permission0/api", default-features = false } pallet-permission0-rpc = { path = "./pallets/permission0/rpc", default-features = false } diff --git a/node/Cargo.toml b/node/Cargo.toml index 3346f5a7..a49ff9a9 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -107,6 +107,7 @@ fp-rpc = { workspace = true, features = ["default"] } # Local torus-runtime.workspace = true pallet-permission0-rpc.workspace = true +pallet-torus0-rpc.workspace = true [build-dependencies] polkadot-sdk = { workspace = true, features = ["substrate-build-script-utils"] } diff --git a/node/src/rpc.rs b/node/src/rpc.rs index 4cb3e9e9..00445c65 100644 --- a/node/src/rpc.rs +++ b/node/src/rpc.rs @@ -28,6 +28,7 @@ use eth::EthDeps; use futures::channel::mpsc; use jsonrpsee::RpcModule; use pallet_permission0_rpc::{Permission0Rpc, Permission0StreamApiServer}; +use pallet_torus0_rpc::{Torus0ApiServer, Torus0Rpc}; use polkadot_sdk::{ pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}, sc_consensus_manual_seal::{ @@ -86,7 +87,8 @@ where io.merge(System::new(client.clone(), pool).into_rpc())?; io.merge(TransactionPayment::new(client.clone()).into_rpc())?; - io.merge(Permission0Rpc::new(client).into_rpc())?; + io.merge(Permission0Rpc::new(client.clone()).into_rpc())?; + io.merge(Torus0Rpc::new(client.clone()).into_rpc())?; if let Some(command_sink) = command_sink { io.merge( diff --git a/pallets/torus0/api/src/api.rs b/pallets/torus0/api/src/api.rs new file mode 100644 index 00000000..606278e5 --- /dev/null +++ b/pallets/torus0/api/src/api.rs @@ -0,0 +1,12 @@ +#![allow(clippy::multiple_bound_locations)] + +use codec::{Decode, Encode}; +use polkadot_sdk::sp_runtime::DispatchError; + +polkadot_sdk::sp_api::decl_runtime_apis! { + /// RPC related to Torus0. + pub trait Torus0RuntimeApi { + /// Calculates the total creation cost of a namespace: (Fee, Deposit). + fn namespace_path_creation_cost(account_id: AccountId, path: crate::NamespacePathInner) -> Result<(Balance, Balance), DispatchError>; + } +} diff --git a/pallets/torus0/api/src/lib.rs b/pallets/torus0/api/src/lib.rs index d06e311e..da7a738b 100644 --- a/pallets/torus0/api/src/lib.rs +++ b/pallets/torus0/api/src/lib.rs @@ -3,7 +3,10 @@ extern crate alloc; extern crate polkadot_sdk; -use core::str::FromStr; +use core::{ + fmt::{Debug, Display}, + str::FromStr, +}; use codec::{Decode, Encode, MaxEncodedLen}; use polkadot_sdk::{ @@ -13,6 +16,8 @@ use polkadot_sdk::{ }; use scale_info::TypeInfo; +pub mod api; + /// The Torus0 pallet API. pub trait Torus0Api { /// Interval of blocks in which rewards are distributed. @@ -66,7 +71,7 @@ pub const NAMESPACE_SEPARATOR: u8 = b'.'; pub type NamespacePathInner = BoundedVec>; -#[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, TypeInfo, MaxEncodedLen, Debug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, TypeInfo, MaxEncodedLen)] pub struct NamespacePath(NamespacePathInner); impl NamespacePath { @@ -171,6 +176,20 @@ impl NamespacePath { } } +impl Debug for NamespacePath { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_tuple("NamespacePath") + .field(&core::str::from_utf8(&self.0)) + .finish() + } +} + +impl Display for NamespacePath { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str(core::str::from_utf8(&self.0).unwrap_or("invalid path")) + } +} + impl FromStr for NamespacePath { type Err = &'static str; diff --git a/pallets/torus0/rpc/Cargo.toml b/pallets/torus0/rpc/Cargo.toml new file mode 100644 index 00000000..1662b846 --- /dev/null +++ b/pallets/torus0/rpc/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pallet-torus0-rpc" +version = "0.1.0" +edition = "2021" + +[lints] +workspace = true + +[dependencies] +async-trait.workspace = true +jsonrpsee.workspace = true +pallet-torus0-api = { workspace = true, features = ["std"] } +polkadot-sdk = { workspace = true, features = ["sp-api", "sp-runtime", "std"] } +torus-runtime = { workspace = true, features = ["std"] } diff --git a/pallets/torus0/rpc/src/lib.rs b/pallets/torus0/rpc/src/lib.rs new file mode 100644 index 00000000..0b762463 --- /dev/null +++ b/pallets/torus0/rpc/src/lib.rs @@ -0,0 +1,68 @@ +use std::sync::Arc; + +use jsonrpsee::{core::RpcResult, types::ErrorObject}; +use pallet_torus0_api::{api::Torus0RuntimeApi, NamespacePathInner}; +use polkadot_sdk::{ + sp_api::ProvideRuntimeApi, + sp_blockchain::HeaderBackend, + sp_runtime::{ + traits::{IdentifyAccount, Verify}, + MultiSignature, + }, +}; +use torus_runtime::opaque::Block; + +type Signature = MultiSignature; +type AccountId = <::Signer as IdentifyAccount>::AccountId; +type Balance = u128; + +#[jsonrpsee::proc_macros::rpc(client, server)] +pub trait Torus0Api { + #[method(name = "torus0_namespacePathCreationCost")] + async fn namespace_path_creation_cost( + &self, + account_id: AccountId, + path: NamespacePathInner, + ) -> RpcResult<(Balance, Balance)>; +} + +pub struct Torus0Rpc { + client: Arc, +} + +impl Torus0Rpc { + pub fn new(client: Arc) -> Self { + Self { client } + } +} + +#[async_trait::async_trait] +impl Torus0ApiServer for Torus0Rpc +where + Client: ProvideRuntimeApi + HeaderBackend + Send + Sync + 'static, + Client::Api: Torus0RuntimeApi, +{ + async fn namespace_path_creation_cost( + &self, + account_id: AccountId, + path: NamespacePathInner, + ) -> RpcResult<(Balance, Balance)> { + let runtime = &*self.client.runtime_api(); + let at = self.client.info().best_hash; + + runtime + .namespace_path_creation_cost(at, account_id, path) + .map(|res| { + res.map_err(|err| { + ErrorObject::owned( + 1, + "namespace cost calculation failed", + Some(format!("{err:?}")), + ) + }) + }) + .map_err(|err| { + ErrorObject::owned(1, "Runtime execution failed", Some(err.to_string())) + })? + } +} diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index 11c55c46..21a3036e 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -394,33 +394,9 @@ pub mod pallet { Error::::NamespaceAlreadyExists ); - let mut paths_to_create = namespace_path.parents(); - paths_to_create.insert(0, namespace_path.clone()); - - let mut missing_paths = paths_to_create.as_slice(); - for (i, segment) in paths_to_create.iter().skip(1).enumerate().rev() { - if !Namespaces::::contains_key(&owner, segment) { - missing_paths = paths_to_create - .get(..i.saturating_add(1)) - .unwrap_or(&paths_to_create); - break; - } - } - - let current_count = NamespaceCount::::get(&owner); - - let pricing_config = NamespacePricingConfig::::get(); - let mut total_fee = BalanceOf::::zero(); - let mut total_deposit = BalanceOf::::zero(); - - for (index, path) in missing_paths.iter().enumerate() { - let count = current_count.saturating_add(index as u32); - let fee = pricing_config.namespace_fee(count)?; - let deposit = pricing_config.namespace_deposit(path); - - total_fee = total_fee.saturating_add(fee); - total_deposit = total_deposit.saturating_add(deposit); - } + let missing_paths = namespace::find_missing_paths::(&owner, &namespace_path); + let (total_fee, total_deposit) = + namespace::calculate_cost::(&owner, &missing_paths)?; T::Currency::reserve(&owner, total_deposit)?; @@ -433,6 +409,7 @@ pub mod pallet { .map_err(|_| crate::Error::::NotEnoughBalanceToRegisterAgent)?; let current_block = >::block_number(); + let pricing_config = crate::NamespacePricingConfig::::get(); for path in missing_paths.iter() { let deposit = pricing_config.namespace_deposit(path); diff --git a/pallets/torus0/src/namespace.rs b/pallets/torus0/src/namespace.rs index 44164a22..d149ca02 100644 --- a/pallets/torus0/src/namespace.rs +++ b/pallets/torus0/src/namespace.rs @@ -3,7 +3,7 @@ use polkadot_sdk::{ frame_support::{CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound}, frame_system::pallet_prelude::BlockNumberFor, sp_runtime::{ - traits::{One, Saturating}, + traits::{One, Saturating, Zero}, FixedPointNumber, FixedU128, }, }; @@ -112,3 +112,42 @@ pub struct NamespaceMetadata { /// Storage deposit paid for this namespace pub deposit: BalanceOf, } + +pub fn find_missing_paths( + owner: &T::AccountId, + path: &NamespacePath, +) -> Vec { + let mut paths_to_create = path.parents(); + paths_to_create.insert(0, path.clone()); + + for (i, segment) in paths_to_create.iter().enumerate().rev() { + if !Namespaces::::contains_key(owner, segment) { + return paths_to_create.get(..=i).unwrap_or_default().to_vec(); + } + } + + Default::default() +} + +/// Calculates the total cost for registering, (Fee, Deposit) +pub fn calculate_cost( + owner: &T::AccountId, + missing_paths: &[NamespacePath], +) -> Result<(BalanceOf, BalanceOf), DispatchError> { + let current_count = NamespaceCount::::get(owner); + + let pricing_config = crate::NamespacePricingConfig::::get(); + let mut total_fee = BalanceOf::::zero(); + let mut total_deposit = BalanceOf::::zero(); + + for (index, path) in missing_paths.iter().enumerate() { + let count = current_count.saturating_add(index as u32); + let fee = pricing_config.namespace_fee(count)?; + let deposit = pricing_config.namespace_deposit(path); + + total_fee = total_fee.saturating_add(fee); + total_deposit = total_deposit.saturating_add(deposit); + } + + Ok((total_fee, total_deposit)) +} diff --git a/pallets/torus0/tests/namespace.rs b/pallets/torus0/tests/namespace.rs index 63cf4cae..ad43b935 100644 --- a/pallets/torus0/tests/namespace.rs +++ b/pallets/torus0/tests/namespace.rs @@ -1,4 +1,7 @@ +#![allow(clippy::indexing_slicing)] + use pallet_torus0::namespace::NamespacePricingConfig; +use pallet_torus0_api::NamespacePath; use polkadot_sdk::sp_runtime::Percent; use test_utils::{as_tors, new_test_ext, Test}; @@ -49,7 +52,6 @@ fn namespace_fee_above_midpoint() { }; let fee_15 = config.namespace_fee(15).unwrap(); - dbg!(fee_15, config.fee_midpoint()); assert!(fee_15 > config.fee_midpoint()); let fee_20 = config.namespace_fee(20).unwrap(); @@ -301,3 +303,311 @@ fn namespace_fee_precision_handling() { assert!(fee_2 > fee_1); }); } + +#[test] +fn find_missing_paths_all_new() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + let path = "v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + + assert_eq!(missing.len(), 4); + assert_eq!(missing[0].as_bytes(), b"v1.compute.gpu.h100"); + assert_eq!(missing[1].as_bytes(), b"v1.compute.gpu"); + assert_eq!(missing[2].as_bytes(), b"v1.compute"); + assert_eq!(missing[3].as_bytes(), b"v1"); + }); +} + +#[test] +fn find_missing_paths_partial_exists() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + for segment in ["v1", "v1.compute"] { + let path: NamespacePath = segment.parse().unwrap(); + + pallet_torus0::Namespaces::::insert( + owner, + path, + pallet_torus0::namespace::NamespaceMetadata { + created_at: 0, + deposit: 100, + }, + ); + } + + let path = "v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + + assert_eq!(missing.len(), 2); + assert_eq!(missing[0].as_bytes(), b"v1.compute.gpu.h100"); + assert_eq!(missing[1].as_bytes(), b"v1.compute.gpu"); + }); +} + +#[test] +fn find_missing_paths_all_exists() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + for path in ["v1", "v1.compute", "v1.compute.gpu", "v1.compute.gpu.h100"] { + let path: NamespacePath = path.parse().unwrap(); + + pallet_torus0::Namespaces::::insert( + owner, + path, + pallet_torus0::namespace::NamespaceMetadata { + created_at: 0, + deposit: 100, + }, + ); + } + + let path = "v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + + assert_eq!(missing.len(), 0); + }); +} + +#[test] +fn find_missing_paths_single_segment() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + let path = "agent".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + + assert_eq!(missing.len(), 1); + assert_eq!(missing[0].as_bytes(), b"agent"); + }); +} + +#[test] +fn find_missing_paths_middle_exists() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + for path in ["v1", "v1.compute.gpu"] { + let path: NamespacePath = path.parse().unwrap(); + pallet_torus0::Namespaces::::insert( + owner, + path, + pallet_torus0::namespace::NamespaceMetadata { + created_at: 0, + deposit: 100, + }, + ); + } + + let path = "v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + + assert_eq!(missing.len(), 3); + assert_eq!(missing[0].as_bytes(), b"v1.compute.gpu.h100"); + assert_eq!(missing[1].as_bytes(), b"v1.compute.gpu"); + assert_eq!(missing[2].as_bytes(), b"v1.compute"); + }); +} + +#[test] +fn find_missing_paths_different_branches() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + for path in ["v1", "v1.storage", "v1.storage.disk"] { + let path: NamespacePath = path.parse().unwrap(); + + pallet_torus0::Namespaces::::insert( + owner, + path, + pallet_torus0::namespace::NamespaceMetadata { + created_at: 0, + deposit: 100, + }, + ); + } + + let path = "v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + + assert_eq!(missing.len(), 3); + assert_eq!(missing[0].as_bytes(), b"v1.compute.gpu.h100"); + assert_eq!(missing[1].as_bytes(), b"v1.compute.gpu"); + assert_eq!(missing[2].as_bytes(), b"v1.compute"); + }); +} + +#[test] +fn calculate_cost_no_existing_namespaces() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + let paths: &[NamespacePath] = &[ + "v1".parse().unwrap(), + "v1.compute".parse().unwrap(), + "v1.compute.gpu".parse().unwrap(), + ]; + + let (fee, deposit) = + pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + + // Using default config: base_fee = 5 TORS, deposit_per_byte = 5 TORS + // Fee calculation: each subsequent namespace has higher fee due to increasing count + // Count 0: fee_0, Count 1: fee_1, Count 2: fee_2 + assert!(fee > as_tors(15)); // 3 namespaces * min 5 TORS base fee + + // Deposit: "v1" = 2 bytes, "v1.compute" = 10 bytes, "v1.compute.gpu" = 14 bytes + // Total = 26 bytes * 5 TORS = 130 TORS + assert_eq!(deposit, as_tors(130)); + }); +} + +#[test] +fn calculate_cost_with_existing_namespaces() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + // Set namespace count to simulate existing namespaces + pallet_torus0::NamespaceCount::::insert(owner, 10); + + let paths: &[NamespacePath] = &["agent".parse().unwrap(), "agent.alice".parse().unwrap()]; + + let (fee, deposit) = + pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + + // Fee should be higher due to existing count of 10 + // Count 10: at midpoint (20), Count 11: above midpoint + let config = pallet_torus0::NamespacePricingConfig::::get(); + let fee_10 = config.namespace_fee(10).unwrap(); + let fee_11 = config.namespace_fee(11).unwrap(); + assert_eq!(fee, fee_10 + fee_11); + + // Deposit: "agent" = 5 bytes, "agent.alice" = 11 bytes + // Total = 16 bytes * 5 TORS = 80 TORS + assert_eq!(deposit, as_tors(80)); + }); +} + +#[test] +fn calculate_cost_progressive_fee_increase() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + // Create a long path to test progressive fee increase + let paths: &[NamespacePath] = &[ + "a".parse().unwrap(), + "a.b".parse().unwrap(), + "a.b.c".parse().unwrap(), + "a.b.c.d".parse().unwrap(), + "a.b.c.d.e".parse().unwrap(), + ]; + + let (fee, _deposit) = + pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + + // Verify progressive increase: calculate individual fees + let config = pallet_torus0::NamespacePricingConfig::::get(); + let mut expected_fee = 0u128; + for i in 0..5 { + expected_fee += config.namespace_fee(i as u32).unwrap(); + } + assert_eq!(fee, expected_fee); + }); +} + +#[test] +fn calculate_cost_empty_paths() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + let (fee, deposit) = pallet_torus0::namespace::calculate_cost::(&owner, &[]).unwrap(); + + assert_eq!(fee, 0); + assert_eq!(deposit, 0); + }); +} + +#[test] +fn calculate_cost_different_pricing_config() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + // Update pricing config + pallet_torus0::NamespacePricingConfig::::put(NamespacePricingConfig { + base_fee: as_tors(10), + deposit_per_byte: as_tors(2), + count_midpoint: 5, + fee_steepness: Percent::from_percent(50), + max_fee_multiplier: 10, + }); + + let paths: &[NamespacePath] = &["test".parse().unwrap(), "test.namespace".parse().unwrap()]; + + let (fee, deposit) = + pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + + // With higher base fee and steeper curve + assert!(fee > as_tors(20)); // 2 namespaces * min 10 TORS base fee + + // Deposit: "test" = 4 bytes, "test.namespace" = 14 bytes + // Total = 18 bytes * 2 TORS = 36 TORS + assert_eq!(deposit, as_tors(36)); + }); +} + +#[test] +fn calculate_cost_long_path_names() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + let paths: &[NamespacePath] = &[ + "very-long-namespace-name".parse().unwrap(), + "very-long-namespace-name.with-another-segment" + .parse() + .unwrap(), + ]; + + let (_fee, deposit) = + pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + + // Deposit calculation based on bytes + // "very-long-namespace-name" = 24 bytes + // "very-long-namespace-name.with-another-segment" = 45 bytes + // Total = 69 bytes * 5 TORS = 345 TORS + assert_eq!(deposit, as_tors(345)); + }); +} + +#[test] +fn calculate_cost_at_fee_ceiling() { + new_test_ext().execute_with(|| { + let owner = 1; + test_utils::register_empty_agent(owner); + + pallet_torus0::NamespaceCount::::insert(owner, 1000); + + let paths: &[NamespacePath] = &["test".parse().unwrap()]; + + let (fee, _deposit) = + pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + + // fee should be at ceiling because of high amount of registered entries + let config = pallet_torus0::NamespacePricingConfig::::get(); + assert_eq!(fee, config.fee_ceiling()); + }); +} diff --git a/runtime/src/apis.rs b/runtime/src/apis.rs index 1b09e7d7..df25d07d 100644 --- a/runtime/src/apis.rs +++ b/runtime/src/apis.rs @@ -307,7 +307,7 @@ impl_runtime_apis! { nonce: Option, estimate: bool, access_list: Option)>>, - ) -> Result { + ) -> Result { let config = if estimate { let mut config = ::config().clone(); config.estimate = true; @@ -471,4 +471,17 @@ impl_runtime_apis! { generate_root_stream_id(&account_id) } } + + impl pallet_torus0_api::api::Torus0RuntimeApi for Runtime { + fn namespace_path_creation_cost(account_id: AccountId, path: pallet_torus0_api::NamespacePathInner) -> Result<(Balance, Balance), DispatchError> { + use pallet_torus0::namespace; + use pallet_torus0_api::NamespacePath; + + let namespace_path = + NamespacePath::new(&path).map_err(|_| pallet_torus0::Error::::InvalidNamespacePath)?; + + let missing_paths = namespace::find_missing_paths::(&account_id, &namespace_path); + namespace::calculate_cost::(&account_id, &missing_paths) + } + } } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index e1e6493d..2bedf191 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -38,7 +38,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("torus-runtime"), impl_name: create_runtime_str!("torus-runtime"), authoring_version: 1, - spec_version: 18, + spec_version: 19, impl_version: 1, apis: apis::RUNTIME_API_VERSIONS, transaction_version: 1, From 04288e82ad5692430a50dc01fe215d0a19aa978d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Thu, 19 Jun 2025 14:05:24 -0300 Subject: [PATCH 35/46] feat: add curator agent freezing toggling (#109) Closes CHAIN-100 --- pallets/emission0/src/weights.rs | 8 +- pallets/governance/api/src/lib.rs | 4 + pallets/governance/src/benchmarking.rs | 12 ++ pallets/governance/src/lib.rs | 65 +++++++++ pallets/governance/src/weights.rs | 134 ++++++++++++++---- pallets/permission0/api/src/lib.rs | 10 +- pallets/permission0/src/lib.rs | 2 + pallets/permission0/src/permission/curator.rs | 12 +- pallets/permission0/src/weights.rs | 24 ++-- pallets/torus0/src/agent.rs | 5 + pallets/torus0/src/lib.rs | 9 ++ pallets/torus0/src/weights.rs | 36 ++--- pallets/torus0/tests/agent.rs | 17 +++ pallets/torus0/tests/namespace.rs | 21 ++- 14 files changed, 290 insertions(+), 69 deletions(-) diff --git a/pallets/emission0/src/weights.rs b/pallets/emission0/src/weights.rs index b1cbb4a1..39f9566a 100644 --- a/pallets/emission0/src/weights.rs +++ b/pallets/emission0/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_emission0` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-06-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-06-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `Luizs-MacBook-Pro.local`, CPU: `` +//! HOSTNAME: `MacBook-Pro-de-Joao.local`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -94,7 +94,7 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `333` // Estimated: `3529` - // Minimum execution time: 12_000_000 picoseconds. + // Minimum execution time: 11_000_000 picoseconds. Weight::from_parts(12_000_000, 3529) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -151,7 +151,7 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `333` // Estimated: `3529` - // Minimum execution time: 12_000_000 picoseconds. + // Minimum execution time: 11_000_000 picoseconds. Weight::from_parts(12_000_000, 3529) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) diff --git a/pallets/governance/api/src/lib.rs b/pallets/governance/api/src/lib.rs index 75092f8e..a7ac58d6 100644 --- a/pallets/governance/api/src/lib.rs +++ b/pallets/governance/api/src/lib.rs @@ -15,6 +15,10 @@ pub trait GovernanceApi { fn set_allocator(key: &AccountId); + fn can_create_namespace(key: &AccountId) -> bool; + + fn can_register_agent(key: &AccountId) -> bool; + #[doc(hidden)] #[cfg(feature = "runtime-benchmarks")] fn force_set_whitelisted(key: &AccountId); diff --git a/pallets/governance/src/benchmarking.rs b/pallets/governance/src/benchmarking.rs index 014e89a7..5969680c 100644 --- a/pallets/governance/src/benchmarking.rs +++ b/pallets/governance/src/benchmarking.rs @@ -266,4 +266,16 @@ mod benchmarks { data, ) } + + #[benchmark] + fn toggle_agent_freezing() { + #[extrinsic_call] + toggle_agent_freezing(RawOrigin::Signed(curator::())) + } + + #[benchmark] + fn toggle_namespace_freezing() { + #[extrinsic_call] + toggle_namespace_freezing(RawOrigin::Signed(curator::())) + } } diff --git a/pallets/governance/src/lib.rs b/pallets/governance/src/lib.rs index 01eb06c1..e2e99301 100644 --- a/pallets/governance/src/lib.rs +++ b/pallets/governance/src/lib.rs @@ -44,6 +44,7 @@ pub mod pallet { const STORAGE_VERSION: StorageVersion = StorageVersion::new(5); use pallet_permission0_api::{CuratorPermissions, Permission0Api, Permission0CuratorApi}; + use polkadot_sdk::sp_core::ConstBool; use proposal::GlobalParamsData; use weights::WeightInfo; @@ -101,6 +102,14 @@ pub mod pallet { pub type TreasuryEmissionFee = StorageValue<_, Percent, ValueQuery, T::DefaultTreasuryEmissionFee>; + /// Determines if new agents can be registered on the chain. + #[pallet::storage] + pub type AgentsFrozen = StorageValue<_, bool, ValueQuery, ConstBool>; + + /// Determines if new namespaces can be created on the chain. + #[pallet::storage] + pub type NamespacesFrozen = StorageValue<_, bool, ValueQuery, ConstBool>; + #[pallet::config] pub trait Config: polkadot_sdk::frame_system::Config + pallet_torus0::Config + pallet_emission0::Config @@ -378,6 +387,44 @@ pub mod pallet { Ok(()) } + + #[pallet::call_index(19)] + #[pallet::weight((::WeightInfo::toggle_agent_freezing(), DispatchClass::Normal, Pays::No))] + pub fn toggle_agent_freezing(origin: OriginFor) -> DispatchResult { + let curator = ::Permission0::ensure_curator_permission( + origin, + CuratorPermissions::AGENT_FREEZING_TOGGLING, + )?; + + let new_state = !crate::AgentsFrozen::::get(); + AgentsFrozen::::set(new_state); + + crate::Pallet::::deposit_event(crate::Event::AgentFreezingToggled { + curator, + new_state, + }); + + Ok(()) + } + + #[pallet::call_index(20)] + #[pallet::weight((::WeightInfo::toggle_namespace_freezing(), DispatchClass::Normal, Pays::No))] + pub fn toggle_namespace_freezing(origin: OriginFor) -> DispatchResult { + let curator = ::Permission0::ensure_curator_permission( + origin, + CuratorPermissions::NAMESPACE_FREEZING_TOGGLING, + )?; + + let new_state = !crate::NamespacesFrozen::::get(); + NamespacesFrozen::::set(new_state); + + crate::Pallet::::deposit_event(crate::Event::NamespaceFreezingToggled { + curator, + new_state, + }); + + Ok(()) + } } #[pallet::event] @@ -413,6 +460,16 @@ pub mod pallet { agent: T::AccountId, penalty: Percent, }, + /// The agent freezing feature was toggled by a curator. + AgentFreezingToggled { + curator: T::AccountId, + new_state: bool, + }, + /// The namespace freezing feature was toggled by a curator. + NamespaceFreezingToggled { + curator: T::AccountId, + new_state: bool, + }, } #[pallet::error] @@ -529,6 +586,14 @@ impl pallet_governance_api::GovernanceApi for Pallet Allocators::::insert(key, ()); } + fn can_create_namespace(key: &T::AccountId) -> bool { + !NamespacesFrozen::::get() || Self::is_whitelisted(key) + } + + fn can_register_agent(key: &T::AccountId) -> bool { + !AgentsFrozen::::get() || Self::is_whitelisted(key) + } + #[cfg(feature = "runtime-benchmarks")] fn force_set_whitelisted(key: &T::AccountId) { Whitelist::::insert(key, ()); diff --git a/pallets/governance/src/weights.rs b/pallets/governance/src/weights.rs index f27b1b82..83ada52d 100644 --- a/pallets/governance/src/weights.rs +++ b/pallets/governance/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_governance` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-06-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-06-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `Luizs-MacBook-Pro.local`, CPU: `` +//! HOSTNAME: `MacBook-Pro-de-Joao.local`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -54,6 +54,8 @@ pub trait WeightInfo { fn enable_vote_delegation() -> Weight; fn disable_vote_delegation() -> Weight; fn add_emission_proposal() -> Weight; + fn toggle_agent_freezing() -> Weight; + fn toggle_namespace_freezing() -> Weight; } /// Weights for `pallet_governance` using the Substrate node and recommended hardware. @@ -65,7 +67,7 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `3497` - // Minimum execution time: 4_000_000 picoseconds. + // Minimum execution time: 5_000_000 picoseconds. Weight::from_parts(5_000_000, 3497) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -77,7 +79,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `62` // Estimated: `3497` // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(6_000_000, 3497) + Weight::from_parts(7_000_000, 3497) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -139,8 +141,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `306` // Estimated: `6196` - // Minimum execution time: 59_000_000 picoseconds. - Weight::from_parts(60_000_000, 6196) + // Minimum execution time: 60_000_000 picoseconds. + Weight::from_parts(62_000_000, 6196) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -164,8 +166,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `469` // Estimated: `11000` - // Minimum execution time: 77_000_000 picoseconds. - Weight::from_parts(78_000_000, 11000) + // Minimum execution time: 78_000_000 picoseconds. + Weight::from_parts(79_000_000, 11000) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(8_u64)) } @@ -203,7 +205,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `160` // Estimated: `11000` // Minimum execution time: 29_000_000 picoseconds. - Weight::from_parts(29_000_000, 11000) + Weight::from_parts(30_000_000, 11000) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -219,8 +221,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `205` // Estimated: `6196` - // Minimum execution time: 54_000_000 picoseconds. - Weight::from_parts(55_000_000, 6196) + // Minimum execution time: 55_000_000 picoseconds. + Weight::from_parts(56_000_000, 6196) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -254,7 +256,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `204` // Estimated: `6196` // Minimum execution time: 54_000_000 picoseconds. - Weight::from_parts(54_000_000, 6196) + Weight::from_parts(55_000_000, 6196) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -270,7 +272,7 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `316` // Estimated: `6100` - // Minimum execution time: 22_000_000 picoseconds. + // Minimum execution time: 23_000_000 picoseconds. Weight::from_parts(23_000_000, 6100) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -320,11 +322,49 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `204` // Estimated: `6196` - // Minimum execution time: 53_000_000 picoseconds. - Weight::from_parts(55_000_000, 6196) + // Minimum execution time: 55_000_000 picoseconds. + Weight::from_parts(56_000_000, 6196) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Governance::AgentsFrozen` (r:1 w:1) + /// Proof: `Governance::AgentsFrozen` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + fn toggle_agent_freezing() -> Weight { + // Proof Size summary in bytes: + // Measured: `48` + // Estimated: `11000` + // Minimum execution time: 25_000_000 picoseconds. + Weight::from_parts(26_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Governance::NamespacesFrozen` (r:1 w:1) + /// Proof: `Governance::NamespacesFrozen` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + fn toggle_namespace_freezing() -> Weight { + // Proof Size summary in bytes: + // Measured: `48` + // Estimated: `11000` + // Minimum execution time: 26_000_000 picoseconds. + Weight::from_parts(27_000_000, 11000) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) + } } // For backwards compatibility and tests. @@ -335,7 +375,7 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6` // Estimated: `3497` - // Minimum execution time: 4_000_000 picoseconds. + // Minimum execution time: 5_000_000 picoseconds. Weight::from_parts(5_000_000, 3497) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) @@ -347,7 +387,7 @@ impl WeightInfo for () { // Measured: `62` // Estimated: `3497` // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(6_000_000, 3497) + Weight::from_parts(7_000_000, 3497) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -409,8 +449,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `306` // Estimated: `6196` - // Minimum execution time: 59_000_000 picoseconds. - Weight::from_parts(60_000_000, 6196) + // Minimum execution time: 60_000_000 picoseconds. + Weight::from_parts(62_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -434,8 +474,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `469` // Estimated: `11000` - // Minimum execution time: 77_000_000 picoseconds. - Weight::from_parts(78_000_000, 11000) + // Minimum execution time: 78_000_000 picoseconds. + Weight::from_parts(79_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(8_u64)) } @@ -473,7 +513,7 @@ impl WeightInfo for () { // Measured: `160` // Estimated: `11000` // Minimum execution time: 29_000_000 picoseconds. - Weight::from_parts(29_000_000, 11000) + Weight::from_parts(30_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -489,8 +529,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `205` // Estimated: `6196` - // Minimum execution time: 54_000_000 picoseconds. - Weight::from_parts(55_000_000, 6196) + // Minimum execution time: 55_000_000 picoseconds. + Weight::from_parts(56_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -524,7 +564,7 @@ impl WeightInfo for () { // Measured: `204` // Estimated: `6196` // Minimum execution time: 54_000_000 picoseconds. - Weight::from_parts(54_000_000, 6196) + Weight::from_parts(55_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -540,7 +580,7 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `316` // Estimated: `6100` - // Minimum execution time: 22_000_000 picoseconds. + // Minimum execution time: 23_000_000 picoseconds. Weight::from_parts(23_000_000, 6100) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) @@ -590,9 +630,47 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `204` // Estimated: `6196` - // Minimum execution time: 53_000_000 picoseconds. - Weight::from_parts(55_000_000, 6196) + // Minimum execution time: 55_000_000 picoseconds. + Weight::from_parts(56_000_000, 6196) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Governance::AgentsFrozen` (r:1 w:1) + /// Proof: `Governance::AgentsFrozen` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + fn toggle_agent_freezing() -> Weight { + // Proof Size summary in bytes: + // Measured: `48` + // Estimated: `11000` + // Minimum execution time: 25_000_000 picoseconds. + Weight::from_parts(26_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) + } + /// Storage: `Permission0::PermissionsByGrantee` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantee` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Permission0::Permissions` (r:1 w:1) + /// Proof: `Permission0::Permissions` (`max_values`: None, `max_size`: Some(7535), added: 10010, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByParticipants` (r:1 w:1) + /// Proof: `Permission0::PermissionsByParticipants` (`max_values`: None, `max_size`: Some(3266), added: 5741, mode: `MaxEncodedLen`) + /// Storage: `Permission0::PermissionsByGrantor` (r:1 w:1) + /// Proof: `Permission0::PermissionsByGrantor` (`max_values`: None, `max_size`: Some(3234), added: 5709, mode: `MaxEncodedLen`) + /// Storage: `Governance::NamespacesFrozen` (r:1 w:1) + /// Proof: `Governance::NamespacesFrozen` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + fn toggle_namespace_freezing() -> Weight { + // Proof Size summary in bytes: + // Measured: `48` + // Estimated: `11000` + // Minimum execution time: 26_000_000 picoseconds. + Weight::from_parts(27_000_000, 11000) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) + } } diff --git a/pallets/permission0/api/src/lib.rs b/pallets/permission0/api/src/lib.rs index 733b38f8..06fb392b 100644 --- a/pallets/permission0/api/src/lib.rs +++ b/pallets/permission0/api/src/lib.rs @@ -129,11 +129,15 @@ bitflags::bitflags! { #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct CuratorPermissions: u32 { /// Permission to review and process agent applications - const APPLICATION_REVIEW = 0b0000_0010; + const APPLICATION_REVIEW = 0b0000_0010; /// Permission to manage the whitelist (add/remove accounts) - const WHITELIST_MANAGE = 0b0000_0100; + const WHITELIST_MANAGE = 0b0000_0100; /// Permission to apply penalty factors to agents - const PENALTY_CONTROL = 0b0000_1000; + const PENALTY_CONTROL = 0b0000_1000; + /// Permission to toggle agent freezing + const AGENT_FREEZING_TOGGLING = 0b0001_0000; + /// Permission to toggle namespace freezing + const NAMESPACE_FREEZING_TOGGLING = 0b0010_0000; } } diff --git a/pallets/permission0/src/lib.rs b/pallets/permission0/src/lib.rs index 759bce4a..ca7f0b80 100644 --- a/pallets/permission0/src/lib.rs +++ b/pallets/permission0/src/lib.rs @@ -304,6 +304,8 @@ pub mod pallet { NotAuthorizedToEdit, /// Stream emission permission is not editable NotEditable, + /// Namespace creation was disabled by a curator. + NamespaceCreationDisabled, } #[pallet::hooks] diff --git a/pallets/permission0/src/permission/curator.rs b/pallets/permission0/src/permission/curator.rs index 0f26413e..232f199c 100644 --- a/pallets/permission0/src/permission/curator.rs +++ b/pallets/permission0/src/permission/curator.rs @@ -25,13 +25,17 @@ bitflags! { impl CuratorPermissions: u32 { /// Able to appoint other curators. Though not used at the moment, /// it will be valuable when we remove the SUDO key/multisig. - const ROOT = 0b0000_0001; + const ROOT = 0b0000_0001; /// Permission to review and process agent applications - const APPLICATION_REVIEW = 0b0000_0010; + const APPLICATION_REVIEW = 0b0000_0010; /// Permission to manage the whitelist (add/remove accounts) - const WHITELIST_MANAGE = 0b0000_0100; + const WHITELIST_MANAGE = 0b0000_0100; /// Permission to apply penalty factors to agents - const PENALTY_CONTROL = 0b0000_1000; + const PENALTY_CONTROL = 0b0000_1000; + /// Permission to toggle agent freezing + const AGENT_FREEZING_TOGGLING = 0b0001_0000; + /// Permission to toggle namespace freezing + const NAMESPACE_FREEZING_TOGGLING = 0b0010_0000; } } diff --git a/pallets/permission0/src/weights.rs b/pallets/permission0/src/weights.rs index e7890eba..f88c179b 100644 --- a/pallets/permission0/src/weights.rs +++ b/pallets/permission0/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_permission0` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-06-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-06-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `Luizs-MacBook-Pro.local`, CPU: `` +//! HOSTNAME: `MacBook-Pro-de-Joao.local`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -67,7 +67,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `279` // Estimated: `11000` // Minimum execution time: 35_000_000 picoseconds. - Weight::from_parts(36_000_000, 11000) + Weight::from_parts(35_000_000, 11000) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -87,8 +87,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `590` // Estimated: `11000` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(32_000_000, 11000) + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 11000) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -133,7 +133,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `583` // Estimated: `11000` // Minimum execution time: 47_000_000 picoseconds. - Weight::from_parts(48_000_000, 11000) + Weight::from_parts(47_000_000, 11000) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -143,7 +143,7 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `356` // Estimated: `11000` - // Minimum execution time: 17_000_000 picoseconds. + // Minimum execution time: 16_000_000 picoseconds. Weight::from_parts(17_000_000, 11000) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -186,7 +186,7 @@ impl WeightInfo for () { // Measured: `279` // Estimated: `11000` // Minimum execution time: 35_000_000 picoseconds. - Weight::from_parts(36_000_000, 11000) + Weight::from_parts(35_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -206,8 +206,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `590` // Estimated: `11000` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(32_000_000, 11000) + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -252,7 +252,7 @@ impl WeightInfo for () { // Measured: `583` // Estimated: `11000` // Minimum execution time: 47_000_000 picoseconds. - Weight::from_parts(48_000_000, 11000) + Weight::from_parts(47_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -262,7 +262,7 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `356` // Estimated: `11000` - // Minimum execution time: 17_000_000 picoseconds. + // Minimum execution time: 16_000_000 picoseconds. Weight::from_parts(17_000_000, 11000) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index 725f72a0..5b794bd8 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -56,6 +56,11 @@ pub fn register( let span = debug_span!("register", agent.key = ?agent_key); let _guard = span.enter(); + ensure!( + ::Governance::can_register_agent(&payer), + crate::pallet::Error::::AgentsFrozen + ); + ensure!( !exists::(&agent_key), crate::Error::::AgentAlreadyRegistered diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index 21a3036e..7a55177e 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -381,6 +381,11 @@ pub mod pallet { pub fn create_namespace(origin: OriginFor, path: NamespacePathInner) -> DispatchResult { let owner = ensure_signed(origin)?; + ensure!( + ::Governance::can_create_namespace(&owner), + Error::::NamespacesFrozen + ); + ensure!( Agents::::contains_key(&owner), Error::::AgentDoesNotExist @@ -618,6 +623,10 @@ pub mod pallet { NamespaceDepthExceeded, /// The namespace is being delegated through a permission. Revoke that first. NamespaceBeingDelegated, + /// Agent Creation was disabled by a curator. + AgentsFrozen, + /// Namespace Creation was disabled by a curator. + NamespacesFrozen, } } diff --git a/pallets/torus0/src/weights.rs b/pallets/torus0/src/weights.rs index d9695695..2a6b03ab 100644 --- a/pallets/torus0/src/weights.rs +++ b/pallets/torus0/src/weights.rs @@ -2,9 +2,9 @@ //! Autogenerated weights for `pallet_torus0` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 43.0.0 -//! DATE: 2025-06-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-06-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `Luizs-MacBook-Pro.local`, CPU: `` +//! HOSTNAME: `MacBook-Pro-de-Joao.local`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -66,8 +66,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `268` // Estimated: `4322` - // Minimum execution time: 29_000_000 picoseconds. - Weight::from_parts(30_000_000, 4322) + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 4322) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -88,7 +88,7 @@ impl WeightInfo for SubstrateWeight { // Measured: `514` // Estimated: `4322` // Minimum execution time: 35_000_000 picoseconds. - Weight::from_parts(35_000_000, 4322) + Weight::from_parts(36_000_000, 4322) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -113,6 +113,8 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } + /// Storage: `Governance::AgentsFrozen` (r:1 w:0) + /// Proof: `Governance::AgentsFrozen` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:1) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) /// Storage: `Torus0::RegistrationsThisBlock` (r:1 w:1) @@ -141,9 +143,9 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `68` // Estimated: `4322` - // Minimum execution time: 25_000_000 picoseconds. - Weight::from_parts(26_000_000, 4322) - .saturating_add(T::DbWeight::get().reads(12_u64)) + // Minimum execution time: 26_000_000 picoseconds. + Weight::from_parts(27_000_000, 4322) + .saturating_add(T::DbWeight::get().reads(13_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Torus0::Agents` (r:1 w:1) @@ -175,7 +177,7 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `155` // Estimated: `4322` - // Minimum execution time: 18_000_000 picoseconds. + // Minimum execution time: 19_000_000 picoseconds. Weight::from_parts(19_000_000, 4322) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -210,8 +212,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `268` // Estimated: `4322` - // Minimum execution time: 29_000_000 picoseconds. - Weight::from_parts(30_000_000, 4322) + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(31_000_000, 4322) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -232,7 +234,7 @@ impl WeightInfo for () { // Measured: `514` // Estimated: `4322` // Minimum execution time: 35_000_000 picoseconds. - Weight::from_parts(35_000_000, 4322) + Weight::from_parts(36_000_000, 4322) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -257,6 +259,8 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } + /// Storage: `Governance::AgentsFrozen` (r:1 w:0) + /// Proof: `Governance::AgentsFrozen` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Torus0::Agents` (r:1 w:1) /// Proof: `Torus0::Agents` (`max_values`: None, `max_size`: Some(857), added: 3332, mode: `MaxEncodedLen`) /// Storage: `Torus0::RegistrationsThisBlock` (r:1 w:1) @@ -285,9 +289,9 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `68` // Estimated: `4322` - // Minimum execution time: 25_000_000 picoseconds. - Weight::from_parts(26_000_000, 4322) - .saturating_add(RocksDbWeight::get().reads(12_u64)) + // Minimum execution time: 26_000_000 picoseconds. + Weight::from_parts(27_000_000, 4322) + .saturating_add(RocksDbWeight::get().reads(13_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Torus0::Agents` (r:1 w:1) @@ -319,7 +323,7 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `155` // Estimated: `4322` - // Minimum execution time: 18_000_000 picoseconds. + // Minimum execution time: 19_000_000 picoseconds. Weight::from_parts(19_000_000, 4322) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index b0020c3f..20c0807a 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -636,3 +636,20 @@ fn fails_updating_whitout_waiting_cooldown() { ); }); } + +#[test] +fn agent_freezing() { + test_utils::new_test_ext().execute_with(|| { + pallet_governance::AgentsFrozen::::set(true); + assert_err!( + pallet_torus0::Pallet::::register_agent( + get_origin(0), + 0, + b"agent name".to_vec(), + b"agent url".to_vec(), + vec![], + ), + pallet_torus0::Error::::AgentsFrozen + ); + }); +} diff --git a/pallets/torus0/tests/namespace.rs b/pallets/torus0/tests/namespace.rs index ad43b935..391e117a 100644 --- a/pallets/torus0/tests/namespace.rs +++ b/pallets/torus0/tests/namespace.rs @@ -2,8 +2,11 @@ use pallet_torus0::namespace::NamespacePricingConfig; use pallet_torus0_api::NamespacePath; -use polkadot_sdk::sp_runtime::Percent; -use test_utils::{as_tors, new_test_ext, Test}; +use polkadot_sdk::{ + frame_support::assert_err, + sp_runtime::{BoundedVec, Percent}, +}; +use test_utils::{as_tors, get_origin, new_test_ext, pallet_governance, Test}; #[test] fn namespace_fee_at_midpoint() { @@ -611,3 +614,17 @@ fn calculate_cost_at_fee_ceiling() { assert_eq!(fee, config.fee_ceiling()); }); } + +#[test] +fn namespace_freezing() { + new_test_ext().execute_with(|| { + pallet_governance::NamespacesFrozen::::set(true); + assert_err!( + pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"new.namespace".to_vec()) + ), + pallet_torus0::Error::::NamespacesFrozen + ); + }); +} From 6de5cb29be3395dcbf553e276b4278f2045b698e Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Fri, 20 Jun 2025 09:19:29 -0300 Subject: [PATCH 36/46] fix(permission0): allow grantor to delegate emission to itself (#107) After discussing how the emissions will be initially used, it was clear to us that there are no cases where it makes sense to delegate emissions permission to another agent. In this case, the best way to delegate is to itself, which allows the agent to control how the emissions will flow and edit the targets at will. --- justfile | 7 +- pallets/permission0/src/ext/emission_impl.rs | 22 ++-- pallets/permission0/tests/stream.rs | 106 +++++++++++++++++-- runtime/src/lib.rs | 2 +- 4 files changed, 114 insertions(+), 23 deletions(-) diff --git a/justfile b/justfile index f6303738..9b36f97a 100644 --- a/justfile +++ b/justfile @@ -1,4 +1,4 @@ -default: check test +default: fmt check test # Build @@ -11,11 +11,14 @@ build-testnet: # Development check: - cargo clippy + cargo clippy --tests test: cargo test +fmt: + cargo fmt + run-localnode profile="--alice": cargo xtask run local {{profile}} diff --git a/pallets/permission0/src/ext/emission_impl.rs b/pallets/permission0/src/ext/emission_impl.rs index 497c14ca..aed7fbc6 100644 --- a/pallets/permission0/src/ext/emission_impl.rs +++ b/pallets/permission0/src/ext/emission_impl.rs @@ -131,7 +131,6 @@ pub(crate) fn grant_emission_permission_impl( T::Torus::is_agent_registered(&grantee), Error::::NotRegisteredAgent ); - ensure!(grantor != grantee, Error::::SelfPermissionNotAllowed); validate_emission_permission_target_weights::(&targets)?; @@ -346,15 +345,11 @@ pub(crate) fn update_emission_permission( return Err(Error::::PermissionNotFound.into()); }; - if permission.grantor == who { - if !permission.is_updatable() { - return Err(Error::::NotEditable.into()); - } - } else if permission.grantee == who { - if new_streams.is_some() || new_distribution_control.is_some() { - return Err(Error::::NotAuthorizedToEdit.into()); - } - } else { + let allowed_grantor = permission.grantor == who && permission.is_updatable(); + let allowed_grantee = + permission.grantee == who && (new_streams.is_none() && new_distribution_control.is_none()); + + if !allowed_grantor && !allowed_grantee { return Err(Error::::NotAuthorizedToEdit.into()); } @@ -386,6 +381,13 @@ pub(crate) fn update_emission_permission( validate_emission_permission_streams::(&new_streams, &permission.grantor)?; + for stream in new_streams.keys() { + AccumulatedStreamAmounts::::set( + (&permission.grantor, stream, permission_id), + Some(Zero::zero()), + ) + } + *streams = new_streams; } diff --git a/pallets/permission0/tests/stream.rs b/pallets/permission0/tests/stream.rs index 6b08b565..426c9bf0 100644 --- a/pallets/permission0/tests/stream.rs +++ b/pallets/permission0/tests/stream.rs @@ -338,7 +338,7 @@ fn grantor_cannot_change_irrevocable_permission() { None, None ), - pallet_permission0::Error::::NotEditable + pallet_permission0::Error::::NotAuthorizedToEdit ); }); } @@ -401,7 +401,7 @@ fn grantor_cannot_change_arbiter_permission() { None, None ), - pallet_permission0::Error::::NotEditable + pallet_permission0::Error::::NotAuthorizedToEdit ); }); } @@ -461,7 +461,7 @@ fn grantor_cannot_change_permission_before_block() { None, None ), - pallet_permission0::Error::::NotEditable + pallet_permission0::Error::::NotAuthorizedToEdit ); step_block(6); @@ -575,10 +575,9 @@ fn updating_works() { add_balance(agent_0, as_tors(10) + 1); - let stream_id = generate_root_stream_id(&agent_0); - + let stream = generate_root_stream_id(&agent_0); let mut streams = BTreeMap::new(); - streams.insert(stream_id, Percent::from_percent(100)); + streams.insert(stream, Percent::from_percent(100)); let permission_id = assert_ok!(grant_emission_permission( agent_0, @@ -597,19 +596,23 @@ fn updating_works() { assert!(AccumulatedStreamAmounts::::contains_key(( &agent_0, - &stream_id, + &stream, &permission_id ))); let mut new_targets = BoundedBTreeMap::new(); - new_targets.try_insert(agent_0, u16::MAX).unwrap(); + new_targets.try_insert(agent_1, u16::MAX).unwrap(); + + let new_stream = generate_root_stream_id(&agent_1); + let mut new_streams = BTreeMap::new(); + new_streams.insert(new_stream, Percent::from_percent(100)); assert_ok!( pallet_permission0::Pallet::::update_emission_permission( get_origin(agent_0), permission_id, new_targets.clone(), - Some(streams.clone().try_into().unwrap()), + Some(new_streams.clone().try_into().unwrap()), Some(pallet_permission0::DistributionControl::Interval(100)) ) ); @@ -624,9 +627,21 @@ fn updating_works() { assert_eq!( emission_scope.allocation, - pallet_permission0::EmissionAllocation::Streams(streams.try_into().unwrap()) + pallet_permission0::EmissionAllocation::Streams(new_streams.try_into().unwrap()) ); + assert!(!AccumulatedStreamAmounts::::contains_key(( + &agent_0, + &stream, + &permission_id + ))); + + assert!(AccumulatedStreamAmounts::::contains_key(( + &agent_0, + new_stream, + &permission_id, + ))); + assert_eq!( emission_scope.distribution, pallet_permission0::DistributionControl::Interval(100) @@ -635,3 +650,74 @@ fn updating_works() { assert_eq!(emission_scope.targets, new_targets); }); } + +#[test] +fn update_prevents_overarching_update_when_grantor_is_grantee() { + test_utils::new_test_ext().execute_with(|| { + zero_min_burn(); + let agent_0 = 0; + register_empty_agent(agent_0); + + let agent_1 = 1; + register_empty_agent(agent_1); + + let agent_2 = 1; + register_empty_agent(agent_2); + + let agent_3 = 1; + register_empty_agent(agent_3); + + add_balance(agent_0, as_tors(10) + 1); + + let stream_id = generate_root_stream_id(&agent_0); + let mut streams = BTreeMap::new(); + streams.insert(stream_id, Percent::from_percent(100)); + + let permission_id = assert_ok!(grant_emission_permission( + agent_0, + agent_0, + pallet_permission0_api::EmissionAllocation::Streams(streams.clone()), + vec![(agent_1, u16::MAX)], + pallet_permission0_api::DistributionControl::Manual, + pallet_permission0_api::PermissionDuration::Indefinite, + pallet_permission0_api::RevocationTerms::RevocableAfter(5), + pallet_permission0_api::EnforcementAuthority::None, + )); + + let mut new_targets = BoundedBTreeMap::new(); + new_targets.try_insert(agent_1, u16::MAX).unwrap(); + + assert_err!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_0), + permission_id, + new_targets.clone(), + Some(BoundedBTreeMap::new()), + None + ), + pallet_permission0::Error::::NotAuthorizedToEdit + ); + + assert_ok!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_0), + permission_id, + new_targets.clone(), + None, + None + ) + ); + + step_block(6); + + assert_ok!( + pallet_permission0::Pallet::::update_emission_permission( + get_origin(agent_0), + permission_id, + new_targets.clone(), + Some(streams.clone().try_into().unwrap()), + Some(pallet_permission0::DistributionControl::Interval(100)) + ) + ); + }); +} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 2bedf191..b14cf825 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -38,7 +38,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("torus-runtime"), impl_name: create_runtime_str!("torus-runtime"), authoring_version: 1, - spec_version: 19, + spec_version: 20, impl_version: 1, apis: apis::RUNTIME_API_VERSIONS, transaction_version: 1, From a94678e562213b8d84977bee46dcf5be61b3139f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:26:31 -0300 Subject: [PATCH 37/46] docs: add testnet deploy steps doc (#94) Adds a doc containing the steps needed to deploy the runtime. --- docs/deploy.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 docs/deploy.md diff --git a/docs/deploy.md b/docs/deploy.md new file mode 100644 index 00000000..799f081f --- /dev/null +++ b/docs/deploy.md @@ -0,0 +1,22 @@ +# Deploy steps + +1. Checkout to the commit/branch that should be deployed with `git checkout `. +2. Do some last code checks. + - Make sure all tests pass by running `cargo test` + - Make sure the runtime migrations work by running `just try-runtime-upgrade-{testnet,mainnet}` +3. Create the release tag following the format `runtime/{test,main}net-{spec_version}`. Example: runtime/testnet-12 (the spec version can be found in `runtime/src/lib.rs` under the `runtime_macro!` call). This will trigger a Github Action that builds the runtime WASM binary. + - The `spec_version` should ALWAYS be the higher number between the latest releases for mainnet and testnet + 1. Example: Latest testnet is 13 and mainnet is 9, the next release should be 14. + - Make sure to check if the spec_version on the code is correct and change it if it's not. +5. Download said runtime binary and check it's checksum. + - The .zip file can be found on the `Artifacts` section of the Action that built it. Search for your commit message that has `Build Torus runtime` written below it on [this page](https://github.com/renlabs-dev/torus-substrate/actions). The correct file name is `torus_runtime.compact.compressed`. + - Check that the hash given by the command `sha256sum ` is the same as the one beside the download button on the action page, on the `Digest` column. + - The WASM blob to be used on the next steps is inside the downloaded zipped file. Extract it somewhere easy to find later. +6. Connect the Torus Testnet Root account to [Polkadot Developer Interface](https://polkadot.js.org/apps/#/explorer) using the [PolkadotJS browser extension](https://polkadot.js.org/extension/). + - Make sure the interface is configured to point to the right net by clicking on the left sidebar, scrolling all the way to the bottom and under the development tab it should be Custom with the address `wss://api.testnet.torus.network` (for testnet) or `wss://api.torus.network` (for mainnet). For testnet, it can also be checked through the `rpc=` query param, it should be something like this `?rpc=wss%3A%2F%2Fapi.testnet.torus.network` (the testnet api endpoint url encoded). +7. Upload the code to the runtime using the [Polkadot Developer Interface](https://polkadot.js.org/apps/#/explorer). + - Click on the `Sudo` button under the `Developer` tab. + - Select the `system` pallet and the `setCode` extrinsic. + - Select the .wasm file extracted on the 4th step. + - Sign and Submit. + +> As of april 9th 2025 the try-runtime cli is broken, install the fork by running `cargo install --git https://github.com/renlabs-dev/try-runtime-cli --locked`. From 10b4a0f9b7131d66edfbae13fecb88e7522f3d22 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Fri, 20 Jun 2025 17:03:50 -0300 Subject: [PATCH 38/46] chore: update burn parameters (#110) This change updates the burn parameters as well as namespace fees. Closes CHAIN-101. --- pallets/permission0/src/permission.rs | 4 +--- pallets/torus0/src/lib.rs | 2 +- pallets/torus0/src/migrations.rs | 25 +++++++++++++++++++++++++ runtime/src/configs.rs | 8 ++++---- runtime/src/lib.rs | 1 + 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/pallets/permission0/src/permission.rs b/pallets/permission0/src/permission.rs index 3d6d54f8..229dc825 100644 --- a/pallets/permission0/src/permission.rs +++ b/pallets/permission0/src/permission.rs @@ -40,9 +40,7 @@ pub fn generate_permission_id( data.extend(>::block_number().encode()); - if !cfg!(debug_assertions) { - let extrinsic_index = >::extrinsic_index() - .ok_or(Error::::PermissionCreationOutsideExtrinsic)?; + if let Some(extrinsic_index) = >::extrinsic_index() { data.extend(extrinsic_index.encode()); } diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index 7a55177e..d6525822 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -34,7 +34,7 @@ use crate::{agent::Agent, burn::BurnConfiguration, fee::ValidatorFeeConstraints} #[frame::pallet] pub mod pallet { - const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(5); use frame::prelude::BlockNumberFor; use pallet_emission0_api::Emission0Api; diff --git a/pallets/torus0/src/migrations.rs b/pallets/torus0/src/migrations.rs index d3437b7c..8bf99d89 100644 --- a/pallets/torus0/src/migrations.rs +++ b/pallets/torus0/src/migrations.rs @@ -80,3 +80,28 @@ pub mod v4 { } } } + +pub mod v5 { + use polkadot_sdk::{ + frame_support::{migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade}, + sp_weights::Weight, + }; + + use crate::{burn::BurnConfiguration, BurnConfig, Config, Pallet}; + + pub type Migration = VersionedMigration<4, 5, MigrateToV5, Pallet, W>; + pub struct MigrateToV5(core::marker::PhantomData); + + impl UncheckedOnRuntimeUpgrade for MigrateToV5 { + fn on_runtime_upgrade() -> Weight { + BurnConfig::::set(BurnConfiguration { + min_burn: 15000000000000000000, // 15tors + max_burn: 1000000000000000000000, // 1000tors + max_registrations_per_interval: 16, + ..BurnConfig::::get() + }); + + Weight::default() + } + } +} diff --git a/runtime/src/configs.rs b/runtime/src/configs.rs index abd7f045..46ea918e 100644 --- a/runtime/src/configs.rs +++ b/runtime/src/configs.rs @@ -311,11 +311,11 @@ parameter_types! { pub NamespaceDepositPerByte: Balance = as_tors(1); pub DefaultNamespacePricingConfig: pallet_torus0::namespace::NamespacePricingConfig = pallet_torus0::namespace::NamespacePricingConfig { - base_fee: as_tors(5), - deposit_per_byte: as_tors(5), + base_fee: as_tors(3), + deposit_per_byte: as_tors(1).saturating_div(5), - count_midpoint: 15, - fee_steepness: Percent::from_percent(25), + count_midpoint: 35, + fee_steepness: Percent::from_percent(10), max_fee_multiplier: 3, }; } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index b14cf825..44e29df1 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -92,6 +92,7 @@ type Migrations = ( pallet_emission0::migrations::v2::Migration, pallet_torus0::migrations::v3::Migration, pallet_torus0::migrations::v4::Migration, + pallet_torus0::migrations::v5::Migration, ); /// Executive: handles dispatch to the various modules. From a9dba2b8a04ca1a19c11fcaaccaa6ee73c57233d Mon Sep 17 00:00:00 2001 From: DaviPtrs Date: Sat, 21 Jun 2025 15:18:47 +0200 Subject: [PATCH 39/46] use Ubicloud --- .github/workflows/build-docker-node.yml | 2 +- .github/workflows/build-docker-xtask.yml | 2 +- .github/workflows/build-docs.yml | 2 +- .github/workflows/build-runtime.yml | 2 +- .github/workflows/check.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-docker-node.yml b/.github/workflows/build-docker-node.yml index c0f50f18..987d68a4 100644 --- a/.github/workflows/build-docker-node.yml +++ b/.github/workflows/build-docker-node.yml @@ -17,7 +17,7 @@ concurrency: jobs: build-n-push: permissions: write-all - runs-on: ubuntu-22.04-32core-karl + runs-on: ubicloud-standard-16 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/build-docker-xtask.yml b/.github/workflows/build-docker-xtask.yml index 06caeaaa..6dadb848 100644 --- a/.github/workflows/build-docker-xtask.yml +++ b/.github/workflows/build-docker-xtask.yml @@ -16,7 +16,7 @@ jobs: permissions: contents: read packages: write - runs-on: ubuntu-latest + runs-on: ubicloud-standard-2 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 4a76f48c..70373bc3 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -11,7 +11,7 @@ jobs: contents: read id-token: write pages: write - runs-on: ubuntu-latest + runs-on: ubicloud-standard-2 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/build-runtime.yml b/.github/workflows/build-runtime.yml index f0705ec9..49cd79d3 100755 --- a/.github/workflows/build-runtime.yml +++ b/.github/workflows/build-runtime.yml @@ -16,7 +16,7 @@ concurrency: jobs: build: - runs-on: ubuntu-22.04-32core-karl + runs-on: ubicloud-standard-16 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index da0b67fe..75e0b33f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -18,7 +18,7 @@ jobs: checks: write contents: write - runs-on: ubuntu-24.04-8core-bakunin + runs-on: ubicloud-standard-8 steps: - uses: actions/checkout@v4 From beb3529824587ecca54380e9730d6ab9ed3b0f63 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 23 Jun 2025 12:53:57 -0300 Subject: [PATCH 40/46] refac(torus0/namespace): require agent prefix (#111) --- .github/workflows/build-runtime.yml | 3 +- docs/namespace.md | 5 +- justfile | 2 +- pallets/permission0/src/ext/namespace_impl.rs | 3 +- pallets/torus0/Cargo.toml | 2 +- pallets/torus0/api/Cargo.toml | 7 +- pallets/torus0/api/src/lib.rs | 116 +++-- pallets/torus0/src/agent.rs | 57 +-- pallets/torus0/src/benchmarking.rs | 2 - pallets/torus0/src/lib.rs | 129 +---- pallets/torus0/src/migrations.rs | 90 +++- pallets/torus0/src/namespace.rs | 153 +++++- pallets/torus0/tests/agent.rs | 129 ++--- pallets/torus0/tests/namespace.rs | 464 ++++++++++++++---- runtime/Cargo.toml | 2 +- runtime/src/apis.rs | 7 +- test-utils/src/lib.rs | 6 +- 17 files changed, 778 insertions(+), 399 deletions(-) diff --git a/.github/workflows/build-runtime.yml b/.github/workflows/build-runtime.yml index 49cd79d3..88affa08 100755 --- a/.github/workflows/build-runtime.yml +++ b/.github/workflows/build-runtime.yml @@ -37,7 +37,8 @@ jobs: - name: Build runtime run: | - cargo build --release --timings --package torus-runtime + echo "Building ${{ startsWith(github.ref, 'refs/tags/runtime/testnet') && 'with testnet feature flag' || 'without testnet feature flag' }}" + cargo build --release --timings --package torus-runtime ${{ startsWith(github.ref, 'refs/tags/runtime/testnet') && '--features testnet' || '' }} export SHA256SUM=$(sha256sum target/release/wbuild/torus-runtime/torus_runtime.compact.compressed.wasm | cut -d ' ' -f1) echo Hash of compact and compressed WASM: $SHA256SUM diff --git a/docs/namespace.md b/docs/namespace.md index dd1afa1d..4bc5e48a 100644 --- a/docs/namespace.md +++ b/docs/namespace.md @@ -23,7 +23,10 @@ The path validation ensures consistency across the network: - Maximum 255 bytes total length - Maximum 10 segments (depth limitation) - Each segment between 1-63 characters -- Valid characters: unicode alphanumerics, `-`, `_` +- Segments must begin and end with alphanumerics +- Valid characters: ASCII alphanumerics, `-`, `_`, and `+` + +> Implementations MUST NOT assume the character set will be ASCII only forever. Paths are UTF-8 encoded strings. This structure creates clear ownership: `agent.alice` owns all paths under that prefix, from `agent.alice.api` to `agent.alice.memory.twitter.v2`. The depth limitation prevents excessive nesting while still allowing meaningful organization. diff --git a/justfile b/justfile index 9b36f97a..4824f6cf 100644 --- a/justfile +++ b/justfile @@ -59,7 +59,7 @@ install-try-runtime: cargo install --git https://github.com/paritytech/try-runtime-cli --locked try-runtime-upgrade-testnet: - cargo build --release --features try-runtime + cargo build --release --features try-runtime,testnet RUST_BACKTRACE=1 RUST_LOG=info try-runtime --runtime target/release/wbuild/torus-runtime/torus_runtime.compact.compressed.wasm on-runtime-upgrade --blocktime 8000 live --uri wss://api.testnet.torus.network try-runtime-upgrade-mainnet: diff --git a/pallets/permission0/src/ext/namespace_impl.rs b/pallets/permission0/src/ext/namespace_impl.rs index 48c7fbc8..88193d62 100644 --- a/pallets/permission0/src/ext/namespace_impl.rs +++ b/pallets/permission0/src/ext/namespace_impl.rs @@ -45,7 +45,8 @@ pub fn grant_namespace_permission_impl( let paths = paths .into_iter() .map(|path| { - let path = NamespacePath::new(&path).map_err(|_| Error::::NamespacePathIsInvalid)?; + let path = + NamespacePath::new_agent(&path).map_err(|_| Error::::NamespacePathIsInvalid)?; ensure!( T::Torus::namespace_exists(&grantor, &path), Error::::NamespaceDoesNotExist diff --git a/pallets/torus0/Cargo.toml b/pallets/torus0/Cargo.toml index 595125d7..7b9bc86e 100644 --- a/pallets/torus0/Cargo.toml +++ b/pallets/torus0/Cargo.toml @@ -25,7 +25,7 @@ runtime-benchmarks = [ "pallet-torus0-api/runtime-benchmarks", ] try-runtime = ["polkadot-sdk/try-runtime", "pallet-torus0-api/try-runtime"] - +testnet = [] [dependencies] codec = { workspace = true, features = ["derive"] } diff --git a/pallets/torus0/api/Cargo.toml b/pallets/torus0/api/Cargo.toml index ae6a5e62..f113ec6b 100644 --- a/pallets/torus0/api/Cargo.toml +++ b/pallets/torus0/api/Cargo.toml @@ -18,4 +18,9 @@ try-runtime = ["polkadot-sdk/try-runtime"] [dependencies] codec = { workspace = true, features = ["derive"] } scale-info = { workspace = true, features = ["derive"] } -polkadot-sdk = { workspace = true, features = ["sp-runtime"] } +polkadot-sdk = { workspace = true, features = [ + "sp-api", + "sp-core", + "sp-runtime", + "sp-std", +] } diff --git a/pallets/torus0/api/src/lib.rs b/pallets/torus0/api/src/lib.rs index da7a738b..d7372295 100644 --- a/pallets/torus0/api/src/lib.rs +++ b/pallets/torus0/api/src/lib.rs @@ -62,12 +62,14 @@ pub trait Torus0Api { /// This might have to increase in the future, but is a good enough default value. /// If it ends up being formalized, the length can be described as a u8. pub const MAX_NAMESPACE_PATH_LENGTH: usize = 256; -/// Number of total bytes a segment can contain. -pub const MAX_SEGMENT_LENGTH: usize = 64; -/// Max number of segments in a path. +/// Number of total bytes a segment can contain. 63 plus dot. +pub const MAX_SEGMENT_LENGTH: usize = 63; +/// Max number of segments in a path. In the common prefix case, an agent will have +/// up to 8 levels of depth to use, 2 being allocated to the agent prefix notation. pub const MAX_NAMESPACE_SEGMENTS: usize = 10; pub const NAMESPACE_SEPARATOR: u8 = b'.'; +pub const NAMESPACE_AGENT_PREFIX: &[u8] = b"agent."; pub type NamespacePathInner = BoundedVec>; @@ -75,8 +77,13 @@ pub type NamespacePathInner = BoundedVec NamespacePath { + NamespacePath(b"agent".to_vec().try_into().unwrap()) + } + /// Create a new namespace path from bytes with validation - pub fn new(bytes: &[u8]) -> Result { + pub fn new_agent(bytes: &[u8]) -> Result { if bytes.is_empty() { return Err("empty namespace path"); } @@ -85,6 +92,10 @@ impl NamespacePath { return Err("path too long"); } + if !bytes.starts_with(NAMESPACE_AGENT_PREFIX) { + return Err("path must begin with agent prefix"); + } + let segments: Vec<&[u8]> = bytes.split(|&b| b == NAMESPACE_SEPARATOR).collect(); if segments.len() > MAX_NAMESPACE_SEGMENTS { return Err("too many namespace segments"); @@ -93,19 +104,19 @@ impl NamespacePath { for segment in &segments { let segment = core::str::from_utf8(segment).map_err(|_| "path is invalid itf-8")?; - let first = segment.chars().next().ok_or("empty namespace segment")?; - if !first.is_alphanumeric() { - return Err("namespace segment must start with alphanumeric character"); - } - if segment.len() > MAX_SEGMENT_LENGTH { return Err("namespace segment too long"); } - if segment - .chars() - .any(|c| !c.is_alphanumeric() && c != '-' && c != '_' && c != '+' && c != '=') - { + let first = segment.chars().next().ok_or("empty namespace segment")?; + let last = segment.chars().last().ok_or("empty namespace segment")?; + if !first.is_ascii_alphanumeric() || !last.is_ascii_alphanumeric() { + return Err("namespace segment must start and end with alphanumeric characters"); + } + + if segment.chars().any(|c| { + !(c.is_ascii_digit() || c.is_ascii_lowercase()) && c != '-' && c != '_' && c != '+' + }) { return Err("invalid character in namespace segment"); } } @@ -128,10 +139,17 @@ impl NamespacePath { } /// Parse a namespace path into segments - pub fn segments(&self) -> Vec<&[u8]> { - self.as_bytes() - .split(|&b| b == NAMESPACE_SEPARATOR) - .collect() + pub fn segments(&self) -> impl Iterator { + self.as_bytes().split(|&b| b == NAMESPACE_SEPARATOR) + } + + /// Returns the first segment of the path. + pub fn root(&self) -> Option { + let Some(root) = self.as_bytes().split(|&b| b == NAMESPACE_SEPARATOR).next() else { + return Some(self.clone()); + }; + + root.to_vec().try_into().ok().map(Self) } /// Get the parent path of this namespace @@ -147,7 +165,7 @@ impl NamespacePath { /// Get the depth of this namespace (number of segments) pub fn depth(&self) -> u32 { - self.segments().len() as u32 + self.segments().count() as u32 } /// Check if this path is a parent of another path @@ -194,7 +212,7 @@ impl FromStr for NamespacePath { type Err = &'static str; fn from_str(s: &str) -> Result { - Self::new(s.as_bytes()) + Self::new_agent(s.as_bytes()) } } @@ -206,54 +224,60 @@ mod tests { #[test] fn namespace_creation_validates_paths() { - assert!(NamespacePath::new(b"agent").is_ok()); - assert!(NamespacePath::new(b"agent.alice").is_ok()); - assert!(NamespacePath::new(b"agent.alice.memory").is_ok()); - assert!(NamespacePath::new(b"agent-1.alice_2.key=val+1").is_ok()); - - assert!(NamespacePath::new(b"").is_err()); - assert!(NamespacePath::new(b".agent").is_err()); - assert!(NamespacePath::new(b"agent.").is_err()); - assert!(NamespacePath::new(b"agent..alice").is_err()); - assert!(NamespacePath::new(b"agent.-alice").is_err()); - assert!(NamespacePath::new(b"agent.alice!").is_err()); - assert!(NamespacePath::new(b"agent.alice memory").is_err()); + assert!(NamespacePath::new_agent(b"agent.alice").is_ok()); + assert!(NamespacePath::new_agent(b"agent.alice_2.memory-1.func+1").is_ok()); + + assert!(NamespacePath::new_agent(format!("agent.alice.{:0<63}", 1).as_bytes()).is_ok()); + assert!(NamespacePath::new_agent(format!("agent.alice.{:0<64}", 1).as_bytes()).is_err()); + + assert!(NamespacePath::new_agent(b"").is_err()); + assert!(NamespacePath::new_agent(b"agent").is_err()); + assert!(NamespacePath::new_agent(b".agent").is_err()); + assert!(NamespacePath::new_agent(b"agent.").is_err()); + assert!(NamespacePath::new_agent(b"agent.Alice").is_err()); + assert!(NamespacePath::new_agent(b"agent..alice").is_err()); + assert!(NamespacePath::new_agent(b"agent.-alice").is_err()); + assert!(NamespacePath::new_agent(b"agent.alice-").is_err()); + assert!(NamespacePath::new_agent(b"agent.-alice-").is_err()); + assert!(NamespacePath::new_agent(b"agent.alice!").is_err()); + assert!(NamespacePath::new_agent(b"agent.alice memory").is_err()); + assert!(NamespacePath::new_agent("agent.alice.tørûs".as_bytes()).is_err()); } #[test] fn namespace_segment_listing() { - let path = NamespacePath::new(b"agent.alice.memory").unwrap(); - let segments = path.segments(); - assert_eq!(segments.len(), 3); - assert_eq!(segments[0], b"agent"); - assert_eq!(segments[1], b"alice"); - assert_eq!(segments[2], b"memory"); + let path = NamespacePath::new_agent(b"agent.alice.memory").unwrap(); + let mut segments = path.segments(); + assert_eq!(segments.next(), Some(b"agent".as_slice())); + assert_eq!(segments.next(), Some(b"alice".as_slice())); + assert_eq!(segments.next(), Some(b"memory".as_slice())); + assert_eq!(segments.next(), None); } #[test] fn namespace_parent_returns_correctly() { - let path = NamespacePath::new(b"agent.alice.memory").unwrap(); + let path = NamespacePath::new_agent(b"agent.alice.memory").unwrap(); let parent = path.parent().unwrap(); assert_eq!(parent.as_bytes(), b"agent.alice"); - let root = NamespacePath::new(b"agent").unwrap(); + let root = NamespacePath::agent_root(); assert!(root.parent().is_none()); } #[test] fn namespace_depth_calculation() { - let path1 = NamespacePath::new(b"agent").unwrap(); - assert_eq!(path1.depth(), 1); + let path1 = NamespacePath::new_agent(b"agent.alice").unwrap(); + assert_eq!(path1.depth(), 2); - let path2 = NamespacePath::new(b"agent.alice.memory.twitter").unwrap(); + let path2 = NamespacePath::new_agent(b"agent.alice.memory.twitter").unwrap(); assert_eq!(path2.depth(), 4); } #[test] fn test_is_parent_of() { - let parent = NamespacePath::new(b"agent.alice").unwrap(); - let child = NamespacePath::new(b"agent.alice.memory").unwrap(); - let other = NamespacePath::new(b"agent.bob").unwrap(); + let parent = NamespacePath::new_agent(b"agent.alice").unwrap(); + let child = NamespacePath::new_agent(b"agent.alice.memory").unwrap(); + let other = NamespacePath::new_agent(b"agent.bob").unwrap(); assert!(parent.is_parent_of(&child)); assert!(!parent.is_parent_of(&other)); @@ -262,7 +286,7 @@ mod tests { #[test] fn test_parents() { - let path = NamespacePath::new(b"agent.alice.memory.twitter").unwrap(); + let path = NamespacePath::new_agent(b"agent.alice.memory.twitter").unwrap(); let parents = path.parents(); assert_eq!(parents.len(), 3); assert_eq!(parents[0].as_bytes(), b"agent.alice.memory"); diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index 5b794bd8..d4df42a8 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -1,6 +1,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; use pallet_emission0_api::Emission0Api; use pallet_governance_api::GovernanceApi; +use pallet_torus0_api::{NamespacePath, NAMESPACE_AGENT_PREFIX}; use polkadot_sdk::{ frame_election_provider_support::Get, frame_support::{ @@ -11,7 +12,7 @@ use polkadot_sdk::{ }, polkadot_sdk_frame::prelude::BlockNumberFor, sp_runtime::{traits::Saturating, BoundedVec, DispatchError, Percent}, - sp_tracing::debug_span, + sp_tracing::{debug_span, warn}, }; use scale_info::{prelude::vec::Vec, TypeInfo}; @@ -77,7 +78,12 @@ pub fn register( crate::Error::::TooManyAgentRegistrationsThisInterval ); - validate_agent_name::(&name[..])?; + let namespace_path: Vec<_> = [NAMESPACE_AGENT_PREFIX, &name].concat(); + let namespace_path = NamespacePath::new_agent(&namespace_path).map_err(|err| { + warn!("{agent_key:?} tried using invalid name: {err:?}"); + crate::Error::::InvalidNamespacePath + })?; + validate_agent_url::(&url[..])?; validate_agent_metadata::(&metadata[..])?; @@ -107,6 +113,11 @@ pub fn register( }, ); + crate::namespace::create_namespace::( + crate::namespace::NamespaceOwnership::Account(agent_key.clone()), + namespace_path, + )?; + crate::RegistrationsThisBlock::::mutate(|value| value.saturating_add(1)); crate::RegistrationsThisInterval::::mutate(|value| value.saturating_add(1)); @@ -127,10 +138,15 @@ pub fn unregister(agent_key: AccountIdOf) -> DispatchResult let span = debug_span!("unregister", agent.key = ?agent_key); let _guard = span.enter(); - ensure!( - exists::(&agent_key), - crate::Error::::AgentDoesNotExist - ); + let agent = crate::Agents::::get(&agent_key).ok_or(crate::Error::::AgentDoesNotExist)?; + + let namespace_path: Vec<_> = [NAMESPACE_AGENT_PREFIX, &agent.name].concat(); + let namespace_path = NamespacePath::new_agent(&namespace_path) + .map_err(|_| crate::Error::::InvalidNamespacePath)?; + crate::namespace::delete_namespace::( + crate::namespace::NamespaceOwnership::Account(agent_key.clone()), + namespace_path, + )?; crate::Agents::::remove(&agent_key); crate::stake::clear_key::(&agent_key)?; @@ -143,7 +159,6 @@ pub fn unregister(agent_key: AccountIdOf) -> DispatchResult /// Updates the metadata of an existing agent. pub fn update( agent_key: AccountIdOf, - name: Vec, url: Vec, metadata: Option>, staking_fee: Option, @@ -161,9 +176,6 @@ pub fn update( return Err(crate::Error::::AgentUpdateOnCooldown.into()); } - validate_agent_name::(&name[..])?; - agent.name = BoundedVec::truncate_from(name); - validate_agent_url::(&url[..])?; agent.url = BoundedVec::truncate_from(url); @@ -228,31 +240,6 @@ pub fn exists(key: &AccountIdOf) -> bool { crate::Agents::::contains_key(key) } -fn validate_agent_name(bytes: &[u8]) -> DispatchResult { - let len: u32 = bytes - .len() - .try_into() - .map_err(|_| crate::Error::::AgentNameTooLong)?; - - ensure!( - len >= crate::MinNameLength::::get() as u32, - crate::Error::::AgentNameTooShort - ); - - ensure!( - len <= (crate::MaxNameLength::::get() as u32) - .min(T::MaxAgentNameLengthConstraint::get()), - crate::Error::::AgentNameTooLong - ); - - ensure!( - core::str::from_utf8(bytes).is_ok(), - crate::Error::::InvalidAgentName - ); - - Ok(()) -} - fn validate_agent_url(bytes: &[u8]) -> DispatchResult { let len: u32 = bytes .len() diff --git a/pallets/torus0/src/benchmarking.rs b/pallets/torus0/src/benchmarking.rs index f4e66245..09b0b97a 100644 --- a/pallets/torus0/src/benchmarking.rs +++ b/pallets/torus0/src/benchmarking.rs @@ -109,7 +109,6 @@ mod benchmarks { AgentUpdateCooldown::::set(Default::default()); - let name = vec![4, 5, 6]; let url = vec![4, 5, 6]; let metadata = Some(vec![4, 5, 6]); let staking_fee = Some(Percent::from_percent(10)); @@ -118,7 +117,6 @@ mod benchmarks { #[extrinsic_call] update_agent( RawOrigin::Signed(agent), - name, url, metadata, staking_fee, diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index d6525822..51ec6d7d 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -16,7 +16,7 @@ use frame::{ arithmetic::Percent, prelude::{ensure_root, ensure_signed}, }; -use namespace::{NamespaceMetadata, NamespacePath}; +use namespace::{NamespaceMetadata, NamespaceOwnership, NamespacePath}; pub use pallet::*; use polkadot_sdk::{ frame_support::{ @@ -41,11 +41,7 @@ pub mod pallet { use pallet_governance_api::GovernanceApi; use pallet_permission0_api::Permission0NamespacesApi; use pallet_torus0_api::NamespacePathInner; - use polkadot_sdk::{ - frame_support::traits::{ExistenceRequirement, ReservableCurrency}, - frame_system, - sp_runtime::traits::Zero, - }; + use polkadot_sdk::frame_support::traits::ReservableCurrency; use weights::WeightInfo; use super::*; @@ -147,7 +143,7 @@ pub mod pallet { pub type Namespaces = StorageDoubleMap< _, Blake2_128Concat, - T::AccountId, + NamespaceOwnership, Blake2_128Concat, NamespacePath, NamespaceMetadata, @@ -156,7 +152,7 @@ pub mod pallet { /// Count of namespaces registered per account #[pallet::storage] pub type NamespaceCount = - StorageMap<_, Blake2_128Concat, T::AccountId, u32, ValueQuery>; + StorageMap<_, Blake2_128Concat, NamespaceOwnership, u32, ValueQuery>; #[pallet::storage] pub type NamespacePricingConfig = StorageValue< @@ -346,21 +342,13 @@ pub mod pallet { #[pallet::weight((T::WeightInfo::update_agent(), DispatchClass::Normal, Pays::Yes))] pub fn update_agent( origin: OriginFor, - name: Vec, url: Vec, metadata: Option>, staking_fee: Option, weight_control_fee: Option, ) -> DispatchResult { let agent_key = ensure_signed(origin)?; - agent::update::( - agent_key, - name, - url, - metadata, - staking_fee, - weight_control_fee, - ) + agent::update::(agent_key, url, metadata, staking_fee, weight_control_fee) } /// Updates origin's key agent metadata. @@ -386,110 +374,27 @@ pub mod pallet { Error::::NamespacesFrozen ); - ensure!( - Agents::::contains_key(&owner), - Error::::AgentDoesNotExist - ); - let namespace_path = - NamespacePath::new(&path).map_err(|_| Error::::InvalidNamespacePath)?; - - ensure!( - !Namespaces::::contains_key(&owner, &namespace_path), - Error::::NamespaceAlreadyExists - ); - - let missing_paths = namespace::find_missing_paths::(&owner, &namespace_path); - let (total_fee, total_deposit) = - namespace::calculate_cost::(&owner, &missing_paths)?; - - T::Currency::reserve(&owner, total_deposit)?; - - ::Currency::transfer( - &owner, - &::Governance::dao_treasury_address(), - total_fee, - ExistenceRequirement::AllowDeath, - ) - .map_err(|_| crate::Error::::NotEnoughBalanceToRegisterAgent)?; - - let current_block = >::block_number(); - let pricing_config = crate::NamespacePricingConfig::::get(); - - for path in missing_paths.iter() { - let deposit = pricing_config.namespace_deposit(path); - - let metadata = NamespaceMetadata { - created_at: current_block, - deposit, - }; - - Namespaces::::insert(&owner, path, metadata); - } + NamespacePath::new_agent(&path).map_err(|_| Error::::InvalidNamespacePath)?; - NamespaceCount::::mutate(&owner, |count| { - *count = count.saturating_add(missing_paths.len() as u32) - }); - - Self::deposit_event(Event::NamespaceCreated { - owner, - path: namespace_path, - deposit: total_deposit, - }); - - Ok(()) + namespace::create_namespace::(NamespaceOwnership::Account(owner), namespace_path) } /// Delete a namespace and all its children #[pallet::call_index(8)] #[pallet::weight(Weight::default())] - pub fn delete_namespace(origin: OriginFor, path: Vec) -> DispatchResult { + pub fn delete_namespace(origin: OriginFor, path: NamespacePathInner) -> DispatchResult { let owner = ensure_signed(origin)?; let namespace_path = - NamespacePath::new(&path).map_err(|_| Error::::InvalidNamespacePath)?; - - ensure!( - Namespaces::::contains_key(&owner, &namespace_path), - Error::::NamespaceNotFound - ); + NamespacePath::new_agent(&path).map_err(|_| Error::::InvalidNamespacePath)?; ensure!( !T::Permission0::is_delegating_namespace(&owner, &namespace_path), Error::::NamespaceBeingDelegated ); - let mut total_deposit = BalanceOf::::zero(); - let namespaces_to_delete: Vec<_> = Namespaces::::iter_prefix(&owner) - .filter_map(|(path, metadata)| { - if path == namespace_path || namespace_path.is_parent_of(&path) { - Some((path, metadata.deposit)) - } else { - None - } - }) - .collect(); - - let deleted_count = namespaces_to_delete.len() as u32; - - for (path_to_delete, deposit) in namespaces_to_delete { - total_deposit = total_deposit.saturating_add(deposit); - Namespaces::::remove(&owner, &path_to_delete); - } - - NamespaceCount::::mutate(&owner, |count| { - *count = count.saturating_sub(deleted_count) - }); - - T::Currency::unreserve(&owner, total_deposit); - - Self::deposit_event(Event::NamespaceDeleted { - owner, - path: namespace_path, - deposit_released: total_deposit, - }); - - Ok(()) + namespace::delete_namespace::(NamespaceOwnership::Account(owner), namespace_path) } } @@ -513,20 +418,12 @@ pub mod pallet { AgentUpdated(AccountIdOf), /// Namespace created NamespaceCreated { - owner: T::AccountId, + owner: NamespaceOwnership, path: NamespacePath, - deposit: BalanceOf, }, /// Namespace deleted NamespaceDeleted { - owner: T::AccountId, - path: NamespacePath, - deposit_released: BalanceOf, - }, - /// Namespace transferred - NamespaceTransferred { - from: T::AccountId, - to: T::AccountId, + owner: NamespaceOwnership, path: NamespacePath, }, } @@ -694,7 +591,7 @@ impl } fn namespace_exists(agent: &T::AccountId, path: &NamespacePath) -> bool { - Namespaces::::contains_key(agent, path) + Namespaces::::contains_key(NamespaceOwnership::Account(agent.clone()), path) } #[cfg(feature = "runtime-benchmarks")] diff --git a/pallets/torus0/src/migrations.rs b/pallets/torus0/src/migrations.rs index 8bf99d89..69bafb54 100644 --- a/pallets/torus0/src/migrations.rs +++ b/pallets/torus0/src/migrations.rs @@ -82,12 +82,36 @@ pub mod v4 { } pub mod v5 { + use pallet_torus0_api::{NamespacePath, NAMESPACE_AGENT_PREFIX}; use polkadot_sdk::{ frame_support::{migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade}, + sp_tracing::{error, info}, sp_weights::Weight, }; - use crate::{burn::BurnConfiguration, BurnConfig, Config, Pallet}; + use crate::{ + burn::BurnConfiguration, namespace::NamespaceOwnership, Agents, BurnConfig, Config, Pallet, + }; + + pub mod storage { + use polkadot_sdk::frame_support::{pallet_prelude::*, storage_alias}; + + use crate::AccountIdOf; + + #[storage_alias] + pub type Namespaces = StorageDoubleMap< + crate::Pallet, + Blake2_128Concat, + AccountIdOf, + Blake2_128Concat, + pallet_torus0_api::NamespacePath, + crate::namespace::NamespaceMetadata, + >; + + #[storage_alias] + pub type NamespaceCount = + StorageMap, Blake2_128Concat, AccountIdOf, u32, ValueQuery>; + } pub type Migration = VersionedMigration<4, 5, MigrateToV5, Pallet, W>; pub struct MigrateToV5(core::marker::PhantomData); @@ -101,6 +125,70 @@ pub mod v5 { ..BurnConfig::::get() }); + let _ = storage::Namespaces::::clear(u32::MAX, None); + let _ = storage::NamespaceCount::::clear(u32::MAX, None); + + let path = NamespacePath::agent_root(); + if let Err(err) = + crate::namespace::create_namespace::(NamespaceOwnership::System, path) + { + error!("failed to create root agent namespace: {err:?}"); + return Weight::default(); + } + + info!("created root agent namespace"); + + for (id, agent) in Agents::::iter() { + let old_name = agent.name.clone(); + let Ok(agent_name) = core::str::from_utf8(&agent.name) else { + error!("agent name is not utf-8: {:?}", agent.name); + continue; + }; + + let agent_name = if cfg!(feature = "testnet") { + agent_name.to_ascii_lowercase().replace(' ', "-") + } else { + agent_name.into() + }; + + let Ok(bounded_name) = agent_name.as_bytes().to_vec().try_into() else { + error!("cannot lower case agent {agent_name:?}"); + continue; + }; + + let path: polkadot_sdk::sp_std::vec::Vec<_> = + [NAMESPACE_AGENT_PREFIX, agent_name.as_bytes()].concat(); + let path = match NamespacePath::new_agent(&path) { + Ok(path) => path, + Err(err) => { + error!( + "cannot create path for agent {agent_name:?} ({:?}): {err:?}", + core::str::from_utf8(&path) + ); + continue; + } + }; + + Agents::::mutate_extant(id.clone(), |agent| { + agent.name = bounded_name; + }); + + #[allow(deprecated)] + if let Err(err) = crate::namespace::create_namespace0::( + NamespaceOwnership::Account(id.clone()), + path.clone(), + false, + ) { + error!("cannot create namespace for agent {agent_name:?}: {err:?}"); + + Agents::::mutate_extant(id.clone(), |agent| { + agent.name = old_name; + }); + } else { + info!("created namespace entry for agent {agent_name:?}: {path:?}"); + } + } + Weight::default() } } diff --git a/pallets/torus0/src/namespace.rs b/pallets/torus0/src/namespace.rs index d149ca02..6544b79a 100644 --- a/pallets/torus0/src/namespace.rs +++ b/pallets/torus0/src/namespace.rs @@ -1,10 +1,14 @@ use codec::{Decode, Encode, MaxEncodedLen}; +use pallet_governance_api::GovernanceApi; use polkadot_sdk::{ - frame_support::{CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound}, - frame_system::pallet_prelude::BlockNumberFor, + frame_support::{ + traits::{ExistenceRequirement, ReservableCurrency}, + CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound, + }, + frame_system::{self, pallet_prelude::BlockNumberFor}, sp_runtime::{ traits::{One, Saturating, Zero}, - FixedPointNumber, FixedU128, + DispatchResult, FixedPointNumber, FixedU128, }, }; use scale_info::TypeInfo; @@ -16,6 +20,18 @@ pub use pallet_torus0_api::{ NAMESPACE_SEPARATOR, }; +/// Describes the ownership of the namespace. +#[derive( + Encode, Decode, CloneNoBound, DebugNoBound, PartialEqNoBound, EqNoBound, TypeInfo, MaxEncodedLen, +)] +#[scale_info(skip_type_params(T))] +pub enum NamespaceOwnership { + /// Owned by the system. Used to register root-level namespaces, like agent. + System, + /// Owned by a SS58 account. Used to represent agent-owned namespaces. + Account(T::AccountId), +} + #[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo, MaxEncodedLen, DebugNoBound)] #[scale_info(skip_type_params(T))] pub struct NamespacePricingConfig { @@ -74,7 +90,9 @@ impl NamespacePricingConfig { Ok(base_fee.saturating_mul(multiplier).into_inner()) } - /// Calculates the deposit needed to register a namespace. + /// Calculates the deposit needed to register a namespace. If a path with the agent prefix + /// is provided and contains more segments, the prefix (agent literal and agent name) + /// will be dropped. pub fn namespace_deposit(&self, path: &NamespacePath) -> BalanceOf { self.deposit_per_byte .saturating_mul((path.as_bytes().len() as u32).into()) @@ -114,13 +132,21 @@ pub struct NamespaceMetadata { } pub fn find_missing_paths( - owner: &T::AccountId, + owner: &NamespaceOwnership, path: &NamespacePath, ) -> Vec { let mut paths_to_create = path.parents(); paths_to_create.insert(0, path.clone()); - for (i, segment) in paths_to_create.iter().enumerate().rev() { + let mut iter = paths_to_create.iter().enumerate().rev(); + if matches!(owner, NamespaceOwnership::Account(_)) + && path.root().as_ref().map(NamespacePath::as_bytes) == Some(&b"agent"[..]) + { + // We drop the first segment, agent + let _ = iter.by_ref().next(); + } + + for (i, segment) in iter { if !Namespaces::::contains_key(owner, segment) { return paths_to_create.get(..=i).unwrap_or_default().to_vec(); } @@ -131,7 +157,7 @@ pub fn find_missing_paths( /// Calculates the total cost for registering, (Fee, Deposit) pub fn calculate_cost( - owner: &T::AccountId, + owner: &NamespaceOwnership, missing_paths: &[NamespacePath], ) -> Result<(BalanceOf, BalanceOf), DispatchError> { let current_count = NamespaceCount::::get(owner); @@ -151,3 +177,116 @@ pub fn calculate_cost( Ok((total_fee, total_deposit)) } + +pub fn create_namespace( + owner: NamespaceOwnership, + path: NamespacePath, +) -> DispatchResult { + #[allow(deprecated)] + create_namespace0(owner, path, true) +} + +#[doc(hidden)] +#[deprecated = "use crate_namespace instead"] +pub(crate) fn create_namespace0( + owner: NamespaceOwnership, + path: NamespacePath, + charge: bool, +) -> DispatchResult { + ensure!( + !Namespaces::::contains_key(&owner, &path), + Error::::NamespaceAlreadyExists + ); + + if let NamespaceOwnership::Account(owner) = &owner { + let path_agent = path + .segments() + .nth(1) + .ok_or(Error::::InvalidNamespacePath)?; + let agent = Agents::::get(owner).ok_or(Error::::AgentDoesNotExist)?; + + ensure!(path_agent == *agent.name, Error::::InvalidNamespacePath); + } + + let missing_paths = find_missing_paths::(&owner, &path); + + if charge { + let (total_fee, total_deposit) = calculate_cost::(&owner, &missing_paths)?; + + if let NamespaceOwnership::Account(owner) = &owner { + T::Currency::reserve(owner, total_deposit)?; + + ::Currency::transfer( + owner, + &::Governance::dao_treasury_address(), + total_fee, + ExistenceRequirement::AllowDeath, + ) + .map_err(|_| crate::Error::::NotEnoughBalanceToRegisterAgent)?; + } + } + + let current_block = >::block_number(); + let pricing_config = crate::NamespacePricingConfig::::get(); + + for path in missing_paths.iter() { + let deposit = if charge { + pricing_config.namespace_deposit(path) + } else { + Zero::zero() + }; + + let metadata = NamespaceMetadata { + created_at: current_block, + deposit, + }; + + Namespaces::::insert(&owner, path, metadata); + } + + NamespaceCount::::mutate(&owner, |count| { + *count = count.saturating_add(missing_paths.len() as u32) + }); + + Pallet::::deposit_event(Event::NamespaceCreated { owner, path }); + + Ok(()) +} + +pub fn delete_namespace( + owner: NamespaceOwnership, + path: NamespacePath, +) -> DispatchResult { + ensure!( + Namespaces::::contains_key(&owner, &path), + Error::::NamespaceNotFound + ); + + let mut total_deposit = BalanceOf::::zero(); + let namespaces_to_delete: Vec<_> = Namespaces::::iter_prefix(&owner) + .filter_map(|(other, metadata)| { + if other == path || path.is_parent_of(&other) { + Some((other, metadata.deposit)) + } else { + None + } + }) + .collect(); + + let deleted_count = namespaces_to_delete.len() as u32; + + for (path_to_delete, deposit) in namespaces_to_delete { + total_deposit = total_deposit.saturating_add(deposit); + Namespaces::::remove(&owner, &path_to_delete); + } + + NamespaceCount::::mutate(&owner, |count| *count = count.saturating_sub(deleted_count)); + + if let NamespaceOwnership::Account(owner) = &owner { + T::Currency::unreserve(owner, total_deposit); + } + + Pallet::::deposit_event(Event::NamespaceDeleted { owner, path }); + + Ok(()) +} diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index 20c0807a..5826c429 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -18,9 +18,9 @@ fn register_correctly() { let agent_id = 0; let allocator_id = 1; - let name = "idk://agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); // Register allocator Agents::::set( @@ -86,9 +86,9 @@ fn register_correctly() { fn register_without_being_whitelisted() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_ok!(pallet_torus0::agent::register::( agent, @@ -108,9 +108,9 @@ fn register_without_being_whitelisted() { fn register_without_enough_balance() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); Burn::::set(100); @@ -133,8 +133,8 @@ fn register_without_enough_balance() { fn register_fail_name_validation() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent @@ -148,7 +148,7 @@ fn register_fail_name_validation() { url.clone(), metadata.clone(), ), - pallet_torus0::Error::::AgentNameTooShort + pallet_torus0::Error::::InvalidNamespacePath ); assert_err!( @@ -161,7 +161,7 @@ fn register_fail_name_validation() { url.clone(), metadata.clone(), ), - pallet_torus0::Error::::AgentNameTooLong + pallet_torus0::Error::::InvalidNamespacePath ); assert_err!( @@ -172,7 +172,7 @@ fn register_fail_name_validation() { url.clone(), metadata.clone(), ), - pallet_torus0::Error::::InvalidAgentName + pallet_torus0::Error::::InvalidNamespacePath ); }); } @@ -181,8 +181,8 @@ fn register_fail_name_validation() { fn register_fail_url_validation() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent @@ -229,8 +229,8 @@ fn register_fail_url_validation() { fn register_fail_metadata_validation() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent @@ -279,9 +279,9 @@ fn register_fail_metadata_validation() { fn register_more_than_allowed_registrations_per_block() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); pallet_torus0::MaxRegistrationsPerBlock::::set(0); @@ -308,9 +308,9 @@ fn register_more_than_allowed_registrations_per_block() { fn register_more_than_registrations_per_interval() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); pallet_torus0::BurnConfig::::mutate(|config| { config.max_registrations_per_interval = 0; @@ -339,9 +339,9 @@ fn register_more_than_registrations_per_interval() { fn unregister_correctly() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent @@ -367,9 +367,9 @@ fn unregister_correctly() { fn unregister_twice() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent @@ -401,19 +401,12 @@ fn update_correctly() { clear_cooldown(); let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_err!( - pallet_torus0::agent::update::( - agent, - b"".to_vec(), - b"".to_vec(), - None, - None, - None, - ), + pallet_torus0::agent::update::(agent, b"".to_vec(), None, None, None,), Error::::AgentDoesNotExist ); @@ -429,9 +422,8 @@ fn update_correctly() { metadata, )); - let new_name = "new-agent".as_bytes().to_vec(); - let new_url = "new-idk://agent".as_bytes().to_vec(); - let new_metadata = "new-idk://agent".as_bytes().to_vec(); + let new_url = b"new-idk://agent".to_vec(); + let new_metadata = b"new-idk://agent".to_vec(); let constraints = pallet_torus0::FeeConstraints::::get(); let staking_fee = constraints.min_staking_fee; @@ -439,7 +431,6 @@ fn update_correctly() { assert_ok!(pallet_torus0::Pallet::::update_agent( get_origin(agent), - new_name.clone(), new_url.clone(), Some(new_metadata.clone()), Some(staking_fee), @@ -448,7 +439,6 @@ fn update_correctly() { let agent = Agents::::get(agent).expect("it should exists"); - assert_eq!(agent.name.to_vec(), new_name); assert_eq!(agent.url.to_vec(), new_url); assert_eq!(agent.metadata.to_vec(), new_metadata); assert_eq!(agent.fees.staking_fee, staking_fee); @@ -462,9 +452,9 @@ fn update_with_zero_staking_fee() { clear_cooldown(); let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent @@ -478,9 +468,8 @@ fn update_with_zero_staking_fee() { metadata.clone(), )); - let new_name = "new-agent".as_bytes().to_vec(); - let new_url = "new-idk://agent".as_bytes().to_vec(); - let new_metadata = "new-idk://agent".as_bytes().to_vec(); + let new_url = b"new-idk://agent".to_vec(); + let new_metadata = b"new-idk://agent".to_vec(); let constraints = pallet_torus0::FeeConstraints::::get(); let staking_fee = constraints.min_staking_fee; @@ -489,7 +478,6 @@ fn update_with_zero_staking_fee() { assert_err!( pallet_torus0::agent::update::( agent, - new_name.clone(), new_url.clone(), Some(new_metadata.clone()), Some(Percent::zero()), @@ -514,9 +502,9 @@ fn update_with_zero_weight_control_fee() { clear_cooldown(); let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_ok!(pallet_governance::whitelist::add_to_whitelist::( agent @@ -530,9 +518,8 @@ fn update_with_zero_weight_control_fee() { metadata.clone(), )); - let new_name = "new-agent".as_bytes().to_vec(); - let new_url = "new-idk://agent".as_bytes().to_vec(); - let new_metadata = "new-idk://agent".as_bytes().to_vec(); + let new_url = b"new-idk://agent".to_vec(); + let new_metadata = b"new-idk://agent".to_vec(); let constraints = pallet_torus0::FeeConstraints::::get(); let staking_fee = constraints.min_staking_fee; @@ -541,7 +528,6 @@ fn update_with_zero_weight_control_fee() { assert_err!( pallet_torus0::agent::update::( agent, - new_name.clone(), new_url.clone(), Some(new_metadata.clone()), Some(staking_fee), @@ -564,19 +550,12 @@ fn update_with_zero_weight_control_fee() { fn fails_updating_whitout_waiting_cooldown() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = "agent".as_bytes().to_vec(); - let url = "idk://agent".as_bytes().to_vec(); - let metadata = "idk://agent".as_bytes().to_vec(); + let name = b"agent".to_vec(); + let url = b"idk://agent".to_vec(); + let metadata = b"idk://agent".to_vec(); assert_err!( - pallet_torus0::agent::update::( - agent, - b"".to_vec(), - b"".to_vec(), - None, - None, - None, - ), + pallet_torus0::agent::update::(agent, b"".to_vec(), None, None, None,), Error::::AgentDoesNotExist ); @@ -592,9 +571,8 @@ fn fails_updating_whitout_waiting_cooldown() { metadata, )); - let new_name = "new-agent".as_bytes().to_vec(); - let new_url = "new-idk://agent".as_bytes().to_vec(); - let new_metadata = "new-idk://agent".as_bytes().to_vec(); + let new_url = b"new-idk://agent".to_vec(); + let new_metadata = b"new-idk://agent".to_vec(); let constraints = pallet_torus0::FeeConstraints::::get(); let staking_fee = constraints.min_staking_fee; @@ -603,7 +581,6 @@ fn fails_updating_whitout_waiting_cooldown() { assert_err!( pallet_torus0::Pallet::::update_agent( get_origin(agent), - new_name.clone(), new_url.clone(), Some(new_metadata.clone()), Some(staking_fee), @@ -616,7 +593,6 @@ fn fails_updating_whitout_waiting_cooldown() { assert_ok!(pallet_torus0::Pallet::::update_agent( get_origin(agent), - new_name.clone(), new_url.clone(), Some(new_metadata.clone()), Some(staking_fee), @@ -626,7 +602,6 @@ fn fails_updating_whitout_waiting_cooldown() { assert_err!( pallet_torus0::Pallet::::update_agent( get_origin(agent), - new_name.clone(), new_url.clone(), Some(new_metadata.clone()), Some(staking_fee), diff --git a/pallets/torus0/tests/namespace.rs b/pallets/torus0/tests/namespace.rs index 391e117a..a6175755 100644 --- a/pallets/torus0/tests/namespace.rs +++ b/pallets/torus0/tests/namespace.rs @@ -1,12 +1,47 @@ #![allow(clippy::indexing_slicing)] -use pallet_torus0::namespace::NamespacePricingConfig; +use pallet_torus0::namespace::{NamespaceOwnership, NamespacePricingConfig}; use pallet_torus0_api::NamespacePath; use polkadot_sdk::{ - frame_support::assert_err, + frame_support::{assert_err, assert_ok, traits::Currency}, + pallet_balances, sp_runtime::{BoundedVec, Percent}, }; -use test_utils::{as_tors, get_origin, new_test_ext, pallet_governance, Test}; +use test_utils::{as_tors, get_origin, new_test_ext, pallet_governance, Balances, Test}; + +/// Helper function to register an agent with a specific name and balance +fn register_agent_with(account_id: u32, name: &str, balance: u128) { + // Register the agent with the specified name + pallet_torus0::Agents::::set( + account_id, + Some(pallet_torus0::agent::Agent { + key: account_id, + name: name.as_bytes().to_vec().try_into().unwrap(), + url: Default::default(), + metadata: Default::default(), + weight_penalty_factor: Default::default(), + registration_block: >::block_number(), + fees: Default::default(), + last_update_block: Default::default(), + }), + ); + + // Set the balance for the account + let _ = Balances::deposit_creating(&account_id, balance); +} + +fn set_namespace_config() { + pallet_torus0::NamespacePricingConfig::::set( + pallet_torus0::namespace::NamespacePricingConfig { + base_fee: as_tors(5), + deposit_per_byte: as_tors(5), + + count_midpoint: 20, + fee_steepness: Percent::from_percent(20), + max_fee_multiplier: 3, + }, + ) +} #[test] fn namespace_fee_at_midpoint() { @@ -87,7 +122,7 @@ fn namespace_fee_steepness_effect() { let fee_high_5 = config_high_steep.namespace_fee(5).unwrap(); assert!( fee_high_5 < fee_low_5, - "higher steepness should result in lower fee below midpoint" + "agent.alice.higher steepness should result in lower fee below midpoint" ); // Above midpoint: higher steepness = lower fee @@ -95,7 +130,7 @@ fn namespace_fee_steepness_effect() { let fee_high_15 = config_high_steep.namespace_fee(15).unwrap(); assert!( fee_high_15 > fee_low_15, - "higher steepness should result in higher fee above midpoint" + "agent.alice.higher steepness should result in higher fee above midpoint" ); }); } @@ -143,8 +178,8 @@ fn namespace_fee_high_steepness() { let diff_before = fee_10.saturating_sub(fee_9); let diff_after = fee_11.saturating_sub(fee_10); - assert!(diff_before > 100, "steep curve is not steep"); - assert!(diff_after > 100, "steep curve is not steep"); + assert!(diff_before > 100, "agent.alice.steep curve is not steep"); + assert!(diff_after > 100, "agent.alice.steep curve is not steep"); }); } @@ -164,7 +199,7 @@ fn namespace_fee_monotonic_increase() { let current_fee = config.namespace_fee(count).unwrap(); assert!( current_fee >= prev_fee, - "fee should increase or stay same as count increases: {} > {} at count {}", + "agent.alice.fee should increase or stay same as count increases: {} > {} at count {}", current_fee, prev_fee, count @@ -204,17 +239,21 @@ fn namespace_deposit_basic() { max_fee_multiplier: 100, }; + // The simple agent path + let path_agent = "agent.alice".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_agent), 1100); + // Single character - let path_a = "a".parse().unwrap(); - assert_eq!(config.namespace_deposit(&path_a), 100); + let path_a = "agent.alice.a".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_a), 1300); // 5 characters - let path_hello = "hello".parse().unwrap(); - assert_eq!(config.namespace_deposit(&path_hello), 500); + let path_hello = "agent.alice.hello".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_hello), 1700); // With dots (24 characters total) - let path_long = "very.long.namespace.path".parse().unwrap(); - assert_eq!(config.namespace_deposit(&path_long), 2400); + let path_long = "agent.alice.very.long.namespace.path".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_long), 3600); }); } @@ -229,13 +268,13 @@ fn namespace_deposit_with_separators() { max_fee_multiplier: 100, }; - // "a.b.c" = 5 bytes - let path_dots = "a.b.c".parse().unwrap(); - assert_eq!(config.namespace_deposit(&path_dots), 250); + // "agent.alice.a.b.c" = 5 bytes + let path_dots = "agent.alice.a.b.c".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_dots), 850); - // "abc" = 3 bytes - let path_no_dots = "abc".parse().unwrap(); - assert_eq!(config.namespace_deposit(&path_no_dots), 150); + // "agent.alice.abc" = 3 bytes + let path_no_dots = "agent.alice.abc".parse().unwrap(); + assert_eq!(config.namespace_deposit(&path_no_dots), 750); }); } @@ -258,9 +297,9 @@ fn namespace_deposit_different_rates() { max_fee_multiplier: 100, }; - let path = "test.namespace".parse().unwrap(); // 14 bytes - assert_eq!(config_low.namespace_deposit(&path), 140); - assert_eq!(config_high.namespace_deposit(&path), 14000); + let path = "agent.alice.test.namespace".parse().unwrap(); // 14 bytes + assert_eq!(config_low.namespace_deposit(&path), 260); + assert_eq!(config_high.namespace_deposit(&path), 26000); }); } @@ -275,7 +314,7 @@ fn namespace_deposit_zero_rate() { max_fee_multiplier: 100, }; - let path = "free.namespace".parse().unwrap(); + let path = "agent.alice.free.namespace".parse().unwrap(); assert_eq!(config.namespace_deposit(&path), 0); }); } @@ -313,14 +352,18 @@ fn find_missing_paths_all_new() { let owner = 1; test_utils::register_empty_agent(owner); - let path = "v1.compute.gpu.h100".parse().unwrap(); - let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + let path = "agent.alice.v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::( + &NamespaceOwnership::Account(owner), + &path, + ); - assert_eq!(missing.len(), 4); - assert_eq!(missing[0].as_bytes(), b"v1.compute.gpu.h100"); - assert_eq!(missing[1].as_bytes(), b"v1.compute.gpu"); - assert_eq!(missing[2].as_bytes(), b"v1.compute"); - assert_eq!(missing[3].as_bytes(), b"v1"); + assert_eq!(missing.len(), 5); + assert_eq!(missing[0].as_bytes(), b"agent.alice.v1.compute.gpu.h100"); + assert_eq!(missing[1].as_bytes(), b"agent.alice.v1.compute.gpu"); + assert_eq!(missing[2].as_bytes(), b"agent.alice.v1.compute"); + assert_eq!(missing[3].as_bytes(), b"agent.alice.v1"); + assert_eq!(missing[4].as_bytes(), b"agent.alice"); }); } @@ -330,25 +373,32 @@ fn find_missing_paths_partial_exists() { let owner = 1; test_utils::register_empty_agent(owner); - for segment in ["v1", "v1.compute"] { - let path: NamespacePath = segment.parse().unwrap(); - + // Helper closure to insert namespace metadata + let insert_namespace = |path_str: &str| { + let path: NamespacePath = path_str.parse().unwrap(); pallet_torus0::Namespaces::::insert( - owner, + NamespaceOwnership::Account(owner), path, pallet_torus0::namespace::NamespaceMetadata { created_at: 0, deposit: 100, }, ); + }; + + for segment in ["agent.alice", "agent.alice.v1", "agent.alice.v1.compute"] { + insert_namespace(segment); } - let path = "v1.compute.gpu.h100".parse().unwrap(); - let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + let path = "agent.alice.v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::( + &NamespaceOwnership::Account(owner), + &path, + ); assert_eq!(missing.len(), 2); - assert_eq!(missing[0].as_bytes(), b"v1.compute.gpu.h100"); - assert_eq!(missing[1].as_bytes(), b"v1.compute.gpu"); + assert_eq!(missing[0].as_bytes(), b"agent.alice.v1.compute.gpu.h100"); + assert_eq!(missing[1].as_bytes(), b"agent.alice.v1.compute.gpu"); }); } @@ -358,11 +408,17 @@ fn find_missing_paths_all_exists() { let owner = 1; test_utils::register_empty_agent(owner); - for path in ["v1", "v1.compute", "v1.compute.gpu", "v1.compute.gpu.h100"] { + for path in [ + "agent.alice", + "agent.alice.v1", + "agent.alice.v1.compute", + "agent.alice.v1.compute.gpu", + "agent.alice.v1.compute.gpu.h100", + ] { let path: NamespacePath = path.parse().unwrap(); pallet_torus0::Namespaces::::insert( - owner, + NamespaceOwnership::Account(owner), path, pallet_torus0::namespace::NamespaceMetadata { created_at: 0, @@ -371,8 +427,11 @@ fn find_missing_paths_all_exists() { ); } - let path = "v1.compute.gpu.h100".parse().unwrap(); - let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + let path = "agent.alice.v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::( + &NamespaceOwnership::Account(owner), + &path, + ); assert_eq!(missing.len(), 0); }); @@ -384,11 +443,14 @@ fn find_missing_paths_single_segment() { let owner = 1; test_utils::register_empty_agent(owner); - let path = "agent".parse().unwrap(); - let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + let path = "agent.alice".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::( + &NamespaceOwnership::Account(owner), + &path, + ); assert_eq!(missing.len(), 1); - assert_eq!(missing[0].as_bytes(), b"agent"); + assert_eq!(missing[0].as_bytes(), b"agent.alice"); }); } @@ -398,10 +460,14 @@ fn find_missing_paths_middle_exists() { let owner = 1; test_utils::register_empty_agent(owner); - for path in ["v1", "v1.compute.gpu"] { + for path in [ + "agent.alice", + "agent.alice.v1", + "agent.alice.v1.compute.gpu", + ] { let path: NamespacePath = path.parse().unwrap(); pallet_torus0::Namespaces::::insert( - owner, + NamespaceOwnership::Account(owner), path, pallet_torus0::namespace::NamespaceMetadata { created_at: 0, @@ -410,13 +476,16 @@ fn find_missing_paths_middle_exists() { ); } - let path = "v1.compute.gpu.h100".parse().unwrap(); - let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + let path = "agent.alice.v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::( + &NamespaceOwnership::Account(owner), + &path, + ); assert_eq!(missing.len(), 3); - assert_eq!(missing[0].as_bytes(), b"v1.compute.gpu.h100"); - assert_eq!(missing[1].as_bytes(), b"v1.compute.gpu"); - assert_eq!(missing[2].as_bytes(), b"v1.compute"); + assert_eq!(missing[0].as_bytes(), b"agent.alice.v1.compute.gpu.h100"); + assert_eq!(missing[1].as_bytes(), b"agent.alice.v1.compute.gpu"); + assert_eq!(missing[2].as_bytes(), b"agent.alice.v1.compute"); }); } @@ -426,11 +495,16 @@ fn find_missing_paths_different_branches() { let owner = 1; test_utils::register_empty_agent(owner); - for path in ["v1", "v1.storage", "v1.storage.disk"] { + for path in [ + "agent.alice", + "agent.alice.v1", + "agent.alice.v1.storage", + "agent.alice.v1.storage.disk", + ] { let path: NamespacePath = path.parse().unwrap(); pallet_torus0::Namespaces::::insert( - owner, + NamespaceOwnership::Account(owner), path, pallet_torus0::namespace::NamespaceMetadata { created_at: 0, @@ -439,55 +513,67 @@ fn find_missing_paths_different_branches() { ); } - let path = "v1.compute.gpu.h100".parse().unwrap(); - let missing = pallet_torus0::namespace::find_missing_paths::(&owner, &path); + let path = "agent.alice.v1.compute.gpu.h100".parse().unwrap(); + let missing = pallet_torus0::namespace::find_missing_paths::( + &NamespaceOwnership::Account(owner), + &path, + ); assert_eq!(missing.len(), 3); - assert_eq!(missing[0].as_bytes(), b"v1.compute.gpu.h100"); - assert_eq!(missing[1].as_bytes(), b"v1.compute.gpu"); - assert_eq!(missing[2].as_bytes(), b"v1.compute"); + assert_eq!(missing[0].as_bytes(), b"agent.alice.v1.compute.gpu.h100"); + assert_eq!(missing[1].as_bytes(), b"agent.alice.v1.compute.gpu"); + assert_eq!(missing[2].as_bytes(), b"agent.alice.v1.compute"); }); } #[test] fn calculate_cost_no_existing_namespaces() { new_test_ext().execute_with(|| { + set_namespace_config(); let owner = 1; test_utils::register_empty_agent(owner); let paths: &[NamespacePath] = &[ - "v1".parse().unwrap(), - "v1.compute".parse().unwrap(), - "v1.compute.gpu".parse().unwrap(), + "agent.alice.v1".parse().unwrap(), + "agent.alice.v1.compute".parse().unwrap(), + "agent.alice.v1.compute.gpu".parse().unwrap(), ]; - let (fee, deposit) = - pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + let (fee, deposit) = pallet_torus0::namespace::calculate_cost::( + &NamespaceOwnership::Account(owner), + paths, + ) + .unwrap(); // Using default config: base_fee = 5 TORS, deposit_per_byte = 5 TORS // Fee calculation: each subsequent namespace has higher fee due to increasing count // Count 0: fee_0, Count 1: fee_1, Count 2: fee_2 assert!(fee > as_tors(15)); // 3 namespaces * min 5 TORS base fee - // Deposit: "v1" = 2 bytes, "v1.compute" = 10 bytes, "v1.compute.gpu" = 14 bytes - // Total = 26 bytes * 5 TORS = 130 TORS - assert_eq!(deposit, as_tors(130)); + assert_eq!(deposit, as_tors(310)); }); } #[test] fn calculate_cost_with_existing_namespaces() { new_test_ext().execute_with(|| { + set_namespace_config(); let owner = 1; test_utils::register_empty_agent(owner); // Set namespace count to simulate existing namespaces - pallet_torus0::NamespaceCount::::insert(owner, 10); + pallet_torus0::NamespaceCount::::insert(NamespaceOwnership::Account(owner), 10); - let paths: &[NamespacePath] = &["agent".parse().unwrap(), "agent.alice".parse().unwrap()]; + let paths: &[NamespacePath] = &[ + "agent.alice.agent".parse().unwrap(), + "agent.alice.super.names".parse().unwrap(), + ]; - let (fee, deposit) = - pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + let (fee, deposit) = pallet_torus0::namespace::calculate_cost::( + &NamespaceOwnership::Account(owner), + paths, + ) + .unwrap(); // Fee should be higher due to existing count of 10 // Count 10: at midpoint (20), Count 11: above midpoint @@ -496,29 +582,32 @@ fn calculate_cost_with_existing_namespaces() { let fee_11 = config.namespace_fee(11).unwrap(); assert_eq!(fee, fee_10 + fee_11); - // Deposit: "agent" = 5 bytes, "agent.alice" = 11 bytes - // Total = 16 bytes * 5 TORS = 80 TORS - assert_eq!(deposit, as_tors(80)); + // Deposit: "agent.alice.agent" = 17 bytes, "agent.alice" = 11 bytes + assert_eq!(deposit, as_tors(200)); }); } #[test] fn calculate_cost_progressive_fee_increase() { new_test_ext().execute_with(|| { + set_namespace_config(); let owner = 1; test_utils::register_empty_agent(owner); // Create a long path to test progressive fee increase let paths: &[NamespacePath] = &[ - "a".parse().unwrap(), - "a.b".parse().unwrap(), - "a.b.c".parse().unwrap(), - "a.b.c.d".parse().unwrap(), - "a.b.c.d.e".parse().unwrap(), + "agent.alice.a".parse().unwrap(), + "agent.alice.a.b".parse().unwrap(), + "agent.alice.a.b.c".parse().unwrap(), + "agent.alice.a.b.c.d".parse().unwrap(), + "agent.alice.a.b.c.d.e".parse().unwrap(), ]; - let (fee, _deposit) = - pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + let (fee, _deposit) = pallet_torus0::namespace::calculate_cost::( + &NamespaceOwnership::Account(owner), + paths, + ) + .unwrap(); // Verify progressive increase: calculate individual fees let config = pallet_torus0::NamespacePricingConfig::::get(); @@ -533,10 +622,15 @@ fn calculate_cost_progressive_fee_increase() { #[test] fn calculate_cost_empty_paths() { new_test_ext().execute_with(|| { + set_namespace_config(); let owner = 1; test_utils::register_empty_agent(owner); - let (fee, deposit) = pallet_torus0::namespace::calculate_cost::(&owner, &[]).unwrap(); + let (fee, deposit) = pallet_torus0::namespace::calculate_cost::( + &NamespaceOwnership::Account(owner), + &[], + ) + .unwrap(); assert_eq!(fee, 0); assert_eq!(deposit, 0); @@ -546,6 +640,7 @@ fn calculate_cost_empty_paths() { #[test] fn calculate_cost_different_pricing_config() { new_test_ext().execute_with(|| { + set_namespace_config(); let owner = 1; test_utils::register_empty_agent(owner); @@ -558,56 +653,66 @@ fn calculate_cost_different_pricing_config() { max_fee_multiplier: 10, }); - let paths: &[NamespacePath] = &["test".parse().unwrap(), "test.namespace".parse().unwrap()]; + let paths: &[NamespacePath] = &[ + "agent.alice.test".parse().unwrap(), + "agent.alice.test.namespace".parse().unwrap(), + ]; - let (fee, deposit) = - pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + let (fee, deposit) = pallet_torus0::namespace::calculate_cost::( + &NamespaceOwnership::Account(owner), + paths, + ) + .unwrap(); // With higher base fee and steeper curve assert!(fee > as_tors(20)); // 2 namespaces * min 10 TORS base fee - // Deposit: "test" = 4 bytes, "test.namespace" = 14 bytes - // Total = 18 bytes * 2 TORS = 36 TORS - assert_eq!(deposit, as_tors(36)); + assert_eq!(deposit, as_tors(84)); }); } #[test] fn calculate_cost_long_path_names() { new_test_ext().execute_with(|| { + set_namespace_config(); + let owner = 1; test_utils::register_empty_agent(owner); let paths: &[NamespacePath] = &[ - "very-long-namespace-name".parse().unwrap(), - "very-long-namespace-name.with-another-segment" + "agent.alice.very-long-namespace-name".parse().unwrap(), + "agent.alice.very-long-namespace-name.with-another-segment" .parse() .unwrap(), ]; - let (_fee, deposit) = - pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + let (_fee, deposit) = pallet_torus0::namespace::calculate_cost::( + &NamespaceOwnership::Account(owner), + paths, + ) + .unwrap(); // Deposit calculation based on bytes - // "very-long-namespace-name" = 24 bytes - // "very-long-namespace-name.with-another-segment" = 45 bytes - // Total = 69 bytes * 5 TORS = 345 TORS - assert_eq!(deposit, as_tors(345)); + assert_eq!(deposit, as_tors(465)); }); } #[test] fn calculate_cost_at_fee_ceiling() { new_test_ext().execute_with(|| { + set_namespace_config(); let owner = 1; test_utils::register_empty_agent(owner); - pallet_torus0::NamespaceCount::::insert(owner, 1000); + pallet_torus0::NamespaceCount::::insert(NamespaceOwnership::Account(owner), 1000); - let paths: &[NamespacePath] = &["test".parse().unwrap()]; + let paths: &[NamespacePath] = &["agent.alice.test".parse().unwrap()]; - let (fee, _deposit) = - pallet_torus0::namespace::calculate_cost::(&owner, paths).unwrap(); + let (fee, _deposit) = pallet_torus0::namespace::calculate_cost::( + &NamespaceOwnership::Account(owner), + paths, + ) + .unwrap(); // fee should be at ceiling because of high amount of registered entries let config = pallet_torus0::NamespacePricingConfig::::get(); @@ -622,9 +727,164 @@ fn namespace_freezing() { assert_err!( pallet_torus0::Pallet::::create_namespace( get_origin(0), - BoundedVec::truncate_from(b"new.namespace".to_vec()) + BoundedVec::truncate_from(b"agent.alice.new.namespace".to_vec()) ), pallet_torus0::Error::::NamespacesFrozen ); }); } + +#[test] +fn namespace_must_start_with_agent_prefix() { + new_test_ext().execute_with(|| { + // Register alice as an agent with proper name and balance + register_agent_with(0, "alice", as_tors(1000)); + + // Helper closure to test invalid namespace creation + let assert_invalid_namespace = |path: &[u8]| { + assert_err!( + pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(path.to_vec()) + ), + pallet_torus0::Error::::InvalidNamespacePath + ); + }; + + // Test various invalid prefixes + assert_invalid_namespace(b"foobar.alice"); + assert_invalid_namespace(b"alice.agent"); + assert_invalid_namespace(b"agents.alice"); + assert_invalid_namespace(b"Agent.alice"); // wrong case + assert_invalid_namespace(b"agentX.alice"); // extra character + assert_invalid_namespace(b""); // empty path + assert_invalid_namespace(b"alice"); // no prefix at all + + // Verify that a valid namespace starting with "agent." works + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice".to_vec()) + )); + }); +} + +#[test] +fn create_namespace_simple() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice".to_vec()) + )); + + // Verify namespace was created + assert!(pallet_torus0::Namespaces::::contains_key( + pallet_torus0::namespace::NamespaceOwnership::Account(0), + pallet_torus0_api::NamespacePath::new_agent(b"agent.alice").unwrap() + )); + }); +} + +#[test] +fn create_namespace_with_hierarchy() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.v1.compute.gpu".to_vec()) + )); + + // Helper closure to check if namespace exists + let ownership = pallet_torus0::namespace::NamespaceOwnership::Account(0); + let assert_namespace_exists = |path: &str| { + assert!(pallet_torus0::Namespaces::::contains_key( + ownership.clone(), + path.parse::().unwrap() + )); + }; + + // Verify all hierarchical namespaces were created + assert_namespace_exists("agent.alice"); + assert_namespace_exists("agent.alice.v1"); + assert_namespace_exists("agent.alice.v1.compute"); + assert_namespace_exists("agent.alice.v1.compute.gpu"); + }); +} + +#[test] +fn create_namespace_already_exists() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + + // Helper closure for namespace creation + let create_namespace = |path: &[u8]| { + pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(path.to_vec()), + ) + }; + + // Create namespace first time + assert_ok!(create_namespace(b"agent.alice")); + + // Try to create same namespace again + assert_err!( + create_namespace(b"agent.alice"), + pallet_torus0::Error::::NamespaceAlreadyExists + ); + }); +} + +#[test] +fn create_namespace_not_an_agent() { + new_test_ext().execute_with(|| { + set_namespace_config(); + + // Try to create namespace without being registered as agent + assert_err!( + pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice".to_vec()) + ), + pallet_torus0::Error::::AgentDoesNotExist + ); + }); +} + +#[test] +fn create_namespace_wrong_agent_name() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + + // Try to create namespace with different agent name + assert_err!( + pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.bob".to_vec()) + ), + pallet_torus0::Error::::InvalidNamespacePath + ); + }); +} + +#[test] +fn create_namespace_insufficient_balance() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1)); // Very low balance + + assert_err!( + pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice".to_vec()) + ), + pallet_balances::Error::::InsufficientBalance + ); + }); +} diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index b8334534..1f1f1441 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -56,7 +56,7 @@ try-runtime = [ # Frontier "fp-self-contained/try-runtime", ] -testnet = ["pallet-faucet/testnet"] +testnet = ["pallet-torus0/testnet", "pallet-faucet/testnet"] [dependencies] serde_json = { workspace = true, features = ["alloc"] } diff --git a/runtime/src/apis.rs b/runtime/src/apis.rs index df25d07d..1a4a30c7 100644 --- a/runtime/src/apis.rs +++ b/runtime/src/apis.rs @@ -478,10 +478,11 @@ impl_runtime_apis! { use pallet_torus0_api::NamespacePath; let namespace_path = - NamespacePath::new(&path).map_err(|_| pallet_torus0::Error::::InvalidNamespacePath)?; + NamespacePath::new_agent(&path).map_err(|_| pallet_torus0::Error::::InvalidNamespacePath)?; - let missing_paths = namespace::find_missing_paths::(&account_id, &namespace_path); - namespace::calculate_cost::(&account_id, &missing_paths) + let owner = namespace::NamespaceOwnership::Account(account_id); + let missing_paths = namespace::find_missing_paths::(&owner, &namespace_path); + namespace::calculate_cost::(&owner, &missing_paths) } } } diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index bc315dbe..eb877590 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -94,12 +94,12 @@ parameter_types! { pub const DefaultDividendsParticipationWeight: Percent = Percent::from_parts(40); pub DefaultNamespacePricingConfig: pallet_torus0::namespace::NamespacePricingConfig = pallet_torus0::namespace::NamespacePricingConfig { - base_fee: as_tors(5), - deposit_per_byte: as_tors(5), + base_fee: as_tors(0), + deposit_per_byte: as_tors(0), count_midpoint: 20, fee_steepness: Percent::from_percent(20), - max_fee_multiplier: 5, + max_fee_multiplier: 0, }; } From d881aab6b97af3e9d71255aa15b90a4b5ac9aaec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= <65056371+devwckd@users.noreply.github.com> Date: Tue, 24 Jun 2025 10:34:17 -0300 Subject: [PATCH 41/46] docs: document faucet usage and proof-of-work (#112) Closes CHAIN-90 --- pallets/faucet/src/ext.rs | 10 ----- pallets/faucet/src/faucet.rs | 71 +++++++++++++++++------------------- pallets/faucet/src/lib.rs | 25 +++++-------- 3 files changed, 42 insertions(+), 64 deletions(-) diff --git a/pallets/faucet/src/ext.rs b/pallets/faucet/src/ext.rs index 7ce6957c..5c072c14 100644 --- a/pallets/faucet/src/ext.rs +++ b/pallets/faucet/src/ext.rs @@ -1,17 +1,7 @@ -//! Type aliases for the faucet pallet -//! -//! This module contains type definitions used throughout the faucet pallet code. - use polkadot_sdk::frame_support::traits::Currency; -/// Type alias for the Balance type used in the pallet -/// -/// This represents the token amount type in the system, derived from the Currency configuration. pub(super) type BalanceOf = <::Currency as Currency< ::AccountId, >>::Balance; -/// Type alias for the AccountId type used in the pallet -/// -/// This represents the account identifier type in the system. pub(super) type AccountIdOf = ::AccountId; diff --git a/pallets/faucet/src/faucet.rs b/pallets/faucet/src/faucet.rs index b3652237..3fc2cde8 100644 --- a/pallets/faucet/src/faucet.rs +++ b/pallets/faucet/src/faucet.rs @@ -1,9 +1,36 @@ -//! Implementation of the faucet functionality +//! # proof-of-work //! -//! This module contains the core logic for the faucet pallet, including: -//! - The execution function that handles faucet requests -//! - Hash calculation and verification functions for proof-of-work -//! - Block hash retrieval and validation functions +//! The following steps are required to generate a valid proof-of-work: +//! - Concatenate the current block hash with the receiver key bytes and hash the result using keccak256. (reference [hash_block_and_key]) +//! - Concatenate a random nonce with the result of the previous step, hash it with sha256 and again with keccak256. (reference [create_seal_hash]) +//! - Transform the result hash to a u128 number and multiply it by 1_000_000. (reference [hash_meets_difficulty]) +//! - If the multiplication result exceeds the maximum possible u128 value, the hash is invalid. Try again with a new random nonce and updated block hash. +//! - If it doesn't, the proof-of-work is valid and the result may be submitted. +//! +//! ## Pseudocode +//! ```x +//! u128 difficulty = 1_000_000; +//! while true { +//! u64 nonce = random_u64(); +//! u8[] block_hash = current_block_hash; +//! +//! // This should result in a byte array with size 64 (trim the end of key bytes if necessary) +//! u8[] block_key_bytes = concat(block_hash, key_bytes); +//! u8[] block_key_hash = keccak_256(block_key_bytes); +//! +//! // This should result in a byte array with size 40 (8 nonce bytes + 32 block_key_hash bytes) +//! u8[] seal_bytes = concat(to_byte_array(nonce), block_key_hash); +//! u8[] seal_hash = sha_256(keccak_256(seal_bytes)); +//! +//! // Overflowing means that the multiplication result exceeded the max value possible for the type, u128 on this case. +//! if overflows(as_u128(seal_hash) * difficulty) { +//! // The seal hash doesn't meet the difficulty requirement, change the nonce and try again. +//! continue; +//! } +//! +//! // The generated seal hash meets the desired difficulty and may be submitted. +//! } +//! ``` use crate::Vec; use crate::{AccountIdOf, BalanceOf}; @@ -22,25 +49,6 @@ use polkadot_sdk::{ const FAUCET_AMOUNT: u128 = 50_000_000_000_000_000_000; -/// Main execution function for the faucet pallet -/// -/// This function processes a faucet request after it has passed the unsigned validation. -/// It performs the following steps: -/// 1. Ensures the account exists (or creates it) -/// 2. Validates that the block number is recent (within the last 3 blocks) -/// 3. Verifies that the proof-of-work meets the difficulty requirement -/// 4. Checks that the submitted work hash matches the expected seal hash -/// 5. Deposits tokens to the account if all checks pass -/// -/// # Parameters -/// * `key` - The account that will receive tokens -/// * `block_number` - The block number used for the proof-of-work -/// * `nonce` - The nonce value that makes the hash meet the difficulty -/// * `work` - The hash result to verify -/// -/// # Returns -/// * `Ok(())` if successful -/// * `Err` with an error if any check fails pub fn execute( key: AccountIdOf, block_number: u64, @@ -54,7 +62,6 @@ pub fn execute( info!("do faucet with key: {key:?} and block number: {block_number} and nonce: {nonce} and hash: {work:?}"); - // Get the current block number for validation let current_block_number: u64 = frame_system::Pallet::::block_number() .try_into() .map_err(|_| "block number exceeded u64")?; @@ -83,7 +90,7 @@ pub fn execute( let seal: H256 = create_seal_hash::(block_number, nonce, &key)?; ensure!(seal == work_hash, Error::::InvalidSeal); - // Award tokens to the account (15 tokens with 18 decimals) + // Award tokens to the account let amount: BalanceOf = FAUCET_AMOUNT.try_into().map_err(|_| "Invalid amount")?; let _ = T::Currency::deposit_creating(&key, amount); @@ -99,14 +106,6 @@ pub fn execute( /// This function combines a block hash with an account key and produces a new hash. /// It takes the 32-byte block hash and combines it with the first 32 bytes of the /// account ID to create a 64-byte array, then hashes it with keccak-256. -/// -/// # Parameters -/// * `block_hash_bytes` - The 32-byte hash of a block -/// * `key` - The account ID to combine with the block hash -/// -/// # Returns -/// * `Ok(H256)` - The resulting hash if successful -/// * `Err` - If the key is too small pub fn hash_block_and_key( block_hash_bytes: &[u8; 32], key: &T::AccountId, @@ -167,10 +166,6 @@ pub fn create_seal_hash( Ok(seal_hash) } -/// Retrieves the hash of a block by its number -/// -/// This function converts a u64 block number to the chain's BlockNumberFor type, -/// retrieves the hash of that block from the system, and converts it to an H256 type. pub fn get_block_hash_from_u64(block_number: u64) -> Result { let block_number: BlockNumberFor = block_number.try_into().map_err(|_| { "Block number {block_number} is too large to be converted to BlockNumberFor" diff --git a/pallets/faucet/src/lib.rs b/pallets/faucet/src/lib.rs index 4fa17372..10ca85f1 100644 --- a/pallets/faucet/src/lib.rs +++ b/pallets/faucet/src/lib.rs @@ -1,32 +1,23 @@ //! # Faucet Pallet //! -//! A pallet that allows users to get test tokens on the testnet by performing proof-of-work. -//! //! ## Overview //! //! The Faucet pallet provides a mechanism for users to acquire test tokens on the testnet -//! through a proof-of-work challenge. This enables developers to test their applications -//! on the testnet without requiring real tokens. +//! through a proof-of-work challenge. This enables developers to test their applications before +//! deploying to the mainnet. //! //! The pallet is only enabled on testnets via the `testnet` feature flag and is disabled //! on production networks to prevent token generation outside of the normal emission schedule. //! -//! ## Features -//! -//! - **Proof-of-Work**: Requires users to perform computational work to prevent abuse -//! - **Token Distribution**: Provides a fixed amount of tokens to users who complete the challenge -//! - **Rate Limiting**: Prevents wealthy accounts from repeatedly requesting tokens -//! - **Recent Block Verification**: Ensures that proof-of-work was done recently -//! -//! ## Interface +//! ## Usage //! -//! ### Extrinsics +//! ### Interface //! -//! * `faucet` - Submit proof-of-work to receive test tokens +//! A user-friendly interface can be found at https://wallet.testnet.torus.network. //! -//! ## Usage +//! ### Programatically //! -//! To request tokens from the faucet, users need to: +//! To request tokens programatically from the faucet, users need to: //! //! 1. Get the hash of a recent block (within the last 3 blocks) //! 2. Generate a proof-of-work based on block hash, account ID, and a nonce @@ -34,6 +25,8 @@ //! //! If the proof is valid and the account's total balance (including staked tokens) is below //! the threshold, the account will receive the configured amount of test tokens. +//! +//! Details about the proof-of-work implementation can be found [here](crate::faucet). #![cfg_attr(not(feature = "std"), no_std)] #![allow(unused)] From b9f14a6bf2b953891f1c3c73e2836fdd04a4e07a Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Tue, 24 Jun 2025 12:30:43 -0300 Subject: [PATCH 42/46] chore(permission0): accumulate distribution remainder --- .../permission0/src/permission/emission.rs | 25 ++++++++++++++++--- pallets/permission0/tests/stream.rs | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/pallets/permission0/src/permission/emission.rs b/pallets/permission0/src/permission/emission.rs index f1644b06..cf2fbbab 100644 --- a/pallets/permission0/src/permission/emission.rs +++ b/pallets/permission0/src/permission/emission.rs @@ -205,6 +205,14 @@ pub(crate) fn do_distribute_emission( let streams = streams.keys().filter_map(|id| { let acc = AccumulatedStreamAmounts::::get((&contract.grantor, id, permission_id))?; + + // You cannot remove the stream from the storage as + // it's needed in the accumulation code + AccumulatedStreamAmounts::::set( + (&contract.grantor, id, permission_id), + Some(Zero::zero()), + ); + if acc.is_zero() { None } else { @@ -226,10 +234,19 @@ pub(crate) fn do_distribute_emission( reason, ); - AccumulatedStreamAmounts::::set( - (&contract.grantor, stream, permission_id), - Some(imbalance.peek()), - ); + let remainder = imbalance.peek(); + if !remainder.is_zero() { + AccumulatedStreamAmounts::::mutate( + (&contract.grantor, stream, permission_id), + |acc| { + if let Some(acc_value) = acc { + *acc_value = acc_value.saturating_add(remainder); + } else { + *acc = Some(remainder) + } + }, + ); + } } } EmissionAllocation::FixedAmount(amount) => { diff --git a/pallets/permission0/tests/stream.rs b/pallets/permission0/tests/stream.rs index 426c9bf0..7a13c73a 100644 --- a/pallets/permission0/tests/stream.rs +++ b/pallets/permission0/tests/stream.rs @@ -188,7 +188,7 @@ fn stream_accumulates_and_executes_at_threshold() { let permission_id = assert_ok!(grant_emission_permission( miner, - val, + miner, pallet_permission0_api::EmissionAllocation::Streams(streams), vec![(val, u16::MAX)], pallet_permission0_api::DistributionControl::Automatic(total_incentives), From 5d79e22fd8d36e56538adcc303cca575ebc4d3b5 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Sun, 6 Jul 2025 17:02:47 -0300 Subject: [PATCH 43/46] fix(namespaces): prevent de-registering root (#117) This patch prevents a registered agent from de-registering the agent entry (`agent.`) through the `delete_namespace` extrinsic. --- flake.lock | 18 +- node/src/cli/eth.rs | 2 + node/src/command/benchmarking.rs | 2 +- node/src/main.rs | 1 + node/src/service.rs | 1 + pallets/emission0/src/distribute.rs | 8 +- pallets/torus0/api/src/lib.rs | 62 ++++++ pallets/torus0/src/agent.rs | 8 +- pallets/torus0/src/lib.rs | 4 +- pallets/torus0/src/migrations.rs | 11 +- pallets/torus0/src/namespace.rs | 8 + pallets/torus0/tests/agent.rs | 20 +- pallets/torus0/tests/namespace.rs | 283 +++++++++++++++++++++++++++- rust-toolchain.toml | 2 +- test-utils/src/lib.rs | 2 +- 15 files changed, 396 insertions(+), 36 deletions(-) diff --git a/flake.lock b/flake.lock index 60b8f9a4..b73dc6f9 100644 --- a/flake.lock +++ b/flake.lock @@ -57,11 +57,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1748162331, - "narHash": "sha256-rqc2RKYTxP3tbjA+PB3VMRQNnjesrT0pEofXQTrMsS8=", + "lastModified": 1751741127, + "narHash": "sha256-t75Shs76NgxjZSgvvZZ9qOmz5zuBE8buUaYD28BMTxg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "7c43f080a7f28b2774f3b3f43234ca11661bf334", + "rev": "29e290002bfff26af1db6f64d070698019460302", "type": "github" }, "original": { @@ -80,11 +80,11 @@ ] }, "locked": { - "lastModified": 1747372754, - "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", + "lastModified": 1750779888, + "narHash": "sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", + "rev": "16ec914f6fb6f599ce988427d9d94efddf25fe6d", "type": "github" }, "original": { @@ -108,11 +108,11 @@ ] }, "locked": { - "lastModified": 1748313401, - "narHash": "sha256-x5UuDKP2Ui/TresAngUo9U4Ss9xfOmN8dAXU8OrkZmA=", + "lastModified": 1751769931, + "narHash": "sha256-QR2Rp/41NkA5YxcpvZEKD1S2QE1Pb9U415aK8M/4tJc=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "9c8ea175cf9af29edbcff121512e44092a8f37e4", + "rev": "3ac4f630e375177ea8317e22f5c804156de177e8", "type": "github" }, "original": { diff --git a/node/src/cli/eth.rs b/node/src/cli/eth.rs index b0ecbb78..188902a2 100644 --- a/node/src/cli/eth.rs +++ b/node/src/cli/eth.rs @@ -1,3 +1,5 @@ +#![allow(clippy::result_large_err)] + use std::{ collections::BTreeMap, path::PathBuf, diff --git a/node/src/command/benchmarking.rs b/node/src/command/benchmarking.rs index 056708cf..e48a4ace 100644 --- a/node/src/command/benchmarking.rs +++ b/node/src/command/benchmarking.rs @@ -171,6 +171,6 @@ pub fn inherent_benchmark_data() -> Result { let timestamp = sp_timestamp::InherentDataProvider::new(d.into()); futures::executor::block_on(timestamp.provide_inherent_data(&mut inherent_data)) - .map_err(|e| format!("creating inherent data: {:?}", e))?; + .map_err(|e| format!("creating inherent data: {e:?}"))?; Ok(inherent_data) } diff --git a/node/src/main.rs b/node/src/main.rs index 5b5b58a8..ac481f44 100644 --- a/node/src/main.rs +++ b/node/src/main.rs @@ -1,3 +1,4 @@ +#![allow(clippy::result_large_err)] //! The Torus node implementation. mod chain_spec; diff --git a/node/src/service.rs b/node/src/service.rs index 693f1429..d329fc1f 100644 --- a/node/src/service.rs +++ b/node/src/service.rs @@ -14,6 +14,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. +#![allow(clippy::result_large_err)] use std::{pin::Pin, sync::Arc, time::Duration}; diff --git a/pallets/emission0/src/distribute.rs b/pallets/emission0/src/distribute.rs index 05f8f4fc..de1c9d66 100644 --- a/pallets/emission0/src/distribute.rs +++ b/pallets/emission0/src/distribute.rs @@ -204,9 +204,11 @@ impl ConsensusMemberInput { let validator_permit = total_stake >= min_validator_stake && !weights.is_empty(); - let weights = validator_permit - .then(|| Self::prepare_weights(weights, &agent_id)) - .unwrap_or_default(); + let weights = if validator_permit { + Self::prepare_weights(weights, &agent_id) + } else { + Default::default() + }; ConsensusMemberInput { registered: ::is_agent_registered(&agent_id) diff --git a/pallets/torus0/api/src/lib.rs b/pallets/torus0/api/src/lib.rs index d7372295..455f65a6 100644 --- a/pallets/torus0/api/src/lib.rs +++ b/pallets/torus0/api/src/lib.rs @@ -82,6 +82,12 @@ impl NamespacePath { NamespacePath(b"agent".to_vec().try_into().unwrap()) } + /// Create a new root agent namespace path from the agent name + pub fn new_agent_root(agent_name: &[u8]) -> Result { + let namespace_path: Vec<_> = [NAMESPACE_AGENT_PREFIX, agent_name].concat(); + Self::new_agent(&namespace_path) + } + /// Create a new namespace path from bytes with validation pub fn new_agent(bytes: &[u8]) -> Result { if bytes.is_empty() { @@ -192,6 +198,19 @@ impl NamespacePath { parents } + + /// Wether the namespace is an agent root path: "agent.". + pub fn is_agent_root(&self) -> bool { + if self.depth() != 2 { + return false; + } + + if let Some(root) = self.segments().next() { + root == b"agent" + } else { + false + } + } } impl Debug for NamespacePath { @@ -293,4 +312,47 @@ mod tests { assert_eq!(parents[1].as_bytes(), b"agent.alice"); assert_eq!(parents[2].as_bytes(), b"agent"); } + + #[test] + fn test_is_agent_root() { + let agent_alice = NamespacePath::new_agent(b"agent.alice").unwrap(); + assert!(agent_alice.is_agent_root()); + + let agent_bob = NamespacePath::new_agent(b"agent.bob").unwrap(); + assert!(agent_bob.is_agent_root()); + + let deeper = NamespacePath::new_agent(b"agent.alice.memory").unwrap(); + assert!(!deeper.is_agent_root()); + + let just_agent = NamespacePath::agent_root(); + assert!(!just_agent.is_agent_root()); + } + + #[test] + fn test_new_agent_root() { + let alice_root = NamespacePath::new_agent_root(b"alice").unwrap(); + assert_eq!(alice_root.as_bytes(), b"agent.alice"); + assert!(alice_root.is_agent_root()); + + let bob_root = NamespacePath::new_agent_root(b"bob").unwrap(); + assert_eq!(bob_root.as_bytes(), b"agent.bob"); + assert!(bob_root.is_agent_root()); + + assert!(NamespacePath::new_agent_root(b"alice123").is_ok()); + assert!(NamespacePath::new_agent_root(b"alice-test").is_ok()); + assert!(NamespacePath::new_agent_root(b"alice_test").is_ok()); + + assert!( + NamespacePath::new_agent_root(b"Alice").is_err(), + "uppercase should fail" + ); + assert!( + NamespacePath::new_agent_root(b"alice!").is_err(), + "special chars should fail" + ); + assert!( + NamespacePath::new_agent_root(b"").is_err(), + "empty name should fail" + ); + } } diff --git a/pallets/torus0/src/agent.rs b/pallets/torus0/src/agent.rs index 4404f84a..b2c40e09 100644 --- a/pallets/torus0/src/agent.rs +++ b/pallets/torus0/src/agent.rs @@ -1,7 +1,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; use pallet_emission0_api::Emission0Api; use pallet_governance_api::GovernanceApi; -use pallet_torus0_api::{NamespacePath, NAMESPACE_AGENT_PREFIX}; +use pallet_torus0_api::NamespacePath; use polkadot_sdk::{ frame_election_provider_support::Get, frame_support::{ @@ -78,8 +78,7 @@ pub fn register( crate::Error::::TooManyAgentRegistrationsThisInterval ); - let namespace_path: Vec<_> = [NAMESPACE_AGENT_PREFIX, &name].concat(); - let namespace_path = NamespacePath::new_agent(&namespace_path).map_err(|err| { + let namespace_path = NamespacePath::new_agent_root(&name).map_err(|err| { warn!("{agent_key:?} tried using invalid name: {err:?}"); crate::Error::::InvalidNamespacePath })?; @@ -140,8 +139,7 @@ pub fn unregister(agent_key: AccountIdOf) -> DispatchResult let agent = crate::Agents::::get(&agent_key).ok_or(crate::Error::::AgentDoesNotExist)?; - let namespace_path: Vec<_> = [NAMESPACE_AGENT_PREFIX, &agent.name].concat(); - let namespace_path = NamespacePath::new_agent(&namespace_path) + let namespace_path = NamespacePath::new_agent_root(&agent.name) .map_err(|_| crate::Error::::InvalidNamespacePath)?; crate::namespace::delete_namespace::( crate::namespace::NamespaceOwnership::Account(agent_key.clone()), diff --git a/pallets/torus0/src/lib.rs b/pallets/torus0/src/lib.rs index 51ec6d7d..95906339 100644 --- a/pallets/torus0/src/lib.rs +++ b/pallets/torus0/src/lib.rs @@ -390,8 +390,8 @@ pub mod pallet { NamespacePath::new_agent(&path).map_err(|_| Error::::InvalidNamespacePath)?; ensure!( - !T::Permission0::is_delegating_namespace(&owner, &namespace_path), - Error::::NamespaceBeingDelegated + !namespace_path.is_agent_root(), + Error::::InvalidNamespacePath ); namespace::delete_namespace::(NamespaceOwnership::Account(owner), namespace_path) diff --git a/pallets/torus0/src/migrations.rs b/pallets/torus0/src/migrations.rs index 53c6bc02..a167e334 100644 --- a/pallets/torus0/src/migrations.rs +++ b/pallets/torus0/src/migrations.rs @@ -64,7 +64,7 @@ pub mod v4 { } pub mod v5 { - use pallet_torus0_api::{NamespacePath, NAMESPACE_AGENT_PREFIX}; + use pallet_torus0_api::NamespacePath; use polkadot_sdk::{ frame_support::{migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade}, sp_tracing::{error, info}, @@ -138,15 +138,10 @@ pub mod v5 { continue; }; - let path: polkadot_sdk::sp_std::vec::Vec<_> = - [NAMESPACE_AGENT_PREFIX, agent_name.as_bytes()].concat(); - let path = match NamespacePath::new_agent(&path) { + let path = match NamespacePath::new_agent_root(agent_name.as_bytes()) { Ok(path) => path, Err(err) => { - error!( - "cannot create path for agent {agent_name:?} ({:?}): {err:?}", - core::str::from_utf8(&path) - ); + error!("cannot create path for agent {agent_name:?}: {err:?}"); continue; } }; diff --git a/pallets/torus0/src/namespace.rs b/pallets/torus0/src/namespace.rs index 6544b79a..ce21e4b4 100644 --- a/pallets/torus0/src/namespace.rs +++ b/pallets/torus0/src/namespace.rs @@ -1,5 +1,6 @@ use codec::{Decode, Encode, MaxEncodedLen}; use pallet_governance_api::GovernanceApi; +use pallet_permission0_api::Permission0NamespacesApi; use polkadot_sdk::{ frame_support::{ traits::{ExistenceRequirement, ReservableCurrency}, @@ -262,6 +263,13 @@ pub fn delete_namespace( Error::::NamespaceNotFound ); + if let NamespaceOwnership::Account(owner) = &owner { + ensure!( + !T::Permission0::is_delegating_namespace(owner, &path), + Error::::NamespaceBeingDelegated + ); + } + let mut total_deposit = BalanceOf::::zero(); let namespaces_to_delete: Vec<_> = Namespaces::::iter_prefix(&owner) .filter_map(|(other, metadata)| { diff --git a/pallets/torus0/tests/agent.rs b/pallets/torus0/tests/agent.rs index 5826c429..ce7588ed 100644 --- a/pallets/torus0/tests/agent.rs +++ b/pallets/torus0/tests/agent.rs @@ -1,5 +1,6 @@ use pallet_governance_api::GovernanceApi; use pallet_torus0::{agent::Agent, AgentUpdateCooldown, Agents, Burn, Error}; +use pallet_torus0_api::NamespacePath; use polkadot_sdk::{frame_support::assert_err, sp_core::Get, sp_runtime::Percent}; use test_utils::{ assert_ok, clear_cooldown, get_balance, get_origin, @@ -18,7 +19,7 @@ fn register_correctly() { let agent_id = 0; let allocator_id = 1; - let name = b"agent".to_vec(); + let name = b"alice".to_vec(); let url = b"idk://agent".to_vec(); let metadata = b"idk://agent".to_vec(); @@ -64,6 +65,11 @@ fn register_correctly() { Some(allocator_id) ); + assert!(pallet_torus0::Namespaces::::contains_key( + pallet_torus0::namespace::NamespaceOwnership::Account(agent_id), + "agent.alice".parse::().unwrap() + )); + assert_err!( pallet_torus0::agent::register::( agent_id, @@ -339,7 +345,7 @@ fn register_more_than_registrations_per_interval() { fn unregister_correctly() { test_utils::new_test_ext().execute_with(|| { let agent = 0; - let name = b"agent".to_vec(); + let name = b"alice".to_vec(); let url = b"idk://agent".to_vec(); let metadata = b"idk://agent".to_vec(); @@ -355,10 +361,20 @@ fn unregister_correctly() { metadata.clone(), )); + assert!(pallet_torus0::Namespaces::::contains_key( + pallet_torus0::namespace::NamespaceOwnership::Account(agent), + "agent.alice".parse::().unwrap() + )); + assert_ok!(pallet_torus0::Pallet::::unregister_agent(get_origin( agent ))); + assert!(!pallet_torus0::Namespaces::::contains_key( + pallet_torus0::namespace::NamespaceOwnership::Account(agent), + "agent.alice".parse::().unwrap() + )); + assert!(pallet_torus0::Agents::::get(agent).is_none()); }); } diff --git a/pallets/torus0/tests/namespace.rs b/pallets/torus0/tests/namespace.rs index a6175755..23bd358c 100644 --- a/pallets/torus0/tests/namespace.rs +++ b/pallets/torus0/tests/namespace.rs @@ -199,10 +199,7 @@ fn namespace_fee_monotonic_increase() { let current_fee = config.namespace_fee(count).unwrap(); assert!( current_fee >= prev_fee, - "agent.alice.fee should increase or stay same as count increases: {} > {} at count {}", - current_fee, - prev_fee, - count + "agent.alice.fee should increase or stay same as count increases: {current_fee} > {prev_fee} at count {count}" ); prev_fee = current_fee; } @@ -888,3 +885,281 @@ fn create_namespace_insufficient_balance() { ); }); } + +#[test] +fn delete_namespace_not_exists() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + + assert_err!( + pallet_torus0::Pallet::::delete_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.nonexistent".to_vec()) + ), + pallet_torus0::Error::::NamespaceNotFound + ); + }); +} + +#[test] +fn delete_namespace_root_agent_entry() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.compute".to_vec()) + )); + + assert!(pallet_torus0::Namespaces::::contains_key( + pallet_torus0::namespace::NamespaceOwnership::Account(0), + "agent.alice.compute".parse::().unwrap() + )); + + assert_err!( + pallet_torus0::Pallet::::delete_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice".to_vec()) + ), + pallet_torus0::Error::::InvalidNamespacePath + ); + }); +} + +#[test] +fn delete_namespace_being_delegated() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.compute".to_vec()) + )); + + let mut paths = polkadot_sdk::sp_runtime::BoundedBTreeSet::new(); + paths + .try_insert(b"agent.alice.compute".to_vec().try_into().unwrap()) + .unwrap(); + + assert_ok!(test_utils::Permission0::grant_namespace_permission( + get_origin(0), + 1, + paths, + test_utils::pallet_permission0::PermissionDuration::Indefinite, + test_utils::pallet_permission0::RevocationTerms::RevocableByGrantor, + )); + + assert_err!( + pallet_torus0::Pallet::::delete_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.compute".to_vec()) + ), + pallet_torus0::Error::::NamespaceBeingDelegated + ); + }); +} + +#[test] +fn delete_namespace_deposit_refund() { + new_test_ext().execute_with(|| { + set_namespace_config(); + let initial_balance = as_tors(1000); + register_agent_with(0, "alice", initial_balance); + + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.compute".to_vec()) + )); + + let balance_after_creation = Balances::free_balance(0); + let reserved_after_creation = Balances::reserved_balance(0); + + assert!(balance_after_creation < initial_balance); + assert!(reserved_after_creation > 0); + + // Sum deposits from all created namespaces + let ownership = pallet_torus0::namespace::NamespaceOwnership::Account(0); + let mut total_deposit_from_storage = 0u128; + for (_, metadata) in pallet_torus0::Namespaces::::iter_prefix(&ownership) { + total_deposit_from_storage += metadata.deposit; + } + assert_eq!(reserved_after_creation, total_deposit_from_storage); + + // Get deposit amount for the namespace being deleted + let compute_path = "agent.alice.compute".parse::().unwrap(); + let compute_deposit = pallet_torus0::Namespaces::::get(&ownership, &compute_path) + .map(|m| m.deposit) + .unwrap_or(0); + + assert_ok!(pallet_torus0::Pallet::::delete_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.compute".to_vec()) + )); + + let balance_after_deletion = Balances::free_balance(0); + let reserved_after_deletion = Balances::reserved_balance(0); + + // Verify the compute namespace deposit was refunded + assert_eq!( + reserved_after_deletion, + reserved_after_creation - compute_deposit + ); + assert_eq!( + balance_after_deletion, + balance_after_creation + compute_deposit + ); + + // Verify remaining deposits match what's in storage + let mut remaining_deposit = 0u128; + for (_, metadata) in pallet_torus0::Namespaces::::iter_prefix(&ownership) { + remaining_deposit += metadata.deposit; + } + assert_eq!(reserved_after_deletion, remaining_deposit); + }); +} + +#[test] +fn delete_namespace_hierarchy_deposit_refund() { + new_test_ext().execute_with(|| { + set_namespace_config(); + let initial_balance = as_tors(1000); + register_agent_with(0, "alice", initial_balance); + + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.v1.compute.gpu".to_vec()) + )); + + let reserved_after_creation = Balances::reserved_balance(0); + let balance_after_creation = Balances::free_balance(0); + + let ownership = pallet_torus0::namespace::NamespaceOwnership::Account(0); + let mut total_deposit_from_storage = 0u128; + for (_, metadata) in pallet_torus0::Namespaces::::iter_prefix(&ownership) { + total_deposit_from_storage += metadata.deposit; + } + assert_eq!(reserved_after_creation, total_deposit_from_storage); + + let paths_to_delete = [ + "agent.alice.v1", + "agent.alice.v1.compute", + "agent.alice.v1.compute.gpu", + ]; + let mut deposits_to_refund = 0u128; + for path_str in &paths_to_delete { + let path = path_str.parse::().unwrap(); + if let Some(metadata) = pallet_torus0::Namespaces::::get(&ownership, &path) { + deposits_to_refund += metadata.deposit; + } + } + + assert_ok!(pallet_torus0::Pallet::::delete_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.v1".to_vec()) + )); + + let reserved_after_deletion = Balances::reserved_balance(0); + let balance_after_deletion = Balances::free_balance(0); + + assert_eq!( + reserved_after_deletion, + reserved_after_creation - deposits_to_refund + ); + assert_eq!( + balance_after_deletion, + balance_after_creation + deposits_to_refund + ); + + for path in paths_to_delete { + assert!(!pallet_torus0::Namespaces::::contains_key( + ownership.clone(), + path.parse::().unwrap() + )); + } + + let mut remaining_deposit = 0u128; + for (_, metadata) in pallet_torus0::Namespaces::::iter_prefix(&ownership) { + remaining_deposit += metadata.deposit; + } + assert_eq!(reserved_after_deletion, remaining_deposit); + }); +} + +#[test] +fn delete_namespace_not_owner() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + register_agent_with(1, "bob", as_tors(1000)); + + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.compute".to_vec()) + )); + + assert_err!( + pallet_torus0::Pallet::::delete_namespace( + get_origin(1), + BoundedVec::truncate_from(b"agent.alice.compute".to_vec()) + ), + pallet_torus0::Error::::NamespaceNotFound + ); + }); +} + +#[test] +fn delete_namespace_partial_hierarchy() { + new_test_ext().execute_with(|| { + set_namespace_config(); + register_agent_with(0, "alice", as_tors(1000)); + + for path in [ + "agent.alice.v1.compute.gpu", + "agent.alice.v1.storage.disk", + "agent.alice.v2.network", + ] { + assert_ok!(pallet_torus0::Pallet::::create_namespace( + get_origin(0), + BoundedVec::truncate_from(path.as_bytes().to_vec()) + )); + } + + let initial_count = pallet_torus0::NamespaceCount::::get( + pallet_torus0::namespace::NamespaceOwnership::Account(0), + ); + assert_eq!(initial_count, 8); // agent.alice + 7 other namespaces + + assert_ok!(pallet_torus0::Pallet::::delete_namespace( + get_origin(0), + BoundedVec::truncate_from(b"agent.alice.v1.compute".to_vec()) + )); + + let count_after = pallet_torus0::NamespaceCount::::get( + pallet_torus0::namespace::NamespaceOwnership::Account(0), + ); + assert_eq!(count_after, 6); + + for path in ["agent.alice.v1.compute", "agent.alice.v1.compute.gpu"] { + assert!(!pallet_torus0::Namespaces::::contains_key( + pallet_torus0::namespace::NamespaceOwnership::Account(0), + path.parse::().unwrap() + )); + } + + for path in [ + "agent.alice.v1", + "agent.alice.v1.storage", + "agent.alice.v1.storage.disk", + "agent.alice.v2", + "agent.alice.v2.network", + ] { + assert!(pallet_torus0::Namespaces::::contains_key( + pallet_torus0::namespace::NamespaceOwnership::Account(0), + path.parse::().unwrap() + )); + } + }); +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml index d24c8f51..19d030e4 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.84.1" +channel = "1.88.0" components = [ "clippy", "rustfmt", diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 20c4ac9b..489e51bf 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -266,7 +266,7 @@ impl pallet_permission0::Config for Test { type MinAutoDistributionThreshold = MinAutoDistributionThreshold; - type MaxNamespacesPerPermission = ConstU32<0>; + type MaxNamespacesPerPermission = ConstU32<10>; } impl pallet_balances::Config for Test { From 498642de53cda8d8b98340a0616eb1244089f680 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 7 Jul 2025 10:52:28 -0300 Subject: [PATCH 44/46] chore: final migrations tweaks (#118) We are getting ready for the mainnet release on July 7th. This change finishes the name porting logic converting agent names to complying namespace names, by lowering and removing whitespace from the names. --- pallets/governance/src/migrations.rs | 174 +------------------------- pallets/governance/src/proposal.rs | 12 +- pallets/permission0/src/migrations.rs | 34 ----- pallets/torus0/api/src/lib.rs | 2 +- pallets/torus0/src/migrations.rs | 9 +- runtime/src/lib.rs | 4 - xtask/src/run.rs | 2 - 7 files changed, 8 insertions(+), 229 deletions(-) diff --git a/pallets/governance/src/migrations.rs b/pallets/governance/src/migrations.rs index 66add872..7ce39046 100644 --- a/pallets/governance/src/migrations.rs +++ b/pallets/governance/src/migrations.rs @@ -5,7 +5,7 @@ use polkadot_sdk::frame_support::{ use crate::{Config, Pallet}; -pub mod v3 { +pub mod v5 { use pallet_permission0_api::{CuratorPermissions, Permission0CuratorApi, PermissionDuration}; use polkadot_sdk::{ frame_system::RawOrigin, @@ -159,175 +159,3 @@ pub mod v3 { } } } - -pub mod v4 { - use pallet_permission0_api::{CuratorPermissions, Permission0CuratorApi, PermissionDuration}; - use polkadot_sdk::{ - frame_system::RawOrigin, - sp_tracing::{info, warn}, - }; - - use super::*; - - pub type Migration = VersionedMigration<3, 4, MigrateToV4, Pallet, W>; - pub struct MigrateToV4(core::marker::PhantomData); - - mod old_storage { - use polkadot_sdk::frame_support::{storage_alias, Identity}; - - use crate::AccountIdOf; - - #[storage_alias] - pub type Curators = - StorageMap, Identity, AccountIdOf, ()>; - } - - impl UncheckedOnRuntimeUpgrade for MigrateToV4 { - fn on_runtime_upgrade() -> Weight { - for (curator, _) in old_storage::Curators::::iter() { - let res = <::Permission0>::grant_curator_permission( - RawOrigin::Root.into(), - curator.clone(), - CuratorPermissions::all(), - None, - PermissionDuration::Indefinite, - pallet_permission0_api::RevocationTerms::RevocableByGrantor, - ); - - match res { - Ok(perm_id) => info!("migrated curator {curator:?} to permission0: {perm_id}"), - Err(err) => { - warn!("Could not migrate curator {curator:?} to permission0: {err:?}"); - } - } - } - - Weight::zero() - } - } -} - -pub mod v5 { - use crate::proposal::{GlobalParamsData, ProposalData}; - - use super::*; - - pub type Migration = VersionedMigration<4, 5, MigrateToV5, Pallet, W>; - pub struct MigrateToV5(core::marker::PhantomData); - - mod old_storage { - use codec::{Decode, Encode, MaxEncodedLen}; - use polkadot_sdk::{ - frame_support::{storage_alias, DebugNoBound, Identity}, - polkadot_sdk_frame::prelude::BlockNumberFor, - sp_core::ConstU32, - sp_runtime::{BoundedVec, Percent}, - }; - use scale_info::TypeInfo; - - use crate::{ - proposal::{ProposalId, ProposalStatus}, - AccountIdOf, BalanceOf, - }; - - #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen)] - #[scale_info(skip_type_params(T))] - pub struct Proposal { - pub id: ProposalId, - pub proposer: AccountIdOf, - pub expiration_block: BlockNumberFor, - pub data: ProposalData, - pub status: ProposalStatus, - pub metadata: BoundedVec>, - pub proposal_cost: BalanceOf, - pub creation_block: BlockNumberFor, - } - - #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] - #[scale_info(skip_type_params(T))] - pub enum ProposalData { - GlobalParams(GlobalParamsData), - GlobalCustom, - Emission { - recycling_percentage: Percent, - treasury_percentage: Percent, - incentives_ratio: Percent, - }, - TransferDaoTreasury { - account: AccountIdOf, - amount: BalanceOf, - }, - } - - #[derive(Clone, DebugNoBound, TypeInfo, Decode, Encode, MaxEncodedLen, PartialEq, Eq)] - #[scale_info(skip_type_params(T))] - pub struct GlobalParamsData { - pub min_name_length: u16, - pub max_name_length: u16, - pub max_allowed_agents: u16, - pub min_weight_control_fee: u8, - pub min_staking_fee: u8, - pub dividends_participation_weight: Percent, - pub proposal_cost: BalanceOf, - } - - #[storage_alias] - pub type Proposals = - StorageMap, Identity, ProposalId, Proposal>; - } - - impl UncheckedOnRuntimeUpgrade for MigrateToV5 { - fn on_runtime_upgrade() -> Weight { - for (id, proposal) in old_storage::Proposals::iter() { - let new_data = match proposal.data { - old_storage::ProposalData::GlobalParams(old_storage::GlobalParamsData { - min_name_length, - max_name_length, - min_weight_control_fee, - min_staking_fee, - dividends_participation_weight, - proposal_cost, - .. - }) => ProposalData::GlobalParams(GlobalParamsData { - min_name_length, - max_name_length, - min_weight_control_fee, - min_staking_fee, - dividends_participation_weight, - namespace_pricing_config: - ::DefaultNamespacePricingConfig::get(), - proposal_cost, - }), - old_storage::ProposalData::GlobalCustom => ProposalData::GlobalCustom, - old_storage::ProposalData::Emission { - recycling_percentage, - treasury_percentage, - incentives_ratio, - } => ProposalData::Emission { - recycling_percentage, - treasury_percentage, - incentives_ratio, - }, - old_storage::ProposalData::TransferDaoTreasury { account, amount } => { - ProposalData::TransferDaoTreasury { account, amount } - } - }; - - let new_proposal = crate::proposal::Proposal { - id: proposal.id, - proposer: proposal.proposer, - expiration_block: proposal.expiration_block, - data: new_data, - status: proposal.status, - metadata: proposal.metadata, - proposal_cost: proposal.proposal_cost, - creation_block: proposal.creation_block, - }; - - crate::Proposals::::set(id, Some(new_proposal)); - } - - Weight::zero() - } - } -} diff --git a/pallets/governance/src/proposal.rs b/pallets/governance/src/proposal.rs index 1a44fd80..fa3d306f 100644 --- a/pallets/governance/src/proposal.rs +++ b/pallets/governance/src/proposal.rs @@ -548,16 +548,12 @@ fn create_unrewarded_proposal( ) { let mut reward_votes_for = BoundedBTreeMap::new(); for (key, value) in votes_for { - reward_votes_for - .try_insert(key, value) - .expect("this wont exceed u32::MAX"); + let _ = reward_votes_for.try_insert(key, value); } let mut reward_votes_against: AccountStakes = BoundedBTreeMap::new(); for (key, value) in votes_against { - reward_votes_against - .try_insert(key, value) - .expect("this probably wont exceed u32::MAX"); + let _ = reward_votes_against.try_insert(key, value); } UnrewardedProposals::::insert( @@ -634,9 +630,7 @@ pub fn tick_proposal_rewards(block_number: BlockNumberFor) .chain(unrewarded_proposal.votes_against.into_iter()) { let curr_stake = *account_stakes.get(&acc_id).unwrap_or(&0u128); - account_stakes - .try_insert(acc_id, curr_stake.saturating_add(stake)) - .expect("infallible"); + let _ = account_stakes.try_insert(acc_id, curr_stake.saturating_add(stake)); } match get_reward_allocation::(&governance_config, n) { diff --git a/pallets/permission0/src/migrations.rs b/pallets/permission0/src/migrations.rs index 67f10238..8b137891 100644 --- a/pallets/permission0/src/migrations.rs +++ b/pallets/permission0/src/migrations.rs @@ -1,35 +1 @@ -pub mod v2 { - use polkadot_sdk::{ - frame_support::{migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade}, - sp_weights::Weight, - }; - use crate::{Config, Pallet}; - - pub type Migration = VersionedMigration<1, 2, MigrateToV2, Pallet, W>; - pub struct MigrateToV2(core::marker::PhantomData); - - impl UncheckedOnRuntimeUpgrade for MigrateToV2 { - fn on_runtime_upgrade() -> Weight { - Weight::zero() - } - } -} - -pub mod v3 { - use polkadot_sdk::{ - frame_support::{migrations::VersionedMigration, traits::UncheckedOnRuntimeUpgrade}, - sp_weights::Weight, - }; - - use crate::{Config, Pallet}; - - pub type Migration = VersionedMigration<2, 3, MigrateToV3, Pallet, W>; - pub struct MigrateToV3(core::marker::PhantomData); - - impl UncheckedOnRuntimeUpgrade for MigrateToV3 { - fn on_runtime_upgrade() -> Weight { - Weight::zero() - } - } -} diff --git a/pallets/torus0/api/src/lib.rs b/pallets/torus0/api/src/lib.rs index 455f65a6..ef4c7f14 100644 --- a/pallets/torus0/api/src/lib.rs +++ b/pallets/torus0/api/src/lib.rs @@ -79,7 +79,7 @@ pub struct NamespacePath(NamespacePathInner); impl NamespacePath { /// The root agent namespace entry. pub fn agent_root() -> NamespacePath { - NamespacePath(b"agent".to_vec().try_into().unwrap()) + NamespacePath(NamespacePathInner::truncate_from(b"agent".to_vec())) } /// Create a new root agent namespace path from the agent name diff --git a/pallets/torus0/src/migrations.rs b/pallets/torus0/src/migrations.rs index a167e334..4c68ae9d 100644 --- a/pallets/torus0/src/migrations.rs +++ b/pallets/torus0/src/migrations.rs @@ -111,8 +111,9 @@ pub mod v5 { let _ = storage::NamespaceCount::::clear(u32::MAX, None); let path = NamespacePath::agent_root(); + #[allow(deprecated)] if let Err(err) = - crate::namespace::create_namespace::(NamespaceOwnership::System, path) + crate::namespace::create_namespace0::(NamespaceOwnership::System, path, false) { error!("failed to create root agent namespace: {err:?}"); return Weight::default(); @@ -127,11 +128,7 @@ pub mod v5 { continue; }; - let agent_name = if cfg!(feature = "testnet") { - agent_name.to_ascii_lowercase().replace(' ', "-") - } else { - agent_name.into() - }; + let agent_name = agent_name.trim().to_ascii_lowercase().replace(' ', "-"); let Ok(bounded_name) = agent_name.as_bytes().to_vec().try_into() else { error!("cannot lower case agent {agent_name:?}"); diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 47264897..a87c0b01 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -84,11 +84,7 @@ pub type SignedPayload = sp_runtime::generic::SignedPayload, - pallet_governance::migrations::v4::Migration, pallet_governance::migrations::v5::Migration, - pallet_permission0::migrations::v2::Migration, - pallet_permission0::migrations::v3::Migration, pallet_emission0::migrations::v2::Migration, pallet_torus0::migrations::v4::Migration, pallet_torus0::migrations::v5::Migration, diff --git a/xtask/src/run.rs b/xtask/src/run.rs index 97fff6f4..6b570815 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -78,8 +78,6 @@ pub(super) fn run(mut r: flags::Run) { ops::key_insert_cmd(&path, &chain_spec, &account.suri, "aura"); ops::key_insert_cmd(&path, &chain_spec, &account.suri, "gran"); - dbg!(&chain_spec); - let _run = ops::run_node(&path, &chain_spec, &node, &r.bootnodes, r.isolated) .spawn() .unwrap() From e0b999d2b36055a1f01a50c10fa61dca29d2ec91 Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 7 Jul 2025 11:12:42 -0300 Subject: [PATCH 45/46] chore: update changelog for spec 21 --- CHANGELOG.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 196abe02..b6fd77a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,70 @@ # Changelog +## Spec 21 + +This release introduces major architectural changes to enable decentralized economic relationships, improved governance flexibility, and preparation for off-chain service integration. The changes span several months of development focused on creating a more sophisticated and scalable network. + +### Major Features + +#### Permission System (permission0 pallet) + +A comprehensive permission framework that revolutionizes how agents interact economically within the network: + +- Agents can now share their token emissions with contributors through recursive permission trees. Supports percentage-based streams or fixed amounts, with flexible distribution controls (manual, automatic threshold, scheduled). +- Permissions can be managed by arbiters (multi-sig groups) for enhanced security and decentralized control. +- Governance powers are now granular with specific permissions for application review, whitelist management, and penalty control. Replaces the old curator system with a more flexible approach. +- Built-in protections against double-spending and infinite recursion ensure tokenomics. + +#### Namespace System + +A hierarchical naming system that functions as decentralized DNS/capability listing for agent services: + +- Agents can create dot-separated paths like `agent.alice.api.v2` to organize their off-chain services. +- Owning a namespace gives control over all sub-paths, enabling structured delegation of services. +- Base fees go to treasury while refundable deposits incentivize efficient storage use. +- Namespaces can be delegated through the permission system, enabling complex service architectures. + +#### Agent Management Improvements + +- Agent names are automatically converted to namespace-compliant format (lowercase, no spaces) during the upgrade. +- Curators can now freeze/unfreeze agents, adding a new governance tool for spam control. +- Agent metadata updates now have cooldowns to prevent spam and ensure stability. +- Burn parameters adjusted for better economic balance during high registration activity. + +#### Economic Enhancements + +- All transaction fees now flow to the treasury instead of being burned, providing sustainable funding for network development. +- Only whitelisted agents receive emissions, ensuring quality participants chosen by the DAO are rewarded. +- Permission holders can dynamically adjust how they distribute received emissions. +- Distribution remainders are now properly accumulated, preventing token loss. + +#### Developer Experience + +- Proof-of-work based faucet for obtaining testnet tokens, preventing abuse while maintaining accessibility. +- Comprehensive docs for all pallets now auto-published to GitHub Pages. +- New `torus0_namespacePathCreationCost` RPC for calculating namespace fees upfront. +- Integrated coverage reporting with `cargo xtask coverage` for maintaining code quality. + +### Bug Fixes & Safety Improvements + +- Critical fix ensuring stakes are properly refunded before clearing storage during de-registration. +- Banned arithmetic side effects throughout the runtime, using saturating operations to prevent overflows. +- All agents now automatically delegate weights to allocators, simplifying the onboarding process. + +### Governance Changes + +- Instead of all-or-nothing curator status, specific permissions can be granted. +- Improved with better event emissions and clearer execution flows. +- Now integrated with the permission system for more flexible control. + +### Infrastructure + +- Enhanced GitHub Actions for automated testing, documentation, and Docker builds. +- Added development container configuration for consistent environments. +- Migrated CI infrastructure for better performance. + +This release represents a fundamental evolution of the Torus Network, creating the foundation for a truly decentralized economy where agents can form complex relationships, share resources, and organize their services in meaningful ways. + ## Spec version 12 ### Critical Migration & Bug Fix @@ -50,7 +115,7 @@ You can find the migration here: The migration calculates the difference between `TotalStake` (which remained **correctly** unchanged) and sums all actual stakes on the network. The difference is then sent to a recovery account, and redistributed to the original stakers via script -**Original Stakers (OS)** +**Original Stakers (OS)** ```text 5CuBSdUuBeLVxtzrTtrdiCjipEgjbvUoMJjxrss4T9f1MEoZ: 178467095451535513057748 @@ -87,4 +152,3 @@ The migration calculates the difference between `TotalStake` (which remained **c - Applied saturating arithmetic in various runtime and pallet modules to prevent overflow issues. - Improved arithmetic safety and robustness in emission and governance modules. - Refined author identification and gas limit calculations with safer arithmetic operations. - From 7952818efab2093719ac18964f43b7910a1e35ac Mon Sep 17 00:00:00 2001 From: Luiz Carvalho Date: Mon, 7 Jul 2025 11:22:23 -0300 Subject: [PATCH 46/46] chore: update claudio codigus guide --- CLAUDE.md | 145 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 133 insertions(+), 12 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 760142ac..caee3b25 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,10 @@ # CLAUDE.md -This file provides guidance to Claude Code when working with this Substrate blockchain repository. +This file provides strict guidance to Claude Code when working with this Substrate blockchain repository. These rules are non-negotiable and must be followed exactly. + +## Project Overview + +Torus is a stake-driven peer-to-peer network built on Substrate. The blockchain manages agents (validators and miners), token emissions, staking, and governance. Code quality is critical - runtime panics will halt the entire chain. ## References @@ -8,27 +12,144 @@ This file provides guidance to Claude Code when working with this Substrate bloc - @CONTRIBUTING.md - Development setup (Nix), guidelines, testing - @docs/pallet-structure.md - Architecture and API design - @docs/xtask-manual.md - Development tooling guide +- @docs/linear-emission.md - Token distribution algorithm ## Core Pallets -- **`torus0`**: Agent registration, staking, burn mechanisms -- **`emission0`**: Token distribution with linear emission algorithm -- **`governance`**: Proposals, voting, treasury, roles +- **`torus0`**: Agent registration, staking, burn mechanisms, fee management +- **`emission0`**: Token distribution with linear emission algorithm, weight control +- **`governance`**: Proposals, voting, treasury, roles (allocators, curators) - **`permission0`**: Permission and access control +## Architecture Principles + +- **API-first design**: Each pallet has separate `api` crate to prevent circular dependencies +- **Domain separation**: Complex logic split into focused modules (agent.rs, stake.rs, etc.) +- **Storage efficiency**: Use container types to minimize state size +- **Zero-panic policy**: Runtime code must NEVER panic under any circumstances + ## Essential Commands ```sh -nix develop # Enter development environment -just # Run checks and tests (default) +# Development environment (REQUIRED - provides correct Rust version, dependencies) +nix develop + +# Running tests and checks +just # Run all checks and tests (default) just check # Clippy linting only just test # Test suite only -cargo xtask coverage # Test coverage report +cargo xtask coverage # Generate code coverage report + +# Local development +cargo xtask run local --alice # Run local node with Alice account +cargo xtask generate-spec gen-new # Create new chain spec +cargo build --release # Build the node ``` -## Critical Safety Rules +## STRICT RUST CODING RULES + +### Error Handling - CRITICAL SAFETY + +- **MUST NEVER** use `unwrap()`, `expect()`, `assert!()`, or any panicking operations in pallet code +- **MUST ALWAYS** use `ensure!` macro for validation, NEVER `assert!` +- **MUST ALWAYS** use the `?` operator for error propagation +- **MUST ALWAYS** use pattern matching with proper error handling: + ```rust + let Some(value) = some_option else { + return Err(Error::::SomeError.into()); + }; + ``` + +### Arithmetic Operations - NO EXCEPTIONS + +- **MUST NEVER** use raw arithmetic operators (`+`, `-`, `*`, `/`) in runtime code +- **MUST ALWAYS** use `saturating_add()`, `saturating_sub()`, `saturating_mul()` for balance operations +- **MUST ALWAYS** use `checked_div()` for division - NEVER the `/` operator +- **MUST ALWAYS** use `FixedU128` for ALL percentage and ratio calculations +- **MUST ALWAYS** handle overflow explicitly with `checked_*` operations when needed + +### Function Structure - MANDATORY PATTERNS + +- **MUST ALWAYS** write functions as generic `pub fn name()` rather than `impl Pallet` +- **MUST ALWAYS** use type aliases: `AccountIdOf`, `BalanceOf`, etc. +- **MUST ALWAYS** validate ALL inputs in private functions before storage operations +- **MUST NEVER** expose unsafe operations through public functions + +### Storage Operations - STRICT REQUIREMENTS + +- **MUST ALWAYS** use `try_mutate` when the operation can fail +- **MUST ALWAYS** check existence with `contains_key` before accessing storage +- **MUST ALWAYS** use `BoundedVec` for ALL storage collections +- **MUST ALWAYS** validate data BEFORE storage mutations +- **MUST NEVER** perform multiple storage writes when one would suffice + +### Extrinsic Requirements - NO FLEXIBILITY + +- **MUST ALWAYS** use manual call indexing: `#[pallet::call_index(n)]` +- **MUST ALWAYS** specify weight info for ALL extrinsics +- **MUST ALWAYS** emit appropriate events after state changes +- **MUST ALWAYS** use `ensure_signed(origin)?` at the start of signed extrinsics + +### Documentation - MANDATORY + +- **MUST ALWAYS** document ALL storage items, extrinsics, errors, and public functions +- **MUST ALWAYS** use `///` doc comments for items exported to client SDKs +- **MUST NEVER** leave TODOs or incomplete implementations in production code + +### Import and Dependency Rules + +- **MUST ALWAYS** use `polkadot_sdk` umbrella crate - NEVER individual substrate dependencies +- **MUST ALWAYS** use `use crate::*` for intra-pallet imports +- **MUST NEVER** use wildcard imports except for preludes + +### Type Safety - ZERO TOLERANCE + +- **MUST ALWAYS** use `BoundedVec>` for storage, NEVER `Vec` +- **MUST ALWAYS** convert with error handling: `BoundedVec::try_from(vec)?` +- **MUST ALWAYS** use proper type conversions with `.try_into()` and handle errors +- **MUST NEVER** use `as` for lossy numeric conversions + +### Common Code Patterns - REQUIRED + +- **MUST ALWAYS** emit events after successful state changes: + ```rust + Pallet::::deposit_event(Event::::SomethingHappened(who, what)); + ``` +- **MUST ALWAYS** validate string data is UTF-8: + ```rust + ensure!(core::str::from_utf8(bytes).is_ok(), Error::::InvalidUtf8); + ``` +- **MUST ALWAYS** check bounds before operations: + ```rust + ensure!(value <= T::MaxValue::get(), Error::::ValueTooLarge); + ``` + +### Testing Requirements - NON-NEGOTIABLE + +- **MUST ALWAYS** write comprehensive tests for ALL extrinsics +- **MUST ALWAYS** test error conditions and edge cases +- **MUST ALWAYS** benchmark ALL extrinsics for weight calculation +- **MUST NEVER** merge code without adequate test coverage + +### Migration Safety - CRITICAL + +- **MUST ALWAYS** use `VersionedMigration` for storage migrations +- **MUST ALWAYS** increment storage version when changing storage +- **MUST NEVER** modify storage structure without a migration +- **MUST ALWAYS** test migrations with realistic data + +### Code Style - ENFORCED BY CI + +- **MUST ALWAYS** run `cargo fmt` before committing +- **MUST ALWAYS** fix ALL clippy warnings +- **MUST ALWAYS** use descriptive variable names, no single letters +- **MUST NEVER** use repetitive and redundant comments within code +- **MUST NEVER** ignore compiler or clippy warnings with `#[allow(...)]` + +### Before committing: -- Never use `unwrap()`, `expect()`, or panicking operations in pallet code -- Use `checked_div()` instead of `/` for arithmetic operations -- Panics in runtime code will halt the chain -- Use `FixedU128` for financial calculations +1. **MUST** run `cargo fmt` +2. **MUST** run `just check` and fix all warnings +3. **MUST** run `just test` and ensure all pass +4. **MUST** run `cargo xtask coverage` to verify coverage +5. **MUST** test runtime upgrades if storage changed