From e9ef12b6b4de638fdf8d296db918330f04202dc6 Mon Sep 17 00:00:00 2001 From: vms Date: Sat, 11 Jul 2020 23:04:55 +0300 Subject: [PATCH] Move to the new sdk (#8) --- .gitignore | 3 + Cargo.lock | 73 ++++++--- Cargo.toml | 3 +- .../src/fce_wit_interfaces.rs | 4 +- .../instructions_generator/fn_instructions.rs | 8 +- .../foreign_mod_instructions.rs | 93 ++++++++++-- .../src/instructions_generator/utils.rs | 10 ++ .../wit-generator/src/interface_generator.rs | 7 +- engine/src/engine.rs | 6 +- engine/src/errors.rs | 6 +- engine/src/module/fce_module.rs | 18 ++- engine/src/module/wit_instance.rs | 7 +- examples/greeting/Cargo.toml | 9 ++ examples/greeting/Config.toml | 6 + examples/greeting/src/main.rs | 40 +++++ .../wasm}/Cargo.toml | 4 +- .../wasm}/src/lib.rs | 2 +- examples/ipfs_node/src/main.rs | 13 +- .../artifacts/wasm_ipfs_rpc_wit.wasi.wasm | Bin 149149 -> 0 bytes .../artifacts/wasm_modules/ipfs_node.wasm | Bin 137636 -> 177816 bytes .../wasm/ipfs_node/.cargo/config.toml | 2 - examples/ipfs_node/wasm/ipfs_node/Cargo.toml | 6 +- examples/ipfs_node/wasm/ipfs_node/src/main.rs | 101 ++++--------- examples/ipfs_node/wasm/ipfs_node/src/mem.rs | 41 ------ .../ipfs_node/wasm/ipfs_node/src/result.rs | 53 ------- examples/ipfs_node/wasm/ipfs_node/wit | 91 ------------ .../wasm/ipfs_rpc/.cargo/config.toml | 2 - examples/ipfs_node/wasm/ipfs_rpc/Cargo.toml | 6 +- examples/ipfs_node/wasm/ipfs_rpc/src/main.rs | 93 +++--------- examples/ipfs_node/wasm/ipfs_rpc/src/mem.rs | 41 ------ .../ipfs_node/wasm/ipfs_rpc/src/result.rs | 53 ------- examples/ipfs_node/wasm/ipfs_rpc/wit | 139 ------------------ examples/simple_greeting/.cargo/config.toml | 2 - 33 files changed, 311 insertions(+), 631 deletions(-) create mode 100644 examples/greeting/Cargo.toml create mode 100644 examples/greeting/Config.toml create mode 100644 examples/greeting/src/main.rs rename examples/{simple_greeting => greeting/wasm}/Cargo.toml (59%) rename examples/{simple_greeting => greeting/wasm}/src/lib.rs (95%) delete mode 100644 examples/ipfs_node/wasm/artifacts/wasm_ipfs_rpc_wit.wasi.wasm delete mode 100644 examples/ipfs_node/wasm/ipfs_node/.cargo/config.toml delete mode 100644 examples/ipfs_node/wasm/ipfs_node/src/mem.rs delete mode 100644 examples/ipfs_node/wasm/ipfs_node/src/result.rs delete mode 100644 examples/ipfs_node/wasm/ipfs_node/wit delete mode 100644 examples/ipfs_node/wasm/ipfs_rpc/.cargo/config.toml delete mode 100644 examples/ipfs_node/wasm/ipfs_rpc/src/mem.rs delete mode 100644 examples/ipfs_node/wasm/ipfs_rpc/src/result.rs delete mode 100644 examples/ipfs_node/wasm/ipfs_rpc/wit delete mode 100644 examples/simple_greeting/.cargo/config.toml diff --git a/.gitignore b/.gitignore index b2e56494..e2f10c56 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ target/ **/*.rs.bk .idea +# MacOS misc file +*.DS_Store + # Wasm files *.wasm *.wat diff --git a/Cargo.lock b/Cargo.lock index faad3094..9f2b098f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,9 +11,9 @@ dependencies = [ [[package]] name = "adler" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc9a9dd069569f212bc4330af9f17c4afb5e8ce185e83dbb14f1349dda18b10" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" [[package]] name = "ansi_term" @@ -91,9 +91,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "blake3" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "423897d97e11b810c9da22458400b28ec866991c711409073662eb34dc44bfff" +checksum = "59f88a20f7dc23e3896bcbd85add056543c87215de721468b90e0c85d5a9f365" dependencies = [ "arrayref", "arrayvec", @@ -101,7 +101,7 @@ dependencies = [ "cfg-if", "constant_time_eq", "crypto-mac", - "digest", + "digest 0.9.0", ] [[package]] @@ -268,11 +268,11 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array", + "generic-array 0.14.2", "subtle", ] @@ -292,7 +292,16 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array", + "generic-array 0.12.3", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.2", ] [[package]] @@ -403,7 +412,7 @@ dependencies = [ [[package]] name = "fluence" version = "0.2.0" -source = "git+https://github.com/fluencelabs/rust-sdk#cc2b8249fc43d9667a4ec82a2e767f27df100c55" +source = "git+https://github.com/fluencelabs/rust-sdk#9775ca6144b67b96aa70ad8020336cd264063316" dependencies = [ "fluence-sdk-macro", "fluence-sdk-main", @@ -428,7 +437,7 @@ dependencies = [ [[package]] name = "fluence-sdk-macro" version = "0.2.0" -source = "git+https://github.com/fluencelabs/rust-sdk#cc2b8249fc43d9667a4ec82a2e767f27df100c55" +source = "git+https://github.com/fluencelabs/rust-sdk#9775ca6144b67b96aa70ad8020336cd264063316" dependencies = [ "fluence-sdk-wit", ] @@ -436,7 +445,7 @@ dependencies = [ [[package]] name = "fluence-sdk-main" version = "0.2.0" -source = "git+https://github.com/fluencelabs/rust-sdk#cc2b8249fc43d9667a4ec82a2e767f27df100c55" +source = "git+https://github.com/fluencelabs/rust-sdk#9775ca6144b67b96aa70ad8020336cd264063316" dependencies = [ "log", ] @@ -444,7 +453,7 @@ dependencies = [ [[package]] name = "fluence-sdk-wit" version = "0.2.0" -source = "git+https://github.com/fluencelabs/rust-sdk#cc2b8249fc43d9667a4ec82a2e767f27df100c55" +source = "git+https://github.com/fluencelabs/rust-sdk#9775ca6144b67b96aa70ad8020336cd264063316" dependencies = [ "proc-macro2", "quote", @@ -479,6 +488,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "generic-array" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac746a5f3bbfdadd6106868134545e684693d54d9d44f6e9588a7d54af0bf980" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.1.14" @@ -521,7 +540,8 @@ checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" name = "greeting" version = "0.1.0" dependencies = [ - "fluence", + "anyhow", + "fluence-faas", ] [[package]] @@ -898,9 +918,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "rustc-demangle" @@ -1014,9 +1034,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "subtle" -version = "1.0.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" +checksum = "502d53007c02d7605a05df1c1a73ee436952781653da5d0bf57ad608f66932c1" [[package]] name = "syn" @@ -1202,13 +1222,28 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasm_greeting" +version = "0.1.0" +dependencies = [ + "fluence", +] + [[package]] name = "wasm_ipfs_node" version = "0.1.0" +dependencies = [ + "fluence", + "log", +] [[package]] name = "wasm_ipfs_rpc" version = "0.1.0" +dependencies = [ + "fluence", + "log", +] [[package]] name = "wasmer-clif-backend" @@ -1292,7 +1327,7 @@ dependencies = [ "bincode", "blake3", "cc", - "digest", + "digest 0.8.1", "errno", "hex", "indexmap", diff --git a/Cargo.toml b/Cargo.toml index 0ec97c1b..0dd0ff29 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,8 @@ members = [ "examples/ipfs_node", "examples/ipfs_node/wasm/ipfs_node", "examples/ipfs_node/wasm/ipfs_rpc", - "examples/simple_greeting", + "examples/greeting", + "examples/greeting/wasm/", "fluence-faas", "tools/cli", ] diff --git a/crates/fce-wit-interfaces/src/fce_wit_interfaces.rs b/crates/fce-wit-interfaces/src/fce_wit_interfaces.rs index 4f47df18..de2fcfbd 100644 --- a/crates/fce-wit-interfaces/src/fce_wit_interfaces.rs +++ b/crates/fce-wit-interfaces/src/fce_wit_interfaces.rs @@ -182,13 +182,13 @@ impl<'a> FCEWITInterfaces<'a> { &self, core_function_type: CoreFunctionType, ) -> Option<&Vec> { - self.adapter_type_to_core.get_vec(&core_function_type) + self.core_type_to_adapter.get_vec(&core_function_type) } pub fn core_types_by_adapter_type( &self, adapter_function_type: AdapterFunctionType, ) -> Option<&Vec> { - self.core_type_to_adapter.get_vec(&adapter_function_type) + self.adapter_type_to_core.get_vec(&adapter_function_type) } } diff --git a/crates/wit-generator/src/instructions_generator/fn_instructions.rs b/crates/wit-generator/src/instructions_generator/fn_instructions.rs index 219bb877..ee85d9c3 100644 --- a/crates/wit-generator/src/instructions_generator/fn_instructions.rs +++ b/crates/wit-generator/src/instructions_generator/fn_instructions.rs @@ -61,14 +61,14 @@ impl WITGenerator for AstFunctionItem { .signature .input_types .iter() - .rev() .enumerate() .map(|(id, input_type)| input_type.generate_instructions_for_input_type(id as _)) .flatten() .collect(); + let export_function_index = (interfaces.exports.len() - 1) as u32; instructions.push(Instruction::CallCore { - function_index: export_idx, + function_index: export_function_index, }); instructions.extend(match &self.signature.output_type { @@ -114,10 +114,10 @@ impl FnInstructionGenerator for ParsedType { ], ParsedType::ByteVector => vec![ Instruction::ArgumentGet { index }, - Instruction::StringSize, + Instruction::ByteArraySize, Instruction::CallCore { function_index: ALLOCATE_FUNC.id }, Instruction::ArgumentGet { index }, - Instruction::StringLowerMemory, + Instruction::ByteArrayLowerMemory, ], _ => unimplemented!(), } diff --git a/crates/wit-generator/src/instructions_generator/foreign_mod_instructions.rs b/crates/wit-generator/src/instructions_generator/foreign_mod_instructions.rs index 5999b077..c532c3a3 100644 --- a/crates/wit-generator/src/instructions_generator/foreign_mod_instructions.rs +++ b/crates/wit-generator/src/instructions_generator/foreign_mod_instructions.rs @@ -24,6 +24,7 @@ use fluence_sdk_wit::AstExternModItem; use fluence_sdk_wit::AstExternFnItem; use fluence_sdk_wit::ParsedType; use wasmer_wit::interpreter::Instruction; +use crate::instructions_generator::utils::wtype_to_itype; impl WITGenerator for AstExternModItem { fn generate_wit<'a>(&'a self, interfaces: &mut Interfaces<'a>) { @@ -52,35 +53,71 @@ fn generate_wit_for_import<'a>( Some(ref output_type) => vec![ptype_to_itype(output_type)], None => vec![], }; - interfaces.types.push(Type::Function { - inputs: inputs.clone(), - outputs: outputs.clone(), - }); - // TODO: replace with Wasm types interfaces.types.push(Type::Function { inputs, outputs }); + let raw_inputs = import + .signature + .input_types + .iter() + .map(to_raw_input_types) + .flatten() + .map(|wt| wtype_to_itype(&wt)) + .collect::>(); + + let raw_outputs = match import.signature.output_type { + Some(ref output_type) => to_raw_output_type(output_type) + .iter() + .map(wtype_to_itype) + .collect(), + None => vec![], + }; + + interfaces.types.push(Type::Function { + inputs: raw_inputs.clone(), + outputs: raw_outputs.clone(), + }); + + interfaces.types.push(Type::Function { + inputs: raw_inputs, + outputs: raw_outputs, + }); + let adapter_idx = (interfaces.types.len() - 2) as u32; - let import_idx = (interfaces.types.len() - 1) as u32; + let import_idx = (interfaces.types.len() - 3) as u32; + let raw_import_idx = (interfaces.types.len() - 1) as u32; + + let link_name = match &import.link_name { + Some(link_name) => link_name, + None => &import.signature.name, + }; interfaces.imports.push(wasmer_wit::ast::Import { namespace: &namespace, - name: &import.signature.name, + name: link_name, function_type: import_idx, }); + interfaces.imports.push(wasmer_wit::ast::Import { + namespace: &namespace, + name: link_name, + function_type: raw_import_idx, + }); + let mut instructions: Vec = import .signature .input_types .iter() - .rev() .enumerate() .map(|(id, input_type)| input_type.generate_instructions_for_input_type(id as _)) .flatten() .collect(); + // TODO: refactor + let import_function_index = + (interfaces.exports.len() + interfaces.imports.len() / 2 - 1) as u32; instructions.push(Instruction::CallCore { - function_index: import_idx, + function_index: import_function_index, }); instructions.extend(match &import.signature.output_type { @@ -95,7 +132,7 @@ fn generate_wit_for_import<'a>( interfaces.adapters.push(adapter); let implementation = wasmer_wit::ast::Implementation { - core_function_type: import_idx, + core_function_type: raw_import_idx, adapter_function_type: adapter_idx, }; interfaces.implementations.push(implementation); @@ -163,3 +200,39 @@ impl ForeignModInstructionGenerator for ParsedType { } } } + +use fluence_sdk_wit::WasmType; + +pub fn to_raw_input_types(ty: &ParsedType) -> Vec { + match ty { + ParsedType::Boolean + | ParsedType::I8 + | ParsedType::I16 + | ParsedType::I32 + | ParsedType::U8 + | ParsedType::U16 + | ParsedType::U32 => vec![WasmType::I32], + ParsedType::I64 | ParsedType::U64 => vec![WasmType::I64], + ParsedType::F32 => vec![WasmType::F32], + ParsedType::F64 => vec![WasmType::F64], + ParsedType::Utf8String | ParsedType::ByteVector | ParsedType::Record(_) => { + vec![WasmType::I32, WasmType::I32] + } + } +} + +pub fn to_raw_output_type(ty: &ParsedType) -> Vec { + match ty { + ParsedType::Boolean + | ParsedType::I8 + | ParsedType::I16 + | ParsedType::I32 + | ParsedType::U8 + | ParsedType::U16 + | ParsedType::U32 => vec![WasmType::I32], + ParsedType::I64 | ParsedType::U64 => vec![WasmType::I64], + ParsedType::F32 => vec![WasmType::F32], + ParsedType::F64 => vec![WasmType::F64], + ParsedType::Utf8String | ParsedType::ByteVector | ParsedType::Record(_) => vec![], + } +} diff --git a/crates/wit-generator/src/instructions_generator/utils.rs b/crates/wit-generator/src/instructions_generator/utils.rs index 1f0545cd..d728cae6 100644 --- a/crates/wit-generator/src/instructions_generator/utils.rs +++ b/crates/wit-generator/src/instructions_generator/utils.rs @@ -16,6 +16,7 @@ use super::IType; use fluence_sdk_wit::ParsedType; +use fluence_sdk_wit::WasmType; pub(crate) fn ptype_to_itype(pty: &ParsedType) -> IType { match pty { @@ -35,3 +36,12 @@ pub(crate) fn ptype_to_itype(pty: &ParsedType) -> IType { ParsedType::Record(_) => unimplemented!(), } } + +pub(crate) fn wtype_to_itype(pty: &WasmType) -> IType { + match pty { + WasmType::I32 => IType::I32, + WasmType::I64 => IType::I64, + WasmType::F32 => IType::F32, + WasmType::F64 => IType::F64, + } +} diff --git a/crates/wit-generator/src/interface_generator.rs b/crates/wit-generator/src/interface_generator.rs index 38f62fbe..34ec66a7 100644 --- a/crates/wit-generator/src/interface_generator.rs +++ b/crates/wit-generator/src/interface_generator.rs @@ -31,7 +31,9 @@ pub fn embed_wit(path: std::path::PathBuf) -> Result<()> { let ast_set = wasm_ast_extractor(&wasm_module)?; let interfaces = generate_interfaces(&ast_set); + let wasm_module = wit_parser::delete_wit_section(wasm_module); let mut wasm_module = wit_parser::embed_wit(wasm_module, &interfaces); + wasm_module.emit_wasm_file(path).map_err(|e| { WITGeneratorError::IOError(format!("resulted Wasm fule can't be emitted: {:?}", e)) }) @@ -68,10 +70,11 @@ fn generate_interfaces(ast_set: &[FCEAst]) -> Interfaces<'_> { } fn generate_default_export_api(interfaces: &mut Interfaces) { + // TODO: the order is matter ALLOCATE_FUNC.update_interfaces(interfaces); DEALLOCATE_FUNC.update_interfaces(interfaces); - SET_RESULT_SIZE_FUNC.update_interfaces(interfaces); - SET_RESULT_PTR_FUNC.update_interfaces(interfaces); GET_RESULT_SIZE_FUNC.update_interfaces(interfaces); GET_RESULT_PTR_FUNC.update_interfaces(interfaces); + SET_RESULT_SIZE_FUNC.update_interfaces(interfaces); + SET_RESULT_PTR_FUNC.update_interfaces(interfaces); } diff --git a/engine/src/engine.rs b/engine/src/engine.rs index b1986e87..e0f5d7a2 100644 --- a/engine/src/engine.rs +++ b/engine/src/engine.rs @@ -51,7 +51,7 @@ impl FCE { match self.modules.get_mut(module_name.as_ref()) { // TODO: refactor errors Some(module) => module.call(func_name.as_ref(), argument), - None => Err(FCEError::NoSuchModule), + None => Err(FCEError::NoSuchModule(module_name.as_ref().to_string())), } } @@ -82,7 +82,7 @@ impl FCE { pub fn unload_module>(&mut self, module_name: S) -> Result<(), FCEError> { match self.modules.remove(module_name.as_ref()) { Some(_) => Ok(()), - None => Err(FCEError::NoSuchModule), + None => Err(FCEError::NoSuchModule(module_name.as_ref().to_string())), } } @@ -103,7 +103,7 @@ impl FCE { ) -> Result>, FCEError> { match self.modules.get(module_name.as_ref()) { Some(module) => Ok(Self::get_module_function_signatures(module)), - None => Err(FCEError::NoSuchModule), + None => Err(FCEError::NoSuchModule(module_name.as_ref().to_string())), } } diff --git a/engine/src/errors.rs b/engine/src/errors.rs index 3538252b..543db1b4 100644 --- a/engine/src/errors.rs +++ b/engine/src/errors.rs @@ -48,7 +48,7 @@ pub enum FCEError { NoSuchFunction(String), /// Returns when there is no module with such name. - NoSuchModule, + NoSuchModule(String), /// WIT section parse error. WITParseError(WITParserError), @@ -73,7 +73,9 @@ impl std::fmt::Display for FCEError { FCEError::NoSuchFunction(msg) => { write!(f, "FCE doesn't have a function with such a name: {}", msg) } - FCEError::NoSuchModule => write!(f, "FCE doesn't have a module with such a name"), + FCEError::NoSuchModule(module_name) => { + write!(f, "FCE doesn't have a module with name {}", module_name) + } FCEError::WITParseError(err) => write!(f, "{}", err), FCEError::IncorrectWIT(err_msg) => write!(f, "{}", err_msg), } diff --git a/engine/src/module/fce_module.rs b/engine/src/module/fce_module.rs index 14c189d7..4a97b03b 100644 --- a/engine/src/module/fce_module.rs +++ b/engine/src/module/fce_module.rs @@ -16,6 +16,7 @@ use super::wit_prelude::*; use super::{IType, IValue, WValue}; +use crate::FCEModuleConfig; use fce_wit_interfaces::FCEWITInterfaces; use wasmer_wit::interpreter::Interpreter; @@ -28,7 +29,6 @@ use std::collections::HashMap; use std::convert::TryInto; use std::mem::MaybeUninit; use std::sync::Arc; -use crate::FCEModuleConfig; type WITInterpreter = Interpreter>; @@ -231,15 +231,20 @@ impl FCEModule { use wasmer_core::vm::Ctx; // returns function that will be called from imports of Wasmer module - fn dyn_func_from_raw_import(inputs: Vec, raw_import: F) -> DynamicFunc<'static> + fn dyn_func_from_raw_import( + inputs: Vec, + outputs: Vec, + raw_import: F, + ) -> DynamicFunc<'static> where F: Fn(&mut Ctx, &[WValue]) -> Vec + 'static, { use wasmer_core::types::FuncSig; use super::type_converters::itype_to_wtype; - let signature = inputs.iter().map(itype_to_wtype).collect::>(); - DynamicFunc::new(Arc::new(FuncSig::new(signature, vec![])), raw_import) + let inputs = inputs.iter().map(itype_to_wtype).collect::>(); + let outputs = outputs.iter().map(itype_to_wtype).collect::>(); + DynamicFunc::new(Arc::new(FuncSig::new(inputs, outputs)), raw_import) } // creates a closure that is represent a WIT module import @@ -302,7 +307,7 @@ impl FCEModule { let wit_type = wit.type_by_idx_r(adapter_function_type)?; match wit_type { - WITAstType::Function { inputs, .. } => { + WITAstType::Function { inputs, outputs } => { let interpreter: WITInterpreter = adapter_instructions.try_into()?; let raw_import = create_raw_import( @@ -311,7 +316,8 @@ impl FCEModule { import_namespace.to_string(), import_name.to_string(), ); - let wit_import = dyn_func_from_raw_import(inputs.clone(), raw_import); + let wit_import = + dyn_func_from_raw_import(inputs.clone(), outputs.clone(), raw_import); Ok((import_namespace.to_string(), (*import_name, wit_import))) } diff --git a/engine/src/module/wit_instance.rs b/engine/src/module/wit_instance.rs index 5f98c140..1a5f3257 100644 --- a/engine/src/module/wit_instance.rs +++ b/engine/src/module/wit_instance.rs @@ -78,17 +78,16 @@ impl WITInstance { start_index: usize, ) -> Result, FCEError> { wit.imports() - .filter(|import| { + .filter(|import| // filter out imports that have implementations - matches!(wit.adapter_by_type(import.function_type), None) - }) + matches!(wit.adapter_types_by_core_type(import.function_type), Some(_))) .enumerate() .map(|(idx, import)| match modules.get(import.namespace) { Some(module) => { let func = WITFunction::from_import(module, import.name)?; Ok((start_index + idx as usize, func)) } - None => Err(FCEError::NoSuchModule), + None => Err(FCEError::NoSuchModule(import.namespace.to_string())), }) .collect::, _>>() } diff --git a/examples/greeting/Cargo.toml b/examples/greeting/Cargo.toml new file mode 100644 index 00000000..e4a6ce8b --- /dev/null +++ b/examples/greeting/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "greeting" +version = "0.1.0" +authors = ["Fluence Labs"] +edition = "2018" + +[dependencies] +fluence-faas = { path = "../../fluence-faas" } +anyhow = "1.0.31" diff --git a/examples/greeting/Config.toml b/examples/greeting/Config.toml new file mode 100644 index 00000000..8f13a036 --- /dev/null +++ b/examples/greeting/Config.toml @@ -0,0 +1,6 @@ +core_modules_dir = "wasm/artifacts/" + +[[core_module]] + name = "greeting.wasm" + mem_pages_count = 1 + logger_enabled = false diff --git a/examples/greeting/src/main.rs b/examples/greeting/src/main.rs new file mode 100644 index 00000000..0fd70fc0 --- /dev/null +++ b/examples/greeting/src/main.rs @@ -0,0 +1,40 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use fluence_faas::FluenceFaaS; +use fluence_faas::IValue; + +use std::path::PathBuf; + +const GREETING_MODULE_CONFIG_PATH: &str = "Config.toml"; + +fn main() -> Result<(), anyhow::Error> { + let mut greeting_node = FluenceFaaS::new(PathBuf::from(GREETING_MODULE_CONFIG_PATH))?; + println!( + "greeting node interface is\n{}", + greeting_node.get_interface() + ); + + let result = greeting_node.call_module( + "greeting.wasm", + "greeting", + &[IValue::String("Fluence".to_string()), IValue::I32(1)], + )?; + + println!("execution result {:?}", result); + + Ok(()) +} diff --git a/examples/simple_greeting/Cargo.toml b/examples/greeting/wasm/Cargo.toml similarity index 59% rename from examples/simple_greeting/Cargo.toml rename to examples/greeting/wasm/Cargo.toml index 92cf1600..e1117164 100644 --- a/examples/simple_greeting/Cargo.toml +++ b/examples/greeting/wasm/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "greeting" +name = "wasm_greeting" version = "0.1.0" authors = ["Fluence Labs"] edition = "2018" @@ -10,4 +10,4 @@ path = "src/lib.rs" crate-type = ["cdylib"] [dependencies] -fluence = { git = "https://github.com/fluencelabs/rust-sdk" } +fluence = { git = "https://github.com/fluencelabs/rust-sdk", features = ["debug"] } diff --git a/examples/simple_greeting/src/lib.rs b/examples/greeting/wasm/src/lib.rs similarity index 95% rename from examples/simple_greeting/src/lib.rs rename to examples/greeting/wasm/src/lib.rs index 571c1b27..736b8065 100644 --- a/examples/simple_greeting/src/lib.rs +++ b/examples/greeting/wasm/src/lib.rs @@ -18,5 +18,5 @@ use fluence::fce; #[fce] pub fn greeting(name: String) -> String { - format!("Hi, {}\n", name) + format!("Hi, {}", name) } diff --git a/examples/ipfs_node/src/main.rs b/examples/ipfs_node/src/main.rs index 0bffa636..6896509c 100644 --- a/examples/ipfs_node/src/main.rs +++ b/examples/ipfs_node/src/main.rs @@ -21,25 +21,24 @@ use std::path::PathBuf; use anyhow::Context; const IPFS_MODULES_CONFIG_PATH: &str = "Config.toml"; -const IPFS_RPC: &str = "wasm/artifacts/wasm_ipfs_rpc_wit.wasi.wasm"; +const IPFS_RPC: &str = "wasm/artifacts/ipfs_rpc.wasm"; fn main() -> Result<(), anyhow::Error> { - let ipfs_rpc = std::fs::read(IPFS_RPC).context(format!("{} wasn't found", IPFS_RPC))?; + let ipfs_rpc = std::fs::read(IPFS_RPC).with_context(|| format!("{} wasn't found", IPFS_RPC))?; let mut ipfs_node = FluenceFaaS::new(PathBuf::from(IPFS_MODULES_CONFIG_PATH))?; - println!("ipfs node interface is\n{}", ipfs_node.get_interface()); let node_address = ipfs_node.call_module("ipfs_node.wasm", "get_address", &[])?; - println!("ipfs node address is:\n{:?}", node_address); let result = ipfs_node.call_code( &ipfs_rpc, - "put", - &[IValue::String("Hello, world".to_string())], + "get", + &[IValue::String( + "QmXdC36pX1B1sdHdbri859vMYctQjAhvTmkWyG9xzhShxb".to_string(), + )], )?; - println!("execution result {:?}", result); Ok(()) diff --git a/examples/ipfs_node/wasm/artifacts/wasm_ipfs_rpc_wit.wasi.wasm b/examples/ipfs_node/wasm/artifacts/wasm_ipfs_rpc_wit.wasi.wasm deleted file mode 100644 index 80abaf8daa46023c948e81cc959cc17279d2d8cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149149 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 diff --git a/examples/ipfs_node/wasm/artifacts/wasm_modules/ipfs_node.wasm b/examples/ipfs_node/wasm/artifacts/wasm_modules/ipfs_node.wasm index 91747eea7ca19b21b2e7fc40cb7399bd28c17550..2f1fe1acaf3029ea5784220515a7b3f6eef2b7ec 100644 GIT binary patch literal 177816 zcmcG%3%p!adH289-h1ZEoH>_C2yh?))|v!3fdm4CB!nPm2S^AZa+QmsNw_oNc9IZK zksKgYv|!_%R;#EesA$omrPkJ{sHj+}qGC&xDpg9UVh9*==2ttV`V1b#80I|Muc;SeI@k$v>pCt$NqL zByt|4>_M`kBC&q9PtM%1uX{9z)uUFH0eOk3rO_RP_Ww=u9tY%4_EOSo7VnY0(E&gOZe;84g@;~4E^bn}%6%g=6e;hz6|77%0 zr+(czYlr45eE@<^sx+y^VqpAf(1R=hCmG_or{l?{{C$e>eYZ`i=CD z-8a+EyW8^jfW7xE4@AcrQ7%S@`ux#(zoS*p8a>WJ%4NdNc#2s>)GKS&;L08 zS$2PZk9#OT_22W)xNqdQr60=|-JX6l|3>yq{)_CP^u76e^7m%n&Tsgq?1%Y3<-f@9 z%|DZWHvew=fLrwk=?PC~&tzYBA8~)@-t7K5Uvt3AAJ6W}Kb(Iu|46?7Thf2d&U?et z`Cp~)$p0~aQ~G@ViF`-?*7Q&EpSaO4<@e?PnLn2wa`Ai9v%ivmH-B6Dz5M(6g*UsO zrTzc-&Nqt0eC06L*g88Ynj2bfPLhu8`aho(&$!itd@qvG^tPXmwbG(V=5Foc>T#Zp zRWn;zk!@+^TUtqxjh`@>kn6^MzOitd^l5XeQhfgBJCgQjnzZtw)(+O0&qvc*tLiJo z{rcFdtQ<^=#HYm#KD%~&k-8di4R!k7pO5+K>b-r%R~Mx>VzImN)1 zqDdwbD=J%x+Bic^HmVoRGu=|;Ucq@J3 z;b+IUR zXeG9@67>@Xov-tyzTy85SQqK$;`9GdVp~PXaNRfn3AwL?YC4u_@vEb0vy}jfYB9sG z60}Ggo&lDnS!)*B=c`)Pnbc%Do|lSGLUkZ%G(7E&gnnA$WuR5_l@*;0B3vbt)n(79 z#Q|SgxwpVoE*}5_7!B2>^AOeYLxw*48u{C7i?H9IM&umce^6K%pyaK!yzes|*PKp{>tMqq5oP|g$kSq>PVfMGywVq(~G!1?OtVt5M>VlPxTZqQcP3{oV;?(Hp5fsMtic4!D8 zSOUNw|6|O(tCZWgG`5IgMN;fV5w~Rn|L(V9=H^i0n|-(Cvn_6`+Dd)(6yTf&7Aw?z zYAwb0JR}1d@bh`O$f;+)1KoYJcNu=9M=NGhB%K+w#(9yfq%+TeY=sh#pB7W!=#mNF z2N1MM3L2R)hgs!-8F3Jn-8!!b+_d4pL(A!h;+ zhOZZPC$qCT`I-nowIqtHiGT+xjTlz&G61=#O+jWddy%;&WM*!Yv}m9%j4~u;VInd| z>=c*`U2_dT4=KoONZ&1Is1A_2$ec!GuF+(Na)Uanw5+2dC?$;&Izd#Md;rG1M2=O7 z6o;2cgD8+d6ia#-nS}@$*7`vHVq&H(~4L8D)Kfqqfk2rkhkI z#hAo@$kfn`1I58mlo!Y(rC1Y~mJw|BU>g)wgR#jcpB}RvI+{N7G!r%Ew|wj3^x3DW zzkFh18?xArWO4eG(%uyVZMJvu*vG#2vC5`JDYfIUpYOap#LL7)4oYbEuts8-Ut_9$ zZFo2%+R$o@L%cF}K2;YiN`LwESa*UCKFyREPaNClNkQD9S3YOXU|0e}wT64E7RmfX z-R9$idEDw+H$f-Y)E<6%2P3gPOm?EiM0IEk(6^P)hBbuK4lI)9&r>jF>xx0JGNf@R zOdl!(lLpo%ZGhw(m|LaIoY;}=04YzkG!=x2|B0lHy`qtHCZ+c{rL>$9RLw)Ot5j8| zAkWG{H_)e+XdO6po62Je_5f3eBVQq^ZClkgWmY@{#-)N&w-ya*9&lfuZcz8EaVsf@ z%zVmmLL$9p9m`Um*)R%bmTn+>?*aBV4XqrkK--L9>SL%3RLcC6q?)%?0MB^Bd^*j; z*&|2|vdJlMVjGt8Ky(EuhPeTvniWghaeYfjF_0EJ0hnok%G~kvm?6JN0q=&z9ZcS7 z!9_9Rg7e5*wf2fZh(Wo~%%r;qV4sF{s=(+padt7enkD^uWTQuf;L3j3Fn#Ny^j_^S z4T?>$D7`PH7Nw6pJ(g*-CVcXYawZ#*Wh-|492r5oQV9?{DJD`RP=WC}fKUvNs}sKP zHj|YC-O}PjVM}6MPJ1|Z`kXqw$2K{zn6ldu8`{MZ$)XZ3<|hNlk>CIvCT=1_e`F5! zV(d^<#yUinh3So|Il;c+t6i$XBEjj}yXqe*7yAb~qBgm2l>IwE%yei`Ag)38BMePm zkvzv{LFy>CXxzJoS1z6P*Sk)3(l5rawBw-|;l1ziSLJ*=t0ZafzTq;3RwBEp^9bak+8PE}IAo)Gj zN(NvGL|F}1Fj-A+ZQ;KJ4S`pwS$k&xn8BLVrX-4%mN=cr^tTPQBk*S+vJEjx@H6(XskjLJlsEBRk=2U#0s-i#w zQ^Ok;Rn8RBBX-F?pkdlH2G*Iu!d%>p*`>!6HdTVh>9d zt=iJc#7y^-V$zk|Gj_;S$=z}$C3h*HEMbr2UNOmC!|@d)ceLisbe{K0?u^O?Fw0k$ zBY6PD?urSGH9=_>l{i78ZJCK$%oCQ)Jo!u$pyUXTa$=e$Gh*}-^ywEtKaYYwA_|ly zRKTlBi&xXf5^;+hxm}_;qh#XJlA;jbLe@mAG$gaGr*tO(s#l@SixGCPMuZ&=txMQ7 z_((XlD#hX+lC#R_bGs;11JN2x#{yC-X77p~M?wQI8j&7L8ZMH#>7!4NEe6Ng6?4VK z7N@+CszKEG#5*Yc0yale@G}a{0Yw2%QuGP!lOmVwT165zom`>_;}YZ|-r6AH=_)K1 zW`Ze*l$MyA3Ug(jD6IigFjos(Mdgc_3peXxZdDY9<*%Ws0%MR=m|Id1!(2n>8Ul+r zw{-~SRwL#z!7k>SJ~^p#b~MaM%w+((#9Ver#9XNOX14hhofBx}9h9BbHX==d4!IGB z=tW*SHRQF4B*1?XdGlhVt38y{(_|%xrG~%s4*s$qrKqwJllaT4;cu!%Nh1DgtSYr@ z{H0~>z$rb-s-ljyW6by>5@I`vW{gCLwrYFv5Zw^{ms!Bn3&iq!Xjb zv~Kkx^q}woqDEp{hlr|Vflr}nCx>S}-L3_rMe?#=YCi))>8~sNRi1fdsfodrk zCl*T;gT_ly6~&Nl!y>=}_*`~50@F*!*zm(*)&@%nhEZRGK4_;g#*TfF9RTa=v9Kvw zmX_pa8cPKn;srZQ0*Sa!Hiq0m!uD8{O|{3g)ohPR z-7R?pf=Cht5riN^EkUg8Q1DZ~>X7ENS8RwZxbpcNH<(ROFsCXTOyn9t)&!;g4o=h3 zXgUjex(l4f@&{5GPS?R{EWKTf?l+9??@BbWs9|)?_eYGTVKWd4F-wf5m?WBBj23!# zFxoyFO5_ov8M^SbgV9WAXN<;vVJdOl<;=E&(V%1$m$aPPJTGcTw(ZS=%ZlvN$UAr` z5juOJ9obNrRTDx(VFYpJND5-4Eo5T2fNpjesbo^M9jtT?+p+Q4J>0)K{1_MspUAO# zvGX>BKHoP7G>~W->L6NuX>u(Ow& zWgY?*L#Lt(Es`xIG0C_vTT{Eug*kqXZ(JVs=OePu;|9XV^Kd{h8V)4yz;+n*qkeyX zK=Y1NgB}fY^_Uk9;_E?+(rwJh&s~&GIL*c2aWFXtFG`;+;W3ZoyhZ7AvZsXkB<8on zA^s45u%B1L3uF7sptJJEb>SA z1^!Tfq+ithLsx8fVKF5ax5E;@BpjuNmXcoD4oCZ=!!m!AU)KC8h=Qo=!ZCtUI_8fV zN)rbblKT!9UPk$sF%w{*=e9g9#j!wZ%pdE=Hiv>Q#iI1q+!y|3&0DgtoQ&nb)QEd* z9|Gd^Fq$!G0J7djwGBw;)Hfs;aB+M{PE34HK649uu_k)a3TnHqF>qk zNG5q}NmxbcRqb$+Kglm|0+!KaSy-*dl5leIkPB=0zNQ^s?q42G@u&Ec{p#kX;sF;< zCI8fRIL)6HPFJ}zNT1OTXZkb4EBxvH70m|?5R^R2z;MmG!<1j+U#%%4W<2Y{T8gi2hjo5kSkLO8Px5>^6YixGX}CboZE3jBulIZS-Tejr zLaqK2E?h*(i`wC0e{r}(4P8q5(ssDaUl!W_65lRYpOPEO)!#5V?I&Hhobs1LM6_N! zAJ2-%l5hoyE85{of2F@XuE2TWDvkV{aJ3i>gQ4oUo=>^3kwE=k+YZ%wdOYyH*!s^-Sx)-=41 z{MWU^>;3D)^(yxU(r;*o8~hDntH0iFE!UKi6V4WO!c9)^wlv&m`)7L^ZqoYQ2nl^k z!@P-?XY`^RTUzC?wsCS)ytz}+cKXeHeM058@$zI=Jd%W4)Zi_y9e&4o{!)IME2nv8 zc%y13r-oY{6Xl;bI!zTqHsQjXRPjwze6#a!cHwuO|6SMow=CS|iXCaVU0-kK>sy?E ziwnQ!Jb!O<&DR$9rD3~1Zs+4$oqwwfZ?hV2SLWNve24RF=XW~)Hs{~znqOkPkd8FG z%OI1E`FEADDIQD1yH)Gm)VjlYw(ajb&tKO(qlCcyY4`(5jHVBy;XNw)2Tc4?rsV=RfTHN8EV0Tc7=%&fo23hI^d9$Ayn79X{qfFCTL&!pBwP zUgtmV{JqrpL^GNx+bb_pum%q)Ge{leo|M`&{@`XIP(B{->Gh z=b7_p`gj`t*gidx29ad{$9&o$aNN(!gSr2dE#YVQq)tAo!Tbp#vHugs@__T7b@ukB zuBe62ss88a^3R;-ucI59qajcAKXv{A*MtR)CIjK~>N2T?KX=9RY4{7(`wQxQ!TB$^ zu)}HmUsUE7$^4S@UvlBgN`9FkZL`JSmW2nM-{Jh9J5OT|y5^Vg zE_}_Je@K}Rk@Hkv-0hHt6DZZzr_#R8~eOHWxAE?3)nCWBA^VfL_KkEGV zT@$`Gnv8@WT4%GuU#s9>)AGIA`aiTTpjKJ<8-4g2T6o;~$6feaTZ$hk^G9U<*!ds3 z@Pv|2Q0IOF;5}LRJ90*8EBwS>?$5$co&Q_s$tUNhu6bE;YZjhVy(ekr@16g97k=i{ z;m?)%b26WD9*X-9&i~B$f9Na@wVsZP^K{SR+?IuZw2roC;ThHcM+S4BK>LhFr5EKq zqQz0pqcVwVgjD>ePQ_oS;y>~A9+m$EFZW_J3jeI^e`Y+-I?rE<|Dv;2Gs6E-<)j(@ zMQg=B|EDB=YWtBi{HwM7Xd0dq>`6W6nx9Fb3IC?@|3()H4k7pg!{LwQ;(u3n|4w)R z;rxHNImvM2qeHH5YdU5jF{n(}wOdp!t~cd4#dM9&!%WpFZhT3-7Tcr#5HpijO3;vO z1@b23s|KCyFUaNTm@;KXcbKwiy<=vg(ttU~cu~}knVrxeO0!c78;R5|!h9OkLWX~V z<-4zA`Hq%$UzV@P@=a+8*D)@r6pTko%e(r;d{mAm*WfX{OT9vs2YK)v&aD zJJhHaB?wresC12P3NTlIE83?;9Yl|Ix2SovX-UeOT<%g~Sq`uQZO+&$BbZ|JP*ujE z5tX{>RLeKEkEkbN|LHS55hQ3bqaMqLteYMK$q2Bc{bnnbK7dO{mJe$dJ&_MH^g%v9 zltjLjU5*HAWo*TYkMknaSP;RZ0TCUH3CQo^x)yNWqIx(iw}X=}tE}$ik+o^21Vrgo z_;44s)hca)o1{?d$)4(s={5?uBMz+`%v8{Nk1rtBF!<5IvB@?~M^v^3Dy_CV_reZn}V>}{|>^&m1G1vBdj6GZ$MbEvIk+a zUW5hVx(G}AyGB?(7{Y?dFF;t3xwD>n>#VV01}5OS?_#ZCXohf*9ye20Athra8#w zi<#!=ZD-TmE-m32jrnk()tl)%?KRCYC>L#Vj$o{E+js3#F`!11>^O4hwlvd;j{rz8 zlDW!}1M4q6W=_-8{4`skF$J;I(Lc8EG}^-P*+AMv^fM@W*HVW!2Y5tlxW)?z*c2U0 z9cx~Cb093DP_c`hx>lcEW1Wq~Kn|?ChHV4B#%T7sNOBY@KsSra88jT+fr{8y5hi;h7`V|uyCPuuh3MtGnGL6bBMf3@#r)ua!`BpR} zt<-%z^cOB@)n&sUSepD8?3fEk5SjXsn{WXk%ntHC*v5Y3^ceQT0$S4#$zmjy*syxo ztD5gf3y;kx_tV;8I{og(tC@(V`x(t22;9jW3`9J9*n@9-pm7PfyQ6TWvZ3rrV$XIM z@gtas_L3Uh+@2N~oA&0z-fgTyGs7$u+=ui&?Xa)k7xU08zh84mr98R59fA*`#iVBY z*@*Qwj)ghC<>xeKhy9uD0kZgvhXW~k;L_xu31qH(7v@oXUK<#dNbq0$v?auj_^l>g^b`xl1CbN z77DBgoe45#1nVN+7qv0%EYt(jj=*}9U+j+ptZEH24^12`EMf%9ib^=fFZ0K2z?$>2 za4e=DGu^BS1tpjJ!Y>~W$N8iEQh(gcaJ)Yri_B8YF(>#HE5b^OV1Dr@j)zt0m|vx> zonw88O|SN=!^!?6j4mhpH7ml)DSV25xj$tbbIYmX(-gy=cAB2sT{xXdorV!iD|b59 zuM~Ov4Bn$1#-HX-Z$58pJqw!*YdsRqDz@JQ5}%D!c@727X=7G7*PrEI;m>ZOyijIF zc%>dqY$~~b6}BZcj-BO~X@Mem9*OhX7*<}5RpmAQRTx|DRSzlO)|Lykb|`g;t-(4< zuWN_(etkF}0A4`y0$YRgwFU_M2?Bpyg9~}TupKV)=j(xiMQd=0zsO%wuE9gHw&Y!F zOYs;s7SbEq;c|a@xI!kWD@kA3#&&X5xLSiHu-p^lwb5@3n*j1=zsYZIV-&eYy`xoJ zjaCtR-@^NrHg=I~^uR8n-e2pl^{>^&x?1H?KCVFhh~;0$yBSKZ*5i7Ay~@AAzuvz= z<=g&>=G*gZta!>{JIVbGZOkWI!-NyQ-YD(pMx^VT9EK5DJ|<+(VB5H`4Q3=$2k@lo z?>G<*+s5z6qOn2Nja$v0af_2N<4v+>tihl`z1w8fz-}=vg9i1tIgA=JCyg3tX4}oQ zu^rw0t*Y@hnKUq6jEA>7EgL2c5V0n!Mvh&hjbTGZy>}`3E|Tw-kpl}x^D)Dx0U0vD zk{YHAZ4ioLk;pMiv}M3}kHcP3+>^>!kz=lC%R=!!hkc^Jc66sQ?}YHsl-?$|kH|LV1xNI@CB-Q%!Os3TEBa{){IT_@Hw+Q?ThX7IUE-(ZkUnEYKSKeG8MLam zKap8Otv+ccjwfwM?^VI(Q_?0`hE(Q{9HT}%VB7dpC-Vn?e_vLo=C^VczzC9K32DpT zfmIb-MS{Vi`9@oBtRDFktB2p=nh&5&FF8ygm_Np`e}Fh&b|PV;GJWLO zJle8%e8pkx0F}R{ystUi@?Uk$&zY0=A!R-kGb7>ny4v}=wR4ZzLUK$Y?eI;9`9mg; zhh6jSD5%(wMrHWOv2L_w(fCUjzO8N^QQjl5#cvyg{$8{C`x2HIFl5DOhwsS9VQ<(V zzAGkJJUCzFT-wVn^Asw0NvUPFweImo&7oNT^40}Ij4)R3$UX5gBQ;xu=$EVpbeWpFpSduT#|F!u=j()!8m;mj{Mrg*DI5J zU2MJL4>jl#M^esOVz9$S>Xy zy*B zR```G!ihAu%Ae?0jmw)tNtN1+Glj=>u=R>xZBkanpKMZA6Ep8sPt$ zHeQtT^uUWE_^#8|HqM9x!+Hz6rkvk?rtam1lcj!Um7!H}h_6zpcj>zeVN6 z>91A!3;iXLS3lz5`xSp(TP~6CIxzM1Bwugb9oGIj{{~~xHvpTh0wU#M=oRtv2?s;p z5N_%)^sO**SUPNY4cr{8fP>#6K0YpXzSZ9VKc6|t&u{3m^A$U@b7Ri8i#Y?-x3KE? zDcW*WRB%;@8?*koxI51T-Y#xT$+xM%+bH>V2Wy9|7u!=gD=M(@w%Gc+96Y^v)`^i< z;12ERlz@#F%nTl0fs420c6hIgJ_i97atWV*)F3+|rcUa86oUi8>h*S~gSD$Dq?Fw6 zS<$9gJw-o2fe%_yy}|N7WJRH}gmn<|I}^r$x^fsa~Ignn|P)Zdg?K+%s;0I`6gdP5Sp*NXnN`8GPjDFOgR zKS2S+0*dMlzW+y76hV?)lO&OxDA?h~_oec4RFD8li9iAXf8Xl-cH_nrKoF?lk0|AU z0NYRC_2R}XBCNlHGo$4EV(oY<#EmQSVHq>l`2ESoG54{$~#f|@L&{en69(k$l6pRyjD~o1m404zl>5isbmka9-Dy~Kp2zNW=0=9b z0iVdAXF+?!s#riDyIrG{L9b&CA%z9HlVaJc6vAeaA*xh}HtH?Pu_z4piu!BDuvm^M z2==~ffo4RrFk5#+l+-Tc(1M(!wh{Os8j|$LVe0E%>s=fT+7_CKtmMiH)SeoPZ?vfeNUQJPU=4zaxb}SPVd19uZ zVrgf_Do{rCvf1P8cnknxz>S%i&M`A*(ag+I0I`{>nVG9C5*84O$4|o}AXGaFGc)B_ z-QIxEs{C`Qbq@`g(j|1+dZtSntOYSG8;R3{uU#v%0bcM|sA!|{)`4_*YlEkZ$JR!Iq^YY1E)@yA%@o~kA2ZNGtgq!|1qaux$&XgrJ2lf zkH3Eh`g-yFJv)---(-n!4S7Om$IX!n>M(bhZs)w|WTS>+6k9Q~RacGvp=zFFsmlm6 z;D}Al&e^muml7`S8#CJ)WkWFtyZp!*vW5cH^^ubaB-omoQtX^W_lqpBolz;UvY&#i zo$yraIZ&X7PY#m_F|x#^c~)W7I<4d{IueGND>AIgqwH3-n!QtDv^k7)vNi20yxA#z z8*AzGzstT~0EK!4QN05q>)Yn9!N$IO${3`2`sO@b<{PUxDFE7XoJ~=q&JSQX5SPRV z%(;_xs}3+n+Gqufk}{K{i-Pd9_S_^{oGFuH{dCtULxH+)%+2Cgiq=)MHBE)N<)ZCt zpapNW(zTQL0gG5Qslg|H+Tvu8&%3vMU5!{-c6Wd5K$mO~?MxGbm3Q-#S?p;ZHQ^q6 z5KwX=rRd|Nalt|Ee%?8T)=!I)2nPn^s<$|pj%Z|gOuL4YCIUdX0AN*gz$j?*)wJIS zrovCFdSo0xH_Yj@VUFz=X`^9nNYJoQUcD{=_4B=cFSfyjcgMNSt9RxDqfYK8C2pq1sw9>%lQ1|^f zeg?v@z}R2xVEc+}^)s*H5CPBeiH*@;e7E!IP(FR~aTNoy!_2)%3uL(na*h(NVnDW; z8PLoEYgCc0oEhpWNGLR+$Ede;9c;E;nTaF-KglK!d=%m_AxRNbEFMzoMpA`n?j2K7 z_jFP_P2M+(r$mF)OlN-3ScHU#!UziktY}MN(Byz~hS}g~6TL4YCHFMUO-EYOg`fl8 zN;bhl;kGApBrcJT{yVKzxl^=GYP2r&az0ToHW;PzfF*WgQ!6n(otuqF*_4dk8Gvxx zvg9KzMimA_d6AbIle)D#W23t*9sGj+w(6_t3&d8J0AFYU6D)MbK+|48hL{c7>1(;@r3Jm zjO`>=(B{H;Sw6wfxR@9(yT(FwQdq90O_8!m^-fzFNvBBKDN@41paQ#6DF~&&!Gjs4 zV72rID_~$lVFV%a!V4h;!xq$=@x`6z(;@hy7Ne(08%e7opj$4~3lJ9s#hUOfOK)CW z-qz(QoXax+a%vwj7lh+ckI-xN7q!heu1B^Ywa^l|pnw4q5spv&lb?WbJ;HRST7aAL ztOEB7YH8E3>{WprolYPpgeyXWN0Hfrfd2(?#>V3qpEc8+m_d+(fN^3}eW?>`YGTb@ zPK-~SR_T12GO?+(rcA82*3^kj+i7B2X$TS%!|!MOxp!i@wuy;!FMT>Anog}V<|*sM zC)Tm^Y07k_)|xV%-da$Jp~O7A)(3~!4hT2mnL#X z@CLdfeCw^cG-3XF>sy*|hDvYnaG4Ky!~0N=Z}=nn;~OCa&-W^uXPlL{Ri810r z_P|-RJ24=8`jJz@UVPb`P>{XH1Hm7IndF0%6GB!Ne-R-dv*HP%Q-Y^#@ZN{<(DE(H za`i|SX2-Ie1`7N8*}>vJP6-E6cGMr}N5}CE&82Kr;=n<%?7{xvFwY-ExW_y{{}duV z9G;;={GsCt_@Hb&v$_mlP}LtskT_5tO&8!3I?Nv~c?JD~jAeL-s`3tDLbc>V+L6QO z$TmlOs(ulX=Vi^sXaP$I{aCVv^F8}TPtiD@q8+8HXd|woBm6OVGF>Q~vRB%9Pp#XwliF`d<0IGHny^N1LcabiTCD1$^c5+rh*Kh=gNAe_cjPFE1f zmT(56JQL^9nd9LV#e`f#ukdGW#5HuhKU=KRrXnX11sH$5vlSjSe_&V zo5pzz={(Nql!JXW)8J%H^afS^T23vLU)C{=^?sdS-^LYG)$y9U$}bmy2^Z>2jiNoO z{vx8C?aP92aWS2ckBj{!Tf(J9AE#H!CD$G=2W|G5kpCy7?I$bfM&J)FZfLn+vxqc{>%~Ql5Ch(PcDh z%0ZWf@*7q09QB-Ysp2|XlyapCekC1Vtm1&O<2)e7b#f_HaVl{m!8G_^6 zGFX#4lye6;54)ltcM}m2f1s>x&IC=2$mU|?8dU48CnNq=OkCX{7b zpT4>S4SlA%-Ql!xSJEw~{3Xn>*{okh+tV-R3^BgsMZ4c+rvQL1QQONd>#@tax-2ie z=_~GJ%6-KkQ#P3O4Gkro3w8B$NJMq0?09jfG^~L=lr&%#TTdF?odoI~-%c6a9Xgqg zq2zH1qVgIB#huIUD9e^rzkqFj2DSc&D!%{(Tv#(%XNFp2839V`r9m$%WqgBPotkf0 zjS&TquaX7jB>>T^B0Vejl7P6~fGA^S3B-zk7-9D;x0eYX3$T|B%$Nec-AWj22PC_h zfz3(^B+~&2cSous=s3L>DAOgQzC@6S1asZaOM#vWA|Rs3=k zAM67gd~KO5dLB*27yAQ!@Bq>Yn;7E$*LE(o)@$z2DN}!6_vz z)h*fmX2@hP&=!UcI40l!+tUF};?Zu08g@7JzuCoeQ@WT;C1xURJl3BMY;`jEd;B6q zjJZhC&DU167}YGP_t>7NRg-cjDfT0tBLev#?3@xp-$+6q&ssVLz3;;~*e9Cbuc<&T z`sP9Kx#abvvI&$52rK1LB0`^b8CFqOAhQlo5yH|Ru<~*J$GEw{xd8xsRipT^`5bit zOm*`{GjYb&JFTIM1Vvk`wM4BA+AwHs$c&n?8spKSYuTFA)Ie`js4j6}*e&D02!oZf zK2)}d1#5t2s5gBx7g9Z&jBoUfjjaLRAH)r9Cme0KK~_;_f!J9>p@hXiaV=)=Vqcv+ z8Ymv8l7#Z&IrJu*O=D=kic8Ze6u(3L?b`JW^XtD*8v9=H3q8$NHPAe^1g^%yW>@PI z6E&T08z{E_a%G!;u+gWaKJ&v(?cy_kb8t-ki=ULA-hU5?_m9LcKl%xYq4>@v zkI8uPzGwSo(;Fy0_~~ofMJs;#=39C1U&G|F9S;=ueRoGv%q?zul*b3z)8FU$nY4K_ zwlAqi1H}&?BjFo|g4N?Y_i5s9orU*#T8&$HWaQ2@Yu!3CfT%HIZ?fjj(3_61$tKbK zAH*m&Mt_hxo3rWxPw5K~qcN1Hu9C&Mm zbQYArDgI46l07r^v+sQVFMVd5Lw@*fkdN?*S>s!{tPx3M!A7h|KS=P36#c8XC>ofU ze_?p}*6XdW;hSkyOL6thG^Zt;+DTKnEL}G@u2=Ej>JuDIuptcbYRA9X3#{>kV}Z0Y z^sbw53rvuD2XSWxISu5wQ0>W9Z3sJr4N~1H!$Rm5oVXsMPpmehlhM1r!S~7KflY($ zOx8}Afa|me6WD(&OV3K)PCA?ORA@ z?(5Jw8mAnC)I-N)SsYkAoDLT(H)6}n&3t7_Hmg2KoebtwCo;Yz$ZigL6R*_=0W7u# zdROF1T^>EImld$4G>SxQ&9b#E=p_yS*+#V-V~@>u8zzdS+pxk{V#7>NQ|}qQcK(!( zCPyDz)WjJR{c6(qJImYW1QdDQ@r~6dCr(*siclO6$c;o6z#o&tEVM>VSwIb|E5Nky z11MO)B50_O=qmv8*br>5^Cd>pPu)_VP5LR zmOBmrU_yJ@Nfwg9%!05p@v*Xrr*{6>)u1*FBD@?xWO zbPoN^iPm9xB6R34V}UU7FG}aIXtn`n;DIXAR7q6^fm`w5&vqbt zP-U3f7~kK6Fg%}s`IKQ5=-@-~M6j|<1E-U*~nuq&B3EO0!xFCDE;HS!Z> z=3Ny|QmxgbSGPGSaB^4!9Jz9dg}h~q^8mSD!>vJbb)CemL3#q$CwMX!UB#69Q*k-i z%5y^o#{+dNaJ!|Sh{ps^he!(YXJAWXLHwC*4h_75(*$Rfke`83*v|c(O{sH=8V3V& ze{LH~@GG$)pHr3^z$9$vzRsi6t0{3h_bSDu%drIWDG6(fdt6w@x9-uuELPf79Xfni`B;-5(epJNaB-XqJOv}{#r^`VE_di$!k0_h z;ZlETxJ(@qlH%KK487FXOTrV1B!8}MFDq@kXTkzbcY zpD@CDSE8p7)#_+>@QS)TvVAc}f)sWPii-LvzQyjsmh`CT;2AuytZ>o^#)Dumb5Y8T zk!E5kwj=ae4!or#lE^`;#oWYTWOai86K`S6Et*h$D(>u}FvNEo;Mj@ArVuFN9KEM7 zOhWpJ1TJ9LZxbUCCsx*bxs)dh!;qXu>0AQF3N+U`(xvV^M3{~|2`3(7A7$(d+VHr- z_+tfHW~rZ>^{7%jO0s-ko-IxnQv3mCxhP%08}<$zAF@h|0JC04Pw05sNTia*kw_(*IucMsGC3H+ zI)F-`QMq)&mRA2fOcnqXlZBxNONCL^q%-iM9c8P2Y!z_c{?d4Xg2nv-9 zxmhsmoDJNb&&Y2k_m!1FB`1qTe~-l?-H2!}iv?IEq+svQ5eUjLQK6%u_36Eg^L6WH6|QWKZ)k?EL0$m4ba*WM+T0iw7NwpC zkqig$AdKO_nBwwYrKb7XeEdOmSWiEQ)W2Htyl+Gqwu4SPKk;K!z zeAZ=wd#sjVMWx;O+~9BgJi?&uuFcgr(f7t4KQhGcBi8zJ3P{?PPhA9L76fdjpQURz zo!^JG1yAe@<~Y9fnun4AI=>&W8M+$OYI^=qGf>m}FcY!M=?+fSob7|3Js##z#mAa+ zRI}6P{(gVeJb;>9#V`}u%Sn_{%~5|q^vKuz{;}p<)nv zstKjFnhWu%Q}ak_;<=xR%;w~|SIxy7-&{P7n#&OG?EGg_vPzI}`4w3=M-pqj^06CeM~FhShL`|&SD%>&O`)s{)AYQGoyaRIFevZApxqnlA0h2YA8Zs&7Y{P4pt3>RZQ+A zzsjF9j&xY_tCuE+l5;XSCy$3U!ga5^w;jTwRYSAzFQ=C%iJvl=c?y};3w0KF3Gb z`SW9;uc%NwI=V1i6bsp%oBl%2jSyDoky?6_+nPn4YvKhu*Q`)MwCP^7($%?ULHqyT zb*}$HUYei$mk0z`uJq_!zvRPc`b*c*x#kqJrs`aCep{Vu_7t6Kw&`56f0NF2-_2tk zo$F)`=;To9T+a~qgwE9ryVSX6M4hXN&NUk50=LfbY|v_6!Ak6`bB$37LUH_5oojR_ zoom*l&h(RM5ay~`pdO{jk?vHA-OP6YcO7=$XJsQb3%F=dHTe_E%3dY71)jZZ8 ze@b%o7jDjNGwDw?Tg zrfP9Ri=|P`xQ0aswV%_1oP|PhHtDn5c0T(|e^yt?Lif_K?pIPu*RZ_8zpATbaRZB# ztXJ!RC<>RigV<}?N@-ZHdpOP~@BDV$J-l*r%R_Xo8*@#mdUdH(p=_a4ts^FAJ)3I1 zl&U**N;{uCrA-HylD@PZChxahp=hHGHi~fLqB#=a_JwHNMfIV(A0);wC}mCItMObyiyh@9{ovIYjy4G!CvgpW)F3 z*V5*n$@hWr4EY4}T$4LWN!lR^c^e2!GMB@&odu7QNK(s}KfL$QS0rn3%F=?aA>MqO zgN4&{6Qtjh`605bm?s}#8NgvisgSZ2b&k{X()?7e-^Qp&_9@j8ayPdS9T5(l#Z@FH z4wmw@6dHtCsX3UgtuB5c#2vI0iLJU`k$TO0tWm_4J}E<7;Et9!ED2S5P>jaFV$9f) zjm>(<1Nb1gC5RK6sRpy5&=2q-!)A&>pijNEXloS;l8w^nvd|>O) zQ!$2CH6X#k@!WKVEiZ)qG7%Hiuq)-TIh9a}!$xUvMRI8J)K|w8EUQ>>{m|UgUmYWA zOa@67uF1gwUoPB8yE#pZ;PsQ2d1ebTPpW~@MG5pn;!6&&LoE3{3}{&{#^fjQEduV*0>!(G99&xdmaon z8OFkm)UM7^$QsPREZ&Sk#oyrAJ;K zNQ~?tBt>u{mpBgu<7QTA9m*?zT~nq50hS$!IT)+Fa7&r>*t5^1@b*vo=aE%b(c@2=q2^SgkDk^_AH9Y_ zYv!Zp&>Pi+p#7zfUQNkI-)(BB(-b;a9GLm&v#yVxU8!cMH|eAA-^kc{eDpS4c@Z@W zdaLU6g?`}&%&u+lkPD*I(F!4d(Lt}NMvXbK3CX0QUC$Z;RoxJr%6AOu>M`U1Y6uvs zmf@2F26z%?>L^ILw!2;|Tgju|#G4Lf0PgXSMpfv&q1aAWjmBPk!1TUc!6oHj+*C(o2+o{1l4 z(TmE2Br_ZooHDJKnqdO{F|MWCbk=yfFRkJ?i4zhu`Nq7UY5XIn3k|2mYoQ=K`d0G; z%S@%B)+r4AZ?i%;Y-40&pKT`dTTgfcb#+QqW3ABdY})rGV2NBScI|7Ovp>)c5Ywml zVV46n4!r3ha-tvc0_WtDtEt}*xkS~%2dk6egVkMx57rQy%J9K%|8_>P)(P|@CbQ=Y z9y%Gc?u2i;ZnoiDUvF$7K=}0y?AW=1*zy;26YmRKj`4@=u$~XQ?x0^#fntd+0jyIj zI${b8&_is>6=? z#5P~wwpc_Z^5zfrr58pYX)fKx#FO&KOd(q+qC*TXN2a{qiy3gzWodFVK-8DJ^u#Z4 z4^O*p(io}zN~DZDG6`b&)d2(%ysfa&s(zp6PRKvy@03?HmC+B2-=H5_L(t6DXz1G% zrqTa&&rj!!huw^_>;@HD5N6QAjPl+zzX$TLey*YT`Wul_VBD?05W- zj-MF~7>>J9b%`21FTi}Kt5Np}c758K5a_MtgKv$8*(K!@#jtl8$d+xO|_qqVd_hXlbg6u+04yue`QsXfT?9MZ)70m?{=IS(#%;?C#Nebj&P06l1bp#7p)xW%r z27d}St38}x|El`a+EU@s-mCtM7{QMzY_s~k8ZRl2&1mdv{7Kl`Fo89%kVbhHg*(@( zshe|2pKE?nboF!4)W56~9OH`U<2S$3m1Ym z9Jnce6D2{(Pju=A{?0bMn5q}I!zKO_iOuinOY1Q{^$|RPXu-ffPg$hmjt}i1(fmVH z25*{i!iMAV*G*tksamz0QjMMt*f za>?f|9+uEuEVzY?3^S^_-GIafXE+>?XMq@*7=yWJ@=|P<+1k8Q)UXC+x@>>f6Hfk3M$Sno?Q8d2c7Gyjfx+*Plu&9<N3Gygu%*xpf)M= zF=CgTUC^=Xk_wTOWd!>GhH#>UjR_GoY)d(?IMb+^J<}E{FR?Too&uEBEBNCCWuKh-)gelEzU@RN6O!(e0p4fourQ!4jLBX$c7h4)=vvv z31!(S$4S%Ffm0X~=tvv>Zkm)^-PEcDWgIqR0CxI3!RiaIve6_de)jaIeyS@$q`EL# z{lv2ULbEoSYyO48Tnhvo2vcQ6E5j?sv-ruk_NWWR{D8Lm&4CbKmzTk(JBoT`%b zY7YB|>wJ>tcd$~yd|FtsO6?{`d#8dKO!}5T`N=Qc^6vM1_||Es$%jj%=42&)l0cPa zpao7-B`7l2HQu+wY)0 ztz^nP3T#{aY(1^FGHp2)18kQjM;A7>qV5x5yv&nZJiyQ_xrC%EX0sDdwm12M#grX* zE#H9Nmhi@SP~&vl13kIs?~o6qO8X|SwfF<827@!H#n?}!I9SNPAb;_UfH7a~!B+Lp znKUBYV}#ORA>(@I2i3`#mO>JhFzW)GP^p@s3_7e~Z`t%?H2t78E#f68!zpx`OhVhB znap0USlDj7iMyD>1U&br z)${_}#Gv&fQmR4OGEz|7%?=`ii542=nm6XG23_fSz z*dqWlmKe@|zI6;?*EK(sA@AloCVsETk+#E~4)HfHPm6O#90|LCpZi3&+N_rwWu>U8%oxA5U0(g(EzN6YbX&n+D*a}cE& zybtq>N;rh@#6u|+MQMMaKcsn&g6RlPJWP*~aCostI09*OA*B|!acmvwNBt4a4_K)g za&1WrT`c)<2}PE)%Xq>(91Xc!rkKEE$Unv$S;)u)HA?y6rwye1@XG~uvNo4ze4FOG z*d#t;6iwnwkekQ2pZRTLNX|?B0A8|V{W4$h^OHZ-mO+BYy+#kNCuUC|IG?Udh!e=5xx3^! zrlGE@>nx%Pf2_qpMC~}ba1o!|{MQV(F(q+v_58>{^Me_(@2mXUW~z_t__(f($Sa@m z`3$R45wNPeiXfsx$pALB8y zBy)FHmHH3?6R^{bic(}5sj6P0FDu=t{TC*Mjo)o%%JcDoqv-Ts(uPC zv6RCZ^db@+1Y-`X$Zi3>z<2?GCAn+;&_a!Ec@skCh#%XrAxu#Qkm9ayLWY0km@J(a z_rFNW`srEc_$%N9-PtTS=}s7H%_fwVa*OwApmGTyPO@9d`Yv@ zB^L;B*u6O&nHW3_5J1o1Dp(8P2A>iph%lgpe#TnmSs!zo_*&zQRRTZ_o$LbOgH7-^ zm||qY;lRDsGJFwPVZVVb+mR4l3sWuTV_~+sx;xSMQ7MDT>>c^EHb!uO1b5l|q-!md zb=|2g#n*ML>#R}6jYkBFX_U@drYD%6^fmJaaK*tdQb0(ySQ5N)in~T^kFMo6VuUSN zCi3Y^sj1^bRIGAmmCZx$y&4AqLb)3Xx}1;gy`SOkWP7JDQ<3f601TXcU5Y@QAah5n z#DAzjQyVw`!1-Uq@?K^13(NpVe@0K}S~n#6Df3`8%Q5zMd|RC{67Mo)jM(e9P*`Sr zy-6gZHg1i{F&a7QjIxC8uN@_g(WK4BR$DyP^C z!CO1{nwfqCX^7L5hc7x2fRz1E5`9HKkCs2#Wyc9*Wv7mlY>Z`%9cy9n{n)@K`!-F| zyT(^4Zna_-cd}I?P(mMXMgJ8syG>7IYcu2!zKC#=AnkDPMtQ@Jmw>0VnKKplIR{`6 z5Ur?Zolo@0YE@kTIOqov&bZ1a8p}}qF_sBh!(?(H9X277voKm#_1h13y7==?T=Jvc zhy7B~i5M++^D|a(%wsF^8qtWGkk=gY8dvy?hrJA|_X1)X)PH7SZ!P|_3O=m*nQbJr zSz#ZF?+Zfg$N%1Yeg^yPVhD#qi%rrh*sYN%`&*i_jzbKplS)i@hp_my$#(NfUP>&GDnHf{=8XaaYdA$!q3 zb3o)z;(;<3^+Q>aR29#s6_z$vjuZQWcxN`&ME18vite7J!NYxMtrg@dUfaJ*z=cj(g{SAW62~~Q=?~;3xrlT z8F~%{u0VeANUwnc%QX}a+;Pz9bU!%LqWR8Hlu*v?pW#dze+7-7MdL&M%)24T9Kkcw zk@iuOrtPM+4G>}d_Rdfw!fPPHE)wB!97bHY<@cN!wV=frI_cbORB?ZIM`c>J!C^&+ zqeOGZ+KMof%CkJ7;NxK*!}fh(P2}xM=lgP*Uu4_+ks=rzPa&(*7d!<5R9pA1S*4bV zFQ!a$6`<<4Fo${UAAzKe1s59-($@k<@id_WnUHy(HbAZCqAu?r4)#QOuL<+0Z8xzg zynBB?#~(5i%6ur~cn&mpfj?{oa=V(yXnDIDh&CDY2?>4qaN};_ zVJc;nx1@$XD;QdI)cEi@{FMoz- zNszA8;0K^^R1VUZZd;6Z`+;Y9#4|J2ND)63Pv)sn5#Np1^7kEi@KaA($UXcF{jg&K z=y6z%rcd577Dh;5w&6#_N$gGQ7-%LC(qtyu#?yY!dnRcJ2|^C(ZNkIM&oawH1^J)} z4rZP^$M^I5fuQ@yHiFT128hR_8G_Jk6bT{ot#;t2AHg^s_vDa)9rpym@`zw?oXJ7FnstVse{5rvnWve|_navZ*_fl!r~Aa89!np>>mhBB5L~n$fmG?k;QAO& z5{;t@M%KW{%pVa2f>{Uze`o_9Kp%rt2s7{HBFtopxsC_y{d!Inj9`a3#xGSI?L$Zie0W(K>^(M&squnz(FS>!BP5LZ z<2anS1pLkX@onKRj!i0IT`WDD;`o~A8O-jCIMI`MJ*f@T=PZC75!FQ3!1vb(EGwE% zGgol&<+Kr%OcW&}XC&~Lm_FfDWxf+3U zV;ori-ie8c9h`g9`2}(M&S(07^%vYbN`5hM*A6JVZa~1HL}xxfG#NZP(d{=4j=U9v zZM<;v;~mKfwv;F|zRZJyh7?kOV@p4WK{;*ovvt&|A}w_oQ`#b6#NFhX=JJSz34!+n|FX>4MvKp43$wA z3iKJ)0YYfl+?2C-x@Fs7{7qyB1BBuiyDuykx6Fw7ncW2PLk7-T7B!ltq-peTX!XVL zRG*jmcUB&1^% zCHa_R$*!_tJK%$nEeQ<9HbZgH{6}eLg>5MLp|07p9cJjnX=ghCKN+Q_YzG<9dbWcC za(cD{1AgIl0N;si?AZQ>=(> z2fWF)9prlJ-46Xgv5)`dnm5xCF^4cMZ3hh>xYht_Kk#Hb*mW;419WH65#bJX(~ovY zDf}u$^QT;W{wwYruasM$M06QgH4t!9L&7}wYw$hdfCrt0!Caug*#Y5vpW(dWw9K(6 z)tp(@eJh$4v_Y2=c5&YBB@}LG_x~C!>_u8;gNboY(s+Nx9VJ_UV$xvZKw|?0px?N? z?#}7(YgrMby!Xq;i}DWl<|-bYVkD+i>L120sec4VN&V|XknGo84rlwp=D%eq_WjbX z&+|?Ad_@|)pS~jO2AMFWemv|x1s8V*9{ux^17Y)f45g_;Kdt=*v6+Pmx74pa@>qzB z+3)w16On_5I1f>KSmM1%?Iph>yhCzlfA<$4{VWa00mu(Asrx=dd|W&x24Dk{gM$b_4AugI^@$s znxA%(PMbI92&nzC7aXr@$0Hvcc0xEj0@EK}M(5arb!YyN{<FJUX^W z`?3ybZI)3=jyfwaiqJuq^N=PI84ScBFc{d6Y934BXnqi%|JzEM<5UE&kSnRZBgKK} zS5xkiL#9E&?EDwiQH%9pqhdE^H}>9*R#8Epzr?%I?A|G&9(3tc3049tVkiL3Bv_H{ zhBUp{4Qa`g8`8M1tmlTbr0BUJEh&0#NK1;z8`6?u$_;5;eb&7pEh*v+X^<>|8dvfJcDC+{G`*uN1fs5{6qyMrvz zQcHZO_S`{MH6NMoAgijCsU2_!Sykk|n@fM(KPFcMbOqm)y>>Ct%)zqk;tlUsvG#Sr z825bxGVJ5vtxxpe!ng8*F$ryrzsNZnRgHQ-6u4LKXWvQR@0|4H6+(MXe4JMd!1o;? z#}I8iNl>6-4ul)qcN;w`S9s`!#R7CKd||S`ny>s)4zCW8V_KK#`IkeiT=P*^K-nn6 zmG_(sm#&X0_dkReGW7-iJ_$}eOL*#Tp26c@9;{=YKc^GEL$U5iV*1YyLl%+m z2)vmUZAGTJ`|2mq`?&3AamEVF%@p2x%-tvhW{I39EJYwd^ufLI2`F^#U$!{o%AvX0 z0uAqO@C^5!M%4$d^@C)Xm{y?ED*}T67}o{<>6otYr_}EBusc78lvmOP{=jD_JK+A=%SI5?(S_ZGAm4w z3tYJ@G7h7tdz4zMd`rhAny(>oKbT=!pkxe+YM~7baOg7z8t#m2hU10HMy4&gG zEaHJJG{Nd4agA8yT=LqDX}Mk4_;2wcMZ$6lKTUPE>oQl)321hdr)oLTRl29~9^=i< zvebv#B_0XOE`IJ>fbf*MAfxI11uSeNET{9{gs1EyJbNKLk+3|5icNS<)Q9_6-AGux z(2B!3QQlBrTc0Zj>#O zE1^=(0wF0fS19|1)$Jld2{q5NH&ecso|#8v=bNpNOi9t2$!r2;IwD614ur(Kkf_3} z%J$A=P&G3~)KlOdhi8MoR5(ugt?aX+-!mDu4{1q0L623nn?$WTHWbr^eqZ&udG8*r zk{Bln#gW3obNS>;G${VTi)W~Z?3OehS`~F1uV#@NXsh^mUfhjYLR};euiq(uCeB^- zMAK9{BGa-92EQ_@t4X7DIW{dhEl7Wo#AHJLPf9~kCpZbT2|fs`x=YN@q89o*RqEw ze0~8a#7~(~Y7li)wsyi3Mk|s*^h`OEtr;_vR)WWTcd}7Xl6pa z)lWLfO2Z=QlNN^2Rj+)#hRaAQq$0+z>_b9y=1Ln6^6Cdz49dshF?pp1N1cEsb!PJe zV}xS?w_6nqMQ{4YsGAw^sty)a0eA_MYr|Qv@w{8R=GF1V2j{yqp+@*wD%mc5p!acY zWbtwj>v3HF);JC=Lfy+==a`s!0b0l2IR*zr0bc}8EXByTw))d2Xr)A|M1>@vDA+xO z{OV1vw@e6@P>)QrRo#2nA||0YX%3P@??6K_#GUs7EX3^GXQ4z^w3~qOi|cWxpfy%i zK!|}&5`I>k-@pp%f$dgU!mp`rE1#!0D-E#%7}&0E3P*?hY<6Z;QE9xL4jIYy3;U84 z*wJd_-*XTKk0fhhaAJcU<~CVxxv(YTOBoir2m&Y_%I1q{N*6^U=V0_gwLvzySO@V< zWov(NzHVC*B{UJTwXEyl zQ3tW=QYr%pTh&AN@Pw?)dO#Cdlcu>!!=481(l1->_qMXf*U`||4@N^%QktC?IZEe{ zg{{~gZKx$0hTB)NaS(k)ZcJ-=imVwc_VX%Xi?1%zU8Fo|dXgy(N_@5p$!qF@UV_!& zeG}$wMLO?`kKPzW@j5)3Pv;QAT!WERd-i1|K?Hx>1M^tnTIISB z;ERQi0AC%MBdr5t+>1SuX9UGiVpsKz1Q~9;>o97IaOK8wbMd>(q>O6lhtd^KswR=d z(IpAB;lv!CwYsG)2~s%%-wf{>_gmgQ83FGU34W*Y{8S5VNNl*0Wie|h)7aCvbmief z-;{@I7QyD^az}ZJ!crC!gt|Ix8b2@%3}gi&?ZV)>Zz zi9xA5i=R%qdZsStl;;R`ABQB4l`O$c_iGv!5(OE7@MNwpZo{eqlsuj~gI7*;=zXp9 zQ8Lbs!T10Kr4x`&hH+L9fQw(cJ_oe&6OvvC-$XD*(f21xPPW^|1=?{w7bwYvTrl}v zQclSLx|%z}v7U@ezk^M~dExdh+b-G=8n%sUv(`31WI9@8UFlq?W|vTH4#}O1lJHIl zPD(ELXlH}vWCM4YX-hyc)GF_W$`?Qjmua9xD8*LO;@&!_zd&u9=r`TI1k)|hcM?xo z*F9WVT}V(4{Yv1dh6Y+vn$#%4le+siJR`u1R7ouw?&&5x3+7yBxy z<78hYWI*=SQ+bE9Ft5+%r4U@u-Jt=LJEC>f&rhS&X)jpOCS=-G?@$XhbNrv3a!4U)hFoUR41uO# zKb2cpfbv+12e=drJ-?Nm9kwQC)xkkB1grramt+6#*_nzD31yRwvIb~RfXR;zhO%wo zr-U3pSuezo_NKURV*GS2KwA8e@WY`bwX(-|PTJhB?EML>Y7Uz2CF0%4fAE&F=CMh{6M@GlSCnnodt5$c4wJhNCU+=mKxapd9_4WVH zcWbyKo7n^5ZY_7nTOSQ~D!IB{-QIi0md9Jd-74NqwW~Myj>Dj<7l-HTdCuMQ!(E#@ zJj@Tj&TZ)(0oI@D-QkV9E8K119oE^~!X2U$mf-3S!rcUS=w)vRcaz*<`+ae^Q=QQ2 z=lZT)trpMEswYIz8>%h=4v|O#TqZRGEm3mpF7ARn&Tcn;E644)e<`1=_M2shk?i-x zyo{iomB@<=FpU|c1W6g}9Y~7js1$8M%@KUiS1TZqU((goz|G9KKr^cVO?4x*bB=$t zXs2vibPAxlMJYBY+Ze|5iv<4qC0Seh5dqX*XXp_xB#;4lI=TWuC<7NI^Ca!B>z_|i0e2*GhCpKI z$)hR4<|_>TIww?#C_yyR|CFm1U}UR{MHF)(6`V|TlN}!NHa>w1v25q4cqzZ5PYlJj zjlr^bnu?Z~p191y)kY-ooX-VWW?sZ)J-=%!RJoz}N=|$cRBRKEgN<8shy?S$q^G2B zF1Ic~kaSe&NyW?9Mj&pnO_%e#CByGB^9o&q+QM|o?bx}YXeaa2cEnjMg%GN8rl`~- z<%;K`T=8^e2c_!3Vt&Fzo~nwU3Xv%wG9!_Fl!|QIRs4d!oQBSDDc~U^A{oEP1(I=j zxu2;(!z<6O{7!o%L*GG9F!hy{QnD}X?p(%~0*L4W|6CJgyJ4!@+~gp55U zP$^ABX?Nn+3b%AU`*eU`{6bZRZ`sgoNJI#*2BX}vNi|_bB@NfTeYN%VMOs5$A5edk zePPCi^+nne`0T#;h^L`_@ir*Wi+>S73kZoOg#9||P56aAm9jKpRyZ`)xVr4?bmgx> z+xlw>O3E0e|JpBVWseRiNOLyh4S%llEv$8MpxVVNtbEpF#|6HO| zBS1c|zOgEoYl@F?Y_X(`k;b$vBk}+`C*uBRpah&D?k@p!L$EL>y5K3$`!kUR&J5DQ z7T$Xg0d5#$x!#|J$Z!_#k>58IzoF>WlOR=}&cXU^*45sccT0M~cyEs5eVcmEUAL?2 z+tTg~D32Ukyd^bNVDPu9D1*PvMQ=^JvnqO9+C3Rz6{kbN*Qc`L6S zR{b%&w@v!7!t{^j!R|)DJ>o-9$CDmvgDoj^-?1zeYzW_@^L?|5AcDNYdT>z5eV~Op zqK(p*;;iu9=oQU_Rems~L#3+wRAQ>iiNVKW(*Ie+cX^e_JBa@TOOs5Yh;>iZXHSKo<0ZuIBtPN_`pss2j79Xah2F>|L10^yz?L@x z8yG`?FBSyimixVi6v0~cqg=31{5WFWG_<`W{2TMoo^F@tjX#kZXSuhocruD2ZbGa> zCG6?nLk371+s+nw{(}cLb4*gWnb4eY*JPp7K!=)Dmbm#v$V4iicCk zajtN0&Xr}%)5LqToV|c=i11@N?FaJoYzf^Nz3BJDix6 z3(?EJMXFNN{9UaeZk^QC>FzY3W;ee*y(L@wira1Lo08fuX`bcN2ngxNW|(!i(EE^j z>_n~B%@58~wU{nz_O=J-={g5GVG`J#oCpiv%qngx{wAYL$*c0*WD9VZBigIZZrSb5 zP~Uc5Z9g|5q;q$2Qg;@M&}{MdxQiJA`N~+-Q(&m4mUDZ%J9u;&>vr0K?#^t!+$n*S zrL{9(!}PXJYS~7X1%>G0&_B>Uosy?tKvBuzy(63GlZ}U(lE)P9#$3&ZTe@fP;h81D zcLxaDF9($O@~jS28i{NqgbE?x3@o+Q8Qbx>$v*0k8F`eS_NVn7Mlu#La}M0Djmp4+ zHfFH;{Tnm-%)~@&Fi&gCG)hwf<;Rvq`Pd*CP4m-<0- zC|3n>i-qMUa@Hok4dRwQ+Jd-+Ll!4(z?R7xTeg;yLAP3^3k$B&B%PCyPYiCd__p_A zkB5a`=v!Re`{-F=XT@18uEaIK?qq&Ot&0o$H&x@D1SZw!z@D?I`0P-62S2TS&FHcu z)CidJ>g^l4?80i6ojD+rgEnu}mL7>y|GJ(lt>-~+-2SJwo_9-%s_CJw$hg6T0|U0i zi56Stk}P3UA)1>!m1*yjAW%{^3Y2XB2c3gh3L{X0U?7MZ&>tIt(js713z3MS`fVW+ zgQMVCy^x}o1hLe$s2AvTYKq8K`y!VJypUogI{Tq?Mn_1vhge-%N z{Zq_+>>t%?;{Z~1kaS}w!>7GYN@VTpBtl1yD_Fv-2QcoI>567=#DS;v6RR5Nzj_Lz zx$64Gq?)a+dnFFKXAxFFr$QERWO2_*ux0r-+c8NCpKC(vp71kRPqE!4?U(25E_Opu zZ)EF2GeIp^E|4~%l$8!f2gA)7`AmX}072$CUDAfqYQ9YNmpZKrKQ~i<#|ys zRG-hvwSCbR!X2hAEt3V#XrwdF1i;~*>;i~QUr9(xuR-RPqg-L12`T1(=>T(1Jjj*I z7OfrNGn5)V(pv22d`U82@na?@6)AHu!d_guPAF^`CMq}Jh+?3j=&>{tW+R@>DvJ;M zBfN{2r-3y#KSU4fClW&k~L zvs9G{ z(L2^pA0Q-iQ3Wi5z6R7~Z$XJ-bC0A|jRP!_-4pM$l4eS$rT2?fAaLlZP46Bk{$>T`7n6G7DpmSd&6Lx>V^^3J(AbdrKr zK}doh+AX;IG*k!A&~+h<5|%l528dP60^CX-&k*Ji6S7@%Q$(0$aSx@(3dqu7MIuet zkw{w05Qud3@AC0y@z+o4Fv@N!NQn^7IaE$D({>&8zpQcYC* za!Rx>pV2V}LgJQzYiW`CZ2-NM-kN-8L*FiW2vBPqI449vf9X_pl0Zd0>t@yOL$rV& z9*U}G)lKSaNF!C>VAQ9Lopd&-lTr8cTKP#k}^MW6siBp#2H@28WKYD^x&^tKy@n_IE<*{BTrg z2m*yLm{D;^MLohqY+CU{X#vS+q1Q4aHe6nawd^x5=KTTBbb@9C1j+=bxQZR&%yXYatv6bLK(* z49~*QOCHxQp`7Hu3)RVP<-ANjp}e{e1Pvb(seHaZ)65I?^t0sGh5jXn)I3j^=ZA#T zLbDI$>B&+pMWshi_gCyf%g!`0qiP9vRDNC8BM` zw&U1ln-xySmT-C~eIh?kl!c(s1%y=T5(7~wJQ(kGX(rh5*s$~v8ifp+Sb$_}Qj7)Y zq|ir@4|^Me+P-eI19?9uh+!RaEr z`$k60JfE8}!KJl#SQTQoVRtXTAj4Se%Dg@c1RkW^+}f>789DlJb8FK+E(2{=hGvr9 zrW_TAt`yn>vDFuQd5wHcSuuN^uu#|J1%^{fagrj5#^AJZqZQ{Wj6Y35tTe{Vu>Cpc zuI0#OGvpMztemL6{jG2QkA(vwGDsnpQGlmx@%PidlNq$T9M{P>qP|Qc49BXXVl3g5 zmO_|>od4?9JT(0MM?W-JuIlv=HJ?C^GG0((lk$XW`u80jWzJoFGLo$kR}wdIh-h;Aw+CYTC& z3i#Dhb~(N-Cwln_^wA7T8}PuF%cGd3;UNmL!cuiyueBy_LcLO<^u(zvD4d4g)3lo1-Rj z{~MXLXCZjJBoF&bIIm8wM%yV6muZxrILp-Nh>_9TRdax~i!^0iF@TPS^a#wN&;>ZB zv^w4U2Ts_9&KO2522#1q1^RdEpU@A9xNdS3Rhm+2gc)JI6kd#K4C;~NQbM|n>oP0Q zocjZAT*9)32bw8&)un`u{E*8}#u1rotQdjXAs`5+xty8$R(5$s@E{q}+hPIgD521g zkanf&)Q?PWmDWjFTC00+Ukt^HZPH@PQ5Ex&^OQ*%!ib`N3tx(v&4{qTOcGj8EFCy9%2)3EBj6TQmv!vO1%G-_&TqCwJGS# z2QDFD^cl@_!pa4p{I_3p5_%+cMCn9KsAhs7ElRatioEnWf2~2aDt~R68Qon1r~;^d ziOR#6FOR=k)h0FL5-22k-HW!@9qUm2V)NP4nqNQP{Ca9#m7wE5weiv!Xn9tZsyBVp z%;2mh=Wg+n53W7T`1T=DkiOD;`wrov!_gGE!!W%VP2;QkUzcxM-{7cpw_T%BY>7{Nk zo#@i=OxZ1GF70loBeTv z+Mc~SRvf~#qtkw2Zj=bAh(xS1A+(viCqph+gF_Px0j&bqLMQ}?&d)kVffyR@`a&Tf zDm>^5g@E$m^fzAstpwMqjUEOwa9>^F)4s5Qrf^1Ks8D~yI#@2P>R<{=4t68-t1p;> zT)$FyMWj5p!k*$uP{LHCfzYoihtrhVjvPqTGC#hPf-P-2?SH83Hb zU^+CF7m0BJcsnp1bZLInTc)5b9P|zg4t-HHLz%YUm6I_d!%v2ui(rKSj7yAesdXyk zLjEG%tNn4rfsoNxelr;B#_F%NSLZYQk#s{|;ISsPqNzKa&F?Z&)K>Cy-D#bzQo*Rd6H2wO7`jszj!rz88!YJr6D{kO| zC2o=80(}CIc4Qls4jkc<4LTBXd7|CjToijniQP$gZlVCdN!e0}%{n_T_1x@bBfpd% zM+P}vHPYfyOr>t(pnNa06g%bOKvV$rw)&L%4SPe!)dpqg$UAj zYw>&_MyO$0mjzcAN`N5GjQ-O`dkF1GeT$Yg&g0a|m)a-nz$v{1cE1VF`%FB{p5 z#N9ZYImPhdk;v%OutT2v2vsU_2~0_X#@bOLd))5iYUIKc8G-)uQ+=zF9r>*f&d-dT zcjXVMbLGf+=`+sOBYtrtMp}zE*St20H`VR0VNTAj9^qmsk@^rRsjmX6Bpbk9B?Isf z|3NjbM@Sw(ieiapnLgHbBh%Ls&w__(RcTnuoSgT}u%8TAFS9qDEvg@KV55X+KvOnv z&9ROhv&0_q~eWcdOgt{>$vc?yWO;sgL^c&5WIL6A+r%1KdJvRquutP!9B^9-7dglqY1G-B%FTjp1+mCQy~n`8mRPqnO8@*0$@ zs%t;Q$e$^Fg1W=qLESmODAq9TzhMxhf$EAHFla_%?QGKHA5s4i*Vtq6^qE!mqm`3E zU7-UyFlJSS<+d8XyrgJ)Dc#g5eBsy>JU76Z4zfdDyi9Ve`;4cnUA^c|)@5gPz4|A4 zSw#-WDxM)9RLc{LK|saNAnanFN0$doa&}CMXQzm^i=r3RY4L*Hwn>X8J1huMr^Uuhscz`wvKwlm(mP}kWX3e7wsd7$>mp6I9YzURCR_6iBSI7gVs#p`osa$h>K;A6z zGsG`}#t3mxT5#lx%9E4?>%B#L*rEXO?tZd75g4AZ}#Tq&ykqrsx*J zCZcK-^|PL+??+JFj9HDMJ~I)hvLGz{<4Y#}Mw)gV#Wolx*pu&81~P zH_j`KVWtJT&cEvwU>^WII`4&0k%yo*P*Q=J@nvqY|~D z;>jQntPCbu@H25M>d6WB71GfsF%%KT5$J~7I-cg6StOv>M-L*TClbX`(*pE zqy-m9#VCTbfY?w(X#t_h^YDIYID$3Pt@;N|Xy0c0*?IPude`PsJ6iufDbSI55%C=> zUVzR8b?XbML2lM*HJ^XMJS5FVv7EQlJEbf`GP6@lZI(N^__(UI0nGMftX`)T z?_!m^JzH0o0AnDOfS;re_-Rs^I?c(Rau4fAG)zckDto09oGcJny<_W&`{?SEYh_E%ltY6Z3S>0%z82$;700(XXrCBpJ-U;u0iM@1KqQ!Y|1w;C)tI zLy_X4T%F}%@sLE+<`++M@kl>AL_1#(?ew*g$}B5j zm?puLyHfB3F@2tk?0EoO{NO=NAqeL zzYrH?k^xnyBP5a`aNkESBjJ zd510xmrFwLBUWrl2f+t1T`9mr|s&C;q;*t=fC`ZvqbJzes)1?+28U;hJRABDiXH*19tS^VZ(`iehOLe(LQ z-@dGN##;OVi}s}~D{CIIXe{jcVq_;Y<6wGaYG8|}e1GVt*?bTyt#ROF^;`zF5|d}i zOvBdOUh=F-R$qc@`#>-HniU{QmvWeDo}kK=@(ouFOUq0{6go^ayW%wOl$67Rm}+KC zd%o6awG{11`0>+f>y03T%GOJCS!Ct$;+`uKwMT6IXjThDht`nL=|O6bXe?qri8e6trKE9RM@{LSI9voXFDC3io+d6Gth*sSVy@-Cc?fi7m zEBspfnNQZToKmvCP)utZvE|jR4={&5wIswG>?r4oH?U2pB)*wKn#7$n(eqp#^9A>dq1=)ZEh+_VlJma(-jALB zBVf*Wm(POxq#S=ejeaJ%gdT-XP#xxXKd0`d-H{dRZ=2MORFedi4%PupALy$%Lu`cj zCv9#*h;zuB%#&ZdV-c=UPen!UkNrg{bhjW+0+ze8u-*M2afOy4E$gWD@Xr)$2Gzn* zkrFWVajDbgTW>n=+v&5b6oUREVLvv8AKpVb5~d#+ip)%eFSXdBMh$~GN9kdyI6P*p zRkgH>&8Oe;>>#|iRXvlVjWvL@x{-CMWC5l+-Z7d)V=!q>R&MER=~Z~rzVn7;!KGm& zH<^YwOFFHtqff!)F?f4-md(|9B$g^h@;1QD5IH?W1kwC=mMtSy~QrD&kw~$7;l(0pvyUWV&SC0NM2hWY^u4a>Dy^3KwDk zb;m__lfe;*Pt6WJlsk!?%1b5d$7ix&50M9h6Y4kg{EA?GB-v}pQ<5e~uG$ueSnBFA z_DCodA#kixlug~Htldsl%sZ&f?&K8wj%n~a`p~#?QxLRG3;4u^PVEjJQB?YXBJDQw z0Y#@$NRdC=a0m9wqUE+u`%aQw%fc5e7Xb#tP6KVkKrgbOEDIVFSC$#tirn_xD*|(t z>zp0_QlD(-ld{DlG$g4>^&_+?MFY(7l3?o>zhW^IE4FRs3D!VDHE07xSJaW(IqeDO zK;0dO8_7We+=sk`ShJ(5F9Tyf4sC+bgGpiMK_ozu@%h(|SV|Pl5Rz8Bt zM-}XnR7jD`k=*DH{v!pj@X;1cEHAMoj&i|*GPI0L_>x|l+N4Qfh^9P7;(b<>0i_Xz z>!@ly-7EDdU)W2mkoq)}SC86zfUzNYu@H~KjLQt!lvR}Rky|u~t9a%af zOm0DeIR-72(gHR ztK5@RXDli|GYjBT9K*R?fSONVEXvi22?(m>@{=A)o$$bd7q3t_z^KxMDd3gHHgLBg z)};cpBJ6Obj?jg#e~D-Tn%z=vCNf|POnYm2;$E`Gr3C$*RBk)aEvcmR(P5*zld*1> zH!~#>0SCIkg7S^VA7!y;`IE){> zYY{0~u40yqGbaZf!9csd4mJ;byh^G=jjXNO3e|jp8juE;eyQ)2M_%Rf;NQ*r{k!O| z(Z8z@n&98%iS}`GQ363q>`s^tMSNpbnd35cc3$eaX^1Q`LiMoWLMHpVpNt-~Z(O+i zu3fmo4y6+XKRiJ;2dRTbUSd_yX!4#Heqd4?FT5vNlPW)%CzUzjSd}^=4-9GMSDvwc z-#S9GCI$}z^IiA1o>$iq=hjvHAI&WV2dW5bLKTOY+mU5+%M+av!=+$~LF;C2nN-a! z5j>h(3P7Kab#80-I8)rrYWtQfJFzysE?SmRIAx#dRX%=@TW4ZBTL0YSbjBvnA?cQs z5Qwg8U;pUxaNi7!M~sF73lBNon~$13!8#n!A1lEU92Lu}Gb?eyc%(c_xa+8256kdy zRwbQvNmkXh65iR;{$NJcP&LNW#eiMC&{An^t)f_EwCj z&}U}*bdX<3z}ew_pu07jFSiB`ej?SLNH=UEI*FTbjGM&mT0ktU2?jb=K^5dy_nyYQ zA|3#Izw3s1X;pSxB|DPE8|LLBLr3K8j^x(*7XHfZ&Gjw6Z}jh)?UCmLW_R9e@St7m z)WfVH-LGFqH!4yQ$k}+%FpG-+!G7b(Uv_b3)!@lrnYBKZnS6W#1XsDdgOf|WY-*0F zkvT7nux9o+1JnlC5bgSknjr#Hv+@3+uCaH@rH@3zVrNC17wDzobf6u+9licCMQ zdT^eQBKwwEi;A}`I+z4Ui_a>ASB7t;4G@x0 zORT?}!NgP*6p-d%!}?BJ#4PE+d<=Ri1@!FSBWYw^#1~>ep@P7MC-6=pIW&KFglq9- zZr+{+hkOt2Otma@g#CHcCldEXwoNgP=3E!v?2$Wn`{Do80%3ols_=$qHUmF0d02na=3(KEY2bY8#D*uum zEBlfRPQ8%BBh9{4ha3WQA^8w6Vh>_pU5Cz86o8_Mbv&m0O_DkoNbx8D6jmb3RoZ?{ z7V=UN_LBA@#sa2gU`l0krIB7V5ikZhpn^o#SRWAyyEv*3%nr7@Ks;SA6TM{01n@1p zpOAY30)eqHF})}Rpy?(}B}_2b9v>^C&r+XE{&+>#A#o7B`U5>nVL=QhhZbMMX4#5> zLL{;3;H&w40}nz3){U>^R@-QK^^k(I9^t{^UJ*H*r6&Z{V9!$308ElH07WEoum++W zD?U${lqpr(wZoR55>g8gYT|++hr1@A)2P(^Ek>vM(09c4PeXj=gXQ>lIZfgzFtn)J z*61<~5{)W+VU7#I47->Y?lhm=Nx($Li0-O&+#zG=9X=Jk1FsMZ5OBAI_+n6I{edpd z-SUJW7DR<&OB-c-L!g)0;AK+Y7j048h) z-P@hukyXb7T^ssYhc;Y$x}mY}lyRk$C#NSTb)@R&{s6SMzy`LqA($(#HkWBn09kj0Py{O^47HcaR5-TWfe`_L+0a>DnKpwO<&jY{&f&K_ryoj-3d2&B7YFn|q zu~i`Qyofd#Z_pNo#D7TUWNO$bi(mj4jp_(c07!Q>v-DGzcCm(2s_SV)TSIBhj0TXfvOjh4`Ko zDh9F?|6NpJnsIZ9)(Opt6UOd>lupWcIYl?7ivNq)Rs3Bp3L>x|4zc)V#_(}76wl2W zc`RK(c>1zJLw}1uc1YKhOcbI)k?x*DMV8-%68gAXSFs+uhIchXGKw#Fkb|`1TXFoE z$VfjVFiVVBiwYDdk8`cc0B(*FGm!Ui+=F7ptFg9;4v3D6 zDg?qP24W)Mdf*p<2#f?G&=5a{FX9KFL>W^XDIg;PY4Y&uo#an5k`0GuBqoeK?kxEK z-b}#t-@g;^NE)Ol)En$D$SZXsQf;e21!8K0YYA6I*n5YjBm*lXUTmL0{o(*Hfs83a zd+UpUGGHQ7g{v`J0y1?F9LWD5c+ZpiAWEv?6l%h>bl7AsTP2w)6RcAu2`I=I{Z~Y8 z0W-z*t>U(PfcNn^$58rk`?baW8EB_)E_mP=-^#Vn?@VNbz3?qmxlNt+=hB!Hu9UJU z6_6pLZ|YZTzZ7vSlG?k1u8BZFCxW<`*$SnkKR%l&$IOK}3m;uMLJFf%?<6tlxAjsV z&y09q@~Vu%HyPPRwFyr?BK9*XV;t6UZ91;I;M8&408;cpP01;<;f5kMO2z{SvVSbDvZ_0^ud(bc2js0@U3 z#meA{Vfu6ug}@sBj0g`HAhz#VM4fZYlCpVTwkwJVJLFD;Hu?0x46c`pU~v(_j9GVm zUa^k(ar9wK_Umv(eV4V-s(2{UMy#SV0kZK*NHh@~f%`ifFYXI5hIQNpMVnixBh#Js zS0Z9(fPKx_s8nnWjwVGBX$AZh!w6}Gtt2uo4w=7b0ByqzIS~*MWZ(Yw7=thh!>d=9 zor`;s0PHX>*M>d!(f@CQf`nCgQ7NAz6W1+x=?jQo~nBuSfm|pZ&ikg8D!dE zJRHH=rjgk55zTJIy$#yjzV>E5KBao)TliEdJ*sGg<1DxV3)~mdbiMS#Q82;=wEf~# zFakELOaI1QAxHypw27+1 zxhE29zMQ5TG}NpQ`JHPh#J97e5?H+mtc%z=$h4FyjJc=IB0?b&5l{&F=X~K;GA&kn zl!`|ngVeFBQGcdxCVraI8{I_D|y}%w!u!`o%=B;?KOxE1wI%1qF3^>{-ZAvu7z zlF&h;hlKSoOML-20H%!7Api%_)w@Z9^Gf5}SbamT8xEE0_Xmmk%X5b%sAM}MQy_4c z(VUr(yWm-$;v+?*;i|fu3W^`ZRYkixkVx-;UGL@H;{A2}_WRw)^C`2Nv0dNlt^7#c zq)Po1M^-S&_j=Ox5^M}hvOA%A#r5XZ=j5QGIc+?5-h;e)AbPd@D7vbcp)5KSqQ|QJ zskC;tOTkY|8c+&FVu?}L%<>c`EtWS@%z|wgIkY8sjJKeAPjw{>H51BB>LTVX6_PO2 zDa6$$Q&?`3aF7uw-BB2-GT!|#5V(dnj(J^+R4U^`*4tHZf*j{30>&o>$N2_+`mD4Q zbRoo5oO&||ExR5n8eyn=U~pO7pA@m!vW)fCYP9-^TDEfQd{J&BwNp)ML!vpT_4 zE%Ixj(ub=ZJScmTvNo<^fiUV{)T6ZcXv!19M{=F})D`uXBYOsn`Hogqg^Z&m)v;kZ zOa)8T&uz*RI&BnZpVkNYO>4QU+8(4X!7b!!8&c9-^08ayC3!h3RKmvlTjtO9ZHQU9 ztG*2}D~t6lC2#fbzMvF<>b&1Ye7iXumn{TuVpeDp(zkrqcVHQ18e>*6?fOoUxKIXXM!ILsZLc49$WCSB8FeB09UL$AZI0`h(j^}9 z=p$KFiX8Vd(f_p6#M}sv=0n^NH(c1!C-U|&(4CwpmKnYA6+HN@RrH(qB? z&Z_I^+TD^eueyb=lw0GfEQl8@w}RzxwuB){uDu_*RtF~sp;>qQs=;2wNjF0kgu#q(Djk%BMFkF zm~J_S=S^BOc|sN-Rg+?m8$jF*fjwdw5Akelmn76fr(G$k4g09rqY~W&?J$(?u;ykx zQ*ix2}vG87)IOor0J%>g7!2ls1#Up!lxikc-ZX6RIqMR{3pgSM&q_{IL?4Yl(58l zJqeq3%9>4;s}8Vc;!~@)NLGUAjFPFrQrvjhI7r2;IxdDOLb3WI;+R_n}CQSvdh?Ugb*oudH&?ZF9AkgP__v z-OcJbbS8hSnk*y(&cx|iD&5Kdj|ibWGBR2NT<9xK(I&qTsH&uFcv@JZN*7VG;**)j zMdA`%Rq%aE)=5nGU7fU0d`27BzMVgtv~wunfwf6{f_>5_sYHPm6Cn=mYJV&aN_!Pp z9RmaSlNAg{0|K~bQrbyGZBUcDa!2bi*|jM=CsUx2I2bfX3I%3{PEsgjXHdKTN_jqZ zosBofX5KwqpbfjY0Qf9{qK;K%@!N*(k_n@Z2!;5QM#Z{Gm;d1_XR7z+Y9&F{f^>{A?* zBO<{$M34zfKuo8og{7F=UP80@^Wpg))=$D-1%z@ltC-fu^D2tPs3ii~P$fCm`nUE` z*T+~196z9yQ%_i?uqQwKbhmO=!HXXF5pXhnm+J!o zcYX=+0kZ>CF1is6@&L-Y#8|BB-v=HqZ?(%AMDoqx98!VR!0Y;0LUreB`sRw4=3ed{Q3~^dbAjCu;k~_ksQ5t~6aMNQBxOk;r{j?+1eBDp~?Y zqmVeJ0}O)}a$z5!!uq%nL9sho z3*d2C*CiDdaE3;IAgV{5a;;*W1m10obn6Pv?=CTQj7C$30PlTic0$N*E+aab zqLC)(df4ycr~#QA$PXy&p6p417XO6(L!>~@zjrrd$mlp!xEB<1|MM56j3W_IO%unAj}s>4Ko8}aYlF}x zh7j67lO_U9k^yNV7?4t3;7Wlet*(1k@V<~3o9coGMejE=*_%bP6qYklZ0q*N{LsUt zuKbS(U8;izZ%?|BPh|5Y`bDz3m1k*^o4bev=rO2(7O{GC%2}uAg8r`K_#H z)z`vrHZ)9C-}G-dA1{M2kyY8{)z$;vKF^|Gir)4y9T=jG@9IEl9T>!ROfD97SB%9O zrQbhMKc}j1g*E_p%$(sj>?BdYF)t#4ev_Y%yYXADn3V_0flxL8xMbVgMMM z;-y_^wL}8MWauf@o{I*I9?WVRMpNDR+rT5%NlZNQAQC-wIZ#DJycwb@LFU#B>R3S8 z)i(_SPq7Sm@O5siZj|Wb(;TT1yQDL0!!B)uT-trQ&SDA~STG=87L$75;j@$ZR5|$xoCmy}z6h(DlX$sRJq++he<6h2$RdLXi3`5mj zs))cLsMZ`pp6f-bAm{|+_zz#S?UG(!4 zAXYM>XFnz0ffYZ<7d9HY7~6NQPgkN+4L$b;!XHNXbGsMd40eAPwn5;XJkV zNcJ$F`I#zRN+?N277PLk^T(LW{^NejFpWSV_0;LyQa7XecPG;HdiA2UlHs$&DusJV zLQJy14JVH>Wn_5`iL%a*P{YJnlngLsAyQCb%Fzgsahhf66hC+Lt-{p+8H2mbyL=JM z^0LSCj*A3I;S4W*N>3lXVnm$)I-+oxKR37r$JI$qRFJ8ZATEk6=x8LXg%cydkvr_z zSpf~{mL-oU$`DBc#a_ai0*g(kfF_!aakCD2jle?>YVaWrh~hD5Ru&xUQOndLZNvc+ zAhl4OSXqp>wBgX=CKgPxiz8q=QBDEPkyB`6O&F!lA6iRahz0n=GKaS(f##z8nbobdS=3Na@0c@qj@+qHBe3{Z+! z0<}a#VOX8^JJW1kouO%;tzLJ5&rm;4<36UjyIDWPkvZASt5iT>eNfh+xoB~rc;pQ}(9^Q5MpBP?W8XEPY znx&^{aK=rjX$LWfrgd(WGY{f?_wlzHwBzy_7yYg`gHf}s`|4f?r_;ZM#v}r6M^s97 zjWDhl8G7tsl*kA=?ZpW4Id4q&jl8f3yVV*Q1H{9c33NJi07)VMML8a39L494Bnc$q zY+NK6+My<;SQ3UbF4y6UG+bkC?OF?W!cs80-UQ$fN$G?G7(hQ8*IS`Ee{Y&j1w~?6 zbT`ad0<+iKnt-f%hY^DUrczO8i1q!IKUcB$Kx17H9e#k)j0 z4CJ-?gJ{p{JXg;>ot6ujL+d*Z+z5DWJ4Qg(pzjE;*Gajo@smWL4SwDn?EpQaybR@u zO{~>bZ(dBgSv3(X8o5m7yi}M+@C0pk2?<&bqr)(}cc!&PUz92wN|ij3J%T$hp;f#K zG5`=*JcCAFZKG)^ZV|E=%O|WG@6}F`QDOu~Ft2B*!^6Y@Qxvo*;jYor^aUO+A#5~I zlkgYWas+piMdybk;s)=@V~`6h;^IAliW8<+wxj5525p%+{IV$-q&M|{?aQbls0*jz z5p@;8IFBg}*S)0VO2G^^nW27)rreSS_vRwDXJu#0D#9Cy22s})=Ri(n!b9Y9<17QU zRAxHSaFz#Of6F3;N*4-QE9Cp+#X0&z^8bIQVcM6K?M^mEUzVI7Gn!*fG%{jL|Ert6 z<0f1nEKl%YRkbfGi?(IJ#Zo;j4d`329=geX4yC&l9T`!&TM5RZ9X$S;vfx4x1>+8M z0{m5W!eGwUWP`b;z1SZZ4180u4y&sBUdRlK8_5T*x>eKCT^XeP9 zdG*F{^T|(hvpW3#2c0@vz3QP!9Zi;0uYK#&7pj@?>isX`cl`d^NA@jLFMOnZvBm0- z-@B+_y4QW2%Ujaw!+*i`ck|*BYvV3)^M`n}qk7hdxx6;3ZultIw`avA?cZOKky=Ut zCPZ>sgod0)=2QHpC?hmr%tIfGGEB)r)Zrx38uhYKnYJa&pd>L(wk|Aw5 z9XHkXK8mpMOzNT4jn}V$sW1*nzjRq$pv&qx6j43rq39z}1MbQN5_^pVYS0b62Gn4K zmEz>g{{u@`oE$c9?cc%74pO$m04^SgR9J$HWzlKBB|`OZTcPZF^bU3_p&lr{pgZmf zK{!d_($yo^0-)BotDRi}BwxgBpa`<4*Q}Un!u*EjOpLOf-l|W!f~$?YfF({KPRWhh zr#aAN@5E~4z#Aj|*yHdB^e2d|@(uF`DK8wNWctgaCTkX8>X+I;4J{`Bs{W96yGJq5 z$8Z4oj2dL%sg)>(m_SIZVTxhjYJEytO)rhfpB36mMysk>d;G;4c!IqzdIe= zbNo8UTHBDFA&3tcPWuy20`&yiSuppWsgUVrOo4V7^c7X-Alm{hQJ@P6w5{vDXEmU@ z9#BPCguwo~j3vcA>=i5iH_>?dBfFc7K5Iy1$xG=rf0)xBCxCE1N|BH^Mlmx5UTZV8 zRCsU)S~AS)gCL+&y5JMbl`JG>zVb$Z#>8Ve-ydP#(UyR%;le(>T-tevSE@sZ%T+;d z^)>)&=X|QovmGycQ6Cw)l$F({L$FZ5gMcs9$$%pmQ|6;6t+6LnTlB12t%G^3t5qwM z6EQT7TCr-S@25e2!6>60(b)t28+DklM#owMT++eo({!C=_KbJ^%U;TTYd>l*`K>lX zWsaqHK}%)y;ZD{IddIfL_hW2>&E7Bjqh%WgFrbsVysYG_k$6a?BD&rw{x}^_xamc| zDq61XwBL|snNeHGaT*W0rYz76VQzgY7ON9a#p2xNV>=bgM8{q-sppK62ZuQo3lPQA zU#9JsMta#~!`+=E-5l^rFhU`9g@m@bv(?Jn-m%DMnvdUB8^hG2*R;mExKSwUM+Hx!=n*7U!JC` zmaE%B&c@zB!%i4nri0O^V6B3Oxu9W3hY4Ds941&cMDe7EBiT44lP9Z!!-N+ysc;t^ zCaBob-mPK>hly0|PW#160Zt=1CQMKk85wnt2O9j=QTJ*EG&r7}0yk}~9U>J%V6}yw z6T18@h>q{Ro=z9V}XO1;z>ftg?~Jl3vV8-;ZC*96ejF5ZwW=M1C4ff+f&Z${40 zAL8uzo`EQ5?7sGdkjNG~2hR~gz$;)0OB0pIazkH7egTrLLAouIY;OooE?LZEUlM+F+OJBRFw;mBi#?G`K<}_@>egt7{)zWTmfpa31B~y@#qh3mU4UWP|aT%}ok?ODWh=bU}oB zf>2{3G$>47u*oMp1|0ORPL>9ExOVz!M%8|y(11zG)H*W{W^$LntQ2cRlQiE|V>;6< z*K|79qunzzgo!W>9Pp)3CsonA8EJ0fx5)iI2u@Wan8kWqAhZlMIB8tv{`SivCCh+| zK_MhiGgbscd2eZx6k~^=Ei9pQH0N~)wk= zE>y>0d7563@kvlc1W)|+IlvwPOM)aXfRCvKQ9S*U%?VTtQv@(-TDmD;laq_8@H+9u zdASZ=%&PnE6aqQHvkcfNol-&KE%alLgtMgm>kYdcmL{RGmfBJ<2a{vsc5wlB%5XO; zOF=0br>sU}(BPhFL(|8^j1|9z0n$9Q&g-cOD!!nQ8fV#w=JHPanrQDIsa$0_I*{N- zt~olu$!Bt~)d_AOnXTgQbJ}HUw9$?YUD_`d5>t$Y*y|}M{G^g>kibSemAS|i?sd{~ zMH@K&y%=jCo$3Wqry7ERUL4E(d@Tc;9YE2jQrsZJa_~Wn$s#h&jRc+v-ArOSv1j}; zz$$F-011H?V=jbr_wE6%P*0hkrCO?oc411q- z9#~3EH{VK4VnE?nstWkDn}kn@p(ztnR>%h=*|G=JONz;K@rhRZc@1EfLwsK~U^CG@ zI|vJu6@O`0hECPP5koXMfZOu~07T=(-2|fwh%lVlMhf&qT4|gwmw@zh8!}!lCF9Ic z9k)O;wF{9xHIZ1#DETG~_d$rUP1a#qeLNW1rTD6hZu;>YTi)2+msKTD-cPfSbwWPo z;T~#2{w{8iJHiP$){Y!J?8^Mf_ogEsJZwkqJ!%lK05{5_S#vtv_U&_%lb{?UQa{q- zd9pAFN{KhJ4h59T>xnW_c(1iU)myHmNi7A{@y1!%X#=Y6$5QGGo=bMM#BB;J(hCLN z$^`*1z9al0$cRn{ChsI9H}s_VpCY&txSc<2ihe}dknYHB0732(FX%_~`j!LyyAnwy zTH^rS0W;)qvK}CHzI4C0>6H*B$UR~R8$B+D_J;F^bqrI2Sj`j7_)7oEWc7vF z*y!q2tNp)`B-M2)+)Ye|Yx8%!{?)2~tj_ZKXPc$UkkFN|l!(h}od29of$JFmjq;x) zcnoLU(Nn9-Nj6TPL+s*v{2sJIjYGq=o=zk)xnN`oUcTe7Nv zIDVLN!A-vKgB3AEk17Jp7zRp(F|!vgu@X{d2i>oGwe$qxuM+!oUuaE4q(l z+CfXF0em>3EwkW&Ucxz$UXc%$D~)HDj3r@BQNS@j)0C0s{| z7xnE4IKuT`4a(C}$b_HJY=7!&El2cx^s>c4Z)7D15m~ULvEu#FHzM5hl$6m9{}mVJwp(IJf>6?(V07Ti+_&5EaVp-e%mGFQ+MPH^qg z64&^CkO{?6H6he#D)7mP1cGBygmKKOS?rsV#(W1>>rUv+cW`Na2SUo&fr=obg`iJt zJ^-N*(seT3)Y)nOzhU*4nm8E=L!xx?;vAd*l|eMSY+&_0V;o%rq}X{#BjN~&wt+>j zA;G-ZdoTyUtNJCK5?1|8i5W4|%}7o6gc+Vo;?*@~Q$Y~1+Qkl4jc}ymfa(Xm5+jP# z!TnY(-l_SANLDhZoWV!r%*A>#=U)ZC&hf7h#WSKPo>uW!7*nqZ(R%%Z2kx|t)WhI4 zjbRJ1jBB9%-l*NPLI-+$kO^R%+IgYScWUrZx#Q{XgxClkHCrzbRBF+?zg@L?Zh`}K zce1+Pl&=ZS=F3(ujEV!MC)CVbTtPS4b|9#2r!k9mEerL`$N&qf6RqO3XfY z?ovl=v(x^iK>dKoVZtWJU2CZ({(<@`F2kffMi-XnWnYIiWOF15&BVZ2K!T}Rq> z+W#%M83v~v48``q3TbA0%O3WxXckd>o`mcrD=HF}_S!%W%k~x>hU{c=K>RzH|3QO( zr~ULp@s??3w;3DSR&jGwXU$K*3>o{L_ah6Wv14Sy1`L0 zLO{8C_{EC=4cl#^;sT(GLm5;wp;luA|47 z=H$Xb%vRX5%GrQY{3CkjX9#fkQ>qZ#9OXJfMsy$DO_K3iRCFbR0@}W8&KRiuvf5KQ z@&(#9s(I}nBLp=X!v@FLxGJK(EEy2Z2F+$BG!o5_(3Xj2`wxTms<#nRn2hM=l^mcE ziL%B;`y;D+z`!B=CXX_TAI&jXjq>bKiqwJwgTxoIP;l}p!!`oRxxYFX` z#<7DX2h_l{R)ZN7waphcH=|ri4vxF>v`u5ui1%HXagSD+Vtc z&s1RWf<&Vxs$7%Z$lJboFZroUU1Vo(a3urWrsE2MOZU21mA}sg5Tjl{mdLH;7Cq%pAm@J7f6?n;n>?%?j z@M$2Fkw83%K!9bRG_nvl8x0Q^f&#=_7?Dmw%L-Wm>}s!@N7bp zM`AHBD*xPymN}|h5;%>d(=W#ZyDwZS*h)zsFMg4R25oQuN4e z(y5VGg?6+vD6jrp9Wm5TAQ-7YL2JmjSv(2Chdcw zE==zKHNZ3>s)A`VXa0-_fRis5uS)T$Jex0NdC%tszhYq8ghN2YZLe5NirZUC`0m)7 zyyxi6icjVSSO=K`*jam+jzg>1Di9~`f~-L6oO4H9HBvWB*@2=n9P0oYW35YiKtwvn z0d?AObq3WaH32L5guOaGT0lyQb#l`;8C7J$Xvs?}xM;~s>jf+rZiwZ!wiUsx)Bf4U z2IeRcPn_uL(V{1TQ47^0FJBCZ4JGJ9(&O4jJOtd-W}uC}kOc`KXw^Xuk<&iVGgOJ1 z)cBETJ+C75fxI-N2EJlKM7YVCF(%#QroErJ%I33qP13lc0Fc2HL$5`l!398Ocal`6 z?_*25%26`NfPP9G0won9mQ)|PaWSbr%AextR={N2!&n6^=3ll@JiQ0bArFx&0s$CP zQ<)40d{dExK;+S;H);^gOR9sd$0sN9l>7^Xw^tJj@&HbpmFOKA#&Z4uJKP^%2)Ot5 z#qT-Jxr>U+DnTMGm1kK z%AZ?NM+0zF*XrYYh*HjKr7$@wFx@0^yNJQ5hVGmL2m~v+T`;9j2MjerL`6)KW@(yvgv7HRQ{b%Lxl1 zMo)9RL2_x_Hwj6+QoQjO$h*lFUkDjO#dz4In~()W+^6|no~ zeLQm)N(>Fe!_?#kX&}}xiWOesrEx(b7EcM5vaPu1GxAUCUSI=E;lLevtLh;(E=skU?%_st6Af=S5Nps-0}YqcLnl@|R^9F=Xf`Dxvp$SPrYhJY@0xiQz+_s=m(l zYsQfO;`f$ErbsXTHOY&Eit#ZF;3JNCIN|~PY*^raQPr|NdW06(7pZA|dwVRn`iu}% zjhNM!DU#f(LwOwssO%fT@=BQ6;YLwBB5y9sAPYiRhW9zZ<%mad*cLdLW=RVK#k0c4 zt%V_=^s%E`iNlTIJ8$8sL9DB{VFcW@?E&ctB>Gz~a#qbY2|x(zAU8;L{o59S200Hf ztL(C!V$Md&V6l+lQVMPHOd<(>JlL3JWJRLuo#2uOW0mlZV09(5ZWWi~M!4r$HL_b* zAZiGs3U;Eg;$s0HvOZJ9Pu2>_ z4-@)t${=|{!oiY$eS3~Ah_p$A-k(#bMW+@=8{9FIov(vA1{#YF)F=#%kzJaYp z72;2qiD%H7hRVrWZW{3TQgeS8gd#A0?1;2Y_mag9bO(BUL~3SaVk@x$3>n48BQ>ZM zKMWcI85A_8MhhSgAi1b3lrr&pq z$qthL9}c+G4>HTiEAB@cLR1=XCefD9hkGjW1cm`fPURjYc}Zl0^jv0xINx!iML)#sgMU=4_9@HpN0U)}OECs!PzkFR zEs#73;B7>S*srR!qOQ6QPFK}Gax`Qmap%95(%2|-ZF}n`ny;4|FVVOz;|Rzc;vnQz|mH1cmE1FUfuLelPFLfW7n6Wl?URtQm^Z+1A>m9 z3~V!)^DX>{3^`^Vht-Yn#%fY2F9xmnH_3|slbdBz#oS-LwJyf35?#nN8IAZ)>95~~ zZ&P8X(HN}r#_L_DTC)4DaT(ms2g;+dwCew`B0ARmjM%(DpOh~JIldgd+?Yrl0``<; zNcbNE5)PSWDr`I`kxYZ;#b1)qaw(Sd1ZZK&QCIm=c;s=e^4Z6~%4Z#R;7<;VbC|gl z(MpRbOOh!?5DTxhO_b#kyA5_?_ySu%4!`0(C8~eLC991Uo#U|L?>y|le;ofwNo8`!XHQ)^}O&Y2VH!s#U>AZp@XcRbQl?^ zcmUVM@GxGJ@SeaU;QW8QJ3gDQ*c+pr->oX7s*>{=BH;AHRv@`SjLPPHqa&PRwkqkE za3>xtPaK11js4`xj71@tJ|))V_Q>=CUp-MX>FSXrPcwWZWrkc0+gE7oB5oTC0LqY5 zeJI@V-tL<)MaY&3Kv8>(ia$$dbZQ;PVrNQ5cRS`qIdnA3B1vp1A2oTP;_VXoU#U4F88T!xsSE zA^KQWlZVnMWDR1dV4K)^xHCH^Oh+ITk_T}s7I{2Qi9HAS@xALZ=?YnZ#`N)NR;3YH z9-rc$G(&D*GE5VZez}yr3AJmn8(9^dX-RZ6k)uC2oElX+wue5}CuvCf4H4_82cO0d zG=voWryA$Vph^3{9*NbYz*J9c-w4rKA!b>!E}KY#qfEo6lLPLhPW!u2=f67?1Rf%+ z;#J7fLtyYfgzA<;Om+JMK!?K9nrL-z2Y@wp|4HYIpw+0L_CP zb)|RK=&Rz(@W4xIP#ILzgJ!OMML1`dlNGvFyfDmHPo~g(Ip9+cV#93DwP`MF9oJ@A z_EeyfvM*Z>V34qQy%xb~P+h1wTqW5c2%L?p5H6H*g=tRW}@ zbIf1}sNh6SjNp8|B=w%OL9ka%J-`~YX$14NJ-JKl4W0JB6{oA_D-H4>+k>9hNg)yP z^e|DUX-iDpW$Xe)#mK)^N z+OtH)z#ubQ#KrXwu^|um7Of5I#a6@i1;bVk(CrzDdx|e`AZqoeB7G*$j&&A1T@XN1 zFOZUzHv!p%T0p` zO3n-1N(L|pNY6H}>@y5cSkl<$iMbi^P{JAO<(Ou#)Bb@#KbBPi#WQtc7zdb)k>Wn7 zfr4O?4@L4X2tI!}!>n$8E@Uf!w{Y5er_b4yeJr0x z>?^K1#@0#2qt+Y3I*7T4?L5sM;`7H3lj}rhLLO|wO2D@sZbOT3FRehn4-k4gLNL&-Q(6#P42 z0F>>Q*Cp0GzW%P4YKl=e(hvflL@O@J*>3Nh^m;kOzq4=82}F8DN>hAUgMViu{o7C@ zk?>dtdf4ySb2n^)9v3<~$j}8O09KIISq=3Ly|Doh6!1>_h`y9EzwFD$J7p~bT~9H9 zVu;Ty;b6hUj9FfWrJx5i3tGsaU1sRAy#+pvWb~zV?~JARf|WaEFv2dwy7WYrt((|Hqk(4Ztk$YCJh4*a}ZX0FU&` zC(r=^eqQHzoN@S`?ikY1mYQ3R(2cdw+GWiHMDgKVlI{I_x*EIfifE zaSY!)UrT1X{@v}{-wtcXQf0r&3OTdJs{?OIUpEG6a1>3*KnL-B>~h`=8576>QuRvl zjfHQVC*sJ5o$Fh*=!0``_An3<30WGQx`b4onYFNV1)G-XXs~I?Hj;6SDM-cz77JZ)t+HU7=R-AuLFV$S@4Cmk~9Dvs2dCs>&infobLvf z$l^TAjVwnNsw~$?yb+g$x_>Oh zAKg-a^p5b67GFuTCFyOIKN^t>qjA{JM~BpAe!;oP1V&|1)%KpDWOGnJfKbNqKrO## z9|SgUJGwm)LRd$ri+K!m=`1w;>ho7)d181h(YheB6nCf9tq<^2yJsc9zX64@j+cZu z__J^JKAY}+cH1F7`<_ieL!O(RNquIAfeHBM(4{l5zOk?XEM6KBKJ37)Y~J1%06LZ5 zNhjc;5`ioYaC8LX_m#$m59rv--K=YYytb@i(jEj-k}fSlrY`117T!)Tut zskT9npj@od)fZ8WDwY0PON!B%igghlyMtUql!$vPLK{-ExPSvdLXwp;n^t1?)C$C1 zpqy3r+*$YSi+AW(-8X#&Pf8iQLRF&DH$&wctAl?^x6*RZBP3~z9x{Kz{_1b%TDzI#CSWf+?+2bYlRcx%p2M77d0DmX z3W)NLw08^}l?7U_XBe4}I2>BC8NXdbI`jczdgzjx+?tJ?x&)NeT|<-hUZ=$cz>_^D zCl6WBsENDbz|B;fz)NE$I4fbG!;VgEAALCod#SzVy@3mK83;goJZoAJ^!l4SRH2AS$Fom|Mad(cr$co- zPUiMxWtCCl4yWI=XAZY?LU{2611Wz*-5^Q)(GAyeuGM|_zzo(W?UO=vJ%o3ZTYwm7 z(uqr7ODYKT3q1Vi_jb#QSn}>vG zcvZU#NL#g9l{iwB0)r8(?L&Tk=$F8G@mHh$S9+1>yx|tLhcH5g-$!e?%A?(8V zOB|QQ8#5^(0$a;WC?#{*hacb&lj=0&rZppp{h1roW7K5@!lVVNh`uhKsD4^b`1&1- zNhO0#pQ6ybeD(_6T?1x_>+8wrDoveIw#U$1hv0nMm5hUKA_6*r*p9njtp>R-{gQ zI!?V>D88t@D-fCWE{qsa6DYd7wY@exW!9KCGO<)idtH1K*{+M7z%zB4xD|_M5$=|J zeFa}n$C54%F`Q<_d6>-$4oLg&sIp>_(^gedeMuwPoKn||*!AL(Jb+R2;O6*XP2D{a zTx9@h_dU@$MMIwyy{}YeZJP&f*w0(VrnUr)-3fy}P-Ry%cf|ot$87G(1J%eC`V;}6 zr*|%Ypec;9LG;g)tXN+$$;Dr@7;BU2!`gsxVs+iyqrMPDX*zc{(@23k@1Ve%>Rv8} zomgOVe&rOHr@J%dZsCI;=~ezyW#U(1Vzc5=zI!y|iUozupt4a^U2?(VPf}MAZf;?5 znl~4b}0tJ-Z(elFX0>7hhORf5TID|6l))-Ml%P; zr*=$?$2+8eytii({aJtDi}q}~BhSZowAy3s*_qLqcI6V5kp0~6IaFkXcd5_e{yxO{ z*^SX8H*D`1pU&H3Q>`@HaWHC6_8rQ7r=!^ea)(OgF3QlGmHYELm)F|LPx7Eec?OOy zeABgR`XsvJ;P~u;X3nWisaccr=Q;NQ zyuZ1>49D-`cwOIn=l)XvkMY~=_+-|an~l=6dBFwcL9=*-AI$GNW+$hMhMt*D#^iCh=7MUpnoTY?#ko?C z-{D>AG0(e_gKGN{V-EZQrZnQ6^%xyoB8 zH_ZFHd6(la@_rjHX{Yb<-Wl^(W$n3%*~Mdis<}_i%yh=QTu1(7tVwyZeQZWMgQLax zj}DIAkR=QytG>CCbH6WgW4UkVFPfdrCZ}hcv#n-2e#3a0HRD6g-_B-QSI>+yaQM1? zU}k*kdifMJC!(4C*$ks8-q^{_XVo zQMzz!Mz{Ic^z6*YqOaQHzn$st+6zwG*&MmGvAJ>r*LXee(hqOoT?+S|D1~=6`R#rD zc4FVTcXGU*51r2b6jN7WHvP$ ziPUY*WV3TKQ*>W6)htHw+*Eesbe7C!>BKSWwPL{Ws7xxV{(9<}QP1Zv;HBQjaHy~> z%t_qv>imbD9tsQ!~WNS_>u z9G1S5KPfA+;ACE%IeiMBPvs?Jr}?-iG(|VKbGVpy@-A!1-HNvMEq`)eQ$Fz5`MvWldXIc=@{+&K_nmk7{a4&0YNH$JNnR}dJDdBqPh|OQ^TG?8 zGvoUY%$~Dvq}h~j_+{VuBgL2Unb*2Pmv}DkBDY@7yIl8Gyr)^4<**PR(Nx-Ox8`P& ztl6FzPnZ}7q8l>S2bl*587@DyfA&E8eUx)3{~x^noY%1#151~KUvaPg@h`fO{7L(s z#p}Mjn!K*qy<1&%)fHD=x9h6Q_gudFic8c**F5~{t9D(ikV_-Qv){_Q^v{cUm;QfQ z`TnZ%``gR+1~qNh1e_>Ah&GmrD0%YSIBV}rHjzc`tU1w&(gn|buj%4T`}9t1 zSm{%F9+7E>sVK`^uYQL)Z|MWIXHhNIQlhEPjI=s9M}xIy(o7aMG@q%nXPYq-V|J!B zCA!e;0ckmDOeRXZd*)j1(rsv&%Kf)FOyTasFD|qF9Bn6bWY{QeC~KX;OYD!%_ZZ?8 zi*h}0~+U*;>i%k7b-bD_{ck(Bn$@*JC{4P27l;a8+bOiIa;&UxoiKIUR zUj6q87aapabY;U@Y?B9Z{xC1O_JeuJwL8Zb@_Bq}Hk+A>CJLQ$C%O{HXisxf^d(xD z7*L{Ft;KYZYj?)vHa?5hTpH=K2V`iJs(-L~b4AwU->0ucPL89yO|?;}WgVK1X0B%@ zMzdL^bKZ+MPu6x>H+w%fsU5Rbs@l_oE6?HDvQ~7;zJRhDIWAUK(FXTtQ`rocr`-6H z=Q1X{RIRz^lAXS(uooARQIEO>VP*c78`@|>M}y^V847wR0ppJTC2wqAA3 z-mAwh+I8_G^#W-0wKoPZv#0-|XT>NUN5F|m(KC+sah>;X*<9JiduQyvnPYj@U-FXm z>mj^k9&lS?d@GfQ@!G}fB3^QQF|SK_rO|BEoStck$(eRqfmKMJzj*xKfDqIsDM6b( z$8XlU+H1Li=w-bQrOs)ym1~%zB@(pRY8NB5H7%VehLLXNnYn3t>)^~d{VJBOpcs^# zL;nGn8c&;2x6bGBDR2}SXmlE*y?3dDt+|P`8DnK%Pa|OrH#_1cyOH79j%Ql@(3~Eh zX2hhJsj}wIHlrJm^)gdBUrG@G~9 zzOggjD(C69C?|UKH2osFbLaT+C|CEB>$PSk1#6fox}<^%)*UCi`TTHRm+~6zyLgGB zjgGRA?K+{byY66Oi#+HYe}iKgcb(&BGl!df$4}#UYv1u4#}Di~e(Iv*{fo*UD9e{P z2?GVOK!Z0U8MNuR?xik#q;a;{gRLe@PIe=G-W$a2LsQ8PDZzH*u3P5%hiI%ZI6MHOtz+WM6+W|sM#?f4te$mom9vl z(PKnbQ_N6t;i6N?1wEb27i+c{6h!pC{1>nfAk zWNSv`8^W%TqlnoOGAZN)xMEr6-+0&k(i{2H(bRZyeE|zqhEFNR?t8ed$cu|wH$HgR z)S-vaX0k4(vVO>1kUzQi<-D%obtSJy^SX-HUS9HdHLs3-at)ua<#in|>4(SgdMq#b zE7#q#&qj_*RhY!lZ1e21&u?P)Q6IU+t9U<-_qXvb{n2^$V!W(4D$IS$FO>+1w8ZA3 z-Y}tU@8tUOOr3VPorjeBc8*_H9zTxnI%D_oe0~D2{EKMLu0Ai`vxe<#Q8y0?2c*jObU)duepZQd`W;gISEp+Ri4? z>KD!ramI}AV8zf*nVz_2$uKDhgl%0F(;rjzRrJM+QkdG~$9 z1!q*74>;$3!y8UKY3u0b;34ZB^OPOC)`eT{f3bDZ&Vj}Qx1YW7+_T)F(=NTww#)8j zE*ExlWe;w{{YWFxe4Fizg@N^_a!E@(VWrA&m4^DY7B!QxD#?%$O{&5OYDUf3*+Z2p z7i&S4E4sR$JeSszM9@>Fz(2H8456L^d?dgFhq}L@oXQ-j?3M{r=ya89#czoQ&?-D3 zx-GRPJ9}ta>d`Dr0u9J%P3#6nR^ zou|~TD2|^)m5Y1YrnD*O#v$4%o9S!1u7-7YA8;ZXXw*F$^6PUsz8o!y9zE4`#!RNa^*(lMx;<&8Q` zg+pdeESk!$@&iqUH&u5hU`}Q4p~<*~EYK|o`qi4&ov-b+?nzhE`IFJqp(ZnCO5e6E zR#@4^oaB4C$KFxrlt{s)XauK%UqMzki6J&BK#*iLwa#E)ucFR+Bhg+q4Z|UN; z6qPyMe~0eiO6mVXU}`(1l^~lcd&N{PCs5Kti_y~u>8lmICMpa1d5ZDS*Y^lF@D;w= zJvUX@Br=h@4yR%&O)^oU{isnnT2-4thMFuhVvjaM@^LOZgA#EAXJ01HMA0j?GTF|k z1>atY8P-Z#CA6R$s=Q{|`)#qaW-FKU!_?&IYtd`4?qv@OTBqxz=WKbk z?$7c_y>43YbypPXiu8^;Lp+ZrWopV5x$OhQmFSpdv)WJScGscU~S-G z8&Ae%YVr_z-Q(M04r9^EvXk)Y=meM^+P5hF?0bS6=99Bs2lMpS%@wgj51@YuekAvk zKMu8h7L_7Ja|SRq#{1^L3QpH@!7hAQ+)K=t%KG~ke#1wg_>13R!AU)LeaFMzlv$cj zv<@1S6Ps_UEcb(tez>x)GCDfN_hLg_q;XWOJ{2DyH8-n|WHn(r?puR%0En_O!S&?t zL*;cR^ik0clYACTv2)H{oFnbic^{ujvl|6S5jhYG=+NE?WX6hwq-5|hJPVI%aU$Q~ z)8ZPuRnFK}*!Ob34t^vZ-{LjRt0{j^899ICeBPQ*Z9aAT$oBKk8F`$X-x(KA=JONE z2Gt<6bnw*Nq%{0ZTwgFau^B{fGj22t!!#_zHXOq>Ji|8vBQy=uG%eFM9n&>E(>DV% zv<%C%EX%eW%e6eqw*o7)4coLW+qNCswLROn13PpK$8;>dJ z@eWEpZgh0?3EHSAM=4TgfrJuSwXafn@%94$yp4B}6C&dnMwJ-;&Q$Zk7ix5QyL>pO zdGG-8Oa`x*kCeTWGMhN}pLv(sev@~RqMd6L{#Mapg{o3W#%SiygRnK_C)PjVT{X8C zB$RV>jXL!?;he&5-O0Py`WNvobEtFe{&9knLJaC1)3_?NWyDyY=KLn-3odpBug*v+auU)Wyv})ANnpJ&M?Jc#pHr_V;i`p*-e%<&@{qA*teB+^KKlgRUb-(rO z=RE(6GyiGRagV(0m%kd_@zBRVVeHSodCPO3_ktI`<=r3n;3x0+^k4t;x4wOMrLpDs zb4&^$M-FqJK#5B9*1+RSdr$6`k zja$x9d#+2f=f2=Aoczg8fBjqE{^7M?U(cul(@8p7!)-zu}D^`RFG< z^|{Y~?H?|E*@yq;j?aC5&*fKK_n0S+J@a|DzWdML`_Yfz@u{zDIqBrbJ^rUZ`_0|+ z8z-Oq&tKnk+Syox z{tu>F{)G>{NIm}rzqxzw{<**U^qpV$>fe9oH+NT>V_R?jdgJCxhEHz{Zn^30o95r< zZeKrtSN+uCYGX&kX$;k?LxV$GMy@>W_@Qft>Wwo-*42mWL-iWdV?$%0zJ9Q}>BNDZ z^({k#1Dl7g8>$VRxbe!y#q|s7)y9^=<2LMUocVyU=49hZ519X}ft%k|KW*^lU)LWq zbmIDx*PXE8gbhy`92q=q@G(Q@4eTB{zpteZoc1f^UrDA{L)j`pZEta8rU)LprP8PQ`XJ@=>@YJ z=D&Q}hJpFJ2j;)N;rkoww>-D*ue<5-C(OTZc>Xiz2KAA_V0icNhQZnOXVo9uc+9%_ zr=4=f$VuxiYs^1u@NI9{aB{=Ey>Zjm9yqjNU|{}_w%jzi`Nr+%4)W`B8}lEjpI$$1 zV`Z>fBbuhhO)y=&kbweQxx-~3_Y=e7T-F;J@;&VJBCF2CZ|*SzMngG1}Q3m1PZLkE}o8WG~$L=C^$H z@7MXyf5DrFMjrH#eEilIw#L5ygU80Nc;(sKuX*)tx4-@kZ+i0|f8axZIkd?c;vv2#>mjRp@%ikZfscR z)prh@Hq_WKbmbo3-e?bv4v*aQz^g9bK78)AXPj{Iy2~499e44jQ-?+dFC9L6-Q4+yi@0i%C|N??Uni5`uV?n)`xD{aqAaue)#S0 zzd0N_w^7^oz>(b}+XwD*^Sd6GJ+cuFZF!h<^-F&~e9M>5UH7`5-E?2GzNImI({rBL zxPD+`ecjOJKioI}(~(-q*|BRa+UVr*U$DR1}E6L-_NH<(NGXIX?%#G(a)-j|9 z=U?%(uMTglZ>-O5c+3z}rV&v8?ZaCyzv=1?C)Vo&L+ef*8d_K1ICReZXC5$e%iwZi zxD>}@0uX84|7W9{HAW|X36Z^>W5KLt&FLJAUL{y>zg{=D==cVX#fu?)dadVQ1DjEQ z(6G?h-1OLND-*uZ7~0puYl)sCAotT6&B_Y~_Eny6pW7AGdzzx^>l48r5~o_<{542al^Z zeNJx-BdUf*Sci5>;l?m0jMPr6)@mVwp;1FTR?n){NfXTR04G#WsGWq^;B2luTpg;9 z)XpL!dX?np>#Ezicvv4mrVO#`s$5g5!wqY4d`2y#Zk>CaS-rH{sB-D*aP`sE+R%pK zxLRAce(({s)45u;>TjxYzk&7DZR@IeqdG{HYNys3_05fqd>pJESEaq{XV%ZGomG2S ztvWPZt*u{Iy`X-uwzYagy-{0N9jyNYk55g9a{y|RtGB8Pu#Cke{OYOvobhdt2C-3&DxbUR(R@uYHgtU z(%NaqZ>&CW_|)~Ib%STC)y}S7Osm(}ns&IlqiS>AT5W*mKDRbp{k}9>6(wjhGzqTq z&FYH>Ds0a%(AZvYRR4(US86X`|E{WcTu?W;ma1e7IN)!VA| z;S+UhR;wpfHx1PXJ~1qhaI&-{y(4E;Yu}?jgS?+!yJlFvd6KjOzh-s1aiFrUTKfro z%^0XYpL;c`&5`Ycx_1U^^-&tRGDI^}uR5tVBvO%7G|&Hu1+ndZMTyU?s|074V8 zc`#JlK>KjvLd0fQ@CW}MXI`(eA#3s2!)&g-0i2FHXf{VM@9KVPWr za?=0%`+qI)ztRG`-t|2O;1(gG%1Z{Q{8cNz{OZl~m4=|;)gQ{oUo_Z;X-ph#V?cw6 zcF$KIIQH1f!)~yTBcDwFfSa3DPE1#-tSnPbq&ZNm64H zEYg-zL&q=rh3|%k(}_tf2i855io5!wUm|^GcvW=p+AP_2+11;w-gfb}UE3ah^)_ce zj7aM0`*!GiNf^5TP`Q_=k->B#pUJZI&cenPo{VYDw#I~fFs6_E1Gej%p65oX8M=WT zr)tAmO2v7eq%^hZ#8w%bV33KLK_I;uH3qZhYuQcZ#1 zwzth$#zQU>j0e}XtSm{LFwHYiy3DlHmfw{o z^mOT>nhdzn(E=eF6Krf0ie6!_{sL-^cejXB`~@;u%7XEX5Ru>;GDQi!^dVFz&@ zsS~YEGuk|_>1hORtWXoh%`EruGCK~u$VlVZ&MiZoBvZC%df_m6^x5Qi!VJ>yLeqgA zmmviTjwP3%g>&DJB1pk*7FxMFc~R}4)Nxt{Jer!g2<$M=ozPLIJeWHb6T~a#zqhv# z18zRknk)o^?jn5?KMk@d4^7v$jMPx4j&|xPtrhO>5YFsr=74`7j-uF2GShKs5Ib9-8v1C$sjymg!6!KhMxy7Wy*ayfqqcF1rbzfN?^ca%9aXZpD&LY=NJtQ2n-gPY14EoRO^`U9eiLjk! zv;8xXj8faMV%rK0!*?S$h;4Pht2!lJJ*cg4p=8)L=f;TGIXB&=1%#WlrVowjPS@vi z%{&i1E42*MH4Hm*LbcW7n$nbx417oEcaHGmOhcS1R0nsd)W!BvGciIZGVl?^zPf)* zIlq|Pg>Y%I9+KR|;gG5aNXyEzSmQ1CI^n*Wf$oMec@!e7ki?mu zCoHnKH4Glpk8C4Q4_s@>G%_>GF=E@cd|J{{XFr~MdWDGAQfjo&nny<;KGBM!LS!#k zE6THWiAcLD%jNkyt09ja#sQNzNJT8gYWr@k?wExL7rDP=)cs-00}V@+LKN^%pcYb3Ao&xt^1{K4$p2kC6v2sz#G9 zStXab_6q&(>dufo*Z`x&<#At$a0zGZlp{R3R;wvD^(F3=@mAj z8_mo_hp1ze29beSb`3kRtk_eQ9uu7vpD_WIY*eqjqoY`s=s_!t--1RcjnL5oB0Eg{ z)J+M&G14Sf_QR>t8dfKotF%XvUDPoQGpgphp_O_lnSpY~q{DpOVSVEkf=E7oV^_yp zTG5rHRubo?8=A<1(9bQTklP)-{ut`EHm1j->G82*-N@X?bW_e}!DPM%%DYaUtZ1}t zSMA;gTTb8ox}|l{L#sPpOrsbuq7d?=3HC=|M26!UQJA`(LOOSvY@w>*OwY9sP$CY) zII&}cMV#9Bt_p@bjTc@(Sv>_ki5REqtd8B)AaSFBb;-jsoJK*EsGXN`x*jkd_64gj zO22;ZDE&(M)^v(Y8Dju;*+d)Rd%!jmY8;wYl*eYky7Hi-y^yg0Wr{MlaWB)+qB9B2#` zow$kpQx8eGYPs&|;Umi?$_-1VC=X%?JX+}JOFOSMjWkG!u0ZGIUuh6W4yEe|J+osw zjUvm*5+?gYAJJ(~zeHF~s~>7LU37%$1BAn)lM*JBVqCVapOb6hgZJ^F`v!|t7@47Z zSVubA*mC|D)cmoQ*sT`cd)JPlFi0ri#%k9SxamDz%8Dt<<^9x(4KHwvh_yLpHNWUy zy}aQ@1nI@O5eK>FTcNtRt5$i1CStmaG!c6;k_PfKFSmk-pgxqDJaW|~GEWL=r`05{ z-~p6xlt348VY! zDL0qQx)9_hWRm&tPZAqrJ;c&u{ZNn8qK3vSS8wlX9e`FY_UPAkkfjl;Ek(>+T_z^J zzFB8#gk4{-tLHK|p_9DaiDL_EILK^YJxU8@Zqii^%hi?+kW<^|e499c^p5Gdg;8tB^p_1tDlg@jX|}Q^)f2 zIEi@FBo7RA<&9i1?9;FMZK+;R#;7bYQ({LKYv@ItD3KM0KzUl<5QqR?65q?A{J3Tq zMe5Ohr-heW{Soj)duhu%@*^j9yf_QcRFX(t^&ko^RIe;U;;F%FaNCbbv%OcA% z5p~#&5v(9j?G=%?mIdB{Dr%<_Mm0r-veTv^=IKv`f zCpVqU4SgrfxX^FaK?WXE$CP=jXmQT?qE;Q4M5Z-@LHF&PJV;+Z+R&;{ zM&b;~4=xd@$BE!Cu8;EKO-46jd`oi~DN;F1P-G1j2v$_2{VPhLrtR zP#-apuaxe*GCCx|^GnB>E{?9UYDvd8QI;g>Pa|5clXtEWTxo~I1knw z6A4TxitRYg)V{+O-Xj*a%Xlt^GA2-JBdl$oxpqO~q-ZW=hOYnF@xBMAc)zqnd9 zY)=6)jbgdzfr)yAv2sAcWR&d&g6hJas7<4zMNH~wCu~KUN%weX6lxu4iJC9Eji^|3 zm=h#S$`oRt8M&sPspPBzKnB-N#->}-a}#)*#yA3+7QT6UlrzooAuO^)dv*|FrbQ|{ zpXV&LclWO`&GXB!k4mWXP}L-1^p58Q|*_rCqvgXdeYf6 z3o8_DId7Rpv6}7Svm^3vRmC9obJS`ByeP;l7?tY4!#ZQ{aJsdRaw8xoj|QVN0rtY4 zL%A?fW5AYxv6WE!5IA1VK1$kiMOU5CLxW{4B0^WIFcSoHh}P()uI+dxUIeVI z93Q~k{}KH|^JY;P=6+%sE^4Z};s1zgp@uWVBNukLpW0cV4$8367=wA4v?zf<7$?kJ z?FSLrKpP{caScXE>>|~2$5c0poGu1i*TYy~K4bgmq8SbE!W>Tn=53n#mWP6KX!SA- z0$A_1k4M8v4b0}>?)Vt28PJRg2;V5{fYyk0Y6&DD1Hg|0a@&cU0fM{Xs;B(EOwh2H zpM_Sa&3?@nA053)XyY>Zy1Ls^?Wtc)*(0=ZJy{nb`!X{_&Gj7vEutch9Yhu0>ZTV1w;q`G0fP;jTHq6&NfyJ_0)q>`(vmGmOi^YaxyPPhl{}*9SrK< zy;eH40Og8i!!R1vKFY)5hKqcMNyzeVf=(wn(GIqyes6uB%V56xknYfNQ3b$!ERaoXO_Q!|fe1+&6dE-k&>;vcu7uCSOhR>2b^VxFYy=6A!Q7)_50O+>zP}Qw?Z+%v|+%F z^2`TsvfU_he9Q53^^Crr@rs~+)4I5IP`c(K-8F{p8VTN$368n$d0Yf!H%fC{-G5Nk zsP3x1?xoYMFs_#1&mn#;KgR<{La00ref7-h^|Xaw4AF8`?SwKhua^)UmfqdWXoHG{Wq$)pM(RIH_FKwNP5c-RLoQMAV?S z*qM!3u~5VvoU*ohUUf%#!$lq)hj3NFB162SOg9Ta1&=(&%dJ)I`4U;MCSRu`z$+KR z9pn<#lt+@SD=~8Q{OSR2T>`eE^Duw=`-UbS9qqStN{E=Kv+N+&BAU-0q=JY~L`0y6 zVeyn9G#fw3y&y>5Rk4PZ# zHR7*@sq(_A7)Og%zvcKf7$Gx<1OdrrZV*|PV2TP3fhWoJ13Zg=SnZ($04V}D7JLfV zuv`bsEKf4@H5`2}sxAOa3P`X-&!{yQM?p=oIJpA?IQA3u;_5Wj3<@-(cs_Ab-~?(D z^p_PF$r1xyx^S%|8Uu5~470$)ofvdJX{K!1-+b;WPRkA*yC8VL zttS7p^skG0i!o><9uSsio9dO-L8cMw*{iBuYi1?X-ECcuzlW>fFmfV4_mKR7pSgj0 z^$`@t2a1C@#r=*wXL*5oP2YkEy5&kww@WWtx7W*|Cw}KEN^f@ux9AQCo6^({vF8OT z`cRrVUgBlywbedgskqSE84fFX(Idhm+=ttQD88*L8NI^QZJI>E%}rz-iW`tl z>c)NyOmF*9W~4IImIad)872abAuPg);-@|mTxO;{XMDRLbIww-xqk_9Qg z(>EOPg^C#*TBhSgz^ph_ti-g{AL(}OU%i|IAmhC?O2D-sF!LM}Aq(7Gy|MaOne)=q zHcNGom#F}}-BZGc!5@z>*S?(|L*RxY0ud~yLx0OFbvF!OOy#U>h= zdX;{rqWB^dMl+6><{b#e=C&ceUCdeo=WwXrTJ5@amU>%Ei`dSt?}ggi&`^b{hOf+a z@j|P&RWDlGa^?3{DpW#Zemx*OL}-BETx3n4#WL?NEjKF+YdIdJ_NvbCYq=A{516NB>hk zFkH({Gxbj08_V!o%%E@1iT;5+KdoLP zeSQ>th6OrB7&9305L$r=bWFp)r?_sR;_Eee?}C)UD=p58Ohkut^mdLGj8ioOv{!$2 zPwUG{NN0g1=fWjp-r?_dZ1v}T3lwV7D(;=j$PYVnDaL-khi5zxowL*h?HqPo=0GKc zapBvkdhZe4;F@Xj0v+}SOb|S#xGgNQ_2*ft-dAnYll??!!TB})WOTGJMzq$d=}kDL zI(GC5J)sNA11;b=8Ke^cOb=4*xHz+2^?oh!N^wQoqNa5ivf8CECRP^&uUWAhY$JzD zgBOzS^zdk@4;+;mSgb}KR9hxXNOl7pK&GiasIAIkN$7OpBE7Ou40JOr--Wi-*N0RS z>ZJh=jP+{c4E)d$-C_AYTyTd7RoqFzI7w#=@EoWQS2aPgaQpO(opOVi(JR_}7urL8 zDpSu%MyC}NO;Ap1k3AxEW-Lnek?IvP+x22}c&!qVQ*5YF5K=V_m>$eLFDC0U^ky4t z8#>fSyBd+{JSsXAXM43gq?#po#M**u!ptEA0}NtaeynaG84 zD5~iTK-eXLm2fIrq>p}^8%_*TY53}|s+aKOD=Sg~)a_IZO3^^FbPOwlv7IOQ@L+SW zmLXX%13z7T9G6+_FbunF4$~;KhcSlDs*Xa>&HWIXKSpbUIv%UPt`5_@8l3w~^%iMD z4fg?Vc*S%N3VuqrzskAZasKXV3mq9LzLJR{123?`uyz`i!Z9N54nX^i@t>PxhT%j`$cA#i}kw5G-YT_;9Ii3Y|SJ#m=j zW{EqyoCk890^J2#)+lf9BJym!I$rApEjBl>o&)UOI8M~(^av=%{<7e)uc0AXoH|vd zK`>YCJc4dvhH#wCSbbirRx4ko0GPN6g%hT9%90Gd4cB36symO!VC%TxxDsyM2=;Ic zWa2@f@YNTp&(!T~l+<#~0$AdyxVk0n)3ubB3XY@lRiwZXxs7g*495>>s=uv<3ny2& zOMHfV@V5yhkJqi0=itXY2pA^TIbbJ_JYh_!ztceJiW9RWkzq>tDAFLrQD3ZT z?py&-X=U0#`C3ez42OM#h_Ay(r& z!2Stjr3eRmmg1-Qa&-_n#Cr9WBQ;Q*98=BAT)ZeTVjxgoEuiq?(MpM2z8yhC0@c=q zq|M_{2*ojuXb@yr!hgTUIu=>zxq^cw_W{1!zJlDk*@>;)B=FR5q<{O0&v2IfQ-WuE%S>PwfAqo%Q}7T6U#M=VIo z{-F}AA%M>MUBppOw5A^6S~hdn@ZepVhWe)hZ7xLm@)uZwuof-|k`d-YDC14;0nee3 z-o)<#FSs65g`A{evHEA-O>0o@%20w;mnPC zsJp5XOS^`LFg@+u@2aUfd?0ol+&^$(V0k9M@#-6T3HSPZq+%2?<>hVfENwZ1H>h8V z=+(4qIq4SH#uMW$aiLz4RL!)Z21Wp@-_#nGe^{w3GI>vWqg<%}HpLpJEs@0>L}>}Y z0Ahrpxteya{$-(t8g_DpwoMPO$Jh;~C@?yey+|uJgtS2v8fG&VZWOC;^#p*;;v94r zJa6&ZT*}`h0mT$|LXcq|`=R=_mXr&0+@KH_I*<2QkzrX{2#N1{_+Rq`FFW3df9+L$ zCHT_^mTHqWgyN9A@Ja|Q1%Cz>vHDI=k?RNIED4a1y>8&DmZ^vVPw7nNBbUKpiJy{K zOcY_=Pv6zR*5SpAebF2oq#m0GpD(HK+|cpS1Z={V{;ewfm11Nr4A4MZ=*EI}byMoW z424XGy2qMB;Ek>RT^mcf9i=C@ECB^D6vo&wPg95zfF~O~!pQ&*Q-X58*KgF9VgrBH z$_%1nTxrRn83zP43oC)ti+UjHVaQNiKu17`8Zg)*{F)%VL8Sge`;fHO=XO@wg+X0N z1HzCJoQ95PN1zY?*-=pn38!a~_R}peUFn~tlVC|@rKWw)(a*-%EvlqUC6R>s0rjYh zVG?AZ+g=Rm$W-6gBfjXWrF;r=DKHTP8J!UT_6sQ&*5eQQT-?iCVTsSh5Kufag; z=XA&Cf|BB>f*|dqy)iNIR$1ytt6!fU#`A$4nXtA(n^Hes`TAsjG-B`=_yokXXRi8* z*7J&5ESxKW1T)E^PQMYK5rXWYj1dJyaGLsQ^(kG|QY)*a1AmbTv}C|67~TDloMsrK z6T3x-?SfHHpe58cRP|8cEX!3t>r?i%v@xw+Gi4qGnKF8^wkLEV1Xm)QJ$%*<0a2vH zR6o}(T1;)EdQV1|BAUl_0h1C)Q9zjz$nL8D(SFyWOxG#q6}Hr(N9O1LAY3MhIL9^F zLQklUpG>~h1nB|*0wBg2Ejc{!s%c>4XEmTyATST~X3OCdlJVc2f20)gRU) z_+E4yvZE4RgfILz+OOpH8?<_n?yk8@<=2W92fRxMuMiOl(8F0y)!jX$zAvN|G(y5H zitM!Hv>?8Xr;)_1WW2~=wMw*xr{-&2Zh6VEF!UT@{XoD=N-ez>Qk3YMh_E;}Wr8t4 z4Ruqk>-Q~-TKz@!(%C5-crdcbkwUwWDV8wyn`^%%a^*-`q)=;?_}P;nC*A`S8!DMW z2(fxvO?WfCNwd3?AYp-T0YfhYhV>jsH&K*^>Xw?gNBU(P4k;}jd3Z8J;7q}`B3=s; zqOG1@>k;~qJ655sb>|mf$zo#Dew22w&5&X600dHo&i(tfo=k! zz%WqHsog8?D+9HMnTB=gnb1l@_1t^uy3mb~!IHI^;00W)&#MV%Q#4Uwipd~sm*zv? zfGi`i3lB{Ha#kvUx&w8@j%Z5Pb@ZVHlZJpxgM=Co;>jP8__4aR)?xV(Z$Ep$zmk7Y zdEK!xx;Q~=Cs3b=4CpMTlc?v{Iut}*z>xwtL%L~o7&-w?5yXW=ix@=gyXpn^QnR60 z`k6t}hYZo2nd*i2&UHb5gaDrVK=%Zyo9Yks06mOC&ZD7I!aXo8pTyg)dQt648PbJ8 zxy%CCMHPgGCf##Qr+XYh9BDK!LvQeiii%0ook0PJ3+HBeqFz!H%6u^c5AX2twGAVHsP@*es)%feog@awfFKyNc-!iw_g-Dea*iJx zU%3~OxyQ2A%W99LuDUZyk+C2M1%O|ytX>dG&ksONO_a|_(xZnkR4};I%kRmTwxv}n2Mc?ZhGJ<1mP$R74OE$2zIts>InV{2 zLN!=eu=KP91}P_CCVFX#(o80S+g7b8UI7)jmT8M$a4uo;g0Hc zs}>=O312wm268lDibU%5s~5q=>0Ka)K?GgE{4Dm$EDy)*gU;)SCbqLSPf+SUM ztx4i5y($vDVf3Om7_S);Ehayik2}PHs-)glyG}$}fio0gQA@;QR|ktuM5Jn1R&HYApM zSM5nOP^qxogS&{mt}SYTvP;ndxi<6IN+Kb+9VOgW@2+*pUm}-qqU%5pcabYl`V)hc zMhQ}%y)xiDWTd`|2m<(%wO^rt)bVH&A7mhmLDoIsw?D0o^aA4FQC9iY#4e;mGxecuHUZ;nC#bNz%|lhkW1a>Qb2F)dKg#s3xVIdVftv-ISB{ zvMYftcrBT)g*vl{`$aY-;vaIXd2A?F0`-BK#5g!*3XQ`>^)E3!Lx42{lmH)Q5JPEJ zAFTDFiEM~T7!O^Kcy4+}V@p?#* z1PW>qOtlmfWwj<56Ee>vzL`0tKBhCJu3=bf$V*QR5&)9sfr#ypAYUJI`r|c8E8`Xk zxQ;~EU7n7{ihvLg;UWdl_)JgzMXehbUdHP#eK0dNv2Or;3EfFkBUPX1sZM2~!pqoG zh6@2>kQ4$H4a1rSAxua8rPeVuPOkGV^;_1fde_K!=)+YYH4_Pp0!Gv)@3Cn?@b6CUBHJ8But-Jk#HNHF;o7Y1?z_zn#B44s2TC{v%RT`k?(hyAmF;-rXX)Zy}o zEt>Ge0kPDQ*d=8ZAQPDStC|pS${a^Mm%`#C2Wt~2UO={#lq>?4he1r-+oyX{(3F5R zEUxx=(l$-)?<<_nOg}UfVHD>QoCm1ns=qE2fTN(yE=mCgSr+=H6G0(28O5>s%+U)t za;2d%;=zH84xa9)&mJv`gWz^_!Y~si0oIiIo1?E4`Y0EJX^Z{_!!cK%t4aEhuED+1 zq7JIwmL=T>lENt^oGhH08HAi(`2~Fz>fD)lHYHqWBAT8qJc0P$Nv;qQW11811R{0k z(YA^$v`4~0@T-c(XsIvMp30N-XZ+DHuHIC*KMl*G^eYJ5B7w=0L0j_v2ytC54~w6M zxeYg+R4Vwo7%P8U>vH`M=UJsm#ItHZk&|?waCgyh$iwn?t1aco>&zfEhw0aT-Xn+K)tFIj9TuDnSnQ$H0@UTbJSM{>gFKBvo1SDJf zWQV6_kV8oF`Lb4ofrE2P{e4Z6D=%6)m#o1{lnyj+*Y=TH(BKK?veegVHw(cfEY{DS zL|om;xe$`iGi?@7|L|e32j|&@}<(Ga1|X+>K2AV{M!} zl&Oi=s3t7;gc{nHC+ZC_V($||C$M_~wNiq2|4FM1vWUAnY|wOJyXu?~#M9{%2jF17 z18B&iYGp9cf1Mkutkw=g+pxg z0vn6W3!RR#CS-y`RM4?YR>o3gkRST4ny`P%OiRVID|T}wtdq^_FNWpTKdcv?akXq( zJf%00)U8JnG4@{OHen(G2Pk!*wj1W?yWg+liXPn33=iqSnx+S=7|OA4zEo4{{n9cN2ICeW zhjRF%VT!5$sBIh@n@J~NMC&2^pEaG`e{%Z!+G;8k6|B=0^L|@}vPd#4^3h7Sqr~Pp z3Nl%QJc}Uz9~?pT04;nnl%U0-%t?m!A8PnsWYco-rmM~-yjf5iQXCE;{u%hp|5ej5 z?}hv+?^4}lLw;WBBX`(4vK{q=SP$L=U!wjAY^g24`$GwhOam+epq<4-;BDoXe zl@NdMZ1s~ukJR@3VZbSk)-Ui=km-v|btJqblP{4dw)$xwGQgD%!_HfJF~ksrElg{J z^n8+q@@GfzOz2r4h%eb(SVgoiy~1Jl&uN?#qi<< zaHR>^|Fwpcx-GGiZR6_wRk?FUmN0VL;=#e|LxO4b8{L$h6tT;IWouldNli*J4d|~K zOa{Rz?yg--Q}&Qco1B)b3XeDvAeL0&KBRZUiqw34(N*BUuX+`HauJkJwh;E{9>Y>M z)dithJco5eE~-+YWdP8zn+TkljI1$P>ZqIRk{nPsZI3wPYKw`6L?J=?07#gUcnwy- z)9R9kLGB^hp!)m?t5%n!hcN1hJ^;zZGnuJd>f1Yamed0_${2}>MbeY1pX?_RbwUzr zdQv^TF6mr~{+CmW)8N69{D#aIkU*iYWa{_p;*#wSlQmBmQYvVAF90qpL3Q&qlqds6}uA`>}i##&Q|r9}t9Wl5+&g5sL>I5B{JoL^3ED2!PG>uq6@^_J8XrV}0vj7vKzr+O6$0_@U5V(U8;3gHx&{V-lt7xG}Yg_Z_Opm-TU z3e`z=c9CG}SJ$^_Z*7qTo1`ExV_&1MQp$}&M3wmoO2%gvvr`h_FhsV91e~dQZC$&l zv}`==%wHR#0bHCx$ddi794~}dciX*teRzu)@#1epUK04NZeOk40Cf{m#)&%sD(cGEU<0K`3XmwL$#A>$O(YXP3Gi*dxbvPqtTB*rc#?0f^pE*KE?&J)etJ5lEo6 z$!v8WB<{SU#UGu=5ooD2xMagIBzrfK8AXuUe`-_u@I_7dKq$lF5L%Zsl}?% zUoy54G(U4l)~+%Osz#}~AsCs5F+p}J>@q_A)tip-4P{@SP*U}#31lnwWP0;4z9GCl zy$L4td6>>A?4jPGvZ6JugZB$pDn=J^@D`aVoFH&W-tpFZtog*43NFO$)BvTWE!5iz zOGD7PMX4!}0ARfvyg{^(#RCc;jBCAkMH@T zWrBv1Yytd&>6fZ^)O-0yS-Fl(=V!0GQs?j1Sukx2w+lPu0c?hedS_i6y4_|tq8s#@ zf-INVwe0igXi`Y1-c@HiQi0pFbS;CK-reh`#nEQ2-kgLPMR*Xa3Ak$pD-h3$`jfh5 zCu`_+!LDN-S$~Vvh$N9hy;_A^YwsrRo|0*+Bao)I18l2r&%7O2Zs45NUQI^})JCt1P!rgm0xY!6qBnKmyl={#y z7JL$~MnoKV8F~uY{?vzy&3_A9TjQOVx27-C8*ue69Qqf&mery!W(f!ze8uCj*+>!n zLw#h`=3+w))KQ{CNiv4=qdr>Cy8}*#B9+M%7g?&sGPfXBNeqtuz%dO8bhi)`i3qU5 z9uQ=jC4;>B*jnXS$H3Fq>o@Ie*;xXP9vjh+J%?zkkJp8tQgroUbuIJ{p;F7%6XR2> zqB!J+j4V}2sc%KeY95+AP`gq9}f;Qa=)q1)CHF> zRD*?{F*2C3IrP}9?61RWO4d;qlL1&xcIHWa_1StS8RHTML#aS__OB)6kNk}!mBh`6 zr^Hu((?yM!6m>hf$;g9Fu2hz8n1Jjx>!{DwyEIp@;F*=e^eq;BQUDSioftUYLiPE& zruGzW)k1D+jekiX`Vz!O^XAJWdL2xGNukenuUz7S$y^qUJefn3-a=}_A-PJOz4hVgT_F>*UVR^OPL>}Fvdid#DerX_?r4^U1CkUO7~&#sGb)pV}HaL!jlA3 z(NBr`dp$kH_o3}DAJ{b|lEJ^Yc=zDPjpwqj7;}@@CK6W@?VHN}&0o`4mXz%ISWI-X z{gR+UhbS}M^}O~ny#IIyB!#BssDJ2A&c1>~dUp%T!xH{Yyocz@j_eDr{&6)$hbF-l z0pShiHTl#%^-o$E*Ui(rPw`1IuyGTd<|cZS$qup!Zf{cJXjQT+tGc=ULQRCYY`o3J zjh)PX3`h_qHhQ4A$z9dgd)S^N2JE8%7=@slpuF4_$>FgztSdf9Fe!CcU6Qr;p(CBV z`95(vfIvV_Q1Tf->Ki?)SymU*A|uOV$?#AlbCy+Mf%6zpoBU+hCv5Bt$0t+YT+u%1 z;4xGP=qbWBA;t&LNBv75io!Tt$xFG^*-RuH4q6hX26`*ZNPVlWx&1OvSAkELUMxp@ zh3i9>7fdeG^VGMGv?Xwx0I87ylvKZQuKu+y2?e@6Ev+eg1RidSzA{LlUke^zkew4| zHXiaAm6gr1Sc%kkj*Yq+vTYaW9o%H@gu$i0TbD?at{~`cPS0lExOQx?d|Ay{>*;^+ zVv_U(>OWSKCamn(9b|qZ7y%V8RR6hJ2?7@c#AMS$NXR6uP~TszL>$FJ!Zz`2Sh#&n z^@G()NOD&AWN@frNmy;FAL{kFmtxY@3A@?&rn67zZplro_f==fGh$FU6V8N)BWwF228JxJ7@xhR!y@SoTm8oDSP>&@Gxgs+rJ}UH7X;usqIe+ha$H;{hzHr* zU^%&_`q2^I*dy?n%{XxIBjdrF)Q{`umI5>Aq#No2$^m);yWTS9i_Lx1Pu5mT8pU9P z1_{>$`9<~l>ESi-Vx9oOkWQJTHq-5%6J#YP*;G9M55`r<1)40&!U@>B2_45K> zEL_qBD6srq6$>nN`mJl1+ioU#L>ZXmxe$r|Kbq~J`+ZGS?2Q1@oDypRmLMKrcjt~bJHy`KZT4f-+chtG zfMvD(a(ZbEwgalHU^|FW&`Z-PeXCQrtO{$eJ)F&ygI!2wGh(yU-NzX0V$OkX`mEC8 zJ;7@^-{^){E!9`bgwMWD>b4AjGu9s=; zdV1r?wS5wFu%8MX6*z08Sqaqduc5WbKokoz4)P*e43v;(G`i`4z*ca`hu2KCA#-2M zXBnFsw<~)S0naX>Bzfbh(H~;<2aQ$SvM&34Nq`k5HR>4zrDv{Ig1~)pYk&wcVo-x@ z^{mD*fd#F=OAUk;JC3mZU+Ac3uU0eRdg6B>2?6P_NU5Qovswufy4&o|Kwb|rd@y&^ zb5|=t#IHv>Np67$#-@dzw^|7TV@OEIjzOeKBpxYMw>C7bw+O$>C+0Hv>SOKndbaZ% zpBf!ynb|LUHTAZ~?6=DT#MMjKWw~Q=S(*Hf)bZTyTJbG zZwqW+vV$IKkCEnPvPIJgl&!aXmU*${*Z%ah2|Wj1-Wb-*kXCE*6^)IWFh<&UeVbP{`m*no z3JP*i(ksyz2ahCvmAn>7f?pe%VUoNvSFdX5-5iQZv-H}Jnwve6%R^AXi~|lA=bdcB z`Rc~u)2Gq9tgz$)gWdx164E?GUPHa6A&fw`zgEB-gasWzsIJ8tCY$n-Y0o7|Q>^84%yT_L#`ZP;Pae_CJKps}U+wbuu9r(VGVA#tdL>C~_ z%Ig~4^l~f3VS=%U%bmVpU$)dkDS}FeK`Z)nJtFM`wI)Mifh;2mhld3m14j!}nmpRms z3^H?o`S4AXVg*V#u2A)+hR`k+Y<#O{PB(91|5{Sacl~=edBLK%N4CA?(X4=QA=w|1 zv^|YY7&vqAx662>w=|A27avqq0*SJ~BKjGcm#5y^xQChY3TXn9iY?DzvSVJeUty@; z)>s_+UxdzfHYi!*Bhf9Q@mG=N<#tJM1yQja2=(OWfajs!-grfgwgxlS7MNaoGZ9du zqp}n)vdETji;rlXS(r~RJv61evHzAG(HNI`i6^6(>qVp5n@y#hyyWXcQ+oeVc|f)+ zWpV9fiSJy<*jDcNzVt4XA&fa|Co|*Iv*RtvFhhPS@`4crj5`KE*HnLe?{p?)WiHG1 z+b}Odl5F*kV<}KNx+Po>20YtBka9AIOsn46IJIv_pp0FPXS%xqz3XTv04AtyLov%? z(;zTC_3p-oa&GCt@h6S@^dFX7q(5yOb&46bpJDfQV0QEo!a_3jo_@_@`2o4YdzW4ET%_aIR5{Q)1yy_b_7aKXu#D^j1(#k3IiNyHgRh_zi5>L zcj}*8|5pi({#IG!`1d{bDm4jDmWZgB4fEc6^dnmKA0QZpU8u>s#&*~0eJd)Qkp#*U zFfRBoIZ`C&PX;zaD(1vg@9!x&iyUdP!onCJr#1A7k4$}3B|Q2ZeQ#1bU{L}aNCHo9pt&{$^NiB`LPC=^@gGWk>*Y8?te0MZ4-Vv_?! zjB@B?jUL%ync`k@U~cMqA$$nlkwG?slov!q_Nfmyy0k30ak&M>qIIj>9aNI9>1{$6 zSV4X9F>reI@7xF<5G*4=hTLPH2Gp^SbajR@|I|kt680kcS$AKX#a>`GlrOdlCdF0) z$_eaEN~4e*PYvymzvsDaP#MK+WaC=GEWAyzr0Zu6w4Sp!n{_kt3u&)AnFk=|WPlYUsszFNnt;!utA~hJ<=)QLs3q zTcI$My+v0S-$`FJ@+Ioi^5zf$R6zj#P5#v_Q%8E zMaA@Bd_ZiLv^;_OyhiHFz2@}--4C}-x5nE7yRm}+?}f750i;*3trlAnrljhG_J&tA zB1NmG?$jc@5In`dW^jP*vDtxFD`mxAUpzfNO@hFgJmh$d9r8GS;TUx?jX|U-`!*Tm zg<+WfZKIo9xQJvts2~Y;0D4FxzoH%tHEV24(L!!>ban*H8_nq#tSFHC4x^f)x_yaDxOx6EBMThsMB|#=5bwi3ESy`56NXuzbqi~5rjs4qfzE^DfOUlc4cQz4=V2+bW$LR zFC5YjmrEeIl6V5gI#~i82x|XQxYi`aQ-6Pkk`+?-FNFw?z`0L~R48gmZU*XGjloGR zRleP52 zsl4S+X6<&gU&f^<`G$`V&SBdIqOR4yHM+Ff#l-^6!7o7x+_oe`V$Uw(<}-rV|GgoR zFLn_WzD#QTXo`TjT~j(>&YwLr4V7OK8sLH_DIMV@_`ldL#Z})s%InY-lHipE8gzl! z-2XVb>tHpoRi%+iJch-#QtCgo?@5MZ|2XJ-0upJ%IyTvHfo)XT&_aE`(b+nozeI1@ z|@$#$zeH zig}!=|7r~A$@AZh2lT-#vQy_co{-+g%VQY>VrJsdj~WB%+~nk;A0J)&A#91tB|#Kw zJe!Gy>L)!P^`hkse12j=%U*Wfz+A&W2vY_a#aBOF&EW?l0e(To_7Frtv2UFESy}C$ zuU69bAWvi@a)aQHxOde5tX9Hc3&#k4rx&HZEQqW}S1@WQ!Kq5b%6^R5oz5BDNYz6~7 z9cyQa=ni9iHT#sUB+?v{$+mUp*4=DQC%VAQANxQP4Qr%G9P^oR$P^s`yzsk2t zb)-5{{KLQeQXa_HwfZ3EZmUx0{?);1y;|EU|5U5PL)D?a!;#)u!+l@Z*A446iqTRT zDHlsVR~H8v)E0#y)Q=NFX&IIvWWdIzzAqpX57Ze$L+d40q3r5)b=qxxqdqjaZg~C3 F{|EfUT2cT2 delta 58710 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 diff --git a/examples/ipfs_node/wasm/ipfs_node/.cargo/config.toml b/examples/ipfs_node/wasm/ipfs_node/.cargo/config.toml deleted file mode 100644 index 6b77899c..00000000 --- a/examples/ipfs_node/wasm/ipfs_node/.cargo/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[build] -target = "wasm32-wasi" diff --git a/examples/ipfs_node/wasm/ipfs_node/Cargo.toml b/examples/ipfs_node/wasm/ipfs_node/Cargo.toml index 3fea3b4c..3b6d4790 100644 --- a/examples/ipfs_node/wasm/ipfs_node/Cargo.toml +++ b/examples/ipfs_node/wasm/ipfs_node/Cargo.toml @@ -5,5 +5,9 @@ authors = ["Fluence Labs"] edition = "2018" [[bin]] -name = "wasm_ipfs_node" +name = "ipfs_node" path = "src/main.rs" + +[dependencies] +fluence = { git = "https://github.com/fluencelabs/rust-sdk", features = ["debug"] } +log = "0.4.8" diff --git a/examples/ipfs_node/wasm/ipfs_node/src/main.rs b/examples/ipfs_node/wasm/ipfs_node/src/main.rs index 53672827..b4bc71bc 100644 --- a/examples/ipfs_node/wasm/ipfs_node/src/main.rs +++ b/examples/ipfs_node/wasm/ipfs_node/src/main.rs @@ -14,63 +14,38 @@ * limitations under the License. */ -#![allow(clippy::missing_safety_doc)] - -mod mem; -mod result; mod path; -use crate::result::{RESULT_PTR, RESULT_SIZE}; use crate::path::to_full_path; +use fluence::fce; +use fluence::WasmLogger; + const RESULT_FILE_PATH: &str = "/tmp/ipfs_rpc_file"; const IPFS_ADDR_ENV_NAME: &str = "IPFS_ADDR"; const TIMEOUT_ENV_NAME: &str = "timeout"; pub fn main() { - let msg = "ipfs_node.main: WASI initialization finished"; - unsafe { - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - } + WasmLogger::init_with_level(log::Level::Info).unwrap(); } -#[no_mangle] -pub unsafe fn put(file_path_ptr: *mut u8, file_path_size: usize) { - let file_path = String::from_raw_parts(file_path_ptr, file_path_size, file_path_size); - - let msg = format!("ipfs_node.put: file path is {}\n", file_path); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); +/// Put file from specified path to IPFS and return its hash. +#[fce] +pub fn put(file_path: String) -> String { + log::info!("put called with file path {}", file_path); let file_path = to_full_path(file_path); let timeout = std::env::var(TIMEOUT_ENV_NAME).unwrap_or_else(|_| "1s".to_string()); let cmd = format!("add --timeout {} -Q {}", timeout, file_path); - let result = ipfs(cmd.as_ptr() as _, cmd.len() as _); - let hash = if result == 0 { - String::from_raw_parts( - *RESULT_PTR.get_mut() as _, - *RESULT_SIZE.get_mut(), - *RESULT_SIZE.get_mut(), - ) - } else { - "host ipfs call failed".to_string() - }; - - let msg = format!("ipfs_node.put: file add with hash is {} \n", hash); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_PTR.get_mut() = hash.as_ptr() as _; - *RESULT_SIZE.get_mut() = hash.len(); - std::mem::forget(hash); + call_ipfs(cmd) } -#[no_mangle] -pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) { - let hash = String::from_raw_parts(hash_ptr, hash_size, hash_size); - - let msg = format!("ipfs_node.get: file hash is {}\n", hash); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); +/// Get file by provided hash from IPFS, saves it to a temporary file and returns a path to it. +#[fce] +pub fn get(hash: String) -> String { + log::info!("get called with hash {}", hash); let result_file_path = to_full_path(RESULT_FILE_PATH); @@ -79,51 +54,39 @@ pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) { "get --timeout {} -o {} {}", timeout, result_file_path, hash ); - let _result = ipfs(cmd.as_ptr() as _, cmd.len() as _); - let _output = String::from_raw_parts( - *RESULT_PTR.get_mut() as _, - *RESULT_SIZE.get_mut(), - *RESULT_SIZE.get_mut(), - ); + call_ipfs(cmd); - // TODO: check output - - let file_path = RESULT_FILE_PATH.to_string(); - let msg = format!("ipfs_node.get: file path is {}", file_path); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_PTR.get_mut() = file_path.as_ptr() as _; - *RESULT_SIZE.get_mut() = file_path.len(); - std::mem::forget(file_path); + RESULT_FILE_PATH.to_string() } -#[no_mangle] -pub unsafe fn get_address() { - let msg = "ipfs_node.get_address".to_string(); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - let ipfs_address = match std::env::var(IPFS_ADDR_ENV_NAME) { +#[fce] +pub fn get_address() -> String { + match std::env::var(IPFS_ADDR_ENV_NAME) { Ok(addr) => addr, Err(e) => format!( "getting {} env variable failed with error {:?}", IPFS_ADDR_ENV_NAME, e ), - }; + } +} - let msg = format!("ipfs_node.get_address: node address is {} \n", ipfs_address); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_PTR.get_mut() = ipfs_address.as_ptr() as _; - *RESULT_SIZE.get_mut() = ipfs_address.len(); - std::mem::forget(ipfs_address); +fn call_ipfs(cmd: String) -> String { + unsafe { + // TODO: better error handling + match ipfs(cmd.as_ptr() as _, cmd.len() as _) { + 0 => String::from_raw_parts( + fluence::internal::get_result_ptr() as _, + fluence::internal::get_result_size(), + fluence::internal::get_result_size(), + ), + _ => "host ipfs call failed".to_string(), + } + } } #[link(wasm_import_module = "host")] extern "C" { - /// Writes a byte string of size bytes that starts from ptr to a logger. - fn log_utf8_string(ptr: i32, size: i32); - /// Put a file to ipfs, returns ipfs hash of the file. fn ipfs(ptr: i32, size: i32) -> i32; } diff --git a/examples/ipfs_node/wasm/ipfs_node/src/mem.rs b/examples/ipfs_node/wasm/ipfs_node/src/mem.rs deleted file mode 100644 index 70172235..00000000 --- a/examples/ipfs_node/wasm/ipfs_node/src/mem.rs +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::log_utf8_string; -use std::alloc::{alloc as global_alloc, dealloc as global_dealloc, Layout}; -use std::ptr::NonNull; - -/// Allocates memory area of specified size and returns its address. -#[no_mangle] -pub unsafe fn allocate(size: usize) -> NonNull { - let layout: Layout = Layout::from_size_align(size, std::mem::align_of::()).unwrap(); - - let msg = format!("ipfs_node.allocate: {}\n", size); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - NonNull::new_unchecked(global_alloc(layout)) -} - -/// Deallocates memory area for provided memory pointer and size. -#[no_mangle] -pub unsafe fn deallocate(ptr: NonNull, size: usize) { - let layout = Layout::from_size_align(size, std::mem::align_of::()).unwrap(); - - let msg = format!("ipfs_node.deallocate: {:?} {}\n", ptr, size); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - global_dealloc(ptr.as_ptr(), layout); -} diff --git a/examples/ipfs_node/wasm/ipfs_node/src/result.rs b/examples/ipfs_node/wasm/ipfs_node/src/result.rs deleted file mode 100644 index b001df61..00000000 --- a/examples/ipfs_node/wasm/ipfs_node/src/result.rs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::log_utf8_string; -use std::sync::atomic::AtomicUsize; - -pub static mut RESULT_PTR: AtomicUsize = AtomicUsize::new(0); -pub static mut RESULT_SIZE: AtomicUsize = AtomicUsize::new(0); - -#[no_mangle] -pub unsafe fn get_result_ptr() -> usize { - let msg = "ipfs_node.get_result_ptr\n"; - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_PTR.get_mut() -} - -#[no_mangle] -pub unsafe fn get_result_size() -> usize { - let msg = "ipfs_node.get_result_size\n"; - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_SIZE.get_mut() -} - -#[no_mangle] -pub unsafe fn set_result_ptr(ptr: usize) { - let msg = format!("ipfs_node.set_result_ptr: {}\n", ptr); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_PTR.get_mut() = ptr; -} - -#[no_mangle] -pub unsafe fn set_result_size(size: usize) { - let msg = format!("ipfs_node.set_result_size: {}\n", size); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_SIZE.get_mut() = size; -} diff --git a/examples/ipfs_node/wasm/ipfs_node/wit b/examples/ipfs_node/wasm/ipfs_node/wit deleted file mode 100644 index bc2b1e61..00000000 --- a/examples/ipfs_node/wasm/ipfs_node/wit +++ /dev/null @@ -1,91 +0,0 @@ -;; allocate function type -(@interface type (func (param i32) (result i32))) ;; 0 - -;; deallocate function -(@interface type (func (param i32 i32))) ;; 1 - -;; invoke function -(@interface type (func (param string) (result string))) ;; 2 - -;; result extractor functions -(@interface type (func (result i32))) ;; 3 - -;; result setter functions -(@interface type (func (param string))) ;; 4 - -;; import ipfs put/get function -(@interface type (func (param i32 i32))) ;; 5 - -;; import ipfs put/get function -(@interface type (func (param string) (result string))) ;; 6 - -;; import ipfs put/get function -(@interface type (func (param string) (result string))) ;; 7 - -;; import ipfs put/get function -(@interface type (func (param string) (result string))) ;; 8 - -;; export ipfs.get_address function -(@interface type (func (result string))) ;; 9 - -;; export ipfs.get_address function -(@interface type (func )) ;; 10 - -(@interface export "allocate" (func 0)) ;; 0 -(@interface export "deallocate" (func 1)) ;; 1 -(@interface export "get_result_size" (func 3)) ;; 2 -(@interface export "get_result_ptr" (func 3)) ;; 3 -(@interface export "set_result_size" (func 4)) ;; 4 -(@interface export "set_result_ptr" (func 4)) ;; 5 - -(@interface export "put" (func 5)) ;; 6 -(@interface export "get" (func 6)) ;; 7 -(@interface export "get_address" (func 10)) ;; 8 - -;; adapter for export function put -(@interface func (type 7) - arg.get 0 - string.size - call-core 0 ;; call allocate - arg.get 0 - string.lower_memory - call-core 6 ;; call self.put - call-core 3 ;; call get_result_ptr - call-core 2 ;; call get_result_size - string.lift_memory - call-core 3 ;; call get_result_ptr - call-core 2 ;; call get_result_size - call-core 1 ;; call deallocate -) - -;; adapter for export function get -(@interface func (type 8) - arg.get 0 - string.size - call-core 0 ;; call allocate - arg.get 0 - string.lower_memory - call-core 7 ;; call self.get - call-core 3 ;; call get_result_ptr - call-core 2 ;; call get_result_size - string.lift_memory - call-core 3 ;; call get_result_ptr - call-core 2 ;; call get_result_size - call-core 1 ;; call deallocate -) - -;; adapter for export function get_address -(@interface func (type 9) - call-core 8 ;; call self.get - call-core 3 ;; call get_result_ptr - call-core 2 ;; call get_result_size - string.lift_memory - call-core 3 ;; call get_result_ptr - call-core 2 ;; call get_result_size - call-core 1 ;; call deallocate -) - -;; Implementations -(@interface implement (func 5) (func 7)) -(@interface implement (func 6) (func 8)) -(@interface implement (func 10) (func 9)) diff --git a/examples/ipfs_node/wasm/ipfs_rpc/.cargo/config.toml b/examples/ipfs_node/wasm/ipfs_rpc/.cargo/config.toml deleted file mode 100644 index 6b77899c..00000000 --- a/examples/ipfs_node/wasm/ipfs_rpc/.cargo/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[build] -target = "wasm32-wasi" diff --git a/examples/ipfs_node/wasm/ipfs_rpc/Cargo.toml b/examples/ipfs_node/wasm/ipfs_rpc/Cargo.toml index 8755eb6c..fc963554 100644 --- a/examples/ipfs_node/wasm/ipfs_rpc/Cargo.toml +++ b/examples/ipfs_node/wasm/ipfs_rpc/Cargo.toml @@ -5,5 +5,9 @@ authors = ["Fluence Labs"] edition = "2018" [[bin]] -name = "wasm_ipfs_rpc" +name = "ipfs_rpc" path = "src/main.rs" + +[dependencies] +fluence = { git = "https://github.com/fluencelabs/rust-sdk", features = ["debug"] } +log = "0.4.8" diff --git a/examples/ipfs_node/wasm/ipfs_rpc/src/main.rs b/examples/ipfs_node/wasm/ipfs_rpc/src/main.rs index 9da7fe2a..395db17a 100644 --- a/examples/ipfs_node/wasm/ipfs_rpc/src/main.rs +++ b/examples/ipfs_node/wasm/ipfs_rpc/src/main.rs @@ -13,107 +13,54 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#![allow(clippy::missing_safety_doc)] -mod mem; -mod result; +use fluence::fce; +use fluence::WasmLogger; -use crate::result::{RESULT_PTR, RESULT_SIZE}; use std::fs; use std::path::PathBuf; const RPC_TMP_FILEPATH: &str = "/tmp/ipfs_rpc_file"; pub fn main() { - let msg = "ipfs_rpc.main: WASI initialization finished"; - unsafe { - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - } + WasmLogger::init_with_level(log::Level::Info).unwrap(); } -#[no_mangle] -pub unsafe fn invoke(_ptr: *mut u8, _size: usize) { - let msg = "ipfs_rpc.invoke: invoke called\n"; - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - let result = "IPFS_RPC wasm example, it allows to:\ninvoke\nput\nget".to_string(); - - *RESULT_PTR.get_mut() = result.as_ptr() as _; - *RESULT_SIZE.get_mut() = result.len(); - std::mem::forget(result); +#[fce] +pub fn invoke() -> String { + "IPFS_RPC wasm example, it allows to:\ninvoke\nput\nget".to_string() } -#[no_mangle] -pub unsafe fn put(file_content_ptr: *mut u8, file_content_size: usize) { - let file_content = - String::from_raw_parts(file_content_ptr, file_content_size, file_content_size); - - let msg = format!("ipfs_rpc.put: file_content is {}\n", file_content); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); +#[fce] +pub fn put(file_content: Vec) -> String { + log::info!("put called with {:?}", file_content); let rpc_tmp_filepath = RPC_TMP_FILEPATH.to_string(); let r = fs::write(PathBuf::from(rpc_tmp_filepath.clone()), file_content); if let Err(e) = r { - let msg: String = e.to_string(); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); + return format!("file can't be written: {}", e); } - ipfs_put(rpc_tmp_filepath.as_ptr() as _, rpc_tmp_filepath.len() as _); - std::mem::forget(rpc_tmp_filepath); - - let hash = String::from_raw_parts( - *RESULT_PTR.get_mut() as _, - *RESULT_SIZE.get_mut(), - *RESULT_SIZE.get_mut(), - ); - - let msg = format!("ipfs_rpc.put: file add with hash {}\n", hash); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_PTR.get_mut() = hash.as_ptr() as _; - *RESULT_SIZE.get_mut() = hash.len(); - std::mem::forget(hash); + ipfs_put(rpc_tmp_filepath) } -#[no_mangle] -pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) { - let hash = String::from_raw_parts(hash_ptr, hash_size, hash_size); +#[fce] +pub fn get(hash: String) -> Vec { + log::info!("get called with hash: {}", hash); - let msg = format!("ipfs_rpc.get: getting file with hash {}\n", hash); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - ipfs_get(hash.as_ptr() as _, hash.len() as _); - - let file_path = String::from_raw_parts( - *RESULT_PTR.get_mut() as _, - *RESULT_SIZE.get_mut(), - *RESULT_SIZE.get_mut(), - ); - - let msg = format!("ipfs_rpc.get: reading file from {}\n", file_path); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - let file_content = fs::read(file_path).unwrap_or_else(|_| b"error while reading file".to_vec()); - - *RESULT_PTR.get_mut() = file_content.as_ptr() as _; - *RESULT_SIZE.get_mut() = file_content.len(); - std::mem::forget(file_content); -} - -#[link(wasm_import_module = "host")] -extern "C" { - /// Writes a byte string of size bytes that starts from ptr to a logger. - fn log_utf8_string(ptr: i32, size: i32); + let file_path = ipfs_get(hash); + fs::read(file_path).unwrap_or_else(|_| b"error while reading file".to_vec()) } +#[fce] #[link(wasm_import_module = "ipfs_node.wasm")] extern "C" { - /// Put a file to ipfs, returns ipfs hash of the file. + /// Put provided file to ipfs, return ipfs hash of the file. #[link_name = "put"] - fn ipfs_put(ptr: i32, size: i32); + pub fn ipfs_put(file_path: String) -> String; /// Get file from ipfs by hash. #[link_name = "get"] - fn ipfs_get(ptr: i32, size: i32); + pub fn ipfs_get(hash: String) -> String; } diff --git a/examples/ipfs_node/wasm/ipfs_rpc/src/mem.rs b/examples/ipfs_node/wasm/ipfs_rpc/src/mem.rs deleted file mode 100644 index 5c9fdc36..00000000 --- a/examples/ipfs_node/wasm/ipfs_rpc/src/mem.rs +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::log_utf8_string; -use std::alloc::{alloc as global_alloc, dealloc as global_dealloc, Layout}; -use std::ptr::NonNull; - -/// Allocates memory area of specified size and returns its address. -#[no_mangle] -pub unsafe fn allocate(size: usize) -> NonNull { - let layout: Layout = Layout::from_size_align(size, std::mem::align_of::()).unwrap(); - - let msg = format!("ipfs_rpc.allocate: {}\n", size); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - NonNull::new_unchecked(global_alloc(layout)) -} - -/// Deallocates memory area for provided memory pointer and size. -#[no_mangle] -pub unsafe fn deallocate(ptr: NonNull, size: usize) { - let layout = Layout::from_size_align(size, std::mem::align_of::()).unwrap(); - - let msg = format!("ipfs_rpc.deallocate: {:?} {}\n", ptr, size); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - global_dealloc(ptr.as_ptr(), layout); -} diff --git a/examples/ipfs_node/wasm/ipfs_rpc/src/result.rs b/examples/ipfs_node/wasm/ipfs_rpc/src/result.rs deleted file mode 100644 index d954b813..00000000 --- a/examples/ipfs_node/wasm/ipfs_rpc/src/result.rs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::log_utf8_string; -use std::sync::atomic::AtomicUsize; - -pub static mut RESULT_PTR: AtomicUsize = AtomicUsize::new(0); -pub static mut RESULT_SIZE: AtomicUsize = AtomicUsize::new(0); - -#[no_mangle] -pub unsafe fn get_result_ptr() -> usize { - let msg = "ipfs_rpc.get_result_ptr\n"; - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_PTR.get_mut() -} - -#[no_mangle] -pub unsafe fn get_result_size() -> usize { - let msg = "ipfs_rpc.get_result_size\n"; - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_SIZE.get_mut() -} - -#[no_mangle] -pub unsafe fn set_result_ptr(ptr: usize) { - let msg = format!("ipfs_rpc.set_result_ptr: {}\n", ptr); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_PTR.get_mut() = ptr; -} - -#[no_mangle] -pub unsafe fn set_result_size(size: usize) { - let msg = format!("ipfs_rpc.set_result_size: {}\n", size); - log_utf8_string(msg.as_ptr() as _, msg.len() as _); - - *RESULT_SIZE.get_mut() = size; -} diff --git a/examples/ipfs_node/wasm/ipfs_rpc/wit b/examples/ipfs_node/wasm/ipfs_rpc/wit deleted file mode 100644 index eefe2d53..00000000 --- a/examples/ipfs_node/wasm/ipfs_rpc/wit +++ /dev/null @@ -1,139 +0,0 @@ -;; allocate function type -(@interface type (func (param i32) (result i32))) ;; 0 - -;; deallocate function -(@interface type (func (param i32 i32))) ;; 1 - -;; invoke function -(@interface type (func (param string) (result string))) ;; 2 - -;; result extractor functions -(@interface type (func (result i32))) ;; 3 - -;; result setter functions -(@interface type (func (param i32))) ;; 4 - -;; import ipfs put/get function -(@interface type (func (param i32 i32))) ;; 5 - -;; import ipfs put/get function -(@interface type (func (param i32 i32))) ;; 6 - -;; import ipfs put/get function -(@interface type (func (param string) (result string))) ;; 7 - -;; import ipfs put/get function -(@interface type (func (param string) (result string))) ;; 8 - -;; import ipfs put/get function -(@interface type (func (param i32 i32))) ;; 9 - -;; import ipfs put/get function -(@interface type (func (param i32 i32))) ;; 10 - -;; export ipfs put/get function -(@interface type (func (param string) (result string))) ;; 11 - -;; export ipfs put/get function -(@interface type (func (param string) (result string))) ;; 12 - -(@interface export "allocate" (func 0)) ;; 0 -(@interface export "deallocate" (func 1)) ;; 1 -(@interface export "invoke" (func 2)) ;; 2 -(@interface export "get_result_size" (func 3)) ;; 3 -(@interface export "get_result_ptr" (func 3)) ;; 4 -(@interface export "set_result_size" (func 4)) ;; 5 -(@interface export "set_result_ptr" (func 4)) ;; 6 -(@interface export "put" (func 11)) ;; 7 -(@interface export "get" (func 12)) ;; 8 - -(@interface import "ipfs_node.wasm" "get" (func (type 5))) -(@interface import "ipfs_node.wasm" "put" (func (type 6))) - -(@interface import "ipfs_node.wasm" "get" (func (type 7))) ;; 9 -(@interface import "ipfs_node.wasm" "put" (func (type 8))) ;; 10 - -;; adapter for export invoke function -(@interface func (type 2) - arg.get 0 - string.size - call-core 0 ;; call allocate - arg.get 0 - string.lower_memory - call-core 2 ;; call invoke - call-core 4 ;; call get_result_size - call-core 3 ;; call get_result_ptr - string.lift_memory - call-core 4 ;; call get_result_size - call-core 3 ;; call get_result_ptr - call-core 1 ;; call deallocate -) - -;; adapter for export put function -(@interface func (type 11) - arg.get 0 - string.size - call-core 0 ;; call allocate - arg.get 0 - string.lower_memory - call-core 7 ;; call put - call-core 4 ;; call get_result_size - call-core 3 ;; call get_result_ptr - string.lift_memory - call-core 4 ;; call get_result_size - call-core 3 ;; call get_result_ptr - call-core 1 ;; call deallocate -) - -;; adapter for export get function -(@interface func (type 12) - arg.get 0 - string.size - call-core 0 ;; call allocate - arg.get 0 - string.lower_memory - call-core 8 ;; call get - call-core 4 ;; call get_result_size - call-core 3 ;; call get_result_ptr - string.lift_memory - call-core 4 ;; call get_result_size - call-core 3 ;; call get_result_ptr - call-core 1 ;; call deallocate -) - -;; adapter for import function ipfs.get -(@interface func (type 9) - arg.get 0 - arg.get 1 - string.lift_memory - call-core 9 ;; call ipfs_node.get that returns string - dup - string.size - call-core 0 ;; call allocate - swap2 - string.lower_memory - call-core 5 ;; call set_result_size - call-core 6 ;; call set_result_ptr -) - -;; adapter for import function ipfs.put -(@interface func (type 10) - arg.get 0 - arg.get 1 - string.lift_memory - call-core 10 ;; call ipfs_node.put that returns string - dup - string.size - call-core 0 ;; call allocate - swap2 - string.lower_memory - call-core 5 ;; call set_result_size - call-core 6 ;; call set_result_ptr -) - -;; Implementations -(@interface implement (func 2) (func 2)) -(@interface implement (func 5) (func 9)) -(@interface implement (func 6) (func 10)) -(@interface implement (func 11) (func 11)) -(@interface implement (func 12) (func 12)) diff --git a/examples/simple_greeting/.cargo/config.toml b/examples/simple_greeting/.cargo/config.toml deleted file mode 100644 index f4e8c002..00000000 --- a/examples/simple_greeting/.cargo/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[build] -target = "wasm32-unknown-unknown"