From 53cf27af4a1762737ca875ce4aa71f2ba2fa97b7 Mon Sep 17 00:00:00 2001 From: Dmitry Murzin Date: Fri, 24 May 2024 18:34:42 +0300 Subject: [PATCH] feat: Custom instructions in executor Signed-off-by: Dmitry Murzin --- Cargo.lock | 10 + client/Cargo.toml | 1 + .../integration/smartcontracts/Cargo.toml | 7 +- .../executor_custom_data_model/Cargo.toml | 14 + .../executor_custom_data_model/src/complex.rs | 258 ++++++++++++++++++ .../executor_custom_data_model/src/lib.rs | 8 + .../executor_custom_data_model/src/simple.rs | 17 ++ .../executor_custom_isi_complex/Cargo.toml | 23 ++ .../executor_custom_isi_complex/src/lib.rs | 82 ++++++ .../executor_custom_isi_simple/Cargo.toml | 23 ++ .../executor_custom_isi_simple/src/lib.rs | 60 ++++ client/tests/integration/upgrade.rs | 123 ++++++++- configs/swarm/executor.wasm | Bin 522309 -> 522621 bytes core/src/smartcontracts/isi/mod.rs | 3 + data_model/src/isi.rs | 25 +- data_model/src/lib.rs | 1 + data_model/src/transaction.rs | 1 + data_model/src/visit.rs | 3 + docs/source/references/schema.json | 21 +- schema/gen/src/lib.rs | 1 + smart_contract/executor/derive/src/default.rs | 1 + smart_contract/executor/src/default.rs | 16 ++ 22 files changed, 690 insertions(+), 8 deletions(-) create mode 100644 client/tests/integration/smartcontracts/executor_custom_data_model/Cargo.toml create mode 100644 client/tests/integration/smartcontracts/executor_custom_data_model/src/complex.rs create mode 100644 client/tests/integration/smartcontracts/executor_custom_data_model/src/lib.rs create mode 100644 client/tests/integration/smartcontracts/executor_custom_data_model/src/simple.rs create mode 100644 client/tests/integration/smartcontracts/executor_custom_isi_complex/Cargo.toml create mode 100644 client/tests/integration/smartcontracts/executor_custom_isi_complex/src/lib.rs create mode 100644 client/tests/integration/smartcontracts/executor_custom_isi_simple/Cargo.toml create mode 100644 client/tests/integration/smartcontracts/executor_custom_isi_simple/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index c9576dadd3a..945196ffdcb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1595,6 +1595,15 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "executor_custom_data_model" +version = "2.0.0-pre-rc.21" +dependencies = [ + "iroha_data_model", + "serde", + "serde_json", +] + [[package]] name = "expect-test" version = "1.5.0" @@ -2810,6 +2819,7 @@ dependencies = [ "derive_more", "displaydoc", "error-stack", + "executor_custom_data_model", "eyre", "futures-util", "hex", diff --git a/client/Cargo.toml b/client/Cargo.toml index 485f8556eef..4f0c0c9fd3a 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -90,6 +90,7 @@ iroha_wasm_builder = { workspace = true } iroha = { workspace = true } iroha_genesis = { workspace = true } test_network = { workspace = true } +executor_custom_data_model = { path = "tests/integration/smartcontracts/executor_custom_data_model" } tokio = { workspace = true, features = ["rt-multi-thread"] } criterion = { workspace = true, features = ["html_reports"] } diff --git a/client/tests/integration/smartcontracts/Cargo.toml b/client/tests/integration/smartcontracts/Cargo.toml index a03698db1b2..83f7869fe2b 100644 --- a/client/tests/integration/smartcontracts/Cargo.toml +++ b/client/tests/integration/smartcontracts/Cargo.toml @@ -15,6 +15,9 @@ members = [ "executor_with_custom_permission", "executor_remove_permission", "executor_with_migration_fail", + "executor_custom_isi_simple", + "executor_custom_isi_complex", + "executor_custom_data_model", "query_assets_and_save_cursor", "smart_contract_can_filter_queries", ] @@ -32,8 +35,10 @@ codegen-units = 1 # Further reduces binary size but increases compilation time [workspace.dependencies] iroha_smart_contract = { version = "=2.0.0-pre-rc.21", path = "../../../../smart_contract", features = ["debug"] } iroha_trigger = { version = "=2.0.0-pre-rc.21", path = "../../../../smart_contract/trigger", features = ["debug"] } -iroha_executor = { version = "=2.0.0-pre-rc.21", path = "../../../../smart_contract/executor" } +iroha_executor = { version = "=2.0.0-pre-rc.21", path = "../../../../smart_contract/executor", features = ["debug"] } iroha_schema = { version = "=2.0.0-pre-rc.21", path = "../../../../schema" } +iroha_data_model = { version = "=2.0.0-pre-rc.21", path = "../../../../data_model", default-features = false } +executor_custom_data_model = { version = "=2.0.0-pre-rc.21", path = "executor_custom_data_model" } parity-scale-codec = { version = "3.2.1", default-features = false } anyhow = { version = "1.0.71", default-features = false } diff --git a/client/tests/integration/smartcontracts/executor_custom_data_model/Cargo.toml b/client/tests/integration/smartcontracts/executor_custom_data_model/Cargo.toml new file mode 100644 index 00000000000..10c9c6f59c5 --- /dev/null +++ b/client/tests/integration/smartcontracts/executor_custom_data_model/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "executor_custom_data_model" + +edition.workspace = true +version.workspace = true +authors.workspace = true + +license.workspace = true + +[dependencies] +iroha_data_model.workspace = true + +serde_json.workspace = true +serde.workspace = true diff --git a/client/tests/integration/smartcontracts/executor_custom_data_model/src/complex.rs b/client/tests/integration/smartcontracts/executor_custom_data_model/src/complex.rs new file mode 100644 index 00000000000..f6cd167b45c --- /dev/null +++ b/client/tests/integration/smartcontracts/executor_custom_data_model/src/complex.rs @@ -0,0 +1,258 @@ +//! Example of custom expression system. +//! Only few expressions are implemented to show proof-of-concept. +//! See `smartcontracts/executor_custom_isi_complex`. +//! This is simplified version of expression system from Iroha v2.0.0-pre-rc.20 + +pub use evaluate::*; +pub use expression::*; +pub use isi::*; + +mod isi { + use alloc::boxed::Box; + + use iroha_data_model::isi::InstructionBox; + use serde::{Deserialize, Serialize}; + + use crate::complex::expression::EvaluatesTo; + + #[derive(Debug, Deserialize, Serialize)] + pub enum CustomInstructionExpr { + Core(CoreExpr), + If(Box), + // Other custom ISI + } + + // Built-in Iroha ISI (can be evaluated based on query values, etc) + #[derive(Debug, Deserialize, Serialize)] + pub struct CoreExpr { + pub object: EvaluatesTo, + } + + impl CoreExpr { + pub fn new(object: impl Into>) -> Self { + Self { + object: object.into(), + } + } + } + + /// Composite instruction for a conditional execution of other instructions. + #[derive(Debug, Deserialize, Serialize)] + pub struct ConditionalExpr { + /// Condition to be checked. + pub condition: EvaluatesTo, + /// Instruction to be executed if condition pass. + pub then: CustomInstructionExpr, + } + + impl ConditionalExpr { + pub fn new( + condition: impl Into>, + then: impl Into, + ) -> Self { + Self { + condition: condition.into(), + then: then.into(), + } + } + } +} + +mod expression { + use alloc::{ + boxed::Box, + string::{String, ToString}, + }; + use core::marker::PhantomData; + + use iroha_data_model::{ + isi::InstructionBox, + prelude::{Numeric, QueryBox}, + }; + use serde::{Deserialize, Serialize}; + + /// Struct for type checking and converting expression results. + #[derive(Debug, Deserialize, Serialize)] + pub struct EvaluatesTo { + #[serde(flatten)] + pub(crate) expression: Box, + _value_type: PhantomData, + } + + impl EvaluatesTo { + pub fn new_unchecked(expression: impl Into) -> Self { + Self { + expression: Box::new(expression.into()), + _value_type: PhantomData, + } + } + } + + /// Represents all possible expressions. + #[derive(Debug, Deserialize, Serialize)] + pub enum Expression { + /// Raw value. + Raw(Value), + /// Greater expression. + Greater(Greater), + /// Query to Iroha state. + Query(QueryBox), + } + + /// Returns whether the `left` expression is greater than the `right`. + #[derive(Debug, Deserialize, Serialize)] + pub struct Greater { + pub left: EvaluatesTo, + pub right: EvaluatesTo, + } + + impl Greater { + /// Construct new [`Greater`] expression + pub fn new( + left: impl Into>, + right: impl Into>, + ) -> Self { + Self { + left: left.into(), + right: right.into(), + } + } + } + + impl From for EvaluatesTo { + fn from(expression: Greater) -> Self { + let expression = Expression::Greater(expression); + EvaluatesTo::new_unchecked(expression) + } + } + + /// Sized container for all possible values. + #[derive(Debug, Clone, Deserialize, Serialize)] + pub enum Value { + Bool(bool), + Numeric(Numeric), + InstructionBox(InstructionBox), + } + + impl From for Value { + fn from(value: bool) -> Self { + Value::Bool(value) + } + } + + impl From for EvaluatesTo { + fn from(value: Numeric) -> Self { + let value = Value::Numeric(value); + let expression = Expression::Raw(value); + EvaluatesTo::new_unchecked(expression) + } + } + + impl From for EvaluatesTo { + fn from(value: InstructionBox) -> Self { + let value = Value::InstructionBox(value); + let expression = Expression::Raw(value); + EvaluatesTo::new_unchecked(expression) + } + } + + impl TryFrom for bool { + type Error = String; + + fn try_from(value: Value) -> Result { + match value { + Value::Bool(value) => Ok(value), + _ => Err("Expected bool".to_string()), + } + } + } + + impl TryFrom for Numeric { + type Error = String; + + fn try_from(value: Value) -> Result { + match value { + Value::Numeric(value) => Ok(value), + _ => Err("Expected Numeric".to_string()), + } + } + } + + impl TryFrom for InstructionBox { + type Error = String; + + fn try_from(value: Value) -> Result { + match value { + Value::InstructionBox(value) => Ok(value), + _ => Err("Expected InstructionBox".to_string()), + } + } + } +} + +mod evaluate { + use alloc::string::ToString; + + use iroha_data_model::{ + isi::error::InstructionExecutionError, query::QueryBox, ValidationFail, + }; + + use crate::complex::expression::{EvaluatesTo, Expression, Greater, Value}; + + pub trait Evaluate { + /// The resulting type of the expression. + type Value; + + /// Calculate result. + fn evaluate(&self, context: &impl Context) -> Result; + } + + pub trait Context { + /// Execute query against the current state of `Iroha` + fn query(&self, query: &QueryBox) -> Result; + } + + impl> Evaluate for EvaluatesTo + where + V::Error: ToString, + { + type Value = V; + + fn evaluate(&self, context: &impl Context) -> Result { + let expr = self.expression.evaluate(context)?; + V::try_from(expr) + .map_err(|e| InstructionExecutionError::Conversion(e.to_string())) + .map_err(ValidationFail::InstructionFailed) + } + } + + impl Evaluate for Expression { + type Value = Value; + + fn evaluate(&self, context: &impl Context) -> Result { + match self { + Expression::Raw(value) => Ok(value.clone()), + Expression::Greater(expr) => expr.evaluate(context).map(Into::into), + Expression::Query(expr) => expr.evaluate(context), + } + } + } + + impl Evaluate for Greater { + type Value = bool; + + fn evaluate(&self, context: &impl Context) -> Result { + let left = self.left.evaluate(context)?; + let right = self.right.evaluate(context)?; + Ok(left > right) + } + } + + impl Evaluate for QueryBox { + type Value = Value; + + fn evaluate(&self, context: &impl Context) -> Result { + context.query(self) + } + } +} diff --git a/client/tests/integration/smartcontracts/executor_custom_data_model/src/lib.rs b/client/tests/integration/smartcontracts/executor_custom_data_model/src/lib.rs new file mode 100644 index 00000000000..62405125d13 --- /dev/null +++ b/client/tests/integration/smartcontracts/executor_custom_data_model/src/lib.rs @@ -0,0 +1,8 @@ +//! Example of custom instructions which can be used in custom executor + +#![no_std] + +extern crate alloc; + +pub mod complex; +pub mod simple; diff --git a/client/tests/integration/smartcontracts/executor_custom_data_model/src/simple.rs b/client/tests/integration/smartcontracts/executor_custom_data_model/src/simple.rs new file mode 100644 index 00000000000..347fb2ec91e --- /dev/null +++ b/client/tests/integration/smartcontracts/executor_custom_data_model/src/simple.rs @@ -0,0 +1,17 @@ +//! Example of one custom instruction. +//! See `smartcontracts/executor_custom_isi_simple`. + +use iroha_data_model::{asset::AssetDefinitionId, prelude::Numeric}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize)] +pub enum CustomInstructionBox { + MintAssetForAllAccounts(MintAssetForAllAccounts), + // Other custom ISI +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct MintAssetForAllAccounts { + pub asset_definition_id: AssetDefinitionId, + pub quantity: Numeric, +} diff --git a/client/tests/integration/smartcontracts/executor_custom_isi_complex/Cargo.toml b/client/tests/integration/smartcontracts/executor_custom_isi_complex/Cargo.toml new file mode 100644 index 00000000000..f335af81152 --- /dev/null +++ b/client/tests/integration/smartcontracts/executor_custom_isi_complex/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "executor_custom_isi_complex" + +edition.workspace = true +version.workspace = true +authors.workspace = true + +license.workspace = true + +[lib] +crate-type = ['cdylib'] + +[dependencies] +iroha_executor.workspace = true +iroha_schema.workspace = true +executor_custom_data_model.workspace = true + +serde_json.workspace = true +serde.workspace = true + +panic-halt.workspace = true +lol_alloc.workspace = true +getrandom.workspace = true diff --git a/client/tests/integration/smartcontracts/executor_custom_isi_complex/src/lib.rs b/client/tests/integration/smartcontracts/executor_custom_isi_complex/src/lib.rs new file mode 100644 index 00000000000..097ba728d02 --- /dev/null +++ b/client/tests/integration/smartcontracts/executor_custom_isi_complex/src/lib.rs @@ -0,0 +1,82 @@ +//! Runtime Executor which extends instruction set with simple expression system. +//! Example of custom expression: +//! "If specific user has more then X amount of specific asset, burn Y amount of that asset" +//! This is expressed as [ConditionalExpr] with [Expression::Greater] and [Expression::Query] as condition. +//! Note that only few expressions are implemented to demonstrate proof-of-concept. + +#![no_std] + +extern crate alloc; +#[cfg(not(test))] +extern crate panic_halt; + +use executor_custom_data_model::complex::{ + ConditionalExpr, CoreExpr, CustomInstructionExpr, Evaluate, Value, +}; +use iroha_executor::{ + data_model::{isi::Custom, query::QueryOutputBox}, + prelude::*, +}; +use lol_alloc::{FreeListAllocator, LockedAllocator}; + +#[global_allocator] +static ALLOC: LockedAllocator = LockedAllocator::new(FreeListAllocator::new()); + +getrandom::register_custom_getrandom!(iroha_executor::stub_getrandom); + +#[derive(Constructor, ValidateEntrypoints, Validate, Visit)] +#[visit(custom(visit_custom))] +struct Executor { + verdict: Result, + block_height: u64, +} + +fn visit_custom(executor: &mut Executor, _authority: &AccountId, isi: &Custom) { + let Ok(isi) = serde_json::from_str::(&isi.payload()) else { + deny!(executor, "Failed to parse custom ISI"); + }; + match execute_custom_isi(isi) { + Ok(()) => return, + Err(err) => { + deny!(executor, err); + } + } +} + +fn execute_custom_isi(isi: CustomInstructionExpr) -> Result<(), ValidationFail> { + match isi { + CustomInstructionExpr::Core(isi) => execute_core(isi), + CustomInstructionExpr::If(isi) => execute_if(*isi), + } +} + +fn execute_core(isi: CoreExpr) -> Result<(), ValidationFail> { + let isi = isi.object.evaluate(&Context)?; + isi.execute() +} + +fn execute_if(isi: ConditionalExpr) -> Result<(), ValidationFail> { + let condition = isi.condition.evaluate(&Context)?; + if condition { + execute_custom_isi(isi.then) + } else { + Ok(()) + } +} + +struct Context; + +impl executor_custom_data_model::complex::Context for Context { + fn query(&self, query: &QueryBox) -> Result { + // Note: supported only queries which return numeric result + match query.execute()?.into_inner() { + QueryOutputBox::Numeric(value) => Ok(Value::Numeric(value)), + _ => unimplemented!(), + } + } +} + +#[entrypoint] +pub fn migrate(_block_height: u64) -> MigrationResult { + Ok(()) +} diff --git a/client/tests/integration/smartcontracts/executor_custom_isi_simple/Cargo.toml b/client/tests/integration/smartcontracts/executor_custom_isi_simple/Cargo.toml new file mode 100644 index 00000000000..639ccadc57d --- /dev/null +++ b/client/tests/integration/smartcontracts/executor_custom_isi_simple/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "executor_custom_isi_simple" + +edition.workspace = true +version.workspace = true +authors.workspace = true + +license.workspace = true + +[lib] +crate-type = ['cdylib'] + +[dependencies] +iroha_executor.workspace = true +iroha_schema.workspace = true +executor_custom_data_model.workspace = true + +serde_json.workspace = true +serde.workspace = true + +panic-halt.workspace = true +lol_alloc.workspace = true +getrandom.workspace = true diff --git a/client/tests/integration/smartcontracts/executor_custom_isi_simple/src/lib.rs b/client/tests/integration/smartcontracts/executor_custom_isi_simple/src/lib.rs new file mode 100644 index 00000000000..bc384b67556 --- /dev/null +++ b/client/tests/integration/smartcontracts/executor_custom_isi_simple/src/lib.rs @@ -0,0 +1,60 @@ +//! Runtime Executor which extends instruction set with one custom instruction - [MintAssetForAllAccounts]. +//! This instruction is handled in executor, and translates to multiple usual ISIs. +//! It is possible to use queries during execution. + +#![no_std] + +extern crate alloc; +#[cfg(not(test))] +extern crate panic_halt; + +use executor_custom_data_model::simple::{CustomInstructionBox, MintAssetForAllAccounts}; +use iroha_executor::{data_model::isi::Custom, debug::DebugExpectExt, prelude::*}; +use lol_alloc::{FreeListAllocator, LockedAllocator}; + +#[global_allocator] +static ALLOC: LockedAllocator = LockedAllocator::new(FreeListAllocator::new()); + +getrandom::register_custom_getrandom!(iroha_executor::stub_getrandom); + +#[derive(Constructor, ValidateEntrypoints, Validate, Visit)] +#[visit(custom(visit_custom))] +struct Executor { + verdict: Result, + block_height: u64, +} + +fn visit_custom(executor: &mut Executor, _authority: &AccountId, isi: &Custom) { + let Ok(isi) = serde_json::from_str::(&isi.payload()) else { + deny!(executor, "Failed to parse custom ISI"); + }; + match execute_custom_isi(isi) { + Ok(()) => return, + Err(err) => { + deny!(executor, err); + } + } +} + +fn execute_custom_isi(isi: CustomInstructionBox) -> Result<(), ValidationFail> { + match isi { + CustomInstructionBox::MintAssetForAllAccounts(isi) => { + execute_mint_asset_for_all_accounts(isi) + } + } +} + +fn execute_mint_asset_for_all_accounts(isi: MintAssetForAllAccounts) -> Result<(), ValidationFail> { + let accounts = FindAccountsWithAsset::new(isi.asset_definition_id.clone()).execute()?; + for account in accounts { + let account = account.dbg_expect("Failed to get accounts with asset"); + let asset_id = AssetId::new(isi.asset_definition_id.clone(), account.id().clone()); + Mint::asset_numeric(isi.quantity, asset_id).execute()?; + } + Ok(()) +} + +#[entrypoint] +pub fn migrate(_block_height: u64) -> MigrationResult { + Ok(()) +} diff --git a/client/tests/integration/upgrade.rs b/client/tests/integration/upgrade.rs index 8910e7f4abe..782336ab5f8 100644 --- a/client/tests/integration/upgrade.rs +++ b/client/tests/integration/upgrade.rs @@ -6,10 +6,14 @@ use iroha_client::{ crypto::KeyPair, data_model::prelude::*, }; +use iroha_data_model::{ + isi::Custom, + parameter::{default::EXECUTOR_FUEL_LIMIT, ParametersBuilder}, +}; use iroha_logger::info; use serde_json::json; use test_network::*; -use test_samples::ALICE_ID; +use test_samples::{ALICE_ID, BOB_ID}; const ADMIN_PUBLIC_KEY_MULTIHASH: &str = "ed012076E5CA9698296AF9BE2CA45F525CB3BCFDEB7EE068BA56F973E9DD90564EF4FC"; @@ -195,6 +199,123 @@ fn executor_upgrade_should_revoke_removed_permissions() -> Result<()> { Ok(()) } +#[test] +fn executor_custom_isi_simple() -> Result<()> { + use executor_custom_data_model::simple::{CustomInstructionBox, MintAssetForAllAccounts}; + + let (_rt, _peer, client) = ::new().with_port(11_170).start_with_runtime(); + wait_for_genesis_committed(&vec![client.clone()], 0); + + upgrade_executor( + &client, + "tests/integration/smartcontracts/executor_custom_isi_simple", + )?; + + let asset_definition_id: AssetDefinitionId = "rose#wonderland".parse().unwrap(); + + // Give 1 rose to bob + let bob_rose = AssetId::new(asset_definition_id.clone(), BOB_ID.clone()); + client.submit_blocking(Mint::asset_numeric(Numeric::from(1u32), bob_rose.clone()))?; + + // Check that bob has 1 rose + assert_eq!( + client.request(FindAssetQuantityById::new(bob_rose.clone()))?, + Numeric::from(1u32) + ); + + // Give 1 rose to all + let isi = MintAssetForAllAccounts { + asset_definition_id, + quantity: Numeric::from(1u32), + }; + let isi = CustomInstructionBox::MintAssetForAllAccounts(isi); + let isi = Custom::new(serde_json::to_string(&isi)?); + client.submit_blocking(isi)?; + + // Check that bob has 2 roses + assert_eq!( + client.request(FindAssetQuantityById::new(bob_rose.clone()))?, + Numeric::from(2u32) + ); + + Ok(()) +} + +#[test] +fn executor_custom_isi_complex() -> Result<()> { + use executor_custom_data_model::complex::{ + ConditionalExpr, CoreExpr, CustomInstructionExpr, EvaluatesTo, Expression, Greater, + }; + use iroha_config::parameters::actual::Root as Config; + + let mut config = Config::test(); + // Note that this value will be overwritten by genesis block with NewParameter ISI + // But it will be needed after NewParameter removal in #4597 + config.chain_wide.executor_runtime.fuel_limit = 1_000_000_000; + + let (_rt, _peer, client) = PeerBuilder::new() + .with_port(11_185) + .with_config(config) + .start_with_runtime(); + wait_for_genesis_committed(&vec![client.clone()], 0); + + // Remove this after #4597 - config value will be used (see above) + let parameters = ParametersBuilder::new() + .add_parameter(EXECUTOR_FUEL_LIMIT, Numeric::from(1_000_000_000_u32))? + .into_set_parameters(); + client.submit_all_blocking(parameters)?; + + upgrade_executor( + &client, + "tests/integration/smartcontracts/executor_custom_isi_complex", + )?; + + // Give 6 roses to bob + let asset_definition_id: AssetDefinitionId = "rose#wonderland".parse().unwrap(); + let bob_rose = AssetId::new(asset_definition_id.clone(), BOB_ID.clone()); + client.submit_blocking(Mint::asset_numeric(Numeric::from(6u32), bob_rose.clone()))?; + + // Check that bob has 6 roses + assert_eq!( + client.request(FindAssetQuantityById::new(bob_rose.clone()))?, + Numeric::from(6u32) + ); + + // If bob has more then 5 roses, then burn 1 rose + let burn_bob_rose_if_more_then_5 = || -> Result<()> { + let condition = Greater::new( + EvaluatesTo::new_unchecked(Expression::Query( + FindAssetQuantityById::new(bob_rose.clone()).into(), + )), + Numeric::from(5u32), + ); + let then = Burn::asset_numeric(Numeric::from(1u32), bob_rose.clone()); + let then: InstructionBox = then.into(); + let then = CustomInstructionExpr::Core(CoreExpr::new(then)); + let isi = CustomInstructionExpr::If(Box::new(ConditionalExpr::new(condition, then))); + let isi = Custom::new(serde_json::to_string(&isi)?); + client.submit_blocking(isi)?; + Ok(()) + }; + burn_bob_rose_if_more_then_5()?; + + // Check that bob has 5 roses + assert_eq!( + client.request(FindAssetQuantityById::new(bob_rose.clone()))?, + Numeric::from(5u32) + ); + + burn_bob_rose_if_more_then_5()?; + + // Check that bob has 5 roses + assert_eq!( + client.request(FindAssetQuantityById::new(bob_rose.clone()))?, + Numeric::from(5u32) + ); + + Ok(()) +} + #[test] fn migration_fail_should_not_cause_any_effects() { let (_rt, _peer, client) = ::new().with_port(10_995).start_with_runtime(); diff --git a/configs/swarm/executor.wasm b/configs/swarm/executor.wasm index 8c552ccf2056fc4ab83600ba6fae647b7db903ad..c413ab54af4537220b7b9b565a3ed1042922c85c 100644 GIT binary patch delta 99693 zcmd>ncVJY-_W#b@t=Zk=2GZ-M!O}Z~o{dseQ0$HRu!0S{?c>k>W6B!vw zFs+&KSuNZ6Kx?l5+3;YpG-1t<%V;!PjKCOwMw0<(nG9xw(TrqnL;_{UJG~GhOmmsy zqfrha6Eg!LBbtk3G?c0|h#p-n;SJ1qqyHFFxS|*pBZ}gW-~n?y{J$n|oye>(ZLzU@ z6OLvYBt}36fBLU{Ee=!ri~mefCR2b3f7(S;NJ5AV5Wdz>Rquu{Ue4DeXsTA<+yLG6 zra4L5ZdSD{vklJxZMNBoX9a{E+9mT~6HiPEacI3QPY0|&yuo14Fn9_MYsW3gS~Y8o z^Yyphd;i@Jy1xJV+iw|u(yCi4DrZ@oR?`}p*yDqj-~GgJfrWQ^{oS`;>(c4vk6-Tk z!TWE&+v&~MUwyaB`!5@Q)ii6jj8WDHTMe+TVc)Zhe5bNk*`bUwjxZJ&^Z8PqW6Cux zF)cJLGA%RZnHKR8<^ui`FXBf7mYYUcf8^03T~T z$46Sfu+Fs3vd*?nvQDs$w=OV^vo14FwhHSs>s0F;>uBpj>pC{ky1=^3ddf22I>S2M znrr>inr9tnn`tYwPPg5#X4}5C-nOo_owZ)DZn6Go&9W6($JiFxhS-+czO#O5``NnR zI?#62S|`hT$$HW{-=^96*(TcVS^L;l*>+erS&vwk+rF{Rv5m1Vu`ageSQlC6S?5}J z2L$vTms>sH5M#SFo1+~c$c3lKoTz=~u*NS(_ju^1n!%8$c$iCxZe%dH6l0o_hInm; z;{m?&yKT-syR&*8Ue4Ucv?bfP1ZBX=bQ1=P#hgs|Zmb4>|GM}*zQ zJ;rY8*A@iA5vatC>U>HG(*sC$bgRS->SoFj>dn510wHDPC|?prIRxC?2pCogLsl8A z=g24xSuI%(iAX(mUq-KBVvyCpJ@ zqAo%2gV^YStJ;Xj2==))H?lVCryWJs&rOave^y(mtU*x`QAI{aj6d04BKdR86BSYC zs?ibUPj;3_-e_?|`V#_6B=pmU04!=nr+X1pOC*oh)<#9JQQCp16n0g+gZIz1u;}J2 zTYDxt1+DuuIwC6DM8x(Mjww;NNLv_PoAuX@Bhwg@!|czLP$JV+t$a-FC?F2YIbz<92}W%P*)MB zsNIqc_FxDswbwvDMm0wpp4>WMm#hI4DA0~4yU-mx<%N(?nZ>FrhgQZk)ETCYs$Gkn z*1oE}htM2fr>(X#@Kd1rNYGt0{b4ngCFS-}%QKdoD}o)2bj%m!?#88{_Sw8!q5_3h z0q8wMXjiP}`agTBeyc6Tj4`m*+Ooiwdt z-EdpbQ_&vQJuoOpYgxCxGs1w5N7s2GTRCI2fps4Vjsf%ZK>9fY7HEYNZjR$2*6<@Z8A*gVa?kBGRq38~Ub}R6m6;Uamb{e+Vxa ztaW)QR6AF{$}3P2zWSp5aJbr-gyXd0iEQbl<`DwSi$L^mOISd*k|mHs7O{AXL}@)6 zJosnvd^}a+`ElybSD~PM$VHYwu4yrHk@q17&E+c*vE<@W7*{Vx?O|B57UqgU4Q zgTyImlERO_Iv2>_es%Pp!{ANL^|}Pp>h+=g;2_z}It9bEYTds6pHVSb8`oU|&F}sX zr@MudVU9tQjIBZ1h~93#WQfGJQ>Sn(=Z$@T4o_WA#JnXb^}t&v{t~6uz9WnM^p5f; z`RXO@t@k7=%zSShA28fc+_mp70CC^=U=$xPNNe-agSjm~>}d8kfW|`KkYOwyGIT}P zLMxbDQ)~R0q{}}(TONZkzQhp2i}UM4%uCv19fP%bJtgLQdUpHMn3F#JwwJ8tX0LU; zKw_VJt9Mv2$^H=0L@lR{QJdVi28qM2zJCH)sx_jYM7DXq`hN*o$3Tf}oq_B4*kV3@ zWYG71!qSYxN7xc$u})Z0nKo_JU|IJMgWD80^WPR5NliO3bTpssWBO-Vg4S_-ZKi4? z#>eKS4u6c4)7^=!v|S@UMz6OXnT+2zM?U&LlZkR#CrzrV&$WL5&S@<{al6b~mthh7 zIw`I+?UhkgOJVTiC_e`O6rZ5X6`^Agq176j{^y88VpC4DkE5D%YmKYQd^O~b82^Ue zzI;GlH^~S2_M|uckpGZPo+cVrobo5wqf@rjj3T?7 zF+E{E3piY!88ea$9<{p&PBn#U%@#CMgWzd2n#>k!bWChqyemN)yujW1sD*5E2CGax zW^uqWm#^Pj9I(gbYoUbIVSNPWAfWJbf?X@`Iq>!)sEIvfl{RBfBv7o%xW|1@T zYl{Ou51D6MamjCrOK#WxwJ6S0P@J}#(s&w|2mnJeAK+{CK|xO6D{}f!Iih7Q3Db%e z)id5TI%2i7rJ=@qa1dxU7Kg@WnjDzaD!?lR`Qhep5Bv3=y*GeqMjWZ>k0i zIGoC;y1$8>PO|F5ven-#jxY`|IYOvv$3T+<4yO{Sv0uv6a=ug_#SX}_?|fO`ILPD( zrc~|GFU{KKFXOeDU&fmyggr7(d~OZnFmE2?aFauoP0Nz3Sq4={m>hxBG~-BM@| zhOo^N%yEE0vx6js;0FqnU`8R6znRh@L^Y#xMw=WC0^@+c#K+9L0I0e4;u5F!&{BtS ztjQ5TFdXAd4tTO8#*`yWE5EdoQ6N%Qg=|*JRu$PSzN#p##!KM8ShudpTvv|AsK-*?uBB7MXwtO7eAE-q(L z;io6S_P43~c?+l6WptWc3TQvjq8(fBVV5-5hQ?vu9AnK1%we*73<;FuqSj->Q*5x< z{VHn&o@5)#1Fq{eU_MlMUSo}%d&~)n)ON^xP^@3cDrz$}#v|*djn$G)VN`Q-M*@_v zWKfJSh>{`sV^sHRA)B56^}H~^Xg-MbNAAo5RuP?^<7Q!EZ2_x<_Zox2f0xHhWla%iHdR9FG?j%Rl-&cl4~WTA z!E-0pgXhXio>N>VCzm`o#3FW0Wp&vc5xj@J&Wgla(^z_#H>+emv!D4y(Yx$jv)seke;q6^o{`C=oxMIYrZBtUcn>_OgcH$MwV5d-w69XE>{_8TXEd_j$_Rmh6aj za&H_vs+smx;#W;t&3&W53g2m84Iau7_wWNh5k-tbgt}V$XkWv? zLuf0pGRX$i(b|1Yji-z}O{~AjVnkYX)<|T(z(cie`vWry7Xf4lwI1^Vbf@PEMG!fh zaLXawKL_D33d4p%coKypDGU{b@G=TVQ5b!XZ~=uADGa7T_!5Pw0+MKi`z=N|6k%Cm z24W`oVw{y^jvNXnQ3*I+k^U`(!zm2TL--7ZWsLzc-1kd_V<_D&!`T#$r?5kY*HKtv zc?d>O(L;fz=rF@+)|MsYHnOJPZYcp3hh!qjO_mkb}H za0G=DWcXJKm!oi^3=be5t_&y1@OTQ#E=-o;#S|ur203ACpat8!1vLI$m7rXk%L;G& zAgjx&raCQ}>q2A2ij}+(zsA_0DLiB0&EBI;`L2q2zCI!qeAkZmwPWZSfDN9sm-b4Zm_ zjnF0&47I8kb0d#_Wn)9N!jsc2nHah~MFws0xyan1@C!j~@t>Kwa zHc1OU+J5ua16-DuRY`MgD%&p4-Q}Q_kq^tGU3=@B7Z9#eikx!#;3uax;fe=X9K90925UPnR@Bblv?AQ=HenTXD-tz! zyjnSMs5Q|DP02k2&~()161Dgp@|?M)I^1%7S&H-p&3yY|5dZPpHSQyP?(H%NAEMp6U8_vUhuKXn_HIg0 zAFIO+VRbPq^fyopVwaKC5W~aSE85Asag?Sia>gW;&c^V zj>(U@%__2-m^`R52VNzXtEZ;wsj1%70KiHh zSOo?NETFX)*j62XzSSTLn6_f&(g!cc$SUwt-V6t2hS!ZH(g&N6zSo<6+6&-xi43op zSq1I6yKcpE-J41aqdxE+3#%wz3TBm*0j!&rdG{4@)4~$bj#w+J$Or0hm9gHm{Z^TF zgVIiT(`I|qzO=DKq865`pbQ1Gu`v5`=v3K5o4uKrdovFUkbo8k08o)PZL2q}n_Z?2 zwX=u#aXrm+5N6}IVnjH5S-kFG3BYf#14Zw6i(dB@eb6b3zDmrnO!k2Sl^~nt3Y19? z1OnDaK@deY_cEWrsn!V`s^0O0OxBsUZz zH=P_-RVn7C$HG{uSZrdIL{1np3Qc9Nis*3WLVq<02csPffY=v# z3l^0q7!koz*$DA?1eVBA>J{;0gd~tDlBM#?I)V6DqZpyG*F-_2OuK|M@rnwFIo^ad zQ8MBCC;%HJu@q_8-={;I8_g1oXcW^z?p80?2W?~OT@%`rW1@WyX`;&_9@6lS?arY@ z2e~!EX@Efr4tFW)P(`$lVK1@MVtouun=JympsF5<5-np{8rv=2`p6t7zK8{%Y!Me? zStoWY@3A;`lR0;jQ6O!6BP^}XOIQooPFd+@46EYtL>6a1TRiTI!gO==eFHzL7mf$a z9Yn@b79{#6uqU0u_6Hz`{1uSpk^pk`AA*$jpq!ojA(naB$t;{Z4`E7KY-1L*H7AIi z_N+OYUxW>0Xnt@9hPjFyh{f*LSuGL2kVWxc7BRd7Yihn;K;yCKxsYX|$i0P-PHAnX z`$!g%(}qnOz0ww&h=GTWmNQiZx$(B zU0`$`?ZV!J(fRm4z#>D%@P9z5VUA+*%~1g2ps3ZCrRIHDja^`-6qmtc78h%or+F1^J5Vu-9dLk{HUQr@R1{iNOuo@c-UEnuploJl>d@8F$-7+j2aLxkXA7)|a{S zdevhQ+_q;9YCrc^n-f|_bBZ4E0> zM0aBi&3ob0fw+2ZLLTm3WyzxEWoALAP3gukpBL>ev&R4>`!abbwJz7gMCKMLKyP-3 zGxD?Y16lqN`Vcp$^ zJ>op!XSd&T$$bF|-{+E>ze!U4Z{m^@Ej|Db&U=zQ2Q6lNiap~zcmEjD6}%GnA&Ucd zH2siOHP6@mly85?9^peRVl|%T!tIhM&X1Tt?p`B&BS)CXdIpMA4j&bfl0Qq19Beit z_u-_E<;c-|wj4P|JPV#1`xP{TwS=>PhK=D+&?8xEHc@o^g!N(P#qJ+jyGU==(!&Nc z`bE*@3G>U~w8j5qS&)NTKj~cmFNjIbKQU}X&ttt2KY1Q|0mDX*PuZYS!v;Vc6bVn8 zQ$^8>m|?nghN<12wR4WL{h9Igwoahmj<5N9C6)eeBj5h*6l@+0n5GP711GZq zYn9lcL~~@n*`Q#aH28BixSW5UjlKS?8@aEAyB}NNqM|kZMKLkDzx369rAseCX``B% zH?lu_nK|$Lk-!eo&B;>hmIYh>MgrT~IqQD5ynjwKWER@HTa=R3?5%%CS&bJM_AcMA zyUO%44AC|DZ|6aoe?Kvmeg<(a7nAAdCd0H?=HF-XJHy=BGNh*O*MBRiIdeak+%Gi~ z%djN&>NNP9SrU+%aPh-@jBq3FS0!bN&XL~}o%wqti~QY8h*T1tSDZKh$a8!9&%0SW zI&=Io_&Wy4b~%qIWssa*LG=A!XpnqPjzA_4)R6<74qAHXKpnQ1(f&IuNM&Q%AP>|j zwEqsTI8dkHK;37n;Q2Wu#;lSD>Q1eKLp@2 zVNX-~XKPqLoE0=+a-vqogVw?-i}GvP^KB(QTY&=V)$zG55BSLgpulIj#3!Fpb$p8G z75f2!8V+dF!-x}$cv#g#V#QkaBo;HA>)69AR6Ms%M{ngi9lg7F5_$~h{g}E&Je<$g ztFby-E3j85BDsN2l-yg`Cfv3FRFZj@jrP3YhrX`m#0YBgo@wZ z2tf|m$l?%ZFA`yC<^FfZ-rHrEnAQ~zk) zarK`ZV>h2>*J;x?mb6W}c_~kE(-}$cpo3G~`B=+y^Q{yCC6CwZ^a>@9*G;rpl2XmI z#^vU?Z{?71o`F}ks(9@TOJj**&Kay0_7*>!VM{HUR=dGI&><%O!eT3K#l~(oZ$dw5 z>etvbf^`6YxH>Hg6ws~=@xw2yn(Z58_QYUci-jz;b3EA3C4qb@BM5R=-?^URBs%D$ zC)q{RdDf`Tb|4F&-RM#W)PU4vy`2%=h~)k#YEDEqJ8%dP{m--RP{o(ev$Pijan2~v z2qMbsKX%A&r`>2)Nz8mk$e`zoqpA~9GIJ`Oo47AcZnJ=Y9z?N;VHX%Svx$NWED2kh znisJeF?5cCDD@_7wIGaSpP;R7hehTPNkuF&-c46n$c$aFzaDSskW{)5M1K>XouxIA zBGw}uw8fzd+Ka5NV^m7MZWD$5&DF7r9W=mPjcpfM7g@A(!ymbVx9b*PsU^IFyQQxE zKe>dLXS~L)GUwbsnlf!KW6Cs2->L9_lWtGkWtUm>NlOAJHiz1CUroKI&{L@R|qV4rM)WU25>s*}ZNg*S?sO-s4hpg{+haCMUlDN`s98fp;1Rvsem zDLe(|D`Yk_-vC0d8iZ5=gyD)ltI|Q53tI zNYgQOA{v4o!P`YW9k<;eulT~uJ?sZ@%FJKmnStVQ3x9^K5wk6PY2s8%qRDfQ_3)@I zo#^cZ#bd*wINi-e78gpd5gAtgBv$UfwQ@T3am&gp;gMqFmGNjtk7?pxHvSPHUbgZ2 zEL&6#;61_t*yaOl_CuR4z6{{&k@bB$f04})1$LB}AuJ9&ibOL9kH@1UJ=Tbx4&Fvp z3^p4L5q@mGbD+jG!sz7bY+4@n|AaGESKN&;N0vK1GT(nW&K10?tHhN+{-|RaSM#t< zNOFnj5Xf649l?QI?2@;+0@Nco)5KkNorUa@ltkcG;?W>pDQtyR(iyye*HZi@h6eFw z7__9$K1@p3ZkN5r z`r(o>1J2zg2{oLju?b?>d2_4?&*K@QT{td1+sj1Fs;2s4$(Q_n@KL2){&-$+1dnEH zuBaBtBkSNiXEXf>Ax7@6y~hK+X9}4|3K1k$#p%W-zHHc8$3w-iNN$V7k5h z8iNGjscsfI0M0%a-$e2XVs+K?wtz71 z*TM#xXdacQU#_LM0ehs&g8gDNk9-xd<(*(uwffEd?b7ey0u&qwP4q!gx80vD*w=g< zD8+<}D#Ou|CCm};E2E=b6wPgPIasVOx>RHDhZ^F8`njkY!&^b--;d$RPtB#VnW;&LnxZj$WFi>AwSbwun^_21tl{pvB$y+{Pc z@wuVD(iGGEMgmuGt^pHXQXc!ojyPUF{HoEeB8c9DSpv>dFB|P~2A5c~+!*P+ZnRfs zEJMck5^3?gI;@hnVq5QT(Y+)isujUykA9Q7f)ulL}wST&6bM}MZB#j zbny^&TU>SVcI;QtGJ(GbVy#TzwOFAzo4}LUx;!+UJf@R$Ts?!A;w&R*Tc5jCKYhbXUk~Ou>!AVKEqrnDn?Y`4cRYZTLs<~ zv+Nobc~$J!Y+n)E0{4lJD&hoi-)7=QMc!K6TWd5|c#W{&)eNr(s=liQycU!ShB2ha z;B0~;OkmpIh%=sAh>Cl`wM67Mm+!=5Sezt;{FlNMgMzVA#2NpH<;k zSp<%fdqKzx3+2e0NB9q_#_O_iVqG=;PaRv{!6Pz$6*gbT77X6Mh4e0KZ zBDp%~eMvl1o!3A`{i^ea(4>Ou7{;!OqU!uDm2N=9Ac4#TJt08cd&?9W%yIpw7Yqzl zrmho?THu4rVq*>dZqyIbc2#j;2(^dMQC)9+SH)vBdH+B;NV|P7#fh327yJ+!*W&L& zRWGc?BY?w}TF6f}ohQ|wzkO{Cq$frH+PoT&UDp8G_?y~1Ao`@QwRn08A>H;9SEpf?61Qo1N9H;^2dS3mbx8Y|m?3ADv&GY)wyEcS$4a@ib?k_-6y8go>P09vTz^#V_ff7|;MdXR)X@ zkG4A+D1}(NMxoW>`vyFjhuX#M#ynmmr}8+vudWu(@}g}jgrP|ENae8@Rfi*4I%>N# z;~^GjIaEDX5w#lfaIv5^j}`Y)c>uBnG=#{M7gZYaj`qu5!nAM(i;TLwl~_`nM_RMt z>z1|OrmW>eY$JZwdDWYh&a0{7o`=`FFY_CXc^nHCgByd8YTk;*yba61{DOOMqC^sa zn1qPX+UekFzJC<)P@oByNIWU;lW*X7lWH;DT%Cw)9IBufT*O5 zRfsNbo~@8TxcLl)&h%mRLBU}>>`CDD_$Vda)vqsvRMAa-UtJ|T#i4f!)%ILh=_{xN zawXblVbDUK{kAHAwx?&}@0~sX?WM6J-8Enq>UGRYFnYWfib4aTT~deaZVm~%A})A% z3y4X*bpEnfoyu)udOB40NwGYg*Fo~xbR=IC%{~0XAbD`)U@?SEp1%g6o0#|jcf`rV zCc17yqYXr#LfqLsEqIeen3g_0w+8c9KklU= zMJ2)}{S)~@GNNUT;eU951T>%Yv2p;wZWWTvET3gf0(e0p=0;+M0i>TTmT~vkg+Zt7b9+dBVSzW?pK=-!Gqu*&STwSR6a-nN$RPh--b zhDg9kCLa}9Ci2vRFDhL|!Jj7FtvRms5rbRvo_GX2#5V@(28ncTNz=wHjy=TVlX@FD zR0oWjL`6;sz~2SBi4Gx0yaUq**TcLsc)HiayiRp}`e5}=AJhc7_Ntx(L2*k5Cq9JP zMoq0~u|3orqIR$J34TKIqk&&=jO&CW~*{VpN?XZnWi%ANaxOkxT^< zM~k8pEx7fKSSg>A+-{Iw<$O9(Op&-nR9z3=(eD6t(+PRA`iuDJQT_?KkQICuCZKU}A zDV{8*A=;lcLeKgw;zZn&+$zpJ3G?ryussFC{gOy~3J6>jJ)Ytfnqn*>NX}qL0{lVA ziPi>60dvs?GjGM@g2q&lrWQ03(KHf2&DBs414b zz?%fQ=>{Z&2M0Jk#&^NR_g;WQ!!2HXk4@3HNpY+rU&Ka>VVy7^TPUh^hFc(Gzv*G|MQ2pBU2N`*CZ7`K zE<7&b^uG0m`nBGRe)4K5Vlv}fZx;Un2;h{~2^ubp$&z;z{=}P|$^}4PwNYHUD&Mna{gIB6t zW>)MfykbGG?Zen06$A3$6xpxvsIc#64ZT-*bjh^}>2tG|U-<6!t=+=`S+H(ArM~w< zn_b|!^tI~-70oy^W^MBZN+w5m+p?>BZ%-KcZ8bA$``^-k0yrnz87K{{j+hml)BXyJ01<^s=hB z50(5ryh8ZJBUi`lpE+RF#EkS_v*(`5zW&A9dH)T9fHw#i$SzASvyRfpSVXU$JSB9& zl3UaEZP0SwOuxDP+}CGM4_z7Z-=NC?k?=mRTD=VD_hC`YF8ys{>MJ}lZ2bjs;poDB z3vL?H&!5?GtKjO^*`NLwP!hFY=G7v~0!|o-k6-3B!@rrbY4WB4`&Jw@r1!lyaOIT! z^Je{G@YU@-(Ik0w;jD3UcK$eXq}$7@6A$Gq-M4PR*?nd6Dtur>j+$k{FGY}>QuFBY z)>kJ;_>?gNCd}J2X6r6P`i;yZId==DEnVVgnEwQ;B|27R!v9^Ya=qO&V|V}ICnkTD z)i{0r(mQuD?+yHU^M8X>qRYn+>#~5C#z^FR%qxW6UY5On+v2=F8R-{(=r>}*grB#3 z{NL!V(^8UZktCH-Luo`xbl53f;q}kDlYMvekD^yb`WH(F5Bq-QqM^RRQ{_F7LyLSxvYGQXU67{^dN=d2OJ$>nc8JDkrk?fVKeamNGJ2)(J3VcLm z4FJ9W34tyPHsK(?`X{d$cI$_{yrDa8t-5MRUw(V};XNzH=Y;*|HREam(zLayC(5d! z6b){dV32{L;B_7ydMIn+t%V0Syp}%r=S8;$|FCB4VV~su2jpNsNuljP%bZ=UvS{I-|d@W-oDxM z<1e#^Umm;;L&2@_M~CdppE4-jhtGdNlim`eh_av;lcbjyhn+JoUCSRda~$SVyKkJi zG%!BEhuUg3FwCI4$<7m-){ZQ*j$%yCNlfB?`fk?HACG@|Z%sz}{QT^z z-(OkQAJQwWJ_1bkUZt|~5TN_by=xMrYv16ky*qx|e`t##{mZ-G-?)Bi*Shm({*rBil_M`N$Fg}O&e;3in+GJ80lyd>82C3W!kK}Y z?zf9p9-A}lhfVLL@0veo!KklJe@<*Cih2PN??p0loF0C5#mOJ%Y##Zpcc5N%;hQOY zPUReF;hkjC0)S7bM91FT$_`73N-V2_QkYy5*Wch3Tr2Vi@87U>#-Mc>=}U&4`!Rd! z*&!Ps-CkD;ZVpT6&&xOI42K4;%<^4=_~)!j^11tPW1U67d%UJ3Qc{_9mO}2P==2_D zSjV$=O}e@D=TmC>vej2FjJb5^I}3<(yU$-F64w3vh}hooYMznBy;i-9dP<>lt;9rY zgjXKdPF%XHXyAg;4b!JxoV@s}TiFwb`Gg0w60ZK(+~xWl`yBpCcV@~Huey#5$Yfqr zugET~URI62izaSNA$QjLti^Zs&L6aT3baQ4;2)N))CRu@5(f6;DSrvEtP+Tc&-!6q z>Ag>|t$}#HMp@0xyg%DH7fUp~3-o=+-F>K>_W-DTw|2JF>6 z>Tav}*8u*i;~Gm0ZQ(R}GMRc!oF4#h>~#@25K9F&MC*a@{oWAW2l6I(%pQpSQa8mv z2l1#V6vFBNb^_47Qy%4g`Z|}qg6ewS!a+QfA$yG>{5d=Z4B>Ow&Ai$}`Bshvi(A8a zJ|3&H_!d0+j(~%EuUIjHe}YGyk^DhCJ|4+m2;7UCcl9m9wpLC>q>Y3Vd#{Ml;Gy0t zp3``1Jf>>=LDOE~!9eH7fod-K+h!tye^mRC5M@3va6@5b$;OdXZC zVlrI60h+}Xh}|8ku!saVPY}u3Jf%{v6Kf{@c=E`!r_#3!9XDud!KmY}s0VBb2AP!{ z`qjs{>8 zeWFFyD+;su6Mn2j&zU@|jm^_{B(jpnJA}4y;~62ha{pp+g}SgjPamYjk5&EEl4x$> z3*7R<>AX|vCRR0j22c}eA4iP0i7sCg!B1GQtA>4NTXBrjb5xw4&LhkJ zB0n+#x))PfQY-5BL5YWF@JEX)&Yr=;GI9w`#fxS;xnmTaPyJ~~U|2FUS2HkLtYaQQ z2nML=U95>Q&r}Lp5QO9)vrDOFcuL)9qZQ$@x*l8eWZ&m7Pe1~;MR=eIJj+HTNtikd zHLr3AlPTk74)3cL1uR(QBl*H`|9sm10(Xd=8IDIZzVhzh{g04Zgema+L;^3t8dAuS$yU*hd_$Z55JeNo3 zt((VxWY~%~eF27z+hXSe9){3Q3$PFRj_9zEC))2am(`86wE*>=7_^W-!!x<~VIl9z z^AC$wi+J_qKXZen7`KT317peUMLZRcdO3Vk#w~^T21jPp+wvYVeApBV&WMUp@5rPO zB;EBUVT%IN)qD5n%#`|^a`rOX?QIx7Zi9^2|Lu~X@Esmi?rc=v_wQ_^we+h-m-u)w zkE6znUCf*E^F~o~7*cwR>x=m?+9^EXOJ3F8$N;^9@d-Kun#GfUSbioM-!Q}ypHtu8 z508=hqnMVXbur)t;{R z^q>qaO;YM^W_QSUPffMIy@i;X$IDxXaJjo~h*+J+qaGWI9a6N|OdF@@24n88@L!ZvT7IJmCNLkKnSdkN?SBHuA%X!sm2oc)e z$l*LeZYIF_wPetP_Jqo{NKZam2LMg?LEf^&zU90bZdMIh!5?EI#Y-!|S0lyn6+BKI z#Es}3T(tr$aHMOHScBMx18(FaPU6bc5uB%aX0Mdg8YDjsfG?(?LFi0h9ti>6I$DIR zecFL%Li=8sE zfJ&FVgAM|lJ@CZ}M$I?azu=7bM4bnLtvV?0=asy>k!j-Tb^MmSJdx)53M7mYujTU> z*r>dX`TTv(w7k@fd{Gddr}tnBEb=?|@|*QXpfVx}J?R6u2C7oV(9<44;3U~_z@g?F zp6t>2*km9i#ognH3ncmE-UHk$8;0yams;Q__82bS+{aTQhe)EDks|p-FA8dAiFx~Y zWPQmgl)_vVA6VK1f_U2aFbv%T*d}#2$2cqNLq)^I&3#aWQ$*x`9$O>JkB_2`$2W7Z z`JcE_Zj>|nU@Gc3otcM;m-q7o^Azx%I$jLf&m$X39I~zYiAk_D+Tul%I%E=IVp1o{ zcopTaxr!cE6hF3~{|jppFC4%Ize%F!0bV@_z%0Naiq7X5)NHZp0F>Z>8{)(PUN-|> zUreFV+`i4k0_a0v+1BofO0t34st(~!&U~K>M^jM%r$uc(3eZPkvvHQxh&%sK zGhH`{rW-*IBA_HPzJ@`>Q9N|a6d8ON7(oRJ>jbn=aT}$*(g*W?f`{5bUp+fvi}?X` zK0x7xz*8@Jk%Pt|jxZBpAsGRBJoY45C?gP}RNA2+`=5TNh{@k!0+J>2zT+uqa-tuW zq>P!TrE_(vm$uYoCdsL51&A~CIw2)nDJkV=B}$R#nSJPaV=zHQ)!s;&2>OUDUOdE| z8911f4FZxr0*12tsdqsr zqZ%P8CF!VBQpW_8x_1aC1PVlj!@ORsu3U&N=`b5q4c}h@#XSSA=VOj1K0b^s;4?)2 zVGLy8>B7VOMS3RhSwYwBtk$_~7OIWNs2y~bUR=yR68gtJ7a&tjAGCSg9ur-p3iiKez_ zDe?dzQ+JO+{YtDl$D3KUU|@rO5Rbc*P!W0_dz^Ab*YmtZxNo@kSaIW~6D%ZOeiZA@ z^Twvd+`gFM5P&&e#9iQle86~7{Q|Gua>#hJMIO~6o$dpy0(N;F64i>Z`AwdecolQC%|-m5 z?3zfsh^^({ix)5Q*3PpBVNsBUWAMy4C~_|H3dY^Eqx{fC9uv44Qs;tYi;>?mf4neW zf+oZquG%Hugs%hPm%t?7B%WBp-v+o1OZWmTxxKTLKOKbuNs`z{U9O+OLYwloT;l(X z2-_;V3}^Vz#7}$B@UHYwx8^--hb7In=8bbG({OxpBH98efSbalbjMNiM*@}Cam(n^ zK&3La4;2O~jrB*ks1u|#4%tQD9^VqoN@&hvc{HIV%WE$QF-M7I4gRVS3ZKI{#qW2WS#cXCX=k z9(O{N5p2I09*VRBA}3UdhespsE6mLF%e4W1I20BC5kkM zp5`w>?8!XpeX-b=j@S@ARy-G>R1W@bPQJlwsA5lXH_u_AMJU6}l0El|ijhivc2{(a zRH~z?L+P$>fM4DX6F( z7VkwXt=SQ=I$CKHbp#C|0r4C#C75^`I>Xfx88J$T#2BS6J1CxwQJS(sF*-(R0EycX zqpWXuY;wNAQ`NI<3Lcx7=VmsZ8x*w=3`*58&*~Y7aeIb*fk!rkYZjghING!&R*Bc4 zMCak0#&}k12e$_Tu{sQ%EMiWYmH@(?WuVY?{Ll$osIq8}5&FOot>%aw@k(R+_qyW7 z$;#uRyi57WNXI?JFqhI)J%HY#U6p7BGz|(Ib}7#WEi2I3B9ZLDWd*{MpnMs$&KC)# zPmw%P>B)BF^-5GKGVu7EBsBeuIF+PK@8XpMGfArv(kh8<^z_2*F$}j%0A=R+O&vWmA;OmU8*G}g-R9!%rndzU#vOpCX~+kViQ0SA%WgewiiV=hauDCe@g*zA7M zl_)D^qU={fAV2v{fwFinMR^wcYPY384_(Q#R8U4*uorcFH6^wwTG0rWrH3Uba{P3) zBsUWXPJ&0&mmaUH80dPyoZ>h28J$=OX^6K-dzUuS23=J z(x2VTOQ@;5WWuvwJtbd(gSJ&eB`)J06`+el;8Rm&0M}dME0Fp-R%bAqqnYp>%7-(~ zNTYd$3}(w2yh+cx6#?w(2DiyH*e@ulz|D|JxZ;x}=om!ksrd*(V|fBH^kjTmgmU`| z)7L8j%M+rfE=LfPS6{U>xrI3i&zl520CWBlW$6=wRJOLBdJsW!w0Tj^L`$jS69zpw zX*MDVwnW8AZJ#`ZZE&S$iqe71(9Fu8|VU?{RUgkrIz*-n~Z3$Gp`o zbPLQNkP!!K)Y}xo$rMnFre&ZAX3CNxg-th4RF&FxQcr9;fbEPH+i=Ol-Z=}c?Kw8Xfb%`q()sH%fa(zxrM{_rO1zjQ)P$qhVRmJiSO8cM*L}s%(k-7^8q6&W3rIM#)tV)!^2mm;bmu5J`mH~G47de`so@{pN9c?`*ckxra8LBzFJT3IJitz4Zbk~%8STPM)mH3nP#`*u`n2K&7{_~3KRZXQ@C zn>#9L(bMqVMb;w`AH-_~jcQbHKgP}F(iOeZBKW1b>yTA$5AA_+r+Tw*>`ge2Jv6B%&Lu!v!8 zkbscUL0+H40F; zI?D@;M1(9Rf@y?hO{js!7Rp73c93SGwBjFPs?p+jXC)ll1#Wa!l3t#tBtqj!+u5X| zHcWKVnb*1opF#sMqLWOGWkE z>lQN;&p&;A74=#Icu@Wa}J-hCX$U2zXhEsw|mVikt3E z^|CiL6F|L0QNa8{Jo+*^Nr<;m44+0GgiwTRBhk>;IC3?S=VHUlkZmD~UREN?Art!1 z3yPXMNJPDYK_<2q<<(Im=V5y*b^j& zauP@Vo7f#OZ}z#~z6R zMn7El0%y3oNb&l_)kUJ`he}e^BDp_?lWL{;$}$qlR1n*9U99?0spQN9dMZ8)PNVZQ zaq&YXf#rzuA1TeBk}^jVG>DL&Tk(Z8aurK)lzrx7O+{THbuaX9OEkS$lCtGA4blrI zQI44T5$L;8Z2w4Us`q9QDj-jmSHF--5(ytGApz1;OJX`)H2)aS6{7RUN|KqJ`RYnB z5btFHAnlbSHhru-gk}VOqP!a7<2V9E?`Y?kyn&x66_{E)h;ZtWT>b? zr%FP`C@wD*y2ps`$hE$jI$DQF*+zSDD0^;j9Dms{}|f}eNJt&x>4p+H;Q^0O7)C< zggluxQYNH3B??p_a*?wiK)JdBdGJQYB_>gF?WF<)idGP$PQnWoKNq3>lK>dU3395mD_G5sflaAh?v(TR;Y>hxE)-L|mp)56cZt zWy0YxO!UzoUuI(dHc9Nmqv9kmuXOC2WGBkj`TWIDnE+^X+2Qex>m|#0^vAYdN@PWH zDPsVTS!7P#yAQL+M@$9Y`AK3%F9^mYL1m(f%b>6?8{GWJcDI)j9tL0-Sc?;!>O%T( zT9w{Pji80ZWfDP}@=Ox1_f}GxW5qxcK=*A+3QI4yk3eW&Ndn1WF@YwD9le!@tec^* z(2JWzTpuM8PP^1T@UsjPZ}w5DhoFR?9{N&-x=<|Yqa+92mm+@XqtuQ^Bx)q)(1-4? z=*6ajiD>B|U)1TVq*hyqEMOIHYiyJoCZ3ISE-lNUU!e^l@HET|F}AN#FA#*oLJQ`R za#2(q?yFRfz7GK)3Tj~rsDL=hpDT&aBLk5NWl0r-wlvX0Br20S*st+vhAiVTN0Ic> z1q~RNtV4p33p!%T=g@}h#m}EBNi87(G-6Vd%ok6VzAVOx zGBlsc7fD?^iw7@o8aw5@(!yqfIfu&lmWzf%VLo{1&86tq?-lUFN)z=4s0~Bl|weJvQgBPa*9?-No|L#EexbDF#b|uF=U{k zVyZN0pyCRX<9Gpjhsfxiz+;`|+kwi%E<5HlD27`d;OzBe%k>`cb2>JA;Kmt`T{Im8 zJ+(``F-VEUokD{KDJ|ie+&xICSGxe*<>n8zaLPUdil`r3KGfa17A}$OP1qw+2P@;7 ze5;U;T23)M1;^LJSxplwL~KO>D>x05&UX0j6}39z9QAp7JaECpgLvT9sUb?Gh|^c| zDSujbb(h4UGgbVOx=%bdM7e|$;ps!+Xx}CJ4OLPCdP5MvKk%#OEgcF^C0(OlhwZSjYj;a6pMxK7B~b09IxSL_wBv2+-$^ zP(BIv0-}{1J+r7cQt5(JF%nA>`^46f$_sEGCuvGUggR*OtR56cH047)o*V^#_dYRw zlrk0T4lPDw)#8A7cQir=MaUQ|MjR4t$0*C#R$&xM4Ls@!Wo5Z_`qU6pZDLc*#@3A) zt33YL*XR@qN^wPinAjmD)RVaxA_lRZ|6FfSt+ zTOrntRbn4FE}569$1&ppbU8pK$^~ON6CwVkp#Yz?my%1bWPf`F2qP3$^5VuR;T5C+ zlUx$U5FcEm=*^@+RU(x{V3>GuoD!{%U9=+w@ZZM$q;Ua6Ck{m^2mt6WTp+Mx~ zZI;-Hx~%@~1n0&n3GI=aHXkIAPmgo~*%$t*b)vu;moZqWO{A#?l!30V$XtWAAuEi) zxa95v+_31)K3;Siue=+Q>unPp*ucw9B0NbHjaMp%qg}M)fNF-jewf!H%NDgJfHQ`R z?h};i)*n%t7+Fl6fWdHf-u?+#R$@QpU7n~Yc#3P2lwRy-@yTQ*q5RJnzp(X*ln@3Q z+8xzPESRjU#@4oOQ0Vh5o^o-FvOs!Wcaj*ng-D;63k@)?oWv7W4Zp$Nj5|Hs;U2WC-h z|HIkcnN3eNB!q+%o+ktd5JHqHMcAl-1$!@u*LtyB^MydKHI z7wsj(*2c-6iOpndE*g&Wa+xAkM>gCLC98ClYf_g{`w8~~K zq3v6y+aH+4?l?V=P__**z!g(3K^{Bi(XW@!Z#>2-Z1-W)4ucb=!g0xKU@EFIh$$yD zibOwH*-$N2@G^5)4@^jm;b?;yF@B&sz<3mSxv&fv7(`S zS}<}v{*%>#4FS?+S*Q{?Ko5t~+@Gx5sQxmmS@bynRPcymXfd9Q8o7IzWCtX zXxg~Uy5k;PM+wrF*T3ld!=uJ+Ki4U5>bMabdz=`#_A@>?qe2x~bifGy8|sF%kF24~ z_uBW}nSwndM$E*~)LtKN*|==<`a-Ti&;Kd!y#N1wfGVxJD0da#vmEsKg)(dwaMCPh z9lzq)g>&>J%t29RzM8!F)!cVIw} zvo|nRz!g%eHDm)Tkuwz^s-cN1ty*S3i`K5RTI8c44fc~Tv4I`4n(_tA6DD^7FVQST zKvby+sKTmWhlLgNi?X;dC?lGG5^&qBs_{Dy)=^cB5w!xLv#6p$gc+fmovW=ZxLm{SwEmv8#CT&)|HB zNceRv9K+vIopmr-Poq26StIdwbe;7c!kwO3Z`DU)-}Nvtd_harTQ@)lxUe29?+dB{ zx!f2^Z8unreOYij`ht~a7kFt4c63P$M0^0%>Nlp+z26a7VX;zL+UIVw#lkV zS(~gx^AkaBH=&1b=sd6>(+`_ zc8-7r@Y1Qf$v8IqzswV0yuxB4BP#=;Dp_WBAOos+C8e-Gcvj)>S!hsGIVDHonSCjy zdmg!_^BIo{9%J?+t=VohOk%~%(D5MXUuS~At)ciG*lYc$?G7uI`EaKl*0+E_+)nFd z$YLMvv|h^ooZC94G&KxLXx#^1Aw6iG4d44_La=eZqqtpGQU}b&_QkRQYqGxtFVPTE zK!Cy^7b_}=hBARg{n0eG4K}!bitf)ahw@gD*Wglfi@8@yyF{d9yVNST|}5grz}bZ^gzO zM6YcHpCKBs75bs(jaUPC>pXnG28G>bBMSL?Dfs#TApMj8`06M2i1ZSaunilIX!tg4 z7^1n`td?o2MT|@_tpJ9N!bpWvD5y#)po)rjltMhdQlq{G&RV1X-*ATR+HsHNbBCP) z&;q?7e!yK(IRPem3`d*0-E!7f-13TiX5U29_gINx5OY}08cJ*SKp;{s2bd6;{pz-@ z%I&IpjH89XQLh9<7wJiiKzgN`1w1bniCwK8fb z`D+D44z`8irIHAQ1fp;DTB)s>>*Gz0IM6Fwyws8~4B(ur3?wDY1S(P3J}c9&S5JkC zcttUzP|OJ05!*}WQpbH(jarb=^1+@w4~Md`i%L`C;bBk%_E|~rI!xK8h%4R_sBE7l zn9%Nn*JB2y?6+>vD5ysl0JC-?KDQsR9S#x)G)sX!6fcGMvhtks_VuzL=m z^8HpTmgQNcQN{a1xWlWSv0AvGEYH}1n$H}tl5IvE$V~+Ytdv~!jLN}k9zZ=K44U&y zOQyRIN)X&p2ds8=2P%!7EugVr7P*LIf;yP1!!82)19QNM)Z!pyyUAMr2Svi7J2O2~ z7W<%ph;ymOL92EZg@^&4Dx)OP{DaWo;LrEFxc24_+RFgTsd` zchXt3f#$H^xg|WZyo%4CaSxDV)Ci9u2{c~6p@R<1BlEfKCnYm&Gy&Oc#Yc*eg(ZMK$0RhluH- zGcXVyg09WW!YGUWxDhl4yARF+Pd{pP1k=8F6izx=+mBf-aHrqX#~=~)qu$4?M;nY5 zY+qHfGQKGV6DJPUTK*8Ip=g@5#_AlQ2n9o7wR7C6TTfZFFkx-GvVhmz0>^bQ^$3_T zG21ot>~Slrm4d+xa2~d}S3)_(mD$S*VHW9uX{%WwkLh1OT7KMmE$17{HU1shFWN}v z{Z_LX)M;-cA*NG;y% zQ?dJR{9@I4Q4OUGcn-}jFhroX1CI+<1V|kLR;lL!oR0LxX+TG^c?%+kHhIm6<|zj2 zYg4=<+Wxu&Fw5a8UY5u;)?zkCu=czsQZJ7pz8^BPTS zeg*v-OAEN(SlWl|Xbg&lZTvt*rPjY%X;v)k?N6SzlKq%fOvNr2kcUu=)mk+II89VB zwAAgCRVxLh;{v0HeqliZQ01afZs93(r7S>=yJS@NC7_36r$Fm*x(ywng~q3WVEQcu zwmux42}}iMYwk7-%5Y#RuvpUM(-5Hh(c04r75_MGrDiC*A%F;w_Xm=Dm}2=H9tYE? zvDExmRqLr=VL%y6eHk46XrfMJ;M79jRVy5Go@|Mrii*}?v!sYJCCYkZzpu>7jK}1v z1uT=*eR_(8WzZ@PQ%RXMJg5c~ow4pR#?h%WutRsJ)@Kp#w~dCLwQ{R)h&XF~B18Rz zIYq^#XRXdg)kB&@Sq(ytg}bi-oP6yq&9D~!3R{vpT z@eT?_C156-b-Zq&MrCO6Y`RI=e^|-boBb&FPk8MV3bTg{)~G;n-f(NE^PfQ3e$@X@ zE0gWo7)2Era*&3YJdPzP#iV{%UMXZE@GO?sl!Da)YuJs z6>w=eb51BsLMcqlz$Q|+i&kR(B<2@b4*nb7B~SpyMVzE%dW4GngJRb8(qJ4w4_-l5 z15|mz<+&5}17oSzEp$ngMo(3`c#Xw*J*bK-1uUn`zpS>nQseo*tfzp3Oa8L_fXU&% zAR>;Y$V*mMPQ~)@VMKsaI~-v(41kISP5_Wu?O1x|l9k-Nq7DxWOR5+X@)h|CQMeg| zG?YuImcUTJ``b$}7mTK@m#iD(D;fbWvU$Iarj*N8nm)(NeYM3~dPOm83NEPo(;lKx z^!{Z`r5}yEtk~_!%hzcb-i;wKLbb~wi@IH3MY~9>XqQhY;>3WuZE`$jn8i!pVwEcB-Kb=H!5ddepVl8}%_n!x)cbz{TT+Kyq4Xh;gveyljd+ z(X+f59QN~kOAlM(C`=1C3z1xHrrNv^%~-hea4iIO(bt5)Nxga0Pl)&7gN=|P9owR= z6rV7KoGHb;Fh+CCAeP41BDEc{&ogLTg|MJv$LeYkem&xFO%>gytQP>dD(#Hn9Ryn` zA|CjRwlk)9t1T`W#)aZ7VWM|v>RCoa>6`;R++jaK%4aL|e_r8DzJz8Wn36BPS;)R7Xw!5C6#L?_nQPABaPjj%5R5)kn^6J-G~8j|aV9;R zDBjJ%_$_x1yE-{SPECV*#PBk^I0!Vi-1V!~E7W@D6AG^;vg3Z^Iv5H5PFey_{%_Q- zns}x~Z#7XkDSFIA`|54|QV4Zf%G?AP@XPqUIGL4&5y7Yk=Cw>E(f(@U2IFIjPZDj7 z9`s<6s0Tw^ev(MU+t4J~2tT4ZNy5e3A6MkHN*4awA1OY_U7lVp7d zwRQVwT^D9(t6JRD@6@ci=$Q7Y<%V|scZ-l-IL3#KrpE_~mBBWM##I+j;h4f+r- z(||^RIy6mS9{Xf~dGJs!bs13jY^}@2Sm!iLGM?Rb15HU0ciS_{0PTTvDMi%Ffhx%= z6l=AvLL7|I(}^qjx3G=0f9v5?Q5Pnof>crU0d{C%jns6puC=--KM;}_uppL*;^hs< zy#@Remb;6W6gT_uzQWJuTk#8{&#pW0JGhLFrHY##Ji!OM%(lv85VRt+Lr{DX;uZYT zZK}@qxGT=9x6%+l+=fa`he#0Aj9Mm9vv=) z&k{Og^#g*uXiA27CSyFKPN?%0s@Jv3?R()hWFAtY`7(6OdDNh$XqmPXZDpCm+VS5} z?VQ8v^(B6L#W_qpYl`VPz(VYgHoX6ViJ+LsO!Y_ej}Q18$_QvzAmB5Z;sLwt6lT(o z=4Og|HI$ss*n6d;IV|94wrT{H^nHIQnxgbM7P!!$C4HL@nE$TT`jM|M7phx_{Qi>7wU+N6kwo0 zzyM@m1F<=Z2!MV7v4EmCW{LWYF;C+c0oc8>#5?%0>WZiHff|gDV^l00Bp7f0YB%z6 z3xzBSQcSqL(i3>&&sm|!Ss0_0M+Tx$1YUI(qP&*aqg!MK-`q0dMN~SsTMBfGVbMbM z$(>E2U+apAi5LuM_8RP_@L)}6JWZ`9k{jzo@#UFTTa*F23xtCk+7qo78a?{(F%jMg zU>^wC_`ROUdP)tGNh;ef_px4}=inS*KIv`nAOc`;Dm0Z%30@*IU<{2z-n`jyHHM9I zfV$Ne$;K!eR$sjEx4Sl*Zq639;SzX0TikaqU>OOKKL>400%JtuQ+P<+9)3Ve^t&>8 zApyGuC$to(AfmD<0;Gg-W|H33M0Nx5P&#&RU?XEsOKfCZ`4HI1BX}d{(8LDfrfYXI z^RjDpb26pmh>RL~OP4m`4Z5p|x20!b6J?pRBsTSvIihy@mpuGJHXQ;&KEwm?J5zcH zYYr|J&JmB|sOs-I;x1>p;85ylUT0pz>GV)Takv3*deD9!y9(8W!4eTWq9<)T@V;_| zV;~zgq@EXZ#Vz(XETzw&8M)%7n}a-`uiRi+18tq$xfn_^j&wRRc{D4OS$z@&$8Xi( zpt4wSn!>919o4x(JPR(>`vx)XsTDgA3}6fz#B8L zeHAalEvw6nBlevoT0~UEW3(QWVp4W~(BM z-KM(+QjYVz5*^V4olqrX(pb{U&T&ID+U}N&@axSu76|tQa z!6KD1%aO?@5@hCM9*}=la-AYTB8p9Lx(NoBgIBM`GQ5W4HJS(Hb&EE2?+h%qs$+N+ zS-K|gXmkVuuoy#R%RPpz=me%5+ZhH7)m{`Jqh_k$3ux=wk;qqbU@H#tc@|RFP`!Da zDmV~@Qrsm*!ls86)bS=!(BwzeB>>8UT%wv$dTvC6kPru%hKsZMV6wt3h-IFuijmnu z((!d)PUp1(tH%5l$im=CR_VM@>A}W2O7uf095(41+TBVdRsWecag4K;S0`386sBo5zDpI`TKE#mzW))9{Bl^h z`4d+?SP^yTme!C=Pta?vMINF{X0{dsjFZK;+$=scvB4L&6*qH;G_C}35nz0aE8emD zGd*2LC9bHBJ8pKmqO-YXFSX7?GpCDR$`cbTM3u(06Zdgc=`-!b4Fb$=77cAD?he;= zd0MC1i93v6sd;;`#+X+uJBa26$``k}T`Z5|ieXQP=HQaxDK*|^ZaE7d7WcHaC{B^Nc!d9L1wpa$3?Ri_c`DIuI9X`Z{cYl(5 z-b=t%=Fp{Nx7ejlUxoMN`pi758Ezvs z-8kCX4VI@96qYYO&)s0~H~LH!hlHKpg(-;XB8CcMfYifp4MM)*Pz2M3dv!A{&leA* zY!)t}*8n$zZ^Hf6WEIbJ*F#O%Oic>J!*N?giEDOsOSkL$q!33qssMIPgv&uqL696@ z%>%gUT%1FRH!PT_i!z z>D67-%~5{3{?Ou}X0T6`OY@+x-Bl}I%ryI#a0N8&=`K=qyf(Mab4HiC4u^AB`AAU1 zsoZ%1giK_@=B-|*fv6hJ*WR#@!$C?)Z!DtHkHlj&RH-$bs7rBxm#U9ax$utN`>}Y{ z%>M)SHFY_Q0j&!rI0VOF=-7M8SjZQFu&y`$TWD4=$qDA!Fs2|(kcDhqo57P%)s7*9 zH7a$>2?I%`dNIyARk$a?%Oinq>W&rxD@Q)0Ezg3-wzEsz1^cQYF1l=}R5y8pF%_`i zi7!lHWk^{TF%&e$hDOyG+hEWm$coNpR$Gqi&@iGfHl=bcydzh?a|dg_ExAcei|;%@ zCdzOcjQl)TtS}n0LGhvfvr-xA-~dyhQj3`loc~00YKT0fV9epnGF3gy!y7tGHr^9r zD&PSczn8lAg4KNk)hrZuR4emv(r2}gW*KM>jNcM?+oMptQGJ_WJZ45V9N4kYq` za9j%J27LEs16TmX1A---Q;@E`dBfD=r6bf$DFzxISYl5aW6vwR4!~W8S|yp%OV1Bx z1cXXta5PG|t{{U#r6M#zvAja4)TRUAmg+zT+XM!2??3}*n0Ku0}x=x}&ty;IGMH94h(prS@89B1$u zp{xbjIGy!Ff3eyRaS?AG#$}l^WJa8~rsltSpUoz=BeU~$ATA!4+5=) z`SQ*oqBQm7aE=wlM_BVjGZhu;oxgK%;GEhF71gYQ5hc`cjHnZh@F8YYCIZiq*B5!I z!~R$8lA$6geZ~JMVMWtDF`|r{u!o&Aa#4yn?g*kQ@a1uW%);LKs@l>a;MQ;rgwG%gq$cFm( z6W>3^$DgW1~BgN{3qr4mN zP1#J|_Z&zIEr*^PC7K|h-3KA{^8~$@IcIIgocwxR0k!^w?2||`ujThDP3(zS< zQox8$Y^uB0s$c@B#g}NS>X^tKA>5?He>k|C+vQ^nhEs+o3>HskbYEvxf)5Gj@C5k~ zPusBsxX}Vn=Y_he7*Y#fa3gmJU!{-7Q`BVwNXZWBJwY@~M9;XqzpFn4wyh9#L={DT zqxBO+JrlQgUz{M)MxC7@SBbZrw_AbtwHM(W9X-eqG~mK?A$e8j)}$9B0}1sVc`*x zQPDB6bY`NsCI6DZ7tfg%&f>YL(+HP!682^=sX(eyR;8rwItfZuu+&F7NmfewSSQ&k z33KS7-@Wdly3lu%M9vk1;1#=2X$1UUrr%Zf{NA%t-~9ebrH(7rSH1FkFP*Pv1lWnT zQ8AJD4-@A$qZH(k7!APCE0aaTxX&t$lUwLbQzwfw8aY`+h4E2CB=x1;lSPM){VJ8@ zFSaA+^UB@nr2aaoG5`nYBoBb9;y`+HifHC~(^Ej=&IeU$kKYGZYK-59RBDOehti2D zqCV~sjf{+n;z@?lnJEBsc%_B$KoY^zkKi(q{DcoE;6!flDY{aHk-C!@&V<-*Ko{Ya zXX=GN(3qS8Qy~c)J3)*n)RpvdchaEvRHs!gMwN@{Qp0qThlC0`!#T;r(GlwTiq0v0 zs^A+dZ=NbTRxMCBaKag)2cx$s6-^aMb&&;e2?|H0tUr_y*MI>9l?|M$La_hIBpp0>Y8t&TzRE^0HAZ#aw`5t z)KBGRUAqgPck?zgC%^#VK+U`KjY!I8A_dTbr*O54il#9MJS8I2FbWNIE`+pgTseVJ z`A-qJd4dU~E`+ojxCRtN-im?bF?eba!enwRo&v2X;))ubnQ#YM{e&wC+%#!|E@B=k zBGy$H!T5{SKv1hU4^BY+$iaqT{O9(FNG*hI-_u>u| zp*|~gA024G%Q7*Zc?!dk5eYgYp3A6srg+{cqO@<}lNv|2ek*EK|3YdU(TIyr-Y|1u z93Mv?e=BN=FJ+WPt4%YV*4o2kS6fh%RlO<`R0}GXPIC(v^mv%1l~dL% z(cD)##Y1@B|J)CIEX%22mS`IKm1@YL{#d=BRAc2QboaZrlhnph+r`J#ua~RF zllgbKYGgQBW;klsRy2(#h1qJrCtYSquRQ?1cCa^42y;#)AXPHWGpfj3;>5Zl2HI`)%|5cgZb2{%L z#!Swkko`0-!U=VSdFWgT)I>eQMU^CP03jbZmH(u0-UnC{25c#f>1_adV(V z?x0-$!NLDI;x+`j4VeSwri`}D5jAmV=AUr3rDHbmcyQzJN-8N0!(`hj_7TYKO+ScC zBb7Sgr}`v4t-y3E@k$!?gYd`yrUuD$!JQN zE0XJYf{t!Z1Huy)Dl6F*O8s(3E-NVdGUY=8O2MN(yzuS*BQv(91@P zB=d-%%kxA=6>a@zy$#0yRFsaVo1vtotz&gTF+qH62CIj~RGS=B5W(6XjREk!mCP7S z7z5n|ZDWKU17*oQPbFhSHKQt(qFDXFX~AoXP5Nx{mB$Mcsm@qXM(+S22N|}dXTC8L zGPO({x@pH}yw2vn355E3$pnt{6z^$g6rtqGyT(UsaP(BpO^*_bF--c23*US54XfRGRFarHd38&B4_A);lCD=)fFUB@`?GPJ;HmxoDb<^BmF!d z&W$ZJVu7dyJ8{VZ(It6b0epxJLLd>~a&hl^HUu8v>hN0@!q&fuUS5cGFQc9dMU9y0 zeHVv7kZ`kMW}S?n-GyQ?8c!?{ooM4CQ5D6GEfNh7p^l_~8;j_(5|NJ^)gl&)*KqCr zdyB>W(2LhB7EO)$Wc?`Cv9`MTM^TDOwlSM7(P3DZYQHsA{6hOFxPFPzNUt z`AHbiWrr?Ty6j&5IZ&LnLVRQ(ZvX3*P+9lW{*{Q?`H>!5B_71J-_uu#EF^AQCGJUC z2J0(=`3*OeV~>PC9JVs}j}SI-jNH|t0QdF(xLUl!qiMND48nC@>(+?sF~>zl+-=bo zN){N-ar$iyFu%Mw{byK(5#M^#TF3?~XzW@T!H?7YwJ`dY)0VYRTUQoGtP?FvxkAE6 zNVjhgX~yc}7dME18aVK?VWW639O#RPD!#=(XOp-;aV^G|Wj@G%?sC?#sTjv{*Ax%k zBsQ4w>s4j~tIX^qQEmQbt5}IUcW&K=bzDzfw!wOeHlksRSx4V(!w}Zcv2Bob7t2U* zJ3Gw-4{LA?6mu-2J*6VUm|tvc$9}B&39BooW?<1X<^{hwr{y3yTf4q|}#vn3Lj z3qVyhugW_Uo@r#2LSrBRC++P z!by*+2Ss*#smusfcMe+ZU^is}d^Ry_k|TF8z!g890}-;-{R53p7jMb0aS$9iUe`O zSHT26aRpn-o!%At$eR+#quEEmCU(;HBUrOtbomGZPInhSbrj>k#{BRY%rbCe91~;k z_QG+vE;rDCJ;v;YC&d%EbGi3Pk;0f=r4nY(Iw`V&y!%grxa_Cur{IX$Pj{UX zx8i5ODHyYslQ=D21o&P#EmEtacKB`4d}J^RR$%WVn|Oqn_{C|)f7*6h>_pw~enqAI zlu{-}$pb*#gEYSk4D?X(PDmpr%upB4iWifQsLf!yB`}8KxP^06y<3>U2j@iBUub%{xHSdM z#KEtA0um``!TUNo=puYWCnZJy4klkhZGRWlOuRn!yXa60dgIhX(L5P&9yo-%53DD(?&4bl*x$E!aM@WbkFLkjE86oL_Yz{``XT z0q@5y&S{pquimW3hF*fua*Wztf{$4PD?k$kBdC~AyFZ;_Y#n54K=wen&b>ppRH4}0uQXLLJ8;5Pt>`A$@HdS zmxccxb~ht8L+{n)Fag7BfanklL(l4>jloR*w7&sKY%-SYSrD-MLfU8$0;?bXI2YK- zFeFSq?%xd^aG7O>d&bA$?YM9|q90i4= zv!z^am>=8JEmZcvZ?OoIU^M58YlO>e!}x^U+OicDM#!$_CpMMDn+?LFU;spmy=*G4 zD}D4}q|A+3YgB6f7aABTvyyx9O=eMDuz-l7QTPg;)(6g9+7v0@v3l8&)TSQ%5c4_d zjVQ@+7Yac(M#(|=zUB+j@=^ROik4$B>8E4ltu4?0z!D3r1U_YY2YRslW$;&JQ&TzfK3|sNf?L_7%h^HHME&|eF(WJ zGLhOPVlpe}wM2QhF_IP}${W!1uZgl6enP9syej<766NSnA1?vEZ>1-y$=rzJ_)dv( ze;lVF)uiA2etq$rYCs@7(AFe*lR0}m#U;xR)b~wrRXxDq!v~wT(x_zl9H^R69cb|j zhbOeMNpvlATsi6VN_#-2%HQO1`)|y6s!^I&hFv|;^j(4-L$H*15t`hPaSP5 z5(gE<$xvUK#W8xmdIKML{Dd~7$cEK5t3!dL3^)n+uAFGxIUK^0Z}n99MA~)>r@O5N zA+VnEPq?3>etpV;4W(ybs{9WeaM5Y9UiBRuwpz|-gR{&+3#tW9q38QViqoC$OOq>o zW$@uOHGPN&f-5HrWeX7(qg*!JAY3*r(q)=2l`$;nx|kZQ0}RVXdK$fxE^{I)SDTS8 z+lKY#V26efk;>EM(-m(|*N`26@RMrD{IFq{Q6vdP8u|d;UG$_+b_tuy^{OIqtxq;X zz=Q3V4~HE_1cO@}iO>0EXW#nZ82)D5hy3!NX7^rnPljyNp!5^o6VM`f*MzXmG&q^1 zIL@E}0G)^@lTP1c0K-nuwhY-cY%}*7hhD4Jl#f6xdbOtPjbZ*?Q}%>xk)J93IEy}pXvE&U?O~@rIr%2b$YLlet?`*F z=c0O@2Ug5Tid}-k9E_*nLMmq$4X!F1HNqA`Xml83_jwc9f$-=0lwE0s4}M zdBb-&(T?op@y+DgSe~z#-ps(yB1bkt&=7maLqMHpK~R}UjqAuxk!uW8P3q!gMJ^z> zo=g{;LqTm9)saDV?9Y-dsB5eo4*gn@uR9#s70+mM45&$`xQe1BaVYv%JsB4{U9l6E z9=@SIjpe_c88$~9hd9roJJ8E4iftm>gwJFa0NG$BJ<>$J2$$NTCbBt%obo2}fjdr1 zHcIj>IS?V3&Oz+QMY@uWk+=g}8UIZuiw|Dl2PGipG}jS2+yfG@H&qoH(iDT7NZXsr zlm}D=r9R|wVfFN_t-pW8;*G7of8~5xs#8l#E1}KmJQZM2Kh|Yxwg{V zFrpvy6SC&fk{hHOrn3-^9d)C8#l%?BtC-cRW(D-T=0VkOwoM(Yn5nevMtL(XuosPF zs|+q?IC<*t2kP%^Zr^a8RezgD5`B;@TULRGFeWy{h=|Z0!szI5T9GXqHd+uIjjE^C zc407WQShlG_;i|HZf`aV^Sa5RDeW<&o(-h`7CmI_DwbcdB5Dn=LVAo@NX*pBz`I8c z&r9RYsM9FBgV~1fey*1Tp(%@Q%Ym4-gx<^Dv#8$6Lb>pl=ilyh9sj-Qye%%InEWlp1|8ggiK5tmiXt6J)5R4{jP z@M#ro$d%RVu+hv}p_)}=5Y9?N(X)mIwoH58GR|y>eDm^TayZ|02Q+tL>7Ht48#-8D z-pR^hZnkVnuQ!rieJd5NGb*pLuVVw4O*!?Y|AuRJz?xvSpZR-tS8F3{Ni>$(Pp(5L z-Ua^q)u`rx%4TEC?g{{$g;oHD|0M7QcB~($B~j~xbpnu;duksFuRvkx9%HoCAti`uIZPH8!t?Fo);pOtDLPRcDXTN;)7;wrqaD^r7r5}bZQQCwFo6GEKDKkyHo2_Jf{=Ku6e9YKbJfW4WX2PVn;AZ)jS+JQJw?Xm_>eoj0 z>riS%#W4@U*AVgO@MA-M0_vM!$#{ZO9-N1tqWLL;pWwqb-DrMN3@qF!Eq<=8grRK* zt#xG~e@0Ll-!UVQX9%M&GBZ5M`&ojiw!Kw$ragJGZPl}esq6z;oMl1*!d6*Cjc$>{LE>a< zFz#dR<*QMXf!q4y=dfWv(?LE2KSFT_IR!uexLr=5q;|5lF__x4Q<}pg?c^)CG;V1- zc@GAa&>m{$S$eF!ypKZffVeT98r~t3&~%486|pc4WUNKQvt%YP1P6udH!{qPg50p_8Ql0G(4 z*N&L@M%v#|CWZyJ6Nl#QrX_NB9}mqhTDWp`6)l^(dmkmu0Q|BBoV!tqw@h zt~L&u(oc`7Ck7xBVP0nTsC@-VnH_R?We4$B+RKV3_5uPE@C2V(k#&X7-Bi*v3)hx& zPU({v4%Rq~o_Ycdc_Y311eEQKH17%70`s5ul&nX-CqW!O3Z;KO3FO^K3!aqKQ}zj% zanwhS%7SJb(0BBCj!r)+YoT1iW3sV5qX40&8|d!GuopEEPPC%{+p(J}xtH^ZlQX%NA{Fu|NpJpRKJL%soE}RZJXK z5kT699}zjggJCch5GuX`ApQCfh`~l`{S>Sc_dG1a@m%nfY+}P60{GG^&jWl59|rh( zhEh%^nL-(lKwaHP_dFtV0p5Z~6r{d-1Xao|moTLEKcXNN{wOrWF;xFi;NJ+k`%#&K zA$NIH-jQB;tUdKuSvmE_O1Uq9E(KeD?FD&5Xn(Z^Hr@A_tWG5_$OyJozo0bGQ!mK& zp(DUo`RZH@sycoBoJ_GbX3*Y-p;e;+fdsHLZ(p2#PNByQ&nxu6{N6Boh0@;V0q2cW z<5^(FbwJun57VH2&j4KKXg2>~<31--sa!v!!6r6nA4Bc&f1uUg*zNz2_vu!7x8MJ) zg4MgvVn#)kXSC{BHKQ%hVn#*u+q3f3$}_4;1<%Q-gvwCs9T?8pCuL2vj73a~$W(KL z{Hj)yw*VH>+X8Qx{nYZkh*SVcH7RLECz*`et2(L4oaqE?FVNVIHB2LKSPwic>mj72 z+tVOfV`%2nvUaU4xMU907(Qus(aq`&B*vXnI8(0(5g?6G9Hom-%SPt--gHA}*#=gH zH#*Ds)FO~&gfR-m$2tI594G06wB>%+hl)Cb0M4PKoq<3jDE1kJGWDO4_gpdgejduu z>o3ZhECLL9QLatiWPy>u5CyY>;K&?zGcM+Wj53(gUXc&R3|3lUFfIQTnQRtpq!F*k zH^B;{UzKh0xA09~p>9UIXuCRocZIZ%4t2L75mKAGn}6ZT+snTq(%sL$_y)#7{)PG| z++8OYcek2`aQt$F`hqla*xSip?ByhUSDNn%(@8NvcH!cxa@!dk%I)mjko03nBqGJ| z3KoZ;Io=N}QSG3EugX!`zo9NqN6o`*5uywqy2PMRr5Lz>1d7o9W_FUZJ{S$moFLL)3VoL(VR*TzaiUD{Rt>= ziaJb?Id%Mg5Peh8StG_YLNH_HMZvBc4H{S1Dls!eo}WffkdLKhuviE81w`X@HVcCx zd7Q*m)?0LMZ+Tn1AMaYL@2^}j%tI#imO0f@Q9jQf$=T|J46@P30&@Dws)?YlXt=I9 z7}mEa1`ljAd1;i?N4gp56%`dT477U;Fsy6!H}g{I{XR0e>H^T{EVIAq7T}+ES*yo6 zM4F5y5H0ab9}rgES>x+==2IhMb3vY(f|?vZ@#OkjG@&Pm%YHi6Q%PgBKaq_i^#EYb z#0Z}MMDm?-Lwm`Opd^0WOEw0u=k${QrW?M3qeTdA*Kpq<^pT|HJ@y{8mMJQQD?fK^n z{gWW-Poqf$Vdp33=(yoAY#1T6Cw)_&%ANmfg zXWvldyTGCu)bU;U7T%V;D_a^f>GHdkHk9-0jh4}tI zvJrfqC;kKb@VC_HeVOZ(eJNOWHFbSoJ_z8hd|!5}qFZ|XwrK1=)zm0_77qmaEcN+7 zKH+5-Xg?zNG#MYP1GarfIUmZ~yzKrJ*{i7Mhw=sL{ecXp^B;oz9-!22@@bvWqnk>Y z+70V|fR1*9`(YL}%~wA?^Pw+%N2~IsTjg6N?Uae&kXKP!f&8O(iP~~yxK@;zFrP>J zQSI&Zc*;_Q1P_agTX&aJ4XpBskK~=nN3m@oQL)fl*YYXBijAn?DtCVj`C}Tr|1mh< z0UG-;aPj~Ze+>Hq)`5Ex+0`>k3+R#z@{WC~6fK_kV zoZ^N7>&{U2Fkt6?dVH8{pV32cyMhX0<3)r3419K1IO()xm>gpEu<7yPm`@GrHe425 z?K6)W0sdT0jYdE#hSTn!BXD;iC2#|~A)O4hL-u%d>(IaIF`^}@-Zyt?P zZa6d4RUK)=BmCwYM*}kBpWxxq8GHnPvQ5+-M98!T3z|#*!WY@AjRUxhKdI;o z`JM4QJ@_Tq%x|>dOPOR|khJYfc?6$6TR2|6n$%61F10I3Z+;anIE%jg3L~0DYrcXT zVn1b0gyIR;;Y2{WjK)sHy8lEa6VcfMsxb*JiembD5-3bD{X7Y1dx0)YlDA=rT27Xu z@wR<32viyQrap zKc>QnFo@<)l`3Kf5DpDQ>>Qd3A*q~Vr$OmDOYNpXI6h17OoLK?mg5=_N-+&XTuu$9 z%jZ*%*^%I-F+PVaWK|F&1Tu^RYp&>u*q`asq4$;3+UX!pE9tN4ay^<@`wbj%XQ|N) zIZUE9E_qpx3tx;Q#b;)~dH_T;zLhtG2f`T!Q_F8<etA@8zv2XokZX4)UJG*LBogK8SvU zyI}|we=qL^)WV8kJlIZ;7DKW)MsF8`XKbf+#quMD+5>Yyw!WlEb7Y!_*>(VGo8|yc z3bKy-mO`pw`fw&NSL6pAU|6viR5e;K2}Y-drf}2-|OiKv=ld zXz4=vQ1S@{mqQ9}yG-YJ0B)y>Z(JnLnDLWTezsQbvixD(YSSO#Qa?$TegxbmQSBvw z8=8p)+>UFwovQ@52@JO^#GwJP_tVxT@~-5as?9?7OoK*5vRJKR!H!YOrC{(oY1LBM zjiGtRGT8^;XWq6<`WTuqh@=ZZQ~m^$DW}Fi0RUjIKLNH1nyK{tPmpUWK+1^Nak+dx z{QwX#ADU(rM#N~ueW^RL;2_hexPCdT1m$#mxq@i=3b`4LoLd2}(HZKyQZA9GkHcU< z#p?90Rnj*07Qekp{$wEbr}Y}yE*@ZoKhDWxSBplyeKd59+!8-k%{EG7UYI|ITj};Q z*!f<%8PR1Bik@C8)020rVzbmjOf{WdcvT3zuXyNMxyVdGz5@vF(hxrHL72}mPodX0 zfcbByNgKdeOK8^ypw^M%n2nIj5L0s3CRwNI6vc%2ddvyxX@}8vzFQrV8 zxok`VL#S)!X2@oiPYDn6>Fg%?J!O?5CU*8_sC8wubF(5T7dFE=cZ9y$0zoc+D= z@-eUYU4i2FW`s4faHE?lKDtyc0XcYPyKD=&n zFhDkvp-Pn30>hdC7??*R1zf!poTDe9=ZZDt(QuM8(u1af1;IrlSP;~q{<~$wgHyap zKGpF5SqXztlSuW}ysnvfZACi0TPEKV0DbPY1u6}vVhTbq z382m20}eff2fC*DGyCo(C)pm z6^34YA55~#=#G7$Nh_#u9|+Y_n!isruZ6DAi#l|PGtvfkh_#y*qYk}7En^Sja!TG0 ziE#?G-Y*A0bzQd~){=wt%YH;|)jA-n{Oy6ujt69udv=AgdaXkLc89W$Nj>ffW&4eK z+{;!8{kSib4IBoaKjN=yVIt0c<&%LR9U2KZM8(pE1F}KBZWM%)_q%FT9q9p?fz20m zK{d`~gQKgs)H2nHi8bLK0u`ZCn?MKEat!k)j@bf#QsY8V3CQ~;6!;pf|a=o<5!Vb$CgZ^i|#8)NpQY&|G7q!&<2cT5&Iv;jJEN z!ePkJyXcl9kXu&JD@VYo4^iJE*ceM`#u4zdW&D#A3HuoEpPkf)$vg^V23?(bL{_8L zM`c{_<;A12wR1R>&voeSX!)E&H0vnDmapmXQQ0$pX((J9@SI^+!)L^la2coId?;$D zlrW$bQs8yvGC(`Lu!Su60xVaN9lN+9`zJW!V>!QI`W3}E79?1Q%{%;Zt7?u-JnYch ziyMg<#9%!fufc+va+ZV8Pf-ksV{4&ug5(0NIGTqUA0+8|4+_B5dQW<0|T z@ze=fBL=;)_W)~^;PxQ;^|-7NUq~nmm5s|5e4?7B`6mFS!?foFf(^%U9{ff={IE3* zKTwW-!BVcHdw!8s^VyWj^v4+*s^*o!lXFPFK;{q*tdAWqb8WRzrq}D1M^vqLft>Q{ z3N+-yAKW&>*XFBmssW~nQykq~9RY9V^{1bIkuA;c#T0Q8GsbWBN!fva-#!W3FMda! zl#QbmFB45w$@aA&y9E9V;2 zrU;UPV9nvSM_I3AZp75Rn*$?JY-!RUiWc75?+ z-g39^@XyArAH4sCE4vi9>4eu5>L0gOxkjJ@KKYoz-|(izZy706y-XR%UMPcEYYgR{ zfp$Hn`0Xu3FbwFt z!QcNicjo7#7res~xRLi&-@b>|_Qb&(L^gEBI^Z%>&`7p~!&zC*Xx?KWR!OK;s)Sj( zb_IfPZNAG0RSY*Ck;xcW(-7W>MqL_m87lutns6C9-3eNCS!Q*<&S)9JpeX^w(zB`< zU&Y9QQ;KY0cj6kLVca7K!YD=~IL-iXci1OG9<+V=Cy=CA2nR{$V73bveO5O9#L$Ip znpp)5jMd*?*nDy1z;6#>_V1z|!eCy9upd$hEEU~W9-s3&(`@IQVqrz<-u>YwR)z=7 zM;duq+R?sYq8a`Am%N2HAifIOhTa=$#j?XXoO)l9O>-}MhqL=%vziqns~9wvGtRJU zHvhX7!TRM@UJt^V2 zGV%xUZq$w$v$rgoc5+Kd-t>vXC$ByD)xa!_G~To`uRy&23-(w{Y#z2UVo??5m4LH= z&MCD0@xcD+leb+rH0_!| zyi=x~{nYh_i^{+}TVWnnR!vSXB8;nf6+Puuj3PkSa1EF9J4hU`1`qU>h3mAI!mI3t zA`W@9WmkW3A2Y1goa9Z#!!@Ht2vC*>u1ajawgh};l}qgA5@8w~UK>_L2}&1s4HyV- z7Ire``lzsLce?JkZYxg~bOQ!vUQ55p20os|Z-LpU2SpJ~=TC2wwZaNvkKKx&`Ls*e zIp``<+AY(s_Zi*_bfV`Z;+xBWW-An2y9)wUTv#FuN^H^JuD#kNy1`d+qO zJO8>%3|M%Kj)f@LTCfo~oYC#ad<)n68m!@Ln_VZM=De4;!r!*oY9|FghH@5K_^1( ztj^b&M#ZXv0P<$Jf(q{ZTZoJtb@+$h*Zz3&2&ik%&yVh1z4h$?e>#tt5(KKLjUEJ- z<}kql{N2Pou}Rep(jQ&7Vyj=lovxa1(e3QQx+hq{NUSQide4u=1Jq|%(V!GxxPGBblo z9A6EdqmK9WwDEuz*3+vI_VdsD@7UsYfwn4wk-rPJx>$$LqOFO+wA1RWno|+Q+>T~N z+Ab8R|3=!a@O6_$QTB)SU$~yuEvN6J?Au_Jz8GcqVd?fWM1}J2)M#5tz5k82S?VoL ziNO(fcrzY}weL*UkpV19CjlaHRtUb`hyCgFpn0)&8_G$LS&qM55W9HoJ~eLor|-7fJ622<nboRH83k;FQIR!}S$Ia7DG8tz{pguScGa+PfIXy? z&*@Nt-53T=FI=rvRhtiyzfjfYIIKQZ?JVTYu8I+Cq|&N(ef;2hf`&+JoM`8844iUd z8*ZYGfm7$VHqv{EHV44WN>t74NVMykB})QP5t-G{+#l4w8b&;I3w>72zBvUlPKc9& z{}avvb4QYgBp} zOl_0wcF!ywfr@;404kPyx*nSc_-q>+M%HtFoX$UlXVwMTdJYT~2pZ-h=eY=yluifb zg^RF(hV{PwBk5?8U8BkfR%-CA=!$MADcSCnKWZY<+4L(ax`*Jex@Ysw1kPs`i?5?k z#WT09hZpRAJ{R#8G%y1;6>;}Jah|&B)2fX-tBY**im)fXQjuOoDB`KnGrS@kc3Y`PKQ7`eTOY4T zcq9xSmC6j}GN{Ib**r`ShEJoQ2#0O+3XJ6<-gw93nV|&QRk_HlO0AT5McB(wsiXB= zgkhbJo_csa>BR^Fdo!2u=2YYrxoSOj2AV-DbG#x~Va#4G;w@QVN^EfR26Ge7={T2R z%s?|`UNbOQ1j=xc$&B<~k&DB5+SDM`&a6^7eHL$qdGu_mePi^nfQ=k?-tV9r$I=C z`)7#{y!0Sd@!OAPZs!PUWOg_15p5B*1bdddYg7p&FgX373YahB&dh#(JB_bwH2>~y zl|TJgDzP<|+;aGg9ic%Nx9So%MJ&dB$+)P^R4^fAl0C8}hL+CgGVk`&DFR4j1w0L4ik+ zVWh0Qcdkb@J*pC*>p|L!jsmndR1+snb{23q9=@&cMsgKRDdi%(zG&l+SL7;^a-NIu z+M-CgSHvSJVIH;@PDT-L%K82A!gIcgrj)SJGSH02$STnkrWZxr4DQ_Fo@RKhTt!k! zxJVUmFuD~Uy<((23^ps$h1#}5?`PW)_w)UcrlBtFPv1~VEDg7fiQY3c#+thr8+tERq&O|19wmXe~ARW7N z_+bVA@dSa*y71#!c243Nz9x}{l(p(X3oNT>OcqGRema$9C#M|e6;^l72Y?4mQo#Fz z{B`YQ^OG^us;-@sI%o_Es_W|m1py6J@QX3@dR;rU-efMpyN_}1s%6f>C|GvbIu2!4 z(D!xi*7bVubF4dve-McXH-fj3cbCSI@l0Pl z&J_?1G{e^UC7ka`T>#n0rxP$RpCMSf@Tb-2}NbVEA=+S8uIF$PI{+Z@#LL$#go=Z@!)Bsc=9w-Jb4-^o;-~d zPp9dt&nlybp>qliM;{l5Oo8*_cH}sU?PaGSlBGc}yFvIWw5!ghQokGQ7n;wu zmDdhSixa5okR(5@_B?iY9OWI{#^Ypt=$s3zqS!*aLDCu{@=2rO)N}B>Gre)6om8db zFmo?$7dTEMZ-id_Gwr+)tFwkK;wM)hVpZ0=FdSlK;s|q|0*aHPj5EGhRQ?b0{?<$Tjsi^qvwG|82{M|4ot=4n9 zxB1n*83lj0Y}3~(KrU)+XGZUVlMl-pg&RVQ7fvNVvWfb&LHvqTH^ueK6*j^Vj~}xcjUn_i<311J|o|{-?jI zR`iov6}Wn@)7vay6%L172j5mKp$5&-+p+6a8}+xVGGh?{RZlG^u8O%%kGoc?9$^cO zxzkRhrH=qkr>|G=m|no^V0Gad^ifmyaprne`)goar|P6-s9Hx?J%7Ebg`3pyu2XgX zMpR8Eg#y3*UnsEV|0fERUvCUWKmXkr%6R6vdiZ}{x9Sh7YW%hIV>gvGwKI)N*QrGZ z8{59?%=qF@=naQ?I@-0PyW?YO8tE+{{rZmfvq1Xvw~cflee1W4YF--!+o) z(`FKiY@-2>7}cwJPW`PWpB=Dpm={;UIiH8pnSn+JeE6o*d&b8=q74U)dy~DQ!(eXb z16y!tLso!k5{PoY{X9O*I`cn9e?+LiW1nPUOc=t%Ti6-+SjktXAQ5R6;tg#TXwmu7oNLP*6l34 z5X@Thi>!qMac(_yrJVK8s;*Pp%pZpRa-Gx9Tyd1IeH$6u(mw|YGjcUZ<(59*`=~Yr zeHHT<_B8a)F)c@&+N}C~%46Da{T@lXAJYm%9jc2yA9#+ErXQ{C-ay@uy zt`5+g#Y^;M=I1%?E6W~P8!pY6t1q?plFMX0^9Hg8$&guNFBu;vUc6G7-yTNBOnVi4 z)b(#R!c+g@D)`vtkUxJ#y9b(FSD!F9#eb2_WR3aJ9Wi%cN;g? zRd$KnE|+y%{gp~=JVJ-ZfhcY<~!cuO@_=#fd@L_RXJb^HAsn8JaH-h@!#F%C@Tzyxo6DDW%?!V;7o8Sjk?1)k@? zSPqQy#)bk{yb%hF^|lEGK2*h_QJl1mt(1g|-_{%$W2-0OzylnpN-}IsB^>x-bINF2 zX$c25GzUi6`b#+QV-8d}McS%NIPl9ist~Fwiog(3_r8h10gRJJaXM9#yvl)b9Oz~N zOuL;v;=t}4=u#THRLc8~Aux{vBh;;k3Ve0Pqnk3KK5c&u=YwpmmT^ACsml* z&&gH(B@GBn}Am@@Jw~sWiex%56(_qq`e~|YpOJSh#8Y5}T(3a(8fBqfFVqWJ z9->|^^3kAaxSCx;Rnx>2zPLU;P2g^`ROOGFDslj(U@FeRAJW*VqKa;vE)sm-h2Cv@ zy0dsbUM(_10?On3Uk77o+jQZJ_$K6gYr1F`e=pyKc#T(GTw^50AA`tKCi3~lxNn&l z$nG6wC~O@)R3^F&fTU&|aA)p>!{73roS&M5RgF^%5$XGk!QdJVTfiyHE@veWpl6>!r*Tqx5wKRnCN1 z2-sIFArr-wg9S)uAzmh~)GI6)o9(RK@AO6Zy|XOoud>4RLPSc&GXiuNSVbQ2CM*{_ zVHQ95g6usT^7U3)FvN!gnFVnhh#a%|W-s1^L0fPMrnCnpis7v^BU61Ye}rQw%&IxA zNu__z6lqtvS?Co;!B}-DURvSb?W{YLWjG)pnQw;MBEoJU;btw=Zo1|cvA7B^{d4rA zn&ma#bz5w5tO0WWZ2ngFC(VMLGw{a1C}4>h7#c@ZGz{e``F9S2y-TS+F{dP4Qx+=i$zw;q&+ z;IDe?iJ}k$ln|7}K~@CaT`s!CdwS{(nxc-wSZW3e&`>_TUXCkyNoUK&umagrujbIO zTzw}rL$1`!NPpOT^jnx8kLvLb8ZJ73bskj1+$^FZ0T0SmDnwQ!_l?in6B@?RLA0?# zbOYF96`~*xJ!&r3QMKwf| z1Hh6>k(CUTa-9ctZes2LGd|b_5mZ+RV%bHXSK)HSY8r{k(<&2)9YISfM0t zzR+Zm^xiDdEehw3p85v#E29!l$+I!*B^AvUE3+}^coaDMYHOWvk*-GP@r_}Gl}oj! z2`uRA*g<;5eeXwb+C~t(Za@6t_og*@bi+A?bLuTFjue)!>r6aF=Ksag4)zUKF0r;mdX-JS`Odw<^)y zwTXjpvEBlsd&FrD%d>-i9kFT;dOW*U zAF)NAa%?S!U4lw4`vsL=vUWYzdWkjA)?)}o+0dqk04OH3^&=uC$M!?SUuoVu${?wF znTT(rk^**f(!bNzWg=aN3d&cOiH<3p6N`~i$1M7Kd~gQLe(<$D%SGF$5MLWp#2aL7 z-x6eP^O$I1Y{N4v#M|bW7S1+2w>LAlIjS{l8{Vagy^W34Vb~n~;DlUEb<0JkSjPNf z?UzT^uYfSyumeLgRkepR0@2qs$9XPsbDReeIoEA!78haui5x^1YQJ&?0#2B09l2K}x` zi&o)unsJ9Rf(MPPP`1ZdDEb7M?@$5U4AW@!|A4fp8>$y{I|{}+a@khK)X-@cQrW4l zaza5xz#yr@gRT#uHTSMOl0UbL{Jj)@jtkBS4vEzdACJT|GI%tw2!sY)gBSTq%AZ z`?B3%U|HEcXZ++MD^3(@FRx!EveRqc#l%I$oA0t)370)jSFgfR=kHXp3LD)9x_6bh zJ|++QA(Q&ye%Ne9GjFCZRzc)q80~yOm{*M~a5nLLGb_wu-Z+&`yJ8eAVgOTE{MPTI#b zb1mZDq5IhfULX6m)8}h(_p+Zl-iHi3XwiM*vE)nzUuo8XV1+{0hic%3NT>V7MDN3} zh@9&@>+}_ayk2*|D6?yZZVJ`xJh>kLwLXkSKOj=mQHhA6tQMHK2o5DYD9Q5xE?~Ak zAd&{F%7z2B4%n!#Y7S_13pNKD!EO$2i-@B3EdX(I90GWV!q(wR&@MSmm7Lv@5Mv;e z@CCYao#>d46si~iw~OI2B8qZa^59xIl;=fyXPxLOa#bWnJ%}ovrZEqS>pHIyJOG(k zz2L?!28{tJNCZ6qU5v9~zLdeRPm;pVyf3&5u-~Q7$p=NRJeUNqvYjfQ|Ex0VUGJ$d z)_{)6(a#FJ?*YUFGkYk`Hwn~xy-07L%@jF?oPWp3?I#_@xI4D6cbW-oZ^DFm^$Q?% z0R4{jA|w9K;?^XhuYt|u@dp8(7~W~)paEXkl+fcf%ivcAExq~A^DkH*t9(c?YKWP6vb}Fn+e#7bj3RJ_PK{FGOAL~O0 zh8tbXX1~;_$W--dHGpmwFt2O zTZu!5)9h4Xfn>IvCVP^g6sJ}G0#a%- zD1IDwF(``KAPT!Cm>I?MBO^f7YPSJco|(ZkumzjPmSi;8w1~prg)>7KG|3*J>J1{T z2j@duWR%R0l&ETi-(3s@GD_6VbOtc7*_|w;<7R>+0X0gX;~PX=)oOvo&5ScUaNRwY zsm7HVrxZej`OLw|QQ3o}T-i$m|$d0_3HcSAhdkF83Dqz6YlupV#!@2m?&edn3#U(@UO*M0z{B z$9*33`w(AbDz{05f1%%j(DG-RE`!4Xyr+H!tPC@|r{2hJN>BZia%uBMu`wB2CK{Gwa`g8+MhzcQ zdCIS(aSw|EaKhI-EE20CfiosTI%YRh$3Aao?H&!hhj7zV>5D9m#GF7kMppV{Uqql; zaB5X9o~FmEmc@aKPvNsvHP{w8Ix7)V3)9$BITQfmO@8!>)QOBVkM&u&LdBUh&Wtzs z9M7j(Gzp5g;;F|YqEkdX51TMEjw&7zW@;phtzZ)aKz#A74!0Pa{!XOdKO*i(f+`-+ z^?WcM4Lv3-Sre>j??**;)E7asKaEmZFq!kH7#5F>63wztL$|=)t67rU_>D&)03S)| zkBQ7&F0=x+OR#q`GC1G$)oL`jI3PPv0HE=#gH_)0$1pHf(fyB!l^H31hk=IAHdD~x zz@wAnB^L%G@Nrid%LMhW71zLY*z#KJhNtO?T1au8rLaw+Ux(k}*xy;J_xQ4G)!DlL z?@*P%-4j)jt2qiZF7zydyi~CX*Kh^&<|Z-FRe(th6$y9~m+-i_HZ!X)(qRqGbvDWZ zjjwUs6{eRD#2gMf90U2D$3ZOA)85BLSK#n}kBia3q5EdhpZ8ki1P-IH*WS5VTpgPQ z3%07cbY#vWAx!#B1_zm{{e>F?2q#C&rZdl3m-p~nF#&=qJe zR`#()X3bX1YmVJ&VGBilsO%3S9)0xNKZtIf|3%3>0T&W}21E)i#HFTek_# z+5T^vbAsKRPV`f5OBD`dxOH-%3UWwf9#`Q94>u%;HV+#07gb{a6}u}4KMe4*FAu-t ze+54{9Kr#=eG7bB4>=Eq4z01n__eDm{)1(SG?q}9}YfqL(1PSVwe;zg3w7AP+?m!A2rOOHf8e(J?L9U7&M zUf(6s|ING)Vikp~V0X4;&ENfRvuY)D$8IqQ2fDi5BDpHK61>;E5@1c>l>lQDE5S|N z&_8&5ZcFu0wbz$qVHV?N+UvW)n#^Bkcs5Q9t`1ln)r3T@a~`!cAVrf$Ee{C0;89CN zveg;O#1u2i>Y3opYQg^>!SN88ML$0&5(ky|oftG&BbqCTW!hylCu@hASEJFguq`m% zhU2epW~r|W;Lh?0qxwCljf>9cX1~k z^%R-QmvRjmGqbZdxfSv>YA;T^C3Ndv5!dOtR%?bYwA^uHVr@v~InnsbrM$?lEzezb z0cnqh)^M!<2oBZ&ZZ%A5`_2+@E^amR-?rKd!8KdaI~PFj6scLu=TIye3>_2M%;Ci^ zmwP-ohL)-^)R}8pZ4aX6R?X$DCNxa)TUYQ|I`#yVF{t&l+H0?;*kSQREEii)2=uAu z;faCD!xOP*86s~yhg$U?hl!F&!;r;DbY5*#2;Zf)fkOX^^M`_NUNX1)6cKz=u;x=G9-ov9m6DsvU*{o@--#y zL+f5bV)!{N$O8Lb*-ra(aKYl8T2ULIGOp)3p74ZdgjVzn1K^p-@B4x)S8D)@WD5bP zx*`PLY1MtTjlwgnPyplOVq$^)m^}(IW)Jr~6GHzQMc!&%)MvkNk7x}XQ}Dk7PWSBx zzi2DvRM zblejVa#Poq9-tO!rA{@_ z93B~Gq^0<7XQefl{Y}!k%5+)@H2oQoo9V@I9w52gx%|Q9BAUyMWEKpHrM=JK=X8D;0fzzR}Ufvjs$ zQGuiFKJ{Kg&0HS_GFx?rX-Q)%*p^QJS&dm>K%_%!Ms`+y>H9RkF zX4J2GLA;c$MI`#+wIdO4`tN;bjzo(r5 zHu!5yQNGZ~fp(;C!mzsVAi@}c`B9$e@$4IFsV8XdEH8#jJVqhxq<4hwJ`X;br{ZlO2Ap=5I`UQNhB63tl4;#!a9$!R&^K(0J$DlSR0kY$J*vTHq@< zr<5Hod%&qV#Ucub#R%dV7a}HnuqJ8`I2F6v9;`t^fgXKD7|=Vh=M|CeLB=46CVKZ3 z+(oS*>jVqeL{Z7i zaRpkf7r`mWFBOBJn%9eE)W05R{>V*|#x?zs%IXE{GhbCNCiVCktVMocWM?#fwr6^X z?}=ux8wvSV@G`2VbQ86GRn@TftD+#b8vJ#xB457XtvED4Cez)oqJ+^fep&xcn)%mw?|QHWom{)Qs+2FiATucyP{-&^&QyVtl zvtfLxW}K$(uZxjwU`Pt<8-xOwC&$w$iPpU??gAGw_Ncfe?%-0EU#Ul(SrX<1*FA;S z92J?~`s%|t268_@IO6%EB6)OUOIn!P1-Xw{y~5u*p)<0*vQxrxWH>tNtVHoBC#+s} zg>rgdoIQ)LhxJRcZ@E(Tn2WQw^M=vrH$_}#V@rlB;YxphLnOytXi5058erI)B4xl2 z&@LHltSbR^Mq1p+m)4+mDLwusp3h&5FLPyZ_|bz$Kpj*n`ZF8~WWu?JK_b|cEY@M{ zr?AV2RltZg-DdGth$V1AoElFI6O9Y@9Vkdo&{^TQ`+<8Q+~=(1yC0@X5{(~(zt>{> z+7X9Wjz$r1&xc!)3Yh(ACSnZpdYf2bM)?~tB(WdR>SG|yKcU@l690%Yy}$zG6!wV_ zMRktO90M2sbBb;dB?5O;mA*up(jej^dD5We8ZaUNX-R|Vpnof9cZ0~t`q7?9ZjhM3 zq~49P;GS^Xm^HX9U=m6HXb=P9zlFI5q*iMwILH1POv7Xvd|X)icYneO$6V<#~yEe*{a2d`cXZmLi_q1%kZ1hc0y zC`PUZQlSaGBS5TD`CHKa7m3R?ydDM%f(bdN?StJIc$3+2qFI9Lc_fx4R1T{XN(?RNHP?J`R&U@5GcW55JkK#ieh-~^8`e3sixOh z>7VBD3?XMs|*Ca%7d=$#W{ zOovz$0W!e8&N&2zkkKl@j8zPwZ9KRQ8go*7r2iF-@*7Y$l+PI z)(GAqn5v*ORGe|=tBokDD_?Jz#nkqFVHMn9jWwrRlgtsgwu;46X@hxEg419$HrA0i zpC;k3>SpTK@}S$}kaZkDB+_l~i$$@$%(nR73-@tw)qPwq`sw{v_i;E82Jhp-%wBZk z2V!&~E>nB)^43%D4riRQ_HM@Y)N|k)U!a?CMioH#85iZYsXXjr27IFnAQI-pO#18t zG0EJ;i;MpR?oeM>U-kH^S6}bpLUx%5lzj-H@AM96w4yvE%>#NQoR4staT-sl^}8TM z^t)4{P_O%tK0Jj>$2`jWNDNBmgDMstREgyv_=?f%uhC~&2Gx8ddZ!s!3e*Ls30YX? z^uba0jf~kxABo#Uo+^@V{21GK#}*4+c~tYUSPpeO(VvKRp6`JI6G9qJ9|JxSWA$pC z9{dD+mk;RWPegXycF0%pO5lKuI7k`?4om;HzEPyNc|b*YIi#oF4o(wwZiHNO15ImW zf!33Ojg2B8s=m-Y8^X0HmY%PZwiP;FEOp}$R|_(t5{n`n7UYKGw!+sKA}5M;Q@UypEMvbtG?XcHfVz#@p^SUk6cfen=&yB~kFO1S|-+z`(;qgBc( z)HRq?za(iLl7dFSLZ^zv=>U6pgz<_x02(iIL41H#k!!KNKos7nSCQxjR5#3j5TOyc zZ-EQGPvv2pAM{O5{JWKD!KR@F|Tzb1Zq#ytKWcAcRbMT zTTD9be*=@g6SuQj<&*yuJs=$I`9W-l@4yctKk{w#0+Ugw5zNSa`Ga~EpY)^nUOO28 z?!JJO^i)tPtzSz{uup>+*A`GuYpCw;}LQgoHUorkK-b-q@Z=N8H1q!F{INp*(KXD zkh@&66B6!p$@2a-Zq?`n2=?khRAHV4-t(}Ir!e2Ey!%4lTIJosw)3uY%K)0g?UCIx zLs+R5B~&MPcyU&O6G&g`ktdtc4<-x@_DW6rWhjk}lpg}gtD@uy^GcvW>^W4UrnHfM zC-*{mw7kA`mpZviUyqi{yeF|XgA)J^;z%~hkdNvoopj#{5lc;};bHWMN4n{SHZq)i zG4j2CT_P8R5(lB5C%2JfFU9@ESUD7t?l^gv$Ij6N**T`3dl|$MWW@L_gTH~iiL#sa zcAzj(raJYy(}9~(&mg#4Qyi5It(y*SgeZDmJx&$gB0*)7VDU1M7^Yp7wyZGLA3?J(tCT4SIC zg!eSPZY6d0$xOX|C5`dPb`YBRwNI9L8__WQP6j*YS^BF_wns!vrtIJK4fn1)acqHY z1yJT#@ZNAo>M2TNy2<;5zjptNjv%sF@+C@f_Y|fNBbiBqI)n2A*Z&GD@ zc@=z*w3pYz_how-3nx5V&V(~NTaMCy4rle9v8gO)b<)jm#vDeq((ZyUervK=(79~% z>1VVvN2b!K963q*EP(GWIVfCR9i!w#0x#p<*6BK#%6hq@LS31@_FA6rd_qiYGZnu@pm4K`^SA z{RikA@}@m~33N~}D#gnO$m}GOQcrM-i*#6mI#el6)AgMsbv%I{^1q8eIEMH?WH&4o z)Or^lBdjo8Im|w(J5KTWvH;rUn2uB+8fbjJ+=zxdpD#ay?b-kg6#F#2`kjFDD%nQY zzM+I}G6SSV&u+3Knr>=0IUml+ZWyN3Z>{exKND=G)(U%IUQ--7d&t;s?<+q9&|yQC zV_5kCTdT!a&|WRRFlyLhExw$vSxdz|q%Y~u2(YcuX7D=eZ_?%|BeisQ50w2b?dc)A zYTpI^w+G6`-r?9EL zk-l;T>XOw@7P5C{Ka8=j=vY5F9`JJd%bVaV?=SOPjHxdkAmgZ^zZ}wHkzECK9UzCc zm}N)MG|>z=A{b;%AUY{&On)o5q|$b`4!4rUI^b?w7pRF@~MaZ zV2HCpNX_mNR_e*Uh1Yu6{=cFyzwCv2_V>$T4f|)Hrbvcq0JCZkYk{fd?hk)z>zdx*@pfjbp&$`~pmP@$ZmA+V`5W2l5B_rUt0@{gMKGZhxg97u(h z7t198aIP2)u#z%|$@M7snPCd5r$qMA{t*~bBG7u+&;(X8p_)H3sy(mB&-l}$Ix=a|#%__Eu}rY%}HcfMm= znBnM5t0!QvG}1E@WQJ~p(}xpezTPFAJQFc^rqF5}c+QObw1KZ}3Vk$3rl0{X%#j(c@d%E0_?PS_bFTCy*T5TzR1d=Cyc^(#JNz3C(8ReA zKz%QuTpVs*n=5CEnrBf^7kXhHTD9UDF`rfuccGat2wh?Ni zq6Kn;UVDU2Es%ufUbv9GuTj(@NwV>Es=|8;)pX zKGclCZKboyr<=3N=FD7pi|MEi#;-=a2kE9Sx^-50(zMcrWz8TQj#?y&VIb6J4d%re z`pp{99AQQD*czFj=M+(34M>ban32Y|a|`{1SgnS9Ya#5tlP0ePy$ySwYh{KzW{~0F z_C!NHwpK>zde-2;p8Mr6UAvXOUnl44al@(dL7C#xuCZJ6VOss5OpG~GV&|)a%ZO|V z9C%R1z=F;OIfSxF-b1k){$zTxAZTp8{ zx~)O~P2fg;9c-|d0wW)iu#S3?CU2DQ#|%>I*O1ckStA$CE}LIIEpYY2@(E3wANb}G zxzZUorhInUnEB;1XO_(`o-^i_veBgr76z7Vl6Oa76pQV$B>BZjh65}~M;H7e@Z*8A z5x?_Pv0YvtnR}Dr$b(moHyjBxG9c5bX1g?KVgP^S4w(>HgA}0A9O+1rOsf$@g*&9* z{Tad;XwUIsVyXDl#CGhuv-@MUqWY`tDb&rgus@*spOxYu^a({^wjOf4{Y2zL_)hL~6 zIJ(1MiX3g>a?)h_XpfAdIZqlhNjnvJ81Zrcka`cJc)?J@d*y^p}lIPIqa zPspLJZ{ckZ?{~EN2|3ZYcDfyV3mes0k035FvM0=_bZ_HLCfTKg1m{OxuLISlrWcuE?P^+?No))#4$?M65n zOxwfNafaPuW9ZGNuzTG~VjpJCIx5NZI@4b?!gUw40&ZM7n#woZudIi`~n`6X`GeC;5V+wWwt9W<2lT6FWOicRhgiJA8HR*@ z+Ec+L?F{XIMi%H>KBB)rBM)Lb-1;mI2S-1l_n(zNv^@%<*%QyRhyP(^?S$XR(vc3V zy#6l&UmcP+##bF%`68A_!{Pr#eZ(O~eIz^lKk}}T|$;#DGjN%D< zd|e6>ZCs7-@WMYo+y$w2D9_rqFC9v7_@7mt?(M&>Omp~OV~?nAEco@GVjTVtl&|)^ zW#hUd;a`=ne&o#Ahf^K?@0G9reN)biN6P-YmdA}S1mshm0aNTfkrmXWa(^U;`6uhhH+Ve8iwG&>R zS%+xRc{wTi)LTGYn}nV01U@op-ZW{h|5}C{r`XRsTlG8m2!zw(uVt6O;ICyrZOC-c zP_yv61HV=HJ&fNj{GP_|Mf~2v?-YKY;rA7OKjY_)!brt06~FfQb&R4T-^dw}V+I0-v<1);I|jQ0DjNl QSBIbf(1%q2t-SO90jwOp4FCWD delta 100017 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 isi.execute(authority, state_transaction), Self::Upgrade(isi) => isi.execute(authority, state_transaction), Self::Log(isi) => isi.execute(authority, state_transaction), + Self::Custom(_) => { + panic!("Custom ISI should be handled in custom executor"); + } } } } diff --git a/data_model/src/isi.rs b/data_model/src/isi.rs index 7ca016b30b2..7ac82f09d3b 100644 --- a/data_model/src/isi.rs +++ b/data_model/src/isi.rs @@ -116,6 +116,8 @@ mod model { Upgrade(Upgrade), #[debug(fmt = "{_0:?}")] Log(Log), + #[debug(fmt = "{_0:?}")] + Custom(Custom), #[debug(fmt = "{_0:?}")] Fail(Fail), @@ -176,6 +178,7 @@ impl_instruction! { Upgrade, ExecuteTrigger, Log, + Custom, Fail, } @@ -997,6 +1000,20 @@ mod transparent { pub msg: String, } } + + isi! { + /// Custom instruction with arbitrary payload. + /// Should be handled in custom executor, where it will be translated to usual ISIs. + /// Can be used to extend instruction set or add expression system. + /// See `executor_custom_isi_simple` and `executor_custom_isi_complex` + /// examples in `client/tests/integration/smartcontracts`. + #[derive(Constructor, Display)] + #[display(fmt = "CUSTOM({payload})")] + pub struct Custom { + /// Custom payload + pub payload: String, + } + } } macro_rules! isi_box { @@ -1518,9 +1535,9 @@ pub mod error { /// The prelude re-exports most commonly used traits, structs and macros from this crate. pub mod prelude { pub use super::{ - AssetTransferBox, Burn, BurnBox, ExecuteTrigger, Fail, Grant, GrantBox, InstructionBox, - Log, Mint, MintBox, NewParameter, Register, RegisterBox, RemoveKeyValue, RemoveKeyValueBox, - Revoke, RevokeBox, SetKeyValue, SetKeyValueBox, SetParameter, Transfer, TransferBox, - Unregister, UnregisterBox, Upgrade, + AssetTransferBox, Burn, BurnBox, Custom, ExecuteTrigger, Fail, Grant, GrantBox, + InstructionBox, Log, Mint, MintBox, NewParameter, Register, RegisterBox, RemoveKeyValue, + RemoveKeyValueBox, Revoke, RevokeBox, SetKeyValue, SetKeyValueBox, SetParameter, Transfer, + TransferBox, Unregister, UnregisterBox, Upgrade, }; } diff --git a/data_model/src/lib.rs b/data_model/src/lib.rs index 301b01ba84e..163888efc5f 100644 --- a/data_model/src/lib.rs +++ b/data_model/src/lib.rs @@ -121,6 +121,7 @@ mod seal { Upgrade, ExecuteTrigger, Log, + Custom, Fail, // Boxed queries diff --git a/data_model/src/transaction.rs b/data_model/src/transaction.rs index 081e0a514f9..9b8bbc83c8c 100644 --- a/data_model/src/transaction.rs +++ b/data_model/src/transaction.rs @@ -583,6 +583,7 @@ pub mod error { NewParameter(_) => "new parameter", Upgrade(_) => "upgrade", Log(_) => "log", + Custom(_) => "custom", }; write!( f, diff --git a/data_model/src/visit.rs b/data_model/src/visit.rs index 754ee8368c6..e0f941c8378 100644 --- a/data_model/src/visit.rs +++ b/data_model/src/visit.rs @@ -43,6 +43,7 @@ pub trait Visit { visit_new_parameter(&NewParameter), visit_set_parameter(&SetParameter), visit_log(&Log), + visit_custom(&Custom), // Visit QueryBox visit_find_account_by_id(&FindAccountById), @@ -257,6 +258,7 @@ pub fn visit_instruction( visitor.visit_unregister(authority, variant_value) } InstructionBox::Upgrade(variant_value) => visitor.visit_upgrade(authority, variant_value), + InstructionBox::Custom(custom) => visitor.visit_custom(authority, custom), } } @@ -429,6 +431,7 @@ leaf_visitors! { visit_execute_trigger(&ExecuteTrigger), visit_fail(&Fail), visit_log(&Log), + visit_custom(&Custom), // Query visitors visit_find_account_by_id(&FindAccountById), diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index 3428213f02e..c052f317238 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -833,6 +833,14 @@ } ] }, + "Custom": { + "Struct": [ + { + "name": "payload", + "type": "String" + } + ] + }, "DataEvent": { "Enum": [ { @@ -1838,8 +1846,13 @@ "type": "Log" }, { - "tag": "Fail", + "tag": "Custom", "discriminant": 14, + "type": "Custom" + }, + { + "tag": "Fail", + "discriminant": 15, "type": "Fail" } ] @@ -1993,8 +2006,12 @@ "discriminant": 13 }, { - "tag": "Fail", + "tag": "Custom", "discriminant": 14 + }, + { + "tag": "Fail", + "discriminant": 15 } ] }, diff --git a/schema/gen/src/lib.rs b/schema/gen/src/lib.rs index ff6b9888da7..5a5fc7b57a4 100644 --- a/schema/gen/src/lib.rs +++ b/schema/gen/src/lib.rs @@ -116,6 +116,7 @@ types!( ConstVec, Container, ClientQueryPayload, + Custom, DataEvent, DataEventFilter, Domain, diff --git a/smart_contract/executor/derive/src/default.rs b/smart_contract/executor/derive/src/default.rs index 14b58d0bd73..6b436fc7019 100644 --- a/smart_contract/executor/derive/src/default.rs +++ b/smart_contract/executor/derive/src/default.rs @@ -159,6 +159,7 @@ pub fn impl_derive_visit(emitter: &mut Emitter, input: &syn::DeriveInput) -> Tok "fn visit_new_parameter(operation: &NewParameter)", "fn visit_upgrade(operation: &Upgrade)", "fn visit_log(operation: &Log)", + "fn visit_custom(operation: &Custom)", "fn visit_fail(operation: &Fail)", ] .into_iter() diff --git a/smart_contract/executor/src/default.rs b/smart_contract/executor/src/default.rs index e2a4e827b9e..3f315cf37cd 100644 --- a/smart_contract/executor/src/default.rs +++ b/smart_contract/executor/src/default.rs @@ -19,6 +19,7 @@ pub use asset_definition::{ visit_set_asset_definition_key_value, visit_transfer_asset_definition, visit_unregister_asset_definition, }; +pub use custom::visit_custom; pub use domain::{ visit_register_domain, visit_remove_domain_key_value, visit_set_domain_key_value, visit_transfer_domain, visit_unregister_domain, @@ -140,6 +141,9 @@ pub fn visit_instruction( InstructionBox::Upgrade(isi) => { executor.visit_upgrade(authority, isi); } + InstructionBox::Custom(isi) => { + executor.visit_custom(authority, isi); + } } } @@ -1721,6 +1725,18 @@ pub mod log { } } +pub mod custom { + use super::*; + + pub fn visit_custom( + executor: &mut V, + _authority: &AccountId, + _isi: &Custom, + ) { + deny!(executor, "Custom ISI should be handled in custom executor") + } +} + pub mod fail { use super::*;