From 670977a1919267886c2fb702471ad29d6a0639e4 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 15 Mar 2024 00:56:46 -0400 Subject: [PATCH 1/9] draft basic wallet translation --- frontend-wasm/src/code_translator/mod.rs | 65 ++-- .../src/code_translator/tests_unsupported.rs | 46 +-- frontend-wasm/src/component/build_ir.rs | 305 +++++++++++++----- frontend-wasm/src/component/instance.rs | 33 +- frontend-wasm/src/component/types/mod.rs | 114 +++---- frontend-wasm/src/lib.rs | 10 +- frontend-wasm/src/module/build_ir.rs | 52 ++- frontend-wasm/src/module/types.rs | 46 +-- hir/src/component/mod.rs | 16 + tests/integration/src/rust_masm_tests/sdk.rs | 65 +++- 10 files changed, 484 insertions(+), 268 deletions(-) diff --git a/frontend-wasm/src/code_translator/mod.rs b/frontend-wasm/src/code_translator/mod.rs index 73e0e1808..962615a45 100644 --- a/frontend-wasm/src/code_translator/mod.rs +++ b/frontend-wasm/src/code_translator/mod.rs @@ -13,24 +13,28 @@ //! //! Based on Cranelift's Wasm -> CLIF translator v11.0.0 -use std::collections::hash_map; -use std::u64; +use std::{collections::hash_map, u64}; -use crate::error::{WasmError, WasmResult}; -use crate::module::func_translation_state::{ControlStackFrame, ElseData, FuncTranslationState}; -use crate::module::function_builder_ext::FunctionBuilderExt; -use crate::module::types::{ir_type, BlockType, FuncIndex, GlobalIndex, ModuleTypes}; -use crate::module::Module; -use crate::ssa::Variable; -use crate::unsupported_diag; use miden_diagnostics::{DiagnosticsHandler, SourceSpan}; -use miden_hir::cranelift_entity::packed_option::ReservedValue; -use miden_hir::Type::*; -use miden_hir::{Block, Inst, InstBuilder, Value}; -use miden_hir::{Immediate, Type}; +use miden_hir::{ + cranelift_entity::packed_option::ReservedValue, Block, Immediate, Inst, InstBuilder, Type, + Type::*, Value, +}; use rustc_hash::FxHashMap; use wasmparser::{MemArg, Operator}; +use crate::{ + error::{WasmError, WasmResult}, + module::{ + func_translation_state::{ControlStackFrame, ElseData, FuncTranslationState}, + function_builder_ext::FunctionBuilderExt, + types::{ir_type, BlockType, FuncIndex, GlobalIndex, ModuleTypes}, + Module, + }, + ssa::Variable, + unsupported_diag, +}; + #[cfg(test)] mod tests; @@ -127,6 +131,9 @@ pub fn translate_operator( diagnostics, )?; } + Operator::CallIndirect { type_index: _, table_index: _, table_byte: _ } => { + // TODO: + } /******************************* Memory management *********************************/ Operator::MemoryGrow { .. } => { let arg = state.pop1_casted(U32, builder, span); @@ -624,9 +631,7 @@ fn prepare_addr( .add_imm_checked(addr_u32, Immediate::U32(memarg.offset as u32), span); } }; - builder - .ins() - .inttoptr(full_addr_int, Type::Ptr(ptr_ty.clone().into()), span) + builder.ins().inttoptr(full_addr_int, Type::Ptr(ptr_ty.clone().into()), span) } fn translate_call( @@ -718,9 +723,7 @@ fn translate_br_if( let else_dest = next_block; let else_args = &[]; let cond_i1 = builder.ins().neq_imm(cond, Immediate::I32(0), span); - builder - .ins() - .cond_br(cond_i1, then_dest, then_args, else_dest, else_args, span); + builder.ins().cond_br(cond_i1, then_dest, then_args, else_dest, else_args, span); builder.seal_block(next_block); // The only predecessor is the current block. builder.switch_to_block(next_block); } @@ -791,9 +794,7 @@ fn translate_end( } frame.truncate_value_stack_to_original_size(&mut state.stack); - state - .stack - .extend_from_slice(builder.block_params(next_block)); + state.stack.extend_from_slice(builder.block_params(next_block)); } fn translate_else( @@ -840,9 +841,7 @@ fn translate_else( else_block } ElseData::WithElse { else_block } => { - builder - .ins() - .br(destination, state.peekn(num_return_values), span); + builder.ins().br(destination, state.peekn(num_return_values), span); state.popn(num_return_values); else_block } @@ -920,13 +919,7 @@ fn translate_if( }; builder.seal_block(next_block); builder.switch_to_block(next_block); - state.push_if( - destination, - else_data, - blockty.params.len(), - blockty.results.len(), - blockty, - ); + state.push_if(destination, else_data, blockty.params.len(), blockty.results.len(), blockty); Ok(()) } @@ -940,14 +933,10 @@ fn translate_loop( let blockty = BlockType::from_wasm(blockty, mod_types)?; let loop_body = builder.create_block_with_params(blockty.params.clone(), span); let next = builder.create_block_with_params(blockty.results.clone(), span); - builder - .ins() - .br(loop_body, state.peekn(blockty.params.len()), span); + builder.ins().br(loop_body, state.peekn(blockty.params.len()), span); state.push_loop(loop_body, next, blockty.params.len(), blockty.results.len()); state.popn(blockty.params.len()); - state - .stack - .extend_from_slice(builder.block_params(loop_body)); + state.stack.extend_from_slice(builder.block_params(loop_body)); builder.switch_to_block(loop_body); Ok(()) } diff --git a/frontend-wasm/src/code_translator/tests_unsupported.rs b/frontend-wasm/src/code_translator/tests_unsupported.rs index 25d0dd937..156505513 100644 --- a/frontend-wasm/src/code_translator/tests_unsupported.rs +++ b/frontend-wasm/src/code_translator/tests_unsupported.rs @@ -1,20 +1,16 @@ use miden_diagnostics::SourceSpan; -use miden_hir::CallConv; -use miden_hir::Linkage; -use miden_hir::ModuleBuilder; -use miden_hir::Signature; - -use wasmparser::MemArg; -use wasmparser::Operator; -use wasmparser::Operator::*; - -use crate::module::func_translation_state::FuncTranslationState; -use crate::module::function_builder_ext::FunctionBuilderContext; -use crate::module::function_builder_ext::FunctionBuilderExt; -use crate::module::Module; -use crate::test_utils::test_diagnostics; +use miden_hir::{CallConv, Linkage, ModuleBuilder, Signature}; +use wasmparser::{MemArg, Operator, Operator::*}; use super::translate_operator; +use crate::{ + module::{ + func_translation_state::FuncTranslationState, + function_builder_ext::{FunctionBuilderContext, FunctionBuilderExt}, + Module, + }, + test_utils::test_diagnostics, +}; fn check_unsupported(op: &Operator) { let diagnostics = test_diagnostics(); @@ -41,29 +37,17 @@ fn check_unsupported(op: &Operator) { &diagnostics, SourceSpan::default(), ); - assert!( - result.is_err(), - "Expected unsupported op error for {:?}", - op - ); + assert!(result.is_err(), "Expected unsupported op error for {:?}", op); assert_eq!( result.unwrap_err().to_string(), format!("Unsupported Wasm: Wasm op {:?} is not supported", op) ); - assert!( - diagnostics.has_errors(), - "Expected diagnostics to have errors" - ); + assert!(diagnostics.has_errors(), "Expected diagnostics to have errors"); } // Wasm Spec v1.0 const UNSUPPORTED_WASM_V1_OPS: &[Operator] = &[ - CallIndirect { - type_index: 0, - table_index: 0, - table_byte: 0, - }, - /****************************** Memory Operators ************************************/ + /****************************** Memory Operators *********************************** */ F32Load { memarg: MemArg { align: 0, @@ -155,7 +139,7 @@ const UNSUPPORTED_WASM_V1_OPS: &[Operator] = &[ F64ReinterpretI64, I32ReinterpretF32, I64ReinterpretF64, - /****************************** Binary Operators ************************************/ + /****************************** Binary Operators *********************************** */ F32Add, F32Sub, F32Mul, @@ -169,7 +153,7 @@ const UNSUPPORTED_WASM_V1_OPS: &[Operator] = &[ F64Div, F64Min, F64Max, - /**************************** Comparison Operators **********************************/ + /**************************** Comparison Operators ********************************* */ F32Eq, F32Ne, F32Gt, diff --git a/frontend-wasm/src/component/build_ir.rs b/frontend-wasm/src/component/build_ir.rs index 33732d8b6..cbbfc29b5 100644 --- a/frontend-wasm/src/component/build_ir.rs +++ b/frontend-wasm/src/component/build_ir.rs @@ -1,17 +1,21 @@ +use alloc::collections::BTreeMap; + use miden_diagnostics::DiagnosticsHandler; use miden_hir::{ cranelift_entity::PrimaryMap, FunctionIdent, Ident, InterfaceFunctionIdent, InterfaceIdent, Symbol, }; use miden_hir_type::LiftedFunctionType; +use rustc_hash::FxHashMap; use wasmparser::WasmFeatures; use super::{ inline, instance::{ComponentImport, ComponentInstance, ComponentInstanceBuilder}, interface_type_to_ir, CanonicalOptions, ComponentTypes, ComponentTypesBuilder, CoreDef, Export, - ExportItem, LinearComponent, LinearComponentTranslation, ParsedRootComponent, - StaticModuleIndex, TypeFuncIndex, + ExportItem, GlobalInitializer, InstantiateModule, LinearComponent, LinearComponentTranslation, + LoweredIndex, ParsedRootComponent, RuntimeImportIndex, RuntimeInstanceIndex, StaticModuleIndex, + Trampoline, TypeFuncIndex, }; use crate::{ component::{ComponentParser, StringEncoding}, @@ -79,102 +83,228 @@ fn inline( fn build_ir<'data>( linear_component_translation: LinearComponentTranslation, component_types: ComponentTypes, - modules: PrimaryMap>, + mut parsed_modules: PrimaryMap>, config: &WasmTranslationConfig, diagnostics: &DiagnosticsHandler, ) -> WasmResult { let mut cb = miden_hir::ComponentBuilder::new(diagnostics); - let component_instance_builder = - ComponentInstanceBuilder::new(linear_component_translation, component_types, modules); - let mut component_instance = component_instance_builder.build()?; + //let component_instance_builder = + // ComponentInstanceBuilder::new(linear_component_translation, component_types, + // parsed_modules); let mut component_instance = component_instance_builder.build()?; - component_instance.ensure_module_names(); + let mut modules_instances: PrimaryMap = + PrimaryMap::new(); + let mut lower_imports: BTreeMap = BTreeMap::default(); + //let mut imports: BTreeMap> = BTreeMap::default(); + let component = &linear_component_translation.component; - // build exports - for (name, export) in &component_instance.component.exports { - build_export(export, &component_instance, name, &mut cb, config)?; + ensure_module_names(&mut parsed_modules); + + dbg!(&component.initializers); + dbg!(&linear_component_translation.trampolines); + for initializer in &component.initializers { + match initializer { + GlobalInitializer::InstantiateModule(m) => { + match m { + InstantiateModule::Static(static_module_idx, args) => { + if module_instances + .values() + .find(|idx| **idx == *static_module_idx) + .is_some() + { + return Err(WasmError::Unsupported(format!( + "A module with a static index {} is already instantiated. We \ + don't support multiple instantiations of the same module.", + static_module_idx.as_u32() + ))); + } + module_instances.push(*static_module_idx); + let mut module_args: Vec = Vec::new(); + for arg in args.iter() { + match arg { + CoreDef::Export(export) => { + // let static_module_idx = module_instances[export.instance]; + match export.item { + ExportItem::Index(entity_idx) => match entity_idx { + EntityIndex::Function(_func_idx) => { + // Do nothing. + // The function indent (module ident + function + // name) + // will be resolved during the `call` resolution. + () + + // module_args.push(import); + } + EntityIndex::Table(_) => { + // Do nothing for now + } + EntityIndex::Memory(_) => { + todo!() + } + EntityIndex::Global(_) => { + todo!() + } + }, + ExportItem::Name(_) => todo!(), + } + } + CoreDef::InstanceFlags(_) => todo!(), + CoreDef::Trampoline(trampoline_idx) => { + let trampoline = + &linear_component_translation.trampolines[*trampoline_idx]; + match trampoline { + Trampoline::LowerImport { + index, + lower_ty, + options: _, + } => { + let import = lower_imports[index]; + let import = ComponentImport { + runtime_import_index: import, + signature: *lower_ty, + }; + build_import( + &import, + &parsed_modules, + &component_types, + component, + &mut cb, + config, + )?; + module_args.push(import); + } + _ => unreachable!(), + } + } + } + } + + let parsed_module = parsed_modules.get_mut(*static_module_idx).unwrap(); + let module = build_ir_module( + parsed_module, + component_types.module_types(), + config, + diagnostics, + )?; + cb.add_module(module.into()).expect("module is already added"); + } + InstantiateModule::Import(..) => todo!(), + }; + } + GlobalInitializer::LowerImport { + index: init_lowered_idx, + import, + } => { + lower_imports.insert(*init_lowered_idx, *import); + } + GlobalInitializer::ExtractMemory(_) => { + // Do nothing for now + } + GlobalInitializer::ExtractRealloc(_) => todo!(), + GlobalInitializer::ExtractPostReturn(_) => todo!(), + GlobalInitializer::Resource(_) => todo!(), + } } - for (static_module_idx, parsed_module) in component_instance.modules { - let component = &component_instance.component; - build_import( - &component_instance.imports[&static_module_idx], - &component_instance.component_types, - component, - &parsed_module, - &mut cb, - config, - )?; + // component_instance.ensure_module_names(); - let module = build_ir_module( - parsed_module, - component_instance.component_types.module_types(), + // build exports + for (name, export) in &component_instance.component.exports { + build_export( + export, + &parsed_modules, + &module_instances, + &component_types, + name, + &mut cb, config, - diagnostics, )?; - cb.add_module(module.into()).expect("module is already added"); } + // for (static_module_idx, parsed_module) in component_instance.modules { + // let component = &component_instance.component; + // build_import( + // &component_instance.imports[&static_module_idx], + // &component_instance.component_types, + // component, + // &parsed_module, + // &mut cb, + // config, + // )?; + + // let module = build_ir_module( + // parsed_module, + // component_instance.component_types.module_types(), + // config, + // diagnostics, + // )?; + // cb.add_module(module.into()).expect("module is already added"); + // } + Ok(cb.build()) } +pub fn ensure_module_names(modules: &mut PrimaryMap>) { + for (idx, parsed_module) in modules.iter_mut() { + parsed_module.module.set_name_fallback(format!("module{}", idx.as_u32())); + } +} + fn build_import( - component_imports: &[ComponentImport], + import: &ComponentImport, + parsed_modules: &PrimaryMap, component_types: &ComponentTypes, component: &LinearComponent, - parsed_module: &ParsedModule<'_>, cb: &mut miden_hir::ComponentBuilder<'_>, config: &WasmTranslationConfig, ) -> WasmResult<()> { - for import in component_imports { - let (import_idx, import_names) = &component.imports[import.runtime_import_index]; - if import_names.len() != 1 { - return Err(crate::WasmError::Unsupported( - "multi-name imports not supported".to_string(), - )); - } - let import_func_name = import_names.first().unwrap(); - let (full_interface_name, _) = component.import_types[*import_idx].clone(); - let interface_function = InterfaceFunctionIdent { - interface: InterfaceIdent::from_full_ident(full_interface_name.clone()), - function: Symbol::intern(import_func_name), - }; - let Some(import_metadata) = config.import_metadata.get(&interface_function) else { - return Err(crate::WasmError::MissingImportMetadata(format!( - "Import metadata for interface function {:?} not found", - &interface_function, - ))); - }; - let lifted_func_ty = convert_lifted_func_ty(&import.signature, component_types); - - let component_import = miden_hir::ComponentImport { - function_ty: lifted_func_ty, - interface_function, - invoke_method: import_metadata.invoke_method, - digest: import_metadata.digest.clone(), - }; - let function_id = - find_module_import_function(parsed_module, full_interface_name, import_func_name)?; - cb.add_import(function_id, component_import); + let (import_idx, import_names) = &component.imports[import.runtime_import_index]; + if import_names.len() != 1 { + return Err(crate::WasmError::Unsupported("multi-name imports not supported".to_string())); } + let import_func_name = import_names.first().unwrap(); + let (full_interface_name, _) = component.import_types[*import_idx].clone(); + let interface_function = InterfaceFunctionIdent { + interface: InterfaceIdent::from_full_ident(full_interface_name.clone()), + function: Symbol::intern(import_func_name), + }; + let Some(import_metadata) = config.import_metadata.get(&interface_function) else { + return Err(crate::WasmError::MissingImportMetadata(format!( + "Import metadata for interface function {:?} not found", + &interface_function, + ))); + }; + let lifted_func_ty = convert_lifted_func_ty(&import.signature, component_types); + + let component_import = miden_hir::ComponentImport { + function_ty: lifted_func_ty, + interface_function, + invoke_method: import_metadata.invoke_method, + digest: import_metadata.digest.clone(), + }; + let function_id = + find_module_import_function(parsed_modules, full_interface_name, import_func_name)?; + cb.add_import(function_id, component_import); Ok(()) } fn find_module_import_function( - parsed_module: &ParsedModule, + parsed_modules: &PrimaryMap, full_interface_name: String, import_func_name: &String, ) -> WasmResult { - for import in &parsed_module.module.imports { - if import.module == full_interface_name && &import.field == import_func_name { - let func_idx = import.index.unwrap_func(); - let func_name = parsed_module.module.func_name(func_idx); - let module_instance_name = parsed_module.module.name(); - return Ok(FunctionIdent { - module: Ident::with_empty_span(Symbol::intern(module_instance_name)), - function: Ident::with_empty_span(Symbol::intern(func_name)), - }); + for (_idx, parsed_module) in parsed_modules { + for import in &parsed_module.module.imports { + if import.module == full_interface_name && &import.field == import_func_name { + let func_idx = import.index.unwrap_func(); + let func_name = parsed_module.module.func_name(func_idx); + let module_instance_name = parsed_module.module.name(); + return Ok(FunctionIdent { + module: Ident::with_empty_span(Symbol::intern(module_instance_name)), + function: Ident::with_empty_span(Symbol::intern(func_name)), + }); + } } } Err(WasmError::Unexpected(format!( @@ -183,32 +313,47 @@ fn find_module_import_function( ))) } -fn build_export( +fn build_export<'data>( export: &Export, - component_instance: &ComponentInstance<'_>, + modules: &PrimaryMap, + module_instances: &PrimaryMap, + component_types: &ComponentTypes, name: &String, cb: &mut miden_hir::ComponentBuilder<'_>, config: &WasmTranslationConfig, ) -> WasmResult<()> { match export { - Export::LiftedFunction { ty, func, options } => { - build_export_function(component_instance, name, func, ty, options, cb, config) - } + Export::LiftedFunction { ty, func, options } => build_export_function( + modules, + module_instances, + component_types, + name, + func, + ty, + options, + cb, + config, + ), Export::Instance(exports) => { // Flatten any(nested) interface instance exports into the IR `Component` exports for (name, export) in exports { - build_export(export, component_instance, name, cb, config)?; + build_export(export, modules, module_instances, component_types, name, cb, config)?; } Ok(()) } Export::ModuleStatic(_) => todo!(), Export::ModuleImport(_) => todo!(), - Export::Type(_) => todo!(), + Export::Type(_) => { + // TODO: implement type exports + Ok(()) + } } } -fn build_export_function( - component_instance: &ComponentInstance<'_>, +fn build_export_function<'data>( + modules: &PrimaryMap, + module_instances: &PrimaryMap, + component_types: &ComponentTypes, name: &String, func: &CoreDef, ty: &TypeFuncIndex, @@ -219,12 +364,12 @@ fn build_export_function( assert_empty_canonical_options(options); let func_ident = match func { CoreDef::Export(core_export) => { - let parsed_module = component_instance.module(core_export.instance); - let module_name = parsed_module.module.name(); + let module = &modules[module_instances[core_export.instance]].module; + let module_name = module.name(); let module_ident = miden_hir::Ident::with_empty_span(Symbol::intern(module_name)); let func_name = match core_export.item { ExportItem::Index(idx) => match idx { - EntityIndex::Function(func_idx) => parsed_module.module.func_name(func_idx), + EntityIndex::Function(func_idx) => module.func_name(func_idx), EntityIndex::Table(_) => todo!(), EntityIndex::Memory(_) => todo!(), EntityIndex::Global(_) => todo!(), @@ -240,7 +385,7 @@ fn build_export_function( CoreDef::InstanceFlags(_) => todo!(), CoreDef::Trampoline(_) => todo!(), }; - let lifted_func_ty = convert_lifted_func_ty(ty, &component_instance.component_types); + let lifted_func_ty = convert_lifted_func_ty(ty, component_types); let export_name = Symbol::intern(name).into(); let Some(export_metadata) = config.export_metadata.get(&export_name) else { return Err(WasmError::MissingExportMetadata(format!( diff --git a/frontend-wasm/src/component/instance.rs b/frontend-wasm/src/component/instance.rs index a8c3a010f..c1e088f00 100644 --- a/frontend-wasm/src/component/instance.rs +++ b/frontend-wasm/src/component/instance.rs @@ -1,3 +1,6 @@ +// TODO: Delete this file +#![allow(dead_code)] + use miden_hir::cranelift_entity::PrimaryMap; use rustc_hash::FxHashMap; @@ -7,7 +10,10 @@ use super::{ StaticModuleIndex, TypeFuncIndex, }; use crate::{ - component::Trampoline, error::WasmResult, module::module_env::ParsedModule, WasmError, + component::{ExportItem, Trampoline}, + error::WasmResult, + module::{module_env::ParsedModule, types::EntityIndex}, + WasmError, }; /// A component import @@ -62,6 +68,8 @@ impl<'data> ComponentInstanceBuilder<'data> { let mut lower_imports: FxHashMap = FxHashMap::default(); let mut imports: FxHashMap> = FxHashMap::default(); let component = &self.linear_component_translation.component; + dbg!(&component.initializers); + dbg!(&self.linear_component_translation.trampolines); for initializer in &component.initializers { match initializer { GlobalInitializer::InstantiateModule(m) => { @@ -83,7 +91,28 @@ impl<'data> ComponentInstanceBuilder<'data> { let mut module_args: Vec = Vec::new(); for arg in args.iter() { match arg { - CoreDef::Export(_) => todo!(), + CoreDef::Export(export) => { + // let static_module_idx = + // module_instances[export.instance]; + match export.item { + ExportItem::Index(entity_idx) => match entity_idx { + EntityIndex::Function(_func_idx) => { + todo!(); + // module_args.push(import); + } + EntityIndex::Table(_) => { + todo!() + } + EntityIndex::Memory(_) => { + todo!() + } + EntityIndex::Global(_) => { + todo!() + } + }, + ExportItem::Name(_) => todo!(), + } + } CoreDef::InstanceFlags(_) => todo!(), CoreDef::Trampoline(trampoline_idx) => { let trampoline = &self diff --git a/frontend-wasm/src/component/types/mod.rs b/frontend-wasm/src/component/types/mod.rs index 827ed0fc5..925ec2b61 100644 --- a/frontend-wasm/src/component/types/mod.rs +++ b/frontend-wasm/src/component/types/mod.rs @@ -7,13 +7,15 @@ pub mod resources; +use std::{hash::Hash, ops::Index}; + use anyhow::{bail, Result}; use indexmap::IndexSet; use miden_hir::cranelift_entity::{EntityRef, PrimaryMap}; use rustc_hash::FxHashMap; -use std::{hash::Hash, ops::Index}; use wasmparser::{names::KebabString, types}; +use self::resources::ResourcesBuilder; use crate::{ indices, module::types::{ @@ -23,8 +25,6 @@ use crate::{ translation_utils::{DiscriminantSize, FlagsSize}, }; -use self::resources::ResourcesBuilder; - /// Maximum nesting depth of a type allowed /// /// This constant isn't chosen via any scientific means and its main purpose is @@ -355,6 +355,7 @@ where ModuleTypes: Index, { type Output = >::Output; + fn index(&self, idx: T) -> &Self::Output { self.module_types.index(idx) } @@ -365,6 +366,7 @@ where ModuleTypes: Index, { type Output = >::Output; + fn index(&self, idx: T) -> &Self::Output { self.module_types.index(idx) } @@ -538,16 +540,14 @@ impl ComponentTypesBuilder { let ty = &types[id]; let mut result = TypeComponent::default(); for (name, ty) in ty.imports.iter() { - result.imports.insert( - name.clone(), - self.convert_component_entity_type(types, *ty)?, - ); + result + .imports + .insert(name.clone(), self.convert_component_entity_type(types, *ty)?); } for (name, ty) in ty.exports.iter() { - result.exports.insert( - name.clone(), - self.convert_component_entity_type(types, *ty)?, - ); + result + .exports + .insert(name.clone(), self.convert_component_entity_type(types, *ty)?); } Ok(self.component_types.components.push(result)) } @@ -560,10 +560,9 @@ impl ComponentTypesBuilder { let ty = &types[id]; let mut result = TypeComponentInstance::default(); for (name, ty) in ty.exports.iter() { - result.exports.insert( - name.clone(), - self.convert_component_entity_type(types, *ty)?, - ); + result + .exports + .insert(name.clone(), self.convert_component_entity_type(types, *ty)?); } Ok(self.component_types.component_instances.push(result)) } @@ -576,15 +575,12 @@ impl ComponentTypesBuilder { let ty = &types[id]; let mut result = TypeModule::default(); for ((module, field), ty) in ty.imports.iter() { - result.imports.insert( - (module.clone(), field.clone()), - self.entity_type(types, ty)?, - ); + result + .imports + .insert((module.clone(), field.clone()), self.entity_type(types, ty)?); } for (name, ty) in ty.exports.iter() { - result - .exports - .insert(name.clone(), self.entity_type(types, ty)?); + result.exports.insert(name.clone(), self.entity_type(types, ty)?); } Ok(self.component_types.modules.push(result)) } @@ -673,9 +669,7 @@ impl ComponentTypesBuilder { }) .collect::>>()?; let abi = CanonicalAbiInfo::record( - fields - .iter() - .map(|field| self.component_types.canonical_abi(&field.ty)), + fields.iter().map(|field| self.component_types.canonical_abi(&field.ty)), ); Ok(self.add_record_type(TypeRecord { fields, abi })) } @@ -701,10 +695,11 @@ impl ComponentTypesBuilder { }) }) .collect::>>()?; - let (info, abi) = VariantInfo::new(cases.iter().map(|c| { - c.ty.as_ref() - .map(|ty| self.component_types.canonical_abi(ty)) - })); + let (info, abi) = VariantInfo::new( + cases + .iter() + .map(|c| c.ty.as_ref().map(|ty| self.component_types.canonical_abi(ty))), + ); Ok(self.add_variant_type(TypeVariant { cases, abi, info })) } @@ -722,11 +717,8 @@ impl ComponentTypesBuilder { } fn new_tuple_type(&mut self, types: Box<[InterfaceType]>) -> TypeTupleIndex { - let abi = CanonicalAbiInfo::record( - types - .iter() - .map(|ty| self.component_types.canonical_abi(ty)), - ); + let abi = + CanonicalAbiInfo::record(types.iter().map(|ty| self.component_types.canonical_abi(ty))); self.add_tuple_type(TypeTuple { types, abi }) } @@ -1087,13 +1079,12 @@ const fn max(a: u32, b: u32) -> u32 { } impl CanonicalAbiInfo { - /// ABI information for zero-sized types. - const ZERO: CanonicalAbiInfo = CanonicalAbiInfo { - size32: 0, - align32: 1, - flat_count: Some(0), + /// ABI information for lists/strings which are "pointer pairs" + pub const POINTER_PAIR: CanonicalAbiInfo = CanonicalAbiInfo { + size32: 8, + align32: 4, + flat_count: Some(2), }; - /// ABI information for one-byte scalars. pub const SCALAR1: CanonicalAbiInfo = CanonicalAbiInfo::scalar(1); /// ABI information for two-byte scalars. @@ -1102,6 +1093,12 @@ impl CanonicalAbiInfo { pub const SCALAR4: CanonicalAbiInfo = CanonicalAbiInfo::scalar(4); /// ABI information for eight-byte scalars. pub const SCALAR8: CanonicalAbiInfo = CanonicalAbiInfo::scalar(8); + /// ABI information for zero-sized types. + const ZERO: CanonicalAbiInfo = CanonicalAbiInfo { + size32: 0, + align32: 1, + flat_count: Some(0), + }; const fn scalar(size: u32) -> CanonicalAbiInfo { CanonicalAbiInfo { @@ -1111,13 +1108,6 @@ impl CanonicalAbiInfo { } } - /// ABI information for lists/strings which are "pointer pairs" - pub const POINTER_PAIR: CanonicalAbiInfo = CanonicalAbiInfo { - size32: 8, - align32: 4, - flat_count: Some(2), - }; - /// Returns the abi for a record represented by the specified fields. pub fn record<'a>(fields: impl Iterator) -> CanonicalAbiInfo { // NB: this is basically a duplicate copy of @@ -1202,10 +1192,7 @@ impl CanonicalAbiInfo { } } CanonicalAbiInfo { - size32: align_to( - align_to(discrim_size, max_align32) + max_size32, - max_align32, - ), + size32: align_to(align_to(discrim_size, max_align32) + max_size32, max_align32), align32: max_align32, flat_count: add_flat(max_case_count, Some(1)), } @@ -1234,10 +1221,7 @@ impl CanonicalAbiInfo { i += 1; } CanonicalAbiInfo { - size32: align_to( - align_to(discrim_size, max_align32) + max_size32, - max_align32, - ), + size32: align_to(align_to(discrim_size, max_align32) + max_size32, max_align32), align32: max_align32, flat_count: add_flat(max_case_count, Some(1)), } @@ -1284,6 +1268,7 @@ impl VariantInfo { abi, ) } + pub const fn new_static(cases: &[Option]) -> VariantInfo { let size = match DiscriminantSize::from_count(cases.len()) { Some(size) => size, @@ -1627,10 +1612,9 @@ impl TypeInformation { /// The iterator item is: /// /// * `None` - no payload for this case - /// * `Some(None)` - this case has a payload but can't be represented with - /// flat types - /// * `Some(Some(types))` - this case has a payload and is represented with - /// the types specified in the flat representation. + /// * `Some(None)` - this case has a payload but can't be represented with flat types + /// * `Some(Some(types))` - this case has a payload and is represented with the types specified + /// in the flat representation. fn build_variant<'a, I>(&mut self, cases: I) where I: IntoIterator>, @@ -1719,9 +1703,7 @@ impl TypeInformation { fn variants(&mut self, types: &ComponentTypesBuilder, ty: &TypeVariant) { self.build_variant( - ty.cases - .iter() - .map(|c| c.ty.as_ref().map(|ty| types.type_information(ty))), + ty.cases.iter().map(|c| c.ty.as_ref().map(|ty| types.type_information(ty))), ) } @@ -1765,7 +1747,13 @@ pub fn interface_type_to_ir( InterfaceType::Record(_) => todo!(), InterfaceType::Variant(_) => todo!(), InterfaceType::List(_) => todo!(), - InterfaceType::Tuple(_) => todo!(), + InterfaceType::Tuple(tuple_idx) => { + let tys = _component_types.tuples[*tuple_idx] + .types + .iter() + .map(|t| interface_type_to_ir(t, _component_types)); + miden_hir_type::Type::Struct(miden_hir_type::StructType::new(tys)) + } InterfaceType::Flags(_) => todo!(), InterfaceType::Enum(_) => todo!(), InterfaceType::Option(_) => todo!(), diff --git a/frontend-wasm/src/lib.rs b/frontend-wasm/src/lib.rs index ac6eeb28a..83d367583 100644 --- a/frontend-wasm/src/lib.rs +++ b/frontend-wasm/src/lib.rs @@ -5,6 +5,8 @@ #![deny(missing_docs)] #![deny(rustdoc::broken_intra_doc_links)] +extern crate alloc; + mod code_translator; mod component; mod config; @@ -16,7 +18,7 @@ mod translation_utils; #[cfg(test)] mod test_utils; -pub use self::component::build_ir::translate_component; -pub use self::config::*; -pub use self::error::WasmError; -pub use self::module::build_ir::translate_module; +pub use self::{ + component::build_ir::translate_component, config::*, error::WasmError, + module::build_ir::translate_module, +}; diff --git a/frontend-wasm/src/module/build_ir.rs b/frontend-wasm/src/module/build_ir.rs index d2043950e..299c74515 100644 --- a/frontend-wasm/src/module/build_ir.rs +++ b/frontend-wasm/src/module/build_ir.rs @@ -1,3 +1,5 @@ +use core::mem; + use miden_diagnostics::{DiagnosticsHandler, SourceSpan}; use miden_hir::{CallConv, ConstantData, FunctionIdent, Ident, Linkage, ModuleBuilder, Symbol}; use wasmparser::{Validator, WasmFeatures}; @@ -9,6 +11,7 @@ use crate::{ func_translator::FuncTranslator, module_env::{FunctionBodyData, ModuleEnvironment, ParsedModule}, types::{ir_func_sig, ir_func_type, ir_type, ModuleTypes}, + EntityIndex, }, WasmError, WasmTranslationConfig, }; @@ -34,11 +37,11 @@ pub fn translate_module( parsed_module.module.set_name_override(name_override.clone()); } let module_types = module_types_builder.finish(); - build_ir_module(parsed_module, &module_types, config, diagnostics) + build_ir_module(&mut parsed_module, &module_types, config, diagnostics) } pub fn build_ir_module( - mut parsed_module: ParsedModule, + mut parsed_module: &mut ParsedModule, module_types: &ModuleTypes, _config: &WasmTranslationConfig, diagnostics: &DiagnosticsHandler, @@ -46,27 +49,42 @@ pub fn build_ir_module( let name = parsed_module.module.name(); let mut module_builder = ModuleBuilder::new(name.clone().as_str()); for import in parsed_module.module.imports.clone() { - let func_idx = import.index.unwrap_func(); - let func_name = parsed_module.module.func_name(func_idx); - let sig_idx = parsed_module.module.type_of(import.index).unwrap_func(); - let func = &module_types[sig_idx]; - let func_type = ir_func_type(&func)?; - let sig = ir_func_sig(&func_type, CallConv::SystemV, Linkage::External); + match import.index { + EntityIndex::Function(func_idx) => { + let func_name = parsed_module.module.func_name(func_idx); + let sig_idx = parsed_module.module.type_of(import.index).unwrap_func(); + let func = &module_types[sig_idx]; + let func_type = ir_func_type(&func)?; + let sig = ir_func_sig(&func_type, CallConv::SystemV, Linkage::External); - let function_id: FunctionIdent = FunctionIdent { - module: module_builder.name(), - function: Ident::with_empty_span(Symbol::intern(func_name)), - }; + let function_id: FunctionIdent = FunctionIdent { + module: module_builder.name(), + function: Ident::with_empty_span(Symbol::intern(func_name)), + }; - parsed_module - .module - .translated_function_imports - .insert(func_idx, (function_id, sig)); + // TODO: extract translated_function_imports from parsed_module so we don't mutate + // it here + parsed_module + .module + .translated_function_imports + .insert(func_idx, (function_id, sig)); + } + EntityIndex::Table(_) => { + // TODO: implement table imports + } + EntityIndex::Memory(_) => todo!(), + EntityIndex::Global(_) => todo!(), + } } build_globals(&parsed_module.module, &mut module_builder, diagnostics)?; build_data_segments(&parsed_module, &mut module_builder, diagnostics)?; let mut func_translator = FuncTranslator::new(); - for (defined_func_idx, body_data) in parsed_module.function_body_inputs { + // debug_assert!( + // !parsed_module.function_body_inputs.is_empty(), + // "No function bodies in a module. Check if it was already translated earlier." + // ); + let function_bodies = mem::take(&mut parsed_module.function_body_inputs); + for (defined_func_idx, body_data) in function_bodies { let func_index = parsed_module.module.func_index(defined_func_idx); let func_type = parsed_module.module.functions[func_index]; let func_name = parsed_module.module.func_name(func_index); diff --git a/frontend-wasm/src/module/types.rs b/frontend-wasm/src/module/types.rs index a2a90ee56..6e14e3295 100644 --- a/frontend-wasm/src/module/types.rs +++ b/frontend-wasm/src/module/types.rs @@ -1,19 +1,16 @@ //! Types for parsed core WebAssembly modules. use core::fmt; -use miden_hir::{AbiParam, CallConv, Linkage, Signature}; -use std::collections::HashMap; -use std::ops::Index; -use wasmparser::types::CoreTypeId; +use std::{collections::HashMap, ops::Index}; use miden_diagnostics::DiagnosticsHandler; -use miden_hir::cranelift_entity::PrimaryMap; +use miden_hir::{cranelift_entity::PrimaryMap, AbiParam, CallConv, Linkage, Signature}; use miden_hir_type as hir; +use wasmparser::types::CoreTypeId; -use crate::component::SignatureIndex; -use crate::error::WasmResult; -use crate::module::Module; -use crate::{unsupported_diag, WasmError}; +use crate::{ + component::SignatureIndex, error::WasmResult, module::Module, unsupported_diag, WasmError, +}; /// Generates a new index type for each entity. #[macro_export] @@ -236,7 +233,7 @@ impl EntityIndex { pub fn unwrap_func(&self) -> FuncIndex { match self { EntityIndex::Function(f) => *f, - _ => panic!("not a func"), + eidx => panic!("not a func, but {eidx:?}"), } } } @@ -416,7 +413,8 @@ impl DataSegmentOffset { diagnostics .diagnostic(miden_diagnostics::Severity::Error) .with_message(format!( - "Failed to get data segment offset from global init {:?} with global index {global_idx:?}", + "Failed to get data segment offset from global init {:?} with \ + global index {global_idx:?}", global_init, )) .emit(); @@ -573,21 +571,13 @@ pub fn ir_type(ty: WasmType) -> WasmResult { Ok(match ty { WasmType::I32 => hir::Type::I32, WasmType::I64 => hir::Type::I64, - WasmType::F32 => { - return Err(WasmError::Unsupported( - "no f32 type in Miden IR".to_string(), - )) - } + WasmType::F32 => return Err(WasmError::Unsupported("no f32 type in Miden IR".to_string())), WasmType::F64 => hir::Type::F64, WasmType::V128 => { - return Err(WasmError::Unsupported( - "V128 type is not supported".to_string(), - )); + return Err(WasmError::Unsupported("V128 type is not supported".to_string())); } WasmType::Ref(_) => { - return Err(WasmError::Unsupported( - "Ref type is not supported".to_string(), - )); + return Err(WasmError::Unsupported("Ref type is not supported".to_string())); } }) } @@ -599,16 +589,8 @@ pub fn ir_func_sig( linkage: Linkage, ) -> Signature { Signature { - params: func_type - .params - .iter() - .map(|ty| AbiParam::new(ty.clone())) - .collect(), - results: func_type - .results - .iter() - .map(|ty| AbiParam::new(ty.clone())) - .collect(), + params: func_type.params.iter().map(|ty| AbiParam::new(ty.clone())).collect(), + results: func_type.results.iter().map(|ty| AbiParam::new(ty.clone())).collect(), cc: call_conv, linkage, } diff --git a/hir/src/component/mod.rs b/hir/src/component/mod.rs index ac3d25f1b..ee08e6c3b 100644 --- a/hir/src/component/mod.rs +++ b/hir/src/component/mod.rs @@ -262,6 +262,22 @@ impl<'a> ComponentBuilder<'a> { self.imports.insert(function_id, import); } + // fn find_import(&self, interface_function_id: &InterfaceFunctionIdent) -> + // Option { dbg!(&interface_function_id); + // for (_id, module) in &self.modules { + // for import_function_id in module.imports().imported(&module.name().unwrap()).unwrap() + // { dbg!(&import_function_id); + // if import_function_id.module == interface_function_id.interface.full_name + // && import_function_id.function.as_str() + // == interface_function_id.function.as_str() + // { + // return Some(import_function_id.clone()); + // } + // } + // } + // None + // } + pub fn add_export(&mut self, name: FunctionExportName, export: ComponentExport) { self.exports.insert(name, export); } diff --git a/tests/integration/src/rust_masm_tests/sdk.rs b/tests/integration/src/rust_masm_tests/sdk.rs index d00023bef..0c8b9ae49 100644 --- a/tests/integration/src/rust_masm_tests/sdk.rs +++ b/tests/integration/src/rust_masm_tests/sdk.rs @@ -1,4 +1,7 @@ use expect_test::expect_file; +use miden_core::crypto::hash::RpoDigest; +use miden_frontend_wasm::{ExportMetadata, ImportMetadata, WasmTranslationConfig}; +use miden_hir::{InterfaceFunctionIdent, InterfaceIdent, Symbol}; use crate::CompilerTest; @@ -11,9 +14,69 @@ fn sdk() { #[test] fn sdk_basic_wallet() { - let test = CompilerTest::rust_source_cargo_component("sdk/basic-wallet", Default::default()); + let interface = InterfaceIdent::from_full_ident("miden:base/tx-kernel@1.0.0".to_string()); + let create_note_ident = InterfaceFunctionIdent { + interface: interface.clone(), + function: Symbol::intern("create-note"), + }; + let add_asset_ident = InterfaceFunctionIdent { + interface: interface.clone(), + function: Symbol::intern("add-asset"), + }; + let remove_asset_ident = InterfaceFunctionIdent { + interface: interface.clone(), + function: Symbol::intern("remove-asset"), + }; + let import_metadata = [ + ( + create_note_ident.clone(), + ImportMetadata { + digest: RpoDigest::default(), + invoke_method: miden_hir::FunctionInvocationMethod::Call, + }, + ), + ( + remove_asset_ident.clone(), + ImportMetadata { + digest: RpoDigest::default(), + invoke_method: miden_hir::FunctionInvocationMethod::Call, + }, + ), + ( + add_asset_ident.clone(), + ImportMetadata { + digest: RpoDigest::default(), + invoke_method: miden_hir::FunctionInvocationMethod::Call, + }, + ), + ] + .into_iter() + .collect(); + let export_metadata = [ + ( + Symbol::intern("send-asset").into(), + ExportMetadata { + invoke_method: miden_hir::FunctionInvocationMethod::Call, + }, + ), + ( + Symbol::intern("receive-asset").into(), + ExportMetadata { + invoke_method: miden_hir::FunctionInvocationMethod::Call, + }, + ), + ] + .into_iter() + .collect(); + let config = WasmTranslationConfig { + import_metadata, + export_metadata, + ..Default::default() + }; + let mut test = CompilerTest::rust_source_cargo_component("sdk/basic-wallet", config); let artifact_name = test.source.artifact_name(); test.expect_wasm(expect_file![format!("../../expected/sdk_basic_wallet/{artifact_name}.wat")]); + test.expect_ir(expect_file![format!("../../expected/sdk_basic_wallet/{artifact_name}.hir")]); } #[test] From 39572381ed28ac90042a139f4b9245421126c4ac Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 15 Mar 2024 01:18:42 -0400 Subject: [PATCH 2/9] feat: introduce module instantiation arguments Swap function calls to imported functions with the external function passed as module arguments. --- frontend-wasm/src/code_translator/mod.rs | 7 +- .../src/code_translator/tests_unsupported.rs | 5 +- frontend-wasm/src/component/build_ir.rs | 95 +++++++++---------- frontend-wasm/src/module/build_ir.rs | 54 +++-------- frontend-wasm/src/module/func_env.rs | 72 ++++++++++++++ .../src/module/func_translation_state.rs | 79 ++++++--------- frontend-wasm/src/module/func_translator.rs | 31 +++--- frontend-wasm/src/module/instance.rs | 8 ++ frontend-wasm/src/module/mod.rs | 10 +- hir/src/component/mod.rs | 2 +- 10 files changed, 200 insertions(+), 163 deletions(-) create mode 100644 frontend-wasm/src/module/func_env.rs create mode 100644 frontend-wasm/src/module/instance.rs diff --git a/frontend-wasm/src/code_translator/mod.rs b/frontend-wasm/src/code_translator/mod.rs index 962615a45..7c404809b 100644 --- a/frontend-wasm/src/code_translator/mod.rs +++ b/frontend-wasm/src/code_translator/mod.rs @@ -26,6 +26,7 @@ use wasmparser::{MemArg, Operator}; use crate::{ error::{WasmError, WasmResult}, module::{ + func_env::FuncEnvironment, func_translation_state::{ControlStackFrame, ElseData, FuncTranslationState}, function_builder_ext::FunctionBuilderExt, types::{ir_type, BlockType, FuncIndex, GlobalIndex, ModuleTypes}, @@ -48,6 +49,7 @@ pub fn translate_operator( state: &mut FuncTranslationState, module: &Module, mod_types: &ModuleTypes, + func_env: &FuncEnvironment, diagnostics: &DiagnosticsHandler, span: SourceSpan, ) -> WasmResult<()> { @@ -125,6 +127,7 @@ pub fn translate_operator( state, builder, FuncIndex::from_u32(*function_index), + func_env, module, mod_types, span, @@ -638,6 +641,7 @@ fn translate_call( state: &mut FuncTranslationState, builder: &mut FunctionBuilderExt, function_index: FuncIndex, + func_env: &FuncEnvironment, module: &Module, mod_types: &ModuleTypes, span: SourceSpan, @@ -646,8 +650,7 @@ fn translate_call( let (fident, num_args) = state.get_direct_func( builder.data_flow_graph_mut(), function_index, - module, - mod_types, + func_env, diagnostics, )?; let args = state.peekn_mut(num_args); diff --git a/frontend-wasm/src/code_translator/tests_unsupported.rs b/frontend-wasm/src/code_translator/tests_unsupported.rs index 156505513..a8f9f9f59 100644 --- a/frontend-wasm/src/code_translator/tests_unsupported.rs +++ b/frontend-wasm/src/code_translator/tests_unsupported.rs @@ -5,6 +5,7 @@ use wasmparser::{MemArg, Operator, Operator::*}; use super::translate_operator; use crate::{ module::{ + func_env::FuncEnvironment, func_translation_state::FuncTranslationState, function_builder_ext::{FunctionBuilderContext, FunctionBuilderExt}, Module, @@ -25,15 +26,17 @@ fn check_unsupported(op: &Operator) { }; let mut module_func_builder = module_builder.function("func_name", sig.clone()).unwrap(); let mut fb_ctx = FunctionBuilderContext::new(); + let mod_types = Default::default(); + let func_env = FuncEnvironment::new(&module_info, &mod_types, vec![]); let mut state = FuncTranslationState::new(); let mut builder_ext = FunctionBuilderExt::new(&mut module_func_builder, &mut fb_ctx); - let mod_types = Default::default(); let result = translate_operator( op, &mut builder_ext, &mut state, &module_info, &mod_types, + &func_env, &diagnostics, SourceSpan::default(), ); diff --git a/frontend-wasm/src/component/build_ir.rs b/frontend-wasm/src/component/build_ir.rs index cbbfc29b5..24d87f13b 100644 --- a/frontend-wasm/src/component/build_ir.rs +++ b/frontend-wasm/src/component/build_ir.rs @@ -20,7 +20,10 @@ use super::{ use crate::{ component::{ComponentParser, StringEncoding}, error::WasmResult, - module::{build_ir::build_ir_module, module_env::ParsedModule, types::EntityIndex}, + module::{ + build_ir::build_ir_module, func_env::FuncEnvironment, instance::ModuleArgument, + module_env::ParsedModule, types::EntityIndex, + }, WasmError, WasmTranslationConfig, }; @@ -88,27 +91,21 @@ fn build_ir<'data>( diagnostics: &DiagnosticsHandler, ) -> WasmResult { let mut cb = miden_hir::ComponentBuilder::new(diagnostics); - - //let component_instance_builder = - // ComponentInstanceBuilder::new(linear_component_translation, component_types, - // parsed_modules); let mut component_instance = component_instance_builder.build()?; - - let mut modules_instances: PrimaryMap = + let mut module_instances_source: PrimaryMap = PrimaryMap::new(); let mut lower_imports: BTreeMap = BTreeMap::default(); - //let mut imports: BTreeMap> = BTreeMap::default(); let component = &linear_component_translation.component; ensure_module_names(&mut parsed_modules); - dbg!(&component.initializers); - dbg!(&linear_component_translation.trampolines); + //dbg!(&component.initializers); + //dbg!(&linear_component_translation.trampolines); for initializer in &component.initializers { match initializer { GlobalInitializer::InstantiateModule(m) => { match m { InstantiateModule::Static(static_module_idx, args) => { - if module_instances + if module_instances_source .values() .find(|idx| **idx == *static_module_idx) .is_some() @@ -119,8 +116,8 @@ fn build_ir<'data>( static_module_idx.as_u32() ))); } - module_instances.push(*static_module_idx); - let mut module_args: Vec = Vec::new(); + module_instances_source.push(*static_module_idx); + let mut module_args: Vec = Vec::new(); for arg in args.iter() { match arg { CoreDef::Export(export) => { @@ -128,16 +125,25 @@ fn build_ir<'data>( match export.item { ExportItem::Index(entity_idx) => match entity_idx { EntityIndex::Function(_func_idx) => { - // Do nothing. - // The function indent (module ident + function - // name) - // will be resolved during the `call` resolution. - () - - // module_args.push(import); + let module_id = + module_instances_source[export.instance]; + let module = &parsed_modules[module_id].module; + let func_name = module.func_name(func_idx); + let module_name = module.name(); + let function_id = FunctionIdent { + module: Ident::with_empty_span(Symbol::intern( + module_name, + )), + function: Ident::with_empty_span( + Symbol::intern(func_name), + ), + }; + // dbg!(function_id); + module_args + .push(ModuleArgument::Function(function_id)); } EntityIndex::Table(_) => { - // Do nothing for now + module_args.push(ModuleArgument::Table) } EntityIndex::Memory(_) => { todo!() @@ -164,7 +170,7 @@ fn build_ir<'data>( runtime_import_index: import, signature: *lower_ty, }; - build_import( + let (func_id, component_import) = build_import( &import, &parsed_modules, &component_types, @@ -172,7 +178,10 @@ fn build_ir<'data>( &mut cb, config, )?; - module_args.push(import); + cb.add_import(func_id, component_import.clone()); + module_args.push(ModuleArgument::ComponentImport( + component_import, + )); } _ => unreachable!(), } @@ -180,10 +189,16 @@ fn build_ir<'data>( } } - let parsed_module = parsed_modules.get_mut(*static_module_idx).unwrap(); + let module_types = component_types.module_types(); + let func_env = FuncEnvironment::new( + &parsed_modules[*static_module_idx].module, + module_types, + module_args, + ); let module = build_ir_module( - parsed_module, - component_types.module_types(), + parsed_modules.get_mut(*static_module_idx).unwrap(), + module_types, + func_env, config, diagnostics, )?; @@ -207,14 +222,12 @@ fn build_ir<'data>( } } - // component_instance.ensure_module_names(); - // build exports for (name, export) in &component_instance.component.exports { build_export( export, &parsed_modules, - &module_instances, + &module_instances_source, &component_types, name, &mut cb, @@ -222,26 +235,6 @@ fn build_ir<'data>( )?; } - // for (static_module_idx, parsed_module) in component_instance.modules { - // let component = &component_instance.component; - // build_import( - // &component_instance.imports[&static_module_idx], - // &component_instance.component_types, - // component, - // &parsed_module, - // &mut cb, - // config, - // )?; - - // let module = build_ir_module( - // parsed_module, - // component_instance.component_types.module_types(), - // config, - // diagnostics, - // )?; - // cb.add_module(module.into()).expect("module is already added"); - // } - Ok(cb.build()) } @@ -258,7 +251,7 @@ fn build_import( component: &LinearComponent, cb: &mut miden_hir::ComponentBuilder<'_>, config: &WasmTranslationConfig, -) -> WasmResult<()> { +) -> WasmResult<(FunctionIdent, miden_hir::ComponentImport)> { let (import_idx, import_names) = &component.imports[import.runtime_import_index]; if import_names.len() != 1 { return Err(crate::WasmError::Unsupported("multi-name imports not supported".to_string())); @@ -286,7 +279,7 @@ fn build_import( let function_id = find_module_import_function(parsed_modules, full_interface_name, import_func_name)?; cb.add_import(function_id, component_import); - Ok(()) + Ok((function_id, component_import)) } fn find_module_import_function( diff --git a/frontend-wasm/src/module/build_ir.rs b/frontend-wasm/src/module/build_ir.rs index 299c74515..635dea337 100644 --- a/frontend-wasm/src/module/build_ir.rs +++ b/frontend-wasm/src/module/build_ir.rs @@ -1,13 +1,14 @@ use core::mem; use miden_diagnostics::{DiagnosticsHandler, SourceSpan}; -use miden_hir::{CallConv, ConstantData, FunctionIdent, Ident, Linkage, ModuleBuilder, Symbol}; +use miden_hir::{CallConv, ConstantData, Linkage, ModuleBuilder}; use wasmparser::{Validator, WasmFeatures}; use super::Module; use crate::{ error::WasmResult, module::{ + func_env::FuncEnvironment, func_translator::FuncTranslator, module_env::{FunctionBodyData, ModuleEnvironment, ParsedModule}, types::{ir_func_sig, ir_func_type, ir_type, ModuleTypes}, @@ -37,57 +38,29 @@ pub fn translate_module( parsed_module.module.set_name_override(name_override.clone()); } let module_types = module_types_builder.finish(); - build_ir_module(&mut parsed_module, &module_types, config, diagnostics) + + let func_env = FuncEnvironment::new(&parsed_module.module, &module_types, vec![]); + build_ir_module(&mut parsed_module, &module_types, func_env, config, diagnostics) } pub fn build_ir_module( mut parsed_module: &mut ParsedModule, module_types: &ModuleTypes, + func_env: FuncEnvironment, _config: &WasmTranslationConfig, diagnostics: &DiagnosticsHandler, ) -> WasmResult { let name = parsed_module.module.name(); let mut module_builder = ModuleBuilder::new(name.clone().as_str()); - for import in parsed_module.module.imports.clone() { - match import.index { - EntityIndex::Function(func_idx) => { - let func_name = parsed_module.module.func_name(func_idx); - let sig_idx = parsed_module.module.type_of(import.index).unwrap_func(); - let func = &module_types[sig_idx]; - let func_type = ir_func_type(&func)?; - let sig = ir_func_sig(&func_type, CallConv::SystemV, Linkage::External); - - let function_id: FunctionIdent = FunctionIdent { - module: module_builder.name(), - function: Ident::with_empty_span(Symbol::intern(func_name)), - }; - - // TODO: extract translated_function_imports from parsed_module so we don't mutate - // it here - parsed_module - .module - .translated_function_imports - .insert(func_idx, (function_id, sig)); - } - EntityIndex::Table(_) => { - // TODO: implement table imports - } - EntityIndex::Memory(_) => todo!(), - EntityIndex::Global(_) => todo!(), - } - } build_globals(&parsed_module.module, &mut module_builder, diagnostics)?; - build_data_segments(&parsed_module, &mut module_builder, diagnostics)?; + build_data_segments(parsed_module, &mut module_builder, diagnostics)?; let mut func_translator = FuncTranslator::new(); - // debug_assert!( - // !parsed_module.function_body_inputs.is_empty(), - // "No function bodies in a module. Check if it was already translated earlier." - // ); - let function_bodies = mem::take(&mut parsed_module.function_body_inputs); - for (defined_func_idx, body_data) in function_bodies { - let func_index = parsed_module.module.func_index(defined_func_idx); - let func_type = parsed_module.module.functions[func_index]; - let func_name = parsed_module.module.func_name(func_index); + // TODO: Ugly! Find a better way to consume the function body inputs + let func_body_inputs = mem::take(&mut parsed_module.function_body_inputs); + for (defined_func_idx, body_data) in func_body_inputs { + let func_index = &parsed_module.module.func_index(defined_func_idx); + let func_type = &parsed_module.module.functions[*func_index]; + let func_name = &parsed_module.module.func_name(*func_index); let wasm_func_type = module_types[func_type.signature].clone(); let ir_func_type = ir_func_type(&wasm_func_type)?; let sig = ir_func_sig(&ir_func_type, CallConv::SystemV, Linkage::External); @@ -99,6 +72,7 @@ pub fn build_ir_module( &mut module_func_builder, &parsed_module.module, &module_types, + &func_env, diagnostics, &mut func_validator, )?; diff --git a/frontend-wasm/src/module/func_env.rs b/frontend-wasm/src/module/func_env.rs new file mode 100644 index 000000000..0f58717e0 --- /dev/null +++ b/frontend-wasm/src/module/func_env.rs @@ -0,0 +1,72 @@ +use miden_hir::{CallConv, FunctionIdent, Ident, Linkage, Signature, Symbol}; +use rustc_hash::FxHashMap; + +use super::{instance::ModuleArgument, ir_func_type, FuncIndex, Module, ModuleTypes}; +use crate::{module::EntityIndex, translation_utils::sig_from_funct_type}; + +pub struct FuncEnvironment { + /// A translated IR function ids indexed by the Wasm function index. + function_ids: FxHashMap, + /// A translated IR function signatures, indexed by the Wasm function index. + signatures: FxHashMap, +} + +impl FuncEnvironment { + pub fn new(module: &Module, mod_types: &ModuleTypes, module_args: Vec) -> Self { + assert_eq!( + module.imports.len(), + module_args.len(), + "Mismatched module imports and arguments" + ); + let mut subst_imports = FxHashMap::default(); + for (import, arg) in module.imports.iter().zip(module_args) { + match (import.index, arg) { + (EntityIndex::Function(func_idx), ModuleArgument::Function(func_id)) => { + subst_imports.insert(func_idx, func_id); + } + (EntityIndex::Function(_), ModuleArgument::ComponentImport(_)) => { + // Do nothing, the local function name will be used + () + } + (EntityIndex::Table(_), ModuleArgument::Table) => { + // TODO: implement table imports + () + } + (import, arg) => { + panic!("Mismatched import and argument: {:?} {:?}", import, arg); + } + } + } + let mut function_ids = FxHashMap::default(); + let mut signatures = FxHashMap::default(); + for (index, _func) in &module.functions { + let func_type_idx = module.functions[index].clone(); + let func_type = mod_types[func_type_idx.signature].clone(); + let ir_func_type = ir_func_type(&func_type).unwrap(); + let sig = sig_from_funct_type(&ir_func_type, CallConv::SystemV, Linkage::External); + signatures.insert(index, sig); + if let Some(subst) = subst_imports.get(&index) { + function_ids.insert(index, subst.clone()); + } else { + let func_name = module.func_name(index); + let func_id = FunctionIdent { + module: Ident::with_empty_span(Symbol::intern(module.name())), + function: Ident::with_empty_span(Symbol::intern(func_name)), + }; + function_ids.insert(index, func_id); + }; + } + Self { + function_ids, + signatures, + } + } + + pub fn function_id(&self, function_idx: FuncIndex) -> &FunctionIdent { + &self.function_ids[&function_idx] + } + + pub fn signature(&self, function_idx: FuncIndex) -> &Signature { + &self.signatures[&function_idx] + } +} diff --git a/frontend-wasm/src/module/func_translation_state.rs b/frontend-wasm/src/module/func_translation_state.rs index df3d77a2b..262c5ea18 100644 --- a/frontend-wasm/src/module/func_translation_state.rs +++ b/frontend-wasm/src/module/func_translation_state.rs @@ -1,24 +1,25 @@ //! WebAssembly module and function translation state. //! -//! The `FuncTranslationState` struct defined in this module is used to keep track of the WebAssembly -//! value and control stacks during the translation of a single function. +//! The `FuncTranslationState` struct defined in this module is used to keep track of the +//! WebAssembly value and control stacks during the translation of a single function. //! //! Based on Cranelift's Wasm -> CLIF translator v11.0.0 -use crate::{ - error::{WasmError, WasmResult}, - module::types::{ir_func_type, BlockType, FuncIndex, ModuleTypes}, - translation_utils::sig_from_funct_type, +use std::{ + collections::hash_map::Entry::{Occupied, Vacant}, + vec::Vec, }; + use miden_diagnostics::{DiagnosticsHandler, SourceSpan}; -use miden_hir::{ - Block, CallConv, DataFlowGraph, FunctionIdent, Inst, InstBuilder, Linkage, Signature, Value, -}; +use miden_hir::{Block, DataFlowGraph, FunctionIdent, Inst, InstBuilder, Signature, Value}; use miden_hir_type::Type; use rustc_hash::FxHashMap; -use std::collections::{hash_map::Entry::Occupied, hash_map::Entry::Vacant}; -use super::{function_builder_ext::FunctionBuilderExt, Module}; +use super::{func_env::FuncEnvironment, function_builder_ext::FunctionBuilderExt}; +use crate::{ + error::{WasmError, WasmResult}, + module::types::{BlockType, FuncIndex}, +}; /// Information about the presence of an associated `else` for an `if`, or the /// lack thereof. @@ -112,6 +113,7 @@ impl ControlStackFrame { } => num_return_values, } } + pub fn num_param_values(&self) -> usize { match *self { Self::If { @@ -125,6 +127,7 @@ impl ControlStackFrame { } => num_param_values, } } + pub fn following_code(&self) -> Block { match *self { Self::If { destination, .. } @@ -132,12 +135,14 @@ impl ControlStackFrame { | Self::Loop { destination, .. } => destination, } } + pub fn br_destination(&self) -> Block { match *self { Self::If { destination, .. } | Self::Block { destination, .. } => destination, Self::Loop { header, .. } => header, } } + /// Private helper. Use `truncate_value_stack_to_else_params()` or /// `truncate_value_stack_to_original_size()` to restore value-stack state. fn original_stack_size(&self) -> usize { @@ -156,6 +161,7 @@ impl ControlStackFrame { } => original_stack_size, } } + pub fn is_loop(&self) -> bool { match *self { Self::If { .. } | Self::Block { .. } => false, @@ -279,9 +285,7 @@ impl FuncTranslationState { /// Pop one value. pub(crate) fn pop1(&mut self) -> Value { - self.stack - .pop() - .expect("attempted to pop a value from an empty stack") + self.stack.pop().expect("attempted to pop a value from an empty stack") } /// Pop one value and cast it to the specified type. @@ -291,19 +295,13 @@ impl FuncTranslationState { builder: &mut FunctionBuilderExt, span: SourceSpan, ) -> Value { - let val = self - .stack - .pop() - .expect("attempted to pop a value from an empty stack"); + let val = self.stack.pop().expect("attempted to pop a value from an empty stack"); builder.ins().cast(val, ty.clone(), span) } /// Peek at the top of the stack without popping it. pub(crate) fn peek1(&self) -> Value { - *self - .stack - .last() - .expect("attempted to peek at a value on an empty stack") + *self.stack.last().expect("attempted to peek at a value on an empty stack") } /// Pop two values. Return them in the order they were pushed. @@ -450,37 +448,22 @@ impl FuncTranslationState { &mut self, dfg: &mut DataFlowGraph, index: FuncIndex, - module: &Module, - mod_types: &ModuleTypes, + func_env: &FuncEnvironment, diagnostics: &DiagnosticsHandler, ) -> WasmResult<(FunctionIdent, usize)> { Ok(match self.functions.entry(index) { Occupied(entry) => *entry.get(), Vacant(entry) => { - let (module_id, func_name_id, sig) = if let Some((func_id, sig)) = - module.translated_function_imports.get(&index) - { - // This is an imported function - ( - func_id.module.clone(), - func_id.function.clone(), - sig.clone(), - ) - } else { - // This is a local function so use the current module name - let func_type_idx = module.functions[index].clone(); - let func_type = mod_types[func_type_idx.signature].clone(); - let func_name = module.func_name(index); - let mod_name = module.name(); - let mod_ident = mod_name.as_str().into(); - let func_name_id = func_name.as_str().into(); - let ir_func_type = ir_func_type(&func_type)?; - let sig = - sig_from_funct_type(&ir_func_type, CallConv::SystemV, Linkage::External); - (mod_ident, func_name_id, sig.clone()) - }; - let Ok(func_id) = dfg.import_function(module_id, func_name_id, sig.clone()) else { - let message = format!("Function with name {} in module {} with signature {sig:?} is already imported (function call) with a different signature", func_name_id, module_id); + let function_id = func_env.function_id(index); + let sig = func_env.signature(index); + let Ok(func_id) = + dfg.import_function(function_id.module, function_id.function, sig.clone()) + else { + let message = format!( + "Function with name {} in module {} with signature {sig:?} is already \ + imported (function call) with a different signature", + function_id.function, function_id.module + ); diagnostics .diagnostic(miden_diagnostics::Severity::Error) .with_message(message.clone()) diff --git a/frontend-wasm/src/module/func_translator.rs b/frontend-wasm/src/module/func_translator.rs index 084573201..ec14fb38e 100644 --- a/frontend-wasm/src/module/func_translator.rs +++ b/frontend-wasm/src/module/func_translator.rs @@ -6,19 +6,22 @@ //! //! Based on Cranelift's Wasm -> CLIF translator v11.0.0 -use crate::code_translator::translate_operator; -use crate::error::WasmResult; -use crate::module::func_translation_state::FuncTranslationState; -use crate::module::function_builder_ext::{FunctionBuilderContext, FunctionBuilderExt}; -use crate::module::types::{convert_valtype, ir_type, ModuleTypes}; -use crate::ssa::Variable; -use crate::translation_utils::emit_zero; use miden_diagnostics::{DiagnosticsHandler, SourceSpan}; -use miden_hir::cranelift_entity::EntityRef; -use miden_hir::{Block, InstBuilder, ModuleFunctionBuilder}; +use miden_hir::{cranelift_entity::EntityRef, Block, InstBuilder, ModuleFunctionBuilder}; use wasmparser::{BinaryReader, FuncValidator, FunctionBody, WasmModuleResources}; -use super::Module; +use super::{func_env::FuncEnvironment, Module}; +use crate::{ + code_translator::translate_operator, + error::WasmResult, + module::{ + func_translation_state::FuncTranslationState, + function_builder_ext::{FunctionBuilderContext, FunctionBuilderExt}, + types::{convert_valtype, ir_type, ModuleTypes}, + }, + ssa::Variable, + translation_utils::emit_zero, +}; /// WebAssembly to Miden IR function translator. /// @@ -46,6 +49,7 @@ impl FuncTranslator { mod_func_builder: &mut ModuleFunctionBuilder, module: &Module, mod_types: &ModuleTypes, + func_env: &FuncEnvironment, diagnostics: &DiagnosticsHandler, func_validator: &mut FuncValidator, ) -> WasmResult<()> { @@ -70,6 +74,7 @@ impl FuncTranslator { &mut self.state, module, mod_types, + func_env, diagnostics, func_validator, )?; @@ -151,6 +156,7 @@ fn parse_function_body( state: &mut FuncTranslationState, module: &Module, mod_types: &ModuleTypes, + func_env: &FuncEnvironment, diagnostics: &DiagnosticsHandler, func_validator: &mut FuncValidator, ) -> WasmResult<()> { @@ -167,6 +173,7 @@ fn parse_function_body( state, module, mod_types, + func_env, diagnostics, SourceSpan::default(), )?; @@ -181,9 +188,7 @@ fn parse_function_body( // generate a return instruction that doesn't match the signature. if state.reachable { if !builder.is_unreachable() { - builder - .ins() - .ret(state.stack.first().cloned(), SourceSpan::default()); + builder.ins().ret(state.stack.first().cloned(), SourceSpan::default()); } } diff --git a/frontend-wasm/src/module/instance.rs b/frontend-wasm/src/module/instance.rs new file mode 100644 index 000000000..272a5c7fe --- /dev/null +++ b/frontend-wasm/src/module/instance.rs @@ -0,0 +1,8 @@ +use miden_hir::{ComponentImport, FunctionIdent}; + +#[derive(Debug, Clone)] +pub enum ModuleArgument { + Function(FunctionIdent), + ComponentImport(ComponentImport), + Table, +} diff --git a/frontend-wasm/src/module/mod.rs b/frontend-wasm/src/module/mod.rs index c1edcd146..5521d1a46 100644 --- a/frontend-wasm/src/module/mod.rs +++ b/frontend-wasm/src/module/mod.rs @@ -7,19 +7,18 @@ use std::{borrow::Cow, collections::BTreeMap, ops::Range}; use indexmap::IndexMap; use miden_diagnostics::DiagnosticsHandler; -use miden_hir::{ - cranelift_entity::{packed_option::ReservedValue, EntityRef, PrimaryMap}, - FunctionIdent, Signature, -}; +use miden_hir::cranelift_entity::{packed_option::ReservedValue, EntityRef, PrimaryMap}; use rustc_hash::FxHashMap; use self::types::*; use crate::{component::SignatureIndex, error::WasmResult, unsupported_diag}; pub mod build_ir; +pub mod func_env; pub mod func_translation_state; pub mod func_translator; pub mod function_builder_ext; +pub mod instance; pub mod module_env; pub mod types; @@ -98,9 +97,6 @@ pub struct Module { /// All import records, in the order they are declared in the module. pub imports: Vec, - /// A translated function imports, indexed by the function index. - pub translated_function_imports: FxHashMap, - /// Exported entities. pub exports: IndexMap, diff --git a/hir/src/component/mod.rs b/hir/src/component/mod.rs index ee08e6c3b..d53733d99 100644 --- a/hir/src/component/mod.rs +++ b/hir/src/component/mod.rs @@ -30,7 +30,7 @@ impl fmt::Display for FunctionInvocationMethod { } /// A component import -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct ComponentImport { /// The interfact function name that is being imported pub interface_function: InterfaceFunctionIdent, From 84d6e1d56119500601080595fa3f5ca76b7735b2 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 15 Mar 2024 02:20:51 -0400 Subject: [PATCH 3/9] feat: `Component::modules` are topologically sorted according to the instantiation order --- Cargo.lock | 1 + Cargo.toml | 1 + frontend-wasm/Cargo.toml | 2 +- frontend-wasm/src/code_translator/mod.rs | 4 - frontend-wasm/src/component/build_ir.rs | 27 ++--- frontend-wasm/src/component/instance.rs | 2 +- frontend-wasm/src/module/build_ir.rs | 3 +- .../src/module/func_translation_state.rs | 5 +- frontend-wasm/src/module/module_env.rs | 105 +++++++----------- frontend-wasm/src/module/types.rs | 1 + hir/Cargo.toml | 1 + hir/src/component/mod.rs | 39 ++----- hir/src/formatter/mod.rs | 10 ++ .../src/rust_masm_tests/components.rs | 2 +- 14 files changed, 81 insertions(+), 122 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f4770b661..27a0b17e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2659,6 +2659,7 @@ dependencies = [ "cranelift-entity", "derive_more", "either", + "indexmap 2.1.0", "intrusive-collections", "inventory", "lalrpop", diff --git a/Cargo.toml b/Cargo.toml index 77ebe1f34..9c89cf285 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,7 @@ smallstr = { version = "0.3", features = ["union"] } thiserror = "1.0" toml = { version = "0.5", features = ["preserve_order"] } derive_more = "0.99" +indexmap = "2.1" # 211152c631d16a943aae503466b198b93c61150f is latest (as of Jan 25th) commit in the next branch miden-assembly = { git = "https://github.com/0xPolygonMiden/miden-vm", rev = "211152c631d16a943aae503466b198b93c61150f" } miden-core = { git = "https://github.com/0xPolygonMiden/miden-vm", rev = "211152c631d16a943aae503466b198b93c61150f" } diff --git a/frontend-wasm/Cargo.toml b/frontend-wasm/Cargo.toml index dd42a125f..90593c5bf 100644 --- a/frontend-wasm/Cargo.toml +++ b/frontend-wasm/Cargo.toml @@ -22,7 +22,7 @@ log.workspace = true anyhow.workspace = true wasmparser = "0.118.1" derive_more.workspace = true -indexmap = "2.1" +indexmap.workspace = true gimli = { version = "0.28.0", default-features = false, features = [ 'read', 'std', diff --git a/frontend-wasm/src/code_translator/mod.rs b/frontend-wasm/src/code_translator/mod.rs index 7c404809b..8fd3614d6 100644 --- a/frontend-wasm/src/code_translator/mod.rs +++ b/frontend-wasm/src/code_translator/mod.rs @@ -128,8 +128,6 @@ pub fn translate_operator( builder, FuncIndex::from_u32(*function_index), func_env, - module, - mod_types, span, diagnostics, )?; @@ -642,8 +640,6 @@ fn translate_call( builder: &mut FunctionBuilderExt, function_index: FuncIndex, func_env: &FuncEnvironment, - module: &Module, - mod_types: &ModuleTypes, span: SourceSpan, diagnostics: &DiagnosticsHandler, ) -> WasmResult<()> { diff --git a/frontend-wasm/src/component/build_ir.rs b/frontend-wasm/src/component/build_ir.rs index 24d87f13b..24094152c 100644 --- a/frontend-wasm/src/component/build_ir.rs +++ b/frontend-wasm/src/component/build_ir.rs @@ -6,16 +6,13 @@ use miden_hir::{ Symbol, }; use miden_hir_type::LiftedFunctionType; -use rustc_hash::FxHashMap; use wasmparser::WasmFeatures; use super::{ - inline, - instance::{ComponentImport, ComponentInstance, ComponentInstanceBuilder}, - interface_type_to_ir, CanonicalOptions, ComponentTypes, ComponentTypesBuilder, CoreDef, Export, - ExportItem, GlobalInitializer, InstantiateModule, LinearComponent, LinearComponentTranslation, - LoweredIndex, ParsedRootComponent, RuntimeImportIndex, RuntimeInstanceIndex, StaticModuleIndex, - Trampoline, TypeFuncIndex, + inline, instance::ComponentImport, interface_type_to_ir, CanonicalOptions, ComponentTypes, + ComponentTypesBuilder, CoreDef, Export, ExportItem, GlobalInitializer, InstantiateModule, + LinearComponent, LinearComponentTranslation, LoweredIndex, ParsedRootComponent, + RuntimeImportIndex, RuntimeInstanceIndex, StaticModuleIndex, Trampoline, TypeFuncIndex, }; use crate::{ component::{ComponentParser, StringEncoding}, @@ -98,8 +95,8 @@ fn build_ir<'data>( ensure_module_names(&mut parsed_modules); - //dbg!(&component.initializers); - //dbg!(&linear_component_translation.trampolines); + // dbg!(&component.initializers); + // dbg!(&linear_component_translation.trampolines); for initializer in &component.initializers { match initializer { GlobalInitializer::InstantiateModule(m) => { @@ -121,10 +118,9 @@ fn build_ir<'data>( for arg in args.iter() { match arg { CoreDef::Export(export) => { - // let static_module_idx = module_instances[export.instance]; match export.item { ExportItem::Index(entity_idx) => match entity_idx { - EntityIndex::Function(_func_idx) => { + EntityIndex::Function(func_idx) => { let module_id = module_instances_source[export.instance]; let module = &parsed_modules[module_id].module; @@ -175,7 +171,6 @@ fn build_ir<'data>( &parsed_modules, &component_types, component, - &mut cb, config, )?; cb.add_import(func_id, component_import.clone()); @@ -223,7 +218,7 @@ fn build_ir<'data>( } // build exports - for (name, export) in &component_instance.component.exports { + for (name, export) in &component.exports { build_export( export, &parsed_modules, @@ -240,7 +235,7 @@ fn build_ir<'data>( pub fn ensure_module_names(modules: &mut PrimaryMap>) { for (idx, parsed_module) in modules.iter_mut() { - parsed_module.module.set_name_fallback(format!("module{}", idx.as_u32())); + parsed_module.module.set_name_fallback(format!("module{}", idx.as_u32()).into()); } } @@ -249,7 +244,6 @@ fn build_import( parsed_modules: &PrimaryMap, component_types: &ComponentTypes, component: &LinearComponent, - cb: &mut miden_hir::ComponentBuilder<'_>, config: &WasmTranslationConfig, ) -> WasmResult<(FunctionIdent, miden_hir::ComponentImport)> { let (import_idx, import_names) = &component.imports[import.runtime_import_index]; @@ -278,7 +272,6 @@ fn build_import( }; let function_id = find_module_import_function(parsed_modules, full_interface_name, import_func_name)?; - cb.add_import(function_id, component_import); Ok((function_id, component_import)) } @@ -635,7 +628,7 @@ mod tests { results: vec![Type::U32], }; assert_eq!(export.function_ty, expected_export_func_ty); - let module = ir.modules().front().get().unwrap(); + let module = ir.modules().first().unwrap().1; // dbg!(&module.imports()); let import_info = module.imports(); let function_id = import_info diff --git a/frontend-wasm/src/component/instance.rs b/frontend-wasm/src/component/instance.rs index c1e088f00..0e95bfcd3 100644 --- a/frontend-wasm/src/component/instance.rs +++ b/frontend-wasm/src/component/instance.rs @@ -1,4 +1,4 @@ -// TODO: Delete this file +// TODO: delete this file #![allow(dead_code)] use miden_hir::cranelift_entity::PrimaryMap; diff --git a/frontend-wasm/src/module/build_ir.rs b/frontend-wasm/src/module/build_ir.rs index 635dea337..4f0348a87 100644 --- a/frontend-wasm/src/module/build_ir.rs +++ b/frontend-wasm/src/module/build_ir.rs @@ -12,7 +12,6 @@ use crate::{ func_translator::FuncTranslator, module_env::{FunctionBodyData, ModuleEnvironment, ParsedModule}, types::{ir_func_sig, ir_func_type, ir_type, ModuleTypes}, - EntityIndex, }, WasmError, WasmTranslationConfig, }; @@ -44,7 +43,7 @@ pub fn translate_module( } pub fn build_ir_module( - mut parsed_module: &mut ParsedModule, + parsed_module: &mut ParsedModule, module_types: &ModuleTypes, func_env: FuncEnvironment, _config: &WasmTranslationConfig, diff --git a/frontend-wasm/src/module/func_translation_state.rs b/frontend-wasm/src/module/func_translation_state.rs index 262c5ea18..b2039c616 100644 --- a/frontend-wasm/src/module/func_translation_state.rs +++ b/frontend-wasm/src/module/func_translation_state.rs @@ -5,10 +5,7 @@ //! //! Based on Cranelift's Wasm -> CLIF translator v11.0.0 -use std::{ - collections::hash_map::Entry::{Occupied, Vacant}, - vec::Vec, -}; +use std::collections::hash_map::Entry::{Occupied, Vacant}; use miden_diagnostics::{DiagnosticsHandler, SourceSpan}; use miden_hir::{Block, DataFlowGraph, FunctionIdent, Inst, InstBuilder, Signature, Value}; diff --git a/frontend-wasm/src/module/module_env.rs b/frontend-wasm/src/module/module_env.rs index 1953e1267..da47360c1 100644 --- a/frontend-wasm/src/module/module_env.rs +++ b/frontend-wasm/src/module/module_env.rs @@ -1,29 +1,32 @@ -use crate::component::SignatureIndex; -use crate::error::WasmResult; -use crate::module::types::{ - convert_func_type, convert_global_type, convert_table_type, convert_valtype, DataSegmentOffset, - DefinedFuncIndex, ElemIndex, EntityIndex, EntityType, FuncIndex, GlobalIndex, GlobalInit, - MemoryIndex, ModuleTypesBuilder, TableIndex, TypeIndex, WasmType, -}; -use crate::module::{FuncRefIndex, Module, ModuleType, TableSegment}; -use crate::{unsupported_diag, WasmError, WasmTranslationConfig}; +use std::{ops::Range, path::PathBuf, sync::Arc}; use miden_diagnostics::DiagnosticsHandler; -use miden_hir::cranelift_entity::packed_option::ReservedValue; -use miden_hir::cranelift_entity::PrimaryMap; +use miden_hir::cranelift_entity::{packed_option::ReservedValue, PrimaryMap}; use rustc_hash::FxHashMap; -use std::ops::Range; -use std::path::PathBuf; -use std::sync::Arc; -use wasmparser::types::CoreTypeId; use wasmparser::{ - CompositeType, CustomSectionReader, DataKind, ElementItems, ElementKind, Encoding, - ExternalKind, FuncToValidate, FunctionBody, NameSectionReader, Naming, Operator, Parser, - Payload, TypeRef, Validator, ValidatorResources, + types::CoreTypeId, CompositeType, CustomSectionReader, DataKind, ElementItems, ElementKind, + Encoding, ExternalKind, FuncToValidate, FunctionBody, NameSectionReader, Naming, Operator, + Parser, Payload, TypeRef, Validator, ValidatorResources, }; -use super::types::{DataSegment, DataSegmentIndex}; -use super::{ModuleImport, TableInitialValue}; +use super::{ + types::{DataSegment, DataSegmentIndex}, + ModuleImport, TableInitialValue, +}; +use crate::{ + component::SignatureIndex, + error::WasmResult, + module::{ + types::{ + convert_func_type, convert_global_type, convert_table_type, convert_valtype, + DataSegmentOffset, DefinedFuncIndex, ElemIndex, EntityIndex, EntityType, FuncIndex, + GlobalIndex, GlobalInit, MemoryIndex, ModuleTypesBuilder, TableIndex, TypeIndex, + WasmType, + }, + FuncRefIndex, Module, ModuleType, TableSegment, + }, + unsupported_diag, WasmError, WasmTranslationConfig, +}; /// Object containing the standalone environment information. pub struct ModuleEnvironment<'a, 'data> { @@ -329,11 +332,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { } } }; - self.result - .module - .table_initialization - .initial_values - .push(init); + self.result.module.table_initialization.initial_values.push(init); }) } @@ -403,10 +402,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { // this never gets past validation ExternalKind::Tag => unreachable!(), }; - self.result - .module - .exports - .insert(String::from(name), entity); + self.result.module.exports.insert(String::from(name), entity); }) } @@ -488,26 +484,19 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { } }; - self.result - .module - .table_initialization - .segments - .push(TableSegment { - table_index, - base, - offset, - elements: elements.into(), - }); + self.result.module.table_initialization.segments.push(TableSegment { + table_index, + base, + offset, + elements: elements.into(), + }); } ElementKind::Passive => { let elem_index = ElemIndex::from_u32(index as u32); let index = self.result.module.passive_elements.len(); self.result.module.passive_elements.push(elements.into()); - self.result - .module - .passive_elements_map - .insert(elem_index, index); + self.result.module.passive_elements_map.insert(elem_index, index); } ElementKind::Declared => {} @@ -536,19 +525,13 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { let ty = convert_valtype(ty); locals.push((cnt, ty)); } - self.result - .debuginfo - .wasm_file - .funcs - .push(FunctionMetadata { - locals: locals.into_boxed_slice(), - params: sig.params().into(), - }); + self.result.debuginfo.wasm_file.funcs.push(FunctionMetadata { + locals: locals.into_boxed_slice(), + params: sig.params().into(), + }); } body.allow_memarg64(false); - self.result - .function_body_inputs - .push(FunctionBodyData { validator, body }); + self.result.function_body_inputs.push(FunctionBodyData { validator, body }); self.result.code_index += 1; Ok(()) } @@ -574,7 +557,8 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { } => { assert_eq!( memory_index, 0, - "data section memory index must be 0 (only one memory per module is supported)" + "data section memory index must be 0 (only one memory per module is \ + supported)" ); let mut offset_expr_reader = offset_expr.get_binary_reader(); let offset = match offset_expr_reader.read_operator()? { @@ -621,11 +605,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { // names are almost always present in the // final compilation artifact. let index = FuncIndex::from_u32(index); - self.result - .module - .name_section - .func_names - .insert(index, name.to_string()); + self.result.module.name_section.func_names.insert(index, name.to_string()); } } wasmparser::Name::Module { name, .. } => { @@ -780,10 +760,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { CompositeType::Func(ty) => { let wasm = convert_func_type(ty); let sig_index = self.types.wasm_func_type(id, wasm); - self.result - .module - .types - .push(ModuleType::Function(sig_index)); + self.result.module.types.push(ModuleType::Function(sig_index)); } CompositeType::Array(_) | CompositeType::Struct(_) => unimplemented!(), } diff --git a/frontend-wasm/src/module/types.rs b/frontend-wasm/src/module/types.rs index 6e14e3295..041d0eb78 100644 --- a/frontend-wasm/src/module/types.rs +++ b/frontend-wasm/src/module/types.rs @@ -429,6 +429,7 @@ impl DataSegmentOffset { /// A WebAssembly data segment. /// https://www.w3.org/TR/wasm-core-1/#data-segments%E2%91%A0 +#[derive(Debug)] pub struct DataSegment<'a> { /// The offset of the data segment inside the linear memory. pub offset: DataSegmentOffset, diff --git a/hir/Cargo.toml b/hir/Cargo.toml index d02e27aa5..c485c38ca 100644 --- a/hir/Cargo.toml +++ b/hir/Cargo.toml @@ -43,6 +43,7 @@ typed-arena = "2.0" unicode-width = { version = "0.1", features = ["no_std"] } winter-math = { version = "0.7", default-features = false } derive_more.workspace = true +indexmap.workspace = true [dev-dependencies] pretty_assertions = "1.0" diff --git a/hir/src/component/mod.rs b/hir/src/component/mod.rs index d53733d99..4e07e8709 100644 --- a/hir/src/component/mod.rs +++ b/hir/src/component/mod.rs @@ -1,7 +1,7 @@ use alloc::collections::BTreeMap; use core::ops::{Deref, DerefMut}; -use intrusive_collections::RBTree; +use indexmap::IndexMap; use miden_core::crypto::hash::RpoDigest; use self::formatter::PrettyPrint; @@ -87,8 +87,9 @@ pub struct ComponentExport { /// have exports/imports. #[derive(Default)] pub struct Component { - /// This tree stores all of the modules - modules: RBTree, + /// This tree stores all of the modules. + /// The modules should be stored in a topological order + modules: IndexMap>, /// A list of this component's imports, indexed by function identifier imports: BTreeMap, @@ -105,23 +106,23 @@ impl Component { } /// Return a reference to the module table for this program - pub fn modules(&self) -> &RBTree { + pub fn modules(&self) -> &IndexMap> { &self.modules } /// Return a mutable reference to the module table for this program - pub fn modules_mut(&mut self) -> &mut RBTree { + pub fn modules_mut(&mut self) -> &mut IndexMap> { &mut self.modules } /// Returns true if `name` is defined in this program. pub fn contains(&self, name: Ident) -> bool { - !self.modules.find(&name).is_null() + !self.modules.contains_key(&name) } /// Look up the signature of a function in this program by `id` pub fn signature(&self, id: &FunctionIdent) -> Option<&Signature> { - let module = self.modules.find(&id.module).get()?; + let module = self.modules.get(&id.module)?; module.function(id.function).map(|f| &f.signature) } @@ -162,7 +163,7 @@ impl formatter::PrettyPrint for Component { let modules = self .modules - .iter() + .values() .map(PrettyPrint::render) .reduce(|acc, doc| acc + nl() + doc) .map(|doc| const_text(";; Modules") + nl() + doc) @@ -194,7 +195,7 @@ impl formatter::PrettyPrint for Component { /// Simply create the builder, add/build one or more modules, then call `link` to obtain a /// [Component]. pub struct ComponentBuilder<'a> { - modules: BTreeMap>, + modules: IndexMap>, imports: BTreeMap, exports: BTreeMap, entry: Option, @@ -262,31 +263,13 @@ impl<'a> ComponentBuilder<'a> { self.imports.insert(function_id, import); } - // fn find_import(&self, interface_function_id: &InterfaceFunctionIdent) -> - // Option { dbg!(&interface_function_id); - // for (_id, module) in &self.modules { - // for import_function_id in module.imports().imported(&module.name().unwrap()).unwrap() - // { dbg!(&import_function_id); - // if import_function_id.module == interface_function_id.interface.full_name - // && import_function_id.function.as_str() - // == interface_function_id.function.as_str() - // { - // return Some(import_function_id.clone()); - // } - // } - // } - // None - // } - pub fn add_export(&mut self, name: FunctionExportName, export: ComponentExport) { self.exports.insert(name, export); } pub fn build(self) -> Component { let mut c = Component::default(); - for module in self.modules.into_values() { - c.modules.insert(module); - } + c.modules = self.modules; c.exports = self.exports; c.imports = self.imports; c diff --git a/hir/src/formatter/mod.rs b/hir/src/formatter/mod.rs index ad481809f..6f0646d31 100644 --- a/hir/src/formatter/mod.rs +++ b/hir/src/formatter/mod.rs @@ -113,6 +113,16 @@ impl<'a> PrettyPrint for alloc::borrow::Cow<'a, str> { } } +impl PrettyPrint for alloc::boxed::Box { + fn render(&self) -> Document { + PrettyPrint::render(self.as_ref()) + } + + fn pretty_print(&self, f: &mut fmt::Formatter) -> fmt::Result { + PrettyPrint::pretty_print(self.as_ref(), f) + } +} + struct Prettier<'a, P: ?Sized + PrettyPrint>(&'a P); impl<'a, P: ?Sized + PrettyPrint> fmt::Display for Prettier<'a, P> { diff --git a/tests/integration/src/rust_masm_tests/components.rs b/tests/integration/src/rust_masm_tests/components.rs index 77a39488c..6e3065c12 100644 --- a/tests/integration/src/rust_masm_tests/components.rs +++ b/tests/integration/src/rust_masm_tests/components.rs @@ -75,7 +75,7 @@ fn wcm_inc() { results: vec![Type::U32], }; assert_eq!(export.function_ty, expected_export_func_ty); - let module = ir_component.modules().front().get().unwrap(); + let module = ir_component.modules().first().unwrap().1; dbg!(&module.imports()); let import_info = module.imports(); let function_id = import_info From 6b01bf5bd6a102e673f282b9c20fcd886a80f6ac Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Mon, 26 Feb 2024 17:40:45 +0200 Subject: [PATCH 4/9] fix: find the correct core module function for the IR component import --- frontend-wasm/src/component/build_ir.rs | 73 +- .../sdk_basic_wallet/basic_wallet.hir | 918 ++++++++++++++++++ 2 files changed, 948 insertions(+), 43 deletions(-) create mode 100644 tests/integration/expected/sdk_basic_wallet/basic_wallet.hir diff --git a/frontend-wasm/src/component/build_ir.rs b/frontend-wasm/src/component/build_ir.rs index 24094152c..ab979c610 100644 --- a/frontend-wasm/src/component/build_ir.rs +++ b/frontend-wasm/src/component/build_ir.rs @@ -114,8 +114,10 @@ fn build_ir<'data>( ))); } module_instances_source.push(*static_module_idx); + let module = &parsed_modules[*static_module_idx].module; + // dbg!(&module); let mut module_args: Vec = Vec::new(); - for arg in args.iter() { + for (idx, arg) in args.iter().enumerate() { match arg { CoreDef::Export(export) => { match export.item { @@ -123,9 +125,11 @@ fn build_ir<'data>( EntityIndex::Function(func_idx) => { let module_id = module_instances_source[export.instance]; - let module = &parsed_modules[module_id].module; - let func_name = module.func_name(func_idx); - let module_name = module.name(); + let exporting_module = + &parsed_modules[module_id].module; + let func_name = + exporting_module.func_name(func_idx); + let module_name = exporting_module.name(); let function_id = FunctionIdent { module: Ident::with_empty_span(Symbol::intern( module_name, @@ -166,14 +170,28 @@ fn build_ir<'data>( runtime_import_index: import, signature: *lower_ty, }; - let (func_id, component_import) = build_import( + let module_import = module + .imports + .get(idx) + .expect("module import not found"); + let func_name = + module.func_name(module_import.index.unwrap_func()); + let module_name = module.name(); + let function_id = FunctionIdent { + module: Ident::with_empty_span(Symbol::intern( + module_name, + )), + function: Ident::with_empty_span(Symbol::intern( + func_name, + )), + }; + let component_import = build_import( &import, - &parsed_modules, &component_types, component, config, )?; - cb.add_import(func_id, component_import.clone()); + cb.add_import(function_id, component_import.clone()); module_args.push(ModuleArgument::ComponentImport( component_import, )); @@ -185,19 +203,15 @@ fn build_ir<'data>( } let module_types = component_types.module_types(); - let func_env = FuncEnvironment::new( - &parsed_modules[*static_module_idx].module, - module_types, - module_args, - ); - let module = build_ir_module( + let func_env = FuncEnvironment::new(module, module_types, module_args); + let ir_module = build_ir_module( parsed_modules.get_mut(*static_module_idx).unwrap(), module_types, func_env, config, diagnostics, )?; - cb.add_module(module.into()).expect("module is already added"); + cb.add_module(ir_module.into()).expect("module is already added"); } InstantiateModule::Import(..) => todo!(), }; @@ -241,11 +255,10 @@ pub fn ensure_module_names(modules: &mut PrimaryMap, component_types: &ComponentTypes, component: &LinearComponent, config: &WasmTranslationConfig, -) -> WasmResult<(FunctionIdent, miden_hir::ComponentImport)> { +) -> WasmResult { let (import_idx, import_names) = &component.imports[import.runtime_import_index]; if import_names.len() != 1 { return Err(crate::WasmError::Unsupported("multi-name imports not supported".to_string())); @@ -270,33 +283,7 @@ fn build_import( invoke_method: import_metadata.invoke_method, digest: import_metadata.digest.clone(), }; - let function_id = - find_module_import_function(parsed_modules, full_interface_name, import_func_name)?; - Ok((function_id, component_import)) -} - -fn find_module_import_function( - parsed_modules: &PrimaryMap, - full_interface_name: String, - import_func_name: &String, -) -> WasmResult { - for (_idx, parsed_module) in parsed_modules { - for import in &parsed_module.module.imports { - if import.module == full_interface_name && &import.field == import_func_name { - let func_idx = import.index.unwrap_func(); - let func_name = parsed_module.module.func_name(func_idx); - let module_instance_name = parsed_module.module.name(); - return Ok(FunctionIdent { - module: Ident::with_empty_span(Symbol::intern(module_instance_name)), - function: Ident::with_empty_span(Symbol::intern(func_name)), - }); - } - } - } - Err(WasmError::Unexpected(format!( - "failed to find module import for interface {} and function {}", - full_interface_name, import_func_name - ))) + Ok(component_import) } fn build_export<'data>( diff --git a/tests/integration/expected/sdk_basic_wallet/basic_wallet.hir b/tests/integration/expected/sdk_basic_wallet/basic_wallet.hir new file mode 100644 index 000000000..86de18ccb --- /dev/null +++ b/tests/integration/expected/sdk_basic_wallet/basic_wallet.hir @@ -0,0 +1,918 @@ +component + +import "call" miden:base/tx-kernel@1.0.0::create-note fn((u64, u64, u64, u64), u64, (u64, u64, u64, u64)) mast#0x0000000000000000000000000000000000000000000000000000000000000000 lower module0::basic_wallet::bindings::miden::base::tx_kernel::create_note::wit_import +import "call" miden:base/tx-kernel@1.0.0::add-asset fn((u64, u64, u64, u64)) -> (u64, u64, u64, u64) mast#0x0000000000000000000000000000000000000000000000000000000000000000 lower wit-component:fixups::func0 +import "call" miden:base/tx-kernel@1.0.0::remove-asset fn((u64, u64, u64, u64)) -> (u64, u64, u64, u64) mast#0x0000000000000000000000000000000000000000000000000000000000000000 lower wit-component:fixups::func1 + +// ==================================================================== +module wit-component:shim + +pub fn indirect-miden:base/tx-kernel@1.0.0-add-asset(i64, i64, i64, i64, i32) { +block0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i32): + v5 = const.i32 0 : i32; + br block1; + +block1: + ret; +} + +pub fn indirect-miden:base/tx-kernel@1.0.0-remove-asset(i64, i64, i64, i64, i32) { +block0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i32): + v5 = const.i32 1 : i32; + br block1; + +block1: + ret; +} + +// ==================================================================== +module module0 + +const $0 = 0x00100000; + +global external @__stack_pointer : i32 = $0 { id = 0 }; + +pub fn __wasm_call_ctors() { +block0: + br block1; + +block1: + ret; +} + +pub fn miden:basic-wallet/basic-wallet@1.0.0#receive-asset(i64, i64, i64, i64) { +block0(v0: i64, v1: i64, v2: i64, v3: i64): + v4 = const.i32 0 : i32; + v5 = global.load (@__stack_pointer) as *mut i8 : i32; + v6 = const.i32 32 : i32; + v7 = sub.wrapping v5, v6 : i32; + v8 = global.symbol @__stack_pointer : *mut i32; + store v8, v7; + call module0::wit_bindgen::rt::run_ctors_once(); + call wit-component:shim::indirect-miden:base/tx-kernel@1.0.0-add-asset(v0, v1, v2, v3, v7); + v9 = const.i32 32 : i32; + v10 = add.wrapping v7, v9 : i32; + v11 = global.symbol @__stack_pointer : *mut i32; + store v11, v10; + br block1; + +block1: + ret; +} + +pub fn miden:basic-wallet/basic-wallet@1.0.0#send-asset(i64, i64, i64, i64, i64, i64, i64, i64, i64) { +block0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i64, v5: i64, v6: i64, v7: i64, v8: i64): + v9 = const.i32 0 : i32; + v10 = global.load (@__stack_pointer) as *mut i8 : i32; + v11 = const.i32 32 : i32; + v12 = sub.wrapping v10, v11 : i32; + v13 = global.symbol @__stack_pointer : *mut i32; + store v13, v12; + call module0::wit_bindgen::rt::run_ctors_once(); + call wit-component:shim::indirect-miden:base/tx-kernel@1.0.0-remove-asset(v0, v1, v2, v3, v12); + v14 = cast v12 : u32; + v15 = inttoptr v14 : *mut i64; + v16 = load v15 : i64; + v17 = const.i32 8 : i32; + v18 = add.wrapping v12, v17 : i32; + v19 = cast v18 : u32; + v20 = inttoptr v19 : *mut i64; + v21 = load v20 : i64; + v22 = const.i32 16 : i32; + v23 = add.wrapping v12, v22 : i32; + v24 = cast v23 : u32; + v25 = inttoptr v24 : *mut i64; + v26 = load v25 : i64; + v27 = const.i32 24 : i32; + v28 = add.wrapping v12, v27 : i32; + v29 = cast v28 : u32; + v30 = inttoptr v29 : *mut i64; + v31 = load v30 : i64; + call module0::basic_wallet::bindings::miden::base::tx_kernel::create_note::wit_import(v16, v21, v26, v31, v4, v5, v6, v7, v8); + v32 = const.i32 32 : i32; + v33 = add.wrapping v12, v32 : i32; + v34 = global.symbol @__stack_pointer : *mut i32; + store v34, v33; + br block1; + +block1: + ret; +} + +pub fn __rust_alloc(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v3 = const.i32 1048576 : i32; + v4 = call module0::::alloc(v3, v1, v0) : i32; + br block1(v4); + +block1(v2: i32): + ret v2; +} + +pub fn __rust_realloc(i32, i32, i32, i32) -> i32 { +block0(v0: i32, v1: i32, v2: i32, v3: i32): + v5 = const.i32 0 : i32; + v6 = const.i32 1048576 : i32; + v7 = call module0::::alloc(v6, v2, v3) : i32; + v8 = eq v7, 0 : i1; + v9 = cast v8 : i32; + v10 = neq v9, 0 : i1; + condbr v10, block2(v7), block3; + +block1(v4: i32): + ret v4; + +block2(v22: i32): + br block1(v22); + +block3: + v11 = cast v1 : u32; + v12 = cast v3 : u32; + v13 = lt v11, v12 : i1; + v14 = cast v13 : i32; + v15 = neq v14, 0 : i1; + v16 = select v15, v1, v3 : i32; + v17 = cast v7 : u32; + v18 = inttoptr v17 : *mut u8; + v19 = cast v0 : u32; + v20 = inttoptr v19 : *mut u8; + memcpy v20, v18, v16; + v21 = const.i32 1048576 : i32; + call module0::::dealloc(v21, v0, v2, v1); + br block2(v7); +} + +pub fn wee_alloc::alloc_first_fit(i32, i32, i32) -> i32 { +block0(v0: i32, v1: i32, v2: i32): + v4 = const.i32 0 : i32; + v5 = cast v2 : u32; + v6 = inttoptr v5 : *mut i32; + v7 = load v6 : i32; + v8 = neq v7, 0 : i1; + condbr v8, block2, block3; + +block1(v3: i32): + ret v3; + +block2: + v10 = const.i32 -1 : i32; + v11 = add.wrapping v1, v10 : i32; + v12 = const.i32 0 : i32; + v13 = sub.wrapping v12, v1 : i32; + v14 = const.i32 2 : i32; + v15 = shl.wrapping v0, v14 : i32; + br block4(v7, v2, v15, v13, v11); + +block3: + v9 = const.i32 0 : i32; + ret v9; + +block4(v16: i32, v147: i32, v158: i32, v173: i32, v186: i32): + v17 = cast v16 : u32; + v18 = add.checked v17, 8 : u32; + v19 = inttoptr v18 : *mut i32; + v20 = load v19 : i32; + v21 = const.i32 1 : i32; + v22 = band v20, v21 : i32; + v23 = neq v22, 0 : i1; + condbr v23, block7, block8; + +block5: + v305 = const.i32 0 : i32; + br block1(v305); + +block6(v148: i32, v157: i32, v172: i32, v185: i32, v194: i32, v298: i32): + v149 = cast v148 : u32; + v150 = inttoptr v149 : *mut i32; + v151 = load v150 : i32; + v152 = const.i32 -4 : i32; + v153 = band v151, v152 : i32; + v154 = const.i32 8 : i32; + v155 = add.wrapping v148, v154 : i32; + v156 = sub.wrapping v153, v155 : i32; + v164 = cast v156 : u32; + v165 = cast v157 : u32; + v166 = lt v164, v165 : i1; + v167 = cast v166 : i32; + v168 = neq v167, 0 : i1; + condbr v168, block22(v194, v298, v157, v172, v185), block23; + +block7: + br block9(v16, v20, v147, v158, v173, v186); + +block8: + br block6(v16, v158, v173, v186, v147, v20); + +block9(v24: i32, v25: i32, v136: i32, v163: i32, v178: i32, v191: i32): + v26 = const.i32 -2 : i32; + v27 = band v25, v26 : i32; + v28 = cast v24 : u32; + v29 = add.checked v28, 8 : u32; + v30 = inttoptr v29 : *mut i32; + store v30, v27; + v31 = cast v24 : u32; + v32 = add.checked v31, 4 : u32; + v33 = inttoptr v32 : *mut i32; + v34 = load v33 : i32; + v35 = const.i32 -4 : i32; + v36 = band v34, v35 : i32; + v37 = neq v36, 0 : i1; + condbr v37, block12, block13; + +block10: + br block6(v137, v159, v174, v187, v132, v143); + +block11(v48: i32, v66: i32, v106: i32, v124: i32, v135: i32, v162: i32, v177: i32, v190: i32): + v49 = cast v48 : u32; + v50 = inttoptr v49 : *mut i32; + v51 = load v50 : i32; + v52 = const.i32 -4 : i32; + v53 = band v51, v52 : i32; + v54 = eq v53, 0 : i1; + v55 = cast v54 : i32; + v56 = neq v55, 0 : i1; + condbr v56, block14(v66, v51, v48, v106, v124, v135, v162, v177, v190), block15; + +block12: + v39 = const.i32 0 : i32; + v40 = cast v36 : u32; + v41 = inttoptr v40 : *mut u8; + v42 = load v41 : u8; + v43 = zext v42 : i32; + v44 = const.i32 1 : i32; + v45 = band v43, v44 : i32; + v46 = neq v45, 0 : i1; + v47 = select v46, v39, v36 : i32; + br block11(v24, v36, v34, v47, v136, v163, v178, v191); + +block13: + v38 = const.i32 0 : i32; + br block11(v24, v36, v34, v38, v136, v163, v178, v191); + +block14(v80: i32, v89: i32, v95: i32, v105: i32, v123: i32, v134: i32, v161: i32, v176: i32, v189: i32): + v81 = eq v80, 0 : i1; + v82 = cast v81 : i32; + v83 = neq v82, 0 : i1; + condbr v83, block17(v95, v105, v89, v123, v134, v161, v176, v189), block18; + +block15: + v57 = const.i32 2 : i32; + v58 = band v51, v57 : i32; + v59 = neq v58, 0 : i1; + condbr v59, block14(v66, v51, v48, v106, v124, v135, v162, v177, v190), block16; + +block16: + v60 = cast v53 : u32; + v61 = add.checked v60, 4 : u32; + v62 = inttoptr v61 : *mut i32; + v63 = load v62 : i32; + v64 = const.i32 3 : i32; + v65 = band v63, v64 : i32; + v67 = bor v65, v66 : i32; + v68 = cast v53 : u32; + v69 = add.checked v68, 4 : u32; + v70 = inttoptr v69 : *mut i32; + store v70, v67; + v71 = cast v48 : u32; + v72 = add.checked v71, 4 : u32; + v73 = inttoptr v72 : *mut i32; + v74 = load v73 : i32; + v75 = const.i32 -4 : i32; + v76 = band v74, v75 : i32; + v77 = cast v48 : u32; + v78 = inttoptr v77 : *mut i32; + v79 = load v78 : i32; + br block14(v76, v79, v48, v74, v124, v135, v162, v177, v190); + +block17(v103: i32, v104: i32, v112: i32, v122: i32, v133: i32, v160: i32, v175: i32, v188: i32): + v107 = const.i32 3 : i32; + v108 = band v104, v107 : i32; + v109 = cast v103 : u32; + v110 = add.checked v109, 4 : u32; + v111 = inttoptr v110 : *mut i32; + store v111, v108; + v113 = const.i32 3 : i32; + v114 = band v112, v113 : i32; + v115 = cast v103 : u32; + v116 = inttoptr v115 : *mut i32; + store v116, v114; + v117 = const.i32 2 : i32; + v118 = band v112, v117 : i32; + v119 = eq v118, 0 : i1; + v120 = cast v119 : i32; + v121 = neq v120, 0 : i1; + condbr v121, block19(v133, v122, v160, v175, v188), block20; + +block18: + v84 = cast v80 : u32; + v85 = inttoptr v84 : *mut i32; + v86 = load v85 : i32; + v87 = const.i32 3 : i32; + v88 = band v86, v87 : i32; + v90 = const.i32 -4 : i32; + v91 = band v89, v90 : i32; + v92 = bor v88, v91 : i32; + v93 = cast v80 : u32; + v94 = inttoptr v93 : *mut i32; + store v94, v92; + v96 = cast v95 : u32; + v97 = add.checked v96, 4 : u32; + v98 = inttoptr v97 : *mut i32; + v99 = load v98 : i32; + v100 = cast v95 : u32; + v101 = inttoptr v100 : *mut i32; + v102 = load v101 : i32; + br block17(v95, v99, v102, v123, v134, v161, v176, v189); + +block19(v132: i32, v137: i32, v159: i32, v174: i32, v187: i32): + v138 = cast v132 : u32; + v139 = inttoptr v138 : *mut i32; + store v139, v137; + v140 = cast v137 : u32; + v141 = add.checked v140, 8 : u32; + v142 = inttoptr v141 : *mut i32; + v143 = load v142 : i32; + v144 = const.i32 1 : i32; + v145 = band v143, v144 : i32; + v146 = neq v145, 0 : i1; + condbr v146, block9(v137, v143, v132, v159, v174, v187), block21; + +block20: + v125 = cast v122 : u32; + v126 = inttoptr v125 : *mut i32; + v127 = load v126 : i32; + v128 = const.i32 2 : i32; + v129 = bor v127, v128 : i32; + v130 = cast v122 : u32; + v131 = inttoptr v130 : *mut i32; + store v131, v129; + br block19(v133, v122, v160, v175, v188); + +block21: + br block10; + +block22(v296: i32, v297: i32, v302: i32, v303: i32, v304: i32): + v299 = cast v296 : u32; + v300 = inttoptr v299 : *mut i32; + store v300, v297; + v301 = neq v297, 0 : i1; + condbr v301, block4(v297, v296, v302, v303, v304), block33; + +block23: + v169 = const.i32 72 : i32; + v170 = add.wrapping v155, v169 : i32; + v171 = sub.wrapping v153, v157 : i32; + v179 = band v171, v172 : i32; + v180 = cast v170 : u32; + v181 = cast v179 : u32; + v182 = lte v180, v181 : i1; + v183 = cast v182 : i32; + v184 = neq v183, 0 : i1; + condbr v184, block25, block26; + +block24(v288: i32, v289: i32): + v290 = const.i32 1 : i32; + v291 = bor v289, v290 : i32; + v292 = cast v288 : u32; + v293 = inttoptr v292 : *mut i32; + store v293, v291; + v294 = const.i32 8 : i32; + v295 = add.wrapping v288, v294 : i32; + ret v295; + +block25: + v206 = const.i32 0 : i32; + v207 = const.i32 0 : i32; + v208 = cast v179 : u32; + v209 = inttoptr v208 : *mut i32; + store v209, v207; + v210 = const.i32 -8 : i32; + v211 = add.wrapping v179, v210 : i32; + v212 = const.i64 0 : i64; + v213 = cast v211 : u32; + v214 = inttoptr v213 : *mut i64; + store v214, v212; + v215 = cast v148 : u32; + v216 = inttoptr v215 : *mut i32; + v217 = load v216 : i32; + v218 = const.i32 -4 : i32; + v219 = band v217, v218 : i32; + v220 = cast v211 : u32; + v221 = inttoptr v220 : *mut i32; + store v221, v219; + v222 = cast v148 : u32; + v223 = inttoptr v222 : *mut i32; + v224 = load v223 : i32; + v225 = const.i32 -4 : i32; + v226 = band v224, v225 : i32; + v227 = eq v226, 0 : i1; + v228 = cast v227 : i32; + v229 = neq v228, 0 : i1; + condbr v229, block28(v211, v206, v148), block29; + +block26: + v192 = band v185, v155 : i32; + v193 = neq v192, 0 : i1; + condbr v193, block22(v194, v298, v157, v172, v185), block27; + +block27: + v195 = cast v148 : u32; + v196 = add.checked v195, 8 : u32; + v197 = inttoptr v196 : *mut i32; + v198 = load v197 : i32; + v199 = const.i32 -4 : i32; + v200 = band v198, v199 : i32; + v201 = cast v194 : u32; + v202 = inttoptr v201 : *mut i32; + store v202, v200; + v203 = cast v148 : u32; + v204 = inttoptr v203 : *mut i32; + v205 = load v204 : i32; + br block24(v148, v205); + +block28(v249: i32, v250: i32, v251: i32): + v252 = bor v250, v251 : i32; + v253 = cast v249 : u32; + v254 = add.checked v253, 4 : u32; + v255 = inttoptr v254 : *mut i32; + store v255, v252; + v256 = cast v251 : u32; + v257 = add.checked v256, 8 : u32; + v258 = inttoptr v257 : *mut i32; + v259 = load v258 : i32; + v260 = const.i32 -2 : i32; + v261 = band v259, v260 : i32; + v262 = cast v251 : u32; + v263 = add.checked v262, 8 : u32; + v264 = inttoptr v263 : *mut i32; + store v264, v261; + v265 = cast v251 : u32; + v266 = inttoptr v265 : *mut i32; + v267 = load v266 : i32; + v268 = const.i32 3 : i32; + v269 = band v267, v268 : i32; + v270 = bor v269, v249 : i32; + v271 = cast v251 : u32; + v272 = inttoptr v271 : *mut i32; + store v272, v270; + v273 = const.i32 2 : i32; + v274 = band v267, v273 : i32; + v275 = neq v274, 0 : i1; + condbr v275, block31, block32; + +block29: + v230 = const.i32 2 : i32; + v231 = band v224, v230 : i32; + v232 = neq v231, 0 : i1; + condbr v232, block28(v211, v206, v148), block30; + +block30: + v233 = cast v226 : u32; + v234 = add.checked v233, 4 : u32; + v235 = inttoptr v234 : *mut i32; + v236 = load v235 : i32; + v237 = const.i32 3 : i32; + v238 = band v236, v237 : i32; + v239 = bor v238, v211 : i32; + v240 = cast v226 : u32; + v241 = add.checked v240, 4 : u32; + v242 = inttoptr v241 : *mut i32; + store v242, v239; + v243 = cast v211 : u32; + v244 = add.checked v243, 4 : u32; + v245 = inttoptr v244 : *mut i32; + v246 = load v245 : i32; + v247 = const.i32 3 : i32; + v248 = band v246, v247 : i32; + br block28(v211, v248, v148); + +block31: + v279 = const.i32 -3 : i32; + v280 = band v270, v279 : i32; + v281 = cast v251 : u32; + v282 = inttoptr v281 : *mut i32; + store v282, v280; + v283 = cast v249 : u32; + v284 = inttoptr v283 : *mut i32; + v285 = load v284 : i32; + v286 = const.i32 2 : i32; + v287 = bor v285, v286 : i32; + br block24(v249, v287); + +block32: + v276 = cast v249 : u32; + v277 = inttoptr v276 : *mut i32; + v278 = load v277 : i32; + br block24(v249, v278); + +block33: + br block5; +} + +pub fn ::alloc(i32, i32, i32) -> i32 { +block0(v0: i32, v1: i32, v2: i32): + v4 = const.i32 0 : i32; + v5 = global.load (@__stack_pointer) as *mut i8 : i32; + v6 = const.i32 16 : i32; + v7 = sub.wrapping v5, v6 : i32; + v8 = global.symbol @__stack_pointer : *mut i32; + store v8, v7; + v9 = neq v2, 0 : i1; + condbr v9, block3, block4; + +block1(v3: i32): + ret v3; + +block2(v87: i32, v91: i32): + v88 = const.i32 16 : i32; + v89 = add.wrapping v87, v88 : i32; + v90 = global.symbol @__stack_pointer : *mut i32; + store v90, v89; + br block1(v91); + +block3: + v10 = cast v0 : u32; + v11 = inttoptr v10 : *mut i32; + v12 = load v11 : i32; + v13 = cast v7 : u32; + v14 = add.checked v13, 12 : u32; + v15 = inttoptr v14 : *mut i32; + store v15, v12; + v16 = const.i32 3 : i32; + v17 = add.wrapping v2, v16 : i32; + v18 = const.i32 2 : i32; + v19 = cast v17 : u32; + v20 = cast v18 : u32; + v21 = shr.wrapping v19, v20 : u32; + v22 = cast v21 : i32; + v23 = const.i32 12 : i32; + v24 = add.wrapping v7, v23 : i32; + v25 = call module0::wee_alloc::alloc_first_fit(v22, v1, v24) : i32; + v26 = neq v25, 0 : i1; + condbr v26, block5(v0, v7, v25), block6; + +block4: + br block2(v7, v1); + +block5(v79: i32, v80: i32, v92: i32): + v81 = cast v80 : u32; + v82 = add.checked v81, 12 : u32; + v83 = inttoptr v82 : *mut i32; + v84 = load v83 : i32; + v85 = cast v79 : u32; + v86 = inttoptr v85 : *mut i32; + store v86, v84; + br block2(v80, v92); + +block6: + v27 = const.i32 -4 : i32; + v28 = band v17, v27 : i32; + v29 = const.i32 3 : i32; + v30 = shl.wrapping v1, v29 : i32; + v31 = const.i32 512 : i32; + v32 = add.wrapping v30, v31 : i32; + v33 = cast v28 : u32; + v34 = cast v32 : u32; + v35 = gt v33, v34 : i1; + v36 = cast v35 : i32; + v37 = neq v36, 0 : i1; + v38 = select v37, v28, v32 : i32; + v39 = const.i32 65543 : i32; + v40 = add.wrapping v38, v39 : i32; + v41 = const.i32 16 : i32; + v42 = cast v40 : u32; + v43 = cast v41 : u32; + v44 = shr.wrapping v42, v43 : u32; + v45 = cast v44 : i32; + v46 = cast v45 : u32; + v47 = memory.grow v46 : i32; + v48 = const.i32 -1 : i32; + v49 = neq v47, v48 : i1; + v50 = cast v49 : i32; + v51 = neq v50, 0 : i1; + condbr v51, block7, block8; + +block7: + v53 = const.i32 16 : i32; + v54 = shl.wrapping v47, v53 : i32; + v55 = const.i32 0 : i32; + v56 = cast v54 : u32; + v57 = add.checked v56, 4 : u32; + v58 = inttoptr v57 : *mut i32; + store v58, v55; + v59 = cast v7 : u32; + v60 = add.checked v59, 12 : u32; + v61 = inttoptr v60 : *mut i32; + v62 = load v61 : i32; + v63 = cast v54 : u32; + v64 = add.checked v63, 8 : u32; + v65 = inttoptr v64 : *mut i32; + store v65, v62; + v66 = const.i32 -65536 : i32; + v67 = band v40, v66 : i32; + v68 = add.wrapping v54, v67 : i32; + v69 = const.i32 2 : i32; + v70 = bor v68, v69 : i32; + v71 = cast v54 : u32; + v72 = inttoptr v71 : *mut i32; + store v72, v70; + v73 = cast v7 : u32; + v74 = add.checked v73, 12 : u32; + v75 = inttoptr v74 : *mut i32; + store v75, v54; + v76 = const.i32 12 : i32; + v77 = add.wrapping v7, v76 : i32; + v78 = call module0::wee_alloc::alloc_first_fit(v22, v1, v77) : i32; + br block5(v0, v7, v78); + +block8: + v52 = const.i32 0 : i32; + br block5(v0, v7, v52); +} + +pub fn ::dealloc(i32, i32, i32, i32) { +block0(v0: i32, v1: i32, v2: i32, v3: i32): + v4 = const.i32 0 : i32; + v5 = eq v1, 0 : i1; + v6 = cast v5 : i32; + v7 = neq v6, 0 : i1; + condbr v7, block2, block3; + +block1: + ret; + +block2: + br block1; + +block3: + v8 = eq v3, 0 : i1; + v9 = cast v8 : i32; + v10 = neq v9, 0 : i1; + condbr v10, block2, block4; + +block4: + v11 = cast v0 : u32; + v12 = inttoptr v11 : *mut i32; + v13 = load v12 : i32; + v14 = const.i32 0 : i32; + v15 = cast v1 : u32; + v16 = inttoptr v15 : *mut i32; + store v16, v14; + v17 = const.i32 -8 : i32; + v18 = add.wrapping v1, v17 : i32; + v19 = cast v18 : u32; + v20 = inttoptr v19 : *mut i32; + v21 = load v20 : i32; + v22 = const.i32 -2 : i32; + v23 = band v21, v22 : i32; + v24 = cast v18 : u32; + v25 = inttoptr v24 : *mut i32; + store v25, v23; + v26 = const.i32 4 : i32; + v27 = add.wrapping v18, v26 : i32; + v28 = cast v27 : u32; + v29 = inttoptr v28 : *mut i32; + v30 = load v29 : i32; + v31 = const.i32 -4 : i32; + v32 = band v30, v31 : i32; + v33 = eq v32, 0 : i1; + v34 = cast v33 : i32; + v35 = neq v34, 0 : i1; + condbr v35, block8(v21, v1, v18, v13, v0), block9; + +block5(v155: i32, v161: i32): + v163 = cast v155 : u32; + v164 = inttoptr v163 : *mut i32; + store v164, v161; + br block2; + +block6(v151: i32, v152: i32, v160: i32, v162: i32): + v153 = cast v151 : u32; + v154 = inttoptr v153 : *mut i32; + store v154, v152; + br block5(v160, v162); + +block7(v147: i32, v156: i32): + br block5(v156, v147); + +block8(v116: i32, v132: i32, v141: i32, v150: i32, v159: i32): + v117 = const.i32 -4 : i32; + v118 = band v116, v117 : i32; + v119 = eq v118, 0 : i1; + v120 = cast v119 : i32; + v121 = neq v120, 0 : i1; + condbr v121, block6(v132, v150, v159, v141), block18; + +block9: + v36 = cast v32 : u32; + v37 = inttoptr v36 : *mut i32; + v38 = load v37 : i32; + v39 = const.i32 1 : i32; + v40 = band v38, v39 : i32; + v41 = neq v40, 0 : i1; + condbr v41, block8(v21, v1, v18, v13, v0), block10; + +block10: + v42 = const.i32 -4 : i32; + v43 = band v21, v42 : i32; + v44 = neq v43, 0 : i1; + condbr v44, block13, block14; + +block11(v90: i32, v91: i32, v96: i32, v97: i32, v107: i32, v148: i32, v157: i32): + v92 = const.i32 3 : i32; + v93 = band v91, v92 : i32; + v94 = cast v90 : u32; + v95 = inttoptr v94 : *mut i32; + store v95, v93; + v98 = const.i32 3 : i32; + v99 = band v97, v98 : i32; + v100 = cast v96 : u32; + v101 = inttoptr v100 : *mut i32; + store v101, v99; + v102 = const.i32 2 : i32; + v103 = band v97, v102 : i32; + v104 = eq v103, 0 : i1; + v105 = cast v104 : i32; + v106 = neq v105, 0 : i1; + condbr v106, block7(v148, v157), block17; + +block12(v72: i32, v73: i32, v76: i32, v82: i32, v86: i32, v108: i32, v149: i32, v158: i32): + v74 = const.i32 -4 : i32; + v75 = band v73, v74 : i32; + v77 = const.i32 3 : i32; + v78 = band v76, v77 : i32; + v79 = bor v75, v78 : i32; + v80 = cast v72 : u32; + v81 = inttoptr v80 : *mut i32; + store v81, v79; + v83 = cast v82 : u32; + v84 = inttoptr v83 : *mut i32; + v85 = load v84 : i32; + v87 = cast v86 : u32; + v88 = inttoptr v87 : *mut i32; + v89 = load v88 : i32; + br block11(v82, v85, v86, v89, v108, v149, v158); + +block13: + v45 = const.i32 2 : i32; + v46 = band v21, v45 : i32; + v47 = neq v46, 0 : i1; + condbr v47, block12(v32, v23, v38, v27, v18, v32, v13, v0), block15; + +block14: + br block12(v32, v23, v38, v27, v18, v32, v13, v0); + +block15: + v48 = cast v43 : u32; + v49 = add.checked v48, 4 : u32; + v50 = inttoptr v49 : *mut i32; + v51 = load v50 : i32; + v52 = const.i32 3 : i32; + v53 = band v51, v52 : i32; + v54 = bor v53, v32 : i32; + v55 = cast v43 : u32; + v56 = add.checked v55, 4 : u32; + v57 = inttoptr v56 : *mut i32; + store v57, v54; + v58 = cast v18 : u32; + v59 = inttoptr v58 : *mut i32; + v60 = load v59 : i32; + v61 = cast v27 : u32; + v62 = inttoptr v61 : *mut i32; + v63 = load v62 : i32; + v64 = const.i32 -4 : i32; + v65 = band v63, v64 : i32; + v66 = eq v65, 0 : i1; + v67 = cast v66 : i32; + v68 = neq v67, 0 : i1; + condbr v68, block11(v27, v63, v18, v60, v32, v13, v0), block16; + +block16: + v69 = cast v65 : u32; + v70 = inttoptr v69 : *mut i32; + v71 = load v70 : i32; + br block12(v65, v60, v71, v27, v18, v32, v13, v0); + +block17: + v109 = cast v107 : u32; + v110 = inttoptr v109 : *mut i32; + v111 = load v110 : i32; + v112 = const.i32 2 : i32; + v113 = bor v111, v112 : i32; + v114 = cast v107 : u32; + v115 = inttoptr v114 : *mut i32; + store v115, v113; + br block7(v148, v157); + +block18: + v122 = const.i32 2 : i32; + v123 = band v116, v122 : i32; + v124 = neq v123, 0 : i1; + condbr v124, block6(v132, v150, v159, v141), block19; + +block19: + v125 = cast v118 : u32; + v126 = inttoptr v125 : *mut u8; + v127 = load v126 : u8; + v128 = zext v127 : i32; + v129 = const.i32 1 : i32; + v130 = band v128, v129 : i32; + v131 = neq v130, 0 : i1; + condbr v131, block6(v132, v150, v159, v141), block20; + +block20: + v133 = cast v118 : u32; + v134 = add.checked v133, 8 : u32; + v135 = inttoptr v134 : *mut i32; + v136 = load v135 : i32; + v137 = const.i32 -4 : i32; + v138 = band v136, v137 : i32; + v139 = cast v132 : u32; + v140 = inttoptr v139 : *mut i32; + store v140, v138; + v142 = const.i32 1 : i32; + v143 = bor v141, v142 : i32; + v144 = cast v118 : u32; + v145 = add.checked v144, 8 : u32; + v146 = inttoptr v145 : *mut i32; + store v146, v143; + br block7(v150, v159); +} + +pub fn wit_bindgen::rt::run_ctors_once() { +block0: + v0 = const.i32 0 : i32; + v1 = cast v0 : u32; + v2 = add.checked v1, 1048581 : u32; + v3 = inttoptr v2 : *mut u8; + v4 = load v3 : u8; + v5 = zext v4 : i32; + v6 = neq v5, 0 : i1; + condbr v6, block2, block3; + +block1: + ret; + +block2: + br block1; + +block3: + call module0::__wasm_call_ctors(); + v7 = const.i32 0 : i32; + v8 = const.i32 1 : i32; + v9 = trunc v8 : u8; + v10 = cast v7 : u32; + v11 = add.checked v10, 1048581 : u32; + v12 = inttoptr v11 : *mut u8; + store v12, v9; + br block2; +} + +pub fn cabi_realloc(i32, i32, i32, i32) -> i32 { +block0(v0: i32, v1: i32, v2: i32, v3: i32): + v5 = neq v1, 0 : i1; + condbr v5, block4, block5; + +block1(v4: i32): + ret v4; + +block2(v19: i32): + br block1(v19); + +block3(v17: i32): + v18 = neq v17, 0 : i1; + condbr v18, block2(v17), block7; + +block4: + v16 = call module0::__rust_realloc(v0, v1, v2, v3) : i32; + br block3(v16); + +block5: + v6 = eq v3, 0 : i1; + v7 = cast v6 : i32; + v8 = neq v7, 0 : i1; + condbr v8, block2(v2), block6; + +block6: + v9 = const.i32 0 : i32; + v10 = cast v9 : u32; + v11 = add.checked v10, 1048580 : u32; + v12 = inttoptr v11 : *mut u8; + v13 = load v12 : u8; + v14 = zext v13 : i32; + v15 = call module0::__rust_alloc(v3, v2) : i32; + br block3(v15); + +block7: + unreachable ; +} + + +pub fn wit-component:shim::indirect-miden:base/tx-kernel@1.0.0-add-asset(i64, i64, i64, i64, i32); + +pub fn wit-component:shim::indirect-miden:base/tx-kernel@1.0.0-remove-asset(i64, i64, i64, i64, i32); + +// ==================================================================== +module wit-component:fixups + + From 932963863baf0312f34dd275d916024fa3763018 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Wed, 28 Feb 2024 18:53:24 +0200 Subject: [PATCH 5/9] refactor: introduce `ComponentTranslator` in the final stage of the translation to make the overall algorithm and steps more clear and concise. Raise errors when an particular item translation is not(yet) implemented. --- frontend-wasm/src/component/build_ir.rs | 376 +------------------ frontend-wasm/src/component/instance.rs | 164 --------- frontend-wasm/src/component/mod.rs | 2 +- frontend-wasm/src/component/translator.rs | 426 ++++++++++++++++++++++ frontend-wasm/src/module/func_env.rs | 31 +- frontend-wasm/src/module/instance.rs | 4 + 6 files changed, 468 insertions(+), 535 deletions(-) delete mode 100644 frontend-wasm/src/component/instance.rs create mode 100644 frontend-wasm/src/component/translator.rs diff --git a/frontend-wasm/src/component/build_ir.rs b/frontend-wasm/src/component/build_ir.rs index ab979c610..a20326306 100644 --- a/frontend-wasm/src/component/build_ir.rs +++ b/frontend-wasm/src/component/build_ir.rs @@ -1,27 +1,14 @@ -use alloc::collections::BTreeMap; - use miden_diagnostics::DiagnosticsHandler; -use miden_hir::{ - cranelift_entity::PrimaryMap, FunctionIdent, Ident, InterfaceFunctionIdent, InterfaceIdent, - Symbol, -}; -use miden_hir_type::LiftedFunctionType; +use miden_hir::cranelift_entity::PrimaryMap; use wasmparser::WasmFeatures; use super::{ - inline, instance::ComponentImport, interface_type_to_ir, CanonicalOptions, ComponentTypes, - ComponentTypesBuilder, CoreDef, Export, ExportItem, GlobalInitializer, InstantiateModule, - LinearComponent, LinearComponentTranslation, LoweredIndex, ParsedRootComponent, - RuntimeImportIndex, RuntimeInstanceIndex, StaticModuleIndex, Trampoline, TypeFuncIndex, + inline, translator::ComponentTranslator, ComponentTypesBuilder, LinearComponentTranslation, + ParsedRootComponent, StaticModuleIndex, }; use crate::{ - component::{ComponentParser, StringEncoding}, - error::WasmResult, - module::{ - build_ir::build_ir_module, func_env::FuncEnvironment, instance::ModuleArgument, - module_env::ParsedModule, types::EntityIndex, - }, - WasmError, WasmTranslationConfig, + component::ComponentParser, error::WasmResult, module::module_env::ParsedModule, + WasmTranslationConfig, }; /// Translate a Wasm component binary into Miden IR component @@ -33,13 +20,9 @@ pub fn translate_component( let (mut component_types_builder, parsed_component) = parse(config, wasm, diagnostics)?; let linearized_component_translation = inline(&mut component_types_builder, &parsed_component)?; let component_types = component_types_builder.finish(); - build_ir( - linearized_component_translation, - component_types, - parsed_component.static_modules, - config, - diagnostics, - ) + let parsed_modules = parsed_component.static_modules; + let translator = ComponentTranslator::new(component_types, parsed_modules, config, diagnostics); + translator.translate(linearized_component_translation) } fn parse<'data>( @@ -52,7 +35,8 @@ fn parse<'data>( let mut component_types_builder = Default::default(); let component_parser = ComponentParser::new(config, &mut validator, &mut component_types_builder); - let parsed_component = component_parser.parse(wasm, diagnostics)?; + let mut parsed_component = component_parser.parse(wasm, diagnostics)?; + ensure_module_names(&mut parsed_component.static_modules); Ok((component_types_builder, parsed_component)) } @@ -80,337 +64,17 @@ fn inline( Ok(component_dfg.finish()) } -fn build_ir<'data>( - linear_component_translation: LinearComponentTranslation, - component_types: ComponentTypes, - mut parsed_modules: PrimaryMap>, - config: &WasmTranslationConfig, - diagnostics: &DiagnosticsHandler, -) -> WasmResult { - let mut cb = miden_hir::ComponentBuilder::new(diagnostics); - let mut module_instances_source: PrimaryMap = - PrimaryMap::new(); - let mut lower_imports: BTreeMap = BTreeMap::default(); - let component = &linear_component_translation.component; - - ensure_module_names(&mut parsed_modules); - - // dbg!(&component.initializers); - // dbg!(&linear_component_translation.trampolines); - for initializer in &component.initializers { - match initializer { - GlobalInitializer::InstantiateModule(m) => { - match m { - InstantiateModule::Static(static_module_idx, args) => { - if module_instances_source - .values() - .find(|idx| **idx == *static_module_idx) - .is_some() - { - return Err(WasmError::Unsupported(format!( - "A module with a static index {} is already instantiated. We \ - don't support multiple instantiations of the same module.", - static_module_idx.as_u32() - ))); - } - module_instances_source.push(*static_module_idx); - let module = &parsed_modules[*static_module_idx].module; - // dbg!(&module); - let mut module_args: Vec = Vec::new(); - for (idx, arg) in args.iter().enumerate() { - match arg { - CoreDef::Export(export) => { - match export.item { - ExportItem::Index(entity_idx) => match entity_idx { - EntityIndex::Function(func_idx) => { - let module_id = - module_instances_source[export.instance]; - let exporting_module = - &parsed_modules[module_id].module; - let func_name = - exporting_module.func_name(func_idx); - let module_name = exporting_module.name(); - let function_id = FunctionIdent { - module: Ident::with_empty_span(Symbol::intern( - module_name, - )), - function: Ident::with_empty_span( - Symbol::intern(func_name), - ), - }; - // dbg!(function_id); - module_args - .push(ModuleArgument::Function(function_id)); - } - EntityIndex::Table(_) => { - module_args.push(ModuleArgument::Table) - } - EntityIndex::Memory(_) => { - todo!() - } - EntityIndex::Global(_) => { - todo!() - } - }, - ExportItem::Name(_) => todo!(), - } - } - CoreDef::InstanceFlags(_) => todo!(), - CoreDef::Trampoline(trampoline_idx) => { - let trampoline = - &linear_component_translation.trampolines[*trampoline_idx]; - match trampoline { - Trampoline::LowerImport { - index, - lower_ty, - options: _, - } => { - let import = lower_imports[index]; - let import = ComponentImport { - runtime_import_index: import, - signature: *lower_ty, - }; - let module_import = module - .imports - .get(idx) - .expect("module import not found"); - let func_name = - module.func_name(module_import.index.unwrap_func()); - let module_name = module.name(); - let function_id = FunctionIdent { - module: Ident::with_empty_span(Symbol::intern( - module_name, - )), - function: Ident::with_empty_span(Symbol::intern( - func_name, - )), - }; - let component_import = build_import( - &import, - &component_types, - component, - config, - )?; - cb.add_import(function_id, component_import.clone()); - module_args.push(ModuleArgument::ComponentImport( - component_import, - )); - } - _ => unreachable!(), - } - } - } - } - - let module_types = component_types.module_types(); - let func_env = FuncEnvironment::new(module, module_types, module_args); - let ir_module = build_ir_module( - parsed_modules.get_mut(*static_module_idx).unwrap(), - module_types, - func_env, - config, - diagnostics, - )?; - cb.add_module(ir_module.into()).expect("module is already added"); - } - InstantiateModule::Import(..) => todo!(), - }; - } - GlobalInitializer::LowerImport { - index: init_lowered_idx, - import, - } => { - lower_imports.insert(*init_lowered_idx, *import); - } - GlobalInitializer::ExtractMemory(_) => { - // Do nothing for now - } - GlobalInitializer::ExtractRealloc(_) => todo!(), - GlobalInitializer::ExtractPostReturn(_) => todo!(), - GlobalInitializer::Resource(_) => todo!(), - } - } - - // build exports - for (name, export) in &component.exports { - build_export( - export, - &parsed_modules, - &module_instances_source, - &component_types, - name, - &mut cb, - config, - )?; - } - - Ok(cb.build()) -} - -pub fn ensure_module_names(modules: &mut PrimaryMap>) { +fn ensure_module_names(modules: &mut PrimaryMap>) { for (idx, parsed_module) in modules.iter_mut() { parsed_module.module.set_name_fallback(format!("module{}", idx.as_u32()).into()); } } -fn build_import( - import: &ComponentImport, - component_types: &ComponentTypes, - component: &LinearComponent, - config: &WasmTranslationConfig, -) -> WasmResult { - let (import_idx, import_names) = &component.imports[import.runtime_import_index]; - if import_names.len() != 1 { - return Err(crate::WasmError::Unsupported("multi-name imports not supported".to_string())); - } - let import_func_name = import_names.first().unwrap(); - let (full_interface_name, _) = component.import_types[*import_idx].clone(); - let interface_function = InterfaceFunctionIdent { - interface: InterfaceIdent::from_full_ident(full_interface_name.clone()), - function: Symbol::intern(import_func_name), - }; - let Some(import_metadata) = config.import_metadata.get(&interface_function) else { - return Err(crate::WasmError::MissingImportMetadata(format!( - "Import metadata for interface function {:?} not found", - &interface_function, - ))); - }; - let lifted_func_ty = convert_lifted_func_ty(&import.signature, component_types); - - let component_import = miden_hir::ComponentImport { - function_ty: lifted_func_ty, - interface_function, - invoke_method: import_metadata.invoke_method, - digest: import_metadata.digest.clone(), - }; - Ok(component_import) -} - -fn build_export<'data>( - export: &Export, - modules: &PrimaryMap, - module_instances: &PrimaryMap, - component_types: &ComponentTypes, - name: &String, - cb: &mut miden_hir::ComponentBuilder<'_>, - config: &WasmTranslationConfig, -) -> WasmResult<()> { - match export { - Export::LiftedFunction { ty, func, options } => build_export_function( - modules, - module_instances, - component_types, - name, - func, - ty, - options, - cb, - config, - ), - Export::Instance(exports) => { - // Flatten any(nested) interface instance exports into the IR `Component` exports - for (name, export) in exports { - build_export(export, modules, module_instances, component_types, name, cb, config)?; - } - Ok(()) - } - Export::ModuleStatic(_) => todo!(), - Export::ModuleImport(_) => todo!(), - Export::Type(_) => { - // TODO: implement type exports - Ok(()) - } - } -} - -fn build_export_function<'data>( - modules: &PrimaryMap, - module_instances: &PrimaryMap, - component_types: &ComponentTypes, - name: &String, - func: &CoreDef, - ty: &TypeFuncIndex, - options: &CanonicalOptions, - cb: &mut miden_hir::ComponentBuilder<'_>, - config: &WasmTranslationConfig, -) -> WasmResult<()> { - assert_empty_canonical_options(options); - let func_ident = match func { - CoreDef::Export(core_export) => { - let module = &modules[module_instances[core_export.instance]].module; - let module_name = module.name(); - let module_ident = miden_hir::Ident::with_empty_span(Symbol::intern(module_name)); - let func_name = match core_export.item { - ExportItem::Index(idx) => match idx { - EntityIndex::Function(func_idx) => module.func_name(func_idx), - EntityIndex::Table(_) => todo!(), - EntityIndex::Memory(_) => todo!(), - EntityIndex::Global(_) => todo!(), - }, - ExportItem::Name(_) => todo!(), - }; - let func_ident = miden_hir::FunctionIdent { - module: module_ident, - function: miden_hir::Ident::with_empty_span(Symbol::intern(func_name)), - }; - func_ident - } - CoreDef::InstanceFlags(_) => todo!(), - CoreDef::Trampoline(_) => todo!(), - }; - let lifted_func_ty = convert_lifted_func_ty(ty, component_types); - let export_name = Symbol::intern(name).into(); - let Some(export_metadata) = config.export_metadata.get(&export_name) else { - return Err(WasmError::MissingExportMetadata(format!( - "Export metadata for interface function {:?} not found", - &export_name, - ))); - }; - let export = miden_hir::ComponentExport { - function: func_ident, - function_ty: lifted_func_ty, - invoke_method: export_metadata.invoke_method, - }; - cb.add_export(export_name, export); - Ok(()) -} - -fn convert_lifted_func_ty( - ty: &TypeFuncIndex, - component_types: &ComponentTypes, -) -> LiftedFunctionType { - let type_func = component_types[*ty].clone(); - let params_types = component_types[type_func.params].clone().types; - let results_types = component_types[type_func.results].clone().types; - let params = params_types - .into_iter() - .map(|ty| interface_type_to_ir(ty, component_types)) - .collect(); - let results = results_types - .into_iter() - .map(|ty| interface_type_to_ir(ty, component_types)) - .collect(); - LiftedFunctionType { params, results } -} - -fn assert_empty_canonical_options(options: &CanonicalOptions) { - assert_eq!( - options.string_encoding, - StringEncoding::Utf8, - "UTF-8 is expected in CanonicalOptions, string transcoding is not yet supported" - ); - assert!(options.realloc.is_none(), "realloc in CanonicalOptions is not yet supported"); - assert!( - options.post_return.is_none(), - "post_return in CanonicalOptions is not yet supported" - ); - assert!(options.memory.is_none(), "memory in CanonicalOptions is not yet supported"); -} - #[cfg(test)] mod tests { use miden_core::crypto::hash::RpoDigest; + use miden_hir::{InterfaceFunctionIdent, InterfaceIdent, LiftedFunctionType, Symbol}; use miden_hir_type::Type; use super::*; @@ -476,14 +140,14 @@ mod tests { // dbg!(&component_translation.component.exports); assert_eq!(component_translation.component.exports.len(), 1); let component_types = component_types_builder.finish(); - let ir = build_ir( - component_translation, + let translator = ComponentTranslator::new( component_types, parsed_component.static_modules, &config, &diagnostics, - ) - .unwrap(); + ); + let ir = translator.translate(component_translation).unwrap(); + // dbg!(&ir.exports()); assert!(!ir.modules().is_empty()); assert!(!ir.exports().is_empty()); @@ -595,14 +259,14 @@ mod tests { let component_types = component_types_builder.finish(); - let ir = build_ir( - component_translation, + let translator = ComponentTranslator::new( component_types, parsed_component.static_modules, &config, &diagnostics, - ) - .unwrap(); + ); + let ir = translator.translate(component_translation).unwrap(); + // dbg!(&ir.exports()); assert!(!ir.modules().is_empty()); assert!(!ir.exports().is_empty()); diff --git a/frontend-wasm/src/component/instance.rs b/frontend-wasm/src/component/instance.rs deleted file mode 100644 index 0e95bfcd3..000000000 --- a/frontend-wasm/src/component/instance.rs +++ /dev/null @@ -1,164 +0,0 @@ -// TODO: delete this file -#![allow(dead_code)] - -use miden_hir::cranelift_entity::PrimaryMap; -use rustc_hash::FxHashMap; - -use super::{ - ComponentTypes, CoreDef, GlobalInitializer, InstantiateModule, LinearComponent, - LinearComponentTranslation, LoweredIndex, RuntimeImportIndex, RuntimeInstanceIndex, - StaticModuleIndex, TypeFuncIndex, -}; -use crate::{ - component::{ExportItem, Trampoline}, - error::WasmResult, - module::{module_env::ParsedModule, types::EntityIndex}, - WasmError, -}; - -/// A component import -#[derive(Debug)] -pub struct ComponentImport { - pub runtime_import_index: RuntimeImportIndex, - pub signature: TypeFuncIndex, -} - -pub struct ComponentInstance<'data> { - pub modules: PrimaryMap>, - pub module_instances: PrimaryMap, - pub component: LinearComponent, - pub component_types: ComponentTypes, - pub imports: FxHashMap>, -} - -impl<'data> ComponentInstance<'data> { - pub fn ensure_module_names(&mut self) { - for (idx, parsed_module) in self.modules.iter_mut() { - parsed_module.module.set_name_fallback(format!("module{}", idx.as_u32()).into()); - } - } - - pub fn module(&self, idx: RuntimeInstanceIndex) -> &ParsedModule<'data> { - &self.modules[self.module_instances[idx]] - } -} - -pub struct ComponentInstanceBuilder<'data> { - linear_component_translation: LinearComponentTranslation, - component_types: ComponentTypes, - modules: PrimaryMap>, -} - -impl<'data> ComponentInstanceBuilder<'data> { - pub fn new( - linear_component_translation: LinearComponentTranslation, - component_types: ComponentTypes, - modules: PrimaryMap>, - ) -> Self { - Self { - linear_component_translation, - component_types, - modules, - } - } - - pub fn build(self) -> WasmResult> { - let mut module_instances: PrimaryMap = - PrimaryMap::new(); - let mut lower_imports: FxHashMap = FxHashMap::default(); - let mut imports: FxHashMap> = FxHashMap::default(); - let component = &self.linear_component_translation.component; - dbg!(&component.initializers); - dbg!(&self.linear_component_translation.trampolines); - for initializer in &component.initializers { - match initializer { - GlobalInitializer::InstantiateModule(m) => { - match m { - InstantiateModule::Static(static_module_idx, args) => { - if module_instances - .values() - .find(|idx| **idx == *static_module_idx) - .is_some() - { - return Err(WasmError::Unsupported(format!( - "A module with a static index {} is already instantiated. We \ - don't support multiple instantiations of the same module.", - static_module_idx.as_u32() - ))); - } - - module_instances.push(*static_module_idx); - let mut module_args: Vec = Vec::new(); - for arg in args.iter() { - match arg { - CoreDef::Export(export) => { - // let static_module_idx = - // module_instances[export.instance]; - match export.item { - ExportItem::Index(entity_idx) => match entity_idx { - EntityIndex::Function(_func_idx) => { - todo!(); - // module_args.push(import); - } - EntityIndex::Table(_) => { - todo!() - } - EntityIndex::Memory(_) => { - todo!() - } - EntityIndex::Global(_) => { - todo!() - } - }, - ExportItem::Name(_) => todo!(), - } - } - CoreDef::InstanceFlags(_) => todo!(), - CoreDef::Trampoline(trampoline_idx) => { - let trampoline = &self - .linear_component_translation - .trampolines[*trampoline_idx]; - match trampoline { - Trampoline::LowerImport { - index, - lower_ty, - options: _, - } => { - let import = lower_imports[index]; - let import = ComponentImport { - runtime_import_index: import, - signature: *lower_ty, - }; - module_args.push(import); - } - _ => unreachable!(), - } - } - } - } - imports.insert(*static_module_idx, module_args); - } - InstantiateModule::Import(..) => todo!(), - }; - } - GlobalInitializer::LowerImport { - index: init_lowered_idx, - import, - } => { - lower_imports.insert(*init_lowered_idx, *import); - } - GlobalInitializer::ExtractMemory(_) => todo!(), - GlobalInitializer::ExtractRealloc(_) => todo!(), - GlobalInitializer::ExtractPostReturn(_) => todo!(), - GlobalInitializer::Resource(_) => todo!(), - } - } - Ok(ComponentInstance { - modules: self.modules, - module_instances, - component: self.linear_component_translation.component, - component_types: self.component_types, - imports, - }) - } -} diff --git a/frontend-wasm/src/component/mod.rs b/frontend-wasm/src/component/mod.rs index 4e8e9b331..13eec880d 100644 --- a/frontend-wasm/src/component/mod.rs +++ b/frontend-wasm/src/component/mod.rs @@ -7,8 +7,8 @@ pub mod build_ir; mod dfg; pub mod info; mod inline; -mod instance; mod parser; +mod translator; mod types; pub use self::info::*; diff --git a/frontend-wasm/src/component/translator.rs b/frontend-wasm/src/component/translator.rs new file mode 100644 index 000000000..108483bcb --- /dev/null +++ b/frontend-wasm/src/component/translator.rs @@ -0,0 +1,426 @@ +use miden_diagnostics::DiagnosticsHandler; +use miden_hir::{ + cranelift_entity::PrimaryMap, ComponentBuilder, ComponentExport, FunctionExportName, + FunctionIdent, Ident, InterfaceFunctionIdent, InterfaceIdent, Symbol, +}; +use miden_hir_type::LiftedFunctionType; +use rustc_hash::FxHashMap; + +use super::{ + interface_type_to_ir, CanonicalOptions, ComponentTypes, CoreDef, CoreExport, Export, + ExportItem, GlobalInitializer, InstantiateModule, LinearComponent, LinearComponentTranslation, + LoweredIndex, RuntimeImportIndex, RuntimeInstanceIndex, StaticModuleIndex, Trampoline, + TypeFuncIndex, +}; +use crate::{ + component::StringEncoding, + error::WasmResult, + module::{ + build_ir::build_ir_module, + func_env::FuncEnvironment, + instance::ModuleArgument, + module_env::ParsedModule, + types::{EntityIndex, FuncIndex}, + Module, ModuleImport, + }, + WasmError, WasmTranslationConfig, +}; + +/// A translator from the linearized Wasm component model to the Miden IR component +pub struct ComponentTranslator<'a, 'data> { + /// The Wasm component types + component_types: ComponentTypes, + /// The parsed static modules of the Wasm component + parsed_modules: PrimaryMap>, + /// The translation configuration + config: &'a WasmTranslationConfig, + /// The runtime module instances index mapped to the static module index + module_instances_source: PrimaryMap, + /// The lower imports index mapped to the runtime import index + lower_imports: FxHashMap, + diagnostics: &'a DiagnosticsHandler, +} + +impl<'a, 'data> ComponentTranslator<'a, 'data> { + pub fn new( + component_types: ComponentTypes, + parsed_modules: PrimaryMap>, + config: &'a WasmTranslationConfig, + diagnostics: &'a DiagnosticsHandler, + ) -> Self { + Self { + component_types, + parsed_modules, + config, + diagnostics, + module_instances_source: PrimaryMap::new(), + lower_imports: FxHashMap::default(), + } + } + + /// Translate the given linearized Wasm component to the Miden IR component + pub fn translate( + mut self, + wasm_translation: LinearComponentTranslation, + ) -> WasmResult { + let mut component_builder: miden_hir::ComponentBuilder<'a> = + miden_hir::ComponentBuilder::new(self.diagnostics); + for initializer in &wasm_translation.component.initializers { + match initializer { + GlobalInitializer::InstantiateModule(instantiate_module) => { + self.translate_module_instance( + instantiate_module, + &mut component_builder, + &wasm_translation, + )?; + } + GlobalInitializer::LowerImport { + index: init_lowered_idx, + import, + } => { + self.lower_imports.insert(*init_lowered_idx, *import); + } + GlobalInitializer::ExtractMemory(_) => { + // Do nothing, there is only one memory address space in Miden IR + } + GlobalInitializer::ExtractRealloc(_) => { + return Err(WasmError::Unsupported( + "Realloc function pointer global initializer is not yet supported" + .to_string(), + )) + } + GlobalInitializer::ExtractPostReturn(_) => { + return Err(WasmError::Unsupported( + "Post return function pointer global initializer is not yet supported" + .to_string(), + )) + } + GlobalInitializer::Resource(_) => { + return Err(WasmError::Unsupported( + "Resource global initializers are not yet supported".to_string(), + )) + } + } + } + for (name, export) in &wasm_translation.component.exports { + self.build_export(export, name, &mut component_builder)?; + } + Ok(component_builder.build()) + } + + /// Translate the given Wasm core module instantiotion to the Miden IR component + fn translate_module_instance( + &mut self, + instantiate_module: &InstantiateModule, + component_builder: &mut ComponentBuilder<'_>, + wasm_translation: &LinearComponentTranslation, + ) -> Result<(), WasmError> { + match instantiate_module { + InstantiateModule::Static(static_module_idx, args) => { + if self + .module_instances_source + .values() + .find(|idx| **idx == *static_module_idx) + .is_some() + { + return Err(WasmError::Unsupported(format!( + "A module with a static index {} is already instantiated. We don't \ + support multiple instantiations of the same module.", + static_module_idx.as_u32() + ))); + } + self.module_instances_source.push(*static_module_idx); + // TODO: create and init module instance tables + let module = &self.parsed_modules[*static_module_idx].module; + let mut module_args: Vec = Vec::new(); + for (idx, arg) in args.iter().enumerate() { + match arg { + CoreDef::Export(export) => { + module_args.push(self.module_arg_from_export(export)?); + } + CoreDef::InstanceFlags(_) => { + return Err(WasmError::Unsupported( + "Wasm component instance flags are not supported".to_string(), + )) + } + CoreDef::Trampoline(trampoline_idx) => { + let trampoline = &wasm_translation.trampolines[*trampoline_idx]; + let arg = self.module_arg_from_trampoline( + trampoline, + module, + idx, + &wasm_translation.component, + component_builder, + )?; + module_args.push(arg); + } + } + } + let module_types = self.component_types.module_types(); + let func_env = FuncEnvironment::new(module, module_types, module_args); + let ir_module = build_ir_module( + self.parsed_modules.get_mut(*static_module_idx).unwrap(), + module_types, + func_env, + self.config, + self.diagnostics, + )?; + component_builder.add_module(ir_module.into()).expect("module is already added"); + } + InstantiateModule::Import(..) => { + return Err(WasmError::Unsupported( + "Imported Wasm core module instantiation is not supported".to_string(), + )) + } + }; + Ok(()) + } + + /// Build a Wasm core module argument from the given trampoline (component import) + fn module_arg_from_trampoline( + &self, + trampoline: &Trampoline, + module: &Module, + idx: usize, + wasm_component: &LinearComponent, + component_builder: &mut ComponentBuilder<'_>, + ) -> Result { + match trampoline { + Trampoline::LowerImport { + index, + lower_ty, + options: _, + } => { + let module_import = module.imports.get(idx).expect("module import not found"); + let runtime_import_idx = self.lower_imports[index]; + let function_id = function_id_from_import(module, module_import); + let component_import = + self.translate_import(runtime_import_idx, *lower_ty, wasm_component)?; + component_builder.add_import(function_id, component_import.clone()); + Ok(ModuleArgument::ComponentImport(component_import)) + } + _ => Err(WasmError::Unsupported(format!( + "Not yet implemented trampoline type {trampoline:?}" + ))), + } + } + + /// Build a module argument from the given module export + fn module_arg_from_export( + &self, + export: &CoreExport, + ) -> WasmResult { + match export.item { + ExportItem::Index(entity_idx) => match entity_idx { + EntityIndex::Function(func_idx) => { + let exporting_module_id = self.module_instances_source[export.instance]; + let function_id = function_id_from_export( + &self.parsed_modules[exporting_module_id].module, + func_idx, + ); + Ok(ModuleArgument::Function(function_id)) + } + EntityIndex::Table(_idx) => { + // TODO: init the exported table with this module's table initialization values + Ok(ModuleArgument::Table) + } + EntityIndex::Memory(_) => { + unreachable!("Attempt to export memory from a module instance. ") + } + EntityIndex::Global(_) => Err(WasmError::Unsupported( + "Exporting of core module globals are not yet supported".to_string(), + )), + }, + ExportItem::Name(_) => Err(WasmError::Unsupported( + "Named core module exports are not yet supported".to_string(), + )), + } + } + + /// Translate the given runtime import to the Miden IR component import + fn translate_import( + &self, + runtime_import_index: RuntimeImportIndex, + signature: TypeFuncIndex, + wasm_component: &LinearComponent, + ) -> WasmResult { + let (import_idx, import_names) = &wasm_component.imports[runtime_import_index]; + if import_names.len() != 1 { + return Err(crate::WasmError::Unsupported( + "multi-name imports not supported".to_string(), + )); + } + let import_func_name = import_names.first().unwrap(); + let (full_interface_name, _) = wasm_component.import_types[*import_idx].clone(); + let interface_function = InterfaceFunctionIdent { + interface: InterfaceIdent::from_full_ident(full_interface_name.clone()), + function: Symbol::intern(import_func_name), + }; + let Some(import_metadata) = self.config.import_metadata.get(&interface_function) else { + return Err(crate::WasmError::MissingImportMetadata(format!( + "Import metadata for interface function {:?} not found", + &interface_function, + ))); + }; + let lifted_func_ty = convert_lifted_func_ty(&signature, &self.component_types); + + let component_import = miden_hir::ComponentImport { + function_ty: lifted_func_ty, + interface_function, + invoke_method: import_metadata.invoke_method, + digest: import_metadata.digest.clone(), + }; + Ok(component_import) + } + + /// Build an IR Component export from the given Wasm component export + fn build_export( + &self, + export: &Export, + name: &String, + component_builder: &mut ComponentBuilder, + ) -> WasmResult<()> { + match export { + Export::LiftedFunction { ty, func, options } => { + let export_name = Symbol::intern(name).into(); + let export = self.build_export_lifted_function(&export_name, func, ty, options)?; + component_builder.add_export(export_name, export); + Ok(()) + } + Export::Instance(exports) => { + // Flatten any(nested) interface instance exports into the IR `Component` exports + for (name, export) in exports { + self.build_export(export, name, component_builder)?; + } + Ok(()) + } + Export::ModuleStatic(_) => { + Err(WasmError::Unsupported("Static module exports are not supported".to_string())) + } + Export::ModuleImport(_) => Err(WasmError::Unsupported( + "Exporting of an imported module is not supported".to_string(), + )), + Export::Type(_) => { + // TODO: implement type exports + Ok(()) + } + } + } + + /// Build an IR Component export from the given lifted Wasm core module function export + fn build_export_lifted_function( + &self, + function_export_name: &FunctionExportName, + func: &CoreDef, + ty: &TypeFuncIndex, + options: &CanonicalOptions, + ) -> WasmResult { + assert_empty_canonical_options(options); + let func_ident = match func { + CoreDef::Export(core_export) => { + let module = + &self.parsed_modules[self.module_instances_source[core_export.instance]].module; + let module_name = module.name(); + let module_ident = miden_hir::Ident::with_empty_span(Symbol::intern(module_name)); + let func_name = match core_export.item { + ExportItem::Index(idx) => match idx { + EntityIndex::Function(func_idx) => module.func_name(func_idx), + EntityIndex::Table(_) | EntityIndex::Memory(_) | EntityIndex::Global(_) => { + return Err(WasmError::Unsupported(format!( + "Exporting of non-function entity {core_export:?} is not supported" + ))); + } + }, + ExportItem::Name(_) => { + return Err(WasmError::Unsupported( + "Named exports are not yet supported".to_string(), + )) + } + }; + let func_ident = miden_hir::FunctionIdent { + module: module_ident, + function: miden_hir::Ident::with_empty_span(Symbol::intern(func_name)), + }; + func_ident + } + CoreDef::InstanceFlags(_) => { + return Err(WasmError::Unsupported( + "Component instance flags exports are not supported".to_string(), + )) + } + CoreDef::Trampoline(_) => { + return Err(WasmError::Unsupported( + "Trampoline core module exports are not supported".to_string(), + )) + } + }; + let lifted_func_ty = convert_lifted_func_ty(ty, &self.component_types); + let Some(export_metadata) = self.config.export_metadata.get(function_export_name) else { + return Err(WasmError::MissingExportMetadata(format!( + "Export metadata for interface function {:?} not found", + function_export_name, + ))); + }; + let export = miden_hir::ComponentExport { + function: func_ident, + function_ty: lifted_func_ty, + invoke_method: export_metadata.invoke_method, + }; + Ok(export) + } +} + +/// Get the function id from the given Wasm core module import +fn function_id_from_import(module: &Module, module_import: &ModuleImport) -> FunctionIdent { + let func_name = module.func_name(module_import.index.unwrap_func()); + let module_name = module.name(); + let function_id = FunctionIdent { + module: Ident::with_empty_span(Symbol::intern(module_name)), + function: Ident::with_empty_span(Symbol::intern(func_name)), + }; + function_id +} + +/// Get the function id from the given Wasm func_idx in the given Wasm core exporting_module +fn function_id_from_export(exporting_module: &Module, func_idx: FuncIndex) -> FunctionIdent { + let func_name = exporting_module.func_name(func_idx); + let module_name = exporting_module.name(); + let function_id = FunctionIdent { + module: Ident::with_empty_span(Symbol::intern(module_name)), + function: Ident::with_empty_span(Symbol::intern(func_name)), + }; + function_id +} + +/// Convert the given Wasm component function type to the Miden IR lifted function type +fn convert_lifted_func_ty( + ty: &TypeFuncIndex, + component_types: &ComponentTypes, +) -> LiftedFunctionType { + let type_func = component_types[*ty].clone(); + let params_types = component_types[type_func.params].clone().types; + let results_types = component_types[type_func.results].clone().types; + let params = params_types + .into_iter() + .map(|ty| interface_type_to_ir(ty, component_types)) + .collect(); + let results = results_types + .into_iter() + .map(|ty| interface_type_to_ir(ty, component_types)) + .collect(); + LiftedFunctionType { params, results } +} + +fn assert_empty_canonical_options(options: &CanonicalOptions) { + assert_eq!( + options.string_encoding, + StringEncoding::Utf8, + "UTF-8 is expected in CanonicalOptions, string transcoding is not yet supported" + ); + assert!(options.realloc.is_none(), "realloc in CanonicalOptions is not yet supported"); + assert!( + options.post_return.is_none(), + "post_return in CanonicalOptions is not yet supported" + ); + assert!(options.memory.is_none(), "memory in CanonicalOptions is not yet supported"); +} diff --git a/frontend-wasm/src/module/func_env.rs b/frontend-wasm/src/module/func_env.rs index 0f58717e0..e1fd4f174 100644 --- a/frontend-wasm/src/module/func_env.rs +++ b/frontend-wasm/src/module/func_env.rs @@ -4,6 +4,7 @@ use rustc_hash::FxHashMap; use super::{instance::ModuleArgument, ir_func_type, FuncIndex, Module, ModuleTypes}; use crate::{module::EntityIndex, translation_utils::sig_from_funct_type}; +/// Represents a function environment that is used in function call translation. pub struct FuncEnvironment { /// A translated IR function ids indexed by the Wasm function index. function_ids: FxHashMap, @@ -18,34 +19,34 @@ impl FuncEnvironment { module_args.len(), "Mismatched module imports and arguments" ); - let mut subst_imports = FxHashMap::default(); + let mut function_import_subst = FxHashMap::default(); for (import, arg) in module.imports.iter().zip(module_args) { match (import.index, arg) { (EntityIndex::Function(func_idx), ModuleArgument::Function(func_id)) => { - subst_imports.insert(func_idx, func_id); + // Substitutes the function import with concrete function exported from another + // module + function_import_subst.insert(func_idx, func_id); } (EntityIndex::Function(_), ModuleArgument::ComponentImport(_)) => { - // Do nothing, the local function name will be used + // Do nothing, the local function id will be used () } - (EntityIndex::Table(_), ModuleArgument::Table) => { - // TODO: implement table imports - () - } - (import, arg) => { - panic!("Mismatched import and argument: {:?} {:?}", import, arg); + (EntityIndex::Function(_), module_arg) => { + panic!( + "Unexpected {module_arg:?} module argument for function import {import:?}" + ) } + (..) => (), // Do nothing, we interested only in function imports } } let mut function_ids = FxHashMap::default(); let mut signatures = FxHashMap::default(); - for (index, _func) in &module.functions { - let func_type_idx = module.functions[index].clone(); - let func_type = mod_types[func_type_idx.signature].clone(); - let ir_func_type = ir_func_type(&func_type).unwrap(); + for (index, func_type) in &module.functions { + let wasm_func_type = mod_types[func_type.signature].clone(); + let ir_func_type = ir_func_type(&wasm_func_type).unwrap(); let sig = sig_from_funct_type(&ir_func_type, CallConv::SystemV, Linkage::External); signatures.insert(index, sig); - if let Some(subst) = subst_imports.get(&index) { + if let Some(subst) = function_import_subst.get(&index) { function_ids.insert(index, subst.clone()); } else { let func_name = module.func_name(index); @@ -62,10 +63,12 @@ impl FuncEnvironment { } } + /// Returns a function id for the given function index. pub fn function_id(&self, function_idx: FuncIndex) -> &FunctionIdent { &self.function_ids[&function_idx] } + /// Returns a function signature for the given function index. pub fn signature(&self, function_idx: FuncIndex) -> &Signature { &self.signatures[&function_idx] } diff --git a/frontend-wasm/src/module/instance.rs b/frontend-wasm/src/module/instance.rs index 272a5c7fe..f0217a129 100644 --- a/frontend-wasm/src/module/instance.rs +++ b/frontend-wasm/src/module/instance.rs @@ -1,8 +1,12 @@ use miden_hir::{ComponentImport, FunctionIdent}; +/// Represents module argument that is used to instantiate a module. #[derive(Debug, Clone)] pub enum ModuleArgument { + /// Represents function that is exported from another module. Function(FunctionIdent), + /// Represents component import that is lowered to a module import. ComponentImport(ComponentImport), + /// Represents table exported from another module. Table, } From 059292c2eaae10eb3c32c0dffc4bfa3a41fa7e80 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 15 Mar 2024 02:40:52 -0400 Subject: [PATCH 6/9] refactor: ensure Wasm module name fallback is set as early as possible --- frontend-wasm/src/component/build_ir.rs | 19 ++----- frontend-wasm/src/component/parser.rs | 74 ++++++++++++------------- 2 files changed, 41 insertions(+), 52 deletions(-) diff --git a/frontend-wasm/src/component/build_ir.rs b/frontend-wasm/src/component/build_ir.rs index a20326306..1db43e22c 100644 --- a/frontend-wasm/src/component/build_ir.rs +++ b/frontend-wasm/src/component/build_ir.rs @@ -1,15 +1,11 @@ use miden_diagnostics::DiagnosticsHandler; -use miden_hir::cranelift_entity::PrimaryMap; use wasmparser::WasmFeatures; use super::{ inline, translator::ComponentTranslator, ComponentTypesBuilder, LinearComponentTranslation, - ParsedRootComponent, StaticModuleIndex, -}; -use crate::{ - component::ComponentParser, error::WasmResult, module::module_env::ParsedModule, - WasmTranslationConfig, + ParsedRootComponent, }; +use crate::{component::ComponentParser, error::WasmResult, WasmTranslationConfig}; /// Translate a Wasm component binary into Miden IR component pub fn translate_component( @@ -35,8 +31,7 @@ fn parse<'data>( let mut component_types_builder = Default::default(); let component_parser = ComponentParser::new(config, &mut validator, &mut component_types_builder); - let mut parsed_component = component_parser.parse(wasm, diagnostics)?; - ensure_module_names(&mut parsed_component.static_modules); + let parsed_component = component_parser.parse(wasm, diagnostics)?; Ok((component_types_builder, parsed_component)) } @@ -64,21 +59,15 @@ fn inline( Ok(component_dfg.finish()) } -fn ensure_module_names(modules: &mut PrimaryMap>) { - for (idx, parsed_module) in modules.iter_mut() { - parsed_module.module.set_name_fallback(format!("module{}", idx.as_u32()).into()); - } -} - #[cfg(test)] mod tests { - use miden_core::crypto::hash::RpoDigest; use miden_hir::{InterfaceFunctionIdent, InterfaceIdent, LiftedFunctionType, Symbol}; use miden_hir_type::Type; use super::*; use crate::{ + component::StaticModuleIndex, config::{ExportMetadata, ImportMetadata}, test_utils::test_diagnostics, }; diff --git a/frontend-wasm/src/component/parser.rs b/frontend-wasm/src/component/parser.rs index 830036ea7..582d56b82 100644 --- a/frontend-wasm/src/component/parser.rs +++ b/frontend-wasm/src/component/parser.rs @@ -3,24 +3,33 @@ // Based on wasmtime v16.0 Wasm component translation -use crate::error::WasmResult; -use crate::module::module_env::{ModuleEnvironment, ParsedModule}; -use crate::module::types::{ - convert_func_type, convert_valtype, EntityIndex, FuncIndex, GlobalIndex, MemoryIndex, - TableIndex, WasmType, -}; -use crate::translation_utils::BuildFxHasher; -use crate::{component::*, unsupported_diag, WasmError, WasmTranslationConfig}; +use std::{collections::HashMap, mem}; + use indexmap::IndexMap; use miden_diagnostics::DiagnosticsHandler; use miden_hir::cranelift_entity::PrimaryMap; use rustc_hash::FxHashMap; -use std::collections::HashMap; -use std::mem; -use wasmparser::types::{ - AliasableResourceId, ComponentEntityType, ComponentFuncTypeId, ComponentInstanceTypeId, Types, +use wasmparser::{ + types::{ + AliasableResourceId, ComponentEntityType, ComponentFuncTypeId, ComponentInstanceTypeId, + Types, + }, + Chunk, ComponentImportName, Encoding, Parser, Payload, Validator, +}; + +use crate::{ + component::*, + error::WasmResult, + module::{ + module_env::{ModuleEnvironment, ParsedModule}, + types::{ + convert_func_type, convert_valtype, EntityIndex, FuncIndex, GlobalIndex, MemoryIndex, + TableIndex, WasmType, + }, + }, + translation_utils::BuildFxHasher, + unsupported_diag, WasmError, WasmTranslationConfig, }; -use wasmparser::{Chunk, ComponentImportName, Encoding, Parser, Payload, Validator}; /// Structure used to parse a Wasm component pub struct ComponentParser<'a, 'data> { @@ -419,13 +428,9 @@ impl<'a, 'data> ComponentParser<'a, 'data> { match ty? { wasmparser::ComponentType::Resource { rep, dtor } => { let rep = convert_valtype(rep); - let id = types - .component_any_type_at(component_type_index) - .unwrap_resource(); + let id = types.component_any_type_at(component_type_index).unwrap_resource(); let dtor = dtor.map(FuncIndex::from_u32); - self.result - .initializers - .push(LocalInitializer::Resource(id, rep, dtor)); + self.result.initializers.push(LocalInitializer::Resource(id, rep, dtor)); } // no extra processing needed @@ -450,12 +455,8 @@ impl<'a, 'data> ComponentParser<'a, 'data> { Ok(for import in s { let import = import?; let types = self.validator.types(0).unwrap(); - let ty = types - .component_entity_type_of_import(import.name.0) - .unwrap(); - self.result - .initializers - .push(LocalInitializer::Import(import.name, ty)); + let ty = types.component_entity_type_of_import(import.name.0).unwrap(); + self.result.initializers.push(LocalInitializer::Import(import.name, ty)); }) } @@ -543,9 +544,14 @@ impl<'a, 'data> ComponentParser<'a, 'data> { ) .parse(parser, &component[range.start..range.end], diagnostics)?; let static_idx = self.static_modules.push(parsed_module); - self.result - .initializers - .push(LocalInitializer::ModuleStatic(static_idx)); + self.result.initializers.push(LocalInitializer::ModuleStatic(static_idx)); + // Set a fallback name for the newly added parsed module to be used if + // the name section does not define a name for the module. + self.static_modules + .get_mut(static_idx) + .unwrap() + .module + .set_name_fallback(format!("module{}", static_idx.as_u32()).into()); Ok(()) } @@ -635,9 +641,7 @@ impl<'a, 'data> ComponentParser<'a, 'data> { let item = self.kind_to_item(export.kind, export.index)?; let prev = self.result.exports.insert(export.name.0, item); assert!(prev.is_none()); - self.result - .initializers - .push(LocalInitializer::Export(item)); + self.result.initializers.push(LocalInitializer::Export(item)); }) } @@ -772,9 +776,7 @@ impl<'a, 'data> ComponentParser<'a, 'data> { // it's an alias into our own space. Otherwise it's switched to // an upvar and will index into the upvar space. Either way // it's just plumbed directly into the initializer. - self.result - .initializers - .push(LocalInitializer::AliasModule(module)); + self.result.initializers.push(LocalInitializer::AliasModule(module)); } wasmparser::ComponentOuterAliasKind::Component => { let index = ComponentIndex::from_u32(index); @@ -785,9 +787,7 @@ impl<'a, 'data> ComponentParser<'a, 'data> { ClosedOverComponent::Upvar(frame.closure_args.components.push(component)); } - self.result - .initializers - .push(LocalInitializer::AliasComponent(component)); + self.result.initializers.push(LocalInitializer::AliasComponent(component)); } } } From f41a56800d3f17d3a0f41f91456c84984f0ecb95 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 15 Mar 2024 02:46:11 -0400 Subject: [PATCH 7/9] test: add expected imports/exports check in basic wallet test --- hir/src/component/mod.rs | 4 +++- tests/integration/src/rust_masm_tests/sdk.rs | 19 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/hir/src/component/mod.rs b/hir/src/component/mod.rs index 4e07e8709..1a6047ce1 100644 --- a/hir/src/component/mod.rs +++ b/hir/src/component/mod.rs @@ -69,7 +69,9 @@ impl formatter::PrettyPrint for ComponentImport { } /// The name of a exported function -#[derive(Debug, Ord, PartialEq, PartialOrd, Eq, Hash, derive_more::From, derive_more::Into)] +#[derive( + Debug, Clone, Ord, PartialEq, PartialOrd, Eq, Hash, derive_more::From, derive_more::Into, +)] pub struct FunctionExportName(Symbol); /// A component export diff --git a/tests/integration/src/rust_masm_tests/sdk.rs b/tests/integration/src/rust_masm_tests/sdk.rs index 0c8b9ae49..5fe4fd0b4 100644 --- a/tests/integration/src/rust_masm_tests/sdk.rs +++ b/tests/integration/src/rust_masm_tests/sdk.rs @@ -1,7 +1,9 @@ +use std::collections::BTreeMap; + use expect_test::expect_file; use miden_core::crypto::hash::RpoDigest; use miden_frontend_wasm::{ExportMetadata, ImportMetadata, WasmTranslationConfig}; -use miden_hir::{InterfaceFunctionIdent, InterfaceIdent, Symbol}; +use miden_hir::{FunctionExportName, InterfaceFunctionIdent, InterfaceIdent, Symbol}; use crate::CompilerTest; @@ -27,7 +29,7 @@ fn sdk_basic_wallet() { interface: interface.clone(), function: Symbol::intern("remove-asset"), }; - let import_metadata = [ + let import_metadata: BTreeMap = [ ( create_note_ident.clone(), ImportMetadata { @@ -52,7 +54,7 @@ fn sdk_basic_wallet() { ] .into_iter() .collect(); - let export_metadata = [ + let export_metadata: BTreeMap = [ ( Symbol::intern("send-asset").into(), ExportMetadata { @@ -69,14 +71,21 @@ fn sdk_basic_wallet() { .into_iter() .collect(); let config = WasmTranslationConfig { - import_metadata, - export_metadata, + import_metadata: import_metadata.clone(), + export_metadata: export_metadata.clone(), ..Default::default() }; let mut test = CompilerTest::rust_source_cargo_component("sdk/basic-wallet", config); let artifact_name = test.source.artifact_name(); test.expect_wasm(expect_file![format!("../../expected/sdk_basic_wallet/{artifact_name}.wat")]); test.expect_ir(expect_file![format!("../../expected/sdk_basic_wallet/{artifact_name}.hir")]); + let ir = test.hir().unwrap_component(); + for (_, import) in ir.imports() { + assert!(import_metadata.contains_key(&import.interface_function)); + } + for (name, _meta) in export_metadata { + assert!(ir.exports().contains_key(&name)); + } } #[test] From 30d8b9fe80b4fe071aea3ceec2b4ba94bb718527 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Thu, 29 Feb 2024 08:26:42 +0200 Subject: [PATCH 8/9] chore: clean up todos, add comments --- frontend-wasm/src/component/translator.rs | 5 ++++- frontend-wasm/src/component/types/mod.rs | 1 - frontend-wasm/src/module/build_ir.rs | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend-wasm/src/component/translator.rs b/frontend-wasm/src/component/translator.rs index 108483bcb..2f403335f 100644 --- a/frontend-wasm/src/component/translator.rs +++ b/frontend-wasm/src/component/translator.rs @@ -131,6 +131,7 @@ impl<'a, 'data> ComponentTranslator<'a, 'data> { } self.module_instances_source.push(*static_module_idx); // TODO: create and init module instance tables + // see https://github.com/0xPolygonMiden/compiler/issues/133 let module = &self.parsed_modules[*static_module_idx].module; let mut module_args: Vec = Vec::new(); for (idx, arg) in args.iter().enumerate() { @@ -222,6 +223,7 @@ impl<'a, 'data> ComponentTranslator<'a, 'data> { } EntityIndex::Table(_idx) => { // TODO: init the exported table with this module's table initialization values + // see https://github.com/0xPolygonMiden/compiler/issues/133 Ok(ModuleArgument::Table) } EntityIndex::Memory(_) => { @@ -301,7 +303,8 @@ impl<'a, 'data> ComponentTranslator<'a, 'data> { "Exporting of an imported module is not supported".to_string(), )), Export::Type(_) => { - // TODO: implement type exports + // Besides the function exports the individual type are also exported from the component + // We can ignore them for now Ok(()) } } diff --git a/frontend-wasm/src/component/types/mod.rs b/frontend-wasm/src/component/types/mod.rs index 925ec2b61..8d48f171d 100644 --- a/frontend-wasm/src/component/types/mod.rs +++ b/frontend-wasm/src/component/types/mod.rs @@ -2,7 +2,6 @@ // Based on wasmtime v16.0 Wasm component translation -// TODO: remove this once Wasm CM support is complete #![allow(dead_code)] pub mod resources; diff --git a/frontend-wasm/src/module/build_ir.rs b/frontend-wasm/src/module/build_ir.rs index 4f0348a87..bd2f959df 100644 --- a/frontend-wasm/src/module/build_ir.rs +++ b/frontend-wasm/src/module/build_ir.rs @@ -54,7 +54,9 @@ pub fn build_ir_module( build_globals(&parsed_module.module, &mut module_builder, diagnostics)?; build_data_segments(parsed_module, &mut module_builder, diagnostics)?; let mut func_translator = FuncTranslator::new(); - // TODO: Ugly! Find a better way to consume the function body inputs + // Although this renders this parsed module invalid(without functiong + // bodies), we don't support multiple module instances. Thus, this + // ParseModule will not be used again to make another module instance. let func_body_inputs = mem::take(&mut parsed_module.function_body_inputs); for (defined_func_idx, body_data) in func_body_inputs { let func_index = &parsed_module.module.func_index(defined_func_idx); From eb3c0c9ae8d9330e5a2f86c757bb872d3de5f348 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 15 Mar 2024 03:00:28 -0400 Subject: [PATCH 9/9] fix: after rebase, add Wasm CM `record` type conversion, temporary use of u64 for Felt in WIT. --- frontend-wasm/src/component/types/mod.rs | 14 +- frontend-wasm/src/config.rs | 7 +- .../sdk_basic_wallet/basic_wallet.hir | 1938 +++++++++-------- .../sdk_basic_wallet/basic_wallet.wat | 32 +- .../basic_wallet_p2id_note.wat | 20 +- .../expected/sdk_basic_wallet/miden_sdk.wat | 20 +- tests/integration/src/rust_masm_tests/sdk.rs | 9 +- .../sdk/basic-wallet/src/bindings.rs | 298 +-- .../sdk/p2id-note/src/bindings.rs | 286 +-- tests/rust-apps-wasm/sdk/sdk/src/bindings.rs | 54 +- tests/rust-apps-wasm/sdk/sdk/wit/miden.wit | 50 +- 11 files changed, 1422 insertions(+), 1306 deletions(-) diff --git a/frontend-wasm/src/component/types/mod.rs b/frontend-wasm/src/component/types/mod.rs index 8d48f171d..2f15946c0 100644 --- a/frontend-wasm/src/component/types/mod.rs +++ b/frontend-wasm/src/component/types/mod.rs @@ -1727,7 +1727,7 @@ impl TypeInformation { pub fn interface_type_to_ir( ty: &InterfaceType, - _component_types: &ComponentTypes, + component_types: &ComponentTypes, ) -> miden_hir_type::Type { match ty { InterfaceType::Bool => miden_hir_type::Type::I1, @@ -1743,14 +1743,20 @@ pub fn interface_type_to_ir( InterfaceType::Float64 => todo!(), InterfaceType::Char => todo!(), InterfaceType::String => todo!(), - InterfaceType::Record(_) => todo!(), + InterfaceType::Record(idx) => { + let tys = component_types.records[*idx] + .fields + .iter() + .map(|f| interface_type_to_ir(&f.ty, component_types)); + miden_hir_type::Type::Struct(miden_hir_type::StructType::new(tys)) + } InterfaceType::Variant(_) => todo!(), InterfaceType::List(_) => todo!(), InterfaceType::Tuple(tuple_idx) => { - let tys = _component_types.tuples[*tuple_idx] + let tys = component_types.tuples[*tuple_idx] .types .iter() - .map(|t| interface_type_to_ir(t, _component_types)); + .map(|t| interface_type_to_ir(t, component_types)); miden_hir_type::Type::Struct(miden_hir_type::StructType::new(tys)) } InterfaceType::Flags(_) => todo!(), diff --git a/frontend-wasm/src/config.rs b/frontend-wasm/src/config.rs index 4992582cf..265d169cb 100644 --- a/frontend-wasm/src/config.rs +++ b/frontend-wasm/src/config.rs @@ -1,8 +1,7 @@ -use std::borrow::Cow; +use alloc::{borrow::Cow, collections::BTreeMap}; use miden_core::crypto::hash::RpoDigest; use miden_hir::{FunctionExportName, FunctionInvocationMethod, InterfaceFunctionIdent}; -use rustc_hash::FxHashMap; /// Represents Miden VM codegen metadata for a function import. /// This struct will have more fields in the future e.g. where the function @@ -42,10 +41,10 @@ pub struct WasmTranslationConfig { /// Import metadata for MAST hashes, calling convention, of /// each imported function. Having it here might be a temporary solution, /// later we might want to move it to Wasm custom section. - pub import_metadata: FxHashMap, + pub import_metadata: BTreeMap, /// Export metadata for calling convention, etc. - pub export_metadata: FxHashMap, + pub export_metadata: BTreeMap, } impl Default for WasmTranslationConfig { diff --git a/tests/integration/expected/sdk_basic_wallet/basic_wallet.hir b/tests/integration/expected/sdk_basic_wallet/basic_wallet.hir index 86de18ccb..db8711193 100644 --- a/tests/integration/expected/sdk_basic_wallet/basic_wallet.hir +++ b/tests/integration/expected/sdk_basic_wallet/basic_wallet.hir @@ -1,918 +1,1020 @@ -component - -import "call" miden:base/tx-kernel@1.0.0::create-note fn((u64, u64, u64, u64), u64, (u64, u64, u64, u64)) mast#0x0000000000000000000000000000000000000000000000000000000000000000 lower module0::basic_wallet::bindings::miden::base::tx_kernel::create_note::wit_import -import "call" miden:base/tx-kernel@1.0.0::add-asset fn((u64, u64, u64, u64)) -> (u64, u64, u64, u64) mast#0x0000000000000000000000000000000000000000000000000000000000000000 lower wit-component:fixups::func0 -import "call" miden:base/tx-kernel@1.0.0::remove-asset fn((u64, u64, u64, u64)) -> (u64, u64, u64, u64) mast#0x0000000000000000000000000000000000000000000000000000000000000000 lower wit-component:fixups::func1 - -// ==================================================================== -module wit-component:shim - -pub fn indirect-miden:base/tx-kernel@1.0.0-add-asset(i64, i64, i64, i64, i32) { -block0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i32): - v5 = const.i32 0 : i32; - br block1; - -block1: - ret; -} - -pub fn indirect-miden:base/tx-kernel@1.0.0-remove-asset(i64, i64, i64, i64, i32) { -block0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i32): - v5 = const.i32 1 : i32; - br block1; - -block1: - ret; -} - -// ==================================================================== -module module0 - -const $0 = 0x00100000; - -global external @__stack_pointer : i32 = $0 { id = 0 }; - -pub fn __wasm_call_ctors() { -block0: - br block1; - -block1: - ret; -} - -pub fn miden:basic-wallet/basic-wallet@1.0.0#receive-asset(i64, i64, i64, i64) { -block0(v0: i64, v1: i64, v2: i64, v3: i64): - v4 = const.i32 0 : i32; - v5 = global.load (@__stack_pointer) as *mut i8 : i32; - v6 = const.i32 32 : i32; - v7 = sub.wrapping v5, v6 : i32; - v8 = global.symbol @__stack_pointer : *mut i32; - store v8, v7; - call module0::wit_bindgen::rt::run_ctors_once(); - call wit-component:shim::indirect-miden:base/tx-kernel@1.0.0-add-asset(v0, v1, v2, v3, v7); - v9 = const.i32 32 : i32; - v10 = add.wrapping v7, v9 : i32; - v11 = global.symbol @__stack_pointer : *mut i32; - store v11, v10; - br block1; - -block1: - ret; -} - -pub fn miden:basic-wallet/basic-wallet@1.0.0#send-asset(i64, i64, i64, i64, i64, i64, i64, i64, i64) { -block0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i64, v5: i64, v6: i64, v7: i64, v8: i64): - v9 = const.i32 0 : i32; - v10 = global.load (@__stack_pointer) as *mut i8 : i32; - v11 = const.i32 32 : i32; - v12 = sub.wrapping v10, v11 : i32; - v13 = global.symbol @__stack_pointer : *mut i32; - store v13, v12; - call module0::wit_bindgen::rt::run_ctors_once(); - call wit-component:shim::indirect-miden:base/tx-kernel@1.0.0-remove-asset(v0, v1, v2, v3, v12); - v14 = cast v12 : u32; - v15 = inttoptr v14 : *mut i64; - v16 = load v15 : i64; - v17 = const.i32 8 : i32; - v18 = add.wrapping v12, v17 : i32; - v19 = cast v18 : u32; - v20 = inttoptr v19 : *mut i64; - v21 = load v20 : i64; - v22 = const.i32 16 : i32; - v23 = add.wrapping v12, v22 : i32; - v24 = cast v23 : u32; - v25 = inttoptr v24 : *mut i64; - v26 = load v25 : i64; - v27 = const.i32 24 : i32; - v28 = add.wrapping v12, v27 : i32; - v29 = cast v28 : u32; - v30 = inttoptr v29 : *mut i64; - v31 = load v30 : i64; - call module0::basic_wallet::bindings::miden::base::tx_kernel::create_note::wit_import(v16, v21, v26, v31, v4, v5, v6, v7, v8); - v32 = const.i32 32 : i32; - v33 = add.wrapping v12, v32 : i32; - v34 = global.symbol @__stack_pointer : *mut i32; - store v34, v33; - br block1; - -block1: - ret; -} - -pub fn __rust_alloc(i32, i32) -> i32 { -block0(v0: i32, v1: i32): - v3 = const.i32 1048576 : i32; - v4 = call module0::::alloc(v3, v1, v0) : i32; - br block1(v4); - -block1(v2: i32): - ret v2; -} - -pub fn __rust_realloc(i32, i32, i32, i32) -> i32 { -block0(v0: i32, v1: i32, v2: i32, v3: i32): - v5 = const.i32 0 : i32; - v6 = const.i32 1048576 : i32; - v7 = call module0::::alloc(v6, v2, v3) : i32; - v8 = eq v7, 0 : i1; - v9 = cast v8 : i32; - v10 = neq v9, 0 : i1; - condbr v10, block2(v7), block3; - -block1(v4: i32): - ret v4; - -block2(v22: i32): - br block1(v22); - -block3: - v11 = cast v1 : u32; - v12 = cast v3 : u32; - v13 = lt v11, v12 : i1; - v14 = cast v13 : i32; - v15 = neq v14, 0 : i1; - v16 = select v15, v1, v3 : i32; - v17 = cast v7 : u32; - v18 = inttoptr v17 : *mut u8; - v19 = cast v0 : u32; - v20 = inttoptr v19 : *mut u8; - memcpy v20, v18, v16; - v21 = const.i32 1048576 : i32; - call module0::::dealloc(v21, v0, v2, v1); - br block2(v7); -} - -pub fn wee_alloc::alloc_first_fit(i32, i32, i32) -> i32 { -block0(v0: i32, v1: i32, v2: i32): - v4 = const.i32 0 : i32; - v5 = cast v2 : u32; - v6 = inttoptr v5 : *mut i32; - v7 = load v6 : i32; - v8 = neq v7, 0 : i1; - condbr v8, block2, block3; - -block1(v3: i32): - ret v3; - -block2: - v10 = const.i32 -1 : i32; - v11 = add.wrapping v1, v10 : i32; - v12 = const.i32 0 : i32; - v13 = sub.wrapping v12, v1 : i32; - v14 = const.i32 2 : i32; - v15 = shl.wrapping v0, v14 : i32; - br block4(v7, v2, v15, v13, v11); - -block3: - v9 = const.i32 0 : i32; - ret v9; - -block4(v16: i32, v147: i32, v158: i32, v173: i32, v186: i32): - v17 = cast v16 : u32; - v18 = add.checked v17, 8 : u32; - v19 = inttoptr v18 : *mut i32; - v20 = load v19 : i32; - v21 = const.i32 1 : i32; - v22 = band v20, v21 : i32; - v23 = neq v22, 0 : i1; - condbr v23, block7, block8; - -block5: - v305 = const.i32 0 : i32; - br block1(v305); - -block6(v148: i32, v157: i32, v172: i32, v185: i32, v194: i32, v298: i32): - v149 = cast v148 : u32; - v150 = inttoptr v149 : *mut i32; - v151 = load v150 : i32; - v152 = const.i32 -4 : i32; - v153 = band v151, v152 : i32; - v154 = const.i32 8 : i32; - v155 = add.wrapping v148, v154 : i32; - v156 = sub.wrapping v153, v155 : i32; - v164 = cast v156 : u32; - v165 = cast v157 : u32; - v166 = lt v164, v165 : i1; - v167 = cast v166 : i32; - v168 = neq v167, 0 : i1; - condbr v168, block22(v194, v298, v157, v172, v185), block23; - -block7: - br block9(v16, v20, v147, v158, v173, v186); - -block8: - br block6(v16, v158, v173, v186, v147, v20); - -block9(v24: i32, v25: i32, v136: i32, v163: i32, v178: i32, v191: i32): - v26 = const.i32 -2 : i32; - v27 = band v25, v26 : i32; - v28 = cast v24 : u32; - v29 = add.checked v28, 8 : u32; - v30 = inttoptr v29 : *mut i32; - store v30, v27; - v31 = cast v24 : u32; - v32 = add.checked v31, 4 : u32; - v33 = inttoptr v32 : *mut i32; - v34 = load v33 : i32; - v35 = const.i32 -4 : i32; - v36 = band v34, v35 : i32; - v37 = neq v36, 0 : i1; - condbr v37, block12, block13; - -block10: - br block6(v137, v159, v174, v187, v132, v143); - -block11(v48: i32, v66: i32, v106: i32, v124: i32, v135: i32, v162: i32, v177: i32, v190: i32): - v49 = cast v48 : u32; - v50 = inttoptr v49 : *mut i32; - v51 = load v50 : i32; - v52 = const.i32 -4 : i32; - v53 = band v51, v52 : i32; - v54 = eq v53, 0 : i1; - v55 = cast v54 : i32; - v56 = neq v55, 0 : i1; - condbr v56, block14(v66, v51, v48, v106, v124, v135, v162, v177, v190), block15; - -block12: - v39 = const.i32 0 : i32; - v40 = cast v36 : u32; - v41 = inttoptr v40 : *mut u8; - v42 = load v41 : u8; - v43 = zext v42 : i32; - v44 = const.i32 1 : i32; - v45 = band v43, v44 : i32; - v46 = neq v45, 0 : i1; - v47 = select v46, v39, v36 : i32; - br block11(v24, v36, v34, v47, v136, v163, v178, v191); - -block13: - v38 = const.i32 0 : i32; - br block11(v24, v36, v34, v38, v136, v163, v178, v191); - -block14(v80: i32, v89: i32, v95: i32, v105: i32, v123: i32, v134: i32, v161: i32, v176: i32, v189: i32): - v81 = eq v80, 0 : i1; - v82 = cast v81 : i32; - v83 = neq v82, 0 : i1; - condbr v83, block17(v95, v105, v89, v123, v134, v161, v176, v189), block18; - -block15: - v57 = const.i32 2 : i32; - v58 = band v51, v57 : i32; - v59 = neq v58, 0 : i1; - condbr v59, block14(v66, v51, v48, v106, v124, v135, v162, v177, v190), block16; - -block16: - v60 = cast v53 : u32; - v61 = add.checked v60, 4 : u32; - v62 = inttoptr v61 : *mut i32; - v63 = load v62 : i32; - v64 = const.i32 3 : i32; - v65 = band v63, v64 : i32; - v67 = bor v65, v66 : i32; - v68 = cast v53 : u32; - v69 = add.checked v68, 4 : u32; - v70 = inttoptr v69 : *mut i32; - store v70, v67; - v71 = cast v48 : u32; - v72 = add.checked v71, 4 : u32; - v73 = inttoptr v72 : *mut i32; - v74 = load v73 : i32; - v75 = const.i32 -4 : i32; - v76 = band v74, v75 : i32; - v77 = cast v48 : u32; - v78 = inttoptr v77 : *mut i32; - v79 = load v78 : i32; - br block14(v76, v79, v48, v74, v124, v135, v162, v177, v190); - -block17(v103: i32, v104: i32, v112: i32, v122: i32, v133: i32, v160: i32, v175: i32, v188: i32): - v107 = const.i32 3 : i32; - v108 = band v104, v107 : i32; - v109 = cast v103 : u32; - v110 = add.checked v109, 4 : u32; - v111 = inttoptr v110 : *mut i32; - store v111, v108; - v113 = const.i32 3 : i32; - v114 = band v112, v113 : i32; - v115 = cast v103 : u32; - v116 = inttoptr v115 : *mut i32; - store v116, v114; - v117 = const.i32 2 : i32; - v118 = band v112, v117 : i32; - v119 = eq v118, 0 : i1; - v120 = cast v119 : i32; - v121 = neq v120, 0 : i1; - condbr v121, block19(v133, v122, v160, v175, v188), block20; - -block18: - v84 = cast v80 : u32; - v85 = inttoptr v84 : *mut i32; - v86 = load v85 : i32; - v87 = const.i32 3 : i32; - v88 = band v86, v87 : i32; - v90 = const.i32 -4 : i32; - v91 = band v89, v90 : i32; - v92 = bor v88, v91 : i32; - v93 = cast v80 : u32; - v94 = inttoptr v93 : *mut i32; - store v94, v92; - v96 = cast v95 : u32; - v97 = add.checked v96, 4 : u32; - v98 = inttoptr v97 : *mut i32; - v99 = load v98 : i32; - v100 = cast v95 : u32; - v101 = inttoptr v100 : *mut i32; - v102 = load v101 : i32; - br block17(v95, v99, v102, v123, v134, v161, v176, v189); - -block19(v132: i32, v137: i32, v159: i32, v174: i32, v187: i32): - v138 = cast v132 : u32; - v139 = inttoptr v138 : *mut i32; - store v139, v137; - v140 = cast v137 : u32; - v141 = add.checked v140, 8 : u32; - v142 = inttoptr v141 : *mut i32; - v143 = load v142 : i32; - v144 = const.i32 1 : i32; - v145 = band v143, v144 : i32; - v146 = neq v145, 0 : i1; - condbr v146, block9(v137, v143, v132, v159, v174, v187), block21; - -block20: - v125 = cast v122 : u32; - v126 = inttoptr v125 : *mut i32; - v127 = load v126 : i32; - v128 = const.i32 2 : i32; - v129 = bor v127, v128 : i32; - v130 = cast v122 : u32; - v131 = inttoptr v130 : *mut i32; - store v131, v129; - br block19(v133, v122, v160, v175, v188); - -block21: - br block10; - -block22(v296: i32, v297: i32, v302: i32, v303: i32, v304: i32): - v299 = cast v296 : u32; - v300 = inttoptr v299 : *mut i32; - store v300, v297; - v301 = neq v297, 0 : i1; - condbr v301, block4(v297, v296, v302, v303, v304), block33; - -block23: - v169 = const.i32 72 : i32; - v170 = add.wrapping v155, v169 : i32; - v171 = sub.wrapping v153, v157 : i32; - v179 = band v171, v172 : i32; - v180 = cast v170 : u32; - v181 = cast v179 : u32; - v182 = lte v180, v181 : i1; - v183 = cast v182 : i32; - v184 = neq v183, 0 : i1; - condbr v184, block25, block26; - -block24(v288: i32, v289: i32): - v290 = const.i32 1 : i32; - v291 = bor v289, v290 : i32; - v292 = cast v288 : u32; - v293 = inttoptr v292 : *mut i32; - store v293, v291; - v294 = const.i32 8 : i32; - v295 = add.wrapping v288, v294 : i32; - ret v295; - -block25: - v206 = const.i32 0 : i32; - v207 = const.i32 0 : i32; - v208 = cast v179 : u32; - v209 = inttoptr v208 : *mut i32; - store v209, v207; - v210 = const.i32 -8 : i32; - v211 = add.wrapping v179, v210 : i32; - v212 = const.i64 0 : i64; - v213 = cast v211 : u32; - v214 = inttoptr v213 : *mut i64; - store v214, v212; - v215 = cast v148 : u32; - v216 = inttoptr v215 : *mut i32; - v217 = load v216 : i32; - v218 = const.i32 -4 : i32; - v219 = band v217, v218 : i32; - v220 = cast v211 : u32; - v221 = inttoptr v220 : *mut i32; - store v221, v219; - v222 = cast v148 : u32; - v223 = inttoptr v222 : *mut i32; - v224 = load v223 : i32; - v225 = const.i32 -4 : i32; - v226 = band v224, v225 : i32; - v227 = eq v226, 0 : i1; - v228 = cast v227 : i32; - v229 = neq v228, 0 : i1; - condbr v229, block28(v211, v206, v148), block29; - -block26: - v192 = band v185, v155 : i32; - v193 = neq v192, 0 : i1; - condbr v193, block22(v194, v298, v157, v172, v185), block27; - -block27: - v195 = cast v148 : u32; - v196 = add.checked v195, 8 : u32; - v197 = inttoptr v196 : *mut i32; - v198 = load v197 : i32; - v199 = const.i32 -4 : i32; - v200 = band v198, v199 : i32; - v201 = cast v194 : u32; - v202 = inttoptr v201 : *mut i32; - store v202, v200; - v203 = cast v148 : u32; - v204 = inttoptr v203 : *mut i32; - v205 = load v204 : i32; - br block24(v148, v205); - -block28(v249: i32, v250: i32, v251: i32): - v252 = bor v250, v251 : i32; - v253 = cast v249 : u32; - v254 = add.checked v253, 4 : u32; - v255 = inttoptr v254 : *mut i32; - store v255, v252; - v256 = cast v251 : u32; - v257 = add.checked v256, 8 : u32; - v258 = inttoptr v257 : *mut i32; - v259 = load v258 : i32; - v260 = const.i32 -2 : i32; - v261 = band v259, v260 : i32; - v262 = cast v251 : u32; - v263 = add.checked v262, 8 : u32; - v264 = inttoptr v263 : *mut i32; - store v264, v261; - v265 = cast v251 : u32; - v266 = inttoptr v265 : *mut i32; - v267 = load v266 : i32; - v268 = const.i32 3 : i32; - v269 = band v267, v268 : i32; - v270 = bor v269, v249 : i32; - v271 = cast v251 : u32; - v272 = inttoptr v271 : *mut i32; - store v272, v270; - v273 = const.i32 2 : i32; - v274 = band v267, v273 : i32; - v275 = neq v274, 0 : i1; - condbr v275, block31, block32; - -block29: - v230 = const.i32 2 : i32; - v231 = band v224, v230 : i32; - v232 = neq v231, 0 : i1; - condbr v232, block28(v211, v206, v148), block30; - -block30: - v233 = cast v226 : u32; - v234 = add.checked v233, 4 : u32; - v235 = inttoptr v234 : *mut i32; - v236 = load v235 : i32; - v237 = const.i32 3 : i32; - v238 = band v236, v237 : i32; - v239 = bor v238, v211 : i32; - v240 = cast v226 : u32; - v241 = add.checked v240, 4 : u32; - v242 = inttoptr v241 : *mut i32; - store v242, v239; - v243 = cast v211 : u32; - v244 = add.checked v243, 4 : u32; - v245 = inttoptr v244 : *mut i32; - v246 = load v245 : i32; - v247 = const.i32 3 : i32; - v248 = band v246, v247 : i32; - br block28(v211, v248, v148); - -block31: - v279 = const.i32 -3 : i32; - v280 = band v270, v279 : i32; - v281 = cast v251 : u32; - v282 = inttoptr v281 : *mut i32; - store v282, v280; - v283 = cast v249 : u32; - v284 = inttoptr v283 : *mut i32; - v285 = load v284 : i32; - v286 = const.i32 2 : i32; - v287 = bor v285, v286 : i32; - br block24(v249, v287); - -block32: - v276 = cast v249 : u32; - v277 = inttoptr v276 : *mut i32; - v278 = load v277 : i32; - br block24(v249, v278); - -block33: - br block5; -} - -pub fn ::alloc(i32, i32, i32) -> i32 { -block0(v0: i32, v1: i32, v2: i32): - v4 = const.i32 0 : i32; - v5 = global.load (@__stack_pointer) as *mut i8 : i32; - v6 = const.i32 16 : i32; - v7 = sub.wrapping v5, v6 : i32; - v8 = global.symbol @__stack_pointer : *mut i32; - store v8, v7; - v9 = neq v2, 0 : i1; - condbr v9, block3, block4; - -block1(v3: i32): - ret v3; - -block2(v87: i32, v91: i32): - v88 = const.i32 16 : i32; - v89 = add.wrapping v87, v88 : i32; - v90 = global.symbol @__stack_pointer : *mut i32; - store v90, v89; - br block1(v91); - -block3: - v10 = cast v0 : u32; - v11 = inttoptr v10 : *mut i32; - v12 = load v11 : i32; - v13 = cast v7 : u32; - v14 = add.checked v13, 12 : u32; - v15 = inttoptr v14 : *mut i32; - store v15, v12; - v16 = const.i32 3 : i32; - v17 = add.wrapping v2, v16 : i32; - v18 = const.i32 2 : i32; - v19 = cast v17 : u32; - v20 = cast v18 : u32; - v21 = shr.wrapping v19, v20 : u32; - v22 = cast v21 : i32; - v23 = const.i32 12 : i32; - v24 = add.wrapping v7, v23 : i32; - v25 = call module0::wee_alloc::alloc_first_fit(v22, v1, v24) : i32; - v26 = neq v25, 0 : i1; - condbr v26, block5(v0, v7, v25), block6; - -block4: - br block2(v7, v1); - -block5(v79: i32, v80: i32, v92: i32): - v81 = cast v80 : u32; - v82 = add.checked v81, 12 : u32; - v83 = inttoptr v82 : *mut i32; - v84 = load v83 : i32; - v85 = cast v79 : u32; - v86 = inttoptr v85 : *mut i32; - store v86, v84; - br block2(v80, v92); - -block6: - v27 = const.i32 -4 : i32; - v28 = band v17, v27 : i32; - v29 = const.i32 3 : i32; - v30 = shl.wrapping v1, v29 : i32; - v31 = const.i32 512 : i32; - v32 = add.wrapping v30, v31 : i32; - v33 = cast v28 : u32; - v34 = cast v32 : u32; - v35 = gt v33, v34 : i1; - v36 = cast v35 : i32; - v37 = neq v36, 0 : i1; - v38 = select v37, v28, v32 : i32; - v39 = const.i32 65543 : i32; - v40 = add.wrapping v38, v39 : i32; - v41 = const.i32 16 : i32; - v42 = cast v40 : u32; - v43 = cast v41 : u32; - v44 = shr.wrapping v42, v43 : u32; - v45 = cast v44 : i32; - v46 = cast v45 : u32; - v47 = memory.grow v46 : i32; - v48 = const.i32 -1 : i32; - v49 = neq v47, v48 : i1; - v50 = cast v49 : i32; - v51 = neq v50, 0 : i1; - condbr v51, block7, block8; - -block7: - v53 = const.i32 16 : i32; - v54 = shl.wrapping v47, v53 : i32; - v55 = const.i32 0 : i32; - v56 = cast v54 : u32; - v57 = add.checked v56, 4 : u32; - v58 = inttoptr v57 : *mut i32; - store v58, v55; - v59 = cast v7 : u32; - v60 = add.checked v59, 12 : u32; - v61 = inttoptr v60 : *mut i32; - v62 = load v61 : i32; - v63 = cast v54 : u32; - v64 = add.checked v63, 8 : u32; - v65 = inttoptr v64 : *mut i32; - store v65, v62; - v66 = const.i32 -65536 : i32; - v67 = band v40, v66 : i32; - v68 = add.wrapping v54, v67 : i32; - v69 = const.i32 2 : i32; - v70 = bor v68, v69 : i32; - v71 = cast v54 : u32; - v72 = inttoptr v71 : *mut i32; - store v72, v70; - v73 = cast v7 : u32; - v74 = add.checked v73, 12 : u32; - v75 = inttoptr v74 : *mut i32; - store v75, v54; - v76 = const.i32 12 : i32; - v77 = add.wrapping v7, v76 : i32; - v78 = call module0::wee_alloc::alloc_first_fit(v22, v1, v77) : i32; - br block5(v0, v7, v78); - -block8: - v52 = const.i32 0 : i32; - br block5(v0, v7, v52); -} - -pub fn ::dealloc(i32, i32, i32, i32) { -block0(v0: i32, v1: i32, v2: i32, v3: i32): - v4 = const.i32 0 : i32; - v5 = eq v1, 0 : i1; - v6 = cast v5 : i32; - v7 = neq v6, 0 : i1; - condbr v7, block2, block3; - -block1: - ret; - -block2: - br block1; - -block3: - v8 = eq v3, 0 : i1; - v9 = cast v8 : i32; - v10 = neq v9, 0 : i1; - condbr v10, block2, block4; - -block4: - v11 = cast v0 : u32; - v12 = inttoptr v11 : *mut i32; - v13 = load v12 : i32; - v14 = const.i32 0 : i32; - v15 = cast v1 : u32; - v16 = inttoptr v15 : *mut i32; - store v16, v14; - v17 = const.i32 -8 : i32; - v18 = add.wrapping v1, v17 : i32; - v19 = cast v18 : u32; - v20 = inttoptr v19 : *mut i32; - v21 = load v20 : i32; - v22 = const.i32 -2 : i32; - v23 = band v21, v22 : i32; - v24 = cast v18 : u32; - v25 = inttoptr v24 : *mut i32; - store v25, v23; - v26 = const.i32 4 : i32; - v27 = add.wrapping v18, v26 : i32; - v28 = cast v27 : u32; - v29 = inttoptr v28 : *mut i32; - v30 = load v29 : i32; - v31 = const.i32 -4 : i32; - v32 = band v30, v31 : i32; - v33 = eq v32, 0 : i1; - v34 = cast v33 : i32; - v35 = neq v34, 0 : i1; - condbr v35, block8(v21, v1, v18, v13, v0), block9; - -block5(v155: i32, v161: i32): - v163 = cast v155 : u32; - v164 = inttoptr v163 : *mut i32; - store v164, v161; - br block2; - -block6(v151: i32, v152: i32, v160: i32, v162: i32): - v153 = cast v151 : u32; - v154 = inttoptr v153 : *mut i32; - store v154, v152; - br block5(v160, v162); - -block7(v147: i32, v156: i32): - br block5(v156, v147); - -block8(v116: i32, v132: i32, v141: i32, v150: i32, v159: i32): - v117 = const.i32 -4 : i32; - v118 = band v116, v117 : i32; - v119 = eq v118, 0 : i1; - v120 = cast v119 : i32; - v121 = neq v120, 0 : i1; - condbr v121, block6(v132, v150, v159, v141), block18; - -block9: - v36 = cast v32 : u32; - v37 = inttoptr v36 : *mut i32; - v38 = load v37 : i32; - v39 = const.i32 1 : i32; - v40 = band v38, v39 : i32; - v41 = neq v40, 0 : i1; - condbr v41, block8(v21, v1, v18, v13, v0), block10; - -block10: - v42 = const.i32 -4 : i32; - v43 = band v21, v42 : i32; - v44 = neq v43, 0 : i1; - condbr v44, block13, block14; - -block11(v90: i32, v91: i32, v96: i32, v97: i32, v107: i32, v148: i32, v157: i32): - v92 = const.i32 3 : i32; - v93 = band v91, v92 : i32; - v94 = cast v90 : u32; - v95 = inttoptr v94 : *mut i32; - store v95, v93; - v98 = const.i32 3 : i32; - v99 = band v97, v98 : i32; - v100 = cast v96 : u32; - v101 = inttoptr v100 : *mut i32; - store v101, v99; - v102 = const.i32 2 : i32; - v103 = band v97, v102 : i32; - v104 = eq v103, 0 : i1; - v105 = cast v104 : i32; - v106 = neq v105, 0 : i1; - condbr v106, block7(v148, v157), block17; - -block12(v72: i32, v73: i32, v76: i32, v82: i32, v86: i32, v108: i32, v149: i32, v158: i32): - v74 = const.i32 -4 : i32; - v75 = band v73, v74 : i32; - v77 = const.i32 3 : i32; - v78 = band v76, v77 : i32; - v79 = bor v75, v78 : i32; - v80 = cast v72 : u32; - v81 = inttoptr v80 : *mut i32; - store v81, v79; - v83 = cast v82 : u32; - v84 = inttoptr v83 : *mut i32; - v85 = load v84 : i32; - v87 = cast v86 : u32; - v88 = inttoptr v87 : *mut i32; - v89 = load v88 : i32; - br block11(v82, v85, v86, v89, v108, v149, v158); - -block13: - v45 = const.i32 2 : i32; - v46 = band v21, v45 : i32; - v47 = neq v46, 0 : i1; - condbr v47, block12(v32, v23, v38, v27, v18, v32, v13, v0), block15; - -block14: - br block12(v32, v23, v38, v27, v18, v32, v13, v0); - -block15: - v48 = cast v43 : u32; - v49 = add.checked v48, 4 : u32; - v50 = inttoptr v49 : *mut i32; - v51 = load v50 : i32; - v52 = const.i32 3 : i32; - v53 = band v51, v52 : i32; - v54 = bor v53, v32 : i32; - v55 = cast v43 : u32; - v56 = add.checked v55, 4 : u32; - v57 = inttoptr v56 : *mut i32; - store v57, v54; - v58 = cast v18 : u32; - v59 = inttoptr v58 : *mut i32; - v60 = load v59 : i32; - v61 = cast v27 : u32; - v62 = inttoptr v61 : *mut i32; - v63 = load v62 : i32; - v64 = const.i32 -4 : i32; - v65 = band v63, v64 : i32; - v66 = eq v65, 0 : i1; - v67 = cast v66 : i32; - v68 = neq v67, 0 : i1; - condbr v68, block11(v27, v63, v18, v60, v32, v13, v0), block16; - -block16: - v69 = cast v65 : u32; - v70 = inttoptr v69 : *mut i32; - v71 = load v70 : i32; - br block12(v65, v60, v71, v27, v18, v32, v13, v0); - -block17: - v109 = cast v107 : u32; - v110 = inttoptr v109 : *mut i32; - v111 = load v110 : i32; - v112 = const.i32 2 : i32; - v113 = bor v111, v112 : i32; - v114 = cast v107 : u32; - v115 = inttoptr v114 : *mut i32; - store v115, v113; - br block7(v148, v157); - -block18: - v122 = const.i32 2 : i32; - v123 = band v116, v122 : i32; - v124 = neq v123, 0 : i1; - condbr v124, block6(v132, v150, v159, v141), block19; - -block19: - v125 = cast v118 : u32; - v126 = inttoptr v125 : *mut u8; - v127 = load v126 : u8; - v128 = zext v127 : i32; - v129 = const.i32 1 : i32; - v130 = band v128, v129 : i32; - v131 = neq v130, 0 : i1; - condbr v131, block6(v132, v150, v159, v141), block20; - -block20: - v133 = cast v118 : u32; - v134 = add.checked v133, 8 : u32; - v135 = inttoptr v134 : *mut i32; - v136 = load v135 : i32; - v137 = const.i32 -4 : i32; - v138 = band v136, v137 : i32; - v139 = cast v132 : u32; - v140 = inttoptr v139 : *mut i32; - store v140, v138; - v142 = const.i32 1 : i32; - v143 = bor v141, v142 : i32; - v144 = cast v118 : u32; - v145 = add.checked v144, 8 : u32; - v146 = inttoptr v145 : *mut i32; - store v146, v143; - br block7(v150, v159); -} - -pub fn wit_bindgen::rt::run_ctors_once() { -block0: - v0 = const.i32 0 : i32; - v1 = cast v0 : u32; - v2 = add.checked v1, 1048581 : u32; - v3 = inttoptr v2 : *mut u8; - v4 = load v3 : u8; - v5 = zext v4 : i32; - v6 = neq v5, 0 : i1; - condbr v6, block2, block3; - -block1: - ret; - -block2: - br block1; - -block3: - call module0::__wasm_call_ctors(); - v7 = const.i32 0 : i32; - v8 = const.i32 1 : i32; - v9 = trunc v8 : u8; - v10 = cast v7 : u32; - v11 = add.checked v10, 1048581 : u32; - v12 = inttoptr v11 : *mut u8; - store v12, v9; - br block2; -} - -pub fn cabi_realloc(i32, i32, i32, i32) -> i32 { -block0(v0: i32, v1: i32, v2: i32, v3: i32): - v5 = neq v1, 0 : i1; - condbr v5, block4, block5; - -block1(v4: i32): - ret v4; - -block2(v19: i32): - br block1(v19); - -block3(v17: i32): - v18 = neq v17, 0 : i1; - condbr v18, block2(v17), block7; - -block4: - v16 = call module0::__rust_realloc(v0, v1, v2, v3) : i32; - br block3(v16); - -block5: - v6 = eq v3, 0 : i1; - v7 = cast v6 : i32; - v8 = neq v7, 0 : i1; - condbr v8, block2(v2), block6; - -block6: - v9 = const.i32 0 : i32; - v10 = cast v9 : u32; - v11 = add.checked v10, 1048580 : u32; - v12 = inttoptr v11 : *mut u8; - v13 = load v12 : u8; - v14 = zext v13 : i32; - v15 = call module0::__rust_alloc(v3, v2) : i32; - br block3(v15); - -block7: - unreachable ; -} - - -pub fn wit-component:shim::indirect-miden:base/tx-kernel@1.0.0-add-asset(i64, i64, i64, i64, i32); - -pub fn wit-component:shim::indirect-miden:base/tx-kernel@1.0.0-remove-asset(i64, i64, i64, i64, i32); - -// ==================================================================== -module wit-component:fixups - - +(component + ;; Component Imports + (lower (import 0x0000000000000000000000000000000000000000000000000000000000000000 (call) (type (func (param (struct (struct (struct u64) (struct u64) (struct u64) (struct u64)))) (param (struct (struct u64))) (param (struct (struct (struct u64) (struct u64) (struct u64) (struct u64)))) (result (struct (struct u64)))))) (#basic_wallet.wasm #basic_wallet::bindings::miden::base::tx::create_note::wit_import) + (lower (import 0x0000000000000000000000000000000000000000000000000000000000000000 (call) (type (func (param (struct (struct (struct u64) (struct u64) (struct u64) (struct u64)))) (result (struct (struct (struct u64) (struct u64) (struct u64) (struct u64))))))) (#wit-component:fixups #func0) + (lower (import 0x0000000000000000000000000000000000000000000000000000000000000000 (call) (type (func (param (struct (struct (struct u64) (struct u64) (struct u64) (struct u64)))) (result (struct (struct (struct u64) (struct u64) (struct u64) (struct u64))))))) (#wit-component:fixups #func1) + + ;; Modules + (module #wit-component:shim + ;; Functions + (func (export #indirect-miden:base/account@1.0.0-add-asset) + (param i64) (param i64) (param i64) (param i64) (param i32) + (block 0 + (param v0 i64) + (param v1 i64) + (param v2 i64) + (param v3 i64) + (param v4 i32) + (let (v5 i32) (const.i32 0)) + (br (block 1))) + + (block 1 + (ret)) + ) + + (func (export #indirect-miden:base/account@1.0.0-remove-asset) + (param i64) (param i64) (param i64) (param i64) (param i32) + (block 0 + (param v0 i64) + (param v1 i64) + (param v2 i64) + (param v3 i64) + (param v4 i32) + (let (v5 i32) (const.i32 1)) + (br (block 1))) + + (block 1 + (ret)) + ) + ) + + (module #basic_wallet.wasm + ;; Constants + (const (id 0) 0x00100000) + + ;; Global Variables + (global (export #__stack_pointer) (id 0) (type i32) (const 0)) + + ;; Functions + (func (export #__wasm_call_ctors) + (block 0 + (br (block 1))) + + (block 1 + (ret)) + ) + + (func (export #miden:basic-wallet/basic-wallet@1.0.0#receive-asset) + (param i64) (param i64) (param i64) (param i64) + (block 0 (param v0 i64) (param v1 i64) (param v2 i64) (param v3 i64) + (let (v4 i32) (const.i32 0)) + (let (v5 i32) (global.load i32 (global.symbol #__stack_pointer))) + (let (v6 i32) (const.i32 32)) + (let (v7 i32) (sub.wrapping v5 v6)) + (let (v8 (ptr i32)) (global.symbol #__stack_pointer)) + (store v8 v7) + (call #wit_bindgen::rt::run_ctors_once) + (call (#wit-component:shim #indirect-miden:base/account@1.0.0-add-asset) v0 v1 v2 v3 v7) + (let (v9 i32) (const.i32 32)) + (let (v10 i32) (add.wrapping v7 v9)) + (let (v11 (ptr i32)) (global.symbol #__stack_pointer)) + (store v11 v10) + (br (block 1))) + + (block 1 + (ret)) + ) + + (func (export #miden:basic-wallet/basic-wallet@1.0.0#send-asset) + (param i64) (param i64) (param i64) (param i64) (param i64) (param i64) (param i64) (param i64) (param i64) + (block 0 + (param v0 i64) + (param v1 i64) + (param v2 i64) + (param v3 i64) + (param v4 i64) + (param v5 i64) + (param v6 i64) + (param v7 i64) + (param v8 i64) + (let (v9 i32) (const.i32 0)) + (let (v10 i32) (global.load i32 (global.symbol #__stack_pointer))) + (let (v11 i32) (const.i32 32)) + (let (v12 i32) (sub.wrapping v10 v11)) + (let (v13 (ptr i32)) (global.symbol #__stack_pointer)) + (store v13 v12) + (call #wit_bindgen::rt::run_ctors_once) + (call (#wit-component:shim #indirect-miden:base/account@1.0.0-remove-asset) v0 v1 v2 v3 v12) + (let (v14 u32) (cast v12)) + (let (v15 (ptr i64)) (inttoptr v14)) + (let (v16 i64) (load v15)) + (let (v17 i32) (const.i32 8)) + (let (v18 i32) (add.wrapping v12 v17)) + (let (v19 u32) (cast v18)) + (let (v20 (ptr i64)) (inttoptr v19)) + (let (v21 i64) (load v20)) + (let (v22 i32) (const.i32 16)) + (let (v23 i32) (add.wrapping v12 v22)) + (let (v24 u32) (cast v23)) + (let (v25 (ptr i64)) (inttoptr v24)) + (let (v26 i64) (load v25)) + (let (v27 i32) (const.i32 24)) + (let (v28 i32) (add.wrapping v12 v27)) + (let (v29 u32) (cast v28)) + (let (v30 (ptr i64)) (inttoptr v29)) + (let (v31 i64) (load v30)) + (let (v32 i64) (call #basic_wallet::bindings::miden::base::tx::create_note::wit_import v16 v21 v26 v31 v4 v5 v6 v7 v8)) + (let (v33 i32) (const.i32 32)) + (let (v34 i32) (add.wrapping v12 v33)) + (let (v35 (ptr i32)) (global.symbol #__stack_pointer)) + (store v35 v34) + (br (block 1))) + + (block 1 + (ret)) + ) + + (func (export #__rust_alloc) (param i32) (param i32) (result i32) + (block 0 (param v0 i32) (param v1 i32) + (let (v3 i32) (const.i32 1048576)) + (let (v4 i32) (call #::alloc v3 v1 v0)) + (br (block 1 v4))) + + (block 1 (param v2 i32) + (ret v2)) + ) + + (func (export #__rust_realloc) + (param i32) (param i32) (param i32) (param i32) (result i32) + (block 0 (param v0 i32) (param v1 i32) (param v2 i32) (param v3 i32) + (let (v5 i32) (const.i32 0)) + (let (v6 i32) (const.i32 1048576)) + (let (v7 i32) (call #::alloc v6 v2 v3)) + (let (v8 i1) (eq v7 0)) + (let (v9 i32) (cast v8)) + (let (v10 i1) (neq v9 0)) + (condbr v10 (block 2 v7) (block 3))) + + (block 1 (param v4 i32) + (ret v4)) + + (block 2 (param v22 i32) + (br (block 1 v22))) + + (block 3 + (let (v11 u32) (cast v1)) + (let (v12 u32) (cast v3)) + (let (v13 i1) (lt v11 v12)) + (let (v14 i32) (cast v13)) + (let (v15 i1) (neq v14 0)) + (let (v16 i32) (select v15 v1 v3)) + (let (v17 u32) (cast v7)) + (let (v18 (ptr u8)) (inttoptr v17)) + (let (v19 u32) (cast v0)) + (let (v20 (ptr u8)) (inttoptr v19)) + (memcpy v20 v18 v16) + (let (v21 i32) (const.i32 1048576)) + (call #::dealloc v21 v0 v2 v1) + (br (block 2 v7))) + ) + + (func (export #wee_alloc::alloc_first_fit) + (param i32) (param i32) (param i32) (result i32) + (block 0 (param v0 i32) (param v1 i32) (param v2 i32) + (let (v4 i32) (const.i32 0)) + (let (v5 u32) (cast v2)) + (let (v6 (ptr i32)) (inttoptr v5)) + (let (v7 i32) (load v6)) + (let (v8 i1) (eq v7 0)) + (let (v9 i32) (cast v8)) + (let (v10 i1) (neq v9 0)) + (condbr v10 (block 2) (block 3))) + + (block 1 (param v3 i32) + (ret v3)) + + (block 2 + (let (v288 i32) (const.i32 0)) + (br (block 1 v288))) + + (block 3 + (let (v11 i32) (const.i32 -1)) + (let (v12 i32) (add.wrapping v1 v11)) + (let (v13 i32) (const.i32 0)) + (let (v14 i32) (sub.wrapping v13 v1)) + (let (v15 i32) (const.i32 2)) + (let (v16 i32) (shl.wrapping v0 v15)) + (br (block 4 v7 v2 v16 v14 v12))) + + (block 4 + (param v17 i32) + (param v139 i32) + (param v149 i32) + (param v163 i32) + (param v175 i32) + (let (v18 i32) (const.i32 8)) + (let (v19 i32) (add.wrapping v17 v18)) + (let (v20 u32) (cast v17)) + (let (v21 u32) (add.checked v20 8)) + (let (v22 (ptr i32)) (inttoptr v21)) + (let (v23 i32) (load v22)) + (let (v24 i32) (const.i32 1)) + (let (v25 i32) (band v23 v24)) + (let (v26 i1) (neq v25 0)) + (condbr v26 (block 7) (block 8))) + + (block 5 + (br (block 2))) + + (block 6 + (param v140 i32) + (param v146 i32) + (param v148 i32) + (param v162 i32) + (param v174 i32) + (param v182 i32) + (param v183 i32) + (let (v141 u32) (cast v140)) + (let (v142 (ptr i32)) (inttoptr v141)) + (let (v143 i32) (load v142)) + (let (v144 i32) (const.i32 -4)) + (let (v145 i32) (band v143 v144)) + (let (v147 i32) (sub.wrapping v145 v146)) + (let (v154 u32) (cast v147)) + (let (v155 u32) (cast v148)) + (let (v156 i1) (lt v154 v155)) + (let (v157 i32) (cast v156)) + (let (v158 i1) (neq v157 0)) + (condbr v158 (block 21 v182 v183 v148 v162 v174) (block 22))) + + (block 7 + (br (block 9 v19 v23 v17 v139 v149 v163 v175))) + + (block 8 + (br (block 6 v17 v19 v149 v163 v175 v139 v23))) + + (block 9 + (param v27 i32) + (param v28 i32) + (param v33 i32) + (param v125 i32) + (param v152 i32) + (param v166 i32) + (param v178 i32) + (let (v29 i32) (const.i32 -2)) + (let (v30 i32) (band v28 v29)) + (let (v31 u32) (cast v27)) + (let (v32 (ptr i32)) (inttoptr v31)) + (store v32 v30) + (let (v34 u32) (cast v33)) + (let (v35 u32) (add.checked v34 4)) + (let (v36 (ptr i32)) (inttoptr v35)) + (let (v37 i32) (load v36)) + (let (v38 i32) (const.i32 -4)) + (let (v39 i32) (band v37 v38)) + (let (v40 u32) (cast v39)) + (let (v41 (ptr i32)) (inttoptr v40)) + (let (v42 i32) (load v41)) + (let (v43 u32) (cast v33)) + (let (v44 (ptr i32)) (inttoptr v43)) + (let (v45 i32) (load v44)) + (let (v46 i32) (const.i32 -4)) + (let (v47 i32) (band v45 v46)) + (let (v48 i1) (neq v47 0)) + (condbr v48 (block 13) (block 14))) + + (block 10 + (br (block 6 v127 v131 v150 v164 v176 v123 v135))) + + (block 11 + (param v97 i32) + (param v98 i32) + (param v104 i32) + (param v114 i32) + (param v124 i32) + (param v151 i32) + (param v165 i32) + (param v177 i32) + (let (v99 i32) (const.i32 3)) + (let (v100 i32) (band v98 v99)) + (let (v101 u32) (cast v97)) + (let (v102 u32) (add.checked v101 4)) + (let (v103 (ptr i32)) (inttoptr v102)) + (store v103 v100) + (let (v105 i32) (const.i32 3)) + (let (v106 i32) (band v104 v105)) + (let (v107 u32) (cast v97)) + (let (v108 (ptr i32)) (inttoptr v107)) + (store v108 v106) + (let (v109 i32) (const.i32 2)) + (let (v110 i32) (band v104 v109)) + (let (v111 i1) (eq v110 0)) + (let (v112 i32) (cast v111)) + (let (v113 i1) (neq v112 0)) + (condbr v113 (block 18 v124 v114 v151 v165 v177) (block 19))) + + (block 12 + (param v81 i32) + (param v82 i32) + (param v85 i32) + (param v89 i32) + (param v115 i32) + (param v126 i32) + (param v153 i32) + (param v167 i32) + (param v179 i32) + (let (v83 i32) (const.i32 3)) + (let (v84 i32) (band v82 v83)) + (let (v86 i32) (bor v84 v85)) + (let (v87 u32) (cast v81)) + (let (v88 (ptr i32)) (inttoptr v87)) + (store v88 v86) + (let (v90 u32) (cast v89)) + (let (v91 u32) (add.checked v90 4)) + (let (v92 (ptr i32)) (inttoptr v91)) + (let (v93 i32) (load v92)) + (let (v94 u32) (cast v89)) + (let (v95 (ptr i32)) (inttoptr v94)) + (let (v96 i32) (load v95)) + (br (block 11 v89 v93 v96 v115 v126 v153 v167 v179))) + + (block 13 + (let (v49 i32) (const.i32 2)) + (let (v50 i32) (band v45 v49)) + (let (v51 i1) (eq v50 0)) + (let (v52 i32) (cast v51)) + (let (v53 i1) (neq v52 0)) + (condbr v53 (block 15) (block 16))) + + (block 14 + (br (block 12 v39 v42 v47 v33 v39 v125 v152 v166 v178))) + + (block 15 + (let (v54 u32) (cast v47)) + (let (v55 u32) (add.checked v54 4)) + (let (v56 (ptr i32)) (inttoptr v55)) + (let (v57 i32) (load v56)) + (let (v58 i32) (const.i32 3)) + (let (v59 i32) (band v57 v58)) + (let (v60 i32) (bor v59 v39)) + (let (v61 u32) (cast v47)) + (let (v62 u32) (add.checked v61 4)) + (let (v63 (ptr i32)) (inttoptr v62)) + (store v63 v60) + (let (v64 u32) (cast v33)) + (let (v65 (ptr i32)) (inttoptr v64)) + (let (v66 i32) (load v65)) + (let (v67 u32) (cast v33)) + (let (v68 u32) (add.checked v67 4)) + (let (v69 (ptr i32)) (inttoptr v68)) + (let (v70 i32) (load v69)) + (let (v71 i32) (const.i32 -4)) + (let (v72 i32) (band v70 v71)) + (let (v73 i1) (eq v72 0)) + (let (v74 i32) (cast v73)) + (let (v75 i1) (neq v74 0)) + (condbr v75 (block 11 v33 v70 v66 v39 v125 v152 v166 v178) (block 17))) + + (block 16 + (br (block 12 v39 v42 v47 v33 v39 v125 v152 v166 v178))) + + (block 17 + (let (v76 i32) (const.i32 -4)) + (let (v77 i32) (band v66 v76)) + (let (v78 u32) (cast v72)) + (let (v79 (ptr i32)) (inttoptr v78)) + (let (v80 i32) (load v79)) + (br (block 12 v72 v80 v77 v33 v39 v125 v152 v166 v178))) + + (block 18 + (param v123 i32) + (param v127 i32) + (param v150 i32) + (param v164 i32) + (param v176 i32) + (let (v128 u32) (cast v123)) + (let (v129 (ptr i32)) (inttoptr v128)) + (store v129 v127) + (let (v130 i32) (const.i32 8)) + (let (v131 i32) (add.wrapping v127 v130)) + (let (v132 u32) (cast v127)) + (let (v133 u32) (add.checked v132 8)) + (let (v134 (ptr i32)) (inttoptr v133)) + (let (v135 i32) (load v134)) + (let (v136 i32) (const.i32 1)) + (let (v137 i32) (band v135 v136)) + (let (v138 i1) (neq v137 0)) + (condbr v138 (block 9 v131 v135 v127 v123 v150 v164 v176) (block 20))) + + (block 19 + (let (v116 u32) (cast v114)) + (let (v117 (ptr i32)) (inttoptr v116)) + (let (v118 i32) (load v117)) + (let (v119 i32) (const.i32 2)) + (let (v120 i32) (bor v118 v119)) + (let (v121 u32) (cast v114)) + (let (v122 (ptr i32)) (inttoptr v121)) + (store v122 v120) + (br (block 18 v124 v114 v151 v165 v177))) + + (block 20 + (br (block 10))) + + (block 21 + (param v280 i32) + (param v281 i32) + (param v285 i32) + (param v286 i32) + (param v287 i32) + (let (v282 u32) (cast v280)) + (let (v283 (ptr i32)) (inttoptr v282)) + (store v283 v281) + (let (v284 i1) (neq v281 0)) + (condbr v284 (block 4 v281 v280 v285 v286 v287) (block 32))) + + (block 22 + (let (v159 i32) (const.i32 72)) + (let (v160 i32) (add.wrapping v146 v159)) + (let (v161 i32) (sub.wrapping v145 v148)) + (let (v168 i32) (band v161 v162)) + (let (v169 u32) (cast v160)) + (let (v170 u32) (cast v168)) + (let (v171 i1) (lte v169 v170)) + (let (v172 i32) (cast v171)) + (let (v173 i1) (neq v172 0)) + (condbr v173 (block 24) (block 25))) + + (block 23 (param v272 i32) (param v273 i32) + (let (v274 i32) (const.i32 1)) + (let (v275 i32) (bor v273 v274)) + (let (v276 u32) (cast v272)) + (let (v277 (ptr i32)) (inttoptr v276)) + (store v277 v275) + (let (v278 i32) (const.i32 8)) + (let (v279 i32) (add.wrapping v272 v278)) + (ret v279)) + + (block 24 + (let (v191 i32) (const.i32 0)) + (let (v192 i32) (const.i32 0)) + (let (v193 u32) (cast v168)) + (let (v194 (ptr i32)) (inttoptr v193)) + (store v194 v192) + (let (v195 i32) (const.i32 -8)) + (let (v196 i32) (add.wrapping v168 v195)) + (let (v197 i64) (const.i64 0)) + (let (v198 u32) (cast v196)) + (let (v199 (ptr i64)) (inttoptr v198)) + (store v199 v197) + (let (v200 u32) (cast v140)) + (let (v201 (ptr i32)) (inttoptr v200)) + (let (v202 i32) (load v201)) + (let (v203 i32) (const.i32 -4)) + (let (v204 i32) (band v202 v203)) + (let (v205 u32) (cast v196)) + (let (v206 (ptr i32)) (inttoptr v205)) + (store v206 v204) + (let (v207 u32) (cast v140)) + (let (v208 (ptr i32)) (inttoptr v207)) + (let (v209 i32) (load v208)) + (let (v210 i32) (const.i32 -4)) + (let (v211 i32) (band v209 v210)) + (let (v212 i1) (eq v211 0)) + (let (v213 i32) (cast v212)) + (let (v214 i1) (neq v213 0)) + (condbr v214 (block 27 v196 v191 v140 v146) (block 28))) + + (block 25 + (let (v180 i32) (band v174 v146)) + (let (v181 i1) (neq v180 0)) + (condbr v181 (block 21 v182 v183 v148 v162 v174) (block 26))) + + (block 26 + (let (v184 i32) (const.i32 -4)) + (let (v185 i32) (band v183 v184)) + (let (v186 u32) (cast v182)) + (let (v187 (ptr i32)) (inttoptr v186)) + (store v187 v185) + (let (v188 u32) (cast v140)) + (let (v189 (ptr i32)) (inttoptr v188)) + (let (v190 i32) (load v189)) + (br (block 23 v140 v190))) + + (block 27 + (param v234 i32) + (param v235 i32) + (param v236 i32) + (param v241 i32) + (let (v237 i32) (bor v235 v236)) + (let (v238 u32) (cast v234)) + (let (v239 u32) (add.checked v238 4)) + (let (v240 (ptr i32)) (inttoptr v239)) + (store v240 v237) + (let (v242 u32) (cast v241)) + (let (v243 (ptr i32)) (inttoptr v242)) + (let (v244 i32) (load v243)) + (let (v245 i32) (const.i32 -2)) + (let (v246 i32) (band v244 v245)) + (let (v247 u32) (cast v241)) + (let (v248 (ptr i32)) (inttoptr v247)) + (store v248 v246) + (let (v249 u32) (cast v236)) + (let (v250 (ptr i32)) (inttoptr v249)) + (let (v251 i32) (load v250)) + (let (v252 i32) (const.i32 3)) + (let (v253 i32) (band v251 v252)) + (let (v254 i32) (bor v253 v234)) + (let (v255 u32) (cast v236)) + (let (v256 (ptr i32)) (inttoptr v255)) + (store v256 v254) + (let (v257 i32) (const.i32 2)) + (let (v258 i32) (band v251 v257)) + (let (v259 i1) (neq v258 0)) + (condbr v259 (block 30) (block 31))) + + (block 28 + (let (v215 i32) (const.i32 2)) + (let (v216 i32) (band v209 v215)) + (let (v217 i1) (neq v216 0)) + (condbr v217 (block 27 v196 v191 v140 v146) (block 29))) + + (block 29 + (let (v218 u32) (cast v211)) + (let (v219 u32) (add.checked v218 4)) + (let (v220 (ptr i32)) (inttoptr v219)) + (let (v221 i32) (load v220)) + (let (v222 i32) (const.i32 3)) + (let (v223 i32) (band v221 v222)) + (let (v224 i32) (bor v223 v196)) + (let (v225 u32) (cast v211)) + (let (v226 u32) (add.checked v225 4)) + (let (v227 (ptr i32)) (inttoptr v226)) + (store v227 v224) + (let (v228 u32) (cast v196)) + (let (v229 u32) (add.checked v228 4)) + (let (v230 (ptr i32)) (inttoptr v229)) + (let (v231 i32) (load v230)) + (let (v232 i32) (const.i32 3)) + (let (v233 i32) (band v231 v232)) + (br (block 27 v196 v233 v140 v146))) + + (block 30 + (let (v263 i32) (const.i32 -3)) + (let (v264 i32) (band v254 v263)) + (let (v265 u32) (cast v236)) + (let (v266 (ptr i32)) (inttoptr v265)) + (store v266 v264) + (let (v267 u32) (cast v234)) + (let (v268 (ptr i32)) (inttoptr v267)) + (let (v269 i32) (load v268)) + (let (v270 i32) (const.i32 2)) + (let (v271 i32) (bor v269 v270)) + (br (block 23 v234 v271))) + + (block 31 + (let (v260 u32) (cast v234)) + (let (v261 (ptr i32)) (inttoptr v260)) + (let (v262 i32) (load v261)) + (br (block 23 v234 v262))) + + (block 32 + (br (block 5))) + ) + + (func (export #::alloc) + (param i32) (param i32) (param i32) (result i32) + (block 0 (param v0 i32) (param v1 i32) (param v2 i32) + (let (v4 i32) (const.i32 0)) + (let (v5 i32) (global.load i32 (global.symbol #__stack_pointer))) + (let (v6 i32) (const.i32 16)) + (let (v7 i32) (sub.wrapping v5 v6)) + (let (v8 (ptr i32)) (global.symbol #__stack_pointer)) + (store v8 v7) + (let (v9 i1) (neq v2 0)) + (condbr v9 (block 3) (block 4))) + + (block 1 (param v3 i32) + (ret v3)) + + (block 2 (param v87 i32) (param v91 i32) + (let (v88 i32) (const.i32 16)) + (let (v89 i32) (add.wrapping v87 v88)) + (let (v90 (ptr i32)) (global.symbol #__stack_pointer)) + (store v90 v89) + (br (block 1 v91))) + + (block 3 + (let (v10 u32) (cast v0)) + (let (v11 (ptr i32)) (inttoptr v10)) + (let (v12 i32) (load v11)) + (let (v13 u32) (cast v7)) + (let (v14 u32) (add.checked v13 12)) + (let (v15 (ptr i32)) (inttoptr v14)) + (store v15 v12) + (let (v16 i32) (const.i32 3)) + (let (v17 i32) (add.wrapping v2 v16)) + (let (v18 i32) (const.i32 2)) + (let (v19 u32) (cast v17)) + (let (v20 u32) (cast v18)) + (let (v21 u32) (shr.wrapping v19 v20)) + (let (v22 i32) (cast v21)) + (let (v23 i32) (const.i32 12)) + (let (v24 i32) (add.wrapping v7 v23)) + (let (v25 i32) (call #wee_alloc::alloc_first_fit v22 v1 v24)) + (let (v26 i1) (neq v25 0)) + (condbr v26 (block 5 v0 v7 v25) (block 6))) + + (block 4 + (br (block 2 v7 v1))) + + (block 5 (param v79 i32) (param v80 i32) (param v92 i32) + (let (v81 u32) (cast v80)) + (let (v82 u32) (add.checked v81 12)) + (let (v83 (ptr i32)) (inttoptr v82)) + (let (v84 i32) (load v83)) + (let (v85 u32) (cast v79)) + (let (v86 (ptr i32)) (inttoptr v85)) + (store v86 v84) + (br (block 2 v80 v92))) + + (block 6 + (let (v27 i32) (const.i32 -4)) + (let (v28 i32) (band v17 v27)) + (let (v29 i32) (const.i32 3)) + (let (v30 i32) (shl.wrapping v1 v29)) + (let (v31 i32) (const.i32 512)) + (let (v32 i32) (add.wrapping v30 v31)) + (let (v33 u32) (cast v28)) + (let (v34 u32) (cast v32)) + (let (v35 i1) (gt v33 v34)) + (let (v36 i32) (cast v35)) + (let (v37 i1) (neq v36 0)) + (let (v38 i32) (select v37 v28 v32)) + (let (v39 i32) (const.i32 65543)) + (let (v40 i32) (add.wrapping v38 v39)) + (let (v41 i32) (const.i32 16)) + (let (v42 u32) (cast v40)) + (let (v43 u32) (cast v41)) + (let (v44 u32) (shr.wrapping v42 v43)) + (let (v45 i32) (cast v44)) + (let (v46 u32) (cast v45)) + (let (v47 i32) (memory.grow v46)) + (let (v48 i32) (const.i32 -1)) + (let (v49 i1) (neq v47 v48)) + (let (v50 i32) (cast v49)) + (let (v51 i1) (neq v50 0)) + (condbr v51 (block 7) (block 8))) + + (block 7 + (let (v53 i32) (const.i32 16)) + (let (v54 i32) (shl.wrapping v47 v53)) + (let (v55 i32) (const.i32 0)) + (let (v56 u32) (cast v54)) + (let (v57 u32) (add.checked v56 4)) + (let (v58 (ptr i32)) (inttoptr v57)) + (store v58 v55) + (let (v59 u32) (cast v7)) + (let (v60 u32) (add.checked v59 12)) + (let (v61 (ptr i32)) (inttoptr v60)) + (let (v62 i32) (load v61)) + (let (v63 u32) (cast v54)) + (let (v64 u32) (add.checked v63 8)) + (let (v65 (ptr i32)) (inttoptr v64)) + (store v65 v62) + (let (v66 i32) (const.i32 -65536)) + (let (v67 i32) (band v40 v66)) + (let (v68 i32) (add.wrapping v54 v67)) + (let (v69 i32) (const.i32 2)) + (let (v70 i32) (bor v68 v69)) + (let (v71 u32) (cast v54)) + (let (v72 (ptr i32)) (inttoptr v71)) + (store v72 v70) + (let (v73 u32) (cast v7)) + (let (v74 u32) (add.checked v73 12)) + (let (v75 (ptr i32)) (inttoptr v74)) + (store v75 v54) + (let (v76 i32) (const.i32 12)) + (let (v77 i32) (add.wrapping v7 v76)) + (let (v78 i32) (call #wee_alloc::alloc_first_fit v22 v1 v77)) + (br (block 5 v0 v7 v78))) + + (block 8 + (let (v52 i32) (const.i32 0)) + (br (block 5 v0 v7 v52))) + ) + + (func (export #::dealloc) + (param i32) (param i32) (param i32) (param i32) + (block 0 (param v0 i32) (param v1 i32) (param v2 i32) (param v3 i32) + (let (v4 i32) (const.i32 0)) + (let (v5 i1) (eq v1 0)) + (let (v6 i32) (cast v5)) + (let (v7 i1) (neq v6 0)) + (condbr v7 (block 2) (block 3))) + + (block 1 + (ret)) + + (block 2 + (br (block 1))) + + (block 3 + (let (v8 i1) (eq v3 0)) + (let (v9 i32) (cast v8)) + (let (v10 i1) (neq v9 0)) + (condbr v10 (block 2) (block 4))) + + (block 4 + (let (v11 u32) (cast v0)) + (let (v12 (ptr i32)) (inttoptr v11)) + (let (v13 i32) (load v12)) + (let (v14 i32) (const.i32 0)) + (let (v15 u32) (cast v1)) + (let (v16 (ptr i32)) (inttoptr v15)) + (store v16 v14) + (let (v17 i32) (const.i32 -8)) + (let (v18 i32) (add.wrapping v1 v17)) + (let (v19 u32) (cast v18)) + (let (v20 (ptr i32)) (inttoptr v19)) + (let (v21 i32) (load v20)) + (let (v22 i32) (const.i32 -2)) + (let (v23 i32) (band v21 v22)) + (let (v24 u32) (cast v18)) + (let (v25 (ptr i32)) (inttoptr v24)) + (store v25 v23) + (let (v26 i32) (const.i32 4)) + (let (v27 i32) (add.wrapping v18 v26)) + (let (v28 u32) (cast v27)) + (let (v29 (ptr i32)) (inttoptr v28)) + (let (v30 i32) (load v29)) + (let (v31 i32) (const.i32 -4)) + (let (v32 i32) (band v30 v31)) + (let (v33 i1) (eq v32 0)) + (let (v34 i32) (cast v33)) + (let (v35 i1) (neq v34 0)) + (condbr v35 (block 10 v21 v1 v18 v13 v0) (block 11))) + + (block 5 (param v159 i32) (param v165 i32) + (let (v167 u32) (cast v159)) + (let (v168 (ptr i32)) (inttoptr v167)) + (store v168 v165) + (br (block 2))) + + (block 6 + (param v155 i32) + (param v156 i32) + (param v164 i32) + (param v166 i32) + (let (v157 u32) (cast v155)) + (let (v158 (ptr i32)) (inttoptr v157)) + (store v158 v156) + (br (block 5 v164 v166))) + + (block 7 (param v151 i32) (param v160 i32) + (br (block 5 v160 v151))) + + (block 8 + (let (v129 u32) (cast v46)) + (let (v130 (ptr u8)) (inttoptr v129)) + (let (v131 u8) (load v130)) + (let (v132 i32) (zext v131)) + (let (v133 i32) (const.i32 1)) + (let (v134 i32) (band v132 v133)) + (let (v135 i1) (neq v134 0)) + (condbr v135 (block 6 v136 v154 v163 v145) (block 22))) + + (block 9 + (let (v55 i32) (const.i32 -4)) + (let (v56 i32) (band v21 v55)) + (let (v57 i1) (neq v56 0)) + (condbr v57 (block 17) (block 18))) + + (block 10 + (param v44 i32) + (param v136 i32) + (param v145 i32) + (param v154 i32) + (param v163 i32) + (let (v45 i32) (const.i32 -4)) + (let (v46 i32) (band v44 v45)) + (let (v47 i1) (eq v46 0)) + (let (v48 i32) (cast v47)) + (let (v49 i1) (neq v48 0)) + (condbr v49 (block 6 v136 v154 v163 v145) (block 13))) + + (block 11 + (let (v36 u32) (cast v32)) + (let (v37 (ptr i32)) (inttoptr v36)) + (let (v38 i32) (load v37)) + (let (v39 i32) (const.i32 1)) + (let (v40 i32) (band v38 v39)) + (let (v41 i1) (eq v40 0)) + (let (v42 i32) (cast v41)) + (let (v43 i1) (neq v42 0)) + (condbr v43 (block 9) (block 12))) + + (block 12 + (br (block 10 v21 v1 v18 v13 v0))) + + (block 13 + (let (v50 i32) (const.i32 2)) + (let (v51 i32) (band v44 v50)) + (let (v52 i1) (eq v51 0)) + (let (v53 i32) (cast v52)) + (let (v54 i1) (neq v53 0)) + (condbr v54 (block 8) (block 14))) + + (block 14 + (br (block 6 v136 v154 v163 v145))) + + (block 15 + (param v103 i32) + (param v104 i32) + (param v109 i32) + (param v110 i32) + (param v120 i32) + (param v152 i32) + (param v161 i32) + (let (v105 i32) (const.i32 3)) + (let (v106 i32) (band v104 v105)) + (let (v107 u32) (cast v103)) + (let (v108 (ptr i32)) (inttoptr v107)) + (store v108 v106) + (let (v111 i32) (const.i32 3)) + (let (v112 i32) (band v110 v111)) + (let (v113 u32) (cast v109)) + (let (v114 (ptr i32)) (inttoptr v113)) + (store v114 v112) + (let (v115 i32) (const.i32 2)) + (let (v116 i32) (band v110 v115)) + (let (v117 i1) (eq v116 0)) + (let (v118 i32) (cast v117)) + (let (v119 i1) (neq v118 0)) + (condbr v119 (block 7 v152 v161) (block 21))) + + (block 16 + (param v85 i32) + (param v86 i32) + (param v89 i32) + (param v95 i32) + (param v99 i32) + (param v121 i32) + (param v153 i32) + (param v162 i32) + (let (v87 i32) (const.i32 -4)) + (let (v88 i32) (band v86 v87)) + (let (v90 i32) (const.i32 3)) + (let (v91 i32) (band v89 v90)) + (let (v92 i32) (bor v88 v91)) + (let (v93 u32) (cast v85)) + (let (v94 (ptr i32)) (inttoptr v93)) + (store v94 v92) + (let (v96 u32) (cast v95)) + (let (v97 (ptr i32)) (inttoptr v96)) + (let (v98 i32) (load v97)) + (let (v100 u32) (cast v99)) + (let (v101 (ptr i32)) (inttoptr v100)) + (let (v102 i32) (load v101)) + (br (block 15 v95 v98 v99 v102 v121 v153 v162))) + + (block 17 + (let (v58 i32) (const.i32 2)) + (let (v59 i32) (band v21 v58)) + (let (v60 i1) (neq v59 0)) + (condbr v60 (block 16 v32 v23 v38 v27 v18 v32 v13 v0) (block 19))) + + (block 18 + (br (block 16 v32 v23 v38 v27 v18 v32 v13 v0))) + + (block 19 + (let (v61 u32) (cast v56)) + (let (v62 u32) (add.checked v61 4)) + (let (v63 (ptr i32)) (inttoptr v62)) + (let (v64 i32) (load v63)) + (let (v65 i32) (const.i32 3)) + (let (v66 i32) (band v64 v65)) + (let (v67 i32) (bor v66 v32)) + (let (v68 u32) (cast v56)) + (let (v69 u32) (add.checked v68 4)) + (let (v70 (ptr i32)) (inttoptr v69)) + (store v70 v67) + (let (v71 u32) (cast v18)) + (let (v72 (ptr i32)) (inttoptr v71)) + (let (v73 i32) (load v72)) + (let (v74 u32) (cast v27)) + (let (v75 (ptr i32)) (inttoptr v74)) + (let (v76 i32) (load v75)) + (let (v77 i32) (const.i32 -4)) + (let (v78 i32) (band v76 v77)) + (let (v79 i1) (eq v78 0)) + (let (v80 i32) (cast v79)) + (let (v81 i1) (neq v80 0)) + (condbr v81 (block 15 v27 v76 v18 v73 v32 v13 v0) (block 20))) + + (block 20 + (let (v82 u32) (cast v78)) + (let (v83 (ptr i32)) (inttoptr v82)) + (let (v84 i32) (load v83)) + (br (block 16 v78 v73 v84 v27 v18 v32 v13 v0))) + + (block 21 + (let (v122 u32) (cast v120)) + (let (v123 (ptr i32)) (inttoptr v122)) + (let (v124 i32) (load v123)) + (let (v125 i32) (const.i32 2)) + (let (v126 i32) (bor v124 v125)) + (let (v127 u32) (cast v120)) + (let (v128 (ptr i32)) (inttoptr v127)) + (store v128 v126) + (br (block 7 v152 v161))) + + (block 22 + (let (v137 u32) (cast v46)) + (let (v138 u32) (add.checked v137 8)) + (let (v139 (ptr i32)) (inttoptr v138)) + (let (v140 i32) (load v139)) + (let (v141 i32) (const.i32 -4)) + (let (v142 i32) (band v140 v141)) + (let (v143 u32) (cast v136)) + (let (v144 (ptr i32)) (inttoptr v143)) + (store v144 v142) + (let (v146 i32) (const.i32 1)) + (let (v147 i32) (bor v145 v146)) + (let (v148 u32) (cast v46)) + (let (v149 u32) (add.checked v148 8)) + (let (v150 (ptr i32)) (inttoptr v149)) + (store v150 v147) + (br (block 7 v154 v163))) + ) + + (func (export #wit_bindgen::rt::run_ctors_once) + (block 0 + (let (v0 i32) (const.i32 0)) + (let (v1 u32) (cast v0)) + (let (v2 u32) (add.checked v1 1048581)) + (let (v3 (ptr u8)) (inttoptr v2)) + (let (v4 u8) (load v3)) + (let (v5 i32) (zext v4)) + (let (v6 i1) (neq v5 0)) + (condbr v6 (block 2) (block 3))) + + (block 1 + (ret)) + + (block 2 + (br (block 1))) + + (block 3 + (call #__wasm_call_ctors) + (let (v7 i32) (const.i32 0)) + (let (v8 i32) (const.i32 1)) + (let (v9 u8) (trunc v8)) + (let (v10 u32) (cast v7)) + (let (v11 u32) (add.checked v10 1048581)) + (let (v12 (ptr u8)) (inttoptr v11)) + (store v12 v9) + (br (block 2))) + ) + + (func (export #cabi_realloc) + (param i32) (param i32) (param i32) (param i32) (result i32) + (block 0 (param v0 i32) (param v1 i32) (param v2 i32) (param v3 i32) + (let (v5 i1) (neq v1 0)) + (condbr v5 (block 4) (block 5))) + + (block 1 (param v4 i32) + (ret v4)) + + (block 2 (param v19 i32) + (br (block 1 v19))) + + (block 3 (param v17 i32) + (let (v18 i1) (neq v17 0)) + (condbr v18 (block 2 v17) (block 7))) + + (block 4 + (let (v16 i32) (call #__rust_realloc v0 v1 v2 v3)) + (br (block 3 v16))) + + (block 5 + (let (v6 i1) (eq v3 0)) + (let (v7 i32) (cast v6)) + (let (v8 i1) (neq v7 0)) + (condbr v8 (block 2 v2) (block 6))) + + (block 6 + (let (v9 i32) (const.i32 0)) + (let (v10 u32) (cast v9)) + (let (v11 u32) (add.checked v10 1048580)) + (let (v12 (ptr u8)) (inttoptr v11)) + (let (v13 u8) (load v12)) + (let (v14 i32) (zext v13)) + (let (v15 i32) (call #__rust_alloc v3 v2)) + (br (block 3 v15))) + + (block 7 + (unreachable)) + ) + + ;; Imports + (func (import #wit-component:shim #indirect-miden:base/account@1.0.0-add-asset) + (param i64) (param i64) (param i64) (param i64) (param i32)) + (func (import #wit-component:shim #indirect-miden:base/account@1.0.0-remove-asset) + (param i64) (param i64) (param i64) (param i64) (param i32)) + ) + + (module #wit-component:fixups + + ) + +) diff --git a/tests/integration/expected/sdk_basic_wallet/basic_wallet.wat b/tests/integration/expected/sdk_basic_wallet/basic_wallet.wat index 7f135ba6a..1c47e6480 100644 --- a/tests/integration/expected/sdk_basic_wallet/basic_wallet.wat +++ b/tests/integration/expected/sdk_basic_wallet/basic_wallet.wat @@ -1,7 +1,7 @@ (component (type (;0;) (instance - (type (;0;) (record (field "inner" float64))) + (type (;0;) (record (field "inner" u64))) (export (;1;) "felt" (type (eq 0))) (type (;2;) (tuple 1 1 1 1)) (export (;3;) "word" (type (eq 2))) @@ -47,11 +47,11 @@ ) (import "miden:base/tx@1.0.0" (instance (;2;) (type 7))) (core module (;0;) - (type (;0;) (func (param f64 f64 f64 f64 i32))) - (type (;1;) (func (param f64 f64 f64 f64 f64 f64 f64 f64 f64) (result f64))) + (type (;0;) (func (param i64 i64 i64 i64 i32))) + (type (;1;) (func (param i64 i64 i64 i64 i64 i64 i64 i64 i64) (result i64))) (type (;2;) (func)) - (type (;3;) (func (param f64 f64 f64 f64))) - (type (;4;) (func (param f64 f64 f64 f64 f64 f64 f64 f64 f64))) + (type (;3;) (func (param i64 i64 i64 i64))) + (type (;4;) (func (param i64 i64 i64 i64 i64 i64 i64 i64 i64))) (type (;5;) (func (param i32 i32) (result i32))) (type (;6;) (func (param i32 i32 i32 i32) (result i32))) (type (;7;) (func (param i32 i32 i32) (result i32))) @@ -60,7 +60,7 @@ (import "miden:base/account@1.0.0" "remove-asset" (func $basic_wallet::bindings::miden::base::account::remove_asset::wit_import (;1;) (type 0))) (import "miden:base/tx@1.0.0" "create-note" (func $basic_wallet::bindings::miden::base::tx::create_note::wit_import (;2;) (type 1))) (func $__wasm_call_ctors (;3;) (type 2)) - (func $miden:basic-wallet/basic-wallet@1.0.0#receive-asset (;4;) (type 3) (param f64 f64 f64 f64) + (func $miden:basic-wallet/basic-wallet@1.0.0#receive-asset (;4;) (type 3) (param i64 i64 i64 i64) (local i32) global.get $__stack_pointer i32.const 32 @@ -79,7 +79,7 @@ i32.add global.set $__stack_pointer ) - (func $miden:basic-wallet/basic-wallet@1.0.0#send-asset (;5;) (type 4) (param f64 f64 f64 f64 f64 f64 f64 f64 f64) + (func $miden:basic-wallet/basic-wallet@1.0.0#send-asset (;5;) (type 4) (param i64 i64 i64 i64 i64 i64 i64 i64 i64) (local i32) global.get $__stack_pointer i32.const 32 @@ -94,19 +94,19 @@ local.get 9 call $basic_wallet::bindings::miden::base::account::remove_asset::wit_import local.get 9 - f64.load + i64.load local.get 9 i32.const 8 i32.add - f64.load + i64.load local.get 9 i32.const 16 i32.add - f64.load + i64.load local.get 9 i32.const 24 i32.add - f64.load + i64.load local.get 4 local.get 5 local.get 6 @@ -783,8 +783,8 @@ (export "cabi_realloc" (func $cabi_realloc)) ) (core module (;1;) - (type (;0;) (func (param f64 f64 f64 f64 i32))) - (func $indirect-miden:base/account@1.0.0-add-asset (;0;) (type 0) (param f64 f64 f64 f64 i32) + (type (;0;) (func (param i64 i64 i64 i64 i32))) + (func $indirect-miden:base/account@1.0.0-add-asset (;0;) (type 0) (param i64 i64 i64 i64 i32) local.get 0 local.get 1 local.get 2 @@ -793,7 +793,7 @@ i32.const 0 call_indirect (type 0) ) - (func $indirect-miden:base/account@1.0.0-remove-asset (;1;) (type 0) (param f64 f64 f64 f64 i32) + (func $indirect-miden:base/account@1.0.0-remove-asset (;1;) (type 0) (param i64 i64 i64 i64 i32) local.get 0 local.get 1 local.get 2 @@ -808,7 +808,7 @@ (export "$imports" (table 0)) ) (core module (;2;) - (type (;0;) (func (param f64 f64 f64 f64 i32))) + (type (;0;) (func (param i64 i64 i64 i64 i32))) (import "" "0" (func (;0;) (type 0))) (import "" "1" (func (;1;) (type 0))) (import "" "$imports" (table (;0;) 2 2 funcref)) @@ -862,7 +862,7 @@ (alias export 0 "tag" (type (;16;))) (alias export 0 "recipient" (type (;17;))) (component (;0;) - (type (;0;) (record (field "inner" float64))) + (type (;0;) (record (field "inner" u64))) (import "import-type-felt" (type (;1;) (eq 0))) (type (;2;) (tuple 1 1 1 1)) (import "import-type-word" (type (;3;) (eq 2))) diff --git a/tests/integration/expected/sdk_basic_wallet/basic_wallet_p2id_note.wat b/tests/integration/expected/sdk_basic_wallet/basic_wallet_p2id_note.wat index 4deb0023d..de2b7eef3 100644 --- a/tests/integration/expected/sdk_basic_wallet/basic_wallet_p2id_note.wat +++ b/tests/integration/expected/sdk_basic_wallet/basic_wallet_p2id_note.wat @@ -1,7 +1,7 @@ (component (type (;0;) (instance - (type (;0;) (record (field "inner" float64))) + (type (;0;) (record (field "inner" u64))) (export (;1;) "felt" (type (eq 0))) (type (;2;) (record (field "inner" 1))) (export (;3;) "account-id" (type (eq 2))) @@ -53,9 +53,9 @@ (import "miden:basic-wallet/basic-wallet@1.0.0" (instance (;3;) (type 7))) (core module (;0;) (type (;0;) (func (param i32))) - (type (;1;) (func (param f64) (result f64))) - (type (;2;) (func (result f64))) - (type (;3;) (func (param f64 f64 f64 f64))) + (type (;1;) (func (param i64) (result i64))) + (type (;2;) (func (result i64))) + (type (;3;) (func (param i64 i64 i64 i64))) (type (;4;) (func)) (type (;5;) (func (param i32 i32) (result i32))) (type (;6;) (func (param i32 i32 i32 i32) (result i32))) @@ -90,10 +90,10 @@ local.get 0 i32.load offset=8 local.tee 2 - f64.load + i64.load call $basic_wallet_p2id_note::bindings::miden::base::core_types::account_id_from_felt::wit_import call $basic_wallet_p2id_note::bindings::miden::base::account::get_id::wit_import - f64.ne + i64.ne br_if 0 (;@1;) local.get 0 i32.const 8 @@ -119,13 +119,13 @@ local.set 6 loop ;; label = @3 local.get 6 - f64.load + i64.load local.get 6 - f64.load offset=8 + i64.load offset=8 local.get 6 - f64.load offset=16 + i64.load offset=16 local.get 6 - f64.load offset=24 + i64.load offset=24 call $basic_wallet_p2id_note::bindings::miden::basic_wallet::basic_wallet::receive_asset::wit_import local.get 6 i32.const 32 diff --git a/tests/integration/expected/sdk_basic_wallet/miden_sdk.wat b/tests/integration/expected/sdk_basic_wallet/miden_sdk.wat index 14c8eadd6..8b7f2843c 100644 --- a/tests/integration/expected/sdk_basic_wallet/miden_sdk.wat +++ b/tests/integration/expected/sdk_basic_wallet/miden_sdk.wat @@ -1,24 +1,24 @@ (component (core module (;0;) (type (;0;) (func)) - (type (;1;) (func (param f64) (result f64))) - (type (;2;) (func (param f64 f64 f64 f64) (result i32))) - (type (;3;) (func (param i32 f64 i64 f64 f64) (result i32))) + (type (;1;) (func (param i64) (result i64))) + (type (;2;) (func (param i64 i64 i64 i64) (result i32))) + (type (;3;) (func (param i32 i64 i64 i64 i64) (result i32))) (type (;4;) (func (param i32 i32) (result i32))) (type (;5;) (func (param i32 i32 i32 i32) (result i32))) (type (;6;) (func (param i32 i32 i32) (result i32))) (type (;7;) (func (param i32 i32 i32 i32))) (func $__wasm_call_ctors (;0;) (type 0)) - (func $miden:base/core-types@1.0.0#account-id-from-felt (;1;) (type 1) (param f64) (result f64) + (func $miden:base/core-types@1.0.0#account-id-from-felt (;1;) (type 1) (param i64) (result i64) call $wit_bindgen::rt::run_ctors_once local.get 0 ) - (func $miden:base/types@1.0.0#from-core-asset (;2;) (type 2) (param f64 f64 f64 f64) (result i32) + (func $miden:base/types@1.0.0#from-core-asset (;2;) (type 2) (param i64 i64 i64 i64) (result i32) call $wit_bindgen::rt::run_ctors_once unreachable unreachable ) - (func $miden:base/types@1.0.0#to-core-asset (;3;) (type 3) (param i32 f64 i64 f64 f64) (result i32) + (func $miden:base/types@1.0.0#to-core-asset (;3;) (type 3) (param i32 i64 i64 i64 i64) (result i32) call $wit_bindgen::rt::run_ctors_once unreachable unreachable @@ -690,19 +690,19 @@ (core instance (;0;) (instantiate 0)) (alias core export 0 "memory" (core memory (;0;))) (alias core export 0 "cabi_realloc" (core func (;0;))) - (type (;0;) (record (field "inner" float64))) + (type (;0;) (record (field "inner" u64))) (type (;1;) (record (field "inner" 0))) (type (;2;) (func (param "felt" 0) (result 1))) (alias core export 0 "miden:base/core-types@1.0.0#account-id-from-felt" (core func (;1;))) (func (;0;) (type 2) (canon lift (core func 1))) (component (;0;) - (type (;0;) (record (field "inner" float64))) + (type (;0;) (record (field "inner" u64))) (import "import-type-felt" (type (;1;) (eq 0))) (type (;2;) (record (field "inner" 1))) (import "import-type-account-id" (type (;3;) (eq 2))) (type (;4;) (func (param "felt" 1) (result 3))) (import "import-func-account-id-from-felt" (func (;0;) (type 4))) - (type (;5;) (record (field "inner" float64))) + (type (;5;) (record (field "inner" u64))) (export (;6;) "felt" (type 5)) (type (;7;) (tuple 6 6 6 6)) (export (;8;) "word" (type 7)) @@ -754,7 +754,7 @@ (func (;2;) (type 10) (canon lift (core func 3) (memory 0))) (alias export 1 "felt" (type (;11;))) (component (;1;) - (type (;0;) (record (field "inner" float64))) + (type (;0;) (record (field "inner" u64))) (import "import-type-felt" (type (;1;) (eq 0))) (type (;2;) (record (field "inner" 1))) (import "import-type-account-id" (type (;3;) (eq 2))) diff --git a/tests/integration/src/rust_masm_tests/sdk.rs b/tests/integration/src/rust_masm_tests/sdk.rs index 5fe4fd0b4..be967e878 100644 --- a/tests/integration/src/rust_masm_tests/sdk.rs +++ b/tests/integration/src/rust_masm_tests/sdk.rs @@ -16,17 +16,18 @@ fn sdk() { #[test] fn sdk_basic_wallet() { - let interface = InterfaceIdent::from_full_ident("miden:base/tx-kernel@1.0.0".to_string()); + let interface_tx = InterfaceIdent::from_full_ident("miden:base/tx@1.0.0".to_string()); let create_note_ident = InterfaceFunctionIdent { - interface: interface.clone(), + interface: interface_tx.clone(), function: Symbol::intern("create-note"), }; + let interface_account = InterfaceIdent::from_full_ident("miden:base/account@1.0.0".to_string()); let add_asset_ident = InterfaceFunctionIdent { - interface: interface.clone(), + interface: interface_account.clone(), function: Symbol::intern("add-asset"), }; let remove_asset_ident = InterfaceFunctionIdent { - interface: interface.clone(), + interface: interface_account.clone(), function: Symbol::intern("remove-asset"), }; let import_metadata: BTreeMap = [ diff --git a/tests/rust-apps-wasm/sdk/basic-wallet/src/bindings.rs b/tests/rust-apps-wasm/sdk/basic-wallet/src/bindings.rs index 7a02447b9..7e2ed5fc4 100644 --- a/tests/rust-apps-wasm/sdk/basic-wallet/src/bindings.rs +++ b/tests/rust-apps-wasm/sdk/basic-wallet/src/bindings.rs @@ -15,9 +15,11 @@ pub mod miden { #[repr(C)] #[derive(Clone, Copy)] pub struct Felt { - /// We use f64 as the backing type for the field element. It has the size that we need and + /// We plan to use f64 as the backing type for the field element. It has the size that we need and /// we don't plan to support floating point arithmetic in programs for Miden VM. - pub inner: f64, + /// + /// For now its u64 + pub inner: u64, } impl ::core::fmt::Debug for Felt { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { @@ -221,15 +223,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/core-types@1.0.0")] extern "C" { #[link_name = "account-id-from-felt"] - fn wit_import(_: f64, ) -> f64; + fn wit_import(_: i64, ) -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, ) -> f64{ unreachable!() } - let ret = wit_import(wit_bindgen::rt::as_f64(inner0)); + fn wit_import(_: i64, ) -> i64{ unreachable!() } + let ret = wit_import(wit_bindgen::rt::as_i64(inner0)); AccountId{ inner: Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -265,15 +267,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "get-id"] - fn wit_import() -> f64; + fn wit_import() -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import() -> f64{ unreachable!() } + fn wit_import() -> i64{ unreachable!() } let ret = wit_import(); super::super::super::miden::base::core_types::AccountId{ inner: super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -290,15 +292,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "get-nonce"] - fn wit_import() -> f64; + fn wit_import() -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import() -> f64{ unreachable!() } + fn wit_import() -> i64{ unreachable!() } let ret = wit_import(); super::super::super::miden::base::core_types::Nonce{ inner: super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -325,19 +327,19 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); super::super::super::miden::base::core_types::AccountHash{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }), } } @@ -364,19 +366,19 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); super::super::super::miden::base::core_types::AccountHash{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }), } } @@ -395,12 +397,12 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "incr-nonce"] - fn wit_import(_: f64, ); + fn wit_import(_: i64, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner0)); + fn wit_import(_: i64, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner0)); } } #[allow(unused_unsafe, clippy::all)] @@ -420,25 +422,25 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "get-item"] - fn wit_import(_: f64, _: i32, ); + fn wit_import(_: i64, _: i32, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: i32, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner0), ptr1); - let l2 = *((ptr1 + 0) as *const f64); - let l3 = *((ptr1 + 8) as *const f64); - let l4 = *((ptr1 + 16) as *const f64); - let l5 = *((ptr1 + 24) as *const f64); + fn wit_import(_: i64, _: i32, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner0), ptr1); + let l2 = *((ptr1 + 0) as *const i64); + let l3 = *((ptr1 + 8) as *const i64); + let l4 = *((ptr1 + 16) as *const i64); + let l5 = *((ptr1 + 24) as *const i64); super::super::super::miden::base::core_types::StorageValue{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l5, + inner: l5 as u64, }), } } @@ -467,39 +469,39 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "set-item"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: i32, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i32, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: i32, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner0), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), wit_bindgen::rt::as_f64(inner6), ptr7); - let l8 = *((ptr7 + 0) as *const f64); - let l9 = *((ptr7 + 8) as *const f64); - let l10 = *((ptr7 + 16) as *const f64); - let l11 = *((ptr7 + 24) as *const f64); - let l12 = *((ptr7 + 32) as *const f64); - let l13 = *((ptr7 + 40) as *const f64); - let l14 = *((ptr7 + 48) as *const f64); - let l15 = *((ptr7 + 56) as *const f64); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i32, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner0), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), wit_bindgen::rt::as_i64(inner6), ptr7); + let l8 = *((ptr7 + 0) as *const i64); + let l9 = *((ptr7 + 8) as *const i64); + let l10 = *((ptr7 + 16) as *const i64); + let l11 = *((ptr7 + 24) as *const i64); + let l12 = *((ptr7 + 32) as *const i64); + let l13 = *((ptr7 + 40) as *const i64); + let l14 = *((ptr7 + 48) as *const i64); + let l15 = *((ptr7 + 56) as *const i64); (super::super::super::miden::base::core_types::StorageRoot{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l8, + inner: l8 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l9, + inner: l9 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l10, + inner: l10 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l11, + inner: l11 as u64, }), }, super::super::super::miden::base::core_types::StorageValue{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l12, + inner: l12 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l13, + inner: l13 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l14, + inner: l14 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l15, + inner: l15 as u64, }), }) } @@ -525,12 +527,12 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "set-code"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5)); + fn wit_import(_: i64, _: i64, _: i64, _: i64, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5)); } } #[allow(unused_unsafe, clippy::all)] @@ -550,14 +552,14 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "get-balance"] - fn wit_import(_: f64, ) -> f64; + fn wit_import(_: i64, ) -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, ) -> f64{ unreachable!() } - let ret = wit_import(wit_bindgen::rt::as_f64(inner1)); + fn wit_import(_: i64, ) -> i64{ unreachable!() } + let ret = wit_import(wit_bindgen::rt::as_i64(inner1)); super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, } } } @@ -582,12 +584,12 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "has-non-fungible-asset"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ) -> i32; + fn wit_import(_: i64, _: i64, _: i64, _: i64, ) -> i32; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ) -> i32{ unreachable!() } - let ret = wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5)); + fn wit_import(_: i64, _: i64, _: i64, _: i64, ) -> i32{ unreachable!() } + let ret = wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5)); wit_bindgen::rt::bool_lift(ret as u8) } } @@ -617,25 +619,25 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "add-asset"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: i32, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i32, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: i32, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), ptr6); - let l7 = *((ptr6 + 0) as *const f64); - let l8 = *((ptr6 + 8) as *const f64); - let l9 = *((ptr6 + 16) as *const f64); - let l10 = *((ptr6 + 24) as *const f64); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i32, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), ptr6); + let l7 = *((ptr6 + 0) as *const i64); + let l8 = *((ptr6 + 8) as *const i64); + let l9 = *((ptr6 + 16) as *const i64); + let l10 = *((ptr6 + 24) as *const i64); super::super::super::miden::base::core_types::CoreAsset{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l7, + inner: l7 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l8, + inner: l8 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l9, + inner: l9 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l10, + inner: l10 as u64, }), } } @@ -662,25 +664,25 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "remove-asset"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: i32, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i32, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: i32, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), ptr6); - let l7 = *((ptr6 + 0) as *const f64); - let l8 = *((ptr6 + 8) as *const f64); - let l9 = *((ptr6 + 16) as *const f64); - let l10 = *((ptr6 + 24) as *const f64); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i32, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), ptr6); + let l7 = *((ptr6 + 0) as *const i64); + let l8 = *((ptr6 + 8) as *const i64); + let l9 = *((ptr6 + 16) as *const i64); + let l10 = *((ptr6 + 24) as *const i64); super::super::super::miden::base::core_types::CoreAsset{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l7, + inner: l7 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l8, + inner: l8 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l9, + inner: l9 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l10, + inner: l10 as u64, }), } } @@ -707,19 +709,19 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); super::super::super::miden::base::core_types::VaultCommitment{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }), } } @@ -753,14 +755,14 @@ pub mod miden { #[link(wasm_import_module = "miden:base/tx@1.0.0")] extern "C" { #[link_name = "get-block-number"] - fn wit_import() -> f64; + fn wit_import() -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import() -> f64{ unreachable!() } + fn wit_import() -> i64{ unreachable!() } let ret = wit_import(); super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, } } } @@ -786,19 +788,19 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); super::super::super::miden::base::core_types::BlockHash{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }), } } @@ -826,18 +828,18 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }) } } @@ -864,18 +866,18 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }) } } @@ -909,15 +911,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/tx@1.0.0")] extern "C" { #[link_name = "create-note"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, ) -> f64; + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, ) -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, ) -> f64{ unreachable!() } - let ret = wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), wit_bindgen::rt::as_f64(inner7), wit_bindgen::rt::as_f64(inner10), wit_bindgen::rt::as_f64(inner11), wit_bindgen::rt::as_f64(inner12), wit_bindgen::rt::as_f64(inner13)); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, ) -> i64{ unreachable!() } + let ret = wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), wit_bindgen::rt::as_i64(inner7), wit_bindgen::rt::as_i64(inner10), wit_bindgen::rt::as_i64(inner11), wit_bindgen::rt::as_i64(inner12), wit_bindgen::rt::as_i64(inner13)); super::super::super::miden::base::core_types::NoteId{ inner: super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -945,7 +947,7 @@ pub mod exports { #[doc(hidden)] #[export_name = "miden:basic-wallet/basic-wallet@1.0.0#receive-asset"] #[allow(non_snake_case)] - unsafe extern "C" fn __export_receive_asset(arg0: f64,arg1: f64,arg2: f64,arg3: f64,) { + unsafe extern "C" fn __export_receive_asset(arg0: i64,arg1: i64,arg2: i64,arg3: i64,) { #[allow(unused_imports)] use wit_bindgen::rt::{alloc, vec::Vec, string::String}; @@ -965,13 +967,13 @@ pub mod exports { <_GuestImpl as Guest>::receive_asset(super::super::super::super::miden::base::core_types::CoreAsset{ inner: (super::super::super::super::miden::base::core_types::Felt{ - inner: arg0, + inner: arg0 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg1, + inner: arg1 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg2, + inner: arg2 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg3, + inner: arg3 as u64, }), }); } @@ -981,7 +983,7 @@ pub mod exports { #[doc(hidden)] #[export_name = "miden:basic-wallet/basic-wallet@1.0.0#send-asset"] #[allow(non_snake_case)] - unsafe extern "C" fn __export_send_asset(arg0: f64,arg1: f64,arg2: f64,arg3: f64,arg4: f64,arg5: f64,arg6: f64,arg7: f64,arg8: f64,) { + unsafe extern "C" fn __export_send_asset(arg0: i64,arg1: i64,arg2: i64,arg3: i64,arg4: i64,arg5: i64,arg6: i64,arg7: i64,arg8: i64,) { #[allow(unused_imports)] use wit_bindgen::rt::{alloc, vec::Vec, string::String}; @@ -1001,27 +1003,27 @@ pub mod exports { <_GuestImpl as Guest>::send_asset(super::super::super::super::miden::base::core_types::CoreAsset{ inner: (super::super::super::super::miden::base::core_types::Felt{ - inner: arg0, + inner: arg0 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg1, + inner: arg1 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg2, + inner: arg2 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg3, + inner: arg3 as u64, }), }, super::super::super::super::miden::base::core_types::Tag{ inner: super::super::super::super::miden::base::core_types::Felt{ - inner: arg4, + inner: arg4 as u64, }, }, super::super::super::super::miden::base::core_types::Recipient{ inner: (super::super::super::super::miden::base::core_types::Felt{ - inner: arg5, + inner: arg5 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg6, + inner: arg6 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg7, + inner: arg7 as u64, }, super::super::super::super::miden::base::core_types::Felt{ - inner: arg8, + inner: arg8 as u64, }), }); } @@ -1041,7 +1043,7 @@ pub mod exports { #[cfg(target_arch = "wasm32")] #[link_section = "component-type:basic-wallet-world"] #[doc(hidden)] -pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 2717] = [3, 0, 18, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 45, 119, 111, 114, 108, 100, 0, 97, 115, 109, 13, 0, 1, 0, 7, 227, 4, 1, 65, 7, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 1, 66, 10, 2, 3, 2, 1, 1, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 3, 116, 97, 103, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 4, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 1, 0, 4, 0, 13, 114, 101, 99, 101, 105, 118, 101, 45, 97, 115, 115, 101, 116, 1, 6, 1, 64, 3, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 3, 116, 97, 103, 3, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 5, 1, 0, 4, 0, 10, 115, 101, 110, 100, 45, 97, 115, 115, 101, 116, 1, 7, 4, 1, 37, 109, 105, 100, 101, 110, 58, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 47, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 64, 49, 46, 48, 46, 48, 5, 4, 11, 18, 1, 0, 12, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 3, 0, 0, 7, 143, 15, 1, 65, 2, 1, 65, 22, 1, 66, 30, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 1, 4, 102, 101, 108, 116, 1, 0, 5, 4, 0, 20, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 1, 28, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 66, 47, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 64, 0, 0, 9, 4, 0, 6, 103, 101, 116, 45, 105, 100, 1, 22, 1, 64, 0, 0, 11, 4, 0, 9, 103, 101, 116, 45, 110, 111, 110, 99, 101, 1, 23, 1, 64, 0, 0, 13, 4, 0, 16, 103, 101, 116, 45, 105, 110, 105, 116, 105, 97, 108, 45, 104, 97, 115, 104, 1, 24, 4, 0, 16, 103, 101, 116, 45, 99, 117, 114, 114, 101, 110, 116, 45, 104, 97, 115, 104, 1, 24, 1, 64, 1, 5, 118, 97, 108, 117, 101, 1, 1, 0, 4, 0, 10, 105, 110, 99, 114, 45, 110, 111, 110, 99, 101, 1, 25, 1, 64, 1, 5, 105, 110, 100, 101, 120, 1, 0, 15, 4, 0, 8, 103, 101, 116, 45, 105, 116, 101, 109, 1, 26, 1, 111, 2, 17, 15, 1, 64, 2, 5, 105, 110, 100, 101, 120, 1, 5, 118, 97, 108, 117, 101, 15, 0, 27, 4, 0, 8, 115, 101, 116, 45, 105, 116, 101, 109, 1, 28, 1, 64, 1, 9, 99, 111, 100, 101, 45, 114, 111, 111, 116, 19, 1, 0, 4, 0, 8, 115, 101, 116, 45, 99, 111, 100, 101, 1, 29, 1, 64, 1, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 9, 0, 1, 4, 0, 11, 103, 101, 116, 45, 98, 97, 108, 97, 110, 99, 101, 1, 30, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 127, 4, 0, 22, 104, 97, 115, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 31, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 3, 4, 0, 9, 97, 100, 100, 45, 97, 115, 115, 101, 116, 1, 32, 4, 0, 12, 114, 101, 109, 111, 118, 101, 45, 97, 115, 115, 101, 116, 1, 32, 1, 64, 0, 0, 21, 4, 0, 20, 103, 101, 116, 45, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 33, 3, 1, 24, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 97, 99, 99, 111, 117, 110, 116, 64, 49, 46, 48, 46, 48, 5, 12, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 7, 110, 111, 116, 101, 45, 105, 100, 1, 66, 37, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 13, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 14, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 2, 3, 2, 1, 15, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 0, 0, 1, 4, 0, 16, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 110, 117, 109, 98, 101, 114, 1, 28, 1, 64, 0, 0, 23, 4, 0, 14, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 1, 29, 1, 64, 0, 0, 25, 4, 0, 20, 103, 101, 116, 45, 105, 110, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 4, 0, 21, 103, 101, 116, 45, 111, 117, 116, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 1, 64, 3, 5, 97, 115, 115, 101, 116, 3, 3, 116, 97, 103, 5, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 7, 0, 27, 4, 0, 11, 99, 114, 101, 97, 116, 101, 45, 110, 111, 116, 101, 1, 31, 3, 1, 19, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 120, 64, 49, 46, 48, 46, 48, 5, 16, 1, 66, 10, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 0, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 2, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 4, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 1, 0, 4, 0, 13, 114, 101, 99, 101, 105, 118, 101, 45, 97, 115, 115, 101, 116, 1, 6, 1, 64, 3, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 3, 116, 97, 103, 3, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 5, 1, 0, 4, 0, 10, 115, 101, 110, 100, 45, 97, 115, 115, 101, 116, 1, 7, 4, 1, 37, 109, 105, 100, 101, 110, 58, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 47, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 64, 49, 46, 48, 46, 48, 5, 17, 4, 1, 43, 109, 105, 100, 101, 110, 58, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 47, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 45, 119, 111, 114, 108, 100, 64, 49, 46, 48, 46, 48, 4, 0, 11, 24, 1, 0, 18, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 45, 119, 111, 114, 108, 100, 3, 2, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 2717] = [3, 0, 18, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 45, 119, 111, 114, 108, 100, 0, 97, 115, 109, 13, 0, 1, 0, 7, 227, 4, 1, 65, 7, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 1, 66, 10, 2, 3, 2, 1, 1, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 3, 116, 97, 103, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 4, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 1, 0, 4, 0, 13, 114, 101, 99, 101, 105, 118, 101, 45, 97, 115, 115, 101, 116, 1, 6, 1, 64, 3, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 3, 116, 97, 103, 3, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 5, 1, 0, 4, 0, 10, 115, 101, 110, 100, 45, 97, 115, 115, 101, 116, 1, 7, 4, 1, 37, 109, 105, 100, 101, 110, 58, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 47, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 64, 49, 46, 48, 46, 48, 5, 4, 11, 18, 1, 0, 12, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 3, 0, 0, 7, 143, 15, 1, 65, 2, 1, 65, 22, 1, 66, 30, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 1, 4, 102, 101, 108, 116, 1, 0, 5, 4, 0, 20, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 1, 28, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 66, 47, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 64, 0, 0, 9, 4, 0, 6, 103, 101, 116, 45, 105, 100, 1, 22, 1, 64, 0, 0, 11, 4, 0, 9, 103, 101, 116, 45, 110, 111, 110, 99, 101, 1, 23, 1, 64, 0, 0, 13, 4, 0, 16, 103, 101, 116, 45, 105, 110, 105, 116, 105, 97, 108, 45, 104, 97, 115, 104, 1, 24, 4, 0, 16, 103, 101, 116, 45, 99, 117, 114, 114, 101, 110, 116, 45, 104, 97, 115, 104, 1, 24, 1, 64, 1, 5, 118, 97, 108, 117, 101, 1, 1, 0, 4, 0, 10, 105, 110, 99, 114, 45, 110, 111, 110, 99, 101, 1, 25, 1, 64, 1, 5, 105, 110, 100, 101, 120, 1, 0, 15, 4, 0, 8, 103, 101, 116, 45, 105, 116, 101, 109, 1, 26, 1, 111, 2, 17, 15, 1, 64, 2, 5, 105, 110, 100, 101, 120, 1, 5, 118, 97, 108, 117, 101, 15, 0, 27, 4, 0, 8, 115, 101, 116, 45, 105, 116, 101, 109, 1, 28, 1, 64, 1, 9, 99, 111, 100, 101, 45, 114, 111, 111, 116, 19, 1, 0, 4, 0, 8, 115, 101, 116, 45, 99, 111, 100, 101, 1, 29, 1, 64, 1, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 9, 0, 1, 4, 0, 11, 103, 101, 116, 45, 98, 97, 108, 97, 110, 99, 101, 1, 30, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 127, 4, 0, 22, 104, 97, 115, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 31, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 3, 4, 0, 9, 97, 100, 100, 45, 97, 115, 115, 101, 116, 1, 32, 4, 0, 12, 114, 101, 109, 111, 118, 101, 45, 97, 115, 115, 101, 116, 1, 32, 1, 64, 0, 0, 21, 4, 0, 20, 103, 101, 116, 45, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 33, 3, 1, 24, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 97, 99, 99, 111, 117, 110, 116, 64, 49, 46, 48, 46, 48, 5, 12, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 7, 110, 111, 116, 101, 45, 105, 100, 1, 66, 37, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 13, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 14, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 2, 3, 2, 1, 15, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 0, 0, 1, 4, 0, 16, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 110, 117, 109, 98, 101, 114, 1, 28, 1, 64, 0, 0, 23, 4, 0, 14, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 1, 29, 1, 64, 0, 0, 25, 4, 0, 20, 103, 101, 116, 45, 105, 110, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 4, 0, 21, 103, 101, 116, 45, 111, 117, 116, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 1, 64, 3, 5, 97, 115, 115, 101, 116, 3, 3, 116, 97, 103, 5, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 7, 0, 27, 4, 0, 11, 99, 114, 101, 97, 116, 101, 45, 110, 111, 116, 101, 1, 31, 3, 1, 19, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 120, 64, 49, 46, 48, 46, 48, 5, 16, 1, 66, 10, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 0, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 2, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 4, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 1, 0, 4, 0, 13, 114, 101, 99, 101, 105, 118, 101, 45, 97, 115, 115, 101, 116, 1, 6, 1, 64, 3, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 3, 116, 97, 103, 3, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 5, 1, 0, 4, 0, 10, 115, 101, 110, 100, 45, 97, 115, 115, 101, 116, 1, 7, 4, 1, 37, 109, 105, 100, 101, 110, 58, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 47, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 64, 49, 46, 48, 46, 48, 5, 17, 4, 1, 43, 109, 105, 100, 101, 110, 58, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 47, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 45, 119, 111, 114, 108, 100, 64, 49, 46, 48, 46, 48, 4, 0, 11, 24, 1, 0, 18, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 45, 119, 111, 114, 108, 100, 3, 2, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; #[inline(never)] #[doc(hidden)] diff --git a/tests/rust-apps-wasm/sdk/p2id-note/src/bindings.rs b/tests/rust-apps-wasm/sdk/p2id-note/src/bindings.rs index 9a1b368d3..b175a5d76 100644 --- a/tests/rust-apps-wasm/sdk/p2id-note/src/bindings.rs +++ b/tests/rust-apps-wasm/sdk/p2id-note/src/bindings.rs @@ -15,9 +15,11 @@ pub mod miden { #[repr(C)] #[derive(Clone, Copy, PartialEq)] pub struct Felt { - /// We use f64 as the backing type for the field element. It has the size that we need and + /// We plan to use f64 as the backing type for the field element. It has the size that we need and /// we don't plan to support floating point arithmetic in programs for Miden VM. - pub inner: f64, + /// + /// For now its u64 + pub inner: u64, } impl ::core::fmt::Debug for Felt { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { @@ -221,15 +223,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/core-types@1.0.0")] extern "C" { #[link_name = "account-id-from-felt"] - fn wit_import(_: f64, ) -> f64; + fn wit_import(_: i64, ) -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, ) -> f64{ unreachable!() } - let ret = wit_import(wit_bindgen::rt::as_f64(inner0)); + fn wit_import(_: i64, ) -> i64{ unreachable!() } + let ret = wit_import(wit_bindgen::rt::as_i64(inner0)); AccountId{ inner: Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -263,14 +265,14 @@ pub mod miden { #[link(wasm_import_module = "miden:base/tx@1.0.0")] extern "C" { #[link_name = "get-block-number"] - fn wit_import() -> f64; + fn wit_import() -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import() -> f64{ unreachable!() } + fn wit_import() -> i64{ unreachable!() } let ret = wit_import(); super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, } } } @@ -296,19 +298,19 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); super::super::super::miden::base::core_types::BlockHash{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }), } } @@ -336,18 +338,18 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }) } } @@ -374,18 +376,18 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }) } } @@ -419,15 +421,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/tx@1.0.0")] extern "C" { #[link_name = "create-note"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, ) -> f64; + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, ) -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, ) -> f64{ unreachable!() } - let ret = wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), wit_bindgen::rt::as_f64(inner7), wit_bindgen::rt::as_f64(inner10), wit_bindgen::rt::as_f64(inner11), wit_bindgen::rt::as_f64(inner12), wit_bindgen::rt::as_f64(inner13)); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, ) -> i64{ unreachable!() } + let ret = wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), wit_bindgen::rt::as_i64(inner7), wit_bindgen::rt::as_i64(inner10), wit_bindgen::rt::as_i64(inner11), wit_bindgen::rt::as_i64(inner12), wit_bindgen::rt::as_i64(inner13)); super::super::super::miden::base::core_types::NoteId{ inner: super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -463,15 +465,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "get-id"] - fn wit_import() -> f64; + fn wit_import() -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import() -> f64{ unreachable!() } + fn wit_import() -> i64{ unreachable!() } let ret = wit_import(); super::super::super::miden::base::core_types::AccountId{ inner: super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -488,15 +490,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "get-nonce"] - fn wit_import() -> f64; + fn wit_import() -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import() -> f64{ unreachable!() } + fn wit_import() -> i64{ unreachable!() } let ret = wit_import(); super::super::super::miden::base::core_types::Nonce{ inner: super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -523,19 +525,19 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); super::super::super::miden::base::core_types::AccountHash{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }), } } @@ -562,19 +564,19 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); super::super::super::miden::base::core_types::AccountHash{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }), } } @@ -593,12 +595,12 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "incr-nonce"] - fn wit_import(_: f64, ); + fn wit_import(_: i64, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner0)); + fn wit_import(_: i64, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner0)); } } #[allow(unused_unsafe, clippy::all)] @@ -618,25 +620,25 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "get-item"] - fn wit_import(_: f64, _: i32, ); + fn wit_import(_: i64, _: i32, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: i32, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner0), ptr1); - let l2 = *((ptr1 + 0) as *const f64); - let l3 = *((ptr1 + 8) as *const f64); - let l4 = *((ptr1 + 16) as *const f64); - let l5 = *((ptr1 + 24) as *const f64); + fn wit_import(_: i64, _: i32, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner0), ptr1); + let l2 = *((ptr1 + 0) as *const i64); + let l3 = *((ptr1 + 8) as *const i64); + let l4 = *((ptr1 + 16) as *const i64); + let l5 = *((ptr1 + 24) as *const i64); super::super::super::miden::base::core_types::StorageValue{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l5, + inner: l5 as u64, }), } } @@ -665,39 +667,39 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "set-item"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: i32, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i32, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: i32, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner0), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), wit_bindgen::rt::as_f64(inner6), ptr7); - let l8 = *((ptr7 + 0) as *const f64); - let l9 = *((ptr7 + 8) as *const f64); - let l10 = *((ptr7 + 16) as *const f64); - let l11 = *((ptr7 + 24) as *const f64); - let l12 = *((ptr7 + 32) as *const f64); - let l13 = *((ptr7 + 40) as *const f64); - let l14 = *((ptr7 + 48) as *const f64); - let l15 = *((ptr7 + 56) as *const f64); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i32, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner0), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), wit_bindgen::rt::as_i64(inner6), ptr7); + let l8 = *((ptr7 + 0) as *const i64); + let l9 = *((ptr7 + 8) as *const i64); + let l10 = *((ptr7 + 16) as *const i64); + let l11 = *((ptr7 + 24) as *const i64); + let l12 = *((ptr7 + 32) as *const i64); + let l13 = *((ptr7 + 40) as *const i64); + let l14 = *((ptr7 + 48) as *const i64); + let l15 = *((ptr7 + 56) as *const i64); (super::super::super::miden::base::core_types::StorageRoot{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l8, + inner: l8 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l9, + inner: l9 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l10, + inner: l10 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l11, + inner: l11 as u64, }), }, super::super::super::miden::base::core_types::StorageValue{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l12, + inner: l12 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l13, + inner: l13 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l14, + inner: l14 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l15, + inner: l15 as u64, }), }) } @@ -723,12 +725,12 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "set-code"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5)); + fn wit_import(_: i64, _: i64, _: i64, _: i64, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5)); } } #[allow(unused_unsafe, clippy::all)] @@ -748,14 +750,14 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "get-balance"] - fn wit_import(_: f64, ) -> f64; + fn wit_import(_: i64, ) -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, ) -> f64{ unreachable!() } - let ret = wit_import(wit_bindgen::rt::as_f64(inner1)); + fn wit_import(_: i64, ) -> i64{ unreachable!() } + let ret = wit_import(wit_bindgen::rt::as_i64(inner1)); super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, } } } @@ -780,12 +782,12 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "has-non-fungible-asset"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ) -> i32; + fn wit_import(_: i64, _: i64, _: i64, _: i64, ) -> i32; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ) -> i32{ unreachable!() } - let ret = wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5)); + fn wit_import(_: i64, _: i64, _: i64, _: i64, ) -> i32{ unreachable!() } + let ret = wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5)); wit_bindgen::rt::bool_lift(ret as u8) } } @@ -815,25 +817,25 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "add-asset"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: i32, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i32, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: i32, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), ptr6); - let l7 = *((ptr6 + 0) as *const f64); - let l8 = *((ptr6 + 8) as *const f64); - let l9 = *((ptr6 + 16) as *const f64); - let l10 = *((ptr6 + 24) as *const f64); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i32, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), ptr6); + let l7 = *((ptr6 + 0) as *const i64); + let l8 = *((ptr6 + 8) as *const i64); + let l9 = *((ptr6 + 16) as *const i64); + let l10 = *((ptr6 + 24) as *const i64); super::super::super::miden::base::core_types::CoreAsset{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l7, + inner: l7 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l8, + inner: l8 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l9, + inner: l9 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l10, + inner: l10 as u64, }), } } @@ -860,25 +862,25 @@ pub mod miden { #[link(wasm_import_module = "miden:base/account@1.0.0")] extern "C" { #[link_name = "remove-asset"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: i32, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i32, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: i32, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), ptr6); - let l7 = *((ptr6 + 0) as *const f64); - let l8 = *((ptr6 + 8) as *const f64); - let l9 = *((ptr6 + 16) as *const f64); - let l10 = *((ptr6 + 24) as *const f64); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i32, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), ptr6); + let l7 = *((ptr6 + 0) as *const i64); + let l8 = *((ptr6 + 8) as *const i64); + let l9 = *((ptr6 + 16) as *const i64); + let l10 = *((ptr6 + 24) as *const i64); super::super::super::miden::base::core_types::CoreAsset{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l7, + inner: l7 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l8, + inner: l8 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l9, + inner: l9 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l10, + inner: l10 as u64, }), } } @@ -905,19 +907,19 @@ pub mod miden { #[cfg(not(target_arch = "wasm32"))] fn wit_import(_: i32, ){ unreachable!() } wit_import(ptr0); - let l1 = *((ptr0 + 0) as *const f64); - let l2 = *((ptr0 + 8) as *const f64); - let l3 = *((ptr0 + 16) as *const f64); - let l4 = *((ptr0 + 24) as *const f64); + let l1 = *((ptr0 + 0) as *const i64); + let l2 = *((ptr0 + 8) as *const i64); + let l3 = *((ptr0 + 16) as *const i64); + let l4 = *((ptr0 + 24) as *const i64); super::super::super::miden::base::core_types::VaultCommitment{ inner: (super::super::super::miden::base::core_types::Felt{ - inner: l1, + inner: l1 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l2, + inner: l2 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l3, + inner: l3 as u64, }, super::super::super::miden::base::core_types::Felt{ - inner: l4, + inner: l4 as u64, }), } } @@ -1003,15 +1005,15 @@ pub mod miden { #[link(wasm_import_module = "miden:base/note@1.0.0")] extern "C" { #[link_name = "get-sender"] - fn wit_import() -> f64; + fn wit_import() -> i64; } #[cfg(not(target_arch = "wasm32"))] - fn wit_import() -> f64{ unreachable!() } + fn wit_import() -> i64{ unreachable!() } let ret = wit_import(); super::super::super::miden::base::core_types::AccountId{ inner: super::super::super::miden::base::core_types::Felt{ - inner: ret, + inner: ret as u64, }, } } @@ -1048,12 +1050,12 @@ pub mod miden { #[link(wasm_import_module = "miden:basic-wallet/basic-wallet@1.0.0")] extern "C" { #[link_name = "receive-asset"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5)); + fn wit_import(_: i64, _: i64, _: i64, _: i64, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5)); } } #[allow(unused_unsafe, clippy::all)] @@ -1081,12 +1083,12 @@ pub mod miden { #[link(wasm_import_module = "miden:basic-wallet/basic-wallet@1.0.0")] extern "C" { #[link_name = "send-asset"] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, ); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, ); } #[cfg(not(target_arch = "wasm32"))] - fn wit_import(_: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, _: f64, ){ unreachable!() } - wit_import(wit_bindgen::rt::as_f64(inner2), wit_bindgen::rt::as_f64(inner3), wit_bindgen::rt::as_f64(inner4), wit_bindgen::rt::as_f64(inner5), wit_bindgen::rt::as_f64(inner7), wit_bindgen::rt::as_f64(inner10), wit_bindgen::rt::as_f64(inner11), wit_bindgen::rt::as_f64(inner12), wit_bindgen::rt::as_f64(inner13)); + fn wit_import(_: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, _: i64, ){ unreachable!() } + wit_import(wit_bindgen::rt::as_i64(inner2), wit_bindgen::rt::as_i64(inner3), wit_bindgen::rt::as_i64(inner4), wit_bindgen::rt::as_i64(inner5), wit_bindgen::rt::as_i64(inner7), wit_bindgen::rt::as_i64(inner10), wit_bindgen::rt::as_i64(inner11), wit_bindgen::rt::as_i64(inner12), wit_bindgen::rt::as_i64(inner13)); } } @@ -1144,7 +1146,7 @@ pub mod exports { #[cfg(target_arch = "wasm32")] #[link_section = "component-type:notes-world"] #[doc(hidden)] -pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 2438] = [3, 0, 11, 110, 111, 116, 101, 115, 45, 119, 111, 114, 108, 100, 0, 97, 115, 109, 13, 0, 1, 0, 7, 128, 18, 1, 65, 2, 1, 65, 26, 1, 66, 30, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 1, 4, 102, 101, 108, 116, 1, 0, 5, 4, 0, 20, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 1, 28, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 7, 110, 111, 116, 101, 45, 105, 100, 1, 66, 37, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 12, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 13, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 2, 3, 2, 1, 14, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 0, 0, 1, 4, 0, 16, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 110, 117, 109, 98, 101, 114, 1, 28, 1, 64, 0, 0, 23, 4, 0, 14, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 1, 29, 1, 64, 0, 0, 25, 4, 0, 20, 103, 101, 116, 45, 105, 110, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 4, 0, 21, 103, 101, 116, 45, 111, 117, 116, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 1, 64, 3, 5, 97, 115, 115, 101, 116, 3, 3, 116, 97, 103, 5, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 7, 0, 27, 4, 0, 11, 99, 114, 101, 97, 116, 101, 45, 110, 111, 116, 101, 1, 31, 3, 1, 19, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 120, 64, 49, 46, 48, 46, 48, 5, 15, 1, 66, 47, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 64, 0, 0, 9, 4, 0, 6, 103, 101, 116, 45, 105, 100, 1, 22, 1, 64, 0, 0, 11, 4, 0, 9, 103, 101, 116, 45, 110, 111, 110, 99, 101, 1, 23, 1, 64, 0, 0, 13, 4, 0, 16, 103, 101, 116, 45, 105, 110, 105, 116, 105, 97, 108, 45, 104, 97, 115, 104, 1, 24, 4, 0, 16, 103, 101, 116, 45, 99, 117, 114, 114, 101, 110, 116, 45, 104, 97, 115, 104, 1, 24, 1, 64, 1, 5, 118, 97, 108, 117, 101, 1, 1, 0, 4, 0, 10, 105, 110, 99, 114, 45, 110, 111, 110, 99, 101, 1, 25, 1, 64, 1, 5, 105, 110, 100, 101, 120, 1, 0, 15, 4, 0, 8, 103, 101, 116, 45, 105, 116, 101, 109, 1, 26, 1, 111, 2, 17, 15, 1, 64, 2, 5, 105, 110, 100, 101, 120, 1, 5, 118, 97, 108, 117, 101, 15, 0, 27, 4, 0, 8, 115, 101, 116, 45, 105, 116, 101, 109, 1, 28, 1, 64, 1, 9, 99, 111, 100, 101, 45, 114, 111, 111, 116, 19, 1, 0, 4, 0, 8, 115, 101, 116, 45, 99, 111, 100, 101, 1, 29, 1, 64, 1, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 9, 0, 1, 4, 0, 11, 103, 101, 116, 45, 98, 97, 108, 97, 110, 99, 101, 1, 30, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 127, 4, 0, 22, 104, 97, 115, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 31, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 3, 4, 0, 9, 97, 100, 100, 45, 97, 115, 115, 101, 116, 1, 32, 4, 0, 12, 114, 101, 109, 111, 118, 101, 45, 97, 115, 115, 101, 116, 1, 32, 1, 64, 0, 0, 21, 4, 0, 20, 103, 101, 116, 45, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 33, 3, 1, 24, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 97, 99, 99, 111, 117, 110, 116, 64, 49, 46, 48, 46, 48, 5, 16, 1, 66, 30, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 112, 1, 1, 64, 0, 0, 22, 4, 0, 10, 103, 101, 116, 45, 105, 110, 112, 117, 116, 115, 1, 23, 1, 112, 3, 1, 64, 0, 0, 24, 4, 0, 10, 103, 101, 116, 45, 97, 115, 115, 101, 116, 115, 1, 25, 1, 64, 0, 0, 9, 4, 0, 10, 103, 101, 116, 45, 115, 101, 110, 100, 101, 114, 1, 26, 3, 1, 21, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 110, 111, 116, 101, 64, 49, 46, 48, 46, 48, 5, 17, 1, 66, 10, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 0, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 2, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 4, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 1, 0, 4, 0, 13, 114, 101, 99, 101, 105, 118, 101, 45, 97, 115, 115, 101, 116, 1, 6, 1, 64, 3, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 3, 116, 97, 103, 3, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 5, 1, 0, 4, 0, 10, 115, 101, 110, 100, 45, 97, 115, 115, 101, 116, 1, 7, 3, 1, 37, 109, 105, 100, 101, 110, 58, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 47, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 64, 49, 46, 48, 46, 48, 5, 18, 1, 66, 2, 1, 64, 0, 1, 0, 4, 0, 11, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 1, 0, 4, 1, 28, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 64, 49, 46, 48, 46, 48, 5, 19, 4, 1, 28, 109, 105, 100, 101, 110, 58, 112, 50, 105, 100, 47, 110, 111, 116, 101, 115, 45, 119, 111, 114, 108, 100, 64, 49, 46, 48, 46, 48, 4, 0, 11, 17, 1, 0, 11, 110, 111, 116, 101, 115, 45, 119, 111, 114, 108, 100, 3, 0, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 2438] = [3, 0, 11, 110, 111, 116, 101, 115, 45, 119, 111, 114, 108, 100, 0, 97, 115, 109, 13, 0, 1, 0, 7, 128, 18, 1, 65, 2, 1, 65, 26, 1, 66, 30, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 1, 4, 102, 101, 108, 116, 1, 0, 5, 4, 0, 20, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 1, 28, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 7, 110, 111, 116, 101, 45, 105, 100, 1, 66, 37, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 12, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 13, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 2, 3, 2, 1, 14, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 0, 0, 1, 4, 0, 16, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 110, 117, 109, 98, 101, 114, 1, 28, 1, 64, 0, 0, 23, 4, 0, 14, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 1, 29, 1, 64, 0, 0, 25, 4, 0, 20, 103, 101, 116, 45, 105, 110, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 4, 0, 21, 103, 101, 116, 45, 111, 117, 116, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 1, 64, 3, 5, 97, 115, 115, 101, 116, 3, 3, 116, 97, 103, 5, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 7, 0, 27, 4, 0, 11, 99, 114, 101, 97, 116, 101, 45, 110, 111, 116, 101, 1, 31, 3, 1, 19, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 120, 64, 49, 46, 48, 46, 48, 5, 15, 1, 66, 47, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 64, 0, 0, 9, 4, 0, 6, 103, 101, 116, 45, 105, 100, 1, 22, 1, 64, 0, 0, 11, 4, 0, 9, 103, 101, 116, 45, 110, 111, 110, 99, 101, 1, 23, 1, 64, 0, 0, 13, 4, 0, 16, 103, 101, 116, 45, 105, 110, 105, 116, 105, 97, 108, 45, 104, 97, 115, 104, 1, 24, 4, 0, 16, 103, 101, 116, 45, 99, 117, 114, 114, 101, 110, 116, 45, 104, 97, 115, 104, 1, 24, 1, 64, 1, 5, 118, 97, 108, 117, 101, 1, 1, 0, 4, 0, 10, 105, 110, 99, 114, 45, 110, 111, 110, 99, 101, 1, 25, 1, 64, 1, 5, 105, 110, 100, 101, 120, 1, 0, 15, 4, 0, 8, 103, 101, 116, 45, 105, 116, 101, 109, 1, 26, 1, 111, 2, 17, 15, 1, 64, 2, 5, 105, 110, 100, 101, 120, 1, 5, 118, 97, 108, 117, 101, 15, 0, 27, 4, 0, 8, 115, 101, 116, 45, 105, 116, 101, 109, 1, 28, 1, 64, 1, 9, 99, 111, 100, 101, 45, 114, 111, 111, 116, 19, 1, 0, 4, 0, 8, 115, 101, 116, 45, 99, 111, 100, 101, 1, 29, 1, 64, 1, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 9, 0, 1, 4, 0, 11, 103, 101, 116, 45, 98, 97, 108, 97, 110, 99, 101, 1, 30, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 127, 4, 0, 22, 104, 97, 115, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 31, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 3, 4, 0, 9, 97, 100, 100, 45, 97, 115, 115, 101, 116, 1, 32, 4, 0, 12, 114, 101, 109, 111, 118, 101, 45, 97, 115, 115, 101, 116, 1, 32, 1, 64, 0, 0, 21, 4, 0, 20, 103, 101, 116, 45, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 33, 3, 1, 24, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 97, 99, 99, 111, 117, 110, 116, 64, 49, 46, 48, 46, 48, 5, 16, 1, 66, 30, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 112, 1, 1, 64, 0, 0, 22, 4, 0, 10, 103, 101, 116, 45, 105, 110, 112, 117, 116, 115, 1, 23, 1, 112, 3, 1, 64, 0, 0, 24, 4, 0, 10, 103, 101, 116, 45, 97, 115, 115, 101, 116, 115, 1, 25, 1, 64, 0, 0, 9, 4, 0, 10, 103, 101, 116, 45, 115, 101, 110, 100, 101, 114, 1, 26, 3, 1, 21, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 110, 111, 116, 101, 64, 49, 46, 48, 46, 48, 5, 17, 1, 66, 10, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 0, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 2, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 4, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 1, 0, 4, 0, 13, 114, 101, 99, 101, 105, 118, 101, 45, 97, 115, 115, 101, 116, 1, 6, 1, 64, 3, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 3, 116, 97, 103, 3, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 5, 1, 0, 4, 0, 10, 115, 101, 110, 100, 45, 97, 115, 115, 101, 116, 1, 7, 3, 1, 37, 109, 105, 100, 101, 110, 58, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 47, 98, 97, 115, 105, 99, 45, 119, 97, 108, 108, 101, 116, 64, 49, 46, 48, 46, 48, 5, 18, 1, 66, 2, 1, 64, 0, 1, 0, 4, 0, 11, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 1, 0, 4, 1, 28, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 64, 49, 46, 48, 46, 48, 5, 19, 4, 1, 28, 109, 105, 100, 101, 110, 58, 112, 50, 105, 100, 47, 110, 111, 116, 101, 115, 45, 119, 111, 114, 108, 100, 64, 49, 46, 48, 46, 48, 4, 0, 11, 17, 1, 0, 11, 110, 111, 116, 101, 115, 45, 119, 111, 114, 108, 100, 3, 0, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; #[inline(never)] #[doc(hidden)] diff --git a/tests/rust-apps-wasm/sdk/sdk/src/bindings.rs b/tests/rust-apps-wasm/sdk/sdk/src/bindings.rs index 2d3d52b32..839d96441 100644 --- a/tests/rust-apps-wasm/sdk/sdk/src/bindings.rs +++ b/tests/rust-apps-wasm/sdk/sdk/src/bindings.rs @@ -16,9 +16,11 @@ pub mod exports { #[repr(C)] #[derive(Clone, Copy)] pub struct Felt { - /// We use f64 as the backing type for the field element. It has the size that we need and + /// We plan to use f64 as the backing type for the field element. It has the size that we need and /// we don't plan to support floating point arithmetic in programs for Miden VM. - pub inner: f64, + /// + /// For now its u64 + pub inner: u64, } impl ::core::fmt::Debug for Felt { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { @@ -105,7 +107,7 @@ pub mod exports { #[doc(hidden)] #[export_name = "miden:base/core-types@1.0.0#account-id-from-felt"] #[allow(non_snake_case)] - unsafe extern "C" fn __export_account_id_from_felt(arg0: f64,) -> f64 { + unsafe extern "C" fn __export_account_id_from_felt(arg0: i64,) -> i64 { #[allow(unused_imports)] use wit_bindgen::rt::{alloc, vec::Vec, string::String}; @@ -124,11 +126,11 @@ pub mod exports { wit_bindgen::rt::run_ctors_once(); let result0 = <_GuestImpl as Guest>::account_id_from_felt(Felt{ - inner: arg0, + inner: arg0 as u64, }); let AccountId{ inner:inner1, } = result0; let Felt{ inner:inner2, } = inner1; - wit_bindgen::rt::as_f64(inner2) + wit_bindgen::rt::as_i64(inner2) } }; use super::super::super::super::super::Component as _GuestImpl; @@ -202,7 +204,7 @@ pub mod exports { #[doc(hidden)] #[export_name = "miden:base/types@1.0.0#from-core-asset"] #[allow(non_snake_case)] - unsafe extern "C" fn __export_from_core_asset(arg0: f64,arg1: f64,arg2: f64,arg3: f64,) -> i32 { + unsafe extern "C" fn __export_from_core_asset(arg0: i64,arg1: i64,arg2: i64,arg3: i64,) -> i32 { #[allow(unused_imports)] use wit_bindgen::rt::{alloc, vec::Vec, string::String}; @@ -222,13 +224,13 @@ pub mod exports { let result0 = <_GuestImpl as Guest>::from_core_asset(super::super::super::super::exports::miden::base::core_types::CoreAsset{ inner: (super::super::super::super::exports::miden::base::core_types::Felt{ - inner: arg0, + inner: arg0 as u64, }, super::super::super::super::exports::miden::base::core_types::Felt{ - inner: arg1, + inner: arg1 as u64, }, super::super::super::super::exports::miden::base::core_types::Felt{ - inner: arg2, + inner: arg2 as u64, }, super::super::super::super::exports::miden::base::core_types::Felt{ - inner: arg3, + inner: arg3 as u64, }), }); let ptr1 = _RET_AREA.0.as_mut_ptr() as i32; @@ -238,7 +240,7 @@ pub mod exports { let FungibleAsset{ asset:asset2, amount:amount2, } = e; let super::super::super::super::exports::miden::base::core_types::AccountId{ inner:inner3, } = asset2; let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner4, } = inner3; - *((ptr1 + 8) as *mut f64) = wit_bindgen::rt::as_f64(inner4); + *((ptr1 + 8) as *mut i64) = wit_bindgen::rt::as_i64(inner4); *((ptr1 + 16) as *mut i64) = wit_bindgen::rt::as_i64(amount2); }, Asset::NonFungible(e) => { @@ -246,13 +248,13 @@ pub mod exports { let NonFungibleAsset{ inner:inner5, } = e; let (t6_0, t6_1, t6_2, t6_3, ) = inner5; let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner7, } = t6_0; - *((ptr1 + 8) as *mut f64) = wit_bindgen::rt::as_f64(inner7); + *((ptr1 + 8) as *mut i64) = wit_bindgen::rt::as_i64(inner7); let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner8, } = t6_1; - *((ptr1 + 16) as *mut f64) = wit_bindgen::rt::as_f64(inner8); + *((ptr1 + 16) as *mut i64) = wit_bindgen::rt::as_i64(inner8); let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner9, } = t6_2; - *((ptr1 + 24) as *mut f64) = wit_bindgen::rt::as_f64(inner9); + *((ptr1 + 24) as *mut i64) = wit_bindgen::rt::as_i64(inner9); let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner10, } = t6_3; - *((ptr1 + 32) as *mut f64) = wit_bindgen::rt::as_f64(inner10); + *((ptr1 + 32) as *mut i64) = wit_bindgen::rt::as_i64(inner10); }, } ptr1 @@ -263,7 +265,7 @@ pub mod exports { #[doc(hidden)] #[export_name = "miden:base/types@1.0.0#to-core-asset"] #[allow(non_snake_case)] - unsafe extern "C" fn __export_to_core_asset(arg0: i32,arg1: f64,arg2: i64,arg3: f64,arg4: f64,) -> i32 { + unsafe extern "C" fn __export_to_core_asset(arg0: i32,arg1: i64,arg2: i64,arg3: i64,arg4: i64,) -> i32 { #[allow(unused_imports)] use wit_bindgen::rt::{alloc, vec::Vec, string::String}; @@ -286,7 +288,7 @@ pub mod exports { let e0 = FungibleAsset{ asset: super::super::super::super::exports::miden::base::core_types::AccountId{ inner: super::super::super::super::exports::miden::base::core_types::Felt{ - inner: arg1, + inner: arg1 as u64, }, }, amount: arg2 as u64, @@ -297,13 +299,13 @@ pub mod exports { debug_assert_eq!(n, 1, "invalid enum discriminant"); let e0 = NonFungibleAsset{ inner: (super::super::super::super::exports::miden::base::core_types::Felt{ - inner: arg1, + inner: arg1 as u64, }, super::super::super::super::exports::miden::base::core_types::Felt{ - inner: f64::from_bits(arg2 as u64), + inner: arg2 as u64, }, super::super::super::super::exports::miden::base::core_types::Felt{ - inner: arg3, + inner: arg3 as u64, }, super::super::super::super::exports::miden::base::core_types::Felt{ - inner: arg4, + inner: arg4 as u64, }), }; Asset::NonFungible(e0) @@ -314,13 +316,13 @@ pub mod exports { let super::super::super::super::exports::miden::base::core_types::CoreAsset{ inner:inner3, } = result1; let (t4_0, t4_1, t4_2, t4_3, ) = inner3; let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner5, } = t4_0; - *((ptr2 + 0) as *mut f64) = wit_bindgen::rt::as_f64(inner5); + *((ptr2 + 0) as *mut i64) = wit_bindgen::rt::as_i64(inner5); let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner6, } = t4_1; - *((ptr2 + 8) as *mut f64) = wit_bindgen::rt::as_f64(inner6); + *((ptr2 + 8) as *mut i64) = wit_bindgen::rt::as_i64(inner6); let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner7, } = t4_2; - *((ptr2 + 16) as *mut f64) = wit_bindgen::rt::as_f64(inner7); + *((ptr2 + 16) as *mut i64) = wit_bindgen::rt::as_i64(inner7); let super::super::super::super::exports::miden::base::core_types::Felt{ inner:inner8, } = t4_3; - *((ptr2 + 24) as *mut f64) = wit_bindgen::rt::as_f64(inner8); + *((ptr2 + 24) as *mut i64) = wit_bindgen::rt::as_i64(inner8); ptr2 } }; @@ -348,7 +350,7 @@ pub mod exports { #[cfg(target_arch = "wasm32")] #[link_section = "component-type:base-world"] #[doc(hidden)] -pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 16715] = [3, 0, 10, 98, 97, 115, 101, 45, 119, 111, 114, 108, 100, 0, 97, 115, 109, 13, 0, 1, 0, 7, 171, 3, 1, 65, 2, 1, 66, 30, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 1, 4, 102, 101, 108, 116, 1, 0, 5, 4, 0, 20, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 1, 28, 4, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 11, 16, 1, 0, 10, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 3, 0, 0, 7, 142, 9, 1, 65, 15, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 66, 47, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 64, 0, 0, 9, 4, 0, 6, 103, 101, 116, 45, 105, 100, 1, 22, 1, 64, 0, 0, 11, 4, 0, 9, 103, 101, 116, 45, 110, 111, 110, 99, 101, 1, 23, 1, 64, 0, 0, 13, 4, 0, 16, 103, 101, 116, 45, 105, 110, 105, 116, 105, 97, 108, 45, 104, 97, 115, 104, 1, 24, 4, 0, 16, 103, 101, 116, 45, 99, 117, 114, 114, 101, 110, 116, 45, 104, 97, 115, 104, 1, 24, 1, 64, 1, 5, 118, 97, 108, 117, 101, 1, 1, 0, 4, 0, 10, 105, 110, 99, 114, 45, 110, 111, 110, 99, 101, 1, 25, 1, 64, 1, 5, 105, 110, 100, 101, 120, 1, 0, 15, 4, 0, 8, 103, 101, 116, 45, 105, 116, 101, 109, 1, 26, 1, 111, 2, 17, 15, 1, 64, 2, 5, 105, 110, 100, 101, 120, 1, 5, 118, 97, 108, 117, 101, 15, 0, 27, 4, 0, 8, 115, 101, 116, 45, 105, 116, 101, 109, 1, 28, 1, 64, 1, 9, 99, 111, 100, 101, 45, 114, 111, 111, 116, 19, 1, 0, 4, 0, 8, 115, 101, 116, 45, 99, 111, 100, 101, 1, 29, 1, 64, 1, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 9, 0, 1, 4, 0, 11, 103, 101, 116, 45, 98, 97, 108, 97, 110, 99, 101, 1, 30, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 127, 4, 0, 22, 104, 97, 115, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 31, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 3, 4, 0, 9, 97, 100, 100, 45, 97, 115, 115, 101, 116, 1, 32, 4, 0, 12, 114, 101, 109, 111, 118, 101, 45, 97, 115, 115, 101, 116, 1, 32, 1, 64, 0, 0, 21, 4, 0, 20, 103, 101, 116, 45, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 33, 4, 1, 24, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 97, 99, 99, 111, 117, 110, 116, 64, 49, 46, 48, 46, 48, 5, 12, 11, 13, 1, 0, 7, 97, 99, 99, 111, 117, 110, 116, 3, 2, 0, 7, 244, 6, 1, 65, 15, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 66, 30, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 112, 1, 1, 64, 0, 0, 22, 4, 0, 10, 103, 101, 116, 45, 105, 110, 112, 117, 116, 115, 1, 23, 1, 112, 3, 1, 64, 0, 0, 24, 4, 0, 10, 103, 101, 116, 45, 97, 115, 115, 101, 116, 115, 1, 25, 1, 64, 0, 0, 9, 4, 0, 10, 103, 101, 116, 45, 115, 101, 110, 100, 101, 114, 1, 26, 4, 1, 21, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 110, 111, 116, 101, 64, 49, 46, 48, 46, 48, 5, 12, 11, 10, 1, 0, 4, 110, 111, 116, 101, 3, 4, 0, 7, 160, 8, 1, 65, 18, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 7, 110, 111, 116, 101, 45, 105, 100, 1, 66, 37, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 12, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 13, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 2, 3, 2, 1, 14, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 0, 0, 1, 4, 0, 16, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 110, 117, 109, 98, 101, 114, 1, 28, 1, 64, 0, 0, 23, 4, 0, 14, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 1, 29, 1, 64, 0, 0, 25, 4, 0, 20, 103, 101, 116, 45, 105, 110, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 4, 0, 21, 103, 101, 116, 45, 111, 117, 116, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 1, 64, 3, 5, 97, 115, 115, 101, 116, 3, 3, 116, 97, 103, 5, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 7, 0, 27, 4, 0, 11, 99, 114, 101, 97, 116, 101, 45, 110, 111, 116, 101, 1, 31, 4, 1, 19, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 120, 64, 49, 46, 48, 46, 48, 5, 15, 11, 8, 1, 0, 2, 116, 120, 3, 6, 0, 7, 173, 8, 1, 65, 17, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 1, 66, 34, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 12, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 13, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 1, 64, 2, 9, 102, 97, 117, 99, 101, 116, 45, 105, 100, 9, 6, 97, 109, 111, 117, 110, 116, 1, 0, 3, 4, 0, 20, 98, 117, 105, 108, 100, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 26, 1, 64, 1, 6, 97, 109, 111, 117, 110, 116, 1, 0, 3, 4, 0, 21, 99, 114, 101, 97, 116, 101, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 27, 1, 64, 2, 9, 102, 97, 117, 99, 101, 116, 45, 105, 100, 9, 9, 100, 97, 116, 97, 45, 104, 97, 115, 104, 25, 0, 3, 4, 0, 24, 98, 117, 105, 108, 100, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 28, 1, 64, 1, 9, 100, 97, 116, 97, 45, 104, 97, 115, 104, 25, 0, 3, 4, 0, 25, 99, 114, 101, 97, 116, 101, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 29, 4, 1, 22, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 97, 115, 115, 101, 116, 64, 49, 46, 48, 46, 48, 5, 14, 11, 11, 1, 0, 5, 97, 115, 115, 101, 116, 3, 8, 0, 7, 170, 7, 1, 65, 17, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 1, 66, 31, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 12, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 13, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 3, 4, 0, 4, 109, 105, 110, 116, 1, 26, 4, 0, 4, 98, 117, 114, 110, 1, 26, 1, 64, 0, 0, 1, 4, 0, 18, 103, 101, 116, 45, 116, 111, 116, 97, 108, 45, 105, 115, 115, 117, 97, 110, 99, 101, 1, 27, 4, 1, 23, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 102, 97, 117, 99, 101, 116, 64, 49, 46, 48, 46, 48, 5, 14, 11, 12, 1, 0, 6, 102, 97, 117, 99, 101, 116, 3, 10, 0, 7, 210, 5, 1, 65, 8, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 66, 18, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 4, 119, 111, 114, 100, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 6, 1, 114, 2, 5, 97, 115, 115, 101, 116, 3, 6, 97, 109, 111, 117, 110, 116, 119, 4, 0, 14, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 5, 4, 0, 18, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 113, 2, 8, 102, 117, 110, 103, 105, 98, 108, 101, 1, 9, 0, 12, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 1, 11, 0, 4, 0, 5, 97, 115, 115, 101, 116, 3, 0, 12, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 7, 0, 13, 4, 0, 15, 102, 114, 111, 109, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 14, 1, 64, 1, 5, 97, 115, 115, 101, 116, 13, 0, 7, 4, 0, 13, 116, 111, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 15, 4, 1, 22, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 5, 11, 11, 1, 0, 5, 116, 121, 112, 101, 115, 3, 12, 0, 7, 60, 1, 65, 2, 1, 66, 2, 1, 64, 0, 1, 0, 4, 0, 11, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 1, 0, 4, 1, 28, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 64, 49, 46, 48, 46, 48, 5, 0, 11, 17, 1, 0, 11, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 3, 14, 0, 7, 153, 6, 1, 65, 2, 1, 65, 8, 1, 66, 30, 1, 114, 1, 5, 105, 110, 110, 101, 114, 117, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 1, 4, 102, 101, 108, 116, 1, 0, 5, 4, 0, 20, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 1, 28, 4, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 66, 18, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 4, 119, 111, 114, 100, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 6, 1, 114, 2, 5, 97, 115, 115, 101, 116, 3, 6, 97, 109, 111, 117, 110, 116, 119, 4, 0, 14, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 5, 4, 0, 18, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 113, 2, 8, 102, 117, 110, 103, 105, 98, 108, 101, 1, 9, 0, 12, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 1, 11, 0, 4, 0, 5, 97, 115, 115, 101, 116, 3, 0, 12, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 7, 0, 13, 4, 0, 15, 102, 114, 111, 109, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 14, 1, 64, 1, 5, 97, 115, 115, 101, 116, 13, 0, 7, 4, 0, 13, 116, 111, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 15, 4, 1, 22, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 5, 4, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 98, 97, 115, 101, 45, 119, 111, 114, 108, 100, 64, 49, 46, 48, 46, 48, 4, 0, 11, 16, 1, 0, 10, 98, 97, 115, 101, 45, 119, 111, 114, 108, 100, 3, 16, 0, 0, 130, 73, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 34, 105, 110, 116, 101, 114, 102, 97, 99, 101, 115, 34, 58, 123, 34, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 84, 121, 112, 101, 115, 32, 116, 111, 32, 98, 101, 32, 117, 115, 101, 100, 32, 105, 110, 32, 116, 120, 45, 107, 101, 114, 110, 101, 108, 32, 105, 110, 116, 101, 114, 102, 97, 99, 101, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 34, 58, 34, 67, 114, 101, 97, 116, 101, 115, 32, 97, 32, 110, 101, 119, 32, 97, 99, 99, 111, 117, 110, 116, 32, 73, 68, 32, 102, 114, 111, 109, 32, 97, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 46, 34, 125, 44, 34, 116, 121, 112, 101, 115, 34, 58, 123, 34, 102, 101, 108, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 82, 101, 112, 114, 101, 115, 101, 110, 116, 115, 32, 98, 97, 115, 101, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 32, 105, 110, 32, 116, 104, 101, 32, 102, 105, 101, 108, 100, 32, 117, 115, 105, 110, 103, 32, 77, 111, 110, 116, 103, 111, 109, 101, 114, 121, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46, 92, 110, 73, 110, 116, 101, 114, 110, 97, 108, 32, 118, 97, 108, 117, 101, 115, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 32, 120, 32, 42, 32, 82, 32, 109, 111, 100, 32, 77, 32, 119, 104, 101, 114, 101, 32, 82, 32, 61, 32, 50, 94, 54, 52, 32, 109, 111, 100, 32, 77, 32, 97, 110, 100, 32, 120, 32, 105, 110, 32, 91, 48, 44, 32, 77, 41, 46, 92, 110, 84, 104, 101, 32, 98, 97, 99, 107, 105, 110, 103, 32, 116, 121, 112, 101, 32, 105, 115, 32, 96, 102, 54, 52, 96, 32, 98, 117, 116, 32, 116, 104, 101, 32, 105, 110, 116, 101, 114, 110, 97, 108, 32, 118, 97, 108, 117, 101, 115, 32, 97, 114, 101, 32, 97, 108, 119, 97, 121, 115, 32, 105, 110, 116, 101, 103, 101, 114, 32, 105, 110, 32, 116, 104, 101, 32, 114, 97, 110, 103, 101, 32, 91, 48, 44, 32, 77, 41, 46, 92, 110, 70, 105, 101, 108, 100, 32, 109, 111, 100, 117, 108, 117, 115, 32, 77, 32, 61, 32, 50, 94, 54, 52, 32, 45, 32, 50, 94, 51, 50, 32, 43, 32, 49, 34, 44, 34, 105, 116, 101, 109, 115, 34, 58, 123, 34, 105, 110, 110, 101, 114, 34, 58, 34, 87, 101, 32, 117, 115, 101, 32, 102, 54, 52, 32, 97, 115, 32, 116, 104, 101, 32, 98, 97, 99, 107, 105, 110, 103, 32, 116, 121, 112, 101, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 46, 32, 73, 116, 32, 104, 97, 115, 32, 116, 104, 101, 32, 115, 105, 122, 101, 32, 116, 104, 97, 116, 32, 119, 101, 32, 110, 101, 101, 100, 32, 97, 110, 100, 92, 110, 119, 101, 32, 100, 111, 110, 39, 116, 32, 112, 108, 97, 110, 32, 116, 111, 32, 115, 117, 112, 112, 111, 114, 116, 32, 102, 108, 111, 97, 116, 105, 110, 103, 32, 112, 111, 105, 110, 116, 32, 97, 114, 105, 116, 104, 109, 101, 116, 105, 99, 32, 105, 110, 32, 112, 114, 111, 103, 114, 97, 109, 115, 32, 102, 111, 114, 32, 77, 105, 100, 101, 110, 32, 86, 77, 46, 34, 125, 125, 44, 34, 119, 111, 114, 100, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 103, 114, 111, 117, 112, 32, 111, 102, 32, 102, 111, 117, 114, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 115, 32, 105, 110, 32, 116, 104, 101, 32, 77, 105, 100, 101, 110, 32, 98, 97, 115, 101, 32, 102, 105, 101, 108, 100, 46, 34, 125, 44, 34, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 85, 110, 105, 113, 117, 101, 32, 105, 100, 101, 110, 116, 105, 102, 105, 101, 114, 32, 111, 102, 32, 97, 110, 32, 97, 99, 99, 111, 117, 110, 116, 46, 92, 110, 92, 110, 65, 99, 99, 111, 117, 110, 116, 32, 73, 68, 32, 99, 111, 110, 115, 105, 115, 116, 115, 32, 111, 102, 32, 49, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 32, 40, 126, 54, 52, 32, 98, 105, 116, 115, 41, 46, 32, 84, 104, 105, 115, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 32, 117, 110, 105, 113, 117, 101, 108, 121, 32, 105, 100, 101, 110, 116, 105, 102, 105, 101, 115, 32, 97, 92, 110, 115, 105, 110, 103, 108, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 97, 110, 100, 32, 97, 108, 115, 111, 32, 115, 112, 101, 99, 105, 102, 105, 101, 115, 32, 116, 104, 101, 32, 116, 121, 112, 101, 32, 111, 102, 32, 116, 104, 101, 32, 117, 110, 100, 101, 114, 108, 121, 105, 110, 103, 32, 97, 99, 99, 111, 117, 110, 116, 46, 32, 83, 112, 101, 99, 105, 102, 105, 99, 97, 108, 108, 121, 58, 92, 110, 45, 32, 84, 104, 101, 32, 116, 119, 111, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 115, 32, 111, 102, 32, 116, 104, 101, 32, 73, 68, 32, 115, 112, 101, 99, 105, 102, 121, 32, 116, 104, 101, 32, 116, 121, 112, 101, 32, 111, 102, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 58, 92, 110, 45, 32, 48, 48, 32, 45, 32, 114, 101, 103, 117, 108, 97, 114, 32, 97, 99, 99, 111, 117, 110, 116, 32, 119, 105, 116, 104, 32, 117, 112, 100, 97, 116, 97, 98, 108, 101, 32, 99, 111, 100, 101, 46, 92, 110, 45, 32, 48, 49, 32, 45, 32, 114, 101, 103, 117, 108, 97, 114, 32, 97, 99, 99, 111, 117, 110, 116, 32, 119, 105, 116, 104, 32, 105, 109, 109, 117, 116, 97, 98, 108, 101, 32, 99, 111, 100, 101, 46, 92, 110, 45, 32, 49, 48, 32, 45, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 97, 117, 99, 101, 116, 32, 119, 105, 116, 104, 32, 105, 109, 109, 117, 116, 97, 98, 108, 101, 32, 99, 111, 100, 101, 46, 92, 110, 45, 32, 49, 49, 32, 45, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 97, 117, 99, 101, 116, 32, 119, 105, 116, 104, 32, 105, 109, 109, 117, 116, 97, 98, 108, 101, 32, 99, 111, 100, 101, 46, 92, 110, 45, 32, 84, 104, 101, 32, 116, 104, 105, 114, 100, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 32, 111, 102, 32, 116, 104, 101, 32, 73, 68, 32, 115, 112, 101, 99, 105, 102, 105, 101, 115, 32, 119, 104, 101, 116, 104, 101, 114, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 100, 97, 116, 97, 32, 105, 115, 32, 115, 116, 111, 114, 101, 100, 32, 111, 110, 45, 99, 104, 97, 105, 110, 58, 92, 110, 45, 32, 48, 32, 45, 32, 102, 117, 108, 108, 32, 97, 99, 99, 111, 117, 110, 116, 32, 100, 97, 116, 97, 32, 105, 115, 32, 115, 116, 111, 114, 101, 100, 32, 111, 110, 45, 99, 104, 97, 105, 110, 46, 92, 110, 45, 32, 49, 32, 45, 32, 111, 110, 108, 121, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 104, 97, 115, 104, 32, 105, 115, 32, 115, 116, 111, 114, 101, 100, 32, 111, 110, 45, 99, 104, 97, 105, 110, 32, 119, 104, 105, 99, 104, 32, 115, 101, 114, 118, 101, 115, 32, 97, 115, 32, 97, 32, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 32, 116, 111, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 115, 116, 97, 116, 101, 46, 92, 110, 65, 115, 32, 115, 117, 99, 104, 32, 116, 104, 101, 32, 116, 104, 114, 101, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 115, 32, 102, 117, 108, 108, 121, 32, 100, 101, 115, 99, 114, 105, 98, 101, 115, 32, 116, 104, 101, 32, 116, 121, 112, 101, 32, 111, 102, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 46, 34, 125, 44, 34, 114, 101, 99, 105, 112, 105, 101, 110, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 82, 101, 99, 105, 112, 105, 101, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 116, 101, 44, 32, 105, 46, 101, 46, 44, 32, 104, 97, 115, 104, 40, 104, 97, 115, 104, 40, 104, 97, 115, 104, 40, 115, 101, 114, 105, 97, 108, 95, 110, 117, 109, 44, 32, 91, 48, 59, 32, 52, 93, 41, 44, 32, 110, 111, 116, 101, 95, 115, 99, 114, 105, 112, 116, 95, 104, 97, 115, 104, 41, 44, 32, 105, 110, 112, 117, 116, 95, 104, 97, 115, 104, 41, 34, 125, 44, 34, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 111, 114, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 92, 110, 92, 110, 65, 108, 108, 32, 97, 115, 115, 101, 116, 115, 32, 97, 114, 101, 32, 101, 110, 99, 111, 100, 101, 100, 32, 117, 115, 105, 110, 103, 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 119, 111, 114, 100, 32, 40, 52, 32, 101, 108, 101, 109, 101, 110, 116, 115, 41, 32, 115, 117, 99, 104, 32, 116, 104, 97, 116, 32, 105, 116, 32, 105, 115, 32, 101, 97, 115, 121, 32, 116, 111, 32, 100, 101, 116, 101, 114, 109, 105, 110, 101, 32, 116, 104, 101, 92, 110, 116, 121, 112, 101, 32, 111, 102, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 98, 111, 116, 104, 32, 105, 110, 115, 105, 100, 101, 32, 97, 110, 100, 32, 111, 117, 116, 115, 105, 100, 101, 32, 77, 105, 100, 101, 110, 32, 86, 77, 46, 32, 83, 112, 101, 99, 105, 102, 105, 99, 97, 108, 108, 121, 58, 92, 110, 69, 108, 101, 109, 101, 110, 116, 32, 49, 32, 119, 105, 108, 108, 32, 98, 101, 58, 92, 110, 45, 32, 90, 69, 82, 79, 32, 102, 111, 114, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 92, 110, 45, 32, 110, 111, 110, 45, 90, 69, 82, 79, 32, 102, 111, 114, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 92, 110, 84, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 32, 119, 105, 108, 108, 32, 98, 101, 58, 92, 110, 45, 32, 79, 78, 69, 32, 102, 111, 114, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 92, 110, 45, 32, 90, 69, 82, 79, 32, 102, 111, 114, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 92, 110, 92, 110, 84, 104, 101, 32, 97, 98, 111, 118, 101, 32, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 32, 116, 104, 97, 116, 32, 116, 104, 101, 114, 101, 32, 99, 97, 110, 32, 110, 101, 118, 101, 114, 32, 98, 101, 32, 97, 32, 99, 111, 108, 108, 105, 115, 105, 111, 110, 32, 98, 101, 116, 119, 101, 101, 110, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 110, 100, 32, 97, 92, 110, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 92, 110, 92, 110, 84, 104, 101, 32, 109, 101, 116, 104, 111, 100, 111, 108, 111, 103, 121, 32, 102, 111, 114, 32, 99, 111, 110, 115, 116, 114, 117, 99, 116, 105, 110, 103, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 110, 100, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 32, 105, 115, 32, 100, 101, 115, 99, 114, 105, 98, 101, 100, 32, 98, 101, 108, 111, 119, 46, 92, 110, 92, 110, 35, 32, 70, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 92, 110, 84, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 101, 108, 101, 109, 101, 110, 116, 32, 111, 102, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 115, 101, 116, 32, 116, 111, 32, 116, 104, 101, 32, 73, 68, 32, 111, 102, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 119, 104, 105, 99, 104, 32, 105, 115, 115, 117, 101, 100, 92, 110, 116, 104, 101, 32, 97, 115, 115, 101, 116, 46, 32, 84, 104, 105, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 115, 32, 116, 104, 101, 32, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 32, 100, 101, 115, 99, 114, 105, 98, 101, 100, 32, 97, 98, 111, 118, 101, 32, 40, 116, 104, 101, 32, 102, 105, 114, 115, 116, 32, 98, 105, 116, 32, 105, 115, 32, 79, 78, 69, 41, 46, 92, 110, 92, 110, 84, 104, 101, 32, 108, 101, 97, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 101, 108, 101, 109, 101, 110, 116, 32, 105, 115, 32, 115, 101, 116, 32, 116, 111, 32, 116, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 46, 32, 84, 104, 105, 115, 32, 97, 109, 111, 117, 110, 116, 32, 99, 97, 110, 110, 111, 116, 32, 98, 101, 32, 103, 114, 101, 97, 116, 101, 114, 92, 110, 116, 104, 97, 110, 32, 50, 94, 54, 51, 32, 45, 32, 49, 32, 97, 110, 100, 32, 116, 104, 117, 115, 32, 114, 101, 113, 117, 105, 114, 101, 115, 32, 54, 51, 45, 98, 105, 116, 115, 32, 116, 111, 32, 115, 116, 111, 114, 101, 46, 92, 110, 92, 110, 69, 108, 101, 109, 101, 110, 116, 115, 32, 49, 32, 97, 110, 100, 32, 50, 32, 97, 114, 101, 32, 115, 101, 116, 32, 116, 111, 32, 90, 69, 82, 79, 46, 92, 110, 92, 110, 73, 116, 32, 105, 115, 32, 105, 109, 112, 111, 115, 115, 105, 98, 108, 101, 32, 116, 111, 32, 102, 105, 110, 100, 32, 97, 32, 99, 111, 108, 108, 105, 115, 105, 111, 110, 32, 98, 101, 116, 119, 101, 101, 110, 32, 116, 119, 111, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 32, 105, 115, 115, 117, 101, 100, 32, 98, 121, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 32, 102, 97, 117, 99, 101, 116, 115, 32, 97, 115, 92, 110, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 105, 115, 32, 105, 110, 99, 108, 117, 100, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 111, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 97, 110, 100, 32, 116, 104, 105, 115, 32, 105, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 100, 32, 116, 111, 32, 98, 101, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 92, 110, 102, 111, 114, 32, 101, 97, 99, 104, 32, 102, 97, 117, 99, 101, 116, 32, 97, 115, 32, 112, 101, 114, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 99, 114, 101, 97, 116, 105, 111, 110, 32, 108, 111, 103, 105, 99, 46, 92, 110, 92, 110, 35, 32, 78, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 92, 110, 84, 104, 101, 32, 52, 32, 101, 108, 101, 109, 101, 110, 116, 115, 32, 111, 102, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 32, 97, 114, 101, 32, 99, 111, 109, 112, 117, 116, 101, 100, 32, 97, 115, 32, 102, 111, 108, 108, 111, 119, 115, 58, 92, 110, 45, 32, 70, 105, 114, 115, 116, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 100, 97, 116, 97, 32, 105, 115, 32, 104, 97, 115, 104, 101, 100, 46, 32, 84, 104, 105, 115, 32, 99, 111, 109, 112, 114, 101, 115, 115, 101, 115, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 111, 102, 32, 97, 110, 32, 97, 114, 98, 105, 116, 114, 97, 114, 121, 32, 108, 101, 110, 103, 116, 104, 32, 116, 111, 32, 52, 32, 102, 105, 101, 108, 100, 92, 110, 101, 108, 101, 109, 101, 110, 116, 115, 58, 32, 91, 100, 48, 44, 32, 100, 49, 44, 32, 100, 50, 44, 32, 100, 51, 93, 46, 92, 110, 45, 32, 100, 49, 32, 105, 115, 32, 116, 104, 101, 110, 32, 114, 101, 112, 108, 97, 99, 101, 100, 32, 119, 105, 116, 104, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 119, 104, 105, 99, 104, 32, 105, 115, 115, 117, 101, 115, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 58, 32, 91, 100, 48, 44, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 44, 32, 100, 50, 44, 32, 100, 51, 93, 46, 92, 110, 45, 32, 76, 97, 115, 116, 108, 121, 44, 32, 116, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 32, 111, 102, 32, 100, 51, 32, 105, 115, 32, 115, 101, 116, 32, 116, 111, 32, 90, 69, 82, 79, 46, 92, 110, 92, 110, 73, 116, 32, 105, 115, 32, 105, 109, 112, 111, 115, 115, 105, 98, 108, 101, 32, 116, 111, 32, 102, 105, 110, 100, 32, 97, 32, 99, 111, 108, 108, 105, 115, 105, 111, 110, 32, 98, 101, 116, 119, 101, 101, 110, 32, 116, 119, 111, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 32, 105, 115, 115, 117, 101, 100, 32, 98, 121, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 32, 102, 97, 117, 99, 101, 116, 115, 92, 110, 97, 115, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 105, 115, 32, 105, 110, 99, 108, 117, 100, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 97, 110, 100, 32, 116, 104, 105, 115, 32, 105, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 100, 92, 110, 116, 111, 32, 98, 101, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 32, 97, 115, 32, 112, 101, 114, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 99, 114, 101, 97, 116, 105, 111, 110, 32, 108, 111, 103, 105, 99, 46, 32, 67, 111, 108, 108, 105, 115, 105, 111, 110, 32, 114, 101, 115, 105, 115, 116, 97, 110, 99, 101, 32, 102, 111, 114, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 92, 110, 105, 115, 115, 117, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 115, 97, 109, 101, 32, 102, 97, 117, 99, 101, 116, 32, 105, 115, 32, 126, 50, 94, 57, 53, 46, 34, 125, 44, 34, 110, 111, 110, 99, 101, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 32, 110, 111, 110, 99, 101, 34, 125, 44, 34, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 32, 104, 97, 115, 104, 34, 125, 44, 34, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 66, 108, 111, 99, 107, 32, 104, 97, 115, 104, 34, 125, 44, 34, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 83, 116, 111, 114, 97, 103, 101, 32, 118, 97, 108, 117, 101, 34, 125, 44, 34, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 32, 115, 116, 111, 114, 97, 103, 101, 32, 114, 111, 111, 116, 34, 125, 44, 34, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 32, 99, 111, 100, 101, 32, 114, 111, 111, 116, 34, 125, 44, 34, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 67, 111, 109, 109, 105, 116, 109, 101, 110, 116, 32, 116, 111, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 118, 97, 117, 108, 116, 34, 125, 44, 34, 110, 111, 116, 101, 45, 105, 100, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 110, 32, 105, 100, 32, 111, 102, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 110, 111, 116, 101, 34, 125, 125, 125, 44, 34, 97, 99, 99, 111, 117, 110, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 103, 101, 116, 45, 105, 100, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 105, 100, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 105, 110, 103, 32, 97, 99, 99, 111, 117, 110, 116, 34, 44, 34, 103, 101, 116, 45, 110, 111, 110, 99, 101, 34, 58, 34, 82, 101, 116, 117, 114, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 110, 111, 110, 99, 101, 34, 44, 34, 103, 101, 116, 45, 105, 110, 105, 116, 105, 97, 108, 45, 104, 97, 115, 104, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 105, 110, 105, 116, 105, 97, 108, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 105, 110, 103, 32, 97, 99, 99, 111, 117, 110, 116, 34, 44, 34, 103, 101, 116, 45, 99, 117, 114, 114, 101, 110, 116, 45, 104, 97, 115, 104, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 100, 97, 116, 97, 32, 115, 116, 111, 114, 101, 100, 32, 105, 110, 32, 109, 101, 109, 111, 114, 121, 34, 44, 34, 105, 110, 99, 114, 45, 110, 111, 110, 99, 101, 34, 58, 34, 73, 110, 99, 114, 101, 109, 101, 110, 116, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 110, 111, 110, 99, 101, 32, 98, 121, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 118, 97, 108, 117, 101, 46, 92, 110, 118, 97, 108, 117, 101, 32, 99, 97, 110, 32, 98, 101, 32, 97, 116, 32, 109, 111, 115, 116, 32, 50, 94, 51, 50, 32, 45, 32, 49, 32, 111, 116, 104, 101, 114, 119, 105, 115, 101, 32, 116, 104, 105, 115, 32, 112, 114, 111, 99, 101, 100, 117, 114, 101, 32, 112, 97, 110, 105, 99, 115, 34, 44, 34, 103, 101, 116, 45, 105, 116, 101, 109, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 107, 101, 121, 32, 105, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 115, 116, 111, 114, 97, 103, 101, 34, 44, 34, 115, 101, 116, 45, 105, 116, 101, 109, 34, 58, 34, 83, 101, 116, 32, 116, 104, 101, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 107, 101, 121, 32, 105, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 115, 116, 111, 114, 97, 103, 101, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 111, 108, 100, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 116, 104, 101, 32, 107, 101, 121, 32, 97, 110, 100, 32, 116, 104, 101, 32, 110, 101, 119, 32, 115, 116, 111, 114, 97, 103, 101, 32, 114, 111, 111, 116, 34, 44, 34, 115, 101, 116, 45, 99, 111, 100, 101, 34, 58, 34, 83, 101, 116, 115, 32, 116, 104, 101, 32, 99, 111, 100, 101, 32, 111, 102, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 84, 104, 105, 115, 32, 112, 114, 111, 99, 101, 100, 117, 114, 101, 32, 99, 97, 110, 32, 111, 110, 108, 121, 32, 98, 101, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 111, 110, 32, 114, 101, 103, 117, 108, 97, 114, 32, 97, 99, 99, 111, 117, 110, 116, 115, 32, 119, 105, 116, 104, 32, 117, 112, 100, 97, 116, 97, 98, 108, 101, 92, 110, 99, 111, 100, 101, 46, 32, 79, 116, 104, 101, 114, 119, 105, 115, 101, 44, 32, 116, 104, 105, 115, 32, 112, 114, 111, 99, 101, 100, 117, 114, 101, 32, 102, 97, 105, 108, 115, 46, 32, 99, 111, 100, 101, 32, 105, 115, 32, 116, 104, 101, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 99, 111, 100, 101, 92, 110, 116, 111, 32, 115, 101, 116, 46, 34, 44, 34, 103, 101, 116, 45, 98, 97, 108, 97, 110, 99, 101, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 98, 97, 108, 97, 110, 99, 101, 32, 111, 102, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 97, 115, 115, 111, 99, 105, 97, 116, 101, 100, 32, 119, 105, 116, 104, 32, 97, 32, 97, 99, 99, 111, 117, 110, 116, 95, 105, 100, 46, 92, 110, 80, 97, 110, 105, 99, 115, 32, 105, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 110, 111, 116, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 32, 97, 99, 99, 111, 117, 110, 116, 95, 105, 100, 32, 105, 115, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 105, 100, 92, 110, 111, 102, 32, 116, 104, 101, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 111, 102, 32, 105, 110, 116, 101, 114, 101, 115, 116, 46, 32, 98, 97, 108, 97, 110, 99, 101, 32, 105, 115, 32, 116, 104, 101, 32, 118, 97, 117, 108, 116, 32, 98, 97, 108, 97, 110, 99, 101, 32, 111, 102, 32, 116, 104, 101, 92, 110, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 104, 97, 115, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 97, 32, 98, 111, 111, 108, 101, 97, 110, 32, 105, 110, 100, 105, 99, 97, 116, 105, 110, 103, 32, 119, 104, 101, 116, 104, 101, 114, 32, 116, 104, 101, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 112, 114, 101, 115, 101, 110, 116, 92, 110, 105, 110, 32, 116, 104, 101, 32, 118, 97, 117, 108, 116, 46, 32, 80, 97, 110, 105, 99, 115, 32, 105, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 116, 104, 101, 92, 110, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 111, 102, 32, 105, 110, 116, 101, 114, 101, 115, 116, 46, 32, 104, 97, 115, 95, 97, 115, 115, 101, 116, 32, 105, 115, 32, 97, 32, 98, 111, 111, 108, 101, 97, 110, 32, 105, 110, 100, 105, 99, 97, 116, 105, 110, 103, 92, 110, 119, 104, 101, 116, 104, 101, 114, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 118, 97, 117, 108, 116, 32, 104, 97, 115, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 111, 102, 32, 105, 110, 116, 101, 114, 101, 115, 116, 46, 34, 44, 34, 97, 100, 100, 45, 97, 115, 115, 101, 116, 34, 58, 34, 65, 100, 100, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 116, 104, 101, 32, 118, 97, 117, 108, 116, 46, 32, 80, 97, 110, 105, 99, 115, 32, 117, 110, 100, 101, 114, 32, 118, 97, 114, 105, 111, 117, 115, 32, 99, 111, 110, 100, 105, 116, 105, 111, 110, 115, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 102, 105, 110, 97, 108, 32, 97, 115, 115, 101, 116, 32, 105, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 118, 97, 117, 108, 116, 32, 100, 101, 102, 105, 110, 101, 100, 32, 97, 115, 32, 102, 111, 108, 108, 111, 119, 115, 58, 32, 73, 102, 32, 97, 115, 115, 101, 116, 32, 105, 115, 92, 110, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 44, 32, 116, 104, 101, 110, 32, 114, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 115, 97, 109, 101, 32, 97, 115, 32, 97, 115, 115, 101, 116, 46, 32, 73, 102, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 97, 92, 110, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 44, 32, 116, 104, 101, 110, 32, 114, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 116, 111, 116, 97, 108, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 105, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 92, 110, 118, 97, 117, 108, 116, 32, 97, 102, 116, 101, 114, 32, 97, 115, 115, 101, 116, 32, 119, 97, 115, 32, 97, 100, 100, 101, 100, 32, 116, 111, 32, 105, 116, 46, 34, 44, 34, 114, 101, 109, 111, 118, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 82, 101, 109, 111, 118, 101, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 97, 115, 115, 101, 116, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 118, 97, 117, 108, 116, 34, 44, 34, 103, 101, 116, 45, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 32, 116, 111, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 118, 97, 117, 108, 116, 46, 34, 125, 125, 44, 34, 110, 111, 116, 101, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 78, 111, 116, 101, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 103, 101, 116, 45, 105, 110, 112, 117, 116, 115, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 105, 110, 112, 117, 116, 115, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 110, 111, 116, 101, 34, 44, 34, 103, 101, 116, 45, 97, 115, 115, 101, 116, 115, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 115, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 105, 110, 103, 32, 110, 111, 116, 101, 34, 44, 34, 103, 101, 116, 45, 115, 101, 110, 100, 101, 114, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 115, 101, 110, 100, 101, 114, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 105, 110, 103, 32, 110, 111, 116, 101, 34, 125, 125, 44, 34, 116, 120, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 110, 117, 109, 98, 101, 114, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 98, 108, 111, 99, 107, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 116, 104, 101, 32, 108, 97, 115, 116, 32, 107, 110, 111, 119, 110, 32, 98, 108, 111, 99, 107, 32, 97, 116, 32, 116, 104, 101, 32, 116, 105, 109, 101, 32, 111, 102, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 101, 120, 101, 99, 117, 116, 105, 111, 110, 46, 34, 44, 34, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 98, 108, 111, 99, 107, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 108, 97, 115, 116, 32, 107, 110, 111, 119, 110, 32, 98, 108, 111, 99, 107, 32, 97, 116, 32, 116, 104, 101, 32, 116, 105, 109, 101, 32, 111, 102, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 101, 120, 101, 99, 117, 116, 105, 111, 110, 46, 34, 44, 34, 103, 101, 116, 45, 105, 110, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 105, 110, 112, 117, 116, 32, 110, 111, 116, 101, 115, 32, 104, 97, 115, 104, 46, 32, 84, 104, 105, 115, 32, 105, 115, 32, 99, 111, 109, 112, 117, 116, 101, 100, 32, 97, 115, 32, 97, 32, 115, 101, 113, 117, 101, 110, 116, 105, 97, 108, 32, 104, 97, 115, 104, 32, 111, 102, 92, 110, 40, 110, 117, 108, 108, 105, 102, 105, 101, 114, 44, 32, 115, 99, 114, 105, 112, 116, 95, 114, 111, 111, 116, 41, 32, 116, 117, 112, 108, 101, 115, 32, 111, 118, 101, 114, 32, 97, 108, 108, 32, 105, 110, 112, 117, 116, 32, 110, 111, 116, 101, 115, 46, 34, 44, 34, 103, 101, 116, 45, 111, 117, 116, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 111, 117, 116, 112, 117, 116, 32, 110, 111, 116, 101, 115, 32, 104, 97, 115, 104, 46, 32, 84, 104, 105, 115, 32, 105, 115, 32, 99, 111, 109, 112, 117, 116, 101, 100, 32, 97, 115, 32, 97, 32, 115, 101, 113, 117, 101, 110, 116, 105, 97, 108, 32, 104, 97, 115, 104, 32, 111, 102, 92, 110, 40, 110, 111, 116, 101, 95, 104, 97, 115, 104, 44, 32, 110, 111, 116, 101, 95, 109, 101, 116, 97, 100, 97, 116, 97, 41, 32, 116, 117, 112, 108, 101, 115, 32, 111, 118, 101, 114, 32, 97, 108, 108, 32, 111, 117, 116, 112, 117, 116, 32, 110, 111, 116, 101, 115, 46, 34, 44, 34, 99, 114, 101, 97, 116, 101, 45, 110, 111, 116, 101, 34, 58, 34, 67, 114, 101, 97, 116, 101, 115, 32, 97, 32, 110, 101, 119, 32, 110, 111, 116, 101, 46, 92, 110, 97, 115, 115, 101, 116, 32, 105, 115, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 98, 101, 32, 105, 110, 99, 108, 117, 100, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 110, 111, 116, 101, 46, 92, 110, 116, 97, 103, 32, 105, 115, 32, 116, 104, 101, 32, 116, 97, 103, 32, 116, 111, 32, 98, 101, 32, 105, 110, 99, 108, 117, 100, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 110, 111, 116, 101, 46, 92, 110, 114, 101, 99, 105, 112, 105, 101, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 114, 101, 99, 105, 112, 105, 101, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 116, 101, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 105, 100, 32, 111, 102, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 110, 111, 116, 101, 46, 34, 125, 125, 44, 34, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 115, 115, 101, 116, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 46, 32, 84, 104, 101, 115, 101, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 32, 99, 97, 110, 32, 111, 110, 108, 121, 32, 98, 101, 32, 99, 97, 108, 108, 101, 100, 32, 98, 121, 32, 102, 97, 117, 99, 101, 116, 32, 97, 99, 99, 111, 117, 110, 116, 115, 46, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 98, 117, 105, 108, 100, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 66, 117, 105, 108, 100, 115, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 102, 97, 117, 99, 101, 116, 32, 97, 110, 100, 32, 97, 109, 111, 117, 110, 116, 46, 92, 110, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 105, 115, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 46, 92, 110, 97, 109, 111, 117, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 99, 114, 101, 97, 116, 101, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 67, 114, 101, 97, 116, 101, 115, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 92, 110, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 97, 109, 111, 117, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 98, 117, 105, 108, 100, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 66, 117, 105, 108, 100, 115, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 102, 97, 117, 99, 101, 116, 32, 97, 110, 100, 92, 110, 100, 97, 116, 97, 45, 104, 97, 115, 104, 46, 92, 110, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 105, 115, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 46, 92, 110, 100, 97, 116, 97, 45, 104, 97, 115, 104, 32, 105, 115, 32, 116, 104, 101, 32, 100, 97, 116, 97, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 98, 117, 105, 108, 100, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 99, 114, 101, 97, 116, 101, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 67, 114, 101, 97, 116, 101, 115, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 100, 97, 116, 97, 45, 104, 97, 115, 104, 32, 105, 115, 32, 116, 104, 101, 32, 100, 97, 116, 97, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 125, 125, 44, 34, 102, 97, 117, 99, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 70, 97, 117, 99, 101, 116, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 46, 32, 84, 104, 101, 115, 101, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 32, 99, 97, 110, 32, 111, 110, 108, 121, 32, 98, 101, 32, 99, 97, 108, 108, 101, 100, 32, 98, 121, 32, 102, 97, 117, 99, 101, 116, 32, 97, 99, 99, 111, 117, 110, 116, 115, 46, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 109, 105, 110, 116, 34, 58, 34, 77, 105, 110, 116, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 109, 105, 110, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 98, 117, 114, 110, 34, 58, 34, 66, 117, 114, 110, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 98, 117, 114, 110, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 103, 101, 116, 45, 116, 111, 116, 97, 108, 45, 105, 115, 115, 117, 97, 110, 99, 101, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 116, 111, 116, 97, 108, 32, 105, 115, 115, 117, 97, 110, 99, 101, 32, 111, 102, 32, 116, 104, 101, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 92, 110, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 32, 80, 97, 110, 105, 99, 115, 32, 105, 102, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 110, 111, 116, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 92, 110, 97, 103, 97, 105, 110, 115, 116, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 102, 97, 117, 99, 101, 116, 46, 34, 125, 125, 44, 34, 116, 121, 112, 101, 115, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 72, 105, 103, 104, 45, 108, 101, 118, 101, 108, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 32, 111, 102, 32, 99, 111, 114, 101, 32, 116, 121, 112, 101, 115, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 102, 114, 111, 109, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 67, 111, 110, 118, 101, 114, 116, 115, 32, 97, 32, 99, 111, 114, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 97, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46, 34, 44, 34, 116, 111, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 67, 111, 110, 118, 101, 114, 116, 115, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 97, 32, 99, 111, 114, 101, 32, 97, 115, 115, 101, 116, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46, 34, 125, 44, 34, 116, 121, 112, 101, 115, 34, 58, 123, 34, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 34, 44, 34, 105, 116, 101, 109, 115, 34, 58, 123, 34, 97, 115, 115, 101, 116, 34, 58, 34, 70, 97, 117, 99, 101, 116, 32, 73, 68, 32, 111, 102, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 119, 104, 105, 99, 104, 32, 105, 115, 115, 117, 101, 100, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 97, 115, 32, 119, 101, 108, 108, 32, 97, 115, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 97, 109, 111, 117, 110, 116, 46, 34, 44, 34, 97, 109, 111, 117, 110, 116, 34, 58, 34, 65, 115, 115, 101, 116, 32, 97, 109, 111, 117, 110, 116, 32, 105, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 100, 32, 116, 111, 32, 98, 101, 32, 50, 94, 54, 51, 32, 45, 32, 49, 32, 111, 114, 32, 115, 109, 97, 108, 108, 101, 114, 46, 34, 125, 125, 44, 34, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 32, 116, 111, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 92, 110, 92, 110, 65, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 99, 111, 110, 115, 105, 115, 116, 115, 32, 111, 102, 32, 52, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 115, 32, 119, 104, 105, 99, 104, 32, 97, 114, 101, 32, 99, 111, 109, 112, 117, 116, 101, 100, 32, 98, 121, 32, 104, 97, 115, 104, 105, 110, 103, 32, 97, 115, 115, 101, 116, 32, 100, 97, 116, 97, 92, 110, 40, 119, 104, 105, 99, 104, 32, 99, 97, 110, 32, 98, 101, 32, 111, 102, 32, 97, 114, 98, 105, 116, 114, 97, 114, 121, 32, 108, 101, 110, 103, 116, 104, 41, 32, 116, 111, 32, 112, 114, 111, 100, 117, 99, 101, 58, 32, 91, 100, 48, 44, 32, 100, 49, 44, 32, 100, 50, 44, 32, 100, 51, 93, 46, 32, 32, 87, 101, 32, 116, 104, 101, 110, 32, 114, 101, 112, 108, 97, 99, 101, 32, 100, 49, 32, 119, 105, 116, 104, 32, 116, 104, 101, 92, 110, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 116, 104, 97, 116, 32, 105, 115, 115, 117, 101, 100, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 58, 32, 91, 100, 48, 44, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 44, 32, 100, 50, 44, 32, 100, 51, 93, 46, 32, 87, 101, 32, 116, 104, 101, 110, 32, 115, 101, 116, 32, 116, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 92, 110, 111, 102, 32, 116, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 101, 108, 101, 109, 101, 110, 116, 32, 116, 111, 32, 90, 69, 82, 79, 46, 34, 125, 44, 34, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 111, 114, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 34, 125, 125, 125, 44, 34, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 78, 111, 116, 101, 32, 115, 99, 114, 105, 112, 116, 32, 105, 110, 116, 101, 114, 102, 97, 99, 101, 32, 116, 104, 97, 116, 32, 105, 115, 32, 101, 120, 112, 101, 99, 116, 101, 100, 32, 116, 111, 32, 98, 101, 32, 105, 109, 112, 108, 101, 109, 101, 110, 116, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 110, 111, 116, 101, 32, 115, 99, 114, 105, 112, 116, 46, 34, 125, 125, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 16742] = [3, 0, 10, 98, 97, 115, 101, 45, 119, 111, 114, 108, 100, 0, 97, 115, 109, 13, 0, 1, 0, 7, 171, 3, 1, 65, 2, 1, 66, 30, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 1, 4, 102, 101, 108, 116, 1, 0, 5, 4, 0, 20, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 1, 28, 4, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 11, 16, 1, 0, 10, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 3, 0, 0, 7, 142, 9, 1, 65, 15, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 66, 47, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 64, 0, 0, 9, 4, 0, 6, 103, 101, 116, 45, 105, 100, 1, 22, 1, 64, 0, 0, 11, 4, 0, 9, 103, 101, 116, 45, 110, 111, 110, 99, 101, 1, 23, 1, 64, 0, 0, 13, 4, 0, 16, 103, 101, 116, 45, 105, 110, 105, 116, 105, 97, 108, 45, 104, 97, 115, 104, 1, 24, 4, 0, 16, 103, 101, 116, 45, 99, 117, 114, 114, 101, 110, 116, 45, 104, 97, 115, 104, 1, 24, 1, 64, 1, 5, 118, 97, 108, 117, 101, 1, 1, 0, 4, 0, 10, 105, 110, 99, 114, 45, 110, 111, 110, 99, 101, 1, 25, 1, 64, 1, 5, 105, 110, 100, 101, 120, 1, 0, 15, 4, 0, 8, 103, 101, 116, 45, 105, 116, 101, 109, 1, 26, 1, 111, 2, 17, 15, 1, 64, 2, 5, 105, 110, 100, 101, 120, 1, 5, 118, 97, 108, 117, 101, 15, 0, 27, 4, 0, 8, 115, 101, 116, 45, 105, 116, 101, 109, 1, 28, 1, 64, 1, 9, 99, 111, 100, 101, 45, 114, 111, 111, 116, 19, 1, 0, 4, 0, 8, 115, 101, 116, 45, 99, 111, 100, 101, 1, 29, 1, 64, 1, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 9, 0, 1, 4, 0, 11, 103, 101, 116, 45, 98, 97, 108, 97, 110, 99, 101, 1, 30, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 127, 4, 0, 22, 104, 97, 115, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 31, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 3, 4, 0, 9, 97, 100, 100, 45, 97, 115, 115, 101, 116, 1, 32, 4, 0, 12, 114, 101, 109, 111, 118, 101, 45, 97, 115, 115, 101, 116, 1, 32, 1, 64, 0, 0, 21, 4, 0, 20, 103, 101, 116, 45, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 33, 4, 1, 24, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 97, 99, 99, 111, 117, 110, 116, 64, 49, 46, 48, 46, 48, 5, 12, 11, 13, 1, 0, 7, 97, 99, 99, 111, 117, 110, 116, 3, 2, 0, 7, 244, 6, 1, 65, 15, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 1, 66, 30, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 1, 112, 1, 1, 64, 0, 0, 22, 4, 0, 10, 103, 101, 116, 45, 105, 110, 112, 117, 116, 115, 1, 23, 1, 112, 3, 1, 64, 0, 0, 24, 4, 0, 10, 103, 101, 116, 45, 97, 115, 115, 101, 116, 115, 1, 25, 1, 64, 0, 0, 9, 4, 0, 10, 103, 101, 116, 45, 115, 101, 110, 100, 101, 114, 1, 26, 4, 1, 21, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 110, 111, 116, 101, 64, 49, 46, 48, 46, 48, 5, 12, 11, 10, 1, 0, 4, 110, 111, 116, 101, 3, 4, 0, 7, 160, 8, 1, 65, 18, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 7, 110, 111, 116, 101, 45, 105, 100, 1, 66, 37, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 12, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 13, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 2, 3, 2, 1, 14, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 0, 0, 1, 4, 0, 16, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 110, 117, 109, 98, 101, 114, 1, 28, 1, 64, 0, 0, 23, 4, 0, 14, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 1, 29, 1, 64, 0, 0, 25, 4, 0, 20, 103, 101, 116, 45, 105, 110, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 4, 0, 21, 103, 101, 116, 45, 111, 117, 116, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 1, 30, 1, 64, 3, 5, 97, 115, 115, 101, 116, 3, 3, 116, 97, 103, 5, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 7, 0, 27, 4, 0, 11, 99, 114, 101, 97, 116, 101, 45, 110, 111, 116, 101, 1, 31, 4, 1, 19, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 120, 64, 49, 46, 48, 46, 48, 5, 15, 11, 8, 1, 0, 2, 116, 120, 3, 6, 0, 7, 173, 8, 1, 65, 17, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 1, 66, 34, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 12, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 13, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 1, 64, 2, 9, 102, 97, 117, 99, 101, 116, 45, 105, 100, 9, 6, 97, 109, 111, 117, 110, 116, 1, 0, 3, 4, 0, 20, 98, 117, 105, 108, 100, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 26, 1, 64, 1, 6, 97, 109, 111, 117, 110, 116, 1, 0, 3, 4, 0, 21, 99, 114, 101, 97, 116, 101, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 27, 1, 64, 2, 9, 102, 97, 117, 99, 101, 116, 45, 105, 100, 9, 9, 100, 97, 116, 97, 45, 104, 97, 115, 104, 25, 0, 3, 4, 0, 24, 98, 117, 105, 108, 100, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 28, 1, 64, 1, 9, 100, 97, 116, 97, 45, 104, 97, 115, 104, 25, 0, 3, 4, 0, 25, 99, 114, 101, 97, 116, 101, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 1, 29, 4, 1, 22, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 97, 115, 115, 101, 116, 64, 49, 46, 48, 46, 48, 5, 14, 11, 11, 1, 0, 5, 97, 115, 115, 101, 116, 3, 8, 0, 7, 170, 7, 1, 65, 17, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 2, 3, 0, 0, 3, 116, 97, 103, 2, 3, 0, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 5, 110, 111, 110, 99, 101, 2, 3, 0, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 2, 3, 0, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 2, 3, 0, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 2, 3, 0, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 2, 3, 0, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 2, 3, 0, 0, 4, 119, 111, 114, 100, 1, 66, 31, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 3, 116, 97, 103, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 2, 3, 2, 1, 5, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 8, 2, 3, 2, 1, 6, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 10, 2, 3, 2, 1, 7, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 12, 2, 3, 2, 1, 8, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 14, 2, 3, 2, 1, 9, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 16, 2, 3, 2, 1, 10, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 18, 2, 3, 2, 1, 11, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 20, 2, 3, 2, 1, 12, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 22, 2, 3, 2, 1, 13, 4, 0, 4, 119, 111, 114, 100, 3, 0, 24, 1, 64, 1, 5, 97, 115, 115, 101, 116, 3, 0, 3, 4, 0, 4, 109, 105, 110, 116, 1, 26, 4, 0, 4, 98, 117, 114, 110, 1, 26, 1, 64, 0, 0, 1, 4, 0, 18, 103, 101, 116, 45, 116, 111, 116, 97, 108, 45, 105, 115, 115, 117, 97, 110, 99, 101, 1, 27, 4, 1, 23, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 102, 97, 117, 99, 101, 116, 64, 49, 46, 48, 46, 48, 5, 14, 11, 12, 1, 0, 6, 102, 97, 117, 99, 101, 116, 3, 10, 0, 7, 210, 5, 1, 65, 8, 1, 66, 28, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 3, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 66, 18, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 4, 119, 111, 114, 100, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 6, 1, 114, 2, 5, 97, 115, 115, 101, 116, 3, 6, 97, 109, 111, 117, 110, 116, 119, 4, 0, 14, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 5, 4, 0, 18, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 113, 2, 8, 102, 117, 110, 103, 105, 98, 108, 101, 1, 9, 0, 12, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 1, 11, 0, 4, 0, 5, 97, 115, 115, 101, 116, 3, 0, 12, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 7, 0, 13, 4, 0, 15, 102, 114, 111, 109, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 14, 1, 64, 1, 5, 97, 115, 115, 101, 116, 13, 0, 7, 4, 0, 13, 116, 111, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 15, 4, 1, 22, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 5, 11, 11, 1, 0, 5, 116, 121, 112, 101, 115, 3, 12, 0, 7, 60, 1, 65, 2, 1, 66, 2, 1, 64, 0, 1, 0, 4, 0, 11, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 1, 0, 4, 1, 28, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 64, 49, 46, 48, 46, 48, 5, 0, 11, 17, 1, 0, 11, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 3, 14, 0, 7, 153, 6, 1, 65, 2, 1, 65, 8, 1, 66, 30, 1, 114, 1, 5, 105, 110, 110, 101, 114, 119, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 1, 111, 4, 1, 1, 1, 1, 4, 0, 4, 119, 111, 114, 100, 3, 0, 2, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 4, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 9, 114, 101, 99, 105, 112, 105, 101, 110, 116, 3, 0, 6, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 3, 116, 97, 103, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 5, 110, 111, 110, 99, 101, 3, 0, 12, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 3, 0, 14, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 10, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 3, 0, 16, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 13, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 3, 0, 18, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 12, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 3, 0, 20, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 17, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 3, 0, 22, 1, 114, 1, 5, 105, 110, 110, 101, 114, 3, 4, 0, 16, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 3, 0, 24, 1, 114, 1, 5, 105, 110, 110, 101, 114, 1, 4, 0, 7, 110, 111, 116, 101, 45, 105, 100, 3, 0, 26, 1, 64, 1, 4, 102, 101, 108, 116, 1, 0, 5, 4, 0, 20, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 1, 28, 4, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 0, 2, 3, 0, 0, 4, 102, 101, 108, 116, 2, 3, 0, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 2, 3, 0, 0, 4, 119, 111, 114, 100, 2, 3, 0, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 66, 18, 2, 3, 2, 1, 1, 4, 0, 4, 102, 101, 108, 116, 3, 0, 0, 2, 3, 2, 1, 2, 4, 0, 10, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 3, 0, 2, 2, 3, 2, 1, 3, 4, 0, 4, 119, 111, 114, 100, 3, 0, 4, 2, 3, 2, 1, 4, 4, 0, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 3, 0, 6, 1, 114, 2, 5, 97, 115, 115, 101, 116, 3, 6, 97, 109, 111, 117, 110, 116, 119, 4, 0, 14, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 3, 0, 8, 1, 114, 1, 5, 105, 110, 110, 101, 114, 5, 4, 0, 18, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 3, 0, 10, 1, 113, 2, 8, 102, 117, 110, 103, 105, 98, 108, 101, 1, 9, 0, 12, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 1, 11, 0, 4, 0, 5, 97, 115, 115, 101, 116, 3, 0, 12, 1, 64, 1, 10, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 7, 0, 13, 4, 0, 15, 102, 114, 111, 109, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 14, 1, 64, 1, 5, 97, 115, 115, 101, 116, 13, 0, 7, 4, 0, 13, 116, 111, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 1, 15, 4, 1, 22, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 5, 5, 4, 1, 27, 109, 105, 100, 101, 110, 58, 98, 97, 115, 101, 47, 98, 97, 115, 101, 45, 119, 111, 114, 108, 100, 64, 49, 46, 48, 46, 48, 4, 0, 11, 16, 1, 0, 10, 98, 97, 115, 101, 45, 119, 111, 114, 108, 100, 3, 16, 0, 0, 157, 73, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 34, 105, 110, 116, 101, 114, 102, 97, 99, 101, 115, 34, 58, 123, 34, 99, 111, 114, 101, 45, 116, 121, 112, 101, 115, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 84, 121, 112, 101, 115, 32, 116, 111, 32, 98, 101, 32, 117, 115, 101, 100, 32, 105, 110, 32, 116, 120, 45, 107, 101, 114, 110, 101, 108, 32, 105, 110, 116, 101, 114, 102, 97, 99, 101, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 45, 102, 114, 111, 109, 45, 102, 101, 108, 116, 34, 58, 34, 67, 114, 101, 97, 116, 101, 115, 32, 97, 32, 110, 101, 119, 32, 97, 99, 99, 111, 117, 110, 116, 32, 73, 68, 32, 102, 114, 111, 109, 32, 97, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 46, 34, 125, 44, 34, 116, 121, 112, 101, 115, 34, 58, 123, 34, 102, 101, 108, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 82, 101, 112, 114, 101, 115, 101, 110, 116, 115, 32, 98, 97, 115, 101, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 32, 105, 110, 32, 116, 104, 101, 32, 102, 105, 101, 108, 100, 32, 117, 115, 105, 110, 103, 32, 77, 111, 110, 116, 103, 111, 109, 101, 114, 121, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46, 92, 110, 73, 110, 116, 101, 114, 110, 97, 108, 32, 118, 97, 108, 117, 101, 115, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 32, 120, 32, 42, 32, 82, 32, 109, 111, 100, 32, 77, 32, 119, 104, 101, 114, 101, 32, 82, 32, 61, 32, 50, 94, 54, 52, 32, 109, 111, 100, 32, 77, 32, 97, 110, 100, 32, 120, 32, 105, 110, 32, 91, 48, 44, 32, 77, 41, 46, 92, 110, 84, 104, 101, 32, 98, 97, 99, 107, 105, 110, 103, 32, 116, 121, 112, 101, 32, 105, 115, 32, 96, 102, 54, 52, 96, 32, 98, 117, 116, 32, 116, 104, 101, 32, 105, 110, 116, 101, 114, 110, 97, 108, 32, 118, 97, 108, 117, 101, 115, 32, 97, 114, 101, 32, 97, 108, 119, 97, 121, 115, 32, 105, 110, 116, 101, 103, 101, 114, 32, 105, 110, 32, 116, 104, 101, 32, 114, 97, 110, 103, 101, 32, 91, 48, 44, 32, 77, 41, 46, 92, 110, 70, 105, 101, 108, 100, 32, 109, 111, 100, 117, 108, 117, 115, 32, 77, 32, 61, 32, 50, 94, 54, 52, 32, 45, 32, 50, 94, 51, 50, 32, 43, 32, 49, 34, 44, 34, 105, 116, 101, 109, 115, 34, 58, 123, 34, 105, 110, 110, 101, 114, 34, 58, 34, 87, 101, 32, 112, 108, 97, 110, 32, 116, 111, 32, 117, 115, 101, 32, 102, 54, 52, 32, 97, 115, 32, 116, 104, 101, 32, 98, 97, 99, 107, 105, 110, 103, 32, 116, 121, 112, 101, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 46, 32, 73, 116, 32, 104, 97, 115, 32, 116, 104, 101, 32, 115, 105, 122, 101, 32, 116, 104, 97, 116, 32, 119, 101, 32, 110, 101, 101, 100, 32, 97, 110, 100, 92, 110, 119, 101, 32, 100, 111, 110, 39, 116, 32, 112, 108, 97, 110, 32, 116, 111, 32, 115, 117, 112, 112, 111, 114, 116, 32, 102, 108, 111, 97, 116, 105, 110, 103, 32, 112, 111, 105, 110, 116, 32, 97, 114, 105, 116, 104, 109, 101, 116, 105, 99, 32, 105, 110, 32, 112, 114, 111, 103, 114, 97, 109, 115, 32, 102, 111, 114, 32, 77, 105, 100, 101, 110, 32, 86, 77, 46, 92, 110, 92, 110, 70, 111, 114, 32, 110, 111, 119, 32, 105, 116, 115, 32, 117, 54, 52, 34, 125, 125, 44, 34, 119, 111, 114, 100, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 103, 114, 111, 117, 112, 32, 111, 102, 32, 102, 111, 117, 114, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 115, 32, 105, 110, 32, 116, 104, 101, 32, 77, 105, 100, 101, 110, 32, 98, 97, 115, 101, 32, 102, 105, 101, 108, 100, 46, 34, 125, 44, 34, 97, 99, 99, 111, 117, 110, 116, 45, 105, 100, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 85, 110, 105, 113, 117, 101, 32, 105, 100, 101, 110, 116, 105, 102, 105, 101, 114, 32, 111, 102, 32, 97, 110, 32, 97, 99, 99, 111, 117, 110, 116, 46, 92, 110, 92, 110, 65, 99, 99, 111, 117, 110, 116, 32, 73, 68, 32, 99, 111, 110, 115, 105, 115, 116, 115, 32, 111, 102, 32, 49, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 32, 40, 126, 54, 52, 32, 98, 105, 116, 115, 41, 46, 32, 84, 104, 105, 115, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 32, 117, 110, 105, 113, 117, 101, 108, 121, 32, 105, 100, 101, 110, 116, 105, 102, 105, 101, 115, 32, 97, 92, 110, 115, 105, 110, 103, 108, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 97, 110, 100, 32, 97, 108, 115, 111, 32, 115, 112, 101, 99, 105, 102, 105, 101, 115, 32, 116, 104, 101, 32, 116, 121, 112, 101, 32, 111, 102, 32, 116, 104, 101, 32, 117, 110, 100, 101, 114, 108, 121, 105, 110, 103, 32, 97, 99, 99, 111, 117, 110, 116, 46, 32, 83, 112, 101, 99, 105, 102, 105, 99, 97, 108, 108, 121, 58, 92, 110, 45, 32, 84, 104, 101, 32, 116, 119, 111, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 115, 32, 111, 102, 32, 116, 104, 101, 32, 73, 68, 32, 115, 112, 101, 99, 105, 102, 121, 32, 116, 104, 101, 32, 116, 121, 112, 101, 32, 111, 102, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 58, 92, 110, 45, 32, 48, 48, 32, 45, 32, 114, 101, 103, 117, 108, 97, 114, 32, 97, 99, 99, 111, 117, 110, 116, 32, 119, 105, 116, 104, 32, 117, 112, 100, 97, 116, 97, 98, 108, 101, 32, 99, 111, 100, 101, 46, 92, 110, 45, 32, 48, 49, 32, 45, 32, 114, 101, 103, 117, 108, 97, 114, 32, 97, 99, 99, 111, 117, 110, 116, 32, 119, 105, 116, 104, 32, 105, 109, 109, 117, 116, 97, 98, 108, 101, 32, 99, 111, 100, 101, 46, 92, 110, 45, 32, 49, 48, 32, 45, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 97, 117, 99, 101, 116, 32, 119, 105, 116, 104, 32, 105, 109, 109, 117, 116, 97, 98, 108, 101, 32, 99, 111, 100, 101, 46, 92, 110, 45, 32, 49, 49, 32, 45, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 97, 117, 99, 101, 116, 32, 119, 105, 116, 104, 32, 105, 109, 109, 117, 116, 97, 98, 108, 101, 32, 99, 111, 100, 101, 46, 92, 110, 45, 32, 84, 104, 101, 32, 116, 104, 105, 114, 100, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 32, 111, 102, 32, 116, 104, 101, 32, 73, 68, 32, 115, 112, 101, 99, 105, 102, 105, 101, 115, 32, 119, 104, 101, 116, 104, 101, 114, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 100, 97, 116, 97, 32, 105, 115, 32, 115, 116, 111, 114, 101, 100, 32, 111, 110, 45, 99, 104, 97, 105, 110, 58, 92, 110, 45, 32, 48, 32, 45, 32, 102, 117, 108, 108, 32, 97, 99, 99, 111, 117, 110, 116, 32, 100, 97, 116, 97, 32, 105, 115, 32, 115, 116, 111, 114, 101, 100, 32, 111, 110, 45, 99, 104, 97, 105, 110, 46, 92, 110, 45, 32, 49, 32, 45, 32, 111, 110, 108, 121, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 104, 97, 115, 104, 32, 105, 115, 32, 115, 116, 111, 114, 101, 100, 32, 111, 110, 45, 99, 104, 97, 105, 110, 32, 119, 104, 105, 99, 104, 32, 115, 101, 114, 118, 101, 115, 32, 97, 115, 32, 97, 32, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 32, 116, 111, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 115, 116, 97, 116, 101, 46, 92, 110, 65, 115, 32, 115, 117, 99, 104, 32, 116, 104, 101, 32, 116, 104, 114, 101, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 115, 32, 102, 117, 108, 108, 121, 32, 100, 101, 115, 99, 114, 105, 98, 101, 115, 32, 116, 104, 101, 32, 116, 121, 112, 101, 32, 111, 102, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 46, 34, 125, 44, 34, 114, 101, 99, 105, 112, 105, 101, 110, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 82, 101, 99, 105, 112, 105, 101, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 116, 101, 44, 32, 105, 46, 101, 46, 44, 32, 104, 97, 115, 104, 40, 104, 97, 115, 104, 40, 104, 97, 115, 104, 40, 115, 101, 114, 105, 97, 108, 95, 110, 117, 109, 44, 32, 91, 48, 59, 32, 52, 93, 41, 44, 32, 110, 111, 116, 101, 95, 115, 99, 114, 105, 112, 116, 95, 104, 97, 115, 104, 41, 44, 32, 105, 110, 112, 117, 116, 95, 104, 97, 115, 104, 41, 34, 125, 44, 34, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 111, 114, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 92, 110, 92, 110, 65, 108, 108, 32, 97, 115, 115, 101, 116, 115, 32, 97, 114, 101, 32, 101, 110, 99, 111, 100, 101, 100, 32, 117, 115, 105, 110, 103, 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 119, 111, 114, 100, 32, 40, 52, 32, 101, 108, 101, 109, 101, 110, 116, 115, 41, 32, 115, 117, 99, 104, 32, 116, 104, 97, 116, 32, 105, 116, 32, 105, 115, 32, 101, 97, 115, 121, 32, 116, 111, 32, 100, 101, 116, 101, 114, 109, 105, 110, 101, 32, 116, 104, 101, 92, 110, 116, 121, 112, 101, 32, 111, 102, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 98, 111, 116, 104, 32, 105, 110, 115, 105, 100, 101, 32, 97, 110, 100, 32, 111, 117, 116, 115, 105, 100, 101, 32, 77, 105, 100, 101, 110, 32, 86, 77, 46, 32, 83, 112, 101, 99, 105, 102, 105, 99, 97, 108, 108, 121, 58, 92, 110, 69, 108, 101, 109, 101, 110, 116, 32, 49, 32, 119, 105, 108, 108, 32, 98, 101, 58, 92, 110, 45, 32, 90, 69, 82, 79, 32, 102, 111, 114, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 92, 110, 45, 32, 110, 111, 110, 45, 90, 69, 82, 79, 32, 102, 111, 114, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 92, 110, 84, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 32, 119, 105, 108, 108, 32, 98, 101, 58, 92, 110, 45, 32, 79, 78, 69, 32, 102, 111, 114, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 92, 110, 45, 32, 90, 69, 82, 79, 32, 102, 111, 114, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 92, 110, 92, 110, 84, 104, 101, 32, 97, 98, 111, 118, 101, 32, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 32, 116, 104, 97, 116, 32, 116, 104, 101, 114, 101, 32, 99, 97, 110, 32, 110, 101, 118, 101, 114, 32, 98, 101, 32, 97, 32, 99, 111, 108, 108, 105, 115, 105, 111, 110, 32, 98, 101, 116, 119, 101, 101, 110, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 110, 100, 32, 97, 92, 110, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 92, 110, 92, 110, 84, 104, 101, 32, 109, 101, 116, 104, 111, 100, 111, 108, 111, 103, 121, 32, 102, 111, 114, 32, 99, 111, 110, 115, 116, 114, 117, 99, 116, 105, 110, 103, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 110, 100, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 32, 105, 115, 32, 100, 101, 115, 99, 114, 105, 98, 101, 100, 32, 98, 101, 108, 111, 119, 46, 92, 110, 92, 110, 35, 32, 70, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 92, 110, 84, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 101, 108, 101, 109, 101, 110, 116, 32, 111, 102, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 115, 101, 116, 32, 116, 111, 32, 116, 104, 101, 32, 73, 68, 32, 111, 102, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 119, 104, 105, 99, 104, 32, 105, 115, 115, 117, 101, 100, 92, 110, 116, 104, 101, 32, 97, 115, 115, 101, 116, 46, 32, 84, 104, 105, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 115, 32, 116, 104, 101, 32, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 32, 100, 101, 115, 99, 114, 105, 98, 101, 100, 32, 97, 98, 111, 118, 101, 32, 40, 116, 104, 101, 32, 102, 105, 114, 115, 116, 32, 98, 105, 116, 32, 105, 115, 32, 79, 78, 69, 41, 46, 92, 110, 92, 110, 84, 104, 101, 32, 108, 101, 97, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 101, 108, 101, 109, 101, 110, 116, 32, 105, 115, 32, 115, 101, 116, 32, 116, 111, 32, 116, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 46, 32, 84, 104, 105, 115, 32, 97, 109, 111, 117, 110, 116, 32, 99, 97, 110, 110, 111, 116, 32, 98, 101, 32, 103, 114, 101, 97, 116, 101, 114, 92, 110, 116, 104, 97, 110, 32, 50, 94, 54, 51, 32, 45, 32, 49, 32, 97, 110, 100, 32, 116, 104, 117, 115, 32, 114, 101, 113, 117, 105, 114, 101, 115, 32, 54, 51, 45, 98, 105, 116, 115, 32, 116, 111, 32, 115, 116, 111, 114, 101, 46, 92, 110, 92, 110, 69, 108, 101, 109, 101, 110, 116, 115, 32, 49, 32, 97, 110, 100, 32, 50, 32, 97, 114, 101, 32, 115, 101, 116, 32, 116, 111, 32, 90, 69, 82, 79, 46, 92, 110, 92, 110, 73, 116, 32, 105, 115, 32, 105, 109, 112, 111, 115, 115, 105, 98, 108, 101, 32, 116, 111, 32, 102, 105, 110, 100, 32, 97, 32, 99, 111, 108, 108, 105, 115, 105, 111, 110, 32, 98, 101, 116, 119, 101, 101, 110, 32, 116, 119, 111, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 32, 105, 115, 115, 117, 101, 100, 32, 98, 121, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 32, 102, 97, 117, 99, 101, 116, 115, 32, 97, 115, 92, 110, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 105, 115, 32, 105, 110, 99, 108, 117, 100, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 111, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 97, 110, 100, 32, 116, 104, 105, 115, 32, 105, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 100, 32, 116, 111, 32, 98, 101, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 92, 110, 102, 111, 114, 32, 101, 97, 99, 104, 32, 102, 97, 117, 99, 101, 116, 32, 97, 115, 32, 112, 101, 114, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 99, 114, 101, 97, 116, 105, 111, 110, 32, 108, 111, 103, 105, 99, 46, 92, 110, 92, 110, 35, 32, 78, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 92, 110, 84, 104, 101, 32, 52, 32, 101, 108, 101, 109, 101, 110, 116, 115, 32, 111, 102, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 32, 97, 114, 101, 32, 99, 111, 109, 112, 117, 116, 101, 100, 32, 97, 115, 32, 102, 111, 108, 108, 111, 119, 115, 58, 92, 110, 45, 32, 70, 105, 114, 115, 116, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 100, 97, 116, 97, 32, 105, 115, 32, 104, 97, 115, 104, 101, 100, 46, 32, 84, 104, 105, 115, 32, 99, 111, 109, 112, 114, 101, 115, 115, 101, 115, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 111, 102, 32, 97, 110, 32, 97, 114, 98, 105, 116, 114, 97, 114, 121, 32, 108, 101, 110, 103, 116, 104, 32, 116, 111, 32, 52, 32, 102, 105, 101, 108, 100, 92, 110, 101, 108, 101, 109, 101, 110, 116, 115, 58, 32, 91, 100, 48, 44, 32, 100, 49, 44, 32, 100, 50, 44, 32, 100, 51, 93, 46, 92, 110, 45, 32, 100, 49, 32, 105, 115, 32, 116, 104, 101, 110, 32, 114, 101, 112, 108, 97, 99, 101, 100, 32, 119, 105, 116, 104, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 119, 104, 105, 99, 104, 32, 105, 115, 115, 117, 101, 115, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 58, 32, 91, 100, 48, 44, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 44, 32, 100, 50, 44, 32, 100, 51, 93, 46, 92, 110, 45, 32, 76, 97, 115, 116, 108, 121, 44, 32, 116, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 32, 111, 102, 32, 100, 51, 32, 105, 115, 32, 115, 101, 116, 32, 116, 111, 32, 90, 69, 82, 79, 46, 92, 110, 92, 110, 73, 116, 32, 105, 115, 32, 105, 109, 112, 111, 115, 115, 105, 98, 108, 101, 32, 116, 111, 32, 102, 105, 110, 100, 32, 97, 32, 99, 111, 108, 108, 105, 115, 105, 111, 110, 32, 98, 101, 116, 119, 101, 101, 110, 32, 116, 119, 111, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 32, 105, 115, 115, 117, 101, 100, 32, 98, 121, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 32, 102, 97, 117, 99, 101, 116, 115, 92, 110, 97, 115, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 105, 115, 32, 105, 110, 99, 108, 117, 100, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 97, 110, 100, 32, 116, 104, 105, 115, 32, 105, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 100, 92, 110, 116, 111, 32, 98, 101, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 32, 97, 115, 32, 112, 101, 114, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 99, 114, 101, 97, 116, 105, 111, 110, 32, 108, 111, 103, 105, 99, 46, 32, 67, 111, 108, 108, 105, 115, 105, 111, 110, 32, 114, 101, 115, 105, 115, 116, 97, 110, 99, 101, 32, 102, 111, 114, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 115, 92, 110, 105, 115, 115, 117, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 115, 97, 109, 101, 32, 102, 97, 117, 99, 101, 116, 32, 105, 115, 32, 126, 50, 94, 57, 53, 46, 34, 125, 44, 34, 110, 111, 110, 99, 101, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 32, 110, 111, 110, 99, 101, 34, 125, 44, 34, 97, 99, 99, 111, 117, 110, 116, 45, 104, 97, 115, 104, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 32, 104, 97, 115, 104, 34, 125, 44, 34, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 66, 108, 111, 99, 107, 32, 104, 97, 115, 104, 34, 125, 44, 34, 115, 116, 111, 114, 97, 103, 101, 45, 118, 97, 108, 117, 101, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 83, 116, 111, 114, 97, 103, 101, 32, 118, 97, 108, 117, 101, 34, 125, 44, 34, 115, 116, 111, 114, 97, 103, 101, 45, 114, 111, 111, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 32, 115, 116, 111, 114, 97, 103, 101, 32, 114, 111, 111, 116, 34, 125, 44, 34, 97, 99, 99, 111, 117, 110, 116, 45, 99, 111, 100, 101, 45, 114, 111, 111, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 32, 99, 111, 100, 101, 32, 114, 111, 111, 116, 34, 125, 44, 34, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 67, 111, 109, 109, 105, 116, 109, 101, 110, 116, 32, 116, 111, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 118, 97, 117, 108, 116, 34, 125, 44, 34, 110, 111, 116, 101, 45, 105, 100, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 110, 32, 105, 100, 32, 111, 102, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 110, 111, 116, 101, 34, 125, 125, 125, 44, 34, 97, 99, 99, 111, 117, 110, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 99, 99, 111, 117, 110, 116, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 103, 101, 116, 45, 105, 100, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 105, 100, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 105, 110, 103, 32, 97, 99, 99, 111, 117, 110, 116, 34, 44, 34, 103, 101, 116, 45, 110, 111, 110, 99, 101, 34, 58, 34, 82, 101, 116, 117, 114, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 110, 111, 110, 99, 101, 34, 44, 34, 103, 101, 116, 45, 105, 110, 105, 116, 105, 97, 108, 45, 104, 97, 115, 104, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 105, 110, 105, 116, 105, 97, 108, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 105, 110, 103, 32, 97, 99, 99, 111, 117, 110, 116, 34, 44, 34, 103, 101, 116, 45, 99, 117, 114, 114, 101, 110, 116, 45, 104, 97, 115, 104, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 100, 97, 116, 97, 32, 115, 116, 111, 114, 101, 100, 32, 105, 110, 32, 109, 101, 109, 111, 114, 121, 34, 44, 34, 105, 110, 99, 114, 45, 110, 111, 110, 99, 101, 34, 58, 34, 73, 110, 99, 114, 101, 109, 101, 110, 116, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 110, 111, 110, 99, 101, 32, 98, 121, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 118, 97, 108, 117, 101, 46, 92, 110, 118, 97, 108, 117, 101, 32, 99, 97, 110, 32, 98, 101, 32, 97, 116, 32, 109, 111, 115, 116, 32, 50, 94, 51, 50, 32, 45, 32, 49, 32, 111, 116, 104, 101, 114, 119, 105, 115, 101, 32, 116, 104, 105, 115, 32, 112, 114, 111, 99, 101, 100, 117, 114, 101, 32, 112, 97, 110, 105, 99, 115, 34, 44, 34, 103, 101, 116, 45, 105, 116, 101, 109, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 107, 101, 121, 32, 105, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 115, 116, 111, 114, 97, 103, 101, 34, 44, 34, 115, 101, 116, 45, 105, 116, 101, 109, 34, 58, 34, 83, 101, 116, 32, 116, 104, 101, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 107, 101, 121, 32, 105, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 115, 116, 111, 114, 97, 103, 101, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 111, 108, 100, 32, 118, 97, 108, 117, 101, 32, 111, 102, 32, 116, 104, 101, 32, 107, 101, 121, 32, 97, 110, 100, 32, 116, 104, 101, 32, 110, 101, 119, 32, 115, 116, 111, 114, 97, 103, 101, 32, 114, 111, 111, 116, 34, 44, 34, 115, 101, 116, 45, 99, 111, 100, 101, 34, 58, 34, 83, 101, 116, 115, 32, 116, 104, 101, 32, 99, 111, 100, 101, 32, 111, 102, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 84, 104, 105, 115, 32, 112, 114, 111, 99, 101, 100, 117, 114, 101, 32, 99, 97, 110, 32, 111, 110, 108, 121, 32, 98, 101, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 111, 110, 32, 114, 101, 103, 117, 108, 97, 114, 32, 97, 99, 99, 111, 117, 110, 116, 115, 32, 119, 105, 116, 104, 32, 117, 112, 100, 97, 116, 97, 98, 108, 101, 92, 110, 99, 111, 100, 101, 46, 32, 79, 116, 104, 101, 114, 119, 105, 115, 101, 44, 32, 116, 104, 105, 115, 32, 112, 114, 111, 99, 101, 100, 117, 114, 101, 32, 102, 97, 105, 108, 115, 46, 32, 99, 111, 100, 101, 32, 105, 115, 32, 116, 104, 101, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 99, 111, 100, 101, 92, 110, 116, 111, 32, 115, 101, 116, 46, 34, 44, 34, 103, 101, 116, 45, 98, 97, 108, 97, 110, 99, 101, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 98, 97, 108, 97, 110, 99, 101, 32, 111, 102, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 97, 115, 115, 111, 99, 105, 97, 116, 101, 100, 32, 119, 105, 116, 104, 32, 97, 32, 97, 99, 99, 111, 117, 110, 116, 95, 105, 100, 46, 92, 110, 80, 97, 110, 105, 99, 115, 32, 105, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 110, 111, 116, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 32, 97, 99, 99, 111, 117, 110, 116, 95, 105, 100, 32, 105, 115, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 105, 100, 92, 110, 111, 102, 32, 116, 104, 101, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 111, 102, 32, 105, 110, 116, 101, 114, 101, 115, 116, 46, 32, 98, 97, 108, 97, 110, 99, 101, 32, 105, 115, 32, 116, 104, 101, 32, 118, 97, 117, 108, 116, 32, 98, 97, 108, 97, 110, 99, 101, 32, 111, 102, 32, 116, 104, 101, 92, 110, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 104, 97, 115, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 97, 32, 98, 111, 111, 108, 101, 97, 110, 32, 105, 110, 100, 105, 99, 97, 116, 105, 110, 103, 32, 119, 104, 101, 116, 104, 101, 114, 32, 116, 104, 101, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 112, 114, 101, 115, 101, 110, 116, 92, 110, 105, 110, 32, 116, 104, 101, 32, 118, 97, 117, 108, 116, 46, 32, 80, 97, 110, 105, 99, 115, 32, 105, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 116, 104, 101, 92, 110, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 111, 102, 32, 105, 110, 116, 101, 114, 101, 115, 116, 46, 32, 104, 97, 115, 95, 97, 115, 115, 101, 116, 32, 105, 115, 32, 97, 32, 98, 111, 111, 108, 101, 97, 110, 32, 105, 110, 100, 105, 99, 97, 116, 105, 110, 103, 92, 110, 119, 104, 101, 116, 104, 101, 114, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 118, 97, 117, 108, 116, 32, 104, 97, 115, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 111, 102, 32, 105, 110, 116, 101, 114, 101, 115, 116, 46, 34, 44, 34, 97, 100, 100, 45, 97, 115, 115, 101, 116, 34, 58, 34, 65, 100, 100, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 116, 104, 101, 32, 118, 97, 117, 108, 116, 46, 32, 80, 97, 110, 105, 99, 115, 32, 117, 110, 100, 101, 114, 32, 118, 97, 114, 105, 111, 117, 115, 32, 99, 111, 110, 100, 105, 116, 105, 111, 110, 115, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 102, 105, 110, 97, 108, 32, 97, 115, 115, 101, 116, 32, 105, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 118, 97, 117, 108, 116, 32, 100, 101, 102, 105, 110, 101, 100, 32, 97, 115, 32, 102, 111, 108, 108, 111, 119, 115, 58, 32, 73, 102, 32, 97, 115, 115, 101, 116, 32, 105, 115, 92, 110, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 44, 32, 116, 104, 101, 110, 32, 114, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 115, 97, 109, 101, 32, 97, 115, 32, 97, 115, 115, 101, 116, 46, 32, 73, 102, 32, 97, 115, 115, 101, 116, 32, 105, 115, 32, 97, 92, 110, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 44, 32, 116, 104, 101, 110, 32, 114, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 116, 111, 116, 97, 108, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 105, 110, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 92, 110, 118, 97, 117, 108, 116, 32, 97, 102, 116, 101, 114, 32, 97, 115, 115, 101, 116, 32, 119, 97, 115, 32, 97, 100, 100, 101, 100, 32, 116, 111, 32, 105, 116, 46, 34, 44, 34, 114, 101, 109, 111, 118, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 82, 101, 109, 111, 118, 101, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 97, 115, 115, 101, 116, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 118, 97, 117, 108, 116, 34, 44, 34, 103, 101, 116, 45, 118, 97, 117, 108, 116, 45, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 32, 116, 111, 32, 116, 104, 101, 32, 97, 99, 99, 111, 117, 110, 116, 32, 118, 97, 117, 108, 116, 46, 34, 125, 125, 44, 34, 110, 111, 116, 101, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 78, 111, 116, 101, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 103, 101, 116, 45, 105, 110, 112, 117, 116, 115, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 105, 110, 112, 117, 116, 115, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 110, 111, 116, 101, 34, 44, 34, 103, 101, 116, 45, 97, 115, 115, 101, 116, 115, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 115, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 105, 110, 103, 32, 110, 111, 116, 101, 34, 44, 34, 103, 101, 116, 45, 115, 101, 110, 100, 101, 114, 34, 58, 34, 71, 101, 116, 32, 116, 104, 101, 32, 115, 101, 110, 100, 101, 114, 32, 111, 102, 32, 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, 121, 32, 101, 120, 101, 99, 117, 116, 105, 110, 103, 32, 110, 111, 116, 101, 34, 125, 125, 44, 34, 116, 120, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 110, 117, 109, 98, 101, 114, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 98, 108, 111, 99, 107, 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, 32, 116, 104, 101, 32, 108, 97, 115, 116, 32, 107, 110, 111, 119, 110, 32, 98, 108, 111, 99, 107, 32, 97, 116, 32, 116, 104, 101, 32, 116, 105, 109, 101, 32, 111, 102, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 101, 120, 101, 99, 117, 116, 105, 111, 110, 46, 34, 44, 34, 103, 101, 116, 45, 98, 108, 111, 99, 107, 45, 104, 97, 115, 104, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 98, 108, 111, 99, 107, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 108, 97, 115, 116, 32, 107, 110, 111, 119, 110, 32, 98, 108, 111, 99, 107, 32, 97, 116, 32, 116, 104, 101, 32, 116, 105, 109, 101, 32, 111, 102, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 101, 120, 101, 99, 117, 116, 105, 111, 110, 46, 34, 44, 34, 103, 101, 116, 45, 105, 110, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 105, 110, 112, 117, 116, 32, 110, 111, 116, 101, 115, 32, 104, 97, 115, 104, 46, 32, 84, 104, 105, 115, 32, 105, 115, 32, 99, 111, 109, 112, 117, 116, 101, 100, 32, 97, 115, 32, 97, 32, 115, 101, 113, 117, 101, 110, 116, 105, 97, 108, 32, 104, 97, 115, 104, 32, 111, 102, 92, 110, 40, 110, 117, 108, 108, 105, 102, 105, 101, 114, 44, 32, 115, 99, 114, 105, 112, 116, 95, 114, 111, 111, 116, 41, 32, 116, 117, 112, 108, 101, 115, 32, 111, 118, 101, 114, 32, 97, 108, 108, 32, 105, 110, 112, 117, 116, 32, 110, 111, 116, 101, 115, 46, 34, 44, 34, 103, 101, 116, 45, 111, 117, 116, 112, 117, 116, 45, 110, 111, 116, 101, 115, 45, 104, 97, 115, 104, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 111, 117, 116, 112, 117, 116, 32, 110, 111, 116, 101, 115, 32, 104, 97, 115, 104, 46, 32, 84, 104, 105, 115, 32, 105, 115, 32, 99, 111, 109, 112, 117, 116, 101, 100, 32, 97, 115, 32, 97, 32, 115, 101, 113, 117, 101, 110, 116, 105, 97, 108, 32, 104, 97, 115, 104, 32, 111, 102, 92, 110, 40, 110, 111, 116, 101, 95, 104, 97, 115, 104, 44, 32, 110, 111, 116, 101, 95, 109, 101, 116, 97, 100, 97, 116, 97, 41, 32, 116, 117, 112, 108, 101, 115, 32, 111, 118, 101, 114, 32, 97, 108, 108, 32, 111, 117, 116, 112, 117, 116, 32, 110, 111, 116, 101, 115, 46, 34, 44, 34, 99, 114, 101, 97, 116, 101, 45, 110, 111, 116, 101, 34, 58, 34, 67, 114, 101, 97, 116, 101, 115, 32, 97, 32, 110, 101, 119, 32, 110, 111, 116, 101, 46, 92, 110, 97, 115, 115, 101, 116, 32, 105, 115, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 98, 101, 32, 105, 110, 99, 108, 117, 100, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 110, 111, 116, 101, 46, 92, 110, 116, 97, 103, 32, 105, 115, 32, 116, 104, 101, 32, 116, 97, 103, 32, 116, 111, 32, 98, 101, 32, 105, 110, 99, 108, 117, 100, 101, 100, 32, 105, 110, 32, 116, 104, 101, 32, 110, 111, 116, 101, 46, 92, 110, 114, 101, 99, 105, 112, 105, 101, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 114, 101, 99, 105, 112, 105, 101, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 116, 101, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 105, 100, 32, 111, 102, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 110, 111, 116, 101, 46, 34, 125, 125, 44, 34, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 115, 115, 101, 116, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 46, 32, 84, 104, 101, 115, 101, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 32, 99, 97, 110, 32, 111, 110, 108, 121, 32, 98, 101, 32, 99, 97, 108, 108, 101, 100, 32, 98, 121, 32, 102, 97, 117, 99, 101, 116, 32, 97, 99, 99, 111, 117, 110, 116, 115, 46, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 98, 117, 105, 108, 100, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 66, 117, 105, 108, 100, 115, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 102, 97, 117, 99, 101, 116, 32, 97, 110, 100, 32, 97, 109, 111, 117, 110, 116, 46, 92, 110, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 105, 115, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 46, 92, 110, 97, 109, 111, 117, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 99, 114, 101, 97, 116, 101, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 67, 114, 101, 97, 116, 101, 115, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 92, 110, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 97, 109, 111, 117, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 98, 117, 105, 108, 100, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 66, 117, 105, 108, 100, 115, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 32, 116, 104, 101, 32, 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 102, 97, 117, 99, 101, 116, 32, 97, 110, 100, 92, 110, 100, 97, 116, 97, 45, 104, 97, 115, 104, 46, 92, 110, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 105, 115, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 46, 92, 110, 100, 97, 116, 97, 45, 104, 97, 115, 104, 32, 105, 115, 32, 116, 104, 101, 32, 100, 97, 116, 97, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 98, 117, 105, 108, 100, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 99, 114, 101, 97, 116, 101, 45, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 67, 114, 101, 97, 116, 101, 115, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 102, 111, 114, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 100, 97, 116, 97, 45, 104, 97, 115, 104, 32, 105, 115, 32, 116, 104, 101, 32, 100, 97, 116, 97, 32, 104, 97, 115, 104, 32, 111, 102, 32, 116, 104, 101, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 99, 114, 101, 97, 116, 101, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 99, 114, 101, 97, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 125, 125, 44, 34, 102, 97, 117, 99, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 70, 97, 117, 99, 101, 116, 45, 114, 101, 108, 97, 116, 101, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 46, 32, 84, 104, 101, 115, 101, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 32, 99, 97, 110, 32, 111, 110, 108, 121, 32, 98, 101, 32, 99, 97, 108, 108, 101, 100, 32, 98, 121, 32, 102, 97, 117, 99, 101, 116, 32, 97, 99, 99, 111, 117, 110, 116, 115, 46, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 109, 105, 110, 116, 34, 58, 34, 77, 105, 110, 116, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 109, 105, 110, 116, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 98, 117, 114, 110, 34, 58, 34, 66, 117, 114, 110, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 92, 110, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 98, 117, 114, 110, 101, 100, 32, 97, 115, 115, 101, 116, 46, 34, 44, 34, 103, 101, 116, 45, 116, 111, 116, 97, 108, 45, 105, 115, 115, 117, 97, 110, 99, 101, 34, 58, 34, 82, 101, 116, 117, 114, 110, 115, 32, 116, 104, 101, 32, 116, 111, 116, 97, 108, 32, 105, 115, 115, 117, 97, 110, 99, 101, 32, 111, 102, 32, 116, 104, 101, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 102, 97, 117, 99, 101, 116, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 92, 110, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 32, 97, 103, 97, 105, 110, 115, 116, 46, 32, 80, 97, 110, 105, 99, 115, 32, 105, 102, 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 32, 105, 115, 32, 110, 111, 116, 32, 98, 101, 105, 110, 103, 32, 101, 120, 101, 99, 117, 116, 101, 100, 92, 110, 97, 103, 97, 105, 110, 115, 116, 32, 97, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 102, 97, 117, 99, 101, 116, 46, 34, 125, 125, 44, 34, 116, 121, 112, 101, 115, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 72, 105, 103, 104, 45, 108, 101, 118, 101, 108, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 32, 111, 102, 32, 99, 111, 114, 101, 32, 116, 121, 112, 101, 115, 34, 44, 34, 102, 117, 110, 99, 115, 34, 58, 123, 34, 102, 114, 111, 109, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 67, 111, 110, 118, 101, 114, 116, 115, 32, 97, 32, 99, 111, 114, 101, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 97, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46, 34, 44, 34, 116, 111, 45, 99, 111, 114, 101, 45, 97, 115, 115, 101, 116, 34, 58, 34, 67, 111, 110, 118, 101, 114, 116, 115, 32, 97, 110, 32, 97, 115, 115, 101, 116, 32, 116, 111, 32, 97, 32, 99, 111, 114, 101, 32, 97, 115, 115, 101, 116, 32, 114, 101, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46, 34, 125, 44, 34, 116, 121, 112, 101, 115, 34, 58, 123, 34, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 34, 44, 34, 105, 116, 101, 109, 115, 34, 58, 123, 34, 97, 115, 115, 101, 116, 34, 58, 34, 70, 97, 117, 99, 101, 116, 32, 73, 68, 32, 111, 102, 32, 116, 104, 101, 32, 102, 97, 117, 99, 101, 116, 32, 119, 104, 105, 99, 104, 32, 105, 115, 115, 117, 101, 100, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 97, 115, 32, 119, 101, 108, 108, 32, 97, 115, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 32, 97, 109, 111, 117, 110, 116, 46, 34, 44, 34, 97, 109, 111, 117, 110, 116, 34, 58, 34, 65, 115, 115, 101, 116, 32, 97, 109, 111, 117, 110, 116, 32, 105, 115, 32, 103, 117, 97, 114, 97, 110, 116, 101, 101, 100, 32, 116, 111, 32, 98, 101, 32, 50, 94, 54, 51, 32, 45, 32, 49, 32, 111, 114, 32, 115, 109, 97, 108, 108, 101, 114, 46, 34, 125, 125, 44, 34, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 45, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 99, 111, 109, 109, 105, 116, 109, 101, 110, 116, 32, 116, 111, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 92, 110, 92, 110, 65, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 32, 99, 111, 110, 115, 105, 115, 116, 115, 32, 111, 102, 32, 52, 32, 102, 105, 101, 108, 100, 32, 101, 108, 101, 109, 101, 110, 116, 115, 32, 119, 104, 105, 99, 104, 32, 97, 114, 101, 32, 99, 111, 109, 112, 117, 116, 101, 100, 32, 98, 121, 32, 104, 97, 115, 104, 105, 110, 103, 32, 97, 115, 115, 101, 116, 32, 100, 97, 116, 97, 92, 110, 40, 119, 104, 105, 99, 104, 32, 99, 97, 110, 32, 98, 101, 32, 111, 102, 32, 97, 114, 98, 105, 116, 114, 97, 114, 121, 32, 108, 101, 110, 103, 116, 104, 41, 32, 116, 111, 32, 112, 114, 111, 100, 117, 99, 101, 58, 32, 91, 100, 48, 44, 32, 100, 49, 44, 32, 100, 50, 44, 32, 100, 51, 93, 46, 32, 32, 87, 101, 32, 116, 104, 101, 110, 32, 114, 101, 112, 108, 97, 99, 101, 32, 100, 49, 32, 119, 105, 116, 104, 32, 116, 104, 101, 92, 110, 102, 97, 117, 99, 101, 116, 95, 105, 100, 32, 116, 104, 97, 116, 32, 105, 115, 115, 117, 101, 100, 32, 116, 104, 101, 32, 97, 115, 115, 101, 116, 58, 32, 91, 100, 48, 44, 32, 102, 97, 117, 99, 101, 116, 95, 105, 100, 44, 32, 100, 50, 44, 32, 100, 51, 93, 46, 32, 87, 101, 32, 116, 104, 101, 110, 32, 115, 101, 116, 32, 116, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 98, 105, 116, 92, 110, 111, 102, 32, 116, 104, 101, 32, 109, 111, 115, 116, 32, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 101, 108, 101, 109, 101, 110, 116, 32, 116, 111, 32, 90, 69, 82, 79, 46, 34, 125, 44, 34, 97, 115, 115, 101, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 65, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 111, 114, 32, 97, 32, 110, 111, 110, 45, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, 115, 115, 101, 116, 46, 34, 125, 125, 125, 44, 34, 110, 111, 116, 101, 45, 115, 99, 114, 105, 112, 116, 34, 58, 123, 34, 100, 111, 99, 115, 34, 58, 34, 78, 111, 116, 101, 32, 115, 99, 114, 105, 112, 116, 32, 105, 110, 116, 101, 114, 102, 97, 99, 101, 32, 116, 104, 97, 116, 32, 105, 115, 32, 101, 120, 112, 101, 99, 116, 101, 100, 32, 116, 111, 32, 98, 101, 32, 105, 109, 112, 108, 101, 109, 101, 110, 116, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, 110, 111, 116, 101, 32, 115, 99, 114, 105, 112, 116, 46, 34, 125, 125, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; #[inline(never)] #[doc(hidden)] diff --git a/tests/rust-apps-wasm/sdk/sdk/wit/miden.wit b/tests/rust-apps-wasm/sdk/sdk/wit/miden.wit index 81f659aa3..dd6546743 100644 --- a/tests/rust-apps-wasm/sdk/sdk/wit/miden.wit +++ b/tests/rust-apps-wasm/sdk/sdk/wit/miden.wit @@ -7,15 +7,17 @@ interface core-types { /// The backing type is `f64` but the internal values are always integer in the range [0, M). /// Field modulus M = 2^64 - 2^32 + 1 record felt { - /// We use f64 as the backing type for the field element. It has the size that we need and + /// We plan to use f64 as the backing type for the field element. It has the size that we need and /// we don't plan to support floating point arithmetic in programs for Miden VM. - inner: f64 + /// + /// For now its u64 + inner: u64 } /// A group of four field elements in the Miden base field. type word = tuple; - + /// Unique identifier of an account. /// /// Account ID consists of 1 field element (~64 bits). This field element uniquely identifies a @@ -32,7 +34,7 @@ interface core-types { record account-id { inner: felt } - + /// Creates a new account ID from a field element. account-id-from-felt: func(felt: felt) -> account-id; @@ -124,7 +126,7 @@ interface core-types { inner: word } - /// An id of the created note + /// An id of the created note record note-id { inner: felt } @@ -132,7 +134,7 @@ interface core-types { } -/// Account-related functions +/// Account-related functions interface account { use core-types.{felt,core-asset, tag, recipient, account-id, nonce, account-hash, storage-value, storage-root, account-code-root, vault-commitment}; @@ -144,7 +146,7 @@ interface account { get-initial-hash: func() -> account-hash; /// Get the current hash of the account data stored in memory get-current-hash: func() -> account-hash; - /// Increment the account nonce by the specified value. + /// Increment the account nonce by the specified value. /// value can be at most 2^32 - 1 otherwise this procedure panics incr-nonce: func(value: felt); /// Get the value of the specified key in the account storage @@ -175,17 +177,17 @@ interface account { add-asset: func(asset: core-asset) -> core-asset; /// Remove the specified asset from the vault remove-asset: func(asset: core-asset) -> core-asset; - /// Returns the commitment to the account vault. + /// Returns the commitment to the account vault. get-vault-commitment: func() -> vault-commitment; } -// Note-related functions +// Note-related functions interface note { use core-types.{felt, core-asset, tag, recipient, account-id, nonce, account-hash, storage-value, storage-root, account-code-root, vault-commitment}; - - /// Get the inputs of the currently executed note + + /// Get the inputs of the currently executed note get-inputs: func() -> list; - /// Get the assets of the currently executing note + /// Get the assets of the currently executing note get-assets: func() -> list; /// Get the sender of the currently executing note get-sender: func() -> account-id; @@ -204,7 +206,7 @@ interface tx { /// (nullifier, script_root) tuples over all input notes. get-input-notes-hash: func() -> word; /// Returns the output notes hash. This is computed as a sequential hash of - /// (note_hash, note_metadata) tuples over all output notes. + /// (note_hash, note_metadata) tuples over all output notes. get-output-notes-hash: func() -> word; /// Creates a new note. /// asset is the asset to be included in the note. @@ -219,23 +221,23 @@ interface asset { use core-types.{felt, core-asset, tag, recipient, account-id, nonce, account-hash, storage-value, storage-root, account-code-root, vault-commitment, block-hash, word}; /// Builds a fungible asset for the specified fungible faucet and amount. - /// faucet_id is the faucet to create the asset for. + /// faucet_id is the faucet to create the asset for. /// amount is the amount of the asset to create. /// Returns the created asset. build-fungible-asset: func(faucet-id: account-id, amount: felt) -> core-asset; /// Creates a fungible asset for the faucet the transaction is being - /// executed against. - /// amount is the amount of the asset to create. + /// executed against. + /// amount is the amount of the asset to create. /// Returns the created asset. create-fungible-asset: func(amount: felt) -> core-asset; /// Builds a non-fungible asset for the specified non-fungible faucet and - /// data-hash. - /// faucet_id is the faucet to create the asset for. - /// data-hash is the data hash of the non-fungible asset to build. + /// data-hash. + /// faucet_id is the faucet to create the asset for. + /// data-hash is the data hash of the non-fungible asset to build. /// Returns the created asset. build-non-fungible-asset: func(faucet-id: account-id, data-hash: word) -> core-asset; - /// Creates a non-fungible asset for the faucet the transaction is being executed against. - /// data-hash is the data hash of the non-fungible asset to create. + /// Creates a non-fungible asset for the faucet the transaction is being executed against. + /// data-hash is the data hash of the non-fungible asset to create. /// Returns the created asset. create-non-fungible-asset: func(data-hash: word) -> core-asset; } @@ -253,7 +255,7 @@ interface faucet { burn: func(asset: core-asset) -> core-asset; /// Returns the total issuance of the fungible faucet the transaction is /// being executed against. Panics if the transaction is not being executed - /// against a fungible faucet. + /// against a fungible faucet. get-total-issuance: func() -> felt; } @@ -263,9 +265,9 @@ interface faucet { interface types { use core-types.{felt, account-id, word, core-asset}; - /// A fungible asset + /// A fungible asset record fungible-asset { - /// Faucet ID of the faucet which issued the asset as well as the asset amount. + /// Faucet ID of the faucet which issued the asset as well as the asset amount. asset: account-id, /// Asset amount is guaranteed to be 2^63 - 1 or smaller. amount: u64